Ejemplo n.º 1
0
    def _on_ui_element_created(self, elem, widget):
        if elem == 'disassembly':
            self.disassembly_view = widget
            self.disassembly_view.graph_view = None
            self.disassembly_view.decompilation_view = None

            self.disassembly_view.disasm_view.run_default_disassembler = False
            self.disassembly_view.disasm_view.onDisassemble.connect(
                self._on_disassemble)

            r2_info = QSplitter()
            r2_info.setOrientation(Qt.Vertical)

            call_refs = DwarfListView()
            self.call_refs_model = QStandardItemModel(0, 3)
            self.call_refs_model.setHeaderData(0, Qt.Horizontal, 'call refs')
            self.call_refs_model.setHeaderData(1, Qt.Horizontal, '')
            self.call_refs_model.setHeaderData(2, Qt.Horizontal, '')
            call_refs.setModel(self.call_refs_model)

            code_xrefs = DwarfListView()
            self.code_xrefs_model = QStandardItemModel(0, 3)
            self.code_xrefs_model.setHeaderData(0, Qt.Horizontal, 'code xrefs')
            self.code_xrefs_model.setHeaderData(1, Qt.Horizontal, '')
            self.code_xrefs_model.setHeaderData(2, Qt.Horizontal, '')
            code_xrefs.setModel(self.code_xrefs_model)

            r2_info.addWidget(call_refs)
            r2_info.addWidget(code_xrefs)

            self.disassembly_view.insertWidget(0, r2_info)
            self.disassembly_view.setStretchFactor(0, 1)
            self.disassembly_view.setStretchFactor(1, 5)

            self.disassembly_view.disasm_view.menu_extra_menu_hooks.append(
                self._on_hook_menu)
Ejemplo n.º 2
0
    def __init__(self, *args, **opts):  # **dict_opts):
        QWidget.__init__(self, parent=None)
        #self._name = self.__class__.__name__

        cp.cmwmain = self

        #self.proc_parser(parser)
        self.proc_opts(**opts)

        from psana.graphqt.CMWMainTabs import CMWMainTabs  # AFTER proc_parser !!!!

        self.main_win_width = cp.main_win_width
        self.main_win_height = cp.main_win_height
        self.main_win_pos_x = cp.main_win_pos_x
        self.main_win_pos_y = cp.main_win_pos_y

        #icon.set_icons()

        self.wtab = CMWMainTabs()
        self.wlog = QWLoggerStd(cp, show_buttons=False)
        self.wtmp = QTextEdit('Some text')

        self.vspl = QSplitter(Qt.Vertical)
        self.vspl.addWidget(self.wtab)
        self.vspl.addWidget(self.wlog)

        self.mbox = QHBoxLayout()
        self.mbox.addWidget(self.vspl)
        self.setLayout(self.mbox)

        self.set_style()
        #self.set_tool_tips()

        self.connect_signals_to_slots()
        #self.move(self.pos()) # + QPoint(self.width()+5, 0))
        logger.info(log_rec_on_start('%Y-%m-%dT%H:%M:%S%z'))
Ejemplo n.º 3
0
    def _on_ui_element_created(self, elem, widget):
        if elem == 'disassembly':
            self.decompiler_view = widget
            self.decompiler_view.onDisassemble.connect(self._on_disassemble)

            r2_info = QSplitter()
            r2_info.setOrientation(Qt.Vertical)

            call_refs = DwarfListView()
            self.call_refs_model = QStandardItemModel(0, 3)
            self.call_refs_model.setHeaderData(0, Qt.Horizontal, 'call refs')
            self.call_refs_model.setHeaderData(1, Qt.Horizontal, '')
            self.call_refs_model.setHeaderData(2, Qt.Horizontal, '')
            call_refs.setModel(self.call_refs_model)

            code_xrefs = DwarfListView()
            self.code_xrefs_model = QStandardItemModel(0, 3)
            self.code_xrefs_model.setHeaderData(0, Qt.Horizontal, 'code xrefs')
            self.code_xrefs_model.setHeaderData(1, Qt.Horizontal, '')
            self.code_xrefs_model.setHeaderData(2, Qt.Horizontal, '')
            code_xrefs.setModel(self.code_xrefs_model)

            r2_info.addWidget(call_refs)
            r2_info.addWidget(code_xrefs)

            self.decompiler_view.insertWidget(0, r2_info)
            self.decompiler_view.setStretchFactor(0, 1)
            self.decompiler_view.setStretchFactor(1, 5)

            r2_menu = QMenu('r2')
            r2_menu.addAction('graph view', self.show_graph_view)
            if self.with_decompiler:
                r2dec = r2_menu.addAction('decompile',
                                          self.show_decompiler_view)

            self.decompiler_view.disasm_view.menu_extra_menu.append(r2_menu)
Ejemplo n.º 4
0
    def initUI(self):
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.model = QFileSystemModel()
        self.model.setRootPath(r'C:\dcmtk')
        self.model.setReadOnly(True)

        self.files_view = self.__initFileTreeView(self.model)
        self.files_view.doubleClicked.connect(self.storeItem)

        self.pacs_model = PacsItemModel(["ID", "Name", "Birth"])

        if PACS_Action.isConnect():
            try:
                patients = PACS_Action.find_patients()
                self.pacs_model.update(patients)
            except:
                print('Error on loading patients list')

        self.pacs_view = PACSView()
        self.pacs_view.setModel(self.pacs_model)
        self.pacs_view.setMinimumWidth(200)
        self.pacs_view.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContents)
        self.pacs_view.horizontalHeader().setSectionResizeMode(
            QHeaderView.ResizeToContents)
        self.pacs_view.resizeColumnsToContents()
        self.pacs_view.doubleClicked.connect(self.showImage)

        splitter = QSplitter()
        splitter.addWidget(self.files_view)
        splitter.addWidget(self.pacs_view)

        layout = QHBoxLayout()
        layout.addWidget(splitter)

        self.setLayout(layout)
Ejemplo n.º 5
0
    def __init__(self, app):
        super().__init__()
        self.app = app

        self.setOrientation(Qt.Vertical)

        top_splitter = QSplitter()

        self.registers_panel = RegistersPanel(self.app, 0, 4)
        top_splitter.addWidget(self.registers_panel)

        top_splitter.setStretchFactor(0, 1)
        top_splitter.setStretchFactor(1, 3)
        self.addWidget(top_splitter)

        self.memory_panel = MemoryPanel(self.app)
        self.addWidget(self.memory_panel)

        self.log_panel = QListWidget()
        self.addWidget(self.log_panel)

        self.setStretchFactor(0, 1)
        self.setStretchFactor(1, 3)
        self.setStretchFactor(2, 1)
Ejemplo n.º 6
0
    def __init__(self, parent):
        """
        Constructor
        
        @param parent parent widget (QWidget)
        """
        self.stacks = []

        QSplitter.__init__(self, parent)
        ViewManager.__init__(self)

        self.viewlist = QListWidget(self)
        policy = self.viewlist.sizePolicy()
        policy.setHorizontalPolicy(QSizePolicy.Ignored)
        self.viewlist.setSizePolicy(policy)
        self.addWidget(self.viewlist)
        self.viewlist.setContextMenuPolicy(Qt.CustomContextMenu)
        self.viewlist.currentRowChanged.connect(self.__showSelectedView)
        self.viewlist.customContextMenuRequested.connect(self.__showMenu)

        self.stackArea = QSplitter(self)
        self.addWidget(self.stackArea)
        self.stackArea.setOrientation(Qt.Vertical)
        stack = StackedWidget(self.stackArea)
        self.stackArea.addWidget(stack)
        self.stacks.append(stack)
        self.currentStack = stack
        stack.currentChanged.connect(self.__currentChanged)
        stack.installEventFilter(self)
        self.setSizes([int(self.width() * 0.2), int(self.width() * 0.8)])
        # 20% for viewlist, 80% for the editors
        self.__inRemoveView = False

        self.__initMenu()
        self.contextMenuEditor = None
        self.contextMenuIndex = -1
Ejemplo n.º 7
0
    def __init__(self, **kwargs):
        QWidget.__init__(self, parent=None, flags=Qt.WindowStaysOnTopHint)

        cp.cmwmain = self
        self.set_input_pars(**kwargs)

        from psana.graphqt.CMWMainTabs import CMWMainTabs  # AFTER set_input_pars !!!!\
        self.wlog = cp.wlog = QWLoggerStd(cp, show_buttons=False)

        repoman = RepoManager(kwargs['logdir'], dettype=None)
        repoman.save_record_at_start(sys.argv[0].rsplit('/')[-1])

        self.wtab = CMWMainTabs()

        self.vspl = QSplitter(Qt.Vertical)
        self.vspl.addWidget(self.wtab)
        self.vspl.addWidget(self.wlog)

        self.mbox = QHBoxLayout()
        self.mbox.addWidget(self.vspl)

        self.setLayout(self.mbox)

        self.set_style()
Ejemplo n.º 8
0
    def AddTab(self):
        i = self.tabCount

        self.tabs.append(QWidget())
        self.tabs[i].layout = QVBoxLayout()
        self.tabs[i].setObjectName("tab" + str(i))
        self.tabs[i].setContentsMargins(0, 0, 0, 0)

        # Open webview
        self.tabs[i].content = QWebEngineView()
        self.tabs[i].content.load(QUrl.fromUserInput("https://www.google.com"))

        self.tabs[i].content.titleChanged.connect(
            lambda: self.SetTabContent(i, "title"))
        self.tabs[i].content.iconChanged.connect(
            lambda: self.SetTabContent(i, "icon"))
        self.tabs[i].content.urlChanged.connect(
            lambda: self.SetTabContent(i, "url"))
        # Add webview to tabs layout
        self.tabs[i].splitview = QSplitter()
        self.tabs[i].layout.addWidget(self.tabs[i].splitview)
        self.tabs[i].splitview.addWidget(self.tabs[i].content)

        # set top level tab from [] to layout
        self.tabs[i].setLayout(self.tabs[i].layout)

        # Add tabe to top level stackedwidget
        self.container.layout.addWidget(self.tabs[i])
        self.container.layout.setCurrentWidget(self.tabs[i])

        # Set the tab at the top of the screen
        self.tabbar.addTab("New Tab")
        self.tabbar.setTabData(i, {"object": "tab" + str(i), "initial": i})
        self.tabbar.setCurrentIndex(i)

        self.tabCount += 1
Ejemplo n.º 9
0
    def __init__(self, parent=None):
        super(SavedOrder, self).__init__(parent=parent)
        v_layout = QVBoxLayout(self)
        splitter = QSplitter(Qt.Vertical)
        # 删、增、改按钮
        tree_modify_btn_s = QHBoxLayout(self)
        self.delete_btn = QPushButton('删除')
        self.delete_btn.clicked.connect(self.on_clicked_delete_btn)
        self.add_btn = QPushButton('增加')
        self.add_btn.clicked.connect(self.on_clicked_add_btn)
        self.change_btn = QPushButton('修改')
        self.change_btn.clicked.connect(self.on_clicked_change_btn)
        # 烦死了,必须要装到widget
        tree_modify_btn_s_widget = QWidget()
        tree_modify_btn_s_widget.setLayout(tree_modify_btn_s)
        tree_modify_btn_s_widget.setMaximumHeight(50)
        # 指令树
        self.tree = self.load_tree()
        self.tree.expandAll()
        self.tree.setColumnWidth(0, 150)
        self.tree.setColumnWidth(1, 200)
        self.tree.currentItemChanged.connect(self.on_changed_tree_item)
        # 运行
        self.run_btn = QPushButton('执行')
        self.run_btn.clicked.connect(self.on_clicked_run)

        tree_modify_btn_s.addWidget(self.delete_btn)
        tree_modify_btn_s.addStretch(1)
        tree_modify_btn_s.addWidget(self.add_btn)
        tree_modify_btn_s.addWidget(self.change_btn)
        splitter.addWidget(tree_modify_btn_s_widget)
        splitter.addWidget(self.tree)
        splitter.addWidget(self.run_btn)
        v_layout.addWidget(splitter)
        self.on_changed_tree_item()
        self.setLayout(v_layout)
Ejemplo n.º 10
0
 def splitViewSpace(self, viewspace, orientation):
     """Split the given view.
     
     If orientation == Qt.Horizontal, adds a new view to the right.
     If orientation == Qt.Vertical, adds a new view to the bottom.
     
     """
     active = viewspace is self.activeViewSpace()
     splitter = viewspace.parentWidget()
     newspace = ViewSpace(self)
     
     if splitter.count() == 1:
         splitter.setOrientation(orientation)
         size = splitter.sizes()[0]
         splitter.addWidget(newspace)
         splitter.setSizes([size / 2, size / 2])
     elif splitter.orientation() == orientation:
         index = splitter.indexOf(viewspace)
         splitter.insertWidget(index + 1, newspace)
     else:
         index = splitter.indexOf(viewspace)
         newsplitter = QSplitter()
         newsplitter.setOrientation(orientation)
         sizes = splitter.sizes()
         splitter.insertWidget(index, newsplitter)
         newsplitter.addWidget(viewspace)
         splitter.setSizes(sizes)
         size = newsplitter.sizes()[0]
         newsplitter.addWidget(newspace)
         newsplitter.setSizes([size / 2, size / 2])
     self._viewSpaces.insert(0, newspace)
     newspace.showDocument(viewspace.document())
     if active:
         newspace.activeView().setFocus()
     self.actionCollection.window_close_view.setEnabled(self.canCloseViewSpace())
     self.actionCollection.window_close_others.setEnabled(self.canCloseViewSpace())
Ejemplo n.º 11
0
    def __init__(self, mainGui):
        QWidget.__init__(self, mainGui)

        self.mainConf = novelwriter.CONFIG
        self.mainGui = mainGui

        # Build GUI
        self.outlineBar = GuiOutlineToolBar(self)
        self.outlineTree = GuiOutlineTree(self)
        self.outlineData = GuiOutlineDetails(self)

        self.splitOutline = QSplitter(Qt.Vertical)
        self.splitOutline.addWidget(self.outlineTree)
        self.splitOutline.addWidget(self.outlineData)
        self.splitOutline.setSizes(self.mainConf.getOutlinePanePos())

        # Assemble
        self.outerBox = QVBoxLayout()
        self.outerBox.setContentsMargins(0, 0, 0, 0)
        self.outerBox.addWidget(self.outlineBar)
        self.outerBox.addWidget(self.splitOutline)

        self.setLayout(self.outerBox)

        # Connect Signals
        self.outlineTree.hiddenStateChanged.connect(self._updateMenuColumns)
        self.outlineTree.activeItemChanged.connect(self.outlineData.showItem)
        self.outlineData.itemTagClicked.connect(self._tagClicked)
        self.outlineBar.loadNovelRootRequest.connect(self._rootItemChanged)
        self.outlineBar.viewColumnToggled.connect(
            self.outlineTree.menuColumnToggled)

        # Function Mappings
        self.getSelectedHandle = self.outlineTree.getSelectedHandle

        return
Ejemplo n.º 12
0
    def loadFileMzML(self, file_path):
        self.isAnnoOn = False
        self.msexperimentWidget = QSplitter(Qt.Vertical)

        # data processing
        scans = self.readMS(file_path)

        # set Widgets
        self.spectrum_widget = SpectrumWidget()
        self.scan_widget = ScanTableWidget(scans)
        self.seqIons_widget = SequenceIonsWidget()
        self.error_widget = ErrorWidget()
        self.tic_widget = TICWidget()
        self.drawTic(scans)

        # connected signals
        self.scan_widget.sigScanClicked.connect(self.updateWidgetDataFromRow)
        self.tic_widget.sigRTClicked.connect(self.ticToTable)

        self.msexperimentWidget.addWidget(self.tic_widget)
        self.msexperimentWidget.addWidget(self.seqIons_widget)
        self.msexperimentWidget.addWidget(self.spectrum_widget)
        self.msexperimentWidget.addWidget(self.error_widget)
        self.msexperimentWidget.addWidget(self.scan_widget)
        self.mainlayout.addWidget(self.msexperimentWidget)

        # set widget sizes, where error plot is set smaller
        widget_height = self.msexperimentWidget.sizeHint().height()
        size_list = [
            widget_height, widget_height, widget_height, widget_height * 0.5,
            widget_height
        ]
        self.msexperimentWidget.setSizes(size_list)

        # default : first row selected.
        self.scan_widget.table_view.selectRow(0)
Ejemplo n.º 13
0
    def __init__(self):
        QWidget.__init__(self)
        self.sun = 1
        hbox = QHBoxLayout(self)
        mainLayout = QSplitter(Qt.Horizontal)
        #splitter1 = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.three_d = display_widget()
        #self.three_d.show()

        self.frame = ribbon_device()

        mainLayout.addWidget(self.frame)
        self.frame.setMinimumSize(100, 0)
        mainLayout.addWidget(self.three_d)
        mainLayout.setStretchFactor(1, 1)
        hbox.addWidget(mainLayout)

        self.setLayout(hbox)

        if enable_webupdates() == True:
            print("Looking for updates")
            self.web_update = update_thread()
            self.web_update.got_data.connect(self.got_help)
            self.web_update.start()
Ejemplo n.º 14
0
    def __init__(self, application):
        super().__init__()

        self.setWindowTitle(config.TITLE + " (v" + config.VERSION + ")")
        self.setGeometry(10, 10, 1220, 500)
        self.setWindowFlags(self.windowFlags() & Qt.WindowMaximizeButtonHint)

        self.data_panel = DataPanel(application)
        self.graph_panel = GraphPanel()
        self.status_bar = StatusBarWidget(application.signals)

        splitter = QSplitter(Qt.Horizontal)
        splitter.addWidget(self.data_panel)
        splitter.addWidget(self.graph_panel)
        splitter.setSizes([10000, 10000])
        splitter.setContentsMargins(1, 1, 1, 1)

        layout = QVBoxLayout()
        layout.addWidget(splitter, 1)
        layout.addWidget(self.status_bar, 0)
        self.setLayout(layout)

        application.signals.csv_imported.connect(self.on_csv_imported)
        self.showMaximized()
Ejemplo n.º 15
0
    def initUI(self):
        self.screenShape = QtWidgets.QDesktopWidget().screenGeometry()
        self.resize(self.screenShape.width() - 10,
                    self.screenShape.height() - 100)
        self.setMinimumWidth(1300)

        self.setWindowTitle("Your recommndations")
        sl = QtWidgets.QSlider(Qt.Horizontal)
        sl.setMinimum(1)
        sl.setMaximum(10)
        sl.setTickInterval(1)
        sl.setTickPosition(QtWidgets.QSlider.TicksBelow)

        self.title = QtWidgets.QLabel("Your recommendations:")
        self.title.setAlignment(Qt.AlignCenter)
        self.title.setObjectName('title')

        self.yourID = QtWidgets.QLabel("Your login: "******"id")
        self.my_rates = QtWidgets.QPushButton('My rates')
        self.my_rates.setFixedSize(100, 30)
        self.all_films = QtWidgets.QPushButton('All films')
        self.all_films.setFixedSize(100, 30)
        self.update = QtWidgets.QPushButton('Update')
        self.update.setFixedSize(100, 30)
        self.randomFilm = QtWidgets.QPushButton('Random \n film')
        self.randomFilm.setFixedSize(100, 70)
        self.my_rates.clicked.connect(lambda: self.btn_click(self.my_rates))
        self.all_films.clicked.connect(lambda: self.btn_click(self.all_films))
        self.update.clicked.connect(lambda: self.btn_click(self.update))
        self.randomFilm.clicked.connect(
            lambda: self.btn_click(self.randomFilm))

        self.splitterV = QSplitter(Qt.Vertical)

        self.films = Films(self.UserID, self.selected)
        self.main_widget = QWidget()
        self.main_layout = QtWidgets.QGridLayout(self.main_widget)
        self.main_layout.setSpacing(5)
        self.main_layout.addWidget(self.yourID, 0, 0)
        self.main_layout.addWidget(self.all_films, 1, 0)
        self.main_layout.addWidget(self.my_rates, 2, 0)
        self.main_layout.addWidget(self.update, 3, 0)
        self.main_layout.addWidget(self.randomFilm, 4, 0)
        self.main_widget.setObjectName('main')

        self.scrollWidget = QScrollArea()
        self.scrollWidget.setWidget(self.films)
        self.scrollWidget.setWidgetResizable(True)
        self.scrollWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scrollWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scrollWidget.setFrameShape(QFrame.NoFrame)

        #self.main_layout.addWidget(self.auto)
        #self.main_layout.addWidget(self.films)
        #self.main_layout.addWidget(self.btn_widget)
        self.main_layout.addWidget(self.splitterV, 0, 1, 15, 1)

        self.splitterV.addWidget(self.title)
        self.splitterV.addWidget(self.scrollWidget)
        self.splitterV.setHandleWidth(1)

        self.setCentralWidget(self.main_widget)

        self.setStyleSheet("""
                    #main{background-image: url(images/back1.jpg);background-attachment: fixed;}
                    QScrollArea { background: transparent; }
                    QScrollArea > QWidget > QWidget { background: transparent; }
                    #id{font:15px;color:white;}
                    QPushButton {font:20px;
                                width: 70px;
                                height: 30px;
                                color:white;
                                background-color:rgba(0,0,0,0.3);}
                    #title, #inform {font: 20px; color:white;
                            background-color:rgba(0,0,0,0.3);}
                    #style-label{font: 20px; color:white;}

                    QSplitter::handle{background-color: transparent;}

                    QScrollBar:vertical {
                            border: 1px solid #999999;
                            background:white;
                            width:10px;
                            margin: 15px 0px 15px 0px;
                      }

                      QScrollBar::handle:vertical {
                                background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
                               stop: 0  rgb(69,81,104),  stop:1 rgb(2,19,25));
                              min-height: 10px;
                      }

                      QScrollBar::add-line:vertical {
                        background: none;
                                    height:15 px;
                                   subcontrol-position: bottom;
                                    subcontrol-origin: margin;
                      }

                      QScrollBar::sub-line:vertical {
                                background: none;
                                height: 15px;
                                subcontrol-position: top;
                                subcontrol-origin: margin;
                      }

                      QScrollBar::up-arrow:vertical {
                        image:url('images/up.png');
                        height: 15px;
                        width: 15px
                      }

                      QScrollBar::down-arrow:vertical {
                        image:url('images/down.png');
                        height: 15px;
                        width: 15px
                      }
                           """)
Ejemplo n.º 16
0
 def make_splitter(orientation, *widgets):
     spl = QSplitter(orientation, self)
     for w in widgets:
         spl.addWidget(w)
     return spl
Ejemplo n.º 17
0
    def __InitView(self):
        '''
                  初始化界面
        '''
        self.setFixedSize(640, 480)
        self.setWindowTitle("PaintBoard Example PyQt5")

        #新建一个水平布局作为本窗体的主布局
        main_layout = QHBoxLayout(self)
        #设置主布局内边距以及控件间距为10px
        main_layout.setSpacing(10)

        #在主界面左侧放置画板
        main_layout.addWidget(self.__paintBoard)

        #新建垂直子布局用于放置按键
        sub_layout = QVBoxLayout()

        #设置此子布局和内部控件的间距为10px
        sub_layout.setContentsMargins(10, 10, 10, 10)

        self.__btn_Clear = QPushButton("清空画板")
        self.__btn_Clear.setParent(self)  #设置父对象为本界面
        self.__btn_Clear.clicked.connect(self.on_clear)  #将按键按下信号与画板清空函数相关联
        sub_layout.addWidget(self.__btn_Clear)

        self.__btn_Save = QPushButton("识别")
        self.__btn_Save.setParent(self)
        self.__btn_Save.clicked.connect(self.on_btn_Save_Clicked)
        sub_layout.addWidget(self.__btn_Save)

        self.__text_predict = QLineEdit(self)
        sub_layout.addWidget(self.__text_predict)

        self.__cbtn_Eraser = QCheckBox("  使用橡皮擦")
        self.__cbtn_Eraser.setParent(self)
        self.__cbtn_Eraser.clicked.connect(self.on_cbtn_Eraser_clicked)
        sub_layout.addWidget(self.__cbtn_Eraser)

        splitter = QSplitter(self)  #占位符
        sub_layout.addWidget(splitter)

        self.__btn_Quit = QPushButton("退出")
        self.__btn_Quit.setParent(self)  #设置父对象为本界面
        self.__btn_Quit.clicked.connect(self.Quit)
        sub_layout.addWidget(self.__btn_Quit)

        self.__label_penThickness = QLabel(self)
        self.__label_penThickness.setText("画笔粗细")
        self.__label_penThickness.setFixedHeight(20)
        sub_layout.addWidget(self.__label_penThickness)

        self.__spinBox_penThickness = QSpinBox(self)
        self.__spinBox_penThickness.setMaximum(20)
        self.__spinBox_penThickness.setMinimum(2)
        self.__spinBox_penThickness.setValue(10)  #默认粗细为10
        self.__spinBox_penThickness.setSingleStep(2)  #最小变化值为2
        self.__spinBox_penThickness.valueChanged.connect(
            self.on_PenThicknessChange
        )  #关联spinBox值变化信号和函数on_PenThicknessChange
        sub_layout.addWidget(self.__spinBox_penThickness)

        self.__label_penColor = QLabel(self)
        self.__label_penColor.setText("画笔颜色")
        self.__label_penColor.setFixedHeight(20)
        sub_layout.addWidget(self.__label_penColor)

        self.__comboBox_penColor = QComboBox(self)
        self.__fillColorList(self.__comboBox_penColor)  #用各种颜色填充下拉列表
        self.__comboBox_penColor.currentIndexChanged.connect(
            self.on_PenColorChange)  #关联下拉列表的当前索引变更信号与函数on_PenColorChange
        sub_layout.addWidget(self.__comboBox_penColor)

        main_layout.addLayout(sub_layout)  #将子布局加入主布局
Ejemplo n.º 18
0
    def __init__(self, *args, **kwargs):
        super(VarietyDataUI, self).__init__(*args, **kwargs)
        main_layout = QHBoxLayout()
        main_layout.setContentsMargins(QMargins(0, 0, 0, 0))
        main_splitter = QSplitter(self)

        self.variety_tree = VarietyTree()
        main_splitter.addWidget(self.variety_tree)

        # 右侧Tab
        self.tab = QTabWidget(self)
        self.tab.setDocumentMode(True)
        self.tab.setTabShape(QTabWidget.Triangular)
        # 数据列表
        self.sheet_table = QTableWidget(self)
        self.sheet_table.setFrameShape(QFrame.NoFrame)
        self.sheet_table.setFocusPolicy(Qt.NoFocus)
        self.sheet_table.verticalHeader().hide()
        self.sheet_table.setEditTriggers(QHeaderView.NoEditTriggers)
        self.sheet_table.setSelectionMode(QAbstractItemView.SingleSelection)
        self.sheet_table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.sheet_table.setAlternatingRowColors(True)

        self.sheet_table.setColumnCount(5)
        self.sheet_table.setHorizontalHeaderLabels(
            ["序号", "标题", "数据起始", "数据结束", "图形"])
        self.sheet_table.verticalHeader().setDefaultSectionSize(
            25)  # 设置行高(与下行代码同时才生效)
        self.sheet_table.verticalHeader().setMinimumSectionSize(25)
        self.sheet_table.horizontalHeader().setSectionResizeMode(
            0, QHeaderView.ResizeToContents)
        self.sheet_table.horizontalHeader().setSectionResizeMode(
            4, QHeaderView.ResizeToContents)
        self.sheet_table.horizontalHeader().setSectionResizeMode(
            1, QHeaderView.Stretch)
        # 图形列表
        self.chart_container = QWebEngineView(self)

        self.tab.addTab(self.chart_container, "图形库")
        self.tab.addTab(self.sheet_table, "数据库")

        main_splitter.addWidget(self.tab)

        main_splitter.setStretchFactor(1, 4)
        main_splitter.setStretchFactor(2, 6)

        main_splitter.setHandleWidth(1)

        main_layout.addWidget(main_splitter)
        self.setLayout(main_layout)

        self.tab.tabBar().setObjectName("tabBar")
        self.sheet_table.setObjectName("sheetTable")
        self.sheet_table.horizontalHeader().setStyleSheet(
            "QHeaderView::section{background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,"
            "stop:0 #34adf3, stop: 0.5 #ccddff,stop: 0.6 #ccddff, stop:1 #34adf3);"
            "border:1px solid rgb(201,202,202);border-left:none;"
            "min-height:25px;min-width:40px;font-weight:bold;font-size:13px};")
        self.setStyleSheet(
            "#tabBar::tab{min-height:20px;}"
            "#sheetTable{background-color:rgb(240,240,240);font-size:12px;"
            "selection-background-color:qlineargradient(x1:0,y1:0, x2:0, y2:1,"
            "stop:0 #cccccc,stop:0.5 white,stop:0.6 white,stop: 1 #cccccc);"
            "alternate-background-color:rgb(245,250,248);}")
Ejemplo n.º 19
0
    def __init__(self, parent = None):
        QMainWindow.__init__(self, parent)
        # 采集类型  0:未选择类型  1:列表或表格  2:列表详情  3:单页采集
        self.acq_type = 0

        self.split = QSplitter(self)
        self.split.setOrientation(Qt.Horizontal)
        self.setCentralWidget(self.split)

        self.step_widget = QWidget(self.split)
        self.step_widget_layout = QHBoxLayout()
        self.step_widget_layout.setAlignment(Qt.AlignRight)
        self.step_widget.setLayout(self.step_widget_layout)

        self.basic_info = My_Label_TWO(1,self)
        self.basic_info.setText("设置基本信息")
        # self.basic_info.setPixmap(QPixmap('../images/step-1.png'))
        m = QMovie('../images/s-step-1.gif')
        self.basic_info.setMovie(m)
        m.start()
        self.site_type = My_Label_TWO(2,self)
        self.site_type.setText("设置网页类型")
        self.site_type.setMovie(m)
        self.site_type.setPixmap(QPixmap('../images/step-2.png'))

        self.no_singel_widget = QWidget(self.step_widget)
        self.no_singel_widget.setFixedHeight(40)
        self.no_singel_widget_layout = QHBoxLayout()
        self.no_singel_widget.setLayout(self.no_singel_widget_layout)

        self.singel_widget = QWidget(self.step_widget)
        self.singel_widget_layout = QHBoxLayout(self.step_widget)
        self.singel_widget.setFixedHeight(40)
        # self.singel_widget_layout.setSpacing(0)
        self.singel_widget_layout.addSpacing(0)
        self.singel_widget.setContentsMargins(0,0,0,0)
        self.singel_widget_layout.setAlignment(Qt.AlignLeft)
        self.singel_widget.setLayout(self.singel_widget_layout)

        self.navi = My_Label_TWO(3,self)
        self.navi.setText("设置列表")
        self.navi.setPixmap(QPixmap('../images/step-3.png'))
        self.flip = My_Label_TWO(4,self)
        self.flip.setText("翻页")
        self.flip.setPixmap(QPixmap('../images/step-4.png'))
        self.field = My_Label_TWO(5,self)
        self.field.setText("设置字段")
        self.field.setPixmap(QPixmap('../images/step-5.png'))
        self.finish = My_Label_TWO(6,self)
        self.finish.setText("完成")
        self.finish.setPixmap(QPixmap('../images/step-7.png'))


        self.single_field = My_Label_TWO(3,self.singel_widget)
        self.single_field.setText("设置字段")
        self.single_field.setPixmap(QPixmap('../images/step-5.png'))
        self.single_filp = My_Label_TWO(4,self.singel_widget)
        self.single_filp.setText("翻页")
        self.single_filp.setPixmap(QPixmap('../images/step-4.png'))
        self.single_finish = My_Label_TWO(5,self.singel_widget)
        self.single_finish.setText("完成")
        self.single_finish.setPixmap(QPixmap('../images/step-7.png'))



        self.no_singel_widget_layout.addWidget(self.navi)
        self.no_singel_widget_layout.addWidget(self.flip)
        self.no_singel_widget_layout.addWidget(self.field)
        self.no_singel_widget_layout.addWidget(self.finish)
        self.no_singel_widget.hide()

        self.singel_widget_layout.addWidget(self.single_field)
        self.singel_widget_layout.addWidget(self.single_filp)
        self.singel_widget_layout.addWidget(self.single_finish)
        self.singel_widget.hide()

        self.step_widget_layout.addWidget(self.basic_info)
        self.step_widget_layout.addWidget(self.site_type)
        self.step_widget_layout.addWidget(self.no_singel_widget)
        self.step_widget_layout.addWidget(self.singel_widget)



        self.split.addWidget(self.step_widget)
Ejemplo n.º 20
0
    def __init__(self, persepolis_setting):
        super().__init__()
        # MainWindow
        self.persepolis_setting = persepolis_setting

        # add support for other languages
        locale = str(self.persepolis_setting.value('settings/locale'))
        QLocale.setDefault(QLocale(locale))
        self.translator = QTranslator()
        if self.translator.load(':/translations/locales/ui_' + locale, 'ts'):
            QCoreApplication.installTranslator(self.translator)


        # set ui direction
        ui_direction = self.persepolis_setting.value('ui_direction')

        if ui_direction == 'rtl':
            self.setLayoutDirection(Qt.RightToLeft)
        
        elif ui_direction in 'ltr':
            self.setLayoutDirection(Qt.LeftToRight)



        icons = ':/' + \
            str(self.persepolis_setting.value('settings/icons')) + '/'

        self.setWindowTitle(QCoreApplication.translate("mainwindow_ui_tr", "Persepolis Download Manager"))
        self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/persepolis.svg')))

        self.centralwidget = QWidget(self)
        self.verticalLayout = QVBoxLayout(self.centralwidget)

        # enable drag and drop
        self.setAcceptDrops(True)

        # frame
        self.frame = QFrame(self.centralwidget)

        # download_table_horizontalLayout
        download_table_horizontalLayout = QHBoxLayout()
        horizontal_splitter = QSplitter(Qt.Horizontal)

        vertical_splitter = QSplitter(Qt.Vertical)

        # category_tree
        self.category_tree_qwidget = QWidget(self)
        category_tree_verticalLayout = QVBoxLayout()
        self.category_tree = CategoryTreeView(self)
        category_tree_verticalLayout.addWidget(self.category_tree)

        self.category_tree_model = QStandardItemModel()
        self.category_tree.setModel(self.category_tree_model)
        category_table_header = [QCoreApplication.translate("mainwindow_ui_tr", 'Category')]

        self.category_tree_model.setHorizontalHeaderLabels(
            category_table_header)
        self.category_tree.header().setStretchLastSection(True)

        self.category_tree.header().setDefaultAlignment(Qt.AlignCenter)
        
        # queue_panel
        self.queue_panel_widget = QWidget(self)

        queue_panel_verticalLayout_main = QVBoxLayout(self.queue_panel_widget)

        # queue_panel_show_button
        self.queue_panel_show_button = QPushButton(self)

        queue_panel_verticalLayout_main.addWidget(self.queue_panel_show_button)

        # queue_panel_widget_frame
        self.queue_panel_widget_frame = QFrame(self)
        self.queue_panel_widget_frame.setFrameShape(QFrame.StyledPanel)
        self.queue_panel_widget_frame.setFrameShadow(QFrame.Raised)

        queue_panel_verticalLayout_main.addWidget(
            self.queue_panel_widget_frame)

        queue_panel_verticalLayout = QVBoxLayout(self.queue_panel_widget_frame)
        queue_panel_verticalLayout_main.setContentsMargins(50, -1, 50, -1)

        # start_end_frame
        self.start_end_frame = QFrame(self)

        # start time
        start_verticalLayout = QVBoxLayout(self.start_end_frame)
        self.start_checkBox = QCheckBox(self)
        start_verticalLayout.addWidget(self.start_checkBox)

        self.start_frame = QFrame(self)
        self.start_frame.setFrameShape(QFrame.StyledPanel)
        self.start_frame.setFrameShadow(QFrame.Raised)

        start_frame_verticalLayout = QVBoxLayout(self.start_frame)

        self.start_time_qDataTimeEdit = QDateTimeEdit(self.start_frame)
        self.start_time_qDataTimeEdit.setDisplayFormat('H:mm')
        start_frame_verticalLayout.addWidget(self.start_time_qDataTimeEdit)
  
        start_verticalLayout.addWidget(self.start_frame)

        # end time
        self.end_checkBox = QCheckBox(self)
        start_verticalLayout.addWidget(self.end_checkBox)

        self.end_frame = QFrame(self)
        self.end_frame.setFrameShape(QFrame.StyledPanel)
        self.end_frame.setFrameShadow(QFrame.Raised)

        end_frame_verticalLayout = QVBoxLayout(self.end_frame)

        self.end_time_qDateTimeEdit = QDateTimeEdit(self.end_frame)
        self.end_time_qDateTimeEdit.setDisplayFormat('H:mm')
        end_frame_verticalLayout.addWidget(self.end_time_qDateTimeEdit)
 
        start_verticalLayout.addWidget(self.end_frame)

        self.reverse_checkBox = QCheckBox(self)
        start_verticalLayout.addWidget(self.reverse_checkBox)

        queue_panel_verticalLayout.addWidget(self.start_end_frame)

        # limit_after_frame
        self.limit_after_frame = QFrame(self)

        # limit_checkBox
        limit_verticalLayout = QVBoxLayout(self.limit_after_frame)
        self.limit_checkBox = QCheckBox(self)
        limit_verticalLayout.addWidget(self.limit_checkBox)

        # limit_frame
        self.limit_frame = QFrame(self)
        self.limit_frame.setFrameShape(QFrame.StyledPanel)
        self.limit_frame.setFrameShadow(QFrame.Raised)
        limit_verticalLayout.addWidget(self.limit_frame)

        limit_frame_verticalLayout = QVBoxLayout(self.limit_frame)

        # limit_spinBox
        limit_frame_horizontalLayout = QHBoxLayout()
        self.limit_spinBox = QDoubleSpinBox(self)
        self.limit_spinBox.setMinimum(1)
        self.limit_spinBox.setMaximum(1023)
        limit_frame_horizontalLayout.addWidget(self.limit_spinBox)

        # limit_comboBox
        self.limit_comboBox = QComboBox(self)
        self.limit_comboBox.addItem("")
        self.limit_comboBox.addItem("")
        limit_frame_horizontalLayout.addWidget(self.limit_comboBox)
        limit_frame_verticalLayout.addLayout(limit_frame_horizontalLayout)

        # limit_pushButton
        self.limit_pushButton = QPushButton(self)
        limit_frame_verticalLayout.addWidget(self.limit_pushButton)

        # after_checkBox
        self.after_checkBox = QCheckBox(self)
        limit_verticalLayout.addWidget(self.after_checkBox)

        # after_frame
        self.after_frame = QFrame(self)
        self.after_frame.setFrameShape(QFrame.StyledPanel)
        self.after_frame.setFrameShadow(QFrame.Raised)
        limit_verticalLayout.addWidget(self.after_frame)

        after_frame_verticalLayout = QVBoxLayout(self.after_frame)

        # after_comboBox
        self.after_comboBox = QComboBox(self)
        self.after_comboBox.addItem("")

        after_frame_verticalLayout.addWidget(self.after_comboBox)

        # after_pushButton
        self.after_pushButton = QPushButton(self)
        after_frame_verticalLayout.addWidget(self.after_pushButton)

        queue_panel_verticalLayout.addWidget(self.limit_after_frame)
        category_tree_verticalLayout.addWidget(self.queue_panel_widget)

        # keep_awake_checkBox
        self.keep_awake_checkBox = QCheckBox(self)
        queue_panel_verticalLayout.addWidget(self.keep_awake_checkBox)

        self.category_tree_qwidget.setLayout(category_tree_verticalLayout)
        horizontal_splitter.addWidget(self.category_tree_qwidget)

        # download table widget
        self.download_table_content_widget = QWidget(self)
        download_table_content_widget_verticalLayout = QVBoxLayout(
            self.download_table_content_widget)

       
        # download_table
        self.download_table = DownloadTableWidget(self)
        vertical_splitter.addWidget(self.download_table)

        horizontal_splitter.addWidget(self.download_table_content_widget)

        self.download_table.setColumnCount(13)
        self.download_table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.download_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.download_table.verticalHeader().hide()

        # hide gid and download dictioanry section
        self.download_table.setColumnHidden(8, True)
        self.download_table.setColumnHidden(9, True)

        download_table_header = [QCoreApplication.translate("mainwindow_ui_tr", 'File Name'), QCoreApplication.translate("mainwindow_ui_tr",'Status'), QCoreApplication.translate("mainwindow_ui_tr", 'Size'), QCoreApplication.translate("mainwindow_ui_tr", 'Downloaded'), QCoreApplication.translate("mainwindow_ui_tr", 'Percentage'), QCoreApplication.translate("mainwindow_ui_tr", 'Connections'),
                                 QCoreApplication.translate("mainwindow_ui_tr", 'Transfer rate'), QCoreApplication.translate("mainwindow_ui_tr",'Estimated time left'), 'Gid', QCoreApplication.translate("mainwindow_ui_tr",'Link'), QCoreApplication.translate("mainwindow_ui_tr", 'First try date'), QCoreApplication.translate("mainwindow_ui_tr", 'Last try date'), QCoreApplication.translate("mainwindow_ui_tr",'Category')]

        self.download_table.setHorizontalHeaderLabels(download_table_header)

        # fixing the size of download_table when window is Maximized!
        self.download_table.horizontalHeader().setSectionResizeMode(0)
        self.download_table.horizontalHeader().setStretchLastSection(True)

        horizontal_splitter.setStretchFactor(0, 3) # category_tree width
        horizontal_splitter.setStretchFactor(1, 10)  # ratio of tables's width


        # video_finder_widget
        self.video_finder_widget = QWidget(self)
        video_finder_horizontalLayout = QHBoxLayout(self.video_finder_widget)

        self.muxing_pushButton = QPushButton(self)
        self.muxing_pushButton.setIcon(QIcon(icons + 'video_finder'))
        video_finder_horizontalLayout.addWidget(self.muxing_pushButton)
        video_finder_horizontalLayout.addSpacing(20)

        video_audio_verticalLayout = QVBoxLayout()

        self.video_label = QLabel(self)
        video_audio_verticalLayout.addWidget(self.video_label)

        self.audio_label = QLabel(self)
        video_audio_verticalLayout.addWidget(self.audio_label)
        video_finder_horizontalLayout.addLayout(video_audio_verticalLayout)

        status_muxing_verticalLayout = QVBoxLayout()

        self.video_finder_status_label = QLabel(self)
        status_muxing_verticalLayout.addWidget(self.video_finder_status_label)

        self.muxing_status_label = QLabel(self)
        status_muxing_verticalLayout.addWidget(self.muxing_status_label)
        video_finder_horizontalLayout.addLayout(status_muxing_verticalLayout)

        vertical_splitter.addWidget(self.video_finder_widget)

        download_table_content_widget_verticalLayout.addWidget(vertical_splitter)


        download_table_horizontalLayout.addWidget(horizontal_splitter)

        self.frame.setLayout(download_table_horizontalLayout)

        self.verticalLayout.addWidget(self.frame)

        self.setCentralWidget(self.centralwidget)

        # menubar
        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 600, 24))
        self.setMenuBar(self.menubar)
        fileMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&File'))
        editMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Edit'))
        viewMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&View'))
        downloadMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Download'))
        queueMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Queue'))
        videoFinderMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'V&ideo Finder'))
        helpMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Help'))


        # viewMenu submenus
        sortMenu = viewMenu.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Sort by'))

        # statusbar
        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.statusbar.showMessage(QCoreApplication.translate("mainwindow_ui_tr", "Persepolis Download Manager"))

        # toolBar
        self.toolBar2 = QToolBar(self)
        self.addToolBar(Qt.TopToolBarArea, self.toolBar2)
        self.toolBar2.setWindowTitle(QCoreApplication.translate("mainwindow_ui_tr", 'Menu'))
        self.toolBar2.setFloatable(False)
        self.toolBar2.setMovable(False)

        self.toolBar = QToolBar(self)
        self.addToolBar(Qt.TopToolBarArea, self.toolBar)
        self.toolBar.setWindowTitle(QCoreApplication.translate("mainwindow_ui_tr", 'Toolbar'))
        self.toolBar.setFloatable(False)
        self.toolBar.setMovable(False)


        #toolBar and menubar and actions
        self.persepolis_setting.beginGroup('settings/shortcuts')

        # videoFinderAddLinkAction
        self.videoFinderAddLinkAction = QAction(QIcon(icons + 'video_finder'), QCoreApplication.translate("mainwindow_ui_tr", 'Find Video Links'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Download video or audio from Youtube, Vimeo, etc...'),
                                            triggered=self.showVideoFinderAddLinkWindow)

        self.videoFinderAddLinkAction_shortcut = QShortcut(self.persepolis_setting.value('video_finder_shortcut'), self, self.showVideoFinderAddLinkWindow)

        videoFinderMenu.addAction(self.videoFinderAddLinkAction)

        # stopAllAction
        self.stopAllAction = QAction(QIcon(icons + 'stop_all'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop all active downloads'),
                                     self, statusTip='Stop all active downloads', triggered=self.stopAllDownloads)
        downloadMenu.addAction(self.stopAllAction)

        # sort_file_name_Action
        self.sort_file_name_Action = QAction(
            QCoreApplication.translate("mainwindow_ui_tr", 'File name'), self, triggered=self.sortByName)
        sortMenu.addAction(self.sort_file_name_Action)

        # sort_file_size_Action
        self.sort_file_size_Action = QAction(
            QCoreApplication.translate("mainwindow_ui_tr", 'File size'), self, triggered=self.sortBySize)
        sortMenu.addAction(self.sort_file_size_Action)

        # sort_first_try_date_Action
        self.sort_first_try_date_Action = QAction(
            QCoreApplication.translate("mainwindow_ui_tr", 'First try date'), self, triggered=self.sortByFirstTry)
        sortMenu.addAction(self.sort_first_try_date_Action)

        # sort_last_try_date_Action
        self.sort_last_try_date_Action = QAction(
            QCoreApplication.translate("mainwindow_ui_tr", 'Last try date'), self, triggered=self.sortByLastTry)
        sortMenu.addAction(self.sort_last_try_date_Action)

        # sort_download_status_Action
        self.sort_download_status_Action = QAction(
            QCoreApplication.translate("mainwindow_ui_tr", 'Download status'), self, triggered=self.sortByStatus)
        sortMenu.addAction(self.sort_download_status_Action)

        # trayAction
        self.trayAction = QAction(QCoreApplication.translate("mainwindow_ui_tr", 'Show system tray icon'), self,
                                  statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Show/Hide system tray icon"), triggered=self.showTray)
        self.trayAction.setCheckable(True)
        viewMenu.addAction(self.trayAction)

        # showMenuBarAction
        self.showMenuBarAction = QAction(
            QCoreApplication.translate("mainwindow_ui_tr", 'Show menubar'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Show menubar'), triggered=self.showMenuBar)
        self.showMenuBarAction.setCheckable(True)
        viewMenu.addAction(self.showMenuBarAction)

        # showSidePanelAction
        self.showSidePanelAction = QAction(
            QCoreApplication.translate("mainwindow_ui_tr", 'Show side panel'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Show side panel'), triggered=self.showSidePanel)
        self.showSidePanelAction.setCheckable(True)
        viewMenu.addAction(self.showSidePanelAction)

        # minimizeAction
        self.minimizeAction = QAction(QIcon(icons + 'minimize'), QCoreApplication.translate("mainwindow_ui_tr", 'Minimize to system tray'), self,
                                      statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Minimize to system tray"), triggered=self.minMaxTray)

        self.minimizeAction_shortcut = QShortcut(self.persepolis_setting.value('hide_window_shortcut'), self, self.minMaxTray)
        viewMenu.addAction(self.minimizeAction)

        # addlinkAction
        self.addlinkAction = QAction(QIcon(icons + 'add'), QCoreApplication.translate("mainwindow_ui_tr", 'Add New Download Link'), self,
                                     statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Add New Download Link"), triggered=self.addLinkButtonPressed)

        self.addlinkAction_shortcut = QShortcut(self.persepolis_setting.value('add_new_download_shortcut'), self, self.addLinkButtonPressed)
        fileMenu.addAction(self.addlinkAction)

        # importText
        self.addtextfileAction = QAction(QIcon(icons + 'file'), QCoreApplication.translate("mainwindow_ui_tr", 'Import links from text file'), self,
                                         statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Create a Text file and put links in it.line by line!'), triggered=self.importText)

        self.addtextfileAction_shortcut = QShortcut(self.persepolis_setting.value('import_text_shortcut'), self, self.importText)

        fileMenu.addAction(self.addtextfileAction)

        # resumeAction
        self.resumeAction = QAction(QIcon(icons + 'play'), QCoreApplication.translate("mainwindow_ui_tr", 'Resume Download'), self,
                                    statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Resume Download"), triggered=self.resumeButtonPressed)

        downloadMenu.addAction(self.resumeAction)

        # pauseAction
        self.pauseAction = QAction(QIcon(icons + 'pause'), QCoreApplication.translate("mainwindow_ui_tr", 'Pause Download'), self,
                                   statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Pause Download"), triggered=self.pauseButtonPressed)

        downloadMenu.addAction(self.pauseAction)

        # stopAction
        self.stopAction = QAction(QIcon(icons + 'stop'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop Download'), self,
                                  statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Stop/Cancel Download"), triggered=self.stopButtonPressed)

        downloadMenu.addAction(self.stopAction)

        # propertiesAction
        self.propertiesAction = QAction(QIcon(icons + 'setting'), QCoreApplication.translate("mainwindow_ui_tr", 'Properties'), self,
                                        statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Properties"), triggered=self.propertiesButtonPressed)

        downloadMenu.addAction(self.propertiesAction)

        # progressAction
        self.progressAction = QAction(QIcon(icons + 'window'), QCoreApplication.translate("mainwindow_ui_tr", 'Progress'), self,
                                      statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Progress"), triggered=self.progressButtonPressed)

        downloadMenu.addAction(self.progressAction)

        # openFileAction
        self.openFileAction = QAction(QIcon(
            icons + 'file'), QCoreApplication.translate("mainwindow_ui_tr", 'Open file'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open file'), triggered=self.openFile)
        fileMenu.addAction(self.openFileAction)

        
        # openDownloadFolderAction
        self.openDownloadFolderAction = QAction(QIcon(
            icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'Open download folder'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open download folder'), triggered=self.openDownloadFolder)

        fileMenu.addAction(self.openDownloadFolderAction)

        # openDefaultDownloadFolderAction
        self.openDefaultDownloadFolderAction = QAction(QIcon(
            icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'Open default download folder'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open default download folder'), triggered=self.openDefaultDownloadFolder)

        fileMenu.addAction(self.openDefaultDownloadFolderAction)

        # exitAction
        self.exitAction = QAction(QIcon(icons + 'exit'), QCoreApplication.translate("mainwindow_ui_tr", 'Exit'), self,
                                  statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Exit"), triggered=self.closeAction)

        self.exitAction_shortcut = QShortcut(self.persepolis_setting.value('quit_shortcut'), self, self.closeAction)

        fileMenu.addAction(self.exitAction)

        # clearAction
        self.clearAction = QAction(QIcon(icons + 'multi_remove'), QCoreApplication.translate("mainwindow_ui_tr", 'Clear download list'),
                                         self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Clear all items in download list'), triggered=self.clearDownloadList)
        editMenu.addAction(self.clearAction)

        # removeSelectedAction
        self.removeSelectedAction = QAction(QIcon(icons + 'remove'), QCoreApplication.translate("mainwindow_ui_tr", 'Remove selected downloads from list'),
                                            self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Remove selected downloads form list'), triggered=self.removeSelected)

        self.removeSelectedAction_shortcut = QShortcut(self.persepolis_setting.value('remove_shortcut'), self, self.removeSelected)

        editMenu.addAction(self.removeSelectedAction)
        self.removeSelectedAction.setEnabled(False)

        # deleteSelectedAction
        self.deleteSelectedAction = QAction(QIcon(icons + 'trash'), QCoreApplication.translate("mainwindow_ui_tr", 'Delete selected download files'),
                                            self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Delete selected download files'), triggered=self.deleteSelected)

        self.deleteSelectedAction_shortcut = QShortcut(self.persepolis_setting.value('delete_shortcut'), self, self.deleteSelected)

        editMenu.addAction(self.deleteSelectedAction)
        self.deleteSelectedAction.setEnabled(False)

        # moveSelectedDownloadsAction
        self.moveSelectedDownloadsAction = QAction(QIcon(icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'move selected download files to another destination'),
                                            self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'move selected download files to another destination'), triggered=self.moveSelectedDownloads)

        editMenu.addAction(self.moveSelectedDownloadsAction)
        self.moveSelectedDownloadsAction.setEnabled(False)



        # createQueueAction
        self.createQueueAction = QAction(QIcon(icons + 'add_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Create new queue'),
                                         self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Create new download queue'), triggered=self.createQueue)
        queueMenu.addAction(self.createQueueAction)

        # removeQueueAction
        self.removeQueueAction = QAction(QIcon(icons + 'remove_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Remove this queue'),
                                         self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Remove this queue'), triggered=self.removeQueue)
        queueMenu.addAction(self.removeQueueAction)

        # startQueueAction
        self.startQueueAction = QAction(QIcon(
            icons + 'start_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Start this queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Start this queue'), triggered=self.startQueue)

        queueMenu.addAction(self.startQueueAction)

        # stopQueueAction
        self.stopQueueAction = QAction(QIcon(
            icons + 'stop_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop this queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Stop this queue'), triggered=self.stopQueue)

        queueMenu.addAction(self.stopQueueAction)

        # moveUpSelectedAction
        self.moveUpSelectedAction = QAction(QIcon(icons + 'multi_up'), QCoreApplication.translate("mainwindow_ui_tr", 'Move up selected items'), self,
                                            statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Move currently selected items up by one row'), triggered=self.moveUpSelected)

        self.moveUpSelectedAction_shortcut = QShortcut(self.persepolis_setting.value('move_up_selection_shortcut'), self, self.moveUpSelected)

        queueMenu.addAction(self.moveUpSelectedAction)

        # moveDownSelectedAction
        self.moveDownSelectedAction = QAction(QIcon(icons + 'multi_down'), QCoreApplication.translate("mainwindow_ui_tr", 'Move down selected items'),
                                              self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Move currently selected items down by one row'), triggered=self.moveDownSelected)
        self.moveDownSelectedAction_shortcut = QShortcut(self.persepolis_setting.value('move_down_selection_shortcut'), self, self.moveDownSelected)

        queueMenu.addAction(self.moveDownSelectedAction)

        # preferencesAction
        self.preferencesAction = QAction(QIcon(icons + 'preferences'), QCoreApplication.translate("mainwindow_ui_tr", 'Preferences'),
                                         self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Preferences'), triggered=self.openPreferences, menuRole=5)
        editMenu.addAction(self.preferencesAction)

        # aboutAction
        self.aboutAction = QAction(QIcon(
            icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'About'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'About'), triggered=self.openAbout, menuRole=4)
        helpMenu.addAction(self.aboutAction)

        # issueAction
        self.issueAction = QAction(QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Report an issue'),
                                   self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Report an issue'), triggered=self.reportIssue)
        helpMenu.addAction(self.issueAction)

        # updateAction
        self.updateAction = QAction(QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Check for newer version'),
                                    self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Check for newer release'), triggered=self.newUpdate)
        helpMenu.addAction(self.updateAction)

        # logAction
        self.logAction = QAction(QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Show log file'),
                                   self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Help'), triggered=self.showLog)
        helpMenu.addAction(self.logAction)

        # helpAction
        self.helpAction = QAction(QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Help'),
                                   self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Help'), triggered=self.persepolisHelp)
        helpMenu.addAction(self.helpAction)

        self.persepolis_setting.endGroup()

        self.qmenu = MenuWidget(self)

        self.toolBar2.addWidget(self.qmenu)


# labels
        self.queue_panel_show_button.setText(QCoreApplication.translate("mainwindow_ui_tr", "Hide options"))
        self.start_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "Start Time"))

        self.end_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "End Time"))

        self.reverse_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "Download bottom of\n the list first"))

        self.limit_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "Limit Speed"))
        self.limit_comboBox.setItemText(0, "KiB/s")
        self.limit_comboBox.setItemText(1, "MiB/s")
        self.limit_pushButton.setText(QCoreApplication.translate("mainwindow_ui_tr", "Apply"))

        self.after_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "After download"))
        self.after_comboBox.setItemText(0, QCoreApplication.translate("mainwindow_ui_tr", "Shut Down"))

        self.keep_awake_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "Keep system awake!"))
        self.keep_awake_checkBox.setToolTip(
            QCoreApplication.translate("mainwindow_ui_tr", "<html><head/><body><p>This option is preventing system from going to sleep.\
            This is necessary if your power manager is suspending system automatically. </p></body></html>"))
 
        self.after_pushButton.setText(QCoreApplication.translate("mainwindow_ui_tr", "Apply"))

        self.muxing_pushButton.setText(QCoreApplication.translate("mainwindow_ui_tr", "start muxing"))

        self.video_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "<b>Video file status: </b>"))
        self.audio_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "<b>Audio file status: </b>"))

        self.video_finder_status_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "<b>Status: </b>"))
        self.muxing_status_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "<b>Muxing status: </b>"))
Ejemplo n.º 21
0
    def __init__(self):

        super(ImageViewer, self).__init__()

        pal = QPalette()
        pal.setColor(QPalette.Background, Qt.lightGray)

        self.factor = 3.0

        self.config = Config()
        self.currentRep = ""

        self.createActions()
        self.createToolbarMenus()
        #self.createMenus()

        self.browserFile()
        self.imgqLabel()
        self.boxSliders()

        self.verticalLayout = QVBoxLayout(self)
        self.horizontalLayout = QHBoxLayout(self)

        self.textInfo = QTextEdit()

        self.textInfoTop = QTextEdit()
        self.textInfoTop.setEnabled(True)
        self.textInfoTop.setSizePolicy(QSizePolicy.Expanding,
                                       QSizePolicy.Ignored)
        self.textInfoTop.setFontPointSize(11)
        self.textInfoTop.setStyleSheet("background-color: lightgray")
        #self.textInfoTop.adjustSize()
        self.textInfoTop.setText('Welcome to IRMaGe')

        self.tableJson = QTableWidget()
        self.tableJson.setColumnCount(2)
        self.tableJson.setColumnWidth(0, 150)
        self.tableJson.setColumnWidth(1, 400)
        self.tableJson.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContents)

        self.tableJson.setHorizontalHeaderLabels(['Keys', 'Values'])
        #self.tableJson.setBackgroundRole(QPalette.Light)

        self.scrollText = QScrollArea()
        self.scrollText.setBackgroundRole(QPalette.Dark)
        self.scrollText.setWidget(self.textInfoTop)
        self.scrollText.setWidgetResizable(True)
        #=======================================================================
        # self.adjustScrollBar(self.scrollText.horizontalScrollBar(), 1.0)
        # self.adjustScrollBar(self.scrollText.verticalScrollBar(), 2.0)
        #=======================================================================
        self.scrollTable = QScrollArea()
        self.scrollTable.setBackgroundRole(QPalette.Dark)
        self.scrollTable.setWidget(self.tableJson)
        self.scrollTable.setWidgetResizable(True)
        #=======================================================================
        # self.adjustScrollBar(self.scrollTable.horizontalScrollBar(), 2.0)
        # self.adjustScrollBar(self.scrollTable.verticalScrollBar(), 2.0)
        #=======================================================================

        self.headerTabData = [
            'Data', 'PatientName', 'StudyName', 'DateCreation', 'PatientSex',
            'PatientWeight', 'ProtocolName', 'SequenceName'
        ]

        self.tableData = TableDataBrower(self)
        self.tableData.setColumnCount(8)
        self.tableData.setRowCount(10)
        self.tableData.setColumnWidth(0, 200)
        self.tableData.setHorizontalHeaderLabels(self.headerTabData)
        self.tableData.setBackgroundRole(QPalette.Light)
        self.tableData.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContents)
        self.tableData.verticalHeader().hide()

        self.scrollBrowser = QScrollArea()
        self.scrollBrowser.setBackgroundRole(QPalette.Dark)
        self.scrollBrowser.setWidget(self.tableData)
        self.scrollBrowser.setWidgetResizable(True)

        self.splitter0 = QSplitter(Qt.Vertical)
        self.splitter0.addWidget(self.scrollText)
        self.splitter0.addWidget(self.scrollTable)

        self.scrollArea = QScrollArea()
        self.scrollArea.setBackgroundRole(QPalette.Dark)
        self.scrollArea.setWidget(self.imageLabel)
        self.scrollArea.setWidgetResizable(False)
        self.scrollArea.setAlignment(Qt.AlignCenter)

        self.adjustScrollBar(self.scrollArea.horizontalScrollBar(), 0.8)
        self.adjustScrollBar(self.scrollArea.verticalScrollBar(), 1.0)

        self.splitter1 = QSplitter(Qt.Horizontal)
        self.splitter1.addWidget(self.splitter0)
        self.splitter1.addWidget(self.scrollArea)
        self.splitter1.addWidget(self.layoutSlide)

        self.splitter3 = QSplitter(Qt.Horizontal)
        self.splitter3.addWidget(self.browser)
        self.splitter3.addWidget(self.scrollBrowser)

        self.splitter2 = QSplitter(Qt.Vertical)
        self.splitter2.addWidget(self.splitter1)
        self.splitter2.addWidget(self.splitter3)
        self.splitter2.setHandleWidth(15)
        #=======================================================================
        # self.splitter2.
        #=======================================================================

        self.verticalLayout.addWidget(self.menuToolBar)
        self.verticalLayout.addWidget(self.splitter2)

        self.setWindowTitle("MRImage Viewer (IRMaGe)")
        self.resize(800, 600)

        self.setAutoFillBackground(True)
        self.setPalette(pal)
Ejemplo n.º 22
0
    def __init__(self, app, *__args):
        super().__init__(app)
        self.app = app

        self.app.dwarf.onJavaTraceEvent.connect(self.on_event)
        self.app.dwarf.onEnumerateJavaClassesStart.connect(self.on_enumeration_start)
        self.app.dwarf.onEnumerateJavaClassesMatch.connect(self.on_enumeration_match)
        self.app.dwarf.onEnumerateJavaClassesComplete.connect(self.on_enumeration_complete)

        self.tracing = False
        self.trace_classes = []
        self.trace_depth = 0

        layout = QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)

        self._record_icon = QIcon(utils.resource_path('assets/icons/record.png'))
        self._pause_icon = QIcon(utils.resource_path('assets/icons/pause.png'))
        self._stop_icon = QIcon(utils.resource_path('assets/icons/stop.png'))

        self._tool_bar = QToolBar()
        self._tool_bar.addAction('Start', self.start_trace)
        self._tool_bar.addAction('Pause', self.pause_trace)
        self._tool_bar.addAction('Stop', self.stop_trace)
        self._tool_bar.addSeparator()
        self._entries_lbl = QLabel('Entries: 0')
        self._entries_lbl.setStyleSheet('color: #ef5350;')
        self._entries_lbl.setContentsMargins(10, 0, 10, 2)
        self._entries_lbl.setAttribute(Qt.WA_TranslucentBackground, True) # keep this
        self._entries_lbl.setAlignment(Qt.AlignRight| Qt.AlignVCenter)
        self._entries_lbl.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
        self._tool_bar.addWidget(self._entries_lbl)

        layout.addWidget(self._tool_bar)

        self.setup_splitter = QSplitter()
        self.events_list = JavaTraceView(self)
        self.events_list.setVisible(False)

        self.trace_list = QListWidget()
        self.class_list = QListWidget()

        self.trace_list.itemDoubleClicked.connect(self.trace_list_double_click)

        self.class_list.setContextMenuPolicy(Qt.CustomContextMenu)
        self.class_list.customContextMenuRequested.connect(self.show_class_list_menu)
        self.class_list.itemDoubleClicked.connect(self.class_list_double_click)

        self.current_class_search = ''

        bar = QScrollBar()
        bar.setFixedWidth(0)
        bar.setFixedHeight(0)
        self.trace_list.setHorizontalScrollBar(bar)
        bar = QScrollBar()
        bar.setFixedWidth(0)
        bar.setFixedHeight(0)
        self.class_list.setHorizontalScrollBar(bar)

        self.setup_splitter.addWidget(self.trace_list)
        self.setup_splitter.addWidget(self.class_list)

        layout.addWidget(self.setup_splitter)
        layout.addWidget(self.events_list)

        self.setLayout(layout)
Ejemplo n.º 23
0
    def __init__(self, panel):
        super(Widget, self).__init__(panel)

        layout = QVBoxLayout()
        self.setLayout(layout)
        layout.setSpacing(0)

        self.searchEntry = SearchLineEdit()
        self.treeView = QTreeView(contextMenuPolicy=Qt.CustomContextMenu)
        self.textView = QTextBrowser()

        applyButton = QToolButton(autoRaise=True)
        editButton = QToolButton(autoRaise=True)
        addButton = QToolButton(autoRaise=True)
        self.menuButton = QPushButton(flat=True)
        menu = QMenu(self.menuButton)
        self.menuButton.setMenu(menu)

        splitter = QSplitter(Qt.Vertical)
        top = QHBoxLayout()
        layout.addLayout(top)
        splitter.addWidget(self.treeView)
        splitter.addWidget(self.textView)
        layout.addWidget(splitter)
        splitter.setSizes([200, 100])
        splitter.setCollapsible(0, False)

        top.addWidget(self.searchEntry)
        top.addWidget(applyButton)
        top.addSpacing(10)
        top.addWidget(addButton)
        top.addWidget(editButton)
        top.addWidget(self.menuButton)

        # action generator for actions added to search entry
        def act(slot, icon=None):
            a = QAction(self, triggered=slot)
            self.addAction(a)
            a.setShortcutContext(Qt.WidgetWithChildrenShortcut)
            icon and a.setIcon(icons.get(icon))
            return a

        # hide if ESC pressed in lineedit
        a = act(self.slotEscapePressed)
        a.setShortcut(QKeySequence(Qt.Key_Escape))

        # import action
        a = self.importAction = act(self.slotImport, 'document-open')
        menu.addAction(a)

        # export action
        a = self.exportAction = act(self.slotExport, 'document-save-as')
        menu.addAction(a)

        # apply button
        a = self.applyAction = act(self.slotApply, 'edit-paste')
        applyButton.setDefaultAction(a)
        menu.addSeparator()
        menu.addAction(a)

        # add button
        a = self.addAction_ = act(self.slotAdd, 'list-add')
        a.setShortcut(QKeySequence(Qt.Key_Insert))
        addButton.setDefaultAction(a)
        menu.addSeparator()
        menu.addAction(a)

        # edit button
        a = self.editAction = act(self.slotEdit, 'document-edit')
        a.setShortcut(QKeySequence(Qt.Key_F2))
        editButton.setDefaultAction(a)
        menu.addAction(a)

        # set shortcut action
        a = self.shortcutAction = act(
            self.slotShortcut, 'preferences-desktop-keyboard-shortcuts')
        menu.addAction(a)

        # delete action
        a = self.deleteAction = act(self.slotDelete, 'list-remove')
        a.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Delete))
        menu.addAction(a)

        # restore action
        a = self.restoreAction = act(self.slotRestore)
        menu.addSeparator()
        menu.addAction(a)

        # help button
        a = self.helpAction = act(self.slotHelp, 'help-contents')
        menu.addSeparator()
        menu.addAction(a)

        self.treeView.setSelectionBehavior(QTreeView.SelectRows)
        self.treeView.setSelectionMode(QTreeView.ExtendedSelection)
        self.treeView.setRootIsDecorated(False)
        self.treeView.setAllColumnsShowFocus(True)
        self.treeView.setModel(model.model())
        self.treeView.setCurrentIndex(QModelIndex())

        # signals
        self.searchEntry.returnPressed.connect(self.slotReturnPressed)
        self.searchEntry.textChanged.connect(self.updateFilter)
        self.treeView.doubleClicked.connect(self.slotDoubleClicked)
        self.treeView.customContextMenuRequested.connect(self.showContextMenu)
        self.treeView.selectionModel().currentChanged.connect(self.updateText)
        self.treeView.model().dataChanged.connect(self.updateFilter)

        # highlight text
        self.highlighter = highlight.Highlighter(self.textView.document())

        # complete on snippet variables
        self.searchEntry.setCompleter(
            QCompleter([
                ':icon', ':indent', ':menu', ':name', ':python', ':selection',
                ':set', ':symbol', ':template', ':template-run'
            ], self.searchEntry))
        self.readSettings()
        app.settingsChanged.connect(self.readSettings)
        app.translateUI(self)
        self.updateColumnSizes()
        self.setAcceptDrops(True)
Ejemplo n.º 24
0
    def setupRightPanel(self):
        self.ServicesTabWidget = QTabWidget()
        self.ServicesTabWidget.setEnabled(True)
        self.sizePolicy2.setHeightForWidth(
            self.ServicesTabWidget.sizePolicy().hasHeightForWidth())
        self.ServicesTabWidget.setSizePolicy(self.sizePolicy2)
        self.ServicesTabWidget.setObjectName(_fromUtf8("ServicesTabWidget"))
        self.splitter.addWidget(self.ServicesTabWidget)

        ###

        self.splitter_3 = QSplitter()
        self.splitter_3.setOrientation(Qt.Horizontal)
        self.splitter_3.setObjectName(_fromUtf8("splitter_3"))
        self.splitter_3.setSizePolicy(
            self.sizePolicy2
        )  # this makes the tools tab stay the same width when resizing the window

        ###

        self.ToolHostsWidget = QWidget()
        self.ToolHostsWidget.setObjectName(_fromUtf8("ToolHostsTab"))
        self.ToolHostsLayout = QVBoxLayout(self.ToolHostsWidget)
        self.ToolHostsLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.ToolHostsTableView = QTableView(self.ToolHostsWidget)
        self.ToolHostsTableView.setObjectName(_fromUtf8("ServicesTableView"))
        self.ToolHostsLayout.addWidget(self.ToolHostsTableView)
        self.splitter_3.addWidget(self.ToolHostsWidget)

        self.DisplayWidget = QWidget()
        self.DisplayWidget.setObjectName('ToolOutput')
        self.DisplayWidget.setSizePolicy(self.sizePolicy2)
        #self.toolOutputTextView = QTextEdit(self.DisplayWidget)
        self.toolOutputTextView = QPlainTextEdit(self.DisplayWidget)
        self.toolOutputTextView.setReadOnly(True)
        self.DisplayWidgetLayout = QHBoxLayout(self.DisplayWidget)
        self.DisplayWidgetLayout.addWidget(self.toolOutputTextView)
        self.splitter_3.addWidget(self.DisplayWidget)

        self.ScreenshotWidget = ImageViewer()
        self.ScreenshotWidget.setObjectName('Screenshot')
        self.ScreenshotWidget.scrollArea.setSizePolicy(self.sizePolicy2)
        self.ScreenshotWidget.scrollArea.setContextMenuPolicy(
            Qt.CustomContextMenu)
        self.splitter_3.addWidget(self.ScreenshotWidget.scrollArea)

        self.splitter.addWidget(self.splitter_3)

        ###

        self.ServicesRightTab = QWidget()
        self.ServicesRightTab.setObjectName(_fromUtf8("ServicesRightTab"))
        self.verticalLayout = QVBoxLayout(self.ServicesRightTab)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.ServicesTableView = QTableView(self.ServicesRightTab)
        self.ServicesTableView.setObjectName(_fromUtf8("ServicesTableView"))
        self.verticalLayout.addWidget(self.ServicesTableView)
        self.ServicesTabWidget.addTab(self.ServicesRightTab, _fromUtf8(""))

        self.ScriptsTab = QWidget()
        self.ScriptsTab.setObjectName(_fromUtf8("ScriptsTab"))
        self.horizontalLayout_6 = QHBoxLayout(self.ScriptsTab)
        self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6"))

        self.splitter_4 = QSplitter(self.ScriptsTab)
        self.splitter_4.setOrientation(Qt.Horizontal)
        self.splitter_4.setObjectName(_fromUtf8("splitter_4"))

        self.ScriptsTableView = QTableView()
        self.ScriptsTableView.setObjectName(_fromUtf8("ScriptsTableView"))
        self.splitter_4.addWidget(self.ScriptsTableView)

        self.ScriptsOutputTextEdit = QPlainTextEdit()
        self.ScriptsOutputTextEdit.setObjectName(
            _fromUtf8("ScriptsOutputTextEdit"))
        self.ScriptsOutputTextEdit.setReadOnly(True)
        self.splitter_4.addWidget(self.ScriptsOutputTextEdit)
        self.horizontalLayout_6.addWidget(self.splitter_4)
        self.ServicesTabWidget.addTab(self.ScriptsTab, _fromUtf8(""))

        self.InformationTab = QWidget()
        self.InformationTab.setObjectName(_fromUtf8("InformationTab"))
        self.ServicesTabWidget.addTab(self.InformationTab, _fromUtf8(""))

        self.NotesTab = QWidget()
        self.NotesTab.setObjectName(_fromUtf8("NotesTab"))
        self.horizontalLayout_4 = QHBoxLayout(self.NotesTab)
        self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
        #self.NotesTextEdit = QTextEdit(self.NotesTab)
        self.NotesTextEdit = QPlainTextEdit(self.NotesTab)
        self.NotesTextEdit.setObjectName(_fromUtf8("NotesTextEdit"))
        self.horizontalLayout_4.addWidget(self.NotesTextEdit)
        self.ServicesTabWidget.addTab(self.NotesTab, _fromUtf8(""))
Ejemplo n.º 25
0
    def setup_window(self):
        #Dialogs
        self.Waterfall_Plot = WaterfallPlotter(self)
        self.Waterfall = Waterfall(self)
        self.Waterfall_Widget = QWidget()
        self.Waterfall_Box = QVBoxLayout()
        self.Waterfall_Splitter = QSplitter(QtCore.Qt.Horizontal)
        self.Waterfall_Splitter.addWidget(self.Waterfall)
        self.Waterfall_Splitter.addWidget(self.Waterfall_Plot)
        self.Waterfall_Box.addWidget(self.Waterfall_Splitter)
        self.Waterfall_Widget.setLayout(self.Waterfall_Box)

        self.Spider_Plot = SpiderPlotter(self)
        self.Spider = Spider(self)
        self.Spider_Widget = QWidget()
        self.Spider_Box = QVBoxLayout()
        self.Spider_Splitter = QSplitter(QtCore.Qt.Horizontal)
        self.Spider_Splitter.addWidget(self.Spider)
        self.Spider_Splitter.addWidget(self.Spider_Plot)
        self.Spider_Box.addWidget(self.Spider_Splitter)
        self.Spider_Widget.setLayout(self.Spider_Box)

        self.Swimmer_Plot = SwimmerPlotter(self)
        self.Swimmer = Swimmer(self)
        self.Swimmer_Widget = QWidget()
        self.Swimmer_Box = QVBoxLayout()
        self.Swimmer_Splitter = QSplitter(QtCore.Qt.Horizontal)
        self.Swimmer_Splitter.addWidget(self.Swimmer)
        self.Swimmer_Splitter.addWidget(self.Swimmer_Plot)
        self.Swimmer_Box.addWidget(self.Swimmer_Splitter)
        self.Swimmer_Widget.setLayout(self.Swimmer_Box)

        self.stackedWidget.addWidget(self.Waterfall_Widget) #0
        self.stackedWidget.addWidget(self.Spider_Widget) #1
        self.stackedWidget.addWidget(self.Swimmer_Widget) #2
        self.stackedWidget.hide()

        #Set up toolBar
        self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)

        importAction = QAction(QtGui.QIcon(os.path.join(image_dir,'images\Download.png')), 'Import date template', self)
        importAction.triggered.connect(self.import_data)
        importAction.setIconText("Import")
        self.toolBar.addAction(importAction)
        self.toolBar.addSeparator()

        dumpAction = QAction(QtGui.QIcon(os.path.join(image_dir,'images\Rubbish.png')), 'Import date template', self)
        #dumpAction.triggered.connect(self.dump_data)
        dumpAction.setIconText("Dump data")
        self.toolBar.addAction(dumpAction)
        self.toolBar.addSeparator()

        self.waterfallAction = QAction(QtGui.QIcon(os.path.join(image_dir, r'images\waterfall.png')), 'Waterfall plot', self)
        self.waterfallAction.triggered.connect(self.launch_waterfall)
        self.waterfallAction.setIconText("Waterfall")
        self.waterfallAction.setEnabled(False)
        self.toolBar.addAction(self.waterfallAction)
        
        self.spiderAction = QAction(QtGui.QIcon(os.path.join(image_dir, r'images\spider.png')), 'Spider plot', self)
        self.spiderAction.triggered.connect(self.launch_spider)
        self.spiderAction.setIconText("Spider")
        self.spiderAction.setEnabled(False)
        self.toolBar.addAction(self.spiderAction)

        self.swimmerAction = QAction(QtGui.QIcon(os.path.join(image_dir, r'images\swimmer_stack.png')), 'Swimmer plot', self)
        self.swimmerAction.triggered.connect(self.launch_spider)
        self.swimmerAction.setIconText("Swimmer")
        self.swimmerAction.setEnabled(False)
        self.toolBar.addAction(self.swimmerAction)
        self.toolBar.addSeparator()

        #Signal interconnections
        self.waterfall_data_signal.connect(self.Waterfall.on_waterfall_data_signal)
        self.waterfall_data_signal.connect(self.Waterfall_Plot.on_waterfall_data_signal)
        self.Waterfall.general_settings_signal.connect(self.Waterfall_Plot.on_general_settings_signal)

        self.swimmer_data_signal.connect(self.Swimmer.on_swimmer_data_signal)
        self.swimmer_data_signal.connect(self.Swimmer_Plot.on_swimmer_data_signal)
Ejemplo n.º 26
0
    def initWindow(self):
        QToolTip.setFont(QFont('SansSerif', 10))
        # main layout
        self.frameWidget = QWidget()
        mainWidget = QSplitter(Qt.Horizontal)
        self.frameLayout = QVBoxLayout()
        self.settingWidget = QWidget()
        settingLayout = QVBoxLayout()
        self.settingWidget.setProperty("class", "settingWidget")
        mainLayout = QVBoxLayout()
        self.settingWidget.setLayout(settingLayout)
        mainLayout.addWidget(self.settingWidget)
        mainLayout.setStretch(0, 2)
        menuLayout = QHBoxLayout()

        self.progressHint = QLabel()
        self.progressHint.hide()

        self.progressbarRootWidget = QWidget()
        progressbarLayout = QVBoxLayout()
        self.progressbarRootWidget.setProperty("class", "progressbarWidget")
        self.progressbarRootWidget.setLayout(progressbarLayout)

        self.downloadWidget = QWidget()
        downloadLayout = QVBoxLayout()
        self.downloadWidget.setProperty("class", "downloadWidget")
        self.downloadWidget.setLayout(downloadLayout)

        mainWidget.setLayout(mainLayout)
        # menu
        # -----
        # settings and others
        # -----
        # progress bar
        # -----
        # download button
        # -----
        # status bar
        self.frameLayout.addLayout(menuLayout)
        self.frameLayout.addWidget(mainWidget)
        self.frameLayout.addWidget(self.progressHint)
        self.frameLayout.addWidget(self.progressbarRootWidget)
        self.frameLayout.addWidget(self.downloadWidget)
        self.frameWidget.setLayout(self.frameLayout)
        self.setCentralWidget(self.frameWidget)
        self.setFrameStrentch(1)

        # option layout
        self.langButton = QPushButton()
        self.skinButton = QPushButton()
        self.aboutButton = QPushButton()
        self.langButton.setProperty("class", "menuItemLang")
        self.skinButton.setProperty("class", "menuItem2")
        self.aboutButton.setProperty("class", "menuItem3")
        self.langButton.setObjectName("menuItem")
        self.skinButton.setObjectName("menuItem")
        self.aboutButton.setObjectName("menuItem")
        menuLayout.addWidget(self.langButton)
        menuLayout.addWidget(self.skinButton)
        menuLayout.addWidget(self.aboutButton)
        menuLayout.addStretch(0)

        # widgets file select
        self.fileSelectGroupBox = QGroupBox(tr("SelectFile"))
        # container
        settingLayout.addWidget(self.fileSelectGroupBox)
        self.fileSelectContainerLayout = QVBoxLayout()
        self.fileSelectGroupBox.setLayout(self.fileSelectContainerLayout)
        # file selection
        self.fileSelecWidget = QWidget()
        self.fileSelectLayout = QVBoxLayout()
        self.fileSelecWidget.setLayout(self.fileSelectLayout)
        self.fileSelectContainerLayout.addWidget(self.fileSelecWidget)

        # add file selection item
        self.addFileSelectionItem()

        # add fileselection functions
        mergeBinWidget = QWidget()
        mergeBinWidgetLayout = QHBoxLayout()
        mergeBinWidget.setLayout(mergeBinWidgetLayout)
        self.addFileButton = QPushButton(tr("Add File"))
        self.packFilesButton = QPushButton(tr("Pack to kfpkg"))
        self.mergeBinButton = QPushButton(tr("Merge to .bin"))
        mergeBinWidgetLayout.addWidget(self.addFileButton)
        mergeBinWidgetLayout.addWidget(self.packFilesButton)
        mergeBinWidgetLayout.addWidget(self.mergeBinButton)
        self.fileSelectContainerLayout.addWidget(mergeBinWidget)

        # widgets board select
        boardSettingsGroupBox = QGroupBox(tr("BoardSettings"))
        settingLayout.addWidget(boardSettingsGroupBox)
        boardSettingsLayout = QGridLayout()
        boardSettingsGroupBox.setLayout(boardSettingsLayout)
        self.boardLabel = QLabel(tr("Board"))
        self.boardCombobox = ComboBox()
        self.boardCombobox.addItem(parameters.SipeedMaixDock)
        self.boardCombobox.addItem(parameters.SipeedMaixBit)
        self.boardCombobox.addItem(parameters.SipeedMaixBitMic)
        self.boardCombobox.addItem(parameters.SipeedMaixduino)
        self.boardCombobox.addItem(parameters.SipeedMaixGo)
        self.boardCombobox.addItem(parameters.SipeedMaixGoD)
        self.boardCombobox.addItem(parameters.M5StickV)
        self.boardCombobox.addItem(parameters.KendryteKd233)
        self.boardCombobox.addItem(parameters.kendryteTrainer)
        self.boardCombobox.addItem(parameters.Auto)
        self.burnPositionLabel = QLabel(tr("BurnTo"))
        self.burnPositionCombobox = ComboBox()
        self.burnPositionCombobox.addItem(tr("Flash"))
        self.burnPositionCombobox.addItem(tr("SRAM"))
        boardSettingsLayout.addWidget(self.boardLabel, 0, 0)
        boardSettingsLayout.addWidget(self.boardCombobox, 0, 1)
        boardSettingsLayout.addWidget(self.burnPositionLabel, 1, 0)
        boardSettingsLayout.addWidget(self.burnPositionCombobox, 1, 1)

        # widgets serial settings
        serialSettingsGroupBox = QGroupBox(tr("SerialSettings"))
        serialSettingsLayout = QGridLayout()
        serialPortLabek = QLabel(tr("SerialPort"))
        serailBaudrateLabel = QLabel(tr("SerialBaudrate"))
        slowModeLabel = QLabel(tr("Speed mode"))
        self.serialPortCombobox = ComboBox()
        self.serailBaudrateCombobox = ComboBox()
        self.serailBaudrateCombobox.addItem("115200")
        self.serailBaudrateCombobox.addItem("921600")
        self.serailBaudrateCombobox.addItem("1500000")
        self.serailBaudrateCombobox.addItem("2000000")
        self.serailBaudrateCombobox.addItem("3500000")
        self.serailBaudrateCombobox.addItem("4000000")
        self.serailBaudrateCombobox.addItem("4500000")
        self.serailBaudrateCombobox.setCurrentIndex(1)
        self.serailBaudrateCombobox.setEditable(True)
        self.slowModeCombobox = ComboBox()
        self.slowModeCombobox.addItem(tr("Slow mode"))
        self.slowModeCombobox.addItem(tr("Fast mode"))
        slowModeLabel.setToolTip(tr("slow mode tips"))
        self.slowModeCombobox.setToolTip(tr("slow mode tips"))

        serialSettingsLayout.addWidget(serialPortLabek, 0, 0)
        serialSettingsLayout.addWidget(serailBaudrateLabel, 1, 0)
        serialSettingsLayout.addWidget(slowModeLabel, 2, 0)
        serialSettingsLayout.addWidget(self.serialPortCombobox, 0, 1)
        serialSettingsLayout.addWidget(self.serailBaudrateCombobox, 1, 1)
        serialSettingsLayout.addWidget(self.slowModeCombobox, 2, 1)
        serialSettingsGroupBox.setLayout(serialSettingsLayout)
        settingLayout.addWidget(serialSettingsGroupBox)

        # set stretch
        settingLayout.setStretch(0, 1)
        settingLayout.setStretch(1, 1)
        settingLayout.setStretch(2, 2)

        # widgets progress bar

        self.progressbar = QProgressBar(self.progressbarRootWidget)
        self.progressbar.setValue(0)
        self.progressbarRootWidget.hide()

        # widgets download area
        self.downloadButton = QPushButton(tr("Download"))
        downloadLayout.addWidget(self.downloadButton)

        # main window
        self.statusBarStauts = QLabel()
        self.statusBarStauts.setMinimumWidth(80)
        self.statusBarStauts.setText("<font color=%s>%s</font>" %
                                     ("#1aac2d", tr("DownloadHint")))
        self.statusBar().addWidget(self.statusBarStauts)

        self.setWindowSize()
        self.MoveToCenter()
        self.setWindowTitle(parameters.appName + " V" +
                            str(helpAbout.versionMajor) + "." +
                            str(helpAbout.versionMinor))
        icon = QIcon()
        print("icon path:" + self.DataPath + "/" + parameters.appIcon)
        icon.addPixmap(QPixmap(self.DataPath + "/" + parameters.appIcon),
                       QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)
        if sys.platform == "win32":
            ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(
                parameters.appName)

        self.show()
        self.progressbar.setGeometry(10, 0,
                                     self.downloadWidget.width() - 25, 40)
        print("config file path:", parameters.configFilePath)
Ejemplo n.º 27
0
    def buildUi(self):
        # ---------------------------------------------------------
        # FONTS
        # ---------------------------------------------------------
        self.font_path = os.path.join(os.path.dirname(__file__), '..', 'fonts')

        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'droid-sans-mono.ttf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'fira-mono-regular.otf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'hack-regular.ttf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'inconsolata.otf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'pt-mono.ttf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'space-mono-regular.ttf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'ubuntu-mono-regular.ttf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'anonymous.ttf'))
        QFontDatabase.addApplicationFont(
            os.path.join(self.font_path, 'inter-ui-regular.ttf'))

        # ---------------------------------------------------------
        # STYLE
        # ---------------------------------------------------------
        self.stylesheet_path = os.path.join(os.path.dirname(__file__), '..',
                                            'config', 'style-light.qss')

        with open(self.stylesheet_path, 'r') as f:
            self.setStyleSheet(f.read())

        # ---------------------------------------------------------
        # ICONS
        # ---------------------------------------------------------
        icon_path = os.path.join(os.path.dirname(__file__), '..', 'icons')

        app_icon = QIcon(os.path.join(icon_path, 'harshark.svg'))
        open_icon = QIcon(os.path.join(icon_path, 'folder-open.svg'))
        quit_icon = QIcon(os.path.join(icon_path, 'power-off.svg'))
        case_icon = QIcon(os.path.join(icon_path, 'font.svg'))
        next_icon = QIcon(os.path.join(icon_path, 'step-forward.svg'))
        clear_icon = QIcon(os.path.join(icon_path, 'times-circle.svg'))
        resize_icon = QIcon(os.path.join(icon_path, 'arrows-alt-h.svg'))
        wrap_icon = QIcon(os.path.join(icon_path, 'file-alt.svg'))
        sort_icon = QIcon(os.path.join(icon_path, 'sort-alpha-down.svg'))
        colour_icon = QIcon(os.path.join(icon_path, 'paint-brush.svg'))
        saml_icon = QIcon(os.path.join(icon_path, 'address-card.svg'))
        self.about_icon = QIcon(os.path.join(icon_path, 'question-circle.svg'))
        self.column_select_icon = QIcon(os.path.join(icon_path, 'columns.svg'))

        # ---------------------------------------------------------
        # MENU BAR
        # ---------------------------------------------------------
        menubar = self.menuBar()
        menubar_file = menubar.addMenu('&File')
        menubar_view = menubar.addMenu('&View')
        menubar_options = menubar.addMenu('&Options')
        menubar_help = menubar.addMenu('&Help')

        # ------------
        # File Menu
        # ------------

        # open file
        action_open = QAction('&Open',
                              self,
                              shortcut='Ctrl+O',
                              icon=open_icon,
                              statusTip='Open a new HAR file')
        action_open.triggered.connect(self.openFile)
        menubar_file.addAction(action_open)

        # quit Harshark
        action_exit = QAction('&Exit',
                              self,
                              shortcut='Ctrl+Q',
                              icon=quit_icon,
                              statusTip='Exit Harshark')
        action_exit.triggered.connect(qApp.quit)
        menubar_file.addAction(action_exit)

        # ------------
        # View Menu
        # ------------

        # word wrap
        self.action_wrap = QAction('&Word Wrap',
                                   self,
                                   shortcut='ALT+Z',
                                   icon=wrap_icon,
                                   checkable=True,
                                   statusTip=('Toggle word wrapping for '
                                              'request and response tabs'))

        if self.config.getConfig('word-wrap'):
            self.action_wrap.setChecked(True)

        self.action_wrap.triggered.connect(self.toggleWrap)
        menubar_view.addAction(self.action_wrap)

        # sort request and response headers by name
        self.action_sort = QAction('&Sort Headers',
                                   self,
                                   shortcut='ALT+S',
                                   icon=sort_icon,
                                   checkable=True,
                                   statusTip=('Alphabetically sort request '
                                              'and response headers by name'))

        if self.config.getConfig('sort-headers'):
            self.action_sort.setChecked(True)

        self.action_sort.triggered.connect(self.toggleSort)
        menubar_view.addAction(self.action_sort)

        # cell colourizations
        self.action_colourization = QAction(
            '&Cell Colourization',
            self,
            shortcut='ALT+C',
            icon=colour_icon,
            checkable=True,
            statusTip=('Toggle cell colourization for cells in '
                       'the entries table.'))
        if self.config.getConfig('cell-colorization'):
            self.action_colourization.setChecked(True)

        self.action_colourization.triggered.connect(self.toggleColourization)
        menubar_view.addAction(self.action_colourization)

        # resize columns
        self.action_resize = QAction(
            '&Resize Columns',
            self,
            shortcut='ALT+R',
            icon=resize_icon,
            statusTip='Resize columns to fit their contents')
        self.action_resize.triggered.connect(lambda: resizeColumns(self))
        menubar_view.addAction(self.action_resize)

        # ------------
        # Options Menu
        # ------------

        # column selector
        action_columns = QAction(
            '&Choose Columns...',
            self,
            icon=self.column_select_icon,
            statusTip='Choose which columns to display in the entries table')
        action_columns.triggered.connect(self.columnSelector)
        menubar_options.addAction(action_columns)

        # SAML request and response parsing :: EXPERIMENTAL
        self.action_enable_saml = QAction(
            'SAML Parsing',
            self,
            icon=saml_icon,
            checkable=True,
            statusTip=('Enable SAML request and response parsing. '))

        if self.config.getConfig('parse-saml'):
            self.action_enable_saml.setChecked(True)

        self.action_enable_saml.triggered.connect(self.toggleSaml)
        menubar_options.addAction(self.action_enable_saml)

        # ------------
        # Help Menu
        # ------------

        # about

        action_about = QAction('&About Harshark',
                               self,
                               icon=self.about_icon,
                               statusTip='View program information')
        action_about.triggered.connect(self.aboutDialog)
        menubar_help.addAction(action_about)

        # ---------------------------------------------------------
        # TOOLBARS
        # ---------------------------------------------------------
        toolbar_main = self.addToolBar('Main')
        toolbar_search = self.addToolBar('Search')

        toolbar_main.setFloatable(False)
        toolbar_main.setMovable(False)
        toolbar_main.setIconSize(QSize(18, 18))

        toolbar_search.setFloatable(False)
        toolbar_search.setMovable(False)
        toolbar_search.setIconSize(QSize(18, 18))

        # open file
        toolbar_main.addAction(action_open)

        # case-sensitive searching
        self.toggle_case = QAction('Case sensitive searching',
                                   self,
                                   checkable=True,
                                   icon=case_icon,
                                   toolTip='Toggle case sensitive searching')

        if self.config.getConfig('case-sensitive-matching'):
            self.toggle_case.setChecked(True)

        self.toggle_case.triggered.connect(self.toggleCase)
        toolbar_search.addAction(self.toggle_case)

        # global search
        self.global_searchbox = QLineEdit(
            self,
            placeholderText='Enter a search query...',
            readOnly=True,
            clearButtonEnabled=True)
        self.global_searchbox.setMaximumWidth(800)
        self.global_searchbox.setMinimumHeight(30)
        self.global_searchbox.setContentsMargins(5, 0, 5, 0)
        self.global_searchbox.returnPressed.connect(self.globalSearch)
        toolbar_search.addWidget(self.global_searchbox)

        # global search: next match
        self.next_match_entries = QAction('Next',
                                          self,
                                          shortcut='F3',
                                          enabled=False,
                                          icon=next_icon,
                                          toolTip='Skip forward to next match')
        self.next_match_entries.triggered.connect(self.nextMatchGlobal)
        toolbar_search.addAction(self.next_match_entries)

        # global search: clear highlights
        self.clear_match_entries = QAction('Clear search',
                                           self,
                                           enabled=False,
                                           icon=clear_icon,
                                           toolTip='Clear search results')
        self.clear_match_entries.triggered.connect(self.clearMatchGlobal)
        toolbar_search.addAction(self.clear_match_entries)

        # ---------------------------------------------------------
        # STATUS BAR
        # ---------------------------------------------------------
        self.statusbar = self.statusBar()

        # ---------------------------------------------------------
        # ENTRIES TABLE
        # ---------------------------------------------------------
        self.entries_table = QTableWidget()
        self.entries_table.setSelectionBehavior(QTableWidget.SelectRows)
        self.entries_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.entries_table.setHorizontalScrollMode(
            QAbstractItemView.ScrollPerPixel)
        self.entries_table.setVerticalScrollMode(
            QAbstractItemView.ScrollPerPixel)

        # select an entry
        self.entries_table.itemSelectionChanged.connect(self.entrySelect)

        # ---------------------------------------------------------
        # REQUEST TABS
        # ---------------------------------------------------------
        self.request_tabs = QTabWidget()

        request_headers_tab = QWidget()
        request_body_tab = QWidget()
        request_query_tab = QWidget()
        request_cookie_tab = QWidget()
        request_saml_tab = QWidget()

        self.request_tabs.addTab(request_headers_tab, 'Headers')
        self.request_tabs.addTab(request_query_tab, 'Parameters')
        self.request_tabs.addTab(request_cookie_tab, 'Cookies')
        self.request_tabs.addTab(request_body_tab, 'Body')
        self.request_tabs.addTab(request_saml_tab, 'SAML')

        self.request_tabs.setTabEnabled(0, False)
        self.request_tabs.setTabEnabled(1, False)
        self.request_tabs.setTabEnabled(2, False)
        self.request_tabs.setTabEnabled(3, False)
        self.request_tabs.setTabEnabled(4, False)

        self.request_headers_tab_text = QTextEdit(readOnly=True)
        self.request_query_tab_text = QTextEdit(readOnly=True)
        self.request_cookie_tab_text = QTextEdit(readOnly=True)
        self.request_body_tab_text = QPlainTextEdit(readOnly=True)
        self.request_saml_tab_text = QPlainTextEdit(readOnly=True)

        # ROBUSTNESS :: We index into this list from a few areas so UI order must be
        # preserved. Can this be made less fragile?
        self.request_textedits = [
            self.request_headers_tab_text, self.request_query_tab_text,
            self.request_cookie_tab_text, self.request_body_tab_text,
            self.request_saml_tab_text
        ]

        word_wrap = self.config.getConfig('word-wrap')
        for textedit in self.request_textedits:
            if not word_wrap:
                textedit.setWordWrapMode(QTextOption.NoWrap)

        request_headers_tab_layout = QVBoxLayout()
        self.request_body_tab_layout = QVBoxLayout()
        request_query_tab_layout = QVBoxLayout()
        request_cookie_tab_layout = QVBoxLayout()
        request_saml_tab_layout = QVBoxLayout()

        truncate_length = self.config.getConfig('truncate-character-count')
        truncate_button_text = (
            'Content truncated to {} characters. '
            'Click to show all content.').format(truncate_length)
        self.request_expand_button = QPushButton(truncate_button_text)
        self.request_expand_button.hide()

        request_headers_tab_layout.addWidget(self.request_headers_tab_text)
        request_headers_tab.setLayout(request_headers_tab_layout)

        self.request_body_tab_layout.addWidget(self.request_expand_button)
        self.request_body_tab_layout.addWidget(self.request_body_tab_text)
        request_body_tab.setLayout(self.request_body_tab_layout)

        request_query_tab_layout.addWidget(self.request_query_tab_text)
        request_query_tab.setLayout(request_query_tab_layout)

        request_cookie_tab_layout.addWidget(self.request_cookie_tab_text)
        request_cookie_tab.setLayout(request_cookie_tab_layout)

        request_saml_tab_layout.addWidget(self.request_saml_tab_text)
        request_saml_tab.setLayout(request_saml_tab_layout)

        # un-truncate request body
        self.request_expand_button.clicked.connect(
            lambda: expandBody(self, 'request'))

        # clear search highlights on tab change
        self.request_tabs.currentChanged.connect(
            lambda: self.tabChanged('request'))

        # next match
        self.next_match_request_btn = QPushButton(
            shortcut='F5',
            icon=next_icon,
            enabled=False,
            toolTip='Skip to the next match')
        self.next_match_request_btn.clicked.connect(
            lambda: self.nextMatchSub('request'))

        # clear highlights
        self.clear_match_request_btn = QPushButton(
            icon=clear_icon, enabled=False, toolTip='Clear search results')
        self.clear_match_request_btn.clicked.connect(
            lambda: self.clearMatchSub('request'))

        # ---------------------------------------------------------
        # RESPONSE TABS
        # ---------------------------------------------------------
        self.response_tabs = QTabWidget()

        response_headers_tab = QWidget()
        response_body_tab = QWidget()
        response_cookie_tab = QWidget()

        self.response_tabs.addTab(response_headers_tab, 'Headers')
        self.response_tabs.addTab(response_cookie_tab, 'Cookies')
        self.response_tabs.addTab(response_body_tab, 'Body')

        self.response_tabs.setTabEnabled(0, False)
        self.response_tabs.setTabEnabled(1, False)
        self.response_tabs.setTabEnabled(2, False)

        self.response_headers_tab_text = QTextEdit(readOnly=True)
        self.response_cookie_tab_text = QTextEdit(readOnly=True)
        self.response_body_tab_text = QPlainTextEdit(readOnly=True)

        # ROBUSTNESS :: We index into this list from a few areas so UI order must be
        # preserved. Can this be made less fragile?
        self.response_textedits = [
            self.response_headers_tab_text, self.response_cookie_tab_text,
            self.response_body_tab_text
        ]

        for textedit in self.response_textedits:
            if not word_wrap:
                textedit.setWordWrapMode(QTextOption.NoWrap)

        response_headers_tab_layout = QVBoxLayout()
        self.response_body_tab_layout = QVBoxLayout()
        response_cookie_tab_layout = QVBoxLayout()

        self.response_expand_button = QPushButton(truncate_button_text)
        self.response_expand_button.hide()

        response_headers_tab_layout.addWidget(self.response_headers_tab_text)
        response_headers_tab.setLayout(response_headers_tab_layout)

        self.response_body_tab_layout.addWidget(self.response_expand_button)
        self.response_body_tab_layout.addWidget(self.response_body_tab_text)
        response_body_tab.setLayout(self.response_body_tab_layout)

        response_cookie_tab_layout.addWidget(self.response_cookie_tab_text)
        response_cookie_tab.setLayout(response_cookie_tab_layout)

        # un-truncate response body
        self.response_expand_button.clicked.connect(
            lambda: expandBody(self, 'response'))

        # clear search highlights on tab change
        self.response_tabs.currentChanged.connect(
            lambda: self.tabChanged('response'))

        # next match
        self.next_match_response_btn = QPushButton(
            shortcut='F6',
            icon=next_icon,
            enabled=False,
            toolTip='Skip to the next match')
        self.next_match_response_btn.clicked.connect(
            lambda: self.nextMatchSub('response'))

        # clear highlights
        self.clear_match_response_btn = QPushButton(
            icon=clear_icon, enabled=False, toolTip='Clear search results')
        self.clear_match_response_btn.clicked.connect(
            lambda: self.clearMatchSub('response'))

        # ---------------------------------------------------------
        # REQUEST / RESPONSE FILTER
        # ---------------------------------------------------------
        self.request_filter = QLineEdit(
            self,
            placeholderText='Enter search query...',
            readOnly=True,
            clearButtonEnabled=True)
        self.request_filter.returnPressed.connect(
            lambda: self.subSearch('request'))
        self.request_filter.setMinimumHeight(30)

        self.response_filter = QLineEdit(
            self,
            placeholderText='Enter search query...',
            readOnly=True,
            clearButtonEnabled=True)
        self.response_filter.returnPressed.connect(
            lambda: self.subSearch('response'))
        self.response_filter.setMinimumHeight(30)

        # ---------------------------------------------------------
        # REQUEST / RESPONSE LAYOUT
        # ---------------------------------------------------------
        request_vbox = QVBoxLayout()
        request_hbox = QHBoxLayout()
        response_vbox = QVBoxLayout()
        response_hbox = QHBoxLayout()

        request_hbox.addWidget(self.request_filter)
        request_hbox.addWidget(self.next_match_request_btn)
        request_hbox.addWidget(self.clear_match_request_btn)

        request_vbox.addWidget(self.request_tabs)
        request_vbox.addLayout(request_hbox)

        response_hbox.addWidget(self.response_filter)
        response_hbox.addWidget(self.next_match_response_btn)
        response_hbox.addWidget(self.clear_match_response_btn)

        response_vbox.addWidget(self.response_tabs)
        response_vbox.addLayout(response_hbox)

        request_group_box = QGroupBox(title='Request Details')
        request_group_box.setLayout(request_vbox)

        response_group_box = QGroupBox(title='Response Details')
        response_group_box.setLayout(response_vbox)

        # ---------------------------------------------------------
        # MAIN WIDGET SPLITTER
        # ---------------------------------------------------------
        splitter_h = QSplitter(Qt.Horizontal)
        splitter_h.addWidget(request_group_box)
        splitter_h.addWidget(response_group_box)

        splitter_v = QSplitter(Qt.Vertical)
        splitter_v.addWidget(self.entries_table)
        splitter_v.addWidget(splitter_h)

        # (index, stretch factor)
        #splitter_v.setStretchFactor(0, 1)
        #splitter_v.setStretchFactor(1, 1)

        self.setCentralWidget(splitter_v)

        # ---------------------------------------------------------
        # KICKUP
        # ---------------------------------------------------------
        self.setWindowTitle('Harshark {} | HTTP Archive (HAR) Viewer'.format(
            self.version))
        self.setWindowIcon(app_icon)
        self.showMaximized()
        self.show()
Ejemplo n.º 28
0
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.image_name = ''

        self.black_threshold = 60
        self.white_threshold = 120
        self.canny_min = 50
        self.canny_max = 200
        self.black_steps = 2
        self.gray_steps = 6
        self.margin = 10
        self.draw_width = 150

        self.statusBar = QStatusBar()
        self.setWindowTitle('Image to Gcode - Duck Plotter')
        self.setStatusBar(self.statusBar)

        layout = QSplitter()

        self.display_image_widget = DisplayImageWidget()
        layout.addWidget(self.display_image_widget)

        btn_layout = QVBoxLayout()

        btn_load = QPushButton('Load image')
        btn_load.clicked.connect(self.load_image)
        btn_load.setIcon(QtGui.QIcon.fromTheme("document-open"))
        btn_layout.addWidget(btn_load)

        line = QFrame()
        line.setFrameShape(QFrame.HLine)
        line.setFrameShadow(QFrame.Sunken)
        btn_layout.addWidget(line)

        self.lbl_black = QLabel()
        self.slider_black = QSlider(QtCore.Qt.Horizontal)
        self.slider_black.setMinimum(0)
        self.slider_black.setMaximum(255)
        self.slider_black.setValue(self.black_threshold)
        self.slider_black.setTickPosition(QSlider.TicksBelow)
        self.slider_black.setTickInterval(5)
        self.slider_black.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_black)
        btn_layout.addWidget(self.slider_black)

        self.lbl_white = QLabel()
        self.slider_white = QSlider(QtCore.Qt.Horizontal)
        self.slider_white.setMinimum(0)
        self.slider_white.setMaximum(255)
        self.slider_white.setValue(self.white_threshold)
        self.slider_white.setTickPosition(QSlider.TicksBelow)
        self.slider_white.setTickInterval(5)
        self.slider_white.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_white)
        btn_layout.addWidget(self.slider_white)

        self.lbl_canny_min = QLabel()
        self.slider_canny_min = QSlider(QtCore.Qt.Horizontal)
        self.slider_canny_min.setMinimum(0)
        self.slider_canny_min.setMaximum(255)
        self.slider_canny_min.setValue(self.canny_min)
        self.slider_canny_min.setTickPosition(QSlider.TicksBelow)
        self.slider_canny_min.setTickInterval(5)
        self.slider_canny_min.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_canny_min)
        btn_layout.addWidget(self.slider_canny_min)

        self.lbl_canny_max = QLabel()
        self.slider_canny_max = QSlider(QtCore.Qt.Horizontal)
        self.slider_canny_max.setMinimum(0)
        self.slider_canny_max.setMaximum(255)
        self.slider_canny_max.setValue(self.canny_max)
        self.slider_canny_max.setTickPosition(QSlider.TicksBelow)
        self.slider_canny_max.setTickInterval(5)
        self.slider_canny_max.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_canny_max)
        btn_layout.addWidget(self.slider_canny_max)

        self.lbl_black_steps = QLabel()
        self.slider_black_steps = QSlider(QtCore.Qt.Horizontal)
        self.slider_black_steps.setMinimum(1)
        self.slider_black_steps.setMaximum(50)
        self.slider_black_steps.setValue(self.black_steps)
        self.slider_black_steps.setTickPosition(QSlider.TicksBelow)
        self.slider_black_steps.setTickInterval(1)
        self.slider_black_steps.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_black_steps)
        btn_layout.addWidget(self.slider_black_steps)

        self.lbl_gray_steps = QLabel()
        self.slider_gray_steps = QSlider(QtCore.Qt.Horizontal)
        self.slider_gray_steps.setMinimum(1)
        self.slider_gray_steps.setMaximum(50)
        self.slider_gray_steps.setValue(self.gray_steps)
        self.slider_gray_steps.setTickPosition(QSlider.TicksBelow)
        self.slider_gray_steps.setTickInterval(1)
        self.slider_gray_steps.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_gray_steps)
        btn_layout.addWidget(self.slider_gray_steps)

        line = QFrame()
        line.setFrameShape(QFrame.HLine)
        line.setFrameShadow(QFrame.Sunken)
        btn_layout.addWidget(line)

        self.lbl_margin = QLabel()
        self.slider_margin = QSlider(QtCore.Qt.Horizontal)
        self.slider_margin.setMinimum(1)
        self.slider_margin.setMaximum(50)
        self.slider_margin.setValue(self.margin)
        self.slider_margin.setTickPosition(QSlider.TicksBelow)
        self.slider_margin.setTickInterval(1)
        self.slider_margin.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_margin)
        btn_layout.addWidget(self.slider_margin)

        self.lbl_draw_width = QLabel()
        self.slider_draw_width = QSlider(QtCore.Qt.Horizontal)
        self.slider_draw_width.setMinimum(1)
        self.slider_draw_width.setMaximum(210)
        self.slider_draw_width.setValue(self.draw_width)
        self.slider_draw_width.setTickPosition(QSlider.TicksBelow)
        self.slider_draw_width.setTickInterval(1)
        self.slider_draw_width.valueChanged.connect(self.value_change)
        btn_layout.addWidget(self.lbl_draw_width)
        btn_layout.addWidget(self.slider_draw_width)

        line = QFrame()
        line.setFrameShape(QFrame.HLine)
        line.setFrameShadow(QFrame.Sunken)
        btn_layout.addWidget(line)

        btn_update = QPushButton('Refresh image')
        btn_update.clicked.connect(self.update)
        btn_update.setIcon(QtGui.QIcon.fromTheme("view-refresh"))
        btn_layout.addWidget(btn_update)

        btn_gcode = QPushButton('Export Gcode')
        btn_gcode.clicked.connect(self.get_gcode)
        btn_gcode.setIcon(QtGui.QIcon.fromTheme("document-save"))
        btn_layout.addWidget(btn_gcode)

        btn_preview = QPushButton('Image preview')
        btn_preview.clicked.connect(self.print_preview)
        btn_preview.setIcon(QtGui.QIcon.fromTheme("document-print"))
        btn_layout.addWidget(btn_preview)

        btn_layout_widget = QWidget()
        btn_layout_widget.setLayout(btn_layout)
        layout.addWidget(btn_layout_widget)
        layout.setStretchFactor(0, 3)
        layout.setStretchFactor(1, 1)

        self.setCentralWidget(layout)

        self.value_change()
        self.load_image()
Ejemplo n.º 29
0
    def __init__(self, app, *__args):
        super().__init__(*__args)

        self.app = app

        self.setTabsClosable(True)
        self.setMovable(True)
        self.tabCloseRequested.connect(self.removeTab)
        self.setContentsMargins(2, 2, 2, 2)
        self.setStyleSheet("""
            QListWidget:hover,
            QTableWidget:hover {
                border: 1px solid transparent;
            }
            QTabWidget QFrame{
                border: 0;
            }
            
            QTabWidget::pane {
                border: 0px solid transparent;
                border-radius: 0px;
                padding: 0px;
                margin: 0px;
            }
            
            QTabWidget::pane:selected {
                background-color: transparent;
                border: 0px solid transparent;
            }
            
            QWidget {
                padding: 0;
                margin-top: 2px;
                margin-right: 2px;
                margin-left: 1px;
            }
        """)

        self.session_panel = QSplitter()

        self.modules_panel = None
        self.ranges_panel = None
        self.registers_panel = None
        self.memory_panel = None
        self.log_panel = None
        self.backtrace_panel = None
        self.hooks_panel = None
        self.contexts_panel = None

        self.session_panel.addWidget(self.build_left_column())
        self.session_panel.addWidget(self.build_central_content())

        self.session_panel.setHandleWidth(1)
        self.session_panel.setStretchFactor(0, 2)
        self.session_panel.setStretchFactor(1, 6)
        self.session_panel.setContentsMargins(0, 0, 0, 0)

        self.modules_panel = ModulesPanel(self.app)
        self.ranges_panel = RangesPanel(self.app)
        self.data_panel = DataPanel(self.app)
        self.asm_panel = AsmPanel(self.app)
        self.java_class_panel = None

        self.addTab(self.session_panel, 'session')
        bt = self.tabBar().tabButton(0, QTabBar.LeftSide)
        if not bt:
            bt = self.tabBar().tabButton(0, QTabBar.RightSide)
        if bt:
            bt.resize(0, 0)
Ejemplo n.º 30
0
    def __init__(self, model):
        """Initialize MNELAB main window.

        Parameters
        ----------
        model : mnelab.model.Model instance
            The main window needs to connect to a model containing all data
            sets. This decouples the GUI from the data (model/view).
        """
        super().__init__()

        mp.set_start_method("spawn", force=True)  # required for Linux/macOS

        self.model = model  # data model
        self.setWindowTitle("MNELAB")

        # restore settings
        settings = read_settings()
        self.recent = settings["recent"]  # list of recent files
        if settings["geometry"]:
            self.restoreGeometry(settings["geometry"])
        else:
            self.setGeometry(300, 300, 1000, 750)  # default window size
            self.move(QApplication.desktop().screen().rect().center() -
                      self.rect().center())  # center window
        if settings["state"]:
            self.restoreState(settings["state"])

        self.actions = {}  # contains all actions

        # initialize menus
        file_menu = self.menuBar().addMenu("&File")
        icon = QIcon(":/open_file.svg")
        self.actions["open_file"] = file_menu.addAction(
            icon, "&Open...", self.open_data, QKeySequence.Open)
        self.recent_menu = file_menu.addMenu("Open recent")
        self.recent_menu.aboutToShow.connect(self._update_recent_menu)
        self.recent_menu.triggered.connect(self._load_recent)
        if not self.recent:
            self.recent_menu.setEnabled(False)
        self.actions["close_file"] = file_menu.addAction(
            "&Close", self.model.remove_data, QKeySequence.Close)
        self.actions["close_all"] = file_menu.addAction(
            "Close all", self.close_all)
        file_menu.addSeparator()
        icon = QIcon(":/meta_info.svg")
        self.actions["meta_info"] = file_menu.addAction(
            icon, "Show information...", self.meta_info)
        file_menu.addSeparator()
        self.actions["import_bads"] = file_menu.addAction(
            "Import bad channels...", lambda: self.import_file(
                model.import_bads, "Import bad channels", "*.csv"))
        self.actions["import_events"] = file_menu.addAction(
            "Import events...", lambda: self.import_file(
                model.import_events, "Import events", "*.csv"))
        self.actions["import_annotations"] = file_menu.addAction(
            "Import annotations...", lambda: self.import_file(
                model.import_annotations, "Import annotations", "*.csv"))
        self.actions["import_ica"] = file_menu.addAction(
            "Import &ICA...", lambda: self.open_file(
                model.import_ica, "Import ICA", "*.fif *.fif.gz"))
        file_menu.addSeparator()
        self.export_menu = file_menu.addMenu("Export data")
        for name, ext in EXPORT_FORMATS.items():
            self.actions["export_data_" + ext] = self.export_menu.addAction(
                f"{name} ({ext[1:].upper()})...",
                partial(self.export_file, model.export_data, "Export data",
                        ext))
        self.actions["export_bads"] = file_menu.addAction(
            "Export &bad channels...", lambda: self.export_file(
                model.export_bads, "Export bad channels", "*.csv"))
        self.actions["export_events"] = file_menu.addAction(
            "Export &events...", lambda: self.export_file(
                model.export_events, "Export events", "*.csv"))
        self.actions["export_annotations"] = file_menu.addAction(
            "Export &annotations...", lambda: self.export_file(
                model.export_annotations, "Export annotations", "*.csv"))
        self.actions["export_ica"] = file_menu.addAction(
            "Export ICA...", lambda: self.export_file(
                model.export_ica, "Export ICA", "*.fif *.fif.gz"))
        file_menu.addSeparator()
        self.actions["quit"] = file_menu.addAction("&Quit", self.close,
                                                   QKeySequence.Quit)

        edit_menu = self.menuBar().addMenu("&Edit")
        self.actions["pick_chans"] = edit_menu.addAction(
            "Pick &channels...", self.pick_channels)
        icon = QIcon(":/chan_props.svg")
        self.actions["chan_props"] = edit_menu.addAction(
            icon, "Channel &properties...", self.channel_properties)
        self.actions["set_montage"] = edit_menu.addAction(
            "Set &montage...", self.set_montage)
        edit_menu.addSeparator()
        self.actions["set_ref"] = edit_menu.addAction("&Set reference...",
                                                      self.set_reference)
        edit_menu.addSeparator()
        self.actions["annotations"] = edit_menu.addAction(
            "Annotations...", self.edit_annotations)
        self.actions["events"] = edit_menu.addAction("Events...",
                                                     self.edit_events)

        edit_menu.addSeparator()
        self.actions["crop"] = edit_menu.addAction("&Crop data...", self.crop)

        plot_menu = self.menuBar().addMenu("&Plot")
        icon = QIcon(":/plot_data.svg")
        self.actions["plot_data"] = plot_menu.addAction(
            icon, "&Data...", self.plot_data)
        icon = QIcon(":/plot_psd.svg")
        self.actions["plot_psd"] = plot_menu.addAction(
            icon, "&Power spectral density...", self.plot_psd)
        icon = QIcon(":/plot_montage.svg")
        self.actions["plot_montage"] = plot_menu.addAction(
            icon, "&Montage...", self.plot_montage)
        plot_menu.addSeparator()
        self.actions["plot_ica_components"] = plot_menu.addAction(
            "ICA &components...", self.plot_ica_components)
        self.actions["plot_ica_sources"] = plot_menu.addAction(
            "ICA &sources...", self.plot_ica_sources)

        tools_menu = self.menuBar().addMenu("&Tools")
        icon = QIcon(":/filter.svg")
        self.actions["filter"] = tools_menu.addAction(icon, "&Filter data...",
                                                      self.filter_data)
        icon = QIcon(":/find_events.svg")
        self.actions["find_events"] = tools_menu.addAction(
            icon, "Find &events...", self.find_events)
        self.actions["events_from_annotations"] = tools_menu.addAction(
            "Create events from annotations", self.events_from_annotations)
        tools_menu.addSeparator()
        icon = QIcon(":/run_ica.svg")
        self.actions["run_ica"] = tools_menu.addAction(icon, "Run &ICA...",
                                                       self.run_ica)
        self.actions["apply_ica"] = tools_menu.addAction(
            "Apply &ICA", self.apply_ica)
        tools_menu.addSeparator()
        self.actions["interpolate_bads"] = tools_menu.addAction(
            "Interpolate bad channels...", self.interpolate_bads)
        tools_menu.addSeparator()
        icon = QIcon(":/epoch_data.svg")
        self.actions["epoch_data"] = tools_menu.addAction(
            icon, "Create Epochs...", self.epoch_data)

        view_menu = self.menuBar().addMenu("&View")
        self.actions["history"] = view_menu.addAction("&History...",
                                                      self.show_history)
        self.actions["toolbar"] = view_menu.addAction("&Toolbar",
                                                      self._toggle_toolbar)
        self.actions["toolbar"].setCheckable(True)
        self.actions["statusbar"] = view_menu.addAction(
            "&Statusbar", self._toggle_statusbar)
        self.actions["statusbar"].setCheckable(True)

        help_menu = self.menuBar().addMenu("&Help")
        self.actions["about"] = help_menu.addAction("&About", self.show_about)
        self.actions["about_qt"] = help_menu.addAction("About &Qt",
                                                       self.show_about_qt)

        # actions that are always enabled
        self.always_enabled = [
            "open_file", "about", "about_qt", "quit", "toolbar", "statusbar"
        ]

        # set up toolbar
        self.toolbar = self.addToolBar("toolbar")
        self.toolbar.setObjectName("toolbar")
        self.toolbar.addAction(self.actions["open_file"])
        self.toolbar.addAction(self.actions["meta_info"])
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions["chan_props"])
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions["plot_data"])
        self.toolbar.addAction(self.actions["plot_psd"])
        self.toolbar.addAction(self.actions["plot_montage"])
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions["filter"])
        self.toolbar.addAction(self.actions["find_events"])
        self.toolbar.addAction(self.actions["epoch_data"])
        self.toolbar.addAction(self.actions["run_ica"])

        self.setUnifiedTitleAndToolBarOnMac(True)
        if settings["toolbar"]:
            self.toolbar.show()
            self.actions["toolbar"].setChecked(True)
        else:
            self.toolbar.hide()
            self.actions["toolbar"].setChecked(False)

        # set up data model for sidebar (list of open files)
        self.names = QStringListModel()
        self.names.dataChanged.connect(self._update_names)
        splitter = QSplitter()
        self.sidebar = QListView()
        self.sidebar.setFrameStyle(QFrame.NoFrame)
        self.sidebar.setFocusPolicy(Qt.NoFocus)
        self.sidebar.setModel(self.names)
        self.sidebar.clicked.connect(self._update_data)
        splitter.addWidget(self.sidebar)
        self.infowidget = InfoWidget()
        splitter.addWidget(self.infowidget)
        width = splitter.size().width()
        splitter.setSizes((int(width * 0.3), int(width * 0.7)))
        self.setCentralWidget(splitter)

        self.status_label = QLabel()
        self.statusBar().addPermanentWidget(self.status_label)
        if settings["statusbar"]:
            self.statusBar().show()
            self.actions["statusbar"].setChecked(True)
        else:
            self.statusBar().hide()
            self.actions["statusbar"].setChecked(False)

        self.setAcceptDrops(True)
        self.data_changed()