From 4bfce6c1250e46339acebc314357f70e2a859b26 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Mon, 15 Feb 2016 21:11:19 +0000
Subject: [PATCH] decouple ONELAB auto-save from auto-load, and activate
 auto-save by default

---
 Common/Context.h        |  3 ++-
 Common/DefaultOptions.h |  6 ++++--
 Common/Options.cpp      |  7 +++++++
 Common/Options.h        |  1 +
 Fltk/onelabGroup.cpp    | 19 +++++++++++++------
 5 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/Common/Context.h b/Common/Context.h
index 2f85aa0bf2..6014f4c8ed 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -259,7 +259,8 @@ class CTX {
     std::string socketName, pythonInterpreter, octaveInterpreter;
     std::string name[NUM_SOLVERS], extension[NUM_SOLVERS];
     std::string executable[NUM_SOLVERS], remoteLogin[NUM_SOLVERS];
-    int autoSaveDatabase, autoArchiveOutputFiles, autoMesh, autoMergeFile;
+    int autoSaveDatabase, autoLoadDatabase;
+    int autoArchiveOutputFiles, autoMesh, autoMergeFile;
     int autoShowViews, autoShowLastStep, autoCheck, showInvisibleParameters;
   }solver;
   // print options
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index e998901bc0..7fd61995c7 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1294,8 +1294,10 @@ StringXNumber SolverOptions_Number[] = {
     "Automatically archive output files after each computation" },
   { F|O, "AutoCheck" , opt_solver_auto_check , 1. ,
     "Automatically check model every time a parameter is changed" },
-  { F|O, "AutoSaveDatabase" , opt_solver_auto_save_database , 0. ,
-    "Automatically save database after each computation" },
+  { F|O, "AutoLoadDatabase" , opt_solver_auto_load_database , 0. ,
+    "Automatically load the ONELAB database when launching a solver" },
+  { F|O, "AutoSaveDatabase" , opt_solver_auto_save_database , 1. ,
+    "Automatically save the ONELAB database after each computation" },
   { F|O, "AutoMesh" , opt_solver_auto_mesh , 1. ,
     "Automatically mesh if necesssary (0: never remesh; 1: on startup, use existing "
     "mesh on disk if available; 2: always remesh)" },
diff --git a/Common/Options.cpp b/Common/Options.cpp
index ca0760cb2e..a16ea96580 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -6585,6 +6585,13 @@ double opt_solver_plugins(OPT_ARGS_NUM)
   return CTX::instance()->solver.plugins;
 }
 
+double opt_solver_auto_load_database(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->solver.autoLoadDatabase = (int)val;
+  return CTX::instance()->solver.autoLoadDatabase;
+}
+
 double opt_solver_auto_save_database(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
diff --git a/Common/Options.h b/Common/Options.h
index 71afb1ac84..0fd4df55ee 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -546,6 +546,7 @@ double opt_mesh_ignore_part_bound(OPT_ARGS_NUM);
 double opt_solver_listen(OPT_ARGS_NUM);
 double opt_solver_timeout(OPT_ARGS_NUM);
 double opt_solver_plugins(OPT_ARGS_NUM);
+double opt_solver_auto_load_database(OPT_ARGS_NUM);
 double opt_solver_auto_save_database(OPT_ARGS_NUM);
 double opt_solver_auto_archive_output_files(OPT_ARGS_NUM);
 double opt_solver_auto_check(OPT_ARGS_NUM);
diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index fe15adf551..8001f6e54f 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -201,7 +201,8 @@ void onelab_cb(Fl_Widget *w, void *data)
 
   if(action == "compute" && (CTX::instance()->solver.autoSaveDatabase ||
                              CTX::instance()->solver.autoArchiveOutputFiles)){
-    std::string db = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db";
+    std::vector<std::string> split = SplitFileName(GModel::current()->getFileName());
+    std::string db = split[0] + split[1] + ".db";
     if(CTX::instance()->solver.autoArchiveOutputFiles) archiveOutputFiles(db);
     if(CTX::instance()->solver.autoSaveDatabase) saveDb(db);
   }
@@ -221,6 +222,8 @@ void onelab_option_cb(Fl_Widget *w, void *data)
   double val = ((Fl_Menu_*)w)->mvalue()->value() ? 1. : 0.;
   if(what == "save")
     CTX::instance()->solver.autoSaveDatabase = val;
+  else if(what == "load")
+    CTX::instance()->solver.autoLoadDatabase = val;
   else if(what == "archive")
     CTX::instance()->solver.autoArchiveOutputFiles = val;
   else if(what == "check"){
@@ -464,7 +467,9 @@ onelabGroup::onelabGroup(int x, int y, int w, int h, const char *l)
 
   _gearOptionsStart = _gear->menu()->size();
 
-  _gear->add("Save && load database automatically", 0, onelab_option_cb, (void*)"save",
+  _gear->add("Save database automatically", 0, onelab_option_cb, (void*)"save",
+             FL_MENU_TOGGLE);
+  _gear->add("Load database automatically", 0, onelab_option_cb, (void*)"load",
              FL_MENU_TOGGLE);
   _gear->add("Archive output files automatically", 0, onelab_option_cb, (void*)"archive",
              FL_MENU_TOGGLE);
@@ -1253,7 +1258,8 @@ std::string onelabGroup::getPath(Fl_Tree_Item *item)
 void onelabGroup::updateGearMenu()
 {
   Fl_Menu_Item* menu = (Fl_Menu_Item*)_gear->menu();
-  int values[8] = {CTX::instance()->solver.autoSaveDatabase,
+  int values[9] = {CTX::instance()->solver.autoSaveDatabase,
+                   CTX::instance()->solver.autoLoadDatabase,
                    CTX::instance()->solver.autoArchiveOutputFiles,
                    CTX::instance()->solver.autoCheck,
                    CTX::instance()->solver.autoMesh,
@@ -1261,7 +1267,7 @@ void onelabGroup::updateGearMenu()
                    CTX::instance()->solver.autoShowViews,
                    CTX::instance()->solver.autoShowLastStep,
                    CTX::instance()->solver.showInvisibleParameters};
-  for(int i = 0; i < 8; i++){
+  for(int i = 0; i < 9; i++){
     int idx = _gearOptionsStart - 1 + i;
     if(values[i])
       menu[idx].set();
@@ -1365,8 +1371,9 @@ void solver_cb(Fl_Widget *w, void *data)
     FlGui::instance()->onelab->rebuildSolverList();
   }
 
-  if(CTX::instance()->solver.autoSaveDatabase){
-    std::string db = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db";
+  if(CTX::instance()->solver.autoLoadDatabase){
+    std::vector<std::string> split = SplitFileName(GModel::current()->getFileName());
+    std::string db = split[0] + split[1] + ".db";
     if(!StatFile(db)){
       loadDb(db);
       CTX::instance()->launchSolverAtStartup = -1;
-- 
GitLab