mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
undo: implement undo of setting a picture time by drag&drop
Even though the functionality is seemingly trivial, this is a bit invasive, as the code has to be split into two distinct parts: 1) Post undo command 2) React to changes to the divelist Don't compile that code on mobile. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
ebdb3e3c30
commit
e61641c79c
11 changed files with 178 additions and 90 deletions
|
@ -16,6 +16,8 @@ set(SUBSURFACE_GENERIC_COMMANDS_SRCS
|
|||
command_edit_trip.h
|
||||
command_event.cpp
|
||||
command_event.h
|
||||
command_pictures.cpp
|
||||
command_pictures.h
|
||||
)
|
||||
add_library(subsurface_commands STATIC ${SUBSURFACE_GENERIC_COMMANDS_SRCS})
|
||||
target_link_libraries(subsurface_commands ${QT_LIBRARIES})
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "command_edit.h"
|
||||
#include "command_edit_trip.h"
|
||||
#include "command_event.h"
|
||||
#include "command_pictures.h"
|
||||
|
||||
namespace Command {
|
||||
|
||||
|
@ -359,4 +360,11 @@ void addGasSwitch(struct dive *d, int dcNr, int seconds, int tank)
|
|||
execute(new AddGasSwitch(d, dcNr, seconds, tank));
|
||||
}
|
||||
|
||||
// Picture (media) commands
|
||||
|
||||
void setPictureOffset(dive *d, const QString &filename, offset_t offset)
|
||||
{
|
||||
execute(new SetPictureOffset(d, filename, offset));
|
||||
}
|
||||
|
||||
} // namespace Command
|
||||
|
|
|
@ -118,6 +118,10 @@ void renameEvent(struct dive *d, int dcNr, struct event *ev, const char *name);
|
|||
void removeEvent(struct dive *d, int dcNr, struct event *ev);
|
||||
void addGasSwitch(struct dive *d, int dcNr, int seconds, int tank);
|
||||
|
||||
// 7) Picture (media) commands
|
||||
|
||||
void setPictureOffset(dive *d, const QString &filename, offset_t offset);
|
||||
|
||||
} // namespace Command
|
||||
|
||||
#endif // COMMAND_H
|
||||
|
|
50
commands/command_pictures.cpp
Normal file
50
commands/command_pictures.cpp
Normal file
|
@ -0,0 +1,50 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include "command_pictures.h"
|
||||
#include "core/subsurface-qt/divelistnotifier.h"
|
||||
|
||||
namespace Command {
|
||||
|
||||
static picture *dive_get_picture(const dive *d, const QString &fn)
|
||||
{
|
||||
int idx = get_picture_idx(&d->pictures, qPrintable(fn));
|
||||
return idx < 0 ? nullptr : &d->pictures.pictures[idx];
|
||||
}
|
||||
|
||||
SetPictureOffset::SetPictureOffset(dive *dIn, const QString &filenameIn, offset_t offsetIn) :
|
||||
d(dIn), filename(filenameIn), offset(offsetIn)
|
||||
{
|
||||
if (!dive_get_picture(d, filename))
|
||||
d = nullptr;
|
||||
setText(Command::Base::tr("Change media time"));
|
||||
}
|
||||
|
||||
void SetPictureOffset::redo()
|
||||
{
|
||||
picture *pic = dive_get_picture(d, filename);
|
||||
if (!pic) {
|
||||
fprintf(stderr, "SetPictureOffset::redo(): picture disappeared!");
|
||||
return;
|
||||
}
|
||||
std::swap(pic->offset, offset);
|
||||
offset_t newOffset = pic->offset;
|
||||
|
||||
// Instead of trying to be smart, let's simply resort the picture table.
|
||||
// If someone complains about speed, do our usual "smart" thing.
|
||||
sort_picture_table(&d->pictures);
|
||||
emit diveListNotifier.pictureOffsetChanged(d, filename, newOffset);
|
||||
invalidate_dive_cache(d);
|
||||
}
|
||||
|
||||
// Undo and redo do the same thing
|
||||
void SetPictureOffset::undo()
|
||||
{
|
||||
redo();
|
||||
}
|
||||
|
||||
bool SetPictureOffset::workToBeDone()
|
||||
{
|
||||
return !!d;
|
||||
}
|
||||
|
||||
} // namespace Command
|
26
commands/command_pictures.h
Normal file
26
commands/command_pictures.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Note: this header file is used by the undo-machinery and should not be included elsewhere.
|
||||
|
||||
#ifndef COMMAND_PICTURES_H
|
||||
#define COMMAND_PICTURES_H
|
||||
|
||||
#include "command_base.h"
|
||||
|
||||
// We put everything in a namespace, so that we can shorten names without polluting the global namespace
|
||||
namespace Command {
|
||||
|
||||
class SetPictureOffset final : public Base {
|
||||
public:
|
||||
SetPictureOffset(dive *d, const QString &filename, offset_t offset); // Pictures are identified by the unique (dive,filename) pair
|
||||
private:
|
||||
dive *d; // null means no work to be done
|
||||
QString filename;
|
||||
offset_t offset;
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
bool workToBeDone() override;
|
||||
};
|
||||
|
||||
} // namespace Command
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue