Commit 1acd582d authored by Pierre-Antoine Rouby's avatar Pierre-Antoine Rouby
Browse files

MainWindow: Add progress dialog for save process.

Showing with 83 additions and 13 deletions
+83 -13
......@@ -86,7 +86,7 @@ class Study(SQLModel):
def is_saved(self):
return self.status.is_saved()
def save(self):
def save(self, progress=None):
# Save a copy of database
fdir, fname = os.path.split(self.filename)
......@@ -110,7 +110,7 @@ class Study(SQLModel):
# Save
self.last_save_date = datetime.now()
self._save()
self._save(progress=progress)
self.status.save()
@property
......@@ -266,38 +266,53 @@ class Study(SQLModel):
return new
def _save(self):
def _save(self, progress=lambda: None):
self.execute(
f"UPDATE info SET " +
f"value='{self._db_format(self.name)}' WHERE key='name'"
)
progress()
self.execute(
f"UPDATE info SET " +
f"value='{self._db_format(self.description)}' " +
"WHERE key='description'"
)
progress()
self.execute(
f"UPDATE info SET " +
f"value='{self._time_system}' WHERE key='time_system'"
)
progress()
self.execute(
f"UPDATE info SET " +
f"value='{timestamp(self._date)}' WHERE key='date'"
)
progress()
self.execute(
f"UPDATE info SET " +
f"value='{timestamp(self.creation_date)}' " +
"WHERE key='creation_date'"
)
progress()
self.execute(
f"UPDATE info SET " +
f"value='{timestamp(self.last_save_date)}' " +
"WHERE key='last_save_date'"
)
progress()
self._save_submodel([self._river])
self._save_submodel([self._river], data=progress)
self.commit()
def sql_save_request_count(self):
return self._count()
def _count(self):
cnt = self._save_count([self._river])
logger.debug(cnt)
return cnt + 6
def close(self):
"""Close db connection
......
......@@ -21,6 +21,7 @@ import sqlite3
import logging
from pathlib import Path
from functools import reduce
from tools import SQL
from Model.Except import NotImplementedMethodeError
......@@ -87,11 +88,18 @@ class SQLModel(SQL):
raise NotImplementedMethodeError(self, self._update)
def _save_submodel(self, objs, data=None):
def fn(sql): return self.execute(
sql,
fetch_one=False,
commit=False
)
progress = lambda: None
if data is not None:
progress = data
def fn(sql):
res = self.execute(
sql,
fetch_one=False,
commit=False
)
progress()
return res
ok = True
for obj in objs:
......@@ -100,9 +108,43 @@ class SQLModel(SQL):
self.commit()
return ok
def _save(self):
def _save(self, progress=None):
raise NotImplementedMethodeError(self, self._save)
def _count(self):
raise NotImplementedMethodeError(self, self._count)
def _save_count(self, objs, data=None):
counter = {
"insert" : 0,
"update" : 0,
"delete" : 0,
"other" : 0,
}
def fn(sql):
if "insert" in sql.lower():
counter["insert"] = counter["insert"] + 1
elif "update" in sql.lower():
counter["update"] = counter["update"] + 1
elif "delete" in sql.lower():
counter["delete"] = counter["delete"] + 1
else:
counter["other"] = counter["other"] + 1
return []
ok = True
for obj in objs:
ok &= obj._db_save(fn)
logger.debug(counter)
return reduce(
lambda acc, k: acc + counter[k],
counter,
0
)
@classmethod
def _load(cls, filename=None):
raise NotImplementedMethodeError(cls, cls._load)
......
......@@ -28,12 +28,12 @@ from PyQt5.QtGui import (
)
from PyQt5.QtCore import (
QTranslator, QEvent, QUrl,
Qt, QTranslator, QEvent, QUrl,
)
from PyQt5.QtWidgets import (
QMainWindow, QApplication, QAction,
QFileDialog, QShortcut, QMenu, QToolBar,
QMessageBox,
QMessageBox, QProgressDialog,
)
from PyQt5.uic import loadUi
......@@ -406,8 +406,21 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
if self._study.is_saved:
return
sql_request_count = self._study.sql_save_request_count()
progress = QProgressDialog(
"Saving...", "Cancel",
0, sql_request_count,
parent=self
)
progress.setWindowModality(Qt.WindowModal)
progress.setValue(0)
logger.info("Save...")
self._study.save()
self._study.save(
progress=lambda: progress.setValue(progress.value() + 1)
)
logger.info("Done")
def save_as_study(self):
"""Save current study as new file
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment