void QMLManager::applicationStateChanged(Qt::ApplicationState state) { if (!timer.isValid()) timer.start(); QString stateText; switch (state) { case Qt::ApplicationActive: stateText = "active"; break; case Qt::ApplicationHidden: stateText = "hidden"; break; case Qt::ApplicationSuspended: stateText = "suspended"; break; case Qt::ApplicationInactive: stateText = "inactive"; break; default: stateText = QString("none of the four: 0x") + QString::number(state, 16); } stateText.prepend("AppState changed to "); stateText.append(" with "); stateText.append((alreadySaving ? QLatin1Literal("") : QLatin1Literal("no ")) + QLatin1Literal("save ongoing")); stateText.append(" and "); stateText.append((unsaved_changes() ? QLatin1Literal("") : QLatin1Literal("no ")) + QLatin1Literal("unsaved changes")); appendTextToLog(stateText); qDebug() << QString::number(timer.elapsed() / 1000.0,'f', 3) << ":" << stateText; if (!alreadySaving && state == Qt::ApplicationInactive && unsaved_changes()) { // FIXME // make sure the user sees that we are saving data if they come back // while this is running saveChangesCloud(false); appendTextToLog(QString::number(timer.elapsed() / 1000.0,'f', 3) + ": done saving to git local / remote"); } }
void MainWindow::on_actionClose_triggered() { if (unsaved_changes() && (askSaveChanges() == FALSE)) return; /* free the dives and trips */ while (dive_table.nr) delete_single_dive(0); /* clear the selection and the statistics */ selected_dive = -1; //WARNING: Port this to Qt. //process_selected_dives(); ui->InfoWidget->clearStats(); ui->InfoWidget->clearInfo(); ui->InfoWidget->clearEquipment(); ui->InfoWidget->updateDiveInfo(-1); ui->ProfileWidget->clear(); ui->ListWidget->reload(DiveTripModel::TREE); ui->globe->reload(); setTitle(MWTF_DEFAULT); mark_divelist_changed(FALSE); clear_events(); }
void QMLManager::saveChangesCloud(bool forceRemoteSync) { if (!unsaved_changes() && !forceRemoteSync) { appendTextToLog("asked to save changes but no unsaved changes"); return; } if (alreadySaving) { appendTextToLog("save operation in progress already"); return; } // first we need to store any unsaved changes to the local repo saveChangesLocal(); // if the user asked not to push to the cloud we are done if (prefs.git_local_only && !forceRemoteSync) return; if (!loadFromCloud()) { appendTextToLog("Don't save dives without loading from the cloud, first."); return; } bool glo = prefs.git_local_only; git_storage_update_progress(false, "start save change to cloud"); prefs.git_local_only = false; alreadySaving = true; loadDivesWithValidCredentials(); alreadySaving = false; git_storage_update_progress(false, "finished syncing dive list to cloud server"); setAccessingCloud(-1); prefs.git_local_only = glo; }
void MainWindow::on_actionClose_triggered() { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before closing the file.")); return; } if (unsaved_changes() && (askSaveChanges() == false)) return; ui.newProfile->setEmptyState(); /* free the dives and trips */ clear_git_id(); while (dive_table.nr) delete_single_dive(0); dive_list()->clearSelection(); /* clear the selection and the statistics */ selected_dive = -1; if (existing_filename) { free((void *)existing_filename); existing_filename = NULL; } cleanUpEmpty(); mark_divelist_changed(false); clear_events(); }
void MainWindow::on_actionQuit_triggered() { if (unsaved_changes() && (askSaveChanges() == FALSE)) return; writeSettings(); QApplication::quit(); }
void QMLManager::saveChangesLocal() { if (unsaved_changes()) { git_storage_update_progress(true, "saving dives locally"); // reset the timers if (!loadFromCloud()) { // this seems silly, but you need a common ancestor in the repository in // order to be able to merge che changes later appendTextToLog("Don't save dives without loading from the cloud, first."); return; } if (alreadySaving) { appendTextToLog("save operation already in progress, can't save locally"); return; } alreadySaving = true; bool glo = prefs.git_local_only; prefs.git_local_only = true; if (save_dives(existing_filename)) { appendTextToLog(get_error_string()); setAccessingCloud(-1); prefs.git_local_only = glo; alreadySaving = false; return; } prefs.git_local_only = glo; mark_divelist_changed(false); git_storage_update_progress(false, "done with local save"); alreadySaving = false; } else { appendTextToLog("local save requested with no unsaved changes"); } }
void MainWindow::closeEvent(QCloseEvent *event) { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before closing the file.")); event->ignore(); return; } if (helpView && helpView->isVisible()) { helpView->close(); helpView->deleteLater(); } if (yearlyStats && yearlyStats->isVisible()) { yearlyStats->close(); yearlyStats->deleteLater(); yearlyStatsModel->deleteLater(); } if (unsaved_changes() && (askSaveChanges() == false)) { event->ignore(); return; } event->accept(); writeSettings(); QApplication::closeAllWindows(); }
void TestRenumber::testMerge() { QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47b.xml"), 0); process_dives(true, false); QCOMPARE(dive_table.nr, 1); QCOMPARE(unsaved_changes(), 1); mark_divelist_changed(false); dive_table.preexisting = dive_table.nr; }
static void quit(GtkWidget *w, gpointer data) { /* Make sure to flush any modified dive data */ update_dive(NULL); if (unsaved_changes()) ask_save_changes(); gtk_main_quit(); }
static gboolean on_delete(GtkWidget* w, gpointer data) { /* Make sure to flush any modified dive data */ update_dive(NULL); if (unsaved_changes()) ask_save_changes(); return FALSE; /* go ahead, kill the program, we're good now */ }
void TestRenumber::testMergeAndAppend() { QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47c.xml"), 0); process_dives(true, false); QCOMPARE(dive_table.nr, 2); QCOMPARE(unsaved_changes(), 1); struct dive *d = get_dive(1); QVERIFY(d != NULL); if (d) QCOMPARE(d->number, 2); }
bool MainWindow::okToClose(QString message) { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), message); return false; } if (unsaved_changes() && askSaveChanges() == false) return false; return true; }
void MainWindow::on_actionQuit_triggered() { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before closing the file.")); return; } if (unsaved_changes() && (askSaveChanges() == false)) return; writeSettings(); QApplication::quit(); }
void MainWindow::closeEvent(QCloseEvent *event) { if (helpView && helpView->isVisible()){ helpView->close(); helpView->deleteLater(); } if (unsaved_changes() && (askSaveChanges() == FALSE)) { event->ignore(); return; } event->accept(); writeSettings(); }
void MainWindow::on_actionClose_triggered() { if (unsaved_changes() && (askSaveChanges() == FALSE)) return; /* free the dives and trips */ while (dive_table.nr) delete_single_dive(0); /* clear the selection and the statistics */ selected_dive = -1; cleanUpEmpty(); mark_divelist_changed(FALSE); clear_events(); }
void QMLManager::saveChangesLocal() { if (unsaved_changes()) { git_storage_update_progress(true, "saving dives locally"); // reset the timers if (credentialStatus() == NOCLOUD) { if (same_string(existing_filename, "")) { char *filename = NOCLOUD_LOCALSTORAGE; if (git_create_local_repo(filename)) appendTextToLog(get_error_string()); set_filename(filename, true); GeneralSettingsObjectWrapper s(this); s.setDefaultFilename(filename); s.setDefaultFileBehavior(LOCAL_DEFAULT_FILE); qDebug() << "setting default file to" << filename; } } else if (!loadFromCloud()) { // this seems silly, but you need a common ancestor in the repository in // order to be able to merge che changes later appendTextToLog("Don't save dives without loading from the cloud, first."); return; } if (alreadySaving) { appendTextToLog("save operation already in progress, can't save locally"); return; } alreadySaving = true; bool glo = prefs.git_local_only; prefs.git_local_only = true; if (save_dives(existing_filename)) { appendTextToLog(get_error_string()); set_filename(NULL, true); setAccessingCloud(-1); prefs.git_local_only = glo; alreadySaving = false; return; } prefs.git_local_only = glo; mark_divelist_changed(false); git_storage_update_progress(false, "done with local save"); alreadySaving = false; } else { appendTextToLog("local save requested with no unsaved changes"); } }
void MainWindow::on_actionQuit_triggered() { if (ui.InfoWidget->isEditing()) { ui.InfoWidget->rejectChanges(); if (ui.InfoWidget->isEditing()) // didn't discard the edits return; } if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING) { DivePlannerPointsModel::instance()->cancelPlan(); if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING) // The planned dive was not discarded return; } if (unsaved_changes() && (askSaveChanges() == false)) return; writeSettings(); QApplication::quit(); }
const k3d::bool_t savable_application_window::save_changes() { if(k3d::batch_mode() || !unsaved_changes()) return true; switch(safe_close_dialog::run(*this, unsaved_document_title())) { case Gtk::RESPONSE_NONE: case Gtk::RESPONSE_CANCEL: case Gtk::RESPONSE_DELETE_EVENT: return false; case Gtk::RESPONSE_CLOSE: return true; case Gtk::RESPONSE_OK: return save_unsaved_changes(); } assert_not_reached(); return false; }
void savable_application_window::safe_close() { if(k3d::batch_mode() || !unsaved_changes()) { close(); return; } switch(safe_close_dialog::run(*this, unsaved_document_title())) { case Gtk::RESPONSE_NONE: case Gtk::RESPONSE_CANCEL: case Gtk::RESPONSE_DELETE_EVENT: return; case Gtk::RESPONSE_CLOSE: close(); return; case Gtk::RESPONSE_OK: if(save_unsaved_changes()) close(); } }
void MainWindow::closeEvent(QCloseEvent *event) { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { on_actionQuit_triggered(); event->ignore(); return; } #ifndef NO_USERMANUAL if (helpView && helpView->isVisible()) { helpView->close(); helpView->deleteLater(); } #endif if (unsaved_changes() && (askSaveChanges() == false)) { event->ignore(); return; } event->accept(); writeSettings(); QApplication::closeAllWindows(); }
void QMLManager::quit() { if (unsaved_changes()) saveChangesCloud(false); QApplication::quit(); }
int parse_file(const char *filename) { struct git_repository *git; const char *branch = NULL; char *current_sha = copy_string(saved_git_id); struct memblock mem; char *fmt; int ret; git = is_git_repository(filename, &branch, NULL, false); if (prefs.cloud_git_url && strstr(filename, prefs.cloud_git_url) && git == dummy_git_repository) { /* opening the cloud storage repository failed for some reason * give up here and don't send errors about git repositories */ free(current_sha); return -1; } /* if this is a git repository, do we already have this exact state loaded ? * get the SHA and compare with what we currently have */ if (git && git != dummy_git_repository) { const char *sha = get_sha(git, branch); if (!same_string(sha, "") && same_string(sha, current_sha) && !unsaved_changes()) { fprintf(stderr, "already have loaded SHA %s - don't load again\n", sha); free(current_sha); return 0; } } free(current_sha); if (git) return git_load_dives(git, branch); if ((ret = readfile(filename, &mem)) < 0) { /* we don't want to display an error if this was the default file or the cloud storage */ if ((prefs.default_filename && !strcmp(filename, prefs.default_filename)) || isCloudUrl(filename)) return 0; return report_error(translate("gettextFromC", "Failed to read '%s'"), filename); } else if (ret == 0) { return report_error(translate("gettextFromC", "Empty file '%s'"), filename); } fmt = strrchr(filename, '.'); if (fmt && (!strcasecmp(fmt + 1, "DB") || !strcasecmp(fmt + 1, "BAK") || !strcasecmp(fmt + 1, "SQL"))) { if (!try_to_open_db(filename, &mem)) { free(mem.buffer); return 0; } } /* Divesoft Freedom */ if (fmt && (!strcasecmp(fmt + 1, "DLF"))) { if (!parse_dlf_buffer(mem.buffer, mem.size)) { free(mem.buffer); return 0; } return -1; } /* DataTrak/Wlog */ if (fmt && !strcasecmp(fmt + 1, "LOG")) { datatrak_import(filename, &dive_table); return 0; } /* OSTCtools */ if (fmt && (!strcasecmp(fmt + 1, "DIVE"))) { ostctools_import(filename, &dive_table); return 0; } ret = parse_file_buffer(filename, &mem); free(mem.buffer); return ret; }