From 3cc69d34131351fc9eb8672a838002241af4d329 Mon Sep 17 00:00:00 2001 From: Cristiana Voicu Date: Thu, 11 Apr 2013 15:07:59 +0300 Subject: bitbake: hob: Refine sorting mechanisms in Hob -refine sorting functions for each column from recipe list page and package list page -sort correctly size column from packages list page -set default sroting order and secondary sorting criteria -make included on included recipes/packages no sortable [YOCTO #2346 & #4194] (Bitbake rev: 56822176e3d5e613654a46c983d2f979d7a9eebc) Signed-off-by: Cristiana Voicu Signed-off-by: Richard Purdie --- bitbake/lib/bb/ui/crumbs/hoblistmodel.py | 107 ++++++++++++++++++++++++++----- 1 file changed, 91 insertions(+), 16 deletions(-) (limited to 'bitbake/lib/bb/ui/crumbs/hoblistmodel.py') diff --git a/bitbake/lib/bb/ui/crumbs/hoblistmodel.py b/bitbake/lib/bb/ui/crumbs/hoblistmodel.py index 0bd9734f48..547c1cade9 100644 --- a/bitbake/lib/bb/ui/crumbs/hoblistmodel.py +++ b/bitbake/lib/bb/ui/crumbs/hoblistmodel.py @@ -103,25 +103,55 @@ class PackageListModel(gtk.ListStore): Create, if required, and return a filtered gtk.TreeModelSort containing only the items specified by filter """ - def tree_model(self, filter, excluded_items_ahead=False, included_items_ahead=True, search_data=None): + def tree_model(self, filter, excluded_items_ahead=False, included_items_ahead=False, search_data=None, initial=False): model = self.filter_new() self.filtered_nb = 0 model.set_visible_func(self.tree_model_filter, filter) sort = gtk.TreeModelSort(model) + if initial: + sort.set_sort_column_id(PackageListModel.COL_NAME, gtk.SORT_ASCENDING) + sort.set_default_sort_func(None) + if excluded_items_ahead: sort.set_default_sort_func(self.exclude_item_sort_func, search_data) elif included_items_ahead: sort.set_default_sort_func(self.include_item_sort_func, search_data) else: - sort.set_sort_column_id(RecipeListModel.COL_NAME, gtk.SORT_ASCENDING) - sort.set_default_sort_func(None) + if search_data and search_data!='Search recipes by name' and search_data!='Search package groups by name': + sort.set_default_sort_func(self.sort_func, search_data) + else: + sort.set_sort_column_id(PackageListModel.COL_NAME, gtk.SORT_ASCENDING) + sort.set_default_sort_func(None) + + sort.set_sort_func(PackageListModel.COL_INC, self.sort_column, PackageListModel.COL_INC) + sort.set_sort_func(PackageListModel.COL_SIZE, self.sort_column, PackageListModel.COL_SIZE) + sort.set_sort_func(PackageListModel.COL_BINB, self.sort_column, PackageListModel.COL_BINB) + sort.set_sort_func(PackageListModel.COL_RCP, self.sort_column, PackageListModel.COL_RCP) return sort + def sort_column(self, model, row1, row2, col): + value1 = model.get_value(row1, col) + value2 = model.get_value(row2, col) + if col==PackageListModel.COL_SIZE: + value1 = HobPage._string_to_size(value1) + value2 = HobPage._string_to_size(value2) + + cmp_res = cmp(value1, value2) + if cmp_res!=0: + if col==PackageListModel.COL_INC: + return -cmp_res + else: + return cmp_res + else: + name1 = model.get_value(row1, PackageListModel.COL_NAME) + name2 = model.get_value(row2, PackageListModel.COL_NAME) + return cmp(name1,name2) + def exclude_item_sort_func(self, model, iter1, iter2, user_data=None): if user_data: - val1 = model.get_value(iter1, RecipeListModel.COL_NAME) - val2 = model.get_value(iter2, RecipeListModel.COL_NAME) + val1 = model.get_value(iter1, PackageListModel.COL_NAME) + val2 = model.get_value(iter2, PackageListModel.COL_NAME) if val1.startswith(user_data) and not val2.startswith(user_data): return -1 elif not val1.startswith(user_data) and val2.startswith(user_data): @@ -129,14 +159,14 @@ class PackageListModel(gtk.ListStore): else: return 0 else: - val1 = model.get_value(iter1, RecipeListModel.COL_FADE_INC) - val2 = model.get_value(iter2, RecipeListModel.COL_INC) + val1 = model.get_value(iter1, PackageListModel.COL_FADE_INC) + val2 = model.get_value(iter2, PackageListModel.COL_INC) return ((val1 == True) and (val2 == False)) def include_item_sort_func(self, model, iter1, iter2, user_data=None): if user_data: - val1 = model.get_value(iter1, RecipeListModel.COL_NAME) - val2 = model.get_value(iter2, RecipeListModel.COL_NAME) + val1 = model.get_value(iter1, PackageListModel.COL_NAME) + val2 = model.get_value(iter2, PackageListModel.COL_NAME) if val1.startswith(user_data) and not val2.startswith(user_data): return -1 elif not val1.startswith(user_data) and val2.startswith(user_data): @@ -144,10 +174,20 @@ class PackageListModel(gtk.ListStore): else: return 0 else: - val1 = model.get_value(iter1, RecipeListModel.COL_INC) - val2 = model.get_value(iter2, RecipeListModel.COL_INC) + val1 = model.get_value(iter1, PackageListModel.COL_INC) + val2 = model.get_value(iter2, PackageListModel.COL_INC) return ((val1 == False) and (val2 == True)) + def sort_func(self, model, iter1, iter2, user_data): + val1 = model.get_value(iter1, PackageListModel.COL_NAME) + val2 = model.get_value(iter2, PackageListModel.COL_NAME) + if val1.startswith(user_data) and not val2.startswith(user_data): + return -1 + elif not val1.startswith(user_data) and val2.startswith(user_data): + return 1 + else: + return 0 + def convert_vpath_to_path(self, view_model, view_path): # view_model is the model sorted # get the path of the model filtered @@ -162,7 +202,7 @@ class PackageListModel(gtk.ListStore): it = view_model.get_iter_first() while it: name = self.find_item_for_path(path) - view_name = view_model.get_value(it, RecipeListModel.COL_NAME) + view_name = view_model.get_value(it, PackageListModel.COL_NAME) if view_name == name: view_path = view_model.get_path(it) return view_path @@ -213,7 +253,6 @@ class PackageListModel(gtk.ListStore): # pkgsize is in KB size = HobPage._size_to_string(HobPage._string_to_size(pkgsize + ' KB')) - self.set(self.append(), self.COL_NAME, pkg, self.COL_VER, pkgv, self.COL_REV, pkgr, self.COL_RNM, pkg_rename, self.COL_SEC, section, self.COL_SUM, summary, @@ -520,25 +559,61 @@ class RecipeListModel(gtk.ListStore): val2 = model.get_value(iter2, RecipeListModel.COL_INC) return ((val1 == False) and (val2 == True)) + def sort_func(self, model, iter1, iter2, user_data): + val1 = model.get_value(iter1, RecipeListModel.COL_NAME) + val2 = model.get_value(iter2, RecipeListModel.COL_NAME) + if val1.startswith(user_data) and not val2.startswith(user_data): + return -1 + elif not val1.startswith(user_data) and val2.startswith(user_data): + return 1 + else: + return 0 + """ Create, if required, and return a filtered gtk.TreeModelSort containing only the items specified by filter """ - def tree_model(self, filter, excluded_items_ahead=False, included_items_ahead=True, search_data=None): + def tree_model(self, filter, excluded_items_ahead=False, included_items_ahead=False, search_data=None, initial=False): model = self.filter_new() self.filtered_nb = 0 model.set_visible_func(self.tree_model_filter, filter) sort = gtk.TreeModelSort(model) + if initial: + sort.set_sort_column_id(RecipeListModel.COL_NAME, gtk.SORT_ASCENDING) + sort.set_default_sort_func(None) + if excluded_items_ahead: sort.set_default_sort_func(self.exclude_item_sort_func, search_data) elif included_items_ahead: sort.set_default_sort_func(self.include_item_sort_func, search_data) else: - sort.set_sort_column_id(RecipeListModel.COL_NAME, gtk.SORT_ASCENDING) - sort.set_default_sort_func(None) + if search_data and search_data!='Search recipes by name' and search_data!='Search package groups by name': + sort.set_default_sort_func(self.sort_func, search_data) + else: + sort.set_sort_column_id(RecipeListModel.COL_NAME, gtk.SORT_ASCENDING) + sort.set_default_sort_func(None) + + sort.set_sort_func(RecipeListModel.COL_INC, self.sort_column, RecipeListModel.COL_INC) + sort.set_sort_func(RecipeListModel.COL_GROUP, self.sort_column, RecipeListModel.COL_GROUP) + sort.set_sort_func(RecipeListModel.COL_BINB, self.sort_column, RecipeListModel.COL_BINB) + sort.set_sort_func(RecipeListModel.COL_LIC, self.sort_column, RecipeListModel.COL_LIC) return sort + def sort_column(self, model, row1, row2, col): + value1 = model.get_value(row1, col) + value2 = model.get_value(row2, col) + cmp_res = cmp(value1, value2) + if cmp_res!=0: + if col==RecipeListModel.COL_INC: + return -cmp_res + else: + return cmp_res + else: + name1 = model.get_value(row1, RecipeListModel.COL_NAME) + name2 = model.get_value(row2, RecipeListModel.COL_NAME) + return cmp(name1,name2) + def convert_vpath_to_path(self, view_model, view_path): filtered_model_path = view_model.convert_path_to_child_path(view_path) filtered_model = view_model.get_model() -- cgit v1.2.3-54-g00ecf