KivyMD icon indicating copy to clipboard operation
KivyMD copied to clipboard

IconLeftWidget on_press event not working in MDSelectionList

Open Tutislav opened this issue 1 year ago • 1 comments

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 IconLeftWidget_KivyMD_1.0.2

KivyMD 0.104.2 (last version when it worked correctly) IconLeftWidget_KivyMD_0.104.2

Versions

  • OS: Windows 10 Pro
  • Python: 3.10.0
  • Kivy: 2.1.0
  • KivyMD: 1.0.2

Tutislav avatar Sep 09 '22 18:09 Tutislav

@Tutislav OK, I'll try to check it out tomorrow.

HeaTTheatR avatar Sep 09 '22 18:09 HeaTTheatR

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 avatar Oct 21 '22 10:10 Tutislav

@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

HeaTTheatR avatar Oct 24 '22 22:10 HeaTTheatR