diff --git a/src/libHeaven/App/Mode.cpp b/src/libHeaven/App/Mode.cpp index 72771c8..a546845 100644 --- a/src/libHeaven/App/Mode.cpp +++ b/src/libHeaven/App/Mode.cpp @@ -40,6 +40,7 @@ namespace Heaven if( !tryLoadConfig() ) { d->mRoot = d->mOriginalState; + d->mRoot->setReadOnly(true); } } diff --git a/src/libHeaven/App/Mode.hpp b/src/libHeaven/App/Mode.hpp index ad2c209..a32c021 100644 --- a/src/libHeaven/App/Mode.hpp +++ b/src/libHeaven/App/Mode.hpp @@ -29,7 +29,7 @@ class QDomElement; namespace Heaven { - class WindowStateRoot; + class WindowStateRoot; //<- Internal class, we don't want to include it, thus the QESDP below class ModePrivate; class ApplicationPrivate; diff --git a/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.cpp b/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.cpp index f01513a..6ef2b10 100644 --- a/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.cpp +++ b/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.cpp @@ -93,4 +93,28 @@ namespace Heaven return mSplitter->orientation() == Qt::Vertical; } + QList SplitterContainerWidget::transformedSizes() + { + QList sizes = mSplitter->sizes(); + int w = width(); + + for (int i = 0; i < sizes.count(); i++) { + sizes[i] = sizes[i] * 10000 / w; + } + + return sizes; + } + + void SplitterContainerWidget::setTransformedSizes(const QList sizes) + { + QList realSizes; + int w = width(); + + for (int i = 0; i < sizes.count(); i++) { + realSizes << sizes[i] * w / 10000; + } + + mSplitter->setSizes(realSizes); + } + } diff --git a/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.hpp b/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.hpp index 590c762..68e7a9f 100644 --- a/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.hpp +++ b/src/libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.hpp @@ -46,6 +46,10 @@ namespace Heaven void setVertical( bool vert ); bool isVertical() const; + public: + QList transformedSizes(); + void setTransformedSizes(const QList sizes); + private: MiniSplitter* mSplitter; }; diff --git a/src/libHeaven/CentralUI/States/WindowState.cpp b/src/libHeaven/CentralUI/States/WindowState.cpp index ab56b79..8e2b42f 100644 --- a/src/libHeaven/CentralUI/States/WindowState.cpp +++ b/src/libHeaven/CentralUI/States/WindowState.cpp @@ -17,8 +17,12 @@ */ #include +#include +#include +#include #include #include +#include #include "libHeaven/App/Application.hpp" #include "libHeaven/App/PrimaryWindow.hpp" @@ -42,6 +46,24 @@ namespace Heaven } } + WindowState::WindowState(WindowState* parent, WindowState* cloneFrom) + : mParent(parent) + , mCurrentContent(NULL) + { + Q_ASSERT(cloneFrom); + + if (mParent) { + mParent->mChildren.append(Ptr(this)); + } + + mId = cloneFrom->mId; + mOptions = cloneFrom->mOptions; + + foreach(const WindowState::Ptr& child, cloneFrom->children()) { + child->clone(this); + } + } + WindowState::~WindowState() { Q_ASSERT( mChildren.count() == 0 ); @@ -125,12 +147,20 @@ namespace Heaven void WindowState::updateConfig() { - foreach( const WindowState::Ptr& ws, mChildren ) + foreach(const WindowState::Ptr& ws, mChildren) { ws->updateConfig(); } } + void WindowState::applyConfig() + { + foreach(const WindowState::Ptr& ws, mChildren) + { + ws->applyConfig(); + } + } + AbstractViewWidget* WindowState::currentContent() { return mCurrentContent; @@ -174,4 +204,97 @@ namespace Heaven mId = id; } + void WindowState::readOptions(const QDomElement& el) + { + for (int i = 0; i < el.attributes().count(); i++) { + QDomAttr a = el.attributes().item(i).toAttr(); + if (a.name().startsWith(QLatin1String("Opt"))) { + QString opt = a.name().mid(4); + QByteArray binData = a.value().toUtf8(); + QDataStream stream(&binData, QIODevice::ReadOnly); + QVariant vData; + stream >> vData; + mOptions.insert(opt, vData); + } + } + } + + void WindowState::saveOptions(QDomElement &el) const + { + foreach (QString name, mOptions.keys()) { + QVariant vData = mOptions.value(name); + QString sData; + QByteArray binData; + QDataStream stream(&binData, QIODevice::WriteOnly); + stream << vData; + sData = QString::fromUtf8(binData.constData()); + el.setAttribute(QLatin1Literal("Opt") % name, sData); + } + } + + void WindowState::setOption(const QString& name, const QVariant& vData) + { + mOptions[name] = vData; + } + + void WindowState::unsetOption(const QString& name) + { + mOptions.remove(name); + } + + QVariant WindowState::option(const QString& name) const + { + return mOptions.value(name, QVariant()); + } + + bool WindowState::isOptionSet(const QString& name) const + { + return mOptions.contains(name); + } + + void WindowState::setWidget(QWidget* widget) + { + mWidget = widget; + + if (mWidget) { + applyConfig(); + } + } + + void WindowState::clearWidgets() + { + if (mWidget) { + updateConfig(); + } + + mWidget = NULL; + + foreach (WindowState::Ptr pChild, mChildren) { + pChild->clearWidgets(); + } + } + + QWidget* WindowState::widget() const + { + return mWidget; + } + + Mode* WindowState::mode() + { + if (mParent) { + return mParent->mode(); + } + + return NULL; + } + + WindowStateRoot* WindowState::root() + { + if (mParent) { + return mParent->root(); + } + + return NULL; + } + } diff --git a/src/libHeaven/CentralUI/States/WindowState.hpp b/src/libHeaven/CentralUI/States/WindowState.hpp index 77f14ce..abd47aa 100644 --- a/src/libHeaven/CentralUI/States/WindowState.hpp +++ b/src/libHeaven/CentralUI/States/WindowState.hpp @@ -20,6 +20,8 @@ #define HEAVEN_WINDOW_STATE_HPP #include +#include +#include #include #include @@ -31,6 +33,9 @@ class QDomElement; namespace Heaven { + class Mode; + class WindowStateRoot; + class WindowState : public QSharedData { public: @@ -55,6 +60,9 @@ namespace Heaven public: typedef QExplicitlySharedDataPointer< WindowState > Ptr; + protected: + WindowState(WindowState* parent, WindowState* cloneFrom); + public: WindowState( WindowState* parent ); virtual ~WindowState(); @@ -67,6 +75,13 @@ namespace Heaven QVector< WindowState::Ptr > children() const; virtual void updateConfig(); + virtual void applyConfig(); + + public: + void setOption(const QString& name, const QVariant& vData); + void unsetOption(const QString& name); + QVariant option(const QString& name) const; + bool isOptionSet(const QString& name) const; public: ViewIdentifier identifier() const; @@ -75,25 +90,39 @@ namespace Heaven void setCurrentContent( AbstractViewWidget* avw ); AbstractViewWidget* currentContent(); + public: + void setWidget(QWidget* widget); + QWidget* widget() const; + void clearWidgets(); + + virtual Mode* mode(); + virtual WindowStateRoot* root(); + protected: - void readChildren( const QDomElement& elParent, ChildTypes allowed ); - void readOrCreateIdentifier( const QDomElement& el ); + void readOptions(const QDomElement& el); + void readChildren(const QDomElement& elParent, ChildTypes allowed); + void readOrCreateIdentifier(const QDomElement& el); + + void saveChildren(QDomElement& elParent) const; + void saveIdentifier(QDomElement& el) const; + void saveOptions(QDomElement& el) const; - void saveChildren( QDomElement& elParent ) const; - void saveIdentifier( QDomElement& el ) const; + virtual WindowState* clone(WindowState* toParent) = 0; public: virtual void save( QDomElement& elParent ) const = 0; private: WindowState* mParent; - AbstractViewWidget * mCurrentContent; + AbstractViewWidget* mCurrentContent; QVector< WindowState::Ptr > mChildren; - ViewIdentifier mId; + ViewIdentifier mId; + QVariantHash mOptions; + QPointer< QWidget > mWidget; }; } -Q_DECLARE_OPERATORS_FOR_FLAGS( Heaven::WindowState::ChildTypes ); +Q_DECLARE_OPERATORS_FOR_FLAGS(Heaven::WindowState::ChildTypes) #endif diff --git a/src/libHeaven/CentralUI/States/WindowStateRoot.cpp b/src/libHeaven/CentralUI/States/WindowStateRoot.cpp index 64a352b..1b075f9 100644 --- a/src/libHeaven/CentralUI/States/WindowStateRoot.cpp +++ b/src/libHeaven/CentralUI/States/WindowStateRoot.cpp @@ -23,15 +23,32 @@ namespace Heaven WindowStateRoot::WindowStateRoot() : WindowState( NULL ) + , mMode(NULL) + , mIsReadOnly(false) { } WindowStateRoot::WindowStateRoot( const QDomElement& elParent ) : WindowState( NULL ) + , mMode(NULL) + , mIsReadOnly(false) { load( elParent ); } + WindowStateRoot::WindowStateRoot(WindowStateRoot* cloneFrom) + : WindowState(NULL, cloneFrom) + { + mMode = cloneFrom->mMode; + mIsReadOnly = true; + } + + WindowStateRoot* WindowStateRoot::clone(WindowState* toParent) + { + Q_ASSERT(toParent == NULL); + return new WindowStateRoot(this); + } + WindowStateRoot::~WindowStateRoot() { } @@ -56,4 +73,29 @@ namespace Heaven readChildren( elParent, CTWindows ); } + void WindowStateRoot::setMode(Mode* mode) + { + mMode = mode; + } + + Mode* WindowStateRoot::mode() + { + return mMode; + } + + WindowStateRoot* WindowStateRoot::root() + { + return this; + } + + void WindowStateRoot::setReadOnly(bool ro) + { + mIsReadOnly = ro; + } + + bool WindowStateRoot::isReadOnly() const + { + return mIsReadOnly; + } + } diff --git a/src/libHeaven/CentralUI/States/WindowStateRoot.hpp b/src/libHeaven/CentralUI/States/WindowStateRoot.hpp index b127675..bafaa80 100644 --- a/src/libHeaven/CentralUI/States/WindowStateRoot.hpp +++ b/src/libHeaven/CentralUI/States/WindowStateRoot.hpp @@ -24,6 +24,8 @@ namespace Heaven { + class Mode; + class WindowStateRoot : public WindowState { public: @@ -31,17 +33,32 @@ namespace Heaven public: WindowStateRoot(); - WindowStateRoot( const QDomElement& elParent ); + WindowStateRoot(WindowStateRoot* cloneFrom); + WindowStateRoot(const QDomElement& elParent); ~WindowStateRoot(); public: + void setMode(Mode* mode); + Mode* mode(); + WindowStateRoot* root(); + + void setReadOnly(bool ro); + bool isReadOnly() const; + Type type() const; void save( QDomElement& elParent ) const; private: void load( const QDomElement& elParent ); + + protected: + WindowStateRoot* clone(WindowState* toParent); + + private: + Mode* mMode; + bool mIsReadOnly; }; } diff --git a/src/libHeaven/CentralUI/States/WindowStateSplitter.cpp b/src/libHeaven/CentralUI/States/WindowStateSplitter.cpp index 64ebe38..a35cfc6 100644 --- a/src/libHeaven/CentralUI/States/WindowStateSplitter.cpp +++ b/src/libHeaven/CentralUI/States/WindowStateSplitter.cpp @@ -19,6 +19,7 @@ #include #include "libHeaven/CentralUI/States/WindowStateSplitter.hpp" +#include "libHeaven/CentralUI/ContainerWidgets/SplitterContainerWidget.hpp" namespace Heaven { @@ -28,19 +29,30 @@ namespace Heaven return s == QLatin1String( "Vert" ); } - WindowStateSplitter::WindowStateSplitter( WindowState* parent ) + WindowStateSplitter::WindowStateSplitter(WindowState* parent) : WindowState( parent ) { } - WindowStateSplitter::WindowStateSplitter( WindowState* parent, QDomElement& el ) + WindowStateSplitter::WindowStateSplitter(WindowState* parent, WindowStateSplitter* cloneFrom) + : WindowState(parent, cloneFrom) + { + mVertical = cloneFrom->mVertical; + } + + WindowStateSplitter::WindowStateSplitter(WindowState* parent, QDomElement& el) : WindowState( parent ) { - mVertical = parseOrient( el.attribute( QLatin1String( "Orient" ), - QLatin1String( "Vert" ) ) ); + mVertical = parseOrient(el.attribute(QLatin1String("Orient"), QLatin1String("Vert"))); + + readOrCreateIdentifier(el); + readOptions(el); + readChildren(el, CTContainers | CTViews); + } - readOrCreateIdentifier( el ); - readChildren( el, CTContainers | CTViews ); + WindowStateSplitter* WindowStateSplitter::clone(WindowState* toParent) + { + return new WindowStateSplitter(toParent, this); } void WindowStateSplitter::save( QDomElement& elParent ) const @@ -48,18 +60,53 @@ namespace Heaven QDomElement elChild = elParent.ownerDocument().createElement( QLatin1String( "Split" ) ); elParent.appendChild( elChild ); - elChild.setAttribute( QLatin1String( "Orient" ), - QLatin1String( mVertical ? "Vert" : "Horz" ) ); + elChild.setAttribute(QLatin1String("Orient"), + QLatin1String(mVertical ? "Vert" : "Horz")); - saveIdentifier( elChild ); - saveChildren( elChild ); + saveIdentifier(elChild); + saveOptions(elChild); + saveChildren(elChild); } void WindowStateSplitter::updateConfig() { + SplitterContainerWidget* scw = qobject_cast(widget()); + + if (scw) { + + QVariantList sizes; + + foreach (int i, scw->transformedSizes()) { + sizes.append(i); + } + + setOption(QLatin1String("Sizes"), sizes); + } + WindowState::updateConfig(); } + void WindowStateSplitter::applyConfig() + { + SplitterContainerWidget* scw = qobject_cast(widget()); + + if (scw) { + QVariant v = option(QLatin1String("Sizes")); + + if (v.type() == QVariant::List) { + + QList sizes; + foreach (QVariant vEntry, v.toList()) { + sizes.append(v.toInt()); + } + + scw->setTransformedSizes(sizes); + } + } + + WindowState::applyConfig(); + } + WindowState::Type WindowStateSplitter::type() const { return WSSplitter; diff --git a/src/libHeaven/CentralUI/States/WindowStateSplitter.hpp b/src/libHeaven/CentralUI/States/WindowStateSplitter.hpp index 77515b8..556dd9a 100644 --- a/src/libHeaven/CentralUI/States/WindowStateSplitter.hpp +++ b/src/libHeaven/CentralUI/States/WindowStateSplitter.hpp @@ -30,8 +30,9 @@ namespace Heaven typedef QExplicitlySharedDataPointer< WindowStateSplitter > Ptr; public: - WindowStateSplitter( WindowState* parent ); - WindowStateSplitter( WindowState* parent, QDomElement& el ); + WindowStateSplitter(WindowState* parent); + WindowStateSplitter(WindowState* parent, WindowStateSplitter* cloneFrom); + WindowStateSplitter(WindowState* parent, QDomElement& el); public: Type type() const; @@ -40,6 +41,10 @@ namespace Heaven bool isVertical() const; void updateConfig(); + void applyConfig(); + + protected: + WindowStateSplitter* clone(WindowState* toParent); protected: void save( QDomElement& elParent ) const; diff --git a/src/libHeaven/CentralUI/States/WindowStateTab.cpp b/src/libHeaven/CentralUI/States/WindowStateTab.cpp index b8df72a..55b94d8 100644 --- a/src/libHeaven/CentralUI/States/WindowStateTab.cpp +++ b/src/libHeaven/CentralUI/States/WindowStateTab.cpp @@ -45,11 +45,22 @@ namespace Heaven readChildren( el, CTContainers | CTViews ); } + WindowStateTab::WindowStateTab(WindowState* parent, WindowStateTab* cloneFrom) + : WindowState(parent, cloneFrom) + { + mPositions = cloneFrom->mPositions; + } + WindowStateTab::WindowStateTab( WindowState* parent ) : WindowState( parent ) { } + WindowStateTab* WindowStateTab::clone(WindowState* toParent) + { + return new WindowStateTab(toParent, this); + } + void WindowStateTab::save( QDomElement& elParent ) const { QDomElement elChild = elParent.ownerDocument().createElement( QLatin1String( "Tab" ) ); diff --git a/src/libHeaven/CentralUI/States/WindowStateTab.hpp b/src/libHeaven/CentralUI/States/WindowStateTab.hpp index 66fdfd3..7164917 100644 --- a/src/libHeaven/CentralUI/States/WindowStateTab.hpp +++ b/src/libHeaven/CentralUI/States/WindowStateTab.hpp @@ -30,8 +30,9 @@ namespace Heaven typedef QExplicitlySharedDataPointer< WindowStateTab > Ptr; public: - WindowStateTab( WindowState* parent ); - WindowStateTab( WindowState* parent, QDomElement& el ); + WindowStateTab(WindowState* parent); + WindowStateTab(WindowState* parent, WindowStateTab* cloneFrom); + WindowStateTab(WindowState* parent, QDomElement& el); public: Type type() const; @@ -42,6 +43,7 @@ namespace Heaven void updateConfig(); protected: + WindowStateTab* clone(WindowState* toParent); void save( QDomElement& elParent ) const; private: diff --git a/src/libHeaven/CentralUI/States/WindowStateView.cpp b/src/libHeaven/CentralUI/States/WindowStateView.cpp index 44d005f..6e5304b 100644 --- a/src/libHeaven/CentralUI/States/WindowStateView.cpp +++ b/src/libHeaven/CentralUI/States/WindowStateView.cpp @@ -28,12 +28,22 @@ namespace Heaven { } + WindowStateView::WindowStateView(WindowState* parent, WindowStateView* cloneFrom) + : WindowState(parent, cloneFrom) + { + } + WindowStateView::WindowStateView( WindowState* parent, QDomElement& el ) : WindowState( parent ) { readOrCreateIdentifier( el ); } + WindowStateView* WindowStateView::clone(WindowState* toParent) + { + return new WindowStateView(toParent, this); + } + void WindowStateView::updateConfig() { } diff --git a/src/libHeaven/CentralUI/States/WindowStateView.hpp b/src/libHeaven/CentralUI/States/WindowStateView.hpp index 338d1db..fc023ee 100644 --- a/src/libHeaven/CentralUI/States/WindowStateView.hpp +++ b/src/libHeaven/CentralUI/States/WindowStateView.hpp @@ -30,14 +30,18 @@ namespace Heaven typedef QExplicitlySharedDataPointer< WindowStateView > Ptr; public: - WindowStateView( WindowState* parent ); - WindowStateView( WindowState* parent, QDomElement& el ); + WindowStateView(WindowState* parent); + WindowStateView(WindowState* parent, WindowStateView* cloneFrom); + WindowStateView(WindowState* parent, QDomElement& el); public: Type type() const; void updateConfig(); + protected: + WindowStateView* clone(WindowState* toParent); + protected: void save( QDomElement& elParent ) const; }; diff --git a/src/libHeaven/CentralUI/States/WindowStateWindow.cpp b/src/libHeaven/CentralUI/States/WindowStateWindow.cpp index 6f7fe4c..7eaac68 100644 --- a/src/libHeaven/CentralUI/States/WindowStateWindow.cpp +++ b/src/libHeaven/CentralUI/States/WindowStateWindow.cpp @@ -23,16 +23,21 @@ namespace Heaven { - WindowStateWindow::WindowStateWindow( WindowState* parent ) - : WindowState( parent ) + WindowStateWindow::WindowStateWindow(WindowState* parent) + : WindowState(parent) { } - WindowStateWindow::WindowStateWindow( WindowState* parent, QDomElement& elParent ) - : WindowState( parent ) + WindowStateWindow::WindowStateWindow(WindowState* parent, WindowStateWindow* cloneFrom) + : WindowState(parent, cloneFrom) { - readOrCreateIdentifier( elParent ); - readChildren( elParent, CTContainers ); + } + + WindowStateWindow::WindowStateWindow(WindowState* parent, QDomElement& elParent) + : WindowState(parent) + { + readOrCreateIdentifier(elParent); + readChildren(elParent, CTContainers); } WindowState::Type WindowStateWindow::type() const @@ -40,6 +45,11 @@ namespace Heaven return WSWindow; } + WindowStateWindow* WindowStateWindow::clone(WindowState* toParent) + { + return new WindowStateWindow(toParent, this); + } + void WindowStateWindow::save( QDomElement& elParent ) const { QDomElement elChild = elParent.ownerDocument().createElement( QLatin1String( "Window" ) ); diff --git a/src/libHeaven/CentralUI/States/WindowStateWindow.hpp b/src/libHeaven/CentralUI/States/WindowStateWindow.hpp index 9134287..fe17c1e 100644 --- a/src/libHeaven/CentralUI/States/WindowStateWindow.hpp +++ b/src/libHeaven/CentralUI/States/WindowStateWindow.hpp @@ -30,13 +30,15 @@ namespace Heaven typedef QExplicitlySharedDataPointer< WindowStateWindow > Ptr; public: - WindowStateWindow( WindowState* parent ); - WindowStateWindow( WindowState* parent, QDomElement& el ); + WindowStateWindow(WindowState* parent); + WindowStateWindow(WindowState* parent, WindowStateWindow* cloneFrom); + WindowStateWindow(WindowState* parent, QDomElement& el); public: Type type() const; protected: + WindowStateWindow* clone(WindowState* toParent); void save( QDomElement& elParent ) const; };