From e20d18f1982dde2b0fa9bd262e5aadd1e451a7fa Mon Sep 17 00:00:00 2001
From: Olivier Goffart <ogoffart@trolltech.com>
Date: Mon, 30 Mar 2009 13:33:45 +0200
Subject: Allow styling of pressed splitter

Task-number: 206494
Reviewed-by: Jens Bache-Wiig
---
 doc/src/snippets/code/doc_src_stylesheet.qdoc |  5 +++
 src/gui/widgets/qsplitter.cpp                 | 12 ++++-
 src/gui/widgets/qsplitter_p.h                 |  9 ++--
 tests/auto/uiloader/baseline/css_splitter.ui  | 63 +++++++++++++++++++++++++++
 4 files changed, 83 insertions(+), 6 deletions(-)
 create mode 100644 tests/auto/uiloader/baseline/css_splitter.ui

diff --git a/doc/src/snippets/code/doc_src_stylesheet.qdoc b/doc/src/snippets/code/doc_src_stylesheet.qdoc
index 60622d3..a62148f 100644
--- a/doc/src/snippets/code/doc_src_stylesheet.qdoc
+++ b/doc/src/snippets/code/doc_src_stylesheet.qdoc
@@ -1538,6 +1538,11 @@ QSplitter::handle:horizontal {
 QSplitter::handle:vertical {
     height: 2px;
 }
+
+QSplitter::handle:pressed {
+    url(images/splitter_pressed.png);
+}
+
 //! [142]
 
 
diff --git a/src/gui/widgets/qsplitter.cpp b/src/gui/widgets/qsplitter.cpp
index bf8af35..06774bc 100644
--- a/src/gui/widgets/qsplitter.cpp
+++ b/src/gui/widgets/qsplitter.cpp
@@ -119,7 +119,6 @@ QSplitterHandle::QSplitterHandle(Qt::Orientation orientation, QSplitter *parent)
 {
     Q_D(QSplitterHandle);
     d->s = parent;
-    d->hover = false;
     setOrientation(orientation);
 }
 
@@ -269,8 +268,11 @@ void QSplitterHandle::mouseMoveEvent(QMouseEvent *e)
 void QSplitterHandle::mousePressEvent(QMouseEvent *e)
 {
     Q_D(QSplitterHandle);
-    if (e->button() == Qt::LeftButton)
+    if (e->button() == Qt::LeftButton) {
         d->mouseOffset = d->pick(e->pos());
+        d->pressed = true;
+        update();
+    }
 }
 
 /*!
@@ -285,6 +287,10 @@ void QSplitterHandle::mouseReleaseEvent(QMouseEvent *e)
         d->s->setRubberBand(-1);
         moveSplitter(pos);
     }
+    if (e->button() == Qt::LeftButton) {
+        d->pressed = false;
+        update();
+    }
 }
 
 /*!
@@ -303,6 +309,8 @@ void QSplitterHandle::paintEvent(QPaintEvent *)
         opt.state = QStyle::State_None;
     if (d->hover)
         opt.state |= QStyle::State_MouseOver;
+    if (d->pressed)
+        opt.state |= QStyle::State_Sunken;
     if (isEnabled())
         opt.state |= QStyle::State_Enabled;
     parentWidget()->style()->drawControl(QStyle::CE_Splitter, &opt, &p, d->s);
diff --git a/src/gui/widgets/qsplitter_p.h b/src/gui/widgets/qsplitter_p.h
index 5cc43af..9f6fe0c 100644
--- a/src/gui/widgets/qsplitter_p.h
+++ b/src/gui/widgets/qsplitter_p.h
@@ -131,16 +131,17 @@ class QSplitterHandlePrivate : public QWidgetPrivate
 {
     Q_DECLARE_PUBLIC(QSplitterHandle)
 public:
-    QSplitterHandlePrivate() : orient(Qt::Horizontal), opaq(false), s(0), mouseOffset(0) {}
+    QSplitterHandlePrivate() : s(0), orient(Qt::Horizontal), mouseOffset(0), opaq(false), hover(false), pressed(false) {}
 
     inline int pick(const QPoint &pos) const
     { return orient == Qt::Horizontal ? pos.x() : pos.y(); }
 
-    Qt::Orientation orient;
-    bool opaq;
     QSplitter *s;
-    bool hover;
+    Qt::Orientation orient;
     int mouseOffset;
+    bool opaq    : 1;
+    bool hover   : 1;
+    bool pressed : 1;
 };
 
 QT_END_NAMESPACE
diff --git a/tests/auto/uiloader/baseline/css_splitter.ui b/tests/auto/uiloader/baseline/css_splitter.ui
new file mode 100644
index 0000000..99dbc18
--- /dev/null
+++ b/tests/auto/uiloader/baseline/css_splitter.ui
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>424</width>
+    <height>364</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="styleSheet">
+   <string notr="true"> QSplitter::handle:vertical {
+     image: url(images/splitter_horizontal.png);
+ }
+
+ QSplitter::handle:horizontal {
+     image: url(images/splitter_vertical.png);
+ }
+
+#big_splitter::handle { background-color: blue;  border: 3px dashed  green; height:50px; }
+
+
+ QSplitter::handle:hover {
+   background-color:  qlineargradient(spread:repeat, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 0, 0, 255), stop:0.17 rgba(255, 0, 0, 255), stop:0.18 rgba(255, 255, 255, 255), stop:0.210212 rgba(255, 255, 255, 255), stop:0.220212 rgba(0, 16, 255, 255), stop:0.279897 rgba(0, 16, 255, 255), stop:0.289897 rgba(255, 255, 255, 255), stop:0.32 rgba(255, 255, 255, 255), stop:0.33 rgba(255, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))
+ }
+
+ QSplitter::handle:pressed {
+	background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(9, 41, 4, 255), stop:0.085 rgba(2, 79, 0, 255), stop:0.19 rgba(50, 147, 22, 255), stop:0.275 rgba(236, 191, 49, 255), stop:0.39 rgba(243, 61, 34, 255), stop:0.555 rgba(135, 81, 60, 255), stop:0.667 rgba(121, 75, 255, 255), stop:0.825 rgba(164, 255, 244, 255), stop:0.885 rgba(104, 222, 71, 255), stop:1 rgba(93, 128, 0, 255));
+ }</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QSplitter" name="splitter_3">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <widget class="QSplitter" name="big_splitter">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <widget class="QTextEdit" name="textEdit"/>
+      <widget class="QTextEdit" name="textEdit_5"/>
+      <widget class="QTextEdit" name="textEdit_4"/>
+     </widget>
+     <widget class="QSplitter" name="splitter">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <widget class="QTextEdit" name="textEdit_2"/>
+      <widget class="QTextEdit" name="textEdit_3"/>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
-- 
cgit v0.12