class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.setWindowTitle("Salary Manager") self.setGeometry(50,50, 800, 600) self.setWindowIcon(QIcon("Resources/rupee.png")) self.widgetStack = QStackedWidget() self.setCentralWidget(self.widgetStack) self.pages = { "Login": LoginWidget, "Home": HomeWidget, "Add Employee": AddEmployeeWidget, "Del Employee": DelEmployeeWidget, "Edit Employee": EditEmployeeWidget, "Show Employee": ShowEmployeeWidget, "Add Designation": AddDesignationWidget, "Show Designation": ShowDesigationWidget, "Calc Salary": CalculateSalaryWidget, "Result": ShowPaySlipWidget } self.gotoPage("Login") def gotoPage(self, name, args=()): print "Goto page", name, "; args=", args try: if len(args) == 0: newPage = self.pages[name](self) else: newPage = self.pages[name](self, *args) self.widgetStack.addWidget(newPage) self.widgetStack.setCurrentWidget(newPage) except mysql.connector.Error as e: ShowMysqlError(e, self) def goBack(self): print "Going Back" try: currentIndex = self.widgetStack.currentIndex() if currentIndex > 0: currentPage = self.widgetStack.currentWidget() self.widgetStack.setCurrentIndex(currentIndex-1) currentPage.deleteLater() self.widgetStack.removeWidget(currentPage) except mysql.connector.Error as e: ShowMysqlError(e, self)
class StackedPage(QWidget): def __init__(self, parent = None): super(StackedPage, self).__init__(parent) layout = QHBoxLayout(self) leftpane = QVBoxLayout() self.buttongroup = QButtonGroup(self) self.buttongroup.setExclusive(True) self.groupbox = QGroupBox(self) self.groupbox.setMinimumWidth(200) QVBoxLayout(self.groupbox) leftpane.addWidget(self.groupbox) leftpane.addStretch(1) layout.addLayout(leftpane) self.rightpane = QStackedWidget(self) layout.addWidget(self.rightpane) self.buttongroup.buttonClicked[int].connect(self.rightpane.setCurrentIndex) self.rightpane.currentChanged[int].connect(self.activate) def addPage(self, buttontext, widget): button = QPushButton(buttontext) button.setCheckable(True) button.setChecked(self.rightpane.count() == 0) self.buttongroup.addButton(button, self.rightpane.count()) self.groupbox.layout().addWidget(button) self.rightpane.addWidget(widget) def pages(self): return [ self.rightpane.widget(i) for i in range(self.rightpane.count()) ] def activate(self, ix): page = self.rightpane.currentWidget() if hasattr(page, "activate") and callable(page.activate): page.activate() def showEvent(self, *args, **kwargs): self.activate(0) return QWidget.showEvent(self, *args, **kwargs)
class GeometryWizardPage(_ExpandableOptionsWizardPage): def __init__(self, options, parent=None): _ExpandableOptionsWizardPage.__init__(self, options, parent) self.setTitle('Geometry') def _initUI(self): # Variables self._widgets = {} # Widgets self._cb_geometry = QComboBox() self._wdg_geometry = QStackedWidget() policy = self._wdg_geometry.sizePolicy() policy.setVerticalStretch(True) self._wdg_geometry.setSizePolicy(policy) # Layouts layout = _ExpandableOptionsWizardPage._initUI(self) layout.addRow("Type of geometry", self._cb_geometry) layout.addRow(self._wdg_geometry) # Signals self._cb_geometry.currentIndexChanged.connect(self._onGeometryChanged) self._cb_geometry.currentIndexChanged.connect(self.valueChanged) return layout def _onGeometryChanged(self): newindex = self._cb_geometry.currentIndex() oldwidget = self._wdg_geometry.currentWidget() newwidget = self._wdg_geometry.widget(newindex) if newwidget is None: return try: newwidget.setValue(oldwidget.value()) except: newwidget.setValue(self.options().geometry) self._wdg_geometry.setCurrentIndex(newindex) # See https://qt-project.org/faq/answer/how_can_i_get_a_qstackedwidget_to_automatically_switch_size_depending_on_th oldwidget.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) newwidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self._wdg_geometry.adjustSize() def _find_material_class(self, programs): highest_class = Material for program in programs: converter = program.converter_class for clasz in converter.MATERIALS: if issubclass(clasz, highest_class): highest_class = clasz return highest_class def initializePage(self): _ExpandableOptionsWizardPage.initializePage(self) # Clear self._widgets.clear() for i in reversed(range(self._cb_geometry.count())): self._cb_geometry.removeItem(i) self._wdg_geometry.removeWidget(self._wdg_geometry.widget(i)) # Populate combo box it = self._iter_widgets('pymontecarlo.ui.gui.options.geometry', 'GEOMETRIES') for clasz, widget_class, programs in it: widget = widget_class() widget.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) widget.setMaterialClass(self._find_material_class(programs)) self._widgets[clasz] = widget program_text = ', '.join(map(attrgetter('name'), programs)) text = '{0} ({1})'.format(widget.accessibleName(), program_text) self._cb_geometry.addItem(text) self._wdg_geometry.addWidget(widget) widget.valueChanged.connect(self.valueChanged) # Select geometry geometry = self.options().geometry widget = self._widgets.get(geometry.__class__) if widget is None: widget = next(iter(self._widgets.values())) widget.setValue(geometry) self._wdg_geometry.setCurrentWidget(widget) self._cb_geometry.setCurrentIndex(self._wdg_geometry.currentIndex()) def validatePage(self): if not self._wdg_geometry.currentWidget().hasAcceptableInput(): return False self.options().geometry = self._wdg_geometry.currentWidget().value() return True def expandCount(self): try: return len(expand(self._wdg_geometry.currentWidget().value())) except: return 0
def test_add_widget_succeeding(self): parent = QStackedWidget() ChildAdder.add(QLabel(), 'fred', parent) self.assertEqual(parent.count(), 1) self.assertTrue(isinstance(parent.currentWidget(), QLabel))
class BeamWizardPage(_ExpandableOptionsWizardPage): def __init__(self, options, parent=None): _ExpandableOptionsWizardPage.__init__(self, options, parent) self.setTitle("Beam") def _initUI(self): # Variables self._widgets = {} # Widgets self._cb_beam = QComboBox() self._wdg_beam = QStackedWidget() # Layouts layout = _ExpandableOptionsWizardPage._initUI(self) layout.addRow("Type of beam", self._cb_beam) layout.addRow(self._wdg_beam) # Signals self._cb_beam.currentIndexChanged.connect(self._onBeamChanged) self._cb_beam.currentIndexChanged.connect(self.valueChanged) return layout def _onBeamChanged(self): newindex = self._cb_beam.currentIndex() oldwidget = self._wdg_beam.currentWidget() newwidget = self._wdg_beam.widget(newindex) if newwidget is None: return try: newwidget.setValue(oldwidget.value()) except: newwidget.setValue(self.options().beam) self._wdg_beam.setCurrentIndex(newindex) def initializePage(self): _ExpandableOptionsWizardPage.initializePage(self) # Clear self._widgets.clear() for i in reversed(range(self._cb_beam.count())): self._cb_beam.removeItem(i) self._wdg_beam.removeWidget(self._wdg_beam.widget(i)) # Populate combo box it = self._iter_widgets("pymontecarlo.ui.gui.options.beam", "BEAMS") for clasz, widget_class, programs in it: widget = widget_class() self._widgets[clasz] = widget program_text = ", ".join(map(attrgetter("name"), programs)) text = "{0} ({1})".format(widget.accessibleName(), program_text) self._cb_beam.addItem(text) self._wdg_beam.addWidget(widget) widget.setParticlesEnabled(False) for program in programs: converter = program.converter_class for particle in converter.PARTICLES: widget.setParticleEnabled(particle, True) widget.valueChanged.connect(self.valueChanged) # Select beam beam = self.options().beam widget = self._widgets.get(beam.__class__) if widget is None: widget = next(iter(self._widgets.values())) widget.setValue(beam) self._wdg_beam.setCurrentWidget(widget) self._cb_beam.setCurrentIndex(self._wdg_beam.currentIndex()) def validatePage(self): if not self._wdg_beam.currentWidget().hasAcceptableInput(): return False self.options().beam = self._wdg_beam.currentWidget().value() return True def expandCount(self): try: return len(expand(self._wdg_beam.currentWidget().value())) except: return 0
class MainWindow(QMainWindow): def __init__(self, controller): super(MainWindow, self).__init__() self.controller = controller self.setWindowTitle("av-control") self.resize(1024, 600) self.setWindowIcon(QIcon(":icons/video-display")) self.mainScreen = VideoSwitcher(controller, self) self.stack = QStackedWidget() self.stack.addWidget(self.mainScreen) outer = QWidget() mainLayout = QGridLayout() mainLayout.addWidget(self.stack, 0, 0, 1, 7) column = 0 self.spc = SystemPowerWidget(controller, self) syspower = ExpandingButton() syspower.setText("Power") syspower.clicked.connect(self.showSystemPower) syspower.setIcon(QIcon(":icons/system-shutdown")) syspower.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(syspower, 1, column) column += 1 self.bc = BlindsControl(controller["Blinds"], self) blinds = ExpandingButton() blinds.setText("Blinds") blinds.clicked.connect(lambda: self.showScreen(self.bc)) blinds.setIcon(QIcon(":icons/blinds")) blinds.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(blinds, 1, column) column += 1 self.sc = ProjectorScreensControl(controller["Screens"], self) screens = ExpandingButton() screens.setText("Screens") screens.clicked.connect(lambda: self.showScreen(self.sc)) screens.setIcon(QIcon(":icons/screens")) screens.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(screens, 1, column) column += 1 if controller.hasDevice("Lights"): self.lightsMenu = LightingControl(controller["Lights"], self) lights = ExpandingButton() lights.setText("Lights") lights.clicked.connect(lambda: self.showScreen(self.lightsMenu)) lights.setIcon(QIcon(":icons/lightbulb_on")) lights.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(lights, 1, column) column += 1 self.advMenu = AdvancedMenu(self.controller, self) adv = ExpandingButton() adv.setText("Advanced") adv.setIcon(QIcon(":icons/applications-system")) adv.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) adv.clicked.connect(lambda: self.showScreen(self.advMenu)) mainLayout.addWidget(adv, 1, column) column += 1 for i in range(column): mainLayout.setColumnStretch(i, 1) tray = QHBoxLayout() tray.addWidget(Clock()) tray.addWidget(SystemStatus(controller)) mainLayout.addLayout(tray, 1, column) mainLayout.setRowStretch(0, 8) mainLayout.setRowStretch(1, 0) outer.setLayout(mainLayout) self.setCentralWidget(outer) self.pnd = PowerNotificationDialog(self) self.pnd.accepted.connect(self.hidePowerDialog) def showScreen(self, screenWidget): if self.stack.currentWidget() == screenWidget: self.stepBack() else: self.stack.insertWidget(0, screenWidget) self.stack.setCurrentWidget(screenWidget) def showSystemPower(self): self.showScreen(self.spc) def stepBack(self): self.stack.removeWidget(self.stack.currentWidget()) def errorBox(self, text): Dialogs.errorBox(text) def showPowerDialog(self, message): self.pnd.message = message self.pnd.exec_() def hidePowerDialog(self): self.pnd.close() if self.stack.currentWidget() == self.spc: self.stepBack() def updateOutputMappings(self, mapping): self.mainScreen.updateOutputMappings(mapping)
class MainWindow(QMainWindow): def __init__(self, controller): super(MainWindow, self).__init__() self.controller = controller self.setWindowTitle("AldatesX") self.resize(1024, 600) self.mainScreen = VideoSwitcher(controller, self) self.stack = QStackedWidget() self.stack.addWidget(self.mainScreen) outer = QWidget() mainLayout = QGridLayout() mainLayout.addWidget(self.stack, 0, 0, 1, 7) self.spc = SystemPowerWidget(controller, self) syspower = ExpandingButton() syspower.setText("Power") syspower.clicked.connect(self.showSystemPower) syspower.setIcon(QIcon("icons/system-shutdown.svg")) syspower.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(syspower, 1, 0) self.bc = BlindsControl(controller, self) blinds = ExpandingButton() blinds.setText("Blinds") blinds.clicked.connect(lambda: self.showScreen(self.bc)) blinds.setIcon(QIcon("icons/blinds.svg")) blinds.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(blinds, 1, 2) self.sc = ProjectorScreensControl(self.controller, self) screens = ExpandingButton() screens.setText("Screens") screens.clicked.connect(lambda: self.showScreen(self.sc)) screens.setIcon(QIcon("icons/screens.svg")) screens.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(screens, 1, 3) self.advMenu = AdvancedMenu(self.controller, self) adv = ExpandingButton() adv.setText("Advanced") adv.setIcon(QIcon("icons/applications-system.svg")) adv.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) adv.clicked.connect(lambda: self.showScreen(self.advMenu)) mainLayout.addWidget(adv, 1, 5) mainLayout.addWidget(Clock(), 1, 6) mainLayout.setRowStretch(0, 8) mainLayout.setRowStretch(1, 0) outer.setLayout(mainLayout) self.setCentralWidget(outer) self.pnd = PowerNotificationDialog(self) self.pnd.accepted.connect(self.hidePowerDialog) def showScreen(self, screenWidget): if self.stack.currentWidget() == screenWidget: self.stepBack() else: self.stack.insertWidget(0, screenWidget) self.stack.setCurrentWidget(screenWidget) def showSystemPower(self): self.showScreen(self.spc) def stepBack(self): self.stack.removeWidget(self.stack.currentWidget()) def errorBox(self, text): Dialogs.errorBox(text) def showPowerDialog(self, message): self.pnd.message = message self.pnd.exec_() def hidePowerDialog(self): self.pnd.close() if self.stack.currentWidget() == self.spc: self.stepBack() def updateOutputMappings(self, mapping): self.mainScreen.updateOutputMappings(mapping)
class MainWindow(QMainWindow, Ui_MainWindow): """Main interface""" # Custom Signals dock_destroyed = Signal(str) def __init__(self, user_data, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.set_username(user_data[0]) self._docks = [] self._stackedWidget = QStackedWidget() self.setCentralWidget(self._stackedWidget) self._overview = OverviewDock() self._stackedWidget.addWidget(self._overview) self._edit_mode = False self._stackedWidget.currentChanged.connect(self.dock_changed) # permission stuff self.set_access(user_data[1]) def dock_changed(self, new_index): new_dock = self._stackedWidget.widget(new_index).objectName() if "Edit" in new_dock: # it's an editing dock self.set_editing(True) def set_editing(self, state): self._edit_mode = state def is_editing(self): return self._edit_mode def set_username(self, username): statics.username = username message = QLabel(unicode("Usuário: ".decode('utf-8')) + username) self.statusbar.addWidget(message) def set_access(self, access_level): statics.access_level = access_level # set availability for QAction objects for action in self.findChildren(QAction): action.setVisible(check_access(access_level, action.objectName())) for menu in self.findChildren(QMenu): if menu.isEmpty(): # no visible actions under this menu menu.menuAction().setVisible(False) @QtCore.Slot() def on_actionExit_activated(self): self.close() @QtCore.Slot() def on_actionAddBook_activated(self): self.show_on_top(AddBookDock, self.actionAddBook) @QtCore.Slot() def on_actionAddAssociate_activated(self): self.show_on_top(AddAssociateDock, self.actionAddAssociate) @QtCore.Slot() def on_actionAddActivity_activated(self): self.show_on_top(AddActivityDock, self.actionAddActivity) @QtCore.Slot() def on_actionPendencies_activated(self): self.show_on_top(PendenciesDock, self.actionPendencies) @QtCore.Slot() def on_actionSellProduct_activated(self): self.show_on_top(OrderProductDock, self.actionSellProduct) @QtCore.Slot() def on_actionSellBook_activated(self): self.show_on_top(OrderBookDock, self.actionSellBook) def show_on_top(self, widget_type, related_action=None, param=None): """ makes the dock related to 'widget_type' the central widget of the mainwindow (by stacking it on front of other widgets), grays out respective action while visible """ if self.is_editing(): # edit dock is being swapped out message = unicode("Todos os dados não salvos serão perdidos".decode('utf-8')) reply = QMessageBox.warning(self, unicode("Atenção".decode('utf-8')), message, QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.No: return else: self.remove_instance(self._stackedWidget.currentWidget()) # there's a need to gray out the corresponding menu option if related_action: related_action.setDisabled(True) widget = self.get_instance(widget_type) if widget is None: # create a new instance of referenced widget if it doesn't exist yet if param: # when a parameter is passed widget = widget_type(param) else: widget = widget_type() self._docks.append(widget) self._stackedWidget.addWidget(widget) # else: # widget.clear() # connects a connection cleanup method when needed # if hasattr(widget, 'cleanup_conn'): # widget.cleanup_conn.connect(self.clean_connection) self._stackedWidget.setCurrentWidget(widget) def get_instance(self, type): for inst in self._docks: if isinstance(inst, type): return inst return None def remove_instance(self, inst): if self.is_editing(): self.set_editing(False) self._docks.remove(inst) self._stackedWidget.removeWidget(inst) self._stackedWidget.setCurrentWidget(self._overview) self._overview.refresh() def closeEvent(self, event): message = unicode("Deseja mesmo sair?".decode('utf-8')) reply = QMessageBox.question(self, 'Seareiros', message, QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore()
class MainWindow(QMainWindow): def __init__(self, controller, joystickAdapter=None): super(MainWindow, self).__init__() self.controller = controller self.setWindowTitle("av-control") self.resize(1024, 600) self.setWindowIcon(QIcon(":icons/video-display")) atem = controller['ATEM'] self.switcherState = SwitcherState(atem) self.mainScreen = VideoSwitcher(controller, self, self.switcherState, joystickAdapter) # This is possibly a bad / too complicated idea... # self.mainScreen.setEnabled(self.switcherState.connected) # self.switcherState.connectionChanged.connect(self.mainScreen.setEnabled) self.stack = QStackedWidget() self.stack.addWidget(self.mainScreen) outer = QWidget() mainLayout = QGridLayout() mainLayout.addWidget(self.stack, 0, 0, 1, 7) column = 0 self.spc = SystemPowerWidget(controller, self) syspower = ExpandingButton() syspower.setText("Power") syspower.clicked.connect(self.showSystemPower) syspower.setIcon(QIcon(":icons/system-shutdown")) syspower.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(syspower, 1, column) column += 1 if controller.hasDevice("Blinds"): self.bc = BlindsControl(controller["Blinds"], self) blinds = ExpandingButton() blinds.setText("Blinds") blinds.clicked.connect(lambda: self.showScreen(self.bc)) blinds.setIcon(QIcon(":icons/blinds")) blinds.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(blinds, 1, column) column += 1 if controller.hasDevice("Lights"): self.lightsMenu = LightingControl(controller["Lights"], self) lights = ExpandingButton() lights.setText("Lights") lights.clicked.connect(lambda: self.showScreen(self.lightsMenu)) lights.setIcon(QIcon(":icons/lightbulb_on")) lights.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) mainLayout.addWidget(lights, 1, column) column += 1 if controller.hasDevice("Recorder"): hyperdeck = controller['Recorder'] self.hyperdeckState = HyperdeckState(hyperdeck) self.recorderScreen = RecorderControl(hyperdeck, atem, self.hyperdeckState, self) recorder = ExpandingButton() recorder.setText("Recorder") recorder.setIcon(QIcon(":icons/drive-optical")) recorder.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) recorder.clicked.connect(lambda: self.showScreen(self.recorderScreen)) mainLayout.addWidget(recorder, 1, column) column += 1 def update_recorder_icon(transport): if 'status' in transport: if transport['status'] == TransportState.RECORD: recorder.setIcon(QIcon(":icons/media-record")) elif transport['status'] == TransportState.PLAYING: recorder.setIcon(QIcon(":icons/media-playback-start")) else: recorder.setIcon(QIcon(":icons/drive-optical")) self.hyperdeckState.transportChange.connect(update_recorder_icon) self.advMenu = AdvancedMenu(self.controller, self.switcherState.mixTransition, atem, self) adv = ExpandingButton() adv.setText("Advanced") adv.setIcon(QIcon(":icons/applications-system")) adv.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) adv.clicked.connect(lambda: self.showScreen(self.advMenu)) mainLayout.addWidget(adv, 1, column) column += 1 for i in range(column): mainLayout.setColumnStretch(i, 1) tray = QHBoxLayout() tray.addWidget(Clock()) tray.addWidget(SystemStatus(controller)) mainLayout.addLayout(tray, 1, column) mainLayout.setRowStretch(0, 8) mainLayout.setRowStretch(1, 0) outer.setLayout(mainLayout) self.setCentralWidget(outer) self.pnd = PowerNotificationDialog(self) self.pnd.accepted.connect(self.hidePowerDialog) def showScreen(self, screenWidget): if self.stack.currentWidget() == screenWidget: self.stepBack() else: self.stack.insertWidget(0, screenWidget) self.stack.setCurrentWidget(screenWidget) def showSystemPower(self): self.showScreen(self.spc) def stepBack(self): self.stack.removeWidget(self.stack.currentWidget()) def errorBox(self, text): Dialogs.errorBox(text) def showPowerDialog(self, message): self.pnd.message = message self.pnd.exec_() def hidePowerDialog(self): self.pnd.close() if self.stack.currentWidget() == self.spc: self.stepBack() def updateOutputMappings(self, deviceID, mapping): self.mainScreen.updateOutputMappings({deviceID: mapping}) def handleMessage(self, msgType, sourceDeviceID, data): if msgType == MessageTypes.SHOW_POWER_ON: self.showPowerDialog(StringConstants.poweringOn) elif msgType == MessageTypes.SHOW_POWER_OFF: self.showPowerDialog(StringConstants.poweringOff) elif msgType == MessageTypes.HIDE_POWER: self.hidePowerDialog() elif sourceDeviceID == "ATEM": self.switcherState.handleMessage(msgType, data) elif sourceDeviceID == "Recorder": self.hyperdeckState.handleMessage(msgType, data)