diff --git a/src/libs/utils/fancymainwindow.cpp b/src/libs/utils/fancymainwindow.cpp index f58f8332ca02df32f553845c4e300f998c01f631..5fa0215924b49ab886627578528d040429071f4a 100644 --- a/src/libs/utils/fancymainwindow.cpp +++ b/src/libs/utils/fancymainwindow.cpp @@ -174,7 +174,8 @@ QHash<QString, QVariant> FancyMainWindow::saveSettings() const void FancyMainWindow::restoreSettings(const QHash<QString, QVariant> &settings) { QByteArray ba = settings.value("State", QByteArray()).toByteArray(); - restoreState(ba); + if (!ba.isEmpty()) + restoreState(ba); m_locked = settings.value("Locked", true).toBool(); for (int i = 0; i < m_dockWidgetActiveState.count(); ++i) { m_dockWidgetActiveState[i] = settings.value(m_dockWidgets.at(i)->objectName(), false).toBool(); diff --git a/src/plugins/designer/editorwidget.cpp b/src/plugins/designer/editorwidget.cpp index 5a619e192c2c817575013285d15f776349dcc670..735a6cae911b902c5f8f36e2c9d0ed7b72d488e2 100644 --- a/src/plugins/designer/editorwidget.cpp +++ b/src/plugins/designer/editorwidget.cpp @@ -37,9 +37,9 @@ #include <QtGui/QVBoxLayout> #include <QtGui/QTabWidget> -using namespace Designer::Constants; +static const char *editorWidgetStateKeyC = "editorWidgetState"; -enum { ActionEditorTab, SignalSlotEditorTab }; +using namespace Designer::Constants; namespace Designer { namespace Internal { @@ -62,198 +62,113 @@ void SharedSubWindow::activate() if (currentParent == this) return; - if (currentParent) { - QVBoxLayout *lt = qobject_cast<QVBoxLayout *>(currentParent->layout()); - QTC_ASSERT(lt, return); - m_shared->setParent(0); - delete lt->takeAt(0); - } m_layout->addWidget(m_shared); - m_layout->invalidate(); + m_shared->show(); } SharedSubWindow::~SharedSubWindow() { // Do not destroy the shared sub window if we currently own it - if (m_layout->count()) { + if (m_shared->parent() == this) { + m_shared->hide(); m_shared->setParent(0); - delete m_layout->takeAt(0); } } -// ---------- Global EditorState -Q_GLOBAL_STATIC(EditorWidgetState, editorWidgetState) - -enum { Version = 1 }; -// Simple conversion of an int list to QVariantList, size as leading element -static void intToVariantList(const QList<int> &il, QVariantList& vl) -{ - const int size = il.size(); - vl.push_back(size); - if (size != 0) { - const QList<int>::const_iterator cend = il.constEnd(); - for (QList<int>::const_iterator it = il.constBegin(); it != cend; ++it) - vl.push_back(QVariant(*it)); - } -} -// Simple conversion of a QVariantList portion saved by the above function to int list -bool variantListToIntList(const QVariantList& vl, int &index, QList<int> &list) -{ - list.clear(); - if (index >= vl.size()) - return false; - const int size = vl.at(index++).toInt(); - const int end = index + size; - if (end > vl.size()) - return false; - if (size != 0) { - for ( ; index < end; index++) - list.push_back(vl.at(index).toInt()); - } - return true; -} +// ---------- EditorWidget -// ------------------ EditorWidgetState -QVariant EditorWidgetState::toVariant() const -{ - QVariantList rc; - rc.push_back(Version); - intToVariantList(horizontalSizes, rc); - intToVariantList(centerVerticalSizes, rc); - intToVariantList(rightVerticalSizes, rc); - return QVariant(rc); -} +QHash<QString, QVariant> EditorWidget::m_globalState = QHash<QString, QVariant>(); -bool EditorWidgetState::fromVariant(const QVariant &v) +EditorWidget::EditorWidget(QWidget *formWindow) + : m_mainWindow(new Core::Utils::FancyMainWindow) { - // Restore state. The weird thing is that QSettings might return - // a QStringList although it was saved as QVariantList<int>. - if (v.type() != QVariant::List && v.type() != QVariant::StringList) - return false; - const QVariantList vl = v.toList(); - if (vl.empty()) - return false; - int index = 0; - const QVariant &versionV = vl.at(index++); - if (versionV.type() != QVariant::Int && versionV.type() != QVariant::String) - return false; - if (versionV.toInt() > Version) - return false; - return variantListToIntList(vl, index, horizontalSizes) && - variantListToIntList(vl, index, centerVerticalSizes) && - variantListToIntList(vl, index, rightVerticalSizes); -} + QVBoxLayout *layout = new QVBoxLayout; + layout->setMargin(0); + layout->setSpacing(0); + setLayout(layout); + layout->addWidget(m_mainWindow); + m_mainWindow->setCentralWidget(formWindow); + m_mainWindow->setDocumentMode(true); + m_mainWindow->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::South); + m_mainWindow->setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); + m_mainWindow->setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); -// ---------- EditorWidget -EditorWidget::EditorWidget(QWidget *formWindow) : - Core::MiniSplitter(Qt::Horizontal), - m_centerVertSplitter(new Core::MiniSplitter(Qt::Vertical)), - m_bottomTab(0), - m_rightVertSplitter(new Core::MiniSplitter(Qt::Vertical)) -{ // Get shared sub windows from Form Editor FormEditorW *few = FormEditorW::instance(); QWidget * const*subs = few->designerSubWindows(); // Create shared sub windows - for (int i=0; i < DesignerSubWindowCount; i++) + for (int i=0; i < DesignerSubWindowCount; i++) { m_designerSubWindows[i] = new SharedSubWindow(subs[i]); - // Create splitter - addWidget(m_designerSubWindows[WidgetBoxSubWindow]); + m_designerSubWindows[i]->setWindowTitle(subs[i]->windowTitle()); + m_designerDockWidgets[i] = m_mainWindow->addDockForWidget(m_designerSubWindows[i]); + } +} - // center - m_centerVertSplitter->addWidget(formWindow); +void EditorWidget::setDefaultLayout() +{ + m_mainWindow->setTrackingEnabled(false); + QList<QDockWidget *> dockWidgets = m_mainWindow->dockWidgets(); + foreach (QDockWidget *dockWidget, dockWidgets) + m_mainWindow->removeDockWidget(dockWidget); - m_bottomTab = new QTabWidget; - m_bottomTab->setTabPosition(QTabWidget::South); - m_bottomTab->setDocumentMode(true); - m_bottomTab->addTab(m_designerSubWindows[ActionEditorSubWindow], tr("Action editor")); - m_bottomTab->addTab(m_designerSubWindows[SignalSlotEditorSubWindow], tr("Signals and slots editor")); - m_centerVertSplitter->addWidget(m_bottomTab); + m_mainWindow->addDockWidget(Qt::LeftDockWidgetArea, m_designerDockWidgets[WidgetBoxSubWindow]); + m_mainWindow->addDockWidget(Qt::RightDockWidgetArea, m_designerDockWidgets[ObjectInspectorSubWindow]); + m_mainWindow->addDockWidget(Qt::RightDockWidgetArea, m_designerDockWidgets[PropertyEditorSubWindow]); + m_mainWindow->addDockWidget(Qt::BottomDockWidgetArea, m_designerDockWidgets[ActionEditorSubWindow]); + m_mainWindow->addDockWidget(Qt::BottomDockWidgetArea, m_designerDockWidgets[SignalSlotEditorSubWindow]); - addWidget(m_centerVertSplitter); + m_mainWindow->tabifyDockWidget(m_designerDockWidgets[ActionEditorSubWindow], + m_designerDockWidgets[SignalSlotEditorSubWindow]); - m_rightVertSplitter->addWidget(m_designerSubWindows[ObjectInspectorSubWindow]); - m_rightVertSplitter->addWidget(m_designerSubWindows[PropertyEditorSubWindow]); - addWidget(m_rightVertSplitter); -} + foreach (QDockWidget *dockWidget, dockWidgets) { + dockWidget->show(); + } -void EditorWidget::setInitialSizes() -{ - QList<int> sizes; - // center vertical. Either the tab containing signal slot editor/ - // action editor or the action editor itself - const QWidget *bottomWidget = m_bottomTab; - if (!bottomWidget) - bottomWidget = m_designerSubWindows[ActionEditorSubWindow]; - const int tabHeight = bottomWidget->sizeHint().height(); - sizes.push_back(height() - handleWidth() - tabHeight); - sizes.push_back( tabHeight); - m_centerVertSplitter->setSizes(sizes); - // right vert - sizes.clear(); - sizes.push_back(height() /2 - (handleWidth() / 2)); - sizes.push_back(height() / 2 - (handleWidth() / 2)); - m_rightVertSplitter->setSizes(sizes); - // horiz sizes - sizes.clear(); - const int wboxWidth = m_designerSubWindows[WidgetBoxSubWindow]->sizeHint().width(); - const int vSplitterWidth = m_rightVertSplitter->sizeHint().width(); - sizes.push_back(wboxWidth); - sizes.push_back(width() - 2 * handleWidth() - wboxWidth - vSplitterWidth); - sizes.push_back(vSplitterWidth); - setSizes(sizes); + m_mainWindow->setTrackingEnabled(true); + m_globalState = m_mainWindow->saveSettings(); } void EditorWidget::activate() { for (int i=0; i < DesignerSubWindowCount; i++) m_designerSubWindows[i]->activate(); - if (!restore(*editorWidgetState())) - setInitialSizes(); -} -bool EditorWidget::event(QEvent * e) -{ - if (e->type() == QEvent::Hide) - *editorWidgetState() = save(); - return QSplitter::event(e); -} - -EditorWidgetState EditorWidget::save() const -{ - EditorWidgetState rc; - rc.horizontalSizes = sizes(); - rc.centerVerticalSizes = m_centerVertSplitter->sizes(); - rc.rightVerticalSizes = m_rightVertSplitter->sizes(); - return rc; + if (!m_globalState.isEmpty()) + m_mainWindow->restoreSettings(m_globalState); + else + setDefaultLayout(); } -bool EditorWidget::restore(const EditorWidgetState &s) +void EditorWidget::hideEvent(QHideEvent *) { - if (s.horizontalSizes.size() != count() || - s.centerVerticalSizes.size() != m_centerVertSplitter->count() || - s.rightVerticalSizes.size() != m_rightVertSplitter->count()) - return false; - m_centerVertSplitter->setSizes(s.centerVerticalSizes); - m_rightVertSplitter->setSizes(s.rightVerticalSizes); - setSizes(s.horizontalSizes); - return true; + m_globalState = m_mainWindow->saveSettings(); } -void EditorWidget::toolChanged(int i) +void EditorWidget::saveState(QSettings *settings) { - if (m_bottomTab) - m_bottomTab->setCurrentIndex(i == EditModeSignalsSlotEditor ? SignalSlotEditorTab : ActionEditorTab); + settings->beginGroup(editorWidgetStateKeyC); + QHashIterator<QString, QVariant> it(m_globalState); + while (it.hasNext()) { + it.next(); + settings->setValue(it.key(), it.value()); + } + settings->endGroup(); } -EditorWidgetState EditorWidget::state() +void EditorWidget::restoreState(QSettings *settings) { - return *editorWidgetState(); + m_globalState.clear(); + settings->beginGroup(editorWidgetStateKeyC); + foreach (const QString &key, settings->childKeys()) { + m_globalState.insert(key, settings->value(key)); + } + settings->endGroup(); } -void EditorWidget::setState(const EditorWidgetState& st) +void EditorWidget::toolChanged(int i) { - *editorWidgetState() = st; +// if (m_bottomTab) +// m_bottomTab->setCurrentIndex(i == EditModeSignalsSlotEditor ? SignalSlotEditorTab : ActionEditorTab); } } // namespace Internal diff --git a/src/plugins/designer/editorwidget.h b/src/plugins/designer/editorwidget.h index 0de42ad4cccad5c2a1302be5b953a926fb784947..ca3965a812da2866f9a7f05918fc0fe7e919cb49 100644 --- a/src/plugins/designer/editorwidget.h +++ b/src/plugins/designer/editorwidget.h @@ -32,17 +32,17 @@ #include "designerconstants.h" -#include <coreplugin/minisplitter.h> +#include <utils/fancymainwindow.h> #include <QtCore/QPointer> #include <QtCore/QList> +#include <QtCore/QHash> #include <QtCore/QVariant> +#include <QtCore/QSettings> #include <QtGui/QWidget> - -QT_BEGIN_NAMESPACE -class QTabWidget; -class QVBoxLayout; -QT_END_NAMESPACE +#include <QtGui/QVBoxLayout> +#include <QtGui/QDockWidget> +#include <QtGui/QHideEvent> namespace Designer { namespace Internal { @@ -68,49 +68,33 @@ private: QVBoxLayout *m_layout; }; -/** State of the editor window (splitter sizes) - * Shared as a global struct between the instances and stored - * in QSettings. */ -struct EditorWidgetState -{ - QVariant toVariant() const; // API to conveniently store in QSettings - bool fromVariant(const QVariant &v); - - QList<int> horizontalSizes; - QList<int> centerVerticalSizes; - QList<int> rightVerticalSizes; -}; - /* Form editor splitter used as editor window. Contains the shared designer * windows. */ -class EditorWidget : public Core::MiniSplitter +class EditorWidget : public QWidget { Q_OBJECT Q_DISABLE_COPY(EditorWidget) public: explicit EditorWidget(QWidget *formWindow); - virtual bool event(QEvent * e); + void setDefaultLayout(); - EditorWidgetState save() const; - bool restore(const EditorWidgetState &s); - - // Get/Set the shared splitter state of all editors of that type for - // settings - static EditorWidgetState state(); - static void setState(const EditorWidgetState&st); + static void saveState(QSettings *settings); + static void restoreState(QSettings *settings); public slots: void activate(); void toolChanged(int); -private: - void setInitialSizes(); +protected: + void hideEvent(QHideEvent * e); +private: SharedSubWindow* m_designerSubWindows[Designer::Constants::DesignerSubWindowCount]; - QSplitter *m_centerVertSplitter; - QTabWidget *m_bottomTab; - QSplitter *m_rightVertSplitter; + QDockWidget *m_designerDockWidgets[Designer::Constants::DesignerSubWindowCount]; + Core::Utils::FancyMainWindow *m_mainWindow; + + static QHash<QString, QVariant> m_globalState; }; } // namespace Internal diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp index b2c1fb27070516136c261eeee03c86492a9480eb..a3179bcc7ff7cb82c7e470b87dceca95b483e58b 100644 --- a/src/plugins/designer/formeditorw.cpp +++ b/src/plugins/designer/formeditorw.cpp @@ -80,7 +80,6 @@ #include <QtCore/QDebug> #include <QtCore/QSettings> -static const char *editorWidgetStateKeyC = "editorWidgetState"; static const char *settingsGroup = "Designer"; #ifdef Q_OS_MAC @@ -522,20 +521,15 @@ Core::ActionContainer *FormEditorW::createPreviewStyleMenu(Core::ActionManager * void FormEditorW::saveSettings(QSettings *s) { s->beginGroup(settingsGroup); - s->setValue(QLatin1String(editorWidgetStateKeyC), EditorWidget::state().toVariant()); + EditorWidget::saveState(s); s->endGroup(); } -void FormEditorW::restoreSettings(const QSettings *s) +void FormEditorW::restoreSettings(QSettings *s) { - QString key = QLatin1String(settingsGroup) + QLatin1Char('/') - + QLatin1String(editorWidgetStateKeyC); - const QVariant ev = s->value(key); - if (ev.type() != QVariant::Invalid) { - EditorWidgetState st; - if (st.fromVariant(ev)) - EditorWidget::setState(st); - } + s->beginGroup(settingsGroup); + EditorWidget::restoreState(s); + s->endGroup(); } diff --git a/src/plugins/designer/formeditorw.h b/src/plugins/designer/formeditorw.h index 5d3fc529be58c8eb91c874b2330f42b0c5ca7edb..ef29952213b445a8ade81d44e4cf6a8540ab7fdd 100644 --- a/src/plugins/designer/formeditorw.h +++ b/src/plugins/designer/formeditorw.h @@ -130,7 +130,7 @@ private: void fullInit(); void saveSettings(QSettings *s); - void restoreSettings(const QSettings *s); + void restoreSettings(QSettings *s); void initDesignerSubWindows();