mirror of https://gitlab.com/pamhyr/pamhyr2
MainWindow: Add progress dialog for save process.
parent
8ce5a4d215
commit
1acd582de9
|
|
@ -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(
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue