Skip to content

Commit 7737395

Browse files
Merge pull request #1378 from MustardBell/develop-mustardbell_fix-tooltip-contrast
feat(settings): add configurable tooltip styling with system‑default toggle
2 parents 644aef6 + bac3645 commit 7737395

File tree

7 files changed

+339
-3
lines changed

7 files changed

+339
-3
lines changed
Lines changed: 10 additions & 0 deletions
Loading
Lines changed: 10 additions & 0 deletions
Loading

manuskript/main.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ def respectSystemDarkThemeSetting():
165165

166166
respectSystemDarkThemeSetting()
167167

168+
# Apply configurable tooltip styling
169+
from manuskript import settings as manuskript_settings
170+
manuskript_settings.applyTooltipStyle()
171+
168172
QIcon.setThemeSearchPaths(QIcon.themeSearchPaths() + [appPath("icons")])
169173
QIcon.setThemeName("NumixMsk")
170174

manuskript/settings.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@
107107
"phraseMax": 5
108108
}
109109

110+
tooltipStyle = {
111+
"useSystemDefaultsForTooltips": True,
112+
"textColor": "#000000",
113+
"backgroundColor": "#ffffdc",
114+
"borderColor": "#767676"
115+
}
116+
110117
viewMode = "fiction" # simple, fiction
111118
saveToZip = False
112119
dontShowDeleteWarning = False
@@ -124,12 +131,20 @@ def initDefaultValues():
124131
from manuskript.ui import style as S
125132
textEditor["fontColor"] = S.text
126133

134+
def applyTooltipStyle():
135+
"""
136+
Apply tooltip styling to the application if system defaults are disabled.
137+
"""
138+
if not tooltipStyle["useSystemDefaultsForTooltips"]:
139+
from PyQt5.QtWidgets import qApp
140+
qApp.setStyleSheet(f"QToolTip {{ color: {tooltipStyle['textColor']}; background-color: {tooltipStyle['backgroundColor']}; border: 1px solid {tooltipStyle['borderColor']}; }}")
141+
127142
def save(filename=None, protocol=None):
128143

129144
global spellcheck, dict, corkSliderFactor, viewSettings, corkSizeFactor, folderView, lastTab, openIndexes, \
130145
progressChars, autoSave, autoSaveDelay, saveOnQuit, autoSaveNoChanges, autoSaveNoChangesDelay, outlineViewColumns, \
131146
corkBackground, corkStyle, fullScreenTheme, defaultTextType, textEditor, revisions, frequencyAnalyzer, viewMode, \
132-
saveToZip, dontShowDeleteWarning, fullscreenSettings
147+
saveToZip, dontShowDeleteWarning, fullscreenSettings, tooltipStyle
133148

134149
allSettings = {
135150
"viewSettings": viewSettings,
@@ -159,6 +174,7 @@ def save(filename=None, protocol=None):
159174
"viewMode": viewMode,
160175
"saveToZip": saveToZip,
161176
"dontShowDeleteWarning": dontShowDeleteWarning,
177+
"tooltipStyle": tooltipStyle,
162178
}
163179

164180
#pp=pprint.PrettyPrinter(indent=4, compact=False)
@@ -331,3 +347,11 @@ def load(string, fromString=False, protocol=None):
331347
if "dontShowDeleteWarning" in allSettings:
332348
global dontShowDeleteWarning
333349
dontShowDeleteWarning = allSettings["dontShowDeleteWarning"]
350+
351+
if "tooltipStyle" in allSettings:
352+
global tooltipStyle
353+
loaded_tooltip_style = allSettings["tooltipStyle"]
354+
# Add missing keys with defaults
355+
if "useSystemDefaultsForTooltips" not in loaded_tooltip_style:
356+
loaded_tooltip_style["useSystemDefaultsForTooltips"] = True
357+
tooltipStyle = loaded_tooltip_style

manuskript/settingsWindow.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def __init__(self, mainWindow):
4040
self.lblTitleLabels,
4141
self.lblTitleStatus,
4242
self.lblTitleFullscreen,
43+
self.lblTitleStyle,
4344
]:
4445
l.setStyleSheet(S.titleLabelSS())
4546

@@ -48,7 +49,8 @@ def __init__(self, mainWindow):
4849
QIcon.fromTheme("gnome-settings"),
4950
themeIcon("label"),
5051
themeIcon("status"),
51-
QIcon.fromTheme("preferences-desktop-theme")
52+
QIcon.fromTheme("preferences-desktop-theme"),
53+
QIcon.fromTheme("color-picker")
5254
]
5355
for i in range(self.lstMenu.count()):
5456
item = self.lstMenu.item(i)
@@ -308,6 +310,17 @@ def __init__(self, mainWindow):
308310
self.timerUpdateFSPreview.setInterval(250)
309311
self.timerUpdateFSPreview.timeout.connect(self.updatePreview)
310312

313+
# Style - Tooltips
314+
self.chkUseSystemTooltips.setChecked(settings.tooltipStyle["useSystemDefaultsForTooltips"])
315+
self.chkUseSystemTooltips.stateChanged.connect(self.toggleTooltipCustomization)
316+
self.setButtonColor(self.btnTooltipTextColor, settings.tooltipStyle["textColor"])
317+
self.btnTooltipTextColor.clicked.connect(self.chooseTooltipTextColor)
318+
self.setButtonColor(self.btnTooltipBackgroundColor, settings.tooltipStyle["backgroundColor"])
319+
self.btnTooltipBackgroundColor.clicked.connect(self.chooseTooltipBackgroundColor)
320+
self.setButtonColor(self.btnTooltipBorderColor, settings.tooltipStyle["borderColor"])
321+
self.btnTooltipBorderColor.clicked.connect(self.chooseTooltipBorderColor)
322+
self.updateTooltipControlsState()
323+
311324
def setTab(self, tab):
312325

313326
tabs = {
@@ -316,6 +329,7 @@ def setTab(self, tab):
316329
"Labels": 2,
317330
"Status": 3,
318331
"Fullscreen": 4,
332+
"Style": 5,
319333
}
320334

321335
if tab in tabs:
@@ -1000,3 +1014,62 @@ def resizeEvent(self, event):
10001014
QWidget.resizeEvent(self, event)
10011015
if self._editingTheme:
10021016
self.updatePreview()
1017+
1018+
####################################################################################################
1019+
# STYLE #
1020+
####################################################################################################
1021+
1022+
def chooseTooltipTextColor(self):
1023+
color = settings.tooltipStyle["textColor"]
1024+
self.colorDialog = QColorDialog(QColor(color), self)
1025+
color = self.colorDialog.getColor(QColor(color))
1026+
if color.isValid():
1027+
settings.tooltipStyle["textColor"] = color.name()
1028+
self.setButtonColor(self.btnTooltipTextColor, color.name())
1029+
self.updateTooltipStyle()
1030+
1031+
def chooseTooltipBackgroundColor(self):
1032+
color = settings.tooltipStyle["backgroundColor"]
1033+
self.colorDialog = QColorDialog(QColor(color), self)
1034+
color = self.colorDialog.getColor(QColor(color))
1035+
if color.isValid():
1036+
settings.tooltipStyle["backgroundColor"] = color.name()
1037+
self.setButtonColor(self.btnTooltipBackgroundColor, color.name())
1038+
self.updateTooltipStyle()
1039+
1040+
def chooseTooltipBorderColor(self):
1041+
color = settings.tooltipStyle["borderColor"]
1042+
self.colorDialog = QColorDialog(QColor(color), self)
1043+
color = self.colorDialog.getColor(QColor(color))
1044+
if color.isValid():
1045+
settings.tooltipStyle["borderColor"] = color.name()
1046+
self.setButtonColor(self.btnTooltipBorderColor, color.name())
1047+
self.updateTooltipStyle()
1048+
1049+
def toggleTooltipCustomization(self):
1050+
settings.tooltipStyle["useSystemDefaultsForTooltips"] = self.chkUseSystemTooltips.isChecked()
1051+
self.updateTooltipControlsState()
1052+
self.updateTooltipStyle()
1053+
1054+
def updateTooltipControlsState(self):
1055+
visible = not settings.tooltipStyle["useSystemDefaultsForTooltips"]
1056+
self.lblTooltipTextColor.setVisible(visible)
1057+
self.btnTooltipTextColor.setVisible(visible)
1058+
self.lblTooltipBackgroundColor.setVisible(visible)
1059+
self.btnTooltipBackgroundColor.setVisible(visible)
1060+
self.lblTooltipBorderColor.setVisible(visible)
1061+
self.btnTooltipBorderColor.setVisible(visible)
1062+
1063+
# Adjust layout spacing when controls are hidden/shown
1064+
if visible:
1065+
self.formLayout_tooltips.setContentsMargins(9, 9, 9, 9)
1066+
else:
1067+
self.formLayout_tooltips.setContentsMargins(9, 9, 9, 0)
1068+
1069+
def updateTooltipStyle(self):
1070+
# Apply the new tooltip style immediately
1071+
if settings.tooltipStyle["useSystemDefaultsForTooltips"]:
1072+
# Clear any custom tooltip styling to use system defaults
1073+
qApp.setStyleSheet("")
1074+
else:
1075+
qApp.setStyleSheet(f"QToolTip {{ color: {settings.tooltipStyle['textColor']}; background-color: {settings.tooltipStyle['backgroundColor']}; border: 1px solid {settings.tooltipStyle['borderColor']}; }}")

manuskript/ui/settings_ui.py

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Form implementation generated from reading ui file 'manuskript/ui/settings_ui.ui'
44
#
5-
# Created by: PyQt5 UI code generator 5.15.11
5+
# Created by: PyQt5 UI code generator 5.15.6
66
#
77
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
88
# run again. Do not edit this file unless you know what you are doing.
@@ -32,6 +32,8 @@ def setupUi(self, Settings):
3232
self.lstMenu.addItem(item)
3333
item = QtWidgets.QListWidgetItem()
3434
self.lstMenu.addItem(item)
35+
item = QtWidgets.QListWidgetItem()
36+
self.lstMenu.addItem(item)
3537
self.horizontalLayout_8.addWidget(self.lstMenu)
3638
self.stack = QtWidgets.QStackedWidget(Settings)
3739
self.stack.setObjectName("stack")
@@ -1750,6 +1752,75 @@ def setupUi(self, Settings):
17501752
self.themeStack.addWidget(self.stackedWidgetPage2_3)
17511753
self.verticalLayout_10.addWidget(self.themeStack)
17521754
self.stack.addWidget(self.page)
1755+
self.pageStyle = QtWidgets.QWidget()
1756+
self.pageStyle.setObjectName("pageStyle")
1757+
self.verticalLayout_style = QtWidgets.QVBoxLayout(self.pageStyle)
1758+
self.verticalLayout_style.setObjectName("verticalLayout_style")
1759+
self.lblTitleStyle = QtWidgets.QLabel(self.pageStyle)
1760+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
1761+
sizePolicy.setHorizontalStretch(0)
1762+
sizePolicy.setVerticalStretch(0)
1763+
sizePolicy.setHeightForWidth(self.lblTitleStyle.sizePolicy().hasHeightForWidth())
1764+
self.lblTitleStyle.setSizePolicy(sizePolicy)
1765+
self.lblTitleStyle.setAlignment(QtCore.Qt.AlignCenter)
1766+
self.lblTitleStyle.setObjectName("lblTitleStyle")
1767+
self.verticalLayout_style.addWidget(self.lblTitleStyle)
1768+
self.groupBoxTooltips = QtWidgets.QGroupBox(self.pageStyle)
1769+
font = QtGui.QFont()
1770+
font.setBold(True)
1771+
self.groupBoxTooltips.setFont(font)
1772+
self.groupBoxTooltips.setObjectName("groupBoxTooltips")
1773+
self.formLayout_tooltips = QtWidgets.QFormLayout(self.groupBoxTooltips)
1774+
self.formLayout_tooltips.setObjectName("formLayout_tooltips")
1775+
self.chkUseSystemTooltips = QtWidgets.QCheckBox(self.groupBoxTooltips)
1776+
font = QtGui.QFont()
1777+
font.setBold(False)
1778+
self.chkUseSystemTooltips.setFont(font)
1779+
self.chkUseSystemTooltips.setObjectName("chkUseSystemTooltips")
1780+
self.formLayout_tooltips.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.chkUseSystemTooltips)
1781+
self.lblTooltipTextColor = QtWidgets.QLabel(self.groupBoxTooltips)
1782+
font = QtGui.QFont()
1783+
font.setBold(False)
1784+
self.lblTooltipTextColor.setFont(font)
1785+
self.lblTooltipTextColor.setObjectName("lblTooltipTextColor")
1786+
self.formLayout_tooltips.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.lblTooltipTextColor)
1787+
self.btnTooltipTextColor = QtWidgets.QPushButton(self.groupBoxTooltips)
1788+
font = QtGui.QFont()
1789+
font.setBold(False)
1790+
self.btnTooltipTextColor.setFont(font)
1791+
self.btnTooltipTextColor.setText("")
1792+
self.btnTooltipTextColor.setObjectName("btnTooltipTextColor")
1793+
self.formLayout_tooltips.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.btnTooltipTextColor)
1794+
self.lblTooltipBackgroundColor = QtWidgets.QLabel(self.groupBoxTooltips)
1795+
font = QtGui.QFont()
1796+
font.setBold(False)
1797+
self.lblTooltipBackgroundColor.setFont(font)
1798+
self.lblTooltipBackgroundColor.setObjectName("lblTooltipBackgroundColor")
1799+
self.formLayout_tooltips.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.lblTooltipBackgroundColor)
1800+
self.btnTooltipBackgroundColor = QtWidgets.QPushButton(self.groupBoxTooltips)
1801+
font = QtGui.QFont()
1802+
font.setBold(False)
1803+
self.btnTooltipBackgroundColor.setFont(font)
1804+
self.btnTooltipBackgroundColor.setText("")
1805+
self.btnTooltipBackgroundColor.setObjectName("btnTooltipBackgroundColor")
1806+
self.formLayout_tooltips.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.btnTooltipBackgroundColor)
1807+
self.lblTooltipBorderColor = QtWidgets.QLabel(self.groupBoxTooltips)
1808+
font = QtGui.QFont()
1809+
font.setBold(False)
1810+
self.lblTooltipBorderColor.setFont(font)
1811+
self.lblTooltipBorderColor.setObjectName("lblTooltipBorderColor")
1812+
self.formLayout_tooltips.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.lblTooltipBorderColor)
1813+
self.btnTooltipBorderColor = QtWidgets.QPushButton(self.groupBoxTooltips)
1814+
font = QtGui.QFont()
1815+
font.setBold(False)
1816+
self.btnTooltipBorderColor.setFont(font)
1817+
self.btnTooltipBorderColor.setText("")
1818+
self.btnTooltipBorderColor.setObjectName("btnTooltipBorderColor")
1819+
self.formLayout_tooltips.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.btnTooltipBorderColor)
1820+
self.verticalLayout_style.addWidget(self.groupBoxTooltips)
1821+
spacerItem14 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
1822+
self.verticalLayout_style.addItem(spacerItem14)
1823+
self.stack.addWidget(self.pageStyle)
17531824
self.horizontalLayout_8.addWidget(self.stack)
17541825

17551826
self.retranslateUi(Settings)
@@ -1778,6 +1849,8 @@ def retranslateUi(self, Settings):
17781849
item.setText(_translate("Settings", "Status"))
17791850
item = self.lstMenu.item(5)
17801851
item.setText(_translate("Settings", "Fullscreen"))
1852+
item = self.lstMenu.item(6)
1853+
item.setText(_translate("Settings", "Style"))
17811854
self.lstMenu.setSortingEnabled(__sortingEnabled)
17821855
self.lblTitleGeneral.setText(_translate("Settings", "General settings"))
17831856
self.groupBox_2.setTitle(_translate("Settings", "Application settings"))
@@ -2018,3 +2091,9 @@ def retranslateUi(self, Settings):
20182091
self.cmbThemeAlignment.setItemText(2, _translate("Settings", "Right"))
20192092
self.cmbThemeAlignment.setItemText(3, _translate("Settings", "Justify"))
20202093
self.label_53.setText(_translate("Settings", "Alignment"))
2094+
self.lblTitleStyle.setText(_translate("Settings", "Style"))
2095+
self.groupBoxTooltips.setTitle(_translate("Settings", "Tooltips"))
2096+
self.chkUseSystemTooltips.setText(_translate("Settings", "Use system defaults"))
2097+
self.lblTooltipTextColor.setText(_translate("Settings", "Text color:"))
2098+
self.lblTooltipBackgroundColor.setText(_translate("Settings", "Background color:"))
2099+
self.lblTooltipBorderColor.setText(_translate("Settings", "Border color:"))

0 commit comments

Comments
 (0)