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):
|
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):
|
||||||
|
|
||||||
# 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):
|
||||||
|
|
||||||
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
|
||||||
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):
|
||||||
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):
|
||||||
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 (
|
||||||
)
|
)
|
||||||
|
|
||||||
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):
|
||||||
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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue