← Back to team overview

kicad-developers team 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:

Dick, Wayne,

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 changed.

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 issues. * 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 important issue. * 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 different distros.


Follow ups