def createSubMenu(self): self.extractor = Extractor(self.__mainWindow) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.submenuFile = QMenu() self.submenuFile.addAction(QIcon(":exec.png"), "Open", self.openDefault, "Listview") self.menuModules = self.submenuFile.addMenu(QIcon(":exec.png"), "Open With") self.menuTags = MenuTags(self, self.__mainWindow, self.getListCurrentNode) self.submenuFile.addSeparator() self.submenuFile.addAction( QIcon(":hexedit.png"), QApplication.translate("ListView", "Hexeditor", None, QApplication.UnicodeUTF8), self.launchHexedit, "Listview") self.submenuFile.addAction( QIcon(":extract.png"), QApplication.translate("ListView", "Extract", None, QApplication.UnicodeUTF8), self.extractNodes, "Listview") self.submenuFile.addSeparator() self.submenuFile.addAction( QIcon(":info.png"), QApplication.translate("ListView", "Property", None, QApplication.UnicodeUTF8), self.propertyNodes, "Listview")
def createSubMenu(self): self.extractor = Extractor(self.__mainWindow) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.submenuFile = QMenu() self.submenuFile.addAction(QIcon(":exec.png"), "Open", self.openDefault, "Listview") self.menuModules = self.submenuFile.addMenu(QIcon(":exec.png"), "Open With") self.menuTags = MenuTags(self, self.__mainWindow, self.getListCurrentNode) self.submenuFile.addSeparator() self.submenuFile.addAction(QIcon(":hexedit.png"), QApplication.translate("ListView", "Hexeditor", None, QApplication.UnicodeUTF8), self.launchHexedit, "Listview") self.submenuFile.addAction(QIcon(":extract.png"), QApplication.translate("ListView", "Extract", None, QApplication.UnicodeUTF8), self.extractNodes, "Listview") self.submenuFile.addSeparator() self.submenuFile.addAction(QIcon(":info.png"), QApplication.translate("ListView", "Property", None, QApplication.UnicodeUTF8), self.propertyNodes, "Listview")
def createSubMenu(self): self.extractor = Extractor(self.parent) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.submenuFile = QMenu() self.submenuFile.addAction(self.actionOpen) self.connect(self.actionOpen, SIGNAL("triggered()"), self.openDefault) self.submenuFile.addAction(self.actionOpen_in_new_tab) self.connect(self.actionOpen_in_new_tab, SIGNAL("triggered()"), self.openAsNewTab) self.submenuRelevant = self.submenuFile.addMenu(self.actionRelevant_module.icon(), self.actionRelevant_module.text()) self.menu = {} self.menuModule = self.submenuFile.addMenu(self.actionOpen_with.icon(), self.actionOpen_with.text()) self.menuTags = MenuTags(self, self.parent.parent.parent.parent, self.currentNodes) self.submenuFile.addSeparator() self.submenuFile.addAction(self.actionHex_viewer) self.connect(self.actionHex_viewer, SIGNAL("triggered()"), self.launchHexedit) self.submenuFile.addAction(self.actionExtract) self.connect(self.actionExtract, SIGNAL("triggered()"), self.extractNodes) self.submenuFile.addSeparator()
class NodeList(QWidget): def __init__(self, parent, mainWindow, dockBrowser): super(NodeList, self).__init__(parent) self.__browsers = dockBrowser # Necessary self.type = "views" self.icon = QIcon(":list.png") self.name = "" self.__mainWindow = mainWindow self.__parent = parent # Specific self.currentIndexDir = None self.currentNodeDir = None self.g_display() self.initCallback(dockBrowser) self.loader = loader.loader() self.lmodules = self.loader.modules self.taskmanager = TaskManager() self.env = env.env() def g_display(self): self.setMinimumSize(QSize(400, 300)) self.createSubMenu() self.vlayout = QVBoxLayout(self) self.hlayout = QHBoxLayout() self.vlayout.addLayout(self.hlayout) self.initListView() self.initThumbsView() self.topButton = QPushButton(self) self.topButton.setFixedSize(QSize(32,32)) self.topButton.setFlat(True) self.topButton.setIcon(QIcon(":previous.png")) self.topButton.setIconSize(QSize(32,32)) self.hlayout.addWidget(self.topButton) self.listButton = QPushButton(self) self.listButton.setFixedSize(QSize(32, 32)) self.listButton.setFlat(True) self.listButton.setIcon(QIcon(":list.png")) self.listButton.setIconSize(QSize(32,32)) self.hlayout.addWidget(self.listButton) self.thumButton = QPushButton(self) self.thumButton.setFixedSize(QSize(32, 32)) self.thumButton.setFlat(True) self.thumButton.setIcon(QIcon(":image.png")) self.thumButton.setIconSize(QSize(32,32)) self.hlayout.addWidget(self.thumButton) self.thumSize = QComboBox() self.thumSize.setMaximumWidth(100) self.thumSize.addItem("Small") self.thumSize.addItem("Medium") self.thumSize.addItem("Large") self.connect(self.thumSize, SIGNAL("currentIndexChanged(QString)"), self.sizeChanged) self.hlayout.addWidget(self.thumSize) self.thumButton.setEnabled(True) self.thumSize.setEnabled(False) self.listButton.setEnabled(False) self.comboBoxPath = NodeComboBox(self) self.comboBoxPath.setMinimumSize(QSize(251,32)) self.comboBoxPath.setMaximumSize(QSize(16777215,32)) self.hlayout.addWidget(self.comboBoxPath) def initListView(self): self.ListView = ListView(self, self.__mainWindow) self.ListModel = ListModel(self) self.ListModelFilter = QSortFilterProxyModel() self.ListModelFilter.setDynamicSortFilter(True) self.ListModelFilter.setSortCaseSensitivity(Qt.CaseInsensitive) self.ListModelFilter.setSourceModel(self.ListModel) self.ListView.setModels(self.ListModel, self.ListModelFilter) self.ListView.setModel(self.ListModelFilter) self.ListView.setSubMenu(self.submenuFile) self.vlayout.addWidget(self.ListView) def initThumbsView(self): self.ThumbsView = ThumbsView(self.__mainWindow, self) self.ThumbsItemModel = ThumbsItemModel(self.ThumbsView.thread) self.ThumbsView.setModels(self.ThumbsItemModel) self.ThumbsView.setSubMenu(self.submenuFile) self.vlayout.addWidget(self.ThumbsView) def initCallback(self, dockBrowser): self.connect(self.topButton, SIGNAL("clicked()"), self.moveToTop) self.connect(self.listButton, SIGNAL("clicked()"), self.listActivated) self.connect(self.thumButton, SIGNAL("clicked()"), self.thumbActivated) self.connect(self.comboBoxPath, SIGNAL("currentIndexChanged(const QString & )"), self.comboBoxPathChanged) self.connect(ConnectorCallback.instance, SIGNAL("reload"), self.reload, Qt.BlockingQueuedConnection) self.connect(dockBrowser.treeView, SIGNAL("changeDirectory"), self.loadFolder) self.connect(dockBrowser.treeView, SIGNAL("reloadNodeView"), self.reload) dockBrowser.treeView.connect(self, SIGNAL("setIndexAndExpand"), dockBrowser.treeView.setIndexAndExpand) dockBrowser.treeView.connect(self, SIGNAL("setIndex"), dockBrowser.treeView.setCurrentIndexForChild) def moveToTop(self): if self.currentIndexDir <> None : index = self.__browsers.treeItemModel.indexWithNode(self.currentNodeDir) parent = self.__browsers.treeItemModel.parent(index) if parent: self.emit(SIGNAL("setIndexAndExpand"), self, parent) self.currentIndexDir = parent else : self.emit(SIGNAL("setIndexAndExpand"), self, index) self.currentIndexDir = index def comboBoxPathChanged(self, text): node = self.comboBoxPath.getNode(str(text)) if node.this == self.currentNodeDir.this : return index = self.comboBoxPath.getBrowserIndex(str(text)) self.loadFolder(node, index) self.emit(SIGNAL("setIndex"), self, self.currentIndexDir) # def comboBoxModeChanged(self, index): # if index == 0 : # self.ListView.setVisible(True) # self.ThumbsView.setVisible(False) # else : # self.ListView.setVisible(False) # self.ThumbsView.setVisible(True) # self.reloadChangedView() def listActivated(self): self.ListView.setVisible(True) self.ThumbsView.setVisible(False) self.reloadChangedView() #Desactivate thumb buttons self.thumButton.setEnabled(True) self.thumSize.setEnabled(False) self.listButton.setEnabled(False) def thumbActivated(self): self.ListView.setVisible(False) self.ThumbsView.setVisible(True) self.reloadChangedView() self.thumButton.setEnabled(False) self.thumSize.setEnabled(True) self.listButton.setEnabled(True) def reloadChangedView(self): if not self.visibleRegion().isEmpty() : view = self.viewVisible() if view.getModel().currentNodeDir is not None and view.getModel().currentNodeDir.this == self.currentNodeDir.this : return self.loadFolder(self.currentNodeDir, self.currentIndexDir, 1) # Specific type views def loadFolder(self, node, indexFolder = None, force = None): if node is None : return if self.currentNodeDir is not None : if force is None and self.currentNodeDir.this == node.this: return if force <> 2 and str(self) <> str(self.__browsers.getChild()) : return self.currentIndexDir = indexFolder self.currentNodeDir = node self.comboBoxPath.addPathAndSelect(node, indexFolder) if self.ThumbsView.isVisible() : self.ThumbsView.loadFolder(node, force) if self.ListView.isVisible() or force == 2: self.ListView.loadFolder(node) if force == 2 : self.emit(SIGNAL("setIndexAndExpand"), self, self.currentIndexDir) def setChildSelected(self): if str(self.__browsers.getChild()) <> str(self) : index = self.__browsers.treeItemModel.indexWithNode(self.currentNodeDir) self.emit(SIGNAL("setIndexAndExpand"), self, index) def getListCurrentItems(self): view = self.viewVisible() return view.getListCurrentItems() def getListCurrentNode(self): view = self.viewVisible() return view.getListCurrentNode() def reload(self): self.loadFolder(self.currentNodeDir, self.currentIndexDir, 1) def refreshIndexBrowser(self): self.emit(SIGNAL("setIndex"), self, self.currentIndexDir) def viewVisible(self): if self.ListView.isVisible() : return self.ListView if self.ThumbsView.isVisible() : return self.ThumbsView return self.ListView def changeDirectoryBrowser(self, node): dockNodeTree = self.__mainWindow.dockNodeTree currentIndex = dockNodeTree.treeView.selectionModel().currentIndex() if currentIndex is None : return currentItem = dockNodeTree.treeItemModel.getItem(currentIndex) #if not node.next.empty(): newcurrent = currentItem.childWithNode(node) if not newcurrent: return # index = dockNodeTree.treeItemModel.index(newcurrent.childNumber(), 0, currentIndex) self.emit(SIGNAL("setIndexAndExpand"), self, index) # #self.loadFolder(node, index) ############### ## CONTEXT MENU ## ############### def createSubMenu(self): self.extractor = Extractor(self.__mainWindow) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.submenuFile = QMenu() self.submenuFile.addAction(QIcon(":exec.png"), "Open", self.openDefault, "Listview") self.menuModules = self.submenuFile.addMenu(QIcon(":exec.png"), "Open With") self.menuTags = MenuTags(self, self.__mainWindow, self.getListCurrentNode) self.submenuFile.addSeparator() self.submenuFile.addAction(QIcon(":hexedit.png"), QApplication.translate("ListView", "Hexeditor", None, QApplication.UnicodeUTF8), self.launchHexedit, "Listview") self.submenuFile.addAction(QIcon(":extract.png"), QApplication.translate("ListView", "Extract", None, QApplication.UnicodeUTF8), self.extractNodes, "Listview") self.submenuFile.addSeparator() self.submenuFile.addAction(QIcon(":info.png"), QApplication.translate("ListView", "Property", None, QApplication.UnicodeUTF8), self.propertyNodes, "Listview") def launchExtract(self): res = self.extractor.getArgs() arg = self.env.libenv.argument("gui_input") lnodes = self.env.libenv.ListNode() lnodes.thisown = 0 for node in res["nodes"]: lnodes.append(node) arg.thisown = 0 arg.add_path("syspath", str(res["path"])) arg.add_lnode("files", lnodes) arg.add_bool("recursive", int(res["recurse"])) self.taskmanager.add("extract", arg, ["thread", "gui"]) def extractNodes(self): self.extractor.launch(self.getListCurrentNode()) def openDefault(self): nodes = self.getListCurrentNode() for node in nodes: arg = self.env.libenv.argument("gui_input") arg.thisown = 0 ft = FILETYPE() try: mod = ft.findcompattype(node)[0] if self.lmodules[mod]: conf = self.lmodules[mod].conf cdl = conf.descr_l for a in cdl: if a.type == "node": arg.add_node(a.name, node) self.taskmanager.add(mod, arg, ["thread", "gui"]) except IndexError: arg.add_node("file", node) self.taskmanager.add("hexedit", arg, ["thread", "gui"]) def launchHexedit(self): nodes = self.getListCurrentNode() for node in nodes: arg = self.env.libenv.argument("gui_input") arg.thisown = 0 arg.add_node("file", node) self.taskmanager.add("hexedit", arg, ["thread", "gui"]) def propertyNodes(self): if not self.__mainWindow.QPropertyDialog.isVisible(): self.__mainWindow.QPropertyDialog.fillInfo(self.currentNodeDir, self.getListCurrentNode()) iReturn = self.__mainWindow.QPropertyDialog.exec_() self.__mainWindow.QPropertyDialog.removeAttr() else: QMessageBox.critical(self, "Erreur", u"This box is already open") # CALLBACK def sizeChanged(self, string): if string == "Small": self.ThumbsView.configure(64, 64) elif string == "Medium": self.ThumbsView.configure(96, 96) elif string == "Large": self.ThumbsView.configure(128, 128)
class SearchNodeBrowser(QWidget, EventHandler, Ui_NodeBrowser): def __init__(self, parent): super(QWidget, self).__init__() EventHandler.__init__(self) self.setupUi(self) self.mainwindow = parent.parent.parent.parent self.model = ListNodeModel(self) self.name = self.windowTitle() self.type = "filebrowser" self.setObjectName(self.name) self.vfs = vfs.vfs() self.VFS = VFS.Get() self.loader = loader.loader() self.lmodules = self.loader.modules self.taskmanager = TaskManager() self.parent = parent self.icon = None self.createSubMenu() self.createLayout() def Event(self, e): self.model.emit(SIGNAL("layoutAboutToBeChanged()")) self.model.emit(SIGNAL("layoutChanged()")) def getWindowGeometry(self): self.winWidth = self.mainwindow.width() def createLayout(self): self.baseLayout = QVBoxLayout(self) self.baseLayout.setMargin(0) self.baseLayout.setSpacing(0) self.browserLayout = QSplitter(self) self.baseLayout.insertWidget(0, self.browserLayout) self.baseLayout.setStretchFactor(self.browserLayout, 1) def addNodeView(self): self.addTableView() self.addThumbsView() def addTableView(self): self.tableView = NodeTableView(self) self.tableView.horizontalHeader().setStretchLastSection(True) self.tableView.setColumnWidth(0, 200) self.tableView.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)) self.browserLayout.addWidget(self.tableView) self.browserLayout.setStretchFactor(self.browserLayout.indexOf(self.tableView), 1) self.connect(self.tableView, SIGNAL("nodePressed"), self.nodePressed) self.connect(self.tableView, SIGNAL("nodeClicked"), self.nodeClicked) self.connect(self.tableView, SIGNAL("nodeDoubleClicked"), self.nodeDoubleClicked) self.connect(self.tableView, SIGNAL(""), self.selectAttr) def applyModule(self, modname, modtype, selected): appMod = ApplyModule(self) appMod.openApplyModule(modname, modtype, selected) def selectAttr(self): pass def addThumbsView(self): self.thumbsView = NodeThumbsView(self) self.thumbsView.setModel(self.model) self.thumbsView.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)) self.browserLayout.addWidget(self.thumbsView) self.browserLayout.setStretchFactor(self.browserLayout.indexOf(self.thumbsView), 1) self.connect(self.thumbsView, SIGNAL("nodePressed"), self.nodePressed) self.connect(self.thumbsView, SIGNAL("nodeClicked"), self.nodeClicked) self.connect(self.thumbsView, SIGNAL("nodeDoubleClicked"), self.nodeDoubleClicked) def currentProxyModel(self): if self.thumbsView.isVisible(): return self.thumbsView.model() elif self.tableView.isVisible(): return self.tableView.model() def currentModel(self): return self.tableView.model() def currentView(self): return self.tableView def currentNodes(self): indexList = self.currentView().selectionModel().selectedRows() nodeList = [] for index in indexList: if index.isValid(): nodeList.append(self.VFS.getNodeFromPointer(index.internalId())) return nodeList def currentNode(self): index = self.currentView().selectionModel().currentIndex() if index.isValid(): return self.VFS.getNodeFromPointer(index.internalId()) def nodePressed(self, key, node, index = None): if key in [Qt.Key_Up, Qt.Key_Down, Qt.Key_PageUp, Qt.Key_PageDown]: self.parent.xtd_attr.fill(node) self.mainwindow.emit(SIGNAL("previewUpdate"), node) def nodeClicked(self, mouseButton, node, index = None): if mouseButton == Qt.LeftButton: self.mainwindow.emit(SIGNAL("previewUpdate"), node) if mouseButton == Qt.RightButton: self.menuRelevant = MenuRelevant(self, self, node) if node.hasChildren() or node.isDir(): self.actionOpen_in_new_tab.setEnabled(True) else: self.actionOpen_in_new_tab.setEnabled(False) self.submenuFile.popup(QCursor.pos()) self.submenuFile.show() self.parent.xtd_attr.fill(node) def nodeTreeDoubleClicked(self, mouseButton, node, index = None): if node == None: return if self.currentView().enterInDirectory: if node.hasChildren() or node.isDir(): self.currentModel().setRootPath(node) def nodeDoubleClicked(self, mouseButton, node, index = None): if node == None: return if self.currentView().enterInDirectory: if node.hasChildren() or node.isDir(): self.openAsNewTab() else: self.openDefault(node) else: self.openDefault(node) def sizeChanged(self, string): if self.nodeViewBox.thumbSize.currentIndex() == 0: self.thumbsView.setIconGridSize(64, 64) elif self.nodeViewBox.thumbSize.currentIndex() == 1: self.thumbsView.setIconGridSize(96, 96) elif self.nodeViewBox.thumbSize.currentIndex() == 2: self.thumbsView.setIconGridSize(128, 128) def openDefault(self, node = None): if not node: node = self.currentNode() if not node: return mods = node.compatibleModules() mods.reverse() if len(mods): for mod in mods: if "Viewers" in self.lmodules[mod].tags: break try: priority = modulePriority[mod] except KeyError: modulePriority[mod] = 0 priority = 0 if not priority: mbox = QMessageBox(QMessageBox.Question, self.tr("Apply module"), self.tr("Do you want to apply module ") + str(mod) + self.tr(" on this node ?"), QMessageBox.Yes | QMessageBox.No, self) mbox.addButton(self.tr("Always"), QMessageBox.AcceptRole) reply = mbox.exec_() if reply == QMessageBox.No: return elif reply == QMessageBox.AcceptRole: modulePriority[mod] = 1 if self.lmodules[mod]: conf = self.lmodules[mod].conf arguments = conf.arguments() marg = {} for argument in arguments: if argument.type() == typeId.Node: marg[argument.name()] = node args = conf.generate(marg) self.taskmanager.add(mod, args, ["thread", "gui"]) return else: errnodes = "" if node.size(): conf = self.lmodules["hexadecimal"].conf try: arg = conf.generate({"file": node}) self.taskmanager.add("hexadecimal", arg, ["thread", "gui"]) except RuntimeError: errnodes += node.absolute() + "\n" else: errnodes += node.absolute() + "\n" if len(errnodes): msg = QMessageBox(self) msg.setWindowTitle(self.tr("Empty files")) msg.setText(self.tr("the following nodes could not be opened with Hex viewer because they are either empty or folders\n")) msg.setIcon(QMessageBox.Warning) msg.setDetailedText(errnodes) msg.setStandardButtons(QMessageBox.Ok) ret = msg.exec_() def createSubMenu(self): self.extractor = Extractor(self.parent) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.submenuFile = QMenu() self.submenuFile.addAction(self.actionOpen) self.connect(self.actionOpen, SIGNAL("triggered()"), self.openDefault) self.submenuFile.addAction(self.actionOpen_in_new_tab) self.connect(self.actionOpen_in_new_tab, SIGNAL("triggered()"), self.openAsNewTab) self.submenuRelevant = self.submenuFile.addMenu(self.actionRelevant_module.icon(), self.actionRelevant_module.text()) self.menu = {} self.menuModule = self.submenuFile.addMenu(self.actionOpen_with.icon(), self.actionOpen_with.text()) self.menuTags = MenuTags(self, self.parent.parent.parent.parent, self.currentNodes) self.submenuFile.addSeparator() self.submenuFile.addAction(self.actionHex_viewer) self.connect(self.actionHex_viewer, SIGNAL("triggered()"), self.launchHexedit) self.submenuFile.addAction(self.actionExtract) self.connect(self.actionExtract, SIGNAL("triggered()"), self.extractNodes) self.submenuFile.addSeparator() def openAsNewTab(self): node = self.currentNode() self.parent.parent.parent.parent.addNodeBrowser(node) def launchHexedit(self): nodes = self.currentNodes() conf = self.loader.get_conf("hexadecimal") errnodes = "" for node in nodes: if node.size(): try: arg = conf.generate({"file": node}) self.taskmanager.add("hexadecimal", arg, ["thread", "gui"]) except RuntimeError: errnodes += node.absolute() + "\n" else: errnodes += node.absolute() + "\n" if len(errnodes): msg = QMessageBox(self) msg.setWindowTitle(self.tr("Empty files")) msg.setText(self.tr("the following nodes could not be opened with Hex viewer because they are either empty or folders\n")) msg.setIcon(QMessageBox.Warning) msg.setDetailedText(errnodes) msg.setStandardButtons(QMessageBox.Ok) ret = msg.exec_() def extractNodes(self): self.extractor.launch(self.currentNodes()) def launchExtract(self): res = self.extractor.getArgs() args = {} args["files"] = res["nodes"] args["syspath"] = str(res["path"]) args["recursive"] = res["recurse"] conf = self.loader.get_conf("extract") try: margs = conf.generate(args) self.taskmanager.add("extract", margs, ["thread", "gui"]) except RuntimeError: pass def changeEvent(self, event): """ Search for a language change event This event have to call retranslateUi to change interface language on the fly. """ if event.type() == QEvent.LanguageChange: self.retranslateUi(self) self.menuModule.setTitle(self.actionOpen_with.text()) self.submenuRelevant.setTitle(self.actionRelevant_module.text()) self.model.translation() else: QWidget.changeEvent(self, event)
class NodeList(QWidget): def __init__(self, parent, mainWindow, dockBrowser): super(NodeList, self).__init__(parent) self.__browsers = dockBrowser # Necessary self.type = "views" self.icon = QIcon(":list.png") self.name = "" self.__mainWindow = mainWindow self.__parent = parent # Specific self.currentIndexDir = None self.currentNodeDir = None self.g_display() self.initCallback(dockBrowser) self.loader = loader.loader() self.lmodules = self.loader.modules self.taskmanager = TaskManager() self.env = env.env() def g_display(self): self.setMinimumSize(QSize(400, 300)) self.createSubMenu() self.vlayout = QVBoxLayout(self) self.hlayout = QHBoxLayout() self.vlayout.addLayout(self.hlayout) self.initListView() self.initThumbsView() self.topButton = QPushButton(self) self.topButton.setFixedSize(QSize(32, 32)) self.topButton.setFlat(True) self.topButton.setIcon(QIcon(":previous.png")) self.topButton.setIconSize(QSize(32, 32)) self.hlayout.addWidget(self.topButton) self.listButton = QPushButton(self) self.listButton.setFixedSize(QSize(32, 32)) self.listButton.setFlat(True) self.listButton.setIcon(QIcon(":list.png")) self.listButton.setIconSize(QSize(32, 32)) self.hlayout.addWidget(self.listButton) self.thumButton = QPushButton(self) self.thumButton.setFixedSize(QSize(32, 32)) self.thumButton.setFlat(True) self.thumButton.setIcon(QIcon(":image.png")) self.thumButton.setIconSize(QSize(32, 32)) self.hlayout.addWidget(self.thumButton) self.thumSize = QComboBox() self.thumSize.setMaximumWidth(100) self.thumSize.addItem("Small") self.thumSize.addItem("Medium") self.thumSize.addItem("Large") self.connect(self.thumSize, SIGNAL("currentIndexChanged(QString)"), self.sizeChanged) self.hlayout.addWidget(self.thumSize) self.thumButton.setEnabled(True) self.thumSize.setEnabled(False) self.listButton.setEnabled(False) self.comboBoxPath = NodeComboBox(self) self.comboBoxPath.setMinimumSize(QSize(251, 32)) self.comboBoxPath.setMaximumSize(QSize(16777215, 32)) self.hlayout.addWidget(self.comboBoxPath) def initListView(self): self.ListView = ListView(self, self.__mainWindow) self.ListModel = ListModel(self) self.ListModelFilter = QSortFilterProxyModel() self.ListModelFilter.setDynamicSortFilter(True) self.ListModelFilter.setSortCaseSensitivity(Qt.CaseInsensitive) self.ListModelFilter.setSourceModel(self.ListModel) self.ListView.setModels(self.ListModel, self.ListModelFilter) self.ListView.setModel(self.ListModelFilter) self.ListView.setSubMenu(self.submenuFile) self.vlayout.addWidget(self.ListView) def initThumbsView(self): self.ThumbsView = ThumbsView(self.__mainWindow, self) self.ThumbsItemModel = ThumbsItemModel(self.ThumbsView.thread) self.ThumbsView.setModels(self.ThumbsItemModel) self.ThumbsView.setSubMenu(self.submenuFile) self.vlayout.addWidget(self.ThumbsView) def initCallback(self, dockBrowser): self.connect(self.topButton, SIGNAL("clicked()"), self.moveToTop) self.connect(self.listButton, SIGNAL("clicked()"), self.listActivated) self.connect(self.thumButton, SIGNAL("clicked()"), self.thumbActivated) self.connect(self.comboBoxPath, SIGNAL("currentIndexChanged(const QString & )"), self.comboBoxPathChanged) self.connect(ConnectorCallback.instance, SIGNAL("reload"), self.reload, Qt.BlockingQueuedConnection) self.connect(dockBrowser.treeView, SIGNAL("changeDirectory"), self.loadFolder) self.connect(dockBrowser.treeView, SIGNAL("reloadNodeView"), self.reload) dockBrowser.treeView.connect(self, SIGNAL("setIndexAndExpand"), dockBrowser.treeView.setIndexAndExpand) dockBrowser.treeView.connect( self, SIGNAL("setIndex"), dockBrowser.treeView.setCurrentIndexForChild) def moveToTop(self): if self.currentIndexDir <> None: index = self.__browsers.treeItemModel.indexWithNode( self.currentNodeDir) parent = self.__browsers.treeItemModel.parent(index) if parent: self.emit(SIGNAL("setIndexAndExpand"), self, parent) self.currentIndexDir = parent else: self.emit(SIGNAL("setIndexAndExpand"), self, index) self.currentIndexDir = index def comboBoxPathChanged(self, text): node = self.comboBoxPath.getNode(str(text)) if node.this == self.currentNodeDir.this: return index = self.comboBoxPath.getBrowserIndex(str(text)) self.loadFolder(node, index) self.emit(SIGNAL("setIndex"), self, self.currentIndexDir) # def comboBoxModeChanged(self, index): # if index == 0 : # self.ListView.setVisible(True) # self.ThumbsView.setVisible(False) # else : # self.ListView.setVisible(False) # self.ThumbsView.setVisible(True) # self.reloadChangedView() def listActivated(self): self.ListView.setVisible(True) self.ThumbsView.setVisible(False) self.reloadChangedView() #Desactivate thumb buttons self.thumButton.setEnabled(True) self.thumSize.setEnabled(False) self.listButton.setEnabled(False) def thumbActivated(self): self.ListView.setVisible(False) self.ThumbsView.setVisible(True) self.reloadChangedView() self.thumButton.setEnabled(False) self.thumSize.setEnabled(True) self.listButton.setEnabled(True) def reloadChangedView(self): if not self.visibleRegion().isEmpty(): view = self.viewVisible() if view.getModel().currentNodeDir is not None and view.getModel( ).currentNodeDir.this == self.currentNodeDir.this: return self.loadFolder(self.currentNodeDir, self.currentIndexDir, 1) # Specific type views def loadFolder(self, node, indexFolder=None, force=None): if node is None: return if self.currentNodeDir is not None: if force is None and self.currentNodeDir.this == node.this: return if force <> 2 and str(self) <> str(self.__browsers.getChild()): return self.currentIndexDir = indexFolder self.currentNodeDir = node self.comboBoxPath.addPathAndSelect(node, indexFolder) if self.ThumbsView.isVisible(): self.ThumbsView.loadFolder(node, force) if self.ListView.isVisible() or force == 2: self.ListView.loadFolder(node) if force == 2: self.emit(SIGNAL("setIndexAndExpand"), self, self.currentIndexDir) def setChildSelected(self): if str(self.__browsers.getChild()) <> str(self): index = self.__browsers.treeItemModel.indexWithNode( self.currentNodeDir) self.emit(SIGNAL("setIndexAndExpand"), self, index) def getListCurrentItems(self): view = self.viewVisible() return view.getListCurrentItems() def getListCurrentNode(self): view = self.viewVisible() return view.getListCurrentNode() def reload(self): self.loadFolder(self.currentNodeDir, self.currentIndexDir, 1) def refreshIndexBrowser(self): self.emit(SIGNAL("setIndex"), self, self.currentIndexDir) def viewVisible(self): if self.ListView.isVisible(): return self.ListView if self.ThumbsView.isVisible(): return self.ThumbsView return self.ListView def changeDirectoryBrowser(self, node): dockNodeTree = self.__mainWindow.dockNodeTree currentIndex = dockNodeTree.treeView.selectionModel().currentIndex() if currentIndex is None: return currentItem = dockNodeTree.treeItemModel.getItem(currentIndex) #if not node.next.empty(): newcurrent = currentItem.childWithNode(node) if not newcurrent: return # index = dockNodeTree.treeItemModel.index(newcurrent.childNumber(), 0, currentIndex) self.emit(SIGNAL("setIndexAndExpand"), self, index) # #self.loadFolder(node, index) ############### ## CONTEXT MENU ## ############### def createSubMenu(self): self.extractor = Extractor(self.__mainWindow) self.connect(self.extractor, SIGNAL("filled"), self.launchExtract) self.submenuFile = QMenu() self.submenuFile.addAction(QIcon(":exec.png"), "Open", self.openDefault, "Listview") self.menuModules = self.submenuFile.addMenu(QIcon(":exec.png"), "Open With") self.menuTags = MenuTags(self, self.__mainWindow, self.getListCurrentNode) self.submenuFile.addSeparator() self.submenuFile.addAction( QIcon(":hexedit.png"), QApplication.translate("ListView", "Hexeditor", None, QApplication.UnicodeUTF8), self.launchHexedit, "Listview") self.submenuFile.addAction( QIcon(":extract.png"), QApplication.translate("ListView", "Extract", None, QApplication.UnicodeUTF8), self.extractNodes, "Listview") self.submenuFile.addSeparator() self.submenuFile.addAction( QIcon(":info.png"), QApplication.translate("ListView", "Property", None, QApplication.UnicodeUTF8), self.propertyNodes, "Listview") def launchExtract(self): res = self.extractor.getArgs() arg = self.env.libenv.argument("gui_input") lnodes = self.env.libenv.ListNode() lnodes.thisown = 0 for node in res["nodes"]: lnodes.append(node) arg.thisown = 0 arg.add_path("syspath", str(res["path"])) arg.add_lnode("files", lnodes) arg.add_bool("recursive", int(res["recurse"])) self.taskmanager.add("extract", arg, ["thread", "gui"]) def extractNodes(self): self.extractor.launch(self.getListCurrentNode()) def openDefault(self): nodes = self.getListCurrentNode() for node in nodes: arg = self.env.libenv.argument("gui_input") arg.thisown = 0 ft = FILETYPE() try: mod = ft.findcompattype(node)[0] if self.lmodules[mod]: conf = self.lmodules[mod].conf cdl = conf.descr_l for a in cdl: if a.type == "node": arg.add_node(a.name, node) self.taskmanager.add(mod, arg, ["thread", "gui"]) except IndexError: arg.add_node("file", node) self.taskmanager.add("hexedit", arg, ["thread", "gui"]) def launchHexedit(self): nodes = self.getListCurrentNode() for node in nodes: arg = self.env.libenv.argument("gui_input") arg.thisown = 0 arg.add_node("file", node) self.taskmanager.add("hexedit", arg, ["thread", "gui"]) def propertyNodes(self): if not self.__mainWindow.QPropertyDialog.isVisible(): self.__mainWindow.QPropertyDialog.fillInfo( self.currentNodeDir, self.getListCurrentNode()) iReturn = self.__mainWindow.QPropertyDialog.exec_() self.__mainWindow.QPropertyDialog.removeAttr() else: QMessageBox.critical(self, "Erreur", u"This box is already open") # CALLBACK def sizeChanged(self, string): if string == "Small": self.ThumbsView.configure(64, 64) elif string == "Medium": self.ThumbsView.configure(96, 96) elif string == "Large": self.ThumbsView.configure(128, 128)