MuseScore is an open source and free music notation software. For support, contribution, bug reports, visit MuseScore.org. Fork and make pull requests!
Thanks to @rpatters1's work in #24744, we now have an Undo/redo history dialog:
Some more refinements are to be made to this dialog.
UX/UI
There is no distinction between undo items and redo items. Here is a graphical explanation of how it currently works, in the case that you have already undone three actions:
When selecting the e.g. topmost action, that action and the two actions between the topmost and the current state. I.e. this dialog only lets you "time-travel", and not cherry-pick single actions (which would be out of scope and not always possible).
Ideas:
Let the OK button indicate what's going to happen: "Undo 1 action" or "Redo 3 actions"
It should be clearer which row in the dialog refers to the "current state". Since the current state refers to a point in time rather than to an action, I would argue it should be its own special row, but @rpatters1 is against that.
If you select e.g. the 5th action below the current state, that means that all 5 actions between the current state and the selected row will be undone; so I think all of them should be highlighted to indicate that.
The current design is basically a copy of Dorico 5's undo history dialog. Instead, we might want to look at Finale's design, which consists of two columns: one for undoing, one for redoing. Although the single-column design is perhaps nice in theory, the two-column design would probably be much more understandable.
Technical
I think NotationUndoStack::undoRedoToIdx functions slightly weirdly: I would expect that if stack->currentIndex() == idx, then nothing happens. Instead, it currently redoes one command in that case. To prevent confusion in the future, that should perhaps be changed.
Instead of doing a lot of logic in QML, it would be more efficient to rewrite UndoRedoHistoryModel as a QAbstractListModel. I've made a start at this; my work-in-progress is here: https://github.com/musescore/MuseScore/compare/master...cbjeukendrup:undohistory/qabstractlistmodel
However, if we switch to a two-column approach, that will obviously have a big influence on the model implementation.
Thanks to @rpatters1's work in #24744, we now have an Undo/redo history dialog:
Some more refinements are to be made to this dialog.
UX/UI
There is no distinction between undo items and redo items. Here is a graphical explanation of how it currently works, in the case that you have already undone three actions:
When selecting the e.g. topmost action, that action and the two actions between the topmost and the current state. I.e. this dialog only lets you "time-travel", and not cherry-pick single actions (which would be out of scope and not always possible).
Ideas:
Technical
NotationUndoStack::undoRedoToIdx
functions slightly weirdly: I would expect that ifstack->currentIndex() == idx
, then nothing happens. Instead, it currently redoes one command in that case. To prevent confusion in the future, that should perhaps be changed.UndoRedoHistoryModel
as aQAbstractListModel
. I've made a start at this; my work-in-progress is here: https://github.com/musescore/MuseScore/compare/master...cbjeukendrup:undohistory/qabstractlistmodel However, if we switch to a two-column approach, that will obviously have a big influence on the model implementation.