From 5d9d0a6392e440ce5caaa0624227ab7a95f77c7a Mon Sep 17 00:00:00 2001 From: kiyreload27 Date: Sun, 28 Dec 2025 20:48:01 +0000 Subject: [PATCH] feat: Implement initial GUI structure including main window, card list, deck builder, and skill search. --- gui/card_view.py | 22 ++++++++++++++++------ gui/deck_builder.py | 8 +++++++- gui/hints_skills_view.py | 35 +++++++++++++++++++++++++++++------ gui/main_window.py | 10 +++++++++- 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/gui/card_view.py b/gui/card_view.py index 3d14456..961aeea 100644 --- a/gui/card_view.py +++ b/gui/card_view.py @@ -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,10 +450,18 @@ class CardListFrame(ttk.Frame): self.level_buttons[lvl] = btn def set_level(self, level): - """Set level from quick button""" - self.level_var.set(level) - self.level_label.config(text=str(level)) - self.update_effects_display() + """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(): diff --git a/gui/deck_builder.py b/gui/deck_builder.py index 5d41160..a6d8a1f 100644 --- a/gui/deck_builder.py +++ b/gui/deck_builder.py @@ -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 diff --git a/gui/hints_skills_view.py b/gui/hints_skills_view.py index 94edcea..38cd5e3 100644 --- a/gui/hints_skills_view.py +++ b/gui/hints_skills_view.py @@ -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) diff --git a/gui/main_window.py b/gui/main_window.py index a5b0720..b49e206 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -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)