The Selection Tool – further development blueprints
Maciej Sumiński/CERN <maciej.suminski@cern.ch>, November 2013
The current selection tool, that is compatible with the GAL, does not
provide enough means to perform all actions required to design a PCB. To
make it fully operational, more functionality is required.
Some of the following functionality is currently available for testing
in the product branch.
Delete
Deletes selected items or groups of items. Activated by a hotkey (e.g. Delete) or a command in the Context Menu (CM). Shortcuts should be consistent with the legacy KiCad edit panel.
Status*: available for testing
Cut/Copy/Paste
Right now KiCad allows only to copy selected blocks by the following steps:
- Select the area to be copied (it works only for items selected by a selection box, even if it is a single item it needs to be selected by a selection box). This begins the movement operation.
- Move it to the destination place.
- Right click and select “Copy block” from the CM.
- The new copy is fixed in the spot where the command was issued.
The way we would like to have it in the new tool is just like in any
other modern graphical application:
Cut/copy operation:
- Select the area to be cut/copied. Allow user to refine the selection by toggling some of the selected items (by clicking them with Shift held).
- Press Ctrl-X/C or select the command from Edit Menu/CM.
- Pick a reference point or item (the point that will be used for dragging the pasted block later). It should be possible to snap the cursor to pads/vias/tracks (switchable by the [tbd] key).
Paste operation:
- Move the cursor to the coarse destination, press Ctrl+V and finely move the block to the desired location (it should be also possible to do it in the reverse order, i.e. by first pressing Ctrl+V and then move the block).
- The cursor is tied to the reference point selected when copying the block.
- The cursor can be snapped to pads/vias/tracks/other items by the [tbd]. Snapping allows to place components both in the grid nodes or to connect them directly to existing items.
- Pressing the [tbd] key should enable linear movement mode (i.e. move the selected block only horizontally or vertically to make alignment easier).
- Pasted vias and tracks inherit nets from the items they were placed over if there is a direct eletrical connection between the objects (e.g. a via pasted on a pad gets the netcode from that pad)
- Single click finishes the paste operation.
Cut/copied items could be stored in the system clipboard in the KiCad s-expression format. It could be easily achievable by extracting all PCB_IO::Format() functions to another class.
Status*: requires some further discussions and more detailed description; available in the module editor
Grid settings
Currently, it is possible to change the grid density by clicking through the context menu or hotkeys (Ctrl+` & `). The context menu entries should be accessible by hotkeys and let the user change the grid settings by keys combination. To sum up:
- To change the grid density to another: activate the context menu, press G to highlight “Grid density” menu item and then a specific number/letter to switch to the desired density.
- Ctrl+` and ` cycle through the default grids to keep the current KiCad users habits.
In the context menu there could be only one unit per row (either mm or mils, not both at the same time), as users usually know the value expressed in one of the units and do not need to know the equivalent in the other one. Another possibility is to display values using only the currently selected unit.
Status*: to be done, grid density switching is possible with the default hot keys (Ctrl+` & `) and using the grid density dropdown list.
Zoom settings
The zoom options are right now fully available in the context menu (and hotkeys too), but they could be grouped together into one menu position that is later expanded to all options (please have a look at the CM plan at the end of the document) and accessible by hotkeys in a similar way to the grid settings.
Status*: to be done, might be irrelevant as usually it is much faster to scroll with mousewheel/hotkeys then select a value from context menu
Selection filter
Pcbnew allows to select only items of a specific type by checking
appropriate checkboxes after selecting an area meant to be modified (the
window titled “Block operation”).
Instead, there could be a dockable window with checkboxes that prevents
selection of given items or filters them out after the selection is
performed.
Filtration rules could be the following:
- item type (pad/track/via) as a list of checkboxes
- item net/class, selected from a combo box
Then buttons with available actions that apply to the items that fulfill the filter rules:
- Select to extend the selection
- Unselect to remove items from the selection
- Invert to toggle the selection
- Update to filter out items that do match the rules
- Highlight to show the items in brighter colors
- Unhighlight to restore normal colors
Illustration 1: Example selection filter window contents.
In the future, it could be extended by handling Python expressions in order to create more sophisticated filtering rules (eg. “IsModule() && PinCount() > 8” to select modules that have more than 8 pins).
Status*: to be done
The selection tool as the default tool
The Tool Framework puts activated tools on a stack, so if one tool finishes its operation then the stack is unrolled and the previous tool is active again. This may lead to a situation where there is no active tool and therefore no context menu accessible. The selection tool should be always at the bottom of the stack, to ensure there is a context menu for user and basic mouse events handling.
Status*: available for testing
Net highlighting
To make it easier to follow connections on a PCB, there should be a net highlight mode available. In principle it should work exactly the same as the high contrast mode, but highlighting nets instead of layers (the Push and Shove router uses that mode). It should be activated by clicking on a single component (pad/via/track) belonging to the desired net with the [tbd] key pressed or selecting “Highlight net” in the CM.
Illustration 2: Net highlighting mode.
Status*: available for testing
Properties dialog
There should be a properties dialog available for all item types, same as the one currently available in Pcbnew. The dialog should be shown after a double click on an item or selected from the CM.
Status*: available for testing
Update of displayed coordinates
In the GAL mode, the status bar should update the information about cursor location (X & Y coordinates), as it is done in the default renderer. Another missing thing are informations about the currently selected/recently clicked item. This could be displayed after hovering the mouse cursor over an item, without any clicking and replace the board statistics informations (number of tracks, vias, etc.)
Status*: available for testing
Update the 'file changed' flag
Changes introduced by the tools using the Tool Framework should make the “Save file” toolbar button and menu entry active. This could be reimplemented using the Observer design pattern, instead of updating the button on every update UI event (such as mouse movement).
Status*: available for testing
Alignment of items
For a block of selected items, give an option to align one edge of every
item bounding box to the edge of another item (e.g. the leftmost edge or
the top edge) or centered.
Another related functionality is items spread that puts parts evenly
distanced from each other alongside a chosen
axis.
Illustration 3: Example alignment modes for selected items.
Status*: available for testing
Undo & redo
Currently one can only revert the current operation (i.e. it is possible
to undo a movement that is still not confirmed by releasing a mouse
button). Tools should have an option to revert at least a few recent
operations, possibly making it consistent with the default KiCad undo
buffer.
The operations should be available under the default hotkeys: Ctrl+Z
(undo), Ctrl+Y (redo).
The most desired solution would be to put all the code associated with
undo/redo operations into a single class. Right now it is spread to
UNDO_REDO_CONTAINER, ITEM_PICKER, PICKED_ITEMS_LIST, PCB_SCREEN
(and ancestors) and PCB_EDIT_FRAME.
Proposed changes:
- Change the name of ITEM_PICKER to ITEM_STATE or UNDO_ENTRY (it took me a while to ensure myself that this is about holding an item state) and leave its interface as it is now
- Replace the PICKED_ITEMS_LIST with a (typedefed?) std::list<ITEM_STATE>
- Move undo/redo related functionality from PCB_SCREEN and PCB_SCREEN to UNDO_REDO_CONTAINER (how about renaming it to UNDO_BUFFER?)
- Limit the undo/redo hotkeys handling functions to something similar to:
> void PCB_EDIT_FRAME::Undo/Redo( wxCommandEvent& event )
> {
> if( m_undoContainer.Undo/RedoSize() <= 0 )
> return;
>
> m_undoContainer.Undo/Redo();
> OnModify();
> m_canvas->Refresh();
> }
- Add an accessor to the undo buffer.
Status*: available for testing
Moving cursor using arrow keys
This functionality is currently available in KiCad. It lets users manipulate items more precisely. To extend it, there could be hotkeys available to increase the unit movement distance (e.g. by default a single key press moves an item by 1 grid unit and with Ctrl held by 10 units).
Status*: to be done
Selected item specific menus
If selected items are of the same type, there could be some extra specific actions displayed, e.g.
- for zones: Show/Hide/Refill
- for items that belong to the same net: Show/Hide ratsnest, Highlight
Status*: there is a mechanism to do that; only zones are handled
Summary
We should be able to choose any action without any mouse movement, but
only using hotkeys. The context menu is designed mainly for the new
users to ease the learning curve and let them learn shortcuts.
Short descriptions of menu actions should pop up, if the mouse cursor is
held over them for a while (e.g. Selection filter: allows to filter
selected items by layer or
type).
Proposal of the new context menu
Illustration 4: The context menu plan.
The illustration presents the concept of the new context menu. Menu
entries prefixed with 'G' are shown only for groups of objects, 'S'
stands for single items, 'T' for type dependent, items without any
prefix are always shown.
Please note that every single item is accessible by a hotkey
combination, e.g. to switch the grid density to 7620: run the context
menu and press G, 8.