Пример #1
0
class NetMainWindow(QMainWindow):
    def __init__(self):
        super(NetMainWindow, self).__init__()
        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)
        self.createActions()
        self.createMenus()
        self.createStatusBar()
        self.readSettings()
        self.setWindowTitle('Net')

    def newScan(self):
        child = IpRangeScanGUI(self)
        self.mdiArea.addSubWindow(child)
        child.show()
        return child

    def createActions(self):
        self.newIPScanAct = QAction("&Start a Scan",
                                    self,
                                    shortcut=QKeySequence.New,
                                    statusTip="Start a Scan",
                                    triggered=self.newScan)

    def createMenus(self):
        self.serverMenu = self.menuBar().addMenu('&IP Scan')
        self.serverMenu.addAction(self.newIPScanAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings('Trolltech', 'MDI Example')
        pos = settings.value('pos', QPoint(200, 200))
        size = settings.value('size', QSize(500, 500))
        self.move(pos)
        self.resize(size)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)
Пример #2
0
class NetMainWindow(QMainWindow):
    def __init__(self):
        super(NetMainWindow, self).__init__()
        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)
        self.createActions()
        self.createMenus()
        self.createStatusBar()
        self.readSettings()
        self.setWindowTitle('Net')

    def newScan(self):
        child = IpRangeScanGUI(self)
        self.mdiArea.addSubWindow(child)
        child.show()
        return child

    def createActions(self):
        self.newIPScanAct = QAction("&Start a Scan", self, shortcut=QKeySequence.New, statusTip="Start a Scan",
                                    triggered=self.newScan)

    def createMenus(self):
        self.serverMenu = self.menuBar().addMenu('&IP Scan')
        self.serverMenu.addAction(self.newIPScanAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings('Trolltech', 'MDI Example')
        pos = settings.value('pos', QPoint(200, 200))
        size = settings.value('size', QSize(500, 500))
        self.move(pos)
        self.resize(size)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)
Пример #3
0
class MainWindow(QMainWindow):
    """This create the main window of the application"""
    def __init__(self):
        super(MainWindow, self).__init__()
        # remove close & maximize window buttons
        #self.setWindowFlags(Qt.CustomizeWindowHint|Qt.WindowMinimizeButtonHint)
        self.setMinimumSize(500, 666)
        #self.setMaximumSize(1000,666)
        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.mdiArea.setViewMode(QMdiArea.TabbedView)

        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.child = None

        self.createActions()
        self.createMenus()
        self.createStatusBar()
        self.updateMenus()
        self.readSettings()
        self.setWindowTitle("LEKTURE")

        mytoolbar = QToolBar()
        #self.toolbar = self.addToolBar()
        mytoolbar.addAction(self.newAct)
        mytoolbar.addAction(self.openAct)
        mytoolbar.addAction(self.saveAct)
        mytoolbar.addAction(self.saveAsAct)
        mytoolbar.addSeparator()
        mytoolbar.addAction(self.outputsAct)
        mytoolbar.addAction(self.scenarioAct)
        self.scenarioAct.setVisible(False)
        mytoolbar.setMovable(False)
        mytoolbar.setFixedWidth(60)
        self.addToolBar(Qt.LeftToolBarArea, mytoolbar)

    def closeEvent(self, scenario):
        """method called when the main window wants to be closed"""
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            scenario.ignore()
        else:
            self.writeSettings()
            scenario.accept()

    def newFile(self):
        """creates a new project"""
        child = self.createProjekt()
        child.newFile()
        child.show()
        self.child = child

    def open(self):
        """open a project"""
        fileName, _ = QFileDialog.getOpenFileName(self)
        if fileName:
            existing = self.findProjekt(fileName)
            if existing:
                self.mdiArea.setActiveSubWindow(existing)
                return

            child = self.createProjekt()
            if child.loadFile(fileName):
                self.statusBar().showMessage("File loaded", 2000)
                child.show()
            else:
                child.close()

    def save(self):
        """called when user save a project"""
        if self.activeProjekt() and self.activeProjekt().save():
            self.statusBar().showMessage("File saved", 2000)
        else:
            self.statusBar().showMessage("Error when trying to save the file")

    def saveAs(self):
        """called when user save AS a project"""
        if self.activeProjekt() and self.activeProjekt().saveAs():
            self.statusBar().showMessage("File saved", 2000)
        else:
            self.statusBar().showMessage("Error when trying to save the file")

    def openFolder(self):
        """called when user calls 'reveal in finder' function"""
        if self.activeProjekt() and self.activeProjekt().openFolder():
            self.statusBar().showMessage("File revealed in Finder", 2000)

    def about(self):
        """called when user wants to know a bit more on the app"""
        import sys
        python_version = str(sys.version_info[0])
        python_version_temp = sys.version_info[1:5]
        for item in python_version_temp:
            python_version = python_version + "." + str(item)
        QMessageBox.about(self, "About Lekture",
                            "pylekture build " + str(pylekture.__version__ + "\n" + \
                            "python version " + str(python_version)))

    def updateMenus(self):
        """update menus"""
        hasProjekt = (self.activeProjekt() is not None)
        self.saveAct.setEnabled(hasProjekt)
        self.saveAsAct.setEnabled(hasProjekt)
        self.outputsAct.setEnabled(hasProjekt)
        self.scenarioAct.setEnabled(hasProjekt)
        self.openFolderAct.setEnabled(hasProjekt)
        self.closeAct.setEnabled(hasProjekt)
        self.closeAllAct.setEnabled(hasProjekt)
        self.nextAct.setEnabled(hasProjekt)
        self.previousAct.setEnabled(hasProjekt)
        self.separatorAct.setVisible(hasProjekt)

    def updateWindowMenu(self):
        """unpates menus on the window toolbar"""
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.activeProjekt())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def createProjekt(self):
        """create a new project"""
        child = Projekt()
        self.mdiArea.addSubWindow(child)
        self.child = child
        return child

    def createActions(self):
        """create all actions"""
        self.newAct = QAction("&New", self,
                              shortcut=QKeySequence.New, statusTip="Create a new file",
                              triggered=self.newFile)

        self.openAct = QAction("&Open...", self,
                               shortcut=QKeySequence.Open, statusTip="Open an existing file",
                               triggered=self.open)

        self.saveAct = QAction("&Save", self,
                               shortcut=QKeySequence.Save,
                               statusTip="Save the document to disk", triggered=self.save)

        self.saveAsAct = QAction("Save &As...", self,
                                 shortcut=QKeySequence.SaveAs,
                                 statusTip="Save the document under a new name",
                                 triggered=self.saveAs)

        self.openFolderAct = QAction("Open Project Folder", self,
                                     statusTip="Reveal Project in Finder",
                                     triggered=self.openFolder)

        self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit,
                               statusTip="Exit the application",
                               triggered=QApplication.instance().closeAllWindows)

        self.closeAct = QAction("Cl&ose", self,
                                statusTip="Close the active window",
                                triggered=self.mdiArea.closeActiveSubWindow)

        self.outputsAct = QAction("Outputs", self,
                                  statusTip="Open the outputs panel",
                                  triggered=self.openOutputsPanel)

        self.scenarioAct = QAction("Scenario", self,
                                   statusTip="Open the scenario panel",
                                   triggered=self.openScenarioPanel)

        self.closeAllAct = QAction("Close &All", self,
                                   statusTip="Close all the windows",
                                   triggered=self.mdiArea.closeAllSubWindows)

        self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild,
                               statusTip="Move the focus to the next window",
                               triggered=self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction("Pre&vious", self,
                                   shortcut=QKeySequence.PreviousChild,
                                   statusTip="Move the focus to the previous window",
                                   triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

        self.aboutAct = QAction("&About", self,
                                statusTip="Show the application's About box",
                                triggered=self.about)

    def createMenus(self):
        """create all menus"""
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.openFolderAct)
        self.fileMenu.addAction(self.exitAct)

        self.viewMenu = self.menuBar().addMenu("&View")
        self.viewMenu.addAction(self.outputsAct)
        self.viewMenu.addAction(self.scenarioAct)

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)

    def createStatusBar(self):
        """create the status bar"""
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        """read the settings"""
        settings = QSettings('Pixel Stereo', 'lekture')
        pos = settings.value('pos', QPoint(200, 200))
        size = settings.value('size', QSize(1000, 650))
        self.move(pos)
        self.resize(size)

    def writeSettings(self):
        """write settings"""
        settings = QSettings('Pixel Stereo', 'lekture')
        settings.setValue('pos', self.pos())
        settings.setValue('size', self.size())

    def activeProjekt(self):
        """return the active project object"""
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        else:
            return None

    def findProjekt(self, fileName):
        """return the project"""
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def setActiveSubWindow(self, window):
        """set the active sub window"""
        if window:
            self.mdiArea.setActiveSubWindow(window)

    def openOutputsPanel(self):
        """switch to the outputs editor"""
        if self.child:
            project = self.activeProjekt()
            project.scenario_events_group.setVisible(False)
            project.outputs_group.setVisible(True)
            self.scenarioAct.setVisible(True)
            self.outputsAct.setVisible(False)

    def openScenarioPanel(self):
        """switch to the scenario editors"""
        if self.child:
            project = self.activeProjekt()
            project.outputs_group.setVisible(False)
            project.scenario_events_group.setVisible(True)
            self.scenarioAct.setVisible(False)
            self.outputsAct.setVisible(True)
Пример #4
0
class MainWindow(object):

    def __init__(self):
        self.main_window_tab_table = QTabWidget()
        self.hbox = QHBoxLayout()
        self.but = QPushButton('Add')
        self.file_menu = None
        self.help_menu = None
        self.about_qt = None
        self.exit_action = None
        self.choice_interface = None

    def setup_ui(self, main_window):
        self.main_window = main_window
        main_window.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        red, green, blue = 11, 7, 11
        main_window.setPalette(QPalette(QColor(red, green, blue)))
        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.create_menu(main_window)
        self.create_tool_bars(main_window)
        main_window.setCentralWidget(self.mdiArea)
        self.windowMapper = QSignalMapper(main_window)

    def file_menu_action(self):

        self.exit_action = QAction(QIcon('../resources/icons/fileclose.png'), "&Exit", self.file_menu)
        self.exit_action.setShortcut('Ctrl+Q')
        self.exit_action.setStatusTip('Exit application')
        # self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit,
        #                       statusTip="Exit the application",
        #                       triggered=QApplication.instance().closeAllWindows)
        self.choice_interface = QAction(QIcon('../resources/icons/ethernet_card_vista.png'), '&New Table', self.file_menu)
        self.choice_interface.setShortcut('Ctrl+A')
        self.choice_interface.setStatusTip('Exit application')
        # create new table
        self.new_act = QAction(QIcon(':/images/new.png'), "&New", self.file_menu)
        self.new_act.setShortcut('Ctrl+Q')
        self.new_act.setStatusTip('Create a new file')
        # triggered=self.open
        self.open_act = QAction(QIcon(':/images/open.png'), "&Open", self.file_menu)
        self.open_act.setShortcut(QKeySequence.Open)
        self.open_act.setStatusTip('Open an existing file')
        # triggered=self.save
        self.save_act = QAction(QIcon(':/images/save.png'), "&Save", self.file_menu)
        self.save_act.setShortcut(QKeySequence.Save)
        self.save_act.setStatusTip('Save the table to disk')
        # triggered=self.saveAs
        self.save_as_act = QAction(QIcon(':/images/save.png'), "&Save &As", self.file_menu)
        self.save_as_act.setShortcut(QKeySequence.SaveAs)
        self.save_as_act.setStatusTip('Save the document under a new name')
        # triggered=self.cut
        self.cut_act = QAction(QIcon(':/images/save.png'), "&Cut", self.file_menu)
        self.cut_act.setShortcut(QKeySequence.Cut)
        self.cut_act.setStatusTip('Cut the current selections contents to the clipboard')
        # triggered=self.copy
        self.copy_act = QAction(QIcon(':/images/save.png'), "&Copy", self.file_menu)
        self.copy_act.setShortcut(QKeySequence.Copy)
        self.copy_act.setStatusTip('Copy the current selections contents to the clipboard')
        # triggered=self.paste
        self.paste_act = QAction(QIcon(':/images/save.png'), "&Paste", self.file_menu)
        self.paste_act.setShortcut(QKeySequence.Paste)
        self.paste_act.setStatusTip('Paste the clipboards contents into the current selection')
        self.close_act = QAction(QIcon(':/images/save.png'), "&Close", self.file_menu)
        self.close_act.setStatusTip('Close the active window')
        self.close_act.triggered.connect(self.mdiArea.closeActiveSubWindow)
        self.close_all_act = QAction(QIcon(':/images/save.png'), "&Close &All", self.file_menu)
        self.close_all_act.setStatusTip('Close all the windows')
        self.close_all_act.triggered.connect(self.mdiArea.closeAllSubWindows)
        self.tile_act = QAction(QIcon(':/images/save.png'), "&Tile", self.file_menu)
        self.tile_act.setStatusTip('Tile the windows')
        self.tile_act.triggered.connect(self.mdiArea.tileSubWindows)
        self.cascade_act = QAction(QIcon(':/images/save.png'), "&Cascade", self.file_menu)
        self.cascade_act.setStatusTip('Cascade the windows')
        self.cascade_act.triggered.connect(self.mdiArea.cascadeSubWindows)
        self.next_act = QAction(QIcon(':/images/save.png'), "&Next", self.file_menu)
        self.next_act.setShortcut(QKeySequence.NextChild)
        self.next_act.setStatusTip('Move the focus to the next window')
        self.next_act.triggered.connect(self.mdiArea.activateNextSubWindow)
        self.previous_act = QAction(QIcon(':/images/save.png'), "&Previous", self.file_menu)
        self.previous_act.setShortcut(QKeySequence.PreviousChild)
        self.previous_act.setStatusTip('Move the focus to the previous window')
        self.previous_act.triggered.connect(self.mdiArea.activatePreviousSubWindow)
        # triggered=self.about

        # self.separatorAct = QAction(self)
        # self.separatorAct.setSeparator(True)

    def help_menu_action(self):
        self.about_qt = QAction(QIcon('../resources/icons/info.png'), '&About Qt', self.help_menu)
        self.about_qt.setShortcut('Ctrl+L')
        self.about_qt.setStatusTip('Show the Qt librarys About box')
        self.about_qt.triggered.connect(qApp.aboutQt)
        # self.aboutQtAct = QAction("About &Qt", self,
        #                           statusTip="Show the Qt library's About box",
        #                           triggered=QApplication.instance().aboutQt)
        self.about_program_act = QAction(QIcon(':/images/save.png'), "&About Program", self.file_menu)
        self.about_program_act.setStatusTip('Show the applications About box')

    def create_menu(self, main_window):
        self.file_menu = main_window.menuBar().addMenu("&File")
        self.file_menu_action()
        self.file_menu.addAction(self.choice_interface)
        self.file_menu.addAction(self.exit_action)
        self.file_menu.addAction(self.new_act)
        self.file_menu.addAction(self.open_act)
        self.file_menu.addAction(self.save_act)
        self.file_menu.addAction(self.save_as_act)
        # self.fileMenu.addSeparator()
        self.help_menu = main_window.menuBar().addMenu("&Help")
        self.help_menu_action()
        self.help_menu.addAction(self.about_qt)
        self.help_menu.addAction(self.about_program_act)

        self.editMenu = main_window.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cut_act)
        self.editMenu.addAction(self.copy_act)
        self.editMenu.addAction(self.paste_act)

        self.windowMenu = main_window.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        # self.menuBar().addSeparator()

    def about(self):
        QMessageBox.about(self, "About MDI",
                          "The <b>MDI</b> example demonstrates how to write multiple "
                          "document interface applications using Qt.")

    def updateMenus(self):
        hasMdiChild = (self.activeMdiChild() is not None)
        self.save_act.setEnabled(hasMdiChild)
        self.save_as_act.setEnabled(hasMdiChild)
        self.paste_act.setEnabled(hasMdiChild)
        self.close_act.setEnabled(hasMdiChild)
        self.close_all_act.setEnabled(hasMdiChild)
        self.tile_act.setEnabled(hasMdiChild)
        self.cascade_act.setEnabled(hasMdiChild)
        self.next_act.setEnabled(hasMdiChild)
        self.previous_act.setEnabled(hasMdiChild)
        # self.separator_act.setVisible(hasMdiChild)

        hasSelection = (self.activeMdiChild() is not None and
                        self.activeMdiChild().textCursor().hasSelection())
        self.cut_act.setEnabled(hasSelection)
        self.copy_act.setEnabled(hasSelection)

    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.close_act)
        self.windowMenu.addAction(self.close_all_act)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tile_act)
        self.windowMenu.addAction(self.cascade_act)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.next_act)
        self.windowMenu.addAction(self.previous_act)
        # self.windowMenu.addAction(self.separator_act)

        windows = self.mdiArea.subWindowList()
        # self.separator_act.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.main_window.activeMdiChild())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    # def switchLayoutDirection(self):
    #    if self.layoutDirection() == Qt.LeftToRight:
    #        QApplication.setLayoutDirection(Qt.RightToLeft)
    #    else:
    #        QApplication.setLayoutDirection(Qt.LeftToRight)
    '''
    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator()
        action = self.fileMenu.addAction("Switch layout direction")
        action.triggered.connect(self.switchLayoutDirection)
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)
    '''

    def create_tool_bars(self, main_window):
        self.file_tool_bar = main_window.addToolBar("File")
        self.file_tool_bar.addAction(self.new_act)
        self.file_tool_bar.addAction(self.open_act)
        self.file_tool_bar.addAction(self.save_act)

        self.edit_tool_bar = main_window.addToolBar("Edit")
        self.edit_tool_bar.addAction(self.cut_act)
        self.edit_tool_bar.addAction(self.copy_act)
        self.edit_tool_bar.addAction(self.paste_act)
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.updateMenus()

        self.readSettings()

        self.setWindowTitle("MDI")

    def closeEvent(self, event):
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            event.ignore()
        else:
            self.writeSettings()
            event.accept()

    def newFile(self):
        child = self.createMdiChild()
        child.newFile()
        child.show()

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self)
        if fileName:
            existing = self.findMdiChild(fileName)
            if existing:
                self.mdiArea.setActiveSubWindow(existing)
                return

            child = self.createMdiChild()
            if child.loadFile(fileName):
                self.statusBar().showMessage("File loaded", 2000)
                child.show()
            else:
                child.close()

    def save(self):
        if self.activeMdiChild() and self.activeMdiChild().save():
            self.statusBar().showMessage("File saved", 2000)

    def saveAs(self):
        if self.activeMdiChild() and self.activeMdiChild().saveAs():
            self.statusBar().showMessage("File saved", 2000)

    def cut(self):
        if self.activeMdiChild():
            self.activeMdiChild().cut()

    def copy(self):
        if self.activeMdiChild():
            self.activeMdiChild().copy()

    def paste(self):
        if self.activeMdiChild():
            self.activeMdiChild().paste()

    def about(self):
        QMessageBox.about(
            self, "About MDI",
            "The <b>MDI</b> example demonstrates how to write multiple "
            "document interface applications using Qt.")

    def updateMenus(self):
        hasMdiChild = (self.activeMdiChild() is not None)
        self.saveAct.setEnabled(hasMdiChild)
        self.saveAsAct.setEnabled(hasMdiChild)
        self.pasteAct.setEnabled(hasMdiChild)
        self.closeAct.setEnabled(hasMdiChild)
        self.closeAllAct.setEnabled(hasMdiChild)
        self.tileAct.setEnabled(hasMdiChild)
        self.cascadeAct.setEnabled(hasMdiChild)
        self.nextAct.setEnabled(hasMdiChild)
        self.previousAct.setEnabled(hasMdiChild)
        self.separatorAct.setVisible(hasMdiChild)

        hasSelection = (self.activeMdiChild() is not None
                        and self.activeMdiChild().textCursor().hasSelection())
        self.cutAct.setEnabled(hasSelection)
        self.copyAct.setEnabled(hasSelection)

    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tileAct)
        self.windowMenu.addAction(self.cascadeAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.activeMdiChild())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def createMdiChild(self):
        child = MdiChild()
        self.mdiArea.addSubWindow(child)

        child.copyAvailable.connect(self.cutAct.setEnabled)
        child.copyAvailable.connect(self.copyAct.setEnabled)

        return child

    def createActions(self):
        self.newAct = QAction(QIcon(':/images/new.png'),
                              "&New",
                              self,
                              shortcut=QKeySequence.New,
                              statusTip="Create a new file",
                              triggered=self.newFile)

        self.openAct = QAction(QIcon(':/images/open.png'),
                               "&Open...",
                               self,
                               shortcut=QKeySequence.Open,
                               statusTip="Open an existing file",
                               triggered=self.open)

        self.saveAct = QAction(QIcon(':/images/save.png'),
                               "&Save",
                               self,
                               shortcut=QKeySequence.Save,
                               statusTip="Save the document to disk",
                               triggered=self.save)

        self.saveAsAct = QAction(
            "Save &As...",
            self,
            shortcut=QKeySequence.SaveAs,
            statusTip="Save the document under a new name",
            triggered=self.saveAs)

        self.exitAct = QAction(
            "E&xit",
            self,
            shortcut=QKeySequence.Quit,
            statusTip="Exit the application",
            triggered=QApplication.instance().closeAllWindows)

        self.cutAct = QAction(
            QIcon(':/images/cut.png'),
            "Cu&t",
            self,
            shortcut=QKeySequence.Cut,
            statusTip="Cut the current selection's contents to the clipboard",
            triggered=self.cut)
        self.suggestAct = QAction(
            "Suggest",
            self,
            shortcut=QKeySequence.Copy,
            statusTip="Cut the current selection's contents to the clipboard",
            triggered=self.copy)
        self.copyAct = QAction(
            QIcon(':/images/copy.png'),
            "&Copy",
            self,
            shortcut=QKeySequence.Copy,
            statusTip="Copy the current selection's contents to the clipboard",
            triggered=self.copy)

        self.pasteAct = QAction(
            QIcon(':/images/paste.png'),
            "&Paste",
            self,
            shortcut=QKeySequence.Paste,
            statusTip=
            "Paste the clipboard's contents into the current selection",
            triggered=self.paste)

        self.closeAct = QAction("Cl&ose",
                                self,
                                statusTip="Close the active window",
                                triggered=self.mdiArea.closeActiveSubWindow)

        self.closeAllAct = QAction("Close &All",
                                   self,
                                   statusTip="Close all the windows",
                                   triggered=self.mdiArea.closeAllSubWindows)

        self.tileAct = QAction("&Tile",
                               self,
                               statusTip="Tile the windows",
                               triggered=self.mdiArea.tileSubWindows)

        self.cascadeAct = QAction("&Cascade",
                                  self,
                                  statusTip="Cascade the windows",
                                  triggered=self.mdiArea.cascadeSubWindows)

        self.nextAct = QAction("Ne&xt",
                               self,
                               shortcut=QKeySequence.NextChild,
                               statusTip="Move the focus to the next window",
                               triggered=self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction(
            "Pre&vious",
            self,
            shortcut=QKeySequence.PreviousChild,
            statusTip="Move the focus to the previous window",
            triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

        self.aboutAct = QAction("&About",
                                self,
                                statusTip="Show the application's About box",
                                triggered=self.about)

        self.aboutQtAct = QAction("About &Qt",
                                  self,
                                  statusTip="Show the Qt library's About box",
                                  triggered=QApplication.instance().aboutQt)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator()
        action = self.fileMenu.addAction("Switch layout direction")
        action.triggered.connect(self.switchLayoutDirection)
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newAct)
        self.fileToolBar.addAction(self.openAct)
        self.fileToolBar.addAction(self.saveAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings('Trolltech', 'MDI Example')
        pos = settings.value('pos', QPoint(200, 200))
        size = settings.value('size', QSize(400, 400))
        self.move(pos)
        self.resize(size)

    def writeSettings(self):
        settings = QSettings('Trolltech', 'MDI Example')
        settings.setValue('pos', self.pos())
        settings.setValue('size', self.size())

    def activeMdiChild(self):
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        return None

    def findMdiChild(self, fileName):
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def switchLayoutDirection(self):
        if self.layoutDirection() == Qt.LeftToRight:
            QApplication.setLayoutDirection(Qt.RightToLeft)
        else:
            QApplication.setLayoutDirection(Qt.LeftToRight)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)

    def contextMenuEvent(self, event):
        menu = QMenu(self)
        menu.addAction(self.cutAct)
        menu.addAction(self.copyAct)
        menu.addAction(self.pasteAct)
        menu.addAction(self.suggestAct)
        menu.exec_(event.globalPos())
Пример #6
0
class MainWindow(QMainWindow):
    """This create the main window of the application"""
    def __init__(self):
        super(MainWindow, self).__init__()

        self.ports = serial.listports()
        self.port = None

        # remove close & maximize window buttons
        #self.setWindowFlags(Qt.CustomizeWindowHint|Qt.WindowMinimizeButtonHint)
        self.setMinimumSize(850, 450)

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.mdiArea.setViewMode(QMdiArea.TabbedView)

        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.child = None

        self.createActions()
        self.createMenus()
        self.createStatusBar()
        self.updateMenus()
        self.readSettings()
        self.setWindowTitle("VISCAM")

        mytoolbar = QToolBar()
        ports_menu = QComboBox()
        ports_menu.addItem('Output Port')
        ports_menu.insertSeparator(1)
        for port in self.ports:
            ports_menu.addItem(port)
        self.ports_menu = ports_menu
        ports_menu.currentTextChanged.connect(self.setActivePort)
        mytoolbar.addWidget(ports_menu)
        mytoolbar.addSeparator()
        mytoolbar.setMovable(False)
        mytoolbar.setFixedHeight(60)
        self.addToolBar(Qt.TopToolBarArea, mytoolbar)

    def closeEvent(self, scenario):
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            scenario.ignore()
        else:
            self.writeSettings()
            scenario.accept()

    def about(self):
        QMessageBox.about(
            self, "About Viscam",
            "<b>Viscam</b> controls and manage your video camera through VISCA protocol."
            "This release is an alpha version. Don't use it in production !!")

    def updateMenus(self):
        hasCamera = (self.activeCamera() is not None)
        self.nextAct.setEnabled(hasCamera)
        self.previousAct.setEnabled(hasCamera)
        self.separatorAct.setVisible(hasCamera)

    def updatePortMenu(self):
        self.PortMenu.clear()
        for i, port in enumerate(self.ports):

            text = "%d %s" % (i + 1, port)
            if i < 9:
                text = '&' + text

            action = self.PortMenu.addAction(text)
            action.setCheckable(True)
            if port == self.port:
                action.setChecked(True)
            action.triggered.connect(self.setActivePort)

    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.activeCamera())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def createCamera(self):
        child = Camera(serial)
        self.mdiArea.addSubWindow(child)
        child.newFile()
        self.child = child
        return child

    def createActions(self):
        self.exitAct = QAction(
            "E&xit",
            self,
            shortcut=QKeySequence.Quit,
            statusTip="Exit the application",
            triggered=QApplication.instance().closeAllWindows)

        self.closeAct = QAction("Cl&ose",
                                self,
                                statusTip="Close the active window",
                                triggered=self.mdiArea.closeActiveSubWindow)

        self.closeAllAct = QAction("Close &All",
                                   self,
                                   statusTip="Close all the windows",
                                   triggered=self.mdiArea.closeAllSubWindows)

        self.nextAct = QAction("Ne&xt",
                               self,
                               shortcut=QKeySequence.NextChild,
                               statusTip="Move the focus to the next window",
                               triggered=self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction(
            "Pre&vious",
            self,
            shortcut=QKeySequence.PreviousChild,
            statusTip="Move the focus to the previous window",
            triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

        self.aboutAct = QAction("&About",
                                self,
                                statusTip="Show the application's About box",
                                triggered=self.about)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.exitAct)

        self.PortMenu = self.menuBar().addMenu("&Ports")
        self.updatePortMenu()
        self.PortMenu.aboutToShow.connect(self.updatePortMenu)

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings('Pixel Stereo', 'viscam')
        port = settings.value('port')
        pos = settings.value('pos', QPoint(200, 200))
        size = settings.value('size', QSize(1000, 650))
        self.move(pos)
        self.resize(size)

    def writeSettings(self):
        settings = QSettings('Pixel Stereo', 'viscam')
        settings.setValue('port', self.port)
        settings.setValue('pos', self.pos())
        settings.setValue('size', self.size())

    def activeCamera(self):
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        else:
            return None

    def findCamera(self, fileName):
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)

    def setActivePort(self):
        self.port = self.ports_menu.currentText().encode('utf-8')
        self.updatePortMenu()
        serial.open(portname=self.port)
        viscams = _cmd_adress_set(serial)
        _if_clear(serial)
        for v in viscams:
            v = self.createCamera()
Пример #7
0
class CalculatorWindow(NodeEditorWindow):
    """Class representing the MainWindow of the application.

    Instance Attributes:
        name_company and name_product - used to register the settings
    """
    def initUI(self):
        """UI is composed with """

        # variable for QSettings
        self.name_company = 'Michelin'
        self.name_product = 'Calculator NodeEditor'

        # Load filesheets
        self.stylesheet_filename = os.path.join(os.path.dirname(__file__),
                                                'qss/nodeeditor.qss')
        loadStylessheets(
            os.path.join(os.path.dirname(__file__), 'qss/nodeeditor-dark.qss'),
            self.stylesheet_filename)

        self.empty_icon = QIcon(".")

        if DEBUG:
            print('Registered Node')
            pp(CALC_NODES)

        # Instantiate the MultiDocument Area
        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setViewMode(QMdiArea.TabbedView)
        self.mdiArea.setTabsClosable(True)
        self.setCentralWidget(self.mdiArea)

        # Connect subWindowActivate to updateMenu
        # Activate the items on the file_menu and the edit_menu
        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        # from mdi example...
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        # instantiate various elements
        self.createNodesDock()
        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.updateMenus()

        self.readSettings()

        self.setWindowTitle("Calculator NodeEditor Example")

    def createActions(self):
        """Instantiate various `QAction` for the main toolbar.

        File and Edit menu actions are instantiated in the :classs:~`node_editor.node_editor_widget.NodeEditorWidget`
        Window and Help actions are specific to the :class:~`examples.calc_window.CalcWindow`
        """
        super().createActions()
        self.actClose = QAction("Cl&ose",
                                self,
                                statusTip="Close the active window",
                                triggered=self.mdiArea.closeActiveSubWindow)
        self.actCloseAll = QAction("Close &All",
                                   self,
                                   statusTip="Close all the windows",
                                   triggered=self.mdiArea.closeAllSubWindows)
        self.actTile = QAction("&Tile",
                               self,
                               statusTip="Tile the windows",
                               triggered=self.mdiArea.tileSubWindows)
        self.actCascade = QAction("&Cascade",
                                  self,
                                  statusTip="Cascade the windows",
                                  triggered=self.mdiArea.cascadeSubWindows)
        self.actNext = QAction("Ne&xt",
                               self,
                               shortcut=QKeySequence.NextChild,
                               statusTip="Move the focus to the next window",
                               triggered=self.mdiArea.activateNextSubWindow)
        self.actPrevious = QAction(
            "Pre&vious",
            self,
            shortcut=QKeySequence.PreviousChild,
            statusTip="Move the focus to the previous window",
            triggered=self.mdiArea.activatePreviousSubWindow)

        self.actSeparator = QAction(self)
        self.actSeparator.setSeparator(True)

        self.actAbout = QAction("&About",
                                self,
                                statusTip="Show the application's About box",
                                triggered=self.about)

    def createMenus(self):
        """Populate File, Edit, Window and Help with `QAction`"""
        super().createMenus()

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.actAbout)

        # Any time the edit menu is about to be shown, update it
        self.editMenu.aboutToShow.connect(self.updateEditMenu)

    def onWindowNodesToolbar(self):
        """Event handling the visibility of the `Nodes Dock`"""
        if self.nodesDock.isVisible():
            self.nodesDock.hide()
        else:
            self.nodesDock.show()

    def createToolBars(self):
        pass

    def createNodesDock(self):
        """Create `Nodes Dock` and populates it with the list of `Nodes`

        The `Nodes` are automatically detected via the :class:~`examples.calc_drag_listbox.QNEDragListBox`
        """
        self.nodeListWidget = QNEDragListbox()

        self.nodesDock = QDockWidget("Nodes")
        self.nodesDock.setWidget(self.nodeListWidget)
        self.nodesDock.setFloating(False)

        self.addDockWidget(Qt.RightDockWidgetArea, self.nodesDock)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready", )

    def updateMenus(self):
        active = self.getCurrentNodeEditorWidget()
        hasMdiChild = (active is not None)

        self.actSave.setEnabled(hasMdiChild)
        self.actSaveAs.setEnabled(hasMdiChild)
        self.actClose.setEnabled(hasMdiChild)
        self.actCloseAll.setEnabled(hasMdiChild)
        self.actTile.setEnabled(hasMdiChild)
        self.actCascade.setEnabled(hasMdiChild)
        self.actNext.setEnabled(hasMdiChild)
        self.actPrevious.setEnabled(hasMdiChild)
        self.actSeparator.setVisible(hasMdiChild)

        self.updateEditMenu()

    def updateEditMenu(self):
        if DEBUG: print('updateEditMenu')
        try:
            active = self.getCurrentNodeEditorWidget()
            hasMdiChild = (active is not None)
            hasSelectedItems = hasMdiChild and active.hasSelectedItems()

            self.actPaste.setEnabled(hasMdiChild)

            self.actCut.setEnabled(hasSelectedItems)
            self.actCopy.setEnabled(hasSelectedItems)
            self.actDelete.setEnabled(hasSelectedItems)

            self.actUndo.setEnabled(hasMdiChild and active.canUndo())
            self.actRedo.setEnabled(hasMdiChild and active.canRedo())
        except Exception as e:
            dumpException(e)

    def updateWindowMenu(self):
        self.windowMenu.clear()

        toolbar_nodes = self.windowMenu.addAction('Nodes toolbar')
        toolbar_nodes.setCheckable(True)
        toolbar_nodes.triggered.connect(self.onWindowNodesToolbar)
        toolbar_nodes.setChecked(self.nodesDock.isVisible())
        self.windowMenu.addSeparator()

        self.windowMenu.addAction(self.actClose)
        self.windowMenu.addAction(self.actCloseAll)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.actTile)
        self.windowMenu.addAction(self.actCascade)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.actNext)
        self.windowMenu.addAction(self.actPrevious)
        self.windowMenu.addAction(self.actSeparator)

        windows = self.mdiArea.subWindowList()
        self.actSeparator.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.getUserFriendlyFilename())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.getCurrentNodeEditorWidget())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def getCurrentNodeEditorWidget(self) -> NodeEditorWidget:
        """Return the widget currently holding the scene.

        For different application, the method can be overridden to return mdiArea, the central widget...

        Returns
        -------
        NodeEditorWidget
            Node editor Widget. The widget holding the scene.
        """
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        return None

    def onFileNew(self):
        try:
            subwnd = self.createMdiChild()
            subwnd.widget().fileNew()
            subwnd.show()
        except Exception as e:
            dumpException(e)

    def onFileOpen(self):
        """Open OpenFileDialog"""
        # OpenFile dialog
        fnames, filter = QFileDialog.getOpenFileNames(
            self, 'Open graph from file', self.getFileDialogDirectory(),
            self.getFileDialogFilter())

        try:
            for fname in fnames:
                if fname:
                    existing = self.findMdiChild(fname)
                    if existing:
                        self.mdiArea.setActiveSubWindow(existing)
                    else:
                        # do not use createMdiChild as a new node editor to call the fileLoad method
                        # Create new subwindow and open file
                        nodeeditor = CalculatorSubWindow()
                        if nodeeditor.fileLoad(fname):
                            self.statusBar().showMessage(
                                f'File {fname} loaded', 5000)
                            nodeeditor.setTitle()
                            subwnd = self.createMdiChild(nodeeditor)
                            subwnd.show()
                        else:
                            nodeeditor.close()
        except Exception as e:
            dumpException(e)

    def about(self):
        QMessageBox.about(
            self, "About Calculator NodeEditor Example",
            "The <b>Calculator NodeEditor</b> example demonstrates how to write multiple "
            "document interface applications using PyQt5 and NodeEditor.")

    def closeEvent(self, event: QCloseEvent) -> None:
        try:
            self.mdiArea.closeAllSubWindows()
            if self.mdiArea.currentSubWindow():
                event.ignore()
            else:
                self.writeSettings()
                event.accept()
                # In case of fixing the application closing
                # import sys
                # sys.exit(0)
        except Exception as e:
            dumpException(e)

    def createMdiChild(self, child_widget=None):
        nodeeditor = child_widget if child_widget is not None else CalculatorSubWindow(
        )
        subwnd = self.mdiArea.addSubWindow(nodeeditor, )
        subwnd.setWindowIcon(self.empty_icon)
        # nodeeditor.scene.addItemSelectedListener(self.updateEditMenu)
        # nodeeditor.scene.addItemsDeselectedListener(self.updateEditMenu)
        nodeeditor.scene.history.addHistoryModifiedListener(
            self.updateEditMenu)
        nodeeditor.addCloseEventListener(self.onSubWndClose)
        return subwnd

    def onSubWndClose(self, widget: CalculatorSubWindow, event: QCloseEvent):
        # close event from the nodeeditor works by asking the active widget
        # if modification occurs on the active widget, ask to save or not.
        # Therefore when closing a subwindow, select the corresponding subwindow
        existing = self.findMdiChild(widget.filename)
        self.mdiArea.setActiveSubWindow(existing)

        # Does the active widget need to be saved ?
        if self.maybeSave():
            event.accept()
        else:
            event.ignore()

    def findMdiChild(self, fileName):
        for window in self.mdiArea.subWindowList():
            if window.widget().filename == fileName:
                return window
        return None

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)
Пример #8
0
class RDFNavigator(QMainWindow):
    output_message = pyqtSignal(str)

    def __init__(self):
        super(RDFNavigator, self).__init__()

        self.lastDir = '.'

        self.settingsManager = RDFNavigatorSettignsManager()
        self.resourceRefManager = RDFNavigatorResourceReferenceManager()
        self.childrenFactory = RDFNavigatorChildrenFactory(self)

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.updateMenus()
        self.createDockWidgets()
        self.readSettings()

        self.setWindowTitle("RDF Navigator")
        self.global_data = {}

        self.analyzeSystemData()
        #self.setStyleSheet("""QToolTip { background-color: black; color: white; border: black solid 1px }""")

    def closeEvent(self, event):
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            event.ignore()
        else:
            self.writeSettings()
            event.accept()

    def newFile(self, fileType):
        child = self.createMdiChild(fileType)
        child.newFile()
        child.show()

    def openFileHelper(self, fileName, fileType):
        if fileName:
            self.lastDir = os.path.dirname(fileName)
            existing = self.findMdiChild(fileName)
            if existing:
                self.mdiArea.setActiveSubWindow(existing)
                return
            child = self.createMdiChild(fileType)
            child.setManager(self.settingsManager)
            if child.loadFile(fileName):
                self.statusBar().showMessage("File loaded", 2000)
                child.show()
            else:
                child.close()

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Open runntime data format file", self.lastDir,
            "RDF Files (*.RDF);;XML Files (*.xml)")
        self.openFileHelper(fileName, RDFNavigatorChildrenTypes.XML)

    def openProject(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Open XML schema project file", self.lastDir,
            "XML Schema Files (*.xsd);;")
        self.openFileHelper(fileName, RDFNavigatorChildrenTypes.SCHEMA)
        child = self.findMdiChild(fileName)
        if child:
            schema = RDFNavigatorXmlSchema()
            schema.validation_message.connect(self.output_message)
            schema.setSchemaPath(fileName)
            graph = schema.getSchemaDependencyGraph()
            self.projectStructureWidget.createProjectTree(
                fileName, graph, RDFNavigatorChildrenTypes.SCHEMA)
            self.projectStructureWidget.open_file_request.connect(
                self.openFileHelper)

    def openTemplate(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Open system data template file", self.lastDir,
            "XML Template Files (*.xml);;")
        self.openFileHelper(fileName, RDFNavigatorChildrenTypes.TEMPLATE)
        child = self.findMdiChild(fileName)
        if child:
            schema = RDFNavigatorXmlSchema()
            schema.validation_message.connect(self.output_message)
            schema.setSchemaPath(fileName)
            graph = schema.getTemplateDependencyGraph()
            self.projectStructureWidget.createProjectTree(
                fileName, graph, RDFNavigatorChildrenTypes.TEMPLATE)
            self.projectStructureWidget.createObjectsTree(fileName)
            self.projectStructureWidget.createFileSystemTree(fileName)
            self.projectStructureWidget.open_file_request.connect(
                self.openFileHelper)
            self.analyzeTemplateData(os.path.dirname(fileName))

    def save(self):
        if self.activeMdiChild() and self.activeMdiChild().save():
            self.statusBar().showMessage("File saved", 2000)

    def saveAs(self):
        if self.activeMdiChild() and self.activeMdiChild().saveAs():
            self.statusBar().showMessage("File saved", 2000)

    def cut(self):
        if self.activeMdiChild():
            self.activeMdiChild().cut()

    def copy(self):
        if self.activeMdiChild():
            self.activeMdiChild().copy()

    def paste(self):
        if self.activeMdiChild():
            self.activeMdiChild().paste()

    def activateFind(self):
        child = self.activeMdiChild()
        find = RDFNavigatorFind(self)

        find.findAllCurrentClicked.connect(child.findAll)
        find.findNextClicked.connect(child.findNextWord)
        find.findCountClicked.connect(child.countWord)

        if child.hasSelectedText():
            text = child.selectedText()
            find.setFindText(text)
        find.show()

    def about(self):
        QMessageBox.about(self, "About RDF Navigator",
                          "Tool to simplify work with RDF data")

    def updateMenus(self):
        hasMdiChild = (self.activeMdiChild() is not None)
        self.saveAct.setEnabled(hasMdiChild)
        self.saveAsAct.setEnabled(hasMdiChild)
        self.pasteAct.setEnabled(hasMdiChild)
        self.closeAct.setEnabled(hasMdiChild)
        self.closeAllAct.setEnabled(hasMdiChild)
        self.tileAct.setEnabled(hasMdiChild)
        self.cascadeAct.setEnabled(hasMdiChild)
        self.nextAct.setEnabled(hasMdiChild)
        self.previousAct.setEnabled(hasMdiChild)
        self.separatorAct.setVisible(hasMdiChild)

        hasSelection = (self.activeMdiChild() is not None
                        and self.activeMdiChild().hasSelectedText())

        self.cutAct.setEnabled(hasSelection)
        self.copyAct.setEnabled(hasSelection)

    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tileAct)
        self.windowMenu.addAction(self.cascadeAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.activeMdiChild())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def createMdiChild(self, childType):
        child = self.childrenFactory.createObject(childType)
        self.mdiArea.addSubWindow(child)
        child.copyAvailable.connect(self.cutAct.setEnabled)
        child.copyAvailable.connect(self.copyAct.setEnabled)
        return child

    def createActions(self):
        self.newAct = QAction(QIcon(':/images/new.png'),
                              "&New",
                              self,
                              shortcut=QKeySequence.New,
                              statusTip="Create a new file",
                              triggered=self.newFile)
        self.openFileAct = QAction(QIcon(':/images/open.png'),
                                   "&Open file...",
                                   self,
                                   shortcut=QKeySequence.Open,
                                   statusTip="Open an existing file",
                                   triggered=self.open)
        self.openProjectAct = QAction(QIcon(':/images/openProject.png'),
                                      "&Open project...",
                                      self,
                                      shortcut=QKeySequence("Ctrl+Shift+O"),
                                      statusTip="Open an existing project",
                                      triggered=self.openProject)
        self.openTemplate = QAction(QIcon(':/images/sdt.png'),
                                    "&Open template...",
                                    self,
                                    shortcut=QKeySequence("Alt+Shift+O"),
                                    statusTip="Open an existing template",
                                    triggered=self.openTemplate)
        self.saveAct = QAction(QIcon(':/images/save.png'),
                               "&Save",
                               self,
                               shortcut=QKeySequence.Save,
                               statusTip="Save the document to disk",
                               triggered=self.save)
        self.saveAsAct = QAction(
            "Save &As...",
            self,
            shortcut=QKeySequence.SaveAs,
            statusTip="Save the document under a new name",
            triggered=self.saveAs)
        self.exitAct = QAction(
            "E&xit",
            self,
            shortcut=QKeySequence.Quit,
            statusTip="Exit the application",
            triggered=QApplication.instance().closeAllWindows)

        self.cutAct = QAction(
            QIcon(':/images/cut.png'),
            "Cu&t",
            self,
            shortcut=QKeySequence.Cut,
            statusTip="Cut the current selection's contents to the clipboard",
            triggered=self.cut)
        self.copyAct = QAction(
            QIcon(':/images/copy.png'),
            "&Copy",
            self,
            shortcut=QKeySequence.Copy,
            statusTip="Copy the current selection's contents to the clipboard",
            triggered=self.copy)
        self.pasteAct = QAction(
            QIcon(':/images/paste.png'),
            "&Paste",
            self,
            shortcut=QKeySequence.Paste,
            statusTip=
            "Paste the clipboard's contents into the current selection",
            triggered=self.paste)
        self.findAct = QAction(QIcon(':/images/find.png'),
                               "&Find",
                               self,
                               shortcut=QKeySequence.Find,
                               statusTip="Find text",
                               triggered=self.activateFind)

        self.settingsAct = QAction(QIcon(':/images/settings.png'),
                                   "Open settings",
                                   self,
                                   shortcut=QKeySequence("Ctrl+1"),
                                   statusTip="Open Settings",
                                   triggered=self.activateSettings)

        self.showProjectStructAct = QAction(
            QIcon(':/images/project_structure.png'),
            "Show structure",
            self,
            shortcut=QKeySequence("Alt+1"),
            statusTip="Show project structure",
            triggered=self.showProjectStructure)
        self.showOutputAct = QAction(QIcon(':/images/project_output.png'),
                                     "Show output",
                                     self,
                                     shortcut=QKeySequence("Alt+2"),
                                     statusTip="Show output",
                                     triggered=self.showOutput)
        self.showBookmarks = QAction(QIcon(':/images/project_bookmarks.png'),
                                     "Show bookmarks",
                                     self,
                                     shortcut=QKeySequence("Alt+3"),
                                     statusTip="Show bookmarks",
                                     triggered=self.showBookmarks)
        self.showAsDiagram = QAction(QIcon(':/images/diagram.png'),
                                     "Show as diagram",
                                     self,
                                     shortcut=QKeySequence("Alt+4"),
                                     statusTip="Show document as diagram",
                                     triggered=self.showAsDiagram)

        self.closeAct = QAction("Cl&ose",
                                self,
                                statusTip="Close the active window",
                                triggered=self.mdiArea.closeActiveSubWindow)
        self.closeAllAct = QAction("Close &All",
                                   self,
                                   statusTip="Close all the windows",
                                   triggered=self.mdiArea.closeAllSubWindows)
        self.tileAct = QAction("&Tile",
                               self,
                               statusTip="Tile the windows",
                               triggered=self.mdiArea.tileSubWindows)
        self.cascadeAct = QAction("&Cascade",
                                  self,
                                  statusTip="Cascade the windows",
                                  triggered=self.mdiArea.cascadeSubWindows)
        self.nextAct = QAction("Ne&xt",
                               self,
                               shortcut=QKeySequence.NextChild,
                               statusTip="Move the focus to the next window",
                               triggered=self.mdiArea.activateNextSubWindow)
        self.previousAct = QAction(
            "Pre&vious",
            self,
            shortcut=QKeySequence.PreviousChild,
            statusTip="Move the focus to the previous window",
            triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

        self.aboutAct = QAction("&About",
                                self,
                                statusTip="Show the application's About box",
                                triggered=self.about)
        self.aboutQtAct = QAction("About &Qt",
                                  self,
                                  statusTip="Show the Qt library's About box",
                                  triggered=QApplication.instance().aboutQt)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openFileAct)
        self.fileMenu.addAction(self.openProjectAct)
        self.fileMenu.addAction(self.openTemplate)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator()
        action = self.fileMenu.addAction("Switch layout direction")
        action.triggered.connect(self.switchLayoutDirection)
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)
        self.editMenu.addAction(self.findAct)

        self.settingsMenu = self.menuBar().addMenu("Set&tings")
        self.settingsMenu.addAction(self.settingsAct)

        self.viewMenu = self.menuBar().addMenu("&View")
        self.createViewMenu()

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newAct)
        self.fileToolBar.addAction(self.openFileAct)
        self.fileToolBar.addAction(self.openProjectAct)
        self.fileToolBar.addAction(self.openTemplate)
        self.fileToolBar.addAction(self.saveAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def createDockWidgets(self):
        self.projectStructureWidget = RDFNavigatorProjectStructure(self)
        self.projectStructureDockWidget = QDockWidget("Project structure",
                                                      self)
        self.projectStructureDockWidget.setWidget(self.projectStructureWidget)
        self.addDockWidget(Qt.LeftDockWidgetArea,
                           self.projectStructureDockWidget)

        self.projectOutputWidget = RDFNavigatorOutput(self)
        self.projectOutputDockWidget = QDockWidget("Project output", self)
        self.projectOutputDockWidget.setWidget(self.projectOutputWidget)
        self.addDockWidget(Qt.BottomDockWidgetArea,
                           self.projectOutputDockWidget)

        self.output_message.connect(self.projectOutputWidget.write)

        self.bookmarskWidget = RDFNavigatorBookmarks(self)
        self.bookmarksDockWidget = QDockWidget("Bookmarks", self)
        self.bookmarksDockWidget.setWidget(self.bookmarskWidget)
        self.addDockWidget(Qt.BottomDockWidgetArea, self.bookmarksDockWidget)
        self.bookmarskWidget.bookmark_ref_requested.connect(self.showBookmark)

    def readSettings(self):
        pos = self.settingsManager.getConfig('pos', QPoint(200, 200))
        size = self.settingsManager.getConfig('size', QSize(400, 400))
        self.lastDir = self.settingsManager.getConfig('lastDir', '')
        self.move(pos)
        self.resize(size)

    def writeSettings(self):
        self.settingsManager.setConfig('pos', self.pos())
        self.settingsManager.setConfig('size', self.size())
        self.settingsManager.setConfig('lastDir', self.lastDir)

    def activeMdiChild(self):
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        return None

    def findMdiChild(self, fileName):
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def switchLayoutDirection(self):
        if self.layoutDirection() == Qt.LeftToRight:
            QApplication.setLayoutDirection(Qt.RightToLeft)
        else:
            QApplication.setLayoutDirection(Qt.LeftToRight)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)

    def activateSettings(self):
        settingsDlg = RDFNavigatorSettings(self)

        settingsDlg.setPluginsPath(self.settingsManager)
        settingsDlg.setRDFToolsPath(self.settingsManager)
        settingsDlg.setSchemaPath(self.settingsManager)
        settingsDlg.setSysDataPath(self.settingsManager)

        settingsDlg.exec_()
        settingsDict = settingsDlg.getConfig()
        map(lambda (x, y): self.settingsManager.setConfig(x, y),
            settingsDict.items())

    def analyzeSystemData(self):
        self.resourceRefManager.setSysDataPath(
            self.settingsManager.getConfig('sys_data', ''))
        self.global_refs_data, self.global_vals_data = self.resourceRefManager.analyzeRefs(
        )

        if self.global_refs_data != {} and self.global_vals_data != {}:
            self.global_file_refs_data = dict(
                reduce(lambda x, y: x + y,
                       [[(v, keys) for v in vals]
                        for keys, vals in self.global_refs_data.iteritems()
                        if vals != {}]))

    def analyzeTemplateData(self, template_path):
        sysDataPath = self.resourceRefManager.getSysDataPath()
        self.resourceRefManager.setSysDataPath(template_path)
        self.template_refs_data, self.template_vals_data = self.resourceRefManager.analyzeRefs(
        )
        if self.template_refs_data != {} and self.template_vals_data != {}:
            self.template_file_refs_data = dict(
                reduce(lambda x, y: x + y,
                       [[(v, keys) for v in vals]
                        for keys, vals in self.template_refs_data.iteritems()
                        if vals != {}]))
            self.resourceRefManager.setSysDataPath(sysDataPath)

    def showReference(self, obj_name, key_id):
        child_name = self.template_file_refs_data.get(obj_name)
        if child_name is None:
            child_name = self.global_file_refs_data[obj_name]
        child = self.findMdiChild(child_name)
        if child is None:
            self.openFileHelper(child_name, RDFNavigatorChildrenTypes.TEMPLATE)
            child = self.findMdiChild(child_name)
        self.mdiArea.setActiveSubWindow(child)
        line = None
        try:
            line = self.template_refs_data[child_name][obj_name][key_id]
        except KeyError:
            line = self.global_refs_data[child_name][obj_name][key_id]
        child.widget().goToLine(line)

    def showReferenceValue(self, obj_name, key_id):
        child_name = self.template_file_refs_data.get(obj_name)
        if child_name is None:
            child_name = self.global_file_refs_data[obj_name]
        value = None
        try:
            value = self.template_vals_data[child_name][obj_name][key_id]
        except KeyError:
            value = self.global_refs_data[child_name][obj_name][key_id]
        child = self.activeMdiChild()
        if child is not None:
            child.displayRefValue(value)

    def showBookmark(self, filename, line):
        child = self.findMdiChild(filename)
        if child is None:
            self.openFileHelper(filename, RDFNavigatorChildrenTypes.TEMPLATE)
            child = self.findMdiChild(filename)
        self.mdiArea.setActiveSubWindow(child)
        child.widget().goToLine(line)

    def createViewMenu(self):
        self.viewMenu.addAction(self.showProjectStructAct)
        self.viewMenu.addAction(self.showOutputAct)
        self.viewMenu.addAction(self.showBookmarks)
        self.viewMenu.addAction(self.showAsDiagram)

    def showProjectStructure(self):
        self.projectStructureDockWidget.show()

    def showOutput(self):
        self.projectOutputDockWidget.show()

    def showBookmarks(self):
        self.bookmarksDockWidget.show()

    def showAsDiagram(self):
        from rdfdiagram.rdfdiagramwidget import RdfDiagramWidget
        rdfdiagram = RdfDiagramWidget(self)
        self.mdiArea.addSubWindow(rdfdiagram)
        rdfdiagram.show()
Пример #9
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.updateMenus()

        self.readSettings()

        self.setWindowTitle("MDI")

    def closeEvent(self, event):
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            event.ignore()
        else:
            self.writeSettings()
            event.accept()

    def newFile(self):
        child = self.createMdiChild()
        child.newFile()
        child.show()

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self)
        if fileName:
            existing = self.findMdiChild(fileName)
            if existing:
                self.mdiArea.setActiveSubWindow(existing)
                return

            child = self.createMdiChild()
            if child.loadFile(fileName):
                self.statusBar().showMessage("File loaded", 2000)
                child.show()
            else:
                child.close()

    def save(self):
        if self.activeMdiChild() and self.activeMdiChild().save():
            self.statusBar().showMessage("File saved", 2000)

    def saveAs(self):
        if self.activeMdiChild() and self.activeMdiChild().saveAs():
            self.statusBar().showMessage("File saved", 2000)

    def cut(self):
        if self.activeMdiChild():
            self.activeMdiChild().cut()

    def copy(self):
        if self.activeMdiChild():
            self.activeMdiChild().copy()

    def paste(self):
        if self.activeMdiChild():
            self.activeMdiChild().paste()

    def about(self):
        QMessageBox.about(self, "About MDI",
                "The <b>MDI</b> example demonstrates how to write multiple "
                "document interface applications using Qt.")

    def updateMenus(self):
        hasMdiChild = (self.activeMdiChild() is not None)
        self.saveAct.setEnabled(hasMdiChild)
        self.saveAsAct.setEnabled(hasMdiChild)
        self.pasteAct.setEnabled(hasMdiChild)
        self.closeAct.setEnabled(hasMdiChild)
        self.closeAllAct.setEnabled(hasMdiChild)
        self.tileAct.setEnabled(hasMdiChild)
        self.cascadeAct.setEnabled(hasMdiChild)
        self.nextAct.setEnabled(hasMdiChild)
        self.previousAct.setEnabled(hasMdiChild)
        self.separatorAct.setVisible(hasMdiChild)

        hasSelection = (self.activeMdiChild() is not None and
                        self.activeMdiChild().textCursor().hasSelection())
        self.cutAct.setEnabled(hasSelection)
        self.copyAct.setEnabled(hasSelection)

    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tileAct)
        self.windowMenu.addAction(self.cascadeAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.activeMdiChild())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def createMdiChild(self):
        child = MdiChild()
        self.mdiArea.addSubWindow(child)

        child.copyAvailable.connect(self.cutAct.setEnabled)
        child.copyAvailable.connect(self.copyAct.setEnabled)

        return child

    def createActions(self):
        self.newAct = QAction(QIcon(':/images/new.png'), "&New", self,
                shortcut=QKeySequence.New, statusTip="Create a new file",
                triggered=self.newFile)

        self.openAct = QAction(QIcon(':/images/open.png'), "&Open...", self,
                shortcut=QKeySequence.Open, statusTip="Open an existing file",
                triggered=self.open)

        self.saveAct = QAction(QIcon(':/images/save.png'), "&Save", self,
                shortcut=QKeySequence.Save,
                statusTip="Save the document to disk", triggered=self.save)

        self.saveAsAct = QAction("Save &As...", self,
                shortcut=QKeySequence.SaveAs,
                statusTip="Save the document under a new name",
                triggered=self.saveAs)

        self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit,
                statusTip="Exit the application",
                triggered=QApplication.instance().closeAllWindows)

        self.cutAct = QAction(QIcon(':/images/cut.png'), "Cu&t", self,
                shortcut=QKeySequence.Cut,
                statusTip="Cut the current selection's contents to the clipboard",
                triggered=self.cut)

        self.copyAct = QAction(QIcon(':/images/copy.png'), "&Copy", self,
                shortcut=QKeySequence.Copy,
                statusTip="Copy the current selection's contents to the clipboard",
                triggered=self.copy)

        self.pasteAct = QAction(QIcon(':/images/paste.png'), "&Paste", self,
                shortcut=QKeySequence.Paste,
                statusTip="Paste the clipboard's contents into the current selection",
                triggered=self.paste)

        self.closeAct = QAction("Cl&ose", self,
                statusTip="Close the active window",
                triggered=self.mdiArea.closeActiveSubWindow)

        self.closeAllAct = QAction("Close &All", self,
                statusTip="Close all the windows",
                triggered=self.mdiArea.closeAllSubWindows)

        self.tileAct = QAction("&Tile", self, statusTip="Tile the windows",
                triggered=self.mdiArea.tileSubWindows)

        self.cascadeAct = QAction("&Cascade", self,
                statusTip="Cascade the windows",
                triggered=self.mdiArea.cascadeSubWindows)

        self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild,
                statusTip="Move the focus to the next window",
                triggered=self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction("Pre&vious", self,
                shortcut=QKeySequence.PreviousChild,
                statusTip="Move the focus to the previous window",
                triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

        self.aboutAct = QAction("&About", self,
                statusTip="Show the application's About box",
                triggered=self.about)

        self.aboutQtAct = QAction("About &Qt", self,
                statusTip="Show the Qt library's About box",
                triggered=QApplication.instance().aboutQt)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator()
        action = self.fileMenu.addAction("Switch layout direction")
        action.triggered.connect(self.switchLayoutDirection)
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newAct)
        self.fileToolBar.addAction(self.openAct)
        self.fileToolBar.addAction(self.saveAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings('Trolltech', 'MDI Example')
        pos = settings.value('pos', QPoint(200, 200))
        size = settings.value('size', QSize(400, 400))
        self.move(pos)
        self.resize(size)

    def writeSettings(self):
        settings = QSettings('Trolltech', 'MDI Example')
        settings.setValue('pos', self.pos())
        settings.setValue('size', self.size())

    def activeMdiChild(self):
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        return None

    def findMdiChild(self, fileName):
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def switchLayoutDirection(self):
        if self.layoutDirection() == Qt.LeftToRight:
            QApplication.setLayoutDirection(Qt.RightToLeft)
        else:
            QApplication.setLayoutDirection(Qt.LeftToRight)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)
Пример #10
0
class CQCadWindow(QMainWindow):
    # Platform independent application settings
    settings = QSettings('cqcad', 'settings')
    guiState = QSettings('cqcad', 'gui')
    menuList = []

    def __init__(self):
        super(CQCadWindow, self).__init__()

        self.initUI()

    def closeEvent(self, event):
        """
        Allows us to clean up after ourselves and make sure that everything is
        saved that the user intended to save.

        :param event: Object describing this event
        :return: None
        """

        self.guiState.sync()
        self.settings.sync()

    def clickAbout(self):
        """
        Displays a dialog with information about this application, including
        the version information for all libraries.

        :return: None
        """
        varTitle = QtCore.QCoreApplication.translate('cqcad', "About CQCad")
        varMsg = QtCore.QCoreApplication.translate(
            'cqcad', "CQCad 2D/3D CAD\r\nVersion: " + __version__ +
            "\r\n\r\nCadQuery Version: N/A\r\nPythonOCC Version: N/A\r\nFreeCAD Version: N/A"
        )

        QMessageBox.about(self, varTitle, varMsg)

    def clickHelp(self):
        """
        Displays a dialog with information about where to find help.

        :return: None
        """
        docLabel = QLabel("http://dcowden.github.io/cadquery/")
        docLabel.setOpenExternalLinks = True

        varTitle = QtCore.QCoreApplication.translate('cqcad', "Finding Help")
        varMsg = QtCore.QCoreApplication.translate(
            'cqcad', "CQCad 2D/3D CAD\r\nVersion: " + __version__ +
            "\r\n\r\nDocumentation: http://dcowden.github.io/cadquery/\r\nVideo Tutorials: https://www.youtube.com/playlist?list=PLMXw3KF1-YfUeFnw6Ich9jvgYjyjiBS3w\r\nUser Group: https://groups.google.com/forum/#!forum/cadquery"
        )

        msgBox = QMessageBox.about(self, varTitle, varMsg)
        # msgBox.setTextFormat(Qt.RichText)

    def notImplemented(self):
        """
        Displays a dialog with information about this application, including
        the version information for all libraries.

        :return: None
        """
        niTitle = "Not Implemented"
        niMsg = QtCore.QCoreApplication.translate(
            'cqcad',
            "This feature has not been implemented yet. If you would like to see this feature in the release version, please create an issue on the GitHub repository. https://github.com/jmwright/cqcad"
        )

        QMessageBox.about(self, niTitle, niMsg)

    def switchModes(self):
        """
        Toggles the other mode check menu items so that only one mode is active
        at a time.

        :return: None
        """
        sending_button = self.sender()

        # Toggle all the other items that were not selected
        if sending_button.objectName() == 'mouse_first':
            self.script1stAct.setChecked(False)

            # Keep track of the state of the GUI for the user
            self.guiState.setValue('mouse_first_enabled', True)
            self.guiState.setValue('script_first_enabled', False)

        elif sending_button.objectName() == 'script_first':
            self.mouse1stAct.setChecked(False)

            # Keep track of the state of the GUI for the user
            self.guiState.setValue('mouse_first_enabled', False)
            self.guiState.setValue('script_first_enabled', True)

    def toggleDock(self):
        """
        Toggles the dock widgets visibility when the menu item is clicked.

        :return: None
        """
        if self.dock.isVisible() == True:
            self.dock.hide()
            self.dockAct.setChecked(False)

            # Keep track of the state of the GUI for the user
            self.guiState.setValue('dock_visible', False)
        else:
            self.dock.show()
            self.dockAct.setChecked(True)

            # Keep track of the state of the GUI for the user
            self.guiState.setValue('dock_visible', True)

        self.guiState.sync()

    def uncheckDockMenu(self):
        """
        Unchecks the dock menu item if the dock widget is closed manually.

        :return: None
        """
        self.dockAct.setChecked(False)

        # Keep track of the state of the GUI for the user
        self.guiState.setValue('dock_visible', False)

    def setInitialDockState(self):
        dockState = self.guiState.value('dock_visible', type=bool)

        if dockState:
            self.dock.show()
            self.dockAct.setChecked(True)
        else:
            self.dock.hide()
            self.dockAct.setChecked(False)

    def getLayouts(self):
        """
        Finds a list of all the layouts that are installed.
        :return: The titles of all the layouts that are installed.
        """
        module_base_path = os.path.dirname(__file__)
        layouts_path = os.path.join(module_base_path, 'layouts')

        titles = []
        functions = {}

        for module in os.listdir(layouts_path):
            if module.endswith('.py') and module != "__init__.py":
                baseName = os.path.splitext(module)[0]
                name = "layouts." + baseName
                mod = __import__(name, fromlist=[baseName])

                titles.append(mod.__title__)
                functions[mod.__title__.replace(' ',
                                                '_').lower()] = mod.execute

        return (titles, functions)

    def loadExtensions(self):
        """
        Finds all of the extensions that are installed and instantiates them.
        :return: None
        """
        module_base_path = os.path.dirname(__file__)
        layouts_path = os.path.join(module_base_path, 'extensions')

        # Load all the extensions and for now tell them to run their setup function to make changes to the GUI
        for module in os.listdir(layouts_path):
            if module.endswith('.py') and module != "__init__.py":
                baseName = os.path.splitext(module)[0]
                name = "extensions." + baseName
                mod = __import__(name, fromlist=[baseName])

                enabled = self.guiState.value(name + "_checked", type=bool)

                # Only load the controls for the extension if it is selected
                if enabled:
                    mod.setup(self)

                act = QAction('&' + baseName, self, checkable=True)
                # act.setShortcut('F6')
                act.setStatusTip(baseName)
                act.setChecked(enabled)
                act.setObjectName(baseName)
                act.triggered.connect(self.toggleExtension)
                self.extsMenu.addAction(act)

                self.menuList.append(act)

    def fireFunction(self):
        """
        Allows us to fire dynamically loaded functions while avoiding a mess
        with a collections.namedtuple import error.
        :return: None
        """
        widget = self.sender().objectName()

        # Avoid an exception from the key not being present
        if widget in self.funcs.keys():
            self.funcs[widget](self.mdiArea)

    def toggleExtsMenuVisibility(self):
        """
        Allows the user to click on the extensions toolbutton and still get the
        drop-down menu.
        :return: None
        """
        if not self.extsMenu.isVisible():
            self.extsButton.showMenu()

    def toggleExtension(self):
        baseName = self.sender().objectName()
        name = "extensions." + baseName
        mod = __import__(name, fromlist=[baseName])

        if self.sender().isChecked():
            mod.setup(self)
            self.guiState.setValue(name + "_checked", True)
        else:
            mod.tearDown(self)
            self.guiState.setValue(name + "_checked", False)

        self.guiState.sync()

    def showSettingsDialog(self):
        self.settingsDlg = SettingsDialog(self)

        # TODO: Init with keybindings, execute_on_save, use_external_editor, max_line_length settings, line_numbers, cad_engine

    def showNewDialog(self):
        newDlg = NewDialog(self)

    def addScriptWindow(self):
        """
        Opens a template in the Python script editor
        :return: None
        """
        subWin = QMdiSubWindow()
        child = CodeEditor(self)
        subWin.setWidget(child)
        child.setObjectName('script:' + str(uuid.uuid1()))
        self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg'))
        self.mdiArea.addSubWindow(subWin)
        subWin.setWindowState(QtCore.Qt.WindowMaximized)
        subWin.setWindowTitle('untitled.py')

        file = open("templates/script_template.py", "r")
        templateText = file.read()

        child.setPlainText(templateText)

    def addPartWindow(self):
        """
        For now, default to opening a part template in the Python script editor
        :return: None
        """
        subWin = QMdiSubWindow()
        self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg'))
        self.mdiArea.addSubWindow(subWin)

        # backend_str = "qt-pyqt5"
        # used_backend = load_backend(backend_str)
        # from OCC.Display.qtDisplay import qtViewer3d

        # Set the part window up differently based on whether the user has
        # selected the mouse first or script first mode
        if self.mouse1stAct.isChecked():
            child = Viewer3D(self)
            subWin.setWidget(child)

            # If we don't do this the window title bar can disappear
            subWin.setMinimumSize(100, 300)

            subWin.setWindowState(QtCore.Qt.WindowMaximized)

            # For now display a default object
            child.InitDriver()
            child._display.Test()
        else:
            child = CodeEditor(self)
            subWin.setWidget(child)

            file = open("templates/part_template.py", "r")
            templateText = file.read()

            child.setPlainText(templateText)

            subWin.setWindowState(QtCore.Qt.WindowMaximized)

    def addAsmWindow(self):
        """
        For now, default to opening a part template in the Python script editor
        :return: None
        """
        # For now, default to opening a script editor
        child = CodeEditor(self)
        self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg'))
        self.mdiArea.addSubWindow(child)
        child.setWindowState(QtCore.Qt.WindowMaximized)

        file = open("templates/assembly_template.py", "r")
        templateText = file.read()

        child.setPlainText(templateText)

    def executeScript(self):
        """
        Executes the script in the active editor window and displays it.
        """
        # Get the active window so we can get the script and match the title
        activeWin = self.mdiArea.activeSubWindow()
        scriptTitle = activeWin.windowTitle()

        # If this isn't a script window we need to handle it differently
        if ".py" not in scriptTitle:
            self.statusBar().showMessage(
                'Cannot Execute From a Non-Script Window')
            return

        # See if the 3D view is somewhere in the MDI subwindows
        subWin = self.getSubwindowByName(scriptTitle + " (3D)")

        # If the 3D view doesn't exist, create it
        if subWin == None:
            # Set up a new 3D view window
            subWin = QMdiSubWindow()
            # self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg'))
            self.mdiArea.addSubWindow(subWin)

            child = Viewer3D(self)
            subWin.setWidget(child)
            subWin.setWindowTitle(scriptTitle + " (3D)")

            # If we don't do this the window title bar can disappear
            subWin.setMinimumSize(100, 300)

            subWin.setWindowState(QtCore.Qt.WindowMaximized)

            # For now display a default object
            child.InitDriver()
            child._display.Test()

        # Extract the text from the script window, execute it, and display the result
        scriptText = activeWin.widget().toPlainText()
        print(scriptText)

    def getSubwindowByName(self, name):
        """
        Searches for a subwindow in the MDI area by name
        """
        foundWin = None
        for subwin in self.mdiArea.subWindowList():
            if subwin.windowTitle() == name:
                foundWin = subwin

        return foundWin

    def setInitialGUIState(self):
        # Mouse vs script mode
        self.guiState.setValue('script_first_enabled', True)
        self.guiState.setValue('mouse_first_enabled', False)

        # Widget visibility
        self.guiState.setValue('dock_visible', True)

        # Make sure we only enter this code once
        self.guiState.setValue('first_run_over', True)

    def initUI(self):
        # Handle setting things up if this is the first time this app has been run
        if not self.guiState.value('first_run_over', type=bool):
            self.setInitialGUIState()

        # Translations of menu items
        exitName = QtCore.QCoreApplication.translate('cqcad', "Exit")
        exitTip = QtCore.QCoreApplication.translate('cqcad',
                                                    "Exit application")
        newName = QtCore.QCoreApplication.translate('cqcad', "New")
        newTip = QtCore.QCoreApplication.translate('cqcad', "New")
        openName = QtCore.QCoreApplication.translate('cqcad', "Open")
        openTip = QtCore.QCoreApplication.translate('cqcad',
                                                    "Open project or script")
        closeName = QtCore.QCoreApplication.translate('cqcad', "Close")
        closeTip = QtCore.QCoreApplication.translate(
            'cqcad', "Close project or script")
        impName = QtCore.QCoreApplication.translate('cqcad', "Import")
        impTip = QtCore.QCoreApplication.translate('cqcad', "Import")
        expName = QtCore.QCoreApplication.translate('cqcad', "Export")
        expTip = QtCore.QCoreApplication.translate('cqcad', "Export")
        abtName = QtCore.QCoreApplication.translate('cqcad', "About")
        abtTip = QtCore.QCoreApplication.translate('cqcad', "About")
        m1stName = QtCore.QCoreApplication.translate(
            'cqcad', "Mouse First (Experimental)")
        m1stTip = QtCore.QCoreApplication.translate(
            'cqcad', "Mouse first (experimental)")
        s1stName = QtCore.QCoreApplication.translate('cqcad', "Script First")
        s1stTip = QtCore.QCoreApplication.translate('cqcad', "Script first")
        pEdName = QtCore.QCoreApplication.translate('cqcad',
                                                    "Parameters Editor")
        pEdTip = QtCore.QCoreApplication.translate('cqcad',
                                                   "Parameters editor")
        viewerName = QtCore.QCoreApplication.translate('cqcad',
                                                       "Object Viewer")
        viewerTip = QtCore.QCoreApplication.translate('cqcad', "Object viewer")
        conName = QtCore.QCoreApplication.translate('cqcad', "Console")
        conTip = QtCore.QCoreApplication.translate('cqcad', "Console")
        dockName = QtCore.QCoreApplication.translate('cqcad', "Dock")
        libsName = QtCore.QCoreApplication.translate('cqcad', "Collections")
        libsTip = QtCore.QCoreApplication.translate('cqcad', "Collections")
        extsName = QtCore.QCoreApplication.translate('cqcad', "Extensions")
        extsTip = QtCore.QCoreApplication.translate('cqcad', "Extensions")
        layoutsName = QtCore.QCoreApplication.translate('cqcad', "Layouts")
        layoutsTip = QtCore.QCoreApplication.translate('cqcad', "Layouts")
        setsName = QtCore.QCoreApplication.translate('cqcad', "Settings")
        setsTip = QtCore.QCoreApplication.translate('cqcad', "Settings")
        fileName = QtCore.QCoreApplication.translate('cqcad', "File")
        rcntName = QtCore.QCoreApplication.translate('cqcad', "Recent")
        exName = QtCore.QCoreApplication.translate('cqcad', "Examples")
        editName = QtCore.QCoreApplication.translate('cqcad', "Edit")
        viewName = QtCore.QCoreApplication.translate('cqcad', "View")
        modesName = QtCore.QCoreApplication.translate('cqcad', "Modes")
        panelsName = QtCore.QCoreApplication.translate('cqcad', "Panels")
        layoutMenuName = QtCore.QCoreApplication.translate('cqcad', "Layout")
        layoutMenuTip = QtCore.QCoreApplication.translate('cqcad', "Layout")
        helpName = QtCore.QCoreApplication.translate('cqcad', "Help")
        axioViewName = QtCore.QCoreApplication.translate(
            'cqcad', "Axiometric View")
        axioViewTip = QtCore.QCoreApplication.translate(
            'cqcad', "Axiometric View")
        frontViewName = QtCore.QCoreApplication.translate(
            'cqcad', "Front View")
        frontViewTip = QtCore.QCoreApplication.translate('cqcad', "Front View")
        backViewName = QtCore.QCoreApplication.translate('cqcad', "Back View")
        backViewTip = QtCore.QCoreApplication.translate('cqcad', "Back View")
        topViewName = QtCore.QCoreApplication.translate('cqcad', "Top View")
        topViewTip = QtCore.QCoreApplication.translate('cqcad', "Top View")
        bottomViewName = QtCore.QCoreApplication.translate(
            'cqcad', "Bottom View")
        bottomViewTip = QtCore.QCoreApplication.translate(
            'cqcad', "Bottom View")
        leftViewName = QtCore.QCoreApplication.translate('cqcad', "Left View")
        leftViewTip = QtCore.QCoreApplication.translate('cqcad', "Left View")
        rightViewName = QtCore.QCoreApplication.translate(
            'cqcad', "Right View")
        rightViewTip = QtCore.QCoreApplication.translate('cqcad', "Right View")
        fitAllName = QtCore.QCoreApplication.translate('cqcad', "Fit All")
        fitAllTip = QtCore.QCoreApplication.translate('cqcad', "Fit All")
        docsName = QtCore.QCoreApplication.translate('cqcad', "Documentation")
        docsTip = QtCore.QCoreApplication.translate('cqcad', "Documentation")
        vidsName = QtCore.QCoreApplication.translate('cqcad',
                                                     "Video Tutorials")
        vidsTip = QtCore.QCoreApplication.translate('cqcad', "Video Tutorials")
        uGroupName = QtCore.QCoreApplication.translate('cqcad', "User Group")
        uGroupTip = QtCore.QCoreApplication.translate('cqcad', "User Group")
        extsToolName = QtCore.QCoreApplication.translate('cqcad', "Extensions")
        extsToolTip = QtCore.QCoreApplication.translate('cqcad', "Extensions")

        #self.setGeometry(300, 300, 250, 150)

        # The central MDI window area
        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.setWindowTitle('CQCad')
        self.setWindowIcon(
            QtGui.QIcon('content/images/cadquery_logo_dark.svg'))
        self.statusBar().showMessage('Ready')

        # Set up our menu
        exitAct = QAction(
            QIcon('content/images/Material/ic_exit_to_app_24px.svg'),
            '&' + exitName, self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip(exitTip)
        exitAct.triggered.connect(qApp.quit)

        newAct = QAction('&' + newName, self)
        newAct.setShortcut('Ctrl+N')
        newAct.setStatusTip(newTip)
        newAct.triggered.connect(self.showNewDialog)

        openAct = QAction('&' + openName, self)
        # openAct.setShortcut('Ctrl+Q')
        openAct.setStatusTip(openTip)
        openAct.triggered.connect(self.notImplemented)

        closeAct = QAction('&' + closeName, self)
        # closeAct.setShortcut('Ctrl+Q')
        closeAct.setStatusTip(closeTip)
        closeAct.triggered.connect(self.notImplemented)

        importAct = QAction('&' + impName, self)
        # importAct.setShortcut('Ctrl+Q')
        importAct.setStatusTip(impTip)
        importAct.triggered.connect(self.notImplemented)

        exportAct = QAction('&' + expName, self)
        # exportAct.setShortcut('Ctrl+Q')
        exportAct.setStatusTip(expTip)
        exportAct.triggered.connect(self.notImplemented)

        self.mouse1stAct = QAction('&' + m1stName, self, checkable=True)
        # self.mouse1stAct.setShortcut('F6')
        self.mouse1stAct.setStatusTip(m1stTip)
        self.mouse1stAct.setChecked(
            self.guiState.value('mouse_first_enabled', type=bool))
        self.mouse1stAct.setObjectName('mouse_first')
        self.mouse1stAct.triggered.connect(self.switchModes)

        self.script1stAct = QAction('&' + s1stName, self, checkable=True)
        # self.script1stAct.setShortcut('F6')
        self.script1stAct.setStatusTip(s1stTip)
        self.script1stAct.setChecked(
            self.guiState.value('script_first_enabled', type=bool))
        self.script1stAct.setObjectName('script_first')
        self.script1stAct.triggered.connect(self.switchModes)

        paramsAct = QAction('&' + pEdName, self, checkable=True)
        # paramsAct.setShortcut('F6')
        paramsAct.setStatusTip(pEdTip)
        paramsAct.setChecked(False)
        paramsAct.setObjectName('parameters_editor')
        paramsAct.triggered.connect(self.notImplemented)

        objectAct = QAction('&' + viewerName, self, checkable=True)
        # objectAct.setShortcut('F6')
        objectAct.setStatusTip(viewerTip)
        objectAct.setChecked(False)
        objectAct.setObjectName('object_viewer')
        objectAct.triggered.connect(self.notImplemented)

        pythonAct = QAction('&' + conName, self, checkable=True)
        # pythonAct.setShortcut('F6')
        pythonAct.setStatusTip(conTip)
        pythonAct.setChecked(False)
        pythonAct.setObjectName('python_console')
        pythonAct.triggered.connect(self.notImplemented)

        self.dockAct = QAction('&' + dockName, self, checkable=True)
        self.dockAct.setStatusTip(dockName)
        self.dockAct.setChecked(True)
        self.dockAct.setObjectName('dock_panel')
        self.dockAct.triggered.connect(self.toggleDock)

        libsAct = QAction('&' + libsName, self)
        # libsAct.setShortcut('F6')
        libsAct.setStatusTip(libsTip)
        libsAct.triggered.connect(self.notImplemented)

        extsAct = QAction('&' + extsName, self)
        # extsAct.setShortcut('F6')
        extsAct.setStatusTip(extsTip)
        extsAct.triggered.connect(self.notImplemented)

        layoutsAct = QAction('&' + layoutsName, self)
        # layoutsAct.setShortcut('F6')
        layoutsAct.setStatusTip(layoutsTip)
        layoutsAct.triggered.connect(self.notImplemented)

        frontViewAct = QAction(QIcon('content/images/front_view.svg'),
                               '&' + frontViewName, self)
        frontViewAct.setShortcut('1')
        frontViewAct.setStatusTip(frontViewTip)
        frontViewAct.triggered.connect(self.notImplemented)

        backViewAct = QAction(QIcon('content/images/back_view.svg'),
                              '&' + backViewName, self)
        backViewAct.setShortcut('2')
        backViewAct.setStatusTip(backViewTip)
        backViewAct.triggered.connect(self.notImplemented)

        topViewAct = QAction(QIcon('content/images/top_view.svg'),
                             '&' + topViewName, self)
        topViewAct.setShortcut('3')
        topViewAct.setStatusTip(topViewTip)
        topViewAct.triggered.connect(self.notImplemented)

        bottomViewAct = QAction(QIcon('content/images/bottom_view.svg'),
                                '&' + bottomViewName, self)
        bottomViewAct.setShortcut('4')
        bottomViewAct.setStatusTip(bottomViewTip)
        bottomViewAct.triggered.connect(self.notImplemented)

        leftViewAct = QAction(QIcon('content/images/left_side_view.svg'),
                              '&' + leftViewName, self)
        leftViewAct.setShortcut('5')
        leftViewAct.setStatusTip(leftViewTip)
        leftViewAct.triggered.connect(self.notImplemented)

        rightViewAct = QAction(QIcon('content/images/right_side_view.svg'),
                               '&' + rightViewName, self)
        rightViewAct.setShortcut('6')
        rightViewAct.setStatusTip(rightViewTip)
        rightViewAct.triggered.connect(self.notImplemented)

        axioViewAct = QAction(QIcon('content/images/axiometric_view.svg'),
                              '&' + axioViewName, self)
        axioViewAct.setShortcut('0')
        axioViewAct.setStatusTip(axioViewTip)
        axioViewAct.triggered.connect(self.notImplemented)

        fitAllAct = QAction(QIcon('content/images/fit_all.svg'),
                            '&' + fitAllName, self)
        # fitAllAct.setShortcut('6')
        fitAllAct.setStatusTip(fitAllTip)
        fitAllAct.triggered.connect(self.notImplemented)

        settingsAct = QAction('&' + setsName, self)
        # settingsAct.setShortcut('F6')
        settingsAct.setStatusTip(setsTip)
        settingsAct.triggered.connect(self.showSettingsDialog)

        docsAct = QAction('&' + docsName, self)
        # docsAct.setShortcut('F1')
        docsAct.setStatusTip(docsTip)
        docsAct.triggered.connect(self.notImplemented)

        vidsAct = QAction('&' + vidsName, self)
        # vidsAct.setShortcut('F1')
        vidsAct.setStatusTip(vidsTip)
        vidsAct.triggered.connect(self.notImplemented)

        uGroupAct = QAction('&' + uGroupName, self)
        # uGroupAct.setShortcut('F1')
        uGroupAct.setStatusTip(uGroupTip)
        uGroupAct.triggered.connect(self.notImplemented)

        aboutAct = QAction(QIcon('content/images/Material/ic_help_24px.svg'),
                           '&' + abtName, self)
        aboutAct.setShortcut('F1')
        aboutAct.setStatusTip(abtTip)
        aboutAct.triggered.connect(self.clickAbout)

        self.helpAct = QAction(
            QIcon('content/images/Material/ic_help_24px.svg'), '&' + abtName,
            self)
        # self.helpAct.setShortcut('F1')
        self.helpAct.setStatusTip(abtTip)
        self.helpAct.triggered.connect(self.clickHelp)

        self.menubar = self.menuBar()
        self.fileMenu = self.menubar.addMenu('&' + fileName)
        self.fileMenu.addAction(newAct)
        self.fileMenu.addAction(openAct)
        self.fileMenu.addAction(closeAct)
        self.recentMenu = QMenu(rcntName, self)
        self.fileMenu.addMenu(self.recentMenu)
        self.examplesMenu = QMenu(exName, self)
        self.fileMenu.addMenu(self.examplesMenu)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(importAct)
        self.fileMenu.addAction(exportAct)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(exitAct)
        editMenu = self.menubar.addMenu('&' + editName)
        editMenu.addAction(libsAct)
        editMenu.addAction(extsAct)
        editMenu.addAction(layoutsAct)
        editMenu.addAction(settingsAct)
        viewMenu = self.menubar.addMenu('&' + viewName)
        modesMenu = QMenu(modesName, self)
        viewMenu.addMenu(modesMenu)
        modesMenu.addAction(self.mouse1stAct)
        modesMenu.addAction(self.script1stAct)
        panelsMenu = QMenu(panelsName, self)
        panelsMenu.addAction(paramsAct)
        panelsMenu.addAction(objectAct)
        panelsMenu.addAction(pythonAct)
        panelsMenu.addAction(self.dockAct)
        viewMenu.addMenu(panelsMenu)
        self.layoutMenu = QMenu(layoutMenuName)
        viewMenu.addMenu(self.layoutMenu)
        # projMenu = menubar.addMenu('&Project')
        self.helpMenu = self.menubar.addMenu('&' + helpName)
        self.helpMenu.addAction(docsAct)
        self.helpMenu.addAction(vidsAct)
        self.helpMenu.addAction(uGroupAct)
        self.helpMenu.addAction(aboutAct)

        # Load layouts dynamically
        (layouts, self.funcs) = self.getLayouts()
        for layout in layouts:
            act = QAction('&' + layout, self)
            act.setStatusTip(layout)
            act.setObjectName(layout.replace(' ', '_').lower())
            act.triggered.connect(self.fireFunction)

            self.layoutMenu.addAction(act)

        # The CadQuery logo
        # logoLabel = QLabel()
        # logoLabel.setPixmap(QPixmap('content/images/cadquery_logo_dark.svg'))

        # Toolbar for CAD controls and extension controls
        self.toolbar = self.addToolBar('Main Tools')
        # self.toolbar.addWidget(logoLabel)
        self.toolbar.addAction(frontViewAct)
        self.toolbar.addAction(backViewAct)
        self.toolbar.addAction(topViewAct)
        self.toolbar.addAction(bottomViewAct)
        self.toolbar.addAction(leftViewAct)
        self.toolbar.addAction(rightViewAct)
        self.toolbar.addAction(axioViewAct)
        self.toolbar.addAction(fitAllAct)
        self.toolbar.addSeparator()

        self.toolbar.addAction(self.helpAct)

        # Drop-dowm menu that lets users select which extensions they want active
        self.extsButton = QToolButton(self.toolbar)
        self.extsButton.setIcon(
            QIcon('content/images/Material/ic_extension_black_24px.svg'))
        self.extsMenu = QMenu(self.extsButton)
        self.extsButton.clicked.connect(self.toggleExtsMenuVisibility)
        self.extsButton.setMenu(self.extsMenu)
        self.extsButton.setPopupMode(QToolButton.MenuButtonPopup)

        # Start up all extensions
        self.loadExtensions()

        # Add the extensions dropdown at the right side of the toolbar
        spacer = QWidget()
        spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.toolbar.addWidget(spacer)
        self.toolbar.addWidget(self.extsButton)

        # Side dock for things like the object viewer
        self.dock = DockWidget(self)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dock)
        self.dock.setMinimumSize(200, 100)
        self.setInitialDockState()

        self.showMaximized()
Пример #11
0
class EditorMainWindow(object):
    def __init__(self):
        self.seq = 0
        self.widget = loadUi(MAIN_UI_PATH)
        self.init_mdi()
        self.init_actions()
        self.init_instance()
        self.widget.closeEvent = self.close_handler

        self.widget.showMaximized()

    def get_seq(self):
        self.seq += 1
        return self.seq

    def init_mdi(self):
        self.mdi = QMdiArea(self.widget)
        self.mdi.setViewMode(QMdiArea.TabbedView)
        self.mdi.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdi.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdi.setTabsMovable(True)
        self.mdi.setTabsClosable(True)
        self.mdi.setTabShape(QTabWidget.Rounded)
        self.widget.setCentralWidget(self.mdi)

    def init_actions(self):
        self.widget.actionNew.triggered.connect(self.action_new_handler)
        self.widget.actionOpen.triggered.connect(self.action_open_handler)
        self.widget.actionSave.triggered.connect(self.action_save_handler)
        self.widget.actionSave_As.triggered.connect(self.action_save_as_handler)
        self.widget.actionClose.triggered.connect(self.action_close_handler)
        self.widget.actionClose_All.triggered.connect(self.action_close_all_handler)
        self.widget.actionExport.triggered.connect(self.action_export_handler)

        self.widget.actionStates.triggered.connect(self.action_states_handler)
        self.widget.actionEvents.triggered.connect(self.action_events_handler)

    def close_handler(self, ev):
        l = self.mdi.subWindowList()
        if len(l) != 0:
            self.mdi.closeAllSubWindows()
            ev.ignore()

    def init_instance(self):
        self.instances = []

    def remove_instance(self, ins):
        self.instances.remove(ins)

    def find_non_existing_name(self):
        while True:
            tmp_path = os.path.join(
                config.src_path,
                "NewFsm" + str(self.get_seq()) + FSM_FILE_EXT)
            if not os.path.exists(tmp_path):
                return tmp_path

    def action_new_handler(self):
        tmp_path = self.find_non_existing_name()
        m = FsmModel()
        m.default_init()
        vm = InstanceVM(m, self, tmp_path)
        vm.set_modified(True)

    def file_already_open(self, pth):
        for i in self.instances:
            pth = os.path.abspath(pth)
            if pth == i.file_path:
                return i
        return None

    def action_open_handler(self):
        p = QFileDialog()
        p.setViewMode(QFileDialog.List)
        p.setFileMode(QFileDialog.ExistingFiles)
        p.setDirectory(config.src_path)
        p.exec()
        paths = p.selectedFiles()
        for pth in paths:
            i = self.file_already_open(pth)
            if i:
                self.mdi.setActiveSubWindow(i.sub_window)
            else:
                m = FsmModel.load_file(pth)
                vm = InstanceVM(m, self, pth)

    def action_save_handler(self):
        w = self.mdi.activeSubWindow()
        if w is None:
            return
        model = w.instance.model
        model.dump_file(w.instance.file_path)
        w.instance.set_modified(False)

    def action_save_as_handler(self):
        w = self.mdi.activeSubWindow()
        if w is None:
            return

        p = QFileDialog()
        p.setViewMode(QFileDialog.List)
        p.setDirectory(config.src_path)
        p.exec()
        paths = p.selectedFiles()
        if len(paths) == 0:
            return
        w.instance.file_path = os.path.abspath(paths[0])
        w.instance.update_title()
        model = w.instance.model
        model.dump_file(w.instance.file_path)
        w.instance.set_modified(False)


    def action_close_handler(self):
        w = self.mdi.activeSubWindow()
        if w is None:
            return
        w.close()

    def action_close_all_handler(self):
        self.mdi.closeAllSubWindows()

    def action_export_handler(self):
        fsm_files = os.listdir(config.src_path)
        for fn in fsm_files:
            full_name = os.path.join(config.src_path, fn)
            b, e = os.path.splitext(full_name)
            if e == FSM_FILE_EXT:
                f = open(full_name, "rb")
                basename, e = os.path.splitext(fn)
                model_object = pickle.load(f)
                f.close()
                exporter = FsmModelPythonExporter(model_object)
                exporter.export(os.path.join(config.export_path, basename + "_fsm.py"))

    def action_states_handler(self):
        cur = self.get_current_instance()
        if cur is None:
            return
        model = cur.model
        w = loadUi(STATE_LIST_DIALOG_PATH)
        list_vm = MultiColumnListModel(
            model.state,
            LIST_DIALOG_COLUMNS,
            STATE_DIALOG_HEADERS)
        add_item = functools.partial(model.add_item, StateItem, "state")
        remove_item = functools.partial(model.remove_item, "state")
        dialog = StateListPanelVM(
            list_vm,
            model.state,
            add_item,
            remove_item,
            w)

        dialog.run()
        cur.table_vm.refresh()

    def action_events_handler(self):
        cur = self.get_current_instance()
        if cur is None:
            return
        model = cur.model
        w = loadUi(EVENT_DIALOG_PATH)
        list_vm = MultiColumnListModel(
            model.event,
            LIST_DIALOG_COLUMNS,
            EVENT_DIALOG_HEADERS)
        add_item = functools.partial(model.add_item, EventItem, "event")
        remove_item = functools.partial(model.remove_item, "event")
        dialog = ListEditPanelVM(
            list_vm,
            model.event,
            add_item,
            remove_item,
            w)
        dialog.run()
        cur.table_vm.refresh()

    def get_current_instance(self):
        current = self.mdi.activeSubWindow()
        if not current:
            return None
        for i in self.instances:
            if i.sub_window == current:
                return i
        assert(False)  # there is an active sub window but there's no matching instance
Пример #12
0
class EditorMainWindow(object):
    def __init__(self):
        self.seq = 0
        self.widget = loadUi(MAIN_UI_PATH)
        self.init_mdi()
        self.init_actions()
        self.init_instance()
        self.widget.closeEvent = self.close_handler

        self.widget.showMaximized()

    def get_seq(self):
        self.seq += 1
        return self.seq

    def init_mdi(self):
        self.mdi = QMdiArea(self.widget)
        self.mdi.setViewMode(QMdiArea.TabbedView)
        self.mdi.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdi.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdi.setTabsMovable(True)
        self.mdi.setTabsClosable(True)
        self.mdi.setTabShape(QTabWidget.Rounded)
        self.widget.setCentralWidget(self.mdi)

    def init_actions(self):
        self.widget.actionNew.triggered.connect(self.action_new_handler)
        self.widget.actionOpen.triggered.connect(self.action_open_handler)
        self.widget.actionSave.triggered.connect(self.action_save_handler)
        self.widget.actionSave_As.triggered.connect(
            self.action_save_as_handler)
        self.widget.actionClose.triggered.connect(self.action_close_handler)
        self.widget.actionClose_All.triggered.connect(
            self.action_close_all_handler)
        self.widget.actionExport.triggered.connect(self.action_export_handler)

        self.widget.actionStates.triggered.connect(self.action_states_handler)
        self.widget.actionEvents.triggered.connect(self.action_events_handler)

    def close_handler(self, ev):
        l = self.mdi.subWindowList()
        if len(l) != 0:
            self.mdi.closeAllSubWindows()
            ev.ignore()

    def init_instance(self):
        self.instances = []

    def remove_instance(self, ins):
        self.instances.remove(ins)

    def find_non_existing_name(self):
        while True:
            tmp_path = os.path.join(
                config.src_path, "NewFsm" + str(self.get_seq()) + FSM_FILE_EXT)
            if not os.path.exists(tmp_path):
                return tmp_path

    def action_new_handler(self):
        tmp_path = self.find_non_existing_name()
        m = FsmModel()
        m.default_init()
        vm = InstanceVM(m, self, tmp_path)
        vm.set_modified(True)

    def file_already_open(self, pth):
        for i in self.instances:
            pth = os.path.abspath(pth)
            if pth == i.file_path:
                return i
        return None

    def action_open_handler(self):
        p = QFileDialog()
        p.setViewMode(QFileDialog.List)
        p.setFileMode(QFileDialog.ExistingFiles)
        p.setDirectory(config.src_path)
        p.exec()
        paths = p.selectedFiles()
        for pth in paths:
            i = self.file_already_open(pth)
            if i:
                self.mdi.setActiveSubWindow(i.sub_window)
            else:
                m = FsmModel.load_file(pth)
                vm = InstanceVM(m, self, pth)

    def action_save_handler(self):
        w = self.mdi.activeSubWindow()
        if w is None:
            return
        model = w.instance.model
        model.dump_file(w.instance.file_path)
        w.instance.set_modified(False)

    def action_save_as_handler(self):
        w = self.mdi.activeSubWindow()
        if w is None:
            return

        p = QFileDialog()
        p.setViewMode(QFileDialog.List)
        p.setDirectory(config.src_path)
        p.exec()
        paths = p.selectedFiles()
        if len(paths) == 0:
            return
        w.instance.file_path = os.path.abspath(paths[0])
        w.instance.update_title()
        model = w.instance.model
        model.dump_file(w.instance.file_path)
        w.instance.set_modified(False)

    def action_close_handler(self):
        w = self.mdi.activeSubWindow()
        if w is None:
            return
        w.close()

    def action_close_all_handler(self):
        self.mdi.closeAllSubWindows()

    def action_export_handler(self):
        fsm_files = os.listdir(config.src_path)
        for fn in fsm_files:
            full_name = os.path.join(config.src_path, fn)
            b, e = os.path.splitext(full_name)
            if e == FSM_FILE_EXT:
                f = open(full_name, "rb")
                basename, e = os.path.splitext(fn)
                model_object = pickle.load(f)
                f.close()
                exporter = FsmModelPythonExporter(model_object)
                exporter.export(
                    os.path.join(config.export_path, basename + "_fsm.py"))

    def action_states_handler(self):
        cur = self.get_current_instance()
        if cur is None:
            return
        model = cur.model
        w = loadUi(STATE_LIST_DIALOG_PATH)
        list_vm = MultiColumnListModel(model.state, LIST_DIALOG_COLUMNS,
                                       STATE_DIALOG_HEADERS)
        add_item = functools.partial(model.add_item, StateItem, "state")
        remove_item = functools.partial(model.remove_item, "state")
        dialog = StateListPanelVM(list_vm, model.state, add_item, remove_item,
                                  w)

        dialog.run()
        cur.table_vm.refresh()

    def action_events_handler(self):
        cur = self.get_current_instance()
        if cur is None:
            return
        model = cur.model
        w = loadUi(EVENT_DIALOG_PATH)
        list_vm = MultiColumnListModel(model.event, LIST_DIALOG_COLUMNS,
                                       EVENT_DIALOG_HEADERS)
        add_item = functools.partial(model.add_item, EventItem, "event")
        remove_item = functools.partial(model.remove_item, "event")
        dialog = ListEditPanelVM(list_vm, model.event, add_item, remove_item,
                                 w)
        dialog.run()
        cur.table_vm.refresh()

    def get_current_instance(self):
        current = self.mdi.activeSubWindow()
        if not current:
            return None
        for i in self.instances:
            if i.sub_window == current:
                return i
        assert (
            False
        )  # there is an active sub window but there's no matching instance
Пример #13
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.createActions()
        self.createMenus()

        self.createStatusBar()
        self.updateMenus()

        self.clipboard = QApplication.clipboard()

        self.setWindowTitle("Qt5 Multi Video Player v0.02 - by Luis Santos AKA DJOKER")



    def closeEvent(self, event):
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            event.ignore()
        else:
            event.accept()

    def newFile(self):
        child = VideoPlayer(True)
        self.mdiArea.addSubWindow(child)
        url = self.clipboard.text()
        child.Player(url)
        child.show()

    def newMute(self):
        child = VideoPlayer(False)
        self.mdiArea.addSubWindow(child)
        url = self.clipboard.text()
        child.Player(url)
        child.show()

        return


    def updateMenus(self):
        hasMdiChild = (self.activeMdiChild() is not None)

        self.closeAct.setEnabled(hasMdiChild)
        self.closeAllAct.setEnabled(hasMdiChild)
        self.tileAct.setEnabled(hasMdiChild)
        self.cascadeAct.setEnabled(hasMdiChild)
        self.nextAct.setEnabled(hasMdiChild)
        self.previousAct.setEnabled(hasMdiChild)
        self.separatorAct.setVisible(hasMdiChild)



    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tileAct)
        self.windowMenu.addAction(self.cascadeAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)



    def createMdiChild(self):
        child = MdiChild()
        self.mdiArea.addSubWindow(child)



        return child

    def createActions(self):
        self.newAct = QAction( "&New", self,
                shortcut=QKeySequence.New, statusTip="Create a new Video Player",
                triggered=self.newFile)

        self.newActCam4 = QAction("&VideoMute", self,
                              shortcut=QKeySequence.New, statusTip="Create a new Video Player Mute",
                              triggered=self.newMute)

        self.closeAct = QAction("Cl&ose", self,
                statusTip="Close the active window",
                triggered=self.mdiArea.closeActiveSubWindow)

        self.closeAllAct = QAction("Close &All", self,
                statusTip="Close all the windows",
                triggered=self.mdiArea.closeAllSubWindows)

        self.tileAct = QAction("&Tile", self, statusTip="Tile the windows",
                triggered=self.mdiArea.tileSubWindows)

        self.cascadeAct = QAction("&Cascade", self,
                statusTip="Cascade the windows",
                triggered=self.mdiArea.cascadeSubWindows)

        self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild,
                statusTip="Move the focus to the next window",
                triggered=self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction("Pre&vious", self,
                shortcut=QKeySequence.PreviousChild,
                statusTip="Move the focus to the previous window",
                triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)



    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.newActCam4)

        self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit,
                               statusTip="Exit the application",
                               triggered=QApplication.instance().closeAllWindows)

        self.fileMenu.addSeparator()
        action = self.fileMenu.addAction("Switch layout direction")
        action.triggered.connect(self.switchLayoutDirection)
        self.fileMenu.addAction(self.exitAct)



        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()






    def createStatusBar(self):
        self.statusBar().showMessage("Ready")



    def activeMdiChild(self):
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        return None

    def findMdiChild(self, fileName):
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def switchLayoutDirection(self):
        if self.layoutDirection() == Qt.LeftToRight:
            QApplication.setLayoutDirection(Qt.RightToLeft)
        else:
            QApplication.setLayoutDirection(Qt.LeftToRight)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)
Пример #14
0
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("De$compliconta$")
        self.setWindowIcon(Icon("main-icon.png"))

        self.area = QMdiArea()
        self.area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.area)

        DATABASE.showInfo()

        self.createMenus()
        self.createWindows()

        self.loadInfo()
        self.showMaximized()
        self.showMessage("Iniciado")

    def closeEvent(self, event):
        DATABASE.close()

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("Arquivo")
        import_ = self.fileMenu.addAction("Importar Transações")
        import_.triggered.connect(self.importWindow)
        export_ = self.fileMenu.addAction("Exportar Transações")
        export_.triggered.connect(self.exportWindow)
        self.fileMenu.addSeparator()
        close_ = self.fileMenu.addAction("Fechar")
        close_.triggered.connect(self.close)

        self.operationsMenu = self.menuBar().addMenu("Operações")
        self.windowsMenu = self.menuBar().addMenu("Janelas")

    def createWindows(self):
        self.accWindow = AccountsWindow(self)
        self.area.addSubWindow(self.accWindow)
        self.accWindow.show()

        self.catWindow = CategoriesWindow(self)
        self.area.addSubWindow(self.catWindow)
        self.catWindow.show()

        self.transWindow = TransactionWindow(self)
        self.area.addSubWindow(self.transWindow)
        self.transWindow.show()

        self.investWindow = InvestimentsWindow(self)
        self.area.addSubWindow(self.investWindow)
        self.investWindow.show()

        self.graphsWindow = GraphWindow(self)
        self.area.addSubWindow(self.graphsWindow)
        self.graphsWindow.show()

        self.accWindow.createMenusAndToolbar()
        self.operationsMenu.addSeparator()
        self.catWindow.createMenusAndToolbar()
        self.operationsMenu.addSeparator()
        self.transWindow.createMenusAndToolbar()
        self.operationsMenu.addSeparator()
        self.investWindow.createMenusAndToolbar()

    def exportWindow(self):
        self.db.cursor.execute("""SELECT * FROM transactions""")
        result = self.db.cursor.fetchall()
        fileDir = QFileDialog.getSaveFileName(self, "Exportar para: ",
                                              os.environ["HOMEPATH"],
                                              "Transações (*.trans)")
        file = open(os.path.join(os.getcwd(), fileDir[0]), 'wb')
        pickle.dump(result, file)
        self.showMessage("%d transações exportadas." % len(result))

    def importWindow(self):
        bar = QProgressBar()
        bar.setTextVisible(True)
        bar.setValue(0)

        fileDir = QLineEdit()
        fileDir.setReadOnly(True)

        start = QPushButton("Importar")

        def importItems():
            try:
                transactions = pickle.load(open(fileDir.text(), "rb"))
                bar.setRange(0, len(transactions))
                count = 0
                for transaction in transactions:
                    self.db.addTransaction(transaction[1:])
                    count += 1
                    bar.setValue(count)
                self.showMessage("%d transações importadas." %
                                 len(transactions))
                start.setEnabled(False)
            except:
                self.showMessage("OPS! Algo deu errado.")

        dialog = QDialog(self)
        dialog.setWindowTitle("Importar Transações")
        layout = QGridLayout()
        layout.addWidget(QLabel("Arquivo: "), 0, 0)
        layout.addWidget(fileDir, 0, 1)
        search = QPushButton("...")
        search.clicked.connect(lambda: fileDir.setText(
            QFileDialog.getOpenFileName(dialog, "Importar de: ", os.environ[
                'HOMEPATH'], "Transações (*.trans)")[0]))
        layout.addWidget(search, 0, 2)
        layout.addWidget(QLabel("Progresso: "), 1, 0)
        layout.addWidget(bar, 1, 1, 1, 3)
        start.clicked.connect(importItems)
        layout.addWidget(start, 2, 1)
        dialog.setLayout(layout)
        dialog.exec_()

    def loadInfo(self):
        self.accWindow.loadInfo()
        self.catWindow.loadInfo()
        self.transWindow.loadInfo()
        self.investWindow.loadInfo()
        self.graphsWindow.updatePlot()

    def showMessage(self, text):
        msg = QDateTime.currentDateTime().toString("dd/MM/yyyy hh:mm ")
        msg += text
        print(msg)
        self.statusBar().showMessage(msg)
Пример #15
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.updateMenus()

        self.readSettings()

        self.setWindowTitle("MDI Test")

    def closeEvent(self, event):
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            event.ignore()
        else:
            self.writeSettings()
            event.accept()

    def newFile(self):
        child = self.createMdiChild()
        child.newFile()
        child.show()

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self)
        if fileName:
            existing = self.findMdiChild(fileName)
            if existing:
                self.mdiArea.setActiveSubWindow(existing)
                return

            child = self.createMdiChild()
            if child.loadFile(fileName):
                self.statusBar().showMessage("File loaded", 2000)
                child.show()
            else:
                child.close()

    def save(self):
        if self.activeMdiChild() and self.activeMdiChild().save():
            self.statusBar().showMessage("File saved", 2000)

    def saveAs(self):
        if self.activeMdiChild() and self.activeMdiChild().saveAs():
            self.statusBar().showMessage("File saved", 2000)

    def cut(self):
        if self.activeMdiChild():
            self.activeMdiChild().cut()

    def copy(self):
        if self.activeMdiChild():
            self.activeMdiChild().copy()

    def paste(self):
        if self.activeMdiChild():
            self.activeMdiChild().paste()

    def about(self):
        QMessageBox.about(
            self, "About MDI",
            "The <b>MDI</b> example demonstrates how to write multiple "
            "document interface applications using Qt.")

    def updateMenus(self):
        hasMdiChild = (self.activeMdiChild() is not None)
        #self.saveAct.setEnabled(hasMdiChild)
        #self.saveAsAct.setEnabled(hasMdiChild)
        self.pasteAct.setEnabled(hasMdiChild)
        self.closeAct.setEnabled(hasMdiChild)
        self.closeAllAct.setEnabled(hasMdiChild)
        self.tileAct.setEnabled(hasMdiChild)
        self.cascadeAct.setEnabled(hasMdiChild)
        self.nextAct.setEnabled(hasMdiChild)
        self.previousAct.setEnabled(hasMdiChild)
        self.separatorAct.setVisible(hasMdiChild)

        hasSelection = (self.activeMdiChild() is not None
                        and self.activeMdiChild().textCursor().hasSelection())
        self.cutAct.setEnabled(hasSelection)
        self.copyAct.setEnabled(hasSelection)

    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tileAct)
        self.windowMenu.addAction(self.cascadeAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
            if i < 9:
                text = '&' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child is self.activeMdiChild())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def createMdiChild(self):
        child = MdiChild()
        self.mdiArea.addSubWindow(child)

        child.copyAvailable.connect(self.cutAct.setEnabled)
        child.copyAvailable.connect(self.copyAct.setEnabled)

        return child

    # showntell
    def createMdiChild15(self):
        child = MdiChild_ShowNTell()
        self.mdiArea.addSubWindow(child)
        return child

    #MNIST
    def show_n_tell(self):
        print('show_n_tell....')
        child = self.createMdiChild15()
        print('self.createMdiChild15')
        #child.resize(830,480)
        #print('self.createMdiChild15')
        child.show
        print('child.show()')

    def createActions(self):

        self.cutAct = QAction(
            QIcon(':/images/cut.png'),
            "Cu&t",
            self,
            shortcut=QKeySequence.Cut,
            statusTip="Cut the current selection's contents to the clipboard",
            triggered=self.cut)

        self.copyAct = QAction(
            QIcon(':/images/copy.png'),
            "&Copy",
            self,
            shortcut=QKeySequence.Copy,
            statusTip="Copy the current selection's contents to the clipboard",
            triggered=self.copy)

        self.pasteAct = QAction(
            QIcon(':/images/paste.png'),
            "&Paste",
            self,
            shortcut=QKeySequence.Paste,
            statusTip=
            "Paste the clipboard's contents into the current selection",
            triggered=self.paste)

        self.closeAct = QAction("Cl&ose",
                                self,
                                statusTip="Close the active window",
                                triggered=self.mdiArea.closeActiveSubWindow)

        self.closeAllAct = QAction("Close &All",
                                   self,
                                   statusTip="Close all the windows",
                                   triggered=self.mdiArea.closeAllSubWindows)

        self.tileAct = QAction("&Tile",
                               self,
                               statusTip="Tile the windows",
                               triggered=self.mdiArea.tileSubWindows)

        self.cascadeAct = QAction("&Cascade",
                                  self,
                                  statusTip="Cascade the windows",
                                  triggered=self.mdiArea.cascadeSubWindows)

        self.nextAct = QAction("Ne&xt",
                               self,
                               shortcut=QKeySequence.NextChild,
                               statusTip="Move the focus to the next window",
                               triggered=self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction(
            "Pre&vious",
            self,
            shortcut=QKeySequence.PreviousChild,
            statusTip="Move the focus to the previous window",
            triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

        # 메뉴 ACTION을 다이나믹하게 연결해준다
        self.MenuActRef = {
            'NewFileAct': 0,
            'OpnFileAct': 0,
            'SavFileAct': 0,
            'SavASFileAct': 0,
            'AboutAct': 0,
            'AboutQTAct': 0,
            'ExitAct': 0,
            'SwitchLayout': 0,
            'ShowNTell': 0
        }

        # ******* Create the File Menu *******
        self.NewFileAct = QAction(QIcon(':/images/new.png'), '&New File', self)
        self.NewFileAct.setShortcut("Ctrl+N")
        self.NewFileAct.setStatusTip('Create a New  File')
        self.NewFileAct.triggered.connect(self.newFile)
        self.MenuActRef['NewFileAct'] = self.NewFileAct

        #self.newAct = QAction(QIcon(':/images/new.png'), "&New", self,
        #        shortcut=QKeySequence.New, statusTip="Create a new file",
        #        triggered=self.newFile)

        # ******* Open File Menu Items *******
        self.OpnFileAct = QAction(QIcon(':/images/open.png'), '&Open File',
                                  self)
        self.OpnFileAct.setShortcut("Ctrl+O")
        self.OpnFileAct.setStatusTip('Open an Existing File')
        self.OpnFileAct.triggered.connect(self.open)
        self.MenuActRef['OpnFileAct'] = self.OpnFileAct

        #self.openAct = QAction(QIcon(':/images/open.png'), "&Open...", self,
        #        shortcut=QKeySequence.Open, statusTip="Open an existing file",
        #        triggered=self.open)

        # ******* Save File Menu Items *******
        self.SavFileAct = QAction(QIcon(':/images/save.png'), '&Save File',
                                  self)
        self.SavFileAct.setShortcut("Ctrl+S")
        self.SavFileAct.setStatusTip('Save Current  File')
        self.SavFileAct.triggered.connect(self.save)
        self.MenuActRef['SavFileAct'] = self.SavFileAct

        #self.saveAct = QAction(QIcon(':/images/save.png'), "&Save", self,
        #        shortcut=QKeySequence.Save,
        #        statusTip="Save the document to disk", triggered=self.save)

        # ******* SaveAS File Menu Items *******
        self.SavASFileAct = QAction('Save &As File', self)
        self.SavASFileAct.setShortcut("Ctrl+A")
        self.SavASFileAct.setStatusTip('Save Current  File  under a new name ')
        self.SavASFileAct.triggered.connect(self.saveAs)
        self.MenuActRef['SavASFileAct'] = self.SavASFileAct

        #self.saveAsAct = QAction("Save &As...", self,
        #        shortcut=QKeySequence.SaveAs,
        #        statusTip="Save the document under a new name",
        #        triggered=self.saveAs)

        # ******* About Menu Items *******
        self.aboutAct = QAction("&About", self)
        self.aboutAct.setStatusTip("Show the application's About box")
        self.aboutAct.triggered.connect(self.about)
        self.MenuActRef['AboutAct'] = self.aboutAct

        # ******* About QT Menu Items *******
        self.aboutAct = QAction("About &Qt", self)
        self.aboutAct.setStatusTip("Show the Qt library's About box")
        self.aboutAct.triggered.connect(QApplication.instance().aboutQt)
        self.MenuActRef['AboutQTAct'] = self.aboutAct

        # ******* Exit Menu Items *******
        self.exitAct = QAction("E&xit", self)
        self.exitAct.setStatusTip("Exit the application")
        self.exitAct.triggered.connect(QApplication.instance().closeAllWindows)
        self.MenuActRef['ExitAct'] = self.exitAct

        #self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit,
        #        statusTip="Exit the application",
        #        triggered=QApplication.instance().closeAllWindows)

        # ******* Switch layout Items *******
        self.SwitchLayout = QAction("&Switch layout direction", self)
        self.SwitchLayout.setStatusTip("Switch layout direction")
        self.SwitchLayout.triggered.connect(self.switchLayoutDirection)
        self.MenuActRef['SwitchLayout'] = self.SwitchLayout

        #self.SwitchLayout = QAction("&Switch layout direction", self,
        #        statusTip="Switch layout direction",
        #        triggered=self.switchLayoutDirection)

        # ******* Switch layout Items *******
        self.ShowNTell = QAction("&ShowNTell", self)
        self.ShowNTell.setStatusTip("&ShowNTell")
        self.ShowNTell.triggered.connect(self.show_n_tell)
        self.MenuActRef['ShowNTell'] = self.ShowNTell

    #self.ShowNTell = QAction("&show_n_tell", self,
    #        statusTip="show_n_tell",
    #         triggered=self.show_n_tell)

    def createMenus(self):

        # 메뉴를 다이나믹하게 생성하고 연결함
        self.MenuLayout = {
            0: {
                'addMenu': '&File',
                'addToolMenu': 'File'
            },
            1: {
                'addDynamic': 'NewFileAct',
                'addToolbar': 'NewFileAct'
            },
            2: {
                'addDynamic': 'OpnFileAct',
                'addToolbar': 'OpnFileAct'
            },
            3: {
                'addDynamic': 'SavFileAct',
                'addToolbar': 'SavFileAct'
            },
            4: {
                'addDynamic': 'SavASFileAct'
            },
            5: {
                'addSeparator': ''
            },
            6: {
                'addDynamic': 'SwitchLayout'
            },
            7: {
                'addDynamic': 'ExitAct'
            },
            8: {
                'addMenu': '&Edit'
            },
            9: {
                'addAction': self.cutAct
            },
            10: {
                'addAction': self.copyAct
            },
            11: {
                'addAction': self.pasteAct
            },
            12: {
                'addMenu': '&Window'
            },
            13: {
                'updateMenu': ''
            },
            14: {
                'addSeparator': ''
            },
            15: {
                'addMenu': '&Help'
            },
            16: {
                'addDynamic': 'AboutAct'
            },
            17: {
                'addDynamic': 'AboutQTAct'
            },
            18: {
                'addMenu': '&MNIST'
            },
            19: {
                'addDynamic': 'ShowNTell'
            }
        }

        for idx in self.MenuLayout:
            item = self.MenuLayout[idx]

            if 'addMenu' in item.keys():
                self.windowMenu = self.menuBar().addMenu(item['addMenu'])

            elif 'addAction' in item.keys():
                self.windowMenu.addAction(item['addAction'])

            elif 'addSeparator' in item.keys():
                self.windowMenu.addSeparator()

            elif 'updateMenu' in item.keys():
                self.updateWindowMenu()
                self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

            # 메뉴 ACTION을 다이나믹하게
            elif 'addDynamic' in item.keys():
                self.windowMenu.addAction(self.MenuActRef[item['addDynamic']])

    def createToolBars(self):

        for idx in self.MenuLayout:
            item = self.MenuLayout[idx]

            if 'addToolMenu' in item.keys():
                self.fileToolBar = self.addToolBar(item['addToolMenu'])

            elif 'addToolbar' in item.keys():
                self.fileToolBar.addAction(self.MenuActRef[item['addDynamic']])

        #self.fileToolBar = self.addToolBar("File")
        #self.fileToolBar.addAction(self.MenuActRef['NewFileAct'])
        #self.fileToolBar.addAction(self.MenuActRef['OpnFileAct'])
        #self.fileToolBar.addAction(self.MenuActRef['SavFileAct'])
        #self.fileToolBar.addAction(self.newAct)
        #self.fileToolBar.addAction(self.openAct)
        #self.fileToolBar.addAction(self.saveAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings('NH-Soft', 'MDI Example')
        pos = settings.value('pos', QPoint(200, 200))
        size = settings.value('size', QSize(400, 400))
        self.move(pos)
        self.resize(size)

    def writeSettings(self):
        settings = QSettings('NH-Soft', 'MDI Example')
        settings.setValue('pos', self.pos())
        settings.setValue('size', self.size())

    def activeMdiChild(self):
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        return None

    def findMdiChild(self, fileName):
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def switchLayoutDirection(self):
        if self.layoutDirection() == Qt.LeftToRight:
            QApplication.setLayoutDirection(Qt.RightToLeft)
        else:
            QApplication.setLayoutDirection(Qt.LeftToRight)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)
Пример #16
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.update_menus)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped.connect(self.set_active_sub_window)

        self.newAct = QAction(self)
        self.newAct.setIcon(self.style().standardIcon(QStyle.SP_FileIcon))
        # self.newAct.setIcon(QIcon(':/images/new.png'))
        self.newAct.setIconText('New')
        self.newAct.setShortcut(QKeySequence.New)
        self.newAct.setStatusTip('Create a new file')
        self.newAct.triggered.connect(self.new_file)

        self.openAct = QAction(self)
        self.openAct.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
        self.openAct.setIconText('Open...')
        self.openAct.setShortcut(QKeySequence.Open)
        self.openAct.setStatusTip('Open an existing file')
        self.openAct.triggered.connect(self.open)

        self.saveAct = QAction(self)
        self.saveAct.setIcon(self.style().standardIcon(QStyle.SP_DialogSaveButton))
        self.saveAct.setIconText('Save')
        self.saveAct.setShortcut(QKeySequence.Save)
        self.saveAct.setStatusTip('Save the document to disk')
        self.saveAct.triggered.connect(self.save)

        self.saveAsAct = QAction(self)
        self.saveAsAct.setIconText('Save As...')
        self.saveAsAct.setShortcut(QKeySequence.SaveAs)
        self.saveAsAct.setStatusTip('Save the document under a new name')
        self.saveAsAct.triggered.connect(self.save_as)

        self.exitAct = QAction(self)
        self.exitAct.setIconText('Exit')
        self.exitAct.setShortcut(QKeySequence.Quit)
        self.exitAct.setStatusTip('Exit the application')
        self.exitAct.triggered.connect(qApp.closeAllWindows)

        self.cutAct = QAction(self)
        # self.cutAct.setIcon(QIcon(':/images/cut.png'))
        self.cutAct.setIconText('Cut')
        self.cutAct.setShortcut(QKeySequence.Cut)
        self.cutAct.setStatusTip("Cut the current selection's contents to the clipboard")
        self.cutAct.triggered.connect(self.cut)

        self.copyAct = QAction(self)
        # self.copyAct.setIcon(QIcon(':/images/copy.png'))
        self.copyAct.setIconText('Copy')
        self.copyAct.setShortcut(QKeySequence.Copy)
        self.copyAct.setStatusTip("Copy the current selection's contents to the clipboard")
        self.copyAct.triggered.connect(self.copy)

        self.pasteAct = QAction(self)
        # self.pasteAct.setIcon(QIcon(':/images/paste.png'))
        self.pasteAct.setIconText('Paste')
        self.pasteAct.setShortcut(QKeySequence.Paste)
        self.pasteAct.setStatusTip("Paste the clipboard's contents into the current selection")
        self.pasteAct.triggered.connect(self.paste)

        self.closeAct = QAction(self)
        self.closeAct.setIconText('Close')
        self.closeAct.setShortcut('Ctrl+W')
        self.closeAct.setStatusTip("Close the active window")
        self.closeAct.triggered.connect(self.mdiArea.closeActiveSubWindow)

        self.closeAllAct = QAction(self)
        self.closeAllAct.setIconText('Close All')
        self.closeAllAct.setStatusTip('Close all the windows')
        self.closeAllAct.triggered.connect(self.mdiArea.closeAllSubWindows)

        self.tileAct = QAction(self)
        self.tileAct.setIconText('Tile')
        self.tileAct.setStatusTip('Tile the windows')
        self.tileAct.triggered.connect(self.mdiArea.tileSubWindows)

        self.cascadeAct = QAction(self)
        self.cascadeAct.setIconText('Cascade')
        self.cascadeAct.setStatusTip('Cascade the windows')
        self.cascadeAct.triggered.connect(self.mdiArea.cascadeSubWindows)

        self.nextAct = QAction(self)
        self.nextAct.setIconText('Next')
        self.nextAct.setShortcut(QKeySequence.NextChild)
        self.nextAct.setStatusTip('Move the focus to the next window')
        self.nextAct.triggered.connect(self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction(self)
        self.previousAct.setIconText('Previous')
        self.previousAct.setShortcut(QKeySequence.PreviousChild)
        self.previousAct.setStatusTip('Move the focus to the previous window')
        self.previousAct.triggered.connect(self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

        self.aboutAct = QAction(self)
        self.aboutAct.setIconText('About')
        self.aboutAct.setStatusTip("Show the application's About box")
        self.aboutAct.triggered.connect(self.about)

        self.aboutQtAct = QAction(self)
        self.aboutQtAct.setIconText('About Qt')
        self.aboutQtAct.setStatusTip("Show the Qt library's About box")
        self.aboutQtAct.triggered.connect(qApp.aboutQt)

        self.fileMenu = self.menuBar().addMenu('File')
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator()
        action = self.fileMenu.addAction('Switch layout direction')
        action.triggered.connect(self.switch_layout_direction)
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu('Edit')
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.windowMenu = self.menuBar().addMenu('Window')
        self.update_window_menu()
        self.windowMenu.aboutToShow.connect(self.update_window_menu)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu('Help')
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

        self.file_tool_bar = self.addToolBar('File')
        self.file_tool_bar.addAction(self.newAct)
        self.file_tool_bar.addAction(self.openAct)
        self.file_tool_bar.addAction(self.saveAct)

        self.edit_tool_bar = self.addToolBar('Edit')
        self.edit_tool_bar.addAction(self.cutAct)
        self.edit_tool_bar.addAction(self.copyAct)
        self.edit_tool_bar.addAction(self.pasteAct)

        self.statusBar().showMessage('Ready')

        self.update_menus()

        self.settings = QSettings('SavSoft', 'Combiner')

        self.last_directory: str = ''
        self.read_settings()

        self.setWindowTitle('MDI')
        self.setUnifiedTitleAndToolBarOnMac(True)

    def closeEvent(self, event):
        self.mdiArea.closeAllSubWindows()
        if self.active_mdi_child():
            event.ignore()
        else:
            self.write_settings()
            event.accept()

    def new_file(self):
        child = self.create_mdi_child()
        child.new_file()
        child.show()

    def open(self):
        filters = ['IRTECON files (*.grd)', 'Plain text files (*.csv *.tsv *.dat *.txt)']
        file_name, _ = QFileDialog.getOpenFileName(self, filter=';;'.join(filters),
                                                   directory=self.last_directory,
                                                   options=QFileDialog.DontUseNativeDialog)
        if file_name:
            child = self.create_mdi_child()
            if QFileInfo(file_name).suffix() == 'grd':
                if child.load_irtecon_file(file_name):
                    self.statusBar().showMessage('File loaded', 2000)
                    self.last_directory = QFileInfo(file_name).dir().absolutePath()
                    child.show()
                else:
                    child.close()
            else:
                print(PlainTextImportDialog(file_name).exec())
                raise NotImplementedError

    def save(self):
        if self.active_mdi_child() and self.active_mdi_child().save():
            self.statusBar().showMessage('File saved', 2000)

    def save_as(self):
        if self.active_mdi_child() and self.active_mdi_child().save_as():
            self.statusBar().showMessage('File saved', 2000)

    def cut(self):
        if self.active_mdi_child():
            self.active_mdi_child().cut()

    def copy(self):
        if self.active_mdi_child():
            self.active_mdi_child().copy()

    def paste(self):
        if self.active_mdi_child():
            self.active_mdi_child().paste()

    def about(self):
        QMessageBox.about(self, 'About MDI',
                          'The <b>MDI</b> example demonstrates how to write multiple '
                          'document interface applications using Qt.')

    def update_menus(self):
        has_mdi_child = (self.active_mdi_child() is not None)
        self.saveAct.setEnabled(has_mdi_child)
        self.saveAsAct.setEnabled(has_mdi_child)
        self.pasteAct.setEnabled(has_mdi_child)
        self.closeAct.setEnabled(has_mdi_child)
        self.closeAllAct.setEnabled(has_mdi_child)
        self.tileAct.setEnabled(has_mdi_child)
        self.cascadeAct.setEnabled(has_mdi_child)
        self.nextAct.setEnabled(has_mdi_child)
        self.previousAct.setEnabled(has_mdi_child)
        self.separatorAct.setVisible(has_mdi_child)

    def update_window_menu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tileAct)
        self.windowMenu.addAction(self.cascadeAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

        for i, window in enumerate(windows):
            child = window.widget()

            text = f'{i + 1:d} {child.user_friendly_current_file()}'
            if i < 9:
                text = '' + text

            action = self.windowMenu.addAction(text)
            action.setCheckable(True)
            action.setChecked(child == self.active_mdi_child())
            action.triggered.connect(self.windowMapper.map)
            self.windowMapper.setMapping(action, window)

    def create_mdi_child(self):
        child = MDIChildPlot()
        self.mdiArea.addSubWindow(child)
        return child

    def read_settings(self):
        pos = self.settings.value('pos', QPoint(200, 200))
        self.move(pos)
        size = self.settings.value('size', QSize(400, 400))
        self.resize(size)
        self.last_directory = self.settings.value('directory', '')

    def write_settings(self):
        self.settings.setValue('pos', self.pos())
        self.settings.setValue('size', self.size())
        self.settings.setValue('directory', self.last_directory)

    def active_mdi_child(self):
        active_sub_window = self.mdiArea.activeSubWindow()
        if active_sub_window:
            return active_sub_window.widget()
        return None

    def switch_layout_direction(self):
        if self.layoutDirection() == Qt.LeftToRight:
            qApp.setLayoutDirection(Qt.RightToLeft)
        else:
            qApp.setLayoutDirection(Qt.LeftToRight)

    def set_active_sub_window(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)
Пример #17
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.mdiArea = QMdiArea()
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setCentralWidget(self.mdiArea)

        self.mdiArea.subWindowActivated.connect(self.updateMenus)
        self.windowMapper = QSignalMapper(self)
        self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

        self.createActions()
        self.createMenus()

        self.createStatusBar()
        self.updateMenus()

        self.setWindowTitle("MDI")

    def closeEvent(self, event):
        self.mdiArea.closeAllSubWindows()
        if self.mdiArea.currentSubWindow():
            event.ignore()
        else:
            event.accept()

    def newFile(self):
        child = BrowserChaturbate(self.mdiArea)
        self.mdiArea.addSubWindow(child)
        child.load("https://www.chaturbate.com/")
        child.resize(320, 240)
        child.show()

    def newCam4(self):
        child = BrowserCam4(self.mdiArea)
        self.mdiArea.addSubWindow(child)
        child.load("https://www.cam4.com")
        child.resize(320, 240)
        child.show()

    def newFreecam(self):
        child = BrowserMyFreeCams(self.mdiArea)
        self.mdiArea.addSubWindow(child)
        #child.load("https://www.myfreecams.com/php/online_models_splash.php?")
        child.load('https://www.pornhub.com/categories?o=al')
        child.resize(320, 240)
        child.show()

    def updateMenus(self):
        hasMdiChild = (self.activeMdiChild() is not None)

        self.closeAct.setEnabled(hasMdiChild)
        self.closeAllAct.setEnabled(hasMdiChild)
        self.tileAct.setEnabled(hasMdiChild)
        self.cascadeAct.setEnabled(hasMdiChild)
        self.nextAct.setEnabled(hasMdiChild)
        self.previousAct.setEnabled(hasMdiChild)
        self.separatorAct.setVisible(hasMdiChild)

    def updateWindowMenu(self):
        self.windowMenu.clear()
        self.windowMenu.addAction(self.closeAct)
        self.windowMenu.addAction(self.closeAllAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.tileAct)
        self.windowMenu.addAction(self.cascadeAct)
        self.windowMenu.addSeparator()
        self.windowMenu.addAction(self.nextAct)
        self.windowMenu.addAction(self.previousAct)
        self.windowMenu.addAction(self.separatorAct)

        windows = self.mdiArea.subWindowList()
        self.separatorAct.setVisible(len(windows) != 0)

    def createActions(self):

        self.newAct = QAction("&Chartubate",
                              self,
                              shortcut=QKeySequence.New,
                              statusTip="Browse Chartubate",
                              triggered=self.newFile)

        self.newActCam4 = QAction("&Cam4",
                                  self,
                                  shortcut=QKeySequence.New,
                                  statusTip="Browse Cam4",
                                  triggered=self.newCam4)

        self.newActFreeCam = QAction("&PornHub",
                                     self,
                                     shortcut=QKeySequence.New,
                                     statusTip="Browse PornHub",
                                     triggered=self.newFreecam)

        self.closeAct = QAction("Cl&ose",
                                self,
                                statusTip="Close the active window",
                                triggered=self.mdiArea.closeActiveSubWindow)

        self.closeAllAct = QAction("Close &All",
                                   self,
                                   statusTip="Close all the windows",
                                   triggered=self.mdiArea.closeAllSubWindows)

        self.tileAct = QAction("&Tile",
                               self,
                               statusTip="Tile the windows",
                               triggered=self.mdiArea.tileSubWindows)

        self.cascadeAct = QAction("&Cascade",
                                  self,
                                  statusTip="Cascade the windows",
                                  triggered=self.mdiArea.cascadeSubWindows)

        self.nextAct = QAction("Ne&xt",
                               self,
                               shortcut=QKeySequence.NextChild,
                               statusTip="Move the focus to the next window",
                               triggered=self.mdiArea.activateNextSubWindow)

        self.previousAct = QAction(
            "Pre&vious",
            self,
            shortcut=QKeySequence.PreviousChild,
            statusTip="Move the focus to the previous window",
            triggered=self.mdiArea.activatePreviousSubWindow)

        self.separatorAct = QAction(self)
        self.separatorAct.setSeparator(True)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.newActCam4)
        self.fileMenu.addAction(self.newActFreeCam)

        self.exitAct = QAction(
            "E&xit",
            self,
            shortcut=QKeySequence.Quit,
            statusTip="Exit the application",
            triggered=QApplication.instance().closeAllWindows)

        self.fileMenu.addSeparator()
        action = self.fileMenu.addAction("Switch layout direction")
        action.triggered.connect(self.switchLayoutDirection)
        self.fileMenu.addAction(self.exitAct)

        self.windowMenu = self.menuBar().addMenu("&Window")
        self.updateWindowMenu()
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)

        self.menuBar().addSeparator()

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def activeMdiChild(self):
        activeSubWindow = self.mdiArea.activeSubWindow()
        if activeSubWindow:
            return activeSubWindow.widget()
        return None

    def findMdiChild(self, fileName):
        canonicalFilePath = QFileInfo(fileName).canonicalFilePath()

        for window in self.mdiArea.subWindowList():
            if window.widget().currentFile() == canonicalFilePath:
                return window
        return None

    def switchLayoutDirection(self):
        if self.layoutDirection() == Qt.LeftToRight:
            QApplication.setLayoutDirection(Qt.RightToLeft)
        else:
            QApplication.setLayoutDirection(Qt.LeftToRight)

    def setActiveSubWindow(self, window):
        if window:
            self.mdiArea.setActiveSubWindow(window)