Example 30: Add a couple empty classes for the new root widget and buddy list.

We'll make the root widget hold the AccountDetailsForm in the next step. This will make it easy for us to switch widgets
and manage side by side windows later.
Example 31: Hook up the new root widget in the kv lang file.

Running this is the same as the earlier layout, but we now have some freedom available to remove the AccountDetails form
and replace it with a buddy list.
Example 32: Add a method that replaces the contents of the root widget with a BuddyList.

Not currently called. Since BuddyList is just an empty box layout right now, even if it was called, it would just blank the screen.
Example 33: Show the buddy list window when we have a connection.

We also have to dismiss the modal so we can see the new (empty) widget that is behind it.
Example 34: Add a basic ListView to the BuddyList.

Running this won't display much change, but now there's an empty list view. The next step is to populate it with data.
Example 35: Populate the BuddyList ListView upon initialization.

It's not a very pretty list, but it is a list, and it's scrollable. The next question is how to get status information
in there.
Example 36: Use a ListAdapter with the rendering class defaulting to Label.
Example 37: Add a BuddyListItem class.

This will eventually render a bunch of different properties, but for now we just
give it a text property so the default arg_converter will work.
Example 38: Basic styling for BuddyListItem.

This just renders a label with an abnormal height so we can see that the class is actually being used. We need to write a custom argument converter to get all the data we really want to see in there.
Example 39: Use more relevant properties for BuddyListItem.

Running this would fail, since we haven't updated the kv file yet.
Example 40: Point the labels at the new custom properties on the widget.

Running this will come up blank since we still aren't populating those custom properites.
Exampre 41: A rather complicated piece of code for converting jabber ids into buddy list item roster information.

It's rather ugly but it returns a simple dictionary. You might want to print said dictionary if you don't believe me.
Example 42: Finally really hook up the buddy list arg converter.

Running this makes a pretty sweet layout, but you ain't seen nothin' yet
Example 43: Set a background color attribute on the BuddyListItem.

Alternate rows get different dark background colors.
Example 44: Draw a rectangle directly on the canvas.

The rectangle's size is bound to the size of the widget, so no matter how the window is resized, the entire background is painted.
Example 45: Try to clean up the layout a little by moving status text under jid
Example 46: Add icons to be rendered in place of status messages
Change the status label to a status icon.

The interface looks much nicer now.