Abbreviated toolbar symbols and add tooltips

This commit is contained in:
Miguel Jacq 2025-11-02 11:56:28 +11:00
parent 43bbe971eb
commit 6cae652643
Signed by: mig5
GPG key ID: 59B3F0C24135C6A9
2 changed files with 118 additions and 60 deletions

View file

@ -1,3 +1,12 @@
# 0.1.3
* Fix bold toggle
* Improvements to preview size in search results
* Make URLs highlighted and clickable (Ctrl+click)
* Explain the purpose of the encryption key for first-time use
* Support saving the encryption key to the settings file to avoid being prompted (off by default)
* Abbreviated toolbar symbols to keep things tidier. Add tooltips
# 0.1.2
* Switch from Markdown to HTML via QTextEdit, with a toolbar

View file

@ -1,7 +1,7 @@
from __future__ import annotations
from PySide6.QtCore import Signal, Qt
from PySide6.QtGui import QAction
from PySide6.QtGui import QAction, QKeySequence, QFont, QFontDatabase
from PySide6.QtWidgets import QToolBar
@ -18,82 +18,131 @@ class ToolBar(QToolBar):
def __init__(self, parent=None):
super().__init__("Format", parent)
self._build_actions()
self.setObjectName("Format")
self.setToolButtonStyle(Qt.ToolButtonTextOnly)
self._build_actions()
self._apply_toolbar_styles()
def _build_actions(self):
# Bold
bold = QAction("Bold", self)
bold.setShortcut("Ctrl+B")
bold.triggered.connect(self.boldRequested)
self.actBold = QAction("Bold", self)
self.actBold.setShortcut(QKeySequence.Bold)
self.actBold.triggered.connect(self.boldRequested)
italic = QAction("Italic", self)
italic.setShortcut("Ctrl+I")
italic.triggered.connect(self.italicRequested)
self.actItalic = QAction("Italic", self)
self.actItalic.setShortcut(QKeySequence.Italic)
self.actItalic.triggered.connect(self.italicRequested)
underline = QAction("Underline", self)
underline.setShortcut("Ctrl+U")
underline.triggered.connect(self.underlineRequested)
self.actUnderline = QAction("Underline", self)
self.actUnderline.setShortcut(QKeySequence.Underline)
self.actUnderline.triggered.connect(self.underlineRequested)
strike = QAction("Strikethrough", self)
strike.setShortcut("Ctrl+-")
strike.triggered.connect(self.strikeRequested)
self.actStrike = QAction("Strikethrough", self)
self.actStrike.setShortcut("Ctrl+-")
self.actStrike.triggered.connect(self.strikeRequested)
code = QAction("<code>", self)
code.setShortcut("Ctrl+`")
code.triggered.connect(self.codeRequested)
self.actCode = QAction("Inline code", self)
self.actCode.setShortcut("Ctrl+`")
self.actCode.triggered.connect(self.codeRequested)
# Headings
h1 = QAction("H1", self)
h1.setShortcut("Ctrl+1")
h2 = QAction("H2", self)
h2.setShortcut("Ctrl+2")
h3 = QAction("H3", self)
h3.setShortcut("Ctrl+3")
normal = QAction("Normal", self)
normal.setShortcut("Ctrl+P")
h1.triggered.connect(lambda: self.headingRequested.emit(24))
h2.triggered.connect(lambda: self.headingRequested.emit(18))
h3.triggered.connect(lambda: self.headingRequested.emit(14))
normal.triggered.connect(lambda: self.headingRequested.emit(0))
self.actH1 = QAction("Heading 1", self)
self.actH2 = QAction("Heading 2", self)
self.actH3 = QAction("Heading 3", self)
self.actNormal = QAction("Normal text", self)
self.actH1.setShortcut("Ctrl+1")
self.actH2.setShortcut("Ctrl+2")
self.actH3.setShortcut("Ctrl+3")
self.actNormal.setShortcut("Ctrl+N")
self.actH1.triggered.connect(lambda: self.headingRequested.emit(24))
self.actH2.triggered.connect(lambda: self.headingRequested.emit(18))
self.actH3.triggered.connect(lambda: self.headingRequested.emit(14))
self.actNormal.triggered.connect(lambda: self.headingRequested.emit(0))
# Lists
bullets = QAction("• Bullets", self)
bullets.triggered.connect(self.bulletsRequested)
numbers = QAction("1. Numbered", self)
numbers.triggered.connect(self.numbersRequested)
self.actBullets = QAction("Bulleted list", self)
self.actBullets.triggered.connect(self.bulletsRequested)
self.actNumbers = QAction("Numbered list", self)
self.actNumbers.triggered.connect(self.numbersRequested)
# Alignment
left = QAction("Align Left", self)
center = QAction("Align Center", self)
right = QAction("Align Right", self)
left.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignmentFlag.AlignLeft)
self.actAlignL = QAction("Align left", self)
self.actAlignC = QAction("Align center", self)
self.actAlignR = QAction("Align right", self)
self.actAlignL.triggered.connect(lambda: self.alignRequested.emit(Qt.AlignLeft))
self.actAlignC.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignHCenter)
)
center.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignmentFlag.AlignHCenter)
)
right.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignmentFlag.AlignRight)
self.actAlignR.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignRight)
)
self.addActions(
[
bold,
italic,
underline,
strike,
code,
h1,
h2,
h3,
normal,
bullets,
numbers,
left,
center,
right,
self.actBold,
self.actItalic,
self.actUnderline,
self.actStrike,
self.actCode,
self.actH1,
self.actH2,
self.actH3,
self.actNormal,
self.actBullets,
self.actNumbers,
self.actAlignL,
self.actAlignC,
self.actAlignR,
]
)
def _apply_toolbar_styles(self):
self._style_letter_button(self.actBold, "B", bold=True)
self._style_letter_button(self.actItalic, "I", italic=True)
self._style_letter_button(self.actUnderline, "U", underline=True)
self._style_letter_button(self.actStrike, "S", strike=True)
# Monospace look for code; use a fixed font
code_font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
self._style_letter_button(self.actCode, "</>", custom_font=code_font)
# Headings
self._style_letter_button(self.actH1, "H1")
self._style_letter_button(self.actH2, "H2")
self._style_letter_button(self.actH3, "H3")
self._style_letter_button(self.actNormal, "N")
# Lists
self._style_letter_button(self.actBullets, "")
self._style_letter_button(self.actNumbers, "1.")
# Alignment
self._style_letter_button(self.actAlignL, "L")
self._style_letter_button(self.actAlignC, "C")
self._style_letter_button(self.actAlignR, "R")
def _style_letter_button(
self,
action: QAction,
text: str,
*,
bold: bool = False,
italic: bool = False,
underline: bool = False,
strike: bool = False,
custom_font: QFont | None = None,
):
btn = self.widgetForAction(action)
if not btn:
return
btn.setText(text)
f = custom_font if custom_font is not None else QFont(btn.font())
if custom_font is None:
f.setBold(bold)
f.setItalic(italic)
f.setUnderline(underline)
f.setStrikeOut(strike)
btn.setFont(f)
# Keep accessibility/tooltip readable
btn.setToolTip(action.text())
btn.setAccessibleName(action.text())