pfalcon/picotui

WListBox item selected?

mbusch-regis opened this issue · 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?

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.

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

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?

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

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