From df8eacf4b98b83d21fb2e2c65fa115c97bb882df Mon Sep 17 00:00:00 2001 From: luxick Date: Wed, 22 Feb 2017 14:33:23 +0100 Subject: [PATCH] New filter: Sets --- mtg-collector/gui.py | 2 ++ mtg-collector/search.py | 72 ++++++++++++++++++++++++++++++----------- mtg-collector/util.py | 20 ++++++++++-- 3 files changed, 73 insertions(+), 21 deletions(-) diff --git a/mtg-collector/gui.py b/mtg-collector/gui.py index 971b2e5..900d1ec 100644 --- a/mtg-collector/gui.py +++ b/mtg-collector/gui.py @@ -19,6 +19,8 @@ class MainWindow(Gtk.Window): # Set reference to main window in util util.window = self + util.load_sets() + vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.add(vbox) self.notebook = Gtk.Notebook() diff --git a/mtg-collector/search.py b/mtg-collector/search.py index c282a4e..e79f277 100644 --- a/mtg-collector/search.py +++ b/mtg-collector/search.py @@ -15,6 +15,7 @@ class SearchView(Gtk.Grid): def __init__(self): Gtk.Grid.__init__(self) self.set_column_spacing(5) + # Search Box self.searchbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, margin_end=5, margin_start=5, margin_top=5, margin_bottom=5) @@ -59,6 +60,12 @@ class SearchView(Gtk.Grid): self.color_chooser.attach(self.green_mana_button, 1, 2, 1, 1) self.color_chooser.attach(self.colorless_mana_button, 2, 2, 1, 1) + # Text renderer for the Combo Boxes + renderer_text = Gtk.CellRendererText() + renderer_text.set_property("wrap-mode", Pango.WrapMode.WORD) + renderer_text.set_property("wrap-width", 50) + renderer_text.props.ellipsize = Pango.EllipsizeMode.END + # Rarity rarity_label = Gtk.Label("Rarity", xalign=0) self.rarity_store = Gtk.ListStore(str, str) @@ -68,14 +75,32 @@ class SearchView(Gtk.Grid): self.rarity_store.append(["rare", "Rare"]) self.rarity_store.append(["mythic rare", "Mythic Rare"]) self.rarity_combo = Gtk.ComboBox.new_with_model(self.rarity_store) - renderer_text = Gtk.CellRendererText() self.rarity_combo.pack_start(renderer_text, True) self.rarity_combo.add_attribute(renderer_text, "text", 1) + # Set + set_label = Gtk.Label("Set", xalign=0) + self.set_store = Gtk.ListStore(str, str) + self.set_store.append(["", "Any"]) + for set in util.set_list: + self.set_store.append([set.code, set.name]) + self.set_combo = Gtk.ComboBox.new_with_model_and_entry(self.set_store) + self.set_combo.pack_start(renderer_text, True) + self.set_combo.add_attribute(renderer_text, "text", 1) + self.set_combo.set_entry_text_column(1) + + # Autocomplete search in Set Combobox + completer = Gtk.EntryCompletion() + completer.set_model(self.set_store) + completer.set_text_column(1) + completer.connect("match-selected", self.match_selected) + self.set_combo.get_child().set_completion(completer) + + #Type type_label = Gtk.Label("Type", xalign=0) self.type_store = Gtk.ListStore(str) types = [ "Any", "Creature", "Artifact", "Instant", - "Aura", "Enchantment", "Sorcery", "Land", "Planeswalker"] + "Enchantment", "Sorcery", "Land", "Planeswalker"] for cardtype in types: self.type_store.append([cardtype]) self.type_combo = Gtk.ComboBox.new_with_model(self.type_store) @@ -85,9 +110,13 @@ class SearchView(Gtk.Grid): self.additional_filters = Gtk.Grid(row_spacing=5, column_spacing=5) self.additional_filters.attach(rarity_label, 0, 0, 1, 1) self.additional_filters.attach(self.rarity_combo, 1, 0, 1, 1) + self.additional_filters.attach(type_label, 0, 1, 1, 1) self.additional_filters.attach(self.type_combo, 1 ,1, 1, 1) + self.additional_filters.attach(set_label, 0, 2, 1, 1) + self.additional_filters.attach(self.set_combo, 1, 2, 1, 1) + self.filters_title = Gtk.Label(xalign=0, yalign=0) self.filters_title.set_markup("Filter search results") @@ -152,6 +181,9 @@ class SearchView(Gtk.Grid): self.selection = self.list.get_selection() self.selection.connect("changed", self.on_card_selected) + def match_selected(self, completion, model, iter): + self.set_combo.set_active_iter(iter) + def do_show_no_results(self, searchterm): # Should move to main UI, so parent can be used dialog = Gtk.MessageDialog(self.parent, 0, Gtk.MessageType.INFO, @@ -160,19 +192,6 @@ class SearchView(Gtk.Grid): dialog.run() dialog.destroy() - def do_activate_controls(self, active): - self.searchEntry.set_editable(active) - self.searchEntry.set_sensitive(active) - self.searchbutton.set_sensitive(active) - self.red_mana_button.set_sensitive(active) - self.blue_mana_button.set_sensitive(active) - self.black_mana_button.set_sensitive(active) - self.green_mana_button.set_sensitive(active) - self.white_mana_button.set_sensitive(active) - self.colorless_mana_button.set_sensitive(active) - self.rarity_combo.set_sensitive(active) - self.type_combo.set_sensitive(active) - def online_search_clicked(self, button): # Clear old data from liststore self.store.clear() @@ -202,6 +221,9 @@ class SearchView(Gtk.Grid): if typefilter == "Any": typefilter = "" + tree_iter = self.set_combo.get_active_iter() + setfilter = self.set_store.get_value(tree_iter, 0) + # Load card info from internet print("\nStart online search") GObject.idle_add(util.push_status, "Searching for cards", priorty=GObject.PRIORITY_DEFAULT) @@ -209,6 +231,7 @@ class SearchView(Gtk.Grid): self.cards = Card.where(name=term)\ .where(colorIdentity=",".join(colorlist)) \ .where(types=typefilter)\ + .where(set=setfilter)\ .where(rarity=rarityfilter) \ .where(pageSize=50)\ .where(page=1).all() @@ -252,10 +275,6 @@ class SearchView(Gtk.Grid): for card in self.cards: if card.multiverse_id is not None: - print("Found: " + card.name - + " (" + card.multiverse_id.__str__() + ")") - print("Types: " + str(card.type)) - self.store.append([card.multiverse_id, util.load_card_image(card, 63 * 2, 88 * 2), card.name, @@ -314,3 +333,18 @@ class SearchView(Gtk.Grid): # Set default rarity and type filters to "Any" self.rarity_combo.set_active(0) self.type_combo.set_active(0) + self.set_combo.set_active(0) + + def do_activate_controls(self, active): + self.searchEntry.set_editable(active) + self.searchEntry.set_sensitive(active) + #self.searchbutton.set_sensitive(active) + self.red_mana_button.set_sensitive(active) + self.blue_mana_button.set_sensitive(active) + self.black_mana_button.set_sensitive(active) + self.green_mana_button.set_sensitive(active) + self.white_mana_button.set_sensitive(active) + self.colorless_mana_button.set_sensitive(active) + self.rarity_combo.set_sensitive(active) + self.type_combo.set_sensitive(active) + self.set_combo.set_sensitive(active) diff --git a/mtg-collector/util.py b/mtg-collector/util.py index a36fbee..9f1fb10 100644 --- a/mtg-collector/util.py +++ b/mtg-collector/util.py @@ -6,14 +6,29 @@ gi.require_version('Gtk', '3.0') from gi.repository import GdkPixbuf, Gtk from PIL import Image as PImage from urllib import request +from mtgsdk import Set +from urllib.error import URLError # Loacally stored images for faster loading times imagecache = [] -manaicons ={} +manaicons = {} + +set_list = [] + window = None status_bar = None +def load_sets(): + #setfile = os.open(config.cachepath + "/sets") + try: + sets = Set.all() + except URLError as err: + show_message("Connection Error", str(err.reason)) + return + for set in sets: + set_list.append(set) + def push_status(msg): status_bar.push(0, msg) @@ -58,13 +73,14 @@ def load_dummy_image(sizex, sizey): return GdkPixbuf.Pixbuf.new_from_file_at_size(os.path.dirname(__file__) + '/resources/images/dummy.jpg', sizex, sizey) + def load_card_image_online(card, sizex, sizey): url = card.image_url if url is None: print("No Image URL provided") return load_dummy_image(sizex, sizey) filename = config.cachepath + card.multiverse_id.__str__() + ".PNG" - print("Loading image from: " + url) + print("Loading image for " + card.name + "from: " + url) response = request.urlretrieve(url, filename) return GdkPixbuf.Pixbuf.new_from_file_at_size(filename, sizex, sizey)