Beispiel #1
0
    def __init__(self, monitor, *, parent=None):
        super().__init__(parent=parent)

        self._edges_removed = []
        self.monitor = monitor
        self.detector = monitor.detector

        self.monitor.update.connect(self._ports_updated)

        self.registry = qtpynodeeditor.DataModelRegistry()
        for ophyd_cls, model in data_model.models.items():
            self.registry.register_model(model, category='Area Detector')

        self.scene = qtpynodeeditor.FlowScene(
            registry=self.registry, allow_node_deletion=False,
            allow_node_creation=False)

        self._connected_by_user = {}
        self.scene.connection_created.connect(self._user_connected_nodes)
        self.scene.connection_deleted.connect(self._user_deleted_connection)

        self.view = qtpynodeeditor.FlowView(self.scene)
        self.view.setMinimumSize(400, 400)

        self.layout = QtWidgets.QVBoxLayout()
        self.dock = QtWidgets.QDockWidget()
        self.layout.addWidget(self.view)
        self.setLayout(self.layout)

        self._nodes = {}
        self._edges = set()
        self._auto_position = True
Beispiel #2
0
    def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags(0), **kwargs):
        super().__init__(parent, flags, **kwargs)

        #: main application datamodel (QStandardItemModel)
        self.datamodel = QtGui.QStandardItemModel(self)

        # @TODO: custom treeview with "currentChanged" slot re-implemented
        #: tree view for the main application data model
        self.treeview = QtWidgets.QTreeView()
        # @TODO
        # self.treeview.setSelectionMode(QtWidgets.QTreeView.SingleSelection)
        self.treeview.setModel(self.datamodel)
        self.treeview.setEditTriggers(
            QtWidgets.QAbstractItemView.NoEditTriggers)
        self.treeview.header().hide()

        self.treeview.clicked.connect(self.setActiveWinFromIndex)
        self.mdiarea.subWindowActivated.connect(self.setActiveIndexFromWin)
        self.datamodel.rowsAboutToBeRemoved.connect(self.onItemsClosed)

        # setup the treeview dock
        treeviewdock = QtWidgets.QDockWidget(self.tr('Data Browser'), self)
        treeviewdock.setWidget(self.treeview)
        treeviewdock.setObjectName('TreeViewPanel')
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, treeviewdock)
Beispiel #3
0
    def init_UI(self):
        self.file_dock = QtWidgets.QDockWidget(u'File List')
        self.file_dock.setObjectName(u'Files')
        self.file_dock.setStyleSheet(
            "QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif; }"
        )

        self.fileSearch = QtWidgets.QLineEdit()
        self.fileSearch.setPlaceholderText('Search Filename')
        self.fileSearch.textChanged.connect(self.fileSearchChanged)

        self.fileListWidget = QtWidgets.QListWidget()
        self.fileListWidget.itemClicked.connect(self.fileItemClicked)
        self.fileListWidget.itemSelectionChanged.connect(
            self.fileSelectionChanged)

        self.fileListLayout = QtWidgets.QVBoxLayout()
        self.fileListLayout.setContentsMargins(0, 0, 0, 0)
        self.fileListLayout.setSpacing(0)
        self.fileListLayout.addWidget(self.fileSearch)
        self.fileListLayout.addWidget(self.fileListWidget)

        fileListWidget = QtWidgets.QWidget()
        fileListWidget.setLayout(self.fileListLayout)

        self.file_dock.setWidget(fileListWidget)
Beispiel #4
0
    def create_console(self):
        # We could inherit QAction, and have it reroute when it triggers,
        # and then drop route when it finishes, however this will not catch
        # interactive dialogs and such.
        c = self._get_console_config()
        self.settings.set_default('console_completion_type', 'droplist')
        valid_completions = ConsoleWidget.gui_completion.values
        self.settings.set_enum_hint('console_completion_type',
                                    valid_completions)
        gui_completion = self.settings['console_completion_type']
        if gui_completion not in valid_completions:
            gui_completion = 'droplist'
        control = ConsoleWidget(config=c, gui_completion=gui_completion)
        control.executing.connect(self.on_console_executing)
        control.executed.connect(self.on_console_executed)

        # This is where we push variables to the console
        ex = self._get_console_exec()
        push = self._get_console_exports()
        control.ex(ex)
        control.push(push)

        self.console = control

        self._console_dock = QtWidgets.QDockWidget("Console")
        self._console_dock.setObjectName('console_widget')
        self._console_dock.setWidget(control)
        self.addDockWidget(Qt.BottomDockWidgetArea, self._console_dock)
    def add_widget(self, widget, floating=None):
        """
        Add the passed 'widget' to the main window. If the widget is not a
        QDockWidget, it will be wrapped into one. The QDockWidget is returned.
        The widget is also added to the window menu self.windowmenu, so that
        it's visibility can be toggled.

        The parameter 'floating' specifies whether the widget should be made
        floating. If None, the value of the setting 'default_widget_floating'
        is used.
        """
        if floating is None:
            floating = self.settings['default_widget_floating', bool]
        if isinstance(widget, QtWidgets.QDockWidget):
            d = widget
        else:
            d = QtWidgets.QDockWidget(self)
            d.setWidget(widget)
            d.setWindowTitle(widget.windowTitle())
        if not d.objectName():
            d.setObjectName(d.windowTitle())
        d.setAllowedAreas(Qt.RightDockWidgetArea | Qt.LeftDockWidgetArea)
        self.addDockWidget(Qt.RightDockWidgetArea, d)
        d.setFloating(floating)

        self.widgets.append(widget)

        # Insert widgets in Windows menu before separator (figures are after)
        self.windowmenu.insertAction(self.windowmenu_sep, d.toggleViewAction())
        return d
Beispiel #6
0
    def init_UI(self):
        self.inference_dock = QtWidgets.QDockWidget('Defect Inference Result')
        self.inference_dock.setObjectName('Flags')
        self.inference_dock.setStyleSheet("QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif;}")

        self.lb_result = QtWidgets.QLabel()
        self.lb_result.setAlignment(Qt.AlignCenter)
        self.lb_result.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored)
        self.lb_result.setAcceptDrops(True)
        self.lb_result.rotation = 0
        self.lb_result.rotate = False
        self.lb_result.resize(1040, 780)

        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidget(self.lb_result)

        self.lb_result_value = QtWidgets.QPlainTextEdit()
        self.lb_result_value.move(80, 20)
        self.lb_result_value.setMaximumSize(2000, 80)
        self.lb_result_value.setReadOnly(True)

        self.ResultListLayout = QtWidgets.QVBoxLayout()
        self.ResultListLayout.setContentsMargins(0, 0, 0, 0)
        self.ResultListLayout.setSpacing(0)
        self.ResultListLayout.addWidget(self.lb_result_value)
        self.ResultListLayout.addWidget(self.scrollArea)

        self.ReulstListWidget = QtWidgets.QWidget()
        self.ReulstListWidget.setLayout(self.ResultListLayout)

        self.inference_dock.setWidget(self.ReulstListWidget)
Beispiel #7
0
    def createHelpWindow(self):
        # http://www.walletfox.com/course/qhelpengineexample.php
        help_path = (Path(__file__).parent / 'TimeView.qhc').resolve()
        assert help_path.exists()
        help_engine = QtHelp.QHelpEngine(str(help_path))
        help_engine.setupData()

        tab_widget = QtWidgets.QTabWidget()
        tab_widget.setMaximumWidth(400)
        tab_widget.addTab(help_engine.contentWidget(), "Contents")
        tab_widget.addTab(help_engine.indexWidget(), "Index")

        text_viewer = HelpBrowser(help_engine)
        url = "qthelp://org.sphinx.timeview.1.0/doc/index.html"
        text_viewer.setSource(QtCore.QUrl(url))

        help_engine.contentWidget()\
                   .linkActivated['QUrl'].connect(text_viewer.setSource)
        help_engine.indexWidget()\
                   .linkActivated['QUrl', str].connect(text_viewer.setSource)

        horiz_splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
        horiz_splitter.insertWidget(0, tab_widget)
        horiz_splitter.insertWidget(1, text_viewer)

        help_window = QtWidgets.QDockWidget('Help', self)
        help_window.setWidget(horiz_splitter)
        help_window.hide()
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, help_window)
        return help_window
Beispiel #8
0
    def init_UI(self):
        self.defect_dock = QtWidgets.QDockWidget('Defect Crop Image')
        self.defect_dock.setObjectName('Defect Crop Image')
        self.defect_dock.setStyleSheet(
            "QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif;}"
        )

        self.defect = defect_info.Defect()
        self.defect_widget = DefectWindow(self.defect)
Beispiel #9
0
 def _toggleTool(self, ctrl: ToolController, action=None):
     if ctrl.name not in self.active_tools:
         dock = QtWidgets.QDockWidget(ctrl.item_config.title)
         content = ctrl.view
         dock.setWidget(content)
         self._setCloseAction(action, content, dock, ctrl.name)
         self.addDockWidget(ctrl.item_config.orientation, dock)
         self.active_tools[ctrl.name] = dock
     else:
         self.active_tools.pop(ctrl.name).close()
Beispiel #10
0
    def init_UI(self):
        self.uniqLabelList = EscapableQListWidget()
        self.property_dock = QtWidgets.QDockWidget(u'Source Image Properties')
        self.property_dock.setObjectName(u'Source Image Properties')
        self.property_dock.setStyleSheet(
            "QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif;}"
        )
        self.property_dock.setWidget(self.uniqLabelList)

        self.extract = extract_exif.Extract()
Beispiel #11
0
def create_dock(title, parent, stretch=True):
    """Create a dock widget and set it up accordingly."""
    dock = QtWidgets.QDockWidget(parent)
    dock.setWindowTitle(title)
    dock.setObjectName(title)
    titlebar = DockTitleBarWidget(dock, title, stretch=stretch)
    dock.setTitleBarWidget(titlebar)
    if hasattr(parent, 'dockwidgets'):
        parent.dockwidgets.append(dock)
    return dock
Beispiel #12
0
 def createDock(self, widget, dockName, dockTitle, widgetArea, isMova):
     # 停靠窗口2
     dock = QtWidgets.QDockWidget(dockTitle)
     dock.setWidget(widget)
     dock.setObjectName(dockName)
     if isMova:
         dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable
                          | QDockWidget.AllDockWidgetFeatures)
     else:
         dock.setFeatures(dock.DockWidgetFloatable)
     self.addDockWidget(widgetArea, dock)
Beispiel #13
0
 def addDock(self, widget, name):
     # add widget
     self.widgets.append(widget)
     # make an empty dock for widget
     self.docks.append(QtWidgets.QDockWidget(name))
     # add widget to dock
     self.docks[-1].setWidget(self.widgets[-1])
     # add dock to view
     self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.docks[-1])
     # set layout
     self.widgets[-1].setLayout(self.widgets[-1].getLayout())
Beispiel #14
0
def create_dock(title, parent, stretch=True, widget=None, fn=None):
    """Create a dock widget and set it up accordingly."""
    dock = QtWidgets.QDockWidget(parent)
    dock.setWindowTitle(title)
    dock.setObjectName(title)
    titlebar = DockTitleBarWidget(dock, title, stretch=stretch)
    dock.setTitleBarWidget(titlebar)
    dock.setAutoFillBackground(True)
    if hasattr(parent, 'dockwidgets'):
        parent.dockwidgets.append(dock)
    if fn:
        widget = fn(dock)
    if widget:
        dock.setWidget(widget)
    return dock
Beispiel #15
0
    def __init__(self, detector, *, parent=None):
        super().__init__(parent=parent)

        self._device_widgets = {}
        self._interface_ready = threading.Event()
        self.detector = detector
        self.setWindowTitle(f'adviewer - {self.detector.name}')

        self.monitor = PortGraphMonitor(detector, parent=self)
        self.chart = PortGraphFlowchart(self.monitor)
        self.tree = PortTreeWidget(self.monitor)
        self.info_label = QtWidgets.QLabel()
        self.loop = asyncio.get_event_loop()

        self.setCentralWidget(self.chart.view)

        self.tree_dock = QtWidgets.QDockWidget('Port &Tree')
        self.tree_dock.setWidget(self.tree)

        self.info_dock = QtWidgets.QDockWidget('Port &Info')
        self.info_dock.setWidget(self.info_label)

        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.tree_dock)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.info_dock)

        self.chart.scene.node_hovered.connect(self._user_node_hovered)
        self.chart.flowchart_updated.connect(self.tree.update)

        self.tree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.tree.customContextMenuRequested.connect(
            self._tree_context_menu)
        self.chart.scene.node_context_menu.connect(
            self._node_context_menu)

        self.tree.port_selected.connect(self._tree_port_selected)
        threading.Thread(target=self._startup).start()
Beispiel #16
0
 def setup_logger_window(self):
     # Put the logging console in the bottom region of the window
     self.logger_dock = QtWidgets.QDockWidget('Log')
     self.logger_dock.setObjectName('LoggerDockWidget')
     self.logger_dock.setFeatures(
         QtWidgets.QDockWidget.DockWidgetClosable
         | QtWidgets.QDockWidget.DockWidgetMovable
         | QtWidgets.QDockWidget.DockWidgetFloatable)
     self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.logger_dock)
     self.logger = logger.Logger(self)
     self.logger.setObjectName('LoggerWidget')
     self.logger_dock.setWidget(self.logger)
     # add self.logger as handler of main logger object
     vitables_logger = logging.getLogger('vitables')
     stream_handler = logging.StreamHandler(self.logger)
     stream_handler.setFormatter(logging.Formatter(_GUI_LOG_FORMAT))
     vitables_logger.addHandler(stream_handler)
Beispiel #17
0
def init(app):
    import logging

    from qtpy import QtCore, QtWidgets

    from exectools.qt import QtOutputPane, QtLoggingHandler

    panel = QtWidgets.QDockWidget('Output Log', app, objectName='outputPanel')
    # @TODO: try to add actions to a QTextEdit widget instead of using a
    #        custom widget
    logpane = QtOutputPane()
    panel.setWidget(logpane)

    app.addDockWidget(QtCore.Qt.BottomDockWidgetArea, panel)

    # setupLogger
    formatter = logging.Formatter('%(levelname)s: %(message)s')
    handler = QtLoggingHandler(logpane)
    handler.setFormatter(formatter)
    app.logger.addHandler(handler)

    # Connect signals
    logpane.paneHideRequest.connect(panel.hide)
Beispiel #18
0
    def addViewerController(self, viewer_ctrl):
        self._model.addViewerCtrl(viewer_ctrl)

        wrapper = QtWidgets.QDockWidget("{}: {}".format(
            viewer_ctrl.v_id, viewer_ctrl.getTitle()))
        wrapper.setWidget(viewer_ctrl.view)

        wrapper.setFocusPolicy(QtCore.Qt.ClickFocus)
        wrapper.focusInEvent = lambda x, v=viewer_ctrl.v_id, dock=wrapper: self._onViewerChanged(
            v, dock)
        wrapper.closeEvent = lambda evt, v=viewer_ctrl.v_id: self._onTabClosed(
            v)
        wrapper.setFeatures(QtWidgets.QDockWidget.DockWidgetVerticalTitleBar
                            | QtWidgets.QDockWidget.DockWidgetClosable
                            | QtWidgets.QDockWidget.DockWidgetFloatable
                            | QtWidgets.QDockWidget.DockWidgetMovable)
        wrapper.setMinimumSize(300, 300)

        self._view.addDockWidget(self._getDefaultDockArea(), wrapper)
        self._tabify(wrapper)

        self._model.addTab(viewer_ctrl.v_id, wrapper)
        self._onViewerAdded(viewer_ctrl)
        wrapper.setFocus()  # triggers _onViewerChanged
Beispiel #19
0
    def __init__(self, path = None):
        super(Viewer, self).__init__()
        self.setWindowTitle("pydiq - Python DICOM Viewer in Qt")
        self.file = None
        self._file_name = None

        self.high_hu = 2000
        self.low_hu = -1024
       
        # self.pix_label = TrackingLabel(self)
        self.pix_label = DicomWidget(self)

        # self.color_table = [QtWidgets.qRgb(i, i, i) for i in range(256)]

        scroll_area = QtWidgets.QScrollArea()
        scroll_area.setWidget(self.pix_label)

        # self.setCentralWidget(self.pix_label)
        self.setCentralWidget(scroll_area)

        self.series_dock = QtWidgets.QDockWidget("Series", self)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.series_dock)

        self.file_dock = QtWidgets.QDockWidget("Images", self)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.file_dock)

        self.file_list = QtWidgets.QListWidget()
        self.file_list.itemSelectionChanged.connect(self.on_file_item_change)
        self.file_dock.setWidget(self.file_list)

        self.series_list = QtWidgets.QListWidget()
        # self.studies_list.itemSelectionChanged.connect(self.on_study_item_change)
        self.series_dock.setWidget(self.series_list)

        self.hu_label = QtWidgets.QLabel("No image")
        self.c_label = QtWidgets.QLabel("")
        self.cw_label = QtWidgets.QLabel("")        
        self.x_label = QtWidgets.QLabel("")
        self.y_label = QtWidgets.QLabel("")
        self.z_label = QtWidgets.QLabel("")
        self.use_fractional_coordinates = True
        self.ij_label = QtWidgets.QLabel("")

        self._zoom_level = 1
        self.mouse_x = -1
        self.mouse_y = -1
       
        self.statusBar().addPermanentWidget(self.cw_label)
        self.statusBar().addPermanentWidget(self.ij_label)
        self.statusBar().addPermanentWidget(self.x_label)
        self.statusBar().addPermanentWidget(self.y_label)
        self.statusBar().addPermanentWidget(self.z_label)
        self.statusBar().addPermanentWidget(self.hu_label)

        self.data = np.ndarray((512, 512), np.int8)
        self.update_cw()

        if os.path.isfile(path):
            self.load_files([path])
        elif os.path.isdir(path):
            self.load_files(dicom_files_in_dir(path))
        self.build_menu()
Beispiel #20
0
 def setupUi(self, MainWindow):
     ## -- 主窗体设置 --
     MainWindow.setObjectName("MainWindow")
     MainWindow.setMinimumSize(QtCore.QSize(1366, 768))
     MainWindow.setWindowTitle(__APPNAME__)
     CentralWidget = QtWidgets.QWidget(MainWindow)
     CentralWidget.setObjectName("CentralWidget")
     MainWindow.setCentralWidget(CentralWidget)
     ## -----
     ## -- 工具栏 --
     toolBar = QtWidgets.QToolBar(self)
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                        QtWidgets.QSizePolicy.Minimum)
     sizePolicy.setHorizontalStretch(0)
     sizePolicy.setVerticalStretch(0)
     sizePolicy.setHeightForWidth(toolBar.sizePolicy().hasHeightForWidth())
     toolBar.setSizePolicy(sizePolicy)
     toolBar.setMinimumSize(QtCore.QSize(0, 33))
     toolBar.setMovable(True)
     toolBar.setAllowedAreas(QtCore.Qt.BottomToolBarArea
                             | QtCore.Qt.TopToolBarArea)
     toolBar.setObjectName("toolBar")
     self.toolBar = toolBar
     MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
     ## -----
     ## -- 状态栏 --
     self.statusbar = QtWidgets.QStatusBar(MainWindow)
     self.statusbar.setObjectName("statusbar")
     self.statusbar.setStyleSheet("QStatusBar::item {border: none;}")
     MainWindow.setStatusBar(self.statusbar)
     self.statusbar.addPermanentWidget(
         self.show_logo(osp.join(pjpath, "resource/Paddle.png")))
     ## -----
     ## -- 图形区域 --
     ImageRegion = QtWidgets.QHBoxLayout(CentralWidget)
     ImageRegion.setObjectName("ImageRegion")
     # 滑动区域
     self.scrollArea = QtWidgets.QScrollArea(CentralWidget)
     self.scrollArea.setWidgetResizable(True)
     self.scrollArea.setObjectName("scrollArea")
     ImageRegion.addWidget(self.scrollArea)
     # 图形显示
     self.scene = QtWidgets.QGraphicsScene()
     self.scene.addPixmap(QtGui.QPixmap())
     self.canvas = Canvas(self.scene, self)
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                        QtWidgets.QSizePolicy.Expanding)
     self.canvas.setSizePolicy(sizePolicy)
     self.canvas.setAlignment(QtCore.Qt.AlignCenter)
     self.canvas.setAutoFillBackground(False)
     self.canvas.setStyleSheet("background-color: White")
     self.canvas.setObjectName("canvas")
     self.scrollArea.setWidget(self.canvas)
     ## -----
     ## -- 工作区 --
     self.dockWorker = QtWidgets.QDockWidget(MainWindow)
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                        QtWidgets.QSizePolicy.Preferred)
     sizePolicy.setHorizontalStretch(0)
     sizePolicy.setVerticalStretch(0)
     sizePolicy.setHeightForWidth(
         self.dockWorker.sizePolicy().hasHeightForWidth())
     self.dockWorker.setSizePolicy(sizePolicy)
     self.dockWorker.setMinimumSize(QtCore.QSize(71, 42))
     self.dockWorker.setWindowTitle(" ")  # 避免拖出后显示“python”
     self.dockWorker.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable
                                 | QtWidgets.QDockWidget.DockWidgetMovable)
     self.dockWorker.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea
                                     | QtCore.Qt.RightDockWidgetArea)
     self.dockWorker.setObjectName("dockWorker")
     p_create_button = partial(self.create_button, CentralWidget)
     # 设置区设置
     DockRegion = QtWidgets.QWidget()
     DockRegion.setObjectName("DockRegion")
     horizontalLayout = QtWidgets.QHBoxLayout(DockRegion)
     horizontalLayout.setObjectName("horizontalLayout")
     SetRegion = QtWidgets.QVBoxLayout()
     SetRegion.setObjectName("SetRegion")
     # 模型加载
     ModelRegion = QtWidgets.QVBoxLayout()
     ModelRegion.setObjectName("ModelRegion")
     labShowSet = self.create_text(CentralWidget, "labShowSet", "模型选择")
     ModelRegion.addWidget(labShowSet)
     combo = QtWidgets.QComboBox(self)
     combo.addItems([m.__name__ for m in MODELS])
     self.comboModelSelect = combo
     ModelRegion.addWidget(self.comboModelSelect)
     # 网络参数
     self.btnParamsSelect = p_create_button(
         "btnParamsLoad", "加载网络参数", osp.join(pjpath, "resource/Model.png"),
         "Ctrl+D")
     ModelRegion.addWidget(self.btnParamsSelect)  # 模型选择
     SetRegion.addLayout(ModelRegion)
     SetRegion.setStretch(0, 1)
     # 数据列表
     # TODO: 数据列表加一个搜索功能
     listRegion = QtWidgets.QVBoxLayout()
     listRegion.setObjectName("listRegion")
     labFiles = self.create_text(CentralWidget, "labFiles", "数据列表")
     listRegion.addWidget(labFiles)
     self.listFiles = QtWidgets.QListWidget(CentralWidget)
     self.listFiles.setObjectName("listFiles")
     listRegion.addWidget(self.listFiles)
     # 标签列表
     labelListLab = self.create_text(CentralWidget, "labelListLab", "标签列表")
     listRegion.addWidget(labelListLab)
     # TODO: 改成 list widget
     self.labelListTable = QtWidgets.QTableWidget(CentralWidget)
     self.labelListTable.horizontalHeader().hide()
     # 铺满
     self.labelListTable.horizontalHeader().setSectionResizeMode(
         QtWidgets.QHeaderView.Stretch)
     self.labelListTable.verticalHeader().hide()
     self.labelListTable.setColumnWidth(0, 10)
     # self.labelListTable.setMinimumWidth()
     self.labelListTable.setObjectName("labelListTable")
     listRegion.addWidget(self.labelListTable)
     self.btnAddClass = p_create_button(
         "btnAddClass", "添加标签", osp.join(pjpath, "resource/Label.png"))
     listRegion.addWidget(self.btnAddClass)
     SetRegion.addLayout(listRegion)
     SetRegion.setStretch(1, 20)
     # 滑块设置
     # 分割阈值
     p_create_slider = partial(self.create_slider, CentralWidget)
     ShowSetRegion = QtWidgets.QVBoxLayout()
     ShowSetRegion.setObjectName("ShowSetRegion")
     self.sldThresh, SegShowRegion = p_create_slider(
         "sldThresh", "labThresh", "分割阈值:")
     ShowSetRegion.addLayout(SegShowRegion)
     ShowSetRegion.addWidget(self.sldThresh)
     # 透明度
     self.sldOpacity, MaskShowRegion = p_create_slider(
         "sldOpacity", "labOpacity", "标签透明度:")
     ShowSetRegion.addLayout(MaskShowRegion)
     ShowSetRegion.addWidget(self.sldOpacity)
     # 点大小
     self.sldClickRadius, PointShowRegion = p_create_slider(
         "sldClickRadius", "labClickRadius", "点击可视化半径:", 3, 10, 1)
     ShowSetRegion.addLayout(PointShowRegion)
     ShowSetRegion.addWidget(self.sldClickRadius)
     SetRegion.addLayout(ShowSetRegion)
     SetRegion.setStretch(2, 1)
     # 保存
     self.btnSave = p_create_button("btnSave", "保存",
                                    osp.join(pjpath, "resource/Save.png"),
                                    "Ctrl+S")
     SetRegion.addWidget(self.btnSave)
     SetRegion.setStretch(3, 1)
     # dock设置完成
     horizontalLayout.addLayout(SetRegion)
     self.dockWorker.setWidget(DockRegion)
     MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWorker)
     ## -----
     QtCore.QMetaObject.connectSlotsByName(MainWindow)
Beispiel #21
0
    def __init__(self, config=None, filename=None, output=None):
        # see labelme/config/default_config.yaml for valid configuration
        if config is None:
            config = get_config()
        self._config = config

        super(MainWindow, self).__init__()
        self.setWindowTitle(__appname__)

        # Whether we need to save or not.
        self.dirty = False

        self._noSelectionSlot = False

        # Main widgets and related state.
        self.labelDialog = LabelDialog(
            parent=self,
            labels=self._config['labels'],
            sort_labels=self._config['sort_labels'],
            show_text_field=self._config['show_label_text_field'],
        )

        self.labelList = LabelQListWidget()
        self.lastOpenDir = None

        self.labelList.itemActivated.connect(self.labelSelectionChanged)
        self.labelList.itemSelectionChanged.connect(self.labelSelectionChanged)
        self.labelList.itemDoubleClicked.connect(self.editLabel)
        # Connect to itemChanged to detect checkbox changes.
        self.labelList.itemChanged.connect(self.labelItemChanged)
        self.labelList.setDragDropMode(
            QtWidgets.QAbstractItemView.InternalMove)
        self.labelList.setParent(self)

        listLayout = QtWidgets.QVBoxLayout()
        listLayout.setContentsMargins(0, 0, 0, 0)
        self.editButton = QtWidgets.QToolButton()
        self.editButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        listLayout.addWidget(self.editButton)  # 0, Qt.AlignCenter)
        listLayout.addWidget(self.labelList)
        self.labelListContainer = QtWidgets.QWidget()
        self.labelListContainer.setLayout(listLayout)

        self.uniqLabelList = EscapableQListWidget()
        self.uniqLabelList.setToolTip(
            "Select label to start annotating for it. "
            "Press 'Esc' to deselect.")
        if self._config['labels']:
            self.uniqLabelList.addItems(self._config['labels'])
            self.uniqLabelList.sortItems()
        self.labelsdock = QtWidgets.QDockWidget(u'Label List', self)
        self.labelsdock.setObjectName(u'Label List')
        self.labelsdock.setWidget(self.uniqLabelList)

        self.dock = QtWidgets.QDockWidget('Polygon Labels', self)
        self.dock.setObjectName('Labels')
        self.dock.setWidget(self.labelListContainer)

        self.fileListWidget = QtWidgets.QListWidget()
        self.fileListWidget.itemSelectionChanged.connect(
            self.fileSelectionChanged)
        filelistLayout = QtWidgets.QVBoxLayout()
        filelistLayout.setContentsMargins(0, 0, 0, 0)
        filelistLayout.addWidget(self.fileListWidget)
        fileListContainer = QtWidgets.QWidget()
        fileListContainer.setLayout(filelistLayout)
        self.filedock = QtWidgets.QDockWidget(u'File List', self)
        self.filedock.setObjectName(u'Files')
        self.filedock.setWidget(fileListContainer)

        self.zoomWidget = ZoomWidget()
        self.colorDialog = ColorDialog(parent=self)

        self.canvas = self.labelList.canvas = Canvas()
        self.canvas.zoomRequest.connect(self.zoomRequest)

        scrollArea = QtWidgets.QScrollArea()
        scrollArea.setWidget(self.canvas)
        scrollArea.setWidgetResizable(True)
        self.scrollBars = {
            Qt.Vertical: scrollArea.verticalScrollBar(),
            Qt.Horizontal: scrollArea.horizontalScrollBar(),
        }
        self.canvas.scrollRequest.connect(self.scrollRequest)

        self.canvas.newShape.connect(self.newShape)
        self.canvas.shapeMoved.connect(self.setDirty)
        self.canvas.selectionChanged.connect(self.shapeSelectionChanged)
        self.canvas.drawingPolygon.connect(self.toggleDrawingSensitive)

        self.setCentralWidget(scrollArea)

        self.addDockWidget(Qt.RightDockWidgetArea, self.labelsdock)
        self.addDockWidget(Qt.RightDockWidgetArea, self.dock)
        self.addDockWidget(Qt.RightDockWidgetArea, self.filedock)
        self.filedock.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable)

        self.dockFeatures = (QtWidgets.QDockWidget.DockWidgetClosable
                             | QtWidgets.QDockWidget.DockWidgetFloatable)
        self.dock.setFeatures(self.dock.features() ^ self.dockFeatures)

        # Actions
        action = functools.partial(newAction, self)
        shortcuts = self._config['shortcuts']
        quit = action('&Quit', self.close, shortcuts['quit'], 'quit',
                      'Quit application')
        open_ = action('&Open', self.openFile, shortcuts['open'], 'open',
                       'Open image or label file')
        opendir = action('&Open Dir', self.openDirDialog,
                         shortcuts['open_dir'], 'open', u'Open Dir')
        openNextImg = action('&Next Image', self.openNextImg,
                             shortcuts['open_next'], 'next', u'Open Next')

        openPrevImg = action('&Prev Image', self.openPrevImg,
                             shortcuts['open_prev'], 'prev', u'Open Prev')
        save = action('&Save',
                      self.saveFile,
                      shortcuts['save'],
                      'save',
                      'Save labels to file',
                      enabled=False)
        saveAs = action('&Save As',
                        self.saveFileAs,
                        shortcuts['save_as'],
                        'save-as',
                        'Save labels to a different file',
                        enabled=False)
        close = action('&Close', self.closeFile, shortcuts['close'], 'close',
                       'Close current file')
        color1 = action('Polygon &Line Color', self.chooseColor1,
                        shortcuts['edit_line_color'], 'color_line',
                        'Choose polygon line color')
        color2 = action('Polygon &Fill Color', self.chooseColor2,
                        shortcuts['edit_fill_color'], 'color',
                        'Choose polygon fill color')

        createMode = action('Create\nPolygo&ns',
                            self.setCreateMode,
                            shortcuts['create_polygon'],
                            'objects',
                            'Start drawing polygons',
                            enabled=True)
        editMode = action('&Edit\nPolygons',
                          self.setEditMode,
                          shortcuts['edit_polygon'],
                          'edit',
                          'Move and edit polygons',
                          enabled=True)

        delete = action('Delete\nPolygon',
                        self.deleteSelectedShape,
                        shortcuts['delete_polygon'],
                        'cancel',
                        'Delete',
                        enabled=False)
        copy = action('&Duplicate\nPolygon',
                      self.copySelectedShape,
                      shortcuts['duplicate_polygon'],
                      'copy',
                      'Create a duplicate of the selected polygon',
                      enabled=False)
        undoLastPoint = action('Undo last point',
                               self.canvas.undoLastPoint,
                               shortcuts['undo_last_point'],
                               'undo',
                               'Undo last drawn point',
                               enabled=False)

        undo = action('Undo',
                      self.undoShapeEdit,
                      shortcuts['undo'],
                      'undo',
                      'Undo last add and edit of shape',
                      enabled=False)

        hideAll = action('&Hide\nPolygons',
                         functools.partial(self.togglePolygons, False),
                         icon='eye',
                         tip='Hide all polygons',
                         enabled=False)
        showAll = action('&Show\nPolygons',
                         functools.partial(self.togglePolygons, True),
                         icon='eye',
                         tip='Show all polygons',
                         enabled=False)

        help = action('&Tutorial',
                      self.tutorial,
                      icon='help',
                      tip='Show tutorial page')

        zoom = QtWidgets.QWidgetAction(self)
        zoom.setDefaultWidget(self.zoomWidget)
        self.zoomWidget.setWhatsThis(
            "Zoom in or out of the image. Also accessible with"
            " %s and %s from the canvas." %
            (fmtShortcut('%s,%s' %
                         (shortcuts['zoom_in'], shortcuts['zoom_out'])),
             fmtShortcut("Ctrl+Wheel")))
        self.zoomWidget.setEnabled(False)

        zoomIn = action('Zoom &In',
                        functools.partial(self.addZoom, 10),
                        shortcuts['zoom_in'],
                        'zoom-in',
                        'Increase zoom level',
                        enabled=False)
        zoomOut = action('&Zoom Out',
                         functools.partial(self.addZoom, -10),
                         shortcuts['zoom_out'],
                         'zoom-out',
                         'Decrease zoom level',
                         enabled=False)
        zoomOrg = action('&Original size',
                         functools.partial(self.setZoom, 100),
                         shortcuts['zoom_to_original'],
                         'zoom',
                         'Zoom to original size',
                         enabled=False)
        fitWindow = action('&Fit Window',
                           self.setFitWindow,
                           shortcuts['fit_window'],
                           'fit-window',
                           'Zoom follows window size',
                           checkable=True,
                           enabled=False)
        fitWidth = action('Fit &Width',
                          self.setFitWidth,
                          shortcuts['fit_width'],
                          'fit-width',
                          'Zoom follows window width',
                          checkable=True,
                          enabled=False)
        # Group zoom controls into a list for easier toggling.
        zoomActions = (self.zoomWidget, zoomIn, zoomOut, zoomOrg, fitWindow,
                       fitWidth)
        self.zoomMode = self.MANUAL_ZOOM
        self.scalers = {
            self.FIT_WINDOW:
            self.scaleFitWindow,
            self.FIT_WIDTH:
            self.scaleFitWidth,
            # Set to one to scale to 100% when loading files.
            self.MANUAL_ZOOM:
            lambda: 1,
        }

        edit = action('&Edit Label',
                      self.editLabel,
                      shortcuts['edit_label'],
                      'edit',
                      'Modify the label of the selected polygon',
                      enabled=False)
        self.editButton.setDefaultAction(edit)

        shapeLineColor = action(
            'Shape &Line Color',
            self.chshapeLineColor,
            icon='color-line',
            tip='Change the line color for this specific shape',
            enabled=False)
        shapeFillColor = action(
            'Shape &Fill Color',
            self.chshapeFillColor,
            icon='color',
            tip='Change the fill color for this specific shape',
            enabled=False)

        labels = self.dock.toggleViewAction()
        labels.setText('Show/Hide Label Panel')

        # Lavel list context menu.
        labelMenu = QtWidgets.QMenu()
        addActions(labelMenu, (edit, delete))
        self.labelList.setContextMenuPolicy(Qt.CustomContextMenu)
        self.labelList.customContextMenuRequested.connect(
            self.popLabelListMenu)

        # Store actions for further handling.
        self.actions = struct(
            save=save,
            saveAs=saveAs,
            open=open_,
            close=close,
            lineColor=color1,
            fillColor=color2,
            delete=delete,
            edit=edit,
            copy=copy,
            undoLastPoint=undoLastPoint,
            undo=undo,
            createMode=createMode,
            editMode=editMode,
            shapeLineColor=shapeLineColor,
            shapeFillColor=shapeFillColor,
            zoom=zoom,
            zoomIn=zoomIn,
            zoomOut=zoomOut,
            zoomOrg=zoomOrg,
            fitWindow=fitWindow,
            fitWidth=fitWidth,
            zoomActions=zoomActions,
            fileMenuActions=(open_, opendir, save, saveAs, close, quit),
            tool=(),
            editMenu=(edit, copy, delete, None, undo, undoLastPoint, None,
                      color1, color2),
            menu=(
                createMode,
                editMode,
                edit,
                copy,
                delete,
                shapeLineColor,
                shapeFillColor,
                undo,
                undoLastPoint,
            ),
            onLoadActive=(close, createMode, editMode),
            onShapesPresent=(saveAs, hideAll, showAll),
        )

        self.menus = struct(
            file=self.menu('&File'),
            edit=self.menu('&Edit'),
            view=self.menu('&View'),
            help=self.menu('&Help'),
            recentFiles=QtWidgets.QMenu('Open &Recent'),
            labelList=labelMenu,
        )

        addActions(self.menus.file, (open_, opendir, self.menus.recentFiles,
                                     save, saveAs, close, None, quit))
        addActions(self.menus.help, (help, ))
        addActions(self.menus.view,
                   (labels, None, hideAll, showAll, None, zoomIn, zoomOut,
                    zoomOrg, None, fitWindow, fitWidth))

        self.menus.file.aboutToShow.connect(self.updateFileMenu)

        # Custom context menu for the canvas widget:
        addActions(self.canvas.menus[0], self.actions.menu)
        addActions(self.canvas.menus[1],
                   (action('&Copy here', self.copyShape),
                    action('&Move here', self.moveShape)))

        self.tools = self.toolbar('Tools')
        self.actions.tool = (open_, opendir, openNextImg, openPrevImg, save,
                             None, createMode, copy, delete, editMode, undo,
                             None, zoomIn, zoom, zoomOut, fitWindow, fitWidth)

        self.statusBar().showMessage('%s started.' % __appname__)
        self.statusBar().show()

        # Application state.
        self.image = QtGui.QImage()
        self.imagePath = None
        if self._config['auto_save'] and output is not None:
            warnings.warn('If `auto_save` argument is True, `output` argument '
                          'is ignored and output filename is automatically '
                          'set as IMAGE_BASENAME.json.')
        self.labeling_once = output is not None
        self.output = output
        self.recentFiles = []
        self.maxRecent = 7
        self.lineColor = None
        self.fillColor = None
        self.otherData = None
        self.zoom_level = 100
        self.fit_window = False

        if filename is not None and os.path.isdir(filename):
            self.importDirImages(filename, load=False)
        else:
            self.filename = filename

        # XXX: Could be completely declarative.
        # Restore application settings.
        self.settings = QtCore.QSettings('labelme', 'labelme')
        # FIXME: QSettings.value can return None on PyQt4
        self.recentFiles = self.settings.value('recentFiles', []) or []
        size = self.settings.value('window/size', QtCore.QSize(600, 500))
        position = self.settings.value('window/position', QtCore.QPoint(0, 0))
        self.resize(size)
        self.move(position)
        # or simply:
        # self.restoreGeometry(settings['window/geometry']
        self.restoreState(
            self.settings.value('window/state', QtCore.QByteArray()))
        self.lineColor = QtGui.QColor(
            self.settings.value('line/color', Shape.line_color))
        self.fillColor = QtGui.QColor(
            self.settings.value('fill/color', Shape.fill_color))
        Shape.line_color = self.lineColor
        Shape.fill_color = self.fillColor

        # Populate the File menu dynamically.
        self.updateFileMenu()
        # Since loading the file may take some time,
        # make sure it runs in the background.
        if self.filename is not None:
            self.queueEvent(functools.partial(self.loadFile, self.filename))

        # Callbacks:
        self.zoomWidget.valueChanged.connect(self.paintCanvas)

        self.populateModeActions()
Beispiel #22
0
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)
        self.setWindowTitle(self.tr("GraphViz"))
        self.setWindowIcon(QtGui.QIcon("GraphViz.ico"))
        self.toolbar = self.addToolBar("tool")
        self.toolwidget = ToolWidget()
        self.toolwidget.graphsignal.connect(self.startWork)
        self.toolwidget.graphsignal2.connect(self.startWork2)
        self.toolbar.addWidget(self.toolwidget)

        mwidget = QtWidgets.QWidget()
        self.vbl = QtWidgets.QVBoxLayout(mwidget)
        self.vbl.setSpacing(0)
        self.vbl.setContentsMargins(0, 0, 0, 0)
        self.stackwidget = QtWidgets.QStackedWidget()
        self.controlWidget = ControlWidget()
        self.controlWidget.resetBtn.clicked.connect(self.resetFilter)
        self.controlWidget.applyBtn.clicked.connect(self.applyFilter)
        self.process = GraphProcessBar()
        self.process.setVisible(False)
        self.vbl.addWidget(self.stackwidget)
        self.vbl.addWidget(self.controlWidget)
        self.vbl.addWidget(self.process)

        self.centralWidget = GraphHigh()
        self.centralWidget.draw_init()
        self.centralWidget.neighbors_signal.connect(self.setNeighbors)
        self.stackwidget.addWidget(QtWidgets.QWidget())
        self.stackwidget.addWidget(self.centralWidget)
        self.setCentralWidget(mwidget)
        self.stackwidget.setCurrentIndex(0)

        self.dockGraph = QtWidgets.QDockWidget(self.tr("Node attributes"),
                                               self)
        self.dockGraph.setFixedWidth(350)
        self.dockGraph.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable
                                   | QtWidgets.QDockWidget.DockWidgetMovable)
        self.dockGraph.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea
                                       | QtCore.Qt.RightDockWidgetArea)

        widget = QtWidgets.QWidget()
        vbl = QtWidgets.QVBoxLayout(widget)
        vbl.setSpacing(0)
        vbl.setContentsMargins(0, 0, 0, 0)
        self.textInfo = QtWidgets.QTextEdit()
        self.textInfo.setReadOnly(True)
        self.graphNodesWidget = InfoTableWidget()
        self.graphNodesWidget.dbclickedSig.connect(
            self.centralWidget.updateMarkerVisible)
        vbl.addWidget(self.textInfo)
        vbl.addWidget(self.graphNodesWidget)

        self.dockGraph.setWidget(widget)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dockGraph)

        self.dockGraph.hide()
        self.controlWidget.hide()

        self.work = GraphWork()
        self.nodesAttrs = [
            "label",
            "node_type",
            "InDegree",
            "OutDegree",
            "Degree",
            "Betweeness",
            "Closeness",
            "PageRank",
            "Louvain",
            "Label propagation",
            "Union find",
        ]
Beispiel #23
0
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("pyMonteCarlo")
        self.setWindowIcon(load_pixmap("logo_32x32.png"))

        # Variables
        self._should_save = False

        self._settings = Settings.read()

        max_workers = multiprocessing.cpu_count() - 1
        self._runner = LocalSimulationRunner(max_workers=max_workers)

        # Actions
        self.action_new_project = QtWidgets.QAction("New project")
        self.action_new_project.setIcon(QtGui.QIcon.fromTheme("document-new"))
        self.action_new_project.setShortcut(QtGui.QKeySequence.New)
        self.action_new_project.triggered.connect(self.newProject)

        self.action_open_project = QtWidgets.QAction("Open project")
        self.action_open_project.setIcon(
            QtGui.QIcon.fromTheme("document-open"))
        self.action_open_project.setShortcut(QtGui.QKeySequence.Open)
        self.action_open_project.triggered.connect(
            functools.partial(self.openProject, None))

        self.action_save_project = QtWidgets.QAction("Save project")
        self.action_save_project.setIcon(
            QtGui.QIcon.fromTheme("document-save"))
        self.action_save_project.setShortcut(QtGui.QKeySequence.Save)
        self.action_save_project.triggered.connect(
            functools.partial(self.saveProject, None))

        self.action_settings = QtWidgets.QAction("Settings")
        self.action_settings.setIcon(
            QtGui.QIcon.fromTheme("preferences-system"))
        self.action_settings.setShortcut(QtGui.QKeySequence.Preferences)
        self.action_settings.triggered.connect(self._on_settings)

        self.action_quit = QtWidgets.QAction("Quit")
        self.action_quit.setShortcut(QtGui.QKeySequence.Quit)
        self.action_quit.triggered.connect(self.close)

        self.action_create_simulations = QtWidgets.QAction(
            "Create new simulations")
        self.action_create_simulations.setIcon(load_icon("newsimulation.svg"))
        self.action_create_simulations.triggered.connect(
            self._on_create_new_simulations)

        self.action_stop_simulations = QtWidgets.QAction(
            "Stop all simulations")
        self.action_stop_simulations.setIcon(
            QtGui.QIcon.fromTheme("media-playback-stop"))
        self.action_stop_simulations.triggered.connect(self._on_stop)
        self.action_stop_simulations.setEnabled(False)

        # Timers
        self.timer_runner = QtCore.QTimer()
        self.timer_runner.setInterval(1000)
        self.timer_runner.setSingleShot(False)

        # Menus
        menu = self.menuBar()
        menu_file = menu.addMenu("File")
        menu_file.addAction(self.action_new_project)
        menu_file.addAction(self.action_open_project)
        menu_file.addAction(self.action_save_project)
        menu_file.addSeparator()
        menu_file.addAction(self.action_settings)
        menu_file.addSeparator()
        menu_file.addAction(self.action_quit)

        menu_simulation = menu.addMenu("Simulation")
        menu_simulation.addAction(self.action_create_simulations)
        menu_simulation.addAction(self.action_stop_simulations)

        # Tool bar
        toolbar_file = self.addToolBar("File")
        toolbar_file.addAction(self.action_new_project)
        toolbar_file.addAction(self.action_open_project)
        toolbar_file.addAction(self.action_save_project)

        toolbar_simulation = self.addToolBar("Simulation")
        toolbar_simulation.addAction(self.action_create_simulations)
        toolbar_simulation.addAction(self.action_stop_simulations)

        # Status bar
        self.statusbar_submitted = QtWidgets.QLabel()
        self.statusbar_submitted.setFrameStyle(QtWidgets.QFrame.Panel
                                               | QtWidgets.QFrame.Sunken)

        self.statusbar_done = QtWidgets.QLabel()
        self.statusbar_done.setFrameStyle(QtWidgets.QFrame.Panel
                                          | QtWidgets.QFrame.Sunken)

        self.statusbar_progressbar = QtWidgets.QProgressBar()
        self.statusbar_progressbar.setRange(0, 100)

        statusbar = self.statusBar()
        statusbar.addPermanentWidget(self.statusbar_submitted)
        statusbar.addPermanentWidget(self.statusbar_done)
        statusbar.addPermanentWidget(self.statusbar_progressbar)

        # Widgets
        self.tree = FieldTree()

        self.dock_project = QtWidgets.QDockWidget("Project")
        self.dock_project.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea
                                          | QtCore.Qt.RightDockWidgetArea)
        self.dock_project.setFeatures(
            QtWidgets.QDockWidget.NoDockWidgetFeatures
            | QtWidgets.QDockWidget.DockWidgetMovable)
        self.dock_project.setWidget(self.tree)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dock_project)

        self.table_runner = TokenTableWidget(self._runner.token)

        self.dock_runner = QtWidgets.QDockWidget("Run")
        self.dock_runner.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea
                                         | QtCore.Qt.RightDockWidgetArea)
        self.dock_runner.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures
                                     | QtWidgets.QDockWidget.DockWidgetMovable)
        self.dock_runner.setWidget(self.table_runner)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dock_runner)

        self.tabifyDockWidget(self.dock_project, self.dock_runner)
        self.dock_project.raise_()

        self.mdiarea = FieldMdiArea()

        self.setCentralWidget(self.mdiarea)

        # Dialogs
        self.wizard_simulation = NewSimulationWizard(self._settings)

        self.dialog_settings = SettingsDialog()

        # Signals
        self.tree.doubleClicked.connect(self._on_tree_double_clicked)

        self.mdiarea.windowOpened.connect(self._on_mdiarea_window_opened)
        self.mdiarea.windowClosed.connect(self._on_mdiarea_window_closed)

        self.timer_runner.timeout.connect(self._on_timer_runner_timeout)

        self.newSimulations.connect(self._on_new_simulations)

        # Start
        logger.debug("Before new project action")
        self.action_new_project.trigger()  # Required to setup project
        self.timer_runner.start()
Beispiel #24
0
            self.toggle_animation.animationCount() - 1
        )
        content_animation.setDuration(200)
        content_animation.setStartValue(0)
        content_animation.setEndValue(content_height)


if __name__ == "__main__":
    import sys
    import random

    app = QtWidgets.QApplication(sys.argv)

    w = QtWidgets.QMainWindow()
    w.setCentralWidget(QtWidgets.QWidget())
    dock = QtWidgets.QDockWidget("Collapsible Demo")
    w.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dock)
    scroll = QtWidgets.QScrollArea()
    dock.setWidget(scroll)
    content = QtWidgets.QWidget()
    scroll.setWidget(content)
    scroll.setWidgetResizable(True)
    vlay = QtWidgets.QVBoxLayout(content)
    for i in range(10):
        box = CollapsibleBox("Collapsible Box Header-{}".format(i))
        vlay.addWidget(box)
        lay = QtWidgets.QVBoxLayout()
        for j in range(8):
            label = QtWidgets.QLineEdit("{}".format(j))
            color = QtGui.QColor(*[random.randint(0, 255) for _ in range(3)])
            label.setStyleSheet(
Beispiel #25
0
def main():
    """Execute QDarkStyle example."""
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument(
        '--palette',
        default='dark',
        type=str,
        choices=['dark', 'light', 'none'],
        help=
        "Palette to display. Using 'none' there is no style sheet applied, OS like."
    )
    parser.add_argument(
        '--qt_from',
        default='qtpy',
        type=str,
        choices=[
            'pyqt5', 'pyqt', 'pyside2', 'pyside', 'qtpy', 'pyqtgraph', 'qt.py'
        ],
        help=
        "Choose which binding and/or abstraction is to be used to run the example. Default is 'qtpy'"
    )
    parser.add_argument('--test',
                        action='store_true',
                        help="Auto close window after 2s.")
    parser.add_argument('--screenshots',
                        action='store_true',
                        help="Generate screenshots on images folder.")
    parser.add_argument(
        '--offscreen',
        action='store_true',
        help="Do not try to show the screen (running on server).")
    parser.add_argument('--reset',
                        action='store_true',
                        help="Reset GUI settings (position, size) then opens.")

    # Parsing arguments from command line
    args = parser.parse_args()

    # To avoid problems when testing without screen
    if args.test or args.offscreen:
        os.environ['QT_QPA_PLATFORM'] = 'offscreen'

    # Set QT_API variable before importing QtPy
    if args.qt_from in ['pyqt', 'pyqt5', 'pyside', 'pyside2']:
        os.environ['QT_API'] = args.qt_from
    elif args.qt_from == 'pyqtgraph':
        os.environ['QT_API'] = os.environ['PYQTGRAPH_QT_LIB']
    elif args.qt_from in ['qt.py', 'qt']:
        try:
            import Qt
        except ImportError:
            print('Could not import Qt (Qt.Py)')
        else:
            os.environ['QT_API'] = Qt.__binding__

    # QtPy imports
    from qtpy import API_NAME, QT_VERSION, PYQT_VERSION, PYSIDE_VERSION, uic
    from qtpy import __version__ as QTPY_VERSION
    from qtpy import QtCore, QtGui, QtWidgets

    # Set API_VERSION variable
    API_VERSION = ''

    if PYQT_VERSION:
        API_VERSION = PYQT_VERSION
    elif PYSIDE_VERSION:
        API_VERSION = PYSIDE_VERSION
    else:
        API_VERSION = 'Not found'

    # create the application
    app = QtWidgets.QApplication(sys.argv)
    app.setOrganizationName('QDarkStyle')
    app.setApplicationName('QDarkStyle Example')

    style = ''

    if args.palette == 'dark':
        style = qdarkstyle.load_stylesheet(palette=DarkPalette)
    elif args.palette == 'light':
        style = qdarkstyle.load_stylesheet(palette=LightPalette)

    app.setStyleSheet(style)

    # create main window
    window = QtWidgets.QMainWindow()
    window.setObjectName('mainwindow')
    uic.loadUi(os.path.join(here, 'ui/mw_menus.ui'), window)

    title = (
        "QDarkStyle Example - (" + f"QDarkStyle=v{qdarkstyle.__version__}, " +
        f"QtPy=v{QTPY_VERSION}, " + f"{API_NAME}=v{API_VERSION}, " +
        f"Qt=v{QT_VERSION}, " + f"Python=v{platform.python_version()}, "
        # Operating system info are maybe too much,
        # but different OS add info in different places
        + f"System={platform.system()}, " + f"Release={platform.release()}, " +
        f"Version={platform.version()}, " + f"Platform={platform.platform()}" +
        ")")

    _logger.info(title)
    window.setWindowTitle(title)

    # Create docks for buttons
    dw_buttons = QtWidgets.QDockWidget()
    dw_buttons.setObjectName('buttons')
    uic.loadUi(os.path.join(here, 'ui/dw_buttons.ui'), dw_buttons)
    window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_buttons)

    # Set state indeterminate (value=1)
    dw_buttons.checkBoxTristate.stateChanged.connect(
        dw_buttons.checkBoxTristateDis.setCheckState)
    dw_buttons.checkBoxTristate.setCheckState(1)

    # Add actions on popup toolbuttons
    menu = QtWidgets.QMenu()

    for action in ['Action A', 'Action B', 'Action C']:
        menu.addAction(action)

    # Add menu in special tool buttons
    dw_buttons.toolButtonDelayedPopup.setMenu(menu)
    dw_buttons.toolButtonInstantPopup.setMenu(menu)
    dw_buttons.toolButtonMenuButtonPopup.setMenu(menu)

    # Add menu in toolbar #251
    action_menu = QtWidgets.QAction(u'Menu action', window.toolBarMenus)
    action_menu.setMenu(menu)
    window.toolBarMenus.addAction(action_menu)

    # Add color to tab title text #212
    window.tabWidget.tabBar().setTabTextColor(3, QtGui.QColor('red'))

    # Connect dialogs to buttons
    window.toolButtonColorDialog.clicked.connect(
        lambda: QtWidgets.QColorDialog().exec())
    window.toolButtonFileDialog.clicked.connect(
        lambda: QtWidgets.QFileDialog().exec())
    window.toolButtonFileDialogStatic.clicked.connect(
        lambda: QtWidgets.QFileDialog.getOpenFileNames())
    window.toolButtonFontDialog.clicked.connect(
        lambda: QtWidgets.QFontDialog().exec())
    window.toolButtonInputDialog.clicked.connect(
        lambda: QtWidgets.QInputDialog().exec())
    window.toolButtonMessageBox.clicked.connect(
        lambda: QtWidgets.QMessageBox().exec())
    window.toolButtonMessageBoxStatic.clicked.connect(
        lambda: QtWidgets.QMessageBox.critical(window, "Critical title",
                                               "Critical message"))
    window.toolButtonProgressDialog.clicked.connect(
        lambda: QtWidgets.QProgressDialog().exec())

    # Create docks for buttons
    dw_displays = QtWidgets.QDockWidget()
    dw_displays.setObjectName('displays')
    uic.loadUi(os.path.join(here, 'ui/dw_displays.ui'), dw_displays)
    window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_displays)

    # Create docks for inputs - no fields
    dw_inputs_no_fields = QtWidgets.QDockWidget()
    dw_inputs_no_fields.setObjectName('inputs_no_fields')
    uic.loadUi(os.path.join(here, 'ui/dw_inputs_no_fields.ui'),
               dw_inputs_no_fields)
    window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_inputs_no_fields)

    # Create docks for inputs - fields
    dw_inputs_fields = QtWidgets.QDockWidget()
    dw_inputs_fields.setObjectName('inputs_fields')
    uic.loadUi(os.path.join(here, 'ui/dw_inputs_fields.ui'), dw_inputs_fields)
    window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_inputs_fields)

    # Create docks for widgets
    dw_widgets = QtWidgets.QDockWidget()
    dw_widgets.setObjectName('widgets')
    uic.loadUi(os.path.join(here, 'ui/dw_widgets.ui'), dw_widgets)
    window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_widgets)

    # Create docks for views
    dw_views = QtWidgets.QDockWidget()
    dw_views.setObjectName('views')
    uic.loadUi(os.path.join(here, 'ui/dw_views.ui'), dw_views)
    window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_views)

    # Create docks for containers - no tabs
    dw_containers_no_tabs = QtWidgets.QDockWidget()
    dw_containers_no_tabs.setObjectName('containers_no_tabs')
    uic.loadUi(os.path.join(here, 'ui/dw_containers_no_tabs.ui'),
               dw_containers_no_tabs)
    window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_containers_no_tabs)

    # Create docks for containters - tabs
    dw_containers_tabs = QtWidgets.QDockWidget()
    dw_containers_tabs.setObjectName('containers_tabs')
    uic.loadUi(os.path.join(here, 'ui/dw_containers_tabs.ui'),
               dw_containers_tabs)
    window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_containers_tabs)

    # Tabify right docks
    window.tabifyDockWidget(dw_buttons, dw_displays)
    window.tabifyDockWidget(dw_displays, dw_inputs_fields)
    window.tabifyDockWidget(dw_inputs_fields, dw_inputs_no_fields)

    # Tabify left docks
    window.tabifyDockWidget(dw_containers_no_tabs, dw_containers_tabs)
    window.tabifyDockWidget(dw_containers_tabs, dw_widgets)
    window.tabifyDockWidget(dw_widgets, dw_views)

    # Issues #9120, #9121 on Spyder
    qstatusbar = QtWidgets.QStatusBar()
    qstatusbar.addWidget(
        QtWidgets.QLabel(
            'Issue Spyder #9120, #9121 - background not matching.'))
    qstatusbar.addWidget(QtWidgets.QPushButton('OK'))

    # Add info also in status bar for screenshots get it
    qstatusbar.addWidget(QtWidgets.QLabel('INFO: ' + title))
    window.setStatusBar(qstatusbar)

    # Todo: add report info and other info in HELP graphical

    # Auto quit after 2s when in test mode
    if args.test:
        QtCore.QTimer.singleShot(2000, app.exit)

    # Save screenshots for different displays and quit
    if args.screenshots:
        window.showFullScreen()
        create_screenshots(app, window, args)
    # Do not read settings when taking screenshots - like reset
    else:
        _read_settings(window, args.reset, QtCore.QSettings)
        window.showMaximized()

    app.exec_()
    _write_settings(window, QtCore.QSettings)
Beispiel #26
0
    def init_UI(self):
        self.classes = self.get_classes()

        self.crop_image_viewer = QtWidgets.QLabel()
        self.crop_image_viewer.setAlignment(Qt.AlignCenter)
        self.crop_image_viewer.setSizePolicy(QtWidgets.QSizePolicy.Ignored,
                                             QtWidgets.QSizePolicy.Ignored)
        self.crop_image_viewer.setAcceptDrops(True)
        self.crop_image_viewer.rotation = 0
        self.crop_image_viewer.rotate = False

        self.crop_image_scrollArea = QtWidgets.QScrollArea()
        self.crop_image_scrollArea.setWidget(self.crop_image_viewer)
        self.crop_image_scrollArea.setAlignment(Qt.AlignCenter)

        self.crop_image_list = QtWidgets.QListWidget()
        self.crop_image_list.setMaximumHeight(60)
        self.crop_image_list.itemClicked.connect(self.select_crop_image)

        self.catListLabel = QtWidgets.QLabel()
        self.catListLabel.setText("Labels")
        self.catListWidget = QtWidgets.QComboBox()
        for cls in self.classes:
            self.catListWidget.addItem(cls)

        self.catListLayout = QtWidgets.QHBoxLayout()
        self.catListLayout.addWidget(self.catListLabel, 20)
        self.catListLayout.addWidget(self.catListWidget, 80)
        self.catWidget = QtWidgets.QWidget()
        self.catWidget.setLayout(self.catListLayout)

        self.catLineEditLabel = QtWidgets.QLabel()
        self.catLineEditLabel.setText("Input label")
        self.catLineEditWidget = QtWidgets.QLineEdit()
        self.catLineEditLayout = QtWidgets.QHBoxLayout()
        self.catLineEditLayout.addWidget(self.catLineEditLabel, 20)
        self.catLineEditLayout.addWidget(self.catLineEditWidget, 80)
        self.catEditWidget = QtWidgets.QWidget()
        self.catEditWidget.setLayout(self.catLineEditLayout)

        self.catAddButton = QtWidgets.QPushButton()
        self.catAddButton.setText("add")
        self.catAddButton.clicked.connect(self.add_cless)
        self.catDeleteButton = QtWidgets.QPushButton()
        self.catDeleteButton.setText("delete")
        self.catDeleteButton.clicked.connect(self.delete_class)
        self.catSelectButton = QtWidgets.QPushButton()
        self.catSelectButton.setText("save")
        self.catSelectButton.clicked.connect(self.category_save)

        # layout
        self.buttonLayout = QtWidgets.QHBoxLayout()
        self.buttonLayout.addWidget(self.catAddButton)
        self.buttonLayout.addWidget(self.catDeleteButton)
        self.buttonLayout.addWidget(self.catSelectButton)
        self.buttonWidget = QtWidgets.QWidget()
        self.buttonWidget.setLayout(self.buttonLayout)
        self.catLayout = QtWidgets.QVBoxLayout()
        self.catLayout.setAlignment(Qt.AlignRight)
        self.catLayout.addWidget(self.crop_image_scrollArea)
        self.catLayout.addWidget(self.crop_image_list)
        self.catLayout.addWidget(self.catWidget)
        self.catLayout.addWidget(self.catEditWidget)
        self.catLayout.addWidget(self.buttonWidget)
        self.baseWidget = QtWidgets.QWidget()
        self.baseWidget.setLayout(self.catLayout)

        self.category_dock = QtWidgets.QDockWidget('Category selection')
        self.category_dock.setObjectName('category_selection')
        self.category_dock.setWidget(self.baseWidget)
        self.category_dock.setMaximumHeight(360)
Beispiel #27
0
    def __init__(self, path = None):
        # Base window options.
        super(Viewer, self).__init__()
        self.setWindowTitle("SlicerVR - CAPS")
        self.setWindowIcon(QtGui.QIcon('icon.png'))
        self.resize(900, 600)
        self.file = None
        self._file_name = None

        # Pipeline-specific "constants" (defaults manipulated through options pane).
        self.HEIGHT_IN_PIXELS = 1024
        self.WIDTH_IN_PIXELS = 1024
        self.IMAGE_ROWS = 8
        self.IMAGE_COLS = 8
        self.DESIRED_SERIES = "DTI1"
        self.STD_DEV_ACROSS_N_FRAMES = 10

        self.slicer_dir = r"C:\Users\loush\AppData\Local\NA-MIC\Slicer 4.11.0-2020-04-01"
        self.exportRan = False
        self.stdRan = False
        self.high_hu = 2000
        self.low_hu = -1024
       
        # self.pix_label = TrackingLabel(self)
        self.pix_label = DicomWidget(self)

        # self.color_table = [QtWidgets.qRgb(i, i, i) for i in range(256)]

        scroll_area = QtWidgets.QScrollArea()
        scroll_area.setWidget(self.pix_label)

        # self.setCentralWidget(self.pix_label)
        self.setCentralWidget(scroll_area)

        # self.series_dock = QtWidgets.QDockWidget("Series", self)
        # self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.series_dock)

        self.file_dock = QtWidgets.QDockWidget("Images", self)
        self.file_dock.setFeatures(QtWidgets.QDockWidget.DockWidgetMovable)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.file_dock)

        self.file_list = QtWidgets.QListWidget()
        self.file_list.itemSelectionChanged.connect(self.on_file_item_change)
        self.file_dock.setWidget(self.file_list)

        # self.series_list = QtWidgets.QListWidget()
        # self.studies_list.itemSelectionChanged.connect(self.on_study_item_change)
        # self.series_dock.setWidget(self.series_list)

        self.hu_label = QtWidgets.QLabel("No image")
        self.c_label = QtWidgets.QLabel("")
        self.cw_label = QtWidgets.QLabel("")        
        self.x_label = QtWidgets.QLabel("")
        self.y_label = QtWidgets.QLabel("")
        self.z_label = QtWidgets.QLabel("")
        self.use_fractional_coordinates = True
        self.ij_label = QtWidgets.QLabel("")

        self._zoom_level = 1
        self.mouse_x = -1
        self.mouse_y = -1
       
        self.statusBar().addPermanentWidget(self.cw_label)
        self.statusBar().addPermanentWidget(self.ij_label)
        self.statusBar().addPermanentWidget(self.x_label)
        self.statusBar().addPermanentWidget(self.y_label)
        self.statusBar().addPermanentWidget(self.z_label)
        self.statusBar().addPermanentWidget(self.hu_label)

        self.data = np.ndarray((512, 512), np.int8)
        self.update_cw()

        if os.path.isfile(path):
            self.load_files([path])
        elif os.path.isdir(path):
            self.load_files(dicom_files_in_dir(path))
        self.build_menu()
Beispiel #28
0
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setAcceptDrops(True)

        self.loader = None
        self.dirty = False
        self._selectSlotBlock = False
        self._config = config.get_default_config()

        self.labelListWidget = LabelListWidget(self)
        self.labelListDock = QtWidgets.QDockWidget('Displayed Label List',
                                                   self)
        self.labelListDock.setWidget(self.labelListWidget)

        self.allLabelList = LabelListWidget(self)
        self.allLabelListDock = QtWidgets.QDockWidget('Label List', self)
        self.allLabelListDock.setWidget(self.allLabelList)

        self.colorTableWidget = TaglistWidget(self)
        self.colorTableWidget.loadFromJson(self._config['tags'])
        self.colorTableDock = QtWidgets.QDockWidget('Color Table', self)
        self.colorTableDock.setWidget(self.colorTableWidget)

        self.addDockWidget(Qt.RightDockWidgetArea, self.allLabelListDock)
        self.addDockWidget(Qt.RightDockWidgetArea, self.colorTableDock)
        self.tabifyDockWidget(self.allLabelListDock, self.labelListDock)

        self.view = BaseView()
        self.setCentralWidget(self.view)
        self.statusBar().show()
        self.resize(1200, 800)

        action = functools.partial(utils.createAction, self)
        open_ = action("&Open", self.open, 'open',
                       self.tr('Open image or label file'))
        exit_ = action("&Exit", tip=self.tr('Quit Application'))
        openDir_ = action("&Open Dir", self.open, 'open')
        createMode_ = action("&Create Polygons",
                             lambda: self.toggleDrawMode(type.Mode_polygon),
                             'objects', self.tr('Start drawing polygons'))

        createRectangleMode_ = action(
            self.tr('Create Rectangle'),
            lambda: self.toggleDrawMode(type.Mode_rectangle),
            'objects',
            self.tr('Start drawing rectangles'),
            enabled=False,
        )
        createCircleMode_ = action(
            self.tr('Create Circle'),
            lambda: self.toggleDrawMode(type.Mode_circle),
            'objects',
            self.tr('Start drawing circles'),
            enabled=False,
        )
        createLineMode_ = action(
            self.tr('Create Line'),
            lambda: self.toggleDrawMode(type.Mode_line),
            'objects',
            self.tr('Start drawing lines'),
            enabled=False,
        )
        createPointMode_ = action(
            self.tr('Create Point'),
            lambda: self.toggleDrawMode(type.Mode_point),
            'objects',
            self.tr('Start drawing points'),
            enabled=False,
        )
        createLineStripMode_ = action(
            self.tr('Create LineStrip'),
            lambda: self.toggleDrawMode(type.Mode_linestrip),
            'objects',
            self.tr('Start drawing linestrip. Ctrl+LeftClick ends creation.'),
            enabled=False,
        )
        createBoxMode_ = action(
            self.tr('Create Box'),
            lambda: self.toggleDrawMode(type.Mode_box),
            'objects',
            self.tr('Start drawing box.'),
            enabled=False,
        )

        delete_ = action(self.tr('Delete Polygons'),
                         self.deleteSelectedShape,
                         'cancel',
                         self.tr('Delete the selected polygons'),
                         enabled=False)

        deleteAll_ = action(self.tr('Delete All'),
                            self.deleteSelectedShape,
                            'delete',
                            self.tr('Delete all polygons'),
                            enabled=False)

        edit_ = action('&Edit Label',
                       lambda: self.toggleDrawMode(None),
                       'edit',
                       'Modify the label of the selected polygon',
                       enabled=False)

        save_ = action(self.tr('&Save'),
                       self.saveFile,
                       'save',
                       self.tr('Save labels to file'),
                       enabled=False)

        saveAs_ = action(self.tr('&Save As'),
                         self.saveFileAs,
                         'save-as',
                         self.tr('Save labels to a different file'),
                         enabled=False)

        nextTag_ = action(
            self.tr('&Next Tag'),
            slot=lambda: self.colorTableWidget.selectNext(),
            tip=self.tr('Go to a next tag'),
        )
        prevTag_ = action(
            self.tr('&Previous Tag'),
            slot=lambda: self.colorTableWidget.selectPrev(),
            tip=self.tr('Go to a previous tag'),
        )
        homeTag_ = action(
            self.tr('&Home Tag'),
            slot=lambda: self.colorTableWidget.selectHome(),
            tip=self.tr('Go to a start tag'),
        )
        endTag_ = action(
            self.tr('&End Tag'),
            slot=lambda: self.colorTableWidget.selectEnd(),
            tip=self.tr('Go to a end tag'),
        )
        deleteTag_ = action(
            self.tr('&Delete Tag'),
            slot=lambda: self.colorTableWidget.deleteSelected())
        addTag_ = action(self.tr('&Add Tag'),
                         slot=lambda: self.colorTableWidget.addTag())
        insertTag_ = action(self.tr('&Insert Tag'),
                            slot=lambda: self.colorTableWidget.insertTag())

        fitWindow_ = action(self.tr('&Fit Window'),
                            slot=self.fitWindow,
                            icon='fit-window',
                            tip=self.tr('Zoom follows window size'))

        undo_ = action(self.tr('&Undo'),
                       slot=self.undo,
                       icon='undo',
                       tip=self.tr('undo'))

        self.zoom_widget = ZoomWidget()
        zoom_ = QtWidgets.QWidgetAction(self)
        zoom_.setDefaultWidget(self.zoom_widget)

        self.actions = utils.struct(
            open=open_,
            exit=exit_,
            openDir=openDir_,
            createMode=createMode_,
            createRectangleMode=createRectangleMode_,
            createCircleMode=createCircleMode_,
            createLineMode=createLineMode_,
            createPointMode=createPointMode_,
            createLineStripMode=createLineStripMode_,
            createBoxMode=createBoxMode_,
            edit=edit_,
            delete=delete_,
            save=save_,
            saveAs=saveAs_,
            nextTag=nextTag_,
            prevTag=prevTag_,
            homeTag=homeTag_,
            endTag=endTag_,
            deleteTag=deleteTag_,
            fitWindow=fitWindow_,
            deleteAll=deleteAll_,
            undo=undo_,
            # load=load_,
            fileMenu=(
                open_,
                openDir_,
                None,
                save_,
                saveAs_,
                None,
                # load_,
                None,
                exit_,
            ),
            editMenu=(
                createMode_,
                createRectangleMode_,
                createCircleMode_,
                createLineMode_,
                createPointMode_,
                createLineStripMode_,
                createBoxMode_,
                None,
                edit_,
                undo_,
                None,
                delete_,
                deleteAll_,
            ),
            selectionMenu=(
                nextTag_,
                prevTag_,
                homeTag_,
                endTag_,
            ),
            viewMenu=(
                self.labelListDock.toggleViewAction(),
                self.allLabelListDock.toggleViewAction(),
                self.colorTableDock.toggleViewAction(),
                None,
                fitWindow_,
            ),
            labelListMenu=(delete_, ),
            tagListMenu=(
                addTag_,
                insertTag_,
                deleteTag_,
            ))

        self.tools_actions = (
            open_,
            openDir_,
            save_,
            saveAs_,
            None,
            delete_,
            deleteAll_,
            undo_,
            None,
            createMode_,
            edit_,
            None,
            zoom_,
            fitWindow_,
        )
        self.toolbar = ToolBar('toolbar')
        self.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        self.addToolBar(Qt.TopToolBarArea, self.toolbar)
        utils.addActions(self.toolbar, self.tools_actions)
        # utils.addActions(self.canvas.menu, self.actions.editMenu)
        self.view.addMenu(self.actions.editMenu)
        self.labelListWidget.addMenu(self.actions.labelListMenu)
        self.allLabelList.addMenu(self.actions.labelListMenu)
        self.colorTableWidget.addMenu(self.actions.tagListMenu)

        self.addMenu("&File", self.actions.fileMenu)
        self.addMenu("&Edit", self.actions.editMenu)
        self.addMenu("&Selection", self.actions.selectionMenu)
        self.addMenu("&View", self.actions.viewMenu)
        # signal

        self.zoom_widget.valueChanged.connect(self.zoomChanged)
        self.labelListWidget.itemChanged.connect(self.labelItemChanged)
        self.labelListWidget.itemDoubleClicked.connect(
            lambda: (self.toggleDrawMode(None), self.labelSelectionChanged()))
        self.labelListWidget.itemSelectionChanged.connect(
            self.labelSelectionChanged)
        self.labelListWidget.itemDeleteSelected.connect(
            self.deleteSelectedShape)
        self.allLabelList.itemSelectionChanged.connect(
            self.allLabelListSelected)
        self.allLabelList.itemDoubleClicked.connect(self.editLabel)

        self.colorTableWidget.itemsDelete.connect(self.tagsDelete)

        self.init()
        self.initViewSlot()
Beispiel #29
0
    def setup_ui(self, window):
        self.labelList = LabelQListWidget(window)
        self.labelList.itemActivated.connect(window.labelSelectionChanged)
        self.labelList.itemSelectionChanged.connect(
            window.labelSelectionChanged)
        self.labelList.itemDoubleClicked.connect(window.editLabel)
        # Connect to itemChanged to detect checkbox changes.
        self.labelList.itemChanged.connect(window.labelItemChanged)
        self.labelList.setDragDropMode(
            QtWidgets.QAbstractItemView.InternalMove)

        self.shape_dock = QtWidgets.QDockWidget('Polygon Labels', window)
        self.shape_dock.setObjectName('Labels')
        self.shape_dock.setWidget(self.labelList)

        self.uniqLabelList = EscapableQListWidget()
        self.uniqLabelList.setToolTip(
            "Select label to start annotating for it. "
            "Press 'Esc' to deselect.")
        if Config.get('labels'):
            self.uniqLabelList.addItems(
                set(Config.get('labels')) - {'__flags'})
            self.uniqLabelList.sortItems()
        self.label_dock = QtWidgets.QDockWidget(u'Label List', window)
        self.label_dock.setObjectName(u'Label List')
        self.label_dock.setWidget(self.uniqLabelList)

        self.fileSearch = QtWidgets.QLineEdit()
        self.fileSearch.setPlaceholderText('Search Filename')
        self.fileListWidget = FileQListWidget(window.bound_to_new_uri,
                                              lambda: window.uri)
        self.fileListWidget.load_file_signal.connect(window.on_file_changed)
        self.fileSearch.textChanged.connect(
            self.fileListWidget.file_search_changed)
        fileListLayout = QtWidgets.QVBoxLayout()
        fileListLayout.setContentsMargins(0, 0, 0, 0)
        fileListLayout.setSpacing(0)
        fileListLayout.addWidget(self.fileSearch)
        fileListLayout.addWidget(self.fileListWidget)
        self.file_dock = QtWidgets.QDockWidget(u'File List', window)
        self.file_dock.setObjectName(u'Files')
        fileListSearchWidget = QtWidgets.QWidget()
        fileListSearchWidget.setLayout(fileListLayout)
        self.file_dock.setWidget(fileListSearchWidget)

        self.zoomWidget = ZoomWidget()
        self.colorDialog = ColorDialog(parent=window)

        self.canvas = self.labelList.canvas = Canvas()
        self.canvas.zoomRequest.connect(window.zoomRequest)

        self.labelDialog = LabelDialog(parent=self.canvas)

        scrollArea = QtWidgets.QScrollArea()
        scrollArea.setWidget(self.canvas)
        scrollArea.setWidgetResizable(True)
        self.scrollBars = {
            Qt.Vertical: scrollArea.verticalScrollBar(),
            Qt.Horizontal: scrollArea.horizontalScrollBar(),
        }
        self.canvas.scrollRequest.connect(window.scrollRequest)
        self.canvas.newShape.connect(window.newShape)
        self.canvas.shapeMoved.connect(window.setDirty)
        self.canvas.selectionChanged.connect(window.shapeSelectionChanged)
        self.canvas.drawingPolygon.connect(window.action_storage.refresh_all)
        self.canvas.mergeShape.connect(window.mergeShapes)

        window.setCentralWidget(scrollArea)

        features = QtWidgets.QDockWidget.DockWidgetFeatures()
        for dock in ['label_dock', 'shape_dock', 'file_dock']:
            if Config.get((dock, 'closable')):
                features = features | QtWidgets.QDockWidget.DockWidgetClosable
            if Config.get((dock, 'floatable')):
                features = features | QtWidgets.QDockWidget.DockWidgetFloatable
            if Config.get((dock, 'movable')):
                features = features | QtWidgets.QDockWidget.DockWidgetMovable
            getattr(self, dock).setFeatures(features)
            if Config.get((dock, 'show')) is False:
                getattr(self, dock).setVisible(False)

        window.addDockWidget(Qt.RightDockWidgetArea, self.label_dock)
        window.addDockWidget(Qt.RightDockWidgetArea, self.shape_dock)
        window.addDockWidget(Qt.RightDockWidgetArea, self.file_dock)

        shortcuts = Config.get('shortcuts')
        self.zoomWidget.setWhatsThis(
            'Zoom in or out of the image. Also accessible with '
            '{} and {} from the canvas.'.format(
                utils.fmtShortcut('{},{}'.format(shortcuts['zoom_in'],
                                                 shortcuts['zoom_out'])),
                utils.fmtShortcut("Ctrl+Wheel"),
            ))
        self.zoomWidget.setEnabled(False)
        self.zoomWidget.valueChanged.connect(window.paintCanvas)

        # Lavel list context menu.
        labelMenu = QtWidgets.QMenu()
        self.labelList.setContextMenuPolicy(Qt.CustomContextMenu)
        self.labelList.customContextMenuRequested.connect(
            window.popLabelListMenu)
        self.menus = SimpleNamespace(
            file=self.menu(window, '&File'),
            edit=self.menu(window, '&Edit'),
            view=self.menu(window, '&View'),
            help=self.menu(window, '&Help'),
            recentFiles=QtWidgets.QMenu('Open &Recent'),
            labelList=labelMenu,
        )
        self.menus.file.aboutToShow.connect(window.updateFileMenu)
        self.tools = self.toolbar(window, 'Tools')
Beispiel #30
0
    def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags(0)):
        QtWidgets.QMainWindow.__init__(self, parent, flags)
        self.statusBar().show()

        self.model = QtGui.QStandardItemModel(self)
        self.model.setColumnCount(2)

        self.treeview = QtWidgets.QTreeView()
        self.treeview.setModel(self.model)
        self.treeview.setHeaderHidden(True)
        self.treeview.setIndentation(0)
        self.treeview.setSelectionMode(
            QtWidgets.QAbstractItemView.ExtendedSelection)
        self.treeview.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
        self.treeview.header().setStretchLastSection(True)

        self.treedock = QtWidgets.QDockWidget(self.tr('Layers View'), self)
        self.treedock.setWidget(self.treeview)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.treedock)

        self.scene = QtWidgets.QGraphicsScene(self)
        self.graphicsview = QtWidgets.QGraphicsView(self.scene, self)
        self.setCentralWidget(self.graphicsview)

        self.mousemanager = MouseManager(self)
        self.mousemanager.register(self.graphicsview)
        self.mousemanager.mode = 'hand'

        self.layermanager = LayerManager(self.treeview, self)

        # File Actions
        self.fileactions = self._setupFileActions()

        menu = QtWidgets.QMenu('File', self)
        menu.addActions(self.fileactions.actions())
        self.menuBar().addMenu(menu)
        self._filemenu = menu

        toolbar = QtWidgets.QToolBar('File toolbar', self)
        toolbar.addActions(self.fileactions.actions())
        self.addToolBar(toolbar)

        # Mouse Actions
        menu = QtWidgets.QMenu('Mouse', self)
        menu.addActions(self.mousemanager.actions.actions())
        self.menuBar().addMenu(menu)

        toolbar = QtWidgets.QToolBar('Mouse toolbar')
        toolbar.addActions(self.mousemanager.actions.actions())
        self.addToolBar(toolbar)

        # View Actions
        self.viewactions = self._setupViewActions()

        menu = QtWidgets.QMenu('View', self)
        menu.addActions(self.viewactions.actions())
        self.menuBar().addMenu(menu)

        toolbar = QtWidgets.QToolBar('View toolbar')
        toolbar.addActions(self.viewactions.actions())
        self.addToolBar(toolbar)

        # Layer Actions
        layeractions = self.layermanager.actions

        menu = QtWidgets.QMenu('Layer', self)
        menu.addActions(layeractions.actions())
        self.menuBar().addMenu(menu)

        toolbar = QtWidgets.QToolBar('Layer toolbar')
        toolbar.addActions(layeractions.actions())
        self.addToolBar(toolbar)

        # Help action
        self.helpactions = self._setupHelpActions()

        menu = QtWidgets.QMenu('Help', self)
        menu.addActions(self.helpactions.actions())
        self.menuBar().addMenu(menu)

        toolbar = QtWidgets.QToolBar('Help toolbar', self)
        toolbar.addActions(self.helpactions.actions())
        self.addToolBar(toolbar)

        self.resize(900, 500)
        self.reset()
        self.statusBar().showMessage('Ready')