
The Big Picture:
----------------

Release 0.1: Basic functionality and main API

Release 0.2: Refactoring, menus, full event set, graphics,
             native dialogs; more complete functionality

Release 0.3: Less API change, focus on robustness
             and stability

Remaining objectives for version 0.1:
-------------------------------------

* Fix remaining bugs and make sure the tests work in all
  backends

* Make sure all backends convert attribute values so they
  are acceptable to the backend widgets

* All backends should now use modify() rather than
  setting attributes directly. (ListBox.selection needs
  some rewriting here)

* Decide whether programmatic changes to widgets (e.g. setting
  the selection of a ListBox) should generate the same events
  as when these changes are caused by the user

* Make passive attributes (like text selection) active
  through basic event handling (Move to 0.2?)

* Make send(foo) send out the default event type (e.g. 'click')
  in addition to 'default', just as the symmetric case (e.g. send(btn,
  'click') will send a 'default' event).

Objectives for version 0.2:
---------------------------

* Refactor to reduce code duplication (by moving things to
  the core), simplify the backend API, and reduce coupling
  between core and backends (having only the bare necessities
  actually _in_ the backends). Reevaluate the _ensure_foo
  strategy?

  Methods like _tk_clicked, which contain no backend-specific
  code, should be lifted to the front-end, and linked to
  event triggers in the backend's _ensure_events.

  Should backends access frontend attributes through their
  internal or external names? A standard should be decided on.

  All methods named _refresh_foo should refer to attributes named foo.
  Most _ensure_foo methods should be renamed to _refresh_foo, though
  some (like _ensure_created) should be given some other names (or
  left alone), and some (like _ensure_state) should be renamed to
  reflect the attribute they are refreshing (e.g. _refresh_on).

* Fix the relationship btw. size, position, and geometry wrt.
  MVC etc. This should be done by making size, position, and geometry
  ordinary attributes, and synchronise them with x, y, width, and
  height through refresh().

* Adjust defaults, and improve window staggering
  (needs a mechanism to find the top window)

* Add support for __delattr__ (in the form of _del_foobar)
  in Mixins.Attrib, and make sure it's used where applicable
  in the various modules.

* Remove some redundante _ensure_foo calls, due to update()

* Add a dialog class

* Add support for native dialogs (e.g. file dialogs)

* Add menus (including popup menus?)

* Add full event system, based on messaging mechanism

* Add a grid-based layout mechanism
  (May require minimum_size and preferred_size properties)

* Add a Canvas widget for full graphics support

* Add an optional status bar to Window

* Create a Container mixin for add() and remove(), and either a
  contents or items attribute. (With items it could be used with
  ListBox too, giving the possibility of adding and removing items...)

* Change Assignee to SmartValue, which also has support for Container
  objects.

* Change add() signature?

* Add support for complex widgets ("megawidgets") with default
  implementations in the basic Anygui API (in the vein of the
  piddle/sping API)

  In other words, give a standardised way of integrating
  backend-specific features into Anygui programs.

* Add tree widget and notebook widget

* Add a combobox with a default implementation in terms of simpler
  components

* Add "applets" -- e.g. for the Gnope panel, KDE kpanel, WindowMaker
  dock, MacOS menu, Windows tray, etc. with a small window as
  fallback?

* Add font, alignment, and colour (etc.) attributes to all relevant
  components.

* Move main event loop to a separate GUI thread?

Longer term goals:
------------------

* Add table support with default implementation

* Add tabbed pane support with default implementation

* Add more alignment options etc. to labels

* Add advanced support for default, including default
  "shrink-wrapping" of windows and frames that aren't
  given an explicit size; will require a "preferred
  size" for all widgets, based on font sizes etc.

* Support accessibility standards

* Add support for styled text

* Add support for importing xml files through xslt?
  (E.g. XUL)

* Add instant model update for text widgets, not just on
  "focus lost"?

* Make Anygui more thread-safe

* Add constructive area geometry to Canvas

* Add toolbars (button bars) with menu shortcuts etc.

Smaller issues:
---------------

* Add support for borders?

* Add a linkMethods (or something) function for callback support?

* Add more distribution types (e.g. windows installers, rpms etc.)
