Skip to content
This repository has been archived by the owner on Mar 3, 2020. It is now read-only.

Commit

Permalink
Merge pull request #46 from kived/speed-cache
Browse files Browse the repository at this point in the history
speed fixes
  • Loading branch information
akshayaurora committed Jun 13, 2014
2 parents 68ee735 + 58b10a4 commit 3e8f621
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 5 deletions.
29 changes: 26 additions & 3 deletions designer/nodetree.py
Expand Up @@ -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.
Expand All @@ -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
Expand Down Expand Up @@ -81,18 +86,36 @@ 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
'''
for node in self.tree.root.nodes:
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.
Expand Down
14 changes: 13 additions & 1 deletion designer/propertyviewer.py
Expand Up @@ -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'.
'''
Expand All @@ -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`
Expand Down
7 changes: 6 additions & 1 deletion 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
Expand Down Expand Up @@ -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
'''
Expand All @@ -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.
'''

Expand Down

0 comments on commit 3e8f621

Please sign in to comment.