From fc283e606301bd911b5dfa4c306e53ad166a0cdc Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 18 May 2021 12:42:43 +0800 Subject: [PATCH] bugfix --- kivyblocks/toggleitems.py | 3 +++ kivyblocks/tree.py | 39 ++++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/kivyblocks/toggleitems.py b/kivyblocks/toggleitems.py index f398069..9069919 100644 --- a/kivyblocks/toggleitems.py +++ b/kivyblocks/toggleitems.py @@ -34,6 +34,9 @@ class PressableBox(TouchRippleButtonBehavior, Box): self.actived = False self.csscls = self.normal_css + def active(self, flag): + self.box_actived = flag + def on_box_actived(self, o, v): if self.box_actived: self.csscls = self.actived_css diff --git a/kivyblocks/tree.py b/kivyblocks/tree.py index 60e2a13..c12340b 100644 --- a/kivyblocks/tree.py +++ b/kivyblocks/tree.py @@ -128,6 +128,11 @@ class TreeNode(BoxLayout): self.addContent() self.setSize() + def sibling(self): + if self.parentNode is None: + return [ i for i in self.treeObj.nodes if i != self ] + return [ i for i in self.parentNode.nodes if i != self ] + def selected(self): self.content.selected() @@ -305,9 +310,10 @@ tree options "params", "normal_css", "selected_css", + "single_expand", + "select_leaf_only", "bgcolor", "checkbox", - "single_expand" "multplecheck", "idField", "textFiled", @@ -320,6 +326,7 @@ class Tree(WidgetCSS, ScrollWidget): url=None, params={}, single_expand=False, + select_leaf_only=True, bgcolor=[0.2,0.2,0.2,1], normal_css="default", row_height=2, @@ -334,6 +341,7 @@ class Tree(WidgetCSS, ScrollWidget): self.params = params self.data = data self.single_expand=single_expand + self.select_leaf_only=select_leaf_only self.row_height=row_height self.rowheight = CSize(self.row_height) self.bgcolor = bgcolor @@ -360,7 +368,15 @@ class Tree(WidgetCSS, ScrollWidget): self.unselect_row() self.selected_node = node node.selected() - self.dispatch('on_press', node) + if not self.select_leaf_only or not node.hasChildren_nodes: + self.dispatch('on_press', node) + if node.hasChildren_nodes: + node.toggleChildren(node) + node.trigger.on_press() + if node.children_open and self.single_expand: + for n in node.sibling(): + if n.hasChildren_nodes and n.children_open: + n.collapse() def unselect_row(self): if self.selected_node: @@ -458,11 +474,6 @@ class TextTreeNode(TreeNode): return def onPress(self,o,v=None): - if self.hasChildren_nodes: - Logger.info('select the non-leaf node') - self.toggleChildren(self) - self.trigger.on_press() - return Logger.info('select the leaf node') self.treeObj.select_row(self) @@ -479,10 +490,6 @@ class TextTree(Tree): self.NodeKlass = nodeklass super().__init__(**options) - def select_row(self, node): - super().select_row(node) - self.dispatch('on_press',node.data) - class MenuTreeNode(TextTreeNode): def on_size(self, *args): Logger.info('%s:on_size(),bgcolor=%s, fgcolor=%s,css=%s', @@ -494,6 +501,12 @@ class MenuTreeNode(TextTreeNode): self.content.width = self.node_box.width - self.trigger.width self.text_widget.width = self.content.width - CSize(1) + def selected(self): + self.content.active(True) + + def unselected(self): + self.content.active(False) + def buildContent(self): txt = self.data.get(self.treeObj.textField, self.data.get(self.treeObj.idField,'defaulttext')) @@ -552,8 +565,8 @@ class MenuTree(TextTree): def select_row(self, node): super().select_row(node) - self.dispatch('on_press',node.data) - self.menucall(node) + if not node.hasChildren_nodes: + self.menucall(node) def menucall(self, node): url = node.data.get('url')