This commit is contained in:
yumoqing 2021-04-22 14:45:16 +08:00
parent ef7de84671
commit 7a9cbf194f
2 changed files with 35 additions and 20 deletions

View File

@ -1,5 +1,6 @@
import time import time
import ujson as json import ujson as json
from kivy.logger import Logger
from kivy.uix.gridlayout import GridLayout from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView from kivy.uix.scrollview import ScrollView
@ -18,7 +19,7 @@ from appPublic.uniqueID import getID
from appPublic.myTE import string_template_render from appPublic.myTE import string_template_render
from .utils import CSize, setSizeOptions, loading, loaded, absurl, alert from .utils import CSize, setSizeOptions, loading, loaded, absurl, alert
from .baseWidget import Text from .baseWidget import Text, HBox, VBox
from .widgetExt import ScrollWidget from .widgetExt import ScrollWidget
from .paging import Paging, RelatedLoader from .paging import Paging, RelatedLoader
from .ready import WidgetReady from .ready import WidgetReady
@ -33,7 +34,6 @@ def field_widget(desc, rec):
viewer = json.dumps(viewer) viewer = json.dumps(viewer)
rendered = string_template_render(desc.get('viewer'), rec) rendered = string_template_render(desc.get('viewer'), rec)
dic = json.loads(rendered) dic = json.loads(rendered)
print('field_widget(), dic=', dic)
if dic is None: if dic is None:
return None return None
return Factory.Blocks(dic) return Factory.Blocks(dic)
@ -42,23 +42,23 @@ def field_widget(desc, rec):
if uitype is None: if uitype is None:
uitype = desc.get('datatype') uitype = desc.get('datatype')
if uitype in [ 'str' 'date', 'time', 'timestamp' ]: if uitype in [ 'str' 'date', 'time', 'timestamp' ]:
return BLabel(text = str(desc['value']), return Text(text = str(desc['value']),
font_size=CSize(1),wrap=True, font_size=CSize(1),wrap=True,
halign='left', valign='middle' halign='left', valign='middle'
) )
if uitype in [ 'long', 'int','integer' ]: if uitype in [ 'long', 'int','integer' ]:
return BLabel(text=str(desc['value']), return Text(text=str(desc['value']),
font_size=CSize(1), wrap=True, font_size=CSize(1), wrap=True,
halign='right', valign='middle' halign='right', valign='middle'
) )
if uitype == 'float': if uitype == 'float':
f = '%%.0%df' % desc.get('dec',2) f = '%%.0%df' % desc.get('dec',2)
return BLabel(text=f % float(desc['value']), return Text(text=f % float(desc['value']),
font_size=CSize(1), wrap=True, font_size=CSize(1), wrap=True,
halign='right', valign='middle' halign='right', valign='middle'
) )
return BLabel(text = str(desc['value']), return Text(text = str(desc['value']),
font_size=CSize(1),wrap=True, font_size=CSize(1),wrap=True,
halign='left', valign='middle' halign='left', valign='middle'
) )
@ -70,8 +70,8 @@ class BLabel(ButtonBehavior, Text):
Text.__init__(self,**kw) Text.__init__(self,**kw)
self.csscls = 'dummy' self.csscls = 'dummy'
class Cell(BoxLayout): class Cell(ButtonBehavior, WidgetCSS, BoxLayout):
def __init__(self,row,desc): def __init__(self,row,desc, **kw):
""" """
desc:{ desc:{
width, width,
@ -83,9 +83,13 @@ class Cell(BoxLayout):
""" """
self.desc = desc self.desc = desc
self.row = row self.row = row
csscls=self.row.part.datagrid.body_css
if self.row.header:
csscls=self.row.part.datagrid.header_css
super().__init__(size_hint=(None,None), super().__init__(size_hint=(None,None),
width = self.desc['width'], width = self.desc['width'],
height = self.row.part.datagrid.rowHeight() height = self.row.part.datagrid.rowHeight(),
csscls=csscls
) )
if not self.row.header and self.desc.get('viewer'): if not self.row.header and self.desc.get('viewer'):
viewer = self.desc.get('viewer') viewer = self.desc.get('viewer')
@ -107,12 +111,12 @@ class Cell(BoxLayout):
bl = field_widget(desc,self.row.row_data) bl = field_widget(desc,self.row.row_data)
if bl: if bl:
self.add_widget(bl) self.add_widget(bl)
bl.bind(on_press=self.cell_press)
def cell_press(self,obj): def on_press(self,o=None):
if not self.row.header:
self.row.selected() self.row.selected()
class Row(WidgetCSS, GridLayout): class Row(BoxLayout):
def __init__(self,part, rowdesc,header=False,data=None, **kw): def __init__(self,part, rowdesc,header=False,data=None, **kw):
""" """
rowdesc=[ rowdesc=[
@ -128,17 +132,17 @@ class Row(WidgetCSS, GridLayout):
self.header = header self.header = header
self.row_data = data self.row_data = data
self.row_id = None self.row_id = None
self.linewidth = 1 self.linewidth = self.part.datagrid.linewidth
self.rowdesc = rowdesc self.rowdesc = rowdesc
opts = kw.copy() opts = kw.copy()
opts.update({ opts.update({
"cols":len(self.rowdesc), "spacing":self.linewidth,
"spacing":2 "orientation":"horizontal"
}) })
super(Row, self).__init__(**opts) super(Row, self).__init__(**opts)
# Clock.schedule_once(self.init,0)
self.init(0) self.init(0)
def init(self,t): def init(self,t):
w = 0 w = 0
h = 0 h = 0
@ -150,7 +154,7 @@ class Row(WidgetCSS, GridLayout):
if cell.height > h: if cell.height > h:
h = cell.height h = cell.height
self.size_hint = None,None self.size_hint = None,None
self.width = w + self.linewidth * 2 * len(self.rowdesc) self.width = w + self.linewidth * (len(self.rowdesc)+1)
self.height = h #self.part.datagrid.rowHeight() self.height = h #self.part.datagrid.rowHeight()
def selected(self): def selected(self):
@ -177,7 +181,7 @@ class Header(WidgetReady, ScrollWidget):
[ f.update({'value':self.part.fields[i].get('label', \ [ f.update({'value':self.part.fields[i].get('label', \
self.part.fields[i].get('name'))}) \ self.part.fields[i].get('name'))}) \
for i,f in enumerate(rd) ] for i,f in enumerate(rd) ]
self.header = Row(self.part,rd,header=True, csscls=self.part.datagrid.header_css) self.header = Row(self.part,rd,header=True)
self.add_widget(self.header) self.add_widget(self.header)
self.height = self.header.height self.height = self.header.height
@ -193,7 +197,7 @@ class Body(WidgetReady, ScrollWidget):
def addRow(self,id, data,index=0): def addRow(self,id, data,index=0):
rd = [ f.copy() for f in self.part.rowdesc ] rd = [ f.copy() for f in self.part.rowdesc ]
[ f.update({'value':data.get(f['name'])}) for f in rd ] [ f.update({'value':data.get(f['name'])}) for f in rd ]
row = Row(self.part,rd,data=data, csscls=self.part.datagrid.body_css) row = Row(self.part,rd,data=data)
row.row_id = id row.row_id = id
self.add_widget(row,index=index) self.add_widget(row,index=index)
self.idRow[id] = row self.idRow[id] = row
@ -283,6 +287,9 @@ class DataGrid(WidgetReady, BoxLayout):
"params":{ "params":{
} }
}, },
"header_css":"default",
"body_css":"default",
"spacing":1,
"fields":[ "fields":[
{ {
"name":"field1", "name":"field1",
@ -326,6 +333,9 @@ class DataGrid(WidgetReady, BoxLayout):
self.params = self.options.get('params',{}) self.params = self.options.get('params',{})
self.total_cnt = 0 self.total_cnt = 0
self.max_row = 0 self.max_row = 0
self.header_css = self.options.get('header_css','default')
self.body_css = self.options.get('body_css', 'default')
self.linewidth = self.options.get('linewidth',1)
self.curpage = 0 self.curpage = 0
self.loading = False self.loading = False
self.freeze_fields = self.getPartFields(freeze_flag=True) self.freeze_fields = self.getPartFields(freeze_flag=True)

View File

@ -52,6 +52,7 @@ class WidgetCSS(object):
app = App.get_running_app() app = App.get_running_app()
for css_name in css_str.split(' '): for css_name in css_str.split(' '):
css.update(app.get_css(css_name)) css.update(app.get_css(css_name))
Logger.info('WidgetCSS:set_css():%s',css.keys())
for k,v in css.items(): for k,v in css.items():
setattr(self,k,v) setattr(self,k,v)
@ -86,6 +87,8 @@ class WidgetCSS(object):
self.set_child_fgcolor(c) self.set_child_fgcolor(c)
def on_fgcolor(self, o, c): def on_fgcolor(self, o, c):
Logger.info('WidgetCSS:on_fgcolor:%s fgcolor=%s', self.__class__.__name__,
self.fgcolor)
if not self.fgcolor: if not self.fgcolor:
return return
if isinstance(self, TextInput): if isinstance(self, TextInput):
@ -98,6 +101,8 @@ class WidgetCSS(object):
return return
def on_bgcolor(self, o, c): def on_bgcolor(self, o, c):
Logger.info('WidgetCSS:on_bgcolor:%s fgcolor=%s', self.__class__.__name__,
self.bgcolor)
if not self.bgcolor: if not self.bgcolor:
return return
if isinstance(self, TextInput): if isinstance(self, TextInput):