Lazy Nerd Font detection — runs after QSS is loaded

Detection deferred to first play_file call so the widget's font
(including QSS overrides) is checked instead of the default font.
This commit is contained in:
pax 2026-04-05 05:14:08 -05:00
parent 7b6c325bdb
commit 0e092b2b93

View File

@ -378,14 +378,9 @@ class VideoPlayer(QWidget):
controls = QHBoxLayout() controls = QHBoxLayout()
controls.setContentsMargins(4, 2, 4, 2) controls.setContentsMargins(4, 2, 4, 2)
# Nerd Font glyphs with text fallback self._use_icons = None # lazy detection
self._use_icons = self._has_nerd_font()
_play = "\uf04b" if self._use_icons else "Play"
_mute = "\uf026" if self._use_icons else "Mute"
_auto = "\uf01d" if self._use_icons else "Auto"
_loop = "\uf01e" if self._use_icons else "Loop"
self._play_btn = QPushButton(_play) self._play_btn = QPushButton("Play")
self._play_btn.clicked.connect(self._toggle_play) self._play_btn.clicked.connect(self._toggle_play)
controls.addWidget(self._play_btn) controls.addWidget(self._play_btn)
@ -410,12 +405,12 @@ class VideoPlayer(QWidget):
self._vol_slider.valueChanged.connect(self._set_volume) self._vol_slider.valueChanged.connect(self._set_volume)
controls.addWidget(self._vol_slider) controls.addWidget(self._vol_slider)
self._mute_btn = QPushButton(_mute) self._mute_btn = QPushButton("Mute")
self._mute_btn.clicked.connect(self._toggle_mute) self._mute_btn.clicked.connect(self._toggle_mute)
controls.addWidget(self._mute_btn) controls.addWidget(self._mute_btn)
self._autoplay = True self._autoplay = True
self._autoplay_btn = QPushButton(_auto) self._autoplay_btn = QPushButton("Auto")
self._autoplay_btn.setCheckable(True) self._autoplay_btn.setCheckable(True)
self._autoplay_btn.setChecked(True) self._autoplay_btn.setChecked(True)
self._autoplay_btn.setToolTip("Auto-play videos when selected") self._autoplay_btn.setToolTip("Auto-play videos when selected")
@ -424,7 +419,7 @@ class VideoPlayer(QWidget):
controls.addWidget(self._autoplay_btn) controls.addWidget(self._autoplay_btn)
self._loop_state = 0 # 0=Loop, 1=Once, 2=Next self._loop_state = 0 # 0=Loop, 1=Once, 2=Next
self._loop_btn = QPushButton(_loop) self._loop_btn = QPushButton("Loop")
self._loop_btn.setToolTip("Loop: repeat / Once: stop at end / Next: advance") self._loop_btn.setToolTip("Loop: repeat / Once: stop at end / Next: advance")
self._loop_btn.clicked.connect(self._cycle_loop) self._loop_btn.clicked.connect(self._cycle_loop)
controls.addWidget(self._loop_btn) controls.addWidget(self._loop_btn)
@ -441,6 +436,7 @@ class VideoPlayer(QWidget):
self._error_fired = False self._error_fired = False
def play_file(self, path: str, info: str = "") -> None: def play_file(self, path: str, info: str = "") -> None:
self._detect_icons()
self._current_file = path self._current_file = path
self._error_fired = False self._error_fired = False
self._ended = False self._ended = False
@ -451,16 +447,18 @@ class VideoPlayer(QWidget):
else: else:
self._player.pause() self._player.pause()
@staticmethod def _detect_icons(self) -> None:
def _has_nerd_font() -> bool: """Detect Nerd Font support and swap button labels if available."""
"""Check if the app font can render Nerd Font glyphs.""" if self._use_icons is not None:
from PySide6.QtGui import QFontMetrics, QFont return
from PySide6.QtWidgets import QApplication from PySide6.QtGui import QFontMetrics
app = QApplication.instance() fm = QFontMetrics(self._play_btn.font())
if not app: self._use_icons = fm.inFont("\uf04b")
return False if self._use_icons:
fm = QFontMetrics(app.font()) self._play_btn.setText("\uf04b")
return fm.inFont("\uf04b") # Nerd Font play icon self._mute_btn.setText("\uf026")
labels = ["\uf01e", "\uf0e2", "\uf051"]
self._loop_btn.setText(labels[self._loop_state])
def _toggle_autoplay(self, checked: bool = True) -> None: def _toggle_autoplay(self, checked: bool = True) -> None:
self._autoplay = self._autoplay_btn.isChecked() self._autoplay = self._autoplay_btn.isChecked()