diff --git a/qad/widgets/session_manager.cpp b/qad/widgets/session_manager.cpp index b46a67d..8f53ab2 100644 --- a/qad/widgets/session_manager.cpp +++ b/qad/widgets/session_manager.cpp @@ -1,9 +1,14 @@ #include #include +#include #include "session_manager.h" void SessionManager::setFile(const QString & file) { + if (file.isEmpty()) { + file_.clear(); + return; + } QFileInfo fi(file); if (fi.isAbsolute()) { file_ = file; @@ -26,7 +31,9 @@ void SessionManager::removeMainWidget(QWidget * e) { void SessionManager::save() { if (file_.isEmpty()) return; QPIConfig sr(file_); + QObjectList tsc; for (int i = 0; i < mwindows.size(); ++i) { + tsc << mwindows[i].second; sr.setValue(mwindows[i].first + " state", mwindows[i].second->saveState(), false); sr.setValue(mwindows[i].first + " window state", (int)mwindows[i].second->windowState(), false); sr.setValue(mwindows[i].first + " geometry " + QString::number((int)mwindows[i].second->windowState()), mwindows[i].second->saveGeometry(), false); @@ -35,6 +42,7 @@ void SessionManager::save() { sr.setValue(mwindows[i].first + " splitter " + s->objectName(), s->saveState(), false); } for (int i = 0; i < widgets.size(); ++i) { + tsc << widgets[i].second; sr.setValue(widgets[i].first + " geometry " + QString::number((int)widgets[i].second->windowState()), widgets[i].second->saveGeometry(), false); sr.setValue(widgets[i].first + " window state", (int)widgets[i].second->windowState(), false); } @@ -70,6 +78,22 @@ void SessionManager::save() { sr.setValue(ints[i].first, *ints[i].second, false); for (int i = 0; i < floats.size(); ++i) sr.setValue(floats[i].first, *floats[i].second, false); + QSet all_list; + foreach (QObject * c, tsc) { + all_list |= QSet::fromList(c->findChildren()); + } + QMap funcs = metaFunctions(all_list, "sessionSave"); + //qDebug() << "check for save" << all_list.size(); + foreach (QObject * o, all_list) { + const QMetaObject * mo = o->metaObject(); + QByteArray fn = funcs.value(mo); + if (!mo || fn.isEmpty()) continue; + QByteArray value; + //qDebug() << "save" << o->objectName(); + mo->invokeMethod(o, fn.constData(), Q_ARG(QByteArray*, &value)); + sr.setValue(o->objectName(), value, false); + } + //qDebug() << mcl.size(); sr.writeAll(); emit saving(sr); } @@ -78,7 +102,9 @@ void SessionManager::save() { void SessionManager::load(bool onlyMainwindow) { if (file_.isEmpty()) return; QPIConfig sr(file_); + QObjectList tsc; for (int i = 0; i < mwindows.size(); ++i) { + tsc << mwindows[i].second; mwindows[i].second->restoreState(sr.getValue(mwindows[i].first + " state", QByteArray())); mwindows[i].second->restoreGeometry(sr.getValue(mwindows[i].first + " geometry " + QString::number((int)mwindows[i].second->windowState()), QByteArray())); mwindows[i].second->setWindowState((Qt::WindowState)(int)sr.getValue(mwindows[i].first + " window state", 0)); @@ -87,6 +113,7 @@ void SessionManager::load(bool onlyMainwindow) { s->restoreState(sr.getValue(mwindows[i].first + " splitter " + s->objectName(), QByteArray())); } for (int i = 0; i < widgets.size(); ++i) { + tsc << widgets[i].second; widgets[i].second->restoreGeometry(sr.getValue(widgets[i].first + " geometry " + QString::number((int)widgets[i].second->windowState()), QByteArray())); widgets[i].second->setWindowState((Qt::WindowState)(int)sr.getValue(widgets[i].first + " window state", 0)); } @@ -131,11 +158,25 @@ void SessionManager::load(bool onlyMainwindow) { *ints[i].second = sr.getValue(ints[i].first, *ints[i].second); for (int i = 0; i < floats.size(); ++i) *floats[i].second = sr.getValue(floats[i].first, *floats[i].second); + QSet all_list; + foreach (QObject * c, tsc) { + all_list |= QSet::fromList(c->findChildren()); + } + QMap funcs = metaFunctions(all_list, "sessionLoad"); + //qDebug() << "check for load" << all_list.size(); + foreach (QObject * o, all_list) { + const QMetaObject * mo = o->metaObject(); + QByteArray fn = funcs.value(mo); + if (!mo || fn.isEmpty()) continue; + QByteArray value = sr.getValue(o->objectName(), QByteArray()); + //qDebug() << "load" << o->objectName(); + mo->invokeMethod(o, fn.constData(), Q_ARG(QByteArray*, &value)); + } emit loading(sr); } -void SessionManager::clear() { +void SessionManager::clear(bool with_filename) { mwindows.clear(); widgets.clear(); checks.clear(); @@ -154,4 +195,29 @@ void SessionManager::clear() { bools.clear(); ints.clear(); floats.clear(); + if (with_filename) setFile(""); +} + + +QMap SessionManager::metaFunctions(const QSet & objects, QByteArray fname) { + QMap funcs; + foreach (QObject * o, objects) { + const QMetaObject * mo = o->metaObject(); + if (!mo) continue; + QByteArray fn; + if (!funcs.contains(mo)) { + for (int i = 0; i < mo->methodCount(); ++i) { + QMetaMethod mm = mo->method(i); + if (mm.name() == fname) { + if (mm.parameterTypes().size() > 0) { + if (mm.parameterTypes()[0] == "QByteArray*") { + fn = mm.name(); + } + } + } + } + funcs[mo] = fn; + } else fn = funcs[mo]; + } + return funcs; } diff --git a/qad/widgets/session_manager.h b/qad/widgets/session_manager.h index 5251d89..107109c 100644 --- a/qad/widgets/session_manager.h +++ b/qad/widgets/session_manager.h @@ -15,6 +15,12 @@ #include "spinslider.h" #include "qpiconfig.h" +/// for all children widgets of "QMainWindow"s and MainWidgets +/// check for slots +/// * void sessionSave(QByteArray * data); +/// * void sessionLoad(QByteArray * data); + + class SessionManager: public QObject { Q_OBJECT @@ -59,9 +65,11 @@ public: void save(); void load(bool onlyMainwindow = false); - void clear(); + void clear(bool with_filename = true); private: + QMap metaFunctions(const QSet & objects, QByteArray fname); + QVector > mwindows; QVector > widgets; QVector > checks;