2008/4/25, Joern Koerner <[EMAIL PROTECTED]>:
> Hi!
>
>  I've a small problem with Overlay.
>  I want to create a "caption" for a LineBox that contains a listbox with an
>  overlay.  Just a small simple text that sits around the top left corner and
>  does nothing.

For my project I've created a separate widget - linebox with title,
based on LineBox:

class Border(urwid.WidgetWrap):
    def __init__(self, widget, title=None, attr=None):
        """
        Draw a line border around widget and set up a title
        @param widget: Widget to wrap
        @param title: (title, attribute) tuple or basestring
        @type title: urwid.Text object
        @param attr: Attribute of border
        """

        utf8decode = urwid.escape.utf8decode

        _title = None

        if title is not None:
            if isinstance(title, tuple):
                _len = len(title[0])
                _title = urwid.Text((title[1], " %s " % title[0]), "center")
            elif isinstance(title, basestring):
                _len = len(title)
                _title = urwid.Text(title, "center")
            else:
                raise UIError("Invalid title type %s. "\
                              "Tuple or basetring expected" % type(_title))

            _len += 2 # " _text "

        self.attr = attr

        self.tline = self._attr(urwid.Divider(utf8decode("─")))
        self.bline = self._attr(urwid.Divider(utf8decode("─")))
        self.lline = self._attr(urwid.SolidFill(utf8decode("│")))
        self.rline = self._attr(urwid.SolidFill(utf8decode("│")))

        self.tlcorner = self._attr(urwid.Text(utf8decode("┌")))
        self.trcorner = self._attr(urwid.Text(utf8decode("┐")))
        self.blcorner = self._attr(urwid.Text(utf8decode("└")))
        self.brcorner = self._attr(urwid.Text(utf8decode("┘")))

        tline_widgets = [('fixed', 1, self.tlcorner), self.tline]

        if title is not None:
            tline_widgets.append(("fixed", _len, _title))

        tline_widgets.extend([self.tline, ("fixed", 1, self.trcorner)])

        self.top = urwid.Columns(tline_widgets)
        self.middle = urwid.Columns([('fixed', 1, self.lline),
                                    widget, ('fixed', 1, self.rline)],
                                    box_columns=[0,2], focus_column=1)

        self.bottom = urwid.Columns([('fixed', 1, self.blcorner),
                                    self.bline, ('fixed', 1, self.brcorner)])

        self.pile = urwid.Pile([('flow',self.top), self.middle,
                               ('flow', self.bottom)], focus_item=1)

        super(Border, self).__init__(self.pile)

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    def _attr(self, widget):
        if self.attr is None:
            return widget

        return urwid.AttrWrap(widget, self.attr)

May be it would be useful.

-- 
~syhpoon
_______________________________________________
Urwid mailing list
[email protected]
http://lists.excess.org/mailman/listinfo/urwid

Reply via email to