KivyMD
KivyMD copied to clipboard
IconLeftWidget on_press event not working in MDSelectionList
Description of the Bug
IconLeftWidget on_press event works in MDList but not in MDSelectionList.
Code and Logs
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.list import TwoLineAvatarIconListItem, IconLeftWidget, IconRightWidget
KV = '''
MDBoxLayout:
ScrollView:
MDList:
id: mdlist
ScrollView:
MDSelectionList:
id: mdselectionlist
'''
class Example(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
return Builder.load_string(KV)
def on_start(self):
for i in range(10):
listitem = TwoLineAvatarIconListItem(text=f"Two-line item with avatar {i}", secondary_text="MDList")
listitem.add_widget(IconLeftWidget(icon="play-circle-outline", on_press=lambda widget:self.play(widget)))
listitem.add_widget(IconRightWidget(icon="play-circle-outline", on_press=lambda widget:self.play(widget)))
self.root.ids.mdlist.add_widget(listitem)
listitem2 = TwoLineAvatarIconListItem(text=f"Two-line item with avatar {i}", secondary_text="MDSelectionList")
listitem2.add_widget(IconLeftWidget(icon="play-circle-outline", on_press=lambda widget:self.play(widget)))
listitem2.add_widget(IconRightWidget(icon="play-circle-outline", on_press=lambda widget:self.play(widget)))
self.root.ids.mdselectionlist.add_widget(listitem2)
def play(self, widget):
if widget.children[0].icon == "play-circle-outline":
widget.children[0].icon = "stop-circle"
else:
widget.children[0].icon = "play-circle-outline"
Example().run()
Screenshots
KivyMD 1.0.2
KivyMD 0.104.2 (last version when it worked correctly)
Versions
- OS: Windows 10 Pro
- Python: 3.10.0
- Kivy: 2.1.0
- KivyMD: 1.0.2
@Tutislav OK, I'll try to check it out tomorrow.
It seems like SelectionIconCheck is overlapping IconLeftWidget, so it can't be pressed. I might found a temporary solution.
uix/selection/selection.py
class MDSelectionList(MDList):
def add_widget(self, widget, index=0, canvas=None):
selection_icon = SelectionIconCheck(
icon=self.icon,
md_bg_color=self.icon_bg_color,
icon_check_color=self.icon_check_color,
)
container = SelectionItem(
size_hint=(1, None),
height=widget.height,
instance_item=widget,
instance_icon=selection_icon,
overlay_color=self.overlay_color,
progress_round_size=self.progress_round_size,
progress_round_color=self.progress_round_color,
owner=self,
)
container.add_widget(widget)
if not self.icon_pos:
pos = (
dp(12),
container.height / 2 - selection_icon.height / 2,
)
else:
pos = self.icon_pos
selection_icon.pos = pos
container.add_widget(selection_icon)
return super().add_widget(container, index, canvas)
When we replace
container.add_widget(selection_icon)
with
container.add_widget(selection_icon, 1)
it works but SelectionIconCheck is now behind IconLeftWidget.
@Tutislav This is a Kivy bug. Widgets that use scaling actually stay the same size:
https://user-images.githubusercontent.com/16930280/197645630-a3844df4-2ff8-4e91-8d54-fd521c9316cc.mov
The issue is deprecated due to the new API of the KivyMD library 2.0.0 version