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)
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'))
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)
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)
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)
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
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()
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
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)
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())
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
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)
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()
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()
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 } """)
def make_splitter(orientation, *widgets): spl = QSplitter(orientation, self) for w in widgets: spl.addWidget(w) return spl
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) #将子布局加入主布局
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);}")
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)
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>"))
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)
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)
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)
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(""))
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)
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)
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()
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()
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)
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()