def __init__(self, display): Tool.__init__(self, display) self._linked_display = None self._menu = QtGui.QMenu() self.setMenu(self._menu) self._menu.aboutToShow.connect(self._buildMenu)
def __init__(self, MEDIA_FOLDER): QtGui.QWidget.__init__(self) self.is_active = True self.max_hist_len = 5 self._c = 0#count all added backups self.reset() self.setContentsMargins (0, 0, 0, 0) #HISTORY MENU self.menu = QtGui.QMenu() self.menu.aboutToShow.connect(self._showMenu) hl = QtGui.QHBoxLayout() hl.setContentsMargins (0, 0, 0, 0) self.setLayout(hl) icon_path = MEDIA_FOLDER.join("icons") #UNDO BUTTON self.btn_undo = QtGui.QToolButton() self.btn_undo.setAutoRaise(True) self.btn_undo.setToolTip('Undo') self.btn_undo.setIcon(QtGui.QIcon(icon_path.join('undo.svg'))) self.btn_undo.setShortcut (QtGui.QKeySequence.Undo) self.btn_undo.clicked.connect(self.undo) self.btn_undo.setEnabled(False) #MENU BUTTON self.btn_menu = QtGui.QToolButton() self.btn_menu.setAutoRaise(True) self.btn_menu.setFixedWidth(9) self.btn_menu.setToolTip('Undo/Redo options') self.btn_menu.setMenu(self.menu) self.btn_menu.setPopupMode(QtGui.QToolButton.InstantPopup) self.menu_options = _MenuOptions() self.menu_options.activate.stateChanged.connect(self.setActive) action = QtGui.QWidgetAction(self) action.setDefaultWidget(self.menu_options) self.menu.addAction(action) #REDO BUTTON self.btn_redo = QtGui.QToolButton() self.btn_redo.setAutoRaise(True) self.btn_redo.setToolTip('Redo') self.btn_redo.setIcon(QtGui.QIcon(icon_path.join('redo.svg'))) self.btn_redo.clicked.connect(self.redo) self.btn_redo.setShortcut (QtGui.QKeySequence.Redo) self.btn_redo.setEnabled(False) hl.addWidget(self.btn_undo) hl.addWidget(self.btn_menu) hl.addWidget(self.btn_redo)
def _openContextMenu(self, pos): #show toolbar name and action[remove] on right click m = QtGui.QMenu() #title: a = QtGui.QAction('Toolbar: %s' % self.name, self) a.setSoftKeyRole(QtGui.QAction.NoSoftKey) f = a.font() f.setBold(True) a.setFont(f) m.addAction(a) m.addSeparator() m.addAction("Remove").triggered.connect(self.actionSelect.trigger) m.exec_(self.mapToGlobal(pos))
def __init__(self, display): self.display = display mAll = QtGui.QMenu('All layers') mAll.addAction('Change').triggered.connect( self.display.changeLayerFiles) mAll.addAction('Remove').triggered.connect(self.display.removeLayers) GroupParameter.__init__( self, **{ 'name': ' Layers', 'sliding': True, 'addToContextMenu': [mAll] }) #IF A LAYER IS MOVED: self.sigChildRemoved.connect( lambda parent, child, index, self=self: self.display.removeLayer( index, self.opts.get('aboutToMove', False))) self._fnInsertRemovedLayer = lambda parent, child, index, self=self: \ self.display.insertRemovedLayer(index) self.sigChildAdded.connect(self._fnInsertRemovedLayer) self.sigChildAdded.connect(self._valuesChanged) self.sigChildRemoved.connect(self._valuesChanged)
def __init__(self, plotDisplay): Tool.__init__(self, plotDisplay) self.mDisplay = QtGui.QMenu('from display') self.setMenu(self.mDisplay) self.mDisplay.aboutToShow.connect(self._buildMenu)
def buildLayer(self, fname, label, name, data, origin=None, index=None, info=None, changes=None): ''' for every layer of the stack add a parameter containing ... * it's stack value * an layer info field * a layer changed field ''' info, changes = self._extractFromOrigin(origin, index, info, changes) try: self.sigChildAdded.disconnect(self._fnInsertRemovedLayer) except TypeError: pass #ADD OPTIONS TO THE CONTEXT MENU: mCopy = QtGui.QMenu('Copy') mMove = QtGui.QMenu('Move') if not fname or not PathStr(fname).isfile(): fname = None menu_entries = [mCopy, mMove] if self.display.reader is not None: aFile = QtGui.QAction('Change File', self) aFile.triggered.connect(lambda checked, i=len(self.childs): self. display.changeLayerFile(i)) menu_entries.append(aFile) #CREATE AND ADD COPY-LAYER-TO OPTION TO PARAMETER: pLayer = self.addChild({ 'type': 'float', 'highlight': True, 'name': name, 'value': self.display.axes.stackAxis.getNextStackValue( PathStr(fname).basename()), 'expanded': False, 'removable': True, 'autoIncrementName': True, 'renamable': True, 'readonly': True, 'addToContextMenu': menu_entries, 'filename': fname, 'layername': label, }) mCopy.aboutToShow.connect( lambda pLayer=pLayer, mCopy=mCopy, self=self: self. buildCopyToDisplayMenu(mCopy, pLayer, 'copy')) mMove.aboutToShow.connect( lambda pLayer=pLayer, mMove=mMove, self=self: self. buildCopyToDisplayMenu(mMove, pLayer, 'move')) #UPDATE STACK VALUES: pLayer.sigValueChanged.connect(self._valuesChanged) #EMIT LAYERNAMESCHANGED: pLayer.sigNameChanged.connect( lambda param, val, self=self: self.sigLayerNameChanged.emit( param.parent().children().index(param), val)) #CHECK WHETHER INSERTED LAYER COMES FROM A MOVED ONE: self.sigChildAdded.connect(self._fnInsertRemovedLayer) #ADD LAYER INFO if info is None: finfo = '' if fname is not None: try: #read info from file: finfo += self.getFileInfo( fname) + '\n' # + self.getMetaData(name) except AttributeError: pass # finfo = '' #not possible to read from file because maybe not a filename dinfo = '' if data is not None: try: dinfo = 'shape:\t%s\ndtype:\t%s' % (data.shape, data.dtype) except AttributeError: #data in not array dinfo = 'length: %s' % len(data) info = '%s---\n%s' % (finfo, dinfo) if isinstance(info, Parameter): #CASE: layer was duplicated and [info] is a parameter for ch in info.children(): pLayer.addChild(ch.duplicate()) else: #info is given as text #LAYER INFO pLayer.addChild({ 'type': 'text', 'name': 'Info', 'value': info if info != None else '', 'readonly': True }) #LAYER CHANGES pLayer.addChild({ 'type': 'text', 'name': 'Changes', #'TODO: every change through a tool/scripts operation to be added here', 'value': changes if changes else '', #'readonly':True 'expanded': bool(changes) })
def _appendMenubarAndPreferences(self): m = self.menuBar() m.setFixedHeight(25) # m.setMaximumHeight(25) m.aboutWidget.setModule(dataArtist) m.aboutWidget.setInstitutionLogo( MEDIA_FOLDER.join('institution_logo.svg')) #hide the menu so toolbars can only be show/hidden via gui->view->toolbars: m.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) self.undoRedo = UndoRedo(MEDIA_FOLDER) self.gTools = GlobalTools() self.gTools.addWidget(self.undoRedo) m.setCornerWidget(self.gTools) #APPEND PREFERENCES t = m.file_preferences.tabs t.addTab(PreferencesView(self), 'View') t.addTab(self.pref_import, 'Import') t.addTab(PreferencesCommunication(self), 'Communication') #APPEND MENUBAR #MENU - FILE f = m.menu_file p = f.action_preferences action_file = QtGui.QAction('&Import', f) action_file.triggered.connect(self.openFile) action_file.setShortcut( QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_I)) f.insertAction(p, action_file) f.insertSeparator(p) #MENU VIEW v = m.menu_view #ACTION PRINT VIEW aPrintView = QtGui.QAction('Print view', v) aPrintView.setCheckable(True) aPrintView.triggered.connect( lambda checked: self.currentWorkspace().setPrintView(checked)) v.addAction(aPrintView) #SHOW/HIDE history aHistory = QtGui.QAction('Program history', v) aHistory.setShortcut(QtCore.Qt.Key_F4) aHistory.setCheckable(True) def showhideHistory(checked): s = self.currentWorkspace().middle_splitter r = s.getRange(1)[1] if checked: r /= 1.5 return s.moveSplitter(r, 1) def isHistoryVisible(): s = self.currentWorkspace().middle_splitter aHistory.setChecked(s.sizes()[1] != 0) aHistory.triggered.connect(showhideHistory) v.aboutToShow.connect(isHistoryVisible) v.addAction(aHistory) #SHOW/HIDE preferences aPref = QtGui.QAction('Dock preferences', v) aPref.setShortcut(QtCore.Qt.Key_F3) aPref.setCheckable(True) def showhidePref(checked): s = self.currentWorkspace().vert_splitter r = s.getRange(1)[1] if checked: r /= 3 else: r = 0 return s.moveSplitter(r, 1) def isPrefVisible(): w = self.currentWorkspace() s = w.vert_splitter aPref.setChecked(s.sizes()[0] != 0) aPref.setEnabled(w.displayPrefTabs.isVisible()) aPref.triggered.connect(showhidePref) v.aboutToShow.connect(isPrefVisible) v.addAction(aPref) #ACTION VIEW2CLIPBOARD aClipboard = QtGui.QAction('Copy view to clipboard', v) aClipboard.triggered.connect( lambda checked: self.currentWorkspace().copyViewToClipboard()) v.addAction(aClipboard) #ACTION Display2CLIPBOARD aClipboard = QtGui.QAction('Copy active display to clipboard', v) aClipboard.triggered.connect(lambda checked: self.currentWorkspace(). copyCurrentDisplayToClipboard()) v.addAction(aClipboard) #MENU - TOOLS t = m.menu_tools = QtGui.QMenu('Dock') m.insertMenuBefore(m.menu_workspace, t) #ADD DISPLAY mDisplay = t.addMenu('Add Display') for i, name in ( #(1, 'Dot'), (2, 'Graph'), (3, 'Image/Video'), #(4, 'Surface') #TODO: #(4, 'TODO: Surface'), #(5, 'TODO: Volume') ): mDisplay.addAction('%sD - %s' % (i - 1, name)).triggered.connect( lambda checked, i=i: self.currentWorkspace().addDisplay(axes=i )) #ADD TABLE t.addAction('Add Table').triggered.connect( lambda: self.currentWorkspace().addTableDock()) #ADD NOTEPAD t.addAction('Add Notepad').triggered.connect( lambda: self.currentWorkspace().addTextDock()) t.addSeparator() #DUPLICATE CURRENT DOCK t.addAction('Duplicate current display').triggered.connect( self._duplicateCurrentDiplay) self._m_duplDisp = t.addMenu('Move current display to other workspace') self._m_duplDisp.aboutToShow.connect(self._fillMenuDuplicateToOtherWS) #MENU - TOOLBARS self.menu_toolbars = QtGui.QMenu('Toolbars', m) self.connect(self.menu_toolbars, QtCore.SIGNAL("hovered(QAction *)"), lambda action, m=self.menu_toolbars: _showActionToolTipInMenu(m, action)) #SHOW ALL TOOLBARS - ACTION a = self.menu_toolbars.a_show = QtGui.QAction('show', m) f = a.font() f.setBold(True) a.setFont(f) a.setCheckable(True) a.setChecked(True) a.triggered.connect(self._toggleShowSelectedToolbars) self.menu_toolbars.aboutToShow.connect(self._listToolbarsInMenu) m.insertMenuBefore(m.menu_workspace, self.menu_toolbars) #MENU HELP m.menu_help.addAction('User manual').triggered.connect( lambda checked: os.startfile(HELP_FILE)) #TUTORIALS ####not used at the moment # self.m_tutorials = TutorialMenu( # tutorialFolder=PathStr.getcwd('dataArtist').join('tutorials'), # openFunction=self._openFnForTutorial, # saveFunction=self.app.session.blockingSave) # m.menu_help.addMenu(self.m_tutorials) m.menu_help.addAction('Online tutorials').triggered.connect( lambda checked: os.startfile( 'http://www.youtube.com/channel/UCjjngrC3jPdx1HL8zJ8yqLQ')) m.menu_help.addAction('Support').triggered.connect( lambda checked: os.startfile( 'https://github.com/radjkarl/dataArtist/issues'))