@@ -47,10 +47,30 @@ WindowStateStorage::~WindowStateStorage()
47 m_db.close();
47 m_db.close();
50−void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
50+void WindowStateStorage::saveState(const QString &windowId, WindowStateStorage::WindowState state)
52− QMutexLocker mutexLocker(&s_mutex);
52+ QString queryString = QString("INSERT OR REPLACE INTO state (windowId, state) values ('%1', '%2');")
56+ saveValue(queryString);
59+WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue)
61+ QString queryString = QString("SELECT * FROM state WHERE windowId = '%1';")
64+ QSqlQuery query = getValue(queryString);
66+ if (!query.first()) {
69+ return (WindowState)query.value("state").toInt();
72+void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
54 QString queryString = QString("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
74 QString queryString = QString("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
55 .arg(windowId)
75 .arg(windowId)
56 .arg(rect.x())
76 .arg(rect.x())
@@ -58,15 +78,7 @@ void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect
58 .arg(rect.width())
78 .arg(rect.width())
59 .arg(rect.height());
79 .arg(rect.height());
61− QFuture<void> future = QtConcurrent::run(executeAsyncQuery, queryString);
81+ saveValue(queryString);
62− m_asyncQueries.append(future);
64− QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
65− futureWatcher->setFuture(future);
66− connect(futureWatcher, &QFutureWatcher<void>::finished,
68− [=](){ m_asyncQueries.removeAll(futureWatcher->future());
69− futureWatcher->deleteLater(); });
72void WindowStateStorage::executeAsyncQuery(const QString &queryString)
84void WindowStateStorage::executeAsyncQuery(const QString &queryString)
@@ -84,18 +96,11 @@ void WindowStateStorage::executeAsyncQuery(const QString &queryString)
85QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue)
97QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue)
87− QMutexLocker l(&s_mutex);
88 QString queryString = QString("SELECT * FROM geometry WHERE windowId = '%1';")
99 QString queryString = QString("SELECT * FROM geometry WHERE windowId = '%1';")
89 .arg(windowId);
100 .arg(windowId);
92− bool ok = query.exec(queryString);
102+ QSqlQuery query = getValue(queryString);
94− qWarning() << "Error retrieving window state for" << windowId
95− << "Driver error:" << query.lastError().driverText()
96− << "Database error:" << query.lastError().databaseText();
99 if (!query.first()) {
104 if (!query.first()) {
100 return defaultValue;
105 return defaultValue;
@@ -114,4 +119,38 @@ void WindowStateStorage::initdb()
114 QSqlQuery query;
119 QSqlQuery query;
115 query.exec("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");
120 query.exec("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");
123+ if (!m_db.tables().contains("state")) {
125+ query.exec("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);");
129+void WindowStateStorage::saveValue(const QString &queryString)
131+ QMutexLocker mutexLocker(&s_mutex);
133+ QFuture<void> future = QtConcurrent::run(executeAsyncQuery, queryString);
134+ m_asyncQueries.append(future);
136+ QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
137+ futureWatcher->setFuture(future);
138+ connect(futureWatcher, &QFutureWatcher<void>::finished,
140+ [=](){ m_asyncQueries.removeAll(futureWatcher->future());
141+ futureWatcher->deleteLater(); });
144+QSqlQuery WindowStateStorage::getValue(const QString &queryString)
146+ QMutexLocker l(&s_mutex);
149+ bool ok = query.exec(queryString);
151+ qWarning() << "Error retrieving database query:" << queryString
152+ << "Driver error:" << query.lastError().driverText()
153+ << "Database error:" << query.lastError().databaseText();