From 979ac006b2a8de8655c54f16979b3f2043a57408 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 17 Dec 2021 00:02:02 +0800 Subject: [PATCH] bugfix --- kivyblocks/clickable.py | 90 +++++++++++++++++++++++++++++------------ kivyblocks/toolbar.py | 31 +++++++++----- 2 files changed, 85 insertions(+), 36 deletions(-) diff --git a/kivyblocks/clickable.py b/kivyblocks/clickable.py index 3e06afb..137d116 100644 --- a/kivyblocks/clickable.py +++ b/kivyblocks/clickable.py @@ -11,9 +11,14 @@ from kivy.properties import NumericProperty, DictProperty, \ from kivyblocks.ready import WidgetReady from kivyblocks.bgcolorbehavior import BGColorBehavior from kivyblocks.utils import CSize -from kivyblocks.baseWidget import Box +from kivyblocks.baseWidget import Box, Text from kivyblocks.widget_css import WidgetCSS +class TinyText(Text): + def on_texture_size(self, o, ts): + self.size = self.texture_size + print('TinyText:texture_size=', self.texture_size) + class ClickableBox(TouchRippleButtonBehavior, Box): def __init__(self, border_width=1, @@ -23,11 +28,10 @@ class ClickableBox(TouchRippleButtonBehavior, Box): border_width, border_width, border_width], - radius=radius, **kw) self.border_width = border_width - self.bind(minimum_height=self.setter('height')) - self.bind(minimum_width=self.setter('width')) + # self.bind(minimum_height=self.setter('height')) + # self.bind(minimum_width=self.setter('width')) def on_press(self,o=None): pass @@ -35,32 +39,53 @@ class ClickableBox(TouchRippleButtonBehavior, Box): class ClickableText(ClickableBox): text = StringProperty(' ') def __init__(self, **kw): + print('ClickableText begin inited') + self.txt_w = None super(ClickableText, self).__init__(**kw) - self.txt_w = Text(text=self.text, i18n=True) - # self.txt_w.size_hint = (None, None) - # self.txt_w.bind(minimum_height=self.self.txt_w.setter('height')) - # self.txt_w.bind(minimum_width=self.self.txt_w.setter('width')) + self.txt_w = TinyText(text=self.text, i18n=True) + self.txt_w.bind(texture_size=self.reset_size) self.add_widget(self.txt_w) + self.txt_w.size_hint = (None, None) + self.txt_w.size = self.txt_w.texture_size + #self.txt_w.bind(minimum_height=self.txt_w.setter('height')) + #self.txt_w.bind(minimum_width=self.txt_w.setter('width')) + print('ClickableText inited') + + def reset_size(self, o, s): + self.size_hint = (None,None) + self.size = self.txt_w.texture_size def on_text(self, o, txt): - self.txt_w.text = txt + print('on_text fired') + if self.txt_w: + self.txt_w.text = self.text + + class ClickableIconText(ClickableText): source = StringProperty(None) img_kw = DictProperty({}) def __init__(self, **kw): - super(ClickableIconText, self).__init__(**kw) self.img_w = None - if source: - self.img_w = AsyncImage(source=self.source, **self.img_kw) - self.add_widget(self.img_w, index=0) + super(ClickableIconText, self).__init__(**kw) + print('ClickableIconText inited') + + def reset_size(self, o, s): + self.size_hint = (None,None) + if self.orientation == 'horizontal': + self.height = max(self.txt_w.texture_size[1], self.img_w.height) + self.width = self.txt_w.texture_size[0] + self.img_w.width + else: + self.height = self.txt_w.texture_size[1] + self.img_w.height + self.width = max(self.txt_w.texture_size[0], self.img_w.width) + def on_source(self, o, source): if self.img_w: self.img_w.source = source return self.img_w = AsyncImage(source=self.source, **self.img_kw) - self.add_widget(self.img_w, index=0) + self.add_widget(self.img_w, index=-1) class ToggleText(ClickableText): """ @@ -91,7 +116,8 @@ class ToggleText(ClickableText): return self.select_state def on_select_state(self, o, f): - self.clscss = self.css_on if f else self.css_off + self.csscls = self.css_on if f else self.css_off + print(f'using {self.csscls}') class ToggleIconText(ToggleText): """ @@ -109,28 +135,38 @@ class ToggleIconText(ToggleText): source = StringProperty(None) img_kw = DictProperty({}) def __init__(self, **kw): - super(ToggleIconText, self).__init__(**kw) self.img_w = None - self.source = source_off + super(ToggleIconText, self).__init__(**kw) + self.source = self.source_off + self.img_w = AsyncImage(source=self.source, **self.img_kw) + self.add_widget(self.img_w, index=-1) + def reset_size(self, o, s): + self.size_hint = (None,None) + if self.orientation == 'horizontal': + self.height = max(self.txt_w.texture_size[1], self.img_w.height) + self.width = self.txt_w.texture_size[0] + self.img_w.width + else: + self.height = self.txt_w.texture_size[1] + self.img_w.height + self.width = max(self.txt_w.texture_size[0], self.img_w.width) + print(f'ToggleIconText:w,h={self.width},{self.height}') + def on_select_state(self, o, f): super(ToggleIconText, self).on_select_state(o,f) - self.source = source_on if f else source_off + self.source = self.source_on if f else self.source_off def on_source(self, o, source): - if not self.img_w: - self.img_w = AsyncImage(self.source, **self.img_kw) - self.add_widget(sef.img_w, index=0) + if self.img_w: + self.img_w.source = self.source class ClickableImage(ClickableBox): source=StringProperty(None) img_kw = DictProperty(None) def __init__(self, **kw): - super(ClickableImage, self).__init__(**kw) self.img_w = None - if source: - self.img_w = AsyncImage(source=self.source, **self.img_kw) - self.add_widget(self.img_w) + super(ClickableImage, self).__init__(**kw) + self.img_w = AsyncImage(source=self.source, **self.img_kw) + self.add_widget(self.img_w) def on_source(self, o, source): if self.img_w: @@ -145,7 +181,7 @@ class ToggleImage(ClickableImage): select_state = BooleanProperty(False) def __init__(self, **kw): super(ToggleImage, self).__init__(**kw) - self.source = source_on + self.source = self.source_on def toggle(self): self.select_state = False if self.select_state else True @@ -166,9 +202,11 @@ class ToggleImage(ClickableImage): self.source = self.source_off r = Factory.register +r('TinyText', TinyText) r('ClickableBox', ClickableBox) r('ClickableText',ClickableText) r('ClickableIconText',ClickableIconText) r('ToggleText',ToggleText) r('ToggleIconText',ToggleIconText) r('ClickableImage',ClickableImage) +r('ToggleImage',ToggleImage) diff --git a/kivyblocks/toolbar.py b/kivyblocks/toolbar.py index c34c781..79321cc 100644 --- a/kivyblocks/toolbar.py +++ b/kivyblocks/toolbar.py @@ -9,7 +9,7 @@ from kivy.uix.widget import Widget from kivy.app import App from kivy.clock import Clock from kivy.factory import Factory -from kivy.properties import StringProperty +from kivy.properties import StringProperty, ListProperty, NumericProperty from appPublic.dictObject import DictObject from appPublic.registerfunction import RegisterFunction @@ -19,6 +19,7 @@ from .utils import * from .ready import WidgetReady from .color_definitions import getColors from .baseWidget import Text, Box +from .scrollpanel import ScrollPanel from .toggleitems import ToggleItems """ @@ -130,7 +131,7 @@ Toolpage options """ -class ScrollToolbar(ToolbarPanel): +class ScrollToolbar(ScrollPanel): """ tool has the follow attributes { @@ -145,35 +146,37 @@ class ScrollToolbar(ToolbarPanel): "img_width_c":image width in charecter size "css_on", "css_off", - "orient":"V" or "H" "tools": + "tool_orient" } """ css_on = StringProperty('default') css_off = StringProperty('default') tools = ListProperty([]) + tool_orient = StringProperty('horizontal') img_height_c = NumericProperty(2) img_width_c = NumericProperty(2) def __init__(self, **kw): + print('#############init begin##########') super(ScrollToolbar, self).__init__(**kw) + print('#############super init end##########') self.register_event_type('on_press') self.w_dic = {} - - def on_tools(self, o, tools): for t in self.tools: label = t.get('label') source_on = t.get('source_on', t.get('img_src',None)) source_off = t.get('source_off', t.get('img_src', None)) ToggleIconText = Factory.ToggleIconText ToggleText = Factory.ToggleText - ToggleIcon = Factory.ToggleIcon + ToggleImage = Factory.ToggleImage if label and source_on: w = ToggleIconText(css_on=self.css_on, css_off=self.css_off, text=label, source_on=source_on, source_off=source_off, + orientation=self.tool_orient, img_kw={ "size_hint":(None, None), "height":CSize(self.img_height_c), @@ -183,14 +186,16 @@ class ScrollToolbar(ToolbarPanel): elif label: w = ToggleText(css_on=self.css_on, css_off=self.css_off, + orientation=self.tool_orient, text=label) elif source_on: - w = ToggleIcon( source_on=source_on, + w = ToggleImage( source_on=source_on, source_off=source_off, + orientation=self.tool_orient, img_kw={ "size_hint":(None, None), "height":CSize(self.img_height_c), - "width":"CSize(self.img_width_c) + "width":CSize(self.img_width_c) } ) @@ -260,6 +265,12 @@ class ToolPage(BoxLayout): self.toolbar.height = self.height self.content.height = self.height self.content.width = self.width - self.toolbar.width + print(f'tb-width={self.toolbar.width}') + print(f'tb-height={self.toolbar.height}') + print(f'c-height={self.content.height}') + print(f'c-width={self.content.width}') + print(f'height={self.height}') + print(f'width={self.width}') def init(self): self.initFlag = True @@ -267,8 +278,8 @@ class ToolPage(BoxLayout): self.content = BoxLayout() self.content.widget_id = 'content' opts = {} - opts['img_height_c"] = self.img_size, - opts['img_width_c"] = self.img_size, + opts['img_height_c'] = self.img_size + opts['img_width_c'] = self.img_size opts['css_on'] = self.actived_css opts['css_off'] = self.normal_css opts['orient'] = 'H'