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

Multiple objects in a box #95

Open
Wieves opened this issue Apr 2, 2020 · 1 comment
Open

Multiple objects in a box #95

Wieves opened this issue Apr 2, 2020 · 1 comment

Comments

@Wieves
Copy link

Wieves commented Apr 2, 2020

Hi!
I've seen old posts about putting widget in a BoxTitle (https://groups.google.com/forum/#!topic/npyscreen/0m87zQ9kdtU)
Is-it possible to add multiple objects in a BoxTitle?
Thanks!

@halbachj
Copy link

halbachj commented May 24, 2020

It is possibille, but I don't knwo if it is a good idea. I had to try it to, so...

class Window(npyscreen.BoxTitle):
    _contained_widget = npyscreen.DummyWidget

    def __init__(self, screen, contained_widget_arguments=None, *args, **keywords):
        super(Window, self).__init__(screen, *args, **keywords)
        self.wg_relx = self.relx
        self.wg_rely = self.rely

        if contained_widget_arguments:
            self.make_contained_widget(contained_widget_arguments=contained_widget_arguments)
        else:
            self.make_contained_widget()
        if 'editable' in keywords:
            self.entry_widget.editable = keywords['editable']
        if 'value' in keywords:
            self.value = keywords['value']
        if 'values' in keywords:
            self.values = keywords['values']
        if 'scroll_exit' in keywords:
            self.entry_widget.scroll_exit = keywords['scroll_exit']
        if 'slow_scroll' in keywords:
            self.entry_widget.scroll_exit = keywords['slow_scroll']

    def insert_widget(self, widget, **widget_arguments):
        if self._my_widgets == npyscreen.DummyWidget:
            self._my_widgets.clear()

        if widget_arguments:
            self._my_widgets.append(widget(self.parent, rely=self.wg_rely + 1, relx=self.wg_relx + 2,
                                           max_width=self.width - 4, max_height=self.height - 2,
                                           **widget_arguments))

        else:
            self._my_widgets.append(widget(self.parent, rely=self.wg_rely + 1, relx=self.wg_relx + 2,
                                           max_width=self.width - 4, max_height=self.height - 2,))

        self.wg_rely += 1

        # self.entry_widget = weakref.proxy(self._my_widgets[0])
        # self.entry_widget.parent_widget = weakref.proxy(self)

        return weakref.proxy(self._my_widgets[-1])

    def update(self, clear=True):
        if self.hidden and clear:
            self.clear()
            return False
        elif self.hidden:
            return False
        super(Window, self).update(clear=clear)
        for w in self._my_widgets:
            self.entry_widget = w
            w.update(clear=clear)

To make it work I had to subclass the Box title class.
I also inserted a DummyWidget as as starting point, so we don't have an empty Box. after that it is basicly just the old init function. To make it finally work we create a new function,
called insert_widged. So we can insert new widgets afterwards. the we override the update function to make it work with the modified contained widgets.
IMPORTANT: the insert widget function returns a reference to the inserted widget so you can interface with it.
You can now create a new widget with:
window1 = self.add(Window, **kwargs)
text1 = window1.insert_widget(npyscreen.FixedText, name="Test")
text1.set_value("abcdefghijklmnop")

Correct me if I'm wrong or leave a comment.

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

2 participants