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 # 0.1.2
* Switch from Markdown to HTML via QTextEdit, with a toolbar * Switch from Markdown to HTML via QTextEdit, with a toolbar

View file

@ -1,7 +1,7 @@
from __future__ import annotations from __future__ import annotations
from PySide6.QtCore import Signal, Qt from PySide6.QtCore import Signal, Qt
from PySide6.QtGui import QAction from PySide6.QtGui import QAction, QKeySequence, QFont, QFontDatabase
from PySide6.QtWidgets import QToolBar from PySide6.QtWidgets import QToolBar
@ -18,82 +18,131 @@ class ToolBar(QToolBar):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__("Format", parent) super().__init__("Format", parent)
self._build_actions()
self.setObjectName("Format") self.setObjectName("Format")
self.setToolButtonStyle(Qt.ToolButtonTextOnly)
self._build_actions()
self._apply_toolbar_styles()
def _build_actions(self): def _build_actions(self):
# Bold self.actBold = QAction("Bold", self)
bold = QAction("Bold", self) self.actBold.setShortcut(QKeySequence.Bold)
bold.setShortcut("Ctrl+B") self.actBold.triggered.connect(self.boldRequested)
bold.triggered.connect(self.boldRequested)
italic = QAction("Italic", self) self.actItalic = QAction("Italic", self)
italic.setShortcut("Ctrl+I") self.actItalic.setShortcut(QKeySequence.Italic)
italic.triggered.connect(self.italicRequested) self.actItalic.triggered.connect(self.italicRequested)
underline = QAction("Underline", self) self.actUnderline = QAction("Underline", self)
underline.setShortcut("Ctrl+U") self.actUnderline.setShortcut(QKeySequence.Underline)
underline.triggered.connect(self.underlineRequested) self.actUnderline.triggered.connect(self.underlineRequested)
strike = QAction("Strikethrough", self) self.actStrike = QAction("Strikethrough", self)
strike.setShortcut("Ctrl+-") self.actStrike.setShortcut("Ctrl+-")
strike.triggered.connect(self.strikeRequested) self.actStrike.triggered.connect(self.strikeRequested)
code = QAction("<code>", self) self.actCode = QAction("Inline code", self)
code.setShortcut("Ctrl+`") self.actCode.setShortcut("Ctrl+`")
code.triggered.connect(self.codeRequested) self.actCode.triggered.connect(self.codeRequested)
# Headings # Headings
h1 = QAction("H1", self) self.actH1 = QAction("Heading 1", self)
h1.setShortcut("Ctrl+1") self.actH2 = QAction("Heading 2", self)
h2 = QAction("H2", self) self.actH3 = QAction("Heading 3", self)
h2.setShortcut("Ctrl+2") self.actNormal = QAction("Normal text", self)
h3 = QAction("H3", self) self.actH1.setShortcut("Ctrl+1")
h3.setShortcut("Ctrl+3") self.actH2.setShortcut("Ctrl+2")
normal = QAction("Normal", self) self.actH3.setShortcut("Ctrl+3")
normal.setShortcut("Ctrl+P") self.actNormal.setShortcut("Ctrl+N")
self.actH1.triggered.connect(lambda: self.headingRequested.emit(24))
h1.triggered.connect(lambda: self.headingRequested.emit(24)) self.actH2.triggered.connect(lambda: self.headingRequested.emit(18))
h2.triggered.connect(lambda: self.headingRequested.emit(18)) self.actH3.triggered.connect(lambda: self.headingRequested.emit(14))
h3.triggered.connect(lambda: self.headingRequested.emit(14)) self.actNormal.triggered.connect(lambda: self.headingRequested.emit(0))
normal.triggered.connect(lambda: self.headingRequested.emit(0))
# Lists # Lists
bullets = QAction("• Bullets", self) self.actBullets = QAction("Bulleted list", self)
bullets.triggered.connect(self.bulletsRequested) self.actBullets.triggered.connect(self.bulletsRequested)
numbers = QAction("1. Numbered", self) self.actNumbers = QAction("Numbered list", self)
numbers.triggered.connect(self.numbersRequested) self.actNumbers.triggered.connect(self.numbersRequested)
# Alignment # Alignment
left = QAction("Align Left", self) self.actAlignL = QAction("Align left", self)
center = QAction("Align Center", self) self.actAlignC = QAction("Align center", self)
right = QAction("Align Right", self) self.actAlignR = QAction("Align right", self)
self.actAlignL.triggered.connect(lambda: self.alignRequested.emit(Qt.AlignLeft))
left.triggered.connect( self.actAlignC.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignmentFlag.AlignLeft) lambda: self.alignRequested.emit(Qt.AlignHCenter)
) )
center.triggered.connect( self.actAlignR.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignmentFlag.AlignHCenter) lambda: self.alignRequested.emit(Qt.AlignRight)
)
right.triggered.connect(
lambda: self.alignRequested.emit(Qt.AlignmentFlag.AlignRight)
) )
self.addActions( self.addActions(
[ [
bold, self.actBold,
italic, self.actItalic,
underline, self.actUnderline,
strike, self.actStrike,
code, self.actCode,
h1, self.actH1,
h2, self.actH2,
h3, self.actH3,
normal, self.actNormal,
bullets, self.actBullets,
numbers, self.actNumbers,
left, self.actAlignL,
center, self.actAlignC,
right, 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())