From 635ac221963d1b9a006915abebbe11acdfd5ec67 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Sat, 9 May 2009 16:47:12 +0200 Subject: [PATCH] Spritz: packages treeview, allow clickable headers and connect to sorters --- spritz/src/spritz.py | 11 +++++- spritz/src/views.py | 91 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 81 insertions(+), 21 deletions(-) diff --git a/spritz/src/spritz.py b/spritz/src/spritz.py index 3f2b05045..c1c8633cc 100644 --- a/spritz/src/spritz.py +++ b/spritz/src/spritz.py @@ -1128,7 +1128,8 @@ class SpritzApplication(Controller, SpritzApplicationEventsMixin): self.show_wait_window() self.setup_gui() # show UI - self.ui.main.maximize() + if "--nomaximize" not in sys.argv: + self.ui.main.maximize() self.ui.main.show() self.hide_wait_window() @@ -1334,6 +1335,14 @@ class SpritzApplication(Controller, SpritzApplicationEventsMixin): 4: 'votes', 5: 'repository', } + self.pkg_sorters_id_inverse = { + 'default': 0, + 'name_az': 1, + 'name_za': 2, + 'downloads': 3, + 'votes': 4, + 'repository': 5, + } self.pkg_sorters_img_ids = { 0: gtk.STOCK_PRINT_PREVIEW, 1: gtk.STOCK_SORT_DESCENDING, diff --git a/spritz/src/views.py b/spritz/src/views.py index f58a5b575..32f887052 100644 --- a/spritz/src/views.py +++ b/spritz/src/views.py @@ -203,22 +203,25 @@ class VoteSortPackageViewModelInjector(EntropyPackageViewModelInjector): def __init__(self, *args, **kwargs): EntropyPackageViewModelInjector.__init__(self, *args, **kwargs) + self.reverse = False def packages_inject(self, packages): - def mycmp(obj_a, obj_b): - eq = 0 - d1 = obj_a.voteint - d2 = obj_b.voteint - if d1 == d2: - return 0 - if d1 < d2: - return 1 - return -1 - - packages.sort(mycmp) + data = {} for po in packages: - self.model.append( None, (po,) ) + vote = po.voteint + d_obj = data.setdefault(vote, []) + d_obj.append(po) + + for vote in sorted(data, reverse = self.reverse): + for po in data[vote]: + self.model.append( None, (po,) ) + +class VoteRevSortPackageViewModelInjector(VoteSortPackageViewModelInjector): + + def __init__(self, *args, **kwargs): + VoteSortPackageViewModelInjector.__init__(self, *args, **kwargs) + self.reverse = True class RepoSortPackageViewModelInjector(EntropyPackageViewModelInjector): @@ -329,10 +332,8 @@ class EntropyPackageView: treeview.set_fixed_height_mode(True) self.view = treeview self.view.connect("button-press-event", self.on_view_button_press) - #self.view.connect("button-release-event", self.load_menu) self.view.connect("enter-notify-event",self.treeview_enter_notify) self.view.connect("leave-notify-event",self.treeview_leave_notify) - #self.view.connect("button-press-event", self.load_properties_button) self.store = self.setupView() self.dummyCats = {} self.queue = qview.queue @@ -406,16 +407,28 @@ class EntropyPackageView: self.pkgset_remove.set_image(self.img_pkgset_remove) self.pkgset_undoremove.set_image(self.img_pkgset_undoremove) + self.model_injector_rotation = { + 'package': [NameSortPackageViewModelInjector, + NameRevSortPackageViewModelInjector, + DownloadSortPackageViewModelInjector, + DefaultPackageViewModelInjector], + 'vote': [VoteSortPackageViewModelInjector, + VoteRevSortPackageViewModelInjector], + 'repository': [RepoSortPackageViewModelInjector], + } + # set default model injector self.change_model_injector(DefaultPackageViewModelInjector) # start view refresher - t = ParallelTask(self.view_refresher) - t.start() + # XXX if people won't complain, keep this disabled + #t = ParallelTask(self.view_refresher) + #t.start() def change_model_injector(self, injector): if not issubclass(injector, EntropyPackageViewModelInjector): raise AttributeError("wrong sorter") + self.__current_model_injector_class = injector self.Injector = injector(self.store, self.Equo, self.etpbase, self.dummyCats) @@ -517,13 +530,13 @@ class EntropyPackageView: return items def on_view_button_press(self, widget, event): - objs = self.collect_selected_items(widget) try: row, column, x, y = widget.get_path_at_pos(int(event.x),int(event.y)) except TypeError: return True + objs = self.collect_selected_items(widget) col_title = column.get_title() if (col_title == self.pkgcolumn_text_rating) and len(objs) < 2: self.load_menu(widget,event, objs = objs) @@ -1183,6 +1196,39 @@ class EntropyPackageView: normalCursor(self.main_window) self.view.queue_draw() + def __do_change_sorting_by_column(self, options): + current = self.__current_model_injector_class + new = options[0] + if current in options: + try: + new = options[options.index(current)+1] + except IndexError: + new = options[0] # make explicit + + if new == self.__current_model_injector_class: + return + self.change_model_injector(new) + if self.Spritz != None: + sorter = self.Spritz.ui.pkgSorter + for sort_name, sort_class in self.Spritz.avail_pkg_sorters.items(): + if sort_class == new: + sort_id = self.Spritz.pkg_sorters_id_inverse.get(sort_name) + sorter.set_active(sort_id) + break + self.Spritz.addPackages() + + def on_package_column_clicked(self, widget): + options = self.model_injector_rotation['package'] + self.__do_change_sorting_by_column(options) + + def on_vote_column_clicked(self, widget): + options = self.model_injector_rotation['vote'] + self.__do_change_sorting_by_column(options) + + def on_repository_column_clicked(self, widget): + options = self.model_injector_rotation['repository'] + self.__do_change_sorting_by_column(options) + def setupView( self ): store = gtk.TreeStore( gobject.TYPE_PYOBJECT ) @@ -1203,7 +1249,8 @@ class EntropyPackageView: column1.set_clickable( False ) self.create_text_column( _( "Package" ), 'namedesc' , size = 300, - expand = True, set_height = myheight, clickable = True) + expand = True, set_height = myheight, clickable = True, + click_cb = self.on_package_column_clicked) # vote event box cell2 = CellRendererStars() @@ -1216,10 +1263,12 @@ class EntropyPackageView: column2.set_expand(False) column2.set_sort_column_id( -1 ) column2.set_clickable(True) + column2.connect("clicked", self.on_vote_column_clicked) self.view.append_column( column2 ) self.create_text_column( _( "Repository" ), 'repoid', size = 130, - set_height = myheight, clickable = True) + set_height = myheight, clickable = True, + click_cb = self.on_repository_column_clicked) return store @@ -1339,7 +1388,7 @@ class EntropyPackageView: pass def create_text_column( self, hdr, property, size, sortcol = None, - expand = False, set_height = 0, clickable = False): + expand = False, set_height = 0, clickable = False, click_cb = None): """ Create a TreeViewColumn with text and set the sorting properties and add it to the view @@ -1355,6 +1404,8 @@ class EntropyPackageView: column.set_expand(expand) column.set_sort_column_id( -1 ) column.set_clickable(clickable) + if callable(click_cb): + column.connect("clicked", click_cb) self.view.append_column( column ) return column