bugfix
This commit is contained in:
parent
1d4161e516
commit
0e748ceff8
@ -71,6 +71,7 @@ from .tab import TabsPanel
|
||||
from .qrdata import QRCodeWidget
|
||||
from .threadcall import HttpClient
|
||||
from .i18n import I18n
|
||||
from .utils import CSize
|
||||
|
||||
if platform == 'android':
|
||||
from .widgetExt.phonebutton import PhoneButton
|
||||
@ -82,17 +83,75 @@ class WrapText(Label):
|
||||
self.bind(width=lambda *x: self.setter('text_size')(self, (self.width, None)),
|
||||
texture_size=lambda *x: self.setter('height')(self, self.texture_size[1]))
|
||||
|
||||
class Box(BGColorBehavior, BoxLayout):
|
||||
def __init__(self,color_level=-1,radius=[],**kw):
|
||||
BoxLayout.__init__(self, **kw)
|
||||
BGColorBehavior.__init__(self, color_level=color_level,
|
||||
radius=radius)
|
||||
|
||||
def add_widget(self, w, *args, **kw):
|
||||
super().add_widget(w, *args, **kw)
|
||||
self.setWidgetTextColor(w)
|
||||
|
||||
def setWidgetTextColor(self,w):
|
||||
if isinstance(w,Box):
|
||||
return
|
||||
|
||||
if isinstance(w,Text):
|
||||
if not w.bgcolor:
|
||||
w.color = self.fgcolor
|
||||
return
|
||||
for c in w.children:
|
||||
self.setWidgetTextColor(c)
|
||||
|
||||
def selected(self):
|
||||
super().selected()
|
||||
if self.fgcolor == self.selected_fgcolor:
|
||||
return
|
||||
for c in self.children:
|
||||
self.setWidgetTextColor(c)
|
||||
|
||||
def unselected(self):
|
||||
super().unselected()
|
||||
if self.fgcolor == self.normal_fgcolor:
|
||||
return
|
||||
for c in self.children:
|
||||
self.setWidgetTextColor(c)
|
||||
|
||||
class HBox(Box):
|
||||
def __init__(self,**kw):
|
||||
kw.update({'orientation':'horizontal'})
|
||||
Box.__init__(self, **kw)
|
||||
|
||||
|
||||
class VBox(Box):
|
||||
def __init__(self,color_level=-1,radius=[],**kw):
|
||||
kw.update({'orientation':'vertical'})
|
||||
Box.__init__(self, **kw)
|
||||
|
||||
class Text(Label):
|
||||
lang=StringProperty('')
|
||||
otext = StringProperty('')
|
||||
def __init__(self,i18n=False, textype='text', wrap=False, **kw):
|
||||
def __init__(self,i18n=False, texttype='text', wrap=False,
|
||||
fgcolor=None, **kw):
|
||||
|
||||
fontsize={'font_size':CSize(1)}
|
||||
offset={
|
||||
'text':0,
|
||||
'title1':CSize(0.6),
|
||||
'title2':CSize(0.5),
|
||||
'title3':CSize(0.4),
|
||||
'title4':CSize(0.3),
|
||||
'title5':CSize(0.2),
|
||||
'title6':CSize(0.1),
|
||||
}
|
||||
fontsize = {'font_size': CSize(1) + offset.get(texttype,0)}
|
||||
self._i18n = i18n
|
||||
self.bgcolor = fgcolor
|
||||
kwargs = kw.copy()
|
||||
config = getConfig()
|
||||
self.wrap = wrap
|
||||
if config.texttypes:
|
||||
attrs = config.texttypes.get('texttype',{})
|
||||
kwargs.update(attrs)
|
||||
kwargs.update(fontsize)
|
||||
super().__init__(**kwargs)
|
||||
if self._i18n:
|
||||
self.i18n = I18n()
|
||||
@ -101,6 +160,8 @@ class Text(Label):
|
||||
if self.wrap:
|
||||
font_size = self.font_size
|
||||
self.text_size = self.width, None
|
||||
if self.bgcolor:
|
||||
self.color = self.bgcolor
|
||||
|
||||
def on_size(self,o,size):
|
||||
# super().on_size(o,size)
|
||||
@ -120,6 +181,62 @@ class Text(Label):
|
||||
def on_lang(self,o,lang):
|
||||
self.text = self.i18n(self.otext)
|
||||
|
||||
class Title1(Text):
|
||||
def __init__(self, **kw):
|
||||
kw.update({'texttype':'title1','bold':True})
|
||||
Text.__init__(self, **kw)
|
||||
|
||||
class Title2(Text):
|
||||
def __init__(self, **kw):
|
||||
kw.update({'texttype':'title2','bold':True})
|
||||
Text.__init__(self, **kw)
|
||||
|
||||
class Title3(Text):
|
||||
def __init__(self, **kw):
|
||||
kw.update({'texttype':'title3','bold':True})
|
||||
Text.__init__(self, **kw)
|
||||
|
||||
class Title4(Text):
|
||||
def __init__(self, **kw):
|
||||
kw.update({'texttype':'title4','bold':True})
|
||||
Text.__init__(self, **kw)
|
||||
|
||||
class Title5(Text):
|
||||
def __init__(self, **kw):
|
||||
kw.update({'texttype':'title5','bold':True})
|
||||
Text.__init__(self, **kw)
|
||||
|
||||
class Title6(Text):
|
||||
def __init__(self, **kw):
|
||||
kw.update({'texttype':'title6','bold':True})
|
||||
Text.__init__(self, **kw)
|
||||
|
||||
class Modal(BGColorBehavior, ModalView):
|
||||
def __init__(self, auto_open=False, color_level=-1, radius=[], **kw):
|
||||
kw.update({'auto_dismiss':False})
|
||||
ModalView.__init__(self, **kw)
|
||||
BGColorBehavior.__init__(self, color_level=color_level,
|
||||
radius=radius)
|
||||
self.auto_open = auto_open
|
||||
if self.auto_open:
|
||||
self.open()
|
||||
|
||||
class TimedModal(Modal):
|
||||
def __init__(self, show_time=5, **kw):
|
||||
self.show_time = show_time
|
||||
self.time_task = None
|
||||
Modal.__init__(self, **kw)
|
||||
|
||||
def open(self, *args, **kw):
|
||||
self.time_task = Clock.schedule_once(self.dismiss, self.show_time)
|
||||
super().open(*args, **kw)
|
||||
|
||||
def dismiss(self, *args, **kw):
|
||||
if self.time_task:
|
||||
self.time_task.cancel()
|
||||
self.time_task = None
|
||||
super().dismiss(*args, **kw)
|
||||
|
||||
class PressableImage(ButtonBehavior,AsyncImage):
|
||||
def on_press(self):
|
||||
pass
|
||||
|
@ -6,12 +6,12 @@ from .color_definitions import getColors
|
||||
_logcnt = 0
|
||||
class BGColorBehavior(object):
|
||||
def __init__(self, color_level=-1,radius=[],**kwargs):
|
||||
if color_level==-1:
|
||||
color_level = 0
|
||||
self.color_level = color_level
|
||||
self.radius = radius
|
||||
self.bgcolor = []
|
||||
self.fgcolor = []
|
||||
self.useOwnColor = False
|
||||
if color_level != -1:
|
||||
fg,bg= getColors(color_level)
|
||||
self.fgcolor = fg
|
||||
self.bgcolor = bg
|
||||
@ -20,34 +20,11 @@ class BGColorBehavior(object):
|
||||
fg,bg= getColors(color_level,selected=True)
|
||||
self.selected_bgcolor = bg
|
||||
self.selected_fgcolor = fg
|
||||
self.useOwnColor = True
|
||||
self.on_bgcolor()
|
||||
|
||||
self.bind(size=self.onSize_bgcolor_behavior,
|
||||
pos=self.onSize_bgcolor_behavior)
|
||||
|
||||
def useAcestorColor(self,selected=False):
|
||||
p = self.parent
|
||||
cnt = 0
|
||||
while p:
|
||||
if isinstance(p,BGColorBehavior) and p.useOwnColor:
|
||||
if selected:
|
||||
self.bgcolor = p.selected_bgcolor
|
||||
self.color = self.fgcolor = p.selected_fgcolor
|
||||
else:
|
||||
self.bgcolor = p.normal_bgcolor
|
||||
self.color = self.fgcolor = p.normal_fgcolor
|
||||
self.on_bgcolor()
|
||||
return
|
||||
p = p.parent
|
||||
cnt += 1
|
||||
if cnt > 100:
|
||||
break
|
||||
fg,bg= getColors(0,selected=selected)
|
||||
self.bgcolor = bg
|
||||
self.color = self.fgcolor = fg
|
||||
self.on_bgcolor()
|
||||
|
||||
def onSize_bgcolor_behavior(self,o,v=None):
|
||||
if not hasattr(self,'rect'):
|
||||
self.on_bgcolor()
|
||||
@ -72,21 +49,15 @@ class BGColorBehavior(object):
|
||||
print('on_bgcolor():self.canvas is None')
|
||||
|
||||
def selected(self):
|
||||
if self.useOwnColor:
|
||||
if self.bgcolor == self.selected_bgcolor:
|
||||
return
|
||||
self.bgcolor = self.selected_bgcolor
|
||||
self.color = self.fgcolor = self.selected_fgcolor
|
||||
self.on_bgcolor()
|
||||
else:
|
||||
self.useAcestorColor(selected=True)
|
||||
|
||||
def unselected(self):
|
||||
if self.useOwnColor:
|
||||
if self.bgcolor == self.normal_bgcolor:
|
||||
return
|
||||
self.bgcolor = self.normal_bgcolor
|
||||
self.color = self.fgcolor = self.normal_fgcolor
|
||||
self.on_bgcolor()
|
||||
else:
|
||||
self.useAcestorColor(selected=False)
|
||||
|
@ -361,6 +361,7 @@ class Blocks(EventDispatcher):
|
||||
w = Blocks.getWidgetById(desc.get('wid','self'),from_widget=widget)
|
||||
if not w:
|
||||
print(desc.get('wid','self'),'not found via Blocks.getWidgetById()')
|
||||
return
|
||||
event = desc.get('event')
|
||||
if event is None:
|
||||
return
|
||||
@ -532,22 +533,34 @@ class Blocks(EventDispatcher):
|
||||
|
||||
@classmethod
|
||||
def getWidgetById(self,id,from_widget=None):
|
||||
app = App.get_running_app()
|
||||
if id in ['root','/self']:
|
||||
print('return app.root',app.root)
|
||||
return app.root
|
||||
def find_widget_by_id(id, from_widget=None):
|
||||
if id=='self':
|
||||
return from_widget
|
||||
if from_widget is None:
|
||||
from_widget = app.root
|
||||
if hasattr(from_widget,'widget_id'):
|
||||
if from_widget.widget_id == id:
|
||||
return from_widget
|
||||
if hasattr(from_widget, id):
|
||||
w = getattr(from_widget,id)
|
||||
if isinstance(w,Widget):
|
||||
return w
|
||||
for c in from_widget.children:
|
||||
ret = Blocks.getWidgetById(id,from_widget=c)
|
||||
ret = find_widget_by_id(id,from_widget=c)
|
||||
if ret:
|
||||
return ret
|
||||
return None
|
||||
ids = id.split('.')
|
||||
app = App.get_running_app()
|
||||
if id.startswith('/self') or id.startswith('root'):
|
||||
from_widget = app.root
|
||||
ids[0] = 'self'
|
||||
if from_widget is None:
|
||||
from_widget = app.root
|
||||
for id in ids:
|
||||
w = find_widget_by_id(id,from_widget=from_widget)
|
||||
if w is None:
|
||||
return None
|
||||
from_widget = w
|
||||
return w
|
||||
|
||||
def on_built(self,v=None):
|
||||
return
|
||||
|
@ -359,8 +359,7 @@ level_bg_colors = [
|
||||
]
|
||||
|
||||
text_colors = {
|
||||
'normal':['eeeeee','111111'],
|
||||
'highlight':['ffffff','000000']
|
||||
'normal':['ffff99','8b210c'],
|
||||
}
|
||||
|
||||
def getConfigStyle():
|
||||
|
@ -5,10 +5,12 @@ from kivy.uix.button import Button
|
||||
from kivy.uix.label import Label
|
||||
from kivy.app import App
|
||||
from .utils import CSize
|
||||
from .bgcolorbehavior import BGColorBehavior
|
||||
|
||||
class PageContainer(FloatLayout):
|
||||
class PageContainer(BGColorBehavior, FloatLayout):
|
||||
def __init__(self,**kw):
|
||||
super().__init__(**kw)
|
||||
FloatLayout.__init__(self, **kw)
|
||||
BGColorBehavior.__init__(self)
|
||||
self.show_back = True
|
||||
self.pageWidgets = []
|
||||
self.backButton = Button(text='<',size_hint=(None,None),
|
||||
|
@ -54,6 +54,16 @@ r('HostImage',HostImage)
|
||||
r('APlayer',APlayer)
|
||||
r('WrapText',WrapText)
|
||||
r('PressableBox',PressableBox)
|
||||
r('Title1',Title1)
|
||||
r('Title2',Title2)
|
||||
r('Title3',Title3)
|
||||
r('Title4',Title4)
|
||||
r('Title5',Title5)
|
||||
r('Title6',Title6)
|
||||
r('Modal',Modal)
|
||||
r('TimedModal',TimedModal)
|
||||
r('HBox',HBox)
|
||||
r('VBox',VBox)
|
||||
r('ToggleItems',ToggleItems)
|
||||
if platform == 'android':
|
||||
r('PhoneButton',PhoneButton)
|
||||
|
@ -7,21 +7,22 @@ from kivy.factory import Factory
|
||||
from kivyblocks.ready import WidgetReady
|
||||
from kivyblocks.bgcolorbehavior import BGColorBehavior
|
||||
from kivyblocks.utils import CSize
|
||||
from kivyblocks.baseWidget import Box
|
||||
|
||||
class PressableBox(BGColorBehavior, TouchRippleButtonBehavior, BoxLayout):
|
||||
class PressableBox(TouchRippleButtonBehavior, Box):
|
||||
def __init__(self,border_width=1,
|
||||
color_level=-1,
|
||||
user_data=None,
|
||||
radius=[],
|
||||
**kw):
|
||||
BoxLayout.__init__(self, padding=[border_width,
|
||||
Box.__init__(self, padding=[border_width,
|
||||
border_width,
|
||||
border_width,
|
||||
border_width],
|
||||
color_level=color_level,
|
||||
radius=radius,
|
||||
**kw)
|
||||
TouchRippleButtonBehavior.__init__(self)
|
||||
BGColorBehavior.__init__(self,color_level=color_level,
|
||||
radius=radius)
|
||||
self.border_width = border_width
|
||||
self.user_data = user_data
|
||||
self.unselected()
|
||||
|
Loading…
Reference in New Issue
Block a user