Example #1
0
class AddItemDialog(QDialog):
    def __init__(self):
        super(AddItemDialog, self).__init__()
        self.setupUi(self)

    def setupUi(self, AddItemDialog):
        self.item_type_picker = QComboBox()

        self.item_properties_switch = QStackedWidget()

        for form in FORMS:
            self.item_type_picker.addItem(form.__name__.split('_')[0],
                                          FORMS.index(form))
            self.item_properties_switch.addWidget(form())

        self.item_type_picker.currentIndexChanged.connect(
            self.item_properties_switch.setCurrentIndex)

        self.add_button = QPushButton("Add")

        mainLayout = QVBoxLayout(self)
        mainLayout.addWidget(self.item_type_picker)
        mainLayout.addWidget(self.item_properties_switch, 1)
        mainLayout.addWidget(self.add_button)

        self.add_button.clicked.connect(self.add_item)

        self.setWindowIcon(QIcon(QPixmap('hotel_icon.jpg')))
        self.layout().setSizeConstraint(QLayout.SetFixedSize)
        self.setWindowTitle("Add Items")

    def add_item(self):
        self.item_properties_switch.currentWidget().add_button_click()
Example #2
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.centralWidget = QStackedWidget()
        self.setCentralWidget(self.centralWidget)
        startWidget = StartWidget(self)
        self.centralWidget.addWidget(startWidget)

        self.setWindowTitle("Mountain King")
        self.resize(210, 50)

    def host(self):
        hostWidget = HostWidget(self)
        self.centralWidget.addWidget(hostWidget)
        self.centralWidget.setCurrentWidget(hostWidget)

        self.setWindowTitle("Hosting Mountain King")
        self.resize(255, 50)

    def join(self):
        joinWidget = JoinWidget(self)
        self.centralWidget.addWidget(joinWidget)
        self.centralWidget.setCurrentWidget(joinWidget)

        self.setWindowTitle("Joining Mountain King")
        self.resize(255, 50)
class Window(QWidget):
    """
    This part might be removed or included for main window application
    """

    def __init__(self, algorithms):
        super(Window, self).__init__()

        self.stackedWidget = QStackedWidget()
        self.orientationCombo = QComboBox()

        for category in categories:
            pass



        for algorithm in algorithms:
            self.orientationCombo.addItem(algorithm.get_name())
            self.stackedWidget.addWidget(GroupOfSliders(algorithm))

            layout = QBoxLayout(QBoxLayout.TopToBottom)

            settings_layout = QBoxLayout(QBoxLayout.TopToBottom)
            settings_layout.addWidget(self.stackedWidget)

            select_layout = QBoxLayout(QBoxLayout.TopToBottom)
            select_layout.addWidget(self.orientationCombo)

            layout.addItem(settings_layout)
            layout.addItem(select_layout)

            self.setLayout(layout)
            self.setWindowTitle(algorithm.get_name() + " Settings")
Example #4
0
class FormComboWidget(QWidget):
    def __init__(self, datalist, comment="", parent=None):
        QWidget.__init__(self, parent)
        layout = QVBoxLayout()
        self.setLayout(layout)
        self.combobox = QComboBox()
        layout.addWidget(self.combobox)
        
        self.stackwidget = QStackedWidget(self)
        layout.addWidget(self.stackwidget)
        self.combobox.currentIndexChanged[int].connect(self.stackwidget,setCurrentIndex)
        
        self.widgetlist = []
        for data, title, comment in datalist:
            self.combobox.addItem(title)
            widget = FormWidget(data, comment=comment, parent=self)
            self.stackwidget.addWidget(widget)
            self.widgetlist.append(widget)
            
    def setup(self):
        for widget in self.widgetlist:
            widget.setup()

    def get(self):
        return [ widget.get() for widget in self.widgetlist]
Example #5
0
 def setCurrentIndex(self, index):
     """Change the current widget being displayed with an animation."""
     old_widget = self.currentWidget()
     new_widget = self.widget(index)
     if old_widget != new_widget:
         self.fader_widget = ui_tools.FaderWidget(self.currentWidget(),
                                                  self.widget(index))
     QStackedWidget.setCurrentIndex(self, index)
Example #6
0
class Root(QMainWindow):
    task_list_index = 0
    task_view_index = 1

    def __init__(self):
        super().__init__()
        self.model = None
        self.task_view = None
        self.initUI()

    def initUI(self):
        # self.cal = QCalendarWidget(self)
        # self.cal.setVerticalHeaderFormat(QCalendarWidget.NoVerticalHeader)
        # self.cal.setGeometry(0, 0, 250, 250)

        self.model = TaskModel()
        self.central = QStackedWidget()

        task_list = TaskList(self.model)
        task_list.open.connect(self.task_open)
        self.central.insertWidget(Root.task_list_index, task_list)

        self.task_view = TaskView(self.model)
        self.task_view.close.connect(self.task_view_close)
        self.central.insertWidget(Root.task_view_index, self.task_view)

        self.central.setCurrentIndex(Root.task_list_index)
        self.setCentralWidget(self.central)

        # QDialog flags:
        #   Qt.Dialog |
        #   Qt.WindowTitleHint |
        #   Qt.WindowSystemMenuHint |
        #   Qt.WindowContextHelpButtonHint |
        #   Qt.WindowCloseButtonHint
        self.setWindowFlags(Qt.Dialog | Qt.WindowStaysOnTopHint)
        self.setGeometry(700, 300, 250, 300)
        self.setWindowTitle('Calendar')

    @pyqtSlot(int)
    def task_open(self, index):
        self.task_view.set_task(index)
        self.central.setCurrentIndex(Root.task_view_index)

    @pyqtSlot()
    def task_view_close(self):
        self.central.setCurrentIndex(Root.task_list_index)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Escape:
            self.close()
class Window(QWidget):
    def __init__(self, all_algorithms):
        super(Window, self).__init__()

        self.stackedWidget = QStackedWidget()
        for item in algorithms:
            widget = GuiElement(item)
            self.stackedWidget.addWidget(widget)

        layout = QHBoxLayout()
        layout.addWidget(self.stackedWidget)
        self.setLayout(layout)

        self.setWindowTitle("Algorithm Settings")
class Window(QWidget):
    def __init__(self, title):
        super(Window, self).__init__()

        self.horizontalSliders = SlidersGroup(title)

        self.stackedWidget = QStackedWidget()
        self.stackedWidget.addWidget(self.horizontalSliders)

        layout = QHBoxLayout()
        layout.addWidget(self.stackedWidget)
        self.setLayout(layout)

        self.setWindowTitle("Algorithm Settings: ")
Example #9
0
    def initUI(self):

        # create menus
        menu.GuiMenu()
        menu.WidgetMenu()
        menu.SettingsMenu()
        menu.LoggingMenu()

        # main layout
        mainVLayout = QVBoxLayout()
        elementHLayouts = []

        # top element: toolbar, status
        t = QLabel("Toolbar")
        s = QLabel("Status")
        toolbarStatusHLayout = QHBoxLayout()
        toolbarStatusHLayout.addWidget(t)
        toolbarStatusHLayout.addWidget(s)
        elementHLayouts.append(toolbarStatusHLayout)

        # mid element: menu buttons
        menubuttonsHLayout = QHBoxLayout()
        stackedButtonsWidget = QStackedWidget()
        buttonGroup = QButtonGroup(self)
        buttonGroup.setExclusive(True)

        for m in menu.Menu.menus:
            btn = QPushButton(m.name)
            btn.setCheckable(True)
            btn.pressed.connect(lambda m=m: stackedButtonsWidget.setCurrentWidget(m))
            menubuttonsHLayout.addWidget(btn)
            buttonGroup.addButton(btn)
            stackedButtonsWidget.addWidget(m)

        elementHLayouts.append(menubuttonsHLayout)

        # bot element: menu specific widgets
        menuwidgetsHLayout = QHBoxLayout()
        menuwidgetsHLayout.addWidget(stackedButtonsWidget)
        elementHLayouts.append(menuwidgetsHLayout)

        # click first button for defined initial state
        if len(buttonGroup.buttons()) > 0:
            buttonGroup.buttons()[0].click()

        for l in elementHLayouts:
            mainVLayout.addLayout(l)

        self.setLayout(mainVLayout)
    def __init__(self, ref_templates, parent=None):
        super().__init__(parent)

        # Variables sections.

        # NB: Sorted.
        self._types = ["book", "bookSection", "conferencePaper", "document",
                       "forumPost", "journalArticle", "patent", "report",
                       "thesis", "webpage"]
        templates_subset = OrderedDict([(k, v) for k, v in ref_templates.items()
                                        if k in self._types])

        # Own configuration section.

        # TODO Better layout configuration.
        self.setMinimumSize(QSize(800, 1000))

        # Widgets section.

        # TODO Prevent edition of the reference type for an existing reference?
        self._types_edit = QComboBox()
        self._types_edit.addItems(self._types)

        self._types_widgets = self._templates_widgets(templates_subset)
        types_forms = self._templates_forms(self._types_widgets)
        forms_stack = QStackedWidget()
        for x in types_forms:
            forms_stack.addWidget(x)

        # NB: The first button with the accept role is made the default button.
        ok_cancel = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

        # Layouts section.

        layout = QFormLayout()
        layout.addRow(self.ITEM_TYPE_FIELD + ":", self._types_edit)
        layout.addRow(forms_stack)
        layout.addRow(ok_cancel)
        # NB: Don't use AllNonFixedFieldsGrow because it expands the QComboBox.
        layout.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
        utils.configure_form_layout(layout)
        self.setLayout(layout)

        # Signals section.

        self._types_edit.currentIndexChanged.connect(forms_stack.setCurrentIndex)
        ok_cancel.accepted.connect(self.accept)
        ok_cancel.rejected.connect(self.reject)
    def __init__(self, algorithms):
        super(Window, self).__init__()

        self.stackedWidget = QStackedWidget()
        self.orientationCombo = QComboBox()

        for category in categories:
            pass



        for algorithm in algorithms:
            self.orientationCombo.addItem(algorithm.get_name())
            self.stackedWidget.addWidget(GroupOfSliders(algorithm))

            layout = QBoxLayout(QBoxLayout.TopToBottom)

            settings_layout = QBoxLayout(QBoxLayout.TopToBottom)
            settings_layout.addWidget(self.stackedWidget)

            select_layout = QBoxLayout(QBoxLayout.TopToBottom)
            select_layout.addWidget(self.orientationCombo)

            layout.addItem(settings_layout)
            layout.addItem(select_layout)

            self.setLayout(layout)
            self.setWindowTitle(algorithm.get_name() + " Settings")
Example #12
0
    def __init__(self, parent=None):
        super().__init__(parent)
        # Register signals connections
        layout = QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)

        self.__buttons = []
        self.__action_number = 1
        self.__buttons_visibility = {}
        self.__current_widget = None
        self.__last_index = -1

        self._stack_widgets = QStackedWidget()
        layout.addWidget(self._stack_widgets)

        # Buttons Widget
        self.buttons_widget = QWidget()
        self.buttons_widget.setObjectName("tools_dock")
        self.buttons_widget.setFixedHeight(26)
        self.buttons_widget.setLayout(QHBoxLayout())
        self.buttons_widget.layout().setContentsMargins(2, 2, 5, 2)
        self.buttons_widget.layout().setSpacing(10)

        IDE.register_service("tools_dock", self)
        _ToolsDock.__created = True
Example #13
0
    def __init__(self):
        super(Window, self).__init__()

        self.horizontalSliders = SlidersGroup(Qt.Horizontal,
                "Horizontal")
        self.verticalSliders = SlidersGroup(Qt.Vertical, "Vertical")

        self.stackedWidget = QStackedWidget()
        self.stackedWidget.addWidget(self.horizontalSliders)
        self.stackedWidget.addWidget(self.verticalSliders)

        self.createControls("Controls")

        self.horizontalSliders.valueChanged.connect(self.verticalSliders.setValue)
        self.verticalSliders.valueChanged.connect(self.valueSpinBox.setValue)
        self.valueSpinBox.valueChanged.connect(self.horizontalSliders.setValue)

        layout = QHBoxLayout()
        layout.addWidget(self.controlsGroup)
        layout.addWidget(self.stackedWidget)
        self.setLayout(layout)

        self.minimumSpinBox.setValue(0)
        self.maximumSpinBox.setValue(20)
        self.valueSpinBox.setValue(5)

        self.setWindowTitle("Sliders")
Example #14
0
    def initUI(self):
        # self.cal = QCalendarWidget(self)
        # self.cal.setVerticalHeaderFormat(QCalendarWidget.NoVerticalHeader)
        # self.cal.setGeometry(0, 0, 250, 250)

        self.model = TaskModel()
        self.central = QStackedWidget()

        task_list = TaskList(self.model)
        task_list.open.connect(self.task_open)
        self.central.insertWidget(Root.task_list_index, task_list)

        self.task_view = TaskView(self.model)
        self.task_view.close.connect(self.task_view_close)
        self.central.insertWidget(Root.task_view_index, self.task_view)

        self.central.setCurrentIndex(Root.task_list_index)
        self.setCentralWidget(self.central)

        # QDialog flags:
        #   Qt.Dialog |
        #   Qt.WindowTitleHint |
        #   Qt.WindowSystemMenuHint |
        #   Qt.WindowContextHelpButtonHint |
        #   Qt.WindowCloseButtonHint
        self.setWindowFlags(Qt.Dialog | Qt.WindowStaysOnTopHint)
        self.setGeometry(700, 300, 250, 300)
        self.setWindowTitle('Calendar')
Example #15
0
 def __init__(self, QWidget_parent=None):
     super(XTabWidget, self).__init__(QWidget_parent)
     # setup self frame
     self.setFrameShadow(QFrame.Raised)
     # self.setFrameShape(QFrame.StyledPanel)
     self.setFrameShape(QFrame.NoFrame)
     # layouts
     self._layout = QVBoxLayout()
     self._layout.setContentsMargins(0, 0, 0, 0)
     self._layout.setSpacing(2)
     self._layout_top = QHBoxLayout()
     self._layout_top.setContentsMargins(0, 0, 0, 0)
     # stacked widget
     self._stack = QStackedWidget(self)
     # tab bar
     self._tabbar = QTabBar(self)
     self._tabbar.setTabsClosable(True)
     self._tabbar.setMovable(False)
     self._tabbar.setExpanding(False)
     self._tabbar.setShape(QTabBar.RoundedNorth)
     self._tabbar.currentChanged.connect(self.on_tab_current_changed)
     self._tabbar.tabCloseRequested.connect(self.on_tab_close_requested)
     # button "add"
     self._btn_add = QPushButton('+', self)
     self._btn_add.setMaximumSize(QSize(22, 22))
     self._btn_add.clicked.connect(self.on_btn_add_clicked)
     # complete layout
     self._layout_top.addWidget(self._btn_add, 0, Qt.AlignVCenter)
     self._layout_top.addWidget(self._tabbar, 1, Qt.AlignVCenter)
     self._layout.addLayout(self._layout_top)
     self._layout.addWidget(self._stack)
     self.setLayout(self._layout)
Example #16
0
    def __init__(self):
        super(Posttid, self).__init__()

        # Set up the main window ui including parameters such as window size and global font
        self.set_up_window()

        # Load in the saved email and requests
        self.data, self.email, self.requests = self.load()

        # Set up each individual window screen
        self.central_widget = QStackedWidget()
        self.settings_widget = SettingsWindow(self.email, self.requests, parent=self)
        self.status_widget = StatusWindow(parent=self)
        self.central_widget.addWidget(self.status_widget)
        self.central_widget.addWidget(self.settings_widget)
        self.setCentralWidget(self.central_widget)

        # Start a new background thread to run the requests
        self.worker = Worker()
        self.worker.set_values(self.email, self.requests)
        self.worker.missing_email_signal.connect(self.log.missing_email)
        self.worker.connect_signal.connect(self.log.connection)
        self.worker.reconnect_signal.connect(self.log.reconnect)
        self.worker.request_signal.connect(self.log.request_found)
        self.worker.connectionerror_signal.connect(self.log.no_connection)
        self.worker.subreddit_noexist_signal.connect(self.log.subreddit_noexists)
        self.worker.status_condition_signal.connect(self.status_widget.set_status)
        self.worker.timeout_signal.connect(self.log.timeout)
        self.worker.httperror_signal.connect(self.log.http)
        self.worker.test_inside_loop.connect(self.log.inside_loop)
        self.worker.test_query_requests.connect(self.log.query_requests)
        self.worker.start()

        # Stop the worker thread when accessing the settings window
        self.status_widget.settings.clicked.connect(self.worker.terminate)
Example #17
0
    def __init__(self):
        super(Window, self).__init__()
        global current_state
        current_state = dict(screen_data)

        self.createControls()
        self.createCommandBox()

        self.brightnessSliders = SlidersGroup(self.commandBox)

        self.stackedWidget = QStackedWidget()
        self.stackedWidget.addWidget(self.brightnessSliders)

        layout = QBoxLayout(QBoxLayout.TopToBottom)
        layout.addWidget(self.stackedWidget)
        layout.addWidget(self.commandBoxGroup)
        layout.addWidget(self.controlsGroup)
        self.setLayout(layout)

        self.setWindowTitle("Brightness editor")
        self.resize(850, 500)

        command = "# get display names and brightness values\n" + \
                  get_brightness_command                 + "\n" + \
                  "# results (formatted): " + str(screen_data)
        if primary != None:
            command += " primary: " + screen_data[primary][0]
        self.commandBox.document().setPlainText(command)
Example #18
0
    def __init__(self, parent=None):
        """Initialize the preferences dialog with a list box and a content layout."""
        super(PreferencesDialog, self).__init__(parent)
        self.setWindowTitle('Preferences')

        settings_icon = utilities.resource_filename('mosaic.images', 'md_settings.png')
        self.setWindowIcon(QIcon(settings_icon))
        self.resize(600, 450)

        self.contents = QListWidget()
        self.contents.setFixedWidth(175)
        self.pages = QStackedWidget()
        self.button_box = QDialogButtonBox(QDialogButtonBox.Ok)

        self.dialog_media_library = MediaLibrary()
        self.dialog_playback = Playback()
        self.dialog_view_options = ViewOptions()
        self.pages.addWidget(self.dialog_media_library)
        self.pages.addWidget(self.dialog_playback)
        self.pages.addWidget(self.dialog_view_options)
        self.list_items()

        stack_layout = QVBoxLayout()
        stack_layout.addWidget(self.pages)
        stack_layout.addWidget(self.button_box)

        layout = QHBoxLayout()
        layout.addWidget(self.contents)
        layout.addLayout(stack_layout)

        self.setLayout(layout)

        self.contents.currentItemChanged.connect(self.change_page)
        self.button_box.accepted.connect(self.accept)
Example #19
0
    def __init__(self):
        super(TableWidget, self).__init__()

        # vbox = QVBoxLayout(self)
        # vbox.setContentsMargins(0, 0, 0, 0)

        self._tabs = QTabWidget()
        self._tabs.setAutoFillBackground(True)
        p = self._tabs.palette()
        p.setColor(p.Window, QColor("white"))
        self._tabs.setPalette(p)
        self._other_tab = QTabWidget()
        self._other_tab.setAutoFillBackground(True)
        self._other_tab.setPalette(p)
        self.addWidget(self._tabs)
        self.addWidget(self._other_tab)
        self.setSizes([1, 1])
        self._other_tab.hide()

        self.relations = {}

        # Stack
        self.stacked = QStackedWidget()
        self._tabs.addTab(self.stacked, "Workspace")
        self.stacked_result = QStackedWidget()
        self._tabs.addTab(self.stacked_result, self.tr("Resultados"))

        btn_split = QToolButton()
        btn_split.setToolTip(self.tr("Click para dividir la pantalla"))
        btn_split.setAutoRaise(True)
        btn_split.setIcon(QIcon(":img/split"))
        self._tabs.setCornerWidget(btn_split)
        btn_split.clicked.connect(self._split)
        btn_split = QToolButton()
        btn_split.setToolTip(self.tr("Click para juntar las pantallas"))
        btn_split.setAutoRaise(True)
        btn_split.setIcon(QIcon(":img/split"))
        btn_split.clicked.connect(self._unsplit)
        self._other_tab.setCornerWidget(btn_split)
        # self.setContextMenuPolicy(Qt.CustomContextMenu)
        # self.customContextMenuRequested.connect(self._show_menu)

        lateral_widget = Pireal.get_service("lateral_widget")
        lateral_widget.resultClicked.connect(self._on_result_list_clicked)
        lateral_widget.resultSelectionChanged.connect(
            lambda index: self.stacked_result.setCurrentIndex(index))
Example #20
0
    def __init__(self, parent):
        super(ScorePartsWidget, self).__init__(parent)
        
        self.typesLabel = QLabel()
        self.typesView = QTreeView(
            selectionMode=QTreeView.ExtendedSelection,
            selectionBehavior=QTreeView.SelectRows,
            animated=True,
            headerHidden=True)
        self.scoreLabel = QLabel()
        self.scoreView = widgets.treewidget.TreeWidget(
            selectionMode=QTreeView.ExtendedSelection,
            selectionBehavior=QTreeView.SelectRows,
            headerHidden=True,
            animated=True,
            dragDropMode=QTreeView.InternalMove)
        self.addButton = QPushButton(icon = icons.get("list-add"))
        self.removeButton = QPushButton(icon = icons.get("list-remove"))
        self.upButton = QToolButton(icon = icons.get("go-up"))
        self.downButton = QToolButton(icon = icons.get("go-down"))
        self.partSettings = QStackedWidget()
        
        w = QWidget()
        self.addWidget(w)
        layout = QVBoxLayout(spacing=0)
        w.setLayout(layout)
        
        layout.addWidget(self.typesLabel)
        layout.addWidget(self.typesView)
        layout.addWidget(self.addButton)
        
        w = QWidget()
        self.addWidget(w)
        layout = QVBoxLayout(spacing=0)
        w.setLayout(layout)
        
        layout.addWidget(self.scoreLabel)
        layout.addWidget(self.scoreView)
        
        box = QHBoxLayout(spacing=0)
        layout.addLayout(box)
        
        box.addWidget(self.removeButton)
        box.addWidget(self.upButton)
        box.addWidget(self.downButton)
        
        self.addWidget(self.partSettings)

        self.typesView.setModel(parts.model())
        app.translateUI(self)
        
        # signal connections
        self.addButton.clicked.connect(self.slotAddButtonClicked)
        self.removeButton.clicked.connect(self.slotRemoveButtonClicked)
        self.typesView.doubleClicked.connect(self.slotDoubleClicked)
        self.scoreView.currentItemChanged.connect(self.slotCurrentItemChanged)
        self.upButton.clicked.connect(self.scoreView.moveSelectedChildrenUp)
        self.downButton.clicked.connect(self.scoreView.moveSelectedChildrenDown)
 def create_widgets(self):
     """Creates central widgets."""
     self.stack = QStackedWidget(self)
     self.setCentralWidget(self.stack)
     self.view = View(self)
     self.stack.addWidget(self.view)
     self.glwidget = GLWidget(self)
     self.worker.video.set_widget(self)
     self.stack.addWidget(self.glwidget)
     self.stack.setCurrentWidget(self.view)
Example #22
0
    def addApplet(self, appletId: int, applet) -> None:
        """
        Adds applet to toolbox if it is available in interactive mode
        """
        if applet.interactive:
            # We need new id before we added item, to handle currentChangedSignal
            newToolbarId = self._toolbox.count()
            self._toolbarIdByAppletId[appletId] = newToolbarId
            self._appletIdByToolbarId[newToolbarId] = appletId

            widget = applet.getMultiLaneGui().appletDrawer()
            assert isinstance(widget, QWidget), f"Not a widget: {widget}"

            stackedWidget = QStackedWidget()
            stackedWidget.addWidget(widget)

            self._toolbox.addItem(stackedWidget, applet.name)
        else:
            self._toolbarIdByAppletId[appletId] = None
Example #23
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.centralWidget = QStackedWidget()
        self.setCentralWidget(self.centralWidget)
        startWidget = StartWidget(self)
        self.centralWidget.addWidget(startWidget)

        self.setWindowTitle("Mountain King")
        self.resize(210, 50)
Example #24
0
    def __init__(self):
        super(TableWidget, self).__init__()

        vbox = QVBoxLayout(self)
        vbox.setContentsMargins(0, 0, 0, 0)

        self.relations = {}

        # Stack
        self.stacked = QStackedWidget()
        vbox.addWidget(self.stacked)
Example #25
0
    def __init__(self, mainWindow):
        """ list of opened documents as it is displayed in the Opened Files Explorer.
        List accessed and modified by enki.core.openedfilemodel.OpenedFileModel class
        """
        QStackedWidget.__init__(self, mainWindow)
        mainWindow.setFocusProxy(self)

        self.sortedDocuments = []  # not protected, because available for OpenedFileModel
        self._oldCurrentDocument = None

        # create opened files explorer
        # openedFileExplorer is not protected, because it is available for OpenedFileModel
        self.openedFileExplorer = enki.core.openedfilemodel.OpenedFileExplorer(self)
        mainWindow.addDockWidget(Qt.LeftDockWidgetArea, self.openedFileExplorer)

        self.currentChanged.connect(self._onStackedLayoutIndexChanged)

        self.currentDocumentChanged.connect(self._updateMainWindowTitle)
        core.project().changed.connect(self._updateMainWindowTitle)
        self.currentDocumentChanged.connect(self._onCurrentDocumentChanged)
Example #26
0
    def __init__(self, settings_object, parent=None):
        super().__init__(parent)

        # The settings object should not be changed directly. Use enqueue_change() to set values and call
        # commit_changes() to write them to file when the user clicks either the "Ok" or "Apply" button.
        self.settings_object = settings_object
        self.pending_changes = {}

        # A list of different settings groups, categorized by the application they apply to.
        self.category_list = QListWidget()
        self.category_list.setSpacing(3)
        self.category_list.setMaximumWidth(100)
        handlebar_category = QListWidgetItem(self.category_list)
        handlebar_category.setText('General')
        handbrake_category = QListWidgetItem(self.category_list)
        handbrake_category.setText('Encoder')
        handbrake_category = QListWidgetItem(self.category_list)
        handbrake_category.setText('Output')

        self.category_pages = QStackedWidget()
        self.category_pages.addWidget(GeneralSettingsPage(self, settings_object))
        self.category_pages.addWidget(EncoderSettingsPage(self, settings_object))
        self.category_pages.addWidget(OutputSettingsPage(self, settings_object))

        self.category_list.setCurrentRow(0)
        self.category_list.currentItemChanged.connect(self.change_category)

        category_layout = QHBoxLayout()
        category_layout.addWidget(self.category_list)
        category_layout.addWidget(self.category_pages)

        ok_button = QPushButton('Ok')
        cancel_button = QPushButton('Cancel')
        self.apply_button = QPushButton('Apply')
        self.apply_button.setEnabled(False)

        ok_button.clicked.connect(self.commit_changes_and_close)
        cancel_button.clicked.connect(self.close)
        self.apply_button.clicked.connect(self.commit_changes)

        button_bar_layout = QHBoxLayout()
        button_bar_layout.addStretch(1)
        button_bar_layout.addWidget(ok_button)
        button_bar_layout.addWidget(cancel_button)
        button_bar_layout.addWidget(self.apply_button)

        main_layout = QVBoxLayout()
        main_layout.addLayout(category_layout)
        main_layout.addLayout(button_bar_layout)
        self.setLayout(main_layout)

        self.setWindowTitle('Configure Settings')
        self.resize(600, 300)
class SpectateBattle(QWidget):
    def __init__(self):
        super(SpectateBattle, self).__init__()
        self.exitButton = QPushButton('Exit to menu')
        self.exitButton.clicked.connect(self.interruptBattle)
        self.menu = BotBattleMenu()
        self.menu.startButton.clicked.connect(self.startBattle)
        self.battle = None

        self.stack = QStackedWidget()
        self.stack.addWidget(self.menu)

        layout = QVBoxLayout()
        layout.addWidget(self.stack)
        layout.addWidget(self.exitButton)
        self.setLayout(layout)

    def startBattle(self):
        bot1 = game.players.ai.select_bot(self.menu.bot1Level)
        bot2 = game.players.ai.select_bot(self.menu.bot2Level)
        self.battle = BotBattle(bot1, bot2)
        self.stack.addWidget(self.battle)
        self.stack.setCurrentWidget(self.battle)

    def interruptBattle(self):
        if self.battle:
            self.battle.interrupt()
class MultiPlayer(QWidget):
    def __init__(self):
        super(MultiPlayer, self).__init__()
        self.exitButton = QPushButton('Exit to menu')
        self.exitButton.clicked.connect(self.exit)
        self.menu = MultiPlayerMenu()
        self.menu.connectButton.clicked.connect(self.connect)
        self.menu.hostButton.clicked.connect(self.host)
        self.menu.hotseatButton.clicked.connect(self.hotseat)

        self.stack = QStackedWidget()
        self.stack.addWidget(self.menu)

        layout = QVBoxLayout()
        layout.addWidget(self.stack)
        layout.addWidget(self.exitButton)

        self.setLayout(layout)
        self.clientGame = None
        self.serverGame = None
        self.hotseatGame = None

    def host(self):
        name = self.menu.nameField.text()
        port = self.menu.portSpinBox.value()
        self.serverGame = ServerGame(name, port)
        self.showGame(self.serverGame)

    def connect(self):
        name = self.menu.nameField.text()
        ip = self.menu.ipField.text()
        port = self.menu.portSpinBox.value()
        self.clientGame = ClientGame(name, ip, port)
        self.showGame(self.clientGame)

    def hotseat(self):
        self.hotseatGame = HotSeatGame()
        self.showGame(self.hotseatGame)

    def showGame(self, game):
        self.stack.addWidget(game)
        self.stack.setCurrentWidget(game)

    def exit(self):
        self.stack.setCurrentWidget(self.menu)
        if self.serverGame:
            self.serverGame.end()
        if self.clientGame:
            self.clientGame.end()
Example #29
0
 def _setupUi(self):
     self.resize(483, 423)
     self.verticalLayout = QVBoxLayout(self)
     self.verticalLayout.setSpacing(0)
     self.verticalLayout.setContentsMargins(0, 0, 0, 0)
     self.horizontalLayout = QHBoxLayout()
     self.horizontalLayout.setSpacing(0)
     self.filterBar = RadioBox(self)
     sizePolicy = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred)
     sizePolicy.setHorizontalStretch(0)
     sizePolicy.setVerticalStretch(0)
     sizePolicy.setHeightForWidth(self.filterBar.sizePolicy().hasHeightForWidth())
     self.filterBar.setSizePolicy(sizePolicy)
     self.horizontalLayout.addWidget(self.filterBar)
     self.horizontalLayout.addItem(horizontalSpacer())
     self.reconciliationButton = QPushButton(tr("Reconciliation"))
     self.reconciliationButton.setCheckable(True)
     self.horizontalLayout.addWidget(self.reconciliationButton)
     self.verticalLayout.addLayout(self.horizontalLayout)
     self.splitterView = QSplitter()
     self.splitterView.setOrientation(Qt.Vertical)
     self.splitterView.setChildrenCollapsible(False)
     self.tableView = TableView(self)
     self.tableView.setAcceptDrops(True)
     self.tableView.setEditTriggers(QAbstractItemView.DoubleClicked|QAbstractItemView.EditKeyPressed)
     self.tableView.setDragEnabled(True)
     self.tableView.setDragDropMode(QAbstractItemView.InternalMove)
     self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
     self.tableView.setSortingEnabled(True)
     self.tableView.horizontalHeader().setHighlightSections(False)
     self.tableView.horizontalHeader().setMinimumSectionSize(18)
     self.tableView.verticalHeader().setVisible(False)
     self.tableView.verticalHeader().setDefaultSectionSize(18)
     self.splitterView.addWidget(self.tableView)
     self.graphView = QStackedWidget(self)
     sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
     sizePolicy.setHorizontalStretch(0)
     sizePolicy.setVerticalStretch(0)
     sizePolicy.setHeightForWidth(self.graphView.sizePolicy().hasHeightForWidth())
     self.graphView.setSizePolicy(sizePolicy)
     self.graphView.setMinimumSize(0, 200)
     self.lineGraphView = LineGraphView()
     self.graphView.addWidget(self.lineGraphView)
     self.barGraphView = BarGraphView()
     self.graphView.addWidget(self.barGraphView)
     self.splitterView.addWidget(self.graphView)
     self.graphView.setCurrentIndex(1)
     self.splitterView.setStretchFactor(0, 1)
     self.splitterView.setStretchFactor(1, 0)
     self.verticalLayout.addWidget(self.splitterView)
Example #30
0
    def __init__(self, parent=None):
        super(FilterDialog, self).__init__(parent)

        self.accepted.connect(self.createFilter)

        self.contentsWidget = QListWidget()
        self.contentsWidget.setViewMode(QListView.IconMode)
        self.contentsWidget.setIconSize(QSize(96, 84))
        self.contentsWidget.setMovement(QListView.Static)
        self.contentsWidget.setMaximumWidth(128)
        self.contentsWidget.setSpacing(12)

        self.basicFilterPage = BasicFilterPage()
        self.timeFilterPage = DateTimeFilterPage()
        self.locationFilterPage = LocationFilterPage()

        self.pagesWidget = QStackedWidget()
        self.pagesWidget.addWidget(self.basicFilterPage)
        self.pagesWidget.addWidget(self.timeFilterPage)
        self.pagesWidget.addWidget(self.locationFilterPage)
        self.pagesWidget.setMinimumHeight(360)

        rejectButton = QPushButton("Storno")
        rejectButton.clicked.connect(self.reject)
        acceptButton = QPushButton("OK")
        acceptButton.clicked.connect(self.accept)

        self.createIcons()
        self.contentsWidget.setCurrentRow(0)

        horizontalLayout = QHBoxLayout()
        horizontalLayout.addWidget(self.contentsWidget)
        horizontalLayout.addWidget(self.pagesWidget, 1)

        buttonsLayout = QHBoxLayout()
        buttonsLayout.addStretch(1)
        buttonsLayout.addWidget(acceptButton)
        buttonsLayout.addWidget(rejectButton)

        layout = QVBoxLayout()
        layout.addLayout(horizontalLayout)
        layout.addStretch(1)
        layout.addSpacing(12)
        layout.addLayout(buttonsLayout)

        self.setLayout(layout)

        self.setMinimumWidth(450)
        self.setWindowTitle("Filtrování výsledků")
Example #31
0
class Application(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.pipeShape = QComboBox()
        self.pipeShape.addItem("circular")
        self.pipeShape.addItem("rectangular")
        self.pipeShape.addItem("trapezoidal")
        self.circleDiameter = QLineEdit()
        self.rectWidth = QLineEdit()
        self.rectDepth = QLineEdit()
        self.rectOpen = QRadioButton("Open")
        self.rectClosed = QRadioButton("Closed")
        self.rectOpen.setChecked(True)
        self.trapWidth = QLineEdit()
        self.trapDepth = QLineEdit()
        self.trapSide = QLineEdit()
        self.trapOpen = QRadioButton("Open")
        self.trapClosed = QRadioButton("Closed")
        self.trapOpen.setChecked(True)
        self.lengthEdit = QLineEdit()
        self.lengthEdit.setFixedWidth(125)
        self.usInvert = QLineEdit()
        self.usInvert.setFixedWidth(125)
        self.dsInvert = QLineEdit()
        self.dsInvert.setFixedWidth(125)
        self.Ks = QLineEdit()
        self.Ks.setFixedWidth(125)
        self.Ks.setText("3.0")
        self.kinvisc = QLineEdit()
        self.kinvisc.setFixedWidth(125)
        self.kinvisc.setText("1.141e-06")
        self.dsK = QLineEdit()
        self.dsK.setFixedWidth(125)
        self.dsK.setText("0.0")
        self.usK = QLineEdit()
        self.usK.setFixedWidth(125)
        self.usK.setText("0.0")
        self.flow = QLineEdit()
        self.myFunc = QPushButton("Calculate", self)
        self.myFunc.clicked.connect(self.calculate)
        self.result = QTextEdit()

        self.stack1 = QWidget()
        self.stack2 = QWidget()
        self.stack3 = QWidget()

        self.stack1UI()
        self.stack2UI()
        self.stack3UI()

        self.stack = QStackedWidget(self)
        self.stack.addWidget(self.stack1)
        self.stack.addWidget(self.stack2)
        self.stack.addWidget(self.stack3)

        layout = QVBoxLayout()
        layout.addWidget(QLabel("Select Pipe Shape:"))
        layout.addWidget(self.pipeShape)

        layout.addWidget(self.stack)
        layoutFlow = QHBoxLayout()
        layoutFlow.addWidget(QLabel("Flow Rate:"))
        layoutFlow.addWidget(QLabel("m3/s"))
        layoutFlow.addWidget(self.flow)
        layout.addLayout(layoutFlow)
        layout.addWidget(self.myFunc)
        layout.addWidget(self.result)

        layout1 = QVBoxLayout()
        layout2 = QHBoxLayout()
        layout2.addWidget(QLabel("Length"))
        layout2.addWidget(self.lengthEdit)
        layout2.addWidget(QLabel("m"))
        layout2.addStretch()
        layout3 = QHBoxLayout()
        layout3.addWidget(QLabel("Upstream IL"))
        layout3.addWidget(self.usInvert)
        layout3.addWidget(QLabel("m"))
        layout4 = QHBoxLayout()
        layout4.addWidget(QLabel("Downstream IL"))
        layout4.addWidget(self.dsInvert)
        layout4.addWidget(QLabel("m"))
        layout5 = QHBoxLayout()
        layout5.addWidget(QLabel("Ks"))
        layout5.addWidget(self.Ks)
        layout5.addWidget(QLabel("mm"))
        layout6 = QHBoxLayout()
        layout6.addWidget(QLabel("kinematic visc"))
        layout6.addWidget(self.kinvisc)
        layout6.addWidget(QLabel("m2/s"))
        layout7 = QHBoxLayout()
        layout7.addWidget(QLabel("Upstream K"))
        layout7.addWidget(self.usK)
        layout7.addWidget(QLabel("no."))
        layout8 = QHBoxLayout()
        layout8.addWidget(QLabel("Downstream K"))
        layout8.addWidget(self.dsK)
        layout8.addWidget(QLabel("no."))
        layout1.addLayout(layout2)
        layout1.addLayout(layout3)
        layout1.addLayout(layout4)
        layout1.addLayout(layout5)
        layout1.addLayout(layout6)
        layout1.addLayout(layout7)
        layout1.addLayout(layout8)
        layout1.setAlignment(Qt.AlignTop)

        topLayout = QHBoxLayout(self)
        topLayout.addLayout(layout)
        topLayout.addLayout(layout1)

        self.setLayout(topLayout)
        self.pipeShape.currentIndexChanged.connect(self.stack.setCurrentIndex)
        self.setGeometry(100, 100, 670, 500)
        self.show()

    def stack1UI(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel("Diameter"))
        layout.addWidget(self.circleDiameter)
        layout.addWidget(QLabel("m"))
        layout.setAlignment(Qt.AlignTop)
        self.stack1.setLayout(layout)

    def stack2UI(self):
        layout = QVBoxLayout()
        layout1 = QHBoxLayout()
        layout2 = QHBoxLayout()
        layout3 = QHBoxLayout()
        layout1.addWidget(QLabel("Width"))
        layout1.addWidget(self.rectWidth)
        layout1.addWidget(QLabel("m"))
        layout2.addWidget(QLabel("Depth"))
        layout2.addWidget(self.rectDepth)
        layout2.addWidget(QLabel("m"))
        layout3.addWidget(self.rectOpen)
        layout3.addWidget(self.rectClosed)
        layout.addLayout(layout1)
        layout.addLayout(layout2)
        layout.addLayout(layout3)
        layout.setAlignment(Qt.AlignTop)
        self.stack2.setLayout(layout)

    def stack3UI(self):
        layout = QVBoxLayout()
        layout1 = QHBoxLayout()
        layout2 = QHBoxLayout()
        layout3 = QHBoxLayout()
        layout4 = QHBoxLayout()
        layout1.addWidget(QLabel("Width"))
        layout1.addWidget(self.trapWidth)
        layout1.addWidget(QLabel("m"))
        layout2.addWidget(QLabel("Depth"))
        layout2.addWidget(self.trapDepth)
        layout2.addWidget(QLabel("m"))
        layout3.addWidget(QLabel("Side Slope"))
        layout3.addWidget(self.trapSide)
        layout3.addWidget(QLabel("unit"))
        layout4.addWidget(self.trapOpen)
        layout4.addWidget(self.trapClosed)
        layout.addLayout(layout1)
        layout.addLayout(layout2)
        layout.addLayout(layout3)
        layout.addLayout(layout4)
        layout.setAlignment(Qt.AlignTop)
        self.stack3.setLayout(layout)

    def calculate(self):
        try:
            flow = float(self.flow.text())
            kinvisc = float(self.kinvisc.text())
            length = float(self.lengthEdit.text())
            usIL = float(self.usInvert.text())
            dsIL = float(self.dsInvert.text())
            Ks = float(self.Ks.text()) / 1000.0
            usK = float(self.usK.text())
            dsK = float(self.dsK.text())
            conduit = channel.Channel()
            conduit.setValues(flow, 0.8, 2, 100.0, 1.0, 0.9, 0.003, kinvisc)
            conduit.calculate()
            resultText = "critical depth:\t %0.3f" % conduit.crit_depth
            resultText += "\nnormal depth:\t %0.3f" % conduit.norm_depth
            resultText += "\nds water depth:\t %0.3f" % conduit.water[0]
            resultText += "\nus water depth:\t %0.3f" % conduit.water[-1]
            resultText += "\nds water level:\t %0.3f" % conduit.head[0]
            resultText += "\nus water level:\t %0.3f" % conduit.head[-1]
            resultText += "\nds energy level:\t %0.3f" % conduit.energy[0]
            resultText += "\nus energy level:\t %0.3f" % conduit.energy[-1]
            self.result.setText(str(resultText))
        except ValueError:
            pass
        except:
            print("error")
            pass
Example #32
0
    def __init__(self):
        super().__init__()

        # init the main window
        self.title = 'Epif Object Classifier'
        self.setWindowTitle(self.title)
        self.left = 10
        self.top = 10
        self.width = 1500
        self.height = 750
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        # Create the map canvas and set the canvas to be the main widget
        self.canvasframe = QFrame()
        self.canvasframe.setFrameShape(QFrame.StyledPanel)
        self.canvasframe.setFrameShadow(QFrame.Raised)
        self.setCentralWidget(self.canvasframe)
        self.canvas = map_canvas()
        self.canvas.show()
        self.framelayout = QVBoxLayout(self.canvasframe)
        self.framelayout.addWidget(self.canvas)

        # create map canvas actions and set icons
        actionZoomIn = QAction("Zoom in", self)
        actionZoomOut = QAction("Zoom out", self)
        actionPan = QAction("Pan", self)
        actionZoomIn.setCheckable(True)
        actionZoomOut.setCheckable(True)
        actionPan.setCheckable(True)

        actionPanPixmap = QIcon(QPixmap(':/icons/pan.png'))
        actionZoomInPixmap = QIcon(QPixmap(':/icons/Zoom-In-icon.png'))
        actionZoomOutPixmap = QPixmap(':/icons/Zoom-Out-icon.png')
        actionsave = QIcon(QPixmap(':/icons/save.png'))
        actionsaveas = QIcon(QPixmap(':/icons/saveas.png'))
        actionnew = QIcon(QPixmap(':/icons/newproject.png'))
        actionloadproject = QIcon(QPixmap(':/icons/openproject.png'))
        actionpolygonize = QIcon(QPixmap(':/icons/polygon.png'))
        actionrasterize = QIcon(QPixmap(':/icons/raster.png'))
        actionconfusion = QIcon(QPixmap(':/icons/matrix.png'))

        actionZoomIn.setIcon(QIcon(actionZoomInPixmap))
        actionZoomOut.setIcon(QIcon(actionZoomOutPixmap))
        actionPan.setIcon(QIcon(actionPanPixmap))

        actionZoomIn.triggered.connect(self.zoomIn)
        actionZoomOut.triggered.connect(self.zoomOut)
        actionPan.triggered.connect(self.pan)

        # create map canvas tool bar
        self.toolbar = self.addToolBar("Canvas actions")
        self.toolbar.addAction(actionZoomIn)
        self.toolbar.addAction(actionZoomOut)
        self.toolbar.addAction(actionPan)

        # create the map tools
        self.toolPan = QgsMapToolPan(self.canvas)
        self.toolPan.setAction(actionPan)
        self.toolZoomIn = QgsMapToolZoom(self.canvas, False)  # false = in
        self.toolZoomIn.setAction(actionZoomIn)
        self.toolZoomOut = QgsMapToolZoom(self.canvas, True)  # true = out
        self.toolZoomOut.setAction(actionZoomOut)

        #init the file tree widget and set as a dock widget
        self.treewidget = filetree()
        self.tree = QDockWidget("Select Data", self)
        self.tree.setWidget(self.treewidget)
        self.tree.setFloating(False)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.tree)

        # init a menue bar and its actions
        self.menuebar = QMenuBar()
        self.setMenuBar(self.menuebar)
        filemenue = self.menuebar.addMenu('Project')
        classificationmenue = self.menuebar.addMenu('Classification')
        toolsmenue = self.menuebar.addMenu('Tools')
        self.supervised = QAction('supervised')
        self.training = QAction("Training set", self)
        self.unsupervised = QAction('unsupernised')
        self.poligonize = QAction(actionpolygonize, 'Polygonize')
        self.rasterize = QAction(actionrasterize, 'Rasterize')
        self.confusiomatrix = QAction(actionconfusion, 'Confusionmatrix')
        self.newprojectaction = QAction(actionnew, 'New project')
        self.loadprojectaction = QAction(actionloadproject, 'Load project')
        self.saveprojectasaction = QAction(actionsaveas, 'Save project as')
        self.saveaction = QAction(actionsave, 'Save')
        classificationmenue.addAction(self.supervised)
        classificationmenue.addAction(self.unsupervised)
        classificationmenue.addAction(self.training)
        toolsmenue.addAction(self.poligonize)
        toolsmenue.addAction(self.rasterize)
        toolsmenue.addAction(self.confusiomatrix)
        filemenue.addAction(self.loadprojectaction)
        filemenue.addAction(self.saveprojectasaction)
        filemenue.addAction(self.newprojectaction)
        filemenue.addAction(self.saveaction)

        # create a layerpanel
        self.layerpanel = LayersPanel(self.canvas)
        self.layerpanelDock = QDockWidget("Layers", self)
        self.layerpanelDock.setObjectName("layers")
        self.layerpanelDock.setAllowedAreas(Qt.LeftDockWidgetArea
                                            | Qt.RightDockWidgetArea)
        self.layerpanelDock.setWidget(self.layerpanel)
        self.layerpanelDock.setContentsMargins(9, 9, 9, 9)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.layerpanelDock)

        #set the supervised classification window widget
        self.supervised_classification = supervised_classification_ui()
        self.StackedWidget = QStackedWidget()

        self.StackedWidget.addWidget(self.supervised_classification.step1)
        self.StackedWidget.addWidget(self.supervised_classification.step2)
        self.StackedWidget.addWidget(self.supervised_classification.step3)
        self.StackedWidget.setCurrentWidget(
            self.supervised_classification.step1)
        self.StackedWidget_dock = QDockWidget('classification', self)
        self.StackedWidget_dock.setWidget(self.StackedWidget)
        self.addDockWidget(Qt.RightDockWidgetArea, self.StackedWidget_dock)

        # set the unsupervised classification window widget

        # set polygonize widget
        polygonizewidget = Polygonize_ui()
        polygonizewidget.legendwidget = self.layerpanel
        self.StackedWidget.addWidget(polygonizewidget)

        # set rasterize widget
        rastrizewidget = Rasterize_ui()
        rastrizewidget.legendwidget = self.layerpanel
        rastrizewidget.legendwidget = self.layerpanel
        self.StackedWidget.addWidget(rastrizewidget)

        # set confusion matrix widget
        confusionmatrixwidget = Confusion_matrix_ui()
        self.StackedWidget.addWidget(confusionmatrixwidget)
        self.StackedWidget.addWidget(confusionmatrixwidget.resultsgroup)

        self.threadpool = QThreadPool()
        self.massage = QMessageBox(text='Running')
        self.StackedWidget_dock.setVisible(False)

        # set the widget for creating training set
        self.trainniwidget = create_training_set(self.canvas)
        self.StackedWidget.addWidget(self.trainniwidget)

        # connect signals and slots
        self.poligonize.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(polygonizewidget))
        self.poligonize.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle('Polygonize'))
        self.rasterize.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(rastrizewidget))
        self.rasterize.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle('Rasterize'))
        self.confusiomatrix.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(confusionmatrixwidget))
        self.confusiomatrix.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle('Confusion Matrix'))
        confusionmatrixwidget.done.connect(
            lambda: self.StackedWidget.setCurrentWidget(confusionmatrixwidget.
                                                        resultsgroup))
        self.supervised.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle(
                'Supervised classification'))
        self.supervised.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step1))
        self.supervised.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.poligonize.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.rasterize.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.confusiomatrix.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.training.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.training.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(self.trainniwidget))
        self.training.triggered.connect(
            lambda: self.trainniwidget.create_layer())
        self.supervised_classification.step1next.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step2))
        self.supervised_classification.step2back.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step1))
        self.supervised_classification.step2next.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step3))
        self.supervised_classification.step3back.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step2))
        self.loadprojectaction.triggered.connect(self.openproject)
        self.saveprojectasaction.triggered.connect(self.saveproject)
        self.newprojectaction.triggered.connect(self.newproject)
        self.saveaction.triggered.connect(self.save)
Example #33
0
    def __init__(self):
        super(Multitool, self).__init__()

        self.statusbar = self.statusBar()
        self.statusBar().showMessage('Ready')

        self.trayActions()
        self.trayMenu()
        self.trayIcon.setIcon(QIcon('icons/biohazard.svg'))
        self.trayIcon.show()

        self.stack1 = QWidget()  # Mouse Clicker
        self.stack2 = QWidget()  # Screenshot
        self.stack3 = QWidget()  # Player
        self.stack4 = QWidget()  # Calculator
        self.stack5 = QWidget()  # Camera
        self.stack6 = QWidget()  # Tetrix

        self.stack1UI()  # Mouse Clicker
        self.stack2UI()  # Screenshot
        self.stack3UI()  # Player
        self.stack4UI()  # Calculator
        self.stack5UI()  # Camera
        self.stack6UI()  # Tetrix

        self.Stack = QStackedWidget(self)
        self.Stack.addWidget(self.stack1)  # Mouse Clicker
        self.Stack.addWidget(self.stack2)  # Screenshot
        self.Stack.addWidget(self.stack3)  # Player
        self.Stack.addWidget(self.stack4)  # Calculator
        self.Stack.addWidget(self.stack5)  # Camera
        self.Stack.addWidget(self.stack6)  # Tetrix

        # General actions starts -------------------------------------
        exitAction = QAction(QIcon('icons/exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(QApplication.instance().quit)

        newMultitoolAction = QAction(QIcon('icons/new.png'), '&New Multitool',
                                     self)
        newMultitoolAction.setShortcut('Ctrl+N')
        newMultitoolAction.setStatusTip('New Multitool')
        newMultitoolAction.triggered.connect(self.newMultitoolWindow)

        aboutAction = QAction(QIcon('icons/biohazard.svg'), 'About', self)
        aboutAction.setStatusTip('About')
        aboutAction.triggered.connect(self.about)

        viewStatAction = QAction('View statusbar', self, checkable=True)
        viewStatAction.setStatusTip('View statusbar')
        viewStatAction.setChecked(True)
        viewStatAction.triggered.connect(self.toggleStatBar)

        viewToolbarAction = QAction('View toolbar', self, checkable=True)
        viewToolbarAction.setStatusTip('View toolbar')
        viewToolbarAction.setChecked(True)
        viewToolbarAction.triggered.connect(self.toggleToolBar)

        minimizeToTrayAction = QAction('Minimize to Tray',
                                       self,
                                       checkable=True)
        minimizeToTrayAction.setStatusTip('Minimize to Tray')
        minimizeToTrayAction.setChecked(False)
        minimizeToTrayAction.triggered.connect(self.minimizeToTray)
        # General actions ends ---------------------------------------

        # Widgets actions starts -------------------------------------
        mouseClickerAction = QAction(QIcon('icons/mouse.png'), 'Mouse Clicker',
                                     self)
        mouseClickerAction.setStatusTip('Mouse Clicker')
        mouseClickerAction.triggered.connect(lambda: self.display(0))

        screeenShotAction = QAction(QIcon('icons/screenshot.png'),
                                    'ScreenShot', self)
        screeenShotAction.setStatusTip('ScreenShot')
        screeenShotAction.triggered.connect(lambda: self.display(1))

        playerAction = QAction(QIcon('icons/player.jpeg'), 'Player', self)
        playerAction.setStatusTip('Player')
        playerAction.triggered.connect(lambda: self.display(2))

        calculatorAction = QAction(QIcon('icons/calc.ico'), 'Calculator', self)
        calculatorAction.setStatusTip('Calculator')
        calculatorAction.triggered.connect(lambda: self.display(3))

        cameraAction = QAction(QIcon('icons/camera.jpeg'), 'Camera', self)
        cameraAction.setStatusTip('Camera')
        cameraAction.triggered.connect(lambda: self.display(4))

        tetrixAction = QAction(QIcon('icons/tetrix.png'), 'Tetrix', self)
        tetrixAction.setStatusTip('Tetrix')
        tetrixAction.triggered.connect(lambda: self.display(5))
        # Widget actions ends ----------------------------------------

        # Menu bar creation starts -----------------------------------
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(newMultitoolAction)
        fileMenu.addAction(exitAction)

        viewMenu = menubar.addMenu('View')
        viewMenu.addAction(viewStatAction)
        viewMenu.addAction(viewToolbarAction)
        viewMenu.addAction(minimizeToTrayAction)

        viewMenuWidget = QMenu('List widget', self)
        viewMenuWidget.addAction(mouseClickerAction)
        viewMenuWidget.addAction(screeenShotAction)
        viewMenuWidget.addAction(playerAction)
        viewMenuWidget.addAction(calculatorAction)
        viewMenuWidget.addAction(cameraAction)
        viewMenu.addMenu(viewMenuWidget)

        gamesMenu = menubar.addMenu('&Games')
        gamesMenu.addAction(tetrixAction)

        helpMenu = menubar.addMenu('&Help')
        helpMenu.addAction(aboutAction)
        # Menu bar creation ends -------------------------------------

        # Toolbar creation starts -------------------------------------
        self.toolbar1 = self.addToolBar('File')
        self.toolbar1.addAction(newMultitoolAction)

        self.toolbar2 = self.addToolBar('Widgets')
        self.toolbar2.addAction(mouseClickerAction)
        self.toolbar2.addAction(screeenShotAction)
        self.toolbar2.addAction(playerAction)
        self.toolbar2.addAction(calculatorAction)
        self.toolbar2.addAction(cameraAction)

        self.toolbar3 = self.addToolBar('Games')
        self.toolbar3.addAction(tetrixAction)

        self.toolbar4 = self.addToolBar('Exit')
        self.toolbar4.addAction(exitAction)
        # Toolbar creation ends -------------------------------------

        self.setCentralWidget(self.Stack)
        self.setGeometry(300, 300, 700, 400)
        self.setWindowTitle('Multitool')
        self.setWindowIcon(QIcon('icons/biohazard.svg'))
        self.show()
Example #34
0
 def __init__(self, main_panel_widget=None, top_panel=None):
     if main_panel_widget is None:
         main_panel_widget = QStackedWidget()
         main_panel_widget.setMinimumSize(800, 600)
     super().__init__(main_panel_widget, top_panel)
Example #35
0
class MainWindow(QMainWindow):
    """ Set up interface main window"""
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("Smart Garden")
        self.central_widget = QStackedWidget()
        self.setCentralWidget(self.central_widget)
        self.setFixedSize(520, 350)
        self.start_window()

    def start_window(self):
        self.addThings_widget = AddThings(self)
        self.addThings_widget.garden_button.clicked.connect(self.adding_garden)
        self.addThings_widget.plant_button.clicked.connect(self.adding_plant)
        self.addThings_widget.device_button.clicked.connect(self.adding_device)
        self.central_widget.addWidget(self.addThings_widget)
        self.central_widget.setCurrentWidget(self.addThings_widget)

    def adding_garden(self):
        self.add_garden_widget = AddGarden(self)
        self.central_widget.addWidget(self.add_garden_widget)
        self.central_widget.setCurrentWidget(self.add_garden_widget)
        self.add_garden_widget.back_button.clicked.connect(self.start_window)

    def adding_plant(self):
        self.add_plant_widget = AddPlant(self)
        self.central_widget.addWidget(self.add_plant_widget)
        self.central_widget.setCurrentWidget(self.add_plant_widget)
        self.add_plant_widget.back_button.clicked.connect(self.start_window)

    def adding_device(self):
        self.add_device_widget = AddDevice(self)
        self.central_widget.addWidget(self.add_device_widget)
        self.central_widget.setCurrentWidget(self.add_device_widget)
        self.add_device_widget.back_button.clicked.connect(self.start_window)
Example #36
0
class switchUI(QWidget):
    """
    class documentation

    variables:

    methods:

    """

    CONTROL = 0
    CONFIGURATION = 1
    SETTINGS = 2

    def __init__(self, parent=None):
        super(switchUI, self).__init__(parent)
        self.setGeometry(0, 0, 600, 400)
        self.initUI()
        self.initConfig()

    def __str__(self):
        return "switchUI(): smart lights zone control switch"

    def __repr__(self):
        return "switchUI()"

    def initUI(self):
        self.stack = QStackedWidget(self)

        self.control = ControlWidget(self)
        self.config = ConfigWidget(self)
        self.settings = SettingsWidget(self)

        self.stack.addWidget(self.control)
        self.stack.addWidget(self.config)
        self.stack.addWidget(self.settings)

        lyt = QVBoxLayout(self)
        lyt.addWidget(self.stack)
        lyt.setContentsMargins(0, 0, 0, 0)

        self.stack.setCurrentIndex(self.CONTROL)  # control screen

        self.control.configure.connect(self.configure)
        self.config.done.connect(self.doneConfiguring)
        self.settings.done.connect(self.doneSettings)

        self.show()

    def initConfig(self):
        # we should check if a config file exists

        # read if exists

        # create defaults if no file exists
        self.settings = {
            'All': [True, True, True, True, True, True, True, True],
            'Min': [False, False, False, False, True, False, False, False],
            'TV': [True, False, True, False, False, False, False, False],
            'Mood': [True, True, True, True, False, True, False, False]
        }

        self.activeKey = 'All'

    def configure(self, key):

        print('** configure "{}"'.format(key))

        if (key.lower() == 'settings'):
            self.stack.setCurrentIndex(self.SETTINGS)
        else:
            self.activeKey = key
            self.activeSetting = self.settings[key][:]

            self.stack.setCurrentIndex(self.CONFIGURATION)
            self.stack.currentWidget().initSettings(self.activeSetting)

    def doneConfiguring(self, state):

        if (state):
            self.settings[self.activeKey] = self.activeSetting[:]

        self.stack.setCurrentIndex(self.CONTROL)
        self.stack.currentWidget().setActiveButton(self.activeKey)

        print('*** status {} : {} ***'.format(
            'changed' if state else 'unchanged',
            self.settings[self.activeKey]))

    def doneSettings(self):

        self.stack.setCurrentIndex(self.CONTROL)
class MinWindow(Winform):
    def __init__(self, parent=None):
        super(MinWindow, self).__init__(parent)

        self.setWindowTitle('主窗口')
        self.resize(900, 600)
        self.center()

        # 创建主窗口
        self.create_main_frame()
        self.add_button()
        # 创建菜单
        self.create_menu()
        # 画出图像
        self.on_draw()

        # 绑定所有事件
        self.events_all_siganl_connect()

    def save_plot(self):
        # 保存当前matplotlib图像
        file_choices = "PNG (*.png)|*.png"

        # path = QFileDialog.getSaveFileName(self,
        #                                    'Save file', '',
        #                                    file_choices)
        # path = self.get_current_path()
        self.stack_tabWidget.currentWidget().mpl_nav_toolbar.save_figure()

        # if path:
        #     print('保存啊')
        #     # self.stack_tabWidget.currentWidget()
        #     self.stack_tabWidget.currentWidget().mpl_nav_toolbar.save_figure()
        #     print('保存了啊')
        #     self.statusBar().showMessage('Saved to %s' % path, 2000)

        pass

    def create_menu(self):
        # 添加菜单栏

        self.setCentralWidget(self.centralwidget)

        # 添加菜单栏
        self.main_menubar = QtWidgets.QMenuBar()
        self.main_menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.main_menubar.setObjectName("main_menubar")

        self.menu = QtWidgets.QMenu(self.main_menubar)
        self.menu.setObjectName("menu")
        self.file_menu = QtWidgets.QMenu(self.main_menubar)
        self.file_menu.setObjectName("file_menu")

        self.save_menu = QtWidgets.QMenu(self.main_menubar)
        self.save_menu.setObjectName("save_menu")

        self.setMenuBar(self.main_menubar)

        self.statusbar = QtWidgets.QStatusBar()
        self.statusbar.setObjectName("statusbar")

        self.setStatusBar(self.statusbar)

        # 添加状态栏
        self.show_status_bar()
        # self.statusbar.showMessage("这是状态栏")

        self.plot_save_action = QtWidgets.QAction()
        self.plot_save_action.setObjectName("plot_save_action")

        # 给自己添加绑定事件
        # self.plot_save_action.set
        _translate = QtCore.QCoreApplication.translate
        self.menu.setTitle(_translate("MainWindow", "菜单"))
        self.file_menu.setTitle(_translate("MainWindow", "保存"))
        self.save_menu.setTitle(_translate("MainWindow", "保存图片"))
        self.plot_save_action.setText(_translate("MainWindow", "保存图片"))

        # self.file_menu.addAction(self.plot_save_action)
        self.main_menubar.addAction(self.menu.menuAction())
        self.main_menubar.addAction(self.file_menu.menuAction())
        self.main_menubar.addAction(self.save_menu.menuAction())

        self.retranslateUi()

        # 给菜单按钮添加绑定事件
        # QtCore.QMetaObject.connectSlotsByName(self)
        save_file_action = self.create_action("&保存图像",
                                              shortcut="Ctrl+S",
                                              slot=self.save_plot,
                                              tip="Save the plot")
        quit_action = self.create_action("&Quit",
                                         slot=self.close,
                                         shortcut="Ctrl+Q",
                                         tip="Close the application")

        self.add_actions(self.file_menu, (save_file_action, None, quit_action))
        pass

    def create_main_frame(self):
        # 窗口布局
        # 添加主窗口
        self.setObjectName("MainWindow")
        self.centralwidget = QtWidgets.QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)

        self.main_widget = QtWidgets.QWidget(self.centralwidget)
        self.main_widget.setGeometry(QtCore.QRect(10, 20, 761, 481))
        self.main_widget.setObjectName("main_widget")

        # 此区域存放图像
        self.stack_tabWidget = QtWidgets.QTabWidget(self.main_widget)
        self.stack_tabWidget.setGeometry(QtCore.QRect(30, 60, 721, 401))
        self.stack_tabWidget.setObjectName("stack_tabWidget")

        # 此区域存放图像的工具栏
        self.toolbar_stackedWidget = QStackedWidget(self.main_widget)
        self.toolbar_stackedWidget.setGeometry(QtCore.QRect(20, 0, 791, 71))
        self.toolbar_stackedWidget.setObjectName("toolbar_stackedWidget")

    def on_draw(self):
        # 添加图像
        self.draw_all_stack_tab()
        # 添加工具栏
        self.set_all_stack_tab_toolbar()
        pass

    def create_status_bar(self):

        pass

    def create_action(self,
                      text,
                      slot=None,
                      shortcut=None,
                      icon=None,
                      tip=None,
                      checkable=False,
                      signal="triggered()"):
        action = QAction(text, self)
        if icon is not None:
            # action.setIcon(QIcon(":/%s.png" % button_icon))
            pass
        if shortcut is not None:
            action.setShortcut(shortcut)
        if tip is not None:
            action.setToolTip(tip)
            action.setStatusTip(tip)
        if slot is not None:
            action.triggered.connect(slot)
        if checkable:
            action.setCheckable(True)
        return action

    def add_actions(self, target, actions):
        for action in actions:
            if action is None:
                target.addSeparator()
            else:
                target.addAction(action)

    def add_button(self):
        self.save_pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.save_pushButton.setGeometry(QtCore.QRect(800, 160, 75, 23))
        self.save_pushButton.setObjectName("save_pushButton")
        pass

    def on_about(self):
        # 弹出关于此软件的信息
        msg = """ A demo of using PyQt with matplotlib:

         * Use the matplotlib navigation bar
         * Add values to the text box and press Enter (or click "Draw")
         * Show or hide the grid
         * Drag the slider to modify the width of the bars
         * Save the plot to a file using the File menu
         * Click on a bar to receive an informative message
        """
        QMessageBox.about(self, "About the demo", msg.strip())

    def retranslateUi(self):
        # 设置各个菜单的名字
        _translate = QtCore.QCoreApplication.translate

        self.setWindowTitle(_translate("MainWindow", "曲线翻页"))

        # self.stack_tabWidget.setTabText(self.stack_tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
        # self.stack_tabWidget.setTabText(self.stack_tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))

        self.menu.setTitle(_translate("MainWindow", "菜单"))
        self.file_menu.setTitle(_translate("MainWindow", "保存"))
        self.save_menu.setTitle(_translate("MainWindow", "状态"))
        self.plot_save_action.setText(_translate("MainWindow", "保存图片"))
        self.save_pushButton.setText(_translate("MainWindow", "点击保存"))

    def draw_all_stack_tab(self):
        # 绘制所有图像
        # 添加到stack_tabWidget上

        # 创建matplot画布
        self.tab1 = PlotCanvas(self, width=9, height=6, dpi=100)
        self.tab2 = PlotCanvas(self, width=9, height=6, dpi=100)
        self.tab3 = PlotCanvas(self, width=9, height=6, dpi=100)
        # mpl.draw_one_line()

        # 加载数据
        # 在不同的画布上画出来
        # 将所有f分页加入到tabWidget上
        lines = load_all_lines()

        self.tab1.draw_one_line(lines[0])
        self.tab2.draw_one_line(lines[1])
        self.tab3.draw_one_line(lines[2])

        # 将所有的tab添加到stack_tabWidget上
        self.stack_tabWidget.addTab(self.tab1, 'td=0.12')
        self.stack_tabWidget.addTab(self.tab2, 'td=0.144')
        self.stack_tabWidget.addTab(self.tab3, 'td=0.176')
        pass

    def set_all_stack_tab_toolbar(self):
        # 添加图像的工具栏 所有的工具栏用容器toolbar_stackedWidget保存
        self.add_stack_toolbar()
        self.tab1_ntb = NavigationToolbar(self.tab1,
                                          self.toolbar_page1)  # 添加完整的 toolbar
        self.tab2_ntb = NavigationToolbar(self.tab2,
                                          self.toolbar_page2)  # 添加完整的 toolbar
        self.tab3_ntb = NavigationToolbar(self.tab3,
                                          self.toolbar_page3)  # 添加完整的 toolbar

        self.tab1.mpl_nav_toolbar = self.tab1_ntb
        self.tab2.mpl_nav_toolbar = self.tab2_ntb
        self.tab3.mpl_nav_toolbar = self.tab3_ntb
        # log('设置了的')
        pass

    def show_status_bar(self):
        # 添加状态栏
        self.status_text = QLabel(" demo 状态栏")
        self.statusbar.addWidget(self.status_text, 1)

    def add_stack_toolbar(self):
        # 添加matplotlib的工具栏
        # toolbar_stackedWidget

        # 创建QStackedWidget容器 将matplotlib所有图像的工具栏叠加放在一起
        # self.toolbar_stackedWidget = QStackedWidget()

        # 创建不同的 QWidget保存单个matplotlib图像的工具栏
        self.toolbar_page1 = QtWidgets.QWidget()
        self.toolbar_page1.setObjectName("toolbar_page1")

        self.toolbar_page2 = QtWidgets.QWidget()
        self.toolbar_page2.setObjectName("toolbar_page2")

        self.toolbar_page3 = QtWidgets.QWidget()
        self.toolbar_page3.setObjectName("toolbar_page3")

        # 初始化空白toolbar区域
        # 添加三个空页
        self.toolbar_stackedWidget.addWidget(self.toolbar_page1)
        self.toolbar_stackedWidget.addWidget(self.toolbar_page2)
        self.toolbar_stackedWidget.addWidget(self.toolbar_page3)

        pass

    def events_all_siganl_connect(self):
        # 连接所有的事件

        # 切换tabWidget图像 显示 当前图像的toolbar
        self.stack_tabWidget.currentChanged.connect(
            self.event_change_toolbar_page)

        # 点击按钮 保存当前图像
        self.save_pushButton.clicked.connect(self.save_plot)

        pass

    def event_change_toolbar_page(self):
        # 切换当前td图像触发
        # 在toolbar_stackedWidget区域显示当前图像的matplotlib工具栏

        # 获取当前的tab
        # log('点击了当前的widget')
        c = self.stack_tabWidget.currentIndex()
        # 设置当前stackWidget的当前
        self.toolbar_stackedWidget.setCurrentIndex(c)
        # log("toolbar_stackedWidget 当前页面是({})".format(c))
        # 设置当前的tool stackWidget的page
        pass

    def get_current_path(self):
        # 获取当前文件目录
        paths = sys.path
        current_file = os.path.basename(__file__)
        for path in paths:
            try:
                if current_file in os.listdir(path):
                    self.current_path = path
                    break
            except (FileExistsError, FileNotFoundError) as e:
                print(e)
class ConfigDialog(QDialog):
    def __init__(self, parent=None):
        super(ConfigDialog, self).__init__(parent)

        self.msg_box = MessageBox()
        self.ejabberd = EjabberdPage()
        self.lider_page = LiderPage()

        self.contentsWidget = QListWidget()
        self.contentsWidget.setViewMode(QListView.IconMode)
        self.contentsWidget.setIconSize(QSize(64, 64))
        self.contentsWidget.setMovement(QListView.Static)
        self.contentsWidget.setMaximumWidth(128)
        self.contentsWidget.setMinimumWidth(128)
        self.contentsWidget.setMinimumHeight(700)
        self.contentsWidget.setSpacing(12)

        self.pagesWidget = QStackedWidget()
        self.pagesWidget.setMinimumHeight(800)
        self.pagesWidget.setMinimumWidth(1024)

        self.pagesWidget.addWidget(SettingsPage())
        # self.pagesWidget.addWidget(DatabasePage())
        # self.pagesWidget.addWidget(OpenLdapPage())
        # self.pagesWidget.addWidget(EjabberdPage())
        # self.pagesWidget.addWidget(LiderPage())
        # self.pagesWidget.addWidget(LiderConsolePage())
        # self.pagesWidget.addWidget(AhenkPage())
        # self.pagesWidget.addWidget(WatchLog())
        closeButton = QPushButton("Kapat")
        aboutButton = QPushButton("Hakkında")
        # self.createIcons()
        self.contentsWidget.setCurrentRow(0)
        closeButton.clicked.connect(self.close_page)
        aboutButton.clicked.connect(self.about_lider_installer)

        horizontalLayout = QHBoxLayout()
        # horizontalLayout.addWidget(self.contentsWidget)
        horizontalLayout.addWidget(self.pagesWidget, 1)

        buttonsLayout = QHBoxLayout()
        buttonsLayout.addStretch(0)
        buttonsLayout.addWidget(aboutButton)
        buttonsLayout.addStretch(1)
        buttonsLayout.addWidget(closeButton)

        mainLayout = QVBoxLayout()
        mainLayout.addLayout(horizontalLayout)
        mainLayout.addStretch(1)
        mainLayout.addSpacing(12)
        mainLayout.addLayout(buttonsLayout)

        self.setLayout(mainLayout)
        self.setWindowTitle("Lider Ahenk Kurulum Uygulaması")
        self.setWindowIcon(QIcon(":/images/liderahenk-32.png"))

    def close_page(self):
        for proc in psutil.process_iter():
            # check whether the process name matches
            if proc.name() == "xterm":
                proc.kill()
        self.close()

    def about_lider_installer(self):
        self.msg_box.about(
            "Lider Ahenk Merkezi Yönetim Sistemi Kurulum Uygulaması\nDaha fazla bilgi için...\nwww.liderahenk.org\nVersiyon: 2.0"
        )

    def changePage(self, current, previous):
        if not current:
            current = previous
        self.pagesWidget.setCurrentIndex(self.contentsWidget.row(current))

    def createIcons(self):
        vagrantButton = QListWidgetItem(self.contentsWidget)
        vagrantButton.setIcon(QIcon(':/images/settings.png'))
        vagrantButton.setText("Sunucu\nAyarları")
        vagrantButton.setTextAlignment(Qt.AlignHCenter)
        vagrantButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        # dbButton = QListWidgetItem(self.contentsWidget)
        # dbButton.setIcon(QIcon(':/images/database.png'))
        # dbButton.setText("Veritabanı")
        # dbButton.setTextAlignment(Qt.AlignHCenter)
        # dbButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
        #
        # ldapButton = QListWidgetItem(self.contentsWidget)
        # ldapButton.setIcon(QIcon(':/images/ldap.png'))
        # ldapButton.setText("OpenLDAP")
        # ldapButton.setTextAlignment(Qt.AlignHCenter)
        # ldapButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
        #
        # xmppButton = QListWidgetItem(self.contentsWidget)
        # xmppButton.setIcon(QIcon(':/images/ejabberd.png'))
        # xmppButton.setText("Ejabberd")
        # xmppButton.setTextAlignment(Qt.AlignHCenter)
        # xmppButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        # liderButton = QListWidgetItem(self.contentsWidget)
        # liderButton.setIcon(QIcon(':/images/liderahenk.png'))
        # liderButton.setText("Lider Kur")
        # liderButton.setTextAlignment(Qt.AlignHCenter)
        # liderButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        # consoleButton = QListWidgetItem(self.contentsWidget)
        # consoleButton.setIcon(QIcon(':/images/lider_console.png'))
        # consoleButton.setText("Lider\nArayüz")
        # consoleButton.setTextAlignment(Qt.AlignHCenter)
        # consoleButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        # ahenkButton = QListWidgetItem(self.contentsWidget)
        # ahenkButton.setIcon(QIcon(':/images/ahenk.png'))
        # ahenkButton.setText("Ahenk Kur")
        # ahenkButton.setTextAlignment(Qt.AlignHCenter)
        # ahenkButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
        #
        # logButton = QListWidgetItem(self.contentsWidget)
        # logButton.setIcon(QIcon(':/images/log.png'))
        # logButton.setText("Log")
        # logButton.setTextAlignment(Qt.AlignHCenter)
        # logButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        self.contentsWidget.currentItemChanged.connect(self.changePage)
Example #39
0
class LeftTabWidget(QWidget):
    '''左侧选项栏'''
    pointlist = []  #########

    def __init__(self):
        super(LeftTabWidget, self).__init__()
        self.setObjectName('LeftTabWidget')

        self.setWindowTitle('LeftTabWidget')
        self.list_style = ('''
            QListWidget, QListView, QTreeWidget, QTreeView {
                outline: 0px;
            }

            QListWidget {
                min-width: 200px;
                max-width: 200px;
                
                color: White;
                background:#454545;
            }

            QListWidget::Item:selected {
                background: lightGray;
                border-left: 5px solid #EE9A00;
                color: black
            }
            HistoryPanel:hover {
                background: rgb(52, 52, 52);
            }
        ''')

        #####################################################ZL
        self.left = 200
        self.top = 200
        self.width = 1000
        self.height = 800
        self.setGeometry(self.left, self.top, self.width, self.height)
        #####################################################ZL

        self.main_layout = QHBoxLayout(self, spacing=0)  #窗口的整体布局
        self.main_layout.setContentsMargins(0, 0, 0, 0)

        self.left_widget = QListWidget()  #左侧选项列表
        self.left_widget.setStyleSheet(self.list_style)
        self.main_layout.addWidget(self.left_widget)

        self.right_widget = QStackedWidget()
        self.main_layout.addWidget(self.right_widget)

        self._setup_ui()

        f = open('/home/robot/waypoints.xml', 'r')  #############
        pointlist = re.findall(r"(?<=<Name>).+?(?=</Name>)", f.read(),
                               re.S)  ########
        f.close()  #######
        self.comboBox2.addItems(pointlist)  ######

    def _setup_ui(self):
        '''加载界面ui'''

        self.left_widget.currentRowChanged.connect(
            self.right_widget.setCurrentIndex)  #list和右侧窗口的index对应绑定

        self.left_widget.setFrameShape(QListWidget.NoFrame)  #去掉边框

        self.left_widget.setVerticalScrollBarPolicy(
            Qt.ScrollBarAlwaysOff)  #隐藏滚动条
        self.left_widget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        list_str = [
            '功能选择', '扫地', '导航', '取物', '关于MOSS', '使用方法', '注意事项', '硬件设置',
            '联系与帮助', '遇到问题', '联系lzz'
        ]

        for i in range(11):
            self.item = QListWidgetItem(list_str[i],
                                        self.left_widget)  #左侧选项的添加
            self.item.setFont(QFont("等线", 11))
            if i == 0 or i == 4 or i == 8:
                self.item.setBackground(QColor('#EE9A00'))
                self.item.setFont(QFont("等线", 13, QFont.Bold))
                if i == 0:
                    self.item.setIcon(
                        qtawesome.icon('fa.hand-pointer-o', color='white'))
                elif i == 4:
                    self.item.setIcon(qtawesome.icon('fa.tags', color='white'))
                elif i == 8:
                    self.item.setIcon(
                        qtawesome.icon('fa.envelope', color='white'))

            self.item.setSizeHint(QSize(60, 65))
            self.item.setTextAlignment(Qt.AlignCenter)  #居中显示

            if i == 1:
                self.centralWidget1 = QtWidgets.QWidget()
                self.centralWidget1.setStyleSheet(
                    '''background:black;border-width:0;''')
                self.layout1 = QtWidgets.QGridLayout()  # 创建左侧部件的网格布局层
                self.centralWidget1.setLayout(self.layout1)

                self.edit1_1 = QtWidgets.QLineEdit()
                self.edit1_1.setPlaceholderText("请输入速度(两位小数,0.0-1.0)")
                self.edit1_1.setStyleSheet(
                    '''color:white;background:transparent;border-width:0;
                                                border-style:outset;border-bottom:1px solid white;
                                                font-size:20px; font-family:等线;'''
                )
                self.vel_reg = QRegExp(r"^(0)|(0\.[0-9])|(1)|(1\.0)$")
                self.vel_validator = QRegExpValidator(self.vel_reg,
                                                      self.edit1_1)
                self.edit1_1.setValidator(self.vel_validator)

                self.edit1_2 = QtWidgets.QLineEdit()
                self.edit1_2.setPlaceholderText("请输入时间(三位整数)")
                self.edit1_2.setStyleSheet(
                    '''color:white;background:transparent;border-width:0;
                                                border-style:outset;border-bottom:1px solid white;
                                                font-size:20px; font-family:等线;'''
                )
                self.time_reg = QRegExp("^[0-9]{3}$")
                self.time_validator = QRegExpValidator(self.time_reg,
                                                       self.edit1_2)
                self.edit1_2.setValidator(self.time_validator)

                self.label1_1 = QtWidgets.QLabel()  #设置label
                self.label1_1.setTextFormat(QtCore.Qt.AutoText)
                self.label1_1.setText("速度")
                self.label1_1.setStyleSheet(
                    '''color:white;font-size:23px; font-family:等线;''')
                self.label1_1.setAlignment(Qt.AlignCenter)

                self.label1_2 = QtWidgets.QLabel()
                self.label1_2.setTextFormat(QtCore.Qt.AutoText)
                self.label1_2.setText("时间")
                self.label1_2.setStyleSheet(
                    '''color:white;font-size:23px; font-family:等线;''')
                self.label1_2.setAlignment(Qt.AlignCenter)

                self.label1_3 = QtWidgets.QLabel()
                self.label1_3.setTextFormat(QtCore.Qt.AutoText)
                self.label1_3.setText("扫地")
                self.label1_3.setStyleSheet(
                    '''color:white;font-size:23px;background:rgb(100,100,100,80;background:#454545);
                                                font-family:等线;''')
                self.label1_3.setAlignment(Qt.AlignCenter)

                self.button1 = QtWidgets.QPushButton()
                self.button1.setText("开始")
                self.button1.setFixedSize(100, 40)
                self.button1.setStyleSheet(
                    '''QPushButton{background:#EE9A00;border-radius:10px;font-family:等线;
                                               font-size:18px;color:white}QPushButton:hover{background:#EEDC82;}'''
                )
                self.button1.clicked.connect(self.button1_1click)

                self.layout1.setColumnStretch(0, 2)
                self.layout1.setColumnStretch(1, 2)
                self.layout1.setColumnStretch(2, 2)
                self.layout1.setColumnStretch(3, 2)
                self.layout1.setColumnStretch(5, 2)
                self.layout1.setColumnStretch(6, 2)
                self.layout1.setColumnStretch(7, 2)
                self.layout1.setColumnStretch(8, 2)
                self.layout1.setColumnStretch(4, 1)

                self.layout1.addWidget(self.label1_3, 0, 0, 1, 9)
                self.layout1.addWidget(self.label1_1, 4, 2, 2, 2)
                self.layout1.addWidget(self.label1_2, 6, 2, 2, 2)
                self.layout1.addWidget(self.edit1_1, 4, 4, 2, 3)
                self.layout1.addWidget(self.edit1_2, 6, 4, 2, 3)
                self.layout1.addWidget(self.button1, 9, 4, 2, 2)
                self.right_widget.addWidget(self.centralWidget1)

            elif i == 2:
                self.centralWidget2 = QtWidgets.QWidget()

                self.centralWidget2.setStyleSheet(
                    '''background:black;border-width:0;''')
                self.layout2 = QtWidgets.QGridLayout()  # 创建左侧部件的网格布局层
                self.centralWidget2.setLayout(self.layout2)

                self.button2_1 = QtWidgets.QPushButton(self.centralWidget2)
                #self.button2_1.setGeometry(QtCore.QRect(210, 110, 100, 60))
                self.button2_1.setObjectName("button1")
                self.button2_1.setText("构建地图")
                self.button2_1.clicked.connect(self.button2_1click)
                self.button2_1.setFixedSize(200, 80)
                self.button2_1.setStyleSheet(
                    '''QPushButton{background:#EE9A00;border-radius:20px;font-family:等线;
                                               font-size:18px;color:white}QPushButton:hover{background:#EEDC82;}'''
                )

                self.button2_2 = QtWidgets.QPushButton(self.centralWidget2)
                #self.button2_2.setGeometry(QtCore.QRect(350, 110, 100, 60))
                self.button2_2.setObjectName("button2")
                self.button2_2.setText("保存地图")
                self.button2_2.clicked.connect(self.button2_2click)
                self.button2_2.setFixedSize(200, 80)
                self.button2_2.setStyleSheet(
                    '''QPushButton{background:#EE9A00;border-radius:20px;font-family:等线;
                                               font-size:18px;color:white}QPushButton:hover{background:#EEDC82;}'''
                )

                self.button2_3 = QtWidgets.QPushButton(self.centralWidget2)
                #self.button2_3.setGeometry(QtCore.QRect(210, 210, 100, 60))
                self.button2_3.setObjectName("button3")
                self.button2_3.setText("设立航点")
                self.button2_3.clicked.connect(self.button2_3click)
                self.button2_3.setFixedSize(200, 80)
                self.button2_3.setStyleSheet(
                    '''QPushButton{background:#EE9A00;border-radius:20px;font-family:等线;
                                               font-size:18px;color:white}QPushButton:hover{background:#EEDC82;}'''
                )

                self.button2_4 = QtWidgets.QPushButton(self.centralWidget2)
                #self.button2_4.setGeometry(QtCore.QRect(350, 210, 100, 60))
                self.button2_4.setObjectName("button4")
                self.button2_4.setText("保存航点")
                self.button2_4.clicked.connect(self.button2_4click)
                self.button2_4.setFixedSize(200, 80)
                self.button2_4.setStyleSheet(
                    '''QPushButton{background:#EE9A00;border-radius:20px;font-family:等线;
                                               font-size:18px;color:white}QPushButton:hover{background:#EEDC82;}'''
                )

                self.button2_5 = QtWidgets.QPushButton(self.centralWidget2)
                #self.button2_5.setGeometry(QtCore.QRect(210, 310, 240, 60))
                self.button2_5.setObjectName("button5")
                self.button2_5.setText("开始导航")
                self.button2_5.clicked.connect(self.button2_5click)
                self.button2_5.setFixedSize(466, 80)
                self.button2_5.setStyleSheet(
                    '''QPushButton{background:#EE9A00;border-radius:20px;font-family:等线;
                                               font-size:18px;color:white}QPushButton:hover{background:#EEDC82;}'''
                )

                self.comboBox2 = QtWidgets.QComboBox(self.centralWidget2)
                #self.comboBox2.setGeometry(QtCore.QRect(210, 410, 100, 30))
                self.comboBox2.setObjectName("comboBox")
                #self.comboBox2.addItems(self.pointlist)
                self.comboBox2.setFixedSize(200, 50)
                self.comboBox2.setStyleSheet(
                    '''QComboBox{background:#EE9A00;border-radius:10px;font-family:等线;
                                               font-size:18px;color:white}QComboBox:hover{background:#EEDC82;}'''
                )

                self.button2_6 = QtWidgets.QPushButton(self.centralWidget2)
                #self.button2_6.setGeometry(QtCore.QRect(350, 410, 100, 30))
                self.button2_6.setObjectName("button6")
                self.button2_6.setText("G O !")
                self.button2_6.clicked.connect(self.button2_6click)
                self.button2_6.setFixedSize(200, 50)
                self.button2_6.setStyleSheet(
                    '''QPushButton{background:#EE9A00;border-radius:20px;font-family:等线;
                                               font-size:18px;color:white}QPushButton:hover{background:#EEDC82;}'''
                )

                self.label2_1 = QtWidgets.QLabel()
                self.label2_1.setTextFormat(QtCore.Qt.AutoText)
                self.label2_1.setText("导航")
                self.label2_1.setStyleSheet(
                    '''color:white;font-size:23px;background:rgb(100,100,100,100);
                                                font-family:等线;''')
                self.label2_1.setAlignment(Qt.AlignCenter)

                self.layout2.setColumnStretch(0, 1)
                self.layout2.setColumnStretch(1, 1)
                self.layout2.setColumnStretch(2, 1)
                self.layout2.setColumnStretch(3, 1)
                self.layout2.setColumnStretch(4, 1)
                self.layout2.setColumnStretch(5, 1)
                self.layout2.setColumnStretch(6, 1)
                self.layout2.setColumnStretch(7, 1)
                self.layout2.setColumnStretch(8, 1)
                self.layout2.setColumnStretch(9, 1)
                self.layout2.setColumnStretch(10, 1)
                self.layout2.setColumnStretch(11, 1)
                self.layout2.setColumnStretch(12, 1)

                self.layout2.addWidget(self.label2_1, 0, 0, 1, 13)
                self.layout2.addWidget(self.button2_1, 2, 3, 2, 3)
                self.layout2.addWidget(self.button2_2, 2, 7, 2, 3)
                self.layout2.addWidget(self.button2_3, 6, 3, 2, 3)
                self.layout2.addWidget(self.button2_4, 6, 7, 2, 3)
                self.layout2.addWidget(self.button2_5, 10, 3, 2, 7)
                self.layout2.addWidget(self.button2_6, 14, 7, 2, 3)
                self.layout2.addWidget(self.comboBox2, 14, 3, 2, 3)

                self.right_widget.addWidget(self.centralWidget2)

            else:
                self.centralWidget0 = QtWidgets.QWidget()
                self.centralWidget0.setStyleSheet(
                    '''background:white;border-width:0;''')
                self.right_widget.addWidget(self.centralWidget0)

    def button1_1click(self):
        vel = 0
        time = 0

        if self.edit1_1.text() == "":
            vel = 0.5
        else:
            vel = float(self.edit1_1.text())

        if self.edit1_2.text() == "":
            time = 60
        else:
            time = int(self.edit1_2.text())

        self.setConfig(vel, time)

        os.system(free_walk_cmd)

    def setConfig(self, vel, time):
        vel_pattern = re.compile(vel_config)
        time_pattern = re.compile(time_config)

        with open(config_path, "w") as f:
            f.truncate()
            f.write(str(vel))
            f.write("\n")
            f.write(str(time))

    def button2_1click(self):
        print("roslaunch wpb_home_tutorials gmapping.launch")
        #os.system("roslaunch wpb_home_tutorials gmapping.launch")
        os.system(
            "gnome-terminal -e 'bash -c \"roslaunch wpb_home_tutorials gmapping.launch\"'"
        )
        #os.system("gnome-terminal -e 'bash -c \"ls\"'")
        #os.system("gnome-terminal -e 'bash -c \"roslaunch wpb_home_tutorials gmapping.launch; exec bash\"'")
    def button2_2click(self):
        print("rosrun map_server map_saver -f map")
        os.system(
            "gnome-terminal -e 'bash -c \"rosrun map_server map_saver -f map&&cp /home/robot/catkin_ws/src/team_201/map.yaml /home/robot/catkin_ws/src/wpb_home/wpb_home_tutorials/maps/map.yaml&&cp /home/robot/catkin_ws/src/team_201/map.pgm /home/robot/catkin_ws/src/wpb_home/wpb_home_tutorials/maps/map.pgm\"'"
        )  ##yidong

#save in the main dir
#print("移动指令")
#may be we do not need to really change the map path, because we can change the map path in some launch files
#such as, in add_waypoint.launch, we can change
#args="$(find wpb_home_tutorials)/maps/map.yaml"/>
#into
#args="/home/robot/map.yaml"/>

    def button2_3click(self):
        print("roslaunch waterplus_map_tools add_waypoint.launch")
        os.system(
            "gnome-terminal -e 'bash -c \"roslaunch waterplus_map_tools add_waypoint.launch\"'"
        )
        ###???????????????????????????????????
    def button2_4click(self):
        print("rosrun waterplus_map_tools wp_saver")
        os.system(
            "gnome-terminal -e 'bash -c \"cd /home/robot/&&rosrun waterplus_map_tools wp_saver\"'"
        )
        time.sleep(2)
        #os.system("rosrun waterplus_map_tools wp_saver")
        #os.system("gnome-terminal -e 'bash -c \"rosrun waterplus_map_tools wp_saver; exec bash\"'")
        #save waypoints.xml into /home/robot/
        self.comboBox2.clear()
        f = open('/home/robot/waypoints.xml', 'r')
        pointlist = re.findall(r"(?<=<Name>).+?(?=</Name>)", f.read(), re.S)
        print(pointlist)
        self.comboBox2.addItems(pointlist)
        f.close()

    def button2_5click(self):
        print("roslaunch wpb_home_apps 6_path_plan.launch")
        os.system(
            "gnome-terminal -e 'bash -c \"roslaunch wpb_home_apps 6_path_plan.launch; exec bash\"'"
        )

    def button2_6click(self):
        print(self.comboBox2.currentIndex() + 1)
        #get to the chosed point
        pointoutput = open('/home/robot/point.txt', 'w')
        pointoutput.write(str(self.comboBox2.currentIndex() + 1))
        pointoutput.close()
Example #40
0
class DiyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUi()

    def initUi(self):
        # 状态栏
        self.statusBar()

        # 功能Action
        single_rec_act = QAction(QIcon('./0.png'), '文字识别', self)
        single_rec_act.setShortcut('Ctrl+F')
        single_rec_act.setStatusTip('对单个文字进行识别')
        single_rec_act.triggered.connect(self.changeLayout)
        single_info_act = QAction(QIcon('./1_1.png'), '单字信息', self)
        single_info_act.setShortcut('Ctrl+S')
        single_info_act.setStatusTip('单个文字的信息')
        single_info_act.triggered.connect(self.changeLayout)
        rubbing_info_act = QAction(QIcon('./2_1.png'), '拓片信息', self)
        rubbing_info_act.setShortcut('Ctrl+R')
        rubbing_info_act.setStatusTip('整个拓片的信息')
        rubbing_info_act.triggered.connect(self.changeLayout)

        # 菜单栏
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('功能')
        fileMenu.addAction(single_rec_act)
        fileMenu.addAction(single_info_act)
        fileMenu.addAction(rubbing_info_act)

        # 工具栏
        toolbar = self.addToolBar('功能')
        toolbar.addAction(single_rec_act)
        toolbar.addAction(single_info_act)
        toolbar.addAction(rubbing_info_act)

        # 需要的变量
        self.path = ""
        self.color = QColor(255, 255, 255)
        # 初始化第一个功能布局:文字识别
        self.initLayout0()
        # 初始化第二个功能布局:单字信息
        self.initLayout1()
        # 初始化第三个功能布局:拓片信息
        self.initLayout2()

        self.stacked = QStackedWidget()
        self.stacked.addWidget(self.layout0)
        self.stacked.addWidget(self.layout1)
        self.stacked.addWidget(self.layout2)
        self.setCentralWidget(self.stacked)

        self.setGeometry(100, 100, 600, 450)
        self.setFixedSize(600, 450)
        self.setWindowTitle('金文识别')
        self.setWindowIcon(QIcon('./4.png'))
        self.center()
        self.show()

    def initLayout0(self):
        # 布局
        grid = QGridLayout()
        self.lf = QLabel("金文图片")
        self.lf.setAlignment(Qt.AlignCenter)
        self.lf.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        btn0 = QPushButton("选择图片")
        btn0.setStyleSheet(
            "QPushButton { height: 50 }")
        btn1 = QPushButton("识别")
        btn1.setStyleSheet(
            "QPushButton { height: 50 }")
        l0_l = QLabel("Top-1")
        l0_l.setAlignment(Qt.AlignCenter)
        self.l0_c = QLabel()
        self.l0_c.setAlignment(Qt.AlignCenter)
        self.l0_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        l1_l = QLabel("Top-2")
        l1_l.setAlignment(Qt.AlignCenter)
        self.l1_c = QLabel()
        self.l1_c.setAlignment(Qt.AlignCenter)
        self.l1_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        l2_l = QLabel("Top-3")
        l2_l.setAlignment(Qt.AlignCenter)
        self.l2_c = QLabel()
        self.l2_c.setAlignment(Qt.AlignCenter)
        self.l2_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        l3_l = QLabel("Top-4")
        l3_l.setAlignment(Qt.AlignCenter)
        self.l3_c = QLabel()
        self.l3_c.setAlignment(Qt.AlignCenter)
        self.l3_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        l4_l = QLabel("Top-5")
        l4_l.setAlignment(Qt.AlignCenter)
        self.l4_c = QLabel()
        self.l4_c.setAlignment(Qt.AlignCenter)
        self.l4_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        grid.addWidget(self.lf, 1, 1, 10, 1)
        grid.addWidget(l0_l, 1, 2)
        grid.addWidget(self.l0_c, 1, 3)
        grid.addWidget(l1_l, 2, 2)
        grid.addWidget(self.l1_c, 2, 3)
        grid.addWidget(l2_l, 3, 2)
        grid.addWidget(self.l2_c, 3, 3)
        grid.addWidget(l3_l, 4, 2)
        grid.addWidget(self.l3_c, 4, 3)
        grid.addWidget(l4_l, 5, 2)
        grid.addWidget(self.l4_c, 5, 3)
        grid.addWidget(btn0, 6, 3, 2, 1)
        grid.addWidget(btn1, 8, 3, 2, 1)
        grid.setColumnStretch(1, 10)
        grid.setColumnStretch(2, 1)
        grid.setColumnStretch(3, 5)
        grid.setColumnStretch(4, 4)
        self.layout0 = QWidget()
        self.layout0.setLayout(grid)
        # 事件
        btn0.clicked.connect(self.selectImg)
        btn1.clicked.connect(self.predictImg)

    def selectImg(self):
        fname = QFileDialog.getOpenFileName(self, '选择图片')
        if fname[0]:
            self.path = fname[0]
            self.statusBar().showMessage("图片路径: " + self.path)
            pixmap = QPixmap(self.path)
            scaled_pixmap = pixmap.scaled(int(self.lf.width()), int(
                self.lf.height()), aspectRatioMode=Qt.KeepAspectRatio)
            self.lf.setPixmap(scaled_pixmap)
        else:
            QMessageBox.information(self, "Info.", "请选择图片^_^")

    def predictImg(self):
        pass

    def initLayout1(self):
        # 布局
        grid = QGridLayout()
        self.ls = QLabel("金文图片")
        self.ls.setAlignment(Qt.AlignCenter)
        self.ls.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        btn = QPushButton("选择单字图片显示信息")
        btn.setStyleSheet(
            "QPushButton { height: 50 }")
        l5_l = QLabel("总号")
        l5_l.setAlignment(Qt.AlignCenter)
        self.l5_c = QLabel()
        self.l5_c.setAlignment(Qt.AlignCenter)
        self.l5_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        l6_l = QLabel("字形出处")
        l6_l.setAlignment(Qt.AlignCenter)
        self.l6_c = QLabel()
        self.l6_c.setAlignment(Qt.AlignCenter)
        self.l6_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        l7_l = QLabel("拓片情况")
        l7_l.setAlignment(Qt.AlignCenter)
        self.l7_c = QLabel()
        self.l7_c.setAlignment(Qt.AlignCenter)
        self.l7_c.setStyleSheet(
            "QLabel { background-color: %s }" % self.color.name())
        l8_l = QLabel("铭中句号")
        l8_l.setAlignment(Qt.AlignCenter)
        self.l8_c = QTextBrowser()
        self.l8_c.setStyleSheet(
            "QTextBrowser { background-color: %s; border: none }" % self.color.name())
        l9_l = QLabel("释文表")
        l9_l.setAlignment(Qt.AlignCenter)
        self.l9_c = QTextBrowser()
        self.l9_c.setStyleSheet(
            "QTextBrowser { background-color: %s; border: none }" % self.color.name())
        grid.addWidget(self.ls, 1, 1, 10, 1)
        grid.addWidget(l5_l, 1, 2)
        grid.addWidget(self.l5_c, 1, 3)
        grid.addWidget(l6_l, 2, 2)
        grid.addWidget(self.l6_c, 2, 3)
        grid.addWidget(l7_l, 3, 2)
        grid.addWidget(self.l7_c, 3, 3)
        grid.addWidget(l8_l, 4, 2)
        grid.addWidget(self.l8_c, 4, 3, 2, 1)
        grid.addWidget(l9_l, 6, 2)
        grid.addWidget(self.l9_c, 6, 3, 2, 1)
        grid.addWidget(btn, 8, 3, 2, 1)
        grid.setColumnStretch(1, 10)
        grid.setColumnStretch(2, 2)
        grid.setColumnStretch(3, 6)
        grid.setColumnStretch(4, 2)
        for i in range(1, 11):
            grid.setRowStretch(i, 1)
        self.layout1 = QWidget()
        self.layout1.setLayout(grid)
        # 事件
        btn.clicked.connect(self.showSingleInfo)

    def showSingleInfo(self):
        pass

    def initLayout2(self):
        # 布局
        grid = QGridLayout()
        btn = QPushButton("ok")
        grid.addWidget(btn, 1, 1)
        self.layout2 = QWidget()
        self.layout2.setLayout(grid)
        # 事件
        btn.clicked.connect(self.showRubbingInfo)

    def showRubbingInfo(self):
        pass

    def changeLayout(self):
        sender = self.sender()
        tmp_str = sender.text()
        self.statusBar().showMessage(tmp_str)
        if tmp_str == '文字识别':
            self.stacked.setCurrentIndex(0)
        if tmp_str == '单字信息':
            self.stacked.setCurrentIndex(1)
        if tmp_str == '拓片信息':
            self.stacked.setCurrentIndex(2)

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()
class App(QDialog):
    def __init__(self):
        super().__init__()
        self.left = 10
        self.top = 10
        self.width = 800
        self.height = 600
        self.initUI()

    def initUI(self):
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createSidebar()
        self.createContent()

        self.windowLayout = QHBoxLayout(self)
        self.windowLayout.addWidget(self.sidebar)
        self.windowLayout.addWidget(self.content)

        self.addMenu(MenuChat())
        #self.addMenu(MenuTraffic())
        #self.addMenu(MenuFirewall())
        self.addMenu(MenuExit())

        self.content.setCurrentIndex(0)

        self.show()

    def addMenu(self, menu):
        menuButton = QPushButton(menu.name)
        menuButton.setSizePolicy(
            QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))

        self.sidebarLayout.addWidget(menuButton)
        contentIndex = self.content.addWidget(menu.widget)

        def onClick():
            self.content.setCurrentIndex(contentIndex)
            menu.onClick()

        menuButton.clicked.connect(onClick)

    def createSidebar(self):
        self.menuStack = QStackedWidget()

        sidebar = QWidget()
        sidebarLayout = QVBoxLayout()
        sidebar.setLayout(sidebarLayout)

        sidebar.setSizePolicy(
            QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))

        #layout.setColumnStretch(1, 4)
        #layout.setColumnStretch(2, 4)

        self.sidebarLayout = sidebarLayout
        self.sidebar = sidebar

    def createContent(self):
        self.content = QStackedWidget()
        self.content.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
Example #42
0
class View:
    """View of the main application. Creates the GUI and abstracts some common
    behaviour around the screen elements.
    """
    def __init__(self, control):
        """Sets a given control and creates the screen elements.

        :param control: The control to this view (implementing application logic).
        """

        self.control = control

        self.__initializeWindow(control.name)

    def open(self):
        """Show the application window.
        """

        self.window.show()

    @closingTagging
    def setNull(self):
        """Abstraction around setting the null view as the current widget.
        """

        self.nullView.open()

        self.views.setCurrentWidget(self.nullView)

    @closingTagging
    def setTagging(self):
        """Abstraction around setting the tagging view as the current widget.
        """

        preprocessing = Preprocessing(self.control)

        self.taggingControl.open(preprocessing)

        self.views.setCurrentWidget(self.taggingView)

    def refreshTagging(self):
        """Abstraction around refreshing the tagging control.
        """

        self.taggingControl.refresh()

    def closeTagging(self):
        """Abstraction around closing the tagging control.

        :raises UserCancel: Raised if the user aborts the closing process.
        """

        self.taggingControl.close()

    def __initializeWindow(self, name):
        """Create the main window.
        """

        self.window = QMainWindow()

        self.window.setWindowTitle(name)

        self.window.setMinimumWidth(800)
        self.window.setMinimumHeight(600)

        self.window.closeEvent = self.control.closeEvent

        self.__initializeIcon()
        self.__initializeMenu()
        self.__initializeShortcuts()
        self.__initializeCentralWidget()

    def __initializeIcon(self):
        """Sets an icon to the window.
        """

        path = os.path.dirname(os.path.realpath(__file__))

        iconObject = QIcon(path + os.path.sep + "icons/ToyIcon.bmp")

        self.window.setWindowIcon(iconObject)

    def __initializeCentralWidget(self):
        """Create the central widget of the window, which is a stacked widget
        with which one can switch between different views. Creates two views:
        One for the null screen and one for the tagging screen.
        """

        self.views = QStackedWidget()

        self.taggingControl = TaggingControl(self, self.control.settings)
        self.taggingView = TaggingView(self, self.taggingControl,
                                       self.control.settings)
        self.taggingControl.view = self.taggingView

        self.nullView = NullView(self)

        self.views.addWidget(self.taggingView)
        self.views.addWidget(self.nullView)

        self.window.setCentralWidget(self.views)

    def __initializeMenu(self):
        """Builds the menu bar and connects the handler-methods of the control
        to the respective events.
        """

        applicationMenuBar = self.window.menuBar()

        fileMenu = applicationMenuBar.addMenu('File')
        openFile = QAction('Open', self.window)
        openFile.triggered.connect(self.control.onOpenFile)
        fileMenu.addAction(openFile)

        self.saveFile = QAction('Save', self.window)
        fileMenu.addAction(self.saveFile)

        self.clearFile = QAction('Clear', self.window)
        self.clearFile.triggered.connect(self.control.onClearFile)
        fileMenu.addAction(self.clearFile)

        self.reloadFile = QAction('Reload', self.window)
        self.reloadFile.triggered.connect(self.control.onReloadFile)
        fileMenu.addAction(self.reloadFile)

        userMenu = applicationMenuBar.addMenu('User')
        settings = QAction('Settings', self.window)
        settings.triggered.connect(self.control.settings.asDialog)
        userMenu.addAction(settings)

    def __initializeShortcuts(self):
        """Registers keyboard shortcuts for the most common functionality.
        """

        openFile = QShortcut(QKeySequence("Ctrl+O"), self.window)
        openFile.activated.connect(self.control.onOpenFile)

        openSettings = QShortcut(QKeySequence("Ctrl+Q"), self.window)
        openSettings.activated.connect(self.control.settings.asDialog)

        openSettings = QShortcut(QKeySequence("Ctrl+R"), self.window)
        openSettings.activated.connect(self.control.onReloadFile)
Example #43
0
class CollapsibleTabWidget(QWidget):
    Horizontal = 0
    Vertical = 1
    doCollapse = pyqtSignal()

    def __init__(self, orientation=0, parent=None):
        super(CollapsibleTabWidget, self).__init__(parent=parent)
        self.frameLayout = None
        self.verticalLayout = None
        self.tabBar = None
        self.tabBarWidget = QWidget(self)
        self.orientation = orientation
        # self.orientation = self.Vertical
        self.splitter = None
        self.splitterPos = None
        self.splitterLower = None
        self.stackTitle = None
        self.stackWidget = None
        self.tabBarList = []

        # local data
        if self.orientation == self.Horizontal:
            self.initHorizontalUI()
            self.titleBarIcon = TitleBar.down
        elif self.orientation == self.Vertical:
            self.initVerticalUI()
            self.titleBarIcon = TitleBar.left

        self.tabBarWidget.setStyleSheet('background-color: #B2B2B2;')
        self.stackTitle.setStyleSheet('background-color: #B2B2B2;')

    def initHorizontalUI(self):
        self.frameLayout = QVBoxLayout(self)
        self.tabBar = QHBoxLayout(self)
        self.tabBarWidget.setLayout(self.tabBar)
        self.tabBar.setAlignment(Qt.AlignLeft)
        self.verticalLayout = QVBoxLayout(self)
        # fill stack
        self.stackTitle = QStackedWidget(self)
        self.stackWidget = QStackedWidget(self)
        self.verticalLayout.addWidget(self.stackTitle)
        self.verticalLayout.addWidget(self.stackWidget)
        # finish
        self.frameLayout.addLayout(self.verticalLayout)
        self.frameLayout.addWidget(self.tabBarWidget)
        self.setLayout(self.frameLayout)
        self.tabBarWidget.setSizePolicy(QSizePolicy.Expanding,
                                        QSizePolicy.Maximum)

    def initVerticalUI(self):
        self.frameLayout = QHBoxLayout(self)
        self.verticalLayout = QVBoxLayout(self)
        # tab bar
        self.tabBar = QVBoxLayout(self)
        self.tabBarWidget.setLayout(self.tabBar)
        self.tabBar.setAlignment(Qt.AlignTop)
        # fill stack
        self.stackTitle = QStackedWidget(self)
        self.stackWidget = QStackedWidget(self)

        self.verticalLayout.addWidget(self.stackTitle)
        self.verticalLayout.addWidget(self.stackWidget)

        self.stackWidget.addWidget(QLabel('asdf', self))
        # finish
        self.frameLayout.addWidget(self.tabBarWidget)
        self.frameLayout.addLayout(self.verticalLayout)
        self.setLayout(self.frameLayout)
        self.tabBarWidget.setSizePolicy(QSizePolicy.Maximum,
                                        QSizePolicy.Expanding)

    def setOrientation(self, orient):
        self.orientation = orient

    def onTabClicked(self, index):
        pass

    def addTab(self, widget: QWidget, title: str):
        titleBar = TitleBar(title, self)
        titleBar.setButtonOrient(self.titleBarIcon)
        titleBar.CollapseButton.clicked.connect(self.collapseStacks)
        self.stackTitle.addWidget(titleBar)
        self.stackWidget.addWidget(widget)
        tabButton = customPushButton(title, len(self.tabBarList),
                                     self.orientation, self)
        self.tabBarList.append(tabButton)

        tabButton.clicked.connect(self.collapseStacks)
        tabButton.clicked_index.connect(self.setCurStack)
        self.tabBar.addWidget(tabButton, 0, Qt.AlignLeft)

        self.stackTitle.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        self.stackTitle.setFixedHeight(titleBar.Height)

    def collapseStacks(self):
        if self.stackWidget.isVisible():
            self.splitterPos = self.splitter.sizes()
            self.stackTitle.hide()
            self.stackWidget.hide()
            if self.orientation == self.Horizontal:
                self.splitter.setSizes([10000, 0])
            if self.orientation == self.Vertical:
                self.splitter.setSizes([0, 10000])
            self.splitter.handle(1).setDisabled(True)
        else:
            self.splitter.setSizes(self.splitterPos)
            self.stackTitle.show()
            self.stackWidget.show()
            self.splitter.handle(1).setDisabled(False)
        self.doCollapse.emit()

    def setCurStack(self, index):
        self.stackTitle.setCurrentIndex(index)
        self.stackWidget.setCurrentIndex(index)

    def setSplitter(self, splitter: QSplitter):
        self.splitter = splitter
        self.splitter.splitterMoved.connect(self.setSplitterRate)

    def setSplitterRate(self, pos, index):
        self.splitterLower = self.splitter.sizes()[1]
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.label3 = QtWidgets.QLabel()
        self.label3.setGeometry(QtCore.QRect(10, 210, 500, 23))
        self.label3.setObjectName("label3")

        self.btn_Action = QtWidgets.QPushButton()
        self.btn_Action.setGeometry(QtCore.QRect(220, 200, 75, 23))
        self.btn_Action.setObjectName("btn_Action")

        self.gridLayout3 = QtWidgets.QGridLayout()
        self.gridLayout3.addWidget(self.label3, 0, 3, 7, 8)
        self.gridLayout3.addWidget(self.btn_Action, 0, 3, 3, 3)

        self.btn_Action.setText("View Chart")
        self.label3.setText('File Uploaded, check console for its contents')

        self.stacked_widget = QStackedWidget()
        self.stacked_widget.currentChanged.connect(self.set_button_state)
        self.btn_Action.clicked.connect(self.next_page)

        widget = QtWidgets.QWidget()
        self.setCentralWidget(widget)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(self.btn_Action)

        vbox = QVBoxLayout()
        vbox.addWidget(self.stacked_widget)
        vbox.addLayout(hbox)

        #add the to the main window
        self.toolbar = QToolBar("Edit", self)

        h = HomeScreen(self)
        h.pushButton.clicked.connect(self.file_open)
        self.insert_page(h.centralwidget)

        self.addToolBar(self.toolbar)

        #start with the toolbar hidden
        self.toolbar.toggleViewAction().setChecked(True)
        self.toolbar.toggleViewAction().trigger()

        # create main layout
        widget.setLayout(vbox)

    def file_open(self):
        name, _ = QtWidgets.QFileDialog.getOpenFileName(
            None,
            'Open File',
            options=QtWidgets.QFileDialog.DontUseNativeDialog)
        classObj = FileOpen.openFile(name)
        #print(classObj)
        #chart = Chart('pie1', classObj, self)
        #self.insert_page(chart.chartview)

        navigation = Navigation(classObj, self)
        #self.addToolBar(navigation.toolbar)

        self.insert_page(navigation.horizontalGroupBox)
        #chart = Chart('pie1', classObj, self)
        '''name, _ = QtWidgets.QFileDialog.getOpenFileName(None, 'Open File', options=QtWidgets.QFileDialog.DontUseNativeDialog)
        file = open(name, 'r') 
        with file as json_file:
            text = json.load(json_file)
            #self.label3.setText('File Uploaded, check console for its contents')
            #chart = Chart('Alloys', text, self)
            #self.insert_page(chart.chartview)
       
            navigation = Navigation(text, self)
            self.addToolBar(navigation.toolbar)
           
            self.insert_page(navigation.horizontalGroupBox)'''

    def set_button_state(self, index):
        #self.prev_button.setEnabled(index > 0)
        n_pages = len(self.stacked_widget)
        self.btn_Action.setEnabled(index % n_pages < n_pages - 1)

    def insert_page(self, widget, index=-1):
        self.stacked_widget.insertWidget(index, widget)
        self.set_button_state(self.stacked_widget.currentIndex())

    def next_page(self):
        new_index = self.stacked_widget.currentIndex() + 1
        if new_index < len(self.stacked_widget):
            self.stacked_widget.setCurrentIndex(new_index)
            self.toolbar.toggleViewAction().trigger()
Example #45
0
    def initUI(self):

        # -- Windows Title Bar --
        self.setWindowTitle('Security-HQ')  # 윈도우 타이틀

        # -- Status Bar --
        self.statusBar().showMessage('Ready')  #상태바 인스턴스 생성 및 표시
        self.statusBar().showMessage(
            self.date.toString(Qt.DefaultLocaleLongDate))  # 현재 날짜 표시

        # -- Menu Bar --
        # 메뉴바 엑션 설정 및 메뉴 명칭, 단축,
        # 종료 action
        exitAction = QAction(QIcon('icon/exit.png'), 'Exit',
                             self)  # 아이콘표시, Exit 표시
        exitAction.setShortcut('Ctrl+Q')  # 단축키
        exitAction.setStatusTip('Exit Application')  # 상태바 표시
        exitAction.triggered.connect(
            qApp.quit)  # 어플리케이션 종료설정 QApplication quit()

        # 종료 action
        saveAction = QAction(QIcon('icon/save.png'), 'Save',
                             self)  # 아이콘표시, Exit 표시
        saveAction.setShortcut('Ctrl+S')  # 단축키
        saveAction.setStatusTip('Save Application')  # 상태바 표시
        # saveAction.triggered.connect(self.showDialog4) #

        # 종료 action
        editAction = QAction(QIcon('icon/edit.png'), 'Edit',
                             self)  # 아이콘표시, Exit 표시
        editAction.setShortcut('Ctrl+E')  # 단축키
        editAction.setStatusTip('Edit Application')  # 상태바 표시
        editAction.triggered.connect(
            qApp.quit)  # 어플리케이션 종료설정 QApplication quit()

        # 종료 action
        printAction = QAction(QIcon('icon/print.png'), 'Print',
                              self)  # 아이콘표시, Exit 표시
        printAction.setShortcut('Ctrl+P')  # 단축키
        printAction.setStatusTip('Print Application')  # 상태바 표시
        printAction.triggered.connect(
            qApp.quit)  # 어플리케이션 종료설정 QApplication quit()

        menubar = self.menuBar()  # 메뉴 인스턴스 생성
        menubar.setNativeMenuBar(False)  # Mac 에서도 윈도우와 동일한 결과 나오게 하기위해

        # -- 파일메뉴 최초
        fileMenu = menubar.addMenu('&파일')  # 메뉴 인스턴스에 실제 메뉴 추가
        # -- 편집메뉴 최초
        editMenu = menubar.addMenu('&편집')  # 메뉴 인스턴스에 실제 메뉴 추가

        # -- 파일메뉴 하위
        fileMenu.addAction(saveAction)  # 정의된 하위 메뉴 추가
        fileMenu.addAction(printAction)  # 정의된 하위 메뉴 추가
        fileMenu.addAction(exitAction)  # 정의된 하위 메뉴 추가

        # -- 편집메뉴 하위
        editMenu.addAction(editAction)

        # -- Tool Bar --
        # 파일 툴바
        self.fileToolbar = self.addToolBar('Exit')
        self.fileToolbar.addAction(exitAction)
        self.fileToolbar.addAction(saveAction)
        self.fileToolbar.addAction(printAction)

        #편집 툴바
        self.editToolbar = self.addToolBar('Edit')
        self.editToolbar.addAction(editAction)

        self.combo = QComboBox(self)
        self.combo.addItem("Item 1")
        self.combo.addItem("Item 2")
        self.combo.addItem("Item 3")
        # self.combo.currentIndexChanged.connect(self.setSomething)
        self.fileToolbar.addWidget(self.combo)
        self.combo.setMinimumSize(self.combo.sizeHint().width(),
                                  self.fileToolbar.iconSize().height())
        self.fileToolbar.setAllowedAreas(Qt.TopToolBarArea
                                         | Qt.BottomToolBarArea)

        dockWidgetLeft = QWidget()
        dockWidgetRight = QWidget()
        dockWidgetBottom = QWidget()
        dockWidgetTree = QTreeWidget()

        self.dockWidget = QDockWidget("메뉴")
        self.dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea
                                        | Qt.RightDockWidgetArea)
        self.dockWidget.setObjectName("dockWidget")
        self.dockWidget.setFeatures(QDockWidget.DockWidgetClosable
                                    | QDockWidget.DockWidgetMovable)
        self.dockWidgetContents = QWidget()
        self.dockWidgetContents.setObjectName("dockWidgetContents")
        self.treeWidget = QTreeWidget(self.dockWidgetContents)
        self.treeWidget.setObjectName("verticalLayout")
        self.treeWidget.headerItem().setText(0, "1")
        self.treeWidget.header().setVisible(False)
        self.treeWidget.setAlternatingRowColors(True)
        for i in range(3):
            parent = QTreeWidgetItem(self.treeWidget)
            parent.setText(0, "Parent {}".format(i))
            # parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
            parent.setFlags(parent.flags())
            for x in range(5):
                child = QTreeWidgetItem(parent)

                # child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
                child.setFlags(child.flags())
                child.setText(0, "Child {}".format(x))
                # child.setCheckState(0, Qt.Unchecked)
        # self.treeWidget.itemClicked.connect(self.login)

        self.verticalLayout = QVBoxLayout(self.dockWidgetContents)
        self.verticalLayout.setContentsMargins(4, 4, 4, 4)
        self.verticalLayout.setObjectName("verticalLayout")
        self.verticalLayout.addWidget(self.treeWidget)

        self.dockWidget.setWidget(self.dockWidgetContents)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget)

        self.dockingWidgetLeft = QDockWidget("Icon panel")  # 타이틀 설정
        self.dockingWidgetLeft.setObjectName("IconPanel")
        self.dockingWidgetLeft.setWidget(dockWidgetLeft)  # 래핑할 위젯 설정
        self.dockingWidgetLeft.setAllowedAreas(Qt.LeftDockWidgetArea
                                               | Qt.RightDockWidgetArea)
        self.dockingWidgetLeft.setFloating(True)
        self.dockingWidgetLeft.widget().setMinimumSize(QSize(80, 150))
        self.addDockWidget(Qt.LeftDockWidgetArea,
                           self.dockingWidgetLeft)  # 초기 위치 및 도킹위젯을 메인윈도의

        self.dockingWidgetRight = QDockWidget("속성 창")  # 타이틀 설정
        self.dockingWidgetRight.setObjectName("IconPanel")
        self.dockingWidgetRight.setWidget(dockWidgetRight)  # 래핑할 위젯 설정
        self.dockingWidgetRight.setAllowedAreas(Qt.RightDockWidgetArea)
        self.dockingWidgetRight.setFloating(True)
        self.dockingWidgetRight.widget().setMinimumSize(QSize(200, 200))
        self.addDockWidget(Qt.RightDockWidgetArea,
                           self.dockingWidgetRight)  # 초기 위치 및 도킹위젯을 메인윈도의

        self.dockingWidgetBottom = QDockWidget("알람 콘솔")  # 타이틀 설정
        self.dockingWidgetBottom.setObjectName("IconPanel")
        self.dockingWidgetBottom.setWidget(dockWidgetBottom)  # 래핑할 위젯 설정
        self.dockingWidgetBottom.setAllowedAreas(Qt.BottomDockWidgetArea)
        self.dockingWidgetBottom.setFloating(True)
        self.dockingWidgetBottom.widget().setMinimumSize(QSize(80, 60))
        self.addDockWidget(Qt.BottomDockWidgetArea,
                           self.dockingWidgetBottom)  # 초기 위치 및 도킹위젯을 메인윈도의

        self.central_widget = QStackedWidget()
        self.setCentralWidget(self.central_widget)

        # Dashboard = DashBoardWidget(self)
        # Dashboard.button.clicked.connect(self.login2)

        # self.central_widget.addWidget(Dashboard)

        # self.setDockOptions(self.AnimatedDocks | self.AllowNestedDocks)
        self.statusBar()

        # 윈도우 표시 정의
        self.setGeometry(0, 0, 1024, 768)  # 윈도우 위치 및 크기
        self.center()  #위도우 위치를 중앙에 이동시킴
        self.show()  #보여줌
Example #46
0
class MainWindow(QWidget):
    toLock = 0

    def __init__(self, btnChecker):
        super().__init__()

        self.setWindowTitle('Modedoor Kiosk 30.10')

        self.showFullScreen()

        self.isLocked = 0

        label = QLabel()
        labelPixmap = QPixmap('../resources/SAFEBANNER.png')
        label.setPixmap(labelPixmap)
        label.setAlignment(Qt.AlignCenter)

        # Optional, resize window to image size
        self.resize(labelPixmap.width(), labelPixmap.height())

        self.settingsButton = modules.buttonizer.Buttonizer(
            "Settings", 150, 110, True, Icons.settingsIcon, 50, 50)
        self.doorButton = modules.buttonizer.Buttonizer(
            "Control", 150, 110, True, Icons.doorIcon, 50, 50)
        self.lockButton = modules.buttonizer.Buttonizer(
            "UnLocked", 170, 110, True, Icons.lockIcon, 100, 50)

        self.controlStack = QWidget()
        self.settingStack = QWidget()
        self.lockStack = QWidget()

        self.settingStackUI()
        self.controlStackUI(btnChecker)
        self.lockStackUI()

        self.Stack = QStackedWidget(self)

        self.Stack.addWidget(self.controlStack)
        self.Stack.addWidget(self.settingStack)
        self.Stack.addWidget(self.lockStack)

        hbox = QHBoxLayout()
        hbox.setSpacing(0.5)
        hbox.addWidget(self.doorButton)
        hbox.addWidget(self.lockButton)
        hbox.addWidget(self.settingsButton)

        vbox = QVBoxLayout()
        vbox.addSpacing(2)
        vbox.addLayout(hbox)
        vbox.addWidget(self.Stack)

        vbox.addWidget(label)

        self.settingsButton.clicked.connect(partial(self.display, 1))
        self.doorButton.clicked.connect(partial(self.display, 0))
        self.lockButton.clicked.connect(partial(self.display, 2))

        self.setLayout(vbox)
        self.setGeometry(0, 0, 1024, 600)
        self.show()

    def controlStackUI(self, btnChecker):

        grid = QGridLayout()

        MainWindow.openButton = modules.buttonizer.Buttonizer(
            "", 140, 140, False, Icons.openIcon, 140, 140)
        MainWindow.halfOpen = modules.buttonizer.Buttonizer(
            "", 140, 140, False, Icons.halfOpenIcon, 140, 140)
        MainWindow.halfClose = modules.buttonizer.Buttonizer(
            "", 140, 140, False, Icons.halfCloseIcon, 140, 140)
        MainWindow.closeButton = modules.buttonizer.Buttonizer(
            "", 140, 140, False, Icons.closeIcon, 140, 140)
        MainWindow.stopButton = modules.buttonizer.Buttonizer(
            "", 140, 140, False, Icons.stopIcon, 140, 140)

        MainWindow.openButton.clicked.connect(
            partial(btnChecker.check, MainWindow.openButton, "openButton"))
        MainWindow.closeButton.clicked.connect(
            partial(btnChecker.check, MainWindow.closeButton, "closeButton"))
        MainWindow.stopButton.clicked.connect(
            partial(btnChecker.check, MainWindow.stopButton, "stopButton"))

        grid.addWidget(MainWindow.openButton, 1, 0)
        grid.addWidget(MainWindow.closeButton, 1, 1)
        grid.addWidget(MainWindow.stopButton, 1, 2)
        grid.addWidget(MainWindow.halfOpen, 1, 3)
        grid.addWidget(MainWindow.halfClose, 1, 4)

        oImage = QImage("../resources/background.png")
        sImage = oImage.scaled(QSize(700, 500))  # resize Image to widgets size
        palette = QPalette()
        palette.setBrush(10, QBrush(sImage))  # 10 = Windowrole
        self.setPalette(palette)

        self.controlStack.setLayout(grid)

    def settingStackUI(self):

        layout = QVBoxLayout(self)

        topVlayout = QVBoxLayout()
        topVlayout.setSpacing(0)

        self.labelMin = QLabel()
        self.labelHour = QLabel()

        self.labelMin.setText("57")
        self.labelHour.setText("19")

        self.labelMin.setStyleSheet("color:black;font-size:34px")
        self.labelHour.setStyleSheet("color:black;font-size:34px")

        self.labelMin.setFixedSize(100, 100)
        self.labelHour.setFixedSize(100, 100)

        labelTag = QLabel("SET HOUR")
        labelTag.setStyleSheet("color:black;font-size:34px")

        labelTag2 = QLabel(":")
        labelTag2.setStyleSheet("color:black;font-size:34px")
        labelTag2.setFixedSize(100, 100)
        labelTag1 = QLabel("SET MINUTE:")
        labelTag1.setStyleSheet("color:black;font-size:34px")

        sliderMin = QSlider(Qt.Horizontal)
        sliderMin.setValue(15)
        sliderMin.setTickInterval(1)
        sliderMin.setMaximum(59)
        sliderMin.setMinimum(00)
        sliderMin.setFixedSize(500, 90)
        sliderMin.valueChanged.connect(self.updateMin)
        sliderMin.setStyleSheet("color:white")

        sliderHour = QSlider(Qt.Horizontal)
        sliderHour.setValue(15)
        sliderHour.setMaximum(23)
        sliderHour.setMinimum(00)
        sliderHour.setFixedSize(500, 90)
        sliderHour.valueChanged.connect(self.updateHour)
        sliderHour.setStyleSheet("color:white")

        layoutH = QHBoxLayout()
        layoutH1 = QHBoxLayout()
        layoutH2 = QHBoxLayout()
        layoutV = QVBoxLayout()

        layoutH2.addWidget(self.labelHour)
        layoutH2.addWidget(labelTag2)
        layoutH2.addWidget(self.labelMin)

        layoutH.addWidget(labelTag)
        layoutH.addWidget(sliderHour)

        layoutH1.addWidget(labelTag1)
        layoutH1.addWidget(sliderMin)

        layoutV.addLayout(layoutH2)
        layoutV.addLayout(layoutH1)
        layoutV.addLayout(layoutH)

        numpad = QGridLayout()
        save = QPushButton("Save")
        numpad_layout = QVBoxLayout()

        numpad.setSpacing(5)
        numpad.setAlignment(Qt.AlignLeft)
        number1 = QPushButton('1')
        number2 = QPushButton('2')
        number3 = QPushButton('3')
        number4 = QPushButton('4')
        number5 = QPushButton('5')
        number6 = QPushButton('6')
        number7 = QPushButton('7')
        number8 = QPushButton('8')
        number9 = QPushButton('9')

        number1.setFixedSize(100, 100)
        number2.setFixedSize(100, 100)
        number3.setFixedSize(100, 100)
        number4.setFixedSize(100, 100)
        number5.setFixedSize(100, 100)
        number6.setFixedSize(100, 100)
        number7.setFixedSize(100, 100)
        number8.setFixedSize(100, 100)
        number9.setFixedSize(100, 100)

        numpad.addWidget(number1, 0, 0)
        numpad.addWidget(number2, 0, 1)
        numpad.addWidget(number3, 0, 2)
        numpad.addWidget(number4, 1, 0)
        numpad.addWidget(number5, 1, 1)
        numpad.addWidget(number6, 1, 2)
        numpad.addWidget(number7, 2, 0)
        numpad.addWidget(number8, 2, 1)
        numpad.addWidget(number9, 2, 2)

        numpad_layout.addLayout(numpad)
        numpad_layout.addWidget(save)

        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()

        # Add tabs
        self.tabs.addTab(self.tab1, "Time")
        self.tabs.addTab(self.tab2, "Password")

        # Create first tab

        self.tab1.setLayout(layoutV)
        self.tab2.setLayout(numpad_layout)

        # Add tabs to widget
        layout.addWidget(self.tabs)
        self.settingStack.setLayout(layout)

    def lockStackUI(self):
        pass

    def lockUnlock(self, toLock):

        try:
            f = open('password.txt', 'r')
        except:
            lay = QHBoxLayout()
            lay.setAlignment(Qt.AlignCenter)
            warn = QLabel(
                "YOU HAVE TO SPECIFY PASSWORD TO LOCK!.\n \t      GO TO SETTINGS"
            )
            warn.setStyleSheet("color:red;font-size:30px")
            lay.addWidget(warn)
            self.lockStack.setLayout(lay)
        else:
            if toLock == 0:
                self.settingsButton.setHidden(True)
                self.doorButton.setHidden(True)
                MainWindow.toLock = 1
                self.lockButton.setIcon(Icons.lockIcon1)
            else:
                self.settingsButton.setHidden(False)
                self.doorButton.setHidden(False)
                self.Stack.setCurrentIndex(0)
                self.lockButton.setText("Unlocked")
                self.lockButton.setIcon(Icons.lockIcon)
                MainWindow.toLock = 0

    def display(self, i):

        self.Stack.setCurrentIndex(i)
        if i == 1:
            self.settingsButton.setIcon(Icons.settingsIcon1)
            self.doorButton.setIcon(Icons.doorIcon)
            self.lockButton.setIcon(Icons.lockIcon)

        elif i == 0:
            self.settingsButton.setIcon(Icons.settingsIcon)
            self.doorButton.setIcon(Icons.doorIcon1)
            self.lockButton.setIcon(Icons.lockIcon)
        elif i == 2:
            self.settingsButton.setIcon(Icons.settingsIcon)
            self.doorButton.setIcon(Icons.doorIcon)
            self.lockUnlock(MainWindow.toLock)

    def updateMin(self, min):
        min = str(min)
        min = min.zfill(2)
        self.labelMin.setText(min)

    def updateHour(self, hour):
        print(hour)
        event = str(hour)
        event = event.zfill(2)
        self.labelHour.setText(event)

    @staticmethod
    def numLen(num):
        return len(str(abs(num)))
Example #47
0
class MainWindow(QMainWindow):
    screen = None
    width, height = None, None
    picture = None
    login_form = None
    user_page = None
    pages = None

    def __init__(self):
        super().__init__()

        if sys.platform != 'linux':
            my_app_id = 'InnoUI.DMD_project.ez_A_for_course.101'  # arbitrary string
            ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(
                my_app_id)
        self.setWindowIcon(QIcon("./images/main_logo.png"))

        size = QDesktopWidget().screenGeometry(-1)
        self.width = size.width() // 5
        self.picture = QPixmap("./images/main_logo.png").scaledToWidth(
            self.width - self.width // 20)

        self.height = self.picture.height() + size.height() // 16
        self.setFixedSize(self.width, self.height)
        self.setWindowTitle('DmD2')
        self.pages = QStackedWidget()

        qr = self.frameGeometry()
        center = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(center)
        self.move(qr.topLeft())
        self.init_ui()

    def login(self, login, password):
        try:
            backend.login(login, password)
        except AssertionError as exception:
            QToolTip.showText(
                self.mapToGlobal(self.login_form.geometry().center()),
                'Invalid credentials')
            return
        self.user_page = levels[backend.user.user_info['role']](self,
                                                                backend.user)
        self.pages.addWidget(self.user_page)
        self.pages.setCurrentWidget(self.user_page)

        self.repaint()
        self.setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)
        self.resize(self.width * 2, self.height * 2)
        qr = self.frameGeometry()
        center = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(center)
        self.move(qr.topLeft())

    def logout(self):
        backend.logout()
        self.pages.setCurrentWidget(self.login_form)
        self.repaint()
        self.setFixedSize(self.width, self.height)
        qr = self.frameGeometry()
        center = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(center)
        self.move(qr.topLeft())
        self.pages.removeWidget(self.user_page)

    def init_ui(self):
        self.login_form = LoginForm(self.width, self.height, self.picture)
        self.user_page = BasePage(self)

        self.pages.addWidget(self.login_form)
        self.pages.setCurrentWidget(self.login_form)

        self.setCentralWidget(self.pages)
        self.login_form.button.clicked.connect(
            lambda: self.login(self.login_form.login_field.text(),
                               self.login_form.password_field.text()))
        self.show()
Example #48
0
class MainWindow(QWidget):
    def __init__(self, title="Raven"):
        super().__init__()
        # self.window_width = 350
        # self.window_height = 600
        # self.setFixedSize(self.window_width, self.window_height)
        self.showMaximized()
        self.setWindowTitle(title)
        self.init_ui()

    def init_ui(self):
        bottom_bar = BottomWidget(self)
        bottom_bar.home_click_listener.connect(self.on_home_click)
        bottom_bar.logout_click_listener.connect(self.on_logout_click)

        self.fragment = QStackedWidget()

        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        layout.addWidget(self.fragment)

        bottom_bar.on_back_press_listener.connect(self.on_back_press)
        layout.addWidget(bottom_bar)

        self.setLayout(layout)
        # self.add_screen(LoginWidget("Login Screen"))
        # self.add_screen(CameraWidget())
        self.add_screen(AttendenceOptionWidget())

    def add_screen(self, screen: base_widget):
        screen.add_screen_listener.connect(self.add_screen)
        screen.on_back_press_listener.connect(self.on_back_press)

        self.fragment.addWidget(screen)
        self.fragment.setCurrentIndex(self.fragment.count() - 1)
        self.updateUi()

    def on_back_press(self):
        if self.fragment.count() > 1:
            widget = self.fragment.currentWidget()
            self.fragment.removeWidget(widget)
            widget.deleteLater()
            self.updateUi()

    def updateUi(self):
        widget: base_widget = self.fragment.currentWidget()
        self.setWindowTitle(widget.title)

    def on_home_click(self):
        self.remove_all_screen()

    def remove_all_screen(self):
        while self.fragment.count() > 1:
            widget = self.fragment.currentWidget()
            self.fragment.removeWidget(widget)
            widget.deleteLater()
            self.updateUi()

    def on_logout_click(self):
        print("On Logout Click")
Example #49
0
class Multitool(QMainWindow, QWidget):
    def __init__(self):
        super(Multitool, self).__init__()

        self.statusbar = self.statusBar()
        self.statusBar().showMessage('Ready')

        self.trayActions()
        self.trayMenu()
        self.trayIcon.setIcon(QIcon('icons/biohazard.svg'))
        self.trayIcon.show()

        self.stack1 = QWidget()  # Mouse Clicker
        self.stack2 = QWidget()  # Screenshot
        self.stack3 = QWidget()  # Player
        self.stack4 = QWidget()  # Calculator
        self.stack5 = QWidget()  # Camera
        self.stack6 = QWidget()  # Tetrix

        self.stack1UI()  # Mouse Clicker
        self.stack2UI()  # Screenshot
        self.stack3UI()  # Player
        self.stack4UI()  # Calculator
        self.stack5UI()  # Camera
        self.stack6UI()  # Tetrix

        self.Stack = QStackedWidget(self)
        self.Stack.addWidget(self.stack1)  # Mouse Clicker
        self.Stack.addWidget(self.stack2)  # Screenshot
        self.Stack.addWidget(self.stack3)  # Player
        self.Stack.addWidget(self.stack4)  # Calculator
        self.Stack.addWidget(self.stack5)  # Camera
        self.Stack.addWidget(self.stack6)  # Tetrix

        # General actions starts -------------------------------------
        exitAction = QAction(QIcon('icons/exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(QApplication.instance().quit)

        newMultitoolAction = QAction(QIcon('icons/new.png'), '&New Multitool',
                                     self)
        newMultitoolAction.setShortcut('Ctrl+N')
        newMultitoolAction.setStatusTip('New Multitool')
        newMultitoolAction.triggered.connect(self.newMultitoolWindow)

        aboutAction = QAction(QIcon('icons/biohazard.svg'), 'About', self)
        aboutAction.setStatusTip('About')
        aboutAction.triggered.connect(self.about)

        viewStatAction = QAction('View statusbar', self, checkable=True)
        viewStatAction.setStatusTip('View statusbar')
        viewStatAction.setChecked(True)
        viewStatAction.triggered.connect(self.toggleStatBar)

        viewToolbarAction = QAction('View toolbar', self, checkable=True)
        viewToolbarAction.setStatusTip('View toolbar')
        viewToolbarAction.setChecked(True)
        viewToolbarAction.triggered.connect(self.toggleToolBar)

        minimizeToTrayAction = QAction('Minimize to Tray',
                                       self,
                                       checkable=True)
        minimizeToTrayAction.setStatusTip('Minimize to Tray')
        minimizeToTrayAction.setChecked(False)
        minimizeToTrayAction.triggered.connect(self.minimizeToTray)
        # General actions ends ---------------------------------------

        # Widgets actions starts -------------------------------------
        mouseClickerAction = QAction(QIcon('icons/mouse.png'), 'Mouse Clicker',
                                     self)
        mouseClickerAction.setStatusTip('Mouse Clicker')
        mouseClickerAction.triggered.connect(lambda: self.display(0))

        screeenShotAction = QAction(QIcon('icons/screenshot.png'),
                                    'ScreenShot', self)
        screeenShotAction.setStatusTip('ScreenShot')
        screeenShotAction.triggered.connect(lambda: self.display(1))

        playerAction = QAction(QIcon('icons/player.jpeg'), 'Player', self)
        playerAction.setStatusTip('Player')
        playerAction.triggered.connect(lambda: self.display(2))

        calculatorAction = QAction(QIcon('icons/calc.ico'), 'Calculator', self)
        calculatorAction.setStatusTip('Calculator')
        calculatorAction.triggered.connect(lambda: self.display(3))

        cameraAction = QAction(QIcon('icons/camera.jpeg'), 'Camera', self)
        cameraAction.setStatusTip('Camera')
        cameraAction.triggered.connect(lambda: self.display(4))

        tetrixAction = QAction(QIcon('icons/tetrix.png'), 'Tetrix', self)
        tetrixAction.setStatusTip('Tetrix')
        tetrixAction.triggered.connect(lambda: self.display(5))
        # Widget actions ends ----------------------------------------

        # Menu bar creation starts -----------------------------------
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(newMultitoolAction)
        fileMenu.addAction(exitAction)

        viewMenu = menubar.addMenu('View')
        viewMenu.addAction(viewStatAction)
        viewMenu.addAction(viewToolbarAction)
        viewMenu.addAction(minimizeToTrayAction)

        viewMenuWidget = QMenu('List widget', self)
        viewMenuWidget.addAction(mouseClickerAction)
        viewMenuWidget.addAction(screeenShotAction)
        viewMenuWidget.addAction(playerAction)
        viewMenuWidget.addAction(calculatorAction)
        viewMenuWidget.addAction(cameraAction)
        viewMenu.addMenu(viewMenuWidget)

        gamesMenu = menubar.addMenu('&Games')
        gamesMenu.addAction(tetrixAction)

        helpMenu = menubar.addMenu('&Help')
        helpMenu.addAction(aboutAction)
        # Menu bar creation ends -------------------------------------

        # Toolbar creation starts -------------------------------------
        self.toolbar1 = self.addToolBar('File')
        self.toolbar1.addAction(newMultitoolAction)

        self.toolbar2 = self.addToolBar('Widgets')
        self.toolbar2.addAction(mouseClickerAction)
        self.toolbar2.addAction(screeenShotAction)
        self.toolbar2.addAction(playerAction)
        self.toolbar2.addAction(calculatorAction)
        self.toolbar2.addAction(cameraAction)

        self.toolbar3 = self.addToolBar('Games')
        self.toolbar3.addAction(tetrixAction)

        self.toolbar4 = self.addToolBar('Exit')
        self.toolbar4.addAction(exitAction)
        # Toolbar creation ends -------------------------------------

        self.setCentralWidget(self.Stack)
        self.setGeometry(300, 300, 700, 400)
        self.setWindowTitle('Multitool')
        self.setWindowIcon(QIcon('icons/biohazard.svg'))
        self.show()

    def toggleStatBar(self, state):
        if state:
            self.statusbar.show()
        else:
            self.statusbar.hide()

    def toggleToolBar(self, state):
        if state:
            self.toolbar1.show()
            self.toolbar2.show()
            self.toolbar3.show()
            self.toolbar4.show()
        else:
            self.toolbar1.hide()
            self.toolbar2.hide()
            self.toolbar3.hide()
            self.toolbar4.hide()

    def minimizeToTray(self, state):
        if state:
            self.hide()
            self.trayIcon.showMessage("Tray Program",
                                      "Application was minimized to tray",
                                      QSystemTrayIcon.Information, 2000)

    def newMultitoolWindow(self):
        self.__init__()
        self.setGeometry(350, 350, 700, 400)

    # Stacked widgets added to layout start----------------------
    def stack1UI(self):
        self.layout = QHBoxLayout()
        self.layout.addWidget(MouseClicker())
        self.stack1.setLayout(self.layout)

    def stack2UI(self):
        self.layout = QHBoxLayout()
        self.layout.addWidget(Screenshot())
        self.stack2.setLayout(self.layout)

    def stack3UI(self):
        self.layout = QHBoxLayout()
        self.layout.addWidget(Player(sys.argv[1:]))
        self.stack3.setLayout(self.layout)

    def stack4UI(self):
        self.layout = QHBoxLayout()
        self.layout.addWidget(Calculator())
        self.stack4.setLayout(self.layout)

    def stack5UI(self):
        self.layout = QHBoxLayout()
        self.layout.addWidget(Camera())
        self.stack5.setLayout(self.layout)

    def stack6UI(self):
        self.layout = QHBoxLayout()
        self.layout.addWidget(TetrixWindow())
        self.stack6.setLayout(self.layout)

    def display(self, i):
        self.Stack.setCurrentIndex(i)

    # Stacked widgets added to layout end------------------------

    def trayActions(self):
        self.minimizeAction = QAction(QIcon('icons/minimize.png'),
                                      "Mi&nimize",
                                      self,
                                      triggered=self.hide)
        self.maximizeAction = QAction(QIcon('icons/maximize.jpeg'),
                                      "Ma&ximize",
                                      self,
                                      triggered=self.showMaximized)
        self.restoreAction = QAction(QIcon('icons/restore.png'),
                                     "&Restore",
                                     self,
                                     triggered=self.showNormal)
        self.quitAction = QAction(QIcon('icons/exit.png'),
                                  "&Quit",
                                  self,
                                  triggered=QApplication.instance().quit)

    def trayMenu(self):
        self.trayIconMenu = QMenu(self)
        self.trayIconMenu.addAction(self.minimizeAction)
        self.trayIconMenu.addAction(self.maximizeAction)
        self.trayIconMenu.addAction(self.restoreAction)
        self.trayIconMenu.addSeparator()
        self.trayIconMenu.addAction(self.quitAction)

        self.trayIcon = QSystemTrayIcon(self)
        self.trayIcon.setContextMenu(self.trayIconMenu)

    # When closing from title bar close button, it will minimize to tray
    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Message',
                                     "This action will minimize to tray.",
                                     QMessageBox.Yes | QMessageBox.Cancel,
                                     QMessageBox.Cancel)

        if reply == QMessageBox.Yes:
            self.hide()
            self.trayIcon.showMessage("Tray Program",
                                      "Application was minimized to tray",
                                      QSystemTrayIcon.Information, 2000)
            event.accept()
        else:
            self.show()
            event.ignore()

    def about(self):
        pixmap = QPixmap('icons/biohazard.svg')
        msg = QMessageBox(
            QMessageBox.Information, 'About Multitool',
            "<b>Aplication name:</b> Multitool" +
            "<br> <b>Version:</b> V0.7 beta" +
            "<br><b>Description:</b> This application puts together many" +
            "<br>widgets into a single application." +
            "<br><b>Details:</b> Programmed and designed with Python 3.5 and PyQt5."
            + "<br><b>Programmer & Designer:</b> Fernando Daniel Jaime" +
            "<br><b>License:</b> GNU General Public License V3.0")
        pixmap = pixmap.scaled(120, 110)
        msg.setIconPixmap(pixmap)
        msg.exec_()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Escape:
            reply = QMessageBox.question(self, 'Message',
                                         "Are you sure to quit?",
                                         QMessageBox.Yes | QMessageBox.Cancel,
                                         QMessageBox.Cancel)

            if reply == QMessageBox.Yes:
                self.statusBar().showMessage('Quiting...')
                QApplication.instance().quit()
            else:
                event.ignore()

    # Multitool context menu
    def contextMenuEvent(self, event):
        cmenu = QMenu(self)
        quitAct = cmenu.addAction(QIcon('icons/exit.png'), "Quit")
        cmenu.addSeparator()
        newMultitoolAction = cmenu.addAction(QIcon('icons/new.png'),
                                             "New Multitool")
        minimizeAction = cmenu.addAction(QIcon('icons/minimize.png'),
                                         "Minimize to tray")
        action = cmenu.exec_(self.mapToGlobal(event.pos()))

        if action == quitAct:
            QApplication.instance().quit()
        if action == newMultitoolAction:
            self.__init__()
            self.setGeometry(350, 350, 700, 400)
        if action == minimizeAction:
            self.hide()
            self.trayIcon.showMessage("Tray Program",
                                      "Application was minimized to tray",
                                      QSystemTrayIcon.Information, 2000)
Example #50
0
class LeftTabWidget(QWidget):
    def __init__(self, *args, **kwargs):

        super(LeftTabWidget, self).__init__(*args, **kwargs)

        self.resize(1000, 800)

        #左右布局(左边一个QListWidget + 右边QStackedWidget)

        layout = QHBoxLayout(self, spacing=0)

        layout.setContentsMargins(0, 0, 0, 0)

        # 左侧列表

        self.listWidget = QListWidget(self)

        layout.addWidget(self.listWidget)

        # 右侧层叠窗口

        self.stackedWidget = QStackedWidget(self)

        layout.addWidget(self.stackedWidget)

        self.initUi()

    def initUi(self):

        # 初始化界面

        # 通过QListWidget的当前item变化来切换QStackedWidget中的序号

        self.listWidget.currentRowChanged.connect(
            self.stackedWidget.setCurrentIndex)

        # 去掉边框

        self.listWidget.setFrameShape(QListWidget.NoFrame)

        # 隐藏滚动条

        self.listWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        self.listWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        self.listWidget.setFixedWidth(180)

        # 这里就用一般的文本配合图标模式了(也可以直接用Icon模式,setViewMode)

        item1 = QListWidgetItem(str('已创建'), self.listWidget)
        item1.setSizeHint(QSize(200, 100))
        item1.setTextAlignment(Qt.AlignCenter)

        item2 = QListWidgetItem(str('已发布'), self.listWidget)
        item2.setSizeHint(QSize(200, 100))
        item2.setTextAlignment(Qt.AlignCenter)

        item3 = QListWidgetItem(str('已开奖'), self.listWidget)
        item3.setSizeHint(QSize(200, 100))
        item3.setTextAlignment(Qt.AlignCenter)

        # 再模拟20个右侧的页面(就不和上面一起循环放了)

        for i in range(4):

            label = QLabel('我是页面 %d' % i, self)

            label.setAlignment(Qt.AlignCenter)

            # 设置label的背景颜色(这里随机)

            # 这里加了一个margin边距(方便区分QStackedWidget和QLabel的颜色)

            label.setStyleSheet('background: rgb(27,111,175);')

            self.stackedWidget.addWidget(label)
Example #51
0
class object_classifier_app(QMainWindow):
    def __init__(self):
        super().__init__()

        # init the main window
        self.title = 'Epif Object Classifier'
        self.setWindowTitle(self.title)
        self.left = 10
        self.top = 10
        self.width = 1500
        self.height = 750
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        # Create the map canvas and set the canvas to be the main widget
        self.canvasframe = QFrame()
        self.canvasframe.setFrameShape(QFrame.StyledPanel)
        self.canvasframe.setFrameShadow(QFrame.Raised)
        self.setCentralWidget(self.canvasframe)
        self.canvas = map_canvas()
        self.canvas.show()
        self.framelayout = QVBoxLayout(self.canvasframe)
        self.framelayout.addWidget(self.canvas)

        # create map canvas actions and set icons
        actionZoomIn = QAction("Zoom in", self)
        actionZoomOut = QAction("Zoom out", self)
        actionPan = QAction("Pan", self)
        actionZoomIn.setCheckable(True)
        actionZoomOut.setCheckable(True)
        actionPan.setCheckable(True)

        actionPanPixmap = QIcon(QPixmap(':/icons/pan.png'))
        actionZoomInPixmap = QIcon(QPixmap(':/icons/Zoom-In-icon.png'))
        actionZoomOutPixmap = QPixmap(':/icons/Zoom-Out-icon.png')
        actionsave = QIcon(QPixmap(':/icons/save.png'))
        actionsaveas = QIcon(QPixmap(':/icons/saveas.png'))
        actionnew = QIcon(QPixmap(':/icons/newproject.png'))
        actionloadproject = QIcon(QPixmap(':/icons/openproject.png'))
        actionpolygonize = QIcon(QPixmap(':/icons/polygon.png'))
        actionrasterize = QIcon(QPixmap(':/icons/raster.png'))
        actionconfusion = QIcon(QPixmap(':/icons/matrix.png'))

        actionZoomIn.setIcon(QIcon(actionZoomInPixmap))
        actionZoomOut.setIcon(QIcon(actionZoomOutPixmap))
        actionPan.setIcon(QIcon(actionPanPixmap))

        actionZoomIn.triggered.connect(self.zoomIn)
        actionZoomOut.triggered.connect(self.zoomOut)
        actionPan.triggered.connect(self.pan)

        # create map canvas tool bar
        self.toolbar = self.addToolBar("Canvas actions")
        self.toolbar.addAction(actionZoomIn)
        self.toolbar.addAction(actionZoomOut)
        self.toolbar.addAction(actionPan)

        # create the map tools
        self.toolPan = QgsMapToolPan(self.canvas)
        self.toolPan.setAction(actionPan)
        self.toolZoomIn = QgsMapToolZoom(self.canvas, False)  # false = in
        self.toolZoomIn.setAction(actionZoomIn)
        self.toolZoomOut = QgsMapToolZoom(self.canvas, True)  # true = out
        self.toolZoomOut.setAction(actionZoomOut)

        #init the file tree widget and set as a dock widget
        self.treewidget = filetree()
        self.tree = QDockWidget("Select Data", self)
        self.tree.setWidget(self.treewidget)
        self.tree.setFloating(False)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.tree)

        # init a menue bar and its actions
        self.menuebar = QMenuBar()
        self.setMenuBar(self.menuebar)
        filemenue = self.menuebar.addMenu('Project')
        classificationmenue = self.menuebar.addMenu('Classification')
        toolsmenue = self.menuebar.addMenu('Tools')
        self.supervised = QAction('supervised')
        self.training = QAction("Training set", self)
        self.unsupervised = QAction('unsupernised')
        self.poligonize = QAction(actionpolygonize, 'Polygonize')
        self.rasterize = QAction(actionrasterize, 'Rasterize')
        self.confusiomatrix = QAction(actionconfusion, 'Confusionmatrix')
        self.newprojectaction = QAction(actionnew, 'New project')
        self.loadprojectaction = QAction(actionloadproject, 'Load project')
        self.saveprojectasaction = QAction(actionsaveas, 'Save project as')
        self.saveaction = QAction(actionsave, 'Save')
        classificationmenue.addAction(self.supervised)
        classificationmenue.addAction(self.unsupervised)
        classificationmenue.addAction(self.training)
        toolsmenue.addAction(self.poligonize)
        toolsmenue.addAction(self.rasterize)
        toolsmenue.addAction(self.confusiomatrix)
        filemenue.addAction(self.loadprojectaction)
        filemenue.addAction(self.saveprojectasaction)
        filemenue.addAction(self.newprojectaction)
        filemenue.addAction(self.saveaction)

        # create a layerpanel
        self.layerpanel = LayersPanel(self.canvas)
        self.layerpanelDock = QDockWidget("Layers", self)
        self.layerpanelDock.setObjectName("layers")
        self.layerpanelDock.setAllowedAreas(Qt.LeftDockWidgetArea
                                            | Qt.RightDockWidgetArea)
        self.layerpanelDock.setWidget(self.layerpanel)
        self.layerpanelDock.setContentsMargins(9, 9, 9, 9)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.layerpanelDock)

        #set the supervised classification window widget
        self.supervised_classification = supervised_classification_ui()
        self.StackedWidget = QStackedWidget()

        self.StackedWidget.addWidget(self.supervised_classification.step1)
        self.StackedWidget.addWidget(self.supervised_classification.step2)
        self.StackedWidget.addWidget(self.supervised_classification.step3)
        self.StackedWidget.setCurrentWidget(
            self.supervised_classification.step1)
        self.StackedWidget_dock = QDockWidget('classification', self)
        self.StackedWidget_dock.setWidget(self.StackedWidget)
        self.addDockWidget(Qt.RightDockWidgetArea, self.StackedWidget_dock)

        # set the unsupervised classification window widget

        # set polygonize widget
        polygonizewidget = Polygonize_ui()
        polygonizewidget.legendwidget = self.layerpanel
        self.StackedWidget.addWidget(polygonizewidget)

        # set rasterize widget
        rastrizewidget = Rasterize_ui()
        rastrizewidget.legendwidget = self.layerpanel
        rastrizewidget.legendwidget = self.layerpanel
        self.StackedWidget.addWidget(rastrizewidget)

        # set confusion matrix widget
        confusionmatrixwidget = Confusion_matrix_ui()
        self.StackedWidget.addWidget(confusionmatrixwidget)
        self.StackedWidget.addWidget(confusionmatrixwidget.resultsgroup)

        self.threadpool = QThreadPool()
        self.massage = QMessageBox(text='Running')
        self.StackedWidget_dock.setVisible(False)

        # set the widget for creating training set
        self.trainniwidget = create_training_set(self.canvas)
        self.StackedWidget.addWidget(self.trainniwidget)

        # connect signals and slots
        self.poligonize.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(polygonizewidget))
        self.poligonize.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle('Polygonize'))
        self.rasterize.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(rastrizewidget))
        self.rasterize.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle('Rasterize'))
        self.confusiomatrix.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(confusionmatrixwidget))
        self.confusiomatrix.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle('Confusion Matrix'))
        confusionmatrixwidget.done.connect(
            lambda: self.StackedWidget.setCurrentWidget(confusionmatrixwidget.
                                                        resultsgroup))
        self.supervised.triggered.connect(
            lambda: self.StackedWidget_dock.setWindowTitle(
                'Supervised classification'))
        self.supervised.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step1))
        self.supervised.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.poligonize.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.rasterize.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.confusiomatrix.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.training.triggered.connect(
            lambda: self.StackedWidget_dock.setVisible(True))
        self.training.triggered.connect(
            lambda: self.StackedWidget.setCurrentWidget(self.trainniwidget))
        self.training.triggered.connect(
            lambda: self.trainniwidget.create_layer())
        self.supervised_classification.step1next.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step2))
        self.supervised_classification.step2back.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step1))
        self.supervised_classification.step2next.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step3))
        self.supervised_classification.step3back.clicked.connect(
            lambda: self.StackedWidget.setCurrentWidget(
                self.supervised_classification.step2))
        self.loadprojectaction.triggered.connect(self.openproject)
        self.saveprojectasaction.triggered.connect(self.saveproject)
        self.newprojectaction.triggered.connect(self.newproject)
        self.saveaction.triggered.connect(self.save)

    def zoomIn(self):
        """canvas zoom in tool"""
        self.canvas.setMapTool(self.toolZoomIn)

    def zoomOut(self):
        """canvas zoom out tool"""
        self.canvas.setMapTool(self.toolZoomOut)

    def pan(self):
        """canvas pan tool"""
        self.canvas.setMapTool(self.toolPan)

    def saveproject(self):
        """save the project as..."""
        savedfile = QFileDialog.getSaveFileName(self, "Save project", ".",
                                                "(*.qgs)")[0] + '.qgs'
        try:
            self.layerpanel.project.setFileName(savedfile)
            self.layerpanel.project.write()
        except:
            pass

    def openproject(self):
        """open a dialog ro select a project file to open"""
        file = QFileDialog.getOpenFileName(self, "Open project", ".",
                                           "(*.qgs)")[0]
        fileinfo = QFileInfo(file)
        projectfile = fileinfo.filePath()
        print(projectfile)
        try:
            self.layerpanel.project.read(projectfile)
        except:
            pass

    def newproject(self):
        """create a new empty project"""
        self.layerpanel.project.clear()

    def save(self):
        """save the changes in the project, if the project is not associated with a project file, a dialog for
        creating a project will open"""
        write = self.layerpanel.project.write()
        if write is True:
            pass
        else:
            self.saveproject()

    def main(argv):
        """runing thr appplication"""
        # create Qt application
        app = QApplication(argv)

        # Initialize qgis libraries
        QgsApplication.setPrefixPath(qgis_prefix, True)
        QgsApplication.initQgis()

        # create main window
        wnd = object_classifier_app()
        # Move the app window to upper left
        wnd.move(100, 100)
        wnd.show()

        # run!
        retval = app.exec_()

        # exit
        QgsApplication.exitQgis()
        sys.exit(retval)
class View_Menu(QWidget):

    #Initialiaze the first page for class View_Menu_First_Page()
    def __init__(self,parent=None):
        super(View_Menu,self).__init__(parent)
        self.resize(800,600)
        self.stackedwidget = QStackedWidget(self)
        self.stackedwidget.setGeometry(QtCore.QRect(0,0 , 800, 600))
        self.stackedwidget.setObjectName("stackwidget")
        self.add_first_page()

    #function to show first page
    def add_first_page(self):
        self.first_page = View_Menu_First_Page()
        self.stackedwidget.addWidget(self.first_page)
        self.stackedwidget.setCurrentIndex(0)
        self.first_page.label_malay.clicked.connect(lambda:self.add_second_page(self.first_page.Malay_link_click())) #only can use lambda: to make use of return value form functions
        self.first_page.label_mcdonalds.clicked.connect(lambda:self.add_second_page(self.first_page.MC_link_click())) #only can use lambda: to make use of return value form functions
        self.first_page.label_kfc.clicked.connect(lambda:self.add_second_page(self.first_page.KFC_link_click())) #only can use lambda: to make use of return value form functions
        self.first_page.label_subway.clicked.connect(lambda:self.add_second_page(self.first_page.Subway_link_click())) #only can use lambda: to make use of return value form functions

    #function to show second page
    def add_second_page(self,store):
        self.second_page = View_Menu_Second_Page(store)
        self.stackedwidget.addWidget(self.second_page)
        self.stackedwidget.setCurrentIndex(1)
        if self.second_page.label.text() == "Mcdonalds":
            self.second_page.BlueButton.clicked.connect(lambda:self.add_third_page(self.first_page.MC_link_click(),self.second_page.submit_click()))

    #function to show third page
    def add_third_page(self,store,date_and_time):
        self.third_page = View_Menu_Third_Page(store,date_and_time)
        self.stackedwidget.addWidget(self.third_page)
        self.stackedwidget.setCurrentIndex(2)
        self.third_page.BlueButton_2.clicked.connect(self.go_back)

    def go_back(self):
        self.stackedwidget.setCurrentIndex(0)
        self.stackedwidget.removeWidget(self.second_page)
        self.stackedwidget.removeWidget(self.third_page)
Example #53
0
    def initUI(self):
        self.pipeShape = QComboBox()
        self.pipeShape.addItem("circular")
        self.pipeShape.addItem("rectangular")
        self.pipeShape.addItem("trapezoidal")
        self.circleDiameter = QLineEdit()
        self.rectWidth = QLineEdit()
        self.rectDepth = QLineEdit()
        self.rectOpen = QRadioButton("Open")
        self.rectClosed = QRadioButton("Closed")
        self.rectOpen.setChecked(True)
        self.trapWidth = QLineEdit()
        self.trapDepth = QLineEdit()
        self.trapSide = QLineEdit()
        self.trapOpen = QRadioButton("Open")
        self.trapClosed = QRadioButton("Closed")
        self.trapOpen.setChecked(True)
        self.lengthEdit = QLineEdit()
        self.lengthEdit.setFixedWidth(125)
        self.usInvert = QLineEdit()
        self.usInvert.setFixedWidth(125)
        self.dsInvert = QLineEdit()
        self.dsInvert.setFixedWidth(125)
        self.Ks = QLineEdit()
        self.Ks.setFixedWidth(125)
        self.Ks.setText("3.0")
        self.kinvisc = QLineEdit()
        self.kinvisc.setFixedWidth(125)
        self.kinvisc.setText("1.141e-06")
        self.dsK = QLineEdit()
        self.dsK.setFixedWidth(125)
        self.dsK.setText("0.0")
        self.usK = QLineEdit()
        self.usK.setFixedWidth(125)
        self.usK.setText("0.0")
        self.flow = QLineEdit()
        self.myFunc = QPushButton("Calculate", self)
        self.myFunc.clicked.connect(self.calculate)
        self.result = QTextEdit()

        self.stack1 = QWidget()
        self.stack2 = QWidget()
        self.stack3 = QWidget()

        self.stack1UI()
        self.stack2UI()
        self.stack3UI()

        self.stack = QStackedWidget(self)
        self.stack.addWidget(self.stack1)
        self.stack.addWidget(self.stack2)
        self.stack.addWidget(self.stack3)

        layout = QVBoxLayout()
        layout.addWidget(QLabel("Select Pipe Shape:"))
        layout.addWidget(self.pipeShape)

        layout.addWidget(self.stack)
        layoutFlow = QHBoxLayout()
        layoutFlow.addWidget(QLabel("Flow Rate:"))
        layoutFlow.addWidget(QLabel("m3/s"))
        layoutFlow.addWidget(self.flow)
        layout.addLayout(layoutFlow)
        layout.addWidget(self.myFunc)
        layout.addWidget(self.result)

        layout1 = QVBoxLayout()
        layout2 = QHBoxLayout()
        layout2.addWidget(QLabel("Length"))
        layout2.addWidget(self.lengthEdit)
        layout2.addWidget(QLabel("m"))
        layout2.addStretch()
        layout3 = QHBoxLayout()
        layout3.addWidget(QLabel("Upstream IL"))
        layout3.addWidget(self.usInvert)
        layout3.addWidget(QLabel("m"))
        layout4 = QHBoxLayout()
        layout4.addWidget(QLabel("Downstream IL"))
        layout4.addWidget(self.dsInvert)
        layout4.addWidget(QLabel("m"))
        layout5 = QHBoxLayout()
        layout5.addWidget(QLabel("Ks"))
        layout5.addWidget(self.Ks)
        layout5.addWidget(QLabel("mm"))
        layout6 = QHBoxLayout()
        layout6.addWidget(QLabel("kinematic visc"))
        layout6.addWidget(self.kinvisc)
        layout6.addWidget(QLabel("m2/s"))
        layout7 = QHBoxLayout()
        layout7.addWidget(QLabel("Upstream K"))
        layout7.addWidget(self.usK)
        layout7.addWidget(QLabel("no."))
        layout8 = QHBoxLayout()
        layout8.addWidget(QLabel("Downstream K"))
        layout8.addWidget(self.dsK)
        layout8.addWidget(QLabel("no."))
        layout1.addLayout(layout2)
        layout1.addLayout(layout3)
        layout1.addLayout(layout4)
        layout1.addLayout(layout5)
        layout1.addLayout(layout6)
        layout1.addLayout(layout7)
        layout1.addLayout(layout8)
        layout1.setAlignment(Qt.AlignTop)

        topLayout = QHBoxLayout(self)
        topLayout.addLayout(layout)
        topLayout.addLayout(layout1)

        self.setLayout(topLayout)
        self.pipeShape.currentIndexChanged.connect(self.stack.setCurrentIndex)
        self.setGeometry(100, 100, 670, 500)
        self.show()
Example #54
0
class FontWindow(BaseWindow):
    def __init__(self, font, parent=None):
        super().__init__(parent)
        self._font = None

        self._infoWindow = None
        self._featuresWindow = None
        self._groupsWindow = None
        self._kerningWindow = None
        self._metricsWindow = None

        self.toolBar = ToolBar(self)
        self.toolBar.setTools(t()
                              for t in QApplication.instance().drawingTools())

        self.glyphCellView = GlyphCellView(self)
        self.glyphCellView.glyphActivated.connect(self.openGlyphTab)
        self.glyphCellView.glyphsDropped.connect(self._orderChanged)
        self.glyphCellView.selectionChanged.connect(self._selectionChanged)
        self.glyphCellView.setAcceptDrops(True)
        self.glyphCellView.setCellRepresentationName("SimpleFont.GlyphCell")
        self.glyphCellView.setFrameShape(self.glyphCellView.NoFrame)
        self.glyphCellView.setFocus()

        self.tabWidget = TabWidget(self)
        self.tabWidget.setAutoHide(True)
        self.tabWidget.setHeroFirstTab(True)
        self.tabWidget.addTab(self.tr("Font"))

        self.stackWidget = QStackedWidget(self)
        self.stackWidget.addWidget(self.glyphCellView)
        self.tabWidget.currentTabChanged.connect(self._tabChanged)
        self.tabWidget.tabRemoved.connect(
            lambda index: self.stackWidget.removeWidget(
                self.stackWidget.widget(index)))
        self.stackWidget.currentChanged.connect(self._widgetChanged)

        self.propertiesView = PropertiesView(font, self)
        self.propertiesView.hide()

        self.statusBar = StatusBar(self)
        self.statusBar.setMinimumSize(32)
        self.statusBar.setMaximumSize(128)
        self.statusBar.sizeChanged.connect(self._sizeChanged)

        self.setFont_(font)

        app = QApplication.instance()
        app.dispatcher.addObserver(self, "_drawingToolRegistered",
                                   "drawingToolRegistered")
        app.dispatcher.addObserver(self, "_drawingToolUnregistered",
                                   "drawingToolUnregistered")
        app.dispatcher.addObserver(self, "_glyphViewGlyphsChanged",
                                   "glyphViewGlyphsChanged")

        layout = QHBoxLayout(self)
        layout.addWidget(self.toolBar)
        vLayout = QVBoxLayout()
        vLayout.addWidget(self.tabWidget)
        pageWidget = PageWidget()
        pageWidget.addWidget(self.stackWidget)
        pageWidget.addWidget(self.statusBar)
        vLayout.addWidget(pageWidget)
        layout.addLayout(vLayout)
        layout.addWidget(self.propertiesView)
        layout.setContentsMargins(0, 2, 0, 0)
        layout.setSpacing(2)

        elements = [
            ("Ctrl+D", self.deselect),
            (platformSpecific.closeKeySequence(), self.closeGlyphTab),
            # XXX: does this really not warrant widget focus?
            (QKeySequence.Delete, self.delete),
            ("Shift+" + QKeySequence(QKeySequence.Delete).toString(),
             self.delete),
            ("Z", lambda: self.zoom(1)),
            ("X", lambda: self.zoom(-1)),
        ]
        e = platformSpecific.altDeleteSequence()
        if e is not None:
            elements.append((e, self.delete))
        e = platformSpecific.altRedoSequence()
        if e is not None:
            elements.append((e, self.redo))
        for keys, callback in elements:
            shortcut = QShortcut(QKeySequence(keys), self)
            shortcut.activated.connect(callback)

        self.installEventFilter(PreviewEventFilter(self))

        self.readSettings()
        self.propertiesView.activeLayerModified.connect(
            self._activeLayerModified)
        self.statusBar.sizeChanged.connect(self.writeSettings)

    def readSettings(self):
        geometry = settings.fontWindowGeometry()
        if geometry:
            self.restoreGeometry(geometry)
        cellSize = settings.glyphCellSize()
        self.statusBar.setSize(cellSize)
        hidden = settings.propertiesHidden()
        if not hidden:
            self.properties()

    def writeSettings(self):
        settings.setFontWindowGeometry(self.saveGeometry())
        settings.setGlyphCellSize(self.glyphCellView.cellSize()[0])
        settings.setPropertiesHidden(self.propertiesView.isHidden())

    def menuBar(self):
        return self.layout().menuBar()

    def setMenuBar(self, menuBar):
        self.layout().setMenuBar(menuBar)

    def setupMenu(self, menuBar):
        app = QApplication.instance()

        fileMenu = menuBar.fetchMenu(Entries.File)
        fileMenu.fetchAction(Entries.File_New)
        fileMenu.fetchAction(Entries.File_Open)
        fileMenu.fetchMenu(Entries.File_Open_Recent)
        if not platformSpecific.mergeOpenAndImport():
            fileMenu.fetchAction(Entries.File_Import)
        fileMenu.addSeparator()
        fileMenu.fetchAction(Entries.File_Save, self.saveFile)
        fileMenu.fetchAction(Entries.File_Save_As, self.saveFileAs)
        fileMenu.fetchAction(Entries.File_Save_All)
        fileMenu.fetchAction(Entries.File_Reload, self.reloadFile)
        fileMenu.addSeparator()
        fileMenu.fetchAction(Entries.File_Export, self.exportFile)
        fileMenu.fetchAction(Entries.File_Exit)

        editMenu = menuBar.fetchMenu(Entries.Edit)
        self._undoAction = editMenu.fetchAction(Entries.Edit_Undo, self.undo)
        self._redoAction = editMenu.fetchAction(Entries.Edit_Redo, self.redo)
        editMenu.addSeparator()
        cut = editMenu.fetchAction(Entries.Edit_Cut, self.cut)
        copy = editMenu.fetchAction(Entries.Edit_Copy, self.copy)
        copyComponent = editMenu.fetchAction(Entries.Edit_Copy_As_Component,
                                             self.copyAsComponent)
        paste = editMenu.fetchAction(Entries.Edit_Paste, self.paste)
        self._clipboardActions = (cut, copy, copyComponent, paste)
        editMenu.fetchAction(Entries.Edit_Select_All, self.selectAll)
        # editMenu.fetchAction(Entries.Edit_Deselect, self.deselect)
        editMenu.fetchAction(Entries.Edit_Find, self.findGlyph)
        editMenu.addSeparator()
        editMenu.fetchAction(Entries.Edit_Settings)

        viewMenu = menuBar.fetchMenu(Entries.View)
        viewMenu.fetchAction(Entries.View_Zoom_In, lambda: self.zoom(1))
        viewMenu.fetchAction(Entries.View_Zoom_Out, lambda: self.zoom(-1))
        viewMenu.fetchAction(Entries.View_Reset_Zoom, self.resetZoom)
        viewMenu.addSeparator()
        viewMenu.fetchAction(Entries.View_Next_Tab, lambda: self.tabOffset(1))
        viewMenu.fetchAction(Entries.View_Previous_Tab,
                             lambda: self.tabOffset(-1))
        viewMenu.fetchAction(Entries.View_Next_Glyph,
                             lambda: self.glyphOffset(1))
        viewMenu.fetchAction(Entries.View_Previous_Glyph,
                             lambda: self.glyphOffset(-1))
        viewMenu.fetchAction(Entries.View_Layer_Up,
                             lambda: self.layerOffset(-1))
        viewMenu.fetchAction(Entries.View_Layer_Down,
                             lambda: self.layerOffset(1))
        viewMenu.addSeparator()
        viewMenu.fetchAction(Entries.View_Show_Points)
        viewMenu.fetchAction(Entries.View_Show_Metrics)
        viewMenu.fetchAction(Entries.View_Show_Images)
        viewMenu.fetchAction(Entries.View_Show_Guidelines)

        fontMenu = menuBar.fetchMenu(Entries.Font)
        fontMenu.fetchAction(Entries.Font_Font_Info, self.fontInfo)
        fontMenu.fetchAction(Entries.Font_Font_Features, self.fontFeatures)
        fontMenu.addSeparator()
        fontMenu.fetchAction(Entries.Font_Add_Glyphs, self.addGlyphs)
        fontMenu.fetchAction(Entries.Font_Sort, self.sortGlyphs)

        # glyphMenu = menuBar.fetchMenu(self.tr("&Glyph"))
        # self._layerAction = glyphMenu.fetchAction(
        #     self.tr("&Layer Actions…"), self.layerActions, "L")

        menuBar.fetchMenu(Entries.Scripts)

        windowMenu = menuBar.fetchMenu(Entries.Window)
        windowMenu.fetchAction(Entries.Window_Groups, self.groups)
        windowMenu.fetchAction(Entries.Window_Kerning, self.kerning)
        windowMenu.fetchAction(Entries.Window_Metrics, self.metrics)
        windowMenu.fetchAction(Entries.Window_Scripting)
        windowMenu.fetchAction(Entries.Window_Properties, self.properties)
        windowMenu.addSeparator()
        action = windowMenu.fetchAction(Entries.Window_Output)
        action.setEnabled(app.outputWindow is not None)

        helpMenu = menuBar.fetchMenu(Entries.Help)
        helpMenu.fetchAction(Entries.Help_Documentation)
        helpMenu.fetchAction(Entries.Help_Report_An_Issue)
        helpMenu.addSeparator()
        helpMenu.fetchAction(Entries.Help_About)

        self._updateGlyphActions()

    # --------------
    # Custom methods
    # --------------

    def font_(self):
        return self._font

    def setFont_(self, font):
        if self._font is not None:
            self._font.removeObserver(self, "Font.Changed")
            self._font.removeObserver(self, "Font.GlyphOrderChanged")
            self._font.removeObserver(self, "Font.SortDescriptorChanged")
        self._font = font
        self.setWindowTitle(self.fontTitle())
        if font is None:
            return
        self._updateGlyphsFromGlyphOrder()
        font.addObserver(self, "_fontChanged", "Font.Changed")
        font.addObserver(self, "_glyphOrderChanged", "Font.GlyphOrderChanged")
        font.addObserver(self, "_sortDescriptorChanged",
                         "Font.SortDescriptorChanged")

    def fontTitle(self):
        if self._font is None:
            return None
        path = self._font.path or self._font.binaryPath
        if path is not None:
            return os.path.basename(path.rstrip(os.sep))
        return self.tr("Untitled")

    def isGlyphTab(self):
        return bool(self.stackWidget.currentIndex())

    def openGlyphTab(self, glyph):
        # if a tab with this glyph exists already, switch to it
        for index in range(self.stackWidget.count()):
            if not index:
                continue
            view = self.stackWidget.widget(index)
            if list(view.glyphs()) == [glyph]:
                self.tabWidget.setCurrentTab(index)
                return
        # spawn
        widget = GlyphCanvasView(self)
        widget.setInputNames([glyph.name])
        widget.activeGlyphChanged.connect(self._selectionChanged)
        widget.glyphNamesChanged.connect(self._namesChanged)
        widget.pointSizeModified.connect(self.statusBar.setSize)
        widget.toolModified.connect(self.toolBar.setCurrentTool)
        # add
        self.tabWidget.addTab(_textForGlyphs([glyph]))
        self.stackWidget.addWidget(widget)
        # activate
        self.tabWidget.setCurrentTab(-1)

    def closeGlyphTab(self):
        index = self.stackWidget.currentIndex()
        if index:
            self.tabWidget.removeTab(index)

    def maybeSaveBeforeExit(self):
        if self._font.dirty:
            ret = CloseMessageBox.getCloseDocument(self, self.fontTitle())
            if ret == QMessageBox.Save:
                self.saveFile()
                return True
            elif ret == QMessageBox.Discard:
                return True
            return False
        return True

    # -------------
    # Notifications
    # -------------

    # app

    def _drawingToolRegistered(self, notification):
        toolClass = notification.data["tool"]
        index = self.stackWidget.currentIndex()
        parent = self.stackWidget.currentWidget() if index else None
        self.toolBar.addTool(toolClass(parent=parent))

    def _drawingToolUnregistered(self, notification):
        toolClass = notification.data["tool"]
        for tool in self.toolBar.tools():
            if isinstance(tool, toolClass):
                self.toolBar.removeTool(tool)
                return
        raise ValueError(
            "couldn't find tool to unregister: {}".format(toolClass))

    def _glyphViewGlyphsChanged(self, notification):
        self._updateGlyphActions()

    # widgets

    def _activeLayerModified(self):
        if self.isGlyphTab():
            widget = self.stackWidget.currentWidget()
            index = self.sender().currentIndex().row()
            layers = self._font.layers
            layer = layers[layers.layerOrder[index]]
            currentGlyph = widget.activeGlyph()
            # XXX: adjust TLayer.get and use it
            if currentGlyph.name in layer:
                glyph = layer[currentGlyph.name]
            else:
                glyph = layer.newGlyph(currentGlyph.name)
            widget.setActiveGlyph(glyph)

    def _namesChanged(self):
        sender = self.sender()
        index = self.stackWidget.indexOf(sender)
        self.tabWidget.setTabName(index, _textForGlyphs(sender.glyphs()))

    def _sizeChanged(self):
        size = self.statusBar.size()
        if self.isGlyphTab():
            widget = self.stackWidget.currentWidget()
            widget.setPointSize(size)
        else:
            self.glyphCellView.setCellSize(size)

    def _tabChanged(self, index):
        self.statusBar.setShouldPropagateSize(not index)
        # we need to hide, then setParent, then show
        self.stackWidget.currentWidget().hide()
        newWidget = self.stackWidget.widget(index)
        if index:
            for tool in self.toolBar.tools():
                tool.setParent(newWidget)
        self.stackWidget.setCurrentIndex(index)
        newWidget.setFocus(Qt.OtherFocusReason)

    def _toolChanged(self, tool):
        widget = self.stackWidget.currentWidget()
        ok = widget.setCurrentTool(tool)
        # the glyph view NAKed the change (in mouseDown)
        # set back the current tool in the toolbar
        if not ok:
            self.toolBar.setCurrentTool(widget.currentTool())

    def _widgetChanged(self, index):
        # update current glyph
        self._updateCurrentGlyph()
        # update undo/redo
        self._updateGlyphActions()
        # update slider
        if self.isGlyphTab():
            lo, hi, unit = 0, 900000, " pt"
            widget = self.stackWidget.currentWidget()
            size = widget.pointSize()
        else:
            lo, hi, unit = 32, 128, None
            size = self.glyphCellView.cellSize()[0]
        self.statusBar.setMinimumSize(lo)
        self.statusBar.setMaximumSize(hi)
        self.statusBar.setSize(size)
        self.statusBar.setUnit(unit)
        self.statusBar.setTextVisible(not self.isGlyphTab())
        # update and connect setCurrentTool
        try:
            self.toolBar.currentToolChanged.disconnect()
        except TypeError:
            pass
        if not index:
            return
        widget = self.stackWidget.currentWidget()
        widget.setCurrentTool(self.toolBar.currentTool())
        self.toolBar.currentToolChanged.connect(self._toolChanged)

    def _orderChanged(self):
        # TODO: reimplement when we start showing glyph subsets
        glyphs = self.glyphCellView.glyphs()
        self._font.glyphOrder = [glyph.name for glyph in glyphs]

    def _selectionChanged(self):
        if self.isGlyphTab():
            activeGlyph = self.stackWidget.currentWidget().activeGlyph()
        else:
            activeGlyph = self.glyphCellView.lastSelectedGlyph()
            # selection text
            # TODO: this should probably be internal to the label
            selection = self.glyphCellView.selection()
            if selection is not None:
                count = len(selection)
                if count == 1:
                    glyph = self.glyphCellView.glyphsForIndexes(selection)[0]
                    text = "%s " % glyph.name
                else:
                    text = ""
                if count:
                    text = self.tr("{0}(%n selected)".format(text), n=count)
            else:
                text = ""
            self.statusBar.setText(text)
        # currentGlyph
        app = QApplication.instance()
        app.setCurrentGlyph(activeGlyph)
        # actions
        self._updateGlyphActions()

    # defcon

    def _fontChanged(self, notification):
        font = notification.object
        self.setWindowModified(font.dirty)

    def _glyphOrderChanged(self, notification):
        self._updateGlyphsFromGlyphOrder()

    def _updateGlyphsFromGlyphOrder(self):
        font = self._font
        glyphOrder = font.glyphOrder
        if glyphOrder:
            glyphCount = 0
            glyphs = []
            for glyphName in glyphOrder:
                if glyphName in font:
                    glyph = font[glyphName]
                    glyphCount += 1
                else:
                    glyph = font.get(glyphName, asTemplate=True)
                glyphs.append(glyph)
            if glyphCount < len(font):
                # if some glyphs in the font are not present in the glyph
                # order, loop again to add them at the end
                for glyph in font:
                    if glyph not in glyphs:
                        glyphs.append(glyph)
                font.disableNotifications(observer=self)
                font.glyphOrder = [glyph.name for glyph in glyphs]
                font.enableNotifications(observer=self)
        else:
            glyphs = list(font)
            font.disableNotifications(observer=self)
            font.glyphOrder = [glyph.name for glyph in glyphs]
            font.enableNotifications(observer=self)
        self.glyphCellView.setGlyphs(glyphs)

    def _sortDescriptorChanged(self, notification):
        font = notification.object
        descriptors = notification.data["newValue"]
        if descriptors is None:
            return
        if descriptors[0]["type"] == "glyphSet":
            glyphNames = descriptors[0]["glyphs"]
        else:
            glyphNames = font.unicodeData.sortGlyphNames(
                font.keys(), descriptors)
        font.glyphOrder = glyphNames

    # ------------
    # Menu methods
    # ------------

    # File

    def saveFile(self, path=None, ufoFormatVersion=3):
        if path is None and self._font.path is None:
            self.saveFileAs()
        else:
            if path is None:
                path = self._font.path
            self._font.save(path, ufoFormatVersion)

    def saveFileAs(self):
        fileFormats = OrderedDict([
            (self.tr("UFO Font version 3 {}").format("(*.ufo)"), 3),
            (self.tr("UFO Font version 2 {}").format("(*.ufo)"), 2),
        ])
        state = settings.saveFileDialogState()
        path = self._font.path or self._font.binaryPath
        if path:
            directory = os.path.dirname(path)
        else:
            directory = None if state else QStandardPaths.standardLocations(
                QStandardPaths.DocumentsLocation)[0]
        # TODO: switch to directory dlg on platforms that need it
        dialog = QFileDialog(self, self.tr("Save File"), directory,
                             ";;".join(fileFormats.keys()))
        if state:
            dialog.restoreState(state)
        dialog.setAcceptMode(QFileDialog.AcceptSave)
        if directory:
            dialog.setDirectory(directory)
        ok = dialog.exec_()
        settings.setSaveFileDialogState(dialog.saveState())
        if ok:
            nameFilter = dialog.selectedNameFilter()
            path = dialog.selectedFiles()[0]
            if not os.path.basename(path).endswith(".ufo"):
                path += ".ufo"
            self.saveFile(path, fileFormats[nameFilter])
            app = QApplication.instance()
            app.setCurrentFile(self._font.path)
            self.setWindowTitle(self.fontTitle())
        # return ok

    def reloadFile(self):
        font = self._font
        path = font.path or font.binaryPath
        if not font.dirty or path is None:
            return
        if not ReloadMessageBox.getReloadDocument(self, self.fontTitle()):
            return
        if font.path is not None:
            font.reloadInfo()
            font.reloadKerning()
            font.reloadGroups()
            font.reloadFeatures()
            font.reloadLib()
            font.reloadGlyphs(font.keys())
            font.dirty = False
        else:
            # TODO: we should do this in-place
            font_ = font.__class__().new()
            font_.extract(font.binaryPath)
            self.setFont_(font_)

    def exportFile(self):
        params, ok = ExportDialog.getExportParameters(self, self._font)
        if not ok:
            return
        baseName = params['baseName']
        directory = params['exportDirectory']
        compression = set(map(str.lower, params['compression']))
        for format in map(str.lower, params['formats']):
            fileName = "{}.{}".format(baseName, format)
            path = os.path.join(directory, fileName)
            try:
                self._font.export(path, format, compression=compression)
            except Exception as e:
                msg = self.tr("This font’s feature file contains an error."
                              ) if isinstance(e, FeatureLibError) else None
                errorReports.showCriticalException(e, message=msg)

    # Edit

    def undo(self):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
        else:
            glyph = widget.lastSelectedGlyph()
        glyph.undo()

    def redo(self):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
        else:
            glyph = widget.lastSelectedGlyph()
        glyph.redo()

    def cut(self):
        self.copy()
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
            deleteUISelection(glyph)
        else:
            glyphs = widget.glyphs()
            for index in widget.selection():
                glyph = glyphs[index]
                glyph.clear()

    def copy(self):
        font = self._font
        widget = self.stackWidget.currentWidget()
        clipboard = QApplication.clipboard()
        mimeData = QMimeData()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
            copyGlyph = glyph.getRepresentation("SimpleFont.FilterSelection")
            packGlyphs = (copyGlyph, )
        else:
            glyphs = self.glyphCellView.glyphs()
            packGlyphs = (glyphs[index]
                          for index in sorted(self.glyphCellView.selection()))

        svgGlyphs = []
        pickled = []
        for i, glyph in enumerate(packGlyphs):
            pickled.append(glyph.serialize(blacklist=("name", "unicodes")))

            pen = SVGPathPen(font)
            glyph.draw(pen)
            col = i % 5
            row = i // 5
            g = '<g transform="matrix(1,0,0,-1,%f,%f)"><path d="%s"/></g>' % (
                font.info.unitsPerEm * col, font.info.unitsPerEm * row,
                pen.getCommands())
            svgGlyphs.append(g)

        mimeData.setData("application/x-simplefont-glyph-data",
                         pickle.dumps(pickled))

        svg = """\
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg">
%s
</svg>
""" % "\n".join(svgGlyphs)
        mimeData.setData("image/svg+xml", svg.encode("utf-8"))

        clipboard.setMimeData(mimeData)

    def copyAsComponent(self):
        if self.isGlyphTab():
            pass
        else:
            glyphs = self.glyphCellView.glyphs()
            pickled = []
            for index in self.glyphCellView.selection():
                glyph = glyphs[index]
                componentGlyph = glyph.__class__()
                componentGlyph.width = glyph.width
                component = componentGlyph.instantiateComponent()
                component.baseGlyph = glyph.name
                pickled.append(componentGlyph.serialize())
            clipboard = QApplication.clipboard()
            mimeData = QMimeData()
            mimeData.setData("application/x-simplefont-glyph-data",
                             pickle.dumps(pickled))
            clipboard.setMimeData(mimeData)

    def paste(self):
        isGlyphTab = self.isGlyphTab()
        widget = self.stackWidget.currentWidget()
        if isGlyphTab:
            glyphs = (widget.activeGlyph(), )
        else:
            selection = self.glyphCellView.selection()
            glyphs = widget.glyphsForIndexes(selection)
        clipboard = QApplication.clipboard()
        mimeData = clipboard.mimeData()
        if mimeData.hasFormat("application/x-simplefont-glyph-data"):
            data = pickle.loads(
                mimeData.data("application/x-simplefont-glyph-data"))
            if len(data) == len(glyphs):
                for pickled, glyph in zip(data, glyphs):
                    if isGlyphTab:
                        pasteGlyph = glyph.__class__()
                        pasteGlyph.deserialize(pickled)
                        # TODO: if we serialize selected state, we don't need
                        # to do this
                        pasteGlyph.selected = True
                        if len(pasteGlyph) or len(pasteGlyph.components) or \
                                len(pasteGlyph.anchors):
                            glyph.beginUndoGroup()
                            glyph.holdNotifications()
                            count = len(glyph)
                            pen = glyph.getPointPen()
                            # contours, components
                            pasteGlyph.drawPoints(pen)
                            for contour in glyph[count:]:
                                contour.selected = True
                            # anchors
                            for anchor in pasteGlyph.anchors:
                                glyph.appendAnchor(dict(anchor))
                            # guidelines
                            for guideline in pasteGlyph.guidelines:
                                glyph.appendGuideline(dict(guideline))
                            glyph.releaseHeldNotifications()
                            glyph.endUndoGroup()
                    else:
                        glyph.deserialize(pickled)
            return
        if mimeData.hasFormat("image/svg+xml"):
            if len(glyphs) == 1:
                glyph = glyphs[0]
                try:
                    svgPath = SVGPath.fromstring(
                        mimeData.data("image/svg+xml"))
                except:
                    pass
                else:
                    glyph.beginUndoGroup()
                    if not isGlyphTab:
                        glyph.clear()
                    svgPath.draw(glyph.getPen())
                    glyph.endUndoGroup()
                    return
        if mimeData.hasText():
            if len(glyphs) == 1:
                glyph = glyphs[0]
                otherGlyph = glyph.__class__()
                text = mimeData.text()
                try:
                    readGlyphFromString(text, otherGlyph,
                                        otherGlyph.getPointPen())
                except:
                    try:
                        svgPath = SVGPath.fromstring(text)
                        svgPath.draw(otherGlyph.getPen())
                    except:
                        return
                glyph.beginUndoGroup()
                if not isGlyphTab:
                    glyph.clear()
                otherGlyph.drawPoints(glyph.getPointPen())
                glyph.endUndoGroup()

    def selectAll(self):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
            if glyph.selected:
                for anchor in glyph.anchors:
                    anchor.selected = True
                for component in glyph.components:
                    component.selected = True
            else:
                glyph.selected = True
        else:
            widget.selectAll()

    def deselect(self):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
            for anchor in glyph.anchors:
                anchor.selected = False
            for component in glyph.components:
                component.selected = False
            glyph.selected = False
        else:
            widget.setSelection(set())

    def delete(self):
        modifiers = QApplication.keyboardModifiers()
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
            # TODO: fuse more the two methods, they're similar and delete is
            # Cut except not putting in the clipboard
            if modifiers & Qt.AltModifier:
                deleteUISelection(glyph)
            else:
                preserveShape = not modifiers & Qt.ShiftModifier
                removeUIGlyphElements(glyph, preserveShape)
        else:
            erase = modifiers & Qt.ShiftModifier
            if self._proceedWithDeletion(erase):
                glyphs = widget.glyphsForIndexes(widget.selection())
                for glyph in glyphs:
                    font = glyph.font
                    for layer in font.layers:
                        if glyph.name in layer:
                            defaultLayer = layer[glyph.name] == glyph
                            if defaultLayer and not erase:
                                # TODO: clear in glyph.template setter?
                                glyph.clear()
                                glyph.template = True
                            else:
                                del layer[glyph.name]

    def findGlyph(self):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
            newGlyph, ok = FindDialog.getNewGlyph(self, glyph)
            if ok and newGlyph is not None:
                widget.setActiveGlyph(newGlyph)
        else:
            pass  # XXX

    # View

    def zoom(self, step):
        if self.isGlyphTab():
            widget = self.stackWidget.currentWidget()
            newScale = widget.scale() * pow(1.2, step)
            widget.zoom(newScale)
            self.statusBar.setSize(widget.pointSize())
        else:
            value = self.statusBar.size()
            newValue = value + 10 * step
            self.statusBar.setSize(newValue)

    def resetZoom(self):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            widget.fitScaleBBox()
        else:
            settings.removeGlyphCellSize()
            cellSize = settings.glyphCellSize()
            self.statusBar.setSize(cellSize)

    def tabOffset(self, value):
        tab = self.tabWidget.currentTab()
        newTab = (tab + value) % len(self.tabWidget.tabs())
        self.tabWidget.setCurrentTab(newTab)

    def glyphOffset(self, value):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            currentGlyph = widget.activeGlyph()
            font = currentGlyph.font
            glyphOrder = font.glyphOrder
            # should be enforced in fontView already
            if not (glyphOrder and len(glyphOrder)):
                return
            index = glyphOrder.index(currentGlyph.name)
            newIndex = (index + value) % len(glyphOrder)
            glyph = font[glyphOrder[newIndex]]
            widget.setActiveGlyph(glyph)
        else:
            lastSelectedCell = widget.lastSelectedCell()
            if lastSelectedCell is None:
                return
            newIndex = lastSelectedCell + value
            if newIndex < 0 or newIndex >= len(widget.glyphs()):
                return
            widget.setSelection({newIndex})

    def layerOffset(self, value):
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            currentGlyph = widget.activeGlyph()
            layerSet, layer = currentGlyph.layerSet, currentGlyph.layer
            if None in (layerSet, layer):
                return
            index = layerSet.layerOrder.index(layer.name)
            newIndex = (index + value) % len(layerSet)
            layer_ = layerSet[layerSet.layerOrder[newIndex]]
            if layer_ == layer:
                return
            # XXX: fix get
            # glyph = layer_.get(currentGlyph.name)
            if currentGlyph.name in layer_:
                glyph = layer_[currentGlyph.name]
            else:
                glyph = layer_.newGlyph(currentGlyph.name)
            widget.setActiveGlyph(glyph)

    # Font

    def fontInfo(self):
        # If a window is already opened, bring it to the front, else spawn one.
        # TODO: see about using widget.setAttribute(Qt.WA_DeleteOnClose)
        # otherwise it seems we're just leaking memory after each close...
        # (both raise_ and show allocate memory instead of using the hidden
        # widget it seems)
        if self._infoWindow is not None and self._infoWindow.isVisible():
            self._infoWindow.raise_()
        else:
            self._infoWindow = FontInfoWindow(self._font, self)
            self._infoWindow.show()

    def fontFeatures(self):
        # TODO: see up here
        if self._featuresWindow is not None and self._featuresWindow.isVisible(
        ):
            self._featuresWindow.raise_()
        else:
            self._featuresWindow = FontFeaturesWindow(self._font, self)
            self._featuresWindow.show()

    def addGlyphs(self):
        glyphs = self.glyphCellView.glyphs()
        newGlyphNames, params, ok = AddGlyphsDialog.getNewGlyphNames(
            self, glyphs)
        if ok:
            sortFont = params.pop("sortFont")
            for name in newGlyphNames:
                glyph = self._font.get(name, **params)
                if glyph is not None:
                    glyphs.append(glyph)
            self.glyphCellView.setGlyphs(glyphs)
            if sortFont:
                # TODO: when the user add chars from a glyphSet and no others,
                # should we try to sort according to that glyphSet?
                # The above would probably warrant some rearchitecturing.
                # kick-in the sort mechanism
                self._font.sortDescriptor = self._font.sortDescriptor

    def sortGlyphs(self):
        sortDescriptor, ok = SortDialog.getDescriptor(
            self, self._font.sortDescriptor)
        if ok:
            self._font.sortDescriptor = sortDescriptor

    # Window

    def groups(self):
        # TODO: see up here
        if self._groupsWindow is not None and self._groupsWindow.isVisible():
            self._groupsWindow.raise_()
        else:
            self._groupsWindow = GroupsWindow(self._font, self)
            self._groupsWindow.show()

    def kerning(self):
        # TODO: see up here
        if self._kerningWindow is not None and self._kerningWindow.isVisible():
            self._kerningWindow.raise_()
        else:
            self._kerningWindow = KerningWindow(self._font, self)
            self._kerningWindow.show()

    def metrics(self):
        # TODO: see up here
        if self._metricsWindow is not None and self._metricsWindow.isVisible():
            self._metricsWindow.raise_()
        else:
            self._metricsWindow = MetricsWindow(self._font)
            # XXX: need proper, fast windowForFont API!
            self._metricsWindow._fontWindow = self
            self.destroyed.connect(self._metricsWindow.close)
            self._metricsWindow.show()
        # TODO: default string kicks-in on the window before this. Figure out
        # how to make a clean interface
        selection = self.glyphCellView.selection()
        if selection:
            glyphs = self.glyphCellView.glyphsForIndexes(selection)
            self._metricsWindow.setGlyphs(glyphs)

    def properties(self):
        shouldBeVisible = self.propertiesView.isHidden()
        self.propertiesView.setVisible(shouldBeVisible)
        self.writeSettings()

    # update methods

    def _setGlyphPreview(self, value):
        index = self.stackWidget.currentIndex()
        if index:
            widget = self.stackWidget.currentWidget()
            widget.setPreviewEnabled(value)

    def _updateCurrentGlyph(self):
        # TODO: refactor this pattern...
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            glyph = widget.activeGlyph()
        else:
            glyph = widget.lastSelectedGlyph()
        if glyph is not None:
            app = QApplication.instance()
            app.setCurrentGlyph(glyph)

    def _updateGlyphActions(self):
        if not hasattr(self, "_undoAction"):
            return
        widget = self.stackWidget.currentWidget()
        if self.isGlyphTab():
            currentGlyph = widget.activeGlyph()
        else:
            currentGlyph = widget.lastSelectedGlyph()
        # disconnect eventual signal of previous glyph
        objects = (
            (self._undoAction, self.undo),
            (self._redoAction, self.redo),
        )
        for action, slot in objects:
            try:
                action.disconnect()
            except TypeError:
                pass
            action.triggered.connect(slot)
        # now update status
        if currentGlyph is None:
            self._undoAction.setEnabled(False)
            self._redoAction.setEnabled(False)
        else:
            undoManager = currentGlyph.undoManager
            self._undoAction.setEnabled(currentGlyph.canUndo())
            undoManager.canUndoChanged.connect(self._undoAction.setEnabled)
            self._redoAction.setEnabled(currentGlyph.canRedo())
            undoManager.canRedoChanged.connect(self._redoAction.setEnabled)
        # and other actions
        for action in self._clipboardActions:
            action.setEnabled(currentGlyph is not None)

    # helper

    def _proceedWithDeletion(self, erase=False):
        if not self.glyphCellView.selection():
            return
        tr = self.tr("Delete") if erase else self.tr("Clear")
        text = self.tr("Do you want to %s selected glyphs?") % tr.lower()
        closeDialog = QMessageBox(QMessageBox.Question, "",
                                  self.tr("%s glyphs") % tr,
                                  QMessageBox.Yes | QMessageBox.No, self)
        closeDialog.setInformativeText(text)
        closeDialog.setModal(True)
        ret = closeDialog.exec_()
        if ret == QMessageBox.Yes:
            return True
        return False

    # ----------
    # Qt methods
    # ----------

    def setWindowTitle(self, title):
        if platformSpecific.appNameInTitle():
            title += " – SimpleFont"
        super().setWindowTitle("[*]{}".format(title))

    def sizeHint(self):
        return QSize(1270, 800)

    def moveEvent(self, event):
        self.writeSettings()

    resizeEvent = moveEvent

    def showEvent(self, event):
        app = QApplication.instance()
        data = dict(
            font=self._font,
            window=self,
        )
        app.postNotification("fontWindowWillOpen", data)
        super().showEvent(event)
        app.postNotification("fontWindowOpened", data)

    def closeEvent(self, event):
        ok = self.maybeSaveBeforeExit()
        if ok:
            app = QApplication.instance()
            data = dict(
                font=self._font,
                window=self,
            )
            app.postNotification("fontWindowWillClose", data)
            self._font.removeObserver(self, "Font.Changed")
            app = QApplication.instance()
            app.dispatcher.removeObserver(self, "drawingToolRegistered")
            app.dispatcher.removeObserver(self, "drawingToolUnregistered")
            app.dispatcher.removeObserver(self, "glyphViewGlyphsChanged")
            event.accept()
        else:
            event.ignore()

    def event(self, event):
        if event.type() == QEvent.WindowActivate:
            app = QApplication.instance()
            app.setCurrentFontWindow(self)
            self._updateCurrentGlyph()
        return super().event(event)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.fillRect(event.rect(), QColor(212, 212, 212))
Example #55
0
    def configure_gui(self):

        self.stack = QStackedWidget(self)
        self.setCentralWidget(self.stack)
        self.stack.setContentsMargins(0, 0, 5, 0)
Example #56
0
    def __init__(self, font, parent=None):
        super().__init__(parent)
        self._font = None

        self._infoWindow = None
        self._featuresWindow = None
        self._groupsWindow = None
        self._kerningWindow = None
        self._metricsWindow = None

        self.toolBar = ToolBar(self)
        self.toolBar.setTools(t()
                              for t in QApplication.instance().drawingTools())

        self.glyphCellView = GlyphCellView(self)
        self.glyphCellView.glyphActivated.connect(self.openGlyphTab)
        self.glyphCellView.glyphsDropped.connect(self._orderChanged)
        self.glyphCellView.selectionChanged.connect(self._selectionChanged)
        self.glyphCellView.setAcceptDrops(True)
        self.glyphCellView.setCellRepresentationName("SimpleFont.GlyphCell")
        self.glyphCellView.setFrameShape(self.glyphCellView.NoFrame)
        self.glyphCellView.setFocus()

        self.tabWidget = TabWidget(self)
        self.tabWidget.setAutoHide(True)
        self.tabWidget.setHeroFirstTab(True)
        self.tabWidget.addTab(self.tr("Font"))

        self.stackWidget = QStackedWidget(self)
        self.stackWidget.addWidget(self.glyphCellView)
        self.tabWidget.currentTabChanged.connect(self._tabChanged)
        self.tabWidget.tabRemoved.connect(
            lambda index: self.stackWidget.removeWidget(
                self.stackWidget.widget(index)))
        self.stackWidget.currentChanged.connect(self._widgetChanged)

        self.propertiesView = PropertiesView(font, self)
        self.propertiesView.hide()

        self.statusBar = StatusBar(self)
        self.statusBar.setMinimumSize(32)
        self.statusBar.setMaximumSize(128)
        self.statusBar.sizeChanged.connect(self._sizeChanged)

        self.setFont_(font)

        app = QApplication.instance()
        app.dispatcher.addObserver(self, "_drawingToolRegistered",
                                   "drawingToolRegistered")
        app.dispatcher.addObserver(self, "_drawingToolUnregistered",
                                   "drawingToolUnregistered")
        app.dispatcher.addObserver(self, "_glyphViewGlyphsChanged",
                                   "glyphViewGlyphsChanged")

        layout = QHBoxLayout(self)
        layout.addWidget(self.toolBar)
        vLayout = QVBoxLayout()
        vLayout.addWidget(self.tabWidget)
        pageWidget = PageWidget()
        pageWidget.addWidget(self.stackWidget)
        pageWidget.addWidget(self.statusBar)
        vLayout.addWidget(pageWidget)
        layout.addLayout(vLayout)
        layout.addWidget(self.propertiesView)
        layout.setContentsMargins(0, 2, 0, 0)
        layout.setSpacing(2)

        elements = [
            ("Ctrl+D", self.deselect),
            (platformSpecific.closeKeySequence(), self.closeGlyphTab),
            # XXX: does this really not warrant widget focus?
            (QKeySequence.Delete, self.delete),
            ("Shift+" + QKeySequence(QKeySequence.Delete).toString(),
             self.delete),
            ("Z", lambda: self.zoom(1)),
            ("X", lambda: self.zoom(-1)),
        ]
        e = platformSpecific.altDeleteSequence()
        if e is not None:
            elements.append((e, self.delete))
        e = platformSpecific.altRedoSequence()
        if e is not None:
            elements.append((e, self.redo))
        for keys, callback in elements:
            shortcut = QShortcut(QKeySequence(keys), self)
            shortcut.activated.connect(callback)

        self.installEventFilter(PreviewEventFilter(self))

        self.readSettings()
        self.propertiesView.activeLayerModified.connect(
            self._activeLayerModified)
        self.statusBar.sizeChanged.connect(self.writeSettings)
Example #57
0
import sys
from PyQt5.QtWidgets import QApplication, QStackedWidget
from PyQt5 import QtGui

from Login.View.ViewLogin import ViewLogin

if __name__ == '__main__':
    app = QApplication(sys.argv)

    widget = QStackedWidget()

    Vista_login = ViewLogin(widget)

    widget.addWidget(Vista_login)
    widget.setStyleSheet("background-color: rgb(254, 235, 156)")
    widget.setWindowTitle("Cinema")
    icon = QtGui.QIcon()
    icon.addPixmap(QtGui.QPixmap("images/biglietto.png"), QtGui.QIcon.Normal,
                   QtGui.QIcon.Off)
    widget.setWindowIcon(icon)
    # Spostamento widget al centro (fissare dimensione login al max per mantenere tutto al centro)
    widget.show()
    centerPoint = QtGui.QScreen.availableGeometry(app.primaryScreen()).center()
    fg = widget.frameGeometry()
    fg.moveCenter(centerPoint)
    widget.move(fg.topLeft())

    sys.exit(app.exec())
Example #58
0
class DataSelectionGui(QWidget):
    """
    Manages all GUI elements in the data selection applet.
    This class itself is the central widget and also owns/manages the applet drawer widgets.
    """

    ###########################################
    ### AppletGuiInterface Concrete Methods ###
    ###########################################

    def centralWidget(self):
        return self

    def appletDrawer(self):
        return self._drawer

    def menus(self):
        return []

    def viewerControlWidget(self):
        return self._viewerControlWidgetStack

    def setImageIndex(self, imageIndex):
        if imageIndex is not None:
            self.laneSummaryTableView.selectRow(imageIndex)
            for detailWidget in self._detailViewerWidgets:
                detailWidget.selectRow(imageIndex)

    def stopAndCleanUp(self):
        self._cleaning_up = True
        for editor in list(self.volumeEditors.values()):
            self.viewerStack.removeWidget(editor)
            self._viewerControlWidgetStack.removeWidget(
                editor.viewerControlWidget())
            editor.stopAndCleanUp()
        self.volumeEditors.clear()

    def imageLaneAdded(self, laneIndex):
        if len(self.laneSummaryTableView.selectedIndexes()) == 0:
            self.laneSummaryTableView.selectRow(laneIndex)

        # We don't have any real work to do because this gui initiated the lane addition in the first place
        if self.guiMode != GuiMode.Batch:
            if (len(self.topLevelOperator.DatasetGroup) != laneIndex + 1):
                import warnings
                warnings.warn(
                    "DataSelectionGui.imageLaneAdded(): length of dataset multislot out of sync with laneindex [%s != %s + 1]"
                    % (len(self.topLevelOperator.DatasetGroup), laneIndex))

    def imageLaneRemoved(self, laneIndex, finalLength):
        # There's nothing to do here because the GUI already
        #  handles operator resizes via slot callbacks.
        pass

    def allowLaneSelectionChange(self):
        return False

    ###########################################
    ###########################################

    class UserCancelledError(Exception):
        # This exception type is raised when the user cancels the
        #  addition of dataset files in the middle of the process somewhere.
        # It isn't an error -- it's used for control flow.
        pass

    def __init__(self,
                 parentApplet,
                 dataSelectionOperator,
                 serializer,
                 instructionText,
                 guiMode=GuiMode.Normal,
                 max_lanes=None,
                 show_axis_details=False):
        """
        Constructor.
        
        :param dataSelectionOperator: The top-level operator.  Must be of type :py:class:`OpMultiLaneDataSelectionGroup`.
        :param serializer: The applet's serializer.  Must be of type :py:class:`DataSelectionSerializer`
        :param instructionText: A string to display in the applet drawer.
        :param guiMode: Either ``GuiMode.Normal`` or ``GuiMode.Batch``.  Currently, there is no difference between normal and batch mode.
        :param max_lanes: The maximum number of lanes that the user is permitted to add to this workflow.  If ``None``, there is no maximum.
        """
        super(DataSelectionGui, self).__init__()
        self._cleaning_up = False
        self.parentApplet = parentApplet
        self._max_lanes = max_lanes
        self._default_h5_volumes = {}
        self.show_axis_details = show_axis_details

        self._viewerControls = QWidget()
        self.topLevelOperator = dataSelectionOperator
        self.guiMode = guiMode
        self.serializer = serializer
        self.threadRouter = ThreadRouter(self)

        self._initCentralUic()
        self._initAppletDrawerUic(instructionText)

        self._viewerControlWidgetStack = QStackedWidget(self)

        def handleImageRemove(multislot, index, finalLength):
            # Remove the viewer for this dataset
            datasetSlot = self.topLevelOperator.DatasetGroup[index]
            if datasetSlot in list(self.volumeEditors.keys()):
                editor = self.volumeEditors[datasetSlot]
                self.viewerStack.removeWidget(editor)
                self._viewerControlWidgetStack.removeWidget(
                    editor.viewerControlWidget())
                editor.stopAndCleanUp()

        self.topLevelOperator.DatasetGroup.notifyRemove(
            bind(handleImageRemove))

        opWorkflow = self.topLevelOperator.parent
        assert hasattr(opWorkflow.shell, 'onSaveProjectActionTriggered'), \
            "This class uses the IlastikShell.onSaveProjectActionTriggered function.  Did you rename it?"

    def _initCentralUic(self):
        """
        Load the GUI from the ui file into this class and connect it with event handlers.
        """
        # Load the ui file into this class (find it in our own directory)
        localDir = os.path.split(__file__)[0] + '/'
        uic.loadUi(localDir + "/dataSelection.ui", self)

        self._initTableViews()
        self._initViewerStack()
        self.splitter.setSizes([150, 850])

    def _initAppletDrawerUic(self, instructionText):
        """
        Load the ui file for the applet drawer, which we own.
        """
        localDir = os.path.split(__file__)[0] + '/'
        self._drawer = uic.loadUi(localDir + "/dataSelectionDrawer.ui")
        self._drawer.instructionLabel.setText(instructionText)

    def _initTableViews(self):
        self.fileInfoTabWidget.setTabText(0, "Summary")
        self.laneSummaryTableView.setModel(
            DataLaneSummaryTableModel(self, self.topLevelOperator))
        self.laneSummaryTableView.dataLaneSelected.connect(self.showDataset)
        self.laneSummaryTableView.addFilesRequested.connect(self.addFiles)
        self.laneSummaryTableView.addStackRequested.connect(self.addStack)
        self.laneSummaryTableView.removeLanesRequested.connect(
            self.handleRemoveLaneButtonClicked)

        # These two helper functions enable/disable an 'add files' button for a given role
        #  based on the the max lane index for that role and the overall permitted max_lanes
        def _update_button_status(viewer, role_index):
            if self._max_lanes:
                viewer.setEnabled(
                    self._findFirstEmptyLane(role_index) < self._max_lanes)

        def _handle_lane_added(button, role_index, lane_slot, lane_index):
            def _handle_role_slot_added(role_slot, added_slot_index, *args):
                if added_slot_index == role_index:
                    role_slot.notifyReady(
                        bind(_update_button_status, button, role_index))
                    role_slot.notifyUnready(
                        bind(_update_button_status, button, role_index))

            lane_slot[lane_index].notifyInserted(_handle_role_slot_added)

        self._retained = []  # Retain menus so they don't get deleted
        self._detailViewerWidgets = []
        for roleIndex, role in enumerate(
                self.topLevelOperator.DatasetRoles.value):
            detailViewer = DatasetDetailedInfoTableView(self)
            detailViewer.setModel(
                DatasetDetailedInfoTableModel(self, self.topLevelOperator,
                                              roleIndex))
            self._detailViewerWidgets.append(detailViewer)

            # Button
            detailViewer.addFilesRequested.connect(
                partial(self.addFiles, roleIndex))
            detailViewer.addStackRequested.connect(
                partial(self.addStack, roleIndex))
            detailViewer.addPrecomputedVolumeRequested.connect(
                partial(self.addPrecomputedVolume, roleIndex))
            detailViewer.addRemoteVolumeRequested.connect(
                partial(self.addDvidVolume, roleIndex))

            # Monitor changes to each lane so we can enable/disable the 'add lanes' button for each tab
            self.topLevelOperator.DatasetGroup.notifyInserted(
                bind(_handle_lane_added, detailViewer, roleIndex))
            self.topLevelOperator.DatasetGroup.notifyRemoved(
                bind(_update_button_status, detailViewer, roleIndex))

            # While we're at it, do the same for the buttons in the summary table, too
            self.topLevelOperator.DatasetGroup.notifyInserted(
                bind(_handle_lane_added,
                     self.laneSummaryTableView.addFilesButtons[roleIndex],
                     roleIndex))
            self.topLevelOperator.DatasetGroup.notifyRemoved(
                bind(_update_button_status,
                     self.laneSummaryTableView.addFilesButtons[roleIndex],
                     roleIndex))

            # Context menu
            detailViewer.replaceWithFileRequested.connect(
                partial(self.handleReplaceFile, roleIndex))
            detailViewer.replaceWithStackRequested.connect(
                partial(self.addStack, roleIndex))
            detailViewer.editRequested.connect(
                partial(self.editDatasetInfo, roleIndex))
            detailViewer.resetRequested.connect(
                partial(self.handleClearDatasets, roleIndex))

            # Drag-and-drop
            detailViewer.addFilesRequestedDrop.connect(
                partial(self.addFileNames, roleIndex=roleIndex))

            # Selection handling
            def showFirstSelectedDataset(_roleIndex, lanes):
                if lanes:
                    self.showDataset(lanes[0], _roleIndex)

            detailViewer.dataLaneSelected.connect(
                partial(showFirstSelectedDataset, roleIndex))

            self.fileInfoTabWidget.insertTab(roleIndex, detailViewer, role)

        self.fileInfoTabWidget.currentChanged.connect(self.handleSwitchTabs)
        self.fileInfoTabWidget.setCurrentIndex(0)

    def handleSwitchTabs(self, tabIndex):
        if tabIndex < len(self._detailViewerWidgets):
            roleIndex = tabIndex  # If summary tab is moved to the front, change this line.
            detailViewer = self._detailViewerWidgets[roleIndex]
            selectedLanes = detailViewer.selectedLanes
            if selectedLanes:
                self.showDataset(selectedLanes[0], roleIndex)

    def _initViewerStack(self):
        self.volumeEditors = {}
        self.viewerStack.addWidget(QWidget())

    def handleRemoveLaneButtonClicked(self):
        """
        The user clicked the "Remove" button.
        Remove the currently selected row(s) from both the GUI and the top-level operator.
        """
        # Figure out which lanes to remove
        selectedIndexes = self.laneSummaryTableView.selectedIndexes()
        rows = set()
        for modelIndex in selectedIndexes:
            rows.add(modelIndex.row())

        # Don't remove the last row, which is just buttons.
        rows.discard(self.laneSummaryTableView.model().rowCount() - 1)

        # Remove in reverse order so row numbers remain consistent
        for row in reversed(sorted(rows)):
            # Remove lanes from the operator.
            # The table model will notice the changes and update the rows accordingly.
            finalSize = len(self.topLevelOperator.DatasetGroup) - 1
            self.topLevelOperator.DatasetGroup.removeSlot(row, finalSize)

    @threadRouted
    def showDataset(self, laneIndex, roleIndex=None):
        if self._cleaning_up:
            return
        if laneIndex == -1:
            self.viewerStack.setCurrentIndex(0)
            return

        assert threading.current_thread().name == "MainThread"

        if laneIndex >= len(self.topLevelOperator.DatasetGroup):
            return
        datasetSlot = self.topLevelOperator.DatasetGroup[laneIndex]

        # Create if necessary
        if datasetSlot not in list(self.volumeEditors.keys()):

            class DatasetViewer(LayerViewerGui):
                def moveToTop(self, roleIndex):
                    opLaneView = self.topLevelOperatorView
                    if not opLaneView.DatasetRoles.ready():
                        return
                    datasetRoles = opLaneView.DatasetRoles.value
                    if roleIndex >= len(datasetRoles):
                        return
                    roleName = datasetRoles[roleIndex]
                    try:
                        layerIndex = [l.name
                                      for l in self.layerstack].index(roleName)
                    except ValueError:
                        return
                    else:
                        self.layerstack.selectRow(layerIndex)
                        self.layerstack.moveSelectedToTop()

                def setupLayers(self):
                    opLaneView = self.topLevelOperatorView
                    if not opLaneView.DatasetRoles.ready():
                        return []
                    layers = []
                    datasetRoles = opLaneView.DatasetRoles.value
                    for roleIndex, slot in enumerate(opLaneView.ImageGroup):
                        if slot.ready():
                            roleName = datasetRoles[roleIndex]
                            layer = self.createStandardLayerFromSlot(slot)
                            layer.name = roleName
                            layers.append(layer)
                    return layers

            opLaneView = self.topLevelOperator.getLane(laneIndex)
            layerViewer = DatasetViewer(self.parentApplet,
                                        opLaneView,
                                        crosshair=False)

            # Maximize the x-y view by default.
            layerViewer.volumeEditorWidget.quadview.ensureMaximized(2)

            self.volumeEditors[datasetSlot] = layerViewer
            self.viewerStack.addWidget(layerViewer)
            self._viewerControlWidgetStack.addWidget(
                layerViewer.viewerControlWidget())

        # Show the right one
        viewer = self.volumeEditors[datasetSlot]
        displayedRole = self.fileInfoTabWidget.currentIndex()
        viewer.moveToTop(displayedRole)
        self.viewerStack.setCurrentWidget(viewer)
        self._viewerControlWidgetStack.setCurrentWidget(
            viewer.viewerControlWidget())

    def handleReplaceFile(self, roleIndex, startingLane):
        self.addFiles(roleIndex, startingLane)

    def addFiles(self, roleIndex, startingLane=None):
        """
        The user clicked the "Add File" button.
        Ask him to choose a file (or several) and add them to both
          the GUI table and the top-level operator inputs.
        """
        # Find the directory of the most recently opened image file
        mostRecentImageFile = PreferencesManager().get('DataSelection',
                                                       'recent image')
        mostRecentImageFile = str(mostRecentImageFile)
        if mostRecentImageFile is not None:
            defaultDirectory = os.path.split(mostRecentImageFile)[0]
        else:
            defaultDirectory = os.path.expanduser('~')

        # Launch the "Open File" dialog
        fileNames = self.getImageFileNamesToOpen(self, defaultDirectory)

        # If the user didn't cancel
        if len(fileNames) > 0:
            PreferencesManager().set('DataSelection', 'recent image',
                                     fileNames[0])
            try:
                self.addFileNames(fileNames, roleIndex, startingLane)
            except Exception as ex:
                log_exception(logger)
                QMessageBox.critical(self, "Error loading file", str(ex))

    @classmethod
    def getImageFileNamesToOpen(cls, parent_window, defaultDirectory):
        """
        Launch an "Open File" dialog to ask the user for one or more image files.
        """
        extensions = OpDataSelection.SupportedExtensions
        filter_strs = ["*." + x for x in extensions]
        filters = ["{filt} ({filt})".format(filt=x) for x in filter_strs]
        filt_all_str = "Image files (" + ' '.join(filter_strs) + ')'

        fileNames = []

        if ilastik_config.getboolean("ilastik", "debug"):
            # use Qt dialog in debug mode (more portable?)
            file_dialog = QFileDialog(parent_window, "Select Images")
            file_dialog.setOption(QFileDialog.DontUseNativeDialog, True)
            # do not display file types associated with a filter
            # the line for "Image files" is too long otherwise
            file_dialog.setNameFilters([filt_all_str] + filters)
            #file_dialog.setNameFilterDetailsVisible(False)
            # select multiple files
            file_dialog.setFileMode(QFileDialog.ExistingFiles)
            file_dialog.setDirectory(defaultDirectory)

            if file_dialog.exec_():
                fileNames = file_dialog.selectedFiles()
        else:
            # otherwise, use native dialog of the present platform
            fileNames, _filter = QFileDialog.getOpenFileNames(
                parent_window, "Select Images", defaultDirectory, filt_all_str)
        return fileNames

    def _findFirstEmptyLane(self, roleIndex):
        opTop = self.topLevelOperator

        # Determine the number of files this role already has
        # Search for the last valid value.
        firstNewLane = 0
        for laneIndex, slot in reversed(
                list(
                    zip(list(range(len(opTop.DatasetGroup))),
                        opTop.DatasetGroup))):
            if slot[roleIndex].ready():
                firstNewLane = laneIndex + 1
                break
        return firstNewLane

    def addFileNames(self, fileNames, roleIndex, startingLane=None, rois=None):
        """
        Add the given filenames to both the GUI table and the top-level operator inputs.
        If startingLane is None, the filenames will be *appended* to the role's list of files.
        
        If rois is provided, it must be a list of (start,stop) tuples (one for each fileName)
        """
        # What lanes will we touch?
        startingLane, endingLane = self._determineLaneRange(
            fileNames, roleIndex, startingLane)
        if startingLane is None:
            # Something went wrong.
            return

        # If we're only adding new lanes, NOT modifying existing lanes...
        adding_only = startingLane == len(self.topLevelOperator)

        # Create a list of DatasetInfos
        try:
            infos = self._createDatasetInfos(roleIndex, fileNames, rois)
        except DataSelectionGui.UserCancelledError:
            return
        # If no exception was thrown so far, set up the operator now
        loaded_all = self._configureOpWithInfos(roleIndex, startingLane,
                                                endingLane, infos)

        if loaded_all:
            # Now check the resulting slots.
            # If they should be copied to the project file, say so.
            self._reconfigureDatasetLocations(roleIndex, startingLane,
                                              endingLane)

            self._checkDataFormatWarnings(roleIndex, startingLane, endingLane)

            # If we succeeded in adding all images, show the first one.
            self.showDataset(startingLane, roleIndex)

        # Notify the workflow that we just added some new lanes.
        if adding_only:
            workflow = self.parentApplet.topLevelOperator.parent
            workflow.handleNewLanesAdded()

        # Notify the workflow that something that could affect applet readyness has occurred.
        self.parentApplet.appletStateUpdateRequested()

        self.updateInternalPathVisiblity()

    def _determineLaneRange(self, fileNames, roleIndex, startingLane=None):
        """
        Determine which lanes should be configured if the user wants to add the 
            given fileNames to the specified role, starting at startingLane.
        If startingLane is None, assume the user wants to APPEND the 
            files to the role's slots.
        """
        if startingLane is None or startingLane == -1:
            startingLane = len(self.topLevelOperator.DatasetGroup)
            endingLane = startingLane + len(fileNames) - 1
        else:
            assert startingLane < len(self.topLevelOperator.DatasetGroup)
            max_files = len(self.topLevelOperator.DatasetGroup) - \
                    startingLane
            if len(fileNames) > max_files:
                msg = "You selected {num_selected} files for {num_slots} "\
                      "slots. To add new files use the 'Add new...' option "\
                      "in the context menu or the button in the last row."\
                              .format(num_selected=len(fileNames),
                                      num_slots=max_files)
                QMessageBox.critical(self, "Too many files", msg)
                return (None, None)
            endingLane = min(startingLane + len(fileNames) - 1,
                             len(self.topLevelOperator.DatasetGroup))

        if self._max_lanes and endingLane >= self._max_lanes:
            msg = "You may not add more than {} file(s) to this workflow.  Please try again.".format(
                self._max_lanes)
            QMessageBox.critical(self, "Too many files", msg)
            return (None, None)

        return (startingLane, endingLane)

    def _createDatasetInfos(self, roleIndex, filePaths, rois):
        """
        Create a list of DatasetInfos for the given filePaths and rois
        rois may be None, in which case it is ignored.
        """
        if rois is None:
            rois = [None] * len(filePaths)
        assert len(rois) == len(filePaths)

        infos = []
        for filePath, roi in zip(filePaths, rois):
            info = self._createDatasetInfo(roleIndex, filePath, roi)
            infos.append(info)
        return infos

    def _createDatasetInfo(self, roleIndex, filePath, roi):
        """
        Create a DatasetInfo object for the given filePath and roi.
        roi may be None, in which case it is ignored.
        """
        cwd = self.topLevelOperator.WorkingDirectory.value
        datasetInfo = DatasetInfo(filePath, cwd=cwd)
        datasetInfo.subvolume_roi = roi  # (might be None)

        absPath, relPath = getPathVariants(filePath, cwd)

        # If the file is in a totally different tree from the cwd,
        # then leave the path as absolute.  Otherwise, override with the relative path.
        if relPath is not None and len(os.path.commonprefix([cwd, absPath
                                                             ])) > 1:
            datasetInfo.filePath = relPath

        h5Exts = ['.ilp', '.h5', '.hdf5']
        if os.path.splitext(datasetInfo.filePath)[1] in h5Exts:
            datasetNames = self.getPossibleInternalPaths(absPath)
            if len(datasetNames) == 0:
                raise RuntimeError("HDF5 file %s has no image datasets" %
                                   datasetInfo.filePath)
            elif len(datasetNames) == 1:
                datasetInfo.filePath += str(datasetNames[0])
            else:
                # If exactly one of the file's datasets matches a user's previous choice, use it.
                if roleIndex not in self._default_h5_volumes:
                    self._default_h5_volumes[roleIndex] = set()
                previous_selections = self._default_h5_volumes[roleIndex]
                possible_auto_selections = previous_selections.intersection(
                    datasetNames)
                if len(possible_auto_selections) == 1:
                    datasetInfo.filePath += str(
                        list(possible_auto_selections)[0])
                else:
                    # Ask the user which dataset to choose
                    dlg = H5VolumeSelectionDlg(datasetNames, self)
                    if dlg.exec_() == QDialog.Accepted:
                        selected_index = dlg.combo.currentIndex()
                        selected_dataset = str(datasetNames[selected_index])
                        datasetInfo.filePath += selected_dataset
                        self._default_h5_volumes[roleIndex].add(
                            selected_dataset)
                    else:
                        raise DataSelectionGui.UserCancelledError()

        # Allow labels by default if this gui isn't being used for batch data.
        datasetInfo.allowLabels = (self.guiMode == GuiMode.Normal)
        return datasetInfo

    def _configureOpWithInfos(self, roleIndex, startingLane, endingLane,
                              infos):
        """
        Attempt to configure the specified role and lanes of the 
        top-level operator with the given DatasetInfos.
        
        Returns True if all lanes were configured successfully, or False if something went wrong.
        """
        opTop = self.topLevelOperator
        originalSize = len(opTop.DatasetGroup)

        # Resize the slot if necessary
        if len(opTop.DatasetGroup) < endingLane + 1:
            opTop.DatasetGroup.resize(endingLane + 1)

        # Configure each subslot
        for laneIndex, info in zip(list(range(startingLane, endingLane + 1)),
                                   infos):
            try:
                self.topLevelOperator.DatasetGroup[laneIndex][
                    roleIndex].setValue(info)
            except DatasetConstraintError as ex:
                return_val = [False]
                # Give the user a chance to fix the problem
                self.handleDatasetConstraintError(info, info.filePath, ex,
                                                  roleIndex, laneIndex,
                                                  return_val)
                if return_val[0]:
                    # Successfully repaired graph.
                    continue
                else:
                    # Not successfully repaired.  Roll back the changes
                    opTop.DatasetGroup.resize(originalSize)
                    return False
            except OpDataSelection.InvalidDimensionalityError as ex:
                opTop.DatasetGroup.resize(originalSize)
                QMessageBox.critical(self,
                                     "Dataset has different dimensionality",
                                     ex.message)
                return False
            except Exception as ex:
                msg = "Wasn't able to load your dataset into the workflow.  See error log for details."
                log_exception(logger, msg)
                QMessageBox.critical(self, "Dataset Load Error", msg)
                opTop.DatasetGroup.resize(originalSize)
                return False

        return True

    def _reconfigureDatasetLocations(self, roleIndex, startingLane,
                                     endingLane):
        """
        Check the metadata for the given slots.  
        If the data is stored a format that is poorly optimized for 3D access, 
        then configure it to be copied to the project file.
        Finally, save the project if we changed something. 
        """
        save_needed = False
        opTop = self.topLevelOperator
        for lane_index in range(startingLane, endingLane + 1):
            output_slot = opTop.ImageGroup[lane_index][roleIndex]
            if output_slot.meta.prefer_2d and 'z' in output_slot.meta.axistags:
                shape = numpy.array(output_slot.meta.shape)
                total_volume = numpy.prod(shape)

                # Only copy to the project file if the total volume is reasonably small
                if total_volume < 0.5e9:
                    info_slot = opTop.DatasetGroup[lane_index][roleIndex]
                    info = info_slot.value
                    info.location = DatasetInfo.Location.ProjectInternal
                    info_slot.setValue(info, check_changed=False)
                    save_needed = True

        if save_needed:
            logger.info(
                "Some of your data cannot be accessed efficiently in 3D in its current format."
                "  It will now be copied to the project file.")
            opWorkflow = self.topLevelOperator.parent
            opWorkflow.shell.onSaveProjectActionTriggered()

    def _checkDataFormatWarnings(self, roleIndex, startingLane, endingLane):
        warn_needed = False
        opTop = self.topLevelOperator
        for lane_index in range(startingLane, endingLane + 1):
            output_slot = opTop.ImageGroup[lane_index][roleIndex]
            if output_slot.meta.inefficient_format:
                warn_needed = True

        if warn_needed:
            QMessageBox.warning(
                self, "Inefficient Data Format",
                "Your data cannot be accessed efficiently in its current format.  "
                "Check the console output for details.\n"
                "(For HDF5 files, be sure to enable chunking on your dataset.)"
            )

    @threadRouted
    def handleDatasetConstraintError(self,
                                     info,
                                     filename,
                                     ex,
                                     roleIndex,
                                     laneIndex,
                                     return_val=[False]):
        if ex.unfixable:
            msg = ("Can't use dataset:\n\n" + filename + "\n\n" +
                   "because it violates a constraint of the {} component.\n\n".
                   format(ex.appletName) + ex.message + "\n\n")

            QMessageBox.warning(self, "Can't use dataset", msg)
            return_val[0] = False
        else:
            assert isinstance(ex, DatasetConstraintError)
            accepted = True
            while isinstance(ex, DatasetConstraintError) and accepted:
                msg = (
                    f"Can't use given properties for dataset:\n\n{filename}\n\nbecause it violates a constraint of "
                    f"the {ex.appletName} component.\n\n{ex.message}\n\nIf possible, fix this problem by adjusting "
                    f"the applet settings and or the dataset properties in the next window(s)."
                )
                QMessageBox.warning(self, "Dataset Needs Correction", msg)
                for dlg in ex.fixing_dialogs:
                    dlg()

                accepted, ex = self.repairDatasetInfo(info, roleIndex,
                                                      laneIndex)

            # The success of this is 'returned' via our special out-param
            # (We can't return a value from this method because it is @threadRouted.
            return_val[0] = accepted and ex is None  # successfully repaired

    def repairDatasetInfo(self, info, roleIndex, laneIndex):
        """Open the dataset properties editor and return True if the new properties are acceptable."""
        defaultInfos = {}
        defaultInfos[laneIndex] = info
        editorDlg = DatasetInfoEditorWidget(
            self,
            self.topLevelOperator,
            roleIndex, [laneIndex],
            defaultInfos,
            show_axis_details=self.show_axis_details)
        dlg_state, ex = editorDlg.exec_()
        return (dlg_state == QDialog.Accepted), ex

    @classmethod
    def getPossibleInternalPaths(cls, absPath, min_ndim=2, max_ndim=5):
        datasetNames = []
        # Open the file as a read-only so we can get a list of the internal paths
        with h5py.File(absPath, 'r') as f:
            # Define a closure to collect all of the dataset names in the file.
            def accumulateDatasetPaths(name, val):
                if type(val) == h5py._hl.dataset.Dataset and min_ndim <= len(
                        val.shape) <= max_ndim:
                    datasetNames.append('/' + name)

            # Visit every group/dataset in the file
            f.visititems(accumulateDatasetPaths)
        return datasetNames

    def addStack(self, roleIndex, laneIndex):
        """
        The user clicked the "Import Stack Files" button.
        """
        stackDlg = StackFileSelectionWidget(self)
        stackDlg.exec_()
        if stackDlg.result() != QDialog.Accepted:
            return
        files = stackDlg.selectedFiles
        sequence_axis = stackDlg.sequence_axis
        if len(files) == 0:
            return

        cwd = self.topLevelOperator.WorkingDirectory.value
        info = DatasetInfo(os.path.pathsep.join(files), cwd=cwd)

        originalNumLanes = len(self.topLevelOperator.DatasetGroup)

        if laneIndex is None or laneIndex == -1:
            laneIndex = len(self.topLevelOperator.DatasetGroup)
        if len(self.topLevelOperator.DatasetGroup) < laneIndex + 1:
            self.topLevelOperator.DatasetGroup.resize(laneIndex + 1)

        def importStack():
            self.parentApplet.busy = True
            self.parentApplet.appletStateUpdateRequested()

            # Serializer will update the operator for us, which will propagate to the GUI.
            try:
                self.serializer.importStackAsLocalDataset(info, sequence_axis)
                try:
                    self.topLevelOperator.DatasetGroup[laneIndex][
                        roleIndex].setValue(info)
                except DatasetConstraintError as ex:
                    # Give the user a chance to repair the problem.
                    filename = files[0] + "\n...\n" + files[-1]
                    return_val = [False]
                    self.parentApplet.busy = False  # required for possible fixing dialogs from DatasetConstraintError
                    self.parentApplet.appletStateUpdateRequested()
                    self.handleDatasetConstraintError(info, filename, ex,
                                                      roleIndex, laneIndex,
                                                      return_val)
                    if not return_val[0]:
                        # Not successfully repaired.  Roll back the changes and give up.
                        self.topLevelOperator.DatasetGroup.resize(
                            originalNumLanes)
            finally:
                self.parentApplet.busy = False
                self.parentApplet.appletStateUpdateRequested()

        req = Request(importStack)
        req.notify_finished(
            lambda result: self.showDataset(laneIndex, roleIndex))
        req.notify_failed(
            partial(self.handleFailedStackLoad, files, originalNumLanes))
        req.submit()

    @threadRouted
    def handleFailedStackLoad(self, files, originalNumLanes, exc, exc_info):
        msg = "Failed to load stack due to the following error:\n{}".format(
            exc)
        msg += "\nAttempted stack files were:\n"
        msg += "\n".join(files)
        log_exception(logger, msg, exc_info)
        QMessageBox.critical(self, "Failed to load image stack", msg)
        self.topLevelOperator.DatasetGroup.resize(originalNumLanes)

    def handleClearDatasets(self, roleIndex, selectedRows):
        for row in selectedRows:
            self.topLevelOperator.DatasetGroup[row][roleIndex].disconnect()

        # Remove all operators that no longer have any connected slots
        laneIndexes = list(range(len(self.topLevelOperator.DatasetGroup)))
        for laneIndex, multislot in reversed(
                list(zip(laneIndexes, self.topLevelOperator.DatasetGroup))):
            any_ready = False
            for slot in multislot:
                any_ready |= slot.ready()
            if not any_ready:
                self.topLevelOperator.DatasetGroup.removeSlot(
                    laneIndex,
                    len(self.topLevelOperator.DatasetGroup) - 1)

        # Notify the workflow that something that could affect applet readyness has occurred.
        self.parentApplet.appletStateUpdateRequested()

    def editDatasetInfo(self, roleIndex, laneIndexes):
        editorDlg = DatasetInfoEditorWidget(
            self,
            self.topLevelOperator,
            roleIndex,
            laneIndexes,
            show_axis_details=self.show_axis_details)
        editorDlg.exec_()
        self.parentApplet.appletStateUpdateRequested()

    def updateInternalPathVisiblity(self):
        for view in self._detailViewerWidgets:
            model = view.model()
            view.setColumnHidden(DatasetDetailedInfoColumn.InternalID,
                                 not model.hasInternalPaths())

    def addPrecomputedVolume(self, roleIndex, laneIndex):
        # add history...
        history = []
        browser = PrecomputedVolumeBrowser(history=history, parent=self)

        if browser.exec_() == PrecomputedVolumeBrowser.Rejected:
            return

        precomputed_url = browser.selected_url
        self.addFileNames([precomputed_url], roleIndex, laneIndex)

    def addDvidVolume(self, roleIndex, laneIndex):
        recent_hosts_pref = PreferencesManager.Setting("DataSelection",
                                                       "Recent DVID Hosts")
        recent_hosts = recent_hosts_pref.get()
        if not recent_hosts:
            recent_hosts = ["localhost:8000"]
        recent_hosts = [
            h for h in recent_hosts if h
        ]  # There used to be a bug where empty strings could be saved. Filter those out.

        recent_nodes_pref = PreferencesManager.Setting("DataSelection",
                                                       "Recent DVID Nodes")
        recent_nodes = recent_nodes_pref.get() or {}

        from .dvidDataSelectionBrowser import DvidDataSelectionBrowser
        browser = DvidDataSelectionBrowser(recent_hosts,
                                           recent_nodes,
                                           parent=self)
        if browser.exec_() == DvidDataSelectionBrowser.Rejected:
            return

        if None in browser.get_selection():
            QMessageBox.critical("Couldn't use your selection.")
            return

        rois = None
        hostname, repo_uuid, volume_name, node_uuid, typename = browser.get_selection(
        )
        dvid_url = 'http://{hostname}/api/node/{node_uuid}/{volume_name}'.format(
            **locals())
        subvolume_roi = browser.get_subvolume_roi()

        # Relocate host to top of 'recent' list, and limit list to 10 items.
        try:
            i = recent_hosts.index(hostname)
            del recent_hosts[i]
        except ValueError:
            pass
        finally:
            recent_hosts.insert(0, hostname)
            recent_hosts = recent_hosts[:10]

        # Save pref
        recent_hosts_pref.set(recent_hosts)

        recent_nodes[hostname] = node_uuid
        recent_nodes_pref.set(recent_nodes)

        if subvolume_roi is None:
            self.addFileNames([dvid_url], roleIndex, laneIndex)
        else:
            start, stop = subvolume_roi
            self.addFileNames([dvid_url], roleIndex, laneIndex,
                              [(start, stop)])
class SimpleTictactoe(QDialog):
    """
    With this class simple tictactoe game-app is created.

    """
    def __init__(self):
        """
        constructor
        
        """
        super().__init__()
        self.title = "Simple Tictactoe"
        self.left, self.top, self.width, self.height = 50, 50, -1, -1
        self.initGUI()

    def initGUI(self):
        """
        initializes GUI

        :return: 
        """

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setWindowModality(Qt.ApplicationModal)
        self.addComponents()
        self.registerEvents()

    def addComponents(self):
        """
        sets the mainLayout for this class and adds components into it.
        :return: 
        """

        self.mainLayout = QVBoxLayout()
        # comboChooser
        self.widgetChooser = QWidget()
        self.layoutChooser = QHBoxLayout()
        self.widgetChooser.setLayout(self.layoutChooser)
        self.mainLayout.addWidget(self.widgetChooser)
        self.lblChooser = QLabel("Choose the tictactoe row x column: ")
        self.comboChooser = QComboBox()
        self.comboChooser.addItems(
            ["Tictactoe 3x3", "Tictactoe 5x5", "Tictactoe 7x7"])
        self.layoutChooser.addWidget(self.lblChooser)
        self.layoutChooser.addWidget(self.comboChooser)

        self.setLayout(self.mainLayout)
        self.tictactoe3 = TictactoeWidget()
        self.tictactoe5 = TictactoeWidget(5, 5)
        self.tictactoe7 = TictactoeWidget(7, 7)
        # self.tictactoe9 = TictactoeWidget(9, 9)
        # self.tictactoe11 = TictactoeWidget(11, 11)
        # self.tictactoe13 = TictactoeWidget(13, 13)

        #  stackedWidget
        self.stackedWidget = QStackedWidget()
        self.mainLayout.addWidget(self.stackedWidget)
        self.stackedWidget.addWidget(self.tictactoe3)
        self.stackedWidget.addWidget(self.tictactoe5)
        self.stackedWidget.addWidget(self.tictactoe7)
        # self.stackedWidget.addWidget(self.tictactoe9)
        # self.stackedWidget.addWidget(self.tictactoe11)
        # self.stackedWidget.addWidget(self.tictactoe13)

    def registerEvents(self):
        """
        registers events
        :return: 
        """
        self.comboChooser.currentIndexChanged.connect(
            self.onCurrentIndexChanged)

    @pyqtSlot()
    def onCurrentIndexChanged(self):
        """
        Slot for signal-slot handling .
        Gets invoked when in comboChooser currentIndexChanged event 
        is triggered.
        :return: 
        """
        currentIndex = self.sender().currentIndex()
        self.stackedWidget.setCurrentIndex(currentIndex)
 def createContent(self):
     self.content = QStackedWidget()
     self.content.setSizePolicy(
         QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))