mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00

* Allow theme change at runtime and add hook * Save or restore default palette on theme change * Update aqt widget styles on theme change * styling fixes - drop _light_palette, as default_palette serves the same purpose - save default platform theme, and restore it when switching away from nightmode - update macOS light/dark mode on theme switch - fix unreadable menus on Windows * update night-mode classes on theme change This is the easy part - CSS styling that uses standard_css or our css variables should update automatically. The main remaining issue is JS code that sets colors based on the theme at the time it's run - eg the graph code, and the editor. * switch night mode value on toggle * expose current theme via a store; switch graphs to use it https://github.com/ankitects/anki/issues/1471#issuecomment-972402492 * start using currentTheme in editor/components This fixes basic editing - there are still components that need updating. * add simple xcodeproj for code completion * add helper to get currently-active system theme on macOS * fix setCurrentTheme not being immediately available * live update tag color * style().name() doesn't work on Qt5 * automatic theme switching on Windows/Mac * currentTheme -> pageTheme * Replace `nightModeKey` with `pageTheme` Co-authored-by: Damien Elmes <gpg@ankiweb.net>
71 lines
1.8 KiB
Python
71 lines
1.8 KiB
Python
# Copyright: Ankitects Pty Ltd and contributors
|
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
"""Platform-specific functionality."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
from ctypes import CDLL
|
|
|
|
import aqt.utils
|
|
from anki.utils import isMac, isWin
|
|
|
|
|
|
def get_windows_dark_mode() -> bool:
|
|
"True if Windows system is currently in dark mode."
|
|
if not isWin:
|
|
return False
|
|
|
|
from winreg import ( # pylint: disable=import-error
|
|
HKEY_CURRENT_USER,
|
|
OpenKey,
|
|
QueryValueEx,
|
|
)
|
|
|
|
key = OpenKey(
|
|
HKEY_CURRENT_USER,
|
|
r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize",
|
|
)
|
|
return not QueryValueEx(key, "AppsUseLightTheme")[0]
|
|
|
|
|
|
def set_macos_dark_mode(enabled: bool) -> bool:
|
|
"True if setting successful."
|
|
if not isMac:
|
|
return False
|
|
try:
|
|
_ankihelper().set_darkmode_enabled(enabled)
|
|
return True
|
|
except Exception as e:
|
|
# swallow exceptions, as library will fail on macOS 10.13
|
|
print(e)
|
|
return False
|
|
|
|
|
|
def get_macos_dark_mode() -> bool:
|
|
"True if macOS system is currently in dark mode."
|
|
if not isMac:
|
|
return False
|
|
try:
|
|
return _ankihelper().system_is_dark()
|
|
except Exception as e:
|
|
# swallow exceptions, as library will fail on macOS 10.13
|
|
print(e)
|
|
return False
|
|
|
|
|
|
_ankihelper_dll: CDLL | None = None
|
|
|
|
|
|
def _ankihelper() -> CDLL:
|
|
global _ankihelper_dll
|
|
if _ankihelper_dll:
|
|
return _ankihelper_dll
|
|
if getattr(sys, "frozen", False):
|
|
path = os.path.join(sys.prefix, "libankihelper.dylib")
|
|
else:
|
|
path = os.path.join(aqt.utils.aqt_data_folder(), "lib", "libankihelper.dylib")
|
|
_ankihelper_dll = CDLL(path)
|
|
return _ankihelper_dll
|