I'm in favor of a way that allows to undo layer specific actions. But to have a separate history stack per layer doesn't work well. Example: An OSM data layer, a GPX layer, and a geotagged image
layer are open.  The data layer is active and the images are correlated
to the GPX track. That action goes into the geo image layer history because that's where the images are. But an "undo" would not undo the image-GPX correlation but the last data layer action because the data layer is active. This might be confusing.

How about a combination of 1) and 2): The history is a linear list of actions. Each action is associated with a layer. All actions that belong to a layer form a virtual history stack. Each action in the history list is either active or undone. If an action is undone the according undone flag is set. The default is to show/use the linear history like it is done now. With a toggle button it can be switched to the (virtual) history of the current layer. Only the actions of the active layer are considered now (history stack display and undo/redo). The border between active and undone actions is based on the undone flag. Back to the full linear history: Undone actions that are in the active section and active actions in the undone section are grayed out to indicate that undo/redo will do nothing with such an action. Grayed out actions are not skipped during undo/redo to keep the history linear. If a grayed out undone action is undone with the linear history the color changes back to normal if there is no earlier undone action of the same layer because it can be redone now. Same for the redo direction. Actions can be color coded to visualize the layer they belong to. Each layer gets a unique color assigned. Actions from different layers could be displayed like commits in branches are displayed in revision control system GUIs. That will help to understand why grayed out actions cannot be undone/redone.

Many ifs and whens, but I think it could work.

Holger


On 2015-12-30 at 19:05 +0100 Vincent Privat wrote:
I think 2) is the best solution. It remains simple for most users who
work on a single modifiable layer at a time, but provides a nice
flexibility for those who work on several layers.
3) is too complex. The less dialogs we have the best it is.


2015-12-29 17:16 GMT+01:00 Holger Mappt:
    What is the recommended way to add a command history with undo/redo
    functionality to a layer that is not an OSM data layer?  In this
    case the GeoImageLayer.

    I can imagine three options:
    1) One linear history stack for all actions with one interface.
    This is what is usually done in other software.  The interface is
    the undo/redo in the edit menu and the main toolbar and the command
    stack toggle dialog.

    2) One history stack per layer with one interface.  Similar to 1),
    but undo/redo applies only to the active layer.  This decouples the
    actions done in different layers.  It requires that actions done in
    one layer do not depend on actions in another layer.  "Layer" can
    either be a single layer or one layer type.

    To be useful the history needs a concept of "connected actions" and
    the possibility to undo unconnected actions independently.  Example:
    The key "opening_hours" is added to a POI node, then the key "name"
    of an other PI node is changed.  To undo the opening_hours the name
    change has to undone too with the current implementation.  But the
    two POI nodes are not connected, it should be possible to undo
    either change.

_______________________________________________
josm-dev mailing list
josm-dev@openstreetmap.org
https://lists.openstreetmap.org/listinfo/josm-dev

Reply via email to