181 lines
7.5 KiB
Python
181 lines
7.5 KiB
Python
"""
|
|
Hints and Skills View - Display support hints and event skills
|
|
"""
|
|
|
|
import tkinter as tk
|
|
from tkinter import ttk
|
|
import sys
|
|
import os
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from db.db_queries import get_hints, get_events, get_all_event_skills, get_card_by_id
|
|
from gui.theme import (
|
|
BG_DARK, BG_MEDIUM, BG_LIGHT,
|
|
ACCENT_PRIMARY, ACCENT_SECONDARY, ACCENT_TERTIARY, ACCENT_SUCCESS,
|
|
TEXT_PRIMARY, TEXT_SECONDARY, TEXT_MUTED,
|
|
FONT_HEADER, FONT_SUBHEADER, FONT_BODY, FONT_BODY_BOLD, FONT_SMALL,
|
|
create_styled_text, create_card_frame
|
|
)
|
|
|
|
|
|
class HintsSkillsFrame(ttk.Frame):
|
|
"""Frame for viewing support hints and event skills"""
|
|
|
|
def __init__(self, parent):
|
|
super().__init__(parent)
|
|
self.current_card_id = None
|
|
self.current_card_name = None
|
|
|
|
self.create_widgets()
|
|
|
|
def create_widgets(self):
|
|
"""Create the hints and skills interface"""
|
|
# Header
|
|
header_frame = tk.Frame(self, bg=BG_DARK)
|
|
header_frame.pack(fill=tk.X, padx=20, pady=15)
|
|
|
|
self.card_label = tk.Label(header_frame,
|
|
text="💡 Select a card from the Card List tab",
|
|
font=FONT_HEADER, bg=BG_DARK, fg=ACCENT_PRIMARY)
|
|
self.card_label.pack(side=tk.LEFT)
|
|
|
|
# Main content with two columns
|
|
content_frame = tk.Frame(self, bg=BG_DARK)
|
|
content_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=(0, 15))
|
|
|
|
# Left column: Hints
|
|
left_container = tk.Frame(content_frame, bg=BG_DARK)
|
|
left_container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 10))
|
|
|
|
hints_header = tk.Frame(left_container, bg=BG_DARK)
|
|
hints_header.pack(fill=tk.X, pady=(0, 8))
|
|
tk.Label(hints_header, text="🎯 Training Hints", font=FONT_SUBHEADER,
|
|
bg=BG_DARK, fg=TEXT_PRIMARY).pack(side=tk.LEFT)
|
|
|
|
hints_frame = create_card_frame(left_container)
|
|
hints_frame.pack(fill=tk.BOTH, expand=True)
|
|
|
|
self.hints_text = create_styled_text(hints_frame, height=18)
|
|
self.hints_text.pack(fill=tk.BOTH, expand=True, padx=2, pady=2)
|
|
self.hints_text.config(state=tk.DISABLED)
|
|
|
|
# Configure tags for hints
|
|
self.hints_text.tag_configure('header', font=FONT_SUBHEADER, foreground=ACCENT_PRIMARY)
|
|
self.hints_text.tag_configure('skill', foreground=ACCENT_TERTIARY, font=FONT_BODY_BOLD)
|
|
self.hints_text.tag_configure('desc', foreground=TEXT_MUTED)
|
|
self.hints_text.tag_configure('number', foreground=ACCENT_SECONDARY)
|
|
|
|
# Right column: Events and Skills
|
|
right_container = tk.Frame(content_frame, bg=BG_DARK)
|
|
right_container.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
|
|
|
|
events_header = tk.Frame(right_container, bg=BG_DARK)
|
|
events_header.pack(fill=tk.X, pady=(0, 8))
|
|
tk.Label(events_header, text="📅 Training Events & Skills", font=FONT_SUBHEADER,
|
|
bg=BG_DARK, fg=TEXT_PRIMARY).pack(side=tk.LEFT)
|
|
|
|
events_frame = create_card_frame(right_container)
|
|
events_frame.pack(fill=tk.BOTH, expand=True)
|
|
|
|
tree_container = tk.Frame(events_frame, bg=BG_MEDIUM)
|
|
tree_container.pack(fill=tk.BOTH, expand=True, padx=2, pady=2)
|
|
|
|
# Treeview for events
|
|
self.events_tree = ttk.Treeview(tree_container, columns=('event', 'skills'), show='tree headings')
|
|
self.events_tree.heading('#0', text='')
|
|
self.events_tree.heading('event', text='Event/Skill')
|
|
self.events_tree.heading('skills', text='Details')
|
|
|
|
self.events_tree.column('#0', width=35)
|
|
self.events_tree.column('event', width=240)
|
|
self.events_tree.column('skills', width=180)
|
|
|
|
scrollbar = ttk.Scrollbar(tree_container, orient=tk.VERTICAL, command=self.events_tree.yview)
|
|
self.events_tree.configure(yscrollcommand=scrollbar.set)
|
|
|
|
self.events_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
|
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
|
|
|
|
# Summary section at bottom
|
|
summary_frame = tk.Frame(self, bg=BG_MEDIUM, padx=15, pady=10)
|
|
summary_frame.pack(fill=tk.X, padx=20, pady=(0, 10))
|
|
|
|
self.summary_label = tk.Label(summary_frame, text="", font=FONT_SMALL,
|
|
bg=BG_MEDIUM, fg=TEXT_SECONDARY)
|
|
self.summary_label.pack()
|
|
|
|
def set_card(self, card_id):
|
|
"""Load a card's hints and skills"""
|
|
self.current_card_id = card_id
|
|
|
|
# Get card info
|
|
card = get_card_by_id(card_id)
|
|
if card:
|
|
self.current_card_name = card[1]
|
|
self.card_label.config(text=f"💡 {self.current_card_name}")
|
|
|
|
self.update_hints_display()
|
|
self.update_events_display()
|
|
|
|
def update_hints_display(self):
|
|
"""Update the hints display"""
|
|
self.hints_text.config(state=tk.NORMAL)
|
|
self.hints_text.delete('1.0', tk.END)
|
|
|
|
if not self.current_card_id:
|
|
self.hints_text.insert(tk.END, "No card selected\n\n", 'desc')
|
|
self.hints_text.insert(tk.END, "Select a card from the Card List tab to view its hints.", 'desc')
|
|
self.hints_text.config(state=tk.DISABLED)
|
|
return
|
|
|
|
hints = get_hints(self.current_card_id)
|
|
|
|
self.hints_text.insert(tk.END, "Training Skills this card can teach:\n\n", 'header')
|
|
|
|
if hints:
|
|
for i, (hint_name, hint_desc) in enumerate(hints, 1):
|
|
self.hints_text.insert(tk.END, f" {i}. ", 'number')
|
|
self.hints_text.insert(tk.END, f"{hint_name}\n", 'skill')
|
|
if hint_desc:
|
|
self.hints_text.insert(tk.END, f" {hint_desc}\n", 'desc')
|
|
self.hints_text.insert(tk.END, "\n")
|
|
else:
|
|
self.hints_text.insert(tk.END, " No hints/skills data available.\n\n", 'desc')
|
|
self.hints_text.insert(tk.END, " This may mean:\n", 'desc')
|
|
self.hints_text.insert(tk.END, " • Card hasn't been scraped yet\n", 'desc')
|
|
self.hints_text.insert(tk.END, " • Card has no trainable skills\n", 'desc')
|
|
|
|
self.hints_text.config(state=tk.DISABLED)
|
|
|
|
def update_events_display(self):
|
|
"""Update the events tree display"""
|
|
self.events_tree.delete(*self.events_tree.get_children())
|
|
|
|
if not self.current_card_id:
|
|
return
|
|
|
|
events = get_events(self.current_card_id)
|
|
events_with_skills = get_all_event_skills(self.current_card_id)
|
|
|
|
# Add events as parent nodes
|
|
for event_id, event_name, event_type in events:
|
|
skills = events_with_skills.get(event_name, [])
|
|
skill_count = f"{len(skills)} skills" if skills else "No skills"
|
|
|
|
event_node = self.events_tree.insert('', tk.END, text='📅',
|
|
values=(event_name, skill_count))
|
|
|
|
# Add skills as children
|
|
for skill in skills:
|
|
self.events_tree.insert(event_node, tk.END, text='⭐',
|
|
values=(skill, ''))
|
|
|
|
# Update summary
|
|
hint_count = len(get_hints(self.current_card_id))
|
|
event_count = len(events)
|
|
|
|
self.summary_label.config(
|
|
text=f"📊 Summary: {hint_count} hints │ {event_count} events"
|
|
)
|