Woopsi is a Nintendo DS GUI library for rapidly creating user interfaces for homebrew software. Modelled after the AmigaOS windowing system.

Release notes:

– Fixes:
– ListData::swapItems() no longer raises a data changed event.
– ListData::sort() raises a data changed event.
– Woopsi class does not attempt to retrieve system font before it is initialised.
– ListBox canvas height no longer includes extra pixel.
– ListBox raises an action event when double-clicked.
– ListBox ignores double-clicks that occur across multiple items.
– Removed unused Gadget::_doubleClickTime member.
– ListBox redraws every time data changes.
– Double-click only counted as such if the gadget already has focus (ie. must be the same gadget clicked twice).
– ListBox::draw() calculates top and bottom visible options correctly, and does not overwrite options at the top of the list with those from the
– ListBox automatically scrolls when items are removed from the ListData object to ensure it does not display past the end of the canvas.

– New Features:
– Split ListData class into ListData and ListDataItem classes for greater flexibility.
– Minor improvements to the ListBox’s use of the ListData class.
– Altered ListData::quickSort() and added compareTo() method to ListDataItem to allow custom ordering of ListDataItem subclasses.
– ScrollingBase adds support for specifying planes on which scrolling can occur.
– ScrollingPanel implements ScrollingBase’s allow/disallow scroll plane features to prevent scrolling on certain planes.
– ListBox does not allow horizontal scrolling.
– Added windowless example project.
– Added Gadget::isDoubleClick() to check for double-clicks.
– Combined various colour members in Gadget class into GadgetColours struct.
– Merged TextWriter into GraphicsXXX classes and removed original class.
– Added FileListDataItem class to store data for file requester.
– FileRequester uses new compareTo() functionality for substantial speed increase and lower memory usage.
– FileRequester displays “Loading…” message whilst directories are enumerated.
– Split ListDataItem into ListDataItem and ListBoxDataItem classes for greater flexibility.
– Split FileRequester into FileListBox and FileRequester classes for greater flexibility.
– CycleButton uses the ListData class to store its data – options can now be selected, removed, sorted, etc.
– ListBox::getPreferredDimensions() bases width on size of text in options.
– ContextMenu used a ListBox to store/view its data.
– ContextMenu includes getPreferredDimensions() method.
– ContextMenu sends ListDataItem objects with event arguments instead of ContextMenuItem objects.
– Deleted ContextMenuItem class.
– Added WoopsiString::copyToCharArray().

Thanks to http://www.nintendomax.com/index.php?topic_id=10958&format=news for the news.