From e35ae3942b118b6169437cccc34a7415c1a38c2e Mon Sep 17 00:00:00 2001 From: luxick Date: Thu, 16 Feb 2017 18:42:27 +0100 Subject: [PATCH] Add detail view on search screen --- README.md | 4 +++- collection.py | 2 +- details.py | 26 ++++++++++++++++++++++++++ search.py | 48 ++++++++++++++++++++++++++++++++++++------------ util.py | 12 +++++++----- 5 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 details.py diff --git a/README.md b/README.md index 577c362..080e459 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # mtg-collector A desktop application for building and organizing MTG card libraries and decks. +## Features + +* Online card search ## Roadmap -* Search for cards * Build collection of cards * Organize cards in collection * Build decklists from cards in collection diff --git a/collection.py b/collection.py index 7d8dcf3..482e110 100644 --- a/collection.py +++ b/collection.py @@ -49,7 +49,7 @@ class CollectionView(Gtk.Grid): self.image_area.add(self.bigCard) self.detailBox.add(self.image_area) - # Stats and Details about the selected Card + # Sta-ts and Details about the selected Card self.stat_listbox = Gtk.ListBox() self.stat_listbox.set_selection_mode(Gtk.SelectionMode.NONE) self.test_statrow = Gtk.ListBoxRow() diff --git a/details.py b/details.py new file mode 100644 index 0000000..171fc97 --- /dev/null +++ b/details.py @@ -0,0 +1,26 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, GdkPixbuf +import util + + +class DetailBar(Gtk.Grid): + def __init__(self): + Gtk.Grid.__init__(self) + + self.image_area = Gtk.Box() + image = Gtk.Image() + pixbuf = util.add_test_image(63 * 5, 88 * 5) + image.set_from_pixbuf(pixbuf) + self.image_area.add(image) + + self.carddetails = Gtk.ListBox() + self.carddetails.set_selection_mode(Gtk.SelectionMode.NONE) + + self.rulings = Gtk.ListBoxRow() + self.rulings.add(Gtk.Label("Test")) + + self.carddetails.add(self.rulings) + + self.attach(self.image_area, 0, 0, 1, 1) + self.attach(self.carddetails, 0, 1, 1, 1) diff --git a/search.py b/search.py index d914dfd..80d96dc 100644 --- a/search.py +++ b/search.py @@ -1,6 +1,7 @@ import gi from gi.repository import Pango import util +import details gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GdkPixbuf from mtgsdk import Card @@ -13,6 +14,7 @@ class SearchView(Gtk.Grid): # Search Box self.searchbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=2) self.searchEntry = Gtk.Entry() + self.searchEntry.connect("activate", self.online_search_clicked) self.searchbutton = Gtk.Button("Search Online") self.searchbutton.connect("clicked", self.online_search_clicked) self.searchEntryLabel = Gtk.Label("Search for Cards:", xalign=0) @@ -36,8 +38,9 @@ class SearchView(Gtk.Grid): self.searchresults = Gtk.ScrolledWindow(hexpand=True, vexpand=True) self.searchresults.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, GdkPixbuf.Pixbuf) + self.store = Gtk.ListStore(int, GdkPixbuf.Pixbuf, str, str, GdkPixbuf.Pixbuf) self.list = Gtk.TreeView(self.store) + self.list.set_rules_hint(True) self.searchresults.add(self.list) image = Gtk.CellRendererPixbuf() @@ -50,17 +53,18 @@ class SearchView(Gtk.Grid): info.set_property("wrap-width", 100) info.set_padding = 2 - # manacost = Gtk.CellRendererText() - - self.column1 = Gtk.TreeViewColumn(title="Image", cell_renderer=image, pixbuf=0) + index = Gtk.CellRendererText() + self.indexcolumn = Gtk.TreeViewColumn(title=index, cell_renderer=index, text=0) + self.indexcolumn.set_visible(False) + self.column1 = Gtk.TreeViewColumn(title="Image", cell_renderer=image, pixbuf=1) self.column1.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - self.column2 = Gtk.TreeViewColumn(title="Name", cell_renderer=title, text=1) + self.column2 = Gtk.TreeViewColumn(title="Name", cell_renderer=title, text=2) self.column2.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - self.column3 = Gtk.TreeViewColumn(title="Card Text", cell_renderer=info, text=2) + self.column3 = Gtk.TreeViewColumn(title="Card Text", cell_renderer=info, text=3) self.column3.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) self.column3.set_resizable(True) self.column3.set_expand(True) - self.column4 = Gtk.TreeViewColumn(title="Mana Cost", cell_renderer=image, pixbuf=3) + self.column4 = Gtk.TreeViewColumn(title="Mana Cost", cell_renderer=image, pixbuf=4) self.column4.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) self.list.append_column(self.column1) @@ -68,32 +72,52 @@ class SearchView(Gtk.Grid): self.list.append_column(self.column3) self.list.append_column(self.column4) + # Detail View for selected Card + self.details = Gtk.Box() + self.details.add(details.DetailBar()) + # Bring it all together self.attach(self.searchbox, 0, 0, 1, 1) self.attach(self.filterBox, 0, 1, 1, 1) self.attach(self.searchresults, 1, 0, 1, 2) + self.attach(self.details, 2, 0, 1, 2) + + self.selection = self.list.get_selection() + self.selection.connect("changed", self.on_card_selected) def online_search_clicked(self, button): term = self.searchEntry.get_text() if not term == "": print("Search for \"" + term + "\" online. \n") - cards = Card.where(name=term).where(pageSize=50).where(page=1).all() + self.cards = Card.where(name=term).where(pageSize=50).where(page=1).all() self.store.clear() - for card in cards: + for card in self.cards: if card.multiverse_id is not None: print("Found: " + card.name + " (" + card.multiverse_id.__str__() + ")") - self.store.append([util.load_card_image(card), + self.store.append([card.multiverse_id, + util.load_card_image(card, 63 * 2, 88 * 2), card.name, card.original_text, util.create_mana_icons(card.mana_cost)]) print("\n") util.reload_image_cache() - def create_row_entry(self, card): - cardname = card.name + def on_card_selected(self, selection): + (model, pathlist) = selection.get_selected_rows() + for path in pathlist: + iter = model.get_iter(path) + card_id = model.get_value(iter, 0) + + selected_card = None + for card in self.cards: + if card.multiverse_id == card_id: + selected_card = card + + print(selected_card.name + " selected \n") + diff --git a/util.py b/util.py index 1294208..bfd501c 100644 --- a/util.py +++ b/util.py @@ -36,8 +36,8 @@ def reload_image_cache(): imagecache.append(img) -def add_test_image(): - return GdkPixbuf.Pixbuf.new_from_file_at_size('./resources/images/demo.jpg', 63 * 2, 88 * 2) +def add_test_image(sizex, sizey): + return GdkPixbuf.Pixbuf.new_from_file_at_size('./resources/images/demo.jpg', sizex, sizey) def load_card_image_online(card): @@ -51,13 +51,13 @@ def load_card_image_online(card): return GdkPixbuf.Pixbuf.new_from_file_at_size(filename, 63 * 2, 88 * 2) -def load_card_image(card): +def load_card_image(card, sizex, sizey): # Try loading from disk, if file exists for image in imagecache: filename = os.path.basename(image.filename) if filename == card.multiverse_id.__str__() + ".PNG": print("Using local file for image: " + filename) - return GdkPixbuf.Pixbuf.new_from_file_at_size(image.filename, 63 * 2, 88 * 2) + return GdkPixbuf.Pixbuf.new_from_file_at_size(image.filename, sizex, sizey) # No file in local cache found return load_card_image_online(card) @@ -65,7 +65,9 @@ def load_card_image(card): def create_mana_icons(mana_string): # Convert the string to a List - list = re.findall("\{(.*?)\}", mana_string) + list = re.findall("\{(.*?)\}", str(mana_string)) + if len(list) == 0: + return # Compute horizontal size for the final image imagesize = len(list) * 105 image = PImage.new("RGBA", (imagesize, 105))