picotui icon indicating copy to clipboard operation
picotui copied to clipboard

WListBox item selected?

Open mbusch-regis opened this issue 8 years ago • 5 comments

I'm trying to make a simple file chooser dialog using a listbox. I can catch the changed event and get the text of the highlighted item just fine, but how would I know if the user "selected" that item by pressing the enter key?

mbusch-regis avatar Apr 27 '18 06:04 mbusch-regis

Never mind. I'm an idiot. I still had a local subclass of WListBox in my code file, but trying to use one in a separate file.

mbusch-regis avatar Apr 27 '18 15:04 mbusch-regis

Hi, could you show your code to handle listbox 'changed' and 'selected' please, I'm also working on this, thank you

lethe3000 avatar Aug 07 '19 03:08 lethe3000

The "click" and "selected" events for seems to not work for WListBox. What event should I grab to have the information that user pressed Enter while browsing the list?

cezarc avatar Sep 01 '20 20:09 cezarc

The "click" and "selected" events for seems to not work for WListBox. What event should I grab to have the information that user pressed Enter while browsing the list?

Same question

lodenrogue avatar May 08 '21 16:05 lodenrogue

Is this what you are looking for?

class WListCheckbox(WListBox):
    def __init__(self, w, h, items):
        super().__init__(w, h, items)
        self.item_selected: List[bool] = [False for _ in items]
        self.prefix_selected = "[X] "
        self.prefix_unselected = "[ ] "

    def handle_key(self, key):
        res = super().handle_key(key)
        self.choice = self.cur_line
        if key == b" ":
            self.flip()

        self.redraw()
        self.signal("changed")
        return res

    def flip(self):
        """Flip the currently selected choice"""
        self.item_selected[self.choice] = not self.item_selected[self.choice]
        self.redraw()
        self.signal("changed")

    def show_line(self, l, i):
        is_selected = self.item_selected[i]

        # highlight current line
        hlite = self.cur_line == i
        if hlite:
            if self.focus:
                self.attr_color(C_B_WHITE, C_GREEN)
            else:
                self.attr_color(C_BLACK, C_GREEN)

        # differentiate between selected and unselected lines
        if i != -1:
            prefix = self.prefix_selected if is_selected else self.prefix_unselected
            l = prefix + l
            l = self.render_line(l)[: self.width]

            if is_selected and not hlite:
                self.attr_color(C_YELLOW)
            self.wr(l)
            self.attr_reset()

        self.clear_num_pos(self.width - len(l))
        if hlite:
            self.attr_reset()

    def handle_mouse(self, x, y):
        res = super().handle_mouse(x, y)
        self.choice = self.cur_line
        self.flip()
        self.redraw()
        self.signal("changed")
        return res

When you either click on an item or you're pressing space while having it selected it gets selected. You can find all the selected item indices by querying the instance selected_items variable

1625388173-screenshot 1625388166-screenshot

bergercookie avatar Jul 04 '21 08:07 bergercookie