def create_layout(self): ''' Creates the complete layout including all controls ''' self.title_label = ElidingLabel(text=self.dock_widget.windowTitle()) self.title_label.set_elide_mode(Qt.ElideRight) self.title_label.setObjectName("dockWidgetTabLabel") self.title_label.setAlignment(Qt.AlignCenter) self.close_button = QPushButton() self.close_button.setObjectName("tabCloseButton") set_button_icon(self.public.style(), self.close_button, QStyle.SP_TitleBarCloseButton) self.close_button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.close_button.setVisible(False) self.close_button.setToolTip("Close Tab") self.close_button.clicked.connect(self.public.close_requested) fm = QFontMetrics(self.title_label.font()) spacing = round(fm.height() / 4.0) # Fill the layout layout = QBoxLayout(QBoxLayout.LeftToRight) layout.setContentsMargins(2 * spacing, 0, 0, 0) layout.setSpacing(0) self.public.setLayout(layout) layout.addWidget(self.title_label, 1) layout.addSpacing(spacing) layout.addWidget(self.close_button) layout.addSpacing(round(spacing * 4.0 / 3.0)) layout.setAlignment(Qt.AlignCenter) self.title_label.setVisible(True)
def __init__(self, *, dock_area: 'DockAreaWidget' = None, dock_widget: 'DockWidget' = None, dock_manager: 'DockManager' = None): ''' Parameters ---------- dock_manager : DockManager dock_area : DockAreaWidget Create floating widget with the given dock area ''' if dock_manager is None: if dock_area is not None: dock_manager = dock_area.dock_manager() elif dock_widget is not None: dock_manager = dock_widget.dock_manager() if dock_manager is None: raise ValueError('Must pass in either dock_area, dock_widget, or dock_manager') super().__init__(dock_manager) self.d = FloatingDockContainerPrivate(self) self.d.dock_manager = dock_manager dock_container = DockContainerWidget(dock_manager, self) self.d.dock_container = dock_container dock_container.destroyed.connect(self._destroyed) dock_container.dock_areas_added.connect(self.on_dock_areas_added_or_removed) dock_container.dock_areas_removed.connect(self.on_dock_areas_added_or_removed) if LINUX: self.d.title_bar = FloatingWidgetTitleBar(self) self.setWindowFlags(super().windowFlags() | Qt.Tool) self.setWidget(self.d.dock_container) self.setFloating(True) self.setFeatures(QDockWidget.AllDockWidgetFeatures) self.setTitleBarWidget(self.d.title_bar) self.d.title_bar.close_requested.connect(self.close) else: self.setWindowFlags(Qt.Window | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) layout = QBoxLayout(QBoxLayout.TopToBottom) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.setLayout(layout) layout.addWidget(dock_container) dock_manager.register_floating_widget(self) # We install an event filter to detect mouse release events because we # do not receive mouse release event if the floating widget is behind # the drop overlay cross qapp = QApplication.instance() qapp.installEventFilter(self) if dock_area is not None: dock_container.add_dock_area(dock_area) elif dock_widget is not None: dock_container.add_dock_widget( DockWidgetArea.center, dock_widget) if (dock_area or dock_widget) and LINUX: self.d.title_bar.enable_close_button(self.is_closable())
def buttonsLayout(self, buttonElementTuple, r2l=False, translation=True): buttonsLayout = QBoxLayout( QBoxLayout.RightToLeft if r2l else QBoxLayout.LeftToRight) buttonsLayout.setSpacing(5) for label, action in buttonElementTuple: buttonLabel = config.thisTranslation[ label] if translation else label button = QPushButton(buttonLabel) button.clicked.connect(action) buttonsLayout.addWidget(button) return buttonsLayout
def navigationLayout1(self): navigationLayout1 = QBoxLayout(QBoxLayout.LeftToRight) navigationLayout1.setSpacing(5) # Version selection self.versionCombo = QComboBox() #self.textList = self.biblesSqlite.getBibleList() self.textList = self.parent.textList self.versionCombo.addItems(self.textList) for index, fullName in enumerate(self.parent.textFullNameList): self.versionCombo.setItemData(index, fullName, Qt.ToolTipRole) initialIndex = 0 if self.text in self.textList: initialIndex = self.textList.index(self.text) self.versionCombo.setCurrentIndex(initialIndex) navigationLayout1.addWidget(self.versionCombo) # Book / Chapter / Verse selection self.bookCombo = QComboBox() navigationLayout1.addWidget(self.bookCombo) self.chapterCombo = QComboBox() navigationLayout1.addWidget(self.chapterCombo) self.verseCombo = QComboBox() navigationLayout1.addWidget(self.verseCombo) # Initial setup self.updateBookCombo() # Interactive update in response to users selection self.versionCombo.currentIndexChanged.connect(self.updateBookCombo) self.bookCombo.currentIndexChanged.connect( lambda index: self.updateChapterCombo(self.bookList[index], True)) self.chapterCombo.currentIndexChanged.connect( lambda index: self.updateVerseCombo(self.chapterList[index], True)) self.verseCombo.currentIndexChanged.connect(self.updateV) return navigationLayout1
def create_layout(self): ''' Creates the complete layout including all controls ''' self.title_label = ElidingLabel() self.title_label.set_elide_mode(Qt.ElideRight) self.title_label.setText("DockWidget->windowTitle()") self.title_label.setObjectName("floatingTitleLabel") self.title_label.setAlignment(Qt.AlignLeft) self.close_button = QPushButton() self.close_button.setObjectName("floatingTitleCloseButton") self.close_button.setFlat(True) # self.close_button.setAutoRaise(True) set_button_icon(self.public.style(), self.close_button, QStyle.SP_TitleBarCloseButton) self.close_button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.close_button.setVisible(True) self.close_button.setFocusPolicy(Qt.NoFocus) self.close_button.clicked.connect(self.public.close_requested) fm = QFontMetrics(self.title_label.font()) spacing = round(fm.height() / 4.0) # Fill the layout layout = QBoxLayout(QBoxLayout.LeftToRight) layout.setContentsMargins(6, 0, 0, 0) layout.setSpacing(0) self.public.setLayout(layout) layout.addWidget(self.title_label, 1) layout.addSpacing(spacing) layout.addWidget(self.close_button) layout.setAlignment(Qt.AlignCenter) self.title_label.setVisible(True)
def __init__(self, item): super().__init__() self._shown = False self.modified_callback = None scene = QGraphicsScene() self.scene = scene self.scene_item = item scene.addItem(item) layout = QBoxLayout(QBoxLayout.TopToBottom, self) scene_view = View(self) self.scene_view = scene_view scene_view.setScene(scene) scene_view.setMinimumSize(350, 350) scene_view.setRenderHint(QPainter.Antialiasing) layout.addWidget(scene_view) self.double_click_callback = None self.mouse_press_callback = None if hasattr(self.scene_item, "mouse_pressed_in"): self.mouse_press_callback = self.scene_item.mouse_pressed_in if hasattr(self.scene_item, "double_clicked_in_background"): self.double_click_callback = \ self.scene_item.double_clicked_in_background if hasattr(self.scene_item, "mouse_moved_in_scene"): self.scene_view.mouse_move_callback = \ self.scene_item.mouse_moved_in_scene self.menus = [] view_menu = QMenu("&View") self.view_menu = view_menu self.menus.append(view_menu) export_menu = QMenu("&Export") self.menus.append(export_menu) self.tools = [] fit_action = QAction("&Fit", self) fit_action.setShortcut("0") fit_action.setIcon(QIcon.fromTheme("zoom-fit-best")) fit_action.setStatusTip("Fit the entire scene to the viewport") fit_action.triggered.connect(self.scene_view.fit_all_in_view) view_menu.addAction(fit_action) self.tools.append(fit_action) reset_action = QAction("&Reset (1:1)", self) reset_action.setShortcut("9") reset_action.setIcon(QIcon.fromTheme("zoom-original")) reset_action.setStatusTip("Reset the view to 100% scale") reset_action.triggered.connect(self.scene_view.reset_scale) view_menu.addAction(reset_action) self.tools.append(reset_action) zoom_in_action = QAction("Zoom &In", self) zoom_in_action.setShortcuts(["+", "="]) zoom_in_action.setStatusTip("Zoom in") zoom_in_action.triggered.connect(lambda: self.scene_view.zoom_in()) view_menu.addAction(zoom_in_action) zoom_out_action = QAction("Zoom &Out", self) zoom_out_action.setShortcuts(["-", "_"]) zoom_out_action.setStatusTip("Zoom out") zoom_out_action.triggered.connect(lambda: self.scene_view.zoom_out()) view_menu.addAction(zoom_out_action) export_svg_action = QAction("As &SVG...", self) export_svg_action.setStatusTip("Export the current tab as an SVG file") export_svg_action.triggered.connect(lambda: export_as_svg(self.scene)) export_menu.addAction(export_svg_action) export_png_action = QAction("As PN&G...", self) export_png_action.setStatusTip("Export the current tab as an PNG file") export_png_action.triggered.connect(lambda: export_as_png(self.scene)) export_menu.addAction(export_png_action) export_pdf_action = QAction("As &PDF...", self) export_pdf_action.setStatusTip("Export the current tab as an PDF file") export_pdf_action.triggered.connect(lambda: export_as_pdf(self.scene)) export_menu.addAction(export_pdf_action) export_svg_clip_action = QAction("To Clipboard as SVG", self) export_svg_clip_action.setStatusTip( "Export the current tab to the clipoard in SVG format") export_svg_clip_action.triggered.connect( lambda: export_to_clipboard_as_svg(self.scene)) export_menu.addAction(export_svg_clip_action) export_image_clip_action = QAction("To &Clipboard as Image", self) export_image_clip_action.setStatusTip( "Export the current tab to the clipoard as an image") export_image_clip_action.triggered.connect( lambda: export_to_clipboard_as_image(self.scene)) export_menu.addAction(export_image_clip_action) self.resize(800, 600)
def setupUI(self): textButtonStyle = "QPushButton {background-color: #151B54; color: white;} QPushButton:hover {background-color: #333972;} QPushButton:pressed { background-color: #515790;}" mainLayout = QGridLayout() commandBox = QVBoxLayout() commandBox.setSpacing(3) commandBar = QWidget() commandLayout1 = QBoxLayout(QBoxLayout.LeftToRight) commandLayout1.setSpacing(5) self.searchLineEdit = QLineEdit() self.searchLineEdit.setClearButtonEnabled(True) self.searchLineEdit.setToolTip( config.thisTranslation["enter_command_here"]) self.searchLineEdit.returnPressed.connect(self.searchLineEntered) self.searchLineEdit.setFixedWidth(450) commandLayout1.addWidget(self.searchLineEdit) enterButton = QPushButton(config.thisTranslation["enter"]) enterButton.setFixedWidth(100) enterButton.clicked.connect(self.searchLineEntered) commandLayout1.addWidget(enterButton) # commandLayout1.addStretch() commandBox.addLayout(commandLayout1) if config.showMiniKeyboardInMiniControl: commandLayout2 = QBoxLayout(QBoxLayout.LeftToRight) commandLayout2.setSpacing(5) keys = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ':', '-', ',', '.', ' ', '<', 'X' ] for key in keys: button = QPushButton(key) button.setMaximumWidth(30) button.clicked.connect(partial(self.keyEntryAction, key)) commandLayout2.addWidget(button) commandLayout2.addStretch() commandBox.addLayout(commandLayout2) if config.showMiniKeyboardInMiniControl and config.isTtsInstalled: ttsLayout = QBoxLayout(QBoxLayout.LeftToRight) ttsLayout.setSpacing(5) self.languageCombo = QComboBox() ttsLayout.addWidget(self.languageCombo) if config.espeak: languages = TtsLanguages().isoLang2epeakLang else: languages = TtsLanguages().isoLang2qlocaleLang self.languageCodes = list(languages.keys()) for code in self.languageCodes: self.languageCombo.addItem(languages[code][1]) # Check if selected tts engine has the language user specify. if not (config.ttsDefaultLangauge in self.languageCodes): config.ttsDefaultLangauge = "en" # Set initial item initialIndex = self.languageCodes.index(config.ttsDefaultLangauge) self.languageCombo.setCurrentIndex(initialIndex) # setting tts default language here is confusing; better place in menu #setDefaultButton = QPushButton(config.thisTranslation["setDefault"]) #setDefaultButton.setFixedWidth(130) #setDefaultButton.clicked.connect(self.setTtsDefaultLanguage) #ttsLayout.addWidget(setDefaultButton) speakButton = QPushButton(config.thisTranslation["speak"]) speakButton.setFixedWidth(100) speakButton.clicked.connect(self.speakCommandFieldText) ttsLayout.addWidget(speakButton) stopButton = QPushButton(config.thisTranslation["stop"]) stopButton.setFixedWidth(100) stopButton.clicked.connect( self.parent.textCommandParser.stopTtsAudio) ttsLayout.addWidget(stopButton) ttsLayout.addStretch() commandBox.addLayout(ttsLayout) commandBar.setLayout(commandBox) mainLayout.addWidget(commandBar, 0, 0, Qt.AlignCenter) self.tabs = QTabWidget() self.tabs.currentChanged.connect(self.tabChanged) mainLayout.addWidget(self.tabs, 1, 0, Qt.AlignCenter) parser = BibleVerseParser(config.parserStandarisation) self.bookMap = parser.standardAbbreviation bookNums = list(self.bookMap.keys()) self.bookNumGps = [ bookNums[0:10], bookNums[10:20], bookNums[20:30], bookNums[30:39], bookNums[39:49], bookNums[49:59], bookNums[59:69], bookNums[69:79], bookNums[79:86], bookNums[86:94], bookNums[94:99], bookNums[99:104], bookNums[104:110], bookNums[110:119], bookNums[119:124], bookNums[124:129], bookNums[129:139], bookNums[139:149], bookNums[149:159], bookNums[159:169], bookNums[169:174], bookNums[174:179], bookNums[179:189], bookNums[189:199], ] # Bible books tab self.bible = QWidget() self.populateBooksButtons(config.mainText) self.tabs.addTab(self.bible, config.thisTranslation["bible"]) # Bible translations tab self.biblesBox = QWidget() self.biblesBoxContainer = QVBoxLayout() collectionsLayout = self.newRowLayout() if len(config.bibleCollections) > 0: button = QPushButton("All") button.setStyleSheet(textButtonStyle) button.clicked.connect(partial(self.selectCollection, "All")) collectionsLayout.addWidget(button) count = 0 for collection in sorted(config.bibleCollections.keys()): button = QPushButton(collection) button.setStyleSheet(textButtonStyle) button.clicked.connect( partial(self.selectCollection, collection)) collectionsLayout.addWidget(button) count += 1 if count > 5: count = 0 self.biblesBoxContainer.addLayout(collectionsLayout) collectionsLayout = self.newRowLayout() self.biblesBoxContainer.addLayout(collectionsLayout) self.bibleBoxWidget = QWidget() self.bibleBoxLayout = QVBoxLayout() self.bibleBoxLayout.setContentsMargins(0, 0, 0, 0) self.bibleBoxLayout.setSpacing(1) row_layout = self.newRowLayout() row_layout.setContentsMargins(0, 0, 0, 0) row_layout.setSpacing(1) biblesSqlite = BiblesSqlite() bibles = biblesSqlite.getBibleList() count = 0 for bible in bibles: button = QPushButton(bible) if bible in config.bibleDescription: button.setToolTip("{0}".format(config.bibleDescription[bible])) button.clicked.connect(partial(self.bibleAction, bible)) row_layout.addWidget(button) count += 1 if count > 6: count = 0 self.bibleBoxLayout.addLayout(row_layout) row_layout = self.newRowLayout() self.bibleButtons[bible] = button self.bibleBoxLayout.addLayout(row_layout) self.bibleBoxLayout.addStretch() self.biblesBoxContainer.addLayout(self.bibleBoxLayout) self.biblesBoxContainer.addStretch() self.biblesBox.setLayout(self.biblesBoxContainer) self.tabs.addTab(self.biblesBox, config.thisTranslation["translations"]) # Commentaries tab commentaries_box = QWidget() box_layout = QVBoxLayout() box_layout.setContentsMargins(0, 0, 0, 0) box_layout.setSpacing(1) row_layout = self.newRowLayout() button = QPushButton(config.thisTranslation["activeOnly"]) button.setStyleSheet(textButtonStyle) button.clicked.connect(self.activeCommentaries) row_layout.addWidget(button) box_layout.addLayout(row_layout) row_layout = self.newRowLayout() commentaries = Commentary().getCommentaryList() count = 0 for commentary in commentaries: button = QPushButton(commentary) button.setToolTip(Commentary.fileLookup[commentary]) button.clicked.connect(partial(self.commentaryAction, commentary)) self.commentaryButtons[commentary] = button row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() commentaries_box.setLayout(box_layout) self.tabs.addTab(commentaries_box, config.thisTranslation["commentaries"]) # Lexicons tab lexicons_box = QWidget() box_layout = QVBoxLayout() box_layout.setContentsMargins(0, 0, 0, 0) box_layout.setSpacing(1) row_layout = self.newRowLayout() lexicons = LexiconData().lexiconList count = 0 for lexicon in lexicons: button = QPushButton(lexicon) if lexicon in config.lexiconDescription: button.setToolTip("{0}".format( config.lexiconDescription[lexicon])) button.clicked.connect(partial(self.lexiconAction, lexicon)) row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() lexicons_box.setLayout(box_layout) self.tabs.addTab(lexicons_box, config.thisTranslation["lexicons"]) # Dictionaries tab dictionaries_box = QWidget() box_layout = QVBoxLayout() box_layout.setContentsMargins(0, 0, 0, 0) box_layout.setSpacing(1) row_layout = self.newRowLayout() dictionaries = IndexesSqlite().dictionaryList count = 0 for dictionary in dictionaries: button = QPushButton(dictionary[0]) button.setToolTip(dictionary[1]) button.clicked.connect( partial(self.dictionaryAction, dictionary[0])) row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() dictionaries_box.setLayout(box_layout) self.tabs.addTab(dictionaries_box, config.thisTranslation["dictionaries"]) # Book intros tab bookIntros_box = QWidget() box_layout = QVBoxLayout() box_layout.setContentsMargins(0, 0, 0, 0) box_layout.setSpacing(1) row_layout = self.newRowLayout() button = QPushButton(config.thisTranslation["activeOnly"]) button.setStyleSheet(textButtonStyle) button.clicked.connect(self.activeBookIntros) row_layout.addWidget(button) box_layout.addLayout(row_layout) row_layout = self.newRowLayout() commentaries = Commentary().getCommentaryList() count = 0 for commentary in commentaries: button = QPushButton(commentary) button.setToolTip(Commentary.fileLookup[commentary]) button.clicked.connect(partial(self.bookIntroAction, commentary)) self.bookIntroButtons[commentary] = button row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() bookIntros_box.setLayout(box_layout) self.tabs.addTab(bookIntros_box, config.thisTranslation["bookIntro"]) # Devotionals tab if len(self.devotionals) > 0: devotionals_box = QWidget() box_layout = QVBoxLayout() box_layout.setContentsMargins(0, 0, 0, 0) box_layout.setSpacing(1) row_layout = self.newRowLayout() count = 0 for file in self.devotionals: name = Path(file).stem button = QPushButton(name) # button.setToolTip(dictionary[1]) button.clicked.connect(partial(self.devotionalAction, name)) row_layout.addWidget(button) count += 1 if count > 2: count = 0 box_layout.addLayout(row_layout) row_layout.addStretch() row_layout = self.newRowLayout() for i in range(count, 3): button = QPushButton("") row_layout.addWidget(button) box_layout.addLayout(row_layout) box_layout.addStretch() devotionals_box.setLayout(box_layout) self.tabs.addTab(devotionals_box, config.thisTranslation["devotionals"]) self.tabs.setCurrentIndex(config.miniControlInitialTab) self.setLayout(mainLayout)
def _move_widgets(widgets_list: List[Tuple[QWidget, int]], layout1: QBoxLayout, layout2: QBoxLayout): for el in widgets_list: layout1.removeWidget(el[0]) layout2.addWidget(el[0], el[1])
class ExtendedTabBar(QFrame): ''' A tab bar that has QToolBars to the left, right, and floating at the end of the tabs. Note that although this class inherits from QFrame, __getattr__() trickery is used to "inherit" the attributes of an internal object that inherits from QTabBar. This is done because it allows the actual tab bar object to be placed in a layout with other widgets, while allowing this class to be treated as the tab bar itself. ''' RoundedNorth = QTabBar.RoundedNorth RoundedSouth = QTabBar.RoundedSouth RoundedWest = QTabBar.RoundedWest RoundedEast = QTabBar.RoundedEast TriangularNorth = QTabBar.TriangularNorth TriangularSouth = QTabBar.TriangularSouth TriangularWest = QTabBar.TriangularWest TriangularEast = QTabBar.TriangularEast def __init__(self): super(ExtendedTabBar, self).__init__() self._tab_bar = _NoMinimumWidthTabBar() self._left_toolbar = QToolBar() self._floating_toolbar = QToolBar() self._right_toolbar = QToolBar() # Setup the layout. self._main_layout = QBoxLayout(QBoxLayout.LeftToRight) self._main_layout.setContentsMargins(0, 0, 0, 0) self._main_layout.setSpacing(0) self._main_layout.addWidget(self._left_toolbar) self._main_layout.addWidget(self._tab_bar) self._main_layout.addWidget(self._floating_toolbar) self._main_layout.addStretch() self._main_layout.addWidget(self._right_toolbar) self.setLayout(self._main_layout) def __getattr__(self, name): ''' Return the internal tab bar object's attributes if this class does not have the given attribute. ''' return self.__dict__.get(name, getattr(self._tab_bar, name)) def minimumSizeHint(self): ''' Add on any margins to the minimum size hint. Keeps the widget from getting sized so that the tab tops are cut off. ''' margins = self._main_layout.contentsMargins() minimum_size_hint = self._tab_bar.minimumSizeHint() if self.shape() in { QTabBar.RoundedNorth, QTabBar.RoundedSouth, QTabBar.TriangularNorth, QTabBar.TriangularSouth }: return minimum_size_hint + QSize(0, margins.top() + margins.bottom()) else: return minimum_size_hint + QSize(margins.left() + margins.right(), 0) def setShape(self, shape): ''' Sets the tab shapes. shape One of: ExtendedTabBar.RoundedNorth ExtendedTabBar.RoundedSouth ExtendedTabBar.RoundedWest ExtendedTabBar.RoundedEast ExtendedTabBar.TriangularNorth ExtendedTabBar.TriangularSouth ExtendedTabBar.TriangularWest ExtendedTabBar.TriangularEast ''' self._tab_bar.setShape(shape) if shape in { QTabBar.RoundedNorth, QTabBar.RoundedSouth, QTabBar.TriangularNorth, QTabBar.TriangularSouth }: direction = QBoxLayout.LeftToRight orientation = Qt.Horizontal else: direction = QBoxLayout.TopToBottom orientation = Qt.Vertical self._main_layout.setDirection(direction) self._left_toolbar.setOrientation(orientation) self._floating_toolbar.setOrientation(orientation) self._right_toolbar.setOrientation(orientation) @property def left_toolbar(self): ''' Returns the QToolBar to the left (top) of the tabs. ''' return self._left_toolbar @property def floating_toolbar(self): ''' Returns the QToolBar floating to the right (bottom) of the tabs. ''' return self._floating_toolbar @property def right_toolbar(self): ''' Returns the QToolBar to the right (bottom) of the tabs. ''' return self._right_toolbar
class ExtendedTabWidget(QFrame): ''' Like QTabWidget, except the tab bar is located elsewhere. Intended for use with ExtendedTabBar. ''' def __init__(self): super(ExtendedTabWidget, self).__init__() self._tab_bar = None self._stack = QStackedWidget() self._main_layout = QBoxLayout(QBoxLayout.LeftToRight) self._main_layout.setContentsMargins(0, 0, 0, 0) self._main_layout.addWidget(self._stack) self.setLayout(self._main_layout) def _move_tab(self, from_, to): ''' Handles tab moves so that the tab bar indices stay aligned with the widget stack indices. ''' displaced_widget = self._stack.widget(from_) moved_widget = self._stack.widget(to) self._stack.removeWidget(moved_widget) self._stack.removeWidget(displaced_widget) self._stack.insertWidget(to, displaced_widget) self._stack.insertWidget(from_, moved_widget) self._stack.setCurrentIndex(self._tab_bar.currentIndex()) def setTabBar(self, tab_bar): ''' Sets the tab bar that will be used to switch between tabs. tab_bar The tab bar to set as the controller of this widget. ''' if self._tab_bar is not None: raise Exception('Tab bar already set.') self._tab_bar = tab_bar tab_bar.currentChanged.connect(self._stack.setCurrentIndex) tab_bar.tabCloseRequested.connect(self.closeTab) tab_bar.tabMoved.connect(self._move_tab) def closeTab(self, index): ''' Closes a tab, removing from this widget, the tab bar, and deleting its widget. index Index of the tab to be closed. ''' self._tab_bar.removeTab(index) widget = self._stack.widget(index) self._stack.removeWidget(widget) widget.deleteLater() self._stack.setCurrentIndex(self._tab_bar.currentIndex()) def addTab(self, widget, label): ''' Adds a tab. widget The widget for the tab contents. label The name of the tab to show in the tab bar. Returns the index of the added tab. ''' index = self._tab_bar.addTab(label) self._stack.insertWidget(index, widget) return index def count(self): ''' Returns the number of widgets. ''' return self._stack.count() def widget(self, index): ''' Returns the widget at the given index. ''' return self._stack.widget(index) def indexOf(self, widget): ''' Returns the index of the given widget. ''' return self._stack.indexOf(widget)
def setupUI(self): mainLayout = QGridLayout() commandBox = QVBoxLayout() commandBox.setSpacing(3) commandBar = QWidget() commandLayout1 = QBoxLayout(QBoxLayout.LeftToRight) commandLayout1.setSpacing(5) self.searchLineEdit = QLineEdit() self.searchLineEdit.setClearButtonEnabled(True) self.searchLineEdit.setToolTip( config.thisTranslation["enter_command_here"]) self.searchLineEdit.returnPressed.connect(self.searchLineEntered) self.searchLineEdit.setFixedWidth(300) commandLayout1.addWidget(self.searchLineEdit) enterButton = QPushButton(config.thisTranslation["enter"]) enterButton.setFixedWidth(100) enterButton.clicked.connect(self.searchLineEntered) commandLayout1.addWidget(enterButton) commandLayout1.addStretch() commandBox.addLayout(commandLayout1) commandLayout2 = QBoxLayout(QBoxLayout.LeftToRight) commandLayout2.setSpacing(5) keys = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ':', '-', ',', '.', ' ', '<', 'X' ] for key in keys: button = QPushButton(key) button.setMaximumWidth(30) button.clicked.connect(partial(self.keyEntryAction, key)) commandLayout2.addWidget(button) commandLayout2.addStretch() commandBox.addLayout(commandLayout2) if config.isTtsInstalled: ttsLayout = QBoxLayout(QBoxLayout.LeftToRight) ttsLayout.setSpacing(5) self.languageCombo = QComboBox() ttsLayout.addWidget(self.languageCombo) if config.espeak: languages = TtsLanguages().isoLang2epeakLang else: languages = TtsLanguages().isoLang2qlocaleLang self.languageCodes = list(languages.keys()) for code in self.languageCodes: self.languageCombo.addItem(languages[code][1]) # Check if selected tts engine has the language user specify. if not (config.ttsDefaultLangauge in self.languageCodes): config.ttsDefaultLangauge = "en" # Set initial item initialIndex = self.languageCodes.index(config.ttsDefaultLangauge) self.languageCombo.setCurrentIndex(initialIndex) # setting tts default language here is confusing; better place in menu #setDefaultButton = QPushButton(config.thisTranslation["setDefault"]) #setDefaultButton.setFixedWidth(130) #setDefaultButton.clicked.connect(self.setTtsDefaultLanguage) #ttsLayout.addWidget(setDefaultButton) speakButton = QPushButton(config.thisTranslation["speak"]) speakButton.setFixedWidth(100) speakButton.clicked.connect(self.speakCommandFieldText) ttsLayout.addWidget(speakButton) stopButton = QPushButton(config.thisTranslation["stop"]) stopButton.setFixedWidth(100) stopButton.clicked.connect( self.parent.textCommandParser.stopTtsAudio) ttsLayout.addWidget(stopButton) ttsLayout.addStretch() commandBox.addLayout(ttsLayout) commandBar.setLayout(commandBox) mainLayout.addWidget(commandBar, 0, 0, Qt.AlignCenter) self.tabs = QTabWidget() self.tabs.currentChanged.connect(self.tabChanged) mainLayout.addWidget(self.tabs, 1, 0, Qt.AlignCenter) parser = BibleVerseParser(config.parserStandarisation) self.bookMap = parser.standardAbbreviation bookNums = list(self.bookMap.keys()) bookNumGps = [ bookNums[0:10], bookNums[10:20], bookNums[20:30], bookNums[30:39], bookNums[39:49], bookNums[49:59], bookNums[59:66], ] bible = QWidget() bible_layout = QVBoxLayout() bible_layout.setMargin(0) bible_layout.setSpacing(0) for bookNumGp in bookNumGps[0:5]: gp = QWidget() layout = self.newRowLayout() for bookNum in bookNumGp: text = self.bookMap[bookNum] button = QPushButton(text) button.clicked.connect(partial(self.bibleBookAction, bookNum)) layout.addWidget(button) gp.setLayout(layout) bible_layout.addWidget(gp) for bookNumGp in bookNumGps[5:]: gp = QWidget() layout = self.newRowLayout() for bookNum in bookNumGp: text = self.bookMap[bookNum] button = QPushButton(text) button.clicked.connect(partial(self.bibleBookAction, bookNum)) layout.addWidget(button) gp.setLayout(layout) bible_layout.addWidget(gp) bible_layout.addStretch() bible.setLayout(bible_layout) self.tabs.addTab(bible, config.thisTranslation["bible"]) bibles_box = QWidget() box_layout = QVBoxLayout() box_layout.setMargin(0) box_layout.setSpacing(0) row_layout = self.newRowLayout() biblesSqlite = BiblesSqlite() bibles = biblesSqlite.getBibleList() count = 0 for bible in bibles: button = QPushButton(bible) button.clicked.connect(partial(self.bibleAction, bible)) row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() bibles_box.setLayout(box_layout) self.tabs.addTab(bibles_box, config.thisTranslation["translations"]) commentaries_box = QWidget() box_layout = QVBoxLayout() box_layout.setMargin(0) box_layout.setSpacing(0) row_layout = self.newRowLayout() commentaries = Commentary().getCommentaryList() count = 0 for commentary in commentaries: button = QPushButton(commentary) button.clicked.connect(partial(self.commentaryAction, commentary)) row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() commentaries_box.setLayout(box_layout) self.tabs.addTab(commentaries_box, config.thisTranslation["commentaries"]) lexicons_box = QWidget() box_layout = QVBoxLayout() box_layout.setMargin(0) box_layout.setSpacing(0) row_layout = self.newRowLayout() lexicons = LexiconData().lexiconList count = 0 for lexicon in lexicons: button = QPushButton(lexicon) button.clicked.connect(partial(self.lexiconAction, lexicon)) row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() lexicons_box.setLayout(box_layout) self.tabs.addTab(lexicons_box, config.thisTranslation["lexicons"]) dictionaries_box = QWidget() box_layout = QVBoxLayout() box_layout.setMargin(0) box_layout.setSpacing(0) row_layout = self.newRowLayout() dictionaries = IndexesSqlite().dictionaryList count = 0 for dictionary in dictionaries: button = QPushButton(dictionary[0]) button.setToolTip(dictionary[1]) button.clicked.connect( partial(self.dictionaryAction, dictionary[0])) row_layout.addWidget(button) count += 1 if count > 6: count = 0 box_layout.addLayout(row_layout) row_layout = self.newRowLayout() box_layout.addLayout(row_layout) box_layout.addStretch() dictionaries_box.setLayout(box_layout) self.tabs.addTab(dictionaries_box, config.thisTranslation["dictionaries"]) self.tabs.setCurrentIndex(config.miniControlInitialTab) self.setLayout(mainLayout)