bool MainWindow::savePath(const QString &path) { if (!controller) return false; if (path.isEmpty()) return showSaveAsDialog(); const FileFormat *format = FileFormats.findFormatForFilename(path); if (format->isExportLossy()) { QString message = tr("This map is being saved as a \"%1\" file. Information may be lost.\n\nPress Yes to save in this format.\nPress No to choose a different format.").arg(format->description()); int result = QMessageBox::warning(this, tr("Warning"), message, QMessageBox::Yes, QMessageBox::No); if (result != QMessageBox::Yes) return showSaveAsDialog(); } if (!controller->save(path)) return false; setMostRecentlyUsedFile(path); setHasAutosaveConflict(false); removeAutosaveFile(); if (path != currentPath()) { setCurrentPath(path); removeAutosaveFile(); } setHasUnsavedChanges(false); return true; }
void MainWindow::switchActualPath(const QString& path) { if (path == actual_path) { return; } int ret = QMessageBox::Ok; if (has_unsaved_changes) { ret = QMessageBox::warning(this, appName(), tr("The file has been modified.\n" "Do you want to discard your changes?"), QMessageBox::Discard | QMessageBox::Cancel); } if (ret != QMessageBox::Cancel) { const QString& current_path = currentPath(); MainWindowController* const new_controller = MainWindowController::controllerForFile(current_path); if (new_controller && new_controller->load(path, this)) { setController(new_controller, current_path); actual_path = path; setHasUnsavedChanges(false); } } emit actualPathChanged(actual_path); activateWindow(); }
void Template::unloadTemplateFile() { Q_ASSERT(template_state == Loaded); if (hasUnsavedChanges()) { // The changes are lost setHasUnsavedChanges(false); } unloadTemplateFileImpl(); template_state = Unloaded; emit templateStateChanged(); }
void Template::saveTemplateConfiguration(QXmlStreamWriter& xml, bool open) { xml.writeStartElement("template"); xml.writeAttribute("open", open ? "true" : "false"); xml.writeAttribute("name", getTemplateFilename()); xml.writeAttribute("path", getTemplatePath()); xml.writeAttribute("relpath", getTemplateRelativePath()); if (is_georeferenced) xml.writeAttribute("georef", "true"); else { xml.writeAttribute("group", QString::number(template_group)); xml.writeStartElement("transformations"); if (adjusted) xml.writeAttribute("adjusted", "true"); if (adjustment_dirty) xml.writeAttribute("adjustment_dirty", "true"); int num_passpoints = (int)passpoints.size(); xml.writeAttribute("passpoints", QString::number(num_passpoints)); transform.save(xml, "active"); other_transform.save(xml, "other"); for (int i = 0; i < num_passpoints; ++i) passpoints[i].save(xml); map_to_template.save(xml, "map_to_template"); template_to_map.save(xml, "template_to_map"); template_to_map_other.save(xml, "template_to_map_other"); xml.writeEndElement(/*transformations*/); } saveTypeSpecificTemplateConfiguration(xml); if (open && hasUnsavedChanges()) { // Save the template itself (e.g. image, gpx file, etc.) saveTemplateFile(); setHasUnsavedChanges(false); // TODO: Error handling? } xml.writeEndElement(/*template*/); }
void Template::drawOntoTemplate(MapCoordF* coords, int num_coords, QColor color, float width, QRectF map_bbox) { Q_ASSERT(canBeDrawnOnto()); Q_ASSERT(num_coords > 1); if (!map_bbox.isValid()) { map_bbox = QRectF(coords[0].x(), coords[0].y(), 0, 0); for (int i = 1; i < num_coords; ++i) rectInclude(map_bbox, coords[i]); } float radius = qMin(getTemplateScaleX(), getTemplateScaleY()) * qMax((width+1) / 2, 1.0f); QRectF radius_bbox = QRectF(map_bbox.left() - radius, map_bbox.top() - radius, map_bbox.width() + 2*radius, map_bbox.height() + 2*radius); drawOntoTemplateImpl(coords, num_coords, color, width); map->setTemplateAreaDirty(this, radius_bbox, 0); setHasUnsavedChanges(true); }
void MainWindow::setController(MainWindowController* new_controller, bool has_file) { if (controller) { controller->detach(); delete controller; controller = nullptr; if (show_menu) menuBar()->clear(); delete general_toolbar; general_toolbar = nullptr; } has_opened_file = has_file; shortcuts_blocked = false; if (create_menu) createFileMenu(); controller = new_controller; controller->attach(this); if (create_menu) createHelpMenu(); #if defined(Q_OS_MAC) if (isVisible() && qApp->activeWindow() == this) { // Force a menu synchronisation, // QCocoaMenuBar::updateMenuBarImmediately(), // via QCocoaNativeInterface::onAppFocusWindowChanged(). qApp->focusWindowChanged(qApp->focusWindow()); } #endif setHasAutosaveConflict(false); setHasUnsavedChanges(false); }
void TemplateImage::drawOntoTemplateUndo(bool redo) { int step_index; if (!redo) { step_index = undo_index - 1; if (step_index < 0) return; } else { step_index = undo_index; if (step_index >= static_cast<int>(undo_steps.size())) return; } DrawOnImageUndoStep& step = undo_steps[step_index]; QImage undo_image = step.image.copy(); step.image = image.copy(step.x, step.y, step.image.width(), step.image.height()); QPainter painter(&image); painter.setCompositionMode(QPainter::CompositionMode_Source); painter.drawImage(step.x, step.y, undo_image); undo_index += redo ? 1 : -1; qreal template_left = step.x - 0.5 * image.width(); qreal template_top = step.y - 0.5 * image.height(); QRectF map_bbox; rectIncludeSafe(map_bbox, templateToMap(QPointF(template_left, template_top))); rectIncludeSafe(map_bbox, templateToMap(QPointF(template_left + step.image.width(), template_top))); rectIncludeSafe(map_bbox, templateToMap(QPointF(template_left, template_top + step.image.height()))); rectIncludeSafe(map_bbox, templateToMap(QPointF(template_left + step.image.width(), template_top + step.image.height()))); map->setTemplateAreaDirty(this, map_bbox, 0); setHasUnsavedChanges(true); }