From dc79086f38edbd82461a0519e2ac897d841980e9 Mon Sep 17 00:00:00 2001 From: "g@localhost.localdomain" Date: Tue, 2 Jan 2007 01:12:51 +0100 Subject: [PATCH] Select paths instead of nodes, easier to use --- pysize/ui/gtk/pysize_widget.py | 2 +- pysize/ui/gtk/pysize_widget_draw.py | 10 ++++++---- pysize/ui/gtk/pysize_widget_menu.py | 2 +- pysize/ui/gtk/pysize_widget_mouse.py | 29 +++++++++++++++++------------ 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/pysize/ui/gtk/pysize_widget.py b/pysize/ui/gtk/pysize_widget.py index fa216fd..0694719 100644 --- a/pysize/ui/gtk/pysize_widget.py +++ b/pysize/ui/gtk/pysize_widget.py @@ -56,7 +56,7 @@ class PysizeWidget(gtk.DrawingArea, PysizeWidget_Draw, self.connect('configure-event', type(self)._configure) self.set_flags(gtk.CAN_FOCUS) self.options = options - self.selected_nodes = [] + self.selected_paths = set() self.paths = args self.tree = pysize_tree([], 0, 0, self.options) self.tree_builder = threaded_pysize_tree() diff --git a/pysize/ui/gtk/pysize_widget_draw.py b/pysize/ui/gtk/pysize_widget_draw.py index d2d84ca..2bf1afb 100644 --- a/pysize/ui/gtk/pysize_widget_draw.py +++ b/pysize/ui/gtk/pysize_widget_draw.py @@ -72,7 +72,7 @@ class PysizeWidget_Draw(object): context.show_layout(pl) return True - def _get_node_colors(self, node, colors): + def _get_node_colors(self, node, is_selected, colors): def transform(colors, dr, dg, db): def clamp(c): return max(0, min(1, c)) @@ -94,7 +94,7 @@ class PysizeWidget_Draw(object): if node == self.cursor_node: colors = transform(colors, 0.2, 0.2, 0.2) - if node in self.selected_nodes + [self.button_press_node]: + if is_selected: colors = transform(colors, -0.4, -0.4, -0.4) return colors @@ -110,7 +110,9 @@ class PysizeWidget_Draw(object): y0 += LINE_WIDTH/4.0 y1 -= LINE_WIDTH/4.0 node.rectangle = x0, x1, y0, y1 - colors = self._get_node_colors(node, ((0.5, 0.4, 1.0), (0.2, 0.4, 1.0))) + is_selected = set(node.get_fullpaths()) <= self.selected_paths + colors = self._get_node_colors(node, is_selected, + ((0.5, 0.4, 1.0), (0.2, 0.4, 1.0))) context.set_source_rgb(0, 0, 0) if self.fast: context.rectangle(x0, y0, x1 - x0, y1 - y0) @@ -144,7 +146,7 @@ class PysizeWidget_Draw(object): name = sanitize_string(node.get_name()) size = human_unit(node.size) position = x0, x1, y0, y1 - if node in self.selected_nodes + [self.button_press_node]: + if is_selected: context.set_source_rgb(1, 1, 1) else: context.set_source_rgb(0, 0, 0) diff --git a/pysize/ui/gtk/pysize_widget_menu.py b/pysize/ui/gtk/pysize_widget_menu.py index 8c37eeb..4601ea5 100644 --- a/pysize/ui/gtk/pysize_widget_menu.py +++ b/pysize/ui/gtk/pysize_widget_menu.py @@ -41,7 +41,7 @@ class PysizeWidget_Menu(object): if self.cursor_node: menu = gtk.Menu() - props = lambda item: self.show_properties(self.get_selection()) + props = lambda item: self.show_properties(self.get_selected_nodes()) self._add_menu_item(menu, 'Show properties...', props) if event: diff --git a/pysize/ui/gtk/pysize_widget_mouse.py b/pysize/ui/gtk/pysize_widget_mouse.py index 11de748..9ef2975 100644 --- a/pysize/ui/gtk/pysize_widget_mouse.py +++ b/pysize/ui/gtk/pysize_widget_mouse.py @@ -102,24 +102,29 @@ class PysizeWidget_Mouse(object): node = self._get_node_here(event) if node == self.button_press_node: if event.state & gtk.gdk.CONTROL_MASK: - if node in self.selected_nodes: - self.selected_nodes.remove(node) - elif node: - self.selected_nodes.append(node) + if node: + node_fullpaths = set(node.get_fullpaths()) + if node_fullpaths <= self.selected_paths: + self.selected_paths -= node_fullpaths + else: + self.selected_paths |= node_fullpaths else: - for n in self.selected_nodes: - self.queue_node_redraw(n) + self.queue_draw() if node: - self.selected_nodes = [node] + self.selected_paths = set(node.get_fullpaths()) else: - self.selected_nodes = [] + self.selected_paths = set() self.queue_node_redraw(node) else: self.queue_node_redraw(self.button_press_node) self.button_press_node = None return True - def get_selection(self): - if self.cursor_node and not self.cursor_node in self.selected_nodes: - return self.selected_nodes + [self.cursor_node] - return self.selected_nodes + def get_selected_nodes(self): + if self.cursor_node: + cursor_fullpaths = set(self.cursor_node.get_fullpaths()) + else: + cursor_fullpaths = set() + sel = self.selected_paths | cursor_fullpaths + nodes = [n for n in self.tree.root if set(n.get_fullpaths()) <= sel] + return nodes -- 2.11.4.GIT