From d2ed221b1bb483025064743777dda88338525eb8 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Tue, 23 Nov 2010 10:07:09 +0100
Subject: [PATCH] QmlObserver: Add 'show app on top' switch to creator +
 qmlobserver

This is convenient especially in the observer mode.

Reviewed-by: Christiaan Janssen
---
 .../include/qdeclarativeobserverservice.h     |   3 ++
 .../include/qdeclarativeviewobserver.h        |   5 +++
 .../qdeclarativeobserverservice.cpp           |  14 ++++++++
 .../qdeclarativeviewobserver.cpp              |  30 ++++++++++++++++++
 .../qdeclarativeviewobserver_p.h              |   1 +
 share/qtcreator/qml/qmlobserver/main.cpp      |   1 +
 .../qtcreator/qml/qmlobserver/qmlruntime.cpp  |  13 ++++++++
 share/qtcreator/qml/qmlobserver/qmlruntime.h  |   2 ++
 .../qmljsinspector/images/app-on-top.png      | Bin 0 -> 2902 bytes
 .../qmljsinspector/qmlinspectortoolbar.cpp    |  26 +++++++++++++++
 .../qmljsinspector/qmlinspectortoolbar.h      |   6 ++++
 .../qmljsinspector/qmljsclientproxy.cpp       |   8 +++++
 src/plugins/qmljsinspector/qmljsclientproxy.h |   2 ++
 src/plugins/qmljsinspector/qmljsinspector.cpp |  12 ++++---
 src/plugins/qmljsinspector/qmljsinspector.qrc |   1 +
 .../qmljsinspector/qmljsinspectorconstants.h  |   1 +
 .../qmljsinspector/qmljsobserverclient.cpp    |  21 ++++++++++++
 .../qmljsinspector/qmljsobserverclient.h      |   2 ++
 18 files changed, 144 insertions(+), 4 deletions(-)
 create mode 100644 src/plugins/qmljsinspector/images/app-on-top.png

diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h
index 66084cd92c4..df4704fa83e 100644
--- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h
+++ b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h
@@ -68,6 +68,8 @@ public:
     void setAnimationSpeed(qreal slowdownFactor);
     void setCurrentTool(QmlJSDebugger::Constants::DesignTool toolId);
     void reloaded();
+    void setShowAppOnTop(bool showAppOnTop);
+
     QString idStringForObject(QObject *obj) const;
 
     void sendMessage(const QByteArray &message);
@@ -81,6 +83,7 @@ Q_SIGNALS:
 
     void currentObjectsChanged(const QList<QObject*> &objects);
     void designModeBehaviorChanged(bool inDesignMode);
+    void showAppOnTopChanged(bool showAppOnTop);
     void reloadRequested();
     void selectToolRequested();
     void selectMarqueeToolRequested();
diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h
index e8f3194a817..3a81119e341 100644
--- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h
+++ b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h
@@ -61,10 +61,14 @@ public:
     static QString idStringForObject(QObject *obj);
     QRectF adjustToScreenBoundaries(const QRectF &boundingRectInSceneSpace);
 
+    bool showAppOnTop() const;
+
 public Q_SLOTS:
     void setDesignModeBehavior(bool value);
     bool designModeBehavior();
 
+    void setShowAppOnTop(bool appOnTop);
+
     void changeAnimationSpeed(qreal slowdownFactor);
     void continueExecution(qreal slowdownFactor = 1.0f);
     void pauseExecution();
@@ -73,6 +77,7 @@ public Q_SLOTS:
 
 Q_SIGNALS:
     void designModeBehaviorChanged(bool inDesignMode);
+    void showAppOnTopChanged(bool showAppOnTop);
     void reloadRequested();
     void marqueeSelectToolActivated();
     void selectToolActivated();
diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp
index 114cd15cf6c..5b052119f9b 100644
--- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp
+++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp
@@ -110,6 +110,10 @@ void QDeclarativeObserverService::messageReceived(const QByteArray &message)
         bool inDesignMode;
         ds >> inDesignMode;
         emit designModeBehaviorChanged(inDesignMode);
+    } else if (type == "SHOW_APP_ON_TOP") {
+        bool showOnTop;
+        ds >> showOnTop;
+        emit showAppOnTopChanged(showOnTop);
     } else if (type == "CREATE_OBJECT") {
         QString qml;
         int parentId;
@@ -207,6 +211,16 @@ void QDeclarativeObserverService::reloaded()
     sendMessage(message);
 }
 
+void QDeclarativeObserverService::setShowAppOnTop(bool showAppOnTop)
+{
+    QByteArray message;
+    QDataStream ds(&message, QIODevice::WriteOnly);
+
+    ds << QByteArray("SHOW_APP_ON_TOP") << showAppOnTop;
+
+    sendMessage(message);
+}
+
 void QDeclarativeObserverService::selectedColorChanged(const QColor &color)
 {
     QByteArray message;
diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp
index 3949bf71378..7063bec07a8 100644
--- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp
+++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp
@@ -57,6 +57,7 @@ const int SceneChangeUpdateInterval = 5000;
 QDeclarativeViewObserverPrivate::QDeclarativeViewObserverPrivate(QDeclarativeViewObserver *q) :
     q(q),
     designModeBehavior(false),
+    showAppOnTop(false),
     executionPaused(false),
     slowdownFactor(1.0f),
     toolbar(0)
@@ -87,6 +88,8 @@ QDeclarativeViewObserver::QDeclarativeViewObserver(QDeclarativeView *view, QObje
     data->debugService = QDeclarativeObserverService::instance();
     connect(data->debugService, SIGNAL(designModeBehaviorChanged(bool)),
             SLOT(setDesignModeBehavior(bool)));
+    connect(data->debugService, SIGNAL(showAppOnTopChanged(bool)),
+            SLOT(setShowAppOnTop(bool)));
     connect(data->debugService, SIGNAL(reloadRequested()), SLOT(_q_reloadView()));
     connect(data->debugService, SIGNAL(currentObjectsChanged(QList<QObject*>)),
             SLOT(_q_onCurrentObjectsChanged(QList<QObject*>)));
@@ -475,6 +478,33 @@ bool QDeclarativeViewObserver::designModeBehavior()
     return data->designModeBehavior;
 }
 
+bool QDeclarativeViewObserver::showAppOnTop() const
+{
+    return data->showAppOnTop;
+}
+
+void QDeclarativeViewObserver::setShowAppOnTop(bool appOnTop)
+{
+    if (data->view) {
+        QWidget *rootWidget = data->view;
+        while (rootWidget->parentWidget())
+            rootWidget = rootWidget->parentWidget();
+        Qt::WindowFlags flags = rootWidget->windowFlags();
+        if (appOnTop) {
+            flags |= Qt::WindowStaysOnTopHint;
+        } else {
+            flags &= ~Qt::WindowStaysOnTopHint;
+        }
+        rootWidget->setWindowFlags(flags);
+        rootWidget->show();
+    }
+
+    data->showAppOnTop = appOnTop;
+    data->debugService->setShowAppOnTop(appOnTop);
+
+    emit showAppOnTopChanged(appOnTop);
+}
+
 void QDeclarativeViewObserverPrivate::changeTool(Constants::DesignTool tool,
                                                  Constants::ToolFlags /*flags*/)
 {
diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h
index 7236e862983..fafa3794b73 100644
--- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h
+++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h
@@ -83,6 +83,7 @@ public:
     BoundingRectHighlighter *boundingRectHighlighter;
 
     bool designModeBehavior;
+    bool showAppOnTop;
 
     bool executionPaused;
     qreal slowdownFactor;
diff --git a/share/qtcreator/qml/qmlobserver/main.cpp b/share/qtcreator/qml/qmlobserver/main.cpp
index baa0fb948e8..86a8085cd0a 100644
--- a/share/qtcreator/qml/qmlobserver/main.cpp
+++ b/share/qtcreator/qml/qmlobserver/main.cpp
@@ -422,6 +422,7 @@ int main(int argc, char ** argv)
         viewer->enableExperimentalGestures();
 
     viewer->setDesignModeBehavior(designModeBehavior);
+    viewer->setStayOnTop(stayOnTop);
 
     foreach (QString lib, imports)
         viewer->addLibraryPath(lib);
diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.cpp b/share/qtcreator/qml/qmlobserver/qmlruntime.cpp
index d35c18d4a96..03276350aea 100644
--- a/share/qtcreator/qml/qmlobserver/qmlruntime.cpp
+++ b/share/qtcreator/qml/qmlobserver/qmlruntime.cpp
@@ -755,6 +755,13 @@ void QDeclarativeViewer::createMenu()
     connect(observer, SIGNAL(designModeBehaviorChanged(bool)), designModeBehaviorAction, SLOT(setChecked(bool)));
     connect(QmlJSDebugger::QDeclarativeObserverService::instance(), SIGNAL(debuggingClientChanged(bool)), designModeBehaviorAction, SLOT(setEnabled(bool)));
 
+    appOnTopAction = new QAction(tr("Keep Window on Top"), this);
+    appOnTopAction->setCheckable(true);
+    appOnTopAction->setChecked(observer->showAppOnTop());
+
+    connect(appOnTopAction, SIGNAL(triggered(bool)), observer, SLOT(setShowAppOnTop(bool)));
+    connect(observer, SIGNAL(showAppOnTopChanged(bool)), appOnTopAction, SLOT(setChecked(bool)));
+
     QAction *proxyAction = new QAction(tr("HTTP &Proxy..."), this);
     connect(proxyAction, SIGNAL(triggered()), this, SLOT(showProxySettings()));
 
@@ -825,6 +832,7 @@ void QDeclarativeViewer::createMenu()
     debugMenu->addAction(playSpeedAction);
     debugMenu->addAction(showWarningsWindow);
     debugMenu->addAction(designModeBehaviorAction);
+    debugMenu->addAction(appOnTopAction);
 #endif // ! Q_OS_SYMBIAN
 
     QMenu *settingsMenu = menu->addMenu(tr("S&ettings"));
@@ -1487,6 +1495,11 @@ void QDeclarativeViewer::setSizeToView(bool sizeToView)
     }
 }
 
+void QDeclarativeViewer::setStayOnTop(bool stayOnTop)
+{
+    appOnTopAction->setChecked(stayOnTop);
+}
+
 void QDeclarativeViewer::setAnimationSpeed(float f)
 {
     QDeclarativeDebugHelper::setAnimationSlowDownFactor(f);
diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.h b/share/qtcreator/qml/qmlobserver/qmlruntime.h
index 7c30998dfc1..b09d1b879b8 100644
--- a/share/qtcreator/qml/qmlobserver/qmlruntime.h
+++ b/share/qtcreator/qml/qmlobserver/qmlruntime.h
@@ -107,6 +107,7 @@ public:
     void setUseGL(bool use);
     void setUseNativeFileBrowser(bool);
     void setSizeToView(bool sizeToView);
+    void setStayOnTop(bool stayOnTop);
 
     QDeclarativeView *view() const;
     LoggerWidget *warningsWidget() const;
@@ -201,6 +202,7 @@ private:
     QActionGroup *orientation;
     QAction *showWarningsWindow;
     QAction *designModeBehaviorAction;
+    QAction *appOnTopAction;
 
     QString m_script;
     ScriptOptions m_scriptOptions;
diff --git a/src/plugins/qmljsinspector/images/app-on-top.png b/src/plugins/qmljsinspector/images/app-on-top.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddec5400c699a8a15fb271976b53bda3cb834228
GIT binary patch
literal 2902
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
AIRF3v

literal 0
HcmV?d00001

diff --git a/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp b/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
index 6d828d82e81..0f91422577d 100644
--- a/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
+++ b/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
@@ -65,6 +65,7 @@ QmlInspectorToolbar::QmlInspectorToolbar(QObject *parent) :
     m_selectAction(0),
     m_zoomAction(0),
     m_colorPickerAction(0),
+    m_showAppOnTopAction(0),
     m_defaultAnimSpeedAction(0),
     m_halfAnimSpeedAction(0),
     m_fourthAnimSpeedAction(0),
@@ -86,6 +87,7 @@ QmlInspectorToolbar::QmlInspectorToolbar(QObject *parent) :
 void QmlInspectorToolbar::setEnabled(bool value)
 {
     m_fromQmlAction->setEnabled(value);
+    m_showAppOnTopAction->setEnabled(value);
     m_observerModeAction->setEnabled(value);
     m_playAction->setEnabled(value);
     m_selectAction->setEnabled(value);
@@ -166,6 +168,13 @@ void QmlInspectorToolbar::setDesignModeBehavior(bool inDesignMode)
     m_emitSignals = true;
 }
 
+void QmlInspectorToolbar::setShowAppOnTop(bool showAppOnTop)
+{
+    m_emitSignals = false;
+    m_showAppOnTopAction->setChecked(showAppOnTop);
+    m_emitSignals = true;
+}
+
 void QmlInspectorToolbar::createActions(const Core::Context &context)
 {
     Core::ICore *core = Core::ICore::instance();
@@ -174,6 +183,9 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
     m_fromQmlAction =
             new QAction(QIcon(QLatin1String(":/qml/images/from-qml-small.png")),
                         tr("Apply Changes on Save"), this);
+    m_showAppOnTopAction =
+            new QAction(QIcon(QLatin1String(":/qml/images/app-on-top.png")),
+                        tr("Show application on top"), this);
     m_observerModeAction =
             new QAction(QIcon(QLatin1String(":/qml/images/observermode.png")),
                         tr("Observer Mode"), this);
@@ -191,6 +203,8 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
 
     m_fromQmlAction->setCheckable(true);
     m_fromQmlAction->setChecked(true);
+    m_showAppOnTopAction->setCheckable(true);
+    m_showAppOnTopAction->setChecked(false);
     m_observerModeAction->setCheckable(true);
     m_observerModeAction->setChecked(false);
     m_selectAction->setCheckable(true);
@@ -203,6 +217,8 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
     am->registerAction(m_zoomAction, QmlJSInspector::Constants::ZOOM_ACTION, context);
     am->registerAction(m_colorPickerAction, QmlJSInspector::Constants::COLOR_PICKER_ACTION, context);
     am->registerAction(m_fromQmlAction, QmlJSInspector::Constants::FROM_QML_ACTION, context);
+    am->registerAction(m_showAppOnTopAction,
+                       QmlJSInspector::Constants::SHOW_APP_ON_TOP_ACTION, context);
 
     m_barWidget = new Utils::StyledBar;
     m_barWidget->setSingleRow(true);
@@ -250,6 +266,9 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
 
     configBarLayout->addWidget(
                 createToolButton(am->command(QmlJSInspector::Constants::FROM_QML_ACTION)->action()));
+    configBarLayout->addWidget(
+                createToolButton(
+                    am->command(QmlJSInspector::Constants::SHOW_APP_ON_TOP_ACTION)->action()));
     configBarLayout->addSpacing(10);
 
     configBarLayout->addWidget(
@@ -277,6 +296,7 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
     setEnabled(false);
 
     connect(m_fromQmlAction, SIGNAL(triggered()), SLOT(activateFromQml()));
+    connect(m_showAppOnTopAction, SIGNAL(triggered()), SLOT(showAppOnTopClick()));
     connect(m_observerModeAction, SIGNAL(triggered()), SLOT(activateDesignModeOnClick()));
     connect(m_playAction, SIGNAL(triggered()), SLOT(activatePlayOnClick()));
     connect(m_colorPickerAction, SIGNAL(triggered()), SLOT(activateColorPickerOnClick()));
@@ -404,6 +424,12 @@ void QmlInspectorToolbar::activateZoomOnClick()
     }
 }
 
+void QmlInspectorToolbar::showAppOnTopClick()
+{
+    if (m_emitSignals)
+        emit showAppOnTopSelected(m_showAppOnTopAction->isChecked());
+}
+
 void QmlInspectorToolbar::setSelectedColor(const QColor &color)
 {
     m_colorBox->setColor(color);
diff --git a/src/plugins/qmljsinspector/qmlinspectortoolbar.h b/src/plugins/qmljsinspector/qmlinspectortoolbar.h
index f643b451073..8252b11eae0 100644
--- a/src/plugins/qmljsinspector/qmlinspectortoolbar.h
+++ b/src/plugins/qmljsinspector/qmlinspectortoolbar.h
@@ -80,6 +80,7 @@ public slots:
     void activateZoomTool();
     void setAnimationSpeed(qreal slowdownFactor);
     void setDesignModeBehavior(bool inDesignMode);
+    void setShowAppOnTop(bool showAppOnTop);
     void setSelectedColor(const QColor &color);
 
 signals:
@@ -91,6 +92,7 @@ signals:
     void selectToolSelected();
     void zoomToolSelected();
 
+    void showAppOnTopSelected(bool isChecked);
     void animationSpeedChanged(qreal slowdownFactor = 1.0f);
 
 private slots:
@@ -100,6 +102,8 @@ private slots:
     void activateSelectToolOnClick();
     void activateZoomOnClick();
 
+    void showAppOnTopClick();
+
     void changeToDefaultAnimSpeed();
     void changeToHalfAnimSpeed();
     void changeToFourthAnimSpeed();
@@ -119,6 +123,8 @@ private:
     QAction *m_zoomAction;
     QAction *m_colorPickerAction;
 
+    QAction *m_showAppOnTopAction;
+
     QAction *m_defaultAnimSpeedAction;
     QAction *m_halfAnimSpeedAction;
     QAction *m_fourthAnimSpeedAction;
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
index a26e15b8a63..26a5e46fdf5 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
@@ -89,6 +89,8 @@ void ClientProxy::connectToServer()
         SIGNAL(animationSpeedChanged(qreal)));
     connect(m_observerClient, SIGNAL(designModeBehaviorChanged(bool)),
         SIGNAL(designModeBehaviorChanged(bool)));
+    connect(m_observerClient, SIGNAL(showAppOnTopChanged(bool)),
+        SIGNAL(showAppOnTopChanged(bool)));
     connect(m_observerClient, SIGNAL(reloaded()), this,
         SIGNAL(serverReloaded()));
     connect(m_observerClient, SIGNAL(selectedColorChanged(QColor)),
@@ -484,6 +486,12 @@ void ClientProxy::changeToSelectMarqueeTool()
         m_observerClient->changeToSelectMarqueeTool();
 }
 
+void ClientProxy::showAppOnTop(bool showOnTop)
+{
+    if (isConnected())
+        m_observerClient->showAppOnTop(showOnTop);
+}
+
 void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId,
                                   const QStringList &imports, const QString &filename)
 {
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h
index 47e867863ab..50f9e4ad218 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.h
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.h
@@ -100,6 +100,7 @@ signals:
     void zoomToolActivated();
     void animationSpeedChanged(qreal slowdownFactor);
     void designModeBehaviorChanged(bool inDesignMode);
+    void showAppOnTopChanged(bool showAppOnTop);
     void serverReloaded();
     void selectedColorChanged(const QColor &color);
     void contextPathUpdated(const QStringList &contextPath);
@@ -115,6 +116,7 @@ public slots:
     void changeToZoomTool();
     void changeToSelectTool();
     void changeToSelectMarqueeTool();
+    void showAppOnTop(bool showOnTop);
     void createQmlObject(const QString &qmlText, int parentDebugId,
                          const QStringList &imports, const QString &filename = QString());
     void destroyQmlObject(int debugId);
diff --git a/src/plugins/qmljsinspector/qmljsinspector.cpp b/src/plugins/qmljsinspector/qmljsinspector.cpp
index a8690280dcf..a9bd4ea35a0 100644
--- a/src/plugins/qmljsinspector/qmljsinspector.cpp
+++ b/src/plugins/qmljsinspector/qmljsinspector.cpp
@@ -768,9 +768,9 @@ void InspectorUi::setupToolbar(bool doConnect)
                 m_clientProxy, SLOT(changeToSelectTool()));
         connect(m_toolbar, SIGNAL(applyChangesFromQmlFileTriggered(bool)),
                 this, SLOT(setApplyChangesToQmlObserver(bool)));
+        connect(m_toolbar, SIGNAL(showAppOnTopSelected(bool)),
+                m_clientProxy, SLOT(showAppOnTop(bool)));
 
-        connect(this, SIGNAL(livePreviewActivated(bool)),
-                m_toolbar, SLOT(setLivePreviewChecked(bool)));
         connect(m_clientProxy, SIGNAL(colorPickerActivated()),
                 m_toolbar, SLOT(activateColorPicker()));
         connect(m_clientProxy, SIGNAL(selectToolActivated()),
@@ -779,6 +779,8 @@ void InspectorUi::setupToolbar(bool doConnect)
                 m_toolbar, SLOT(activateZoomTool()));
         connect(m_clientProxy, SIGNAL(designModeBehaviorChanged(bool)),
                 m_toolbar, SLOT(setDesignModeBehavior(bool)));
+        connect(m_clientProxy, SIGNAL(showAppOnTopChanged(bool)),
+                m_toolbar, SLOT(setShowAppOnTop(bool)));
         connect(m_clientProxy, SIGNAL(selectedColorChanged(QColor)),
                 m_toolbar, SLOT(setSelectedColor(QColor)));
 
@@ -804,9 +806,9 @@ void InspectorUi::setupToolbar(bool doConnect)
                    m_clientProxy, SLOT(changeToSelectTool()));
         disconnect(m_toolbar, SIGNAL(applyChangesFromQmlFileTriggered(bool)),
                    this, SLOT(setApplyChangesToQmlObserver(bool)));
+        disconnect(m_toolbar, SIGNAL(showAppOnTopSelected(bool)),
+                   m_clientProxy, SLOT(showAppOnTop(bool)));
 
-        disconnect(this, SIGNAL(livePreviewActivated(bool)),
-                   m_toolbar, SLOT(setLivePreviewChecked(bool)));
         disconnect(m_clientProxy, SIGNAL(colorPickerActivated()),
                    m_toolbar, SLOT(activateColorPicker()));
         disconnect(m_clientProxy, SIGNAL(selectToolActivated()),
@@ -815,6 +817,8 @@ void InspectorUi::setupToolbar(bool doConnect)
                    m_toolbar, SLOT(activateZoomTool()));
         disconnect(m_clientProxy, SIGNAL(designModeBehaviorChanged(bool)),
                    m_toolbar, SLOT(setDesignModeBehavior(bool)));
+        disconnect(m_clientProxy, SIGNAL(showAppOnTopChanged(bool)),
+                   m_toolbar, SLOT(setShowAppOnTop(bool)));
         disconnect(m_clientProxy, SIGNAL(selectedColorChanged(QColor)),
                    m_toolbar, SLOT(setSelectedColor(QColor)));
 
diff --git a/src/plugins/qmljsinspector/qmljsinspector.qrc b/src/plugins/qmljsinspector/qmljsinspector.qrc
index 9881cc04982..f1e4ceb212e 100644
--- a/src/plugins/qmljsinspector/qmljsinspector.qrc
+++ b/src/plugins/qmljsinspector/qmljsinspector.qrc
@@ -19,5 +19,6 @@
         <file>images/select-marquee-small.png</file>
         <file>images/color-picker-small-hicontrast.png</file>
         <file>images/observermode.png</file>
+        <file>images/app-on-top.png</file>
     </qresource>
 </RCC>
diff --git a/src/plugins/qmljsinspector/qmljsinspectorconstants.h b/src/plugins/qmljsinspector/qmljsinspectorconstants.h
index b5741b54744..ace17f09086 100644
--- a/src/plugins/qmljsinspector/qmljsinspectorconstants.h
+++ b/src/plugins/qmljsinspector/qmljsinspectorconstants.h
@@ -50,6 +50,7 @@ const char * const ZOOM_ACTION = "QmlInspector.Zoom";
 const char * const COLOR_PICKER_ACTION = "QmlInspector.ColorPicker";
 const char * const TO_QML_ACTION = "QmlInspector.ToQml";
 const char * const FROM_QML_ACTION = "QmlInspector.FromQml";
+const char * const SHOW_APP_ON_TOP_ACTION = "QmlInspector.ShowAppOnTop";
 
 // settings
 const char * const S_QML_INSPECTOR    = "QML.Inspector";
diff --git a/src/plugins/qmljsinspector/qmljsobserverclient.cpp b/src/plugins/qmljsinspector/qmljsobserverclient.cpp
index 2c63c719ce7..cb0a53a8f71 100644
--- a/src/plugins/qmljsinspector/qmljsobserverclient.cpp
+++ b/src/plugins/qmljsinspector/qmljsobserverclient.cpp
@@ -107,6 +107,10 @@ void QmlJSObserverClient::messageReceived(const QByteArray &message)
         bool inDesignMode;
         ds >> inDesignMode;
         emit designModeBehaviorChanged(inDesignMode);
+    } else if (type == "SHOW_APP_ON_TOP") {
+        bool showAppOnTop;
+        ds >> showAppOnTop;
+        emit showAppOnTopChanged(showAppOnTop);
     } else if (type == "RELOADED") {
         emit reloaded();
     } else if (type == "COLOR_CHANGED") {
@@ -337,6 +341,23 @@ void QmlJSObserverClient::changeToZoomTool()
     sendMessage(message);
 }
 
+void QmlJSObserverClient::showAppOnTop(bool showOnTop)
+{
+    if (!m_connection || !m_connection->isConnected())
+        return;
+
+    QByteArray message;
+    QDataStream ds(&message, QIODevice::WriteOnly);
+
+    ds << QByteArray("SHOW_APP_ON_TOP")
+       << showOnTop;
+
+    if (debug)
+        qDebug() << "QmlJSObserverClient: Sending" <<"SHOWONTOP" << showOnTop;
+
+    sendMessage(message);
+}
+
 void QmlJSObserverClient::createQmlObject(const QString &qmlText, int parentDebugId,
                                              const QStringList &imports, const QString &filename)
 {
diff --git a/src/plugins/qmljsinspector/qmljsobserverclient.h b/src/plugins/qmljsinspector/qmljsobserverclient.h
index 1e87bf94d3e..318ad8c50b9 100644
--- a/src/plugins/qmljsinspector/qmljsobserverclient.h
+++ b/src/plugins/qmljsinspector/qmljsobserverclient.h
@@ -62,6 +62,7 @@ public:
     void changeToSelectTool();
     void changeToSelectMarqueeTool();
     void changeToZoomTool();
+    void showAppOnTop(bool showOnTop);
 
     void createQmlObject(const QString &qmlText, int parentDebugId,
                          const QStringList &imports, const QString &filename);
@@ -90,6 +91,7 @@ signals:
     void zoomToolActivated();
     void animationSpeedChanged(qreal slowdownFactor);
     void designModeBehaviorChanged(bool inDesignMode);
+    void showAppOnTopChanged(bool showAppOnTop);
     void reloaded(); // the server has reloaded the document
     void contextPathUpdated(const QStringList &path);
 
-- 
GitLab