05/23 Phase 3
This commit is contained in:
@@ -16,6 +16,7 @@ from apscheduler.schedulers.background import BackgroundScheduler
|
||||
from db.database import init_db
|
||||
from core.fetcher import fetch_all
|
||||
from ui.statusbar import StatusBar
|
||||
from ui.history import HistoryScreen
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
@@ -38,10 +39,13 @@ class LottoSightApp(tk.Tk):
|
||||
|
||||
self._fetch_lock = threading.Lock()
|
||||
self._scheduler: BackgroundScheduler | None = None
|
||||
self._current_screen: tk.Widget | None = None
|
||||
self._screens: dict[str, tk.Widget] = {}
|
||||
|
||||
self._build_ui()
|
||||
self._start_scheduler()
|
||||
self._launch_fetch() # auto-fetch on startup
|
||||
self._navigate("History") # open History as default for now
|
||||
self._launch_fetch() # auto-fetch on startup
|
||||
|
||||
# ── UI construction ───────────────────────────────────────────────────────
|
||||
|
||||
@@ -65,15 +69,10 @@ class LottoSightApp(tk.Tk):
|
||||
)
|
||||
self._fetch_btn.pack(side="right", padx=4)
|
||||
|
||||
# Content area — replaced by real screens in later phases
|
||||
self._content = ttk.Frame(self, padding=16)
|
||||
# Content area — screens are packed/unpacked inside here
|
||||
self._content = ttk.Frame(self)
|
||||
self._content.pack(side="top", fill="both", expand=True)
|
||||
|
||||
self._content_label = ttk.Label(
|
||||
self._content, text="Dashboard", font=("TkDefaultFont", 14)
|
||||
)
|
||||
self._content_label.pack(expand=True)
|
||||
|
||||
# Status bar
|
||||
self._statusbar = StatusBar(self)
|
||||
self._statusbar.pack(side="bottom", fill="x")
|
||||
@@ -82,7 +81,29 @@ class LottoSightApp(tk.Tk):
|
||||
|
||||
def _navigate(self, screen_name: str):
|
||||
logger.info("Navigate → %s", screen_name)
|
||||
self._content_label.config(text=screen_name)
|
||||
|
||||
if self._current_screen is not None:
|
||||
self._current_screen.pack_forget()
|
||||
|
||||
if screen_name not in self._screens:
|
||||
self._screens[screen_name] = self._make_screen(screen_name)
|
||||
|
||||
self._current_screen = self._screens[screen_name]
|
||||
self._current_screen.pack(fill="both", expand=True)
|
||||
|
||||
# Refresh data-bearing screens each time they're shown
|
||||
if hasattr(self._current_screen, "refresh"):
|
||||
self._current_screen.refresh()
|
||||
|
||||
def _make_screen(self, name: str) -> tk.Widget:
|
||||
if name == "History":
|
||||
return HistoryScreen(self._content)
|
||||
# Placeholder for screens added in later phases
|
||||
placeholder = ttk.Label(
|
||||
self._content, text=f"{name} — coming soon",
|
||||
font=("TkDefaultFont", 14), anchor="center",
|
||||
)
|
||||
return placeholder
|
||||
|
||||
# ── Fetch wiring ──────────────────────────────────────────────────────────
|
||||
|
||||
@@ -126,6 +147,9 @@ class LottoSightApp(tk.Tk):
|
||||
def _on_fetch_done(self, results: list):
|
||||
self._fetch_btn.config(state="normal", text="Fetch Now")
|
||||
self._statusbar.update_fetch_results(results)
|
||||
# Refresh the current screen if it can show new data
|
||||
if self._current_screen and hasattr(self._current_screen, "refresh"):
|
||||
self._current_screen.refresh()
|
||||
|
||||
# ── Lifecycle ─────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user