def new_console(tabto=None, floating=False, dockingarea=QtCore.Qt.RightDockWidgetArea): """ Create a new console and float it as a max widget tabto: name of a widget on top of which the console should be tabbed floating: True to float the console, False to leave it docked dockingarea: The docking area for docking the window (default = right) """ main_window = GetQMaxMainWindow() # create and setup a console console = PythonConsole(formats=HUGOS_THEME) console.setStyleSheet("background-color: #333333;") # create a dock widget for the console dock_widget = QDockWidget(main_window) dock_widget.setWidget(console) dock_widget.setObjectName("pyconsole") dock_widget.setWindowTitle("Python Console") main_window.addDockWidget(dockingarea, dock_widget) if not tabto is None: tabw = main_window.findChild(QWidget, tabto) main_window.tabifyDockWidget(tabw, dock_widget) dock_widget.setFloating(floating) dock_widget.show() # make the console do stuff console.eval_queued() return console
def __init__(self): super(MainWindowV2, self).__init__() # self.model - вместо трёх отдельных lists (arr_sheet, arr_Dash, arr_Tab) # в QStandardItemModel будем append-ить # один из трёх классов, наследующихся от QStandardItem self.model = QStandardItemModel(self) self.tabWidget = QTabWidget(self) self.tabWidget.setTabPosition(QTabWidget.South) self.tabWidget.setTabsClosable(True) # можно премещать вкладки self.tabWidget.setMovable( True) # но пока по нажатию ничего не происходит self.tabWidget.tabCloseRequested.connect(self.closeTabFromTabWidget) self.setCentralWidget(self.tabWidget) # summerfield "Rapid GUI Programming" ch6 logDockWidget = QDockWidget("Tabs", self) logDockWidget.setTitleBarWidget(QWidget()) # logDockWidget = QDockWidget(self) logDockWidget.setObjectName("LogDockWidget") logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) logDockWidget.setFeatures(QDockWidget.DockWidgetMovable) # logDockWidget.setMinimumSize(100, 0) self.navListView = QListView() self.navListView.setModel(self.model) logDockWidget.setWidget(self.navListView) self.addDockWidget(Qt.LeftDockWidgetArea, logDockWidget) self.createActions() tabsToolbar = self.addToolBar("Tabs") tabsToolbar.setObjectName("tabsToolBar") tabsToolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) for action in [ self.newChartAction, self.newTableAction, self.newDashboardAction, self.closeTabAction ]: tabsToolbar.addAction(action) self.navListView.selectionModel().selectionChanged.connect( self.setActiveTab) # easy start self.newChart()
def createDockWindows(self): # Info dock = QDockWidget('Details', self) dock.setObjectName("DETAILS") dock.setAllowedAreas(Qt.AllDockWidgetAreas) self.detailsWidget = InfoPanelWidget(self) self.project_widget.treeCurrentItemChanged.connect( self.detailsWidget.setItem) self.project_widget.treeCurrentItemChanged.connect( self.currentItemChanged) dock.setWidget(self.detailsWidget) self.addDockWidget(Qt.RightDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction())
def make_dock_widget(parent, name, view, area, allowedAreas, features=QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable): dock = QDockWidget(name, parent) dock.setObjectName(name) dock.setAllowedAreas(allowedAreas) dock.setFeatures(features) dock.setWidget(view) parent.addDockWidget(area, dock) return dock
def demo_docking_widgets(): """ Demonstrates how to create a QWidget with PySide2 and attach it to the 3dsmax main window. Creates two types of dockable widgets, a QDockWidget and a QToolbar """ # Retrieve 3ds Max Main Window QWdiget main_window = GetQMaxMainWindow() # QAction reused by both dockable widgets. cylinder_icon_path = os.path.dirname(os.path.realpath(__file__)) + "\\cylinder_icon_48.png" cylinder_icon = QtGui.QIcon(cylinder_icon_path) create_cyl_action = QAction(cylinder_icon, u"Create Cylinder", main_window) create_cyl_action.triggered.connect(create_cylinder) # QDockWidget construction and placement over the main window dock_widget = QDockWidget(main_window) # Set for position persistence dock_widget.setObjectName("Creators") # Set to see dock widget name in toolbar customize popup dock_widget.setWindowTitle("Creators") dock_tool_button = QToolButton() dock_tool_button.setAutoRaise(True) dock_tool_button.setDefaultAction(create_cyl_action) dock_tool_button.setToolButtonStyle(QtCore.Qt.ToolButtonTextOnly) dock_widget.setWidget(dock_tool_button) main_window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dock_widget) dock_widget.setFloating(True) dock_widget.show() # QToolBar construction and attachement to main window toolbar_widget = QToolBar(main_window) # Set for position persistence toolbar_widget.setObjectName("Creators TB") # Set to see dock widget name in toolbar customize popup toolbar_widget.setWindowTitle("Creators TB") toolbar_widget.setFloatable(True) toolbar_widget.addAction(create_cyl_action) main_window.addToolBar(QtCore.Qt.BottomToolBarArea, toolbar_widget) toolbar_widget.show() toolbar_position = get_pos_to_dock_toolbar(dock_widget) make_toolbar_floating(toolbar_widget, toolbar_position)
def __init__(self, app): super(MainWindow, self).__init__() self._app = app self._selectedIndex = None # model nodeFactory = NodeFactory() rootNode = nodeFactory.create(NodeType.General, 'Root') # for i in range(10000): # for testing childNode0 = nodeFactory.create(NodeType.General, 'RightPirateLeg', rootNode) childNode1 = nodeFactory.create(NodeType.General, 'RightPirateLeg_END', childNode0) childNode2 = nodeFactory.create(NodeType.General, 'LeftFemur', rootNode) childNode3 = nodeFactory.create(NodeType.Sphere, 'LeftTibia', childNode2) childNode4 = nodeFactory.create(NodeType.Sphere, 'LeftFoot', childNode3) transform = childNode4.component(ComponentType.Transform) qTransform = transform.component() translation = qTransform.translation() translation.setX(5) qTransform.setTranslation(translation) # childNode5 = nodeFactory.create(NodeType.Box, 'LeftFoot_END', childNode4) self._model = SceneGraphModel(rootNode) self._sceneView = SceneView(rootNode.entity()) self._container = self.createWindowContainer(self._sceneView) # scene graph view self._treeView = QTreeView() self._treeView.setModel(self._model) self._treeView.setHeaderHidden(True) self._treeView.setAlternatingRowColors(True) dockWidget = QDockWidget() dockWidget.setWidget(self._treeView) dockWidget.setWindowTitle('Scene Graph') dockWidget.setObjectName('sceneGraph') sceneGraphToggleAction = dockWidget.toggleViewAction() self.addDockWidget(Qt.LeftDockWidgetArea, dockWidget) # property editor propertyEditor = PropertyEditor(self._model, nodeFactory, FieldFactory()) dockWidget = QDockWidget() dockWidget.setWidget(propertyEditor) dockWidget.setWindowTitle('Property Editor') dockWidget.setObjectName('propertyEditor') propertyEditorToggleAction = dockWidget.toggleViewAction() self.addDockWidget(Qt.RightDockWidgetArea, dockWidget) # menu menuBar = self.menuBar() menu = menuBar.addMenu('&File') exitAction = menu.addAction('E&xit') exitAction.triggered.connect(self.close) menu.addAction(exitAction) menu = menuBar.addMenu('&Windows') menu.addAction(sceneGraphToggleAction) menu.addAction(propertyEditorToggleAction) menuBar.addMenu(menu) # central widget #button = QPushButton() self.setCentralWidget(self._container) # selection change event selectionModel = self._treeView.selectionModel() selectionModel.currentChanged.connect(propertyEditor.changeSelection)
def __init__(self, parent=None): super(MainWindow, self).__init__(parent) QApplication.setApplicationName('Sherloq') QApplication.setOrganizationName('Guido Bartoli') QApplication.setOrganizationDomain('www.guidobartoli.com') QApplication.setApplicationVersion(ToolTree().version) QApplication.setWindowIcon(QIcon('icons/sherloq_white.png')) self.setWindowTitle('{} {}'.format(QApplication.applicationName(), QApplication.applicationVersion())) self.mdi_area = QMdiArea() self.setCentralWidget(self.mdi_area) self.filename = None self.image = None modify_font(self.statusBar(), bold=True) tree_dock = QDockWidget(self.tr('TOOLS'), self) tree_dock.setObjectName('tree_dock') tree_dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.addDockWidget(Qt.LeftDockWidgetArea, tree_dock) self.tree_widget = ToolTree() self.tree_widget.setObjectName('tree_widget') self.tree_widget.itemDoubleClicked.connect(self.open_tool) tree_dock.setWidget(self.tree_widget) tools_action = tree_dock.toggleViewAction() tools_action.setText(self.tr('Show tools')) tools_action.setToolTip(self.tr('Toggle toolset visibility')) tools_action.setShortcut(QKeySequence(Qt.Key_Tab)) tools_action.setObjectName('tools_action') tools_action.setIcon(QIcon('icons/tools.svg')) help_action = QAction(self.tr('Show help'), self) help_action.setToolTip(self.tr('Toggle online help')) help_action.setShortcut(QKeySequence.HelpContents) help_action.setObjectName('help_action') help_action.setIcon(QIcon('icons/help.svg')) help_action.setCheckable(True) help_action.setEnabled(False) load_action = QAction(self.tr('&Load image...'), self) load_action.setToolTip(self.tr('Load an image to analyze')) load_action.setShortcut(QKeySequence.Open) load_action.triggered.connect(self.load_file) load_action.setObjectName('load_action') load_action.setIcon(QIcon('icons/load.svg')) quit_action = QAction(self.tr('&Quit'), self) quit_action.setToolTip(self.tr('Exit from Sherloq')) quit_action.setShortcut(QKeySequence.Quit) quit_action.triggered.connect(self.close) quit_action.setObjectName('quit_action') quit_action.setIcon(QIcon('icons/quit.svg')) tabbed_action = QAction(self.tr('&Tabbed'), self) tabbed_action.setToolTip(self.tr('Toggle tabbed view for window area')) tabbed_action.setShortcut(QKeySequence(Qt.Key_F10)) tabbed_action.setCheckable(True) tabbed_action.triggered.connect(self.toggle_view) tabbed_action.setObjectName('tabbed_action') tabbed_action.setIcon(QIcon('icons/tabbed.svg')) prev_action = QAction(self.tr('&Previous'), self) prev_action.setToolTip(self.tr('Select the previous tool window')) prev_action.setShortcut(QKeySequence.PreviousChild) prev_action.triggered.connect(self.mdi_area.activatePreviousSubWindow) prev_action.setObjectName('prev_action') prev_action.setIcon(QIcon('icons/previous.svg')) next_action = QAction(self.tr('&Next'), self) next_action.setToolTip(self.tr('Select the next tool window')) next_action.setShortcut(QKeySequence.NextChild) next_action.triggered.connect(self.mdi_area.activateNextSubWindow) next_action.setObjectName('next_action') next_action.setIcon(QIcon('icons/next.svg')) tile_action = QAction(self.tr('&Tile'), self) tile_action.setToolTip( self.tr('Arrange windows into non-overlapping views')) tile_action.setShortcut(QKeySequence(Qt.Key_F11)) tile_action.triggered.connect(self.mdi_area.tileSubWindows) tile_action.setObjectName('tile_action') tile_action.setIcon(QIcon('icons/tile.svg')) cascade_action = QAction(self.tr('&Cascade'), self) cascade_action.setToolTip( self.tr('Arrange windows into overlapping views')) cascade_action.setShortcut(QKeySequence(Qt.Key_F12)) cascade_action.triggered.connect(self.mdi_area.cascadeSubWindows) cascade_action.setObjectName('cascade_action') cascade_action.setIcon(QIcon('icons/cascade.svg')) close_action = QAction(self.tr('Close &All'), self) close_action.setToolTip(self.tr('Close all open tool windows')) close_action.setShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_W)) close_action.triggered.connect(self.mdi_area.closeAllSubWindows) close_action.setObjectName('close_action') close_action.setIcon(QIcon('icons/close.svg')) self.full_action = QAction(self.tr('Full screen'), self) self.full_action.setToolTip(self.tr('Switch to full screen mode')) self.full_action.setShortcut(QKeySequence.FullScreen) self.full_action.triggered.connect(self.change_view) self.full_action.setObjectName('full_action') self.full_action.setIcon(QIcon('icons/full.svg')) self.normal_action = QAction(self.tr('Normal view'), self) self.normal_action.setToolTip(self.tr('Back to normal view mode')) self.normal_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_F12)) self.normal_action.triggered.connect(self.change_view) self.normal_action.setObjectName('normal_action') self.normal_action.setIcon(QIcon('icons/normal.svg')) about_action = QAction(self.tr('&About...'), self) about_action.setToolTip(self.tr('Information about this program')) about_action.triggered.connect(self.show_about) about_action.setObjectName('about_action') about_action.setIcon(QIcon('icons/sherloq_alpha.png')) about_qt_action = QAction(self.tr('About &Qt'), self) about_qt_action.setToolTip( self.tr('Information about the Qt Framework')) about_qt_action.triggered.connect(QApplication.aboutQt) about_qt_action.setIcon(QIcon('icons/Qt.svg')) file_menu = self.menuBar().addMenu(self.tr('&File')) file_menu.addAction(load_action) file_menu.addSeparator() self.recent_actions = [None] * self.max_recent for i in range(len(self.recent_actions)): self.recent_actions[i] = QAction(self) self.recent_actions[i].setVisible(False) self.recent_actions[i].triggered.connect(self.open_recent) file_menu.addAction(self.recent_actions[i]) file_menu.addSeparator() file_menu.addAction(quit_action) view_menu = self.menuBar().addMenu(self.tr('&View')) view_menu.addAction(tools_action) view_menu.addAction(help_action) view_menu.addSeparator() view_menu.addAction(self.full_action) view_menu.addAction(self.normal_action) window_menu = self.menuBar().addMenu(self.tr('&Window')) window_menu.addAction(prev_action) window_menu.addAction(next_action) window_menu.addSeparator() window_menu.addAction(tile_action) window_menu.addAction(cascade_action) window_menu.addAction(tabbed_action) window_menu.addSeparator() window_menu.addAction(close_action) help_menu = self.menuBar().addMenu(self.tr('&Help')) help_menu.addAction(help_action) help_menu.addSeparator() help_menu.addAction(about_action) help_menu.addAction(about_qt_action) main_toolbar = self.addToolBar(self.tr('&Toolbar')) main_toolbar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) main_toolbar.addAction(load_action) main_toolbar.addSeparator() main_toolbar.addAction(tools_action) main_toolbar.addAction(help_action) main_toolbar.addSeparator() main_toolbar.addAction(prev_action) main_toolbar.addAction(next_action) main_toolbar.addSeparator() main_toolbar.addAction(tile_action) main_toolbar.addAction(cascade_action) main_toolbar.addAction(tabbed_action) main_toolbar.addAction(close_action) # main_toolbar.addSeparator() # main_toolbar.addAction(self.normal_action) # main_toolbar.addAction(self.full_action) main_toolbar.setAllowedAreas(Qt.TopToolBarArea | Qt.BottomToolBarArea) main_toolbar.setObjectName('main_toolbar') settings = QSettings() settings.beginGroup('main_window') self.restoreGeometry(settings.value('geometry')) self.restoreState(settings.value('state')) self.recent_files = settings.value('recent_files') if self.recent_files is None: self.recent_files = [] elif not isinstance(self.recent_files, list): self.recent_files = [self.recent_files] self.update_recent() settings.endGroup() prev_action.setEnabled(False) next_action.setEnabled(False) tile_action.setEnabled(False) cascade_action.setEnabled(False) close_action.setEnabled(False) tabbed_action.setEnabled(False) self.tree_widget.setEnabled(False) self.showNormal() self.normal_action.setEnabled(False) self.show_message(self.tr('Ready'))
def createDockWindows(self): # Scale self.dynamic_scale_dock = QDockWidget("Dynamic Scale", self) self.dynamic_scale_dock.setObjectName("SCALE") self.dynamic_scale_dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.scaleWidget = ScaleWidget(self, scales_model=self.scales_model, cmap_model=self.cmaps) self.dynamic_scale_dock.setWidget(self.scaleWidget) self.addDockWidget(Qt.RightDockWidgetArea, self.dynamic_scale_dock) self.viewMenu.addAction(self.dynamic_scale_dock.toggleViewAction()) self.dynamic_scale_dock.setFloating(True) self.dynamic_scale_dock.hide() #radial profiles dock = QDockWidget("Radial Profile Fit", self) dock.setObjectName("RADIAL_PROFILE_IRAF") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.radial_profile_iraf_widget = IRAFRadialProfileWidget( self.fits_image.data) dock.setWidget(self.radial_profile_iraf_widget) self.addDockWidget(Qt.RightDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) self.dockRadialFit = dock dock = QDockWidget("Radial Profile Curve", self) dock.setObjectName("RADIAL_PROFILE") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.radial_profile_widget = RadialProfileWidget(self.fits_image.data) dock.setWidget(self.radial_profile_widget) self.addDockWidget(Qt.RightDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) dock.hide() #info panel dock = QDockWidget("Info", self) dock.setObjectName("INFO_PANEL") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.info_widget = InfoWidget(self) dock.setWidget(self.info_widget) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) # FITS headers dock = QDockWidget("FITS header", self) dock.setObjectName("FTIS_DATA") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) self.headerWidget = HeaderTableWidget(self) self.headerWidget.setColumnCount(2) self.headerWidget.setHorizontalHeaderItem(0, QTableWidgetItem("KEY")) self.headerWidget.setHorizontalHeaderItem(1, QTableWidgetItem("VALUE")) self.headerWidget.horizontalHeader().setStretchLastSection(1) self.headerWidget.setEditTriggers( QtWidgets.QTableWidget.NoEditTriggers) self.headerWidget.clearFocus() dock.setWidget(self.headerWidget) # full dock = QDockWidget("Full view", self) dock.setObjectName("FULL_VIEW") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.full_view_widget = FullViewWidget(self.fits_image) self.full_view_widget.fits_image.set_scale_model(self.scales_model) self.full_view_widget.fits_image.set_cmap_model(self.cmaps) dock.setWidget(self.full_view_widget) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) # zoom dock = QDockWidget("Zoom view", self) dock.setObjectName("ZOOM_VIEW") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.zoom_view_widget = ZoomViewWidget(self.fits_image) self.zoom_view_widget.fits_image.set_scale_model(self.scales_model) self.zoom_view_widget.fits_image.set_cmap_model(self.cmaps) dock.setWidget(self.zoom_view_widget) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) # fileSelector dock = QDockWidget("Directory view", self) dock.setObjectName("DIRECTORY_VIEW") dock.setAllowedAreas(Qt.LeftDockWidgetArea) self.file_widget = FileSystemWidget(self) dock.setWidget(self.file_widget) self.addDockWidget(Qt.LeftDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) self.viewMenu.addSeparator()
class MainWindow(QMainWindow): def __init__(self, tedaCommandLine): super().__init__() self.tedaCommandLine = tedaCommandLine self.cmaps = ColorMaps() self.combobox = QComboBox() self.filename = None self.isMousePressed = False self.isCmdPressed = False self.cursor_coords = CoordinatesModel() self.scales_model = ScalesModel() fig = Figure(figsize=(14, 10)) fig.tight_layout() self.fits_image = FitsPlotter(figure=fig) fig.subplots_adjust(left=0, bottom=0.001, right=1, top=1, wspace=None, hspace=None) self.fits_image = FitsPlotterFitsFile(figure=fig, cmap_model=self.cmaps, scale_model=self.scales_model) self.central_widget = FigureCanvas(fig) self.setCentralWidget(self.central_widget) self.current_x_coord = 0 self.current_y_coord = 0 self.fullWidgetXcord = 0 self.fullWidgetYcord = 0 self.centralWidgetcordX = 0 self.centralWidgetcordY = 0 self.painterComponent = PainterComponent(self.fits_image) # self.painterComponent.startMovingEvents(self.central_widget) self.painterComponent.setCanvas(self.central_widget) self.scanObject = ScanToolbar(self) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.createDockWindows() if not self.tedaCommandLine.ignoreSettings: self.scaleWidget.readSlidersValues() # self.defineButtonsActions() self.setWindowTitle("TeDa") self.painterComponent.observe( lambda change: self.onAutoCenterChange(change), ['auto_center']) self.readWindowSettings() self.readAppState() self.updateHeaderData() self.dragging = draggingComponent.Dragging( widget=self, scale_widget=self.scaleWidget) self.activeLinearAdjustmentByMouseMovement() # Observing here may be to late for values loaded from settings e.g. via readAppState self.painterComponent.observe( lambda change: self.onCenterCircleChange(change), ['ccenter_x', 'ccenter_y']) self.painterComponent.observe( lambda change: self.onCenterCircleRadiusChange(change), ['cradius']) self.fits_image.observe(lambda change: self.onMouseMoveOnImage(change), ['mouse_xdata', 'mouse_ydata']) # self.cmaps.observe(lambda change: self.on_colormap_change(change)) self.full_view_widget.painterComponent.observe( lambda change: self.onRectangleInWidgetMove(change), ['viewX', 'viewY']) self.painterComponent.observe( lambda change: self.movingCentralWidget(change), ['movingViewX', 'movingViewY']) self.fits_image.observe(lambda change: self.onMouseZoomOnImage(change), ['viewBounaries_versionno']) # open last fits try: self.openLastFits() except FileNotFoundError: print('Błąd w odczycie lub brak ostatio wczytanego pliku') def closeEvent(self, event: PySide2.QtGui.QCloseEvent): self.writeAppState() self.writeWindowSettings() if not self.tedaCommandLine.ignoreSettings: self.scaleWidget.writeSlidersValues() super().closeEvent(event) def keyPressEvent(self, e): if e.key() == Qt.Key_Delete: self.deleteSelected() if e.key() == Qt.Key_R: action = self.dockRadialFit.toggleViewAction() if not action.isChecked(): action.trigger() if (self.cursor_coords.img_x != 0 and self.cursor_coords.img_x != None) and (self.cursor_coords.img_y != 0 and self.cursor_coords.img_y != None): self.painterComponent.add(self.cursor_coords.img_x, self.cursor_coords.img_y, type="circleCenter") self.painterComponent.paintAllShapes( self.central_widget.figure.axes[0]) if e.key() == Qt.Key_Control: self.isCmdPressed = True def keyReleaseEvent(self, event: PySide2.QtGui.QKeyEvent): if event.key() == Qt.Key_Control: self.isCmdPressed = False def canvasMousePressEvent(self, event): self.isMousePressed = not self.isMousePressed def mouseMoveEventOnCanvas(self, event): if self.isCmdPressed: if self.isMousePressed: self.dragging.mouseMoveEvent(event) def print_(self): document = self.textEdit.document() printer = QPrinter() dlg = QPrintDialog(printer, self) if dlg.exec_() != QDialog.Accepted: return document.print_(printer) self.statusBar().showMessage("Ready", 2000) def open_dialog(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open Image", ".", "Fits files (*.fits)") if fileName: self.open_fits(fileName) def save(self): filename, _ = QFileDialog.getSaveFileName(self, "Choose a file name", '.', "HTML (*.html *.htm)") if not filename: return file = QFile(filename) if not file.open(QFile.WriteOnly | QFile.Text): QMessageBox.warning( self, "Dock Widgets", "Cannot write file %s:\n%s." % (filename, file.errorString())) return out = QTextStream(file) QApplication.setOverrideCursor(Qt.WaitCursor) out << self.textEdit.toHtml() QApplication.restoreOverrideCursor() self.statusBar().showMessage("Saved '%s'" % filename, 2000) def save_dialog(self): figure = self.central_widget.figure filetypes = figure.canvas.get_supported_filetypes_grouped() filterstr = ';;'.join([ k + ' (' + ' '.join(['*.' + ext for ext in v]) + ')' for k, v in filetypes.items() ]) dialog = QFileDialog.getSaveFileName( self, "Save Image As...", os.path.splitext(self.filename)[0], filterstr) if dialog[0] != "": try: self.central_widget.figure.savefig(dialog[0]) except ValueError: print("Unsupported format") def open_fits(self, fileName): """Opens specified FITS file and loads it to user interface""" self.fits_image.set_file(fileName) self.filename = fileName self.cursor_coords.set_wcs_from_fits( self.fits_image.header ) # TODO: one up and extract and set wcs in fits_image before plot self.fits_image.set_wcs(self.cursor_coords.wcs) self.fits_image.plot() self.radial_profile_widget.set_data(self.fits_image.data) self.radial_profile_iraf_widget.set_data(self.fits_image.data) self.updateHeaderData() self.zoom_view_widget.updateFits(self.fits_image) self.full_view_widget.updateFits(self.fits_image) self.saveLastFits() def saveLastFits(self): if self.tedaCommandLine.ignoreSettings: return settings = QSettings() settings.beginGroup("Files") settings.setValue("lastFile", self.filename) settings.endGroup() def openLastFits(self): if (self.tedaCommandLine.openFile is None): if self.tedaCommandLine.ignoreSettings: return settings = QSettings() settings.beginGroup("Files") filename = settings.value("lastFile") settings.endGroup() else: filename = self.tedaCommandLine.openFile if filename: self.open_fits(filename) def readAppState(self): if self.tedaCommandLine.ignoreSettings: return settings = QSettings() settings.beginGroup("WCS") self.wcsSexAct.setChecked(bool(settings.value("sexagesimal", True))) self.wcsGridAct.setChecked(bool(settings.value("grid", False))) settings.endGroup() settings.beginGroup("paint") self.painterComponent.auto_center = bool( settings.value("auto_center", True)) settings.endGroup() def writeAppState(self): if self.tedaCommandLine.ignoreSettings: return settings = QSettings() settings.beginGroup("WCS") settings.setValue("sexagesimal", self.wcsSexAct.isChecked()) settings.setValue("grid", self.wcsGridAct.isChecked()) settings.endGroup() settings.beginGroup("paint") settings.setValue("auto_center", self.painterComponent.auto_center) settings.endGroup() def undo(self): document = self.textEdit.document() document.undo() def insertCustomer(self, customer): if not customer: return def addParagraph(self, paragraph): if not paragraph: return def about(self): QMessageBox.about( self, "TeDa FITS Viewer", f"TeDa FITS Viewer {__version__} <br/>" "Authors: <ul> " "<li>Michał Brodniak</li>" "<li>Konrad Górski</li>" "<li>Mikołaj Kałuszyński</li>" "<li>Edward Lis</li>" "<li>Grzegorz Mroczkowski</li>" "</ul>" "Created by <a href='https://akond.com'>Akond Lab</a> for The " "<a href='https://araucaria.camk.edu.pl'>Araucaria Project</a><br/>" "Licence: MIT <br/>" "3rd party work used: " "<a href='https://material.io/resources/icons/'> Google Material Icons</a>, " "<a href='https://www.astropy.org'> AstroPy</a>, " "<a href='https://doc.qt.io/qtforpython/'> Qt5/PySide2</a>, " "<a href='https://www.scipy.org'> SciPy</a>, and other..." "<br/><br/>" "Visit the <a href='https://github.com/majkelx/teda'>project's GitHub page</a> for help" " and the issue tracker") def on_console_show(self): console.show(ax=self.fits_image.ax, window=self, data=self.fits_image.data, header=self.fits_image.header, wcs=self.cursor_coords.wcs) def on_sex_toggle(self): print('sex toggled to :', self.wcsSexAct.isChecked()) self.cursor_coords.wcs_sexagesimal = self.wcsSexAct.isChecked() def on_grid_toggle(self): self.fits_image.plot_grid = self.wcsGridAct.isChecked() def createActions(self): # ico1 = QPixmap('/Users/mka/projects/astro/teda/icons/png.png') # self.openAct = QAction(ico1, "&Open", self, shortcut=QKeySequence.Open, statusTip="Open FITS file", triggered=self.open) self.openAct = QAction(IconFactory.getIcon('note_add'), "&Open", self, shortcut=QKeySequence.Open, statusTip="Open FITS file", triggered=self.open_dialog) self.saveAct = QAction(IconFactory.getIcon('save'), "&Save", self, shortcut=QKeySequence.Save, statusTip="Save FITS view", triggered=self.save_dialog) self.quitAct = QAction("&Quit", self, shortcut="Ctrl+Q", statusTip="Quit the application", triggered=self.close) 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) self.qtConsoleAct = QAction('Python Console', self, statusTip="Open IPython console window", triggered=self.on_console_show) self.wcsSexAct = QAction( 'Sexagesimal', self, statusTip= "Format WCS coordinates as sexagesimal (RA in hour angle) instead of decimal deg" ) self.wcsSexAct.toggled.connect(self.on_sex_toggle) self.wcsSexAct.setCheckable(True) self.wcsGridAct = QAction( 'Show Grid', self, statusTip="Overlay WCS coordinates grid over image", ) self.wcsGridAct.setCheckable(True) self.wcsGridAct.toggled.connect(self.on_grid_toggle) self.prevHDUAct = QAction(IconFactory.getIcon('skip_previous'), 'Prev HDU', self, statusTip="Previous HDU", triggered=self.prevHDU) self.nextHDUAct = QAction(IconFactory.getIcon('skip_next'), 'Next HDU', self, statusTip="Next HDU", triggered=self.nextHDU) self.zoom4Act = QAction(IconFactory.getIcon("x4"), 'Zoom ×4', self, statusTip="Zoom ×4", triggered=self.setZoomButton4) self.zoom2Act = QAction(IconFactory.getIcon("x2"), 'Zoom ×2', self, statusTip="Zoom ×2", triggered=self.setZoomButton2) self.zoomHomeAct = QAction(IconFactory.getIcon('home'), 'Home', self, statusTip="Reset zoom an position", triggered=self.setZoomButtonHome) self.zoom05Act = QAction(IconFactory.getIcon("1-2"), 'Zoom 1/2', self, statusTip="Zoom 1/2", triggered=self.setZoomButton05) self.zoom025Act = QAction(IconFactory.getIcon("1-4"), 'Zoom 1/4', self, statusTip="Zoom 1/4", triggered=self.setZoomButton025) self.panningAct = QAction(IconFactory.getIcon('panning'), 'Panning', self, statusTip="Panning", triggered=self.changePanningStatus) self.circleAct = QAction(IconFactory.getIcon('circle'), 'Add Region', self, statusTip="Add Region", triggered=self.changeAddCircleStatus) self.centerCircleAct = QAction( IconFactory.getIcon('add_circle_outline'), 'Radial profile', self, statusTip="Radial profile with gaussoide fit [R]-key", triggered=self.changeAddCenterCircleStatus) self.autoCenterAct = QAction( 'Auto Center', self, statusTip="Automatically center cursor on star centroid", triggered=self.changeAutoCenter) self.deleteAct = QAction(IconFactory.getIcon('delete_forever'), 'Delete selected', self, statusTip="Delete selected [Del]-key", triggered=self.deleteSelected) self.slidersAct = QAction( IconFactory.getIcon('slider'), 'Dynamic Scale Sliders', self, statusTip='Show/Hide Dynamic Scale', triggered=self.dynamicScaleDockWidgetTriggerActions) self.panningAct.setCheckable(True) self.panningAct.setChecked(True) self.circleAct.setCheckable(True) self.autoCenterAct.setCheckable(True) self.autoCenterAct.setChecked(self.painterComponent.auto_center) self.centerCircleAct.setCheckable(True) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.scanObject.scanAct) self.fileMenu.addAction(self.scanObject.stopAct) self.fileMenu.addAction(self.scanObject.pauseAct) self.fileMenu.addAction(self.scanObject.resumeAct) self.fileMenu.addAction(self.scanObject.autopauseAct) self.fileMenu.addAction(self.scanObject.disabledautopauseAct) self.fileMenu.addAction(self.saveAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.quitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.panningAct) self.editMenu.addAction(self.circleAct) self.editMenu.addAction(self.centerCircleAct) self.editMenu.addSeparator() self.editMenu.addAction(self.autoCenterAct) self.editMenu.addSeparator() self.editMenu.addAction(self.deleteAct) self.hduMenu = self.menuBar().addMenu("HDU") self.hduMenu.addAction(self.prevHDUAct) self.hduMenu.addAction(self.nextHDUAct) self.hduMenu.addSeparator() self.zoomMenu = self.menuBar().addMenu("Zoom") self.zoomMenu.addAction(self.zoom4Act) self.zoomMenu.addAction(self.zoom2Act) self.zoomMenu.addAction(self.zoomHomeAct) self.zoomMenu.addAction(self.zoom05Act) self.zoomMenu.addAction(self.zoom025Act) self.WcsMenu = self.menuBar().addMenu("W&CS") self.WcsMenu.addAction(self.wcsSexAct) self.WcsMenu.addSeparator() self.WcsMenu.addAction(self.wcsGridAct) self.viewMenu = self.menuBar().addMenu("&View") self.viewMenu.addAction(self.qtConsoleAct) self.viewMenu.addSeparator() 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 Toolbar") self.fileToolBar.addAction(self.openAct) self.fileToolBar.addAction(self.saveAct) self.hduToolBar = self.addToolBar("HDU Toolbar") self.hduToolBar.addAction(self.prevHDUAct) self.hduToolBar.addAction(self.nextHDUAct) self.scanToolBar = self.addToolBar("Scan Toolbar") self.scanToolBar.addAction(self.scanObject.scanAct) self.scanToolBar.addAction(self.scanObject.stopAct) self.scanToolBar.addAction(self.scanObject.pauseAct) self.scanToolBar.addAction(self.scanObject.resumeAct) self.scanToolBar.addAction(self.scanObject.autopauseAct) self.scanToolBar.addAction(self.scanObject.disabledautopauseAct) self.scanToolBar.hide() # self.infoToolBar = self.addToolBar("Info Toolbar") # self.mouse_x_label = QLabel('100.1') # self.mouse_y_label = QLabel('100.145') # self.infoToolBar.addWidget(QLabel('image x:')) # self.infoToolBar.addWidget(self.mouse_x_label) # self.infoToolBar.addWidget(QLabel('y:')) # self.infoToolBar.addWidget(self.mouse_y_label) # self.infoToolBar.hide() self.zoomToolBar = self.addToolBar("Zoom Toolbar") self.zoomToolBar.addAction(self.zoom4Act) self.zoomToolBar.addAction(self.zoom2Act) self.zoomToolBar.addAction(self.zoomHomeAct) self.zoomToolBar.addAction(self.zoom05Act) self.zoomToolBar.addAction(self.zoom025Act) self.mouseActionToolBar = self.addToolBar("Mouse Task Toolbar") self.mouseActionToolBar.addAction(self.panningAct) self.mouseActionToolBar.addAction(self.circleAct) self.mouseActionToolBar.addAction(self.centerCircleAct) self.mouseActionToolBar.addAction(self.deleteAct) self.sliderToolBar = self.addToolBar("Slider Toolbar") self.slidersAct.setChecked(True) self.sliderToolBar.addAction(self.slidersAct) self.viewMenu.addAction(self.fileToolBar.toggleViewAction()) self.viewMenu.addAction(self.hduToolBar.toggleViewAction()) self.viewMenu.addAction(self.scanToolBar.toggleViewAction()) # self.viewMenu.addAction(self.infoToolBar.toggleViewAction()) self.viewMenu.addAction(self.zoomToolBar.toggleViewAction()) self.viewMenu.addAction(self.mouseActionToolBar.toggleViewAction()) self.viewMenu.addAction(self.sliderToolBar.toggleViewAction()) self.viewMenu.addSeparator() def nextHDU(self): self.fits_image.changeHDU(True, 1) self.updateHeaderData() def prevHDU(self): self.fits_image.changeHDU(True, -1) self.updateHeaderData() def updateHeaderData(self): self.headerWidget.setHeader() self.prevHDUAct.setEnabled(self.fits_image._huds is not None and self.fits_image.hdu != 0) self.nextHDUAct.setEnabled( self.fits_image._huds is not None and self.fits_image.hdu != len(self.fits_image._huds) - 1) def setZoomButton4(self): self.setZoomButton(4, False) def setZoomButton2(self): self.setZoomButton(2, False) def setZoomButtonHome(self): self.setZoomButton(1, True) def setZoomButton05(self): self.setZoomButton(0.5, False) def setZoomButton025(self): self.setZoomButton(0.25, False) def setZoomButton(self, zoom: float, reset: bool): if self.fits_image.ax != None: self.fits_image.setZoom(zoom, reset) self.full_view_widget.updateMiniatureShape(self.fits_image.viewX, self.fits_image.viewY, self.fits_image.viewW, self.fits_image.viewH) def changePanningStatus(self): if self.panningAct.isChecked(): self.toogleOffRegionButtons() self.panningAct.toggle() self.painterComponent.stopPainting(self.central_widget) self.painterComponent.startMovingEvents(self.central_widget) else: self.painterComponent.stopPainting(self.central_widget) self.painterComponent.stopMovingEvents(self.central_widget) def changeAddCircleStatus(self): if self.circleAct.isChecked(): self.toogleOffRegionButtons() self.circleAct.toggle() self.painterComponent.startPainting(self.central_widget, "circle") else: self.painterComponent.stopPainting(self.central_widget) self.painterComponent.startMovingEvents(self.central_widget) self.panningAct.toggle() def changeAddCenterCircleStatus(self): if self.centerCircleAct.isChecked(): self.toogleOffRegionButtons() self.centerCircleAct.toggle() self.painterComponent.startPainting(self.central_widget, "circleCenter") else: self.painterComponent.stopPainting(self.central_widget) self.painterComponent.startMovingEvents(self.central_widget) self.panningAct.toggle() def changeAutoCenter(self): self.painterComponent.auto_center = self.autoCenterAct.isChecked() def deleteSelected(self): self.painterComponent.deleteSelectedShapes( self.central_widget.figure.axes[0]) def toogleOffRegionButtons(self): if self.panningAct.isChecked(): self.panningAct.toggle() if self.circleAct.isChecked(): self.circleAct.toggle() if self.centerCircleAct.isChecked(): self.centerCircleAct.toggle() self.painterComponent.stopPainting(self.central_widget) def createStatusBar(self): self.statusBar().showMessage("Ready") def createDockWindows(self): # Scale self.dynamic_scale_dock = QDockWidget("Dynamic Scale", self) self.dynamic_scale_dock.setObjectName("SCALE") self.dynamic_scale_dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.scaleWidget = ScaleWidget(self, scales_model=self.scales_model, cmap_model=self.cmaps) self.dynamic_scale_dock.setWidget(self.scaleWidget) self.addDockWidget(Qt.RightDockWidgetArea, self.dynamic_scale_dock) self.viewMenu.addAction(self.dynamic_scale_dock.toggleViewAction()) self.dynamic_scale_dock.setFloating(True) self.dynamic_scale_dock.hide() #radial profiles dock = QDockWidget("Radial Profile Fit", self) dock.setObjectName("RADIAL_PROFILE_IRAF") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.radial_profile_iraf_widget = IRAFRadialProfileWidget( self.fits_image.data) dock.setWidget(self.radial_profile_iraf_widget) self.addDockWidget(Qt.RightDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) self.dockRadialFit = dock dock = QDockWidget("Radial Profile Curve", self) dock.setObjectName("RADIAL_PROFILE") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.radial_profile_widget = RadialProfileWidget(self.fits_image.data) dock.setWidget(self.radial_profile_widget) self.addDockWidget(Qt.RightDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) dock.hide() #info panel dock = QDockWidget("Info", self) dock.setObjectName("INFO_PANEL") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.info_widget = InfoWidget(self) dock.setWidget(self.info_widget) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) # FITS headers dock = QDockWidget("FITS header", self) dock.setObjectName("FTIS_DATA") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) self.headerWidget = HeaderTableWidget(self) self.headerWidget.setColumnCount(2) self.headerWidget.setHorizontalHeaderItem(0, QTableWidgetItem("KEY")) self.headerWidget.setHorizontalHeaderItem(1, QTableWidgetItem("VALUE")) self.headerWidget.horizontalHeader().setStretchLastSection(1) self.headerWidget.setEditTriggers( QtWidgets.QTableWidget.NoEditTriggers) self.headerWidget.clearFocus() dock.setWidget(self.headerWidget) # full dock = QDockWidget("Full view", self) dock.setObjectName("FULL_VIEW") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.full_view_widget = FullViewWidget(self.fits_image) self.full_view_widget.fits_image.set_scale_model(self.scales_model) self.full_view_widget.fits_image.set_cmap_model(self.cmaps) dock.setWidget(self.full_view_widget) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) # zoom dock = QDockWidget("Zoom view", self) dock.setObjectName("ZOOM_VIEW") dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.TopDockWidgetArea) self.zoom_view_widget = ZoomViewWidget(self.fits_image) self.zoom_view_widget.fits_image.set_scale_model(self.scales_model) self.zoom_view_widget.fits_image.set_cmap_model(self.cmaps) dock.setWidget(self.zoom_view_widget) self.addDockWidget(Qt.TopDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) # fileSelector dock = QDockWidget("Directory view", self) dock.setObjectName("DIRECTORY_VIEW") dock.setAllowedAreas(Qt.LeftDockWidgetArea) self.file_widget = FileSystemWidget(self) dock.setWidget(self.file_widget) self.addDockWidget(Qt.LeftDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) self.viewMenu.addSeparator() # def changeColor(self, color): # self.cmaps.set_active_color_map(color) # def on_colormap_change(self, change): # self.fits_image.cmap = self.cmaps.get_active_color_map() # self.fits_image.plot() # self.updateFitsInWidgets() def onAutoCenterChange(self, change): self.autoCenterAct.setChecked(change.new) def dynamicScaleDockWidgetTriggerActions(self): if self.dynamic_scale_dock.isHidden(): self.dynamic_scale_dock.show() else: self.dynamic_scale_dock.hide() def onCenterCircleChange(self, change): self.radial_profile_widget.set_centroid( self.painterComponent.ccenter_x, self.painterComponent.ccenter_y) self.radial_profile_iraf_widget.set_centroid( self.painterComponent.ccenter_x, self.painterComponent.ccenter_y) def onCenterCircleRadiusChange(self, change): self.radial_profile_widget.set_radius(self.painterComponent.cradius) self.radial_profile_iraf_widget.set_radius( self.painterComponent.cradius) def onRectangleInWidgetMove(self, change): changed = False if change.new is not None: changed = True if change.name == 'viewX': self.fullWidgetXcord = change.new elif change.name == 'viewY': self.fullWidgetYcord = change.new if changed: self.fits_image.moveToXYcords(self.fullWidgetXcord, self.fullWidgetYcord) def movingCentralWidget(self, change): changed = False if change.new is not None: changed = True if change.name == 'movingViewX': self.centralWidgetcordX = change.new elif change.name == 'movingViewY': self.centralWidgetcordY = change.new if changed: self.full_view_widget.updateMiniatureShapeXYonly( self.centralWidgetcordX, self.centralWidgetcordY) def onMouseMoveOnImage(self, change): display = '' val = 0 if change.new is not None: display = f'{change.new:f}' val = change.new if change.name == 'mouse_xdata': # self.mouse_x_label.setText(display) self.current_x_coord = val self.cursor_coords.set_img_x(change.new) elif change.name == 'mouse_ydata': # self.mouse_y_label.setText(display) self.current_y_coord = val self.cursor_coords.set_img_y(change.new) if display != '': self.zoom_view_widget.setXYofZoom(self.fits_image, self.current_x_coord, self.current_y_coord, self.fits_image.zoom) if not self.hasFocus(): self.setFocus() if self.scanObject.activeScan and self.scanObject.enableAutopause: #reser autopause if not self.scanObject.obserwableValue.autopauseFlag: self.scanObject.obserwableValue.autopauseFlag = True def activeLinearAdjustmentByMouseMovement(self): self.central_widget.mpl_connect('motion_notify_event', self.mouseMoveEventOnCanvas) self.central_widget.mpl_connect('button_press_event', self.canvasMousePressEvent) self.central_widget.mpl_connect('button_release_event', self.canvasMousePressEvent) def onMouseZoomOnImage(self, change): changed = False if change.new is not None: changed = True if changed: self.full_view_widget.updateMiniatureShape(self.fits_image.viewX, self.fits_image.viewY, self.fits_image.viewW, self.fits_image.viewH) def readWindowSettings(self): if self.tedaCommandLine.ignoreSettings: return settings = QSettings() settings.beginGroup("MainWindow") size, pos = settings.value("size"), settings.value("pos") settings.endGroup() if size is not None and pos is not None: print('settings: resize to {} and move to {}', size, pos) self.move(pos) # self.resize(size) print('Size reported ', self.size()) print('Size set ', size) self.resize(size) print('Size reported ', self.size()) else: self.resize(800, 600) geometry = settings.value("geometry") if geometry is not None: self.restoreGeometry(geometry) self.restoreState(settings.value("windowState")) self.headerWidget.readSettings(settings) self.file_widget.readSettings(settings) def writeWindowSettings(self): if self.tedaCommandLine.ignoreSettings: return settings = QSettings() settings.beginGroup("MainWindow") settings.setValue("size", self.size()) settings.setValue("pos", self.pos()) settings.endGroup() settings.setValue('geometry', self.saveGeometry()) settings.setValue('windowState', self.saveState()) self.headerWidget.writeSettings(settings) self.file_widget.writeSettings(settings)
def __init__(self, parent=None): super(MainWindow, self).__init__(parent) QApplication.setApplicationName("Sherloq") QApplication.setOrganizationName("Guido Bartoli") QApplication.setOrganizationDomain("www.guidobartoli.com") QApplication.setApplicationVersion(ToolTree().version) QApplication.setWindowIcon(QIcon("icons/sherloq_white.png")) self.setWindowTitle( f"{QApplication.applicationName()} {QApplication.applicationVersion()}" ) self.mdi_area = QMdiArea() self.setCentralWidget(self.mdi_area) self.filename = None self.image = None modify_font(self.statusBar(), bold=True) tree_dock = QDockWidget(self.tr("TOOLS"), self) tree_dock.setObjectName("tree_dock") tree_dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.addDockWidget(Qt.LeftDockWidgetArea, tree_dock) self.tree_widget = ToolTree() self.tree_widget.setObjectName("tree_widget") self.tree_widget.itemDoubleClicked.connect(self.open_tool) tree_dock.setWidget(self.tree_widget) tools_action = tree_dock.toggleViewAction() tools_action.setText(self.tr("Show tools")) tools_action.setToolTip(self.tr("Toggle toolset visibility")) tools_action.setShortcut(QKeySequence(Qt.Key_Tab)) tools_action.setObjectName("tools_action") tools_action.setIcon(QIcon("icons/tools.svg")) help_action = QAction(self.tr("Show help"), self) help_action.setToolTip(self.tr("Toggle online help")) help_action.setShortcut(QKeySequence.HelpContents) help_action.setObjectName("help_action") help_action.setIcon(QIcon("icons/help.svg")) help_action.setCheckable(True) help_action.setEnabled(False) load_action = QAction(self.tr("&Load image..."), self) load_action.setToolTip(self.tr("Load an image to analyze")) load_action.setShortcut(QKeySequence.Open) load_action.triggered.connect(self.load_file) load_action.setObjectName("load_action") load_action.setIcon(QIcon("icons/load.svg")) quit_action = QAction(self.tr("&Quit"), self) quit_action.setToolTip(self.tr("Exit from Sherloq")) quit_action.setShortcut(QKeySequence.Quit) quit_action.triggered.connect(self.close) quit_action.setObjectName("quit_action") quit_action.setIcon(QIcon("icons/quit.svg")) tabbed_action = QAction(self.tr("&Tabbed"), self) tabbed_action.setToolTip(self.tr("Toggle tabbed view for window area")) tabbed_action.setShortcut(QKeySequence(Qt.Key_F10)) tabbed_action.setCheckable(True) tabbed_action.triggered.connect(self.toggle_view) tabbed_action.setObjectName("tabbed_action") tabbed_action.setIcon(QIcon("icons/tabbed.svg")) prev_action = QAction(self.tr("&Previous"), self) prev_action.setToolTip(self.tr("Select the previous tool window")) prev_action.setShortcut(QKeySequence.PreviousChild) prev_action.triggered.connect(self.mdi_area.activatePreviousSubWindow) prev_action.setObjectName("prev_action") prev_action.setIcon(QIcon("icons/previous.svg")) next_action = QAction(self.tr("&Next"), self) next_action.setToolTip(self.tr("Select the next tool window")) next_action.setShortcut(QKeySequence.NextChild) next_action.triggered.connect(self.mdi_area.activateNextSubWindow) next_action.setObjectName("next_action") next_action.setIcon(QIcon("icons/next.svg")) tile_action = QAction(self.tr("&Tile"), self) tile_action.setToolTip( self.tr("Arrange windows into non-overlapping views")) tile_action.setShortcut(QKeySequence(Qt.Key_F11)) tile_action.triggered.connect(self.mdi_area.tileSubWindows) tile_action.setObjectName("tile_action") tile_action.setIcon(QIcon("icons/tile.svg")) cascade_action = QAction(self.tr("&Cascade"), self) cascade_action.setToolTip( self.tr("Arrange windows into overlapping views")) cascade_action.setShortcut(QKeySequence(Qt.Key_F12)) cascade_action.triggered.connect(self.mdi_area.cascadeSubWindows) cascade_action.setObjectName("cascade_action") cascade_action.setIcon(QIcon("icons/cascade.svg")) close_action = QAction(self.tr("Close &All"), self) close_action.setToolTip(self.tr("Close all open tool windows")) close_action.setShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_W)) close_action.triggered.connect(self.mdi_area.closeAllSubWindows) close_action.setObjectName("close_action") close_action.setIcon(QIcon("icons/close.svg")) self.full_action = QAction(self.tr("Full screen"), self) self.full_action.setToolTip(self.tr("Switch to full screen mode")) self.full_action.setShortcut(QKeySequence.FullScreen) self.full_action.triggered.connect(self.change_view) self.full_action.setObjectName("full_action") self.full_action.setIcon(QIcon("icons/full.svg")) self.normal_action = QAction(self.tr("Normal view"), self) self.normal_action.setToolTip(self.tr("Back to normal view mode")) self.normal_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_F12)) self.normal_action.triggered.connect(self.change_view) self.normal_action.setObjectName("normal_action") self.normal_action.setIcon(QIcon("icons/normal.svg")) about_action = QAction(self.tr("&About..."), self) about_action.setToolTip(self.tr("Information about this program")) about_action.triggered.connect(self.show_about) about_action.setObjectName("about_action") about_action.setIcon(QIcon("icons/sherloq_alpha.png")) about_qt_action = QAction(self.tr("About &Qt"), self) about_qt_action.setToolTip( self.tr("Information about the Qt Framework")) about_qt_action.triggered.connect(QApplication.aboutQt) about_qt_action.setIcon(QIcon("icons/Qt.svg")) file_menu = self.menuBar().addMenu(self.tr("&File")) file_menu.addAction(load_action) file_menu.addSeparator() self.recent_actions = [None] * self.max_recent for i in range(len(self.recent_actions)): self.recent_actions[i] = QAction(self) self.recent_actions[i].setVisible(False) self.recent_actions[i].triggered.connect(self.open_recent) file_menu.addAction(self.recent_actions[i]) file_menu.addSeparator() file_menu.addAction(quit_action) view_menu = self.menuBar().addMenu(self.tr("&View")) view_menu.addAction(tools_action) view_menu.addAction(help_action) view_menu.addSeparator() view_menu.addAction(self.full_action) view_menu.addAction(self.normal_action) window_menu = self.menuBar().addMenu(self.tr("&Window")) window_menu.addAction(prev_action) window_menu.addAction(next_action) window_menu.addSeparator() window_menu.addAction(tile_action) window_menu.addAction(cascade_action) window_menu.addAction(tabbed_action) window_menu.addSeparator() window_menu.addAction(close_action) help_menu = self.menuBar().addMenu(self.tr("&Help")) help_menu.addAction(help_action) help_menu.addSeparator() help_menu.addAction(about_action) help_menu.addAction(about_qt_action) main_toolbar = self.addToolBar(self.tr("&Toolbar")) main_toolbar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) main_toolbar.addAction(load_action) main_toolbar.addSeparator() main_toolbar.addAction(tools_action) main_toolbar.addAction(help_action) main_toolbar.addSeparator() main_toolbar.addAction(prev_action) main_toolbar.addAction(next_action) main_toolbar.addSeparator() main_toolbar.addAction(tile_action) main_toolbar.addAction(cascade_action) main_toolbar.addAction(tabbed_action) main_toolbar.addAction(close_action) # main_toolbar.addSeparator() # main_toolbar.addAction(self.normal_action) # main_toolbar.addAction(self.full_action) main_toolbar.setAllowedAreas(Qt.TopToolBarArea | Qt.BottomToolBarArea) main_toolbar.setObjectName("main_toolbar") settings = QSettings() settings.beginGroup("main_window") self.restoreGeometry(settings.value("geometry")) self.restoreState(settings.value("state")) self.recent_files = settings.value("recent_files") if self.recent_files is None: self.recent_files = [] elif not isinstance(self.recent_files, list): self.recent_files = [self.recent_files] self.update_recent() settings.endGroup() prev_action.setEnabled(False) next_action.setEnabled(False) tile_action.setEnabled(False) cascade_action.setEnabled(False) close_action.setEnabled(False) tabbed_action.setEnabled(False) self.tree_widget.setEnabled(False) self.showNormal() self.normal_action.setEnabled(False) self.show_message(self.tr("Ready"))
def create_ui(self): """Setup main UI elements, dock widgets, UI-related elements, etc. """ log.debug('Loading UI') # Undo Stack self.undo_stack = QUndoStack(self) self.undo_stack.setUndoLimit(100) # Object navigation history self.obj_history = deque([], config.MAX_OBJ_HISTORY) app = QApplication.instance() base_font = QFont() base_font.fromString(self.prefs['base_font']) app.setFont(base_font) # Object class table widget # classTable = QTableView(self) classTable = classtable.TableView(self) classTable.setObjectName("classTable") classTable.setAlternatingRowColors(True) classTable.setFrameShape(QFrame.StyledPanel) classTable_font = QFont() classTable_font.fromString(self.prefs['class_table_font']) classTable.setFont(classTable_font) fm = classTable.fontMetrics() classTable.setWordWrap(True) classTable.setEditTriggers(QAbstractItemView.EditKeyPressed | QAbstractItemView.DoubleClicked | QAbstractItemView.AnyKeyPressed | QAbstractItemView.SelectedClicked) # classTable.horizontalHeader().setMovable(True) # classTable.verticalHeader().setMovable(False) classTable.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive) classTable.verticalHeader().setSectionResizeMode(QHeaderView.Interactive) classTable.horizontalHeader().setDefaultSectionSize(self.prefs['default_column_width']) classTable.verticalHeader().setDefaultSectionSize(fm.height() + 0) classTable.setSelectionMode(QAbstractItemView.ExtendedSelection) classTable.setContextMenuPolicy(Qt.CustomContextMenu) classTable.customContextMenuRequested.connect(self.custom_table_context_menu) # Create table model and proxy layers for transposing and filtering self.classTableModel = classtable.IDFObjectTableModel(classTable) self.transposeableModel = classtable.TransposeProxyModel(self.classTableModel) self.transposeableModel.setSourceModel(self.classTableModel) self.sortableModel = classtable.SortFilterProxyModel(self.transposeableModel) self.sortableModel.setSourceModel(self.transposeableModel) # Assign model to table (enable sorting FIRST) # table.setSortingEnabled(True) # Disable for now, CRUD actions won't work! classTable.setModel(self.sortableModel) # Connect some signals selection_model = classTable.selectionModel() selection_model.selectionChanged.connect(self.table_selection_changed) scroll_bar = classTable.verticalScrollBar() scroll_bar.valueChanged.connect(self.scroll_changed) # These are currently broken # classTable.horizontalHeader().sectionMoved.connect(self.moveObject) # classTable.verticalHeader().sectionMoved.connect(self.moveObject) # Object class tree widget classTreeDockWidget = QDockWidget("Object Classes and Counts", self) classTreeDockWidget.setObjectName("classTreeDockWidget") classTreeDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas) classTree = QTreeView(classTreeDockWidget) classTree.setUniformRowHeights(True) classTree.setAllColumnsShowFocus(True) classTree.setRootIsDecorated(False) classTree.setExpandsOnDoubleClick(True) classTree.setIndentation(15) classTree.setAnimated(True) classTree_font = QFont() classTree_font.fromString(self.prefs['class_tree_font']) classTree.setFont(classTree_font) classTree.setAlternatingRowColors(True) classTree.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) palette = classTree.palette() palette.setColor(QPalette.Highlight, Qt.darkCyan) classTree.setPalette(palette) class_tree_window = QWidget(classTreeDockWidget) class_tree_dock_layout_v = QVBoxLayout() class_tree_dock_layout_h = QHBoxLayout() class_tree_dock_layout_v.setContentsMargins(0, 8, 0, 0) class_tree_dock_layout_h.setContentsMargins(0, 0, 0, 0) class_tree_filter_edit = QLineEdit(classTreeDockWidget) class_tree_filter_edit.setPlaceholderText("Filter Classes") class_tree_filter_edit.textChanged.connect(self.treeFilterRegExpChanged) class_tree_filter_cancel = QPushButton("Clear", classTreeDockWidget) class_tree_filter_cancel.setMaximumWidth(45) class_tree_filter_cancel.clicked.connect(self.clearTreeFilterClicked) class_tree_dock_layout_h.addWidget(class_tree_filter_edit) class_tree_dock_layout_h.addWidget(class_tree_filter_cancel) class_tree_dock_layout_v.addLayout(class_tree_dock_layout_h) class_tree_dock_layout_v.addWidget(classTree) class_tree_window.setLayout(class_tree_dock_layout_v) classTreeDockWidget.setWidget(class_tree_window) classTreeDockWidget.setContentsMargins(0,0,0,0) # Comments widget commentDockWidget = QDockWidget("Comments", self) commentDockWidget.setObjectName("commentDockWidget") commentDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas) commentView = UndoRedoTextEdit(commentDockWidget, self) commentView.setLineWrapMode(QTextEdit.FixedColumnWidth) commentView.setLineWrapColumnOrWidth(499) commentView.setFrameShape(QFrame.StyledPanel) commentView_font = QFont() commentView_font.fromString(self.prefs['comments_font']) commentView.setFont(commentView_font) commentDockWidget.setWidget(commentView) # Info and help widget infoDockWidget = QDockWidget("Info", self) infoDockWidget.setObjectName("infoDockWidget") infoDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas) infoView = QTextEdit(infoDockWidget) infoView.setFrameShape(QFrame.StyledPanel) infoView.setReadOnly(True) infoDockWidget.setWidget(infoView) # Node list and jump menu widget refDockWidget = QDockWidget("Field References", self) refDockWidget.setObjectName("refDockWidget") refDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas) ref_model = reftree.ReferenceTreeModel(None, refDockWidget) refView = QTreeView(refDockWidget) refView.setModel(ref_model) refView.setUniformRowHeights(True) refView.setRootIsDecorated(False) refView.setIndentation(15) refView.setColumnWidth(0, 160) refView.setFrameShape(QFrame.StyledPanel) refDockWidget.setWidget(refView) refView.doubleClicked.connect(self.ref_tree_double_clicked) # Logging and debugging widget logDockWidget = QDockWidget("Log Viewer", self) logDockWidget.setObjectName("logDockWidget") logDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas) logView = QPlainTextEdit(logDockWidget) logView.setLineWrapMode(QPlainTextEdit.NoWrap) logView.setReadOnly(True) logView_font = QFont() logView_font.fromString(self.prefs['base_font']) logView.setFont(logView_font) logView.ensureCursorVisible() logDockWidget.setWidget(logView) # Undo view widget undoDockWidget = QDockWidget("Undo History", self) undoDockWidget.setObjectName("undoDockWidget") undoDockWidget.setAllowedAreas(Qt.AllDockWidgetAreas) undoView = QUndoView(self.undo_stack) undoDockWidget.setWidget(undoView) # Define corner docking behaviour self.setDockNestingEnabled(True) self.setCorner(Qt.TopLeftCorner, Qt.LeftDockWidgetArea) self.setCorner(Qt.TopRightCorner, Qt.RightDockWidgetArea) self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea) self.setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea) # Assign main widget and dock widgets to QMainWindow self.setCentralWidget(classTable) self.addDockWidget(Qt.LeftDockWidgetArea, classTreeDockWidget) self.addDockWidget(Qt.RightDockWidgetArea, commentDockWidget) self.addDockWidget(Qt.RightDockWidgetArea, infoDockWidget) self.addDockWidget(Qt.RightDockWidgetArea, refDockWidget) self.addDockWidget(Qt.RightDockWidgetArea, logDockWidget) self.addDockWidget(Qt.RightDockWidgetArea, undoDockWidget) # Store widgets for access by other objects self.classTable = classTable self.commentView = commentView self.infoView = infoView self.classTree = classTree self.logView = logView self.undoView = undoView self.refView = refView self.filterTreeBox = class_tree_filter_edit # Store docks for access by other objects self.commentDockWidget = commentDockWidget self.infoDockWidget = infoDockWidget self.classTreeDockWidget = classTreeDockWidget self.logDockWidget = logDockWidget self.undoDockWidget = undoDockWidget self.refDockWidget = refDockWidget # Perform other UI-related initialization tasks self.center() self.setUnifiedTitleAndToolBarOnMac(True) self.setWindowIcon(QIcon(':/images/logo.png')) # Status bar setup self.statusBar().showMessage('Status: Ready') self.unitsLabel = QLabel() self.unitsLabel.setAlignment(Qt.AlignCenter) self.unitsLabel.setMinimumSize(self.unitsLabel.sizeHint()) self.unitsLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.statusBar().addPermanentWidget(self.unitsLabel) self.pathLabel = QLabel() self.pathLabel.setAlignment(Qt.AlignCenter) self.pathLabel.setMinimumSize(self.pathLabel.sizeHint()) self.pathLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.statusBar().addPermanentWidget(self.pathLabel) self.versionLabel = QLabel() self.versionLabel.setAlignment(Qt.AlignCenter) self.versionLabel.setMinimumSize(self.versionLabel.sizeHint()) self.versionLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.statusBar().addPermanentWidget(self.versionLabel) self.progressBarIDF = QProgressBar() self.progressBarIDF.setAlignment(Qt.AlignCenter) self.progressBarIDF.setMaximumWidth(200) self.statusBar().addPermanentWidget(self.progressBarIDF) self.clipboard = QApplication.instance().clipboard() self.obj_clipboard = [] self.setStyleSheet(""" QToolTip { background-color: gray; color: white; border: black solid 1px } # QMenu { # background-color: rgbf(0.949020, 0.945098, 0.941176); # color: rgb(255,255,255); # } # QMenu::item::selected { # background-color: rgbf(0.949020, 0.945098, 0.941176); # } """)
class PuppetMaster(QMainWindow): requestEditMode = Signal(bool) def __init__(self, parent=None, editMode=bool(False)): super(PuppetMaster, self).__init__(parent) self._parent = parent self._model = list() self.editMode = editMode self.setMouseTracking(True) self.setFocusPolicy(Qt.StrongFocus) self.setWindowTitle('PuppetMaster') self.setMinimumHeight(1) self.setMinimumWidth(1) self.setContextMenuPolicy(Qt.PreventContextMenu) # Main tabs self.tab = CanvasGraphicsViewTab(parent=self) self.tab.requestEditMode.connect(self.set_edit) self.setCentralWidget(self.tab) # Parameter Widget self.parameter = Parameters(parent=self) self.parameterDock = QDockWidget(": Parameters ::", self) self.parameterDock.setObjectName('Parameters') self.parameterDock.setFeatures(QDockWidget.DockWidgetClosable) self.parameterDock.setWidget(self.parameter) self.parameterDock.setTitleBarWidget(QWidget(self.parameterDock)) self.parameterDock.setVisible(self.editMode) self.addDockWidget(Qt.BottomDockWidgetArea, self.parameterDock) self.tab.onSelection.connect(self.update_parameters) self.parameter.onChangeBGColor.connect(self.tab.update_bg_color) self.parameter.onChangeFontColor.connect(self.tab.update_font_color) self.parameter.onChangeFontSize.connect(self.tab.update_font_size) self.parameter.onChangeText.connect(self.tab.update_text) self.parameter.onChangeShape.connect(self.tab.update_shape) # maya Signal on selection items self.idx = OpenMaya.MEventMessage.addEventCallback( "SelectionChanged", self.tab.maya_selection) # Menu self.setMenuBar(self.create_menu()) self.set_edit(self.editMode) def update_parameters(self, node=PickNode): shape = node.Shape if isinstance(node, PickNode) else str() self.parameter.update_param(text=node.toPlainText(), fontSize=node.font().pointSize(), fontColor=node.defaultTextColor(), bgColor=node.Background, shapeName=shape) def create_menu(self): window_menu = QMenuBar(self) file_menu = window_menu.addMenu("&File") new_action = QAction("&New...", self) new_action.setShortcut('Ctrl+N') new_action.setShortcutContext(Qt.WidgetShortcut) new_action.setStatusTip('Create a new Set') new_action.triggered.connect(self.tab.new_tab) file_menu.addAction(new_action) open_action = QAction("&Open...", self) open_action.setShortcut('Ctrl+O') open_action.setShortcutContext(Qt.WidgetShortcut) open_action.setStatusTip('Open a new set') open_action.triggered.connect(self.tab.open_set) file_menu.addAction(open_action) refresh_action = QAction("&Refresh...", self) refresh_action.setStatusTip('Refresh the current sets') refresh_action.triggered.connect(self.tab.refresh_set) file_menu.addAction(refresh_action) file_menu.addSeparator() save_action = QAction("&Save...", self) save_action.setShortcut('Ctrl+S') save_action.setShortcutContext(Qt.WidgetShortcut) save_action.setStatusTip('Save the current tab') save_action.triggered.connect(self.tab.save_set) file_menu.addAction(save_action) saveAs_action = QAction("&Save As...", self) saveAs_action.setShortcut('Ctrl+Shift+S') saveAs_action.setShortcutContext(Qt.WidgetShortcut) saveAs_action.setStatusTip('Save the current tab as a new Set') saveAs_action.triggered.connect(self.tab.saveAs_set) file_menu.addAction(saveAs_action) saveAsTemp_action = QAction("&Save As Template...", self) saveAsTemp_action.setStatusTip( 'Save the current tab as a new Template') saveAsTemp_action.triggered.connect(self.tab.saveAsTemplate_set) file_menu.addAction(saveAsTemp_action) file_menu.addSeparator() rename_action = QAction("&Rename Tab...", self) rename_action.setStatusTip('Rename the current Tab') rename_action.triggered.connect(self.tab.rename_set) file_menu.addAction(rename_action) close_action = QAction("&Close Tab...", self) close_action.setShortcut('Ctrl+Shift+W') close_action.setShortcutContext(Qt.WidgetShortcut) close_action.setStatusTip('Close the current Tab') close_action.triggered.connect(self.tab.closeCurrentTab) file_menu.addAction(close_action) picker_menu = window_menu.addMenu("&Picker") self.edit_action = QAction("&Edit Mode", self) self.edit_action.setStatusTip('Toggle between view and edit mode.') self.edit_action.triggered.connect(self.edit_toggle) self.edit_action.setCheckable(True) self.edit_action.setChecked(self.editMode) picker_menu.addAction(self.edit_action) picker_menu.addSeparator() self.background_action = QAction("&Change Background...", self) self.background_action.setEnabled(self.editMode) self.background_action.setStatusTip('Change the background.') self.background_action.triggered.connect(self.tab.set_background) picker_menu.addAction(self.background_action) self.namespace_action = QAction("&Change Namespace...", self) self.namespace_action.setEnabled(self.editMode) self.namespace_action.setStatusTip('Change the namespace.') self.namespace_action.triggered.connect(self.tab.set_namespace) picker_menu.addAction(self.namespace_action) help_menu = window_menu.addMenu("&Help") wiki_action = QAction("&About PuppetMaster...", self) wiki_action.setStatusTip('Open Wiki page') wiki_action.triggered.connect(self.wiki_open) help_menu.addAction(wiki_action) return window_menu def edit_toggle(self): self.set_edit(not self.editMode) def wiki_open(self): webbrowser.open_new_tab( 'https://github.com/Bernardrouhi/PuppetMaster/wiki') def force_load(self, paths=list): self.tab.force_load(paths) def findAndLoad(self, names=list()): ''' Find the names in PuppetMaster folder and load them Parameters ---------- names: (list) List of dictionaries of name and namespace. ''' if names: self.tab.findAndLoad(names) def destroyMayaSignals(self): # destroy the connection OpenMaya.MMessage.removeCallback(self.idx) def get_edit(self): return self.editMode def set_edit(self, value=bool): self.editMode = value self.background_action.setEnabled(self.editMode) self.namespace_action.setEnabled(self.editMode) self.parameterDock.setVisible(self.editMode) self.edit_action.setChecked(self.editMode) self.tab.Edit = self.editMode # Notification if not self.editMode: warningMes( "PUPPETMASTER-INFO: Out of 'Edit Mode' you won't be able to create/edit/move or delete any node." ) else: warningMes( "PUPPETMASTER-INFO: In 'Edit Mode' command buttons won't run any commands." ) Edit = property(get_edit, set_edit) def keyPressEvent(self, event): if event.modifiers() == (Qt.ControlModifier | Qt.ShiftModifier): if event.key() == Qt.Key_W: self.tab.closeCurrentTab() elif event.key() == Qt.Key_S: self.tab.saveAs_set() elif event.modifiers() == Qt.ControlModifier: if event.key() == Qt.Key_S: self.tab.save_set() elif event.key() == Qt.Key_N: self.tab.new_tab() elif event.key() == Qt.Key_O: self.tab.open_set() else: super(PuppetMaster, self).keyPressEvent(event)