diff --git a/src/plugins/coreplugin/editmode.cpp b/src/plugins/coreplugin/editmode.cpp index a02c434cd6d286a6ce1871fb630cb32a5f512c04..8a6fef9569edf16c791d077a73da8d28c22f7e6d 100644 --- a/src/plugins/coreplugin/editmode.cpp +++ b/src/plugins/coreplugin/editmode.cpp @@ -68,7 +68,7 @@ EditMode::EditMode(EditorManager *editorManager) : MiniSplitter *splitter = new MiniSplitter; splitter->setOrientation(Qt::Vertical); splitter->insertWidget(0, rightPaneSplitter); - splitter->insertWidget(1, new Core::OutputPanePlaceHolder(this)); + splitter->insertWidget(1, new Core::OutputPanePlaceHolder(this, splitter)); splitter->setStretchFactor(0, 3); splitter->setStretchFactor(1, 0); diff --git a/src/plugins/coreplugin/outputpane.cpp b/src/plugins/coreplugin/outputpane.cpp index 7b46cbd23a8029a93179a81f9a7c7ba3d62e4ac8..5b51f5876f436d4e4706af2fe0de3c60db359989 100644 --- a/src/plugins/coreplugin/outputpane.cpp +++ b/src/plugins/coreplugin/outputpane.cpp @@ -43,6 +43,7 @@ #include <extensionsystem/pluginmanager.h> #include <utils/styledbar.h> +#include <utils/qtcassert.h> #include <QtCore/QDebug> @@ -51,6 +52,7 @@ #include <QtGui/QComboBox> #include <QtGui/QFocusEvent> #include <QtGui/QHBoxLayout> +#include <QtGui/QSplitter> #include <QtGui/QMenu> #include <QtGui/QPainter> #include <QtGui/QPushButton> @@ -80,9 +82,10 @@ private: OutputPanePlaceHolder *OutputPanePlaceHolder::m_current = 0; -OutputPanePlaceHolder::OutputPanePlaceHolder(Core::IMode *mode, QWidget *parent) +OutputPanePlaceHolder::OutputPanePlaceHolder(Core::IMode *mode, QSplitter* parent) : QWidget(parent), m_mode(mode), m_closeable(true) { + m_splitter = parent; setVisible(false); setLayout(new QVBoxLayout); QSizePolicy sp; @@ -130,6 +133,40 @@ void OutputPanePlaceHolder::currentModeChanged(Core::IMode *mode) } } +void OutputPanePlaceHolder::maximizeOrMinimize(bool maximize) +{ + if (!m_splitter) + return; + int idx = m_splitter->indexOf(this); + if (idx < 0) + return; + + QList<int> sizes = m_splitter->sizes(); + + if (maximize) { + int sum; + foreach(int s, sizes) + sum += s; + for (int i = 0; i < sizes.count(); ++i) { + sizes[i] = 32; + } + sizes[idx] = sum - (sizes.count()-1) * 32; + } else { + int target = sizeHint().height(); + int space = sizes[idx] - target; + if (space > 0) { + for (int i = 0; i < sizes.count(); ++i) { + sizes[i] += space / (sizes.count()-1); + } + sizes[idx] = target; + } + } + + m_splitter->setSizes(sizes); + +} + + //// // OutputPaneManager //// @@ -157,6 +194,8 @@ void OutputPaneManager::updateStatusButtons(bool visible) int idx = m_widgetComboBox->itemData(m_widgetComboBox->currentIndex()).toInt(); if (m_buttons.value(idx)) m_buttons.value(idx)->setChecked(visible); + m_minMaxButton->setVisible(OutputPanePlaceHolder::m_current + && OutputPanePlaceHolder::m_current->canMaximizeOrMinimize()); } OutputPaneManager::OutputPaneManager(QWidget *parent) : @@ -164,6 +203,8 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) : m_widgetComboBox(new QComboBox), m_clearButton(new QToolButton), m_closeButton(new QToolButton), + m_minMaxAction(0), + m_minMaxButton(new QToolButton), m_nextAction(0), m_prevAction(0), m_lastIndex(-1), @@ -187,6 +228,10 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) : m_prevAction->setText(tr("Previous Item")); connect(m_prevAction, SIGNAL(triggered()), this, SLOT(slotPrev())); + m_minMaxAction = new QAction(this); + m_minMaxAction->setText(tr("Minimize/Maximize Output Pane")); + m_minMaxButton->setArrowType(Qt::UpArrow); + m_closeButton->setIcon(QIcon(":/core/images/closebutton.png")); connect(m_closeButton, SIGNAL(clicked()), this, SLOT(slotHide())); @@ -204,6 +249,7 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) : m_nextToolButton = new QToolButton; toolLayout->addWidget(m_nextToolButton); toolLayout->addWidget(m_opToolBarWidgets); + toolLayout->addWidget(m_minMaxButton); toolLayout->addWidget(m_closeButton); mainlayout->addWidget(m_toolBar); mainlayout->addWidget(m_outputWidgetPane, 10); @@ -262,6 +308,12 @@ void OutputPaneManager::init() cmd->setDefaultKeySequence(QKeySequence("F6")); mpanes->addAction(cmd, "Coreplugin.OutputPane.ActionsGroup"); + cmd = am->registerAction(m_minMaxAction, "Coreplugin.OutputPane.minmax", globalcontext); + cmd->setDefaultKeySequence(QKeySequence("Ctrl+9")); + mpanes->addAction(cmd, "Coreplugin.OutputPane.ActionsGroup"); + m_minMaxButton->setDefaultAction(cmd->action()); + connect(m_minMaxAction, SIGNAL(triggered()), this, SLOT(slotMinMax())); + QAction *sep = new QAction(this); sep->setSeparator(true); cmd = am->registerAction(sep, QLatin1String("Coreplugin.OutputPane.Sep"), globalcontext); @@ -357,6 +409,18 @@ void OutputPaneManager::shortcutTriggered() } } + +void OutputPaneManager::slotMinMax() +{ + QTC_ASSERT(OutputPanePlaceHolder::m_current, return); + + if (!OutputPanePlaceHolder::m_current->isVisible()) // easier than disabling/enabling the action + return; + bool maximize = m_minMaxButton->arrowType() == Qt::UpArrow; + OutputPanePlaceHolder::m_current->maximizeOrMinimize(maximize); + m_minMaxButton->setArrowType(maximize ? Qt::DownArrow : Qt::UpArrow); +} + void OutputPaneManager::buttonTriggered() { QPushButton *button = qobject_cast<QPushButton *>(sender()); diff --git a/src/plugins/coreplugin/outputpane.h b/src/plugins/coreplugin/outputpane.h index 5ed31f1733d9afa009275213094d02883f64a614..8d0d973eaca3b577c2747512ea6315d220095840 100644 --- a/src/plugins/coreplugin/outputpane.h +++ b/src/plugins/coreplugin/outputpane.h @@ -41,6 +41,7 @@ class QComboBox; class QToolButton; class QStackedWidget; class QPushButton; +class QSplitter; QT_END_NAMESPACE namespace Core { @@ -59,16 +60,19 @@ class CORE_EXPORT OutputPanePlaceHolder : public QWidget friend class Core::Internal::OutputPaneManager; // needs to set m_visible and thus access m_current Q_OBJECT public: - OutputPanePlaceHolder(Core::IMode *mode, QWidget *parent = 0); + OutputPanePlaceHolder(Core::IMode *mode, QSplitter *parent = 0); ~OutputPanePlaceHolder(); void setCloseable(bool b); bool closeable(); static OutputPanePlaceHolder *getCurrent() { return m_current; } + inline bool canMaximizeOrMinimize() const { return m_splitter != 0; } + void maximizeOrMinimize(bool maximize); private slots: void currentModeChanged(Core::IMode *); private: Core::IMode *m_mode; + QSplitter *m_splitter; bool m_closeable; static OutputPanePlaceHolder* m_current; }; @@ -92,6 +96,7 @@ public slots: void slotNext(); void slotPrev(); void shortcutTriggered(); + void slotMinMax(); protected: void focusInEvent(QFocusEvent *e); @@ -122,6 +127,9 @@ private: QToolButton *m_clearButton; QToolButton *m_closeButton; + QAction *m_minMaxAction; + QToolButton *m_minMaxButton; + QAction *m_nextAction; QAction *m_prevAction; QToolButton *m_prevToolButton; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 0d269658bcdb6e765faac30a2576f7d74a3b763d..1e91222a06b545fddb73668e0c0694139fd70656 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -895,7 +895,7 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess MiniSplitter *splitter = new MiniSplitter; splitter->addWidget(m_manager->mainWindow()); - splitter->addWidget(new OutputPanePlaceHolder(m_debugMode)); + splitter->addWidget(new OutputPanePlaceHolder(m_debugMode, splitter)); splitter->setStretchFactor(0, 10); splitter->setStretchFactor(1, 0); splitter->setOrientation(Qt::Vertical); diff --git a/src/plugins/qmlinspector/qmlinspectormode.cpp b/src/plugins/qmlinspector/qmlinspectormode.cpp index 636c488defb45c1a0814038106dfa63a3f204742..69da5c2a054db15f37202036b0e37ba8246aaa1f 100644 --- a/src/plugins/qmlinspector/qmlinspectormode.cpp +++ b/src/plugins/qmlinspector/qmlinspectormode.cpp @@ -396,7 +396,7 @@ QWidget *QmlInspectorMode::createModeWindow() // right-side window with editor, output etc. Core::MiniSplitter *mainWindowSplitter = new Core::MiniSplitter; mainWindowSplitter->addWidget(createMainView()); - mainWindowSplitter->addWidget(new Core::OutputPanePlaceHolder(this)); + mainWindowSplitter->addWidget(new Core::OutputPanePlaceHolder(this, mainWindowSplitter)); mainWindowSplitter->setStretchFactor(0, 10); mainWindowSplitter->setStretchFactor(1, 0); mainWindowSplitter->setOrientation(Qt::Vertical);