implement "typical" save and close conventions.
[mussa.git] / qui / MussaWindow.cpp
index 1e8d06cb3ddfb1adb9572633eada961da07968d4..8d51ab542d208b2d6b473a1adeaeab5225e9ee79 100644 (file)
@@ -5,6 +5,7 @@
 #include <QAction>
 #include <QApplication>
 #include <QAssistantClient>
+#include <QCloseEvent>
 #include <QDir>
 #include <QFileDialog>
 #include <QHBoxLayout>
@@ -130,9 +131,15 @@ void MussaWindow::setupActions()
   connect(createSubAnalysisAction, SIGNAL(triggered()), 
           this, SLOT(createSubAnalysis()));
 
-  saveAnalysisAction = new QAction(tr("Save Analysis"), this);
+  saveAnalysisAction = new QAction(tr("&Save Analysis"), this);
   connect(saveAnalysisAction, SIGNAL(triggered()), 
           this, SLOT(saveAnalysis()));
+  saveAnalysisAction->setIcon(QIcon(":/icons/filesave.png"));
+
+  saveAnalysisAsAction = new QAction(tr("Save Analysis &As"), this);
+  connect(saveAnalysisAsAction, SIGNAL(triggered()), 
+          this, SLOT(saveAnalysisAs()));
+  saveAnalysisAsAction->setIcon(QIcon(":/icons/filesave.png"));
 
   editMotifsAction = new QAction(tr("Edit Motifs"), this);;
   connect(editMotifsAction, SIGNAL(triggered()), this, SLOT(editMotifs()));
@@ -202,6 +209,15 @@ void MussaWindow::setupActions()
 
 }
 
+void MussaWindow::closeEvent(QCloseEvent *event)
+{
+  if(isClearingAnalysisSafe()) {
+    event->accept();
+  } else {
+    event->ignore();
+  }
+}
+
 void MussaWindow::setupMainMenu()
 {
   // we need to run setupActions first
@@ -214,6 +230,7 @@ void MussaWindow::setupMainMenu()
   newMenu->addAction(loadMupaAction);
   newMenu->addAction(loadSavedAnalysisAction);
   newMenu->addAction(saveAnalysisAction);
+  newMenu->addAction(saveAnalysisAsAction);
   newMenu->addSeparator();
   newMenu->addAction(loadMotifListAction);
   newMenu->addAction(saveMotifListAction);
@@ -311,6 +328,21 @@ void MussaWindow::createSubAnalysis()
 }
 
 void MussaWindow::saveAnalysis()
+{
+  // if we've got an analysis
+  if (analysis and not analysis->empty()) {
+    // if it doesn't have a name we need to pick one
+    if (analysis->get_analysis_path().empty()) {
+      saveAnalysisAs();
+    }      
+    // if we've got a name, has it changed any?
+    else if (analysis->is_dirty()) {
+      analysis->save();
+    }
+  }
+}
+
+void MussaWindow::saveAnalysisAs()
 {
   std::auto_ptr<QFileDialog> dialog(new QFileDialog(this));
   dialog->setAcceptMode(QFileDialog::AcceptSave);
@@ -343,6 +375,35 @@ void MussaWindow::saveAnalysis()
   analysis->save(save_path);
 }
 
+bool MussaWindow::isClearingAnalysisSafe()
+{
+  if (analysis and not analysis->empty() and analysis->is_dirty()) {
+    switch (QMessageBox::question(
+      this,
+      tr("Save Unsaved Changes -- Mussa"),
+      tr("There are unsaved changes,\ndo you want to save?"),
+      tr("&Yes"), tr("&No"), tr("&Cancel"),
+      0, 2)) {
+    case 0:
+      // save
+      saveAnalysis();
+      break;
+    case 1:
+      // don't save
+      break;
+    case 2:
+      // don't replace 
+      return false;
+      break;
+    default:
+      // error
+      throw runtime_error("isClearingAnalysis QMesageBox failure");
+    }
+  } 
+  // if we're here we've been saved and can replace
+  return true;
+}
+
 void MussaWindow::editMotifs()
 {
   if (motif_editor != 0) {