From 0518775205b302a5154093afdfe48545c676d903 Mon Sep 17 00:00:00 2001 From: luxick Date: Wed, 5 Jul 2017 13:58:48 +0200 Subject: [PATCH] Refactor signal handlers into separate classes. --- cardvault/application.py | 11 - cardvault/gui/cardtree.glade | 126 ++++++++++ cardvault/handlers.py | 456 +---------------------------------- cardvault/lib_funct.py | 70 ------ cardvault/library.py | 211 ++++++++++++++++ cardvault/search.py | 343 ++++++++++++++++++++++++++ cardvault/search_funct.py | 156 ------------ cardvault/wants.py | 176 ++++++++++++++ cardvault/wants_funct.py | 53 ---- 9 files changed, 868 insertions(+), 734 deletions(-) create mode 100644 cardvault/gui/cardtree.glade delete mode 100644 cardvault/lib_funct.py create mode 100644 cardvault/library.py create mode 100644 cardvault/search.py delete mode 100644 cardvault/search_funct.py create mode 100644 cardvault/wants.py delete mode 100644 cardvault/wants_funct.py diff --git a/cardvault/application.py b/cardvault/application.py index f4b0a10..05f91e4 100644 --- a/cardvault/application.py +++ b/cardvault/application.py @@ -18,8 +18,6 @@ from typing import Type, Dict, List from cardvault import handlers from cardvault import util -from cardvault import search_funct -from cardvault import lib_funct from cardvault import wants_funct @@ -73,14 +71,6 @@ class Application: self.handlers = handlers.Handlers(self) self.ui.connect_signals(self.handlers) - # Initialize the views - - search_funct.init_search_view(self) - - lib_funct.init_library_view(self) - - wants_funct.init_wants_view(self) - self.ui.get_object("mainWindow").connect('delete-event', Gtk.main_quit) self.ui.get_object("mainWindow").show_all() self.push_status("Card Vault ready.") @@ -89,7 +79,6 @@ class Application: start_page = [page for page in view_menu.get_children() if page.get_name() == util.START_PAGE] start_page[0].activate() - util.log("Launching Card Vault version {}".format(util.VERSION), util.LogLevel.Info) def push_status(self, msg): diff --git a/cardvault/gui/cardtree.glade b/cardvault/gui/cardtree.glade new file mode 100644 index 0000000..a14b5b4 --- /dev/null +++ b/cardvault/gui/cardtree.glade @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + cardStore + 2 + both + + + + + + True + Card Name + True + 1 + + + 800 + + + 11 + 1 + + + + + + + Supertypes + 2 + + + + 11 + 2 + + + + + + + Types + 3 + + + + 11 + 3 + + + + + + + Rarity + 4 + + + + 11 + 4 + + + + + + + Edition + 10 + + + + 11 + 10 + + + + + + + Mana Cost + 9 + + + 0.019999999552965164 + + + 8 + + + + + + diff --git a/cardvault/handlers.py b/cardvault/handlers.py index df17152..8c07575 100644 --- a/cardvault/handlers.py +++ b/cardvault/handlers.py @@ -1,22 +1,28 @@ import gi - gi.require_version('Gtk', '3.0') import datetime import os from gi.repository import Gtk -from cardvault import lib_funct -from cardvault import search_funct -from cardvault import wants_funct from cardvault import util from cardvault import application +from search import SearchHandlers +from library import LibraryHandlers +from wants import WantsHandlers -class Handlers: + +class Handlers(SearchHandlers, LibraryHandlers, WantsHandlers): def __init__(self, app: 'application.Application'): + """Initialize handlers for UI signals""" self.app = app - # ---------------------------------Main Window---------------------------------------------- + # Call constructor of view handlers classes + SearchHandlers.__init__(self, app) + LibraryHandlers.__init__(self, app) + WantsHandlers.__init__(self, app) + + # --------------------------------- Main Window Handlers ---------------------------------------------- def do_save_library(self, item): self.app.save_library() @@ -85,441 +91,3 @@ class Handlers: return False elif response == Gtk.ResponseType.CANCEL: return True - - # ---------------------------------Search---------------------------------------------- - - def do_search_cards(self, sender): - search_term = self.app.ui.get_object("searchEntry").get_text() - - filters = search_funct.get_filters(self.app) - - results = search_funct.search_cards(search_term, filters) - - card_list = self.app.ui.get_object("searchResults").get_child() - card_list.update(results) - - self.app.ui.get_object("searchOverlay").set_visible(False) - - @staticmethod - def do_clear_mana_filter(mana_filter_grid): - for toggle_button in mana_filter_grid.get_children(): - if isinstance(toggle_button, Gtk.ToggleButton): - toggle_button.set_active(False) - - @staticmethod - def do_clear_set_filter(entry, icon_pos, button): - entry.set_text("") - - def do_add_clicked(self, button): - card_view = self.app.ui.get_object("searchResults").get_child() - (model, pathlist) = card_view.selection.get_selected_rows() - - for path in pathlist: - tree_iter = model.get_iter(path) - card_id = model.get_value(tree_iter, 0) - card = card_view.lib[card_id] - self.app.add_card_to_lib(card) - search_funct.reload_search_view(self.app) - self.app.ui.get_object("searchEntry").grab_focus() - - def search_tree_popup_showed(self, menu): - # Create tag submenu - tags_item = self.app.ui.get_object("searchListPopupAddTag") - tags_sub = Gtk.Menu() - tags_item.set_submenu(tags_sub) - - for list_name in self.app.tags.keys(): - item = Gtk.MenuItem() - tags_sub.add(item) - item.set_label(list_name) - item.connect('activate', self.search_popup_add_tags) - - # Add separator - tags_sub.add(Gtk.SeparatorMenuItem()) - # Add new tag item - new_tag = Gtk.MenuItem("New Tag") - new_tag.connect('activate', self.new_tag_and_add) - tags_sub.add(new_tag) - - tags_item.show_all() - - # Create wants Submenu - wants_item = self.app.ui.get_object("searchListPopupWants") - wants_sub = Gtk.Menu() - wants_item.set_submenu(wants_sub) - - for list_name in self.app.wants.keys(): - item = Gtk.MenuItem() - wants_sub.add(item) - item.set_label(list_name) - item.connect('activate', self.search_popup_add_wants) - - # Add separator - wants_sub.add(Gtk.SeparatorMenuItem()) - # Add new tag item - new_want = Gtk.MenuItem("New Want List") - new_want.connect('activate', self.new_wants_and_add) - wants_sub.add(new_want) - - wants_item.show_all() - - def new_tag_and_add(self, menu_item): - # Get selected cards - card_list = self.app.ui.get_object("searchResults").get_child() - cards = card_list.get_selected_cards() - response = self.app.show_name_enter_dialog("Enter name for new Tag", "") - if not response == "": - self.app.add_tag(response) - for card in cards.values(): - self.app.add_card_to_lib(card, response) - else: - util.log("No tag name entered", util.LogLevel.Warning) - self.app.push_status("No name for new tag entered") - search_funct.reload_search_view(self.app) - - def new_wants_and_add(self, menu_item): - # Get selected cards - card_list = self.app.ui.get_object("searchResults").get_child() - cards = card_list.get_selected_cards() - response = self.app.show_name_enter_dialog("Enter name for new Want List", "") - if not response == "": - self.app.add_want_list(response) - for card in cards.values(): - self.app.add_card_to_want_list(response, card) - else: - util.log("No list name entered", util.LogLevel.Warning) - self.app.push_status("No name for new wants list entered") - search_funct.reload_search_view(self.app) - - def search_popup_add_tags(self, item): - # Get selected cards - card_list = self.app.ui.get_object("searchResults").get_child() - cards = card_list.get_selected_cards() - for card in cards.values(): - self.app.add_card_to_lib(card, item.get_label()) - search_funct.reload_search_view(self.app) - self.app.push_status("Added " + str(len(cards)) + " card(s) to library.") - - def search_popup_add_wants(self, item): - # Get selected cards - card_list = self.app.ui.get_object("searchResults").get_child() - cards = card_list.get_selected_cards() - for card in cards.values(): - self.app.add_card_to_want_list(item.get_label(), card) - search_funct.reload_search_view(self.app) - self.app.push_status("Added " + str(len(cards)) + " card(s) to Want List '" + item.get_label() + "'") - - def do_search_clear_all_clicked(self, button): - """ Rest all controls in search view """ - self.app.ui.get_object("searchEntry").set_text("") - self.do_clear_mana_filter(self.app.ui.get_object("manaFilterGrid")) - self.app.ui.get_object("rarityCombo").set_active(0) - self.app.ui.get_object("typeCombo").set_active(0) - self.app.ui.get_object("setEntry").set_text("") - - def do_show_card_details(self, menu_item): - tree = self.app.ui.get_object("searchResults").get_child() - cards = tree.get_selected_cards() - for card in cards.values(): - self.app.show_card_details(card) - - def do_search_add_to_lib(self, menu_item): - tree = self.app.ui.get_object("searchResults").get_child() - cards = tree.get_selected_cards() - for card in cards.values(): - self.app.add_card_to_lib(card) - search_funct.reload_search_view(self.app) - - # ---------------------------------Library---------------------------------------------- - - def do_reload_library(self, view): - lib_funct.reload_library(self.app) - - def do_tag_entry_changed(self, entry): - input_valid = entry.get_text() and entry.get_text() != "" - self.app.ui.get_object("newTagButton").set_sensitive(input_valid) - - def do_new_tag_clicked(self, entry): - lib_funct.add_new_tag(entry.get_text(), self.app) - entry.set_text("") - - 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() - 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() - selected_cards = card_view.get_selected_cards() - tag = entry.get_text() - if tag != "": - lib_funct.tag_cards(selected_cards, tag, self.app) - lib_funct.reload_library(self.app, tag) - entry.set_text("") - - def on_tag_selected(self, selection, path, column): - (model, pathlist) = selection.get_selected_rows() - 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): - 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]) - tag = treeview.get_model().get_value(tree_iter, 0) - self.app.ui.get_object("tagListPopup").popup(None, None, None, None, 0, event.time) - - def do_tag_list_rename(self, tree): - (model, pathlist) = tree.get_selection().get_selected_rows() - for path in pathlist: - tree_iter = model.get_iter(path) - tag = model.get_value(tree_iter, 0) - - new_name = self.app.show_name_enter_dialog("Rename Tag", tag) - self.app.rename_tag(tag, new_name) - self.app.current_page.emit('show') - - def do_tag_list_delete(self, tree): - (model, pathlist) = tree.get_selection().get_selected_rows() - for path in pathlist: - tree_iter = model.get_iter(path) - tag = model.get_value(tree_iter, 0) - self.app.remove_tag(tag) - self.app.current_page.emit('show') - - def do_refilter_library(self, container): - # 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) - - # ---------------------------------Wants---------------------------------------------- - - def do_reload_wants(self, view): - wants_funct.reload_wants_view(self.app) - - def on_new_wants_list_clicked(self, entry): - name = entry.get_text() - entry.set_text("") - # Check if list name already exists - if self.app.wants.__contains__(name): - return - self.app.add_want_list(name) - wants_funct.reload_wants_view(self.app) - - def on_want_list_selected(self, selection, path, column): - (model, pathlist) = selection.get_selected_rows() - for path in pathlist: - tree_iter = model.get_iter(path) - list_name = model.get_value(tree_iter, 0) - wants_funct.reload_wants_view(self.app, list_name) - - def do_wants_tree_press_event(self, treeview, event): - if event.button == 3: # right click - path = treeview.get_path_at_pos(int(event.x), int(event.y)) - # Get the selection - selection = treeview.get_selection() - # Get the selected path(s) - rows = selection.get_selected_rows() - # If not clicked on selection, change selected rows - if path: - if path[0] not in rows[1]: - selection.unselect_all() - selection.select_path(path[0]) - self.app.ui.get_object("wants_wantsListPopup").popup(None, None, None, None, 0, event.time) - return True - - def do_rename_wants_list(self, tree): - (model, pathlist) = tree.get_selection().get_selected_rows() - for path in pathlist: - tree_iter = model.get_iter(path) - tag = model.get_value(tree_iter, 0) - - new_name = self.app.show_name_enter_dialog("Rename Want List", tag) - if not tag == new_name: - self.app.rename_want_list(tag, new_name) - self.app.current_page.emit('show') - - def do_delete_wants_list(self, tree): - (model, pathlist) = tree.get_selection().get_selected_rows() - for path in pathlist: - tree_iter = model.get_iter(path) - name = model.get_value(tree_iter, 0) - - self.app.delete_wants_list(name) - self.app.current_page.emit('show') - - def on_want_cards_add_activated(self, menu_item): - # Get selected cards - tree = self.app.ui.get_object("wantsListContainer").get_child() - selected = tree.get_selected_cards() - - # Get selected list - list_tree = self.app.ui.get_object("wantsListsTree") - (model, pathlist) = list_tree.get_selection().get_selected_rows() - for path in pathlist: - tree_iter = model.get_iter(path) - list_name = model.get_value(tree_iter, 0) - - for card in selected.values(): - self.app.add_card_to_lib(card) - self.app.remove_card_from_want_list(card, list_name) - - wants_funct.reload_wants_view(self.app, list_name) - - def on_want_cards_remove_activated(self, menu_item): - # Get selected cards - tree = self.app.ui.get_object("wantsListContainer").get_child() - selected = tree.get_selected_cards() - - # Get selected list - list_tree = self.app.ui.get_object("wantsListsTree") - (model, pathlist) = list_tree.get_selection().get_selected_rows() - for path in pathlist: - tree_iter = model.get_iter(path) - list_name = model.get_value(tree_iter, 0) - - for card in selected.values(): - self.app.remove_card_from_want_list(card, list_name) - - wants_funct.reload_wants_view(self.app, list_name) - - # Handlers for TreeViews etc. which have been not added by Glade - - # ---------------------------------Search Tree---------------------------------------------- - - def on_search_card_selected(self, tree, row_no, column): - (model, path_list) = tree.get_selection().get_selected_rows() - for path in path_list: - tree_iter = model.get_iter(path) - card_id = model.get_value(tree_iter, 0) - card_list = self.app.ui.get_object("searchResults").get_child() - card = card_list.lib[card_id] - self.app.show_card_details(card) - - def on_search_selection_changed(self, selection): - (model, pathlist) = selection.get_selected_rows() - tools = self.app.ui.get_object("selectionToolsBox") - add_remove_button = self.app.ui.get_object("addRemoveButton") - - if pathlist: - add_remove_button.set_sensitive(True) - else: - add_remove_button.set_sensitive(False) - - def on_search_tree_press_event(self, treeview, event): - if event.button == 3: # right click - path = treeview.get_path_at_pos(int(event.x), int(event.y)) - # Get the selection - selection = treeview.get_selection() - # Get the selected path(s) - rows = selection.get_selected_rows() - # If not clicked on selection, change selected rows - if path: - if path[0] not in rows[1]: - selection.unselect_all() - selection.select_path(path[0]) - self.app.ui.get_object("searchListPopup").emit('show') - self.app.ui.get_object("searchListPopup").popup(None, None, None, None, 0, event.time) - return True - - # ---------------------------------Library Tree---------------------------------------------- - - def on_library_card_selected(self, tree, row_no, column): - (model, path_list) = tree.get_selection().get_selected_rows() - for path in path_list: - tree_iter = model.get_iter(path) - card_id = model.get_value(tree_iter, 0) - 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)) - # Get the selection - selection = treeview.get_selection() - # Get the selected path(s) - rows = selection.get_selected_rows() - # If not clicked on selection, change selected rows - if path[0] not in rows[1]: - selection.unselect_all() - selection.select_path(path[0]) - self.app.ui.get_object("libListPopup").emit('show') - self.app.ui.get_object("libListPopup").popup(None, None, None, None, 0, event.time) - return True - - # ---------------------------------Wants Tree---------------------------------------------- - - def on_wants_card_selected(self, tree, row, column): - (model, path_list) = tree.get_selection().get_selected_rows() - for path in path_list: - tree_iter = model.get_iter(path) - card_id = model.get_value(tree_iter, 0) - card_list = self.app.ui.get_object("wantsListContainer").get_child() - card = card_list.lib[card_id] - self.app.show_card_details(card) - - def on_wants_cards_press_event(self, treeview, event): - if event.button == 3: # right click - path = treeview.get_path_at_pos(int(event.x), int(event.y)) - # Get the selection - selection = treeview.get_selection() - # Get the selected path(s) - rows = selection.get_selected_rows() - # If not clicked on selection, change selected rows - if path[0] not in rows[1]: - selection.unselect_all() - selection.select_path(path[0]) - - # Show popup and emit 'show' to trigger update function of popup - self.app.ui.get_object("wants_cardListPopup").emit('show') - self.app.ui.get_object("wants_cardListPopup").popup(None, None, None, None, 0, event.time) - return True diff --git a/cardvault/lib_funct.py b/cardvault/lib_funct.py deleted file mode 100644 index de35640..0000000 --- a/cardvault/lib_funct.py +++ /dev/null @@ -1,70 +0,0 @@ -import gi -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk - -from cardvault import util -from cardvault import cardlist - - -def init_library_view(app): - # Create Tree View for library - container = app.ui.get_object("libraryContainer") - card_list = cardlist.CardList(True, app, util.GENERIC_TREE_COLORS) - 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")) - container.show_all() - - app.ui.get_object("noResults").set_visible(False) - - -def reload_library(app, tag=None): - if tag == "Untagged" or tag == "All": - lib = app.get_untagged_cards() - tag = None - else: - lib = app.get_tagged_cards(tag) - reload_tag_list(app, tag) - tag_combo = app.ui.get_object("tagCardCombo") - tag_combo.set_model(app.ui.get_object("tagStore")) - - card_tree = app.ui.get_object("libraryContainer").get_child() - if lib: - app.ui.get_object("noResults").set_visible(False) - card_tree.update(lib) - else: - card_tree.store.clear() - app.ui.get_object("noResults").set_visible(True) - - -def add_new_tag(name, app): - app.add_tag(name) - reload_tag_list(app, True) - - -def reload_tag_list(app, preserve=False): - tree = app.ui.get_object("tagTree") - (path, column) = tree.get_cursor() - store = tree.get_model() - store.clear() - for tag, ids in app.tags.items(): - store.append([tag, tag + " (" + str(len(ids)) + ")"]) - if preserve: - tree.set_cursor(path if path else 0) - store.set_sort_column_id(1, Gtk.SortType.ASCENDING) - - -def tag_cards(card_list, tag, app): - # Check if tag exist and create if necessary - if not app.tags.__contains__(tag): - app.add_tag(tag) - - for card in card_list.values(): - if not app.tags[tag].__contains__(card.multiverse_id): - app.tag_card(card, tag) - diff --git a/cardvault/library.py b/cardvault/library.py new file mode 100644 index 0000000..ad2cb98 --- /dev/null +++ b/cardvault/library.py @@ -0,0 +1,211 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +from cardvault import application +from cardvault import util +from cardvault import cardlist + + +class LibraryHandlers: + def __init__(self, app: 'application.Application'): + self.app = app + self.init_library_view() + + def do_reload_library(self, view): + self.reload_library() + + def do_tag_entry_changed(self, entry): + input_valid = entry.get_text() and entry.get_text() != "" + self.app.ui.get_object("newTagButton").set_sensitive(input_valid) + + def do_new_tag_clicked(self, entry): + self.add_new_tag(entry.get_text()) + entry.set_text("") + + 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" + self.reload_library("All") + + def do_show_untagged_clicked(self, button): + # Clear selection in tag list + self.app.ui.get_object("tagTree").get_selection().unselect_all() + self.app.current_lib_tag = "Untagged" + self.reload_library("Untagged") + + def do_tag_cards(self, entry): + card_view = self.app.ui.get_object("libraryContainer").get_child() + selected_cards = card_view.get_selected_cards() + tag = entry.get_text() + if tag != "": + self.tag_cards(selected_cards, tag) + self.reload_library(tag) + entry.set_text("") + + def on_tag_selected(self, selection, path, column): + (model, pathlist) = selection.get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + tag = model.get_value(tree_iter, 0) + self.app.current_lib_tag = tag + self.reload_library(tag) + + def do_tag_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]) + tag = treeview.get_model().get_value(tree_iter, 0) + self.app.ui.get_object("tagListPopup").popup(None, None, None, None, 0, event.time) + + def do_tag_list_rename(self, tree): + (model, pathlist) = tree.get_selection().get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + tag = model.get_value(tree_iter, 0) + + new_name = self.app.show_name_enter_dialog("Rename Tag", tag) + self.app.rename_tag(tag, new_name) + self.app.current_page.emit('show') + + def do_tag_list_delete(self, tree): + (model, pathlist) = tree.get_selection().get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + tag = model.get_value(tree_iter, 0) + self.app.remove_tag(tag) + self.app.current_page.emit('show') + + def do_refilter_library(self, container): + # 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) + self.reload_library(tag) + self.reload_tag_list(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) + self.reload_library(self.app.current_lib_tag) + self.reload_tag_list(preserve=True) + + # ---------------------------------Library Tree---------------------------------------------- + + def on_library_card_selected(self, tree, row_no, column): + (model, path_list) = tree.get_selection().get_selected_rows() + for path in path_list: + tree_iter = model.get_iter(path) + card_id = model.get_value(tree_iter, 0) + 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)) + # Get the selection + selection = treeview.get_selection() + # Get the selected path(s) + rows = selection.get_selected_rows() + # If not clicked on selection, change selected rows + if path[0] not in rows[1]: + selection.unselect_all() + selection.select_path(path[0]) + self.app.ui.get_object("libListPopup").emit('show') + self.app.ui.get_object("libListPopup").popup(None, None, None, None, 0, event.time) + return True + + # -------------------------- Class Functions ------------------------------- + + def init_library_view(self): + """Initialize the library view""" + # Create Tree View for library + container = self.app.ui.get_object("libraryContainer") + card_list = cardlist.CardList(True, self.app, util.GENERIC_TREE_COLORS) + card_list.set_name("libScroller") + # Show details + card_list.list.connect("row-activated", self.on_library_card_selected) + # Show Context menu + card_list.list.connect("button-press-event", self.on_library_tree_press_event) + card_list.filter.set_visible_func(self.app.filter_lib_func) + container.add(card_list) + container.add_overlay(self.app.ui.get_object("noResults")) + container.show_all() + + self.app.ui.get_object("noResults").set_visible(False) + + def reload_library(self, tag="All"): + if tag == "Untagged": + lib = self.app.get_untagged_cards() + elif tag == "All": + lib = self.app.library + else: + lib = self.app.get_tagged_cards(tag) + self.reload_tag_list(True) + tag_combo = self.app.ui.get_object("tagCardCombo") + tag_combo.set_model(self.app.ui.get_object("tagStore")) + + card_tree = self.app.ui.get_object("libraryContainer").get_child() + if lib: + self.app.ui.get_object("noResults").set_visible(False) + card_tree.update(lib) + else: + card_tree.store.clear() + self.app.ui.get_object("noResults").set_visible(True) + + def add_new_tag(self, name): + self.app.add_tag(name) + self.reload_tag_list(True) + + def reload_tag_list(self, preserve=False): + """Reload left pane tag list""" + tree = self.app.ui.get_object("tagTree") + (path, column) = tree.get_cursor() + store = tree.get_model() + store.clear() + for tag, ids in self.app.tags.items(): + store.append([tag, tag + " (" + str(len(ids)) + ")"]) + if preserve: + tree.set_cursor(path if path else 0) + store.set_sort_column_id(1, Gtk.SortType.ASCENDING) + + def tag_cards(self, card_list, tag): + # Check if tag exist and create if necessary + if not self.app.tags.__contains__(tag): + self.app.add_tag(tag) + + for card in card_list.values(): + if not self.app.tags[tag].__contains__(card.multiverse_id): + self.app.tag_card(card, tag) + diff --git a/cardvault/search.py b/cardvault/search.py new file mode 100644 index 0000000..2e44f69 --- /dev/null +++ b/cardvault/search.py @@ -0,0 +1,343 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from urllib.error import URLError, HTTPError + +import time + +from mtgsdk import Card + +from cardvault import application +from cardvault import cardlist +from cardvault import util + + +class SearchHandlers: + def __init__(self, app: 'application.Application'): + self.app = app + self.init_search_view() + + def do_search_cards(self, sender): + search_term = self.app.ui.get_object("searchEntry").get_text() + + filters = self.get_filters() + + results = self.search_cards(search_term, filters) + + card_list = self.app.ui.get_object("searchResults").get_child() + card_list.update(results) + + self.app.ui.get_object("searchOverlay").set_visible(False) + + @staticmethod + def do_clear_mana_filter(mana_filter_grid): + for toggle_button in mana_filter_grid.get_children(): + if isinstance(toggle_button, Gtk.ToggleButton): + toggle_button.set_active(False) + + @staticmethod + def do_clear_set_filter(entry, icon_pos, button): + entry.set_text("") + + def do_add_clicked(self, button): + card_view = self.app.ui.get_object("searchResults").get_child() + (model, pathlist) = card_view.selection.get_selected_rows() + + for path in pathlist: + tree_iter = model.get_iter(path) + card_id = model.get_value(tree_iter, 0) + card = card_view.lib[card_id] + self.app.add_card_to_lib(card) + self.reload_search_view() + self.app.ui.get_object("searchEntry").grab_focus() + + def search_tree_popup_showed(self, menu): + # Create tag submenu + tags_item = self.app.ui.get_object("searchListPopupAddTag") + tags_sub = Gtk.Menu() + tags_item.set_submenu(tags_sub) + + for list_name in self.app.tags.keys(): + item = Gtk.MenuItem() + tags_sub.add(item) + item.set_label(list_name) + item.connect('activate', self.search_popup_add_tags) + + # Add separator + tags_sub.add(Gtk.SeparatorMenuItem()) + # Add new tag item + new_tag = Gtk.MenuItem("New Tag") + new_tag.connect('activate', self.new_tag_and_add) + tags_sub.add(new_tag) + + tags_item.show_all() + + # Create wants Submenu + wants_item = self.app.ui.get_object("searchListPopupWants") + wants_sub = Gtk.Menu() + wants_item.set_submenu(wants_sub) + + for list_name in self.app.wants.keys(): + item = Gtk.MenuItem() + wants_sub.add(item) + item.set_label(list_name) + item.connect('activate', self.search_popup_add_wants) + + # Add separator + wants_sub.add(Gtk.SeparatorMenuItem()) + # Add new tag item + new_want = Gtk.MenuItem("New Want List") + new_want.connect('activate', self.new_wants_and_add) + wants_sub.add(new_want) + + wants_item.show_all() + + def new_tag_and_add(self, menu_item): + # Get selected cards + card_list = self.app.ui.get_object("searchResults").get_child() + cards = card_list.get_selected_cards() + response = self.app.show_name_enter_dialog("Enter name for new Tag", "") + if not response == "": + self.app.add_tag(response) + for card in cards.values(): + self.app.add_card_to_lib(card, response) + else: + util.log("No tag name entered", util.LogLevel.Warning) + self.app.push_status("No name for new tag entered") + self.reload_search_view() + + def new_wants_and_add(self, menu_item): + # Get selected cards + card_list = self.app.ui.get_object("searchResults").get_child() + cards = card_list.get_selected_cards() + response = self.app.show_name_enter_dialog("Enter name for new Want List", "") + if not response == "": + self.app.add_want_list(response) + for card in cards.values(): + self.app.add_card_to_want_list(response, card) + else: + util.log("No list name entered", util.LogLevel.Warning) + self.app.push_status("No name for new wants list entered") + self.reload_search_view() + + def search_popup_add_tags(self, item): + # Get selected cards + card_list = self.app.ui.get_object("searchResults").get_child() + cards = card_list.get_selected_cards() + for card in cards.values(): + self.app.add_card_to_lib(card, item.get_label()) + self.reload_search_view() + self.app.push_status("Added " + str(len(cards)) + " card(s) to library.") + + def search_popup_add_wants(self, item): + # Get selected cards + card_list = self.app.ui.get_object("searchResults").get_child() + cards = card_list.get_selected_cards() + for card in cards.values(): + self.app.add_card_to_want_list(item.get_label(), card) + self.reload_search_view() + self.app.push_status("Added " + str(len(cards)) + " card(s) to Want List '" + item.get_label() + "'") + + def do_search_clear_all_clicked(self, button): + """ Rest all controls in search view """ + self.app.ui.get_object("searchEntry").set_text("") + self.do_clear_mana_filter(self.app.ui.get_object("manaFilterGrid")) + self.app.ui.get_object("rarityCombo").set_active(0) + self.app.ui.get_object("typeCombo").set_active(0) + self.app.ui.get_object("setEntry").set_text("") + + def do_show_card_details(self, menu_item): + tree = self.app.ui.get_object("searchResults").get_child() + cards = tree.get_selected_cards() + for card in cards.values(): + self.app.show_card_details(card) + + def do_search_add_to_lib(self, menu_item): + tree = self.app.ui.get_object("searchResults").get_child() + cards = tree.get_selected_cards() + for card in cards.values(): + self.app.add_card_to_lib(card) + self.reload_search_view() + + def init_search_view(self): + # set mana icons on filter buttons + buttons = [x for x in self.app.ui.get_object("manaFilterGrid").get_children() + if isinstance(x, Gtk.ToggleButton)] + self._init_mana_buttons(buttons) + # set auto completion for filter entry + self._init_set_entry(self.app.ui.get_object("setEntry")) + # Fill rarity box + self._init_combo_box(self.app.ui.get_object("rarityCombo"), util.rarity_dict.keys()) + # Fill type box + self._init_combo_box(self.app.ui.get_object("typeCombo"), util.card_types) + # Create Model for search results + self._init_results_tree() + + def reload_search_view(self): + """ Reload the card tree """ + results_tree = self.app.ui.get_object("searchResults").get_child() + cards = results_tree.lib + results_tree.update(cards) + + def get_filters(self) -> dict: + """ Read selected filters from UI and return values as dict """ + output = {} + # Mana colors + color_list = [] + # Go through mana color buttons an get the active filters + for button in self.app.ui.get_object("manaFilterGrid").get_children(): + if isinstance(button, Gtk.ToggleButton): + if button.get_active(): + color_list.append(button.get_name()) + output["mana"] = ",".join(color_list) + # Rarity + combo = self.app.ui.get_object("rarityCombo") + output["rarity"] = self._get_combo_value(combo) + # Type + combo = self.app.ui.get_object("typeCombo") + output["type"] = self._get_combo_value(combo) + # Set + name = self.app.ui.get_object("setEntry").get_text() + output["set"] = "" + for mtgset in self.app.sets.values(): + if mtgset.name == name: + output["set"] = mtgset.code + return output + + def search_cards(self, term: str, filters: dict) -> dict: + util.log("Starting online search for '" + term + "'", util.LogLevel.Info) + util.log("Used Filters: " + str(filters), util.LogLevel.Info) + + # Load card info from internet + try: + util.log("Fetching card info ...", util.LogLevel.Info) + start = time.time() + cards = Card.where(name=term) \ + .where(colorIdentity=filters["mana"]) \ + .where(types=filters["type"]) \ + .where(set=filters["set"]) \ + .where(rarity=filters["rarity"]) \ + .where(pageSize=50) \ + .where(page=1).all() + end = time.time() + util.log("Card info fetched in {}s".format(round(end - start, 3)), util.LogLevel.Info) + except (URLError, HTTPError) as err: + util.log(err, util.LogLevel.Error) + return {} + + # Check if results were found + if len(cards) == 0: + # TODO UI show no cards found + util.log("No Cards found", util.LogLevel.Info) + return {} + + util.log("Found " + str(len(cards)) + " cards", util.LogLevel.Info) + # Remove duplicate entries + if util.SHOW_FROM_ALL_SETS is False: + cards = self._remove_duplicates(cards) + + # Pack results in a dictionary + lib = {} + for card in cards: + lib[card.multiverse_id] = card + return lib + + # ---------------------------------Search Tree---------------------------------------------- + + def on_search_card_selected(self, tree, row_no, column): + (model, path_list) = tree.get_selection().get_selected_rows() + for path in path_list: + tree_iter = model.get_iter(path) + card_id = model.get_value(tree_iter, 0) + card_list = self.app.ui.get_object("searchResults").get_child() + card = card_list.lib[card_id] + self.app.show_card_details(card) + + def on_search_selection_changed(self, selection): + (model, pathlist) = selection.get_selected_rows() + tools = self.app.ui.get_object("selectionToolsBox") + add_remove_button = self.app.ui.get_object("addRemoveButton") + + if pathlist: + add_remove_button.set_sensitive(True) + else: + add_remove_button.set_sensitive(False) + + def on_search_tree_press_event(self, treeview, event): + if event.button == 3: # right click + path = treeview.get_path_at_pos(int(event.x), int(event.y)) + # Get the selection + selection = treeview.get_selection() + # Get the selected path(s) + rows = selection.get_selected_rows() + # If not clicked on selection, change selected rows + if path: + if path[0] not in rows[1]: + selection.unselect_all() + selection.select_path(path[0]) + self.app.ui.get_object("searchListPopup").emit('show') + self.app.ui.get_object("searchListPopup").popup(None, None, None, None, 0, event.time) + return True + + # -------------------------- Class Functions ------------------------------- + + def _init_results_tree(self): + overlay = self.app.ui.get_object("searchResults") + card_list = cardlist.CardList(False, self.app, util.SEARCH_TREE_COLORS) + card_list.set_name("resultsScroller") + card_list.list.connect("row-activated", self.on_search_card_selected) + card_list.selection.connect("changed", self.on_search_selection_changed) + overlay.add(card_list) + overlay.add_overlay(self.app.ui.get_object("searchOverlay")) + overlay.show_all() + + # Connect signal for context menu + card_list.list.connect("button-press-event", self.on_search_tree_press_event) + + @staticmethod + def _init_combo_box(combo, card_list: list): + """ Initialize a combo box model """ + model = Gtk.ListStore(str) + model.append(["All"]) + for entry in card_list: + model.append([entry.title()]) + combo.set_model(model) + cell = Gtk.CellRendererText() + combo.pack_start(cell, True) + combo.add_attribute(cell, "text", 0) + combo.set_active(0) + + @staticmethod + def _remove_duplicates(cards: list) -> list: + """ Remove cards with the same name from a list """ + unique_cards = [] + unique_names = [] + # Reverse cardlist so we get the version with the most modern art + for card in reversed(cards): + if card.name not in unique_names: + unique_names.append(card.name) + unique_cards.append(card) + return unique_cards + + @staticmethod + def _get_combo_value(combo) -> str: + """ Get value from a combo box control """ + tree_iter = combo.get_active_iter() + value = combo.get_model().get_value(tree_iter, 0) + return value.replace("All", "") + + def _init_mana_buttons(self, button_list): + """ Initialize mana buttons """ + for button in button_list: + image = Gtk.Image.new_from_pixbuf(self.app.get_mana_icons("{" + button.get_name() + "}")) + button.set_image(image) + + def _init_set_entry(self, entry): + """ Initialize model for set entry """ + set_store = Gtk.ListStore(str, str) + for mtgset in self.app.sets.values(): + set_store.append([mtgset.name, mtgset.code]) + completer = Gtk.EntryCompletion() + completer.set_model(set_store) + completer.set_text_column(0) + entry.set_completion(completer) diff --git a/cardvault/search_funct.py b/cardvault/search_funct.py deleted file mode 100644 index d1c0243..0000000 --- a/cardvault/search_funct.py +++ /dev/null @@ -1,156 +0,0 @@ -from urllib.error import URLError, HTTPError - -import gi -import time -from gi.repository import Gtk, Gdk - -from cardvault import cardlist -from cardvault import util -from cardvault import application -from mtgsdk import Card - -gi.require_version('Gtk', '3.0') - - -def init_search_view(app: 'application.Application'): - # set mana icons on filter buttons - buttons = [x for x in app.ui.get_object("manaFilterGrid").get_children() - if isinstance(x, Gtk.ToggleButton)] - _init_mana_buttons(app, buttons) - # set auto completion for filter entry - _init_set_entry(app, app.ui.get_object("setEntry")) - # Fill rarity box - _init_combo_box(app.ui.get_object("rarityCombo"), util.rarity_dict.keys()) - # Fill type box - _init_combo_box(app.ui.get_object("typeCombo"), util.card_types) - # Create Model for search results - _init_results_tree(app) - - -def reload_search_view(app: 'application.Application'): - results_tree = app.ui.get_object("searchResults").get_child() - cards = results_tree.lib - results_tree.update(cards) - - -def get_filters(app: 'application.Application') -> dict: - output = {} - # Mana colors - color_list = [] - # Go through mana color buttons an get the active filters - for button in app.ui.get_object("manaFilterGrid").get_children(): - if isinstance(button, Gtk.ToggleButton): - if button.get_active(): - color_list.append(button.get_name()) - output["mana"] = ",".join(color_list) - # Rarity - combo = app.ui.get_object("rarityCombo") - output["rarity"] = _get_combo_value(combo) - # Type - combo = app.ui.get_object("typeCombo") - output["type"] = _get_combo_value(combo) - # Set - name = app.ui.get_object("setEntry").get_text() - output["set"] = "" - for set in app.sets.values(): - if set.name == name: - output["set"] = set.code - return output - - -def search_cards(term: str, filters: dict) -> dict: - util.log("Starting online search for '" + term + "'", util.LogLevel.Info) - util.log("Used Filters: " + str(filters), util.LogLevel.Info) - - # Load card info from internet - try: - util.log("Fetching card info ...", util.LogLevel.Info) - start = time.time() - cards = Card.where(name=term) \ - .where(colorIdentity=filters["mana"]) \ - .where(types=filters["type"]) \ - .where(set=filters["set"]) \ - .where(rarity=filters["rarity"]) \ - .where(pageSize=50) \ - .where(page=1).all() - end = time.time() - util.log("Card info fetched in {}s".format(round(end - start, 3)), util.LogLevel.Info) - except (URLError, HTTPError) as err: - util.log(err, util.LogLevel.Error) - return - - # Check if results were found - if len(cards) == 0: - # TODO UI show no cards found - util.log("No Cards found", util.LogLevel.Info) - return - - util.log("Found " + str(len(cards)) + " cards", util.LogLevel.Info) - # Remove duplicate entries - if util.SHOW_FROM_ALL_SETS is False: - cards = _remove_duplicates(cards) - - # Pack results in a dictionary - lib = {} - for card in cards: - lib[card.multiverse_id] = card - return lib - - -def _init_results_tree(app: 'application.Application'): - overlay = app.ui.get_object("searchResults") - card_list = cardlist.CardList(False, app, util.SEARCH_TREE_COLORS) - card_list.set_name("resultsScroller") - card_list.list.connect("row-activated", app.handlers.on_search_card_selected) - card_list.selection.connect("changed", app.handlers.on_search_selection_changed) - overlay.add(card_list) - overlay.add_overlay(app.ui.get_object("searchOverlay")) - overlay.show_all() - - # Connect signal for context menu - card_list.list.connect("button-press-event", app.handlers.on_search_tree_press_event) - - -def _init_combo_box(combo, list: list): - model = Gtk.ListStore(str) - model.append(["All"]) - for entry in list: - model.append([entry.title()]) - combo.set_model(model) - cell = Gtk.CellRendererText() - combo.pack_start(cell, True) - combo.add_attribute(cell, "text", 0) - combo.set_active(0) - - -def _remove_duplicates(cards: list) -> list: - unique_cards = [] - unique_names = [] - # Reverse cardlist so we get the version with the most modern art - for card in reversed(cards): - if card.name not in unique_names: - unique_names.append(card.name) - unique_cards.append(card) - return unique_cards - - -def _get_combo_value(combo) -> str: - tree_iter = combo.get_active_iter() - value = combo.get_model().get_value(tree_iter, 0) - return value.replace("All", "") - - -def _init_mana_buttons(app, button_list): - for button in button_list: - image = Gtk.Image.new_from_pixbuf(app.get_mana_icons("{" + button.get_name() + "}")) - button.set_image(image) - - -def _init_set_entry(app: 'application.Application', entry): - set_store = Gtk.ListStore(str, str) - for set in app.sets.values(): - set_store.append([set.name, set.code]) - completer = Gtk.EntryCompletion() - completer.set_model(set_store) - completer.set_text_column(0) - entry.set_completion(completer) diff --git a/cardvault/wants.py b/cardvault/wants.py new file mode 100644 index 0000000..316f351 --- /dev/null +++ b/cardvault/wants.py @@ -0,0 +1,176 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +from cardvault import cardlist +from cardvault import application +from cardvault import util + + +class WantsHandlers: + def __init__(self, app: 'application.Application'): + self.app = app + self.init_wants_view() + + def do_reload_wants(self, view): + self.reload_wants_view() + + def on_new_wants_list_clicked(self, entry): + name = entry.get_text() + entry.set_text("") + # Check if list name already exists + if self.app.wants.__contains__(name): + return + self.app.add_want_list(name) + self.reload_wants_view() + + def on_want_list_selected(self, selection, path, column): + (model, pathlist) = selection.get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + list_name = model.get_value(tree_iter, 0) + self.reload_wants_view(list_name) + + def do_wants_tree_press_event(self, treeview, event): + if event.button == 3: # right click + path = treeview.get_path_at_pos(int(event.x), int(event.y)) + # Get the selection + selection = treeview.get_selection() + # Get the selected path(s) + rows = selection.get_selected_rows() + # If not clicked on selection, change selected rows + if path: + if path[0] not in rows[1]: + selection.unselect_all() + selection.select_path(path[0]) + self.app.ui.get_object("wants_wantsListPopup").popup(None, None, None, None, 0, event.time) + return True + + def do_rename_wants_list(self, tree): + (model, pathlist) = tree.get_selection().get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + tag = model.get_value(tree_iter, 0) + + new_name = self.app.show_name_enter_dialog("Rename Want List", tag) + if not tag == new_name: + self.app.rename_want_list(tag, new_name) + self.app.current_page.emit('show') + + def do_delete_wants_list(self, tree): + (model, pathlist) = tree.get_selection().get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + name = model.get_value(tree_iter, 0) + + self.app.delete_wants_list(name) + self.app.current_page.emit('show') + + def on_want_cards_add_activated(self, menu_item): + # Get selected cards + tree = self.app.ui.get_object("wantsListContainer").get_child() + selected = tree.get_selected_cards() + + # Get selected list + list_tree = self.app.ui.get_object("wantsListsTree") + (model, pathlist) = list_tree.get_selection().get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + list_name = model.get_value(tree_iter, 0) + + for card in selected.values(): + self.app.add_card_to_lib(card) + self.app.remove_card_from_want_list(card, list_name) + + self.reload_wants_view(list_name) + + def on_want_cards_remove_activated(self, menu_item): + # Get selected cards + tree = self.app.ui.get_object("wantsListContainer").get_child() + selected = tree.get_selected_cards() + + # Get selected list + list_tree = self.app.ui.get_object("wantsListsTree") + (model, pathlist) = list_tree.get_selection().get_selected_rows() + for path in pathlist: + tree_iter = model.get_iter(path) + list_name = model.get_value(tree_iter, 0) + + for card in selected.values(): + self.app.remove_card_from_want_list(card, list_name) + + self.reload_wants_view(list_name) + + # ---------------------------------Wants Tree---------------------------------------------- + + def on_wants_card_selected(self, tree, row, column): + (model, path_list) = tree.get_selection().get_selected_rows() + for path in path_list: + tree_iter = model.get_iter(path) + card_id = model.get_value(tree_iter, 0) + card_list = self.app.ui.get_object("wantsListContainer").get_child() + card = card_list.lib[card_id] + self.app.show_card_details(card) + + def on_wants_cards_press_event(self, treeview, event): + if event.button == 3: # right click + path = treeview.get_path_at_pos(int(event.x), int(event.y)) + # Get the selection + selection = treeview.get_selection() + # Get the selected path(s) + rows = selection.get_selected_rows() + # If not clicked on selection, change selected rows + if path[0] not in rows[1]: + selection.unselect_all() + selection.select_path(path[0]) + + # Show popup and emit 'show' to trigger update function of popup + self.app.ui.get_object("wants_cardListPopup").emit('show') + self.app.ui.get_object("wants_cardListPopup").popup(None, None, None, None, 0, event.time) + return True + + # -------------------------- Class Functions ------------------------------- + + def init_wants_view(self): + # Get container for Cardlist Tree + container = self.app.ui.get_object("wantsListContainer") + # Create new Cardlist + card_list = cardlist.CardList(True, self.app, util.GENERIC_TREE_COLORS) + card_list.set_name("wantsScroller") + # Show details + card_list.list.connect("row-activated", self.on_wants_card_selected) + card_list.list.connect("button-press-event", self.on_wants_cards_press_event) + # Add card list to container + container.add(card_list) + container.add_overlay(self.app.ui.get_object("wantsOverlay")) + container.show_all() + # Hide no results overlay + self.app.ui.get_object("wantsOverlay").set_visible(False) + + def reload_wants_view(self, selected_list: str = None): + tree = self.app.ui.get_object("wantsListContainer").get_child() # type: cardlist.CardList + cards = self.app.get_wanted_cards(selected_list) + self.reload_wants_list(True) + if cards: + self.app.ui.get_object("wantsOverlay").set_visible(False) + tree.update(cards) + else: + tree.store.clear() + self.app.ui.get_object("wantsOverlay").set_visible(True) + + # Set Title + label = self.app.ui.get_object("wantsTileLabel") # type: Gtk.Label + label.set_markup("" + str(selected_list) + "") + + + def reload_wants_list(self, preserve=False): + tree = self.app.ui.get_object("wantsListsTree") + (path, column) = tree.get_cursor() + store = tree.get_model() + store.clear() + + for list_name, cards in self.app.wants.items(): + store.append([list_name, list_name + " (" + str(len(cards)) + ")"]) + if preserve: + tree.set_cursor(path if path else 0) + store.set_sort_column_id(1, Gtk.SortType.ASCENDING) \ No newline at end of file diff --git a/cardvault/wants_funct.py b/cardvault/wants_funct.py deleted file mode 100644 index cb12f3e..0000000 --- a/cardvault/wants_funct.py +++ /dev/null @@ -1,53 +0,0 @@ -import gi -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk - -from cardvault import cardlist -from cardvault import application -from cardvault import util - - -def init_wants_view(app: 'application.Application'): - # Get container for Cardlist Tree - container = app.ui.get_object("wantsListContainer") - # Create new Cardlist - card_list = cardlist.CardList(True, app, util.GENERIC_TREE_COLORS) - card_list.set_name("wantsScroller") - # Show details - card_list.list.connect("row-activated", app.handlers.on_wants_card_selected) - card_list.list.connect("button-press-event", app.handlers.on_wants_cards_press_event) - # Add card list to container - container.add(card_list) - container.add_overlay(app.ui.get_object("wantsOverlay")) - container.show_all() - # Hide no results overlay - app.ui.get_object("wantsOverlay").set_visible(False) - - -def reload_wants_view(app: 'application.Application', selected_list: str = None): - tree = app.ui.get_object("wantsListContainer").get_child() # type: cardlist.CardList - cards = app.get_wanted_cards(selected_list) - reload_wants_list(app, True) - if cards: - app.ui.get_object("wantsOverlay").set_visible(False) - tree.update(cards) - else: - tree.store.clear() - app.ui.get_object("wantsOverlay").set_visible(True) - - # Set Title - label = app.ui.get_object("wantsTileLabel") # type: Gtk.Label - label.set_markup("" + str(selected_list) + "") - - -def reload_wants_list(app: 'application.Application', preserve=False): - tree = app.ui.get_object("wantsListsTree") - (path, column) = tree.get_cursor() - store = tree.get_model() - store.clear() - - for list_name, cards in app.wants.items(): - store.append([list_name, list_name + " (" + str(len(cards)) + ")"]) - if preserve: - tree.set_cursor(path if path else 0) - store.set_sort_column_id(1, Gtk.SortType.ASCENDING)