diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2021-06-02 11:27:24 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2021-07-28 19:31:25 -0400 |
| commit | c08ddcab02433cb5078b6cfea11bf972e47b3169 (patch) | |
| tree | 02f05276ac497521a76e1591f3776e4f1cfe31d9 /python | |
| parent | 8c0fa1737552e548909a435ddcc2b661a71b5da9 (diff) | |
Add sidebar and move some dock widgets to it
Diffstat (limited to 'python')
| -rw-r--r-- | python/examples/hellodockwidget.py | 6 | ||||
| -rw-r--r-- | python/examples/hellosidebar.py | 107 |
2 files changed, 110 insertions, 3 deletions
diff --git a/python/examples/hellodockwidget.py b/python/examples/hellodockwidget.py index 6f5f52ea..879b424f 100644 --- a/python/examples/hellodockwidget.py +++ b/python/examples/hellodockwidget.py @@ -31,9 +31,9 @@ # For Dynamic dock widgets, the UI widget operates on a single binary view instance from binaryninjaui import DockHandler, DockContextHandler, UIActionHandler -from PySide2 import QtCore -from PySide2.QtCore import Qt -from PySide2.QtWidgets import QApplication, QHBoxLayout, QVBoxLayout, QLabel, QWidget +from PySide6 import QtCore +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QApplication, QHBoxLayout, QVBoxLayout, QLabel, QWidget instance_id = 0 class HelloDockWidget(QWidget, DockContextHandler): diff --git a/python/examples/hellosidebar.py b/python/examples/hellosidebar.py new file mode 100644 index 00000000..7c490dbb --- /dev/null +++ b/python/examples/hellosidebar.py @@ -0,0 +1,107 @@ +# Copyright (c) 2015-2021 Vector 35 Inc +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +# This is an example UI plugin which demonstrates how to add sidebar widgets to Binary Ninja. +# See .../api/ui/sidebar.h for interface details. + +from binaryninjaui import SidebarWidget, SidebarWidgetType, Sidebar, UIActionHandler +from PySide6 import QtCore +from PySide6.QtCore import Qt, QRectF +from PySide6.QtWidgets import QApplication, QHBoxLayout, QVBoxLayout, QLabel, QWidget +from PySide6.QtGui import QImage, QPixmap, QPainter, QFont, QColor + +instance_id = 0 + +# Sidebar widgets must derive from SidebarWidget, not QWidget. SidebarWidget is a QWidget but +# provides callbacks for sidebar events, and must be created with a title. +class HelloSidebarWidget(SidebarWidget): + def __init__(self, name, frame, data): + global instance_id + SidebarWidget.__init__(self, name) + self.actionHandler = UIActionHandler() + self.actionHandler.setupActionHandler(self) + offset_layout = QHBoxLayout() + offset_layout.addWidget(QLabel("Offset: ")) + self.offset = QLabel(hex(0)) + offset_layout.addWidget(self.offset) + offset_layout.setAlignment(QtCore.Qt.AlignCenter) + datatype_layout = QHBoxLayout() + datatype_layout.addWidget(QLabel("Data Type: ")) + self.datatype = QLabel("") + datatype_layout.addWidget(self.datatype) + datatype_layout.setAlignment(QtCore.Qt.AlignCenter) + layout = QVBoxLayout() + title = QLabel(name, self) + title.setAlignment(QtCore.Qt.AlignCenter) + instance = QLabel("Instance: " + str(instance_id), self) + instance.setAlignment(QtCore.Qt.AlignCenter) + layout.addStretch() + layout.addWidget(title) + layout.addWidget(instance) + layout.addLayout(datatype_layout) + layout.addLayout(offset_layout) + layout.addStretch() + self.setLayout(layout) + instance_id += 1 + self.data = data + + def notifyOffsetChanged(self, offset): + self.offset.setText(hex(offset)) + + def notifyViewChanged(self, view_frame): + if view_frame is None: + self.datatype.setText("None") + self.data = None + else: + self.datatype.setText(view_frame.getCurrentView()) + view = view_frame.getCurrentViewInterface() + self.data = view.getData() + + def contextMenuEvent(self, event): + self.m_contextMenuManager.show(self.m_menu, self.actionHandler) + +class HelloSidebarWidgetType(SidebarWidgetType): + def __init__(self): + # Sidebar icons are 28x28 points. Should be at least 56x56 pixels for + # HiDPI display compatibility. They will be automatically made theme + # aware, so you need only provide a grayscale image, where white is + # the color of the shape. + icon = QImage(56, 56, QImage.Format_RGB32) + icon.fill(0) + + # Render an "H" as the example icon + p = QPainter() + p.begin(icon) + p.setFont(QFont("Open Sans", 56)) + p.setPen(QColor(255, 255, 255, 255)) + p.drawText(QRectF(0, 0, 56, 56), Qt.AlignCenter, "H") + p.end() + + SidebarWidgetType.__init__(self, icon, "Hello") + + def createWidget(self, frame, data): + # This callback is called when a widget needs to be created for a given context. Different + # widgets are created for each unique BinaryView. They are created on demand when the sidebar + # widget is visible and the BinaryView becomes active. + return HelloSidebarWidget("Hello", frame, data) + +# Register the sidebar widget type with Binary Ninja. This will make it appear as an icon in the +# sidebar and the `createWidget` method will be called when a widget is required. +Sidebar.addSidebarWidgetType(HelloSidebarWidgetType()) |
