From patchwork Sun Apr 8 10:21:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel, 03/20] Hob: add fadeout display effection for package view include page Date: Sun, 08 Apr 2012 10:21:06 -0000 From: Shane Wang X-Patchwork-Id: 25303 Message-Id: <1b402179e218701541a0d2ec97a13d7f1c93a0d9.1333880210.git.shane.wang@intel.com> To: bitbake-devel@lists.openembedded.org From: Liming An [YOCTO #2100] Signed-off-by: Liming An --- bitbake/lib/bb/ui/crumbs/hoblistmodel.py | 17 ++++++- bitbake/lib/bb/ui/crumbs/hobwidget.py | 6 ++- bitbake/lib/bb/ui/crumbs/packageselectionpage.py | 52 +++++++++++++++++++--- bitbake/lib/bb/ui/crumbs/recipeselectionpage.py | 2 +- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/bitbake/lib/bb/ui/crumbs/hoblistmodel.py b/bitbake/lib/bb/ui/crumbs/hoblistmodel.py index 523a591..f5e3740 100644 --- a/bitbake/lib/bb/ui/crumbs/hoblistmodel.py +++ b/bitbake/lib/bb/ui/crumbs/hoblistmodel.py @@ -428,6 +428,19 @@ class PackageListModel(gtk.TreeStore): self.selection_change_notification() + """ + Resync the state of included items to a backup column before performing the fadeout visible effect + """ + def resync_fadeout_column(self, model_first_iter=None): + it = model_first_iter + while it: + active = self.get_value(it, self.COL_INC) + self.set(it, self.COL_FADE_INC, active) + if self.iter_has_child(it): + self.resync_fadeout_column(self.iter_children(it)) + + it = self.iter_next(it) + # # RecipeListModel # @@ -509,12 +522,12 @@ class RecipeListModel(gtk.ListStore): Create, if required, and return a filtered gtk.TreeModelSort containing only the items which are items specified by filter """ - def tree_model(self, filter, excluded_items_head=False): + def tree_model(self, filter, excluded_items_ahead=False): model = self.filter_new() model.set_visible_func(self.tree_model_filter, filter) sort = gtk.TreeModelSort(model) - if excluded_items_head: + if excluded_items_ahead: sort.set_default_sort_func(self.exclude_item_sort_func) else: sort.set_sort_column_id(RecipeListModel.COL_NAME, gtk.SORT_ASCENDING) diff --git a/bitbake/lib/bb/ui/crumbs/hobwidget.py b/bitbake/lib/bb/ui/crumbs/hobwidget.py index 41a59bd..21836f7 100644 --- a/bitbake/lib/bb/ui/crumbs/hobwidget.py +++ b/bitbake/lib/bb/ui/crumbs/hobwidget.py @@ -1057,7 +1057,11 @@ class HobCellRendererToggle(gtk.CellRendererToggle): if (not self.ctrl) or (not widget): return if self.ctrl.is_active(): - path = widget.get_path_at_pos(cell_area.x + cell_area.width/2, cell_area.y + cell_area.height/2)[0] + path = widget.get_path_at_pos(cell_area.x + cell_area.width/2, cell_area.y + cell_area.height/2) + # sometimes the parameters of cell_area will be a negative number,such as pull up down the scroll bar + # it's over the tree container range, so the path will be bad + if not path: return + path = path[0] if path in self.ctrl.running_cell_areas: cr = window.cairo_create() color = gtk.gdk.Color(HobColors.WHITE) diff --git a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py index 7926636..8391e29 100755 --- a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py +++ b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py @@ -110,10 +110,10 @@ class PackageSelectionPage (HobPage): tab = HobViewTable(columns) filter = page['filter'] tab.set_model(self.package_model.tree_model(filter)) - tab.connect("toggled", self.table_toggled_cb) + tab.connect("toggled", self.table_toggled_cb, page['name']) if page['name'] == "Included": tab.connect("row-activated", self.tree_row_activated_cb) - + tab.connect("cell-fadeinout-stopped", self.after_fadeout_checkin_include) label = gtk.Label(page['name']) self.ins.append_page(tab, label) self.tables.append(tab) @@ -176,18 +176,58 @@ class PackageSelectionPage (HobPage): (selected_packages_num, selected_packages_size_str, image_total_size_str)) self.ins.show_indicator_icon("Included", selected_packages_num) - def toggle_item_idle_cb(self, path): + def toggle_item_idle_cb(self, path, view_tree, cell, pagename): if not self.package_model.path_included(path): self.package_model.include_item(item_path=path, binb="User Selected") else: - self.package_model.exclude_item(item_path=path) + if pagename == "Included": + self.pre_fadeout_checkout_include(view_tree) + self.package_model.exclude_item(item_path=path) + self.render_fadeout(view_tree, cell) + else: + self.package_model.exclude_item(item_path=path) self.refresh_selection() self.builder.window_sensitive(True) - def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree): + def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree, pagename): # Click to include a package self.builder.window_sensitive(False) view_model = view_tree.get_model() path = self.package_model.convert_vpath_to_path(view_model, view_path) - glib.idle_add(self.toggle_item_idle_cb, path) + glib.idle_add(self.toggle_item_idle_cb, path, view_tree, cell, pagename) + + def pre_fadeout_checkout_include(self, tree): + self.package_model.resync_fadeout_column(self.package_model.get_iter_first()) + # Check out a model which base on the column COL_FADE_INC, + # it's save the prev state of column COL_INC before do exclude_item + filter = { PackageListModel.COL_FADE_INC : [True]} + new_model = self.package_model.tree_model(filter) + tree.set_model(new_model) + tree.expand_all() + + def get_excluded_rows(self, to_render_cells, model, it): + while it: + path = model.get_path(it) + prev_cell_is_active = model.get_value(it, PackageListModel.COL_FADE_INC) + curr_cell_is_active = model.get_value(it, PackageListModel.COL_INC) + if (prev_cell_is_active == True) and (curr_cell_is_active == False): + to_render_cells.append(path) + if model.iter_has_child(it): + self.get_excluded_rows(to_render_cells, model, model.iter_children(it)) + it = model.iter_next(it) + + return to_render_cells + + def render_fadeout(self, tree, cell): + if (not cell) or (not tree): + return + to_render_cells = [] + view_model = tree.get_model() + self.get_excluded_rows(to_render_cells, view_model, view_model.get_iter_first()) + + cell.fadeout(tree, 1000, to_render_cells) + + def after_fadeout_checkin_include(self, table, ctrl, cell, tree): + tree.set_model(self.package_model.tree_model(self.pages[0]['filter'])) + tree.expand_all() diff --git a/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py b/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py index 0568032..a2f7982 100755 --- a/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py +++ b/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py @@ -212,7 +212,7 @@ class RecipeSelectionPage (HobPage): # it's save the prev state of column COL_INC before do exclude_item filter = { RecipeListModel.COL_FADE_INC : [True], RecipeListModel.COL_TYPE : ['recipe', 'task'] } - new_model = self.recipe_model.tree_model(filter, excluded_items_head=True) + new_model = self.recipe_model.tree_model(filter, excluded_items_ahead=True) tree.set_model(new_model) def render_fadeout(self, tree, cell):