diff --git a/src/plugins/coreplugin/sidebar.cpp b/src/plugins/coreplugin/sidebar.cpp index 68ae83dca79..332aea38086 100644 --- a/src/plugins/coreplugin/sidebar.cpp +++ b/src/plugins/coreplugin/sidebar.cpp @@ -50,7 +50,8 @@ SideBarItem::~SideBarItem() } SideBar::SideBar(QList itemList, - QList defaultVisible) + QList defaultVisible) : + m_closeWhenEmpty(false) { setOrientation(Qt::Vertical); foreach (SideBarItem *item, itemList) { @@ -76,23 +77,64 @@ QStringList SideBar::availableItems() const return m_availableItems; } +QStringList SideBar::unavailableItems() const +{ + return m_unavailableItems; +} + +bool SideBar::closeWhenEmpty() const +{ + return m_closeWhenEmpty; +} +void SideBar::setCloseWhenEmpty(bool value) +{ + m_closeWhenEmpty = value; +} + void SideBar::makeItemAvailable(SideBarItem *item) { QMap::const_iterator it = m_itemMap.constBegin(); while (it != m_itemMap.constEnd()) { if (it.value() == item) { m_availableItems.append(it.key()); + m_unavailableItems.removeAll(it.key()); qSort(m_availableItems); + emit availableItemsChanged(); + //updateWidgets(); break; } ++it; } } +// sets a list of externally used, unavailable items. For example, +// another sidebar could set +void SideBar::setUnavailableItems(const QStringList &itemTitles) +{ + // re-enable previous items + foreach(const QString &title, m_unavailableItems) + m_availableItems.append(title); + + m_unavailableItems.clear(); + + foreach (const QString &title, itemTitles) { + if (!m_unavailableItems.contains(title)) + m_unavailableItems.append(title); + m_availableItems.removeAll(title); + } + qSort(m_availableItems); + updateWidgets(); +} + SideBarItem *SideBar::item(const QString &title) { if (m_itemMap.contains(title)) { m_availableItems.removeAll(title); + + if (!m_unavailableItems.contains(title)) + m_unavailableItems.append(title); + + emit availableItemsChanged(); return m_itemMap.value(title); } return 0; @@ -134,6 +176,9 @@ void SideBar::closeSubWidget() return; removeSideBarWidget(widget); updateWidgets(); + } else { + if (m_closeWhenEmpty) + setVisible(false); } } @@ -227,8 +272,6 @@ QMap SideBar::shortcutMap() const return m_shortcutMap; } - - SideBarWidget::SideBarWidget(SideBar *sideBar, const QString &title) : m_currentItem(0) , m_sideBar(sideBar) @@ -302,6 +345,7 @@ void SideBarWidget::setCurrentItem(const QString &title) return; removeCurrentItem(); m_currentItem = item; + layout()->addWidget(m_currentItem->widget()); // Add buttons and remember their actions for later removal @@ -359,8 +403,6 @@ Core::Command *SideBarWidget::command(const QString &title) const return 0; } - - ComboBox::ComboBox(SideBarWidget *sideBarWidget) : m_sideBarWidget(sideBarWidget) { diff --git a/src/plugins/coreplugin/sidebar.h b/src/plugins/coreplugin/sidebar.h index 05e9c411251..4b08e9eb2ef 100644 --- a/src/plugins/coreplugin/sidebar.h +++ b/src/plugins/coreplugin/sidebar.h @@ -98,9 +98,15 @@ public: ~SideBar(); QStringList availableItems() const; + QStringList unavailableItems() const; void makeItemAvailable(SideBarItem *item); + void setUnavailableItems(const QStringList &itemTitles); + SideBarItem *item(const QString &title); + bool closeWhenEmpty() const; + void setCloseWhenEmpty(bool value); + void saveSettings(QSettings *settings, const QString &name); void readSettings(QSettings *settings, const QString &name); @@ -109,6 +115,9 @@ public: void setShortcutMap(const QMap &shortcutMap); QMap shortcutMap() const; +signals: + void availableItemsChanged(); + private slots: void splitSubWidget(); void closeSubWidget(); @@ -120,11 +129,12 @@ private: void removeSideBarWidget(Internal::SideBarWidget *widget); QList m_widgets; - QMap m_itemMap; QStringList m_availableItems; + QStringList m_unavailableItems; QStringList m_defaultVisible; QMap m_shortcutMap; + bool m_closeWhenEmpty; }; namespace Internal { diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 2b41d624f08..b6819f0df77 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -578,11 +578,8 @@ void DesignModeWidget::setup() m_formEditorView = new FormEditorView(this); - - //m_designToolBar = new QToolBar; m_fakeToolBar = Core::EditorManager::createToolBar(this); - m_mainSplitter = new MiniSplitter(this); m_mainSplitter->setObjectName("mainSplitter"); @@ -590,34 +587,35 @@ void DesignModeWidget::setup() m_warningWidget = new DocumentWarningWidget(this); m_warningWidget->setVisible(false); - // Left area: - Core::SideBarItem *navigatorItem = new Core::SideBarItem(m_navigator->widget()); Core::SideBarItem *libraryItem = new Core::SideBarItem(m_itemLibrary.data()); Core::SideBarItem *propertiesItem = new Core::SideBarItem(m_allPropertiesBox.data()); + QList sideBarItems; - QList leftSideBarItems, rightSideBarItems; - leftSideBarItems << navigatorItem << libraryItem; - rightSideBarItems << propertiesItem; + // default items + sideBarItems << navigatorItem << libraryItem << propertiesItem; if (projectsExplorer) { Core::SideBarItem *projectExplorerItem = new Core::SideBarItem(projectsExplorer); - rightSideBarItems << projectExplorerItem; + sideBarItems << projectExplorerItem; } if (fileSystemExplorer) { Core::SideBarItem *fileSystemExplorerItem = new Core::SideBarItem(fileSystemExplorer); - rightSideBarItems << fileSystemExplorerItem; + sideBarItems << fileSystemExplorerItem; } - if (openDocumentsWidget) { + if (openDocumentsWidget) { Core::SideBarItem *openDocumentsItem = new Core::SideBarItem(openDocumentsWidget); - rightSideBarItems << openDocumentsItem; + sideBarItems << openDocumentsItem; } - m_leftSideBar = new Core::SideBar(leftSideBarItems, QList() << navigatorItem << libraryItem); - m_rightSideBar = new Core::SideBar(rightSideBarItems, QList() << propertiesItem); + m_leftSideBar = new Core::SideBar(sideBarItems, QList() << navigatorItem << libraryItem); + m_rightSideBar = new Core::SideBar(sideBarItems, QList() << propertiesItem); + + connect(m_leftSideBar, SIGNAL(availableItemsChanged()), SLOT(updateAvailableSidebarItemsRight())); + connect(m_rightSideBar, SIGNAL(availableItemsChanged()), SLOT(updateAvailableSidebarItemsLeft())); m_fakeToolBar->setToolbarCreationFlags(Core::EditorToolBar::FlagsStandalone); //m_fakeToolBar->addEditor(textEditor()); ### what does this mean? @@ -664,6 +662,8 @@ void DesignModeWidget::setup() m_statesEditorWidget->setEnabled(true); m_leftSideBar->setEnabled(true); m_rightSideBar->setEnabled(true); + m_leftSideBar->setCloseWhenEmpty(true); + m_rightSideBar->setCloseWhenEmpty(true); readSettings(); @@ -671,6 +671,18 @@ void DesignModeWidget::setup() QApplication::processEvents(); } +void DesignModeWidget::updateAvailableSidebarItemsRight() +{ + // event comes from m_leftSidebar, so update right side. + m_rightSideBar->setUnavailableItems(m_leftSideBar->unavailableItems()); +} + +void DesignModeWidget::updateAvailableSidebarItemsLeft() +{ + // event comes from m_rightSidebar, so update left side. + m_leftSideBar->setUnavailableItems(m_rightSideBar->unavailableItems()); +} + void DesignModeWidget::resizeEvent(QResizeEvent *event) { if (m_warningWidget) diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index 3130011bdc8..81fa1ae4de1 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -138,6 +138,8 @@ private slots: void enable(); void disable(const QList &errors); void updateErrorStatus(const QList &errors); + void updateAvailableSidebarItemsLeft(); + void updateAvailableSidebarItemsRight(); protected: void resizeEvent(QResizeEvent *event);