Source code for appbase.MultiWorkspaceWindow

from MainWindow import MainWindow

from PyQt4 import QtGui, QtCore



[docs]class MultiWorkspaceWindow(MainWindow): '''Adding workspace management to appbase.MainWindow * 'Workspace' menu in menu bar * Switch between workspaces with [Ctrl]+[Page up/down] * Add workspace with [Ctrl]+[W] * Remove current workspace with [Ctrl]+[Q] ''' def __init__(self, workspaceClass, *args, **kwargs): ''' workspaceClass needs to have the following methods: * def setActive -> called when workspace is activated * def setInactive -> called when workspace is deactivated ''' MainWindow.__init__(self, *args, **kwargs) self._workspace_cls = workspaceClass self.setCentralWidget(QtGui.QStackedWidget()) # APPEND MENUBAR m = self.menuBar() w = m.menu_workspace = QtGui.QMenu('&Workspace') m.insertMenuBefore(m.menu_help, w) action_add = QtGui.QAction('&Add', w) action_add.triggered.connect(self.addWorkspace) action_add.setShortcuts(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_W)) w.addAction(action_add) action_close = QtGui.QAction('&Close current', w) action_close.triggered.connect(self.closeCurrentWorkspace) action_close.setShortcuts(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_Q)) w.addAction(action_close) action_next = QtGui.QAction('&Next', w) action_next.triggered.connect(self.showNextWorkspace) action_next.setShortcuts(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_PageUp)) w.addAction(action_next) action_previous = QtGui.QAction('&Previous', w) action_previous.triggered.connect(self.showPreviousWorkspace) action_previous.setShortcuts(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_PageDown)) w.addAction(action_previous) self._menu_workspaces = QtGui.QMenu('Set', w) self._menu_workspaces.aboutToShow.connect(self._listWorkspacesInMenu) w.addMenu(self._menu_workspaces) # Shortcuts sc = self.menuBar().shortcutsWidget sc.addShortcut('Alt+w', 'Add Workspace') sc.addShortcut('Alt+q', 'Close current Workspace') sc.addShortcut('Alt+PageUp', 'Show next Workspace') sc.addShortcut('Alt+PageDown', 'Show previous Workspace')
[docs] def workspaces(self, index=None): '''return generator for all all workspace instances''' c = self.centralWidget() if index is None: return (c.widget(n) for n in range(c.count())) else: return c.widget(index)
[docs] def currentWorkspace(self): return self.centralWidget().currentWidget()
[docs] def addWorkspace(self): w = self.currentWorkspace() if w: w.setInactive() w = self._workspace_cls(self) c = self.centralWidget() i = c.addWidget(w) c.setCurrentIndex(i) self.setTitleAdditive('[%s/%s]' % (i+1, c.count() ) ) return w
[docs] def closeWorkspace(self, ws): ws.close() self.centralWidget().removeWidget(ws) ws.deleteLater()
[docs] def closeCurrentWorkspace(self): c = self.centralWidget() self.closeWorkspace(c.currentWidget()) if c.count() == 0: self.addWorkspace() else: c.setCurrentIndex(c.count()-1) self.setTitleAdditive('[%s/%s]' % (c.count(), c.count() ) )
[docs] def showNextWorkspace(self): c = self.centralWidget() i = c.currentIndex() if i >= c.count()-1: return # at the end self.showWorkspace(i+1)
[docs] def showWorkspace(self, i): c = self.centralWidget() c.currentWidget().setInactive() c.setCurrentIndex(i) w = c.currentWidget() w.setActive() self.setTitleAdditive('[%s/%s]' %(i+1, c.count() ) )
[docs] def showPreviousWorkspace(self): c = self.centralWidget() i = c.currentIndex() if i == 0: return self.showWorkspace(i-1)
def _listWorkspacesInMenu(self): c = self.centralWidget() self._menu_workspaces.clear() for i in range(c.count()): if i == c.currentIndex(): t = '[%s] <-' % str(i+1) else: t = '[%s]' % str(i+1) a = QtGui.QAction(t, self._menu_workspaces) a.triggered.connect(lambda clicked, i=i, self=self: self.showWorkspace(i)) self._menu_workspaces.addAction(a)
if __name__ == '__main__': from appbase.Application import Application import sys class Workspace(QtGui.QTextEdit): def setInactive(self): self.append('inactivated') def setActive(self): self.append('activated') app = Application([]) win = MultiWorkspaceWindow(Workspace, title='Hello World') win.addWorkspace() win.addWorkspace() win.currentWorkspace().setText("""This is workspace [2] You can switch between different workspaces via Menubar->Workspace->Next/Previous -------""") win.show() sys.exit(app.exec_())