Double the left margin of the button text for the paged side bar

This commit is contained in:
Veronica Berglyd Olsen
2023-08-06 15:08:57 +02:00
parent 762f7c62cd
commit c480db898c
+28 -23
View File
@@ -1,7 +1,6 @@
""" """
novelWriter Custom Widget: Paged SideBar novelWriter Custom Widget: Paged SideBar
========================================== ==========================================
A custom widget for making a sidebar for flipping through pages
File History: File History:
Created: 2023-02-21 [2.1b1] NPagedSideBar Created: 2023-02-21 [2.1b1] NPagedSideBar
@@ -24,20 +23,26 @@ General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from __future__ import annotations
from PyQt5.QtGui import QColor, QPainter from PyQt5.QtGui import QColor, QPaintEvent, QPainter
from PyQt5.QtCore import QRectF, Qt, pyqtSignal, pyqtSlot from PyQt5.QtCore import QRectF, Qt, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QButtonGroup, QLabel, QSizePolicy, QStyle, QStyleOptionToolButton, QToolBar, QAbstractButton, QAction, QButtonGroup, QLabel, QSizePolicy, QStyle,
QToolButton, QWidget QStyleOptionToolButton, QToolBar, QToolButton, QWidget
) )
class NPagedSideBar(QToolBar): class NPagedSideBar(QToolBar):
"""Extensions: Paged Side Bar
A side bar widget that holds buttons that mimic tabs. It is designed
to be used in combination with a QStackedWidget for options panels.
"""
buttonClicked = pyqtSignal(int) buttonClicked = pyqtSignal(int)
def __init__(self, parent): def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
self._buttons = [] self._buttons = []
@@ -58,7 +63,7 @@ class NPagedSideBar(QToolBar):
return return
def setLabelColor(self, color): def setLabelColor(self, color: list | QColor) -> None:
"""Set the text color for the labels.""" """Set the text color for the labels."""
if isinstance(color, list): if isinstance(color, list):
self._labelCol = QColor(*color) self._labelCol = QColor(*color)
@@ -66,7 +71,7 @@ class NPagedSideBar(QToolBar):
self._labelCol = color self._labelCol = color
return return
def addSeparator(self): def addSeparator(self) -> None:
"""Add a spacer widget.""" """Add a spacer widget."""
spacer = QWidget(self) spacer = QWidget(self)
spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
@@ -74,16 +79,16 @@ class NPagedSideBar(QToolBar):
self.insertWidget(self._stretchAction, spacer) self.insertWidget(self._stretchAction, spacer)
return return
def addLabel(self, text): def addLabel(self, text: str) -> None:
"""Add a new label to the toolbar.""" """Add a new label to the toolbar."""
label = NPagedToolLabel(self, self._labelCol) label = _NPagedToolLabel(self, self._labelCol)
label.setText(text) label.setText(text)
self.insertWidget(self._stretchAction, label) self.insertWidget(self._stretchAction, label)
return return
def addButton(self, text, buttonId=-1): def addButton(self, text: str, buttonId: int = -1) -> QAction:
"""Add a new button to the toolbar.""" """Add a new button to the toolbar."""
button = NPagedToolButton(self) button = _NPagedToolButton(self)
button.setText(text) button.setText(text)
action = self.insertWidget(self._stretchAction, button) action = self.insertWidget(self._stretchAction, button)
@@ -94,7 +99,7 @@ class NPagedSideBar(QToolBar):
return action return action
def setSelected(self, buttonId): def setSelected(self, buttonId: int) -> None:
"""Set the selected button.""" """Set the selected button."""
self._group.button(buttonId).setChecked(True) self._group.button(buttonId).setChecked(True)
return return
@@ -104,7 +109,7 @@ class NPagedSideBar(QToolBar):
## ##
@pyqtSlot("QAbstractButton*") @pyqtSlot("QAbstractButton*")
def _buttonClicked(self, button): def _buttonClicked(self, button: QAbstractButton) -> None:
"""A button was clicked in the group, emit its id.""" """A button was clicked in the group, emit its id."""
buttonId = self._group.id(button) buttonId = self._group.id(button)
if buttonId != -1: if buttonId != -1:
@@ -114,11 +119,11 @@ class NPagedSideBar(QToolBar):
# END Class NPagedSideBar # END Class NPagedSideBar
class NPagedToolButton(QToolButton): class _NPagedToolButton(QToolButton):
__slots__ = ("_bH", "_tM", "_lM", "_cR") __slots__ = ("_bH", "_tM", "_lM", "_cR")
def __init__(self, parent): def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
@@ -133,7 +138,7 @@ class NPagedToolButton(QToolButton):
return return
def paintEvent(self, event): def paintEvent(self, event: QPaintEvent) -> None:
"""Overload the paint event to draw a simple, left aligned text """Overload the paint event to draw a simple, left aligned text
label, with a highlight when selected and a transparent base label, with a highlight when selected and a transparent base
colour when hovered. colour when hovered.
@@ -164,23 +169,23 @@ class NPagedToolButton(QToolButton):
else: else:
textCol = palette.text().color() textCol = palette.text().color()
tW = width - 2*self._lM tW = width - 3*self._lM
tH = height - 2*self._tM tH = height - 2*self._tM
paint.setPen(textCol) paint.setPen(textCol)
paint.setOpacity(1.0) paint.setOpacity(1.0)
paint.drawText(QRectF(self._lM, self._tM, tW, tH), Qt.AlignLeft, self.text()) paint.drawText(QRectF(2*self._lM, self._tM, tW, tH), Qt.AlignLeft, self.text())
return return
# END Class NPagedToolButton # END Class _NPagedToolButton
class NPagedToolLabel(QLabel): class _NPagedToolLabel(QLabel):
__slots__ = ("_bH", "_tM", "_lM", "_textCol") __slots__ = ("_bH", "_tM", "_lM", "_textCol")
def __init__(self, parent, textColor=None): def __init__(self, parent: QWidget, textColor: QColor | None = None) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
@@ -195,7 +200,7 @@ class NPagedToolLabel(QLabel):
return return
def paintEvent(self, event): def paintEvent(self, event: QPaintEvent) -> None:
"""Overload the paint event to draw a simple, left aligned text """Overload the paint event to draw a simple, left aligned text
label that matches the button style. label that matches the button style.
""" """
@@ -215,4 +220,4 @@ class NPagedToolLabel(QLabel):
return return
# END Class NPagedToolLabel # END Class _NPagedToolLabel