#include "widgetstate.h" #include "debug.h" #include #include #include #include #include #include namespace { enum class Action { Save, Restore }; void handleGeometry(QSettings *settings, QWidget *widget, Action action) { SOFT_ASSERT(widget, return ); if (widget->parent()) return; const auto name = widget->objectName() + QLatin1String("_geometry"); if (action == Action::Save) { settings->setValue(name, widget->geometry()); } else { if (settings->contains(name)) widget->setGeometry(settings->value(name).toRect()); } } template void handleState(QSettings *settings, QWidget *widget, Action action) { auto instance = qobject_cast(widget); if (!instance) return; const auto name = widget->objectName() + QLatin1Char('_') + typeid(T).name(); if (action == Action::Save) settings->setValue(name, instance->saveState()); else instance->restoreState(settings->value(name).toByteArray()); } void handleWidget(QSettings *settings, QWidget *widget, Action action) { SOFT_ASSERT(widget, return ); if (!widget->objectName().isEmpty()) { handleGeometry(settings, widget, action); handleState(settings, widget, action); handleState(settings, widget, action); handleState(settings, widget, action); } settings->beginGroup(widget->objectName()); const auto children = widget->findChildren(QString(), Qt::FindDirectChildrenOnly); for (auto *child : children) { handleWidget(settings, child, action); } settings->endGroup(); } void apply(QWidget *widget, Action action) { QSettings settings; settings.beginGroup(QStringLiteral("GUI")); handleWidget(&settings, widget, action); settings.endGroup(); } } // namespace WidgetState::WidgetState(QWidget *parent) : QObject(parent) { add(parent); } void WidgetState::add(QWidget *watched) { if (!watched) return; watched->installEventFilter(this); } bool WidgetState::eventFilter(QObject *watched, QEvent *event) { if (event->type() != QEvent::Show && event->type() != QEvent::Hide) return QObject::eventFilter(watched, event); auto widget = qobject_cast(watched); if (!widget) return QObject::eventFilter(watched, event); if (event->type() == QEvent::Show) restore(widget); else if (event->type() == QEvent::Hide) save(widget); return QObject::eventFilter(watched, event); } void WidgetState::save(QWidget *widget) { SOFT_ASSERT(widget, return ); SOFT_ASSERT(!widget->objectName().isEmpty(), return ); apply(widget, Action::Save); } void WidgetState::restore(QWidget *widget) { if (QCoreApplication::arguments().contains(QLatin1String("--reset-gui"))) return; SOFT_ASSERT(widget, return ); SOFT_ASSERT(!widget->objectName().isEmpty(), return ); apply(widget, Action::Restore); }