05/23 Phase 22
This commit is contained in:
+37
-5
@@ -54,6 +54,7 @@ class DashboardScreen(ttk.Frame):
|
||||
def __init__(self, parent, on_fetch=None, **kwargs):
|
||||
super().__init__(parent, **kwargs)
|
||||
self._on_fetch = on_fetch
|
||||
self._filter_var = tk.StringVar(value="All Games")
|
||||
self._build_ui()
|
||||
|
||||
# ── Layout ────────────────────────────────────────────────────────────────
|
||||
@@ -66,7 +67,7 @@ class DashboardScreen(ttk.Frame):
|
||||
vsb.pack(side="right", fill="y")
|
||||
canvas.pack(side="left", fill="both", expand=True)
|
||||
|
||||
inner = ttk.Frame(canvas, padding=(28, 20, 28, 20))
|
||||
inner = ttk.Frame(canvas, padding=(28, 16, 28, 20))
|
||||
win = canvas.create_window((0, 0), window=inner, anchor="nw")
|
||||
|
||||
def _resize(event=None):
|
||||
@@ -82,6 +83,18 @@ class DashboardScreen(ttk.Frame):
|
||||
lambda e: canvas.unbind_all("<MouseWheel>"))
|
||||
|
||||
self._inner = inner
|
||||
|
||||
# Game filter bar
|
||||
filter_bar = ttk.Frame(inner)
|
||||
filter_bar.pack(fill="x", pady=(0, 12))
|
||||
ttk.Label(filter_bar, text="Show game:").pack(side="left", padx=(0, 6))
|
||||
self._game_filter = ttk.Combobox(
|
||||
filter_bar, textvariable=self._filter_var,
|
||||
state="readonly", width=22,
|
||||
)
|
||||
self._game_filter.pack(side="left")
|
||||
self._game_filter.bind("<<ComboboxSelected>>", lambda _e: self.refresh())
|
||||
|
||||
self._draw_sections()
|
||||
|
||||
def _section_header(self, title: str):
|
||||
@@ -101,7 +114,22 @@ class DashboardScreen(ttk.Frame):
|
||||
|
||||
# ── Refresh ───────────────────────────────────────────────────────────────
|
||||
|
||||
def _update_filter_options(self):
|
||||
games = get_all_games(active_only=True)
|
||||
names = ["All Games"] + [g["name"] for g in games]
|
||||
self._game_filter["values"] = names
|
||||
if self._filter_var.get() not in names:
|
||||
self._filter_var.set("All Games")
|
||||
|
||||
def _filtered_games(self):
|
||||
games = get_all_games(active_only=True)
|
||||
sel = self._filter_var.get()
|
||||
if not sel or sel == "All Games":
|
||||
return games
|
||||
return [g for g in games if g["name"] == sel]
|
||||
|
||||
def refresh(self):
|
||||
self._update_filter_options()
|
||||
self._refresh_last_draws()
|
||||
self._refresh_db_summary()
|
||||
self._refresh_hot_numbers()
|
||||
@@ -111,13 +139,12 @@ class DashboardScreen(ttk.Frame):
|
||||
for w in self._last_draw_body.winfo_children():
|
||||
w.destroy()
|
||||
|
||||
games = get_all_games(active_only=True)
|
||||
games = self._filtered_games()
|
||||
if not games:
|
||||
ttk.Label(self._last_draw_body, text="No active games.",
|
||||
foreground="#aaaaaa").pack(anchor="w")
|
||||
return
|
||||
|
||||
# Lay cards out in a horizontal row that wraps via grid
|
||||
row_frame = ttk.Frame(self._last_draw_body)
|
||||
row_frame.pack(fill="x")
|
||||
|
||||
@@ -128,6 +155,11 @@ class DashboardScreen(ttk.Frame):
|
||||
)
|
||||
card.grid(row=0, column=col_idx, padx=(0, 16), sticky="nw")
|
||||
|
||||
top_prize = game["top_prize"] if "top_prize" in game.keys() else ""
|
||||
if top_prize:
|
||||
ttk.Label(card, text=f"Top prize: {top_prize}",
|
||||
foreground="#8e44ad", font=_CARD_FONT).pack(anchor="w")
|
||||
|
||||
if draw is None:
|
||||
ttk.Label(card, text="No draws yet.", foreground="#aaaaaa",
|
||||
font=_CARD_FONT).pack(anchor="w")
|
||||
@@ -172,7 +204,7 @@ class DashboardScreen(ttk.Frame):
|
||||
for w in self._hot_body.winfo_children():
|
||||
w.destroy()
|
||||
|
||||
games = get_all_games(active_only=True)
|
||||
games = self._filtered_games()
|
||||
if not games:
|
||||
ttk.Label(self._hot_body, text="No active games.",
|
||||
foreground="#aaaaaa").pack(anchor="w")
|
||||
@@ -201,7 +233,7 @@ class DashboardScreen(ttk.Frame):
|
||||
for w in self._overdue_body.winfo_children():
|
||||
w.destroy()
|
||||
|
||||
games = get_all_games(active_only=True)
|
||||
games = self._filtered_games()
|
||||
if not games:
|
||||
ttk.Label(self._overdue_body, text="No active games.",
|
||||
foreground="#aaaaaa").pack(anchor="w")
|
||||
|
||||
+13
-5
@@ -10,9 +10,12 @@ from tkinter import ttk
|
||||
from datetime import datetime
|
||||
|
||||
_SOURCE_NAMES = {
|
||||
"powerball_ny": "Powerball",
|
||||
"megamillions_ny": "Mega Millions (NY)",
|
||||
"megamillions_tx": "Mega Millions (TX)",
|
||||
"powerball_ny": "Powerball",
|
||||
"megamillions_ny": "Mega Millions (NY)",
|
||||
"megamillions_tx": "Mega Millions (TX)",
|
||||
"cash5_va": "Cash 5 (VA)",
|
||||
"millionaireforlife_va": "Millionaire for Life (VA)",
|
||||
"bankamillion_va": "Bank a Million (VA)",
|
||||
}
|
||||
|
||||
|
||||
@@ -50,5 +53,10 @@ class StatusBar(ttk.Frame):
|
||||
parts.append(f"{name} — ERROR: {r['message']}")
|
||||
else:
|
||||
parts.append(f"{name} — {r['added']} added, {r['skipped']} skipped")
|
||||
text = "Last fetch: " + " | ".join(parts) + f" | {now}"
|
||||
self.set_text(text)
|
||||
self._last_fetch_text = "Last fetch: " + " | ".join(parts) + f" | {now}"
|
||||
self.set_text(self._last_fetch_text)
|
||||
|
||||
def append_match_alert(self, msg: str):
|
||||
"""Append a prediction-match alert to the current status text."""
|
||||
base = getattr(self, "_last_fetch_text", self._label.cget("text"))
|
||||
self.set_text(f"{base} • {msg}")
|
||||
|
||||
Reference in New Issue
Block a user