mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
QML UI: implement undelete
This code is very similar to the undo code in the desktop UI, but untangling that from the desktop seemed massive overkill; we don't have lists of dives to delete and undelete here - so this is actually much simpler and easier to maintain (I hope). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
e39e9eee3b
commit
abab031ed2
3 changed files with 59 additions and 3 deletions
|
@ -63,11 +63,12 @@ MobileComponents.Page {
|
||||||
text: "Delete dive"
|
text: "Delete dive"
|
||||||
iconName: "trash-empty"
|
iconName: "trash-empty"
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
manager.deleteDive(diveDetailsListView.currentItem.modelData.dive.id)
|
var deletedId = diveDetailsListView.currentItem.modelData.dive.id
|
||||||
|
manager.deleteDive(deletedId)
|
||||||
var notification = notificationComponent.createObject(contentItem.parent);
|
var notification = notificationComponent.createObject(contentItem.parent);
|
||||||
notification.showNotification("Dive deleted", 3000, "Undo",
|
notification.showNotification("Dive deleted", 3000, "Undo",
|
||||||
function() {
|
function() {
|
||||||
print("now I need to undo!")
|
manager.undoDelete(deletedId)
|
||||||
});
|
});
|
||||||
contextDrawer.close()
|
contextDrawer.close()
|
||||||
stackView.pop()
|
stackView.pop()
|
||||||
|
|
|
@ -43,7 +43,9 @@ extern "C" int gitProgressCB(int percent)
|
||||||
QMLManager::QMLManager() : m_locationServiceEnabled(false),
|
QMLManager::QMLManager() : m_locationServiceEnabled(false),
|
||||||
m_verboseEnabled(false),
|
m_verboseEnabled(false),
|
||||||
m_credentialStatus(UNKNOWN),
|
m_credentialStatus(UNKNOWN),
|
||||||
reply(0)
|
reply(0),
|
||||||
|
deletedDive(0),
|
||||||
|
deletedTrip(0)
|
||||||
{
|
{
|
||||||
m_instance = this;
|
m_instance = this;
|
||||||
appendTextToLog(getUserAgent());
|
appendTextToLog(getUserAgent());
|
||||||
|
@ -610,6 +612,34 @@ void QMLManager::saveChanges()
|
||||||
mark_divelist_changed(false);
|
mark_divelist_changed(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QMLManager::undoDelete(int id)
|
||||||
|
{
|
||||||
|
if (!deletedDive || deletedDive->id != id) {
|
||||||
|
qDebug() << "can't find the deleted dive";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (deletedTrip)
|
||||||
|
insert_trip(&deletedTrip);
|
||||||
|
if (deletedDive->divetrip) {
|
||||||
|
struct dive_trip *trip = deletedDive->divetrip;
|
||||||
|
tripflag_t tripflag = deletedDive->tripflag; // this gets overwritten in add_dive_to_trip()
|
||||||
|
deletedDive->divetrip = NULL;
|
||||||
|
deletedDive->next = NULL;
|
||||||
|
deletedDive->pprev = NULL;
|
||||||
|
add_dive_to_trip(deletedDive, trip);
|
||||||
|
deletedDive->tripflag = tripflag;
|
||||||
|
}
|
||||||
|
record_dive(deletedDive);
|
||||||
|
DiveListModel::instance()->addDive(deletedDive);
|
||||||
|
prefs.cloud_background_sync = false;
|
||||||
|
prefs.git_local_only = true;
|
||||||
|
saveChanges();
|
||||||
|
prefs.cloud_background_sync = true;
|
||||||
|
prefs.git_local_only = false;
|
||||||
|
deletedDive = NULL;
|
||||||
|
deletedTrip = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void QMLManager::deleteDive(int id)
|
void QMLManager::deleteDive(int id)
|
||||||
{
|
{
|
||||||
struct dive *d = get_dive_by_uniq_id(id);
|
struct dive *d = get_dive_by_uniq_id(id);
|
||||||
|
@ -617,6 +647,28 @@ void QMLManager::deleteDive(int id)
|
||||||
qDebug() << "oops, trying to delete non-existing dive";
|
qDebug() << "oops, trying to delete non-existing dive";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// clean up (or create) the storage for the deleted dive and trip (if applicable)
|
||||||
|
if (!deletedDive)
|
||||||
|
deletedDive = alloc_dive();
|
||||||
|
else
|
||||||
|
clear_dive(deletedDive);
|
||||||
|
copy_dive(d, deletedDive);
|
||||||
|
if (!deletedTrip) {
|
||||||
|
deletedTrip = (struct dive_trip *)calloc(1, sizeof(struct dive_trip));
|
||||||
|
} else {
|
||||||
|
free(deletedTrip->location);
|
||||||
|
free(deletedTrip->notes);
|
||||||
|
memset(deletedTrip, 0, sizeof(struct dive_trip));
|
||||||
|
}
|
||||||
|
// if this is the last dive in that trip, remember the trip as well
|
||||||
|
if (d->divetrip && d->divetrip->nrdives == 1) {
|
||||||
|
deletedTrip = (struct dive_trip *)calloc(1, sizeof(struct dive_trip));
|
||||||
|
*deletedTrip = *d->divetrip;
|
||||||
|
deletedTrip->location = copy_string(d->divetrip->location);
|
||||||
|
deletedTrip->notes = copy_string(d->divetrip->notes);
|
||||||
|
deletedTrip->nrdives = 0;
|
||||||
|
deletedDive->divetrip = deletedTrip;
|
||||||
|
}
|
||||||
DiveListModel::instance()->removeDiveById(id);
|
DiveListModel::instance()->removeDiveById(id);
|
||||||
delete_single_dive(get_idx_by_uniq_id(id));
|
delete_single_dive(get_idx_by_uniq_id(id));
|
||||||
prefs.cloud_background_sync = false;
|
prefs.cloud_background_sync = false;
|
||||||
|
|
|
@ -92,6 +92,7 @@ public slots:
|
||||||
|
|
||||||
void saveChanges();
|
void saveChanges();
|
||||||
void deleteDive(int id);
|
void deleteDive(int id);
|
||||||
|
void undoDelete(int id);
|
||||||
QString addDive();
|
QString addDive();
|
||||||
void addDiveAborted(int id);
|
void addDiveAborted(int id);
|
||||||
void applyGpsData();
|
void applyGpsData();
|
||||||
|
@ -125,6 +126,8 @@ private:
|
||||||
static QMLManager *m_instance;
|
static QMLManager *m_instance;
|
||||||
QNetworkReply *reply;
|
QNetworkReply *reply;
|
||||||
QNetworkRequest request;
|
QNetworkRequest request;
|
||||||
|
struct dive *deletedDive;
|
||||||
|
struct dive_trip *deletedTrip;
|
||||||
|
|
||||||
credentialStatus_t m_credentialStatus;
|
credentialStatus_t m_credentialStatus;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue