From d58184173e84e9e1d22fbf227ce1bb24ae88271d Mon Sep 17 00:00:00 2001
From: Jens Bache-Wiig <jbache@trolltech.com>
Date: Tue, 16 Mar 2010 16:55:56 +0100
Subject: [PATCH] Clean up layouts and use minisplitter everywhere

This patch replaces all uses of QSplitter with thin 1-pixel
splitters. I also fixed dock widget layouts in main windows
to do the same. Additionally I had to tweak the tabbars so
they look good in mini splitter layouts to avoid a double
left-border.

Reviewed-by: thorbjorn
---
 src/libs/extensionsystem/mainwindow.ui        |  0
 src/libs/utils/fancymainwindow.cpp            |  2 +-
 src/plugins/coreplugin/manhattanstyle.cpp     | 30 +++++++++++++++++--
 src/plugins/debugger/breakwindow.cpp          |  1 +
 src/plugins/debugger/debuggermanager.cpp      |  3 +-
 src/plugins/debugger/debuggeroutputwindow.cpp |  4 ++-
 src/plugins/debugger/snapshotwindow.cpp       |  1 +
 src/plugins/debugger/sourcefileswindow.cpp    |  1 +
 src/plugins/debugger/stackwindow.cpp          |  1 +
 src/plugins/debugger/threadswindow.cpp        |  1 +
 src/plugins/debugger/watchwindow.cpp          |  1 +
 src/plugins/designer/editorwidget.cpp         |  8 +++++
 src/plugins/designer/formeditorstack.cpp      |  5 ++++
 13 files changed, 52 insertions(+), 6 deletions(-)
 create mode 100644 src/libs/extensionsystem/mainwindow.ui

diff --git a/src/libs/extensionsystem/mainwindow.ui b/src/libs/extensionsystem/mainwindow.ui
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/libs/utils/fancymainwindow.cpp b/src/libs/utils/fancymainwindow.cpp
index bbb703f8f7a..6428e20bcd4 100644
--- a/src/libs/utils/fancymainwindow.cpp
+++ b/src/libs/utils/fancymainwindow.cpp
@@ -33,7 +33,6 @@
 #include <QtGui/QDockWidget>
 #include <QtCore/QSettings>
 
-
 using namespace Utils;
 
 FancyMainWindow::FancyMainWindow(QWidget *parent)
@@ -41,6 +40,7 @@ FancyMainWindow::FancyMainWindow(QWidget *parent)
     m_locked(true),
     m_handleDockVisibilityChanges(true)
 {
+    setProperty("panelwidget", true);
 }
 
 QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget)
diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp
index 924b290c763..10415187592 100644
--- a/src/plugins/coreplugin/manhattanstyle.cpp
+++ b/src/plugins/coreplugin/manhattanstyle.cpp
@@ -55,6 +55,7 @@
 #include <QtGui/QStyleFactory>
 #include <QtGui/QStyleOption>
 #include <QtGui/QToolBar>
+#include <QtGui/QTreeView>
 #include <QtGui/QToolButton>
 #include <QtGui/QAbstractItemView>
 
@@ -88,10 +89,9 @@ bool panelWidget(const QWidget *widget)
     while (p) {
         if (qobject_cast<const QToolBar *>(p) ||
             qobject_cast<const QStatusBar *>(p) ||
-            qobject_cast<const QMenuBar *>(p))
+            qobject_cast<const QMenuBar *>(p) ||
+            p->property("panelwidget").toBool())
             return styleEnabled(widget);
-        if (p->property("panelwidget").toBool())
-            return true;
         p = p->parentWidget();
     }
     return false;
@@ -197,6 +197,8 @@ int ManhattanStyle::pixelMetric(PixelMetric metric, const QStyleOption *option,
         if (panelWidget(widget))
             retval = 16;
         break;
+    case PM_DockWidgetSeparatorExtent:
+        return 1;
     case PM_MenuPanelWidth:
     case PM_MenuBarHMargin:
     case PM_MenuBarVMargin:
@@ -260,6 +262,7 @@ void ManhattanStyle::polish(QWidget *widget)
         if (qobject_cast<QToolBar*>(widget))
             widget->removeEventFilter(baseStyle());
     }
+
     if (panelWidget(widget)) {
         widget->setAttribute(Qt::WA_LayoutUsesWidgetRect, true);
         if (qobject_cast<QToolButton*>(widget)) {
@@ -594,6 +597,27 @@ void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *opt
         return QProxyStyle::drawControl(element, option, painter, widget);
 
     switch (element) {
+    case CE_Splitter:
+        painter->fillRect(option->rect, Utils::StyleHelper::borderColor());
+        break;
+
+    case CE_TabBarTabShape:
+        // Most styles draw a single dark outline. This looks rather ugly when combined with our
+        // single pixel dark separator so we adjust the first tab to compensate for this
+
+        if (const QStyleOptionTabV3 *tab = qstyleoption_cast<const QStyleOptionTabV3 *>(option)) {
+            QStyleOptionTabV3 adjustedTab = *tab;
+            if (tab->position == QStyleOptionTab::Beginning) {
+                if (option->direction == Qt::LeftToRight)
+                    adjustedTab.rect = adjustedTab.rect.adjusted(-1, 0, 0, 0);
+                else
+                    adjustedTab.rect = adjustedTab.rect.adjusted(0, 0, 1 ,0);
+            }
+            QProxyStyle::drawControl(element, &adjustedTab, painter, widget);
+            return;
+        }
+        break;
+
     case CE_MenuBarItem:
         painter->save();
         if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp
index 6cd9b4841d6..953d1cea250 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -83,6 +83,7 @@ BreakWindow::BreakWindow(Debugger::DebuggerManager *manager)
   : m_manager(manager), m_alwaysResizeColumnsToContents(false)
 {
     QAction *act = theDebuggerAction(UseAlternatingRowColors);
+    setFrameStyle(QFrame::NoFrame);
     setWindowTitle(tr("Breakpoints"));
     setWindowIcon(QIcon(":/debugger/images/debugger_breakpoints.png"));
     setAlternatingRowColors(act->isChecked());
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 9c0e217e14e..70c02b886ff 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -64,6 +64,7 @@
 #endif
 
 #include <coreplugin/icore.h>
+#include <coreplugin/minisplitter.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <utils/qtcassert.h>
 #include <projectexplorer/toolchain.h>
@@ -585,7 +586,7 @@ void DebuggerManager::init()
 
     d->m_threadsDock = uiSwitcher->createDockWidget(LANG_CPP, d->m_threadsWindow);
 
-    QSplitter *localsAndWatchers = new QSplitter(Qt::Vertical);
+    QSplitter *localsAndWatchers = new Core::MiniSplitter(Qt::Vertical);
     localsAndWatchers->setWindowTitle(d->m_localsWindow->windowTitle());
     localsAndWatchers->addWidget(d->m_localsWindow);
     localsAndWatchers->addWidget(d->m_watchersWindow);
diff --git a/src/plugins/debugger/debuggeroutputwindow.cpp b/src/plugins/debugger/debuggeroutputwindow.cpp
index 45e535c2299..0c39f9a1531 100644
--- a/src/plugins/debugger/debuggeroutputwindow.cpp
+++ b/src/plugins/debugger/debuggeroutputwindow.cpp
@@ -47,6 +47,7 @@
 
 #include <aggregation/aggregate.h>
 #include <coreplugin/findplaceholder.h>
+#include <coreplugin/minisplitter.h>
 #include <find/basetextfind.h>
 
 using namespace Debugger;
@@ -329,7 +330,8 @@ DebuggerOutputWindow::DebuggerOutputWindow(QWidget *parent)
 {
     setWindowTitle(tr("Debugger"));
 
-    QSplitter *m_splitter = new QSplitter(Qt::Horizontal, this);
+    QSplitter *m_splitter = new  Core::MiniSplitter(Qt::Horizontal);
+    m_splitter->setParent(this);
     // mixed input/output
     m_combinedText = new CombinedPane(this);
     m_combinedText->setReadOnly(true);
diff --git a/src/plugins/debugger/snapshotwindow.cpp b/src/plugins/debugger/snapshotwindow.cpp
index 15ecd0b22e5..ab11f0fbfbe 100644
--- a/src/plugins/debugger/snapshotwindow.cpp
+++ b/src/plugins/debugger/snapshotwindow.cpp
@@ -74,6 +74,7 @@ SnapshotWindow::SnapshotWindow(DebuggerManager *manager, QWidget *parent)
     QAction *act = theDebuggerAction(UseAlternatingRowColors);
     setWindowTitle(tr("Snapshots"));
 
+    setFrameStyle(QFrame::NoFrame);
     setAlternatingRowColors(act->isChecked());
     setRootIsDecorated(false);
     setIconSize(QSize(10, 10));
diff --git a/src/plugins/debugger/sourcefileswindow.cpp b/src/plugins/debugger/sourcefileswindow.cpp
index 37ac5f75aa3..5d321fc81c1 100644
--- a/src/plugins/debugger/sourcefileswindow.cpp
+++ b/src/plugins/debugger/sourcefileswindow.cpp
@@ -169,6 +169,7 @@ SourceFilesWindow::SourceFilesWindow(QWidget *parent)
     proxyModel->setSourceModel(m_model);
     setModel(proxyModel);
 
+    setFrameStyle(QFrame::NoFrame);
     setWindowTitle(tr("Source Files"));
     setSortingEnabled(true);
     setAlternatingRowColors(act->isChecked());
diff --git a/src/plugins/debugger/stackwindow.cpp b/src/plugins/debugger/stackwindow.cpp
index a0029b79a70..c5e3637801b 100644
--- a/src/plugins/debugger/stackwindow.cpp
+++ b/src/plugins/debugger/stackwindow.cpp
@@ -54,6 +54,7 @@ namespace Internal {
 StackWindow::StackWindow(DebuggerManager *manager, QWidget *parent)
     : QTreeView(parent), m_manager(manager), m_alwaysResizeColumnsToContents(false)
 {
+    setFrameStyle(QFrame::NoFrame);
     m_disassemblerAgent = new DisassemblerViewAgent(manager);
 
     QAction *act = theDebuggerAction(UseAlternatingRowColors);
diff --git a/src/plugins/debugger/threadswindow.cpp b/src/plugins/debugger/threadswindow.cpp
index 472cba0e4a0..951a0eb0385 100644
--- a/src/plugins/debugger/threadswindow.cpp
+++ b/src/plugins/debugger/threadswindow.cpp
@@ -43,6 +43,7 @@ ThreadsWindow::ThreadsWindow(QWidget *parent)
 {
     QAction *act = theDebuggerAction(UseAlternatingRowColors);
 
+    setFrameStyle(QFrame::NoFrame);
     setWindowTitle(tr("Thread"));
     setAlternatingRowColors(act->isChecked());
     setRootIsDecorated(false);
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 7d076e26594..77c9f2bd9bb 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -125,6 +125,7 @@ WatchWindow::WatchWindow(Type type, DebuggerManager *manager, QWidget *parent)
     m_grabbing = false;
 
     QAction *act = theDebuggerAction(UseAlternatingRowColors);
+    setFrameStyle(QFrame::NoFrame);
     setWindowTitle(tr("Locals and Watchers"));
     setAlternatingRowColors(act->isChecked());
     setIndentation(indentation() * 9/10);
diff --git a/src/plugins/designer/editorwidget.cpp b/src/plugins/designer/editorwidget.cpp
index cd6796e1e67..d35cd0e05b4 100644
--- a/src/plugins/designer/editorwidget.cpp
+++ b/src/plugins/designer/editorwidget.cpp
@@ -35,6 +35,7 @@
 
 #include <QtGui/QVBoxLayout>
 #include <QtGui/QDockWidget>
+#include <QtGui/QAbstractItemView>
 
 using namespace Designer::Constants;
 
@@ -59,6 +60,13 @@ EditorWidget::EditorWidget(FormEditorW *few, QWidget *parent) :
         QWidget *subWindow = subs[i];
         subWindow->setWindowTitle(subs[i]->windowTitle());
         m_designerDockWidgets[i] = addDockForWidget(subWindow);
+
+        // Since we have 1-pixel splitters, we generally want to remove
+        // frames around item views. So we apply this hack for now.
+        QList<QAbstractItemView*> frames = subWindow->findChildren<QAbstractItemView*>();
+        for (int i = 0 ; i< frames.count(); ++i)
+            frames[i]->setFrameStyle(QFrame::NoFrame);
+
     }
     resetToDefaultLayout();
 }
diff --git a/src/plugins/designer/formeditorstack.cpp b/src/plugins/designer/formeditorstack.cpp
index a21a81595cc..af1f3813c15 100644
--- a/src/plugins/designer/formeditorstack.cpp
+++ b/src/plugins/designer/formeditorstack.cpp
@@ -80,6 +80,11 @@ void FormEditorStack::add(const EditorData &data)
 
     if (Designer::Constants::Internal::debug)
         qDebug() << "FormEditorStack::add" << data.widgetHost;
+
+    // Since we have 1 pixel splitters we enforce no frame
+    // on the content widget
+    if (QFrame *frame = qobject_cast<QFrame*>(data.widgetHost))
+        frame->setFrameStyle(QFrame::NoFrame);
 }
 
 int FormEditorStack::indexOf(const QDesignerFormWindowInterface *fw) const
-- 
GitLab