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.on_stats_updated = on_stats_updated_callback
self.cards = [] self.cards = []
self.current_card_id = None 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 self.icon_cache = {} # Cache for list icons
# Create main layout # Create main layout
@@ -379,6 +380,7 @@ class CardListFrame(ttk.Frame):
self.level_var.set(initial_level) self.level_var.set(initial_level)
self.level_label.config(text=str(initial_level)) self.level_label.config(text=str(initial_level))
self.selected_level = initial_level
# Update details display with colors # Update details display with colors
type_icon = get_type_icon(card_type) type_icon = get_type_icon(card_type)
@@ -394,7 +396,7 @@ class CardListFrame(ttk.Frame):
# Notify parent window # Notify parent window
if self.on_card_selected: 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): def load_card_image(self, image_path):
"""Load and display card image""" """Load and display card image"""
@@ -448,11 +450,19 @@ class CardListFrame(ttk.Frame):
self.level_buttons[lvl] = btn self.level_buttons[lvl] = btn
def set_level(self, level): 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_var.set(level)
self.level_label.config(text=str(level)) self.level_label.config(text=str(level))
self.update_effects_display() 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 # Save level if owned
if self.current_card_id and self.owned_var.get(): if self.current_card_id and self.owned_var.get():
update_owned_card_level(self.current_card_id, level) update_owned_card_level(self.current_card_id, level)

View File

@@ -453,7 +453,13 @@ class DeckBuilderFrame(ttk.Frame):
# Find empty slot # Find empty slot
for i in range(6): for i in range(6):
if self.deck_slots[i] is None: 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() self.load_deck()
return return

View File

@@ -28,6 +28,7 @@ class SkillSearchFrame(ttk.Frame):
super().__init__(parent) super().__init__(parent)
self.all_skills = [] self.all_skills = []
self.icon_cache = {} self.icon_cache = {}
self.current_skill = None
self.create_widgets() self.create_widgets()
self.load_skills() self.load_skills()
@@ -79,10 +80,20 @@ class SkillSearchFrame(ttk.Frame):
right_frame = tk.Frame(main_pane, bg=BG_DARK) right_frame = tk.Frame(main_pane, bg=BG_DARK)
main_pane.add(right_frame, weight=3) main_pane.add(right_frame, weight=3)
# Result Header # Search Row (Search + Filter)
self.result_header = tk.Label(right_frame, text="Select a skill to see who has it", search_frame = tk.Frame(right_frame, bg=BG_DARK)
font=FONT_HEADER, bg=BG_DARK, fg=ACCENT_TERTIARY) search_frame.pack(fill=tk.X, padx=10, pady=10)
self.result_header.pack(anchor='w', pady=(0, 15), padx=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 # Results Treeview
tree_frame = create_card_frame(right_frame) 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()] filtered = [s for s in self.all_skills if search in s.lower()]
self.update_listbox(filtered) 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): def on_skill_selected(self, event):
"""Handle skill selection""" """Handle skill selection from listbox"""
selection = self.skill_listbox.curselection() selection = self.skill_listbox.curselection()
if not selection: if not selection:
return return
skill_name = self.skill_listbox.get(selection[0]) skill_name = self.skill_listbox.get(selection[0])
self.current_skill = skill_name
self.show_cards_for_skill(skill_name) self.show_cards_for_skill(skill_name)
def show_cards_for_skill(self, skill_name): def show_cards_for_skill(self, skill_name):
"""Fetch and display cards with the selected skill""" """Fetch and display cards with the selected skill"""
self.current_skill = skill_name
self.result_header.config(text=f"Cards with skill: {skill_name}") self.result_header.config(text=f"Cards with skill: {skill_name}")
# Clear tree # Clear tree
@@ -159,7 +177,12 @@ class SkillSearchFrame(ttk.Frame):
cards = get_cards_with_skill(skill_name) cards = get_cards_with_skill(skill_name)
owned_only = self.owned_only_var.get()
for card in cards: for card in cards:
if owned_only and not card.get('is_owned'):
continue
# Load Icon # Load Icon
card_id = card['card_id'] card_id = card['card_id']
img = self.icon_cache.get(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 = ttk.Frame(self.root)
main_container.pack(fill=tk.BOTH, expand=True) main_container.pack(fill=tk.BOTH, expand=True)
# State
self.last_selected_levels = {} # card_id -> level
# Header with stats # Header with stats
self.create_header(main_container) self.create_header(main_container)
@@ -201,8 +204,13 @@ class MainWindow:
fg=ACCENT_TERTIARY fg=ACCENT_TERTIARY
).pack(side=tk.RIGHT) ).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""" """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 # Update other tabs with selected card
if hasattr(self, 'effects_frame'): if hasattr(self, 'effects_frame'):
self.effects_frame.set_card(card_id) self.effects_frame.set_card(card_id)