From db03b70792834e4a143e3e31edeef2898119651c Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 7 Dec 2021 09:04:54 +0800 Subject: [PATCH] bugfix --- kivyblocks/clickable.py | 33 +++++++++++++++++++++++++-- kivyblocks/multi_select.py | 46 +++++++++++++++++--------------------- kivyblocks/register.py | 3 +++ 3 files changed, 55 insertions(+), 27 deletions(-) diff --git a/kivyblocks/clickable.py b/kivyblocks/clickable.py index 2f75cc9..52957c6 100644 --- a/kivyblocks/clickable.py +++ b/kivyblocks/clickable.py @@ -59,6 +59,18 @@ class ToggleText(ClickableText): def __init__(self, **kw): super(ToggleText, self).__init__(**kw) + def toggle(self): + self.select_state = False if self.select_state else True + + def select(self, flag): + if flag: + self.select_state = True + else: + self.select_state = False + + def state(self): + return self.select_state + def on_press(self, o=None): self.select_state = False if self.select_state else True @@ -90,18 +102,35 @@ class ToggleImage(ClickableImage): def __init__(self, **kw): super(ToggleImage, self).__init__(**kw) + def toggle(self): + self.select_state = False if self.select_state else True + + def select(self, flag): + if flag: + self.select_state = True + else: + self.select_state = False + + def state(self): + return self.select_state + def on_press(self, o): self.select_state = False if self.select_state else True def on_select_state(self, o, f): if self.img_w: - if f: + if self.select_state and self.on_source is not None: self.img_w.source = self.on_source else: self.img_w.source = self.source return - if f: + if self.select_state and self.on_source is not None: self.img_w = AsyncImage(source=self.on_source) else: self.img_w = AsyncImage(source=self.source) +r = Factory.register +r('ClickableBox', ClickableBox) +r('ClickableText',ClickableText) +r('ToggleText',ToggleText) +r('ClickableImage',ClickableImage) diff --git a/kivyblocks/multi_select.py b/kivyblocks/multi_select.py index 3b85410..e395bbb 100644 --- a/kivyblocks/multi_select.py +++ b/kivyblocks/multi_select.py @@ -2,6 +2,7 @@ from kivy.properties import BooleanProperty, StringProperty,\ ListProperty, DictProperty from kivyblocks.baseWidgets import VBox, PressableText from kivyblocks.typewriterbox import TypeWriterBox +from kivy.factory import Factory class MultiSelect(TypeWriterBox): items = ListProperty([]) @@ -14,7 +15,18 @@ class MultiSelect(TypeWriterBox): super(MultiSelectBotton, self).__init__(**kw) self.button_dic = {} self.value_b = {} - self.button_state = {} + + def buildItem(self, dic): + keys = dic.keys() + ToggleText = Factory.ToggleText + ToggleImage = Factory.ToggleImage + if 'text' in keys and 'value' in keys: + desc = dic.copy() + desc['off_css'] = self.item_css + desc['on_css'] = self.item_selected_css + return ToggleText(**desc) + if 'source' in keys and 'on_source' in keys: + return ToggleImage(**dic) def on_items(self, o, items): self.clear_widgets() @@ -28,37 +40,22 @@ class MultiSelect(TypeWriterBox): else: items.append(dic) for item in items: - dic = item.copy() - if item['name'] in self.default_selected: - dic['clscss'] = self.item_selected_cls - state = 'selected' - else: - dic['clscss'] = self.item_cls - state = 'unselected' - b = PressableText(dic) + b = self.buildItem(item) b.bind(on_press=self.button_pressed) self.button_dic.update({b:dic}) self.value_b.update({dic['value']:b}) - self.button_state.update({b:state}) def button_pressed(self, o): - if self.button_state[o] == 'selected': - o.clscss = item_cls - self.button_state.update({o:'unselected'}) - else: - o.clscss = item_selected_cls - self.button_state.update({o:'selected'}) - if self.button_dic[o]['value'] == '_all_' \ - and self.button_state[o] == 'selected': - for b, state in self.button_state.copy().items(): + o.toggle() + if self.button_dic[o]['value'] == '_all_' and o.state(): + for b, dic in self.button_dic.copy().items(): if b == o: continue - b.clscss = item_cls - self.button_state.update({b:'unselected'}) + b.select(False) def getValue(self): - selected_buttons = [ b for b,state in self.button_state.item() \ - if state == 'selected' ] + selected_buttons = [ b for b in self.button_dic.item() \ + if b.state() ] r = [ dic['value'] for b, dic in self.button_dic.items() \ if b in selected_buttons ] return r @@ -66,7 +63,6 @@ class MultiSelect(TypeWriterBox): def setValue(self, value): for v in value: b = self.value_b[v] - self.button_state[b] = 'selected' - b.clscss = item_selected_cls + b.select(True) diff --git a/kivyblocks/register.py b/kivyblocks/register.py index 57f8b29..c3f004f 100644 --- a/kivyblocks/register.py +++ b/kivyblocks/register.py @@ -4,6 +4,9 @@ from kivy.uix.textinput import TextInput from appPublic.registerfunction import RegisterFunction +import kivyblocks.clickable +import kivyblocks.multi-select + from .baseWidget import * from .tree import Tree, TextTree, MenuTree, PopupMenu from .toolbar import ToolPage, Toolbar