This commit is contained in:
yumoqing 2021-12-29 18:38:14 +08:00
parent 5103a9a8d8
commit 0d4b540cac
5 changed files with 168 additions and 8 deletions

60
kivyblocks/block_test.py Normal file
View 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
View 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)

View File

@ -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']:

View File

@ -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)

View File

@ -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: