From 58b10a4c96b71065877b7cb9f1194ee93f03481f Mon Sep 17 00:00:00 2001 From: Ryan Pessa Date: Thu, 12 Jun 2014 15:29:54 -0500 Subject: [PATCH] speed fixes --- designer/nodetree.py | 29 ++++++++++++++++++++++++++--- designer/propertyviewer.py | 14 +++++++++++++- designer/statusbar.py | 7 ++++++- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/designer/nodetree.py b/designer/nodetree.py index 673ea3b..4fee1ee 100644 --- a/designer/nodetree.py +++ b/designer/nodetree.py @@ -44,6 +44,11 @@ class WidgetsTree(ScrollView): :data:`dragging` is a :class:`~kivy.properties.ObjectProperty` ''' + def __init__(self, **kwargs): + super(WidgetsTree, self).__init__(**kwargs) + self.refresh = Clock.create_trigger(self._refresh) + self._widget_cache = {} + def recursive_insert(self, node, treenode): '''This function will add a node to TreeView, by recursively travelling through the Root Widget's Tree. @@ -52,7 +57,7 @@ def recursive_insert(self, node, treenode): if node is None: return - b = WidgetTreeElement(node=node) + b = self._get_widget(node) self.tree.add_node(b, treenode) class_rules = self.project_loader.class_rules root_widget = self.project_loader.root_rule.widget @@ -81,11 +86,23 @@ def insert_for_tabbed_panel(self, node, treenode): '''This function will insert nodes in tree specially for TabbedPanel. ''' for tab in node.tab_list: - b = WidgetTreeElement(node=tab) + b = self._get_widget(tab) self.tree.add_node(b, treenode) self.recursive_insert(tab.content, b) - def refresh(self, *l): + def _get_widget(self, node): + try: + wid = self._widget_cache[node] + if not wid: + raise KeyError() + except KeyError: + wid = WidgetTreeElement(node=node) + self._widget_cache[node] = wid.proxy_ref + if wid.parent_node: + self.tree.remove_node(wid) + return wid + + def _refresh(self, *l): '''This function will refresh the tree. It will first remove all nodes and then insert them using recursive_insert ''' @@ -93,6 +110,12 @@ def refresh(self, *l): self.tree.remove_node(node) self.recursive_insert(self.playground.root, self.tree.root) + self._clean_cache() + + def _clean_cache(self): + for node, wid in self._widget_cache.items(): + if not node or not node.parent or not wid or not wid.parent_node: + del self._widget_cache[node] def on_touch_up(self, touch): '''Default event handler for 'on_touch_up' event. diff --git a/designer/propertyviewer.py b/designer/propertyviewer.py index 8669d05..46d3a6d 100644 --- a/designer/propertyviewer.py +++ b/designer/propertyviewer.py @@ -168,6 +168,10 @@ class PropertyViewer(ScrollView): :data:`kv_code_input` is a :class:`~kivy.properties.ObjectProperty` ''' + def __init__(self, **kwargs): + super(PropertyViewer, self).__init__(**kwargs) + self._label_cache = {} + def on_widget(self, instance, value): '''Default handler for 'on_widget'. ''' @@ -189,15 +193,23 @@ def discover(self, value): ''' add = self.prop_list.add_widget + get_label = self._get_label props = value.properties().keys() props.sort() for prop in props: ip = self.build_for(prop) if not ip: continue - add(PropertyLabel(text=prop)) + add(get_label(prop)) add(ip) + def _get_label(self, prop): + try: + return self._label_cache[prop] + except KeyError: + lbl = self._label_cache[prop] = PropertyLabel(text=prop) + return lbl + def build_for(self, name): '''To create :class:`~designer.propertyviewer.PropertyBoolean` :class:`~designer.propertyviewer.PropertyTextInput` diff --git a/designer/statusbar.py b/designer/statusbar.py index 631e3ba..81770e9 100644 --- a/designer/statusbar.py +++ b/designer/statusbar.py @@ -1,4 +1,5 @@ from kivy.properties import ObjectProperty +from kivy.clock import Clock from kivy.uix.button import Button from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout @@ -55,6 +56,10 @@ class StatusBar(BoxLayout): :class:`~kivy.properties.ObjectProperty` ''' + def __init__(self, **kwargs): + super(StatusBar, self).__init__(**kwargs) + self.update_navbar = Clock.create_trigger(self._update_navbar) + def show_message(self, message): '''To show a message in StatusBar ''' @@ -74,7 +79,7 @@ def show_message(self, message): def on_app(self, instance, app): app.bind(widget_focused=self.update_navbar) - def update_navbar(self, *largs): + def _update_navbar(self, *largs): '''To update navbar with the parents of currently selected Widget. '''