kicad-developers team mailing list archive
Mailing list archive
Re: Kicad Tool Framework
On 08/12/2013 04:24 PM, Dick Hollenbeck wrote:
Unfortunately, I guess I am losing my hope that we have a unified vision.
We apparently do not.
The project is based on wx. The portions of wx that are objectionable, to me are:
I said I'd prefer to not use wxEvtHandler for deriving the tools from,
but the tool framework code is at a proposal stage, so everything can be
I did my own event system, because I wanted to test some concepts (such
as FSM state switching and coroutines) which are orthogonal to any UI
library. I'm not a wxWidgets guru, and perhaps most of my requirements
could be met with some hacking of the wx's event system - I'm asking for
your help here. The reasons why I didn't use wxEvent/wxEvtHandler right
away are below:
- wxEvtHandler specifies a single method for handling events:
virtual bool ProcessEvent().
My idea was to have states in separate methods. One reason is avoid
enumerating states (and a big switch() statement in
MY_TOOL::ProcessEvent()), another is that with states in methods, FSMs
could be easily specialized by inheritance. I guess it should be
possible to do the same using a wxEventHandler. The base tool class
derived from wxEvtHandler could implement its own ProcessEvent() with
reworked dispatching code from TOOL_MANAGER, that calls the actual state
handlers and/or wakes them coroutines.
- AFAIK wx uses integer IDs for defining UI commands. These IDs should
to be globally unique, which may be hard to meet, as the project grows
and many people contribute tool plugins. I chose to call tools by name.
I'm fine with wxEvents if we find a way to ensure that all IDs (also
across plugins) are easy to register and unique (hashes?).
- wx mouse events work in window space, tools work in board space:
I assumed that events passed to the tools will be adjusted to the
current state of the view. For example if the view is being
auto-scrolled (because the mouse is
near the edge), the tools should receive a series of mouse motion events
because the cursor moves with respect to the world. Probably overloading
wxMouseEvent could fix it, but this brings extra complexity too. In wx,
mouse events are in screen space (GetLogicalPosition works for wxDC, but
not for the GAL which has a non-wx-related coordinate system) - so the
adjustment will have to be done in each state handler method or through
some global event filter. The former is not too elegant, and I don't
know if the latter is possible. You have much more experience with
wxWidgets than me - what do you think about this? Then, there is a
problem of distinguishing between events with board-relative coordinates
with plain wx mouse events that might be injected from other sources
(scripts). Also, tools should be able to request mouse snapping to
nearby objects/grid and. It could be done on event level, by adjusting
cursor coordinates accordingly.
- Drag vs click filtering:
Wx gives raw events. A click with a tiny mouse movement is considered a
drag, unless some filtering is applied, so an intermediate event filter
is required. I did it in TOOL_DISPATCHER class - maybe it could be
integrated into wx event stack and work on wxEvent derivatives?
- No idea how wx event stack will play with coroutines:
One of the key points of my proposal was the ability to handle events in
a loop, a thing that we consider really useful and simplifying tool
development (a small demo is in pcbnew/tools/selection_tool.cpp in
kicad-gal-orson branch). Is it possible to marry coroutines with the wx
event system? It would be great if so, otherwise, me & Orson would miss
them very much (after all, P&S and interactive selection tools that we
are developing are the most complex ones, that really benefit from all
goodies of the tool framework...).
- Wanted to avoid translating between VECTOR2<>/BOX2<> and
wxRect/wxPoint in the tools.
- (a less technical one) I'm slightly biased against wx, so I didn't
want to depend too much on it:
* Different way of handling events on different plaforms: Let me give
an example - the selection tool opens a pop-up menu when multiple items
are clicked. We wanted to add some visual feedback that draws a bright,
contrast border of the item you're about to select from the
clarification menu. Then we discovered that it doesn't work on Windows:
under Linux, a menu choice event comes after a menu close event, on
Windows the order is opposite. I don't know if wx provides a mechanism
for filtering and reordering events and if it can be adapted to fix such
* Mouse warping is forbidden on some OSes: emulate it (transparently
to the tools, so mouse events need to be adjusted somewhere) or drop it.
Existing Kicad tools use mouse warping quite frequently, so it's an
* Linux issues: printing never, ever worked for me and the
never-ending story of incompatible versions, which gave me bad feelings
about general quality of the wxWidgets project and its packages in