diff --git a/cardvault/application.py b/cardvault/application.py
index 995147e..4468784 100644
--- a/cardvault/application.py
+++ b/cardvault/application.py
@@ -13,6 +13,8 @@ except ImportError as ex:
import os
import copy
import re
+import mtgsdk
+from typing import Type, Dict, List
from cardvault import handlers
from cardvault import util
@@ -21,6 +23,8 @@ from cardvault import lib_funct
from cardvault import wants_funct
+
+
class Application:
# ---------------------------------Initialize the Application----------------------------------------------
def __init__(self):
@@ -57,15 +61,15 @@ class Application:
self.sets = util.load_sets(util.get_root_filename("sets"))
- self.library = None
- self.tags = None
- self.wants = None
+ self.library = Dict[str, Type[mtgsdk.Card]]
+ self.tags = Dict[str, str]
+ self.wants = Dict[str, List[Type[mtgsdk.Card]]]
self.load_library()
self.handlers = handlers.Handlers(self)
self.ui.connect_signals(self.handlers)
- # Inizialize the views
+ # Initialize the views
search_funct.init_search_view(self)
@@ -207,6 +211,8 @@ class Application:
util.save_file(util.get_root_filename("library"), self.library)
# Save tags file
util.save_file(util.get_root_filename("tags"), self.tags)
+ # Save wants file
+ util.save_file(util.get_root_filename("wants"), self.wants)
self.unsaved_changes = False
self.push_status("Library saved")
@@ -283,12 +289,24 @@ class Application:
util.log("Tag '" + old + "' renamed to '" + new + "'", util.LogLevel.Info)
self.unsaved_changes = True
+ def get_wanted_card_ids(self) -> List[str]:
+ all_ids = []
+ for cards in self.wants.values():
+ next_ids = [card.multiverse_id for card in cards]
+ all_ids = list(set(all_ids) | set(next_ids))
+ return all_ids
+
def add_want_list(self, name):
- self.wants[name] = {}
+ self.wants[name] = []
util.log("Want list '" + name + "' created", util.LogLevel.Info)
self.push_status("Created want list '" + name + "'")
self.unsaved_changes = True
+ def add_card_to_want_list(self, list_name, card):
+ self.wants[list_name].append(card)
+ util.log(card.name + " added to want list " + list_name, util.LogLevel.Info)
+ self.unsaved_changes = True
+
def add_card_to_lib(self, card, tag=None):
if tag is not None:
self.tag_card(card, tag)
diff --git a/cardvault/cardlist.py b/cardvault/cardlist.py
index 7c6edd5..5017802 100644
--- a/cardvault/cardlist.py
+++ b/cardvault/cardlist.py
@@ -1,5 +1,6 @@
import gi
from cardvault import util
+from cardvault import application
from gi.repository import Gtk, GdkPixbuf, Gdk
import time
gi.require_version('Gtk', '3.0')
@@ -7,7 +8,7 @@ gi.require_version('Gdk', '3.0')
class CardList(Gtk.ScrolledWindow):
- def __init__(self, with_filter, app):
+ def __init__(self, with_filter, app : 'application.Application'):
Gtk.ScrolledWindow.__init__(self)
self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
self.set_hexpand(True)
@@ -134,11 +135,16 @@ class CardList(Gtk.ScrolledWindow):
util.log("Updating tree view", util.LogLevel.Info)
start = time.time()
- for card_id, card in library.items():
+ all_wants = self.app.get_wanted_card_ids()
+
+ for card_id, card in library.items():
if card.multiverse_id is not None:
+
if self.app.library.__contains__(card_id) and colorize:
color = util.card_view_colors["owned"]
+ elif all_wants.__contains__(card_id) and colorize:
+ color = util.card_view_colors["wanted"]
else:
color = util.card_view_colors["unowned"]
if card.type == "Land":
diff --git a/cardvault/gui/library.glade b/cardvault/gui/library.glade
index 81ada8e..3324cf2 100644
--- a/cardvault/gui/library.glade
+++ b/cardvault/gui/library.glade
@@ -100,7 +100,6 @@
tagStore
1
-
diff --git a/cardvault/gui/search.glade b/cardvault/gui/search.glade
index bdfe174..e18e5a5 100644
--- a/cardvault/gui/search.glade
+++ b/cardvault/gui/search.glade
@@ -2,31 +2,24 @@
-
-
+
+ True
False
+ vertical
+ 2
-
- Add to Library
- True
- False
- True
- True
-
+
+ False
+ 2
+
+
+ Add to Library
+ True
+ False
+ True
+ True
+
+
+
+ False
+ True
+ 0
+
+
+
+
+
+
+
+
False
@@ -299,15 +311,25 @@
-
-
-
-
+
+ True
+ False
+ True
+ True
+
+
+
+
+
+ False
+ True
+ 1
+
- 1
- 0
+ True
+ True
diff --git a/cardvault/gui/wants.glade b/cardvault/gui/wants.glade
index 5b72104..a36ebdf 100644
--- a/cardvault/gui/wants.glade
+++ b/cardvault/gui/wants.glade
@@ -52,7 +52,7 @@
- False
+ True
True
0
diff --git a/cardvault/handlers.py b/cardvault/handlers.py
index d7f62ff..0bc1f8d 100644
--- a/cardvault/handlers.py
+++ b/cardvault/handlers.py
@@ -13,8 +13,7 @@ from cardvault import application
class Handlers:
- def __init__(self, app):
- self.app = Type[application.Application]
+ def __init__(self, app: 'application.Application'):
self.app = app
# ---------------------------------Main Window----------------------------------------------
@@ -115,6 +114,29 @@ class Handlers:
search_funct.reload_serach_view(self.app)
self.app.ui.get_object("searchEntry").grab_focus()
+ def search_tree_popup_showed(self, menu):
+ # Create wants Submenu
+ wants_item = self.app.ui.get_object("searchListPopupTags")
+ 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)
+
+ wants_item.show_all()
+
+ 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_serach_view(self.app)
+ self.app.push_status("Added " + str(len(cards)) + " card(s) to Want List '" + item.get_label() + "'")
+
# ---------------------------------Library----------------------------------------------
def do_reload_library(self, view):
@@ -149,9 +171,6 @@ class Handlers:
lib_funct.reload_library(self.app, tag)
entry.set_text("")
- def on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
- print("drag received")
-
def on_tag_selected(self, selection, path, column):
(model, pathlist) = selection.get_selected_rows()
for path in pathlist:
@@ -262,6 +281,15 @@ class Handlers:
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))
+ if path:
+ tree_iter = treeview.get_model().get_iter(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):
diff --git a/cardvault/search_funct.py b/cardvault/search_funct.py
index 5035f2d..c7d7350 100644
--- a/cardvault/search_funct.py
+++ b/cardvault/search_funct.py
@@ -5,12 +5,13 @@ 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):
+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)]
@@ -24,16 +25,14 @@ def init_search_view(app):
# Create Model for search results
_init_results_tree(app)
- app.ui.get_object("tagTree").drag_dest_set(Gtk.DestDefaults.ALL, [], Gdk.DragAction.COPY)
-
-def reload_serach_view(app):
+def reload_serach_view(app: 'application.Application'):
results_tree = app.ui.get_object("searchResults").get_child()
cards = results_tree.lib
results_tree.update(cards, True)
-def get_filters(app):
+def get_filters(app: 'application.Application') -> dict:
output = {}
# Mana colors
color_list = []
@@ -58,7 +57,7 @@ def get_filters(app):
return output
-def search_cards(term, filters):
+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)
@@ -72,12 +71,15 @@ def search_cards(term, filters):
.where(pageSize=50) \
.where(page=1).all()
except (URLError, HTTPError) as err:
- print("Error connecting to the internet")
+ 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:
@@ -90,7 +92,7 @@ def search_cards(term, filters):
return lib
-def _init_results_tree(app):
+def _init_results_tree(app: 'application.Application'):
overlay = app.ui.get_object("searchResults")
card_list = cardlist.CardList(False, app)
card_list.set_name("resultsScroller")
@@ -98,10 +100,13 @@ def _init_results_tree(app):
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()
+ 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):
+def _init_combo_box(combo, list: list):
model = Gtk.ListStore(str)
model.append(["All"])
for entry in list:
@@ -113,7 +118,7 @@ def _init_combo_box(combo, list):
combo.set_active(0)
-def _remove_duplicates(cards):
+def _remove_duplicates(cards: list) -> list:
unique_cards = []
unique_names = []
# Reverse cardlist so we get the version with the most modern art
@@ -124,7 +129,7 @@ def _remove_duplicates(cards):
return unique_cards
-def _get_combo_value(combo):
+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", "")
@@ -136,7 +141,7 @@ def _init_mana_buttons(app, button_list):
button.set_image(image)
-def _init_set_entry(app, entry):
+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])
diff --git a/mtgsdk/card.py b/mtgsdk/card.py
index 0a1f8df..398f085 100644
--- a/mtgsdk/card.py
+++ b/mtgsdk/card.py
@@ -55,6 +55,7 @@ class Card(object):
self.foreign_names = response_dict.get('foreignNames')
self.owned = None
self.tags = []
+ self.wanted = None
@staticmethod
def find(id):