From 7adba9194f382d856362b0d98dc2b40e225cc82c Mon Sep 17 00:00:00 2001 From: luxick Date: Sat, 22 Apr 2017 13:49:21 +0200 Subject: [PATCH] Untag and remove cards in library with context menu. --- README.md | 3 +- cardvault/application.py | 11 +++++++ cardvault/gui/library.glade | 24 +++++++++++++++ cardvault/handlers.py | 61 +++++++++++++++++++++++++++++++++---- cardvault/lib_funct.py | 5 ++- mtgsdk/card.py | 1 + 6 files changed, 97 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6725d42..866be93 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,12 @@ A desktop application for building and organizing MTG card libraries and decks. * Online card search * Create a library of owned cards +* Organize cards in library * Import and Export Libraries + ## TODO -* Organize cards in library * Build decklists from cards in collection * Want lists * Full offline functionality diff --git a/cardvault/application.py b/cardvault/application.py index 5ee28b1..2a8cb51 100644 --- a/cardvault/application.py +++ b/cardvault/application.py @@ -34,6 +34,7 @@ class Application: self.current_page = None self.unsaved_changes = False + self.current_lib_tag = "All" not_found = self.ui.get_object("pageNotFound") self.pages = { @@ -243,6 +244,11 @@ class Application: list.append(card.multiverse_id) self.unsaved_changes = True + def untag_card(self, card, tag): + list = self.tags[tag] + list.remove(card.multiverse_id) + self.unsaved_changes = True + def add_tag(self, tag): self.tags[tag] = [] util.log("Tag '" + tag + "' added", util.LogLevel.Info) @@ -269,6 +275,11 @@ class Application: self.unsaved_changes = True def remove_card_from_lib(self, card): + # Check if card is tagged + for card_ids in self.tags.values(): + if card_ids.__contains__(card.multiverse_id): + card_ids.remove(card.multiverse_id) + del self.library[card.multiverse_id] self.push_status(card.name + " removed from library") self.unsaved_changes = True diff --git a/cardvault/gui/library.glade b/cardvault/gui/library.glade index 82c715c..fd79874 100644 --- a/cardvault/gui/library.glade +++ b/cardvault/gui/library.glade @@ -2,6 +2,30 @@ + + True + False + + + + True + False + False + Untag Card + True + + + + + + True + False + Remove from Library + True + + + + True False diff --git a/cardvault/handlers.py b/cardvault/handlers.py index 51481ad..1f96103 100644 --- a/cardvault/handlers.py +++ b/cardvault/handlers.py @@ -14,7 +14,7 @@ class Handlers: def __init__(self, app): self.app = app - # ----------------Main Window----------------- + # ---------------------------------Main Window---------------------------------------------- def do_save_library(self, item): self.app.save_library() @@ -78,7 +78,7 @@ class Handlers: if response == Gtk.ResponseType.YES: self.app.save_library() - # ----------------Search----------------- + # ---------------------------------Search---------------------------------------------- def do_search_cards(self, sender): search_term = self.app.ui.get_object("searchEntry").get_text() @@ -111,7 +111,7 @@ class Handlers: self.app.add_card_to_lib(card) search_funct.reload_serach_view(self.app) - # ----------------Library----------------- + # ---------------------------------Library---------------------------------------------- def do_reload_library(self, view): lib_funct.reload_library(self.app) @@ -127,12 +127,14 @@ class Handlers: def do_show_all_clicked(self, button): # Clear selection in tag list self.app.ui.get_object("tagTree").get_selection().unselect_all() + self.app.current_lib_tag = "All" lib_funct.reload_library(self.app) def do_show_untagged_clicked(self, button): # Clear selection in tag list self.app.ui.get_object("tagTree").get_selection().unselect_all() - lib_funct.reload_library(self.app, "untagged") + self.app.current_lib_tag = "Untagged" + lib_funct.reload_library(self.app, "Untagged") def do_tag_cards(self, entry): card_view = self.app.ui.get_object("libraryContainer").get_child() @@ -151,6 +153,7 @@ class Handlers: for path in pathlist: tree_iter = model.get_iter(path) tag = model.get_value(tree_iter, 0) + self.app.current_lib_tag = tag lib_funct.reload_library(self.app, tag) def do_tag_tree_press_event(self, treeview, event): @@ -181,9 +184,47 @@ class Handlers: # Access Card View inside of container container.get_child().filter.refilter() + def lib_tree_popup_showed(self, menu): + # Get selected cards + card_list = self.app.ui.get_object("libraryContainer").get_child() + cards = card_list.get_selected_cards() + + # Check if a tag is selected + current_tag = self.app.current_lib_tag + if current_tag == "All" or current_tag == "Untagged": + return + + # Check if selected Cards are tagged + for id_list in self.app.tags.values(): + for card_id in cards.keys(): + if id_list.__contains__(card_id): + # Enable untag menu item + self.app.ui.get_object("untagItem").set_sensitive(True) + return + + def do_popup_untag_cards(self, item): + # Get selected cards + card_list = self.app.ui.get_object("libraryContainer").get_child() + cards = card_list.get_selected_cards() + tag = self.app.current_lib_tag + for card in cards.values(): + self.app.untag_card(card, tag) + lib_funct.reload_library(self.app, tag) + lib_funct.reload_tag_list(self.app, preserve=True) + + def do_popup_remove_card(self, item): + # Get selected cards + card_list = self.app.ui.get_object("libraryContainer").get_child() + cards = card_list.get_selected_cards() + # Remove selected cards + for card in cards.values(): + self.app.remove_card_from_lib(card) + lib_funct.reload_library(self.app, self.app.current_lib_tag) + lib_funct.reload_tag_list(self.app, preserve=True) + # Handlers for TreeViews etc. wich have been not added by Glade - # ----------------Search----------------- + # ---------------------------------Search Tree---------------------------------------------- def on_search_card_selected(self, tree, row_no, column): (model, path_list) = tree.get_selection().get_selected_rows() @@ -204,7 +245,7 @@ class Handlers: else: add_remove_button.set_sensitive(False) - # ----------------Library----------------- + # ---------------------------------Library Tree---------------------------------------------- def on_library_card_selected(self, tree, row_no, column): (model, path_list) = tree.get_selection().get_selected_rows() @@ -214,3 +255,11 @@ class Handlers: card_list = self.app.ui.get_object("libraryContainer").get_child() card = card_list.lib[card_id] self.app.show_card_details(card) + + def on_library_tree_press_event(self, treeview, event): + if event.button == 3: # right click + path = treeview.get_path_at_pos(int(event.x), int(event.y)) + if path: + tree_iter = treeview.get_model().get_iter(path[0]) + self.app.ui.get_object("libListPopup").emit('show') + self.app.ui.get_object("libListPopup").popup(None, None, None, None, 0, event.time) diff --git a/cardvault/lib_funct.py b/cardvault/lib_funct.py index 85ea87a..45037a1 100644 --- a/cardvault/lib_funct.py +++ b/cardvault/lib_funct.py @@ -9,7 +9,10 @@ def init_library_view(app): container = app.ui.get_object("libraryContainer") card_list = cardlist.CardList(True, app) card_list.set_name("libScroller") + # Show details card_list.list.connect("row-activated", app.handlers.on_library_card_selected) + # Show Context menu + card_list.list.connect("button-press-event", app.handlers.on_library_tree_press_event) card_list.filter.set_visible_func(app.filter_lib_func) container.add(card_list) container.add_overlay(app.ui.get_object("noResults")) @@ -19,7 +22,7 @@ def init_library_view(app): def reload_library(app, tag=None): - if tag == "untagged": + if tag == "Untagged": lib = app.get_untagged_cards() tag = None else: diff --git a/mtgsdk/card.py b/mtgsdk/card.py index 7d6c565..0a1f8df 100644 --- a/mtgsdk/card.py +++ b/mtgsdk/card.py @@ -54,6 +54,7 @@ class Card(object): self.rulings = response_dict.get('rulings') self.foreign_names = response_dict.get('foreignNames') self.owned = None + self.tags = [] @staticmethod def find(id):