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): ...@@ -86,7 +86,7 @@ class Study(SQLModel):
def is_saved(self): def is_saved(self):
return self.status.is_saved() return self.status.is_saved()
def save(self): def save(self, progress=None):
# Save a copy of database # Save a copy of database
fdir, fname = os.path.split(self.filename) fdir, fname = os.path.split(self.filename)
...@@ -110,7 +110,7 @@ class Study(SQLModel): ...@@ -110,7 +110,7 @@ class Study(SQLModel):
# Save # Save
self.last_save_date = datetime.now() self.last_save_date = datetime.now()
self._save() self._save(progress=progress)
self.status.save() self.status.save()
@property @property
...@@ -266,38 +266,53 @@ class Study(SQLModel): ...@@ -266,38 +266,53 @@ class Study(SQLModel):
return new return new
def _save(self): def _save(self, progress=lambda: None):
self.execute( self.execute(
f"UPDATE info SET " + f"UPDATE info SET " +
f"value='{self._db_format(self.name)}' WHERE key='name'" f"value='{self._db_format(self.name)}' WHERE key='name'"
) )
progress()
self.execute( self.execute(
f"UPDATE info SET " + f"UPDATE info SET " +
f"value='{self._db_format(self.description)}' " + f"value='{self._db_format(self.description)}' " +
"WHERE key='description'" "WHERE key='description'"
) )
progress()
self.execute( self.execute(
f"UPDATE info SET " + f"UPDATE info SET " +
f"value='{self._time_system}' WHERE key='time_system'" f"value='{self._time_system}' WHERE key='time_system'"
) )
progress()
self.execute( self.execute(
f"UPDATE info SET " + f"UPDATE info SET " +
f"value='{timestamp(self._date)}' WHERE key='date'" f"value='{timestamp(self._date)}' WHERE key='date'"
) )
progress()
self.execute( self.execute(
f"UPDATE info SET " + f"UPDATE info SET " +
f"value='{timestamp(self.creation_date)}' " + f"value='{timestamp(self.creation_date)}' " +
"WHERE key='creation_date'" "WHERE key='creation_date'"
) )
progress()
self.execute( self.execute(
f"UPDATE info SET " + f"UPDATE info SET " +
f"value='{timestamp(self.last_save_date)}' " + f"value='{timestamp(self.last_save_date)}' " +
"WHERE key='last_save_date'" "WHERE key='last_save_date'"
) )
progress()
self._save_submodel([self._river]) self._save_submodel([self._river], data=progress)
self.commit() 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): def close(self):
"""Close db connection """Close db connection
......
...@@ -21,6 +21,7 @@ import sqlite3 ...@@ -21,6 +21,7 @@ import sqlite3
import logging import logging
from pathlib import Path from pathlib import Path
from functools import reduce
from tools import SQL from tools import SQL
from Model.Except import NotImplementedMethodeError from Model.Except import NotImplementedMethodeError
...@@ -87,11 +88,18 @@ class SQLModel(SQL): ...@@ -87,11 +88,18 @@ class SQLModel(SQL):
raise NotImplementedMethodeError(self, self._update) raise NotImplementedMethodeError(self, self._update)
def _save_submodel(self, objs, data=None): def _save_submodel(self, objs, data=None):
def fn(sql): return self.execute( progress = lambda: None
sql, if data is not None:
fetch_one=False, progress = data
commit=False
) def fn(sql):
res = self.execute(
sql,
fetch_one=False,
commit=False
)
progress()
return res
ok = True ok = True
for obj in objs: for obj in objs:
...@@ -100,9 +108,43 @@ class SQLModel(SQL): ...@@ -100,9 +108,43 @@ class SQLModel(SQL):
self.commit() self.commit()
return ok return ok
def _save(self): def _save(self, progress=None):
raise NotImplementedMethodeError(self, self._save) 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 @classmethod
def _load(cls, filename=None): def _load(cls, filename=None):
raise NotImplementedMethodeError(cls, cls._load) raise NotImplementedMethodeError(cls, cls._load)
......
...@@ -28,12 +28,12 @@ from PyQt5.QtGui import ( ...@@ -28,12 +28,12 @@ from PyQt5.QtGui import (
) )
from PyQt5.QtCore import ( from PyQt5.QtCore import (
QTranslator, QEvent, QUrl, Qt, QTranslator, QEvent, QUrl,
) )
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QMainWindow, QApplication, QAction, QMainWindow, QApplication, QAction,
QFileDialog, QShortcut, QMenu, QToolBar, QFileDialog, QShortcut, QMenu, QToolBar,
QMessageBox, QMessageBox, QProgressDialog,
) )
from PyQt5.uic import loadUi from PyQt5.uic import loadUi
...@@ -406,8 +406,21 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): ...@@ -406,8 +406,21 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
if self._study.is_saved: if self._study.is_saved:
return 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...") logger.info("Save...")
self._study.save() self._study.save(
progress=lambda: progress.setValue(progress.value() + 1)
)
logger.info("Done")
def save_as_study(self): def save_as_study(self):
"""Save current study as new file """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