This commit is contained in:
yumoqing 2022-01-29 22:54:46 +08:00
parent 87b17d287f
commit c1b7768fdd
3 changed files with 20 additions and 173 deletions

View File

@ -24,20 +24,27 @@ from kivy.app import App
from kivy.factory import Factory from kivy.factory import Factory
from kivy.utils import platform from kivy.utils import platform
from kivy.uix.boxlayout import BoxLayout from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Fbo from kivy.graphics import Fbo, Color, Rectangle
from .responsivelayout import VResponsiveLayout from .responsivelayout import VResponsiveLayout
from .toolbar import Toolbar from .toolbar import Toolbar
from .paging import Paging, RelatedLoader from .paging import Paging, RelatedLoader
from .utils import CSize from .utils import CSize
from .ready import WidgetReady from .ready import WidgetReady
from .baseWidget import VBox
class BoxViewer(WidgetReady, BoxLayout): class BoxViewer(VBox):
toolbar = DictProperty(None)
dataloader = DictProperty(None)
boxwidth = NumericProperty(0.48)
boxheight = NumericProperty(None)
viewer = DictProperty(None)
viewer_url = StringProperty(None)
viewer_css = StringProperty('viewer_css')
def __init__(self, **options): def __init__(self, **options):
self.options = options self.options = options
self.subwidgets = [] self.subwidgets = []
self.toolbar = None self.toolbar = None
self.parenturl = None
self.dataloader = None self.dataloader = None
self.initflag = False self.initflag = False
remind = ['toolbar', remind = ['toolbar',
@ -45,44 +52,33 @@ class BoxViewer(WidgetReady, BoxLayout):
'orientation', 'orientation',
'boxwidth', 'boxwidth',
'boxheight', 'boxheight',
'color_level',
'radius',
'viewer_url', 'viewer_url',
'viewer' 'viewer'
] ]
kwargs = {k:v for k,v in options.items() if k not in remind } SUPER(BoxViewer, self, options)
print('BoxViewer():kwargs=',kwargs)
BoxLayout.__init__(self, orientation='vertical', **kwargs)
WidgetReady.__init__(self)
self.selected_data = None self.selected_data = None
self.radius = self.options.get('radius',[]) self.box_width = CSize(self.boxwidth)
self.box_width = CSize(options['boxwidth']) self.box_height = CSize(self.boxheight)
self.box_height = CSize(options['boxheight'])
self.viewContainer = VResponsiveLayout(box_width=self.box_width) self.viewContainer = VResponsiveLayout(box_width=self.box_width)
if options.get('toolbar'): if self.toolbar:
self.toolbar = Toolbar(options['toolbar']) self.toolbar_w = Toolbar(self.toolbar)
lopts = options['dataloader'].copy() lopts = self.dataloader.get('options', {}).copy()
if lopts.get('options'):
lopts = lopts.get('options')
self.dataloader = RelatedLoader(target=self,**lopts) self.dataloader = RelatedLoader(target=self,**lopts)
self.dataloader.bind(on_deletepage=self.deleteWidgets) self.dataloader.bind(on_deletepage=self.deleteWidgets)
self.dataloader.bind(on_pageloaded=self.addPageWidgets) self.dataloader.bind(on_pageloaded=self.addPageWidgets)
self.dataloader.bind(on_newbegin=self.deleteAllWidgets) self.dataloader.bind(on_newbegin=self.deleteAllWidgets)
self.params = self.options['dataloader']['options'].get('params',{}) self.params = lopts.get('params',{})
if self.toolbar: if self.toolbar_w:
self.add_widget(self.toolbar) self.add_widget(self.toolbar_w)
if self.dataloader.widget: if self.dataloader.widget:
self.add_widget(self.dataloader.widget) self.add_widget(self.dataloader.widget)
self.dataloader.bind(on_submit=self.getParams) self.dataloader.widget.bind(on_submit=self.getParams)
self.add_widget(self.viewContainer) self.add_widget(self.viewContainer)
self.register_event_type('on_selected') self.register_event_type('on_selected')
self.bind(size=self.resetCols, self.bind(size=self.resetCols,
pos=self.resetCols) pos=self.resetCols)
self.viewContainer.bind(on_scroll_stop=self.on_scroll_stop) self.viewContainer.bind(on_scroll_stop=self.on_scroll_stop)
# use_keyboard() will block the python
# no reason !!!!
# self.use_keyboard()
def key_handle(self,keyinfo): def key_handle(self,keyinfo):
print('keyinfo=',keyinfo,'...................') print('keyinfo=',keyinfo,'...................')

View File

@ -1,133 +0,0 @@
import math
from kivyblocks.graph import *
from kivy.utils import get_color_from_hex as rgb
from .threadcall import HttpClient
class Chart2d(Graph):
"""
json format:
{
"widgettype":"Chart2d",
"options":{
"xlabel":"Xlabel",
"ylable":"Ylabel",
"x_ticks_minor":1,
"x_ticks_major":5,
"y_ticks_minor":1,
"y_ticks_major":5,
"x_grid_label":true,
"y_grid_label":true,
"padding":5,
"xlog":false,
"ylog":false,
"x_grid":true,
"y_grid":true,
"xmin":0,
"xmax":100,
"ymax":100,
"ymin":1,
"x_field":"xxx",
"dataurl":"xxx",
"charts":[
{
"y_field":"yy",
"color":"efefef",
"charttype":"LinePlot"
}
]
}
}
"""
plotmappings={
"line":LinePlot,
"hbar":BarPlot
}
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},
'background_color': rgb('f8f8f2'), # canvas background color
'tick_color': rgb('808080'), # ticks and grid
'border_color': rgb('808080') # border drawn around each graph
}
def __init__(self, dataurl='',
data=None,
x_field='',
params={},
headers={},
charts=[],
**kw):
self._dataurl = dataurl
self._params = params
self._headers = {}
self.x_field = x_field
self._data = data
if not self._data:
self._data = self.get_data()
print('_data=',self._data, 'url=', self._dataurl)
xmax = len(self._data)
ymax = 0
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(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 = [(i,yvalue[i]) for i in range(xmax)]
plots.append(plot)
maxv = max(yvalue)
if ymax < maxv:
ymax = maxv
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
print('gkw=', gkw)
Graph.__init__(self, **gkw)
print('plots=', plots)
for p in plots:
print('points=', p.points)
self.add_plot(p)
if hasattr(p,'bind_to_graph'):
p.bind_to_graph(self)
def get_data(self):
hc = HttpClient()
d = hc.get(self._dataurl,
params=self._params,
headers=self._headers)
return d

View File

@ -23,11 +23,7 @@ from .tab import TabsPanel
from .qrdata import QRCodeWidget from .qrdata import QRCodeWidget
# from .kivycamera import KivyCamera # from .kivycamera import KivyCamera
from .filebrowser import FileLoaderBrowser from .filebrowser import FileLoaderBrowser
from .graph import Graph, MeshLinePlot, MeshStemPlot, LinePlot, \
SmoothLinePlot, ContourPlot, BarPlot, HBar, VBar, ScatterPlot, \
PointPlot
from .mapview import MapView from .mapview import MapView
from .chart2d import Chart2d
from .message import Conform from .message import Conform
from .pagepanel import PagePanel from .pagepanel import PagePanel
from .markdown import Markdown from .markdown import Markdown
@ -59,19 +55,7 @@ r('QrReader', QrReader)
r('Markdown', Markdown) r('Markdown', Markdown)
r('PagePanel', PagePanel) r('PagePanel', PagePanel)
r('Conform', Conform) r('Conform', Conform)
r('Chart2d', Chart2d)
r('Popup', Popup) r('Popup', Popup)
r('Graph', Graph)
r('MeshLinePlot', MeshLinePlot)
r('MeshStemPlot', MeshStemPlot)
r('LinePlot', LinePlot)
r('SmoothLinePlot', SmoothLinePlot)
r('ContourPlot', ContourPlot)
r('BarPlot', BarPlot)
r('HBar', HBar)
r('VBar', VBar)
r('ScatterPlot', ScatterPlot)
r('PointPlot', PointPlot)
r('MapView', MapView) r('MapView', MapView)
r('DataGrid',DataGrid) r('DataGrid',DataGrid)
r('FileLoaderBrowser',FileLoaderBrowser) r('FileLoaderBrowser',FileLoaderBrowser)