class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) if linux_distribution(): self.menu = QMenu('Open with') self.menu.aboutToShow.connect(self.build_submenu) self.ex_locator = self.locator.get_service('explorer') self.ex_locator.add_project_menu(self.menu, lang='all') def build_submenu(self): ''' build sub menu on the fly based on file path ''' self.menu.clear() if self.ex_locator.get_current_project_item().isFolder is not True: filenam = self.ex_locator.get_current_project_item().get_full_path() entry = xdg_query('default', guess_type(filenam, strict=False)[0]) if entry: app = entry.replace('.desktop', '') self.menu.addActions([ QAction(QIcon.fromTheme(app), app, self, triggered=lambda: Popen([app, filenam])), QAction(QIcon.fromTheme('folder-open'), 'File Manager', self, triggered=lambda: Popen(['xdg-open', path.dirname(filenam)]))]) self.menu.show()
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) self.menu = QMenu('Convert Image') self.menu.aboutToShow.connect(self.build_submenu) self.ex_locator = self.locator.get_service('explorer') self.ex_locator.add_project_menu(self.menu, lang='all') def build_submenu(self): ''' build sub menu on the fly based on file path ''' self.menu.clear() if self.ex_locator.get_current_project_item().isFolder is not True: filenam = self.ex_locator.get_current_project_item().get_full_path() # pillow.readthedocs.org/en/latest/handbook/image-file-formats.html exten = ('bmp', 'cur', 'gbr', 'gif', 'ico', 'jfif', 'jpeg', 'pbm', 'pcx', 'pgm', 'png', 'ppm', 'psd', 'tga', 'tiff', 'xbm', 'xpm') conditional = path.splitext(filenam)[1][1:].strip().lower() in exten if conditional: self.menu.addActions([ QAction('{} to WEBP'.format(path.basename(filenam)[:50]), self, triggered=lambda: self.convert_img('WEBP')), QAction('{} to JPG'.format(path.basename(filenam)[:50]), self, triggered=lambda: self.convert_img('JPEG')), QAction('{} to PNG'.format(path.basename(filenam)[:50]), self, triggered=lambda: self.convert_img('PNG')), ]) self.menu.show() def convert_img(self, fmt): """ convert image to desired format """ filenam = self.ex_locator.get_current_project_item().get_full_path() im = Image.open(filenam).convert("RGB") im.save(path.splitext(filenam)[0] + ".{}".format(fmt.lower()), fmt)
class TrayIcon(QSystemTrayIcon): def __init__(self, parent=None, clickEnable=True): QtGui.QSystemTrayIcon.__init__(self, parent) # 设置关闭所有窗口,也不关闭应用程序 # QtGui.QApplication.instance().setQuitOnLastWindowClosed(False) # 设置系统托盘图标 self.setIcon(QIcon(resource_path('img/android_tools_logo.png'))) # 托盘能否被点击 self.clickEnable = clickEnable # 托盘被点击 self.activated.connect(self.trayClickActive) # 托盘消息被点击 self.messageClicked.connect(self.trayMsgClick) self.menu = QMenu() self.quitAction = QtGui.QAction(u'退出', self, triggered=self.quit) self.menu.addAction(self.quitAction) self.setContextMenu(self.menu) def trayClickActive(self, reason): if not self.clickEnable: return # 鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击 # http://doc.qt.io/qt-5/qsystemtrayicon.html (ActivationReason) if reason == QSystemTrayIcon.DoubleClick or reason == QSystemTrayIcon.Trigger: pw = self.parent() if not pw: pass elif pw.isVisible(): pw.hide() else: pw.show() self.emit(QtCore.SIGNAL('showProgramSignal')) elif reason == QSystemTrayIcon.Context: self.showMenu() # print reason def trayMsgClick(self): # self.showMessage("FFStore", "click msg", icon=1) pass def showMsg(self, msg, title="AndroidTools"): # self.showMessage("提示", "你点了消息", self.icon) # http://doc.qt.io/qt-5/qsystemtrayicon.html (MessageIcon) self.show() self.showMessage(title, msg, icon=1) def showMenu(self): self.menu.show() def quit(self): self.setVisible(False) QtGui.QApplication.quit() self.hide() sys.exit() def showProgramSignal(self): return
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) if linux_distribution(): self.menu = QMenu('Open with') self.menu.aboutToShow.connect(self.build_submenu) self.ex_locator = self.locator.get_service('explorer') self.ex_locator.add_project_menu(self.menu, lang='all') def build_submenu(self): ''' build sub menu on the fly based on file path ''' self.menu.clear() if self.ex_locator.get_current_project_item().isFolder is not True: filenam = self.ex_locator.get_current_project_item().get_full_path() entry = xdg_query('default', guess_type(filenam, strict=False)[0]) if entry: app = entry.replace('.desktop', '') actions = [ QAction(QIcon.fromTheme(app), app, self, triggered=lambda: Popen([app, filenam])), QAction(QIcon.fromTheme('folder-open'), 'File Manager', self, triggered=lambda: Popen(['xdg-open', path.dirname(filenam)]))] #QAction(QIcon.fromTheme('Sublime Text 2'), 'Sublime', # self, triggered=lambda: Popen(['sublime-text', filenam])), #QAction(QIcon.fromTheme('Sqliteman'), 'Sqliteman', # self, triggered=lambda: Popen(['sqliteman', filenam])), #QAction(QIcon.fromTheme('Google Chrome'), 'Google Chrome', # self, triggered=lambda: Popen(['google-chrome', filenam])) for key in usersettings.commands.keys(): action = QAction(QIcon.fromTheme(key), key, self, triggered=lambda: Popen([usersettings.commands[key], filenam])) actions.append(action) self.menu.addActions(actions) self.menu.show()
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) self.menu1 = QMenu('Compress') self.menu1.aboutToShow.connect(self.build_submenu) self.ex_locator = self.locator.get_service('explorer') self.ex_locator.add_project_menu(self.menu1, lang='all') if not version_info[0] < 3: self.menu2 = QMenu('Extract') self.menu2.aboutToShow.connect(self.build_submenu) self.ex_locator.add_project_menu(self.menu2, lang='all') def build_submenu(self): ''' build sub menu on the fly based on file path ''' self.menu1.clear() if self.ex_locator.get_current_project_item().isFolder is True: folder = self.ex_locator.get_current_project_item().get_full_path() self.menu1.addActions([ QAction('To ZIP', self, triggered=lambda: make_archive(folder, 'zip', folder)), QAction('To TAR', self, triggered=lambda: make_archive(folder, 'tar', folder)), QAction('To BZ2', self, triggered=lambda: make_archive(folder, 'bztar', folder))]) self.menu1.show() elif not version_info[0] < 3: self.menu2.clear() filenam = self.ex_locator.get_current_project_item().get_full_path() exten = ('zip', 'tar', 'bz2', 'bztar', 'gztar') conditional = path.splitext(filenam)[1][1:].strip().lower() in exten if conditional: self.menu2.addAction(QAction('From {}'.format( path.splitext(filenam)[1].upper()), self, triggered=lambda: unpack_archive(filenam, path.dirname(filenam)))) self.menu2.show()
class PythonConsoleWidget(QDockWidget): """ original code pulled from: http://stackoverflow.com/questions/31380457/add-right-click-functionality-to-listwidget-in-pyqt4 http://stackoverflow.com/questions/20951660/creating-a-syntax-highlighter-in-pythonpyqt4 http://eli.thegreenplace.net/2011/04/01/sample-using-qscintilla-with-pyqt """ def __init__(self, parent): self.parent = parent super(PythonConsoleWidget, self).__init__('Python Console', parent=parent) #super(QDockWidget, self).__init__('Python Console', parent=parent) # I think this works by accident in qt4/5 self.listMenu = QMenu() self.execute_python_button = QPushButton('Execute') self.execute_and_clear_python_button = QPushButton('Execute and Clear') if is_pygments and is_scintilla: #self.enter_data = QSyntaxHighlighting() self.enter_data = SimplePythonEditorWidget() else: self.enter_data = QTextEdit() font = QFont() font.setFamily('Courier') self.enter_data.setFont(font) self.setup_connections() self.layout() def layout(self): vbox = QVBoxLayout() hbox = QHBoxLayout() vbox.addWidget(self.enter_data) hbox.addWidget(self.execute_python_button) hbox.addWidget(self.execute_and_clear_python_button) vbox.addLayout(hbox) vbox_widget = QWidget() vbox_widget.setLayout(vbox) self.setWidget(vbox_widget) def setup_connections(self): if qt_version == 4: self.connect(self.execute_python_button, QtCore.SIGNAL('clicked()'), self.on_execute_python_button) self.connect(self.execute_and_clear_python_button, QtCore.SIGNAL('clicked()'), self.on_execute_and_clear_python_button) else: self.execute_python_button.clicked.connect( self.on_execute_python_button) self.execute_and_clear_python_button.clicked.connect( self.on_execute_and_clear_python_button) #self.on_rig # TODO: enables the right click menu # messes up the previous right click menu #self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) #self.connect(self, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), # self.listItemRightClicked) menu_item1 = self.listMenu.addAction("Properties...") menu_item2 = self.listMenu.addAction("Select All...") menu_item3 = self.listMenu.addAction("Copy...") menu_item1.triggered.connect(self.menuItemClicked_1) menu_item2.triggered.connect(self.menuItemClicked_2) menu_item3.triggered.connect(self.menuItemClicked_3) #self.connect(menu_item1, QtCore.SIGNAL("triggered()"), self.menuItemClicked_1) #self.connect(menu_item2, QtCore.SIGNAL("triggered()"), self.menuItemClicked_2) #self.connect(menu_item3, QtCore.SIGNAL("triggered()"), self.menuItemClicked_3) # we have to create a QWidget to put the console vbox into vbox_widget because # self.setLayout(vbox) # is not supported in a QDockWidget def on_execute_and_clear_python_button(self): self.parent._on_execute_python_button(clear=True) def on_execute_python_button(self): self.parent._on_execute_python_button(clear=False) def listItemRightClicked(self, QPos): """ TDOO: not done... """ return parentPosition = self.mapToGlobal(QtCore.QPoint(0, 0)) self.listMenu.move(parentPosition + QPos) self.listMenu.show() def menuItemClicked_1(self): print(1) def menuItemClicked_2(self): print(2) def menuItemClicked_3(self): print(3)
class MenuManager(QWidget, Ui_nodeActions): def __init__(self, selection, listmodel): super(QWidget, self).__init__() self.__iconView = False self.setupUi(self) self.processusManager = ProcessusManager() self.loader = loader.loader() self.lmodules = self.loader.modules self.taskmanager = TaskManager() self.mainwindow = QApplication.instance().mainWindow self.createActions() self.checkedSelection = selection self.selection = None self.model = listmodel self.bookManager = BookmarkManager(self.model) #self.document = QtWebKit.QWebView() #self.document.loadFinished.connect(self.__print) self.__corrupt = base64.b64encode( str(QtGui.QImage(":file_broken.png").bits())) self.__printer = QtGui.QPrinter(QtGui.QPrinter.ScreenResolution) self.__printer.setOutputFormat(QtGui.QPrinter.PdfFormat) self.__printer.setPaperSize(QtGui.QPrinter.A4) self.__printer.setFullPage(True) def setupUi(self, nodeActions): self.actionScan = QAction(self) icon = QIcon() icon.addPixmap(QPixmap(QString.fromUtf8(":/scan")), QIcon.Normal, QIcon.On) self.actionScan.setIcon(icon) self.actionScan.setObjectName(QString.fromUtf8("actionScan")) self.actionReport_node = QAction(self) icon = QIcon() icon.addPixmap(QPixmap(QString.fromUtf8(":/report")), QIcon.Normal, QIcon.On) self.actionReport_node.setIcon(icon) self.actionReport_node.setObjectName( QString.fromUtf8("actionReport_Node")) Ui_nodeActions.setupUi(self, nodeActions) def retranslateUi(self, nodeActions): Ui_nodeActions.retranslateUi(self, nodeActions) self.actionScan.setText( QApplication.translate("nodeActions", "Scan", None, QApplication.UnicodeUTF8)) self.actionScan.setToolTip( QApplication.translate("nodeActions", "Launch recursive scan", None, QApplication.UnicodeUTF8)) self.actionReport_node.setText( QApplication.translate("nodeActions", "Report", None, QApplication.UnicodeUTF8)) self.actionReport_node.setToolTip( QApplication.translate("nodeActions", "Tag nodes", None, QApplication.UnicodeUTF8)) def setIconView(self, enable): self.__iconView = enable def createActions(self): self.extractor = Extractor(self.mainwindow) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.actionOpen.setParent(self.mainwindow) self.actionOpen_in_new_tab.setParent(self.mainwindow) self.copyToHtmlTable = QAction(self.tr("Export selection to pdf"), self) self.copyToHtmlTable.triggered.connect(self.__exportToPdf) self.connect(self.actionOpen, SIGNAL("triggered()"), self.openDefault) self.connect(self.actionOpen_in_new_tab, SIGNAL("triggered()"), self.openAsNewTab) self.connect(self.actionOpen_parent_folder, SIGNAL("triggered()"), self.openParentFolder) self.connect(self.actionHex_viewer, SIGNAL("triggered()"), self.launchHexedit) self.connect(self.actionExtract, SIGNAL("triggered()"), self.extractNodes) self.connect(self.actionBookmark, SIGNAL("triggered()"), self.bookmark) self.connect(self.actionScan, SIGNAL('triggered()'), self.scan) self.connect(self.actionReport_node, SIGNAL('triggered()'), self.reportNode) def createMenu(self): nodeclicked = self.model.currentNode() self.mainmenu = QMenu(self.mainwindow) self.selection = self.model.currentNode() self.setOpenRelevant() self.setOpenWith() self.mainmenu.addAction(self.actionOpen) self.mainmenu.addAction(self.actionOpen_with) self.mainmenu.addAction(self.actionOpen_in_new_tab) self.mainmenu.addAction(self.actionOpen_parent_folder) if nodeclicked.isDir() or nodeclicked.hasChildren(): self.actionOpen_parent_folder.setVisible(False) self.actionOpen_parent_folder.setEnabled(False) self.actionOpen_in_new_tab.setVisible(True) self.actionOpen_in_new_tab.setEnabled(True) else: self.actionOpen_in_new_tab.setVisible(False) self.actionOpen_in_new_tab.setEnabled(False) self.actionOpen_parent_folder.setVisible(True) self.actionOpen_parent_folder.setEnabled(True) self.mainmenu.addSeparator() selection = selectionMenu(self, self.model) self.mainmenu.addMenu(selection) tags = tagMenu(self, self.mainwindow, self.model) self.actionTags.setMenu(tags) self.mainmenu.addAction(self.actionTags) self.mainmenu.addAction(self.actionBookmark) if nodeclicked.path().find('/Bookmarks/') != -1: self.mainmenu.addAction(QIcon(":trash"), self.tr("Delete bookmark"), self.deleteBookmark) self.bookseparator = self.mainmenu.addSeparator() self.mainmenu.addAction(self.actionHex_viewer) self.mainmenu.addAction(self.actionExtract) if self.__iconView: self.mainmenu.addAction(self.copyToHtmlTable) self.mainmenu.popup(QCursor.pos()) self.mainmenu.insertSeparator(self.actionOpen_parent_folder) self.mainmenu.insertAction(self.actionOpen_parent_folder, self.actionScan) self.mainmenu.addSeparator() self.mainmenu.insertAction(self.bookseparator, self.actionReport_node) self.mainmenu.show() def reportNode(self): ReportNodesAction(self.model) def scan(self): autoWiz = AutoWizard(self, root=self.model.currentNode()) autoWiz.exec_() def deleteBookmark(self): vfs = VFS.Get() try: vfs.unregister(self.model.currentNode()) except Exception as e: print 'TreeMenu.deleteNode exceptions : ', str(e) def setOpenRelevant(self): if self.selection != None: node = self.selection modules = node.compatibleModules() if len(modules): relevant = QMenu() for modname in modules: module = self.loader.modules[modname] relevant.addAction( newAction(self, self.mainwindow, modname, module.tags, module.icon)) self.actionOpen.setMenu(relevant) def __exportToPdf(self): pdfFile = QtGui.QFileDialog.getSaveFileName( self, self.tr("Export to pdf file"), os.path.expanduser("~"), self.tr("Pdf files (*.pdf)")) if not pdfFile.endsWith(".pdf"): pdfFile.append(".pdf") self.__printer.setOutputFileName(pdfFile) self.__createPdf() def __createPdf(self): html = """ <html> <head> <style type="text/css"> img { max-width: 340px; max-height: 340px; width: expression(this.width > 340 ? "340px" : true); height: expression(this.height > 340 ? "340px" : true); } .break { page-break-before: always; } </style> </head> <body> """ start = """<table style="height: 100%; margin: 1px auto; border-spacing: 10px; border-collapse: separate;">""" end = """</table><p class="break"></p>""" count = 1 row = "" for uid in self.checkedSelection._selection: cell = self.__nodeToHtmlCell(uid) if len(cell): row += cell if count == 1: html += start if count % 3 == 0: html += "<tr>\n{}\n</tr>".format(row) row = "" if count == 9: html += end count = 0 row = "" count += 1 if len(row): html += "<tr>{}</tr></table>".format(row) html += "</body></html>" self.document.setHtml(html) def __nodeToHtmlCell(self, uid): imagecell = """<td style="text-align: center;"><img src="data:image/jpg;base64,{}"/><br />{} {} {}</td>""" node = VFS.Get().getNodeById(uid) timestamp = "" device = "" model = "" make = "" b64image = self.__corrupt if node is not None: dtype = node.dataType() try: if dtype.find("image") != -1: vfile = node.open() image = vfile.read() vfile.close() data = node.attributesByName("exif.Model", ABSOLUTE_ATTR_NAME) if len(data): model = data[0].toString() data = node.attributesByName("exif.Make", ABSOLUTE_ATTR_NAME) if len(data): make = data[0].toString() if len(model) or len(make): device = "<br />{} {}".format(model, make) data = node.attributesByName("exif.DateTimeDigitized", ABSOLUTE_ATTR_NAME) if len(data): timestamp = "<br /> {}".format(data[0].toString()) b64image = base64.b64encode(image) except: pass return imagecell.format(b64image, node.name(), device, timestamp) return "" def __print(self, ok): self.document.print_(self.__printer) def setOpenWith(self): owmenu = QMenu() setags = Utils.getSetTags() selist = list(setags) selist.sort() owmenu.addAction(self.mainwindow.actionBrowse_modules) owmenu.addSeparator() for tags in selist: if not tags == "builtins": action = QAction(QString(tags), self.mainwindow) menu = self.getMenuFromModuleTag(tags) action.setMenu(menu) owmenu.addAction(action) self.actionOpen_with.setMenu(owmenu) def getMenuFromModuleTag(self, tagname): menu = QMenu() modules = self.loader.modules for mod in modules: m = modules[mod] try: if m.tags == tagname: menu.addAction( newAction(self, self.mainwindow, mod, tagname, m.icon)) # actions.append(newAction(self, self.__mainWindow, mod, self.tags, m.icon)) except AttributeError, e: pass return menu
class PythonConsoleWidget(QDockWidget): """ original code pulled from: http://stackoverflow.com/questions/31380457/add-right-click-functionality-to-listwidget-in-pyqt4 http://stackoverflow.com/questions/20951660/creating-a-syntax-highlighter-in-pythonpyqt4 http://eli.thegreenplace.net/2011/04/01/sample-using-qscintilla-with-pyqt """ def __init__(self, parent): self.parent = parent super(PythonConsoleWidget, self).__init__('Python Console', parent=parent) #super(QDockWidget, self).__init__('Python Console', parent=parent) # I think this works by accident in qt4/5 self.listMenu = QMenu() self.execute_python_button = QPushButton('Execute') self.execute_and_clear_python_button = QPushButton('Execute and Clear') if is_pygments and is_scintilla: #self.enter_data = QSyntaxHighlighting() self.enter_data = SimplePythonEditorWidget() else: self.enter_data = QTextEdit() font = QFont() font.setFamily('Courier') self.enter_data.setFont(font) self.setup_connections() self.layout() def layout(self): vbox = QVBoxLayout() hbox = QHBoxLayout() vbox.addWidget(self.enter_data) hbox.addWidget(self.execute_python_button) hbox.addWidget(self.execute_and_clear_python_button) vbox.addLayout(hbox) vbox_widget = QWidget() vbox_widget.setLayout(vbox) self.setWidget(vbox_widget) def setup_connections(self): if qt_version == 4: self.connect(self.execute_python_button, QtCore.SIGNAL('clicked()'), self.on_execute_python_button) self.connect(self.execute_and_clear_python_button, QtCore.SIGNAL('clicked()'), self.on_execute_and_clear_python_button) else: self.execute_python_button.clicked.connect(self.on_execute_python_button) self.execute_and_clear_python_button.clicked.connect( self.on_execute_and_clear_python_button) #self.on_rig # TODO: enables the right click menu # messes up the previous right click menu #self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) #self.connect(self, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), # self.listItemRightClicked) menu_item1 = self.listMenu.addAction("Properties...") menu_item2 = self.listMenu.addAction("Select All...") menu_item3 = self.listMenu.addAction("Copy...") menu_item1.triggered.connect(self.menuItemClicked_1) menu_item2.triggered.connect(self.menuItemClicked_2) menu_item3.triggered.connect(self.menuItemClicked_3) #self.connect(menu_item1, QtCore.SIGNAL("triggered()"), self.menuItemClicked_1) #self.connect(menu_item2, QtCore.SIGNAL("triggered()"), self.menuItemClicked_2) #self.connect(menu_item3, QtCore.SIGNAL("triggered()"), self.menuItemClicked_3) # we have to create a QWidget to put the console vbox into vbox_widget because # self.setLayout(vbox) # is not supported in a QDockWidget def on_execute_and_clear_python_button(self): self.parent._on_execute_python_button(clear=True) def on_execute_python_button(self): self.parent._on_execute_python_button(clear=False) def listItemRightClicked(self, QPos): """ TDOO: not done... """ return parentPosition = self.mapToGlobal(QtCore.QPoint(0, 0)) self.listMenu.move(parentPosition + QPos) self.listMenu.show() def menuItemClicked_1(self): print(1) def menuItemClicked_2(self): print(2) def menuItemClicked_3(self): print(3)
class MenuManager(QWidget, Ui_nodeActions): def __init__(self, selection, listmodel): super(QWidget, self).__init__() self.setupUi(self) self.processusManager = ProcessusManager() self.loader = loader.loader() self.lmodules = self.loader.modules self.taskmanager = TaskManager() self.mainwindow = QApplication.instance().mainWindow self.createActions() self.checkedSelection = selection self.selection = None self.model = listmodel self.bookManager = BookmarkManager(self.model) def createActions(self): self.extractor = Extractor(self.mainwindow) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.actionOpen.setParent(self.mainwindow) self.actionOpen_in_new_tab.setParent(self.mainwindow) self.connect(self.actionOpen, SIGNAL("triggered()"), self.openDefault) self.connect(self.actionOpen_in_new_tab, SIGNAL("triggered()"), self.openAsNewTab) self.connect(self.actionOpen_parent_folder, SIGNAL("triggered()"), self.openParentFolder) self.connect(self.actionHex_viewer, SIGNAL("triggered()"), self.launchHexedit) self.connect(self.actionExtract, SIGNAL("triggered()"), self.extractNodes) self.connect(self.actionBookmark, SIGNAL("triggered()"), self.bookmark) def createMenu(self): nodeclicked = self.model.currentNode() self.mainmenu = QMenu(self.mainwindow) self.selection = self.model.currentNode() self.setOpenRelevant() self.setOpenWith() self.mainmenu.addAction(self.actionOpen) self.mainmenu.addAction(self.actionOpen_with) self.mainmenu.addAction(self.actionOpen_in_new_tab) self.mainmenu.addAction(self.actionOpen_parent_folder) if nodeclicked.isDir() or nodeclicked.hasChildren(): self.actionOpen_parent_folder.setVisible(False) self.actionOpen_parent_folder.setEnabled(False) self.actionOpen_in_new_tab.setVisible(True) self.actionOpen_in_new_tab.setEnabled(True) else: self.actionOpen_in_new_tab.setVisible(False) self.actionOpen_in_new_tab.setEnabled(False) self.actionOpen_parent_folder.setVisible(True) self.actionOpen_parent_folder.setEnabled(True) self.mainmenu.addSeparator() selection = selectionMenu(self, self.model) self.mainmenu.addMenu(selection) tags = tagMenu(self, self.mainwindow, self.model) self.actionTags.setMenu(tags) self.mainmenu.addAction(self.actionTags) self.mainmenu.addAction(self.actionBookmark) self.bookseparator = self.mainmenu.addSeparator() self.mainmenu.addAction(self.actionHex_viewer) self.mainmenu.addAction(self.actionExtract) self.mainmenu.popup(QCursor.pos()) self.mainmenu.show() def setOpenRelevant(self): if self.selection != None: node = self.selection modules = node.compatibleModules() if len(modules): relevant = QMenu() for modname in modules: module = self.loader.modules[modname] relevant.addAction(newAction(self, self.mainwindow, modname, module.tags, module.icon)) self.actionOpen.setMenu(relevant) def setOpenWith(self): owmenu = QMenu() setags = Utils.getSetTags() selist = list(setags) selist.sort() owmenu.addAction(self.mainwindow.actionBrowse_modules) owmenu.addSeparator() for tags in selist: if not tags == "builtins": action = QAction(QString(tags), self.mainwindow) menu = self.getMenuFromModuleTag(tags) action.setMenu(menu) owmenu.addAction(action) self.actionOpen_with.setMenu(owmenu) def getMenuFromModuleTag(self, tagname): menu = QMenu() modules = self.loader.modules for mod in modules : m = modules[mod] try : if m.tags == tagname: menu.addAction(newAction(self, self.mainwindow, mod, tagname, m.icon)) # actions.append(newAction(self, self.__mainWindow, mod, self.tags, m.icon)) except AttributeError, e: pass return menu
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) self.infile = QLineEdit(path.expanduser("~")) self.infile.setPlaceholderText(' /full/path/to/file ') self.infile.returnPressed.connect(self.run) self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.infile.setCompleter(self.completer) self.menu = QMenu('Base64') self.menu.aboutToShow.connect(self.build_submenu) self.ex_locator = self.locator.get_service('explorer') self.ex_locator.add_project_menu(self.menu, lang='all') self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.setCursor(QCursor(Qt.PointingHandCursor)) self.open.clicked.connect(lambda: self.infile.setText(str( QFileDialog.getOpenFileName(self.dock, "Open a File to Encode...", path.expanduser("~"), ';;'.join(['{}(*.{})'.format(e.upper(), e) for e in ['*', 'jpg', 'png', 'webp', 'svg', 'gif', 'webm']]))))) self.chckbx1 = QCheckBox('Use basic Caesar Cipher (ROT13)') self.chckbx1.setToolTip('Use "string".decode("rot13") to Decipher ! ') self.chckbx2 = QCheckBox('Use "data:type/subtype;base64,..."') self.chckbx2.setChecked(True) self.chckbx3 = QCheckBox('Copy encoded output to Clipboard') self.chckbx4 = QCheckBox('Use URL-Safe Base64 Encoder') self.combo1 = QComboBox() self.combo1.addItems(['Do Not Generate Code', 'Generate CSS embed Code', 'Generate Python Embed Code', 'Generate HTML embed Code', 'Generate JS embed Code', 'Generate QML embed Code']) self.combo1.currentIndexChanged.connect(self.combo_changed) self.output = QTextEdit(''' We can only see a short distance ahead, but we can see plenty there that needs to be done. - Alan Turing ''') self.output.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Encode BASE64') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) glow.setEnabled(True) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((QLabel('<i>Encode file as plain text string</i>'), QLabel('<b>File to Encode:'), self.infile, self.open, self.chckbx2, self.chckbx3, self.chckbx1, self.chckbx4, QLabel('<b>Embedding Template Code:'), self.combo1, QLabel(' <b>Base64 String Output: '), self.output, QLabel('<center><small><i>' + ''.join((__doc__, __version__, __license__, 'by', __author__))), self.button )) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ExplorerContainer().addTab(self.dock, "Base64") self.guimode = QComboBox(self.dock) self.guimode.addItems(['Full Mode', 'Simple Mode']) self.guimode.currentIndexChanged.connect(self.guimode_change) def guimode_change(self): """ Change from Simple Mode to Full Mode by Hide or Show Widgets """ if self.guimode.currentIndex() is 0: self.chckbx1.show() self.chckbx2.show() self.chckbx3.show() self.chckbx4.show() else: self.chckbx1.hide() self.chckbx2.hide() self.chckbx3.hide() self.chckbx4.hide() self.chckbx1.setChecked(False) self.chckbx2.setChecked(True) self.chckbx3.setChecked(False) self.chckbx4.setChecked(False) def build_submenu(self): ''' build sub menu on the fly based on file path ''' self.menu.clear() if self.ex_locator.get_current_project_item().isFolder is not True: filenam = self.ex_locator.get_current_project_item().get_full_path() self.menu.addActions([ QAction('Copy {} as Base64'.format(path.basename(filenam)[:50]), self, triggered=lambda: QApplication.clipboard().setText( '"data:{};charset=utf-8;base64,{}"'.format( guess_type(filenam, strict=False)[0], b64encode(open(filenam, "rb").read())))), QAction('Copy {} as Base64 URL-Safe'.format( path.basename(filenam)[:50]), self, triggered=lambda: QApplication.clipboard().setText( '"data:{};charset=utf-8;base64,{}"'.format( guess_type(filenam, strict=False)[0], urlsafe_b64encode(open(filenam, "rb").read()))))]) self.menu.show() def run(self): ' run the encoding ' mimetype = guess_type(str(self.infile.text()).strip(), strict=False)[0] _mime = mimetype if mimetype is not None else self.ask_mime() fle = str(self.infile.text()).strip().replace('file:///', '/') encoder = urlsafe_b64encode if self.chckbx4.isChecked() else b64encode if int(path.getsize(fle)) / 1024 / 1024 >= 1: QMessageBox.information(self.dock, __doc__, '''<b style="color:red"> WARNING!: File size is > 1 Megabyte!,<br> this will take some time, depending your CPU Processing power!.''') output = '"{}{}{}{}"'.format( 'data:' if self.chckbx2.isChecked() is True else '', _mime if self.chckbx2.isChecked() is True else '', ';charset=utf-8;base64,' if self.chckbx2.isChecked() is True else '', encoder(open(fle, "rb").read())) if self.combo1.currentIndex() is 1: output = ('html, body { margin:0; padding:0; background: url(' + output + ') no-repeat center center fixed; background-size:cover }') elif self.combo1.currentIndex() is 2: output = PY_EMBED.format(getuser(), datetime.now().isoformat().split('.')[0], output) elif self.combo1.currentIndex() is 3: output = '<img src={} alt="{}" title="{}"/>'.format(output, fle.split(sep)[-1], fle.split(sep)[-1]) elif self.combo1.currentIndex() is 4: output = 'var embedded_file = window.atob({}); '.format(output) elif self.combo1.currentIndex() is 5: output = 'Image { source: ' + output + ' } ' if self.chckbx1.isChecked() is True: output = str(output).encode('rot13') if self.chckbx3.isChecked() is True: QApplication.clipboard().setText(output) self.output.setPlainText(output) self.output.setFocus() self.output.selectAll() def ask_mime(self): ' ask user for mime type ' return str(QInputDialog.getText(self.dock, __doc__, 'Write a MIME-Type', QLineEdit.Normal, 'application/octet-stream')[0]).strip().lower() def combo_changed(self): ' on combo changed ' if self.combo1.currentIndex() is 1 or self.combo1.currentIndex() is 3: self.chckbx1.setChecked(False) self.chckbx2.setChecked(True) elif self.combo1.currentIndex() is 2 or self.combo1.currentIndex() is 4: self.chckbx1.setChecked(False) self.chckbx2.setChecked(False)
class MenuManager(QWidget, Ui_nodeActions): def __init__(self, selection, listmodel): super(QWidget, self).__init__() self.setupUi(self) self.processusManager = ProcessusManager() self.loader = loader.loader() self.lmodules = self.loader.modules self.taskmanager = TaskManager() self.mainwindow = QApplication.instance().mainWindow self.createActions() self.checkedSelection = selection self.selection = None self.model = listmodel self.bookManager = BookmarkManager(self.model) def createActions(self): self.extractor = Extractor(self.mainwindow) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.actionOpen.setParent(self.mainwindow) self.actionOpen_in_new_tab.setParent(self.mainwindow) self.connect(self.actionOpen, SIGNAL("triggered()"), self.openDefault) self.connect(self.actionOpen_in_new_tab, SIGNAL("triggered()"), self.openAsNewTab) self.connect(self.actionOpen_parent_folder, SIGNAL("triggered()"), self.openParentFolder) self.connect(self.actionHex_viewer, SIGNAL("triggered()"), self.launchHexedit) self.connect(self.actionExtract, SIGNAL("triggered()"), self.extractNodes) self.connect(self.actionBookmark, SIGNAL("triggered()"), self.bookmark) def createMenu(self): nodeclicked = self.model.currentNode() self.mainmenu = QMenu(self.mainwindow) self.selection = self.model.currentNode() self.setOpenRelevant() self.setOpenWith() self.mainmenu.addAction(self.actionOpen) self.mainmenu.addAction(self.actionOpen_with) self.mainmenu.addAction(self.actionOpen_in_new_tab) self.mainmenu.addAction(self.actionOpen_parent_folder) if nodeclicked.isDir() or nodeclicked.hasChildren(): self.actionOpen_parent_folder.setVisible(False) self.actionOpen_parent_folder.setEnabled(False) self.actionOpen_in_new_tab.setVisible(True) self.actionOpen_in_new_tab.setEnabled(True) else: self.actionOpen_in_new_tab.setVisible(False) self.actionOpen_in_new_tab.setEnabled(False) self.actionOpen_parent_folder.setVisible(True) self.actionOpen_parent_folder.setEnabled(True) self.mainmenu.addSeparator() selection = selectionMenu(self, self.model) self.mainmenu.addMenu(selection) tags = tagMenu(self, self.mainwindow, self.model) self.actionTags.setMenu(tags) self.mainmenu.addAction(self.actionTags) self.mainmenu.addAction(self.actionBookmark) self.bookseparator = self.mainmenu.addSeparator() self.mainmenu.addAction(self.actionHex_viewer) self.mainmenu.addAction(self.actionExtract) self.mainmenu.popup(QCursor.pos()) self.mainmenu.show() def setOpenRelevant(self): if self.selection != None: node = self.selection modules = node.compatibleModules() if len(modules): relevant = QMenu() for modname in modules: module = self.loader.modules[modname] relevant.addAction( newAction(self, self.mainwindow, modname, module.tags, module.icon)) self.actionOpen.setMenu(relevant) def setOpenWith(self): owmenu = QMenu() setags = Utils.getSetTags() selist = list(setags) selist.sort() owmenu.addAction(self.mainwindow.actionBrowse_modules) owmenu.addSeparator() for tags in selist: if not tags == "builtins": action = QAction(QString(tags), self.mainwindow) menu = self.getMenuFromModuleTag(tags) action.setMenu(menu) owmenu.addAction(action) self.actionOpen_with.setMenu(owmenu) def getMenuFromModuleTag(self, tagname): menu = QMenu() modules = self.loader.modules for mod in modules: m = modules[mod] try: if m.tags == tagname: menu.addAction( newAction(self, self.mainwindow, mod, tagname, m.icon)) # actions.append(newAction(self, self.__mainWindow, mod, self.tags, m.icon)) except AttributeError, e: pass return menu