def createAliasPanelTab(self): self.aliasPanel = QAliasListPanel(parent=self) idx = self.stack.addWidget(self.aliasPanel) self.aliasPanel.set_index(idx) tab_idx = self.tabBar.addTab("Aliases") self.aliasPanel.set_tab_idx(tab_idx) self.tab_to_stack_idx[tab_idx] = idx
class QMashupView(QtGui.QMainWindow, BaseView): #signals #mashupChanged = pyqtSignal() def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()): QtGui.QMainWindow.__init__(self, parent, f) BaseView.__init__(self) self.set_title("Mashup") self.controller = None self.mshpController = None self.createActions() #Setting up a toolbar self.createToolBar() self.tab_to_stack_idx = {} self.button_to_tab_idx = Bidict() widget = QtGui.QWidget(self) layout = QtGui.QVBoxLayout() layout.setMargin(0) layout.setSpacing(0) self.tabBar = QtGui.QTabBar(self) self.tabBar.setDocumentMode(True) self.tabBar.setTabsClosable(False) self.tabBar.setExpanding(False) self.tabBar.currentChanged.connect(self.switchTab) self.stack = QtGui.QStackedWidget(self) layout.addWidget(self.tabBar) layout.addWidget(self.stack) widget.setLayout(layout) self.setCentralWidget(widget) self.createAliasPanelTab() widget.setVisible(True) #self.createPipelineTab() self.setWindowTitle("Mashup Builder") self.vtversion = -1 self.manager = MashupsManager.getInstance() def set_default_layout(self): from gui.mashups.mashups_inspector import QMashupsInspector from gui.mashups.alias_parameter_view import QAliasParameterView self.set_palette_layout({ QtCore.Qt.LeftDockWidgetArea: QMashupsInspector, QtCore.Qt.RightDockWidgetArea: QAliasParameterView, }) def set_action_links(self): self.action_links = \ { } def set_action_defaults(self): self.action_defaults['execute'] = [('setEnabled', False, False)] def set_controller(self, controller): """set_controller(controller:VistrailController) -> None This will set vistrail controller""" if controller == self.controller: return # if self.controller is not None: # self.disconnect(self.controller, # QtCore.SIGNAL('versionWasChanged'), # self.versionChanged) self.controller = controller # if self.controller: # self.connect(self.controller, # QtCore.SIGNAL('versionWasChanged'), # self.versionChanged) #print " *** mashup view set vtController: ", controller def versionChanged(self, version): window = self.window() self.vtversion = version if self.vtversion > -1: window.qactions['mashup'].setEnabled(True) else: window.qactions['mashup'].setEnabled(False) #print " *** mashup view versionChanged ", self.vtversion def controllerChanged(self, controller): from gui.vistrails_window import _app self.set_controller(controller) self.versionChanged(self.controller.current_version) if _app.get_current_tab() == self: self.updateView() def updateView(self): from gui.vistrails_window import _app if self.vtversion > 0: if self.mshpController is not None: self.mshpController.versionChanged.disconnect( self.mshpVersionChanged) self.mshpController.stateChanged.disconnect( self.mshpStateChanged) if self.mshpController.vtController is not None: self.disconnect(self.mshpController.vtController, QtCore.SIGNAL('vistrailChanged()'), self.mshpControllerVistrailChanged) self.controller.flush_delayed_actions() self.vtversion = self.controller.current_version self.mshpController = self.manager.createMashupController( self.controller, self.vtversion) #self.pipelineTab.set_controller(self.mshpController.vtController) #self.pipelineTab.set_to_current() self.mshpController.vtController.change_selected_version( self.vtversion) self.connect(self.mshpController.vtController, QtCore.SIGNAL('vistrailChanged()'), self.mshpControllerVistrailChanged) self.mshpController.versionChanged.connect(self.mshpVersionChanged) self.mshpController.stateChanged.connect(self.mshpStateChanged) self.aliasPanel.updateController(self.mshpController) self.clearPreviewTabs() _app.notify('mshpcontroller_changed', self.mshpController) def createActions(self): self.saveAction = QtGui.QAction("Tag", self, triggered=self.saveTriggered) self.saveAction.setToolTip("Tag current mashup") self.saveAction.setEnabled(False) self.previewAction = QtGui.QAction("Preview", self, triggered=self.previewTriggered, checkable=False) self.previewAction.setToolTip("Preview current mashup") def createToolBar(self): self.toolbar = QtGui.QToolBar(self) self.toolbar.addAction(self.previewAction) self.toolbar.addSeparator() self.toolbar.addAction(self.saveAction) self.addToolBar(self.toolbar) def createAliasPanelTab(self): self.aliasPanel = QAliasListPanel(parent=self) idx = self.stack.addWidget(self.aliasPanel) self.aliasPanel.set_index(idx) tab_idx = self.tabBar.addTab("Aliases") self.aliasPanel.set_tab_idx(tab_idx) self.tab_to_stack_idx[tab_idx] = idx def createPreviewTab(self, version): previewTab = QMashupViewTab(self.mshpController, version) # self.refreshButton = QtGui.QPushButton("Refresh", self) # self.refreshButton.setFlat(True) # self.refreshButton.setEnabled(False) # self.refreshButton.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, # QtGui.QSizePolicy.Fixed)) previewApp = self.manager.createMashupApp( self.controller, self.mshpController.mshptrail, version) previewApp.appWasClosed.connect(self.previewTabWasClosed) layout = QtGui.QVBoxLayout() layout.setMargin(0) layout.setSpacing(5) #layout.addWidget(self.refreshButton, QtCore.Qt.AlignLeft) layout.addWidget(previewApp) previewTab.setLayout(layout) idx = self.stack.addWidget(previewTab) previewTab.set_index(idx) tab_idx = self.tabBar.addTab( "Preview: %s" % self.mshpController.getMashupName(version)) previewTab.set_tab_idx(tab_idx) self.tab_to_stack_idx[tab_idx] = idx closeButton = QMashupViewCloseButton(self.tabBar) closeSide = self.tabBar.style().styleHint( QtGui.QStyle.SH_TabBar_CloseButtonPosition, None, self.tabBar) closeButton.clicked.connect(self.closePreviewTab) self.tabBar.setTabButton(tab_idx, closeSide, closeButton) self.button_to_tab_idx[closeButton] = tab_idx self.tabBar.setCurrentIndex(tab_idx) @pyqtSlot() def closePreviewTab(self): closeButton = self.sender() tab_idx = self.button_to_tab_idx[closeButton] self.tabBar.removeTab(tab_idx) stack_idx = self.tab_to_stack_idx[tab_idx] if stack_idx >= 0: self.stack.removeWidget(self.stack.widget(stack_idx)) del self.button_to_tab_idx[closeButton] self.updateIndexes(tab_idx, stack_idx) def previewTabWasClosed(self, previewApp): previewTab = previewApp.parent() tab_idx = previewTab.get_tab_idx() stack_idx = self.tab_to_stack_idx[tab_idx] if previewTab == self.stack.widget(stack_idx): #this means the quit button was pressed closeButton = self.button_to_tab_idx.inverse[tab_idx] self.tabBar.removeTab(tab_idx) self.stack.removeWidget(self.stack.widget(stack_idx)) del self.button_to_tab_idx[closeButton] self.updateIndexes(tab_idx, stack_idx) def updateIndexes(self, rm_tab_idx, rm_stack_idx): for (b, tab_idx) in self.button_to_tab_idx.iteritems(): if tab_idx > rm_tab_idx: self.button_to_tab_idx[b] -= 1 for idx in range(self.stack.count()): if idx >= rm_stack_idx: view = self.stack.widget(idx) view.set_index(idx) view.set_tab_idx(view.tab_idx - 1) def clearPreviewTabs(self): tab_idx = self.tabBar.count() - 1 while self.tabBar.count() > 1: idx = self.tab_to_stack_idx[tab_idx] if type(self.stack.widget(idx)) == QMashupViewTab: self.tabBar.removeTab(tab_idx) if idx >= 0: self.stack.removeWidget(self.stack.widget(idx)) tab_idx -= 1 @pyqtSlot(int) def switchTab(self, index): try: self.stack.setCurrentIndex(self.tab_to_stack_idx[index]) except KeyError: pass def previewTriggered(self): self.createPreviewTab(self.mshpController.currentVersion) def saveTriggered(self): (pid, pname) = self.mshpController.findFirstTaggedParent( self.mshpController.currentVersion) if pid >= 1: res = show_question( "VisTrails::Mashups", """You've decided to keep a modified version of '%s'. Would you like to update it (this will move the tag to the current version)? Click on No to create a new tag.""" % pname, [CANCEL_BUTTON, YES_BUTTON, NO_BUTTON], 0) if res == YES_BUTTON: #move tag self.mshpController.moveTag(pid, self.mshpController.currentVersion, pname) elif res == NO_BUTTON: # show createNewtag dialog tag_exists = True ok = True while ok and tag_exists: (text, ok) = QtGui.QInputDialog.getText(self, "VisTrails::Mashups", "Enter a new tag:", text="") if ok and not text.isEmpty(): tag = str(text) if self.mshpController.updateCurrentTag(tag): tag_exists = False def mshpControllerVistrailChanged(self): #print "*** vistrailChanged mashup view ", self.mshpController.vtController.current_version pipeline = self.mshpController.vtController.current_pipeline self.mshpController.updateAliasesFromPipeline(pipeline) def mshpVersionChanged(self, versionId): from gui.vistrails_window import _app #print "*** mshpVersionChanged ", versionId self.aliasPanel.updateVersion(versionId) if not self.mshpController.versionHasTag(versionId): self.saveAction.setEnabled(True) else: self.saveAction.setEnabled(False) _app.notify('mshpversion_changed', versionId) def mshpStateChanged(self): for idx in range(self.stack.count()): view = self.stack.widget(idx) if type(view) == QMashupViewTab: tab_idx = view.tab_idx self.tabBar.setTabText( tab_idx, "Preview: %s" % self.mshpController.getMashupName(view.version)) def aliasChanged(self, param): #print "mashupView aliasChanged", param self.mshpController.updateAliasFromParam(param)
class QMashupView(QtGui.QMainWindow, BaseView): #signals #mashupChanged = pyqtSignal() def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()): QtGui.QMainWindow.__init__(self, parent, f) BaseView.__init__(self) self.set_title("Mashup") self.controller = None self.mshpController = None self.createActions() #Setting up a toolbar self.createToolBar() self.tab_to_stack_idx = {} self.button_to_tab_idx = Bidict() widget = QtGui.QWidget(self) layout = QtGui.QVBoxLayout() layout.setMargin(0) layout.setSpacing(0) self.tabBar = QtGui.QTabBar(self) self.tabBar.setDocumentMode(True) self.tabBar.setTabsClosable(False) self.tabBar.setExpanding(False) self.tabBar.currentChanged.connect(self.switchTab) self.stack = QtGui.QStackedWidget(self) layout.addWidget(self.tabBar) layout.addWidget(self.stack) widget.setLayout(layout) self.setCentralWidget(widget) self.createAliasPanelTab() widget.setVisible(True) #self.createPipelineTab() self.setWindowTitle("Mashup Builder") self.vtversion = -1 self.manager = MashupsManager.getInstance() def set_default_layout(self): from gui.mashups.mashups_inspector import QMashupsInspector from gui.mashups.alias_parameter_view import QAliasParameterView self.set_palette_layout( {QtCore.Qt.LeftDockWidgetArea: QMashupsInspector, QtCore.Qt.RightDockWidgetArea: QAliasParameterView, }) def set_action_links(self): self.action_links = \ { } def set_action_defaults(self): self.action_defaults['execute'] = [('setEnabled', False, False)] def set_controller(self, controller): """set_controller(controller:VistrailController) -> None This will set vistrail controller""" if controller == self.controller: return # if self.controller is not None: # self.disconnect(self.controller, # QtCore.SIGNAL('versionWasChanged'), # self.versionChanged) self.controller = controller # if self.controller: # self.connect(self.controller, # QtCore.SIGNAL('versionWasChanged'), # self.versionChanged) #print " *** mashup view set vtController: ", controller def versionChanged(self, version): window = self.window() self.vtversion = version if self.vtversion > -1: window.qactions['mashup'].setEnabled(True) else: window.qactions['mashup'].setEnabled(False) #print " *** mashup view versionChanged ", self.vtversion def controllerChanged(self, controller): from gui.vistrails_window import _app self.set_controller(controller) self.versionChanged(self.controller.current_version) if _app.get_current_tab() == self: self.updateView() def updateView(self): from gui.vistrails_window import _app if self.vtversion > 0: if self.mshpController is not None: self.mshpController.versionChanged.disconnect(self.mshpVersionChanged) self.mshpController.stateChanged.disconnect(self.mshpStateChanged) if self.mshpController.vtController is not None: self.disconnect(self.mshpController.vtController, QtCore.SIGNAL('vistrailChanged()'), self.mshpControllerVistrailChanged) self.controller.flush_delayed_actions() self.vtversion = self.controller.current_version self.mshpController = self.manager.createMashupController(self.controller, self.vtversion) #self.pipelineTab.set_controller(self.mshpController.vtController) #self.pipelineTab.set_to_current() self.mshpController.vtController.change_selected_version(self.vtversion) self.connect(self.mshpController.vtController, QtCore.SIGNAL('vistrailChanged()'), self.mshpControllerVistrailChanged) self.mshpController.versionChanged.connect(self.mshpVersionChanged) self.mshpController.stateChanged.connect(self.mshpStateChanged) self.aliasPanel.updateController(self.mshpController) self.clearPreviewTabs() _app.notify('mshpcontroller_changed', self.mshpController) def createActions(self): self.saveAction = QtGui.QAction("Tag", self, triggered=self.saveTriggered) self.saveAction.setToolTip("Tag current mashup") self.saveAction.setEnabled(False) self.previewAction = QtGui.QAction("Preview", self, triggered=self.previewTriggered, checkable=False) self.previewAction.setToolTip("Preview current mashup") def createToolBar(self): self.toolbar = QtGui.QToolBar(self) self.toolbar.addAction(self.previewAction) self.toolbar.addSeparator() self.toolbar.addAction(self.saveAction) self.addToolBar(self.toolbar) def createAliasPanelTab(self): self.aliasPanel = QAliasListPanel(parent=self) idx = self.stack.addWidget(self.aliasPanel) self.aliasPanel.set_index(idx) tab_idx = self.tabBar.addTab("Aliases") self.aliasPanel.set_tab_idx(tab_idx) self.tab_to_stack_idx[tab_idx] = idx def createPreviewTab(self, version): previewTab = QMashupViewTab(self.mshpController, version) # self.refreshButton = QtGui.QPushButton("Refresh", self) # self.refreshButton.setFlat(True) # self.refreshButton.setEnabled(False) # self.refreshButton.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, # QtGui.QSizePolicy.Fixed)) previewApp = self.manager.createMashupApp(self.controller, self.mshpController.mshptrail, version) previewApp.appWasClosed.connect(self.previewTabWasClosed) layout = QtGui.QVBoxLayout() layout.setMargin(0) layout.setSpacing(5) #layout.addWidget(self.refreshButton, QtCore.Qt.AlignLeft) layout.addWidget(previewApp) previewTab.setLayout(layout) idx = self.stack.addWidget(previewTab) previewTab.set_index(idx) tab_idx = self.tabBar.addTab("Preview: %s"%self.mshpController.getMashupName(version)) previewTab.set_tab_idx(tab_idx) self.tab_to_stack_idx[tab_idx] = idx closeButton = QMashupViewCloseButton(self.tabBar) closeSide = self.tabBar.style().styleHint( QtGui.QStyle.SH_TabBar_CloseButtonPosition, None, self.tabBar) closeButton.clicked.connect(self.closePreviewTab) self.tabBar.setTabButton(tab_idx, closeSide, closeButton) self.button_to_tab_idx[closeButton] = tab_idx self.tabBar.setCurrentIndex(tab_idx) @pyqtSlot() def closePreviewTab(self): closeButton = self.sender() tab_idx = self.button_to_tab_idx[closeButton] self.tabBar.removeTab(tab_idx) stack_idx = self.tab_to_stack_idx[tab_idx] if stack_idx >= 0: self.stack.removeWidget(self.stack.widget(stack_idx)) del self.button_to_tab_idx[closeButton] self.updateIndexes(tab_idx, stack_idx) def previewTabWasClosed(self, previewApp): previewTab = previewApp.parent() tab_idx = previewTab.get_tab_idx() stack_idx = self.tab_to_stack_idx[tab_idx] if previewTab == self.stack.widget(stack_idx): #this means the quit button was pressed closeButton = self.button_to_tab_idx.inverse[tab_idx] self.tabBar.removeTab(tab_idx) self.stack.removeWidget(self.stack.widget(stack_idx)) del self.button_to_tab_idx[closeButton] self.updateIndexes(tab_idx, stack_idx) def updateIndexes(self, rm_tab_idx, rm_stack_idx): for (b,tab_idx) in self.button_to_tab_idx.iteritems(): if tab_idx > rm_tab_idx: self.button_to_tab_idx[b] -= 1 for idx in range(self.stack.count()): if idx >= rm_stack_idx: view = self.stack.widget(idx) view.set_index(idx) view.set_tab_idx(view.tab_idx-1) def clearPreviewTabs(self): tab_idx = self.tabBar.count()-1 while self.tabBar.count() > 1: idx = self.tab_to_stack_idx[tab_idx] if type(self.stack.widget(idx)) == QMashupViewTab: self.tabBar.removeTab(tab_idx) if idx >= 0: self.stack.removeWidget(self.stack.widget(idx)) tab_idx -= 1 @pyqtSlot(int) def switchTab(self, index): try: self.stack.setCurrentIndex(self.tab_to_stack_idx[index]) except KeyError: pass def previewTriggered(self): self.createPreviewTab(self.mshpController.currentVersion) def saveTriggered(self): (pid, pname) = self.mshpController.findFirstTaggedParent(self.mshpController.currentVersion) if pid >= 1: res = show_question("VisTrails::Mashups", """You've decided to keep a modified version of '%s'. Would you like to update it (this will move the tag to the current version)? Click on No to create a new tag.""" %pname, [CANCEL_BUTTON, YES_BUTTON, NO_BUTTON], 0) if res == YES_BUTTON: #move tag self.mshpController.moveTag(pid, self.mshpController.currentVersion, pname) elif res == NO_BUTTON: # show createNewtag dialog tag_exists = True ok = True while ok and tag_exists: (text, ok) = QtGui.QInputDialog.getText(self, "VisTrails::Mashups", "Enter a new tag:", text="") if ok and not text.isEmpty(): tag = str(text) if self.mshpController.updateCurrentTag(tag): tag_exists = False def mshpControllerVistrailChanged(self): #print "*** vistrailChanged mashup view ", self.mshpController.vtController.current_version pipeline = self.mshpController.vtController.current_pipeline self.mshpController.updateAliasesFromPipeline(pipeline) def mshpVersionChanged(self, versionId): from gui.vistrails_window import _app #print "*** mshpVersionChanged ", versionId self.aliasPanel.updateVersion(versionId) if not self.mshpController.versionHasTag(versionId): self.saveAction.setEnabled(True) else: self.saveAction.setEnabled(False) _app.notify('mshpversion_changed', versionId) def mshpStateChanged(self): for idx in range(self.stack.count()): view = self.stack.widget(idx) if type(view) == QMashupViewTab: tab_idx = view.tab_idx self.tabBar.setTabText(tab_idx, "Preview: %s"%self.mshpController.getMashupName(view.version)) def aliasChanged(self, param): #print "mashupView aliasChanged", param self.mshpController.updateAliasFromParam(param)