[josm-dev] Thoughts for further step to modeless operation in JOSM

David Earl david at frankieandshadow.com
Tue Aug 19 13:13:09 BST 2008


The two threads of recent days, in particular about the cross to add a 
new node, are expressing an underlying frustration about the remaining 
modes in JOSM. The cross is a bit of a hack to work round this. Can we 
do more to get rid of the modes? Is re-learning gestures to achieve this 
worthwhile?

It is fairly easy to see how one could use combinations of clicks and 
modifiers to achieve this, but you don't want to have to keep a finger 
on a modifier key when extending ways - it gets very tedious. So we want 
to have CLICK do two different things at different times, but don't want 
modes. Hmm.

Recognising that we are limited by the number of mouse buttons and 
modifier keys, another approach might be to use a pop up menu to offer 
multiple possibilities. But that gets tedious too, and is more suited to 
new users. Or we could substitute mouse clicks with keyboard keys - so 
for example you'd position the mouse where you want it and say click to 
select, but press E to extend a way, N to add a node without extension, 
e to extend without snapping to an existing point/way, n ditto for N and 
so on. In effect the keyboard becomes a plethora of mouse buttons. But 
that is a radically unconventional UI.

So here's a third possibility, the remainder of this long mail: use 
context, so you barely notice, and don't normally have to press a key or 
button to switch a mode. Most of what follows will be pretty familiar, 
with only a few changes to current behaviour, though I spelled out 
everything (E&OE). Only a CLICK is ambiguous. In that case only there's 
an implicit mode.

Left button deals with data, right button with viewing. RIGHT-DRAG pans 
(as now) and SHIFT+RIGHT-DRAG rubber band rectangle zooms (like DRAG in 
zoom mode now). That removes the need for a zoom mode. We also have the 
possibility of zooming in by some factor on simple right click centred 
on the cursor. Of course mostly you continue to use scroll wheel.

CLICK on a target object normally selects it, replacing any existing 
selection, but see below.

SHIFT+CLICK adds the target to those selected already, but like most 
applications (but unlike now) also removes the target from the selection 
if it is already selected (so CTRL+CLICK no longer has this function). 
DRAG from one point to another selects objects in the dragged rectangle; 
SHIFT+DRAG adds enclosed objects to those already selected, both as now.

However, if the immediately preceding operation (ignoring any zooms and 
pans) was a selection (any of the above) or a drawing operation (CLICK, 
CTRL+CLICK, ALT+CLICK, ALT+SHIFT+CLICK - see below), CLICK changes its 
behaviour: it extends a way (pretty much as Draw mode does now, and 
providing a way, or a node, or a way+end node of that way is selected - 
see below). It snaps the way to a node if you click on a node, as now, 
and inserts the new node in a way if you click on a way, as now.

Furthermore, CLICK in a blank area always extends as above (deselection 
is therefore only by Deselect All or press 'U'), so only the snap case 
is ambiguous.

In most cases, this is what you want, but sometimes you want the other 
interpretation (draw not select or vice-versa). SHIFT+CTRL+CLICK does 
what CLICK would do in the other case, and/or ESC can toggle.

CTRL+CLICK always adds a new node without extending (this used to be 
SHIFT+CLICK, but SHIFT+CLICK is so universally used for selection 
extension, I think that should be its assignment). If over a way, we 
snap the node into the way. If near an existing node do nothing/say so 
(or, possibly, just select the node).

If nothing is selected to start with, CLICK in a blank area does the 
same as CTRL+CLICK, i.e. just add a new node.

ALT modifies to not snap. So ALT+CLICK extends and always creates a new 
node, never part of an existing way, and ALT+CTRL+CLICK always creates a 
new node. ALT+CLICK is unambiguous so doesn't need to be preceded by 
selection.

DEL or D deletes selected objects. There is no need for a delete mode.

DRAG moves the selected objects, also selecting the target if not 
already selected, exactly as now, but with no need to be in a mode.

CTRL+SHIFT+DRAG rotates the selection, ditto (it could be just 
CTRL+DRAG, but it's CTRL+SHIFT+DRAG already).

ALT+DRAG extrudes, ditto.

Currently you can make a new way from the selected node to the target 
with ALT+CLICK (which I've usurped to suppress snapping). Here's what I 
would do for this. Firstly the extension rules:

- if only a single node is selected, a new way is created by a CLICK 
from that node to the target position (either creating a new node, 
possibly also snapping into an existing way, or snapping to an existing 
node).

- if only a single way is selected, the way is extended to the 
new/target node. This would most usefully be from the nearest end to the 
target click.

- if a single way _and_ one of its endpoint nodes is selected, this 
forces the end extended from.

- any other selection is invalid. This could mean do nothing, display a 
message, and/or possibly

- the whole way extended or created and the new node (or snapped to 
node) end up selected.

So, to create new way rather than extending an existing one, you just 
select a node. If you want to extend a way, you select the way (and 
possibly also an end node if you want). If you just created a way and 
want to start a new one on the end of it, you SHIFT+CLICK the way just 
created (which deselects it, but leaves the end node selected) and then 
CLICK.

The awkward cases are, of course, where you expect CLICK to do one thing 
and it does the other. The rubber band lines and cursor should be 
telling you what will happen.

- you select something, and, realising you selected the wrong thing, you 
immediately try to select something else. This in fact creates a way 
instead.

- you are inspecting objects, so selecting them but not then doing any 
more gestures, simply looking at the information in the panels. This is 
the same case as above, but deliberate.

In the these cases, ESC could toggle the "draw" interpretation of 
click-and-snap, though, yes, you have to remember to do it. Also, there 
is the unused combination SHIFT+CTRL+CLICK which could be used to do a 
simple selection when CLICK would otherwise draw and vice-versa.

- you've finished adding tags, and you want to extend the way you just 
tagged to link to an existing way or node, but the click actually 
selects the target way or node (the snap case is thee only one that is 
affected - a simple extension into blank space does what you want). 
Solution is to click the already selected way, or press ESC first, or 
SHIFT+CTRL+CLICK.

In essence this is trading the convenience of the double interpretation 
of a CLICK for these cases.

I think that then leaves only these cases:

- alignment of WMS layer. I think this should be done with a pan gesture 
with the WMS layer selected. (And selecting the WMS layer shouldn't 
obscure the other layers!)

- moving the audio play head. This needn't change.

Incidentally, the equivalent of the cross would be to CTRL+CLICK on a 
way, in all cases, but of course it can be anywhere on the way.

David




More information about the josm-dev mailing list