bugfix
This commit is contained in:
parent
5103a9a8d8
commit
0d4b540cac
60
kivyblocks/block_test.py
Normal file
60
kivyblocks/block_test.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
from traceback import print_exc
|
||||||
|
import ujson as json
|
||||||
|
from kivy.properties import StringProperty
|
||||||
|
from kivy.factory import Factory
|
||||||
|
from .toolbar import Toolbar
|
||||||
|
from .baseWidget import VBox, StrInput
|
||||||
|
from .utils import SUPER, blockImage, CSize
|
||||||
|
from .clickable import ClickableText
|
||||||
|
|
||||||
|
class BlockTest(VBox):
|
||||||
|
source_code = StringProperty(None)
|
||||||
|
def __init__(self, **kw):
|
||||||
|
SUPER(BlockTest, self, kw)
|
||||||
|
tb_desc = {
|
||||||
|
"img_size_c":2,
|
||||||
|
"toolbar_orient":"H",
|
||||||
|
"tool_orient":"horizontal",
|
||||||
|
"css_on":"default",
|
||||||
|
"css_off":"default",
|
||||||
|
"tools":[
|
||||||
|
{
|
||||||
|
"name":"source",
|
||||||
|
"source_on":blockImage('source_on.png'),
|
||||||
|
"source_off":blockImage('source_off.png'),
|
||||||
|
"label":"source code"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"widget",
|
||||||
|
"source_on":blockImage('widget_on.png'),
|
||||||
|
"source_off":blockImage('widget_off.png'),
|
||||||
|
"label":"Result widget"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
self.toolbar = Toolbar(**tb_desc)
|
||||||
|
self.toolbar.bind(on_press=self.tool_pressed)
|
||||||
|
self.content = VBox()
|
||||||
|
self.source_w = StrInput(multiline=True)
|
||||||
|
self.content.add_widget(self.source_w)
|
||||||
|
if self.source_code:
|
||||||
|
self.source_w.text = self.source_code
|
||||||
|
self.add_widget(self.toolbar)
|
||||||
|
self.add_widget(self.content)
|
||||||
|
|
||||||
|
def tool_pressed(self, o, v):
|
||||||
|
self.content.clear_widgets()
|
||||||
|
if v['name'] == 'source':
|
||||||
|
print('switch to source code')
|
||||||
|
self.content.add_widget(self.source_w)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
dic = json.loads(self.source_w.text)
|
||||||
|
print(dic, type(dic))
|
||||||
|
w = Factory.Blocks().widgetBuild(dic)
|
||||||
|
self.content.add_widget(w)
|
||||||
|
except Exception as e:
|
||||||
|
print_exc()
|
||||||
|
print('BlockTest:Exception:',e)
|
||||||
|
|
||||||
|
Factory.register('BlockTest', BlockTest)
|
97
kivyblocks/hirarchy.py
Normal file
97
kivyblocks/hirarchy.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
import traceback
|
||||||
|
|
||||||
|
from kivy.clock import Clock
|
||||||
|
from kivy.factory import Factory
|
||||||
|
from kivy.properties import ListProperty, BooleanProperty, \
|
||||||
|
StringProperty, DictProperty
|
||||||
|
from kivy.uix.treeview import TreeView, TreeViewNode, TreeViewLabel
|
||||||
|
from kivy.uix.boxlayout import BoxLayout
|
||||||
|
|
||||||
|
from .threadcall import HttpClient
|
||||||
|
from .scrollpanel import ScrollPanel
|
||||||
|
from .clickable import SingleCheckBox
|
||||||
|
from .baseWidget import Text
|
||||||
|
|
||||||
|
class TreeViewComplexNode(BoxLayout, TreeViewLabel):
|
||||||
|
otext = StringProperty(None)
|
||||||
|
checkbox = BooleanProperty(False)
|
||||||
|
icon = StringProperty(None)
|
||||||
|
def __init__(self, **kw):
|
||||||
|
super(TreeViewComplexNode, self).__init__(**kw)
|
||||||
|
self.orientation = 'horizontal'
|
||||||
|
if self.checkbox:
|
||||||
|
cb = SingleCheckBox(size_hint=(None,None))
|
||||||
|
cb.bind(on_press=self.set_checked)
|
||||||
|
self.add_widget(cb)
|
||||||
|
if self.icon:
|
||||||
|
img = AsyncImage(source=self.icon)
|
||||||
|
self.add_widget(img)
|
||||||
|
txt = Text(otext=self.otext, i18n=True)
|
||||||
|
txt.texture_update()
|
||||||
|
txt.size = txt.texture_size
|
||||||
|
self.add_widget(txt)
|
||||||
|
|
||||||
|
def set_checked(self, o):
|
||||||
|
if o.state():
|
||||||
|
self.data['checked'] = True
|
||||||
|
else:
|
||||||
|
self.data['checked'] = False
|
||||||
|
|
||||||
|
class Hirarchy(ScrollPanel):
|
||||||
|
url = StringProperty(None)
|
||||||
|
params = DictProperty(None)
|
||||||
|
method = StringProperty('get')
|
||||||
|
idField = StringProperty(None)
|
||||||
|
textField = StringProperty(None)
|
||||||
|
data = ListProperty(None)
|
||||||
|
checkbox = BooleanProperty(False)
|
||||||
|
icon = StringProperty(None)
|
||||||
|
def __init__(self, **kw):
|
||||||
|
self.tree = TreeView(hide_root=True)
|
||||||
|
self.tree.size_hint_y = None
|
||||||
|
self.tree.bind(on_node_expand=self.check_load_subnodes)
|
||||||
|
super(Hirarchy, self).__init__(inner=self.tree, **kw)
|
||||||
|
if self.url:
|
||||||
|
self.data = self.get_remote_data()
|
||||||
|
|
||||||
|
def check_load_subnodes(self, treeview, node):
|
||||||
|
if node.is_loaded:
|
||||||
|
return
|
||||||
|
data = self.get_remote_data(node)
|
||||||
|
for d in data:
|
||||||
|
self.create_new_node(d, node)
|
||||||
|
node.is_loaded = True
|
||||||
|
|
||||||
|
def create_new_node(self, data, node=None):
|
||||||
|
n = TreeViewComplexNode(otext=data[self.textField],
|
||||||
|
checkbox=self.checkbox,
|
||||||
|
icon=self.icon
|
||||||
|
)
|
||||||
|
n.data = data
|
||||||
|
if self.checkbox:
|
||||||
|
cb = SingleCheckBox()
|
||||||
|
n.add_widget(cb, index=len(n.children))
|
||||||
|
if node:
|
||||||
|
self.tree.add_node(n, node)
|
||||||
|
else:
|
||||||
|
self.tree.add_node(n)
|
||||||
|
|
||||||
|
def get_remote_data(self, node=None):
|
||||||
|
hc = HttpClient()
|
||||||
|
params = self.params.copy() if self.params else {}
|
||||||
|
if node:
|
||||||
|
params['id'] = node.data[self.idField]
|
||||||
|
d = hc(self.url, method=self.method, params=params)
|
||||||
|
if isinstance(d, list):
|
||||||
|
return d
|
||||||
|
if isinstance(d, dict):
|
||||||
|
return d['rows']
|
||||||
|
return None
|
||||||
|
|
||||||
|
def on_data(self, o, d=None):
|
||||||
|
if not self.data:
|
||||||
|
return
|
||||||
|
for d in self.data:
|
||||||
|
self.create_new_node(d)
|
||||||
|
|
||||||
|
Factory.register('Hirarchy', Hirarchy)
|
@ -39,6 +39,8 @@ from .scrollpanel import ScrollPanel
|
|||||||
from .udp_widget import UdpWidget
|
from .udp_widget import UdpWidget
|
||||||
from .paging import PageLoader
|
from .paging import PageLoader
|
||||||
from .dateinput import DateInput
|
from .dateinput import DateInput
|
||||||
|
from .block_test import BlockTest
|
||||||
|
from .hirarchy import Hirarchy
|
||||||
|
|
||||||
r = Factory.register
|
r = Factory.register
|
||||||
if kivy.platform in ['win','linux', 'macosx']:
|
if kivy.platform in ['win','linux', 'macosx']:
|
||||||
|
@ -132,7 +132,7 @@ class Toolbar(ScrollPanel):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
print(w, 'children=', len(w.children))
|
w.widget_id = t['name']
|
||||||
if t.get('deletable', False):
|
if t.get('deletable', False):
|
||||||
x = ClickableImage(source=blockImage('delete.png'),
|
x = ClickableImage(source=blockImage('delete.png'),
|
||||||
size_hint=(None,None),
|
size_hint=(None,None),
|
||||||
@ -144,7 +144,8 @@ class Toolbar(ScrollPanel):
|
|||||||
|
|
||||||
if w:
|
if w:
|
||||||
self.add_widget(w)
|
self.add_widget(w)
|
||||||
self.w_dic[w] = t
|
self.w_dic[w] = t.copy()
|
||||||
|
self.w_dic[w]['widget'] = w
|
||||||
w.select(False)
|
w.select(False)
|
||||||
w.bind(size=self.on_children_size)
|
w.bind(size=self.on_children_size)
|
||||||
w.bind(on_press=self.tool_press)
|
w.bind(on_press=self.tool_press)
|
||||||
|
@ -356,18 +356,18 @@ class Tree(WidgetCSS, ScrollWidget):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def select_row(self, node):
|
def select_row(self, node):
|
||||||
self.unselect_row()
|
if node.hasChildren_nodes and self.select_leaf_only:
|
||||||
self.selected_node = node
|
|
||||||
node.selected()
|
|
||||||
if not self.select_leaf_only or not node.hasChildren_nodes:
|
|
||||||
self.dispatch('on_press', node)
|
|
||||||
if node.hasChildren_nodes:
|
|
||||||
node.toggleChildren(node)
|
node.toggleChildren(node)
|
||||||
node.trigger.on_press()
|
node.trigger.on_press()
|
||||||
if node.children_open and self.single_expand:
|
if node.children_open and self.single_expand:
|
||||||
for n in node.sibling():
|
for n in node.sibling():
|
||||||
if n.hasChildren_nodes and n.children_open:
|
if n.hasChildren_nodes and n.children_open:
|
||||||
n.collapse()
|
n.collapse()
|
||||||
|
return
|
||||||
|
self.unselect_row()
|
||||||
|
self.selected_node = node
|
||||||
|
node.selected()
|
||||||
|
self.dispatch('on_press', node)
|
||||||
|
|
||||||
def unselect_row(self):
|
def unselect_row(self):
|
||||||
if self.selected_node:
|
if self.selected_node:
|
||||||
|
Loading…
Reference in New Issue
Block a user