On Tue, Nov 24, 2009 at 3:26 PM, Ian Ward <[email protected]> wrote:
> Dominic LoBue wrote:
>> On Tue, Nov 24, 2009 at 9:17 AM, Ian Ward <[email protected]> wrote:
>>> You could try something like:
>>>
>>> listbox.set_focus(header_position)
>>> listbox.set_focus_valign('top')
>>> main_loop.process_input(['down'])
>>>
>>> That last line will cause the focus position change to actually happen,
>>> because the size information is passed along with the keypress method,
>>> and 'down' might move the focus back to the body.  An alternative would
>>> be to pass some input that doesn't do anything (just use the focus
>>> setting side-effect) then call set_focus again on your listbox.
>>>
>>
>> Perfect! That worked! Thanks!
>>
>> Two questions though:
>> a. Why do I need to call the lsitbox's set_focus method instead of the
>> listwalker?
>> b. Is there any way to achieve the same effect as this without all the
>> extra overhead of redrawing the screen three times?
>
> There's no screen redrawing there, the process_input just calls down
> through the widgets' keypress() methods once.
>
> The list walker is responsible for storing which widget is in focus, but
> the list box is responsible for remembering where to display that
> widget, usually how far from the top as a fraction of the list box
> height.  The set_focus and set_focus_valign methods set flags in the
> list box telling it that the next time it knows its size it needs to
> recalculate the position of the focus widget (this can be complicated so
> doing it lazily isn't such a bad thing).  So we're using the keypress
> side-effect of letting the list box set finish setting the position.
>
> Ian
>
> _______________________________________________
> Urwid mailing list
> [email protected]
> http://lists.excess.org/mailman/listinfo/urwid
>

Oh.. I think I understand. Just to be sure though: the _invalidate and
_modified methods don't actually initiate a redraw, they merely clear
the cache so the next time a redraw does occur their visual
representation is updated.

Urwid's caching mechanism has been a gigantic black box for me. My
entire approach to dealing with it has been to emulate how
SimpleListWalker notifies its ListBox container that its contents has
changed.

If you could do a writeup on the site on the theory behind Urwid's
caching, and how to efficiently work with it I'd greatly appreciate
it.

Dominic

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

Reply via email to