From fb681918c65422148a6a116fd80ea77063aa8f84 Mon Sep 17 00:00:00 2001
From: Lasse Holmstedt <lasse.holmstedt@nokia.com>
Date: Mon, 26 Jul 2010 12:47:55 +0200
Subject: [PATCH] QmlJS Live Preview: Added color box to toolbar

---
 .../images/color-picker-small-hicontrast.png  | Bin 0 -> 3206 bytes
 .../qmljsinspector/qmlinspectortoolbar.cpp    |  14 +++
 .../qmljsinspector/qmlinspectortoolbar.h      |   7 ++
 .../qmljsinspector/qmljsclientproxy.cpp       |   3 +
 src/plugins/qmljsinspector/qmljsclientproxy.h |   1 +
 .../qmljsinspector/qmljsdesigndebugclient.cpp |   6 +
 .../qmljsinspector/qmljsdesigndebugclient.h   |   1 +
 src/plugins/qmljsinspector/qmljsinspector.pro |   2 +
 src/plugins/qmljsinspector/qmljsinspector.qrc |   1 +
 .../qmljsinspector/qmljsinspectorplugin.cpp   |   1 +
 .../qmljsinspector/qmljstoolbarcolorbox.cpp   | 108 ++++++++++++++++++
 .../qmljsinspector/qmljstoolbarcolorbox.h     |  46 ++++++++
 .../qdeclarativedesigndebugserver.cpp         |  12 ++
 .../qdeclarativedesigndebugserver.h           |   4 +
 .../qmlobserver/qdeclarativedesignview.cpp    |   2 +
 15 files changed, 208 insertions(+)
 create mode 100644 src/plugins/qmljsinspector/images/color-picker-small-hicontrast.png
 create mode 100644 src/plugins/qmljsinspector/qmljstoolbarcolorbox.cpp
 create mode 100644 src/plugins/qmljsinspector/qmljstoolbarcolorbox.h

diff --git a/src/plugins/qmljsinspector/images/color-picker-small-hicontrast.png b/src/plugins/qmljsinspector/images/color-picker-small-hicontrast.png
new file mode 100644
index 0000000000000000000000000000000000000000..95b88ac8f0a20ce091821002793d1cfc3302c0b2
GIT binary patch
literal 3206
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

literal 0
HcmV?d00001

diff --git a/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp b/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
index c33e59f3a8d..6cd083b644c 100644
--- a/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
+++ b/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
@@ -1,5 +1,6 @@
 #include "qmlinspectortoolbar.h"
 #include "qmljsinspectorconstants.h"
+#include "qmljstoolbarcolorbox.h"
 
 #include <extensionsystem/pluginmanager.h>
 #include <coreplugin/icore.h>
@@ -41,6 +42,8 @@ QmlInspectorToolbar::QmlInspectorToolbar(QObject *parent) :
     m_fourthAnimSpeedAction(0),
     m_eighthAnimSpeedAction(0),
     m_tenthAnimSpeedAction(0),
+    m_menuPauseAction(0),
+    m_colorBox(0),
     m_emitSignals(true),
     m_isRunning(false),
     m_animationSpeed(1.0f),
@@ -242,6 +245,12 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
     configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::ZOOM_ACTION)->action()));
     configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::COLOR_PICKER_ACTION)->action()));
 
+    m_colorBox = new ToolBarColorBox(configBar);
+    m_colorBox->setMinimumSize(20, 20);
+    m_colorBox->setMaximumSize(20, 20);
+    m_colorBox->setInnerBorderColor(QColor(192,192,192));
+    m_colorBox->setOuterBorderColor(QColor(58,58,58));
+    configBarLayout->addWidget(m_colorBox);
     //configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::TO_QML_ACTION)->action()));
 
     configBarLayout->addStretch();
@@ -391,6 +400,11 @@ void QmlInspectorToolbar::activateZoomOnClick()
     }
 }
 
+void QmlInspectorToolbar::setSelectedColor(const QColor &color)
+{
+    m_colorBox->setColor(color);
+}
+
 void QmlInspectorToolbar::activateFromQml()
 {
     if (m_emitSignals)
diff --git a/src/plugins/qmljsinspector/qmlinspectortoolbar.h b/src/plugins/qmljsinspector/qmlinspectortoolbar.h
index ccc653f2d21..efed26f50f6 100644
--- a/src/plugins/qmljsinspector/qmlinspectortoolbar.h
+++ b/src/plugins/qmljsinspector/qmlinspectortoolbar.h
@@ -4,12 +4,16 @@
 #include <QObject>
 
 QT_FORWARD_DECLARE_CLASS(QAction);
+QT_FORWARD_DECLARE_CLASS(QColor);
 
 namespace Core {
     class Context;
 }
 
 namespace QmlJSInspector {
+
+class ToolBarColorBox;
+
 namespace Internal {
 
 class QmlInspectorToolbar : public QObject
@@ -40,6 +44,7 @@ public slots:
     void activateZoomTool();
     void changeAnimationSpeed(qreal slowdownFactor);
     void setDesignModeBehavior(bool inDesignMode);
+    void setSelectedColor(const QColor &color);
 
 signals:
     void animationSpeedChanged(qreal slowdownFactor = 1.0f);
@@ -91,6 +96,8 @@ private:
     QAction *m_tenthAnimSpeedAction;
     QAction *m_menuPauseAction;
 
+    ToolBarColorBox *m_colorBox;
+
     bool m_emitSignals;
     bool m_isRunning;
     qreal m_animationSpeed;
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
index e0260ed4429..8217b67d9ae 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
@@ -80,6 +80,8 @@ bool ClientProxy::connectToViewer(const QString &host, quint16 port)
                    SIGNAL(animationSpeedChanged(qreal)), this, SIGNAL(animationSpeedChanged(qreal)));
         disconnect(m_designClient,
                    SIGNAL(designModeBehaviorChanged(bool)), this, SIGNAL(designModeBehaviorChanged(bool)));
+        disconnect(m_designClient,
+                   SIGNAL(selectedColorChanged(QColor)), this, SIGNAL(selectedColorChanged(QColor)));
 
         emit aboutToDisconnect();
 
@@ -224,6 +226,7 @@ void ClientProxy::connectionStateChanged()
                 connect(m_designClient,
                         SIGNAL(designModeBehaviorChanged(bool)), SIGNAL(designModeBehaviorChanged(bool)));
                 connect(m_designClient, SIGNAL(reloaded()), this, SIGNAL(serverReloaded()));
+                connect(m_designClient, SIGNAL(selectedColorChanged(QColor)), SIGNAL(selectedColorChanged(QColor)));
             }
 
             (void) new DebuggerClient(m_conn);
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h
index a3694818629..3a2bcad2100 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.h
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.h
@@ -95,6 +95,7 @@ signals:
     void animationSpeedChanged(qreal slowdownFactor);
     void designModeBehaviorChanged(bool inDesignMode);
     void serverReloaded();
+    void selectedColorChanged(const QColor &color);
 
 public slots:
     void queryEngineContext(int id);
diff --git a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
index d76f75fbd49..f503fefea04 100644
--- a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
+++ b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
@@ -43,6 +43,8 @@
 #include "qmljsclientproxy.h"
 #include "qmljsinspectorconstants.h"
 
+#include <QColor>
+
 namespace QmlJSInspector {
 namespace Internal {
 
@@ -98,6 +100,10 @@ void QmlJSDesignDebugClient::messageReceived(const QByteArray &message)
         emit designModeBehaviorChanged(inDesignMode);
     } else if (type == "RELOADED") {
         emit reloaded();
+    } else if (type == "COLOR_CHANGED") {
+        QColor col;
+        ds >> col;
+        emit selectedColorChanged(col);
     }
 }
 
diff --git a/src/plugins/qmljsinspector/qmljsdesigndebugclient.h b/src/plugins/qmljsinspector/qmljsdesigndebugclient.h
index f1f45a9242b..217f969e89c 100644
--- a/src/plugins/qmljsinspector/qmljsdesigndebugclient.h
+++ b/src/plugins/qmljsinspector/qmljsdesigndebugclient.h
@@ -75,6 +75,7 @@ public:
 
 signals:
     void currentObjectsChanged(const QList<int> &debugIds);
+    void selectedColorChanged(const QColor &color);
     void colorPickerActivated();
     void selectToolActivated();
     void selectMarqueeToolActivated();
diff --git a/src/plugins/qmljsinspector/qmljsinspector.pro b/src/plugins/qmljsinspector/qmljsinspector.pro
index d543ca86938..ac2dc277a54 100644
--- a/src/plugins/qmljsinspector/qmljsinspector.pro
+++ b/src/plugins/qmljsinspector/qmljsinspector.pro
@@ -19,6 +19,7 @@ qmljsclientproxy.h \
 qmljsinspector.h \
 qmlinspectortoolbar.h \
 qmljslivetextpreview.h \
+qmljstoolbarcolorbox.h \
 qmljsdesigndebugclient.h
 
 SOURCES += \
@@ -29,6 +30,7 @@ qmljsclientproxy.cpp \
 qmljsinspector.cpp \
 qmlinspectortoolbar.cpp \
 qmljslivetextpreview.cpp \
+qmljstoolbarcolorbox.cpp \
 qmljsdesigndebugclient.cpp
 
 OTHER_FILES += QmlJSInspector.pluginspec
diff --git a/src/plugins/qmljsinspector/qmljsinspector.qrc b/src/plugins/qmljsinspector/qmljsinspector.qrc
index 36b7587803d..95700236cb2 100644
--- a/src/plugins/qmljsinspector/qmljsinspector.qrc
+++ b/src/plugins/qmljsinspector/qmljsinspector.qrc
@@ -18,5 +18,6 @@
         <file>images/zoom-small.png</file>
         <file>images/select-marquee-small.png</file>
         <file>images/designmode.png</file>
+        <file>images/color-picker-small-hicontrast.png</file>
     </qresource>
 </RCC>
diff --git a/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp b/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp
index a19b9b463e6..f69fb16967f 100644
--- a/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp
+++ b/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp
@@ -173,6 +173,7 @@ void InspectorPlugin::extensionsInitialized()
     connect(_clientProxy, SIGNAL(selectMarqueeToolActivated()), m_toolbar, SLOT(activateMarqueeSelectTool()));
     connect(_clientProxy, SIGNAL(zoomToolActivated()), m_toolbar, SLOT(activateZoomTool()));
     connect(_clientProxy, SIGNAL(designModeBehaviorChanged(bool)), m_toolbar, SLOT(setDesignModeBehavior(bool)));
+    connect(_clientProxy, SIGNAL(selectedColorChanged(QColor)), m_toolbar, SLOT(setSelectedColor(QColor)));
 
     connect(_clientProxy, SIGNAL(animationSpeedChanged(qreal)), m_toolbar, SLOT(changeAnimationSpeed(qreal)));
 }
diff --git a/src/plugins/qmljsinspector/qmljstoolbarcolorbox.cpp b/src/plugins/qmljsinspector/qmljstoolbarcolorbox.cpp
new file mode 100644
index 00000000000..64d4f7411ae
--- /dev/null
+++ b/src/plugins/qmljsinspector/qmljstoolbarcolorbox.cpp
@@ -0,0 +1,108 @@
+#include "qmljstoolbarcolorbox.h"
+
+#include <QPixmap>
+#include <QPainter>
+#include <QMenu>
+#include <QAction>
+#include <QContextMenuEvent>
+#include <QClipboard>
+#include <QApplication>
+#include <QColorDialog>
+#include <QDrag>
+#include <QMimeData>
+
+#include <QDebug>
+
+namespace QmlJSInspector {
+
+ToolBarColorBox::ToolBarColorBox(QWidget *parent) :
+    QLabel(parent)
+{
+    m_color = Qt::white;
+    m_borderColorOuter = Qt::white;
+    m_borderColorInner = QColor(143, 143 ,143);
+
+    m_copyHexColorAction = new QAction(QIcon(":/qml/images/color-picker-small-hicontrast.png"), tr("Copy Color"), this);
+    connect(m_copyHexColorAction, SIGNAL(triggered()), SLOT(copyColorToClipboard()));
+    setScaledContents(false);
+}
+
+void ToolBarColorBox::setColor(const QColor &color)
+{
+    m_color = color;
+
+    QPixmap pix = createDragPixmap(width());
+    setPixmap(pix);
+    update();
+}
+
+void ToolBarColorBox::setInnerBorderColor(const QColor &color)
+{
+    m_borderColorInner = color;
+    setColor(m_color);
+}
+
+void ToolBarColorBox::setOuterBorderColor(const QColor &color)
+ {
+     m_borderColorOuter = color;
+     setColor(m_color);
+ }
+
+void ToolBarColorBox::mousePressEvent(QMouseEvent *event)
+{
+    m_dragBeginPoint = event->pos();
+    m_dragStarted = false;
+}
+
+void ToolBarColorBox::mouseMoveEvent(QMouseEvent *event)
+{
+    if (event->buttons() & Qt::LeftButton
+        && QPoint(event->pos() - m_dragBeginPoint).manhattanLength() > QApplication::startDragDistance()
+        && !m_dragStarted)
+    {
+        m_dragStarted = true;
+        QDrag *drag = new QDrag(this);
+        QMimeData *mimeData = new QMimeData;
+
+        mimeData->setText(m_color.name());
+        drag->setMimeData(mimeData);
+        drag->setPixmap(createDragPixmap());
+
+        drag->exec();
+    }
+}
+
+QPixmap ToolBarColorBox::createDragPixmap(int size) const
+{
+    QPixmap pix(size, size);
+    QPainter p(&pix);
+
+    p.setBrush(QBrush(m_color));
+    p.setPen(QPen(QBrush(m_borderColorInner),1));
+
+    p.fillRect(0, 0, size, size, m_borderColorOuter);
+    p.drawRect(1,1, size - 3, size - 3);
+    return pix;
+}
+
+void ToolBarColorBox::contextMenuEvent(QContextMenuEvent *ev)
+{
+    QMenu contextMenu;
+    contextMenu.addAction(m_copyHexColorAction);
+    contextMenu.exec(ev->globalPos());
+}
+
+void ToolBarColorBox::mouseDoubleClickEvent(QMouseEvent *)
+{
+    QColorDialog dialog(m_color);
+    dialog.show();
+}
+
+void ToolBarColorBox::copyColorToClipboard()
+{
+    QClipboard *clipboard = QApplication::clipboard();
+    clipboard->setText(m_color.name());
+}
+
+
+} // namespace QmlJSInspector
diff --git a/src/plugins/qmljsinspector/qmljstoolbarcolorbox.h b/src/plugins/qmljsinspector/qmljstoolbarcolorbox.h
new file mode 100644
index 00000000000..1b375544c28
--- /dev/null
+++ b/src/plugins/qmljsinspector/qmljstoolbarcolorbox.h
@@ -0,0 +1,46 @@
+#ifndef TOOLBARCOLORBOX_H
+#define TOOLBARCOLORBOX_H
+
+#include <QLabel>
+#include <QColor>
+#include <QPoint>
+
+QT_FORWARD_DECLARE_CLASS(QContextMenuEvent);
+QT_FORWARD_DECLARE_CLASS(QAction);
+
+namespace QmlJSInspector {
+
+class ToolBarColorBox : public QLabel
+{
+    Q_OBJECT
+public:
+    explicit ToolBarColorBox(QWidget *parent = 0);
+    void setColor(const QColor &color);
+    void setInnerBorderColor(const QColor &color);
+    void setOuterBorderColor(const QColor &color);
+
+protected:
+    void contextMenuEvent(QContextMenuEvent *ev);
+    void mouseDoubleClickEvent(QMouseEvent *);
+    void mousePressEvent(QMouseEvent *ev);
+    void mouseMoveEvent(QMouseEvent *ev);
+private slots:
+    void copyColorToClipboard();
+
+private:
+    QPixmap createDragPixmap(int size = 24) const;
+
+private:
+    bool m_dragStarted;
+    QPoint m_dragBeginPoint;
+    QAction *m_copyHexColorAction;
+    QColor m_color;
+
+    QColor m_borderColorOuter;
+    QColor m_borderColorInner;
+
+};
+
+} // namespace QmlJSInspector
+
+#endif // TOOLBARCOLORBOX_H
diff --git a/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.cpp b/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.cpp
index 1d53adf6454..367e74c41af 100644
--- a/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.cpp
+++ b/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.cpp
@@ -1,5 +1,7 @@
 #include "qdeclarativedesigndebugserver.h"
+
 #include <QStringList>
+#include <QColor>
 
 #include <QDebug>
 
@@ -128,3 +130,13 @@ void QDeclarativeDesignDebugServer::reloaded()
     sendMessage(message);
 }
 
+void QDeclarativeDesignDebugServer::selectedColorChanged(const QColor &color)
+{
+    QByteArray message;
+    QDataStream ds(&message, QIODevice::WriteOnly);
+
+    ds << QByteArray("COLOR_CHANGED")
+       << color;
+
+    sendMessage(message);
+}
diff --git a/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.h b/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.h
index a2f2890feb3..55a91a7af33 100644
--- a/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.h
+++ b/src/tools/qml/qmlobserver/qdeclarativedesigndebugserver.h
@@ -47,6 +47,7 @@
 
 QT_BEGIN_NAMESPACE
 
+class QColor;
 class QDeclarativeEngine;
 class QDeclarativeContext;
 class QDeclarativeWatcher;
@@ -64,6 +65,9 @@ public:
     void setCurrentTool(QmlViewer::Constants::DesignTool toolId);
     void reloaded();
 
+public Q_SLOTS:
+    void selectedColorChanged(const QColor &color);
+
 Q_SIGNALS:
     void currentObjectsChanged(const QList<QObject*> &objects);
     void designModeBehaviorChanged(bool inDesignMode);
diff --git a/src/tools/qml/qmlobserver/qdeclarativedesignview.cpp b/src/tools/qml/qmlobserver/qdeclarativedesignview.cpp
index 76de0ab06ef..d1316925e7f 100644
--- a/src/tools/qml/qmlobserver/qdeclarativedesignview.cpp
+++ b/src/tools/qml/qmlobserver/qdeclarativedesignview.cpp
@@ -58,6 +58,8 @@ QDeclarativeDesignView::QDeclarativeDesignView(QWidget *parent) :
     connect(this, SIGNAL(statusChanged(QDeclarativeView::Status)), SLOT(onStatusChanged(QDeclarativeView::Status)));
 
     connect(m_colorPickerTool, SIGNAL(selectedColorChanged(QColor)), SIGNAL(selectedColorChanged(QColor)));
+    connect(m_colorPickerTool, SIGNAL(selectedColorChanged(QColor)),
+            qmlDesignDebugServer(), SLOT(selectedColorChanged(QColor)));
 
     createToolbar();
 }
-- 
GitLab