From 80872fecebf34a177843a313e46c1b7f24b816d2 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sun, 17 May 2020 16:08:58 +0200 Subject: [PATCH] Paged dialog with vertical tabs now working --- nw/gui/additions/pageddialog.py | 79 ++++++++++++++++++++++++++++----- nw/gui/dialogs/configeditor.py | 28 ++++-------- nw/gui/dialogs/projecteditor.py | 8 ++-- 3 files changed, 79 insertions(+), 36 deletions(-) diff --git a/nw/gui/additions/pageddialog.py b/nw/gui/additions/pageddialog.py index 5f06c84e..40ba8656 100644 --- a/nw/gui/additions/pageddialog.py +++ b/nw/gui/additions/pageddialog.py @@ -28,9 +28,11 @@ import logging import nw -from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt, QRect, QPoint +from PyQt5.QtGui import QPalette from PyQt5.QtWidgets import ( - QDialog, QHBoxLayout, QVBoxLayout, QTabWidget + QWidget, QDialog, QHBoxLayout, QVBoxLayout, QTabWidget, QTabBar, + QStylePainter, QStyleOptionTab, QStyle, QLabel ) from nw.constants import nwUnicode @@ -40,26 +42,79 @@ logger = logging.getLogger(__name__) class PagedDialog(QDialog): def __init__(self, parent=None): - super().__init__(parent=parent) + QDialog.__init__(self, parent=parent) - self._outerBox = QVBoxLayout() - self._innerBox = QHBoxLayout() - self._navBox = QVBoxLayout() - self._tabBox = QTabWidget() + self._outerBox = QVBoxLayout() + self._buttonBox = QHBoxLayout() + self._tabBox = QTabWidget() - self._outerBox.addLayout(self._innerBox) - self._innerBox.addLayout(self._navBox) - self._innerBox.addWidget(self._tabBox) + self._tabBar = VerticalTabBar(self) + self._tabBox.setTabBar(self._tabBar) + self._tabBox.setTabPosition(QTabWidget.West) + self._tabBar.setExpanding(False) + + self._outerBox.addWidget(self._tabBox) + self._outerBox.addLayout(self._buttonBox) self.setLayout(self._outerBox) + # Default Margins + qM = self._outerBox.contentsMargins() + mL = qM.left() + mR = qM.right() + mT = qM.top() + mB = qM.bottom() + + self.setContentsMargins(0, 0, 0, 0) + self._outerBox.setContentsMargins(0, 0, 0, mB) + self._buttonBox.setContentsMargins(mL, 0, mR, 0) + self._outerBox.setSpacing(mT) + return - def addPage(self, tabWidget, tabLabel): + def addTab(self, tabWidget, tabLabel): self._tabBox.addTab(tabWidget, tabLabel) return def addControls(self, buttonBar): - self._outerBox.addWidget(buttonBar) + self._buttonBox.addWidget(buttonBar) return # END Class PagedDialog + +class VerticalTabBar(QTabBar): + + def __init__(self, parent=None): + QTabBar.__init__(self, parent=parent) + return + + def tabSizeHint(self, theIndex): + tSize = QTabBar.tabSizeHint(self, theIndex) + tSize.transpose() + return tSize + + def paintEvent(self, theEvent): + + pObj = QStylePainter(self) + oObj = QStyleOptionTab() + + for i in range(self.count()): + self.initStyleOption(oObj, i) + pObj.drawControl(QStyle.CE_TabBarTabShape, oObj) + pObj.save() + + oSize = oObj.rect.size() + oSize.transpose() + oRect = QRect(QPoint(), oSize) + oRect.moveCenter(oObj.rect.center()) + oObj.rect = oRect + + oCenter = self.tabRect(i).center() + pObj.translate(oCenter) + pObj.rotate(90) + pObj.translate(-oCenter) + pObj.drawControl(QStyle.CE_TabBarTabLabel, oObj) + pObj.restore() + + return + +# END Class VerticalTabBar diff --git a/nw/gui/dialogs/configeditor.py b/nw/gui/dialogs/configeditor.py index da3158c0..61726a93 100644 --- a/nw/gui/dialogs/configeditor.py +++ b/nw/gui/dialogs/configeditor.py @@ -38,51 +38,39 @@ from PyQt5.QtWidgets import ( QFileDialog ) -from nw.gui.additions import QSwitch, QConfigLayout +from nw.gui.additions import QSwitch, QConfigLayout, PagedDialog from nw.core import NWSpellCheck, NWSpellSimple, NWSpellEnchant from nw.constants import nwAlert, nwQuotes logger = logging.getLogger(__name__) -class GuiConfigEditor(QDialog): +class GuiConfigEditor(PagedDialog): def __init__(self, theParent, theProject): - QDialog.__init__(self, theParent) + PagedDialog.__init__(self, theParent) logger.debug("Initialising ConfigEditor ...") self.mainConf = nw.CONFIG self.theParent = theParent self.theProject = theProject - self.outerBox = QHBoxLayout() - self.innerBox = QVBoxLayout() self.setWindowTitle("Preferences") - self.guiDeco = self.theParent.theTheme.loadDecoration("settings", (64,64)) - self.outerBox.setSpacing(16) - - self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) - self.outerBox.addLayout(self.innerBox) - self.setLayout(self.outerBox) self.tabGeneral = GuiConfigEditGeneralTab(self.theParent) self.tabLayout = GuiConfigEditLayoutTab(self.theParent) self.tabEditing = GuiConfigEditEditingTab(self.theParent) self.tabAutoRep = GuiConfigEditAutoReplaceTab(self.theParent) - self.tabWidget = QTabWidget() - self.tabWidget.setMinimumWidth(600) - self.tabWidget.addTab(self.tabGeneral, "General") - self.tabWidget.addTab(self.tabLayout, "Layout") - self.tabWidget.addTab(self.tabEditing, "Editing") - self.tabWidget.addTab(self.tabAutoRep, "Auto-Replace") + self.addTab(self.tabGeneral, "General") + self.addTab(self.tabLayout, "Layout") + self.addTab(self.tabEditing, "Editing") + self.addTab(self.tabAutoRep, "Auto-Replace") self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox.accepted.connect(self._doSave) self.buttonBox.rejected.connect(self._doClose) - - self.innerBox.addWidget(self.tabWidget) - self.innerBox.addWidget(self.buttonBox) + self.addControls(self.buttonBox) self.show() diff --git a/nw/gui/dialogs/projecteditor.py b/nw/gui/dialogs/projecteditor.py index 9c5b4ba4..4c425770 100644 --- a/nw/gui/dialogs/projecteditor.py +++ b/nw/gui/dialogs/projecteditor.py @@ -61,10 +61,10 @@ class GuiProjectEditor(PagedDialog): self.tabImport = GuiProjectEditStatus(self.theParent, self.theProject.importItems) self.tabReplace = GuiProjectEditReplace(self.theParent, self.theProject) - self.addPage(self.tabMain, "Settings") - self.addPage(self.tabStatus, "Status") - self.addPage(self.tabImport, "Importance") - self.addPage(self.tabReplace,"Auto-Replace") + self.addTab(self.tabMain, "Settings") + self.addTab(self.tabStatus, "Status") + self.addTab(self.tabImport, "Importance") + self.addTab(self.tabReplace,"Auto-Replace") self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox.accepted.connect(self._doSave)