Refactor card tree class.
This commit is contained in:
@@ -18,9 +18,6 @@ from typing import Type, Dict, List
|
||||
|
||||
from cardvault import handlers
|
||||
from cardvault import util
|
||||
from cardvault import wants_funct
|
||||
|
||||
|
||||
|
||||
|
||||
class Application:
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import copy
|
||||
|
||||
import gi
|
||||
from cardvault import util
|
||||
from cardvault import application
|
||||
@@ -14,7 +16,7 @@ gi.require_version('Gdk', '3.0')
|
||||
class CardList(Gtk.ScrolledWindow):
|
||||
def __init__(self, filtered, app: 'application.Application', row_colors: Dict[str, str]):
|
||||
Gtk.ScrolledWindow.__init__(self)
|
||||
self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
|
||||
self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
|
||||
self.set_hexpand(True)
|
||||
self.set_vexpand(True)
|
||||
|
||||
@@ -23,100 +25,20 @@ class CardList(Gtk.ScrolledWindow):
|
||||
self.app = app
|
||||
self.row_colors = row_colors
|
||||
|
||||
# Columns are these:
|
||||
# 0 Multiverse ID
|
||||
# 1 Card Name
|
||||
# 2 Card Supertypes (Legendary,..)
|
||||
# 3 Card types (Creature, etc)
|
||||
# 4 Rarity
|
||||
# 5 Power
|
||||
# 6 Toughness
|
||||
# 7 Printings (Sets with this card in it)
|
||||
# 8 Mana Cost(Form: {G}{2})
|
||||
# 9 CMC
|
||||
# 10 Edition
|
||||
# 11 Color indicating if the card is owned or wanted
|
||||
self.store = Gtk.ListStore(int, str, str, str, str, str, str, str, GdkPixbuf.Pixbuf, int, str, str)
|
||||
if self.filtered:
|
||||
self.filter = self.store.filter_new()
|
||||
self.filter_and_sort = Gtk.TreeModelSort(self.filter)
|
||||
self.filter_and_sort.set_sort_func(4, self.compare_rarity, None)
|
||||
self.list = Gtk.TreeView(self.filter_and_sort)
|
||||
else:
|
||||
self.store.set_sort_func(4, self.compare_rarity, None)
|
||||
self.list = Gtk.TreeView(self.store)
|
||||
self.add(self.list)
|
||||
builder = Gtk.Builder()
|
||||
builder.add_from_file(util.get_ui_filename("cardtree.glade"))
|
||||
|
||||
self.list.set_rules_hint(True)
|
||||
self.selection = self.list.get_selection()
|
||||
self.selection.set_mode(Gtk.SelectionMode.MULTIPLE)
|
||||
self.filter = builder.get_object("cardStoreFiltered")
|
||||
|
||||
bold_renderer = Gtk.CellRendererText(xalign=0.5, yalign=0.5)
|
||||
bold_renderer.set_property("weight", 800)
|
||||
self.store = builder.get_object("cardStore")
|
||||
|
||||
text_renderer = Gtk.CellRendererText(xalign=0.5, yalign=0.5)
|
||||
text_renderer.set_property("weight", 500)
|
||||
image_renderer = Gtk.CellRendererPixbuf()
|
||||
self.tree = builder.get_object("cardTree")
|
||||
|
||||
col_id = Gtk.TreeViewColumn(title="Multiverse ID", cell_renderer=text_renderer, text=0, foreground=11)
|
||||
col_id.set_visible(False)
|
||||
self.store.set_sort_func(4, self.compare_rarity, None)
|
||||
|
||||
col_title = Gtk.TreeViewColumn(title="Name", cell_renderer=bold_renderer, text=1, foreground=11)
|
||||
col_title.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
|
||||
col_title.set_expand(True)
|
||||
col_title.set_sort_column_id(1)
|
||||
self.add(self.tree)
|
||||
|
||||
col_supertypes = Gtk.TreeViewColumn(title="Supertypes", cell_renderer=text_renderer, text=2, foreground=11)
|
||||
col_supertypes.set_sort_column_id(2)
|
||||
col_supertypes.set_visible(False)
|
||||
|
||||
col_types = Gtk.TreeViewColumn(title="Types", cell_renderer=text_renderer, text=3, foreground=11)
|
||||
col_types.set_sort_column_id(3)
|
||||
|
||||
col_rarity = Gtk.TreeViewColumn(title="Rarity", cell_renderer=text_renderer, text=4, foreground=11)
|
||||
col_rarity.set_sort_column_id(4)
|
||||
|
||||
col_power = Gtk.TreeViewColumn(title="Power", cell_renderer=text_renderer, text=5, foreground=11)
|
||||
col_power.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
|
||||
col_power.set_fixed_width(50)
|
||||
col_power.set_sort_column_id(5)
|
||||
col_power.set_visible(False)
|
||||
|
||||
col_thoughness = Gtk.TreeViewColumn(title="Toughness", cell_renderer=text_renderer, text=6, foreground=11)
|
||||
col_thoughness.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
|
||||
col_thoughness.set_fixed_width(50)
|
||||
col_thoughness.set_sort_column_id(6)
|
||||
col_thoughness.set_visible(False)
|
||||
|
||||
col_printings = Gtk.TreeViewColumn(title="Printings", cell_renderer=text_renderer, text=7, foreground=11)
|
||||
col_printings.set_sort_column_id(7)
|
||||
col_printings.set_visible(False)
|
||||
|
||||
col_mana = Gtk.TreeViewColumn(title="Mana Cost", cell_renderer=image_renderer, pixbuf=8)
|
||||
col_mana.set_expand(False)
|
||||
col_mana.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
|
||||
col_mana.set_sort_column_id(9)
|
||||
|
||||
col_cmc = Gtk.TreeViewColumn(title="CMC", cell_renderer=text_renderer, text=9, foreground=11)
|
||||
col_cmc.set_visible(False)
|
||||
|
||||
col_set_name = Gtk.TreeViewColumn(title="Edition", cell_renderer=text_renderer, text=10, foreground=11)
|
||||
col_set_name.set_expand(False)
|
||||
col_set_name.set_sort_column_id(10)
|
||||
|
||||
self.list.append_column(col_id)
|
||||
self.list.append_column(col_title)
|
||||
self.list.append_column(col_supertypes)
|
||||
self.list.append_column(col_types)
|
||||
self.list.append_column(col_rarity)
|
||||
self.list.append_column(col_set_name)
|
||||
self.list.append_column(col_power)
|
||||
self.list.append_column(col_thoughness)
|
||||
self.list.append_column(col_printings)
|
||||
self.list.append_column(col_mana)
|
||||
self.list.append_column(col_cmc)
|
||||
|
||||
self.store.set_sort_column_id(1, Gtk.SortType.ASCENDING)
|
||||
self.selection = self.tree.get_selection()
|
||||
|
||||
def get_selected_cards(self) -> dict:
|
||||
(model, pathlist) = self.selection.get_selected_rows()
|
||||
@@ -135,8 +57,7 @@ class CardList(Gtk.ScrolledWindow):
|
||||
self.lib = library
|
||||
# Disable update if tree is filtered (performance)
|
||||
if self.filtered:
|
||||
self.list.freeze_child_notify()
|
||||
self.list.set_model(None)
|
||||
self.tree.freeze_child_notify()
|
||||
|
||||
util.log("Updating tree view", util.LogLevel.Info)
|
||||
start = time.time()
|
||||
@@ -165,8 +86,7 @@ class CardList(Gtk.ScrolledWindow):
|
||||
|
||||
# Reactivate update for filtered trees
|
||||
if self.filtered:
|
||||
self.list.set_model(self.filter_and_sort)
|
||||
self.list.thaw_child_notify()
|
||||
self.tree.thaw_child_notify()
|
||||
|
||||
@staticmethod
|
||||
def compare_rarity(model, row1, row2, user_data):
|
||||
|
||||
@@ -30,23 +30,33 @@
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkTreeModelFilter" id="cardStoreFiltered">
|
||||
<property name="child_model">cardStore</property>
|
||||
</object>
|
||||
<object class="GtkTreeModelSort" id="cardStoreFilteredSorted">
|
||||
<property name="model">cardStoreFiltered</property>
|
||||
</object>
|
||||
<object class="GtkTreeView" id="cardTree">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">cardStore</property>
|
||||
<property name="model">cardStoreFilteredSorted</property>
|
||||
<property name="search_column">2</property>
|
||||
<property name="enable_grid_lines">both</property>
|
||||
<property name="enable_grid_lines">horizontal</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection"/>
|
||||
<object class="GtkTreeSelection">
|
||||
<property name="mode">multiple</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="col_name">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Card Name</property>
|
||||
<property name="sort_indicator">True</property>
|
||||
<property name="sort_column_id">1</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cell_bold">
|
||||
<property name="xpad">2</property>
|
||||
<property name="weight">800</property>
|
||||
</object>
|
||||
<attributes>
|
||||
@@ -56,25 +66,16 @@
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="col_supertypes">
|
||||
<property name="title" translatable="yes">Supertypes</property>
|
||||
<property name="sort_column_id">2</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<attributes>
|
||||
<attribute name="foreground">11</attribute>
|
||||
<attribute name="text">2</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="col_types">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Types</property>
|
||||
<property name="sort_column_id">3</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<object class="GtkCellRendererText">
|
||||
<property name="xpad">2</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="foreground">11</attribute>
|
||||
<attribute name="text">3</attribute>
|
||||
@@ -84,10 +85,14 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="col_rarity">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Rarity</property>
|
||||
<property name="sort_column_id">4</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<object class="GtkCellRendererText">
|
||||
<property name="xpad">2</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="foreground">11</attribute>
|
||||
<attribute name="text">4</attribute>
|
||||
@@ -97,10 +102,14 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="col_set">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Edition</property>
|
||||
<property name="sort_column_id">10</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<object class="GtkCellRendererText">
|
||||
<property name="xpad">2</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="foreground">11</attribute>
|
||||
<attribute name="text">10</attribute>
|
||||
@@ -110,6 +119,8 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="col_mana">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Mana Cost</property>
|
||||
<property name="sort_column_id">9</property>
|
||||
<child>
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<property name="name">Card Vault</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="title" translatable="yes">Card Vault</property>
|
||||
<property name="default_width">800</property>
|
||||
<property name="default_height">600</property>
|
||||
<property name="default_width">900</property>
|
||||
<property name="default_height">700</property>
|
||||
<property name="icon_name">application-x-executable</property>
|
||||
<signal name="delete-event" handler="do_delete_event" swapped="no"/>
|
||||
<child>
|
||||
|
||||
@@ -108,7 +108,7 @@ class LibraryHandlers:
|
||||
for card in cards.values():
|
||||
self.app.untag_card(card, tag)
|
||||
self.reload_library(tag)
|
||||
self.reload_tag_list(preserve=True)
|
||||
self.reload_tag_list(none_selected=True)
|
||||
|
||||
def do_popup_remove_card(self, item):
|
||||
# Get selected cards
|
||||
@@ -118,7 +118,7 @@ class LibraryHandlers:
|
||||
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)
|
||||
self.reload_tag_list(none_selected=True)
|
||||
|
||||
# ---------------------------------Library Tree----------------------------------------------
|
||||
|
||||
@@ -155,9 +155,9 @@ class LibraryHandlers:
|
||||
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)
|
||||
card_list.tree.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.tree.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"))
|
||||
@@ -172,7 +172,7 @@ class LibraryHandlers:
|
||||
lib = self.app.library
|
||||
else:
|
||||
lib = self.app.get_tagged_cards(tag)
|
||||
self.reload_tag_list(True)
|
||||
self.reload_tag_list(tag == "All" or tag == "Untagged")
|
||||
tag_combo = self.app.ui.get_object("tagCardCombo")
|
||||
tag_combo.set_model(self.app.ui.get_object("tagStore"))
|
||||
|
||||
@@ -188,7 +188,7 @@ class LibraryHandlers:
|
||||
self.app.add_tag(name)
|
||||
self.reload_tag_list(True)
|
||||
|
||||
def reload_tag_list(self, preserve=False):
|
||||
def reload_tag_list(self, none_selected=False):
|
||||
"""Reload left pane tag list"""
|
||||
tree = self.app.ui.get_object("tagTree")
|
||||
(path, column) = tree.get_cursor()
|
||||
@@ -196,7 +196,7 @@ class LibraryHandlers:
|
||||
store.clear()
|
||||
for tag, ids in self.app.tags.items():
|
||||
store.append([tag, tag + " (" + str(len(ids)) + ")"])
|
||||
if preserve:
|
||||
if none_selected:
|
||||
tree.set_cursor(path if path else 0)
|
||||
store.set_sort_column_id(1, Gtk.SortType.ASCENDING)
|
||||
|
||||
|
||||
@@ -285,14 +285,14 @@ class SearchHandlers:
|
||||
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.tree.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)
|
||||
card_list.tree.connect("button-press-event", self.on_search_tree_press_event)
|
||||
|
||||
@staticmethod
|
||||
def _init_combo_box(combo, card_list: list):
|
||||
|
||||
@@ -138,8 +138,8 @@ class WantsHandlers:
|
||||
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)
|
||||
card_list.tree.connect("row-activated", self.on_wants_card_selected)
|
||||
card_list.tree.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"))
|
||||
|
||||
Reference in New Issue
Block a user