mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
fce48367cd
Place undo commands for every change of the profile, not only on "saving". Move the edit-mode from the mainwindow and the maintab to the profile widget. This is still very rough. For example, the only way to exit the edit mode is changing the current dive. The undo-commands are placed by the desktop-profile widget. We might think about moving that down to the profile-view so that this will be useable on mobile. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
113 lines
2.3 KiB
C++
113 lines
2.3 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include "command_base.h"
|
|
#include "core/qthelper.h" // for updateWindowTitle()
|
|
#include "core/subsurface-qt/divelistnotifier.h"
|
|
#include <QVector>
|
|
|
|
namespace Command {
|
|
|
|
static QUndoStack undoStack;
|
|
|
|
// forward declaration
|
|
QString changesMade();
|
|
|
|
// General commands
|
|
void init()
|
|
{
|
|
QObject::connect(&undoStack, &QUndoStack::cleanChanged, &updateWindowTitle);
|
|
changesCallback = &changesMade;
|
|
}
|
|
|
|
void clear()
|
|
{
|
|
undoStack.clear();
|
|
}
|
|
|
|
void setClean()
|
|
{
|
|
undoStack.setClean();
|
|
}
|
|
|
|
bool isClean()
|
|
{
|
|
return undoStack.isClean();
|
|
}
|
|
|
|
// this can be used to get access to the signals emitted by the QUndoStack
|
|
QUndoStack *getUndoStack()
|
|
{
|
|
return &undoStack;
|
|
}
|
|
|
|
QAction *undoAction(QObject *parent)
|
|
{
|
|
return undoStack.createUndoAction(parent, QCoreApplication::translate("Command", "&Undo"));
|
|
}
|
|
|
|
QAction *redoAction(QObject *parent)
|
|
{
|
|
return undoStack.createRedoAction(parent, QCoreApplication::translate("Command", "&Redo"));
|
|
}
|
|
|
|
QString diveNumberOrDate(struct dive *d)
|
|
{
|
|
if (d->number != 0)
|
|
return QStringLiteral("#%1").arg(d->number);
|
|
else
|
|
return QStringLiteral("@%1").arg(get_short_dive_date_string(d->when));
|
|
}
|
|
|
|
QString getListOfDives(const std::vector<struct dive*> &dives)
|
|
{
|
|
QString listOfDives;
|
|
if ((int)dives.size() == dive_table.nr)
|
|
return Base::tr("all dives");
|
|
int i = 0;
|
|
for (dive *d: dives) {
|
|
// we show a maximum of five dive numbers, or 4 plus ellipsis
|
|
if (++i == 4 && dives.size() >= 5)
|
|
return listOfDives + "...";
|
|
listOfDives += diveNumberOrDate(d) + ", ";
|
|
}
|
|
if (!listOfDives.isEmpty())
|
|
listOfDives.truncate(listOfDives.length() - 2);
|
|
return listOfDives;
|
|
}
|
|
|
|
QString getListOfDives(QVector<struct dive *> dives)
|
|
{
|
|
return getListOfDives(std::vector<struct dive *>(dives.begin(), dives.end()));
|
|
}
|
|
|
|
// return a string that can be used for the commit message and should list the changes that
|
|
// were made to the dive list
|
|
QString changesMade()
|
|
{
|
|
QString changeTexts;
|
|
for (int i = 0; i < undoStack.index(); i++)
|
|
changeTexts += undoStack.text(i) + "\n";
|
|
return changeTexts;
|
|
}
|
|
|
|
static bool executingCommand = false;
|
|
bool execute(Base *cmd)
|
|
{
|
|
if (cmd->workToBeDone()) {
|
|
executingCommand = true;
|
|
undoStack.push(cmd);
|
|
executingCommand = false;
|
|
emit diveListNotifier.commandExecuted();
|
|
return true;
|
|
} else {
|
|
delete cmd;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool placingCommand()
|
|
{
|
|
return executingCommand;
|
|
}
|
|
|
|
} // namespace Command
|