Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WListBox item selected? #31

Open
mbusch-regis opened this issue Apr 27, 2018 · 5 comments
Open

WListBox item selected? #31

mbusch-regis opened this issue Apr 27, 2018 · 5 comments

Comments

@mbusch-regis
Copy link

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
Copy link
Author

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.

@lethe3000
Copy link

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

@cezarc
Copy link

cezarc commented Sep 1, 2020

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?

@lodenrogue
Copy link

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

@bergercookie
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants