Version 1

This commit is contained in:
2026-04-10 23:59:23 +02:00
parent 9d7adf42c1
commit d55859c593
17 changed files with 743 additions and 490 deletions

View File

@@ -26,7 +26,8 @@ class ProgressBar(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._fraction = 0.0
self._demo_fraction = 0.0
self._demo_fraction = 0.0 # hvor musikken stopper (blå)
self._demo_fade_fraction = 0.0 # hvor fade slutter (grå)
self.setFixedHeight(10)
self.setCursor(Qt.CursorShape.PointingHandCursor)
@@ -34,8 +35,9 @@ class ProgressBar(QWidget):
self._fraction = max(0.0, min(1.0, f))
self.update()
def set_demo_marker(self, f: float):
self._demo_fraction = max(0.0, min(1.0, f))
def set_demo_marker(self, demo_f: float, fade_f: float = 0.0):
self._demo_fraction = max(0.0, min(1.0, demo_f))
self._demo_fade_fraction = max(0.0, min(1.0, fade_f))
self.update()
def paintEvent(self, event):
@@ -46,6 +48,11 @@ class ProgressBar(QWidget):
fill_w = int(w * self._fraction)
if fill_w > 0:
p.fillRect(0, 0, fill_w, h, QColor("#e8a020"))
# Fade-slut markør (grå) — vises bag demo-markøren
if self._demo_fade_fraction > 0:
fx = int(w * self._demo_fade_fraction)
p.fillRect(fx - 1, 0, 2, h, QColor("#6a7080"))
# Demo-stop markør (blå)
if self._demo_fraction > 0:
mx = int(w * self._demo_fraction)
p.fillRect(mx - 1, 0, 2, h, QColor("#3b8fd4"))
@@ -81,6 +88,7 @@ class MainWindow(QMainWindow):
self._settings = load_settings()
self._dark_theme = self._settings.get("dark_theme", True)
self._demo_seconds = self._settings.get("demo_seconds", 10)
self._demo_fade_seconds = self._settings.get("demo_fade_seconds", 5)
self._connect_player_signals()
self._build_menu()
@@ -306,12 +314,12 @@ class MainWindow(QMainWindow):
self._vol_slider = QSlider(Qt.Orientation.Horizontal)
self._vol_slider.setRange(0, 100)
self._vol_slider.setValue(78)
self._vol_slider.setValue(self._settings.get("volume", 78))
self._vol_slider.setFixedWidth(100)
self._vol_slider.valueChanged.connect(self._on_volume)
layout.addWidget(self._vol_slider)
self._lbl_vol = QLabel("78")
self._lbl_vol = QLabel(str(self._settings.get("volume", 78)))
self._lbl_vol.setObjectName("vol_val")
layout.addWidget(self._lbl_vol)
@@ -401,7 +409,7 @@ class MainWindow(QMainWindow):
except Exception as e:
self._set_status(f"DB fejl: {e}")
print(f"DB init fejl: {e}")
pass
def start_scan(self):
"""Start fuld scanning af alle biblioteker i baggrundstråd."""
@@ -463,7 +471,7 @@ class MainWindow(QMainWindow):
count = len(songs)
self._set_status(f"Bibliotek: {count} sang{'e' if count != 1 else ''}", 3000)
except Exception as e:
print(f"Bibliotek reload fejl: {e}")
pass
def add_library_path(self, path: str):
try:
@@ -483,6 +491,7 @@ class MainWindow(QMainWindow):
if dialog.exec():
self._settings = dialog.get_values()
self._demo_seconds = self._settings.get("demo_seconds", 10)
self._demo_fade_seconds = self._settings.get("demo_fade_seconds", 5)
# Opdater tema hvis ændret
new_dark = self._settings.get("dark_theme", True)
if new_dark != self._dark_theme:
@@ -498,7 +507,7 @@ class MainWindow(QMainWindow):
if hasattr(self, "_current_song") and self._current_song:
dur = self._current_song.get("duration_sec", 0)
if dur > 0:
self._progress.set_demo_marker(min(self._demo_seconds / dur, 1.0))
self._progress.set_demo_marker(min(self._demo_seconds / dur, 1.0), min((self._demo_seconds + self._demo_fade_seconds) / dur, 1.0))
self._set_status("Indstillinger gemt", 2000)
def _auto_login(self):
@@ -562,7 +571,7 @@ class MainWindow(QMainWindow):
self._set_status(f"Synkroniseret {len(levels)} niveauer og {len(names)} dans-navne", 4000)
except Exception as e:
print(f"Dans-sync fejl: {e}")
pass
def _go_offline(self):
self._api_url = self._api_token = self._api_username = None
@@ -744,7 +753,7 @@ class MainWindow(QMainWindow):
)
if dur > 0:
self._progress.set_demo_marker(min(self._demo_seconds / dur, 1.0))
self._progress.set_demo_marker(min(self._demo_seconds / dur, 1.0), min((self._demo_seconds + self._demo_fade_seconds) / dur, 1.0))
self._set_status(f"Indlæst: {song.get('title','')}", 3000)
@@ -787,7 +796,10 @@ class MainWindow(QMainWindow):
else:
self._demo_active = True
self._btn_demo.setChecked(True)
self._player.play_demo(stop_at_sec=self._demo_seconds)
self._player.play_demo(
stop_at_sec=self._demo_seconds,
fade_sec=self._demo_fade_seconds,
)
self._btn_play.setText("")
def _prev_song(self):
@@ -853,33 +865,34 @@ class MainWindow(QMainWindow):
self._load_song(next_song)
self._set_status(f"Klar: {next_song.get('title','')} — tryk ▶ for at starte")
else:
# Danseliste afsluttet — nulstil liste-markering og synkroniser
self._current_idx = -1
self._playlist_panel._current_idx = -1
self._playlist_panel._song_ended = False
self._playlist_panel._refresh()
self._sync_event_status_to_playlist()
self._lbl_title.setText("— Danseliste afsluttet —")
self._lbl_meta.setText("")
self._lbl_dances.setText("")
self._set_status("Danselisten er afsluttet")
def _sync_event_status_to_playlist(self):
"""Gem event-fremgang i den aktive navngivne liste."""
"""Gem event-fremgang (afspillet/sprunget over) til den navngivne liste."""
try:
from local.local_db import get_db
songs = self._playlist_panel.get_songs()
pl_id = self._playlist_panel.get_named_playlist_id()
if not pl_id:
return
statuses = self._playlist_panel.get_statuses()
from local.local_db import get_db
with get_db() as conn:
# Find den aktive liste (ikke __aktiv__)
pl = conn.execute(
"SELECT id FROM playlists WHERE name != '__aktiv__' "
"ORDER BY created_at DESC LIMIT 1"
).fetchone()
if not pl:
return
# Opdater status for hver sang i listen
for i, (song, status) in enumerate(zip(songs, statuses)):
conn.execute("""
UPDATE playlist_songs SET status=?
WHERE playlist_id=? AND song_id=?
""", (status, pl["id"], song.get("id")))
for position, status in enumerate(statuses, start=1):
conn.execute(
"UPDATE playlist_songs SET status=? "
"WHERE playlist_id=? AND position=?",
(status, pl_id, position)
)
except Exception as e:
print(f"Event-status sync fejl: {e}")
pass
def _on_state_changed(self, state: str):
if state == "playing":
@@ -900,6 +913,9 @@ class MainWindow(QMainWindow):
def _on_volume(self, value: int):
self._lbl_vol.setText(str(value))
self._player.set_volume(value)
from ui.settings_dialog import save_settings
self._settings["volume"] = value
save_settings(self._settings)
# ── Tema ──────────────────────────────────────────────────────────────────