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); QList<dive *>diveAsList; diveAsList << deletedDive; DiveListModel::instance()->addDive(diveAsList); // make sure the changes get saved if the app is no longer in the foreground // or if the user requests a save mark_divelist_changed(true); deletedDive = NULL; deletedTrip = NULL; }
bool QMLManager::undoDelete(int id) { if (!deletedDive || deletedDive->id != id) { qDebug() << "can't find the deleted dive"; return false; } 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); QList<dive *>diveAsList; diveAsList << deletedDive; DiveListModel::instance()->addDive(diveAsList); changesNeedSaving(); deletedDive = NULL; deletedTrip = NULL; return true; }
void DivePlannerPointsModel::createPlan(bool replanCopy) { // Ok, so, here the diveplan creates a dive struct deco_state *cache = NULL; bool oldRecalc = setRecalc(false); removeDeco(); createTemporaryPlan(); setRecalc(oldRecalc); //TODO: C-based function here? struct decostop stoptable[60]; plan(&diveplan, &displayed_dive, DECOTIMESTEP, stoptable, &cache, isPlanner(), true); free(cache); if (!current_dive || displayed_dive.id != current_dive->id) { // we were planning a new dive, not re-planning an existing on record_dive(clone_dive(&displayed_dive)); } else if (current_dive && displayed_dive.id == current_dive->id) { // we are replanning a dive - make sure changes are reflected // correctly in the dive structure and copy it back into the dive table displayed_dive.maxdepth.mm = 0; displayed_dive.dc.maxdepth.mm = 0; fixup_dive(&displayed_dive); // Try to identify old planner output and remove only this part // Treat user provided text as plain text. QTextDocument notesDocument; notesDocument.setHtml(current_dive->notes); QString oldnotes(notesDocument.toPlainText()); int disclaimerPosition = oldnotes.indexOf(disclaimer); if (disclaimerPosition == 0) oldnotes.clear(); else if (disclaimerPosition >= 1) oldnotes.truncate(disclaimerPosition-1); // Deal with line breaks oldnotes.replace("\n", "<br>"); oldnotes.append(displayed_dive.notes); displayed_dive.notes = strdup(oldnotes.toUtf8().data()); // If we save as new create a copy of the dive here if (replanCopy) { struct dive *copy = alloc_dive(); copy_dive(current_dive, copy); copy->id = 0; copy->selected = false; copy->divetrip = NULL; if (current_dive->divetrip) add_dive_to_trip(copy, current_dive->divetrip); record_dive(copy); } copy_dive(&displayed_dive, current_dive); } mark_divelist_changed(true); // Remove and clean the diveplan, so we don't delete // the dive by mistake. free_dps(&diveplan); setPlanMode(NOTHING); planCreated(); }
void UndoRemoveDivesFromTrip::undo() { QMapIterator<dive*, dive_trip*> i(divesToUndo); while (i.hasNext()) { i.next(); add_dive_to_trip(i.key (), i.value()); } mark_divelist_changed(true); MainWindow::instance()->refreshDisplay(); }
static void record_uemis_dive(device_data_t *devdata, struct dive *dive) { if (devdata->create_new_trip) { if (!devdata->trip) devdata->trip = create_and_hookup_trip_from_dive(dive); else add_dive_to_trip(dive, devdata->trip); } record_dive_to_table(dive, devdata->download_table); }
static struct dive *create_new_dive(timestamp_t when) { struct dive *dive = alloc_dive(); /* We'll fill in more data from the dive file */ dive->when = when; if (active_trip) add_dive_to_trip(dive, active_trip); return dive; }
static void dive_start(void) { if (cur_dive) return; cur_dive = alloc_dive(); reset_dc_info(&cur_dive->dc); memset(&cur_tm, 0, sizeof(cur_tm)); if (cur_trip) { add_dive_to_trip(cur_dive, cur_trip); cur_dive->tripflag = IN_TRIP; } }
void DivePlannerPointsModel::createPlan(bool replanCopy) { // Ok, so, here the diveplan creates a dive char *cache = NULL; bool oldRecalc = setRecalc(false); removeDeco(); createTemporaryPlan(); setRecalc(oldRecalc); //TODO: C-based function here? bool did_deco = plan(&diveplan, &cache, isPlanner(), true); free(cache); if (!current_dive || displayed_dive.id != current_dive->id) { // we were planning a new dive, not re-planning an existing on record_dive(clone_dive(&displayed_dive)); } else if (current_dive && displayed_dive.id == current_dive->id) { // we are replanning a dive - make sure changes are reflected // correctly in the dive structure and copy it back into the dive table displayed_dive.maxdepth.mm = 0; displayed_dive.dc.maxdepth.mm = 0; fixup_dive(&displayed_dive); if (replanCopy) { struct dive *copy = alloc_dive(); copy_dive(current_dive, copy); copy->id = 0; copy->selected = false; copy->divetrip = NULL; if (current_dive->divetrip) add_dive_to_trip(copy, current_dive->divetrip); record_dive(copy); QString oldnotes(current_dive->notes); if (oldnotes.indexOf(QString(disclaimer)) >= 0) oldnotes.truncate(oldnotes.indexOf(QString(disclaimer))); if (did_deco) oldnotes.append(displayed_dive.notes); displayed_dive.notes = strdup(oldnotes.toUtf8().data()); } copy_dive(&displayed_dive, current_dive); } mark_divelist_changed(true); // Remove and clean the diveplan, so we don't delete // the dive by mistake. free_dps(&diveplan); setPlanMode(NOTHING); planCreated(); }
void UndoDeleteDive::undo() { // first bring back the trip(s) Q_FOREACH(struct dive_trip *trip, tripList) insert_trip(&trip); // now walk the list of deleted dives for (int i = 0; i < diveList.count(); i++) { struct dive *d = diveList.at(i); // we adjusted the divetrip to point to the "new" divetrip if (d->divetrip) { struct dive_trip *trip = d->divetrip; tripflag_t tripflag = d->tripflag; // this gets overwritten in add_dive_to_trip() d->divetrip = NULL; d->next = NULL; d->pprev = NULL; add_dive_to_trip(d, trip); d->tripflag = tripflag; } record_dive(diveList.at(i)); } mark_divelist_changed(true); MainWindow::instance()->refreshDisplay(); }