keyboard and pointer input: big refactor
authorAndrew Chadwick <andrewc-git@piffle.org>
Wed, 1 Aug 2012 01:12:23 +0000 (02:12 +0100)
committerAndrew Chadwick <andrewc-git@piffle.org>
Tue, 7 Aug 2012 01:27:21 +0000 (02:27 +0100)
commit366e1007755c8e572cd74c11b92876f5efc55805
treeaff766d3c2f437ea7771b6b91977aff253a51df4
parent3b4046b7b0e0ff8d0529dfd737e42f882fed7c01
keyboard and pointer input: big refactor

Move even more stuff out of the TDW, moving the input processing stuff
to a stack of interaction mode objects owned by each gui Document, only
the top mode of which is active. gui.document.Document ("doc") objects
are evolving into something more like classical MVC controllers.

The new InteractionMode objects know which doc and which tdw was active
at the time of the event, which may allow us to add additional views of
a model controlled by a single doc.

Active interaction modes' handlers can freely push new sub-modes to the
mode stack, and pop the stack when they're finished: this is how
switching modes using modifiers now works. There's an enter/leave
protocol at work for ensuring grabs are released appropriately.

* Replaces older button-press abstractions.

* Modes replace dragfuncs: certain modes are specialised for dragging between
  pen-down and pen-up events, and for keypresses involving space.

* Bye bye tdw's DragHandler, hello new super-grabby DragMode base class.

Differences between space drags and button-down drags are abstracted
away by the DragMode interface.

* Can now space-drag and zoom etc. on the scratchpad.

* Input stroke observers now belong to the gui-doc only.

* Global pressure mapping is now an Application attribute.

The controller classes track last event position and time on their TDWs
so that all modes can use the information, and so that it updates for
all modes.

* There's a minimal canvas controller for testing and the
  brush icon editor: it uses a freehand-only mode which cannot be switched
  using modifier keys.

TODO: need Actions for changing the active mode. Kinda what we're aiming
at here.

TODO: merge "linemode.py" modes into the new structure. This already
uses its own similar scheme.
gui/application.py
gui/brushcreationwidget.py
gui/brushselectionwindow.py
gui/brushsettingswindow.py
gui/canvasevent.py [new file with mode: 0644]
gui/document.py
gui/dragfunc.py [deleted file]
gui/drawwindow.py
gui/linemode.py
gui/scratchwindow.py
gui/tileddrawwidget.py