feat: dark/light theme toggle (Catppuccin Frappé ↔ Latte)
- app/config/theme.py: palette definitions for both themes + apply_qss() helper used by both main.py (startup) and MainWindow (live toggle) - resources/style_light.qss: complete Catppuccin Latte QSS - View menu: ☀️/🌙 Switch Theme action (Ctrl+Shift+T) toggles live - Preferences → Appearance: Color theme dropdown persists choice - SQLHighlighter: _build_rules() reads get_palette(); update_theme() rebuilds rules and rehighlights all open editors on switch - SqlCompleter: popup stylesheet reads get_palette() via _apply_popup_style(); update_theme() called on switch - EditableTableModel: dirty/delete cell colors read get_palette() live - ResultTableModel: NULL_COLOR property reads get_palette() live - TableViewer: apply_settings() refreshes frozen-view border + repaints Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,8 @@ from app.config.settings import get_settings
|
||||
_FONT_FAMILIES = ["Consolas", "JetBrains Mono", "Fira Code", "Cascadia Code", "Courier New"]
|
||||
_PAGE_SIZES = [50, 100, 500, 1000, 0] # 0 → All
|
||||
_PAGE_LABELS = ["50", "100", "500", "1 000", "All"]
|
||||
_THEMES = [("dark", "🌙 Dark (Catppuccin Frappé)"),
|
||||
("light", "☀️ Light (Catppuccin Latte)")]
|
||||
|
||||
|
||||
class PreferencesDialog(QDialog):
|
||||
@@ -64,6 +66,18 @@ class PreferencesDialog(QDialog):
|
||||
|
||||
root.addWidget(results_box)
|
||||
|
||||
# ── Appearance ────────────────────────────────────────────────────────
|
||||
appear_box = QGroupBox("Appearance")
|
||||
af = QFormLayout(appear_box)
|
||||
af.setSpacing(8)
|
||||
|
||||
self._theme = QComboBox()
|
||||
for _, label in _THEMES:
|
||||
self._theme.addItem(label)
|
||||
af.addRow("Color theme:", self._theme)
|
||||
|
||||
root.addWidget(appear_box)
|
||||
|
||||
# ── General ───────────────────────────────────────────────────────────
|
||||
general_box = QGroupBox("General")
|
||||
gf = QFormLayout(general_box)
|
||||
@@ -82,7 +96,7 @@ class PreferencesDialog(QDialog):
|
||||
root.addStretch()
|
||||
|
||||
# ── Buttons ───────────────────────────────────────────────────────────
|
||||
note = QLabel("Font changes take effect immediately in open editors.")
|
||||
note = QLabel("Theme and font changes take effect immediately.")
|
||||
note.setObjectName("statusLabel")
|
||||
root.addWidget(note)
|
||||
|
||||
@@ -116,6 +130,10 @@ class PreferencesDialog(QDialog):
|
||||
self._max_history.setValue(s.get("max_history", 500))
|
||||
self._auto_commit.setChecked(s.get("auto_commit", True))
|
||||
|
||||
theme_name = s.get("theme", "dark")
|
||||
ti = next((i for i, (k, _) in enumerate(_THEMES) if k == theme_name), 0)
|
||||
self._theme.setCurrentIndex(ti)
|
||||
|
||||
def _apply(self):
|
||||
s = get_settings()
|
||||
s.set("font_family", self._font_family.currentText())
|
||||
@@ -125,6 +143,7 @@ class PreferencesDialog(QDialog):
|
||||
s.set("query_timeout", self._timeout.value())
|
||||
s.set("max_history", self._max_history.value())
|
||||
s.set("auto_commit", self._auto_commit.isChecked())
|
||||
s.set("theme", _THEMES[self._theme.currentIndex()][0])
|
||||
s.save()
|
||||
self.settings_applied.emit()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user