feat: Implement initial GUI structure including main window, card list, deck builder, and skill search.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user