git-svn-id: svn://db.shs.com.ru/libs@439 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -1,9 +1,14 @@
|
||||
#include <QApplication>
|
||||
#include <QFileInfo>
|
||||
#include <QMetaMethod>
|
||||
#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<QObject*> all_list;
|
||||
foreach (QObject * c, tsc) {
|
||||
all_list |= QSet<QObject*>::fromList(c->findChildren<QObject*>());
|
||||
}
|
||||
QMap<const QMetaObject*, QByteArray> 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<QObject*> all_list;
|
||||
foreach (QObject * c, tsc) {
|
||||
all_list |= QSet<QObject*>::fromList(c->findChildren<QObject*>());
|
||||
}
|
||||
QMap<const QMetaObject*, QByteArray> 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<const QMetaObject *, QByteArray> SessionManager::metaFunctions(const QSet<QObject *> & objects, QByteArray fname) {
|
||||
QMap<const QMetaObject*, QByteArray> 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user