class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Untitled") icon = os.path.join(BASE_DIR, 'ide/Icon.ico') self.setWindowIcon(QIcon(icon)) self.saveLoad = SaveLoad() self.fileName = None self.setupUI() def setupUI(self): centralWidget = QWidget(self) layout = QHBoxLayout(centralWidget) self.fileSysView = QTreeView(centralWidget) self.setupFileSystemViewer() self.editor = QsciScintilla(centralWidget) self.setupEditor() layout.addWidget(self.fileSysView, 1) layout.addWidget(self.editor, 3) self.setCentralWidget(centralWidget) self.setMinimumSize(700, 500) self.defaultMenuBar = QMenuBar(self) self.setupMenus() self.setMenuBar(self.defaultMenuBar) self.show() def setupEditor(self): self.editor.setFont(QFont("Times New Roman", 12)) self.editor.setMargins(2) self.editor.setMarginType(0, QsciScintilla.NumberMargin) self.editor.setMarginType(1, QsciScintilla.SymbolMargin) self.editor.setMarginWidth(0, "000") self.editor.setMarginWidth(1, "00") self.editor.markerDefine(QsciScintilla.RightTriangle, 1) if system() == "Windows": self.editor.setEolMode(QsciScintilla.EolWindows) elif system() == "Linux": self.editor.setEolMode(QsciScintilla.EolUnix) elif system() == "Mac": self.editor.setEolMode(QsciScintilla.EolMac) else: print("Using Windows EOL") self.editor.setEolMode(QsciScintilla.EolWindows) self.editor.setBraceMatching(QsciScintilla.SloppyBraceMatch) self.editor.setIndentationsUseTabs(True) self.editor.setTabWidth(4) self.editor.setIndentationGuides(True) self.editor.setTabIndents(True) self.editor.setAutoIndent(True) self.editor.setCaretForegroundColor(QColor("#ff11214b")) self.editor.setCaretLineVisible(True) self.editor.setCaretLineBackgroundColor(QColor("#1f0000ff")) self.editor.setUtf8(True) self.editor.setMarginSensitivity(1, True) self.editor.marginClicked.connect(self.margin_clicked) self.editor.marginRightClicked.connect(self.margin_right_clicked) self.lexer = QsciLexerPython() self.lexer.setFont(QFont("Times New Roman", 12)) self.editor.setLexer(self.lexer) self.editor.textChanged.connect(self.fileChanged) def setupFileSystemViewer(self): model = QFileSystemModel() model.setRootPath("/") self.fileSysView.setModel(model) self.fileSysView.hideColumn(1) self.fileSysView.hideColumn(2) self.fileSysView.hideColumn(3) self.fileSysView.doubleClicked.connect(self.openFile) def setupMenus(self): fileMenu = QMenu(self.defaultMenuBar) fileMenu.setTitle("File") editMenu = QMenu(self.defaultMenuBar) editMenu.setTitle("Edit") viewMenu = QMenu(self.defaultMenuBar) viewMenu.setTitle("View") runMenu = QMenu(self.defaultMenuBar) runMenu.setTitle("Run") settingsMenu = QMenu(self.defaultMenuBar) settingsMenu.setTitle("Settings") self.actionNew = QAction(self) self.actionNew.setText("New") self.actionNew.setShortcut("Ctrl+N") self.actionOpen = QAction(self) self.actionOpen.setText("Open") self.actionOpen.setShortcut("Ctrl+O") self.actionSave = QAction(self) self.actionSave.setText("Save") self.actionSave.setShortcut("Ctrl+S") self.actionSaveAs = QAction(self) self.actionSaveAs.setText("Save As") self.actionSaveAs.setShortcut("Ctrl+Shift+S") self.actionExit = QAction(self) self.actionExit.setText("Exit") self.actionExit.setShortcut("Alt+X") self.actionUndo = QAction(self) self.actionUndo.setText("Undo") self.actionUndo.setShortcut("Ctrl+Z") self.actionRedo = QAction(self) self.actionRedo.setText("Redo") self.actionRedo.setShortcut("Ctrl+Shift+Z") self.actionSelectAll = QAction(self) self.actionSelectAll.setText("Select all") self.actionSelectAll.setShortcut("Ctrl+A") self.actionCut = QAction(self) self.actionCut.setText("Cut") self.actionCut.setShortcut("Ctrl+X") self.actionCopy = QAction(self) self.actionCopy.setText("Copy") self.actionCopy.setShortcut("Ctrl+C") self.actionPaste = QAction(self) self.actionPaste.setText("Paste") self.actionPaste.setShortcut("Ctrl+V") self.actionFind = QAction(self) self.actionFind.setText("Find") self.actionFind.setShortcut("Ctrl+F") self.actionReplace = QAction(self) self.actionReplace.setText("Replace") self.actionReplace.setShortcut("Ctrl+H") self.actionRun = QAction(self) self.actionRun.setText("Run") self.actionRun.setShortcut("F5") self.actionRunCustom = QAction(self) self.actionRunCustom.setText("Run Customized") self.actionRunCustom.setShortcut("Shift+F5") self.actionShell = QAction(self) self.actionShell.setText("Python shell") self.actionShell.setShortcut("Alt+S") self.actionFont = QAction(self) self.actionFont.setText("Font") self.actionEncoding = QAction(self) self.actionEncoding.setText("Encoding") fileMenu.addAction(self.actionNew) fileMenu.addAction(self.actionOpen) fileMenu.addAction(self.actionSave) fileMenu.addAction(self.actionSaveAs) fileMenu.addSeparator() fileMenu.addAction(self.actionExit) editMenu.addAction(self.actionUndo) editMenu.addAction(self.actionRedo) editMenu.addSeparator() editMenu.addAction(self.actionSelectAll) editMenu.addSeparator() editMenu.addAction(self.actionCut) editMenu.addAction(self.actionCopy) editMenu.addAction(self.actionPaste) viewMenu.addAction(self.actionFind) viewMenu.addAction(self.actionReplace) runMenu.addAction(self.actionRun) runMenu.addAction(self.actionRunCustom) runMenu.addAction(self.actionShell) settingsMenu.addAction(self.actionFont) settingsMenu.addAction(self.actionEncoding) self.defaultMenuBar.addAction(fileMenu.menuAction()) self.defaultMenuBar.addAction(editMenu.menuAction()) self.defaultMenuBar.addAction(viewMenu.menuAction()) self.defaultMenuBar.addAction(runMenu.menuAction()) self.defaultMenuBar.addAction(settingsMenu.menuAction()) self.actionNew.triggered.connect(self.new) self.actionOpen.triggered.connect(self.open) self.actionSave.triggered.connect(self.save) self.actionSaveAs.triggered.connect(self.saveAs) self.actionExit.triggered.connect(self.close) self.actionUndo.triggered.connect(self.editor.undo) self.actionRedo.triggered.connect(self.editor.redo) self.actionSelectAll.triggered.connect( lambda: self.editor.selectAll(True)) self.actionCut.triggered.connect(self.editor.cut) self.actionCopy.triggered.connect(self.editor.copy) self.actionPaste.triggered.connect(self.editor.paste) self.actionFind.triggered.connect(self.find) self.actionReplace.triggered.connect(self.replace) self.actionRun.triggered.connect(self.run) self.actionRunCustom.triggered.connect(self.runCustom) self.actionShell.triggered.connect(self.shell) self.actionFont.triggered.connect(self.Font) def margin_clicked(self, margin_nr, line_nr, state): self.editor.markerAdd(line_nr, margin_nr) def margin_right_clicked(self, margin_nr, line_nr, state): self.editor.markerDelete(line_nr, margin_nr) def new(self): if self.windowTitle().endswith("*"): if (Dialogs().Question( self, "Do you want to save your file?") == "accept"): if self.filename is None: self.saveAs() else: self.save() self.editor.setText("") self.setWindowTitle("Untitled") def open(self): if self.windowTitle().endswith("*"): if (Dialogs().Question( self, "Do you want to save your file?") == "accept"): if self.filename is None: self.saveAs() else: self.save() filename = self.saveLoad.OpenDialog() data = Open(filename) if data is not None: self.editor.setText(data) self.setWindowTitle(filename) self.filename = filename def save(self): if self.filename is None: self.saveAs() else: returnval = Save(self.editor.text(), self.filename) if (returnval): Dialogs().Message(self, "File saved successfully") self.setWindowTitle(self.filename) else: Dialogs().Error(self, "File could not be saved") def saveAs(self): self.filename = self.saveLoad.SaveDialog() returnval = Save(self.editor.text(), self.filename) if (returnval): Dialogs().Message(self, "File saved successfully") self.setWindowTitle(self.filename) else: Dialogs().Error(self, "File could not be saved") def run(self): if self.filename is None: self.saveAs() Runfile(self.filename) def runCustom(self): if self.filename is None: self.saveAs() if self.filename != "": print(len(self.filename)) option, ok = QInputDialog().getText( self, "Customized run", "Enter parameters for sys.argv", QLineEdit.Normal, " ") if ok: Runfile(self.filename, option) def shell(self): Shell() def Font(self): font, ok = QFontDialog.getFont() if ok: self.editor.setFont(font) self.lexer.setFont(font) self.editor.setLexer(self.lexer) def openFile(self, signal): fileName = self.fileSysView.model().filePath(signal) if fileName.endswith("py") or fileName.endswith("pyw"): if self.windowTitle().endswith("*"): if Dialogs().Question( self, "Do you want to save your file?") == "accept": if self.filename is None: self.saveAs() else: self.save() data = Open(fileName) if data is not None: self.editor.setText(data) self.setWindowTitle(fileName) self.filename = fileName def fileChanged(self): title = self.windowTitle() if not (title.endswith("*")): self.setWindowTitle(title + " *") def replace(self): replaceObj = replaceDialog(self, self.editor) def find(self): findObj = findDialog(self, self.editor)
class Ui_MainWindow(object): ARROW_MARKER_NUM = 8 def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(640, 480) self.vindu = QtWidgets.QWidget(MainWindow) self.vindu.setStyleSheet(_fromUtf8('notusedasyet')) #MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) self.filename = "" self.vindu.setObjectName(_fromUtf8("vindu")) self.verticalLayout = PyQt5.QtWidgets.QVBoxLayout(self.vindu) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/ico/python.png")), QtGui.QIcon.Normal, QtGui.QIcon.On) MainWindow.setWindowIcon(icon) self.verticalLayout.setContentsMargins(0,0,0,0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName(_fromUtf8('verticalLayout')) self.codebox = Qsci.QsciScintilla(self.vindu) self.codebox.setToolTip(_fromUtf8("")) self.codebox.setWhatsThis(_fromUtf8("")) self.codebox.setAutoFillBackground(False) self.codebox.setFrameShape(QtWidgets.QFrame.NoFrame) self.codebox.setObjectName(_fromUtf8("codebox")) self.verticalLayout.addWidget(self.codebox) MainWindow.setCentralWidget(self.vindu) #toolbar self.toolBar = QtWidgets.QToolBar(MainWindow) self.toolBar.setAutoFillBackground(False) self.toolBar.setIconSize(QtCore.QSize(32, 32)) self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.toolBar.setObjectName(_fromUtf8("toolBar2")) MainWindow.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolBar) self.toolBar.addSeparator() #toolbar2 debugger #self.toolBar2 = QtGui.QToolBar(MainWindow) #self.toolBar2.setAutoFillBackground(False) #self.toolBar2.setIconSize(QtCore.QSize(32, 32)) #self.toolBar2.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) #self.toolBar2.setObjectName(_fromUtf8("toolBar")) # MainWindow.addToolBar(QtCore.Qt.RightToolBarArea, self.toolBar2) # self.toolBar2.addSeparator() #getting ready for debugger self.codebox.setMarginSensitivity(1, True) self.codebox.marginClicked.connect(self.on_margin_clicked) self.codebox.markerDefine(QsciScintilla.FullRectangle, self.ARROW_MARKER_NUM) self.codebox.setMarkerBackgroundColor(QColor("#ee1111"), self.ARROW_MARKER_NUM) #first action Newfile self.toolBar.newAction = QtWidgets.QAction(QtGui.QIcon(":/ico/new.png"),"New",self.toolBar) self.toolBar.newAction.setStatusTip("Clear TextBox or make new document.") self.toolBar.newAction.setShortcut("Ctrl+N") self.toolBar.newAction.triggered.connect(self.newfile) #second Action OpenFile self.toolBar.secondAction = QtWidgets.QAction(QtGui.QIcon(":/ico/open.png"),"Open",self.toolBar) self.toolBar.secondAction.setStatusTip("Create a new document from scratch.") self.toolBar.secondAction.setShortcut("Ctrl+O") self.toolBar.secondAction.triggered.connect(self.open) # action 3 save file self.toolBar.Action3 = QtWidgets.QAction(QtGui.QIcon(":/ico/save.png"),"Save",self.toolBar) self.toolBar.Action3.setStatusTip("Save Your File.") self.toolBar.Action3.setShortcut("Ctrl+S") self.toolBar.Action3.triggered.connect(self.savefile) #action 4 run file self.toolBar.Action4 = QtWidgets.QAction(QtGui.QIcon(":/ico/run32.png"),"Run",self.toolBar) self.toolBar.Action4.setStatusTip("Run") self.toolBar.Action4.setShortcut("Ctrl+E") self.toolBar.Action4.triggered.connect(self.runto) #action 21 debug #self.toolBar2.Action21 = QtGui.QAction(QtGui.QIcon(":/ico/run32.png"),"Debug",self.toolBar) #self.toolBar2.Action21.setStatusTip("Debug File.") #self.toolBar2.Action21.setShortcut("Ctrl+7") #self.toolBar2.Action21.triggered.connect(self.debugto) #action 6 undo self.toolBar.Action6 = QtWidgets.QAction(QtGui.QIcon(":/ico/undo.png"),"Redo",self.toolBar) self.toolBar.Action6.setStatusTip("Undo.") self.toolBar.Action6.setShortcut("Ctrl+Z") self.toolBar.Action6.triggered.connect(self.codebox.undo) #action 7 redo self.toolBar.Action7 = QtWidgets.QAction(QtGui.QIcon(":/ico/redo.png"),"Redo",self.toolBar) self.toolBar.Action7.setStatusTip("Redo.") self.toolBar.Action7.setShortcut("Ctrl+Y") self.toolBar.Action7.triggered.connect(self.codebox.redo) #action8 rerset Folding self.toolBar.Action8 = QtWidgets.QAction(QtGui.QIcon(":/ico/align-justify.png"),"Reset Folding",self.toolBar) self.toolBar.Action8.setStatusTip("Reset Folding.") self.toolBar.Action8.setShortcut("Ctrl+R") self.toolBar.Action8.triggered.connect(self.nofoldingl) #actions9 CircledTreeFoldStyle self.toolBar.Action9 = QtWidgets.QAction(QtGui.QIcon(":/ico/bullet.png"),"Circled Tree Folding",self.toolBar) self.toolBar.Action9.setStatusTip("Circled Tree Folding.") self.toolBar.Action9.setShortcut("Ctrl+C") self.toolBar.Action9.triggered.connect(self.Circledfold) #actions10 plainFoldStyle self.toolBar.Action10 = QtWidgets.QAction(QtGui.QIcon(":/ico/number.png"),"Plain Folding",self.toolBar) self.toolBar.Action10.setStatusTip("Plain Folding") self.toolBar.Action10.setShortcut("Ctrl+P") self.toolBar.Action10.triggered.connect(self.plainfold) # fonts self.toolBar.Action21 = QtWidgets.QAction(QtGui.QIcon(":/ico4/font.png"), "Fonts", self.toolBar) self.toolBar.Action21.setStatusTip("Fonts") self.toolBar.Action21.setShortcut("Ctrl+F") self.toolBar.Action21.triggered.connect(self.font_choice) #web baby self.toolBar.Action11 = QtWidgets.QAction(QtGui.QIcon(":/ico/web.png"),"Hex-rays Homepage",self.toolBar) self.toolBar.Action11.setStatusTip("Home of Hex-rays") self.toolBar.Action11.setShortcut("Ctrl+W") self.toolBar.Action11.triggered.connect(self.webopen) #irc self.toolBar.Action12 = QtWidgets.QAction(QtGui.QIcon(":/ico3/settings.png"),"Open Ida Pro Python SDK",self.toolBar) self.toolBar.Action12.setStatusTip("Ida Pro Python SDK") self.toolBar.Action12.setShortcut("Ctrl+I") self.toolBar.Action12.triggered.connect(self.sdkopen) #github Python self.toolBar.Action14 = QtWidgets.QAction(QtGui.QIcon(":/ico/github.png"),"Open git python",self.toolBar) self.toolBar.Action14.setStatusTip("Open git python") self.toolBar.Action14.setShortcut("Ctrl+G") self.toolBar.Action14.triggered.connect(self.gitopen) #auther me :) self.toolBar.Action15 = QtWidgets.QAction(QtGui.QIcon(":/ico/auth.png"),"Author",self.toolBar) self.toolBar.Action15.setStatusTip("Author") self.toolBar.Action15.setShortcut("Ctrl+B") self.toolBar.Action15.triggered.connect(self.Author) #toggle off code regonision self.toolBar.Action16 = QtWidgets.QAction(QtGui.QIcon(":/ico2/pythonminus.png"),"Disable Code recognition",self.toolBar) self.toolBar.Action16.setStatusTip("Disable Code recognition") self.toolBar.Action16.setShortcut("Alt+D") self.toolBar.Action16.triggered.connect(self.Diablecode) #toogle on self.toolBar.Action17 = QtWidgets.QAction(QtGui.QIcon(":/ico2/pypluss.png"),"Enable Code recognition",self.toolBar) self.toolBar.Action17.setStatusTip("Enable Code recognition") self.toolBar.Action17.setShortcut("Alt+E") self.toolBar.Action17.triggered.connect(self.Reiablecode) # zoom in self.toolBar.Action18 = QtWidgets.QAction(QtGui.QIcon(":/ico3/in.png"),"Zoom In",self.toolBar) self.toolBar.Action18.setStatusTip("Zoom In") self.toolBar.Action18.setShortcut("CTRL+SHIFT++") self.toolBar.Action18.triggered.connect(self.udder) #zoom out self.toolBar.Action19 = QtWidgets.QAction(QtGui.QIcon(":/ico3/out.png"),"Zoom Out",self.toolBar) self.toolBar.Action19.setStatusTip("Zoom Out") self.toolBar.Action19.setShortcut("CTRL+SHIFT+-") self.toolBar.Action19.triggered.connect(self.odder) self.toolBar.Action20 = QtWidgets.QAction(QtGui.QIcon(":/ico3/10.png"),"Profile Code",self.toolBar) self.toolBar.Action20.setStatusTip("Profile Code") self.toolBar.Action20.setShortcut("CTRL+SHIFT+E") self.toolBar.Action20.triggered.connect(self.runtoprob) #actions self.toolBar.addAction(self.toolBar.newAction) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.secondAction) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action3) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action4) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action6) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action7) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action8) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action9) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action10) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action21) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action11) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action12) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action14) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action15) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action16) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action17) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action18) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action19) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action20) #self.toolBar2.addAction(self.toolBar.Action21) #self.toolBar2.addSeparator() #font self.skrift = QFont() self.skrift.setFamily('Consolas') self.skrift.setFixedPitch(True) self.skrift.setPointSize(12) self.codebox.setFont(self.skrift) #python style self.lexer = QsciLexerPython(self.codebox) self.lexer.setFont(self.skrift) self.lexer.setEolFill(True) #api test not working api = Qsci.QsciAPIs(self.lexer) API_FILE = dn+'\\Python.api' API_FILE2 = dn+'\\idc.api' API_FILE3 = dn+'\\idaapi.api' api.load(API_FILE) api.load(API_FILE2) api.load(API_FILE3) api.prepare() self.codebox.setAutoCompletionThreshold(0) self.codebox.setAutoCompletionThreshold(6) self.codebox.setAutoCompletionThreshold(8) self.codebox.setAutoCompletionSource(Qsci.QsciScintilla.AcsAPIs) self.lexer.setDefaultFont(self.skrift) self.codebox.setLexer(self.lexer) self.codebox.SendScintilla(QsciScintilla.SCI_STYLESETFONT, 1, 'Consolas') #line numbers fontmetrics = QFontMetrics(self.skrift) self.codebox.setMarginsFont(self.skrift) self.codebox.setMarginWidth(0, fontmetrics.width("00000") + 6) self.codebox.setTabWidth(4) #brace self.codebox.setBraceMatching(QsciScintilla.SloppyBraceMatch) #auto line tab =4 self.codebox.setAutoIndent(True) #scroolbar self.codebox.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 1) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "Ida Pro Python Script Editor", None)) self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar", None)) def udder(self): self.codebox.zoomIn() def odder(self): self.codebox.zoomOut() def newfile(self): self.codebox.clear() def open(self): self.path = QtCore.QFileInfo(self.filename).path() # Get filename and show only .writer files (self.filename, _) = \ QtWidgets.QFileDialog.getOpenFileName(self.vindu, 'Open File', self.path, 'Python Files (*.py *.pyc *.pyw)', '') if self.filename: with open(self.filename, 'r') as self.file: self.codebox.setText(self.file.read()) os.chdir(str(self.path)) def savefile(self): self.path = QtCore.QFileInfo(self.filename).path() (self.filename, _) = \ QtWidgets.QFileDialog.getSaveFileName(self.vindu, 'Save as' , self.path, 'Python Files (*.py *.pyc *.pyw)') if self.filename: self.savetext(self.filename) os.chdir(str(self.path)) def savetext(self, fileName): textout = self.codebox.text() file = QtCore.QFile(fileName) if file.open(QtCore.QIODevice.WriteOnly): QtCore.QTextStream(file) << textout else: QtWidgets.QMessageBox.information(self.vindu, 'Unable to open file', file.errorString()) os.chdir(str(self.path)) def runto(self): self.path = QtCore.QFileInfo(self.filename).path() g = globals() os.chdir(str(self.path)) script = str(self.codebox.text()) try: os.chdir(str(self.path)) os.path.join(os.path.expanduser('~'), os.path.expandvars(str(self.path))) sys.path.insert(0, str(self.path)) exec (script, g) except Exception as e: print e.__doc__ print e.message else: exec (script, g) def runtoprob(self): try: self.path = QtCore.QFileInfo(self.filename).path() self.path = QtCore.QFileInfo(self.filename).path() g = globals() os.chdir(str(self.path)) script = str(self.codebox.text()) import cProfile cProfile.run(script) except Exception as e: print e.__doc__ print e.message else: import cProfile cProfile.run(script) def Diablecode(self): self.codebox.setAutoCompletionSource(Qsci.QsciScintilla.AcsNone) def Reiablecode(self): self.codebox.setAutoCompletionSource(Qsci.QsciScintilla.AcsAPIs) def nofoldingl(self): self.codebox.setFolding(QsciScintilla.NoFoldStyle) def Circledfold(self): self.codebox.setFolding(QsciScintilla.CircledTreeFoldStyle) def plainfold(self): self.codebox.setFolding(QsciScintilla.PlainFoldStyle) def webopen(self): import webbrowser webbrowser.open('https://www.hex-rays.com/') def sdkopen(self): import webbrowser webbrowser.open('https://www.hex-rays.com/products/ida/support/idapython_docs/') def gitopen(self): import webbrowser webbrowser.open('https://github.com/idapython/src/tree/build-1.7.2') def Author(self): import webbrowser webbrowser.open('https://github.com/techbliss') def font_choice(self): self.lbl = self.lexer font, ok = QtWidgets.QFontDialog.getFont() if ok: self.lbl.setFont(font) def on_margin_clicked(self, nmargin, nline, modifiers): # Toggle marker for the line the margin was clicked on if self.codebox.markersAtLine(nline) != 0: self.codebox.markerDelete(nline, self.ARROW_MARKER_NUM) else: self.codebox.markerAdd(nline, self.ARROW_MARKER_NUM)
class Ui_Wizard(QtWidgets.QWizard): def __init__(self, parent=None): super(Ui_Wizard, self).__init__(parent=None) Wizard.setObjectName("Wizard") Wizard.resize(762, 500) font = QtGui.QFont() font.setFamily("Calibri Light") Wizard.setFont(font) Wizard.setOptions(QtWidgets.QWizard.HelpButtonOnRight) self.wizardPage1 = QtWidgets.QWizardPage() font = QtGui.QFont() font.setFamily("Calibri Light") font.setPointSize(20) self.wizardPage1.setFont(font) self.wizardPage1.setObjectName("wizardPage1") self.textBrowser_2 = QtWidgets.QTextBrowser(self.wizardPage1) self.textBrowser_2.setGeometry(QtCore.QRect(130, 140, 421, 131)) self.textBrowser_2.setFrameShape(QtWidgets.QFrame.NoFrame) self.textBrowser_2.setObjectName("textBrowser_2") Wizard.addPage(self.wizardPage1) self.wizardPage = QtWidgets.QWizardPage() self.wizardPage.setTitle("") self.wizardPage.setSubTitle("") self.wizardPage.setObjectName("wizardPage") self.textBrowser_4 = QtWidgets.QTextBrowser(self.wizardPage) self.textBrowser_4.setGeometry(QtCore.QRect(130, 140, 499, 239)) self.textBrowser_4.setFrameShape(QtWidgets.QFrame.NoFrame) self.textBrowser_4.setObjectName("textBrowser_4") Wizard.addPage(self.wizardPage) self.tempwizardPage = QtWidgets.QWizardPage() self.tempwizardPage.setObjectName("tempwizardPage") self.verticalLayout = QtWidgets.QVBoxLayout(self.tempwizardPage) self.verticalLayout.setObjectName("verticalLayout") self.TemptextEdit = Qsci.QsciScintilla(self.tempwizardPage) self.TemptextEdit.setToolTip("") self.TemptextEdit.setWhatsThis("") self.TemptextEdit.setObjectName("TemptextEdit") self.verticalLayout.addWidget(self.TemptextEdit) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.temppushButtonopen = QtWidgets.QPushButton(self.tempwizardPage) self.temppushButtonopen.setObjectName("temppushButtonopen") self.horizontalLayout.addWidget(self.temppushButtonopen) self.temppushButtonsave = QtWidgets.QPushButton(self.tempwizardPage) self.temppushButtonsave.setObjectName("temppushButtonsave") self.horizontalLayout.addWidget(self.temppushButtonsave) self.verticalLayout.addLayout(self.horizontalLayout) Wizard.addPage(self.tempwizardPage) self.scriptwizardPage = QtWidgets.QWizardPage() self.scriptwizardPage.setObjectName("scriptwizardPage") self.textBrowser_5 = QtWidgets.QTextBrowser(self.scriptwizardPage) self.textBrowser_5.setGeometry(QtCore.QRect(120, 130, 499, 239)) self.textBrowser_5.setFrameShape(QtWidgets.QFrame.NoFrame) self.textBrowser_5.setObjectName("textBrowser_5") Wizard.addPage(self.scriptwizardPage) self.wizardPage_3 = QtWidgets.QWizardPage() self.wizardPage_3.setObjectName("wizardPage_3") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.wizardPage_3) self.verticalLayout_2.setObjectName("verticalLayout_2") self.script_textEdit = Qsci.QsciScintilla(self.wizardPage_3) self.script_textEdit.setToolTip("") self.script_textEdit.setWhatsThis("") self.script_textEdit.setObjectName("script_textEdit") self.verticalLayout_2.addWidget(self.script_textEdit) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem1) self.scriptGrabpushButton = QtWidgets.QPushButton(self.wizardPage_3) self.scriptGrabpushButton.setObjectName("scriptGrabpushButton") self.horizontalLayout_2.addWidget(self.scriptGrabpushButton) self.scriptpushButtonopen = QtWidgets.QPushButton(self.wizardPage_3) self.scriptpushButtonopen.setObjectName("scriptpushButtonopen") self.horizontalLayout_2.addWidget(self.scriptpushButtonopen) self.scriptpushButtonsave = QtWidgets.QPushButton(self.wizardPage_3) self.scriptpushButtonsave.setObjectName("scriptpushButtonsave") self.horizontalLayout_2.addWidget(self.scriptpushButtonsave) self.verticalLayout_2.addLayout(self.horizontalLayout_2) Wizard.addPage(self.wizardPage_3) self.wizardPage_2 = QtWidgets.QWizardPage() font = QtGui.QFont() font.setPointSize(20) self.wizardPage_2.setFont(font) self.wizardPage_2.setObjectName("wizardPage_2") self.textBrowser_6 = QtWidgets.QTextBrowser(self.wizardPage_2) self.textBrowser_6.setGeometry(QtCore.QRect(170, 140, 411, 191)) self.textBrowser_6.setFrameShape(QtWidgets.QFrame.NoFrame) self.textBrowser_6.setObjectName("textBrowser_6") Wizard.addPage(self.wizardPage_2) #font textedit self.skrift = QFont() self.skrift.setFamily('Consolas') self.skrift.setFixedPitch(True) self.skrift.setPointSize(11) self.TemptextEdit.setFont(self.skrift) self.script_textEdit.setFont(self.skrift) #python style temp self.lexer = QsciLexerPython(self.TemptextEdit) self.lexer.setFont(self.skrift) self.lexer.setEolFill(True) #Python style scritps self.lexer = QsciLexerPython(self.script_textEdit) self.lexer.setFont(self.skrift) self.lexer.setEolFill(True) self.filename = "" #python style temp self.TemptextEdit.setAutoCompletionThreshold(0) self.TemptextEdit.setAutoCompletionThreshold(6) self.TemptextEdit.setAutoCompletionThreshold(8) self.TemptextEdit.setAutoCompletionSource(Qsci.QsciScintilla.AcsAPIs) # self.TemptextEdit.setDefaultFont(self.skrift) self.TemptextEdit.setLexer(self.lexer) self.TemptextEdit.SendScintilla(QsciScintilla.SCI_STYLESETFONT, 1, 'Consolas') #python style script self.script_textEdit.setAutoCompletionThreshold(0) self.script_textEdit.setAutoCompletionThreshold(6) self.script_textEdit.setAutoCompletionThreshold(8) self.script_textEdit.setAutoCompletionSource( Qsci.QsciScintilla.AcsAPIs) # self.script_textEdit.setDefaultFont(self.skrift) self.script_textEdit.setLexer(self.lexer) self.script_textEdit.SendScintilla(QsciScintilla.SCI_STYLESETFONT, 1, 'Consolas') #line numbers temp fontmetrics = QFontMetrics(self.skrift) self.TemptextEdit.setMarginsFont(self.skrift) self.TemptextEdit.setMarginWidth(0, fontmetrics.width("00000") + 6) self.TemptextEdit.setTabWidth(4) #line numbers script fontmetrics = QFontMetrics(self.skrift) self.script_textEdit.setMarginsFont(self.skrift) self.script_textEdit.setMarginWidth(0, fontmetrics.width("00000") + 6) self.script_textEdit.setTabWidth(4) #brace temp self.TemptextEdit.setBraceMatching(QsciScintilla.SloppyBraceMatch) #brace script self.script_textEdit.setBraceMatching(QsciScintilla.SloppyBraceMatch) #auto line tab =4 temp self.TemptextEdit.setAutoIndent(True) #auto line tab =4 script self.TemptextEdit.setAutoIndent(True) #scroolbar self.script_textEdit.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 1) try: bs = open(TemplateFile).read() bba = QtCore.QByteArray(bs) self.bts = QtCore.QTextStream(bba) self.bheysa = self.bts.readAll() self.TemptextEdit.setText(self.bheysa) self.TemptextEdit.setMarkerBackgroundColor((QColor(66, 66, 255))) marker = self.TemptextEdit.markerDefine( PyQt5.Qsci.QsciScintilla.Rectangle, 2) self.TemptextEdit.markerAdd(7, 2) self.TemptextEdit.markerAdd(11, 2) self.TemptextEdit.markerAdd(12, 2) self.TemptextEdit.markerAdd(13, 2) self.TemptextEdit.markerAdd(14, 2) self.TemptextEdit.markerAdd(15, 2) self.TemptextEdit.markerAdd(19, 2) self.TemptextEdit.markerAdd(27, 2) self.TemptextEdit.markerAdd(34, 2) self.TemptextEdit.markerAdd(35, 2) self.TemptextEdit.markerAdd(40, 2) self.TemptextEdit.markerAdd(41, 2) self.TemptextEdit.markerAdd(42, 2) self.TemptextEdit.markerAdd(43, 2) self.TemptextEdit.markerAdd(44, 2) self.TemptextEdit.markerAdd(45, 2) self.TemptextEdit.markerAdd(48, 2) self.TemptextEdit.markerAdd(50, 2) self.TemptextEdit.markerAdd(51, 2) self.TemptextEdit.markerAdd(52, 2) self.TemptextEdit.markerAdd(53, 2) self.TemptextEdit.markerAdd(54, 2) self.TemptextEdit.markerAdd(55, 2) self.TemptextEdit.markerAdd(62, 2) self.TemptextEdit.markerAdd(63, 2) self.TemptextEdit.markerAdd(64, 2) self.TemptextEdit.markerAdd(67, 2) self.TemptextEdit.markerAdd(89, 2) self.TemptextEdit.markerAdd(97, 2) self.TemptextEdit.markerAdd(98, 2) self.TemptextEdit.markerAdd(99, 2) self.TemptextEdit.markerAdd(102, 2) except: self.TemptextEdit.setText('Plugin_temp file not found') pass self.retranslateUi2(Wizard) QtCore.QMetaObject.connectSlotsByName(Wizard) def retranslateUi2(self, Wizard): _translate = QtCore.QCoreApplication.translate Wizard.setWindowTitle( _translate("Wizard", " Ida Pro Plugin Wizard")) self.textBrowser_2.setHtml( _translate( "Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:\'Calibri Light\'; font-size:20pt; font-weight:400; font-style:normal;\">\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Welcome to the plugin wizard.</p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Please follow the steps in the wizard, to tranform your code, to a full Ida Pro plugin.</p></body></html>" )) self.textBrowser_4.setHtml( _translate( "Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:\'Calibri Light\'; font-size:8.14286pt; font-weight:400; font-style:normal;\">\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:20pt;\">First we create the plugin loader</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:20pt;\">Then we change the higlightet text in the template, and then save the plugin loader in Ida Pro Plugins folder.</span></p></body></html>" )) self.temppushButtonopen.setText(_translate("Wizard", "Open")) self.temppushButtonsave.setText(_translate("Wizard", "Save")) self.textBrowser_5.setHtml( _translate( "Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:\'Calibri Light\'; font-size:8.14286pt; font-weight:400; font-style:normal;\">\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:20pt;\">Now we grab the editors current script, or open a new script.<br />Remember to save this in the right folder.<br />Plugins\\My_plugin_folder as declared in the template.</span></p>\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:20pt;\"><br /></p></body></html>" )) self.scriptGrabpushButton.setText( _translate("Wizard", "Grab from Editor")) self.scriptpushButtonopen.setText(_translate("Wizard", "Open")) self.scriptpushButtonsave.setText(_translate("Wizard", "Save")) self.textBrowser_6.setHtml( _translate( "Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:\'Calibri Light\'; font-size:20pt; font-weight:400; font-style:normal;\">\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Loader Template should now be in <br />ida pro\\plugin<br />script should be in a subfolder<br />ida pro\\plugin\\Myplugin\\</p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">If above are correct your good to go!</p></body></html>" )) self.temppushButtonopen.clicked.connect(self.opentemp) self.temppushButtonsave.clicked.connect(self.savetemp) self.scriptpushButtonopen.clicked.connect(self.openscript) self.scriptpushButtonsave.clicked.connect(self.savescript) self.scriptGrabpushButton.clicked.connect(self.grapper) def grapper(self): #hellotext = Ui_MainWindow # hello2= hellotext.sendgrapped # print str(hello2) messageformForm.show() def opentemp(self): print "hello" self.path = QtCore.QFileInfo(self.filename).path() # Get filename and show only .writer files (self.filename, _) = \ QtWidgets.QFileDialog.getOpenFileName(self.wizardPage_3, 'Open File', self.path, 'Python Files (*.py *.pyc *.pyw)', '') if self.filename: with open(self.filename, 'r') as self.file: self.TemptextEdit.setText(self.file.read()) os.chdir(str(self.path)) def savetemp(self): self.path = QtCore.QFileInfo(self.filename).path() (self.filename, _) = \ QtWidgets.QFileDialog.getSaveFileName(self, 'Save as' , self.path, 'Python Files (*.py *.pyc *.pyw)') if self.filename: self.savetexttemp(self.filename) os.chdir(str(self.path)) def savetexttemp(self, fileName): textout = self.TemptextEdit.text() file = QtCore.QFile(fileName) if file.open(QtCore.QIODevice.WriteOnly): QtCore.QTextStream(file) << textout else: QtWidgets.QMessageBox.information(self.tempwizardPage, 'Unable to open file', file.errorString()) os.chdir(str(self.path)) def openscript(self): print "hello" self.path = QtCore.QFileInfo(self.filename).path() # Get filename and show only .writer files (self.filename, _) = \ QtWidgets.QFileDialog.getOpenFileName(self.wizardPage_3, 'Open File', self.path, 'Python Files (*.py *.pyc *.pyw)', '') if self.filename: with open(self.filename, 'r') as self.file: self.script_textEdit.setText(self.file.read()) os.chdir(str(self.path)) def savescript(self): self.path = QtCore.QFileInfo(self.filename).path() (self.filename, _) = \ QtWidgets.QFileDialog.getSaveFileName(self.wizardPage_3, 'Save as' , self.path, 'Python Files (*.py *.pyc *.pyw)') if self.filename: self.savetextscript(self.filename) os.chdir(str(self.path)) def savetextscript(self, fileName): textout = self.script_textEdit.text() file = QtCore.QFile(fileName) if file.open(QtCore.QIODevice.WriteOnly): QtCore.QTextStream(file) << textout else: QtWidgets.QMessageBox.information(self.wizardPage_3, 'Unable to open file', file.errorString()) os.chdir(str(self.path))
class Ui_MainWindow(object): ARROW_MARKER_NUM = 8 def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(640, 480) self.vindu = QtWidgets.QWidget(MainWindow) self.vindu.setStyleSheet(_fromUtf8('notusedasyet')) #MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) self.filename = "" self.vindu.setObjectName(_fromUtf8("vindu")) self.verticalLayout = PyQt5.QtWidgets.QVBoxLayout(self.vindu) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/ico/python.png")), QtGui.QIcon.Normal, QtGui.QIcon.On) MainWindow.setWindowIcon(icon) self.verticalLayout.setContentsMargins(0,0,0,0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName(_fromUtf8('verticalLayout')) self.codebox = Qsci.QsciScintilla(self.vindu) self.codebox.setToolTip(_fromUtf8("")) self.codebox.setWhatsThis(_fromUtf8("")) self.codebox.setAutoFillBackground(False) self.codebox.setFrameShape(QtWidgets.QFrame.NoFrame) self.codebox.setObjectName(_fromUtf8("codebox")) self.verticalLayout.addWidget(self.codebox) MainWindow.setCentralWidget(self.vindu) #toolbar self.toolBar = QtWidgets.QToolBar(MainWindow) self.toolBar.setAutoFillBackground(False) self.toolBar.setIconSize(QtCore.QSize(32, 32)) self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.toolBar.setObjectName(_fromUtf8("toolBar2")) MainWindow.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolBar) self.toolBar.addSeparator() #toolbar2 debugger #self.toolBar2 = QtGui.QToolBar(MainWindow) #self.toolBar2.setAutoFillBackground(False) #self.toolBar2.setIconSize(QtCore.QSize(32, 32)) #self.toolBar2.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) #self.toolBar2.setObjectName(_fromUtf8("toolBar")) # MainWindow.addToolBar(QtCore.Qt.RightToolBarArea, self.toolBar2) # self.toolBar2.addSeparator() #getting ready for debugger self.codebox.setMarginSensitivity(1, True) self.codebox.marginClicked.connect(self.on_margin_clicked) self.codebox.markerDefine(QsciScintilla.FullRectangle, self.ARROW_MARKER_NUM) self.codebox.setMarkerBackgroundColor(QColor("#ee1111"), self.ARROW_MARKER_NUM) #first action Newfile self.toolBar.newAction = QtWidgets.QAction(QtGui.QIcon(":/ico/new.png"),"New",self.toolBar) self.toolBar.newAction.setStatusTip("Clear TextBox or make new document.") self.toolBar.newAction.setShortcut("Ctrl+N") self.toolBar.newAction.triggered.connect(self.newfile) #second Action OpenFile self.toolBar.secondAction = QtWidgets.QAction(QtGui.QIcon(":/ico/open.png"),"Open",self.toolBar) self.toolBar.secondAction.setStatusTip("Create a new document from scratch.") self.toolBar.secondAction.setShortcut("Ctrl+O") self.toolBar.secondAction.triggered.connect(self.open) # action 3 save file self.toolBar.Action3 = QtWidgets.QAction(QtGui.QIcon(":/ico/save.png"),"Save",self.toolBar) self.toolBar.Action3.setStatusTip("Save Your File.") self.toolBar.Action3.setShortcut("Ctrl+S") self.toolBar.Action3.triggered.connect(self.savefile) #action 4 run file self.toolBar.Action4 = QtWidgets.QAction(QtGui.QIcon(":/ico/run32.png"),"Run",self.toolBar) self.toolBar.Action4.setStatusTip("Run") self.toolBar.Action4.setShortcut("Ctrl+E") self.toolBar.Action4.triggered.connect(self.runto) #action 21 debug #self.toolBar2.Action21 = QtGui.QAction(QtGui.QIcon(":/ico/run32.png"),"Debug",self.toolBar) #self.toolBar2.Action21.setStatusTip("Debug File.") #self.toolBar2.Action21.setShortcut("Ctrl+7") #self.toolBar2.Action21.triggered.connect(self.debugto) #action 6 undo self.toolBar.Action6 = QtWidgets.QAction(QtGui.QIcon(":/ico/undo.png"),"Redo",self.toolBar) self.toolBar.Action6.setStatusTip("Undo.") self.toolBar.Action6.setShortcut("Ctrl+Z") self.toolBar.Action6.triggered.connect(self.codebox.undo) #action 7 redo self.toolBar.Action7 = QtWidgets.QAction(QtGui.QIcon(":/ico/redo.png"),"Redo",self.toolBar) self.toolBar.Action7.setStatusTip("Redo.") self.toolBar.Action7.setShortcut("Ctrl+Y") self.toolBar.Action7.triggered.connect(self.codebox.redo) #action8 rerset Folding self.toolBar.Action8 = QtWidgets.QAction(QtGui.QIcon(":/ico/align-justify.png"),"Reset Folding",self.toolBar) self.toolBar.Action8.setStatusTip("Reset Folding.") self.toolBar.Action8.setShortcut("Ctrl+R") self.toolBar.Action8.triggered.connect(self.nofoldingl) #actions9 CircledTreeFoldStyle self.toolBar.Action9 = QtWidgets.QAction(QtGui.QIcon(":/ico/bullet.png"),"Circled Tree Folding",self.toolBar) self.toolBar.Action9.setStatusTip("Circled Tree Folding.") self.toolBar.Action9.setShortcut("Ctrl+C") self.toolBar.Action9.triggered.connect(self.Circledfold) #actions10 plainFoldStyle self.toolBar.Action10 = QtWidgets.QAction(QtGui.QIcon(":/ico/number.png"),"Plain Folding",self.toolBar) self.toolBar.Action10.setStatusTip("Plain Folding") self.toolBar.Action10.setShortcut("Ctrl+P") self.toolBar.Action10.triggered.connect(self.plainfold) # fonts self.toolBar.Action21 = QtWidgets.QAction(QtGui.QIcon(":/ico4/font.png"), "Fonts", self.toolBar) self.toolBar.Action21.setStatusTip("Fonts") self.toolBar.Action21.setShortcut("Ctrl+F") self.toolBar.Action21.triggered.connect(self.font_choice) #web baby self.toolBar.Action11 = QtWidgets.QAction(QtGui.QIcon(":/ico/web.png"),"Hex-rays Homepage",self.toolBar) self.toolBar.Action11.setStatusTip("Home of Hex-rays") self.toolBar.Action11.setShortcut("Ctrl+W") self.toolBar.Action11.triggered.connect(self.webopen) #irc self.toolBar.Action12 = QtWidgets.QAction(QtGui.QIcon(":/ico3/settings.png"),"Open Ida Pro Python SDK",self.toolBar) self.toolBar.Action12.setStatusTip("Ida Pro Python SDK") self.toolBar.Action12.setShortcut("Ctrl+I") self.toolBar.Action12.triggered.connect(self.sdkopen) #github Python self.toolBar.Action14 = QtWidgets.QAction(QtGui.QIcon(":/ico/github.png"),"Open git python",self.toolBar) self.toolBar.Action14.setStatusTip("Open git python") self.toolBar.Action14.setShortcut("Ctrl+G") self.toolBar.Action14.triggered.connect(self.gitopen) #auther me :) self.toolBar.Action15 = QtWidgets.QAction(QtGui.QIcon(":/ico/auth.png"),"Author",self.toolBar) self.toolBar.Action15.setStatusTip("Author") self.toolBar.Action15.setShortcut("Ctrl+B") self.toolBar.Action15.triggered.connect(self.Author) #toggle off code regonision self.toolBar.Action16 = QtWidgets.QAction(QtGui.QIcon(":/ico2/pythonminus.png"),"Disable Code recognition",self.toolBar) self.toolBar.Action16.setStatusTip("Disable Code recognition") self.toolBar.Action16.setShortcut("Alt+D") self.toolBar.Action16.triggered.connect(self.Diablecode) #toogle on self.toolBar.Action17 = QtWidgets.QAction(QtGui.QIcon(":/ico2/pypluss.png"),"Enable Code recognition",self.toolBar) self.toolBar.Action17.setStatusTip("Enable Code recognition") self.toolBar.Action17.setShortcut("Alt+E") self.toolBar.Action17.triggered.connect(self.Reiablecode) # zoom in self.toolBar.Action18 = QtWidgets.QAction(QtGui.QIcon(":/ico3/in.png"),"Zoom In",self.toolBar) self.toolBar.Action18.setStatusTip("Zoom In") self.toolBar.Action18.setShortcut("CTRL+SHIFT++") self.toolBar.Action18.triggered.connect(self.udder) #zoom out self.toolBar.Action19 = QtWidgets.QAction(QtGui.QIcon(":/ico3/out.png"),"Zoom Out",self.toolBar) self.toolBar.Action19.setStatusTip("Zoom Out") self.toolBar.Action19.setShortcut("CTRL+SHIFT+-") self.toolBar.Action19.triggered.connect(self.odder) self.toolBar.Action20 = QtWidgets.QAction(QtGui.QIcon(":/ico3/10.png"),"Profile Code",self.toolBar) self.toolBar.Action20.setStatusTip("Profile Code") self.toolBar.Action20.setShortcut("CTRL+SHIFT+E") self.toolBar.Action20.triggered.connect(self.runtoprob) #actions self.toolBar.addAction(self.toolBar.newAction) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.secondAction) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action3) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action4) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action6) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action7) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action8) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action9) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action10) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action21) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action11) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action12) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action14) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action15) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action16) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action17) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action18) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action19) self.toolBar.addSeparator() self.toolBar.addAction(self.toolBar.Action20) #self.toolBar2.addAction(self.toolBar.Action21) #self.toolBar2.addSeparator() #font self.skrift = QFont() self.skrift.setFamily('Consolas') self.skrift.setFixedPitch(True) self.skrift.setPointSize(12) self.codebox.setFont(self.skrift) #python style self.lexer = QsciLexerPython(self.codebox) self.lexer.setFont(self.skrift) self.lexer.setEolFill(True) #api test not working api = Qsci.QsciAPIs(self.lexer) API_FILE = dn+'\\Python.api' API_FILE2 = dn+'\\idc.api' API_FILE3 = dn+'\\idaapi.api' api.load(API_FILE) api.load(API_FILE2) api.load(API_FILE3) api.prepare() self.codebox.setAutoCompletionThreshold(0) self.codebox.setAutoCompletionThreshold(6) self.codebox.setAutoCompletionThreshold(8) self.codebox.setAutoCompletionSource(Qsci.QsciScintilla.AcsAPIs) self.lexer.setDefaultFont(self.skrift) self.codebox.setLexer(self.lexer) self.codebox.SendScintilla(QsciScintilla.SCI_STYLESETFONT, 1, 'Consolas') #line numbers fontmetrics = QFontMetrics(self.skrift) self.codebox.setMarginsFont(self.skrift) self.codebox.setMarginWidth(0, fontmetrics.width("00000") + 6) self.codebox.setTabWidth(4) #brace self.codebox.setBraceMatching(QsciScintilla.SloppyBraceMatch) #auto line tab =4 self.codebox.setAutoIndent(True) #scroolbar self.codebox.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 1) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "Ida Pro Python Script Editor", None)) self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar", None)) def udder(self): self.codebox.zoomIn() def odder(self): self.codebox.zoomOut() def newfile(self): self.codebox.clear() def open(self): self.path = QtCore.QFileInfo(self.filename).path() # Get filename and show only .writer files (self.filename, _) = \ QtWidgets.QFileDialog.getOpenFileName(self.vindu, 'Open File', self.path, 'Python Files (*.py *.pyc *.pyw)', '') if self.filename: with open(self.filename, 'r') as self.file: self.codebox.setText(self.file.read()) os.chdir(str(self.path)) def savefile(self): self.path = QtCore.QFileInfo(self.filename).path() (self.filename, _) = \ QtWidgets.QFileDialog.getSaveFileName(self.vindu, 'Save as' , self.path, 'Python Files (*.py *.pyc *.pyw)') if self.filename: self.savetext(self.filename) os.chdir(str(self.path)) def savetext(self, fileName): textout = self.codebox.text() file = QtCore.QFile(fileName) if file.open(QtCore.QIODevice.WriteOnly): QtCore.QTextStream(file) << textout else: QtWidgets.QMessageBox.information(self.vindu, 'Unable to open file', file.errorString()) os.chdir(str(self.path)) def runto(self): self.path = QtCore.QFileInfo(self.filename).path() g = globals() os.chdir(str(self.path)) script = str(self.codebox.text()) try: exec (script, g) QtGui.QCloseEvent() except ImportError: os.chdir(str(self.path)) os.path.join(os.path.expanduser('~'), os.path.expandvars(str(self.path))) sys.path.insert(0, str(self.path)) exec (script, g) QtGui.QCloseEvent() except Exception, e: print str(e) QtGui.QCloseEvent()
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.Qsci import QsciScintilla, QsciLexerPython if __name__ == "__main__": app = QApplication(sys.argv) font = QFont() font.setFamily('Courier') font.setFixedPitch(True) editor = QsciScintilla() editor.setFont(font) lexer = QsciLexerPython() lexer.setFont(font) editor.setLexer(lexer) editor.show() editor.setText(open(sys.argv[0]).read()) app.exec_()
def _setup_editor(self): # set default editor settings self.editor.setFont(DEFAULT_FONT) self.editor.setMarginsFont(LINENO_FONT) self.editor.setBraceMatching(QsciScintilla.SloppyBraceMatch) self.editor.setCaretLineVisible(True) self.editor.setCaretForegroundColor(QColor('#000000')) self.editor.setCaretLineBackgroundColor(QColor('#c4e8fd')) self.editor.setAutoIndent(True) self.editor.setTabIndents(True) # tab width self.editor.setTabWidth(4) # line numbers (margin 0) self.editor.setMarginLineNumbers(0, True) self.editor.setMarginWidth(0, '00000') # hide symbol margin self.editor.setMarginWidth(1, 0) # folding self.editor.setFolding(1) # indentation guides self.editor.setIndentationGuides(True) # wrap mode wrap_lines = False self.editor.setWrapMode(wrap_lines) if wrap_lines: # remove horizontal scrollBar self.editor.SendScintilla(SCI.SCI_SETHSCROLLBAR, 0, 0) lexer = QsciLexerPython(self) # apply default settings to lexer lexer.setDefaultFont(DEFAULT_FONT) lexer.setFont(DEFAULT_FONT) # margins lexer.setPaper(MARGIN_BGCOLOR, SCI.STYLE_LINENUMBER) lexer.setColor(MARGIN_COLOR, SCI.STYLE_LINENUMBER) lexer.setFont(DEFAULT_FONT, SCI.STYLE_LINENUMBER) # assign the lexer self.editor.setLexer(lexer) self.editor.SendScintilla(SCI.SCI_COLOURISE, 0, -1) # margins self.editor.setMarginsBackgroundColor(MARGIN_BGCOLOR) self.editor.setMarginsForegroundColor(MARGIN_COLOR) self.editor.setMarginsFont(LINENO_FONT) # folding self.editor.setFolding(FOLDING) self.editor.SendScintilla(SCI.SCI_SETMARGINWIDTHN, FOLD_MARGIN_NUM, FOLD_MARGIN_WIDTH) # set fold margin colors self.editor.SendScintilla(SCI.SCI_SETFOLDMARGINCOLOUR, True, Main._color_to_bgr_int(FOLD_MARGIN_COLOR)) self.editor.SendScintilla(SCI.SCI_SETFOLDMARGINHICOLOUR, True, Main._color_to_bgr_int(FOLD_MARGIN_HICOLOR)) # create and configure the breakpoint column self.editor.setMarginWidth(self.__symbol_margin_num, 17) self.editor.markerDefine(BREAKPOINT_SYMBOL, self.__breakpoint_marker_num) self.editor.setMarginMarkerMask(self.__symbol_margin_num, self.__breakpoint_marker_mask) self.editor.setMarkerBackgroundColor(BREAKPOINT_COLOR, self.__breakpoint_marker_num) # make breakpoint margin clickable self.editor.setMarginSensitivity(self.__symbol_margin_num, True) # add new callback for breakpoints self.editor.marginClicked.connect(self._slot_margin_clicked) # setup active line marker self.editor.markerDefine(ACTIVE_LINE_SYMBOL, self.__active_line_marker_num) self.editor.setMarkerForegroundColor(ACTIVE_LINE_COLOR, self.__active_line_marker_num) self.editor.setMarkerBackgroundColor(ACTIVE_LINE_COLOR, self.__active_line_marker_num) # connect signals self.editor.textChanged.connect(self._slot_text_changed) self.editor.modificationChanged.connect( self._slot_editor_modification_changed) self.editor.SCN_URIDROPPED.connect(self._slot_file_dropped) self.editor.copyAvailable.connect(self.actionCut.setEnabled) self.editor.copyAvailable.connect(self.actionCopy.setEnabled) self.editor.selectionChanged.connect( lambda: self.actionDelete.setEnabled(self.editor.hasSelectedText() )) self.editor.selectionChanged.connect( lambda: self.actionSelectAll.setEnabled(self.editor. hasSelectedText())) # autocomplete if API_FILE is not None: apis = QsciAPIs(self.editor.lexer()) apis.loadPrepared(API_FILE) self.editor.setAutoCompletionThreshold(3) # The source is any installed APIs. self.editor.setAutoCompletionSource(QsciScintilla.AcsAPIs)
class PMCodeEditor(QWidget, Ui_FormEditor): def __init__(self, *args, **kwargs): super(PMCodeEditor, self).__init__(*args, **kwargs) self.setupUi(self) self._lexer = None self._apis = None self._init_editor() self._init_lexer() self._init_apis() self._init_signals() def _init_editor(self): """ 初始化编辑器设置 Returns: """ self.label_status_ln_col.setText(self.tr('行:1 列:1')) self.label_status_length.setText(self.tr('长度:0 行数:1')) self.label_status_sel.setText(self.tr('选中:0 | 0')) self.textEdit.setContextMenuPolicy(Qt.CustomContextMenu) # 设置字体 self.textEdit.setFont(QFont('Source Code Pro', 12)) # Consolas self.textEdit.setMarginsFont(self.textEdit.font()) # 自动换行 self.textEdit.setEolMode(QsciScintilla.EolUnix) # \n换行 self.textEdit.setWrapMode(QsciScintilla.WrapWord) # 自动换行 self.textEdit.setWrapVisualFlags(QsciScintilla.WrapFlagNone) self.textEdit.setWrapIndentMode(QsciScintilla.WrapIndentFixed) # 编码 self.textEdit.setUtf8(True) self.textEdit.SendScintilla(QsciScintilla.SCI_SETCODEPAGE, QsciScintilla.SC_CP_UTF8) # 自动提示 self.textEdit.setAnnotationDisplay( QsciScintilla.AnnotationBoxed) # 提示显示方式 self.textEdit.setAutoCompletionSource( QsciScintilla.AcsAll) # 自动补全。对于所有Ascii字符 self.textEdit.setAutoCompletionReplaceWord(True) self.textEdit.setAutoCompletionCaseSensitivity(False) # 忽略大小写 # self.textEdit.setAutoCompletionUseSingle(QsciScintilla.AcusAlways) self.textEdit.setAutoCompletionThreshold(1) # 输入多少个字符才弹出补全提示 self.textEdit.setCallTipsPosition( QsciScintilla.CallTipsBelowText) # 设置提示位置 self.textEdit.setCallTipsStyle( QsciScintilla.CallTipsNoContext) # 设置提示样式 # 设置折叠样式 self.textEdit.setFolding( QsciScintilla.FoldStyle.BoxedTreeFoldStyle) # 代码折叠 self.textEdit.setFoldMarginColors(QColor(233, 233, 233), Qt.white) # 折叠标签颜色 self.textEdit.SendScintilla(QsciScintilla.SCI_MARKERSETBACK, QsciScintilla.SC_MARKNUM_FOLDERSUB, QColor('0xa0a0a0')) self.textEdit.SendScintilla(QsciScintilla.SCI_MARKERSETBACK, QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL, QColor('0xa0a0a0')) self.textEdit.SendScintilla(QsciScintilla.SCI_MARKERSETBACK, QsciScintilla.SC_MARKNUM_FOLDERTAIL, QColor('0xa0a0a0')) # 设置当前行背景 self.textEdit.setCaretLineVisible(True) self.textEdit.setCaretLineBackgroundColor(QColor(232, 232, 255)) # 设置选中文本颜色 # self.textEdit.setSelectionForegroundColor(QColor(192, 192, 192)) # self.textEdit.setSelectionBackgroundColor(QColor(192, 192, 192)) # 括号匹配 self.textEdit.setBraceMatching( QsciScintilla.StrictBraceMatch) # 大括号严格匹配 self.textEdit.setMatchedBraceBackgroundColor(Qt.blue) self.textEdit.setMatchedBraceForegroundColor(Qt.white) self.textEdit.setUnmatchedBraceBackgroundColor(Qt.red) self.textEdit.setUnmatchedBraceForegroundColor(Qt.white) # 启用活动热点区域的下划线 self.textEdit.setHotspotUnderline(True) self.textEdit.setHotspotWrap(True) # 缩进 self.textEdit.setAutoIndent(True) # 换行后自动缩进 self.textEdit.setTabWidth(4) self.textEdit.setIndentationWidth(4) self.textEdit.setTabIndents(True) # 缩进指南 self.textEdit.setIndentationGuides(True) self.textEdit.setIndentationsUseTabs(False) # 不使用Tab self.textEdit.setBackspaceUnindents(True) # 当一行没有其它字符时删除前面的缩进 self.textEdit.setIndentationGuidesForegroundColor(QColor( 192, 192, 192)) self.textEdit.setIndentationGuidesBackgroundColor(Qt.white) # 显示行号 self.textEdit.setMarginLineNumbers(0, True) self.textEdit.setMarginWidth(0, 50) self.textEdit.setMarginWidth(1, 0) # 行号 # self.textEdit.setMarginWidth(2, 0) # 折叠 self.textEdit.setMarginWidth(3, 0) self.textEdit.setMarginWidth(4, 0) # # 折叠区域 # self.textEdit.setMarginType(3, QsciScintilla.SymbolMargin) # self.textEdit.setMarginLineNumbers(3, False) # self.textEdit.setMarginWidth(3, 15) # self.textEdit.setMarginSensitivity(3, True) # 设置空白字符显示 self.textEdit.setWhitespaceSize(1) # 可见的空白点的尺寸 self.textEdit.setWhitespaceVisibility( QsciScintilla.WsVisible) # 空白的可见性。默认的是空格是无形的 self.textEdit.setWhitespaceForegroundColor(QColor(255, 181, 106)) def _init_lexer(self): """ 初始化语法解析器 Returns: """ self._lexer = QsciLexerPython(self.textEdit) self._lexer.setFont(self.textEdit.font()) self.textEdit.setLexer(self._lexer) def _init_apis(self): """ 加载自定义智能提示文件 Returns: """ self._apis = QsciAPIs(self._lexer) for path in Path(os.path.dirname(__file__)).rglob('*.api'): self._apis.load(str(path.absolute())) self._apis.prepare() def _init_signals(self): """ 初始化信号绑定 Returns: """ # 绑定光标变化信号 self.textEdit.cursorPositionChanged.connect( self.slot_cursor_position_changed) # 绑定内容改变信号 self.textEdit.textChanged.connect(self.slot_text_changed) # 绑定选中变化信号 self.textEdit.selectionChanged.connect(self.slot_selection_changed) # 绑定是否被修改信号 self.textEdit.modificationChanged.connect( self.slot_modification_changed) # 绑定右键菜单信号 self.textEdit.customContextMenuRequested.connect( self.slot_custom_context_menu_requested) def slot_cursor_position_changed(self, line: int, column: int): """ 光标变化槽函数 Args: line: column: Returns: """ self.label_status_ln_col.setText( self.tr('行:{0} 列:{1}').format(line + 1, column + 1)) def slot_text_changed(self): """ 内容变化槽函数 Returns: """ self.label_status_length.setText( self.tr('长度:{0} 行数:{1}').format(self.textEdit.length(), self.textEdit.lines())) def slot_selection_changed(self): """ 选中内容变化槽函数 Returns: """ lineFrom, indexFrom, lineTo, indexTo = self.textEdit.getSelection() lines = 0 if lineFrom == lineTo == -1 else lineTo - lineFrom + 1 self.label_status_sel.setText( self.tr('选中:{0} | {1}').format(len(self.textEdit.selectedText()), lines)) def slot_modification_changed(self, modified: bool): """ 内容被修改槽函数 Args: modified: Returns: """ title = self.windowTitle() if modified: if not title.startswith('*'): self.setWindowTitle('*' + title) else: if title.startswith('*'): self.setWindowTitle(title[1:]) def slot_custom_context_menu_requested(self, pos: QPoint): """ 右键菜单修改 Args: pos: Returns: """ # 创建默认菜单 menu = self.textEdit.createStandardContextMenu() country = QLocale.system().country() is_china = QLocale.system().language( ) == QLocale.Chinese or country in (QLocale.China, QLocale.HongKong, QLocale.Taiwan) # 遍历本身已有的菜单项做中文翻译处理 # 前提是要加载了Qt自带的翻译文件 for action in menu.actions(): if is_china: action.setText( QCoreApplication.translate('QTextControl', action.text())) menu.exec_(self.textEdit.mapToGlobal(pos)) del menu