feat: Implement initial GUI structure including main window, card list, deck builder, and skill search.

This commit is contained in:
kiyreload27
2025-12-28 20:48:01 +00:00
parent ab8af651a2
commit 5d9d0a6392
4 changed files with 61 additions and 14 deletions

View File

@@ -33,7 +33,8 @@ class CardListFrame(ttk.Frame):
self.on_stats_updated = on_stats_updated_callback
self.cards = []
self.current_card_id = None
self.card_image = None # Keep reference to prevent garbage collection
self.selected_level = 50
self.card_image = None
self.icon_cache = {} # Cache for list icons
# Create main layout
@@ -379,6 +380,7 @@ class CardListFrame(ttk.Frame):
self.level_var.set(initial_level)
self.level_label.config(text=str(initial_level))
self.selected_level = initial_level
# Update details display with colors
type_icon = get_type_icon(card_type)
@@ -394,7 +396,7 @@ class CardListFrame(ttk.Frame):
# Notify parent window
if self.on_card_selected:
self.on_card_selected(card_id, name)
self.on_card_selected(card_id, name, self.selected_level)
def load_card_image(self, image_path):
"""Load and display card image"""
@@ -448,11 +450,19 @@ class CardListFrame(ttk.Frame):
self.level_buttons[lvl] = btn
def set_level(self, level):
"""Set level from quick button"""
"""Update selected level and notify callback"""
if self.current_card_id:
self.selected_level = level
self.level_var.set(level)
self.level_label.config(text=str(level))
self.update_effects_display()
# Notify parent window about level change
if self.on_card_selected:
card = get_card_by_id(self.current_card_id)
if card:
self.on_card_selected(self.current_card_id, card[1], self.selected_level)
# Save level if owned
if self.current_card_id and self.owned_var.get():
update_owned_card_level(self.current_card_id, level)

View File

@@ -453,7 +453,13 @@ class DeckBuilderFrame(ttk.Frame):
# Find empty slot
for i in range(6):
if self.deck_slots[i] is None:
add_card_to_deck(self.current_deck_id, card_id, i, 50)
# Get the last selected level for this card from main window
level = 50
parent = self.winfo_toplevel()
if hasattr(parent, 'last_selected_levels'):
level = parent.last_selected_levels.get(card_id, 50)
add_card_to_deck(self.current_deck_id, card_id, i, level)
self.load_deck()
return

View File

@@ -28,6 +28,7 @@ class SkillSearchFrame(ttk.Frame):
super().__init__(parent)
self.all_skills = []
self.icon_cache = {}
self.current_skill = None
self.create_widgets()
self.load_skills()
@@ -79,10 +80,20 @@ class SkillSearchFrame(ttk.Frame):
right_frame = tk.Frame(main_pane, bg=BG_DARK)
main_pane.add(right_frame, weight=3)
# Result Header
self.result_header = tk.Label(right_frame, text="Select a skill to see who has it",
font=FONT_HEADER, bg=BG_DARK, fg=ACCENT_TERTIARY)
self.result_header.pack(anchor='w', pady=(0, 15), padx=10)
# Search Row (Search + Filter)
search_frame = tk.Frame(right_frame, bg=BG_DARK)
search_frame.pack(fill=tk.X, padx=10, pady=10)
self.result_header = tk.Label(search_frame, text="Select a skill to see cards",
font=FONT_SUBHEADER, bg=BG_DARK, fg=ACCENT_PRIMARY)
self.result_header.pack(side=tk.LEFT)
# Owned Filter
self.owned_only_var = tk.BooleanVar(value=False)
self.owned_check = ttk.Checkbutton(search_frame, text="Show Owned Only",
variable=self.owned_only_var,
command=self.on_filter_changed)
self.owned_check.pack(side=tk.RIGHT, padx=10)
# Results Treeview
tree_frame = create_card_frame(right_frame)
@@ -140,17 +151,24 @@ class SkillSearchFrame(ttk.Frame):
filtered = [s for s in self.all_skills if search in s.lower()]
self.update_listbox(filtered)
def on_filter_changed(self):
"""Handle filter checkbox change"""
if self.current_skill:
self.show_cards_for_skill(self.current_skill)
def on_skill_selected(self, event):
"""Handle skill selection"""
"""Handle skill selection from listbox"""
selection = self.skill_listbox.curselection()
if not selection:
return
skill_name = self.skill_listbox.get(selection[0])
self.current_skill = skill_name
self.show_cards_for_skill(skill_name)
def show_cards_for_skill(self, skill_name):
"""Fetch and display cards with the selected skill"""
self.current_skill = skill_name
self.result_header.config(text=f"Cards with skill: {skill_name}")
# Clear tree
@@ -159,7 +177,12 @@ class SkillSearchFrame(ttk.Frame):
cards = get_cards_with_skill(skill_name)
owned_only = self.owned_only_var.get()
for card in cards:
if owned_only and not card.get('is_owned'):
continue
# Load Icon
card_id = card['card_id']
img = self.icon_cache.get(card_id)

View File

@@ -53,6 +53,9 @@ class MainWindow:
main_container = ttk.Frame(self.root)
main_container.pack(fill=tk.BOTH, expand=True)
# State
self.last_selected_levels = {} # card_id -> level
# Header with stats
self.create_header(main_container)
@@ -201,8 +204,13 @@ class MainWindow:
fg=ACCENT_TERTIARY
).pack(side=tk.RIGHT)
def on_card_selected(self, card_id, card_name):
def on_card_selected(self, card_id, card_name, level=None):
"""Handle card selection from card list"""
# Store level if provided
if level is not None:
self.last_selected_levels[card_id] = level
self.selected_card_id = card_id # Update selected_card_id
# Update other tabs with selected card
if hasattr(self, 'effects_frame'):
self.effects_frame.set_card(card_id)