This commit is contained in:
yumoqing 2021-01-21 12:30:56 +08:00
parent 4c75d9f6a6
commit 47a1647f9a
6 changed files with 109 additions and 65 deletions

View File

@ -322,20 +322,6 @@ class Blocks(EventDispatcher):
def build_rest(self, widget,desc,t=None):
self.subwidget_total = len(desc.get('subwidgets',[]))
self.subwidgets = [ None for i in range(self.subwidget_total)]
def doit(params,o,w):
desc = params['desc']
widget = params['widget']
self.subwidgets[params['pos']] = w
if None not in self.subwidgets:
for w in self.subwidgets:
widget.add_widget(w)
for b in desc.get('binds',[]):
kw = b.copy()
self.buildBind(widget,kw)
def doerr(o,e):
raise e
pos = 0
for pos,sw in enumerate(desc.get('subwidgets',[])):
params={
@ -343,17 +329,14 @@ class Blocks(EventDispatcher):
'widget':widget,
'pos':pos
}
f = partial(doit,params)
b = Blocks()
b.bind(on_built=f)
b.bind(on_failed=doerr)
kw = sw.copy()
b.widgetBuild(kw)
w = b.widgetBuild(kw)
widget.add_widget(w)
if self.subwidget_total == 0:
for b in desc.get('binds',[]):
kw = b.copy()
self.buildBind(widget,b)
for b in desc.get('binds',[]):
kw = b.copy()
self.buildBind(widget,b)
def buildBind(self,widget,desc):
wid = desc.get('wid','self')
@ -371,6 +354,7 @@ class Blocks(EventDispatcher):
Logger.info('Block: get a null function,%s',str(desc))
return
w.bind(**{event:f})
# Logger.info('Block: %s bind built', str(desc))
def uniaction(self,widget,desc, *args):
Logger.info('Block: uniaction() called, desc=%s', str(desc))

View File

@ -2,9 +2,12 @@
import os
import sys
import signal
import codecs
import json
from appPublic.jsonConfig import getConfig
from appPublic.folderUtils import ProgramPath
from appPublic.uniqueID import getID
from kivy.factory import Factory
from kivy.config import Config
@ -14,6 +17,8 @@ from kivy.clock import Clock
from kivy.logger import Logger
import kivy
import plyer
from kivy.resources import resource_add_path
resource_add_path(os.path.join(os.path.dirname(__file__),'./ttf'))
Config.set('kivy', 'default_font', [
@ -28,6 +33,8 @@ from .pagescontainer import PageContainer
from .blocks import Blocks
from .theming import ThemeManager
from appPublic.rsa import RSA
if platform == 'android':
from jnius import autoclass
class ServerInfo:
def __init__(self):
@ -92,6 +99,44 @@ class BlocksApp(App):
self.on_close()
return x
def get_user_data_path(self):
if platform == 'android':
Environment = autoclass('android.os.Environment')
sdpath = Environment.get_running_app().getExternalStorageDirectory()
return str(sdpath)
sdpath = App.get_running_app().user_data_dir
return str(sdpath)
def get_profile_name(self):
fname = os.path.join(self.get_user_data_path(),'.profile.json')
print('profile_path=', fname)
return fname
def write_profile(self, dic):
fname = self.get_profile_name()
with codecs.open(fname,'w','utf-8') as f:
json.dump(dic,f)
def write_default_profile(self):
device_id = getID()
try:
device_id = plyer.uniqueid.id
except:
pass
d = {
'device_id': device_id
}
self.write_profile(d)
def read_profile(self):
fname = self.get_profile_name()
if not os.path.isfile(fname):
self.write_default_profile()
with codecs.open(fname, 'r', 'utf-8') as f:
d = json.load(f)
return d
def device_info(self, *args):
d = {
"platform":platform,

View File

@ -1,3 +1,4 @@
import math
from kivyblocks.graph import *
from kivy.utils import get_color_from_hex as rgb
from .threadcall import HttpClient
@ -42,7 +43,24 @@ class Chart2d(Graph):
"line":LinePlot,
"hbar":BarPlot
}
graph_theme = {
default_options = {
"x_grid_label":True,
"y_grid_label":True,
"xlabel":"Xlabel",
"ylabel":"Ylabel",
"xmin":0,
"xmax":100,
"ymax":100,
"ymin":1,
"x_grid":True,
"y_grid":True,
"padding":5,
"xlog":False,
"ylog":False,
'x_ticks_minor':1,
'x_ticks_major':5,
"y_ticks_minor":1,
"y_ticks_major":5,
'label_options': {
'color': rgb('444444'), # color of tick labels and titles
'bold': True},
@ -65,33 +83,46 @@ class Chart2d(Graph):
self._data = data
if not self._data:
self._data = self.get_data()
xmax = len(data)
print('_data=',self._data, 'url=', self._dataurl)
xmax = len(self._data)
ymax = 0
xvalues = [ self._data[i][self.x_field] for i in range(xmax) ]
xvalue = [ self._data[i][self.x_field] for i in range(xmax) ]
self._charts = charts
print('charts=', charts)
plots = []
for c in charts:
plotKlass = self.plotmappings.get('charttype')
if not plot:
plotKlass = self.plotmappings.get(c['charttype'])
if not plotKlass:
print('charttype not defined', c)
continue
yvalue = [self._data[i][c['y_field']] for i in range(xmax)]
print('yvalue=', yvalue)
color = rgb(c.get('color','d8d8d8'))
plot = plotKlass(color=color)
plot.points = [(xvalue[i],yvalue[i]) for i in range(xmax)]
plot.points = [(i,yvalue[i]) for i in range(xmax)]
plots.append(plot)
maxv = max(yvalue)
if ymax < maxv:
ymax = maxv
gkw = kw.copy()
gkw['ymax'] = ymax
gkw = self.default_options.copy()
gkw.update(kw)
gkw['ymax'] = math.ceil(ymax)
gkw['y_ticks_minor'] = gkw['ymax'] / 10
gkw['y_ticks_major'] = gkw['ymax'] / 2
gkw['x_ticks_minor'] = 1
if gkw['x_ticks_major'] > xmax:
gkw['x_ticks_major'] = xmax
gkw['xmax'] = xmax
Graph.__init__(self, **kw)
self.ymax = ymax
print('gkw=', gkw)
Graph.__init__(self, **gkw)
print('plots=', plots)
for p in plots:
print('points=', p.points)
self.add_plot(p)
p.bind_to_graph(self)
if hasattr(p,'bind_to_graph'):
p.bind_to_graph(self)
def get_data(self):
hc = HttpClient()

View File

@ -116,6 +116,7 @@ class Row(GridLayout):
self.part.datagrid.row_selected = True
self.part.datagrid.select_rowid = self.row_id
self.part.datagrid.select_row = self
self.part.datagrid.dispatch('on_selected',self)
class Header(WidgetReady, BGColorBehavior, ScrollWidget):
@ -342,7 +343,6 @@ class DataGrid(WidgetReady, BGColorBehavior, BoxLayout):
self.normal_part.body.clearRows()
def add_page(self,o,data):
print('dg.py:add_page() called',data)
ids = []
recs = data['data']
page = data['page']
@ -354,7 +354,6 @@ class DataGrid(WidgetReady, BGColorBehavior, BoxLayout):
for r in recs:
id = self.addRow(r,index=idx)
ids.append(id)
print('rec added',r,id)
self.dataloader.bufferObjects(page,ids)
x = self.dataloader.getLocater()
self.locater(x)
@ -383,7 +382,7 @@ class DataGrid(WidgetReady, BGColorBehavior, BoxLayout):
self.toolbar = Toolbar(ancestor=self,**tb)
def on_selected(self,row):
self.selected_row = row
print("DataGrid():on_selected fire", self.widget_id or 'not widget_id seted')
def loadData(self,**kwargs):
page = kwargs.get('page',1)

View File

@ -311,6 +311,12 @@ class Graph(Widget):
k2 = 0 # position in points minor
for m in range(0, n_ticks):
if minor and m % minor:
if k2 >= len(points_minor):
continue
print('len(points_minor)=', len(points_minor), \
'len(points_major)=',len(points_major), \
'major=', major, 'minor=', minor or 1, \
'k2=',k2, 'n_ticks=', n_ticks)
points_minor[k2] = m * tick_dist + s_min
k2 += 1
else:

View File

@ -14,31 +14,26 @@ class OrientationLayout(WidgetReady, SwipeBehavior, FloatLayout):
def __init__(self, main_widget=None, second_widget=None, **kw):
self.main_widget = main_widget
self.second_widget = second_widget
self.widget_main = main_widget
self.widget_second = second_widget
self.widget_main = None
self.widget_second = None
self.second_flg = False
FloatLayout.__init__(self, **kw)
SwipeBehavior.__init__(self)
WidgetReady.__init__(self)
Clock.schedule_once(self.build_children,0)
self.build_children()
self.bind(on_swipe_left=self.toggle_second)
self.bind(on_swipe_right=self.toggle_second)
self.bind(size=self.on_size_changed)
self.bind(pos=self.on_size_changed)
self.current_orient = None
self.register_event_type('on_orientation_changed')
self.reready()
def build_children(self, *args):
if isinstance(self.main_widget, dict):
blocks = Factory.Blocks()
blocks.bind(on_built=self.main_widget_built)
blocks.bind(on_failed=self.widget_build_failed)
blocks.widgetBuild(self.main_widget)
if isinstance(self.second_widget, dict):
blocks = Factory.Blocks()
blocks.bind(on_built=self.second_widget_built)
blocks.bind(on_failed=self.widget_build_failed)
blocks.widgetBuild(self.second_widget)
blocks = Factory.Blocks()
self.widget_main = blocks.widgetBuild(self.main_widget)
blocks = Factory.Blocks()
self.widget_second = blocks.widgetBuild(self.second_widget)
def isLandscape(self):
return self.width > self.height
@ -106,22 +101,6 @@ class OrientationLayout(WidgetReady, SwipeBehavior, FloatLayout):
self.add_widget(self.widget_main)
self.add_widget(self.widget_second)
def main_widget_built(self,o,w):
print('main_widget_built() called ...')
self.widget_main = w
self.add_widget(self.widget_main)
if isinstance(self.widget_main, Widget) and isinstance(self.widget_second, Widget):
print('ready() called ..')
self.reready()
def second_widget_built(self,o,w):
print('second_widget_built() called ...')
self.widget_second = w
if isinstance(self.widget_main, Widget) and isinstance(self.widget_second, Widget):
print('ready() called ..')
self.reready()
def widget_build_failed(self, o, e):
pass