def __init__(self, parent=None, flags=QtCore.Qt.Widget): super(MainWindow, self).__init__(parent, flags) splitter_widget = QtGui.QSplitter(QtCore.Qt.Horizontal) self.code_object_view = QtGui.QTreeView(splitter_widget) self.code_object_view.setHeaderHidden(True) self.code_object_view.setModel(QtGui.QStandardItemModel()) self.code_object_view.selectionModel().currentChanged.connect(self.on_code_object_view_current_changed) tab_widget = QtGui.QTabWidget(splitter_widget) self.summary_view = QtWebKit.QWebView() self.summary_view.page().setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateAllLinks) self.summary_view.linkClicked.connect(self.on_summary_view_link_clicked) self.disassembly_view = QtWebKit.QWebView() self.disassembly_view.page().setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateAllLinks) self.disassembly_view.linkClicked.connect(self.on_disassembly_view_link_clicked) self.hex_edit = hexedit.HexEdit() tab_widget.addTab(self.summary_view, 'Summary') tab_widget.addTab(self.disassembly_view, 'Disassembly') tab_widget.addTab(self.hex_edit, 'Hex Dump') menu = self.menuBar().addMenu('&File') menu.addAction('&Open...').triggered.connect(self.on_menu_bar_open_triggered) menu.addAction('&Close').triggered.connect(self.on_menu_bar_close_triggered) menu.addAction('&Reload').triggered.connect(self.on_menu_bar_reload_triggered) menu.addSeparator() menu.addAction('E&xit').triggered.connect(Qt.qApp.quit) menu = self.menuBar().addMenu('&Help') menu.addAction('About...').triggered.connect(self.on_menu_bar_about_triggered) menu.addSeparator() menu.addAction('About Qt...').triggered.connect(Qt.qApp.aboutQt) splitter_widget.setStretchFactor(0, 0) splitter_widget.setStretchFactor(1, 1) splitter_widget.setSizes([200, splitter_widget.width()-200]) self.setCentralWidget(splitter_widget) self.setWindowTitle('Chrysanthemum') self.setWindowIcon(QtGui.QIcon(':/images/icon.png')) self.setAcceptDrops(True) self.resize(1024, 768) self.setGeometry(QtGui.QStyle.alignedRect(QtCore.Qt.LeftToRight, QtCore.Qt.AlignCenter, self.size(), QtGui.QDesktopWidget().availableGeometry())) self.close()
def OnTextPopupMenuItemSaveSelection(self, event): if self.textView.selection_start is not None and self.textView.selection_end is not None: selection_start, selection_end = self.textView.getSelection() if selection_start > selection_end: #swap if start > end selection_start, selection_end = self.textView.selection_end, self.textView.selection_start dlg = wx.FileDialog(self, "Save Selection As...", os.getcwd(), "", PlatformMethods.GetWildcard(), wx.SAVE) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() #make a new instance to copy the stuff to newmodel = hexedit.HexEdit() newmodel.new(path) #copy blocks t_offset = 0 for offset, block in self.textViewer.bin.blockReader(selection_start, 1024*1024, endoffset=selection_end): newmodel.bin.write(t_offset, block) newmodel.bin.commit() #write to disk often to keep history small t_offset += len(block) newmodel.close() dlg.Destroy() event.Skip()
def CreateTextViewWindow(self): self.panTextView = wx.Panel(id=wx.NewId(), parent=self, pos=wx.Point(0, 0), size=wx.Size(672, 600)) self.panTextView.SetBackgroundColour(wx.Colour(225, 236, 255)) self.panTextView.SetAutoLayout(True) self.lblTextViewStatus = wx.StaticText(id=wx.NewId(), label='Staus', parent=self.panTextView, pos=wx.Point(8, 572), size=wx.Size(656, 20), style=wx.ST_NO_AUTORESIZE | wx.SUNKEN_BORDER) self.lblTextViewStatus.SetConstraints(LayoutAnchors(self.lblTextViewStatus, True, False, True, True)) self.textView = TextViewWindow(self.panTextView, self.lblTextViewStatus, id=wx.NewId(), pos=wx.Point(8, 8), size=wx.Size(656, 555)) self.textView.SetConstraints(LayoutAnchors(self.textView, True, True, True, True)) self.textView.Bind(wx.EVT_CONTEXT_MENU, self.OnTextViewRightUp) self.textView.Bind(wx.EVT_LEFT_UP, self.OnTextViewLeftUp) self.textViewer = hexedit.HexEdit() self.textView.setModel(self.textViewer) self.textViewer.attach(self) return self.panTextView