From fe1cf36e1f1dfcfc7231bef84cd5e167f9058748 Mon Sep 17 00:00:00 2001 From: Kai Koehne <kai.koehne@digia.com> Date: Fri, 1 Nov 2013 16:07:24 +0100 Subject: [PATCH] Remove support for debugging JS with Qt 4.7 Remove infrastructure to debug/inspect QML applications with Qt 4.7. Change-Id: I277e9884e009475a29017f502bbe1d069317460f Reviewed-by: hjk <hjk121@nokiamail.com> Reviewed-by: Eike Ziller <eike.ziller@digia.com> --- doc/src/debugger/creator-debugger.qdoc | 12 - doc/src/debugger/qtquick-debugging.qdoc | 7 +- doc/src/howto/qtcreator-faq.qdoc | 4 - .../editor/abstractliveedittool.cpp | 185 -- .../editor/abstractliveedittool.h | 104 -- .../editor/boundingrecthighlighter.cpp | 228 --- .../editor/boundingrecthighlighter.h | 103 -- .../qmljsdebugger/editor/colorpickertool.cpp | 118 -- .../qmljsdebugger/editor/colorpickertool.h | 81 - .../qmljsdebugger/editor/livelayeritem.cpp | 79 - .../qml/qmljsdebugger/editor/livelayeritem.h | 55 - .../liverubberbandselectionmanipulator.cpp | 152 -- .../liverubberbandselectionmanipulator.h | 85 - .../editor/liveselectionindicator.cpp | 105 -- .../editor/liveselectionindicator.h | 68 - .../editor/liveselectionrectangle.cpp | 100 - .../editor/liveselectionrectangle.h | 65 - .../editor/liveselectiontool.cpp | 424 ----- .../qmljsdebugger/editor/liveselectiontool.h | 109 -- .../editor/livesingleselectionmanipulator.cpp | 138 -- .../editor/livesingleselectionmanipulator.h | 77 - .../editor/subcomponentmasklayeritem.cpp | 116 -- .../editor/subcomponentmasklayeritem.h | 59 - .../qml/qmljsdebugger/editor/zoomtool.cpp | 323 ---- .../qml/qmljsdebugger/editor/zoomtool.h | 94 - .../qmljsdebugger/include/jsdebuggeragent.h | 107 -- .../include/qdeclarativeinspectorservice.h | 103 -- .../include/qdeclarativeviewinspector.h | 116 -- .../include/qdeclarativeviewobserver.h | 50 - .../include/qmlinspectorconstants.h | 68 - .../include/qmljsdebugger_global.h | 46 - .../qt_private/qdeclarativedebughelper_p.h | 56 - .../qt_private/qdeclarativedebugservice_p.h | 77 - .../include/qt_private/qdeclarativestate_p.h | 194 -- .../qml/qmljsdebugger/jsdebuggeragent.cpp | 672 ------- .../protocol/inspectorprotocol.h | 125 -- .../qml/qmljsdebugger/protocol/protocol.pri | 3 - .../qdeclarativeinspectorservice.cpp | 284 --- .../qdeclarativeviewinspector.cpp | 835 --------- .../qdeclarativeviewinspector_p.h | 129 -- .../qml/qmljsdebugger/qmljsdebugger-lib.pri | 14 - .../qml/qmljsdebugger/qmljsdebugger-src.pri | 45 - .../qml/qmljsdebugger/qmljsdebugger.pro | 18 - share/qtcreator/qml/qmlobserver/Info.plist.in | 77 - .../qml/qmlobserver/LGPL_EXCEPTION.TXT | 22 - share/qtcreator/qml/qmlobserver/LICENSE.LGPL | 504 ----- .../qml/qmlobserver/browser/Browser.qml | 306 --- .../qml/qmlobserver/browser/browser.qrc | 9 - .../qml/qmlobserver/browser/images/folder.png | Bin 1841 -> 0 bytes .../qmlobserver/browser/images/titlebar.png | Bin 1436 -> 0 bytes .../qmlobserver/browser/images/titlebar.sci | 5 - .../qml/qmlobserver/browser/images/up.png | Bin 662 -> 0 bytes .../qml/qmlobserver/deviceorientation.cpp | 68 - .../qml/qmlobserver/deviceorientation.h | 72 - .../qmlobserver/deviceorientation_symbian.cpp | 180 -- .../qml/qmlobserver/loggerwidget.cpp | 189 -- .../qtcreator/qml/qmlobserver/loggerwidget.h | 87 - share/qtcreator/qml/qmlobserver/main.cpp | 562 ------ .../qml/qmlobserver/proxysettings.cpp | 99 - .../qtcreator/qml/qmlobserver/proxysettings.h | 63 - .../qml/qmlobserver/proxysettings.ui | 115 -- .../qml/qmlobserver/proxysettings_maemo5.ui | 177 -- .../qml/qmlobserver/qdeclarativetester.cpp | 445 ----- .../qml/qmlobserver/qdeclarativetester.h | 280 --- share/qtcreator/qml/qmlobserver/qml.icns | Bin 196156 -> 0 bytes share/qtcreator/qml/qmlobserver/qml.pri | 37 - .../qtcreator/qml/qmlobserver/qmlobserver.pro | 73 - .../qtcreator/qml/qmlobserver/qmlruntime.cpp | 1633 ----------------- share/qtcreator/qml/qmlobserver/qmlruntime.h | 214 --- share/qtcreator/qml/qmlobserver/recopts.ui | 513 ------ .../qml/qmlobserver/recopts_maemo5.ui | 254 --- .../qml/qmlobserver/startup/Logo.qml | 167 -- .../qml/qmlobserver/startup/qt-back.png | Bin 3549 -> 0 bytes .../qml/qmlobserver/startup/qt-blue.jpg | Bin 20900 -> 0 bytes .../qml/qmlobserver/startup/qt-front.png | Bin 3318 -> 0 bytes .../qml/qmlobserver/startup/qt-sketch.jpg | Bin 17048 -> 0 bytes .../qml/qmlobserver/startup/qt-text.png | Bin 14565 -> 0 bytes .../qml/qmlobserver/startup/quick-blur.png | Bin 2826 -> 0 bytes .../qml/qmlobserver/startup/quick-regular.png | Bin 1399 -> 0 bytes .../qml/qmlobserver/startup/shadow.png | Bin 1592 -> 0 bytes .../qml/qmlobserver/startup/startup.qml | 161 -- .../qml/qmlobserver/startup/startup.qrc | 16 - .../qml/qmlobserver/startup/white-star.png | Bin 2651 -> 0 bytes .../qmlobserver/texteditautoresizer_maemo5.h | 101 - share/qtcreator/static.pro | 3 - .../projectexplorer/projectexplorer.cpp | 3 - .../qbsprojectmanager/qbsbuildstep.cpp | 8 - src/plugins/qbsprojectmanager/qbsbuildstep.h | 1 - src/plugins/qmakeprojectmanager/qmakestep.cpp | 30 +- src/plugins/qmakeprojectmanager/qmakestep.h | 3 - src/plugins/qmakeprojectmanager/qmakestep.ui | 33 +- src/plugins/qmlprofiler/qmlprofilerengine.cpp | 33 - src/plugins/qmlprofiler/qmlprofilerengine.h | 3 - .../qmlprojectmanager/qmlprojectplugin.cpp | 23 - .../qmlprojectmanager/qmlprojectplugin.h | 2 - .../qmlprojectrunconfiguration.cpp | 5 +- src/plugins/qtsupport/baseqtversion.cpp | 57 +- src/plugins/qtsupport/baseqtversion.h | 7 - src/plugins/qtsupport/debugginghelper.ui | 98 +- .../qtsupport/debugginghelperbuildtask.cpp | 50 +- .../qtsupport/debugginghelperbuildtask.h | 6 +- src/plugins/qtsupport/qmldebugginglibrary.cpp | 157 -- src/plugins/qtsupport/qmldebugginglibrary.h | 68 - src/plugins/qtsupport/qmlobservertool.cpp | 175 -- src/plugins/qtsupport/qmlobservertool.h | 56 - src/plugins/qtsupport/qtoptionspage.cpp | 101 +- src/plugins/qtsupport/qtoptionspage.h | 2 - src/plugins/qtsupport/qtsupport.pro | 4 - src/plugins/qtsupport/qtsupport.qbs | 4 - 109 files changed, 69 insertions(+), 13125 deletions(-) delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/editor/zoomtool.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qdeclarativeinspectorservice.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewinspector.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qmlinspectorconstants.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qmljsdebugger_global.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativestate_p.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/protocol/inspectorprotocol.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri delete mode 100644 share/qtcreator/qml/qmljsdebugger/qdeclarativeinspectorservice.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector.cpp delete mode 100644 share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector_p.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri delete mode 100644 share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri delete mode 100644 share/qtcreator/qml/qmljsdebugger/qmljsdebugger.pro delete mode 100644 share/qtcreator/qml/qmlobserver/Info.plist.in delete mode 100644 share/qtcreator/qml/qmlobserver/LGPL_EXCEPTION.TXT delete mode 100644 share/qtcreator/qml/qmlobserver/LICENSE.LGPL delete mode 100644 share/qtcreator/qml/qmlobserver/browser/Browser.qml delete mode 100644 share/qtcreator/qml/qmlobserver/browser/browser.qrc delete mode 100644 share/qtcreator/qml/qmlobserver/browser/images/folder.png delete mode 100644 share/qtcreator/qml/qmlobserver/browser/images/titlebar.png delete mode 100644 share/qtcreator/qml/qmlobserver/browser/images/titlebar.sci delete mode 100644 share/qtcreator/qml/qmlobserver/browser/images/up.png delete mode 100644 share/qtcreator/qml/qmlobserver/deviceorientation.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/deviceorientation.h delete mode 100644 share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/loggerwidget.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/loggerwidget.h delete mode 100644 share/qtcreator/qml/qmlobserver/main.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/proxysettings.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/proxysettings.h delete mode 100644 share/qtcreator/qml/qmlobserver/proxysettings.ui delete mode 100644 share/qtcreator/qml/qmlobserver/proxysettings_maemo5.ui delete mode 100644 share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/qdeclarativetester.h delete mode 100644 share/qtcreator/qml/qmlobserver/qml.icns delete mode 100644 share/qtcreator/qml/qmlobserver/qml.pri delete mode 100644 share/qtcreator/qml/qmlobserver/qmlobserver.pro delete mode 100644 share/qtcreator/qml/qmlobserver/qmlruntime.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/qmlruntime.h delete mode 100644 share/qtcreator/qml/qmlobserver/recopts.ui delete mode 100644 share/qtcreator/qml/qmlobserver/recopts_maemo5.ui delete mode 100644 share/qtcreator/qml/qmlobserver/startup/Logo.qml delete mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-back.png delete mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-blue.jpg delete mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-front.png delete mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-sketch.jpg delete mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-text.png delete mode 100644 share/qtcreator/qml/qmlobserver/startup/quick-blur.png delete mode 100644 share/qtcreator/qml/qmlobserver/startup/quick-regular.png delete mode 100644 share/qtcreator/qml/qmlobserver/startup/shadow.png delete mode 100644 share/qtcreator/qml/qmlobserver/startup/startup.qml delete mode 100644 share/qtcreator/qml/qmlobserver/startup/startup.qrc delete mode 100644 share/qtcreator/qml/qmlobserver/startup/white-star.png delete mode 100644 share/qtcreator/qml/qmlobserver/texteditautoresizer_maemo5.h delete mode 100644 src/plugins/qtsupport/qmldebugginglibrary.cpp delete mode 100644 src/plugins/qtsupport/qmldebugginglibrary.h delete mode 100644 src/plugins/qtsupport/qmlobservertool.cpp delete mode 100644 src/plugins/qtsupport/qmlobservertool.h diff --git a/doc/src/debugger/creator-debugger.qdoc b/doc/src/debugger/creator-debugger.qdoc index 1670720ea05..c1db72f4c74 100644 --- a/doc/src/debugger/creator-debugger.qdoc +++ b/doc/src/debugger/creator-debugger.qdoc @@ -1183,18 +1183,6 @@ d.putSubItem("value", value) \endcode - - \section1 Debugging Helpers for QML - - The debugging helpers for QML provide you with code completion for custom modules - (\c qmldump) and debugging Qt Quick UI projects (\c qmlobserver). - - You have to build the QML Inspector once for each Qt version that you want - to debug - with. Select \gui{Tools > Options > Build & Run > Qt Versions}. - - \note QML Inspector requires Qt 4.7.1 or later. - \section1 Enabling Debugging Helpers for Qt's Bootstrapped Applications Qt's bootstrapped applications (such as moc and qmake) are built in a way diff --git a/doc/src/debugger/qtquick-debugging.qdoc b/doc/src/debugger/qtquick-debugging.qdoc index d1fcba00288..cc60d4974f0 100644 --- a/doc/src/debugger/qtquick-debugging.qdoc +++ b/doc/src/debugger/qtquick-debugging.qdoc @@ -30,12 +30,7 @@ \title Debugging Qt Quick Projects - \note You need Qt 4.7.1 or later to debug Qt Quick projects. Debugging - projects not created with the Qt Quick wizards is only supported with - Qt 4.8, or later. - - To debug Qt Quick applications running on devices, you must install - Qt 4.7.4, or later, libraries on devices. + \note You need Qt 4.8 or later to debug Qt Quick projects. For an example of how to debug Qt Quick Projects, see \l{Debugging a Qt Quick Example Application}. diff --git a/doc/src/howto/qtcreator-faq.qdoc b/doc/src/howto/qtcreator-faq.qdoc index 965650ad66e..522ada136b7 100644 --- a/doc/src/howto/qtcreator-faq.qdoc +++ b/doc/src/howto/qtcreator-faq.qdoc @@ -50,12 +50,8 @@ \li qtc-debugging-helper - \li qtc-qmldbg - \li qtc-qmldump - \li qtc-qmlobserver - \endlist The location depends on the platform. On Linux and other Unix platforms, the files diff --git a/share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.cpp deleted file mode 100644 index 20fbddd1c07..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "abstractliveedittool.h" -#include "qdeclarativeviewinspector.h" -#include "../qdeclarativeviewinspector_p.h" - -#include <QDeclarativeEngine> - -#include <QDebug> -#include <QGraphicsItem> -#include <QDeclarativeItem> - -namespace QmlJSDebugger { - -AbstractLiveEditTool::AbstractLiveEditTool(QDeclarativeViewInspector *editorView) - : QObject(editorView), m_inspector(editorView) -{ -} - - -AbstractLiveEditTool::~AbstractLiveEditTool() -{ -} - -QDeclarativeViewInspector *AbstractLiveEditTool::inspector() const -{ - return m_inspector; -} - -QDeclarativeView *AbstractLiveEditTool::view() const -{ - return m_inspector->declarativeView(); -} - -QGraphicsScene* AbstractLiveEditTool::scene() const -{ - return view()->scene(); -} - -void AbstractLiveEditTool::updateSelectedItems() -{ - selectedItemsChanged(items()); -} - -QList<QGraphicsItem*> AbstractLiveEditTool::items() const -{ - return inspector()->selectedItems(); -} - -bool AbstractLiveEditTool::topItemIsMovable(const QList<QGraphicsItem*> & itemList) -{ - QGraphicsItem *firstSelectableItem = topMovableGraphicsItem(itemList); - if (firstSelectableItem == 0) - return false; - if (toQDeclarativeItem(firstSelectableItem) != 0) - return true; - - return false; - -} - -bool AbstractLiveEditTool::topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList) -{ - QList<QGraphicsItem*> selectedItems = inspector()->selectedItems(); - - foreach (QGraphicsItem *item, itemList) { - QDeclarativeItem *declarativeItem = toQDeclarativeItem(item); - if (declarativeItem - && selectedItems.contains(declarativeItem) - /*&& (declarativeItem->qmlItemNode().hasShowContent() || selectNonContentItems)*/) - return true; - } - - return false; - -} - -bool AbstractLiveEditTool::topItemIsResizeHandle(const QList<QGraphicsItem*> &/*itemList*/) -{ - return false; -} - -QDeclarativeItem *AbstractLiveEditTool::toQDeclarativeItem(QGraphicsItem *item) -{ - return qobject_cast<QDeclarativeItem*>(item->toGraphicsObject()); -} - -QGraphicsItem *AbstractLiveEditTool::topMovableGraphicsItem(const QList<QGraphicsItem*> &itemList) -{ - foreach (QGraphicsItem *item, itemList) { - if (item->flags().testFlag(QGraphicsItem::ItemIsMovable)) - return item; - } - return 0; -} - -QDeclarativeItem *AbstractLiveEditTool::topMovableDeclarativeItem(const QList<QGraphicsItem*> - &itemList) -{ - foreach (QGraphicsItem *item, itemList) { - QDeclarativeItem *declarativeItem = toQDeclarativeItem(item); - if (declarativeItem /*&& (declarativeItem->qmlItemNode().hasShowContent())*/) - return declarativeItem; - } - - return 0; -} - -QList<QGraphicsObject*> AbstractLiveEditTool::toGraphicsObjectList(const QList<QGraphicsItem*> - &itemList) -{ - QList<QGraphicsObject*> gfxObjects; - foreach (QGraphicsItem *item, itemList) { - QGraphicsObject *obj = item->toGraphicsObject(); - if (obj) - gfxObjects << obj; - } - - return gfxObjects; -} - -QString AbstractLiveEditTool::titleForItem(QGraphicsItem *item) -{ - QString className("QGraphicsItem"); - QString objectStringId; - - QString constructedName; - - QGraphicsObject *gfxObject = item->toGraphicsObject(); - if (gfxObject) { - className = gfxObject->metaObject()->className(); - - className.remove(QRegExp("_QMLTYPE_\\d+")); - className.remove(QRegExp("_QML_\\d+")); - if (className.startsWith(QLatin1String("QDeclarative"))) - className = className.remove(QLatin1String("QDeclarative")); - - QDeclarativeItem *declarativeItem = qobject_cast<QDeclarativeItem*>(gfxObject); - if (declarativeItem) { - objectStringId = QDeclarativeViewInspector::idStringForObject(declarativeItem); - } - - if (!objectStringId.isEmpty()) { - constructedName = objectStringId + " (" + className + QLatin1Char(')'); - } else { - if (!gfxObject->objectName().isEmpty()) { - constructedName = gfxObject->objectName() + " (" + className + QLatin1Char(')'); - } else { - constructedName = className; - } - } - } - - return constructedName; -} - - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.h b/share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.h deleted file mode 100644 index 29a3f8d5b2f..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/abstractliveedittool.h +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef ABSTRACTLIVEEDITTOOL_H -#define ABSTRACTLIVEEDITTOOL_H - -#include <QList> -#include <QObject> - -QT_BEGIN_NAMESPACE -class QMouseEvent; -class QGraphicsItem; -class QDeclarativeItem; -class QKeyEvent; -class QGraphicsScene; -class QGraphicsObject; -class QWheelEvent; -class QDeclarativeView; -QT_END_NAMESPACE - -namespace QmlJSDebugger { - -class QDeclarativeViewInspector; - -class FormEditorView; - -class AbstractLiveEditTool : public QObject -{ - Q_OBJECT -public: - AbstractLiveEditTool(QDeclarativeViewInspector *inspector); - - virtual ~AbstractLiveEditTool(); - - virtual void mousePressEvent(QMouseEvent *event) = 0; - virtual void mouseMoveEvent(QMouseEvent *event) = 0; - virtual void mouseReleaseEvent(QMouseEvent *event) = 0; - virtual void mouseDoubleClickEvent(QMouseEvent *event) = 0; - - virtual void hoverMoveEvent(QMouseEvent *event) = 0; - virtual void wheelEvent(QWheelEvent *event) = 0; - - virtual void keyPressEvent(QKeyEvent *event) = 0; - virtual void keyReleaseEvent(QKeyEvent *keyEvent) = 0; - virtual void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList) = 0; - - virtual void clear() = 0; - - void updateSelectedItems(); - QList<QGraphicsItem*> items() const; - - void enterContext(QGraphicsItem *itemToEnter); - - bool topItemIsMovable(const QList<QGraphicsItem*> &itemList); - bool topItemIsResizeHandle(const QList<QGraphicsItem*> &itemList); - bool topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList); - - static QString titleForItem(QGraphicsItem *item); - static QList<QGraphicsObject*> toGraphicsObjectList(const QList<QGraphicsItem*> &itemList); - static QGraphicsItem* topMovableGraphicsItem(const QList<QGraphicsItem*> &itemList); - static QDeclarativeItem* topMovableDeclarativeItem(const QList<QGraphicsItem*> &itemList); - static QDeclarativeItem *toQDeclarativeItem(QGraphicsItem *item); - -protected: - virtual void selectedItemsChanged(const QList<QGraphicsItem*> &objectList) = 0; - - QDeclarativeViewInspector *inspector() const; - QDeclarativeView *view() const; - QGraphicsScene *scene() const; - -private: - QDeclarativeViewInspector *m_inspector; - QList<QGraphicsItem*> m_itemList; -}; - -} - -#endif // ABSTRACTLIVEEDITTOOL_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.cpp b/share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.cpp deleted file mode 100644 index 5ce6c141c07..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "boundingrecthighlighter.h" -#include "qdeclarativeviewinspector.h" -#include "qmlinspectorconstants.h" - -#include <QGraphicsPolygonItem> - -#include <QTimer> -#include <QObject> -#include <QDebug> - -namespace QmlJSDebugger { - -BoundingBox::BoundingBox(QGraphicsObject *itemToHighlight, QGraphicsItem *parentItem, - QObject *parent) - : QObject(parent), - highlightedObject(itemToHighlight), - highlightPolygon(0), - highlightPolygonEdge(0) -{ - highlightPolygon = new BoundingBoxPolygonItem(parentItem); - highlightPolygonEdge = new BoundingBoxPolygonItem(parentItem); - - highlightPolygon->setPen(QPen(QColor(0, 22, 159))); - highlightPolygonEdge->setPen(QPen(QColor(158, 199, 255))); - - highlightPolygon->setFlag(QGraphicsItem::ItemIsSelectable, false); - highlightPolygonEdge->setFlag(QGraphicsItem::ItemIsSelectable, false); -} - -BoundingBox::~BoundingBox() -{ - highlightedObject.clear(); -} - -BoundingBoxPolygonItem::BoundingBoxPolygonItem(QGraphicsItem *item) : QGraphicsPolygonItem(item) -{ - QPen pen; - pen.setColor(QColor(108, 141, 221)); - pen.setWidth(1); - setPen(pen); -} - -int BoundingBoxPolygonItem::type() const -{ - return Constants::EditorItemType; -} - -BoundingRectHighlighter::BoundingRectHighlighter(QDeclarativeViewInspector *view) : - LiveLayerItem(view->declarativeView()->scene()), - m_view(view) -{ -} - -BoundingRectHighlighter::~BoundingRectHighlighter() -{ - -} - -void BoundingRectHighlighter::clear() -{ - foreach (BoundingBox *box, m_boxes) - freeBoundingBox(box); -} - -BoundingBox *BoundingRectHighlighter::boxFor(QGraphicsObject *item) const -{ - foreach (BoundingBox *box, m_boxes) { - if (box->highlightedObject.data() == item) - return box; - } - return 0; -} - -void BoundingRectHighlighter::highlight(QList<QGraphicsObject*> items) -{ - if (items.isEmpty()) - return; - - QList<BoundingBox *> newBoxes; - foreach (QGraphicsObject *itemToHighlight, items) { - BoundingBox *box = boxFor(itemToHighlight); - if (!box) - box = createBoundingBox(itemToHighlight); - - newBoxes << box; - } - qSort(newBoxes); - - if (newBoxes != m_boxes) { - clear(); - m_boxes << newBoxes; - } - - highlightAll(); -} - -void BoundingRectHighlighter::highlight(QGraphicsObject* itemToHighlight) -{ - if (!itemToHighlight) - return; - - BoundingBox *box = boxFor(itemToHighlight); - if (!box) { - box = createBoundingBox(itemToHighlight); - m_boxes << box; - qSort(m_boxes); - } - - highlightAll(); -} - -BoundingBox *BoundingRectHighlighter::createBoundingBox(QGraphicsObject *itemToHighlight) -{ - if (!m_freeBoxes.isEmpty()) { - BoundingBox *box = m_freeBoxes.last(); - if (box->highlightedObject.isNull()) { - box->highlightedObject = itemToHighlight; - box->highlightPolygon->show(); - box->highlightPolygonEdge->show(); - m_freeBoxes.removeLast(); - return box; - } - } - - BoundingBox *box = new BoundingBox(itemToHighlight, this, this); - - connect(itemToHighlight, SIGNAL(xChanged()), this, SLOT(refresh())); - connect(itemToHighlight, SIGNAL(yChanged()), this, SLOT(refresh())); - connect(itemToHighlight, SIGNAL(widthChanged()), this, SLOT(refresh())); - connect(itemToHighlight, SIGNAL(heightChanged()), this, SLOT(refresh())); - connect(itemToHighlight, SIGNAL(rotationChanged()), this, SLOT(refresh())); - connect(itemToHighlight, SIGNAL(destroyed(QObject*)), this, SLOT(itemDestroyed(QObject*))); - - return box; -} - -void BoundingRectHighlighter::removeBoundingBox(BoundingBox *box) -{ - delete box; - box = 0; -} - -void BoundingRectHighlighter::freeBoundingBox(BoundingBox *box) -{ - if (!box->highlightedObject.isNull()) { - disconnect(box->highlightedObject.data(), SIGNAL(xChanged()), this, SLOT(refresh())); - disconnect(box->highlightedObject.data(), SIGNAL(yChanged()), this, SLOT(refresh())); - disconnect(box->highlightedObject.data(), SIGNAL(widthChanged()), this, SLOT(refresh())); - disconnect(box->highlightedObject.data(), SIGNAL(heightChanged()), this, SLOT(refresh())); - disconnect(box->highlightedObject.data(), SIGNAL(rotationChanged()), this, SLOT(refresh())); - } - - box->highlightedObject.clear(); - box->highlightPolygon->hide(); - box->highlightPolygonEdge->hide(); - m_boxes.removeOne(box); - m_freeBoxes << box; -} - -void BoundingRectHighlighter::itemDestroyed(QObject *obj) -{ - foreach (BoundingBox *box, m_boxes) { - if (box->highlightedObject.data() == obj) { - freeBoundingBox(box); - break; - } - } -} - -void BoundingRectHighlighter::highlightAll() -{ - foreach (BoundingBox *box, m_boxes) { - Q_ASSERT(box); - if (box->highlightedObject.isNull()) { - // clear all highlights - clear(); - return; - } - QGraphicsObject *item = box->highlightedObject.data(); - - QRectF boundingRectInSceneSpace(item->mapToScene(item->boundingRect()).boundingRect()); - QRectF boundingRectInLayerItemSpace = mapRectFromScene(boundingRectInSceneSpace); - QRectF bboxRect = m_view->adjustToScreenBoundaries(boundingRectInLayerItemSpace); - QRectF edgeRect = bboxRect; - edgeRect.adjust(-1, -1, 1, 1); - - box->highlightPolygon->setPolygon(QPolygonF(bboxRect)); - box->highlightPolygonEdge->setPolygon(QPolygonF(edgeRect)); - } -} - -void BoundingRectHighlighter::refresh() -{ - if (!m_boxes.isEmpty()) - highlightAll(); -} - - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.h b/share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.h deleted file mode 100644 index d5919a3d311..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/boundingrecthighlighter.h +++ /dev/null @@ -1,103 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef BOUNDINGRECTHIGHLIGHTER_H -#define BOUNDINGRECTHIGHLIGHTER_H - -#include "livelayeritem.h" - -#include <QObject> -#include <QWeakPointer> - -QT_FORWARD_DECLARE_CLASS(QGraphicsItem) -QT_FORWARD_DECLARE_CLASS(QPainter) -QT_FORWARD_DECLARE_CLASS(QWidget) -QT_FORWARD_DECLARE_CLASS(QStyleOptionGraphicsItem) -QT_FORWARD_DECLARE_CLASS(QTimer) - -namespace QmlJSDebugger { - -class QDeclarativeViewInspector; -class BoundingBox; - -class BoundingRectHighlighter : public LiveLayerItem -{ - Q_OBJECT -public: - explicit BoundingRectHighlighter(QDeclarativeViewInspector *view); - ~BoundingRectHighlighter(); - void clear(); - void highlight(QList<QGraphicsObject*> items); - void highlight(QGraphicsObject* item); - -private slots: - void refresh(); - void itemDestroyed(QObject *); - -private: - BoundingBox *boxFor(QGraphicsObject *item) const; - void highlightAll(); - BoundingBox *createBoundingBox(QGraphicsObject *itemToHighlight); - void removeBoundingBox(BoundingBox *box); - void freeBoundingBox(BoundingBox *box); - -private: - Q_DISABLE_COPY(BoundingRectHighlighter) - - QDeclarativeViewInspector *m_view; - QList<BoundingBox* > m_boxes; - QList<BoundingBox* > m_freeBoxes; -}; - -class BoundingBox : public QObject -{ - Q_OBJECT -public: - explicit BoundingBox(QGraphicsObject *itemToHighlight, QGraphicsItem *parentItem, - QObject *parent = 0); - ~BoundingBox(); - QWeakPointer<QGraphicsObject> highlightedObject; - QGraphicsPolygonItem *highlightPolygon; - QGraphicsPolygonItem *highlightPolygonEdge; - -private: - Q_DISABLE_COPY(BoundingBox) - -}; - -class BoundingBoxPolygonItem : public QGraphicsPolygonItem -{ -public: - explicit BoundingBoxPolygonItem(QGraphicsItem *item); - int type() const; -}; - -} // namespace QmlJSDebugger - -#endif // BOUNDINGRECTHIGHLIGHTER_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.cpp deleted file mode 100644 index 6ef379c510c..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "colorpickertool.h" -#include "qdeclarativeviewinspector.h" - -#include <QMouseEvent> -#include <QKeyEvent> -#include <QRectF> -#include <QRgb> -#include <QImage> -#include <QApplication> -#include <QPalette> - -namespace QmlJSDebugger { - -ColorPickerTool::ColorPickerTool(QDeclarativeViewInspector *view) : - AbstractLiveEditTool(view) -{ - m_selectedColor.setRgb(0,0,0); -} - -ColorPickerTool::~ColorPickerTool() -{ - -} - -void ColorPickerTool::mousePressEvent(QMouseEvent * /*event*/) -{ -} - -void ColorPickerTool::mouseMoveEvent(QMouseEvent *event) -{ - pickColor(event->pos()); -} - -void ColorPickerTool::mouseReleaseEvent(QMouseEvent *event) -{ - pickColor(event->pos()); -} - -void ColorPickerTool::mouseDoubleClickEvent(QMouseEvent * /*event*/) -{ -} - - -void ColorPickerTool::hoverMoveEvent(QMouseEvent * /*event*/) -{ -} - -void ColorPickerTool::keyPressEvent(QKeyEvent * /*event*/) -{ -} - -void ColorPickerTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/) -{ -} -void ColorPickerTool::wheelEvent(QWheelEvent * /*event*/) -{ -} - -void ColorPickerTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/) -{ -} - -void ColorPickerTool::clear() -{ - view()->setCursor(Qt::CrossCursor); -} - -void ColorPickerTool::selectedItemsChanged(const QList<QGraphicsItem*> &/*itemList*/) -{ -} - -void ColorPickerTool::pickColor(const QPoint &pos) -{ - QRgb fillColor = view()->backgroundBrush().color().rgb(); - if (view()->backgroundBrush().style() == Qt::NoBrush) - fillColor = view()->palette().color(QPalette::Base).rgb(); - - QRectF target(0,0, 1, 1); - QRect source(pos.x(), pos.y(), 1, 1); - QImage img(1, 1, QImage::Format_ARGB32); - img.fill(fillColor); - QPainter painter(&img); - view()->render(&painter, target, source); - m_selectedColor = QColor::fromRgb(img.pixel(0, 0)); - - emit selectedColorChanged(m_selectedColor); -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.h b/share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.h deleted file mode 100644 index bfedc70e660..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/colorpickertool.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef COLORPICKERTOOL_H -#define COLORPICKERTOOL_H - -#include "abstractliveedittool.h" - -#include <QColor> - -QT_FORWARD_DECLARE_CLASS(QPoint) - -namespace QmlJSDebugger { - -class ColorPickerTool : public AbstractLiveEditTool -{ - Q_OBJECT -public: - explicit ColorPickerTool(QDeclarativeViewInspector *view); - - virtual ~ColorPickerTool(); - - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - - void hoverMoveEvent(QMouseEvent *event); - - void keyPressEvent(QKeyEvent *event); - void keyReleaseEvent(QKeyEvent *keyEvent); - - void wheelEvent(QWheelEvent *event); - - void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList); - - void clear(); - -signals: - void selectedColorChanged(const QColor &color); - -protected: - - void selectedItemsChanged(const QList<QGraphicsItem*> &itemList); - -private: - void pickColor(const QPoint &pos); - -private: - QColor m_selectedColor; -}; - -} // namespace QmlJSDebugger - -#endif // COLORPICKERTOOL_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.cpp b/share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.cpp deleted file mode 100644 index 60505afb873..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "livelayeritem.h" -#include "qmlinspectorconstants.h" - -#include <QGraphicsScene> - -namespace QmlJSDebugger { - -LiveLayerItem::LiveLayerItem(QGraphicsScene* scene) - : QGraphicsObject() -{ - scene->addItem(this); - setZValue(1); - setFlag(QGraphicsItem::ItemIsMovable, false); -} - -LiveLayerItem::~LiveLayerItem() -{ -} - -void LiveLayerItem::paint(QPainter * /*painter*/, const QStyleOptionGraphicsItem * /*option*/, - QWidget * /*widget*/) -{ -} - -int LiveLayerItem::type() const -{ - return Constants::EditorItemType; -} - -QRectF LiveLayerItem::boundingRect() const -{ - return childrenBoundingRect(); -} - -QList<QGraphicsItem*> LiveLayerItem::findAllChildItems() const -{ - return findAllChildItems(this); -} - -QList<QGraphicsItem*> LiveLayerItem::findAllChildItems(const QGraphicsItem *item) const -{ - QList<QGraphicsItem*> itemList(item->childItems()); - - foreach (QGraphicsItem *childItem, item->childItems()) - itemList += findAllChildItems(childItem); - - return itemList; -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.h b/share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.h deleted file mode 100644 index 6fe82b3dbc3..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/livelayeritem.h +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef LIVELAYERITEM_H -#define LIVELAYERITEM_H - -#include <QGraphicsObject> - -namespace QmlJSDebugger { - -class LiveLayerItem : public QGraphicsObject -{ -public: - LiveLayerItem(QGraphicsScene *scene); - ~LiveLayerItem(); - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, - QWidget *widget = 0); - QRectF boundingRect() const; - int type() const; - - QList<QGraphicsItem*> findAllChildItems() const; - -protected: - QList<QGraphicsItem*> findAllChildItems(const QGraphicsItem *item) const; -}; - -} - -#endif // LIVELAYERITEM_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.cpp deleted file mode 100644 index 9d96f0472c2..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "liverubberbandselectionmanipulator.h" -#include "../qdeclarativeviewinspector_p.h" - -#include <QGraphicsItem> - -#include <QDebug> - -namespace QmlJSDebugger { - -LiveRubberBandSelectionManipulator::LiveRubberBandSelectionManipulator(QGraphicsObject *layerItem, - QDeclarativeViewInspector *editorView) - : m_selectionRectangleElement(layerItem), - m_editorView(editorView), - m_beginFormEditorItem(0), - m_isActive(false) -{ - m_selectionRectangleElement.hide(); -} - -void LiveRubberBandSelectionManipulator::clear() -{ - m_selectionRectangleElement.clear(); - m_isActive = false; - m_beginPoint = QPointF(); - m_itemList.clear(); - m_oldSelectionList.clear(); -} - -QGraphicsItem *LiveRubberBandSelectionManipulator::topFormEditorItem(const QList<QGraphicsItem*> - &itemList) -{ - if (itemList.isEmpty()) - return 0; - - return itemList.first(); -} - -void LiveRubberBandSelectionManipulator::begin(const QPointF &beginPoint) -{ - m_beginPoint = beginPoint; - m_selectionRectangleElement.setRect(m_beginPoint, m_beginPoint); - m_selectionRectangleElement.show(); - m_isActive = true; - QDeclarativeViewInspectorPrivate *inspectorPrivate - = QDeclarativeViewInspectorPrivate::get(m_editorView); - m_beginFormEditorItem = topFormEditorItem(inspectorPrivate->selectableItems(beginPoint)); - m_oldSelectionList = m_editorView->selectedItems(); -} - -void LiveRubberBandSelectionManipulator::update(const QPointF &updatePoint) -{ - m_selectionRectangleElement.setRect(m_beginPoint, updatePoint); -} - -void LiveRubberBandSelectionManipulator::end() -{ - m_oldSelectionList.clear(); - m_selectionRectangleElement.hide(); - m_isActive = false; -} - -void LiveRubberBandSelectionManipulator::select(SelectionType selectionType) -{ - QDeclarativeViewInspectorPrivate *inspectorPrivate - = QDeclarativeViewInspectorPrivate::get(m_editorView); - QList<QGraphicsItem*> itemList - = inspectorPrivate->selectableItems(m_selectionRectangleElement.rect(), - Qt::IntersectsItemShape); - QList<QGraphicsItem*> newSelectionList; - - foreach (QGraphicsItem* item, itemList) { - if (item - && item->parentItem() - && !newSelectionList.contains(item) - //&& m_beginFormEditorItem->childItems().contains(item) // TODO activate this test - ) - { - newSelectionList.append(item); - } - } - - if (newSelectionList.isEmpty() && m_beginFormEditorItem) - newSelectionList.append(m_beginFormEditorItem); - - QList<QGraphicsItem*> resultList; - - switch(selectionType) { - case AddToSelection: { - resultList.append(m_oldSelectionList); - resultList.append(newSelectionList); - } - break; - case ReplaceSelection: { - resultList.append(newSelectionList); - } - break; - case RemoveFromSelection: { - QSet<QGraphicsItem*> oldSelectionSet(m_oldSelectionList.toSet()); - QSet<QGraphicsItem*> newSelectionSet(newSelectionList.toSet()); - resultList.append(oldSelectionSet.subtract(newSelectionSet).toList()); - } - } - - m_editorView->setSelectedItems(resultList); -} - - -void LiveRubberBandSelectionManipulator::setItems(const QList<QGraphicsItem*> &itemList) -{ - m_itemList = itemList; -} - -QPointF LiveRubberBandSelectionManipulator::beginPoint() const -{ - return m_beginPoint; -} - -bool LiveRubberBandSelectionManipulator::isActive() const -{ - return m_isActive; -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.h b/share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.h deleted file mode 100644 index 8b2cee12895..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liverubberbandselectionmanipulator.h +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef RUBBERBANDSELECTIONMANIPULATOR_H -#define RUBBERBANDSELECTIONMANIPULATOR_H - - -#include "liveselectionrectangle.h" - -#include <QPointF> - -QT_FORWARD_DECLARE_CLASS(QGraphicsItem) - -namespace QmlJSDebugger { - -class QDeclarativeViewInspector; - -class LiveRubberBandSelectionManipulator -{ -public: - enum SelectionType { - ReplaceSelection, - AddToSelection, - RemoveFromSelection - }; - - LiveRubberBandSelectionManipulator(QGraphicsObject *layerItem, - QDeclarativeViewInspector *editorView); - - void setItems(const QList<QGraphicsItem*> &itemList); - - void begin(const QPointF& beginPoint); - void update(const QPointF& updatePoint); - void end(); - - void clear(); - - void select(SelectionType selectionType); - - QPointF beginPoint() const; - - bool isActive() const; - -protected: - QGraphicsItem *topFormEditorItem(const QList<QGraphicsItem*> &itemList); - -private: - QList<QGraphicsItem*> m_itemList; - QList<QGraphicsItem*> m_oldSelectionList; - LiveSelectionRectangle m_selectionRectangleElement; - QPointF m_beginPoint; - QDeclarativeViewInspector *m_editorView; - QGraphicsItem *m_beginFormEditorItem; - bool m_isActive; -}; - -} - -#endif // RUBBERBANDSELECTIONMANIPULATOR_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.cpp deleted file mode 100644 index 67d35b11ec9..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "liveselectionindicator.h" -#include "../qdeclarativeviewinspector_p.h" -#include "qmlinspectorconstants.h" - -#include <QGraphicsRectItem> -#include <QGraphicsObject> -#include <QGraphicsScene> -#include <QPen> - -namespace QmlJSDebugger { - -LiveSelectionIndicator::LiveSelectionIndicator(QDeclarativeViewInspector *viewInspector, - QGraphicsObject *layerItem) - : m_layerItem(layerItem) - , m_view(viewInspector) -{ -} - -LiveSelectionIndicator::~LiveSelectionIndicator() -{ - clear(); -} - -void LiveSelectionIndicator::show() -{ - foreach (QGraphicsRectItem *item, m_indicatorShapeHash) - item->show(); -} - -void LiveSelectionIndicator::hide() -{ - foreach (QGraphicsRectItem *item, m_indicatorShapeHash) - item->hide(); -} - -void LiveSelectionIndicator::clear() -{ - if (!m_layerItem.isNull()) { - QGraphicsScene *scene = m_layerItem.data()->scene(); - foreach (QGraphicsRectItem *item, m_indicatorShapeHash) { - scene->removeItem(item); - delete item; - } - } - - m_indicatorShapeHash.clear(); - -} - -void LiveSelectionIndicator::setItems(const QList<QWeakPointer<QGraphicsObject> > &itemList) -{ - clear(); - - foreach (const QWeakPointer<QGraphicsObject> &object, itemList) { - if (object.isNull()) - continue; - - QGraphicsItem *item = object.data(); - - if (!m_indicatorShapeHash.contains(item)) { - QGraphicsRectItem *selectionIndicator = new QGraphicsRectItem(m_layerItem.data()); - m_indicatorShapeHash.insert(item, selectionIndicator); - - const QRectF boundingRect = m_view->adjustToScreenBoundaries(item->mapRectToScene(item->boundingRect())); - const QRectF boundingRectInLayerItemSpace = m_layerItem.data()->mapRectFromScene(boundingRect); - - selectionIndicator->setData(Constants::EditorItemDataKey, true); - selectionIndicator->setFlag(QGraphicsItem::ItemIsSelectable, false); - selectionIndicator->setRect(boundingRectInLayerItemSpace); - selectionIndicator->setPen(QColor(108, 141, 221)); - } - } -} - -} //namespace QmlJSDebugger - diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.h b/share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.h deleted file mode 100644 index c3fc2b1d713..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionindicator.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef LIVESELECTIONINDICATOR_H -#define LIVESELECTIONINDICATOR_H - -#include <QWeakPointer> -#include <QHash> - -QT_BEGIN_NAMESPACE -class QGraphicsObject; -class QGraphicsRectItem; -class QGraphicsItem; -class QPolygonF; -QT_END_NAMESPACE - -namespace QmlJSDebugger { - -class QDeclarativeViewInspector; - -class LiveSelectionIndicator -{ -public: - LiveSelectionIndicator(QDeclarativeViewInspector *viewInspector, QGraphicsObject *layerItem); - ~LiveSelectionIndicator(); - - void show(); - void hide(); - - void clear(); - - void setItems(const QList<QWeakPointer<QGraphicsObject> > &itemList); - -private: - QHash<QGraphicsItem*, QGraphicsRectItem *> m_indicatorShapeHash; - QWeakPointer<QGraphicsObject> m_layerItem; - QDeclarativeViewInspector *m_view; -}; - -} - -#endif // LIVESELECTIONINDICATOR_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.cpp b/share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.cpp deleted file mode 100644 index 301f43a42de..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "liveselectionrectangle.h" -#include "qmlinspectorconstants.h" - -#include <QPen> -#include <QGraphicsRectItem> -#include <QGraphicsObject> -#include <QGraphicsScene> - -#include <QDebug> - -#include <cmath> - -namespace QmlJSDebugger { - -class SelectionRectShape : public QGraphicsRectItem -{ -public: - SelectionRectShape(QGraphicsItem *parent = 0) : QGraphicsRectItem(parent) {} - int type() const { return Constants::EditorItemType; } -}; - -LiveSelectionRectangle::LiveSelectionRectangle(QGraphicsObject *layerItem) - : m_controlShape(new SelectionRectShape(layerItem)), - m_layerItem(layerItem) -{ - m_controlShape->setPen(QPen(Qt::black)); - m_controlShape->setBrush(QColor(128, 128, 128, 50)); -} - -LiveSelectionRectangle::~LiveSelectionRectangle() -{ - if (m_layerItem) - m_layerItem.data()->scene()->removeItem(m_controlShape); -} - -void LiveSelectionRectangle::clear() -{ - hide(); -} -void LiveSelectionRectangle::show() -{ - m_controlShape->show(); -} - -void LiveSelectionRectangle::hide() -{ - m_controlShape->hide(); -} - -QRectF LiveSelectionRectangle::rect() const -{ - return m_controlShape->mapFromScene(m_controlShape->rect()).boundingRect(); -} - -void LiveSelectionRectangle::setRect(const QPointF &firstPoint, - const QPointF &secondPoint) -{ - double firstX = std::floor(firstPoint.x()) + 0.5; - double firstY = std::floor(firstPoint.y()) + 0.5; - double secondX = std::floor(secondPoint.x()) + 0.5; - double secondY = std::floor(secondPoint.y()) + 0.5; - QPointF topLeftPoint(firstX < secondX ? firstX : secondX, - firstY < secondY ? firstY : secondY); - QPointF bottomRightPoint(firstX > secondX ? firstX : secondX, - firstY > secondY ? firstY : secondY); - - QRectF rect(topLeftPoint, bottomRightPoint); - m_controlShape->setRect(rect); -} - -} diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.h b/share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.h deleted file mode 100644 index 76fdbb81b32..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liveselectionrectangle.h +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef LIVESELECTIONRECTANGLE_H -#define LIVESELECTIONRECTANGLE_H - -#include <QWeakPointer> - -QT_FORWARD_DECLARE_CLASS(QGraphicsObject) -QT_FORWARD_DECLARE_CLASS(QGraphicsRectItem) -QT_FORWARD_DECLARE_CLASS(QPointF) -QT_FORWARD_DECLARE_CLASS(QRectF) - -namespace QmlJSDebugger { - -class LiveSelectionRectangle -{ -public: - LiveSelectionRectangle(QGraphicsObject *layerItem); - ~LiveSelectionRectangle(); - - void show(); - void hide(); - - void clear(); - - void setRect(const QPointF &firstPoint, - const QPointF &secondPoint); - - QRectF rect() const; - -private: - QGraphicsRectItem *m_controlShape; - QWeakPointer<QGraphicsObject> m_layerItem; -}; - -} // namespace QmlJSDebugger - -#endif // LIVESELECTIONRECTANGLE_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.cpp deleted file mode 100644 index 8ed9c60f6a6..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "liveselectiontool.h" -#include "livelayeritem.h" - -#include "../qdeclarativeviewinspector_p.h" - -#include <QApplication> -#include <QWheelEvent> -#include <QMouseEvent> -#include <QClipboard> -#include <QMenu> -#include <QAction> -#include <QGraphicsObject> - -#include <QDeclarativeItem> -#include <QDeclarativeEngine> - -#include <QDebug> - -namespace QmlJSDebugger { - -LiveSelectionTool::LiveSelectionTool(QDeclarativeViewInspector *editorView) : - AbstractLiveEditTool(editorView), - m_rubberbandSelectionMode(false), - m_rubberbandSelectionManipulator( - QDeclarativeViewInspectorPrivate::get(editorView)->manipulatorLayer, editorView), - m_singleSelectionManipulator(editorView), - m_selectionIndicator(editorView, - QDeclarativeViewInspectorPrivate::get(editorView)->manipulatorLayer), - //m_resizeIndicator(editorView->manipulatorLayer()), - m_selectOnlyContentItems(true) -{ - -} - -LiveSelectionTool::~LiveSelectionTool() -{ -} - -void LiveSelectionTool::setRubberbandSelectionMode(bool value) -{ - m_rubberbandSelectionMode = value; -} - -LiveSingleSelectionManipulator::SelectionType LiveSelectionTool::getSelectionType(Qt::KeyboardModifiers - modifiers) -{ - LiveSingleSelectionManipulator::SelectionType selectionType - = LiveSingleSelectionManipulator::ReplaceSelection; - if (modifiers.testFlag(Qt::ControlModifier)) { - selectionType = LiveSingleSelectionManipulator::RemoveFromSelection; - } else if (modifiers.testFlag(Qt::ShiftModifier)) { - selectionType = LiveSingleSelectionManipulator::AddToSelection; - } - return selectionType; -} - -bool LiveSelectionTool::alreadySelected(const QList<QGraphicsItem*> &itemList) const -{ - QDeclarativeViewInspectorPrivate *inspectorPrivate - = QDeclarativeViewInspectorPrivate::get(inspector()); - const QList<QGraphicsItem*> selectedItems = inspectorPrivate->selectedItems(); - - if (selectedItems.isEmpty()) - return false; - - foreach (QGraphicsItem *item, itemList) - if (selectedItems.contains(item)) - return true; - - return false; -} - -void LiveSelectionTool::mousePressEvent(QMouseEvent *event) -{ - QDeclarativeViewInspectorPrivate *inspectorPrivate - = QDeclarativeViewInspectorPrivate::get(inspector()); - QList<QGraphicsItem*> itemList = inspectorPrivate->selectableItems(event->pos()); - LiveSingleSelectionManipulator::SelectionType selectionType = getSelectionType(event->modifiers()); - - if (event->buttons() & Qt::LeftButton) { - m_mousePressTimer.start(); - - if (m_rubberbandSelectionMode) { - m_rubberbandSelectionManipulator.begin(event->pos()); - } else { - m_singleSelectionManipulator.begin(event->pos()); - m_singleSelectionManipulator.select(selectionType, m_selectOnlyContentItems); - } - } else if (event->buttons() & Qt::RightButton) { - createContextMenu(itemList, event->globalPos()); - } -} - -void LiveSelectionTool::createContextMenu(QList<QGraphicsItem*> itemList, QPoint globalPos) -{ - QMenu contextMenu; - connect(&contextMenu, SIGNAL(hovered(QAction*)), - this, SLOT(contextMenuElementHovered(QAction*))); - - m_contextMenuItemList = itemList; - - contextMenu.addAction("Items"); - contextMenu.addSeparator(); - int shortcutKey = Qt::Key_1; - bool addKeySequence = true; - int i = 0; - - foreach (QGraphicsItem * const item, itemList) { - QString itemTitle = titleForItem(item); - QAction *elementAction = contextMenu.addAction(itemTitle, this, - SLOT(contextMenuElementSelected())); - - if (inspector()->selectedItems().contains(item)) { - QFont boldFont = elementAction->font(); - boldFont.setBold(true); - elementAction->setFont(boldFont); - } - - elementAction->setData(i); - if (addKeySequence) - elementAction->setShortcut(QKeySequence(shortcutKey)); - - shortcutKey++; - if (shortcutKey > Qt::Key_9) - addKeySequence = false; - - ++i; - } - // add root item separately - // QString itemTitle = QString(tr("%1")).arg(titleForItem(view()->currentRootItem())); - // contextMenu.addAction(itemTitle, this, SLOT(contextMenuElementSelected())); - // m_contextMenuItemList.append(view()->currentRootItem()); - - contextMenu.exec(globalPos); - m_contextMenuItemList.clear(); -} - -void LiveSelectionTool::contextMenuElementSelected() -{ - QAction *senderAction = static_cast<QAction*>(sender()); - int itemListIndex = senderAction->data().toInt(); - if (itemListIndex >= 0 && itemListIndex < m_contextMenuItemList.length()) { - - QPointF updatePt(0, 0); - QGraphicsItem *item = m_contextMenuItemList.at(itemListIndex); - m_singleSelectionManipulator.begin(updatePt); - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::InvertSelection, - QList<QGraphicsItem*>() << item, - false); - m_singleSelectionManipulator.end(updatePt); - } -} - -void LiveSelectionTool::contextMenuElementHovered(QAction *action) -{ - int itemListIndex = action->data().toInt(); - if (itemListIndex >= 0 && itemListIndex < m_contextMenuItemList.length()) { - QGraphicsObject *item = m_contextMenuItemList.at(itemListIndex)->toGraphicsObject(); - QDeclarativeViewInspectorPrivate::get(inspector())->highlight(item); - } -} - -void LiveSelectionTool::mouseMoveEvent(QMouseEvent *event) -{ - if (m_singleSelectionManipulator.isActive()) { - QPointF mouseMovementVector = m_singleSelectionManipulator.beginPoint() - event->pos(); - - if ((mouseMovementVector.toPoint().manhattanLength() > Constants::DragStartDistance) - && (m_mousePressTimer.elapsed() > Constants::DragStartTime)) - { - m_singleSelectionManipulator.end(event->pos()); - //view()->changeToMoveTool(m_singleSelectionManipulator.beginPoint()); - return; - } - } else if (m_rubberbandSelectionManipulator.isActive()) { - QPointF mouseMovementVector = m_rubberbandSelectionManipulator.beginPoint() - event->pos(); - - if ((mouseMovementVector.toPoint().manhattanLength() > Constants::DragStartDistance) - && (m_mousePressTimer.elapsed() > Constants::DragStartTime)) { - m_rubberbandSelectionManipulator.update(event->pos()); - - if (event->modifiers().testFlag(Qt::ControlModifier)) - m_rubberbandSelectionManipulator.select( - LiveRubberBandSelectionManipulator::RemoveFromSelection); - else if (event->modifiers().testFlag(Qt::ShiftModifier)) - m_rubberbandSelectionManipulator.select( - LiveRubberBandSelectionManipulator::AddToSelection); - else - m_rubberbandSelectionManipulator.select( - LiveRubberBandSelectionManipulator::ReplaceSelection); - } - } -} - -void LiveSelectionTool::hoverMoveEvent(QMouseEvent * event) -{ -// ### commented out until move tool is re-enabled -// QList<QGraphicsItem*> itemList = view()->items(event->pos()); -// if (!itemList.isEmpty() && !m_rubberbandSelectionMode) { -// -// foreach (QGraphicsItem *item, itemList) { -// if (item->type() == Constants::ResizeHandleItemType) { -// ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(item); -// if (resizeHandle) -// view()->changeTool(Constants::ResizeToolMode); -// return; -// } -// } -// if (topSelectedItemIsMovable(itemList)) -// view()->changeTool(Constants::MoveToolMode); -// } - QDeclarativeViewInspectorPrivate *inspectorPrivate - = QDeclarativeViewInspectorPrivate::get(inspector()); - - QList<QGraphicsItem*> selectableItemList = inspectorPrivate->selectableItems(event->pos()); - if (!selectableItemList.isEmpty()) { - QGraphicsObject *item = selectableItemList.first()->toGraphicsObject(); - if (item) - QDeclarativeViewInspectorPrivate::get(inspector())->highlight(item); - - return; - } - - QDeclarativeViewInspectorPrivate::get(inspector())->clearHighlight(); -} - -void LiveSelectionTool::mouseReleaseEvent(QMouseEvent *event) -{ - if (m_singleSelectionManipulator.isActive()) { - m_singleSelectionManipulator.end(event->pos()); - } else if (m_rubberbandSelectionManipulator.isActive()) { - QPointF mouseMovementVector = m_rubberbandSelectionManipulator.beginPoint() - event->pos(); - if (mouseMovementVector.toPoint().manhattanLength() < Constants::DragStartDistance) { - m_singleSelectionManipulator.begin(event->pos()); - - if (event->modifiers().testFlag(Qt::ControlModifier)) - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::RemoveFromSelection, - m_selectOnlyContentItems); - else if (event->modifiers().testFlag(Qt::ShiftModifier)) - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::AddToSelection, - m_selectOnlyContentItems); - else - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::InvertSelection, - m_selectOnlyContentItems); - - m_singleSelectionManipulator.end(event->pos()); - } else { - m_rubberbandSelectionManipulator.update(event->pos()); - - if (event->modifiers().testFlag(Qt::ControlModifier)) - m_rubberbandSelectionManipulator.select( - LiveRubberBandSelectionManipulator::RemoveFromSelection); - else if (event->modifiers().testFlag(Qt::ShiftModifier)) - m_rubberbandSelectionManipulator.select( - LiveRubberBandSelectionManipulator::AddToSelection); - else - m_rubberbandSelectionManipulator.select( - LiveRubberBandSelectionManipulator::ReplaceSelection); - - m_rubberbandSelectionManipulator.end(); - } - } -} - -void LiveSelectionTool::mouseDoubleClickEvent(QMouseEvent * /*event*/) -{ -} - -void LiveSelectionTool::keyPressEvent(QKeyEvent *event) -{ - switch(event->key()) { - case Qt::Key_Left: - case Qt::Key_Right: - case Qt::Key_Up: - case Qt::Key_Down: - // disabled for now, cannot move stuff yet. - //view()->changeTool(Constants::MoveToolMode); - //view()->currentTool()->keyPressEvent(event); - break; - } -} - -void LiveSelectionTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/) -{ - -} - -void LiveSelectionTool::wheelEvent(QWheelEvent *event) -{ - if (event->orientation() == Qt::Horizontal || m_rubberbandSelectionMode) - return; - - QDeclarativeViewInspectorPrivate *inspectorPrivate - = QDeclarativeViewInspectorPrivate::get(inspector()); - QList<QGraphicsItem*> itemList = inspectorPrivate->selectableItems(event->pos()); - - if (itemList.isEmpty()) - return; - - int selectedIdx = 0; - if (!inspector()->selectedItems().isEmpty()) { - selectedIdx = itemList.indexOf(inspector()->selectedItems().first()); - if (selectedIdx >= 0) { - if (event->delta() > 0) { - selectedIdx++; - if (selectedIdx == itemList.length()) - selectedIdx = 0; - } else if (event->delta() < 0) { - selectedIdx--; - if (selectedIdx == -1) - selectedIdx = itemList.length() - 1; - } - } else { - selectedIdx = 0; - } - } - - QPointF updatePt(0, 0); - m_singleSelectionManipulator.begin(updatePt); - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::ReplaceSelection, - QList<QGraphicsItem*>() << itemList.at(selectedIdx), - false); - m_singleSelectionManipulator.end(updatePt); - -} - -void LiveSelectionTool::setSelectOnlyContentItems(bool selectOnlyContentItems) -{ - m_selectOnlyContentItems = selectOnlyContentItems; -} - -void LiveSelectionTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/) -{ -} - -void LiveSelectionTool::clear() -{ - view()->setCursor(Qt::ArrowCursor); - m_rubberbandSelectionManipulator.clear(), - m_singleSelectionManipulator.clear(); - m_selectionIndicator.clear(); - //m_resizeIndicator.clear(); -} - -void LiveSelectionTool::selectedItemsChanged(const QList<QGraphicsItem*> &itemList) -{ - foreach (const QWeakPointer<QGraphicsObject> &obj, m_selectedItemList) { - if (!obj.isNull()) { - disconnect(obj.data(), SIGNAL(xChanged()), this, SLOT(repaintBoundingRects())); - disconnect(obj.data(), SIGNAL(yChanged()), this, SLOT(repaintBoundingRects())); - disconnect(obj.data(), SIGNAL(widthChanged()), this, SLOT(repaintBoundingRects())); - disconnect(obj.data(), SIGNAL(heightChanged()), this, SLOT(repaintBoundingRects())); - disconnect(obj.data(), SIGNAL(rotationChanged()), this, SLOT(repaintBoundingRects())); - } - } - - QList<QGraphicsObject*> objects = toGraphicsObjectList(itemList); - m_selectedItemList.clear(); - - foreach (QGraphicsObject *obj, objects) { - m_selectedItemList.append(obj); - connect(obj, SIGNAL(xChanged()), this, SLOT(repaintBoundingRects())); - connect(obj, SIGNAL(yChanged()), this, SLOT(repaintBoundingRects())); - connect(obj, SIGNAL(widthChanged()), this, SLOT(repaintBoundingRects())); - connect(obj, SIGNAL(heightChanged()), this, SLOT(repaintBoundingRects())); - connect(obj, SIGNAL(rotationChanged()), this, SLOT(repaintBoundingRects())); - } - - m_selectionIndicator.setItems(m_selectedItemList); - //m_resizeIndicator.setItems(toGraphicsObjectList(itemList)); -} - -void LiveSelectionTool::repaintBoundingRects() -{ - m_selectionIndicator.setItems(m_selectedItemList); -} - -void LiveSelectionTool::selectUnderPoint(QMouseEvent *event) -{ - m_singleSelectionManipulator.begin(event->pos()); - - if (event->modifiers().testFlag(Qt::ControlModifier)) - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::RemoveFromSelection, - m_selectOnlyContentItems); - else if (event->modifiers().testFlag(Qt::ShiftModifier)) - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::AddToSelection, - m_selectOnlyContentItems); - else - m_singleSelectionManipulator.select(LiveSingleSelectionManipulator::InvertSelection, - m_selectOnlyContentItems); - - m_singleSelectionManipulator.end(event->pos()); -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.h b/share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.h deleted file mode 100644 index d2b900f518e..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/liveselectiontool.h +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef LIVESELECTIONTOOL_H -#define LIVESELECTIONTOOL_H - - -#include "abstractliveedittool.h" -#include "liverubberbandselectionmanipulator.h" -#include "livesingleselectionmanipulator.h" -#include "liveselectionindicator.h" - -#include <QList> -#include <QTime> - -QT_FORWARD_DECLARE_CLASS(QGraphicsItem) -QT_FORWARD_DECLARE_CLASS(QMouseEvent) -QT_FORWARD_DECLARE_CLASS(QKeyEvent) -QT_FORWARD_DECLARE_CLASS(QAction) - -namespace QmlJSDebugger { - -class LiveSelectionTool : public AbstractLiveEditTool -{ - Q_OBJECT - -public: - LiveSelectionTool(QDeclarativeViewInspector* editorView); - ~LiveSelectionTool(); - - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - void hoverMoveEvent(QMouseEvent *event); - void keyPressEvent(QKeyEvent *event); - void keyReleaseEvent(QKeyEvent *keyEvent); - void wheelEvent(QWheelEvent *event); - - void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList); -// QVariant itemChange(const QList<QGraphicsItem*> &itemList, -// QGraphicsItem::GraphicsItemChange change, -// const QVariant &value ); - -// void update(); - - void clear(); - - void selectedItemsChanged(const QList<QGraphicsItem*> &itemList); - - void selectUnderPoint(QMouseEvent *event); - - void setSelectOnlyContentItems(bool selectOnlyContentItems); - - void setRubberbandSelectionMode(bool value); - -private slots: - void contextMenuElementSelected(); - void contextMenuElementHovered(QAction *action); - void repaintBoundingRects(); - -private: - void createContextMenu(QList<QGraphicsItem*> itemList, QPoint globalPos); - LiveSingleSelectionManipulator::SelectionType getSelectionType(Qt::KeyboardModifiers modifiers); - bool alreadySelected(const QList<QGraphicsItem*> &itemList) const; - -private: - bool m_rubberbandSelectionMode; - LiveRubberBandSelectionManipulator m_rubberbandSelectionManipulator; - LiveSingleSelectionManipulator m_singleSelectionManipulator; - LiveSelectionIndicator m_selectionIndicator; - //ResizeIndicator m_resizeIndicator; - QTime m_mousePressTimer; - bool m_selectOnlyContentItems; - - QList<QWeakPointer<QGraphicsObject> > m_selectedItemList; - - QList<QGraphicsItem*> m_contextMenuItemList; -}; - -} // namespace QmlJSDebugger - -#endif // LIVESELECTIONTOOL_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.cpp deleted file mode 100644 index 11c69edd571..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "livesingleselectionmanipulator.h" -#include "qdeclarativeviewinspector.h" -#include "../qdeclarativeviewinspector_p.h" -#include <QDebug> - -namespace QmlJSDebugger { - -LiveSingleSelectionManipulator::LiveSingleSelectionManipulator(QDeclarativeViewInspector *editorView) - : m_editorView(editorView), - m_isActive(false) -{ -} - - -void LiveSingleSelectionManipulator::begin(const QPointF &beginPoint) -{ - m_beginPoint = beginPoint; - m_isActive = true; - m_oldSelectionList = QDeclarativeViewInspectorPrivate::get(m_editorView)->selectedItems(); -} - -void LiveSingleSelectionManipulator::update(const QPointF &/*updatePoint*/) -{ - m_oldSelectionList.clear(); -} - -void LiveSingleSelectionManipulator::clear() -{ - m_beginPoint = QPointF(); - m_oldSelectionList.clear(); -} - - -void LiveSingleSelectionManipulator::end(const QPointF &/*updatePoint*/) -{ - m_oldSelectionList.clear(); - m_isActive = false; -} - -void LiveSingleSelectionManipulator::select(SelectionType selectionType, - const QList<QGraphicsItem*> &items, - bool /*selectOnlyContentItems*/) -{ - QGraphicsItem *selectedItem = 0; - - foreach (QGraphicsItem* item, items) - { - //FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); - if (item - /*&& !formEditorItem->qmlItemNode().isRootNode() - && (formEditorItem->qmlItemNode().hasShowContent() || !selectOnlyContentItems)*/) - { - selectedItem = item; - break; - } - } - - QList<QGraphicsItem*> resultList; - - switch(selectionType) { - case AddToSelection: { - resultList.append(m_oldSelectionList); - if (selectedItem && !m_oldSelectionList.contains(selectedItem)) - resultList.append(selectedItem); - } - break; - case ReplaceSelection: { - if (selectedItem) - resultList.append(selectedItem); - } - break; - case RemoveFromSelection: { - resultList.append(m_oldSelectionList); - if (selectedItem) - resultList.removeAll(selectedItem); - } - break; - case InvertSelection: { - if (selectedItem - && !m_oldSelectionList.contains(selectedItem)) - { - resultList.append(selectedItem); - } - } - } - - m_editorView->setSelectedItems(resultList); -} - -void LiveSingleSelectionManipulator::select(SelectionType selectionType, bool selectOnlyContentItems) -{ - QDeclarativeViewInspectorPrivate *inspectorPrivate = - QDeclarativeViewInspectorPrivate::get(m_editorView); - QList<QGraphicsItem*> itemList = inspectorPrivate->selectableItems(m_beginPoint); - select(selectionType, itemList, selectOnlyContentItems); -} - - -bool LiveSingleSelectionManipulator::isActive() const -{ - return m_isActive; -} - -QPointF LiveSingleSelectionManipulator::beginPoint() const -{ - return m_beginPoint; -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.h b/share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.h deleted file mode 100644 index b5018d1fe3b..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/livesingleselectionmanipulator.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef LIVESINGLESELECTIONMANIPULATOR_H -#define LIVESINGLESELECTIONMANIPULATOR_H - -#include <QPointF> -#include <QList> - -QT_FORWARD_DECLARE_CLASS(QGraphicsItem); - -namespace QmlJSDebugger { - -class QDeclarativeViewInspector; - -class LiveSingleSelectionManipulator -{ -public: - LiveSingleSelectionManipulator(QDeclarativeViewInspector *editorView); - - enum SelectionType { - ReplaceSelection, - AddToSelection, - RemoveFromSelection, - InvertSelection - }; - - void begin(const QPointF& beginPoint); - void update(const QPointF& updatePoint); - void end(const QPointF& updatePoint); - - void select(SelectionType selectionType, const QList<QGraphicsItem*> &items, - bool selectOnlyContentItems); - void select(SelectionType selectionType, bool selectOnlyContentItems); - - void clear(); - - QPointF beginPoint() const; - - bool isActive() const; - -private: - QList<QGraphicsItem*> m_oldSelectionList; - QPointF m_beginPoint; - QDeclarativeViewInspector *m_editorView; - bool m_isActive; -}; - -} // namespace QmlJSDebugger - -#endif // LIVESINGLESELECTIONMANIPULATOR_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.cpp b/share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.cpp deleted file mode 100644 index 46dd1edf01e..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "subcomponentmasklayeritem.h" -#include "qmlinspectorconstants.h" -#include "qdeclarativeviewinspector.h" -#include <QPolygonF> - -namespace QmlJSDebugger { - -SubcomponentMaskLayerItem::SubcomponentMaskLayerItem(QDeclarativeViewInspector *inspector, - QGraphicsItem *parentItem) : - QGraphicsPolygonItem(parentItem), - m_inspector(inspector), - m_currentItem(0), - m_borderRect(new QGraphicsRectItem(this)) -{ - m_borderRect->setRect(0,0,0,0); - m_borderRect->setPen(QPen(QColor(60, 60, 60), 1)); - m_borderRect->setData(Constants::EditorItemDataKey, QVariant(true)); - - setBrush(QBrush(QColor(160,160,160))); - setPen(Qt::NoPen); -} - -int SubcomponentMaskLayerItem::type() const -{ - return Constants::EditorItemType; -} - -static QRectF resizeRect(const QRectF &newRect, const QRectF &oldRect) -{ - QRectF result = newRect; - if (oldRect.left() < newRect.left()) - result.setLeft(oldRect.left()); - - if (oldRect.top() < newRect.top()) - result.setTop(oldRect.top()); - - if (oldRect.right() > newRect.right()) - result.setRight(oldRect.right()); - - if (oldRect.bottom() > newRect.bottom()) - result.setBottom(oldRect.bottom()); - - return result; -} - -static QPolygonF regionToPolygon(const QRegion ®ion) -{ - QPainterPath path; - foreach (const QRect &rect, region.rects()) - path.addRect(rect); - return path.toFillPolygon(); -} - -void SubcomponentMaskLayerItem::setCurrentItem(QGraphicsItem *item) -{ - QGraphicsItem *prevItem = m_currentItem; - m_currentItem = item; - - if (!m_currentItem) - return; - - QRect viewRect = m_inspector->declarativeView()->rect(); - viewRect = m_inspector->declarativeView()->mapToScene(viewRect).boundingRect().toRect(); - - QRectF itemRect = item->boundingRect() | item->childrenBoundingRect(); - itemRect = item->mapRectToScene(itemRect); - - // if updating the same item as before, resize the rectangle only bigger, not smaller. - if (prevItem == item && prevItem != 0) { - m_itemPolyRect = resizeRect(itemRect, m_itemPolyRect); - } else { - m_itemPolyRect = itemRect; - } - QRectF borderRect = m_itemPolyRect; - borderRect.adjust(-1, -1, 1, 1); - m_borderRect->setRect(borderRect); - - const QRegion externalRegion = QRegion(viewRect).subtracted(m_itemPolyRect.toRect()); - setPolygon(regionToPolygon(externalRegion)); -} - -QGraphicsItem *SubcomponentMaskLayerItem::currentItem() const -{ - return m_currentItem; -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.h b/share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.h deleted file mode 100644 index 4faa9ba1756..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/subcomponentmasklayeritem.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef SUBCOMPONENTMASKLAYERITEM_H -#define SUBCOMPONENTMASKLAYERITEM_H - -#include <QGraphicsPolygonItem> - -namespace QmlJSDebugger { - -class QDeclarativeViewInspector; - -class SubcomponentMaskLayerItem : public QGraphicsPolygonItem -{ -public: - explicit SubcomponentMaskLayerItem(QDeclarativeViewInspector *inspector, - QGraphicsItem *parentItem = 0); - int type() const; - void setCurrentItem(QGraphicsItem *item); - void setBoundingBox(const QRectF &boundingBox); - QGraphicsItem *currentItem() const; - QRectF itemRect() const; - -private: - QDeclarativeViewInspector *m_inspector; - QGraphicsItem *m_currentItem; - QGraphicsRectItem *m_borderRect; - QRectF m_itemPolyRect; -}; - -} // namespace QmlJSDebugger - -#endif // SUBCOMPONENTMASKLAYERITEM_H diff --git a/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp deleted file mode 100644 index ab8ebf5b3c3..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "zoomtool.h" -#include "../qdeclarativeviewinspector_p.h" - -#include <QMouseEvent> -#include <QWheelEvent> -#include <QKeyEvent> -#include <QMenu> -#include <QAction> - -#include <QRectF> -#include <QDebug> - -namespace QmlJSDebugger { - -ZoomTool::ZoomTool(QDeclarativeViewInspector *view) : - AbstractLiveEditTool(view), - m_rubberbandManipulator(), - m_smoothZoomMultiplier(0.05f), - m_currentScale(1.0f) -{ - m_zoomTo100Action = new QAction(tr("Zoom to &100%"), this); - m_zoomInAction = new QAction(tr("Zoom In"), this); - m_zoomOutAction = new QAction(tr("Zoom Out"), this); - m_zoomInAction->setShortcut(QKeySequence(Qt::Key_Plus)); - m_zoomOutAction->setShortcut(QKeySequence(Qt::Key_Minus)); - - - LiveLayerItem *layerItem = QDeclarativeViewInspectorPrivate::get(view)->manipulatorLayer; - QGraphicsObject *layerObject = reinterpret_cast<QGraphicsObject *>(layerItem); - m_rubberbandManipulator = new LiveRubberBandSelectionManipulator(layerObject, view); - - - connect(m_zoomTo100Action, SIGNAL(triggered()), SLOT(zoomTo100())); - connect(m_zoomInAction, SIGNAL(triggered()), SLOT(zoomIn())); - connect(m_zoomOutAction, SIGNAL(triggered()), SLOT(zoomOut())); -} - -ZoomTool::~ZoomTool() -{ - delete m_rubberbandManipulator; -} - -void ZoomTool::mousePressEvent(QMouseEvent *event) -{ - m_mousePos = event->pos(); - - QPointF scenePos = view()->mapToScene(event->pos()); - - if (event->buttons() & Qt::RightButton) { - QMenu contextMenu; - contextMenu.addAction(m_zoomTo100Action); - contextMenu.addSeparator(); - contextMenu.addAction(m_zoomInAction); - contextMenu.addAction(m_zoomOutAction); - contextMenu.exec(event->globalPos()); - } else if (event->buttons() & Qt::LeftButton) { - m_dragBeginPos = scenePos; - m_dragStarted = false; - } -} - -void ZoomTool::mouseMoveEvent(QMouseEvent *event) -{ - m_mousePos = event->pos(); - - QPointF scenePos = view()->mapToScene(event->pos()); - - if (event->buttons() & Qt::LeftButton - && (QPointF(scenePos - m_dragBeginPos).manhattanLength() - > Constants::DragStartDistance / 3) - && !m_dragStarted) - { - m_dragStarted = true; - m_rubberbandManipulator->begin(m_dragBeginPos); - return; - } - - if (m_dragStarted) - m_rubberbandManipulator->update(scenePos); - -} - -void ZoomTool::mouseReleaseEvent(QMouseEvent *event) -{ - m_mousePos = event->pos(); - QPointF scenePos = view()->mapToScene(event->pos()); - - if (m_dragStarted) { - m_rubberbandManipulator->end(); - - int x1 = qMin(scenePos.x(), m_rubberbandManipulator->beginPoint().x()); - int x2 = qMax(scenePos.x(), m_rubberbandManipulator->beginPoint().x()); - int y1 = qMin(scenePos.y(), m_rubberbandManipulator->beginPoint().y()); - int y2 = qMax(scenePos.y(), m_rubberbandManipulator->beginPoint().y()); - - QPointF scenePosTopLeft = QPoint(x1, y1); - QPointF scenePosBottomRight = QPoint(x2, y2); - - QRectF sceneArea(scenePosTopLeft, scenePosBottomRight); - - m_currentScale = qMin(view()->rect().width() / sceneArea.width(), - view()->rect().height() / sceneArea.height()); - - - QTransform transform; - transform.scale(m_currentScale, m_currentScale); - - view()->setTransform(transform); - view()->setSceneRect(sceneArea); - } else { - Qt::KeyboardModifier modifierKey = Qt::ControlModifier; -#ifdef Q_OS_MAC - modifierKey = Qt::AltModifier; -#endif - if (event->modifiers() & modifierKey) { - zoomOut(); - } else { - zoomIn(); - } - } -} - -void ZoomTool::zoomIn() -{ - m_currentScale = nextZoomScale(ZoomIn); - scaleView(view()->mapToScene(m_mousePos)); -} - -void ZoomTool::zoomOut() -{ - m_currentScale = nextZoomScale(ZoomOut); - scaleView(view()->mapToScene(m_mousePos)); -} - -void ZoomTool::mouseDoubleClickEvent(QMouseEvent *event) -{ - m_mousePos = event->pos(); -} - - -void ZoomTool::hoverMoveEvent(QMouseEvent *event) -{ - m_mousePos = event->pos(); -} - - -void ZoomTool::keyPressEvent(QKeyEvent * /*event*/) -{ -} - -void ZoomTool::wheelEvent(QWheelEvent *event) -{ - if (event->orientation() != Qt::Vertical) - return; - - Qt::KeyboardModifier smoothZoomModifier = Qt::ControlModifier; - if (event->modifiers() & smoothZoomModifier) { - int numDegrees = event->delta() / 8; - m_currentScale += m_smoothZoomMultiplier * (numDegrees / 15.0f); - - scaleView(view()->mapToScene(m_mousePos)); - - } else if (!event->modifiers()) { - if (event->delta() > 0) { - m_currentScale = nextZoomScale(ZoomIn); - } else if (event->delta() < 0) { - m_currentScale = nextZoomScale(ZoomOut); - } - scaleView(view()->mapToScene(m_mousePos)); - } -} - -void ZoomTool::keyReleaseEvent(QKeyEvent *event) -{ - switch(event->key()) { - case Qt::Key_Plus: - zoomIn(); - break; - case Qt::Key_Minus: - zoomOut(); - break; - case Qt::Key_1: - case Qt::Key_2: - case Qt::Key_3: - case Qt::Key_4: - case Qt::Key_5: - case Qt::Key_6: - case Qt::Key_7: - case Qt::Key_8: - case Qt::Key_9: - { - m_currentScale = ((event->key() - Qt::Key_0) * 1.0f); - scaleView(view()->mapToScene(m_mousePos)); // view()->mapToScene(view()->rect().center()) - break; - } - - default: - break; - } - -} - -void ZoomTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/) -{ -} - -void ZoomTool::clear() -{ - view()->setCursor(Qt::ArrowCursor); -} - -void ZoomTool::selectedItemsChanged(const QList<QGraphicsItem*> &/*itemList*/) -{ -} - -void ZoomTool::scaleView(const QPointF ¢erPos) -{ - - QTransform transform; - transform.scale(m_currentScale, m_currentScale); - view()->setTransform(transform); - - QPointF adjustedCenterPos = centerPos; - QSize rectSize(view()->rect().width() / m_currentScale, - view()->rect().height() / m_currentScale); - - QRectF sceneRect; - if (qAbs(m_currentScale - 1.0f) < Constants::ZoomSnapDelta) { - adjustedCenterPos.rx() = rectSize.width() / 2; - adjustedCenterPos.ry() = rectSize.height() / 2; - } - - if (m_currentScale < 1.0f) { - adjustedCenterPos.rx() = rectSize.width() / 2; - adjustedCenterPos.ry() = rectSize.height() / 2; - sceneRect.setRect(view()->rect().width() / 2 -rectSize.width() / 2, - view()->rect().height() / 2 -rectSize.height() / 2, - rectSize.width(), - rectSize.height()); - } else { - sceneRect.setRect(adjustedCenterPos.x() - rectSize.width() / 2, - adjustedCenterPos.y() - rectSize.height() / 2, - rectSize.width(), - rectSize.height()); - } - - view()->setSceneRect(sceneRect); -} - -void ZoomTool::zoomTo100() -{ - m_currentScale = 1.0f; - scaleView(view()->mapToScene(view()->rect().center())); -} - -qreal ZoomTool::nextZoomScale(ZoomDirection direction) const -{ - static QList<qreal> zoomScales = - QList<qreal>() - << 0.125f - << 1.0f / 6.0f - << 0.25f - << 1.0f / 3.0f - << 0.5f - << 2.0f / 3.0f - << 1.0f - << 2.0f - << 3.0f - << 4.0f - << 5.0f - << 6.0f - << 7.0f - << 8.0f - << 12.0f - << 16.0f - << 32.0f - << 48.0f; - - if (direction == ZoomIn) { - for (int i = 0; i < zoomScales.length(); ++i) { - if (zoomScales[i] > m_currentScale || i == zoomScales.length() - 1) - return zoomScales[i]; - } - } else { - for (int i = zoomScales.length() - 1; i >= 0; --i) { - if (zoomScales[i] < m_currentScale || i == 0) - return zoomScales[i]; - } - } - - return 1.0f; -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.h b/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.h deleted file mode 100644 index 999045f15b2..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef ZOOMTOOL_H -#define ZOOMTOOL_H - -#include "abstractliveedittool.h" -#include "liverubberbandselectionmanipulator.h" - -QT_FORWARD_DECLARE_CLASS(QAction) - -namespace QmlJSDebugger { - -class ZoomTool : public AbstractLiveEditTool -{ - Q_OBJECT -public: - enum ZoomDirection { - ZoomIn, - ZoomOut - }; - - explicit ZoomTool(QDeclarativeViewInspector *view); - - virtual ~ZoomTool(); - - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - - void hoverMoveEvent(QMouseEvent *event); - void wheelEvent(QWheelEvent *event); - - void keyPressEvent(QKeyEvent *event); - void keyReleaseEvent(QKeyEvent *keyEvent); - void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList); - - void clear(); -protected: - void selectedItemsChanged(const QList<QGraphicsItem*> &itemList); - -private slots: - void zoomTo100(); - void zoomIn(); - void zoomOut(); - -private: - qreal nextZoomScale(ZoomDirection direction) const; - void scaleView(const QPointF ¢erPos); - -private: - bool m_dragStarted; - QPoint m_mousePos; // in view coords - QPointF m_dragBeginPos; - QAction *m_zoomTo100Action; - QAction *m_zoomInAction; - QAction *m_zoomOutAction; - LiveRubberBandSelectionManipulator *m_rubberbandManipulator; - - qreal m_smoothZoomMultiplier; - qreal m_currentScale; - -}; - -} // namespace QmlJSDebugger - -#endif // ZOOMTOOL_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h b/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h deleted file mode 100644 index 3602bd0a3ab..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h +++ /dev/null @@ -1,107 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef JSDEBUGGERAGENT_H -#define JSDEBUGGERAGENT_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qscriptengineagent.h> - -#include "qt_private/qdeclarativedebugservice_p.h" - -#include "qmljsdebugger_global.h" - -QT_BEGIN_NAMESPACE -class QScriptValue; -class QDeclarativeEngine; -QT_END_NAMESPACE - -namespace QmlJSDebugger { - -class JSDebuggerAgentPrivate; - -class QMLJSDEBUGGER_EXPORT JSDebuggerAgent - : public QDeclarativeDebugService - , public QScriptEngineAgent -{ - Q_OBJECT - -public: - JSDebuggerAgent(QScriptEngine *engine); - JSDebuggerAgent(QDeclarativeEngine *engine); - ~JSDebuggerAgent(); - - // reimplemented - void scriptLoad(qint64 id, const QString &program, - const QString &fileName, int baseLineNumber); - void scriptUnload(qint64 id); - - void contextPush(); - void contextPop(); - - void functionEntry(qint64 scriptId); - void functionExit(qint64 scriptId, - const QScriptValue &returnValue); - - void positionChange(qint64 scriptId, - int lineNumber, int columnNumber); - - void exceptionThrow(qint64 scriptId, - const QScriptValue &exception, - bool hasHandler); - void exceptionCatch(qint64 scriptId, - const QScriptValue &exception); - - bool supportsExtension(Extension extension) const; - QVariant extension(Extension extension, - const QVariant &argument = QVariant()); - - void messageReceived(const QByteArray &); - void statusChanged(Status status); - void baseMessageReceived(const QByteArray &message); - -public slots: - -private: - JSDebuggerAgentPrivate *d; -}; - -} // namespace QmlJSDebugger - -#endif // JSDEBUGGERAGENT_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeinspectorservice.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeinspectorservice.h deleted file mode 100644 index f6c02b1978b..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeinspectorservice.h +++ /dev/null @@ -1,103 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVEDINSPECTORSERVICE_H -#define QDECLARATIVEDINSPECTORSERVICE_H - -#include "qt_private/qdeclarativedebugservice_p.h" -#include "qmlinspectorconstants.h" -#include "qmljsdebugger_global.h" - -#include <QHash> - -QT_FORWARD_DECLARE_CLASS(QColor) -QT_FORWARD_DECLARE_CLASS(QDeclarativeEngine) -QT_FORWARD_DECLARE_CLASS(QDeclarativeContext) -QT_FORWARD_DECLARE_CLASS(QDeclarativeWatcher) -QT_FORWARD_DECLARE_CLASS(QDataStream) - -namespace QmlJSDebugger { - -class QMLJSDEBUGGER_EXPORT QDeclarativeInspectorService : public QDeclarativeDebugService -{ - Q_OBJECT -public: - QDeclarativeInspectorService(); - static QDeclarativeInspectorService *instance(); - - void setDesignModeBehavior(bool inDesignMode); - void setCurrentObjects(QList<QObject*> items); - void setAnimationSpeed(qreal slowDownFactor); - void setAnimationPaused(bool paused); - void setCurrentTool(QmlJSDebugger::Constants::DesignTool toolId); - void reloaded(); - void setShowAppOnTop(bool showAppOnTop); - - QString idStringForObject(QObject *obj) const; - - void sendMessage(const QByteArray &message); - -public Q_SLOTS: - void selectedColorChanged(const QColor &color); - -Q_SIGNALS: - void debuggingClientChanged(bool hasDebuggingClient); - - void currentObjectsChanged(const QList<QObject*> &objects); - void designModeBehaviorChanged(bool inDesignMode); - void showAppOnTopChanged(bool showAppOnTop); - void reloadRequested(); - void selectToolRequested(); - void selectMarqueeToolRequested(); - void zoomToolRequested(); - void colorPickerToolRequested(); - - void objectCreationRequested(const QString &qml, QObject *parent, - const QStringList &imports, const QString &filename = QString(), int order = -1); - void objectReparentRequested(QObject *object, QObject *newParent); - void objectDeletionRequested(QObject *object); - - // 1 = normal speed, - // 1 < x < 16 = slowdown by some factor - void animationSpeedChangeRequested(qreal speedFactor); - void executionPauseChangeRequested(bool paused); - - void clearComponentCacheRequested(); - -protected: - virtual void statusChanged(Status status); - virtual void messageReceived(const QByteArray &); - -private: - QHash<int, QString> m_stringIdForObjectId; -}; - -} // namespace QmlJSDebugger - -#endif // QDECLARATIVEDINSPECTORSERVICE_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewinspector.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewinspector.h deleted file mode 100644 index 16adc285ba9..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewinspector.h +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVEVIEWINSPECTOR_H -#define QDECLARATIVEVIEWINSPECTOR_H - -#include "qmljsdebugger_global.h" -#include "qmlinspectorconstants.h" - -#include <QScopedPointer> -#include <QDeclarativeView> - -QT_FORWARD_DECLARE_CLASS(QDeclarativeItem) -QT_FORWARD_DECLARE_CLASS(QMouseEvent) - -namespace QmlJSDebugger { - -class CrumblePath; -class QDeclarativeViewInspectorPrivate; - -class QMLJSDEBUGGER_EXPORT QDeclarativeViewInspector : public QObject -{ - Q_OBJECT -public: - - explicit QDeclarativeViewInspector(QDeclarativeView *view, QObject *parent = 0); - ~QDeclarativeViewInspector(); - - void setSelectedItems(QList<QGraphicsItem *> items); - QList<QGraphicsItem *> selectedItems(); - - QDeclarativeView *declarativeView(); - - 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 setAnimationSpeed(qreal factor); - void setAnimationPaused(bool paused); - -Q_SIGNALS: - void designModeBehaviorChanged(bool inDesignMode); - void showAppOnTopChanged(bool showAppOnTop); - void reloadRequested(); - void marqueeSelectToolActivated(); - void selectToolActivated(); - void zoomToolActivated(); - void colorPickerActivated(); - void selectedColorChanged(const QColor &color); - - void animationSpeedChanged(qreal factor); - void animationPausedChanged(bool paused); - -protected: - bool eventFilter(QObject *obj, QEvent *event); - - bool leaveEvent(QEvent *); - bool mousePressEvent(QMouseEvent *event); - bool mouseMoveEvent(QMouseEvent *event); - bool mouseReleaseEvent(QMouseEvent *event); - bool keyPressEvent(QKeyEvent *event); - bool keyReleaseEvent(QKeyEvent *keyEvent); - bool mouseDoubleClickEvent(QMouseEvent *event); - bool wheelEvent(QWheelEvent *event); - - void setSelectedItemsForTools(QList<QGraphicsItem *> items); - -private slots: - void animationSpeedChangeRequested(qreal factor); - void animationPausedChangeRequested(bool paused); - -private: - Q_DISABLE_COPY(QDeclarativeViewInspector) - - inline QDeclarativeViewInspectorPrivate *d_func() { return data.data(); } - QScopedPointer<QDeclarativeViewInspectorPrivate> data; - friend class QDeclarativeViewInspectorPrivate; - friend class AbstractLiveEditTool; -}; - -} // namespace QmlJSDebugger - -#endif // QDECLARATIVEVIEWINSPECTOR_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h deleted file mode 100644 index 938f96463ca..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeviewobserver.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVEVIEWOBSERVER_H -#define QDECLARATIVEVIEWOBSERVER_H - -#include "qdeclarativeviewinspector.h" - -namespace QmlJSDebugger { - -// Provided for compatibility with QmlApplicationViewer -class QMLJSDEBUGGER_EXPORT QDeclarativeViewObserver : public QDeclarativeViewInspector -{ - Q_OBJECT - -public: - explicit QDeclarativeViewObserver(QDeclarativeView *view, QObject *parent = 0) - : QDeclarativeViewInspector(view, parent) - {} -}; - -} // namespace QmlJSDebugger - -#endif // QDECLARATIVEVIEWOBSERVER_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qmlinspectorconstants.h b/share/qtcreator/qml/qmljsdebugger/include/qmlinspectorconstants.h deleted file mode 100644 index 080892fa83b..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qmlinspectorconstants.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QMLINSPECTORCONSTANTS_H -#define QMLINSPECTORCONSTANTS_H - -namespace QmlJSDebugger { -namespace Constants { - -enum DesignTool { - NoTool = 0, - SelectionToolMode = 1, - MarqueeSelectionToolMode = 2, - MoveToolMode = 3, - ResizeToolMode = 4, - ColorPickerMode = 5, - ZoomMode = 6 -}; - -enum ToolFlags { - NoToolFlags = 0, - UseCursorPos = 1 -}; - -static const int DragStartTime = 50; - -static const int DragStartDistance = 20; - -static const double ZoomSnapDelta = 0.04; - -static const int EditorItemDataKey = 1000; - -enum GraphicsItemTypes { - EditorItemType = 0xEAAA, - ResizeHandleItemType = 0xEAEA -}; - - -} // namespace Constants -} // namespace QmlJSDebugger - -#endif // QMLINSPECTORCONSTANTS_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qmljsdebugger_global.h b/share/qtcreator/qml/qmljsdebugger/include/qmljsdebugger_global.h deleted file mode 100644 index 224927e54f8..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qmljsdebugger_global.h +++ /dev/null @@ -1,46 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QMLJSDEBUGGER_GLOBAL_H -#define QMLJSDEBUGGER_GLOBAL_H - -#include <qglobal.h> - -# if defined(BUILD_QMLJSDEBUGGER_LIB) -# define QMLJSDEBUGGER_EXPORT Q_DECL_EXPORT -# define QMLJSDEBUGGER_EXTERN Q_DECL_IMPORT -# elif defined(BUILD_QMLJSDEBUGGER_STATIC_LIB) -# define QMLJSDEBUGGER_EXPORT -# define QMLJSDEBUGGER_EXTERN Q_DECL_IMPORT -# else -# define QMLJSDEBUGGER_EXPORT -# define QMLJSDEBUGGER_EXTERN Q_DECL_IMPORT -#endif - -#endif // QMLJSDEBUGGER_GLOBAL_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h b/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h deleted file mode 100644 index a1872a1ef19..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h +++ /dev/null @@ -1,56 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVEDEBUGHELPER_P_H -#define QDECLARATIVEDEBUGHELPER_P_H - -#include "../qmljsdebugger_global.h" -#include <qglobal.h> - -QT_BEGIN_NAMESPACE - -class QScriptEngine; -class QDeclarativeEngine; - -// Helper functions to access private API through a stable interface -// This is used in the qmljsdebugger library of QtCreator. -class QMLJSDEBUGGER_EXTERN QDeclarativeDebugHelper -{ -public: - static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine); - static void setAnimationSlowDownFactor(qreal factor); - - // Enables remote debugging functionality - // Only use this for debugging in a safe environment! - static void enableDebugging(); -}; - -QT_END_NAMESPACE - -#endif // QDECLARATIVEDEBUGHELPER_P_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h b/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h deleted file mode 100644 index bd220ff059f..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVEDEBUGSERVICE_H -#define QDECLARATIVEDEBUGSERVICE_H - -#include "../qmljsdebugger_global.h" -#include <qobject.h> - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QDeclarativeDebugServicePrivate; -class QMLJSDEBUGGER_EXTERN QDeclarativeDebugService : public QObject -{ - Q_OBJECT - Q_DECLARE_PRIVATE(QDeclarativeDebugService) - Q_DISABLE_COPY(QDeclarativeDebugService) - -public: - explicit QDeclarativeDebugService(const QString &, QObject *parent = 0); - ~QDeclarativeDebugService(); - - QString name() const; - - enum Status { NotConnected, Unavailable, Enabled }; - Status status() const; - - void sendMessage(const QByteArray &); - - static int idForObject(QObject *); - static QObject *objectForId(int); - - static QString objectToString(QObject *obj); - - static bool isDebuggingEnabled(); - static bool hasDebuggingClient(); - -protected: - virtual void statusChanged(Status); - virtual void messageReceived(const QByteArray &); - -private: - friend class QDeclarativeDebugServer; -}; - -QT_END_NAMESPACE - -#endif // QDECLARATIVEDEBUGSERVICE_H - diff --git a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativestate_p.h b/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativestate_p.h deleted file mode 100644 index cc1a81ab6b1..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativestate_p.h +++ /dev/null @@ -1,194 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVESTATE_H -#define QDECLARATIVESTATE_H - -#include "../qmljsdebugger_global.h" - -#include <qdeclarative.h> -#include <qdeclarativeproperty.h> -#include <qobject.h> -#include <qsharedpointer.h> - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QDeclarativeActionEvent; -class QDeclarativeAbstractBinding; -class QDeclarativeBinding; -class QDeclarativeExpression; -class QMLJSDEBUGGER_EXTERN QDeclarativeAction -{ -public: - QDeclarativeAction(); - QDeclarativeAction(QObject *, const QString &, const QVariant &); - QDeclarativeAction(QObject *, const QString &, - QDeclarativeContext *, const QVariant &); - - bool restore:1; - bool actionDone:1; - bool reverseEvent:1; - bool deletableToBinding:1; - - QDeclarativeProperty property; - QVariant fromValue; - QVariant toValue; - - QDeclarativeAbstractBinding *fromBinding; - QWeakPointer<QDeclarativeAbstractBinding> toBinding; - QDeclarativeActionEvent *event; - - //strictly for matching - QObject *specifiedObject; - QString specifiedProperty; - - void deleteFromBinding(); -}; - -class QMLJSDEBUGGER_EXTERN QDeclarativeActionEvent -{ -public: - virtual ~QDeclarativeActionEvent(); - virtual QString typeName() const; - - enum Reason { ActualChange, FastForward }; - - virtual void execute(Reason reason = ActualChange); - virtual bool isReversable(); - virtual void reverse(Reason reason = ActualChange); - virtual void saveOriginals() {} - virtual bool needsCopy() { return false; } - virtual void copyOriginals(QDeclarativeActionEvent *) {} - virtual bool isRewindable() { return isReversable(); } - virtual void rewind() {} - virtual void saveCurrentValues() {} - virtual void saveTargetValues() {} - - virtual bool changesBindings(); - virtual void clearBindings(); - virtual bool override(QDeclarativeActionEvent*other); -}; - -//### rename to QDeclarativeStateChange? -class QDeclarativeStateGroup; -class QDeclarativeState; -class QDeclarativeStateOperationPrivate; -class QMLJSDEBUGGER_EXTERN QDeclarativeStateOperation : public QObject -{ - Q_OBJECT -public: - QDeclarativeStateOperation(QObject *parent = 0) - : QObject(parent) {} - typedef QList<QDeclarativeAction> ActionList; - - virtual ActionList actions(); - - QDeclarativeState *state() const; - void setState(QDeclarativeState *state); - -protected: - QDeclarativeStateOperation(QObjectPrivate &dd, QObject *parent = 0); - -private: - Q_DECLARE_PRIVATE(QDeclarativeStateOperation) - Q_DISABLE_COPY(QDeclarativeStateOperation) -}; - -typedef QDeclarativeStateOperation::ActionList QDeclarativeStateActions; - -class QDeclarativeTransition; -class QDeclarativeStatePrivate; -class QMLJSDEBUGGER_EXTERN QDeclarativeState : public QObject -{ - Q_OBJECT - - Q_PROPERTY(QString name READ name WRITE setName) - Q_PROPERTY(QDeclarativeBinding *when READ when WRITE setWhen) - Q_PROPERTY(QString extend READ extends WRITE setExtends) - Q_PROPERTY(QDeclarativeListProperty<QDeclarativeStateOperation> changes READ changes) - Q_CLASSINFO("DefaultProperty", "changes") - Q_CLASSINFO("DeferredPropertyNames", "changes") - -public: - QDeclarativeState(QObject *parent=0); - virtual ~QDeclarativeState(); - - QString name() const; - void setName(const QString &); - bool isNamed() const; - - /*'when' is a QDeclarativeBinding to limit state changes oscillation - due to the unpredictable order of evaluation of bound expressions*/ - bool isWhenKnown() const; - QDeclarativeBinding *when() const; - void setWhen(QDeclarativeBinding *); - - QString extends() const; - void setExtends(const QString &); - - QDeclarativeListProperty<QDeclarativeStateOperation> changes(); - int operationCount() const; - QDeclarativeStateOperation *operationAt(int) const; - - QDeclarativeState &operator<<(QDeclarativeStateOperation *); - - void apply(QDeclarativeStateGroup *, QDeclarativeTransition *, QDeclarativeState *revert); - void cancel(); - - QDeclarativeStateGroup *stateGroup() const; - void setStateGroup(QDeclarativeStateGroup *); - - bool containsPropertyInRevertList(QObject *target, const QString &name) const; - bool changeValueInRevertList(QObject *target, const QString &name, const QVariant &revertValue); - bool changeBindingInRevertList(QObject *target, const QString &name, QDeclarativeAbstractBinding *binding); - bool removeEntryFromRevertList(QObject *target, const QString &name); - void addEntryToRevertList(const QDeclarativeAction &action); - void removeAllEntriesFromRevertList(QObject *target); - void addEntriesToRevertList(const QList<QDeclarativeAction> &actions); - QVariant valueInRevertList(QObject *target, const QString &name) const; - QDeclarativeAbstractBinding *bindingInRevertList(QObject *target, const QString &name) const; - - bool isStateActive() const; - -Q_SIGNALS: - void completed(); - -private: - Q_DECLARE_PRIVATE(QDeclarativeState) - Q_DISABLE_COPY(QDeclarativeState) -}; - -QT_END_NAMESPACE - -//QML_DECLARE_TYPE(QDeclarativeStateOperation) -//QML_DECLARE_TYPE(QDeclarativeState) - -#endif // QDECLARATIVESTATE_H diff --git a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp deleted file mode 100644 index 8f3ed659fee..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp +++ /dev/null @@ -1,672 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "jsdebuggeragent.h" -#include "qt_private/qdeclarativedebughelper_p.h" - -#include <qdatetime.h> -#include <qdebug.h> -#include <qcoreapplication.h> -#include <qset.h> -#include <qurl.h> -#include <qscriptcontextinfo.h> -#include <qscriptengine.h> -#include <qscriptvalueiterator.h> - -namespace QmlJSDebugger { - -enum JSDebuggerState -{ - NoState, - SteppingIntoState, - SteppingOverState, - SteppingOutState, - StoppedState -}; - -struct JSAgentWatchData -{ - QByteArray exp; - QByteArray name; - QByteArray value; - QByteArray type; - bool hasChildren; - quint64 objectId; -}; - -QDataStream &operator<<(QDataStream &s, const JSAgentWatchData &data) -{ - return s << data.exp << data.name << data.value - << data.type << data.hasChildren << data.objectId; -} - -struct JSAgentStackData -{ - QByteArray functionName; - QByteArray fileUrl; - qint32 lineNumber; -}; - -QDataStream &operator<<(QDataStream &s, const JSAgentStackData &data) -{ - return s << data.functionName << data.fileUrl << data.lineNumber; -} - -struct JSAgentBreakpointData -{ - QByteArray functionName; - QByteArray fileUrl; - qint32 lineNumber; -}; - -typedef QSet<JSAgentBreakpointData> JSAgentBreakpoints; - -QDataStream &operator<<(QDataStream &s, const JSAgentBreakpointData &data) -{ - return s << data.functionName << data.fileUrl << data.lineNumber; -} - -QDataStream &operator>>(QDataStream &s, JSAgentBreakpointData &data) -{ - return s >> data.functionName >> data.fileUrl >> data.lineNumber; -} - -bool operator==(const JSAgentBreakpointData &b1, const JSAgentBreakpointData &b2) -{ - return b1.lineNumber == b2.lineNumber && b1.fileUrl == b2.fileUrl; -} - -uint qHash(const JSAgentBreakpointData &b) -{ - return b.lineNumber ^ qHash(b.fileUrl); -} - -class JSDebuggerAgentPrivate -{ -public: - JSDebuggerAgentPrivate(JSDebuggerAgent *q) - : q(q), state(NoState) - {} - - void continueExec(); - void recordKnownObjects(const QList<JSAgentWatchData> &); - QList<JSAgentWatchData> getLocals(QScriptContext *); - void positionChange(qint64 scriptId, int lineNumber, int columnNumber); - QScriptEngine *engine() { return q->engine(); } - void stopped(); - void messageReceived(const QByteArray &message); - void sendMessage(const QByteArray &message) { q->sendMessage(message); } - -public: - JSDebuggerAgent *q; - JSDebuggerState state; - int stepDepth; - int stepCount; - - QEventLoop loop; - QHash<qint64, QString> filenames; - JSAgentBreakpoints breakpoints; - // breakpoints by filename (without path) - QHash<QString, JSAgentBreakpointData> fileNameToBreakpoints; - QStringList watchExpressions; - QSet<qint64> knownObjectIds; -}; - -class SetupExecEnv -{ -public: - SetupExecEnv(JSDebuggerAgentPrivate *a) - : agent(a), - previousState(a->state), - hadException(a->engine()->hasUncaughtException()) - { - agent->state = StoppedState; - } - - ~SetupExecEnv() - { - if (!hadException && agent->engine()->hasUncaughtException()) - agent->engine()->clearExceptions(); - agent->state = previousState; - } - -private: - JSDebuggerAgentPrivate *agent; - JSDebuggerState previousState; - bool hadException; -}; - -static JSAgentWatchData fromScriptValue(const QString &expression, - const QScriptValue &value) -{ - static const QString arrayStr = QCoreApplication::translate - ("Debugger::JSAgentWatchData", "[Array of length %1]"); - static const QString undefinedStr = QCoreApplication::translate - ("Debugger::JSAgentWatchData", "<undefined>"); - - JSAgentWatchData data; - data.exp = expression.toUtf8(); - data.name = data.exp; - data.hasChildren = false; - data.value = value.toString().toUtf8(); - data.objectId = value.objectId(); - if (value.isArray()) { - data.type = "Array"; - data.value = arrayStr.arg(value.property("length").toString()).toUtf8(); - data.hasChildren = true; - } else if (value.isBool()) { - data.type = "Bool"; - // data.value = value.toBool() ? "true" : "false"; - } else if (value.isDate()) { - data.type = "Date"; - data.value = value.toDateTime().toString().toUtf8(); - } else if (value.isError()) { - data.type = "Error"; - } else if (value.isFunction()) { - data.type = "Function"; - } else if (value.isUndefined()) { - data.type = undefinedStr.toUtf8(); - } else if (value.isNumber()) { - data.type = "Number"; - } else if (value.isRegExp()) { - data.type = "RegExp"; - } else if (value.isString()) { - data.type = "String"; - } else if (value.isVariant()) { - data.type = "Variant"; - } else if (value.isQObject()) { - const QObject *obj = value.toQObject(); - data.type = "Object"; - data.value += '['; - data.value += obj->metaObject()->className(); - data.value += ']'; - data.hasChildren = true; - } else if (value.isObject()) { - data.type = "Object"; - data.hasChildren = true; - data.value = "[Object]"; - } else if (value.isNull()) { - data.type = "<null>"; - } else { - data.type = "<unknown>"; - } - return data; -} - -static QList<JSAgentWatchData> expandObject(const QScriptValue &object) -{ - QList<JSAgentWatchData> result; - QScriptValueIterator it(object); - while (it.hasNext()) { - it.next(); - if (it.flags() & QScriptValue::SkipInEnumeration) - continue; - if (/*object.isQObject() &&*/ it.value().isFunction()) { - // Cosmetics: skip all functions and slot, there are too many of them, - // and it is not useful information in the debugger. - continue; - } - JSAgentWatchData data = fromScriptValue(it.name(), it.value()); - result.append(data); - } - if (result.isEmpty()) { - JSAgentWatchData data; - data.name = "<no initialized data>"; - data.hasChildren = false; - data.value = " "; - data.objectId = 0; - result.append(data); - } - return result; -} - -void JSDebuggerAgentPrivate::recordKnownObjects(const QList<JSAgentWatchData>& list) -{ - foreach (const JSAgentWatchData &data, list) - knownObjectIds << data.objectId; -} - -QList<JSAgentWatchData> JSDebuggerAgentPrivate::getLocals(QScriptContext *ctx) -{ - QList<JSAgentWatchData> locals; - if (ctx) { - QScriptValue activationObject = ctx->activationObject(); - QScriptValue thisObject = ctx->thisObject(); - locals = expandObject(activationObject); - if (thisObject.isObject() - && thisObject.objectId() != engine()->globalObject().objectId() - && QScriptValueIterator(thisObject).hasNext()) - locals.prepend(fromScriptValue("this", thisObject)); - recordKnownObjects(locals); - knownObjectIds << activationObject.objectId(); - } - return locals; -} - -/*! - Constructs a new agent for the given \a engine. The agent will - report debugging-related events (e.g. step completion) to the given - \a backend. -*/ -JSDebuggerAgent::JSDebuggerAgent(QScriptEngine *engine) - : QDeclarativeDebugService("JSDebugger") - , QScriptEngineAgent(engine) - , d(new JSDebuggerAgentPrivate(this)) -{ - if (status() == Enabled) - engine->setAgent(this); -} - -JSDebuggerAgent::JSDebuggerAgent(QDeclarativeEngine *engine) - : QDeclarativeDebugService("JSDebugger") - , QScriptEngineAgent(QDeclarativeDebugHelper::getScriptEngine(engine)) - , d(new JSDebuggerAgentPrivate(this)) -{ - if (status() == Enabled) - QDeclarativeDebugHelper::getScriptEngine(engine)->setAgent(this); -} - -/*! - Destroys this QScriptDebuggerAgent. -*/ -JSDebuggerAgent::~JSDebuggerAgent() -{ - delete d; -} - -/*! - \reimp -*/ -void JSDebuggerAgent::scriptLoad(qint64 id, const QString &program, - const QString &fileName, int) -{ - Q_UNUSED(program); - d->filenames.insert(id, fileName); -} - -/*! - \reimp -*/ -void JSDebuggerAgent::scriptUnload(qint64 id) -{ - d->filenames.remove(id); -} - -/*! - \reimp -*/ -void JSDebuggerAgent::contextPush() -{ -} - -/*! - \reimp -*/ -void JSDebuggerAgent::contextPop() -{ -} - -/*! - \reimp -*/ -void JSDebuggerAgent::functionEntry(qint64 scriptId) -{ - Q_UNUSED(scriptId); - d->stepDepth++; -} - -/*! - \reimp -*/ -void JSDebuggerAgent::functionExit(qint64 scriptId, const QScriptValue &returnValue) -{ - Q_UNUSED(scriptId); - Q_UNUSED(returnValue); - d->stepDepth--; -} - -/*! - \reimp -*/ -void JSDebuggerAgent::positionChange(qint64 scriptId, int lineNumber, int columnNumber) -{ - d->positionChange(scriptId, lineNumber, columnNumber); -} - -QString fileName(const QString &fileUrl) -{ - int lastDelimiterPos = fileUrl.lastIndexOf(QLatin1Char('/')); - return fileUrl.mid(lastDelimiterPos, fileUrl.size() - lastDelimiterPos); -} - -void JSDebuggerAgentPrivate::positionChange(qint64 scriptId, int lineNumber, int columnNumber) -{ - Q_UNUSED(columnNumber); - - if (state == StoppedState) - return; //no re-entrency - - // check breakpoints - if (!breakpoints.isEmpty()) { - QScriptContext *ctx = engine()->currentContext(); - QScriptContextInfo info(ctx); - - if (info.functionType() == QScriptContextInfo::ScriptFunction) { - QHash<qint64, QString>::const_iterator it = filenames.constFind(scriptId); - if (it == filenames.constEnd()) { - // It is possible that the scripts are loaded before the agent is attached - QString filename = info.fileName(); - - JSAgentStackData frame; - frame.functionName = info.functionName().toUtf8(); - it = filenames.insert(scriptId, filename); - } - - const QString filePath = it->toUtf8(); - JSAgentBreakpoints bps = fileNameToBreakpoints.values(fileName(filePath)).toSet(); - - foreach (const JSAgentBreakpointData &bp, bps) { - if (bp.lineNumber == lineNumber) { - stopped(); - return; - } - } - } - } - - switch (state) { - case NoState: - case StoppedState: - // Do nothing - break; - case SteppingOutState: - if (stepDepth >= 0) - break; - //fallthough - case SteppingOverState: - if (stepDepth > 0) - break; - //fallthough - case SteppingIntoState: - stopped(); - break; - } - -} - -/*! - \reimp -*/ -void JSDebuggerAgent::exceptionThrow(qint64 scriptId, - const QScriptValue &exception, - bool hasHandler) -{ - Q_UNUSED(scriptId); - Q_UNUSED(exception); - Q_UNUSED(hasHandler); -// qDebug() << Q_FUNC_INFO << exception.toString() << hasHandler; -#if 0 //sometimes, we get exceptions that we should just ignore. - if (!hasHandler && state != StoppedState) - stopped(true, exception); -#endif -} - -/*! - \reimp -*/ -void JSDebuggerAgent::exceptionCatch(qint64 scriptId, const QScriptValue &exception) -{ - Q_UNUSED(scriptId); - Q_UNUSED(exception); -} - -bool JSDebuggerAgent::supportsExtension(Extension extension) const -{ - return extension == QScriptEngineAgent::DebuggerInvocationRequest; -} - -QVariant JSDebuggerAgent::extension(Extension extension, const QVariant &argument) -{ - if (extension == QScriptEngineAgent::DebuggerInvocationRequest) { - d->stopped(); - return QVariant(); - } - return QScriptEngineAgent::extension(extension, argument); -} - -void JSDebuggerAgent::messageReceived(const QByteArray &message) -{ - d->messageReceived(message); -} - -void JSDebuggerAgentPrivate::messageReceived(const QByteArray &message) -{ - QDataStream ds(message); - QByteArray command; - ds >> command; - if (command == "BREAKPOINTS") { - ds >> breakpoints; - - fileNameToBreakpoints.clear(); - foreach (const JSAgentBreakpointData &bp, breakpoints) { - fileNameToBreakpoints.insertMulti(fileName(bp.fileUrl), bp); - } - - //qDebug() << "BREAKPOINTS"; - //foreach (const JSAgentBreakpointData &bp, breakpoints) - // qDebug() << "BREAKPOINT: " << bp.fileName << bp.lineNumber; - } else if (command == "WATCH_EXPRESSIONS") { - ds >> watchExpressions; - } else if (command == "STEPOVER") { - stepDepth = 0; - state = SteppingOverState; - continueExec(); - } else if (command == "STEPINTO" || command == "INTERRUPT") { - stepDepth = 0; - state = SteppingIntoState; - continueExec(); - } else if (command == "STEPOUT") { - stepDepth = 0; - state = SteppingOutState; - continueExec(); - } else if (command == "CONTINUE") { - state = NoState; - continueExec(); - } else if (command == "EXEC") { - SetupExecEnv execEnv(this); - - QByteArray id; - QString expr; - ds >> id >> expr; - - JSAgentWatchData data = fromScriptValue(expr, engine()->evaluate(expr)); - knownObjectIds << data.objectId; - - QByteArray reply; - QDataStream rs(&reply, QIODevice::WriteOnly); - rs << QByteArray("RESULT") << id << data; - sendMessage(reply); - } else if (command == "EXPAND") { - SetupExecEnv execEnv(this); - - QByteArray requestId; - quint64 objectId; - ds >> requestId >> objectId; - QScriptValue v; - if (knownObjectIds.contains(objectId)) - v = engine()->objectById(objectId); - - QList<JSAgentWatchData> result = expandObject(v); - recordKnownObjects(result); - - QByteArray reply; - QDataStream rs(&reply, QIODevice::WriteOnly); - rs << QByteArray("EXPANDED") << requestId << result; - sendMessage(reply); - - } else if (command == "ACTIVATE_FRAME") { - SetupExecEnv execEnv(this); - - int frameId; - ds >> frameId; - - int deep = 0; - QScriptContext *ctx = engine()->currentContext(); - while (ctx && deep < frameId) { - ctx = ctx->parentContext(); - deep++; - } - - QList<JSAgentWatchData> watches; - QList<JSAgentWatchData> locals = getLocals(ctx); - - // re-evaluate watches given the frame's context - QScriptContext *currentCtx = engine()->pushContext(); - currentCtx->setActivationObject(ctx->activationObject()); - currentCtx->setThisObject(ctx->thisObject()); - foreach (const QString &expr, watchExpressions) - watches << fromScriptValue(expr, engine()->evaluate(expr)); - recordKnownObjects(watches); - engine()->popContext(); - - QByteArray reply; - QDataStream rs(&reply, QIODevice::WriteOnly); - rs << QByteArray("LOCALS") << frameId << locals << watches; - sendMessage(reply); - } else if (command == "SET_PROPERTY") { - SetupExecEnv execEnv(this); - - QByteArray id; - qint64 objectId; - QString property; - QString value; - ds >> id >> objectId >> property >> value; - - if (knownObjectIds.contains(objectId)) { - QScriptValue object; - object = engine()->objectById(objectId); - - if (object.isObject()) { - QScriptValue result = engine()->evaluate(value); - object.setProperty(property, result); - } - } - - //TODO: feedback - } else if (command == "PING") { - int ping; - ds >> ping; - QByteArray reply; - QDataStream rs(&reply, QIODevice::WriteOnly); - rs << QByteArray("PONG") << ping; - sendMessage(reply); - } else { - qDebug() << Q_FUNC_INFO << "Unknown command" << command; - } - - q->baseMessageReceived(message); -} - -void JSDebuggerAgentPrivate::stopped() -{ - bool becauseOfException = false; - const QScriptValue &exception = QScriptValue(); - - knownObjectIds.clear(); - state = StoppedState; - QList<JSAgentStackData> backtrace; - - for (QScriptContext* ctx = engine()->currentContext(); ctx; ctx = ctx->parentContext()) { - QScriptContextInfo info(ctx); - - JSAgentStackData frame; - frame.functionName = info.functionName().toUtf8(); - if (frame.functionName.isEmpty()) { - if (ctx->parentContext()) { - switch (info.functionType()) { - case QScriptContextInfo::ScriptFunction: - frame.functionName = "<anonymous>"; - break; - case QScriptContextInfo::NativeFunction: - frame.functionName = "<native>"; - break; - case QScriptContextInfo::QtFunction: - case QScriptContextInfo::QtPropertyFunction: - frame.functionName = "<native slot>"; - break; - } - } else { - frame.functionName = "<global>"; - } - } - frame.lineNumber = info.lineNumber(); - // if the line number is unknown, fallback to the function line number - if (frame.lineNumber == -1) - frame.lineNumber = info.functionStartLineNumber(); - - frame.fileUrl = info.fileName().toUtf8(); - backtrace.append(frame); - } - QList<JSAgentWatchData> watches; - foreach (const QString &expr, watchExpressions) - watches << fromScriptValue(expr, engine()->evaluate(expr)); - recordKnownObjects(watches); - - QList<JSAgentWatchData> locals = getLocals(engine()->currentContext()); - - if (!becauseOfException) { - // Clear any exceptions occurred during locals evaluation. - engine()->clearExceptions(); - } - - QByteArray reply; - QDataStream rs(&reply, QIODevice::WriteOnly); - rs << QByteArray("STOPPED") << backtrace << watches << locals - << becauseOfException << exception.toString(); - sendMessage(reply); - - loop.exec(QEventLoop::ExcludeUserInputEvents); -} - -void JSDebuggerAgentPrivate::continueExec() -{ - loop.quit(); -} - -void JSDebuggerAgent::statusChanged(Status status) -{ - engine()->setAgent((status == QDeclarativeDebugService::Enabled) ? this : 0); -} - -void JSDebuggerAgent::baseMessageReceived(const QByteArray &message) -{ - QDeclarativeDebugService::messageReceived(message); -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/protocol/inspectorprotocol.h b/share/qtcreator/qml/qmljsdebugger/protocol/inspectorprotocol.h deleted file mode 100644 index 34109161723..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/protocol/inspectorprotocol.h +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef INSPECTORPROTOCOL_H -#define INSPECTORPROTOCOL_H - -#include <QDebug> -#include <QMetaType> -#include <QMetaEnum> -#include <QObject> - -namespace QmlJSDebugger { - -class InspectorProtocol : public QObject -{ - Q_OBJECT - Q_ENUMS(Message Tool) - -public: - enum Message { - AnimationSpeedChanged = 0, - AnimationPausedChanged = 19, // highest value - ChangeTool = 1, - ClearComponentCache = 2, - ColorChanged = 3, - CreateObject = 5, - CurrentObjectsChanged = 6, - DestroyObject = 7, - MoveObject = 8, - ObjectIdList = 9, - Reload = 10, - Reloaded = 11, - SetAnimationSpeed = 12, - SetAnimationPaused = 18, - SetCurrentObjects = 14, - SetDesignMode = 15, - ShowAppOnTop = 16, - ToolChanged = 17 - }; - - enum Tool { - ColorPickerTool, - SelectMarqueeTool, - SelectTool, - ZoomTool - }; - - static inline QString toString(Message message) - { - return staticMetaObject.enumerator(0).valueToKey(message); - } - - static inline QString toString(Tool tool) - { - return staticMetaObject.enumerator(1).valueToKey(tool); - } -}; - -inline QDataStream & operator<< (QDataStream &stream, InspectorProtocol::Message message) -{ - return stream << static_cast<quint32>(message); -} - -inline QDataStream & operator>> (QDataStream &stream, InspectorProtocol::Message &message) -{ - quint32 i; - stream >> i; - message = static_cast<InspectorProtocol::Message>(i); - return stream; -} - -inline QDebug operator<< (QDebug dbg, InspectorProtocol::Message message) -{ - dbg << InspectorProtocol::toString(message); - return dbg; -} - -inline QDataStream & operator<< (QDataStream &stream, InspectorProtocol::Tool tool) -{ - return stream << static_cast<quint32>(tool); -} - -inline QDataStream & operator>> (QDataStream &stream, InspectorProtocol::Tool &tool) -{ - quint32 i; - stream >> i; - tool = static_cast<InspectorProtocol::Tool>(i); - return stream; -} - -inline QDebug operator<< (QDebug dbg, InspectorProtocol::Tool tool) -{ - dbg << InspectorProtocol::toString(tool); - return dbg; -} - -} // namespace QmlJSDebugger - -#endif // INSPECTORPROTOCOL_H diff --git a/share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri b/share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri deleted file mode 100644 index dfb18fb864f..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri +++ /dev/null @@ -1,3 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD -HEADERS += $$PWD/inspectorprotocol.h diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeinspectorservice.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeinspectorservice.cpp deleted file mode 100644 index 947c80fdb4e..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeinspectorservice.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "qdeclarativeinspectorservice.h" - -#include <inspectorprotocol.h> - -#include <QStringList> -#include <QColor> - -namespace QmlJSDebugger { - -Q_GLOBAL_STATIC(QDeclarativeInspectorService, serviceInstance) - -QDeclarativeInspectorService::QDeclarativeInspectorService() - : QDeclarativeDebugService(QLatin1String("QDeclarativeObserverMode")) -{ -} - -QDeclarativeInspectorService *QDeclarativeInspectorService::instance() -{ - return serviceInstance(); -} - -void QDeclarativeInspectorService::statusChanged(Status status) -{ - emit debuggingClientChanged((status == Enabled)); -} - -void QDeclarativeInspectorService::messageReceived(const QByteArray &message) -{ - QDataStream ds(message); - - InspectorProtocol::Message type; - ds >> type; - - switch (type) { - case InspectorProtocol::SetCurrentObjects: { - int itemCount = 0; - ds >> itemCount; - - QList<QObject*> selectedObjects; - for (int i = 0; i < itemCount; ++i) { - int debugId = -1; - ds >> debugId; - if (QObject *obj = objectForId(debugId)) - selectedObjects << obj; - } - - emit currentObjectsChanged(selectedObjects); - break; - } - case InspectorProtocol::Reload: { - emit reloadRequested(); - break; - } - case InspectorProtocol::SetAnimationSpeed: { - qreal speed; - ds >> speed; - emit animationSpeedChangeRequested(speed); - break; - } - case InspectorProtocol::SetAnimationPaused: { - bool paused; - ds >> paused; - emit executionPauseChangeRequested(paused); - break; - } - case InspectorProtocol::ChangeTool: { - InspectorProtocol::Tool tool; - ds >> tool; - switch (tool) { - case InspectorProtocol::ColorPickerTool: - emit colorPickerToolRequested(); - break; - case InspectorProtocol::SelectTool: - emit selectToolRequested(); - break; - case InspectorProtocol::SelectMarqueeTool: - emit selectMarqueeToolRequested(); - break; - case InspectorProtocol::ZoomTool: - emit zoomToolRequested(); - break; - default: - qWarning() << "Warning: Unhandled tool:" << tool; - } - break; - } - case InspectorProtocol::SetDesignMode: { - bool inDesignMode; - ds >> inDesignMode; - emit designModeBehaviorChanged(inDesignMode); - break; - } - case InspectorProtocol::ShowAppOnTop: { - bool showOnTop; - ds >> showOnTop; - emit showAppOnTopChanged(showOnTop); - break; - } - case InspectorProtocol::CreateObject: { - QString qml; - int parentId; - QString filename; - QStringList imports; - ds >> qml >> parentId >> imports >> filename; - int order = -1; - if (!ds.atEnd()) { - ds >> order; - } - emit objectCreationRequested(qml, objectForId(parentId), imports, filename, order); - break; - } - case InspectorProtocol::DestroyObject: { - int debugId; - ds >> debugId; - if (QObject* obj = objectForId(debugId)) { - emit objectDeletionRequested(obj); - } - break; - } - case InspectorProtocol::MoveObject: { - int debugId, newParent; - ds >> debugId >> newParent; - emit objectReparentRequested(objectForId(debugId), objectForId(newParent)); - break; - } - case InspectorProtocol::ObjectIdList: { - int itemCount; - ds >> itemCount; - m_stringIdForObjectId.clear(); - for (int i = 0; i < itemCount; ++i) { - int itemDebugId; - QString itemIdString; - ds >> itemDebugId - >> itemIdString; - - m_stringIdForObjectId.insert(itemDebugId, itemIdString); - } - break; - } - case InspectorProtocol::ClearComponentCache: { - emit clearComponentCacheRequested(); - break; - } - default: - qWarning() << "Warning: Not handling message:" << type; - } -} - -void QDeclarativeInspectorService::setDesignModeBehavior(bool inDesignMode) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::SetDesignMode - << inDesignMode; - - sendMessage(message); -} - -void QDeclarativeInspectorService::setCurrentObjects(QList<QObject*> objects) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::CurrentObjectsChanged - << objects.length(); - - foreach (QObject *object, objects) { - int id = idForObject(object); - ds << id; - } - - sendMessage(message); -} - -void QDeclarativeInspectorService::setCurrentTool(QmlJSDebugger::Constants::DesignTool toolId) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::ToolChanged - << toolId; - - sendMessage(message); -} - -void QDeclarativeInspectorService::setAnimationSpeed(qreal slowDownFactor) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::AnimationSpeedChanged - << slowDownFactor; - - sendMessage(message); -} - -void QDeclarativeInspectorService::setAnimationPaused(bool paused) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::AnimationPausedChanged - << paused; - - sendMessage(message); -} - -void QDeclarativeInspectorService::reloaded() -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::Reloaded; - - sendMessage(message); -} - -void QDeclarativeInspectorService::setShowAppOnTop(bool showAppOnTop) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::ShowAppOnTop << showAppOnTop; - - sendMessage(message); -} - -void QDeclarativeInspectorService::selectedColorChanged(const QColor &color) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << InspectorProtocol::ColorChanged - << color; - - sendMessage(message); -} - -QString QDeclarativeInspectorService::idStringForObject(QObject *obj) const -{ - int id = idForObject(obj); - QString idString = m_stringIdForObjectId.value(id, QString()); - return idString; -} - -void QDeclarativeInspectorService::sendMessage(const QByteArray &message) -{ - if (status() != Enabled) - return; - - QDeclarativeDebugService::sendMessage(message); -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector.cpp deleted file mode 100644 index 6b944bfd6fd..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector.cpp +++ /dev/null @@ -1,835 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "qdeclarativeviewinspector.h" -#include "qdeclarativeviewinspector_p.h" -#include "qdeclarativeinspectorservice.h" -#include "editor/liveselectiontool.h" -#include "editor/zoomtool.h" -#include "editor/colorpickertool.h" -#include "editor/livelayeritem.h" -#include "editor/boundingrecthighlighter.h" - -#include "qt_private/qdeclarativedebughelper_p.h" - -#include <QDeclarativeItem> -#include <QDeclarativeEngine> -#include <QDeclarativeContext> -#include <QDeclarativeExpression> -#include <QWidget> -#include <QVBoxLayout> -#include <QMouseEvent> -#include <QGraphicsObject> -#include <QApplication> - -#include "qt_private/qdeclarativestate_p.h" - -namespace QmlJSDebugger { - -QDeclarativeViewInspectorPrivate::QDeclarativeViewInspectorPrivate(QDeclarativeViewInspector *q) : - q(q), - designModeBehavior(false), - showAppOnTop(false), - animationPaused(false), - slowDownFactor(1.0f) -{ -} - -QDeclarativeViewInspectorPrivate::~QDeclarativeViewInspectorPrivate() -{ -} - -QDeclarativeViewInspector::QDeclarativeViewInspector(QDeclarativeView *view, QObject *parent) : - QObject(parent), data(new QDeclarativeViewInspectorPrivate(this)) -{ - data->view = view; - data->manipulatorLayer = new LiveLayerItem(view->scene()); - data->selectionTool = new LiveSelectionTool(this); - data->zoomTool = new ZoomTool(this); - data->colorPickerTool = new ColorPickerTool(this); - data->boundingRectHighlighter = new BoundingRectHighlighter(this); - data->currentTool = data->selectionTool; - - // to capture ChildRemoved event when viewport changes - data->view->installEventFilter(this); - - data->setViewport(data->view->viewport()); - - data->debugService = QDeclarativeInspectorService::instance(); - - connect(data->debugService, SIGNAL(designModeBehaviorChanged(bool)), - SLOT(setDesignModeBehavior(bool))); - connect(data->debugService, SIGNAL(showAppOnTopChanged(bool)), - SLOT(setShowAppOnTop(bool))); - connect(data->debugService, SIGNAL(reloadRequested()), data.data(), SLOT(_q_reloadView())); - connect(data->debugService, SIGNAL(currentObjectsChanged(QList<QObject*>)), - data.data(), SLOT(_q_onCurrentObjectsChanged(QList<QObject*>))); - connect(data->debugService, SIGNAL(animationSpeedChangeRequested(qreal)), - SLOT(animationSpeedChangeRequested(qreal))); - connect(data->debugService, SIGNAL(executionPauseChangeRequested(bool)), - SLOT(animationPausedChangeRequested(bool))); - connect(data->debugService, SIGNAL(colorPickerToolRequested()), - data.data(), SLOT(_q_changeToColorPickerTool())); - connect(data->debugService, SIGNAL(selectMarqueeToolRequested()), - data.data(), SLOT(_q_changeToMarqueeSelectTool())); - connect(data->debugService, SIGNAL(selectToolRequested()), data.data(), SLOT(_q_changeToSingleSelectTool())); - connect(data->debugService, SIGNAL(zoomToolRequested()), data.data(), SLOT(_q_changeToZoomTool())); - connect(data->debugService, - SIGNAL(objectCreationRequested(QString,QObject*,QStringList,QString,int)), - data.data(), SLOT(_q_createQmlObject(QString,QObject*,QStringList,QString,int))); - connect(data->debugService, - SIGNAL(objectDeletionRequested(QObject*)), data.data(), SLOT(_q_deleteQmlObject(QObject*))); - connect(data->debugService, - SIGNAL(objectReparentRequested(QObject*,QObject*)), - data.data(), SLOT(_q_reparentQmlObject(QObject*,QObject*))); - connect(data->debugService, SIGNAL(clearComponentCacheRequested()), - data.data(), SLOT(_q_clearComponentCache())); - connect(data->view, SIGNAL(statusChanged(QDeclarativeView::Status)), - data.data(), SLOT(_q_onStatusChanged(QDeclarativeView::Status))); - - connect(data->colorPickerTool, SIGNAL(selectedColorChanged(QColor)), - SIGNAL(selectedColorChanged(QColor))); - connect(data->colorPickerTool, SIGNAL(selectedColorChanged(QColor)), - data->debugService, SLOT(selectedColorChanged(QColor))); - - data->_q_changeToSingleSelectTool(); -} - -QDeclarativeViewInspector::~QDeclarativeViewInspector() -{ -} - -void QDeclarativeViewInspectorPrivate::_q_reloadView() -{ - clearHighlight(); - emit q->reloadRequested(); -} - -void QDeclarativeViewInspectorPrivate::setViewport(QWidget *widget) -{ - if (viewport.data() == widget) - return; - - if (viewport) - viewport.data()->removeEventFilter(q); - - viewport = widget; - if (viewport) { - // make sure we get mouse move events - viewport.data()->setMouseTracking(true); - viewport.data()->installEventFilter(q); - } -} - -void QDeclarativeViewInspectorPrivate::clearEditorItems() -{ - clearHighlight(); - setSelectedItems(QList<QGraphicsItem*>()); -} - -bool QDeclarativeViewInspector::eventFilter(QObject *obj, QEvent *event) -{ - if (obj == data->view) { - // Event from view - if (event->type() == QEvent::ChildRemoved) { - // Might mean that viewport has changed - if (data->view->viewport() != data->viewport.data()) - data->setViewport(data->view->viewport()); - } - return QObject::eventFilter(obj, event); - } - - // Event from viewport - switch (event->type()) { - case QEvent::Leave: { - if (leaveEvent(event)) - return true; - break; - } - case QEvent::MouseButtonPress: { - if (mousePressEvent(static_cast<QMouseEvent*>(event))) - return true; - break; - } - case QEvent::MouseMove: { - if (mouseMoveEvent(static_cast<QMouseEvent*>(event))) - return true; - break; - } - case QEvent::MouseButtonRelease: { - if (mouseReleaseEvent(static_cast<QMouseEvent*>(event))) - return true; - break; - } - case QEvent::KeyPress: { - if (keyPressEvent(static_cast<QKeyEvent*>(event))) - return true; - break; - } - case QEvent::KeyRelease: { - if (keyReleaseEvent(static_cast<QKeyEvent*>(event))) - return true; - break; - } - case QEvent::MouseButtonDblClick: { - if (mouseDoubleClickEvent(static_cast<QMouseEvent*>(event))) - return true; - break; - } - case QEvent::Wheel: { - if (wheelEvent(static_cast<QWheelEvent*>(event))) - return true; - break; - } - default: { - break; - } - } //switch - - // standard event processing - return QObject::eventFilter(obj, event); -} - -bool QDeclarativeViewInspector::leaveEvent(QEvent * /*event*/) -{ - if (!data->designModeBehavior) - return false; - data->clearHighlight(); - return true; -} - -bool QDeclarativeViewInspector::mousePressEvent(QMouseEvent *event) -{ - if (!data->designModeBehavior) - return false; - data->cursorPos = event->pos(); - data->currentTool->mousePressEvent(event); - return true; -} - -bool QDeclarativeViewInspector::mouseMoveEvent(QMouseEvent *event) -{ - if (!data->designModeBehavior) { - data->clearEditorItems(); - return false; - } - data->cursorPos = event->pos(); - - QList<QGraphicsItem*> selItems = data->selectableItems(event->pos()); - if (!selItems.isEmpty()) { - declarativeView()->setToolTip(AbstractLiveEditTool::titleForItem(selItems.first())); - } else { - declarativeView()->setToolTip(QString()); - } - if (event->buttons()) { - data->currentTool->mouseMoveEvent(event); - } else { - data->currentTool->hoverMoveEvent(event); - } - return true; -} - -bool QDeclarativeViewInspector::mouseReleaseEvent(QMouseEvent *event) -{ - if (!data->designModeBehavior) - return false; - - data->cursorPos = event->pos(); - data->currentTool->mouseReleaseEvent(event); - return true; -} - -bool QDeclarativeViewInspector::keyPressEvent(QKeyEvent *event) -{ - if (!data->designModeBehavior) - return false; - - data->currentTool->keyPressEvent(event); - return true; -} - -bool QDeclarativeViewInspector::keyReleaseEvent(QKeyEvent *event) -{ - if (!data->designModeBehavior) - return false; - - switch(event->key()) { - case Qt::Key_V: - data->_q_changeToSingleSelectTool(); - break; -// disabled because multiselection does not do anything useful without design mode -// case Qt::Key_M: -// data->_q_changeToMarqueeSelectTool(); -// break; - case Qt::Key_I: - data->_q_changeToColorPickerTool(); - break; - case Qt::Key_Z: - data->_q_changeToZoomTool(); - break; - case Qt::Key_Space: - setAnimationPaused(!data->animationPaused); - break; - default: - break; - } - - data->currentTool->keyReleaseEvent(event); - return true; -} - -bool insertObjectInListProperty(QDeclarativeListReference &fromList, int position, QObject *object) -{ - QList<QObject *> tmpList; - int i; - - if (!(fromList.canCount() && fromList.canAt() && fromList.canAppend() && fromList.canClear())) - return false; - - if (position == fromList.count()) { - fromList.append(object); - return true; - } - - for (i=0; i<fromList.count(); ++i) - tmpList << fromList.at(i); - - fromList.clear(); - for (i=0; i<position; ++i) - fromList.append(tmpList.at(i)); - - fromList.append(object); - for (; i<tmpList.count(); ++i) - fromList.append(tmpList.at(i)); - - return true; -} - -bool removeObjectFromListProperty(QDeclarativeListReference &fromList, QObject *object) -{ - QList<QObject *> tmpList; - int i; - - if (!(fromList.canCount() && fromList.canAt() && fromList.canAppend() && fromList.canClear())) - return false; - - for (i=0; i<fromList.count(); ++i) - if (object != fromList.at(i)) - tmpList << fromList.at(i); - - fromList.clear(); - - foreach (QObject *item, tmpList) - fromList.append(item); - - return true; -} - -void QDeclarativeViewInspectorPrivate::_q_createQmlObject(const QString &qml, QObject *parent, - const QStringList &importList, - const QString &filename, int order) -{ - if (!parent) - return; - - QString imports; - foreach (const QString &s, importList) { - imports += s; - imports += QLatin1Char('\n'); - } - - QDeclarativeContext *parentContext = view->engine()->contextForObject(parent); - QDeclarativeComponent component(view->engine(), q); - QByteArray constructedQml = QString(imports + qml).toLatin1(); - - component.setData(constructedQml, filename); - QObject *newObject = component.create(parentContext); - if (newObject) { - newObject->setParent(parent); - do { - // add child item - QDeclarativeItem *parentItem = qobject_cast<QDeclarativeItem*>(parent); - QDeclarativeItem *newItem = qobject_cast<QDeclarativeItem*>(newObject); - if (parentItem && newItem) { - newItem->setParentItem(parentItem); - break; - } - - // add property change - QDeclarativeState *parentState = qobject_cast<QDeclarativeState*>(parent); - QDeclarativeStateOperation *newPropertyChanges = qobject_cast<QDeclarativeStateOperation *>(newObject); - if (parentState && newPropertyChanges) { - (*parentState) << newPropertyChanges; - break; - } - - // add states - QDeclarativeState *newState = qobject_cast<QDeclarativeState*>(newObject); - if (parentItem && newState) { - QDeclarativeListReference statesList(parentItem, "states"); - statesList.append(newObject); - break; - } - - // add animation to transition - if (parent->inherits("QDeclarativeTransition") && - newObject->inherits("QDeclarativeAbstractAnimation")) { - QDeclarativeListReference animationsList(parent, "animations"); - animationsList.append(newObject); - break; - } - - // add animation to animation - if (parent->inherits("QDeclarativeAnimationGroup") && - newObject->inherits("QDeclarativeAbstractAnimation")) { - QDeclarativeListReference animationsList(parent, "animations"); - if (order==-1) { - animationsList.append(newObject); - } else { - if (!insertObjectInListProperty(animationsList, order, newObject)) { - animationsList.append(newObject); - } - } - break; - } - - // add transition - if (parentItem && newObject->inherits("QDeclarativeTransition")) { - QDeclarativeListReference transitionsList(parentItem,"transitions"); - if (transitionsList.count() == 1 && transitionsList.at(0) == 0) { - transitionsList.clear(); - } - transitionsList.append(newObject); - break; - } - - } while (false); - } -} - -void QDeclarativeViewInspectorPrivate::_q_reparentQmlObject(QObject *object, QObject *newParent) -{ - if (!newParent) - return; - - object->setParent(newParent); - QDeclarativeItem *newParentItem = qobject_cast<QDeclarativeItem*>(newParent); - QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(object); - if (newParentItem && item) - item->setParentItem(newParentItem); -} - -void QDeclarativeViewInspectorPrivate::_q_deleteQmlObject(QObject *object) -{ - // special cases for transitions/animations - if (object->inherits("QDeclarativeAbstractAnimation")) { - if (object->parent()) { - QDeclarativeListReference animationsList(object->parent(), "animations"); - if (removeObjectFromListProperty(animationsList, object)) - object->deleteLater(); - return; - } - } - - if (object->inherits("QDeclarativeTransition")) { - QDeclarativeListReference transitionsList(object->parent(), "transitions"); - if (removeObjectFromListProperty(transitionsList, object)) - object->deleteLater(); - return; - } -} - -void QDeclarativeViewInspectorPrivate::_q_clearComponentCache() -{ - view->engine()->clearComponentCache(); -} - -void QDeclarativeViewInspectorPrivate::_q_removeFromSelection(QObject *obj) -{ - QList<QGraphicsItem*> items = selectedItems(); - if (QGraphicsItem *item = qobject_cast<QGraphicsObject*>(obj)) - items.removeOne(item); - setSelectedItems(items); -} - -bool QDeclarativeViewInspector::mouseDoubleClickEvent(QMouseEvent * /*event*/) -{ - if (!data->designModeBehavior) - return false; - - return true; -} - -bool QDeclarativeViewInspector::wheelEvent(QWheelEvent *event) -{ - if (!data->designModeBehavior) - return false; - data->currentTool->wheelEvent(event); - return true; -} - -void QDeclarativeViewInspector::setDesignModeBehavior(bool value) -{ - emit designModeBehaviorChanged(value); - - data->debugService->setDesignModeBehavior(value); - - data->designModeBehavior = value; - - if (!data->designModeBehavior) - data->clearEditorItems(); -} - -bool QDeclarativeViewInspector::designModeBehavior() -{ - return data->designModeBehavior; -} - -bool QDeclarativeViewInspector::showAppOnTop() const -{ - return data->showAppOnTop; -} - -void QDeclarativeViewInspector::setShowAppOnTop(bool appOnTop) -{ - if (data->view) { - QWidget *window = data->view->window(); - Qt::WindowFlags flags = window->windowFlags(); - if (appOnTop) - flags |= Qt::WindowStaysOnTopHint; - else - flags &= ~Qt::WindowStaysOnTopHint; - - window->setWindowFlags(flags); - window->show(); - } - - data->showAppOnTop = appOnTop; - data->debugService->setShowAppOnTop(appOnTop); - - emit showAppOnTopChanged(appOnTop); -} - -void QDeclarativeViewInspectorPrivate::changeTool(Constants::DesignTool tool, - Constants::ToolFlags /*flags*/) -{ - switch(tool) { - case Constants::SelectionToolMode: - _q_changeToSingleSelectTool(); - break; - case Constants::NoTool: - default: - currentTool = 0; - break; - } -} - -void QDeclarativeViewInspectorPrivate::setSelectedItemsForTools(QList<QGraphicsItem *> items) -{ - foreach (const QWeakPointer<QGraphicsObject> &obj, currentSelection) { - if (QGraphicsItem *item = obj.data()) { - if (!items.contains(item)) { - QObject::disconnect(obj.data(), SIGNAL(destroyed(QObject*)), - this, SLOT(_q_removeFromSelection(QObject*))); - currentSelection.removeOne(obj); - } - } - } - - foreach (QGraphicsItem *item, items) { - if (QGraphicsObject *obj = item->toGraphicsObject()) { - if (!currentSelection.contains(obj)) { - QObject::connect(obj, SIGNAL(destroyed(QObject*)), - this, SLOT(_q_removeFromSelection(QObject*))); - currentSelection.append(obj); - } - } - } - - currentTool->updateSelectedItems(); -} - -void QDeclarativeViewInspectorPrivate::setSelectedItems(QList<QGraphicsItem *> items) -{ - QList<QWeakPointer<QGraphicsObject> > oldList = currentSelection; - setSelectedItemsForTools(items); - if (oldList != currentSelection) { - QList<QObject*> objectList; - foreach (const QWeakPointer<QGraphicsObject> &graphicsObject, currentSelection) { - if (graphicsObject) - objectList << graphicsObject.data(); - } - - debugService->setCurrentObjects(objectList); - } -} - -QList<QGraphicsItem *> QDeclarativeViewInspectorPrivate::selectedItems() -{ - QList<QGraphicsItem *> selection; - foreach (const QWeakPointer<QGraphicsObject> &selectedObject, currentSelection) { - if (selectedObject.data()) - selection << selectedObject.data(); - } - - return selection; -} - -void QDeclarativeViewInspector::setSelectedItems(QList<QGraphicsItem *> items) -{ - data->setSelectedItems(items); -} - -QList<QGraphicsItem *> QDeclarativeViewInspector::selectedItems() -{ - return data->selectedItems(); -} - -QDeclarativeView *QDeclarativeViewInspector::declarativeView() -{ - return data->view; -} - -void QDeclarativeViewInspectorPrivate::clearHighlight() -{ - boundingRectHighlighter->clear(); -} - -void QDeclarativeViewInspectorPrivate::highlight(const QList<QGraphicsObject *> &items) -{ - if (items.isEmpty()) - return; - - QList<QGraphicsObject*> objectList; - foreach (QGraphicsItem *item, items) { - QGraphicsItem *child = item; - - if (child) { - QGraphicsObject *childObject = child->toGraphicsObject(); - if (childObject) - objectList << childObject; - } - } - - boundingRectHighlighter->highlight(objectList); -} - -QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::selectableItems( - const QPointF &scenePos) const -{ - QList<QGraphicsItem*> itemlist = view->scene()->items(scenePos); - return filterForSelection(itemlist); -} - -QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::selectableItems(const QPoint &pos) const -{ - QList<QGraphicsItem*> itemlist = view->items(pos); - return filterForSelection(itemlist); -} - -QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::selectableItems( - const QRectF &sceneRect, Qt::ItemSelectionMode selectionMode) const -{ - QList<QGraphicsItem*> itemlist = view->scene()->items(sceneRect, selectionMode); - return filterForSelection(itemlist); -} - -void QDeclarativeViewInspectorPrivate::_q_changeToSingleSelectTool() -{ - currentToolMode = Constants::SelectionToolMode; - selectionTool->setRubberbandSelectionMode(false); - - changeToSelectTool(); - - emit q->selectToolActivated(); - debugService->setCurrentTool(Constants::SelectionToolMode); -} - -void QDeclarativeViewInspectorPrivate::changeToSelectTool() -{ - if (currentTool == selectionTool) - return; - - currentTool->clear(); - currentTool = selectionTool; - currentTool->clear(); - currentTool->updateSelectedItems(); -} - -void QDeclarativeViewInspectorPrivate::_q_changeToMarqueeSelectTool() -{ - changeToSelectTool(); - currentToolMode = Constants::MarqueeSelectionToolMode; - selectionTool->setRubberbandSelectionMode(true); - - emit q->marqueeSelectToolActivated(); - debugService->setCurrentTool(Constants::MarqueeSelectionToolMode); -} - -void QDeclarativeViewInspectorPrivate::_q_changeToZoomTool() -{ - currentToolMode = Constants::ZoomMode; - currentTool->clear(); - currentTool = zoomTool; - currentTool->clear(); - - emit q->zoomToolActivated(); - debugService->setCurrentTool(Constants::ZoomMode); -} - -void QDeclarativeViewInspectorPrivate::_q_changeToColorPickerTool() -{ - if (currentTool == colorPickerTool) - return; - - currentToolMode = Constants::ColorPickerMode; - currentTool->clear(); - currentTool = colorPickerTool; - currentTool->clear(); - - emit q->colorPickerActivated(); - debugService->setCurrentTool(Constants::ColorPickerMode); -} - -void QDeclarativeViewInspector::setAnimationSpeed(qreal slowDownFactor) -{ - Q_ASSERT(slowDownFactor > 0); - if (data->slowDownFactor == slowDownFactor) - return; - - animationSpeedChangeRequested(slowDownFactor); - data->debugService->setAnimationSpeed(slowDownFactor); -} - -void QDeclarativeViewInspector::setAnimationPaused(bool paused) -{ - if (data->animationPaused == paused) - return; - - animationPausedChangeRequested(paused); - data->debugService->setAnimationPaused(paused); -} - -void QDeclarativeViewInspector::animationSpeedChangeRequested(qreal factor) -{ - if (data->slowDownFactor != factor) { - data->slowDownFactor = factor; - emit animationSpeedChanged(factor); - } - - const float effectiveFactor = data->animationPaused ? 0 : factor; - QDeclarativeDebugHelper::setAnimationSlowDownFactor(effectiveFactor); -} - -void QDeclarativeViewInspector::animationPausedChangeRequested(bool paused) -{ - if (data->animationPaused != paused) { - data->animationPaused = paused; - emit animationPausedChanged(paused); - } - - const float effectiveFactor = paused ? 0 : data->slowDownFactor; - QDeclarativeDebugHelper::setAnimationSlowDownFactor(effectiveFactor); -} - - -void QDeclarativeViewInspectorPrivate::_q_applyChangesFromClient() -{ -} - - -QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::filterForSelection( - QList<QGraphicsItem*> &itemlist) const -{ - foreach (QGraphicsItem *item, itemlist) { - if (isEditorItem(item)) - itemlist.removeOne(item); - } - - return itemlist; -} - -bool QDeclarativeViewInspectorPrivate::isEditorItem(QGraphicsItem *item) const -{ - return (item->type() == Constants::EditorItemType - || item->type() == Constants::ResizeHandleItemType - || item->data(Constants::EditorItemDataKey).toBool()); -} - -void QDeclarativeViewInspectorPrivate::_q_onStatusChanged(QDeclarativeView::Status status) -{ - if (status == QDeclarativeView::Ready) - debugService->reloaded(); -} - -void QDeclarativeViewInspectorPrivate::_q_onCurrentObjectsChanged(QList<QObject*> objects) -{ - QList<QGraphicsItem*> items; - QList<QGraphicsObject*> gfxObjects; - foreach (QObject *obj, objects) { - if (QDeclarativeItem *declarativeItem = qobject_cast<QDeclarativeItem*>(obj)) { - items << declarativeItem; - gfxObjects << declarativeItem; - } - } - if (designModeBehavior) { - setSelectedItemsForTools(items); - clearHighlight(); - highlight(gfxObjects); - } -} - -QString QDeclarativeViewInspector::idStringForObject(QObject *obj) -{ - return QDeclarativeInspectorService::instance()->idStringForObject(obj); -} - -// adjusts bounding boxes on edges of screen to be visible -QRectF QDeclarativeViewInspector::adjustToScreenBoundaries(const QRectF &boundingRectInSceneSpace) -{ - int marginFromEdge = 1; - QRectF boundingRect(boundingRectInSceneSpace); - if (qAbs(boundingRect.left()) - 1 < 2) - boundingRect.setLeft(marginFromEdge); - - QRect rect = data->view->rect(); - - if (boundingRect.right() >= rect.right()) - boundingRect.setRight(rect.right() - marginFromEdge); - - if (qAbs(boundingRect.top()) - 1 < 2) - boundingRect.setTop(marginFromEdge); - - if (boundingRect.bottom() >= rect.bottom()) - boundingRect.setBottom(rect.bottom() - marginFromEdge); - - return boundingRect; -} - -} // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector_p.h b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector_p.h deleted file mode 100644 index e2a208cbd78..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewinspector_p.h +++ /dev/null @@ -1,129 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVEVIEWINSPECTOR_P_H -#define QDECLARATIVEVIEWINSPECTOR_P_H - -#include <QWeakPointer> -#include <QPointF> - -#include "qdeclarativeviewinspector.h" -#include "qdeclarativeinspectorservice.h" - -namespace QmlJSDebugger { - -class JSDebuggerAgent; -class QDeclarativeViewInspector; -class LiveSelectionTool; -class ZoomTool; -class ColorPickerTool; -class LiveLayerItem; -class BoundingRectHighlighter; -class CrumblePath; -class AbstractLiveEditTool; - -class QDeclarativeViewInspectorPrivate : public QObject -{ - Q_OBJECT -public: - QDeclarativeViewInspectorPrivate(QDeclarativeViewInspector *); - ~QDeclarativeViewInspectorPrivate(); - - QDeclarativeView *view; - QDeclarativeViewInspector *q; - QDeclarativeInspectorService *debugService; - QWeakPointer<QWidget> viewport; - - QPointF cursorPos; - QList<QWeakPointer<QGraphicsObject> > currentSelection; - - Constants::DesignTool currentToolMode; - AbstractLiveEditTool *currentTool; - - LiveSelectionTool *selectionTool; - ZoomTool *zoomTool; - ColorPickerTool *colorPickerTool; - LiveLayerItem *manipulatorLayer; - - BoundingRectHighlighter *boundingRectHighlighter; - - bool designModeBehavior; - bool showAppOnTop; - - bool animationPaused; - qreal slowDownFactor; - - void setViewport(QWidget *widget); - - void clearEditorItems(); - void changeToSelectTool(); - QList<QGraphicsItem*> filterForSelection(QList<QGraphicsItem*> &itemlist) const; - - QList<QGraphicsItem*> selectableItems(const QPoint &pos) const; - QList<QGraphicsItem*> selectableItems(const QPointF &scenePos) const; - QList<QGraphicsItem*> selectableItems(const QRectF &sceneRect, Qt::ItemSelectionMode selectionMode) const; - - void setSelectedItemsForTools(QList<QGraphicsItem *> items); - void setSelectedItems(QList<QGraphicsItem *> items); - QList<QGraphicsItem *> selectedItems(); - - void changeTool(Constants::DesignTool tool, - Constants::ToolFlags flags = Constants::NoToolFlags); - - void clearHighlight(); - void highlight(const QList<QGraphicsObject *> &item); - inline void highlight(QGraphicsObject *item) - { highlight(QList<QGraphicsObject*>() << item); } - - bool isEditorItem(QGraphicsItem *item) const; - -public slots: - void _q_reloadView(); - void _q_onStatusChanged(QDeclarativeView::Status status); - void _q_onCurrentObjectsChanged(QList<QObject*> objects); - void _q_applyChangesFromClient(); - void _q_createQmlObject(const QString &qml, QObject *parent, - const QStringList &imports, const QString &filename = QString(), int order = 0); - void _q_reparentQmlObject(QObject *, QObject *); - void _q_deleteQmlObject(QObject *); - - void _q_changeToSingleSelectTool(); - void _q_changeToMarqueeSelectTool(); - void _q_changeToZoomTool(); - void _q_changeToColorPickerTool(); - void _q_clearComponentCache(); - void _q_removeFromSelection(QObject *); - -public: - static QDeclarativeViewInspectorPrivate *get(QDeclarativeViewInspector *v) { return v->d_func(); } -}; - -} // namespace QmlJSDebugger - -#endif // QDECLARATIVEVIEWINSPECTOR_P_H diff --git a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri b/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri deleted file mode 100644 index 820267165fc..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri +++ /dev/null @@ -1,14 +0,0 @@ -# This file is part of Qt Creator -# It enables debugging of Qt Quick applications - -QT += declarative script -INCLUDEPATH += $$PWD/include - -windows:CONFIG(debug, debug|release) { - LIBNAME = QmlJSDebuggerd -} else { - LIBNAME = QmlJSDebugger -} -LIBS += -L$$PWD -l$$LIBNAME - -DEFINES += QMLJSDEBUGGER diff --git a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri b/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri deleted file mode 100644 index cb41d7169f8..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri +++ /dev/null @@ -1,45 +0,0 @@ -INCLUDEPATH += $$PWD/include - -include($$PWD/protocol/protocol.pri) - -HEADERS += \ - $$PWD/include/jsdebuggeragent.h \ - $$PWD/include/qmljsdebugger_global.h - -SOURCES += \ - $$PWD/jsdebuggeragent.cpp - -HEADERS += \ - $$PWD/include/qdeclarativeviewinspector.h \ - $$PWD/include/qdeclarativeviewobserver.h \ - $$PWD/include/qdeclarativeinspectorservice.h \ - $$PWD/include/qmlinspectorconstants.h \ - $$PWD/editor/abstractliveedittool.h \ - $$PWD/editor/liveselectiontool.h \ - $$PWD/editor/livelayeritem.h \ - $$PWD/editor/livesingleselectionmanipulator.h \ - $$PWD/editor/liverubberbandselectionmanipulator.h \ - $$PWD/editor/liveselectionrectangle.h \ - $$PWD/editor/liveselectionindicator.h \ - $$PWD/editor/boundingrecthighlighter.h \ - $$PWD/editor/subcomponentmasklayeritem.h \ - $$PWD/editor/zoomtool.h \ - $$PWD/editor/colorpickertool.h \ - $$PWD/qdeclarativeviewinspector_p.h - -SOURCES += \ - $$PWD/qdeclarativeviewinspector.cpp \ - $$PWD/qdeclarativeinspectorservice.cpp \ - $$PWD/editor/abstractliveedittool.cpp \ - $$PWD/editor/liveselectiontool.cpp \ - $$PWD/editor/livelayeritem.cpp \ - $$PWD/editor/livesingleselectionmanipulator.cpp \ - $$PWD/editor/liverubberbandselectionmanipulator.cpp \ - $$PWD/editor/liveselectionrectangle.cpp \ - $$PWD/editor/liveselectionindicator.cpp \ - $$PWD/editor/boundingrecthighlighter.cpp \ - $$PWD/editor/subcomponentmasklayeritem.cpp \ - $$PWD/editor/zoomtool.cpp \ - $$PWD/editor/colorpickertool.cpp - -DEFINES += QMLJSDEBUGGER diff --git a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger.pro b/share/qtcreator/qml/qmljsdebugger/qmljsdebugger.pro deleted file mode 100644 index f7585e1478b..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger.pro +++ /dev/null @@ -1,18 +0,0 @@ -# This file is part of Qt Creator -# It enables debugging of Qt Quick applications - -TEMPLATE = lib -CONFIG += staticlib create_prl -QT += declarative script - -DEFINES += BUILD_QMLJSDEBUGGER_STATIC_LIB - -unix:QMAKE_CXXFLAGS_DEBUG += -O3 - -DESTDIR = $$PWD -TARGET=QmlJSDebugger -CONFIG(debug, debug|release) { - windows:TARGET=QmlJSDebuggerd -} - -include(qmljsdebugger-src.pri) diff --git a/share/qtcreator/qml/qmlobserver/Info.plist.in b/share/qtcreator/qml/qmlobserver/Info.plist.in deleted file mode 100644 index 924d1fc411f..00000000000 --- a/share/qtcreator/qml/qmlobserver/Info.plist.in +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version=\"1.0\" encoding=\"UTF-8\"?> -<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\"> -<plist version=\"0.1\"> -<dict> - <key>NSHumanReadableCopyright</key> - <string>This file is part of Qt Creator - -Copyright (c) 2013 Digia Plc and/or its subsidiary(-ies). - -Contact: http://www.qt-project.org/ - -GNU Lesser General Public License Usage - -This file may be used under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation and -appearing in the file LICENSE.LGPL included in the packaging of this file. -Please review the following information to ensure the GNU Lesser General -Public License version 2.1 requirements will be met: -http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. - -In addition, as a special exception, Digia gives you certain additional -rights. These rights are described in the Digia Qt LGPL Exception -version 1.1, included in the file LGPL_EXCEPTION.txt in this package. - -Other Usage - -Alternatively, this file may be used in accordance with the terms and -conditions contained in a signed written agreement between you and Digia.</string> - <key>CFBundleIconFile</key> - <string>@ICON@</string> - <key>CFBundleIdentifier</key> - <string>com.nokia.qt.qml</string> - <key>CFBundlePackageType</key> - <string>APPL</string> - <key>CFBundleGetInfoString</key> - <string>Created by Qt/QMake</string> - <key>CFBundleSignature</key> - <string>@TYPEINFO@</string> - <key>CFBundleExecutable</key> - <string>@EXECUTABLE@</string> - <key>CFBundleVersion</key> - <string>$$QTCREATOR_VERSION</string> - <key>CFBundleShortVersionString</key> - <string>$$QTCREATOR_VERSION</string> - <key>UTExportedTypeDeclarations</key> - <array> - <dict> - <key>UTTypeIdentifier</key> - <string>com.nokia.qt.qml</string> - <key>UTTypeDescription</key> - <string>Qt Markup Language</string> - <key>UTTypeConformsTo</key> - <array> - <string>public.plain-text</string> - </array> - <key>UTTypeTagSpecification</key> - <dict> - <key>public.filename-extension</key> - <array> - <string>qml</string> - </array> - </dict> - </dict> - </array> - <key>CFBundleDocumentTypes</key> - <array> - <dict> - <key>LSItemContentTypes</key> - <array> - <string>com.nokia.qt.qml</string> - </array> - <key>CFBundleTypeRole</key> - <string>Viewer</string> - </dict> - </array> -</dict> -</plist> diff --git a/share/qtcreator/qml/qmlobserver/LGPL_EXCEPTION.TXT b/share/qtcreator/qml/qmlobserver/LGPL_EXCEPTION.TXT deleted file mode 100644 index add80b93182..00000000000 --- a/share/qtcreator/qml/qmlobserver/LGPL_EXCEPTION.TXT +++ /dev/null @@ -1,22 +0,0 @@ -Digia Qt LGPL Exception version 1.1 - -As an additional permission to the GNU Lesser General Public License version -2.1, the object code form of a "work that uses the Library" may incorporate -material from a header file that is part of the Library. You may distribute -such object code under terms of your choice, provided that: - (i) the header files of the Library have not been modified; and - (ii) the incorporated material is limited to numerical parameters, data - structure layouts, accessors, macros, inline functions and - templates; and - (iii) you comply with the terms of Section 6 of the GNU Lesser General - Public License version 2.1. - -Moreover, you may apply this exception to a modified version of the Library, -provided that such modification does not involve copying material from the -Library into the modified Library's header files unless such material is -limited to (i) numerical parameters; (ii) data structure layouts; -(iii) accessors; and (iv) small macros, templates and inline functions of -five lines or less in length. - -Furthermore, you are not required to apply this additional permission to a -modified version of the Library. diff --git a/share/qtcreator/qml/qmlobserver/LICENSE.LGPL b/share/qtcreator/qml/qmlobserver/LICENSE.LGPL deleted file mode 100644 index 602bfc94635..00000000000 --- a/share/qtcreator/qml/qmlobserver/LICENSE.LGPL +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/share/qtcreator/qml/qmlobserver/browser/Browser.qml b/share/qtcreator/qml/qmlobserver/browser/Browser.qml deleted file mode 100644 index 83d5c1aeb5b..00000000000 --- a/share/qtcreator/qml/qmlobserver/browser/Browser.qml +++ /dev/null @@ -1,306 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -import QtQuick 1.0 -import Qt.labs.folderlistmodel 1.0 - -Rectangle { - id: root - property bool showFocusHighlight: false - property variant folders: folders1 - property variant view: view1 - width: 320 - height: 480 - color: palette.window - - FolderListModel { - id: folders1 - nameFilters: [ "*.qml" ] - folder: qmlViewerFolder - } - FolderListModel { - id: folders2 - nameFilters: [ "*.qml" ] - folder: qmlViewerFolder - } - - SystemPalette { id: palette } - - function down(path) { - if (folders == folders1) { - view = view2 - folders = folders2; - view1.state = "exitLeft"; - } else { - view = view1 - folders = folders1; - view2.state = "exitLeft"; - } - view.x = root.width; - view.state = "current"; - view.focus = true; - folders.folder = path; - } - function up() { - var path = folders.parentFolder; - if (folders == folders1) { - view = view2 - folders = folders2; - view1.state = "exitRight"; - } else { - view = view1 - folders = folders1; - view2.state = "exitRight"; - } - view.x = -root.width; - view.state = "current"; - view.focus = true; - folders.folder = path; - } - function keyPressed(key) { - switch (key) { - case Qt.Key_Up: - case Qt.Key_Down: - case Qt.Key_Left: - case Qt.Key_Right: - root.showFocusHighlight = true; - break; - default: - // do nothing - break; - } - } - - Component { - id: folderDelegate - Rectangle { - id: wrapper - function launch() { - if (folders.isFolder(index)) { - down(filePath); - } else { - qmlViewer.launch(filePath); - } - } - width: root.width - height: 52 - color: "transparent" - Rectangle { - id: highlight; visible: false - anchors.fill: parent - color: palette.highlight - gradient: Gradient { - GradientStop { id: t1; position: 0.0; color: palette.highlight } - GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } - } - } - Item { - width: 48; height: 48 - Image { source: "images/folder.png"; anchors.centerIn: parent; visible: folders.isFolder(index)} - } - Text { - id: nameText - anchors.fill: parent; verticalAlignment: Text.AlignVCenter - text: fileName - anchors.leftMargin: 54 - font.pixelSize: 32 - color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : palette.windowText - elide: Text.ElideRight - } - MouseArea { - id: mouseRegion - anchors.fill: parent - onPressed: { - root.showFocusHighlight = false; - wrapper.ListView.view.currentIndex = index; - } - onClicked: { if (folders == wrapper.ListView.view.model) launch() } - } - states: [ - State { - name: "pressed" - when: mouseRegion.pressed - PropertyChanges { target: highlight; visible: true } - PropertyChanges { target: nameText; color: palette.highlightedText } - } - ] - } - } - - ListView { - id: view1 - anchors.top: titleBar.bottom - anchors.bottom: parent.bottom - x: 0 - width: parent.width - model: folders1 - delegate: folderDelegate - highlight: Rectangle { - color: palette.highlight - visible: root.showFocusHighlight && view1.count != 0 - gradient: Gradient { - GradientStop { id: t1; position: 0.0; color: palette.highlight } - GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } - } - width: view1.currentItem == null ? 0 : view1.currentItem.width - } - highlightMoveSpeed: 1000 - pressDelay: 100 - focus: true - state: "current" - states: [ - State { - name: "current" - PropertyChanges { target: view1; x: 0 } - }, - State { - name: "exitLeft" - PropertyChanges { target: view1; x: -root.width } - }, - State { - name: "exitRight" - PropertyChanges { target: view1; x: root.width } - } - ] - transitions: [ - Transition { - to: "current" - SequentialAnimation { - NumberAnimation { properties: "x"; duration: 250 } - } - }, - Transition { - NumberAnimation { properties: "x"; duration: 250 } - NumberAnimation { properties: "x"; duration: 250 } - } - ] - Keys.onPressed: root.keyPressed(event.key) - } - - ListView { - id: view2 - anchors.top: titleBar.bottom - anchors.bottom: parent.bottom - x: parent.width - width: parent.width - model: folders2 - delegate: folderDelegate - highlight: Rectangle { - color: palette.highlight - visible: root.showFocusHighlight && view2.count != 0 - gradient: Gradient { - GradientStop { id: t1; position: 0.0; color: palette.highlight } - GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } - } - width: view1.currentItem == null ? 0 : view1.currentItem.width - } - highlightMoveSpeed: 1000 - pressDelay: 100 - states: [ - State { - name: "current" - PropertyChanges { target: view2; x: 0 } - }, - State { - name: "exitLeft" - PropertyChanges { target: view2; x: -root.width } - }, - State { - name: "exitRight" - PropertyChanges { target: view2; x: root.width } - } - ] - transitions: [ - Transition { - to: "current" - SequentialAnimation { - NumberAnimation { properties: "x"; duration: 250 } - } - }, - Transition { - NumberAnimation { properties: "x"; duration: 250 } - } - ] - Keys.onPressed: root.keyPressed(event.key) - } - - Keys.onPressed: { - root.keyPressed(event.key); - if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) { - view.currentItem.launch(); - event.accepted = true; - } else if (event.key == Qt.Key_Left) { - up(); - } - } - - BorderImage { - source: "images/titlebar.sci"; - width: parent.width; - height: 52 - y: -7 - id: titleBar - - Rectangle { - id: upButton - width: 48 - height: titleBar.height - 7 - color: "transparent" - - Image { anchors.centerIn: parent; source: "images/up.png" } - MouseArea { id: upRegion; anchors.centerIn: parent - width: 56 - height: 56 - onClicked: if (folders.parentFolder != "") up() - } - states: [ - State { - name: "pressed" - when: upRegion.pressed - PropertyChanges { target: upButton; color: palette.highlight } - } - ] - } - Rectangle { - color: "gray" - x: 48 - width: 1 - height: 44 - } - - Text { - anchors.left: upButton.right; anchors.right: parent.right; height: parent.height - anchors.leftMargin: 4; anchors.rightMargin: 4 - text: folders.folder - color: "white" - elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter - font.pixelSize: 32 - } - } -} diff --git a/share/qtcreator/qml/qmlobserver/browser/browser.qrc b/share/qtcreator/qml/qmlobserver/browser/browser.qrc deleted file mode 100644 index 9c688e75215..00000000000 --- a/share/qtcreator/qml/qmlobserver/browser/browser.qrc +++ /dev/null @@ -1,9 +0,0 @@ -<RCC> - <qresource prefix="/browser"> - <file>Browser.qml</file> - <file>images/up.png</file> - <file>images/folder.png</file> - <file>images/titlebar.sci</file> - <file>images/titlebar.png</file> - </qresource> -</RCC> diff --git a/share/qtcreator/qml/qmlobserver/browser/images/folder.png b/share/qtcreator/qml/qmlobserver/browser/images/folder.png deleted file mode 100644 index e53e2ad464eb993256a6c3567fc940498e26fc8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1841 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 diff --git a/share/qtcreator/qml/qmlobserver/browser/images/titlebar.png b/share/qtcreator/qml/qmlobserver/browser/images/titlebar.png deleted file mode 100644 index 51c90082d052a94af34488ca9a13842122f7d7a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1436 zcmV;N1!MY&P)<h;3K|Lk000e1NJLTq001!n001lq1^@s6%+yd>00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXW1 z0xv7!9LBW(000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000E{Nkl<Z zXx`PDzit~x5XOJAx1{I@R?^xq6ay}j0504Ha9+XBk|J%IJY8xxR^!45+!zo9Ie|^y z?arjw-MhWxk&>Liq!w7*fp`1oo9~;MC5Hkm0Ga8f)%S;LHn|^l4>W+QI@MK<0LU%? zTCN^g=1tdNq`Dpph<f7&#N2xjKFg}9x;p|{O<B-t^AQL@@W6u%WSN2NlGq_Z=*0Q~ z=ztdJJa7uEfRo&p6_BO^a3~N3NDZLPeGRM&h;MR#kbx|6cL(&1sV`^+V3PrS0=x&# zR;!a&=jY%5`s~>=PESv9&Y_yal)K%ETFKXCtR`vY67D3wB9@+&cbGgIArTN6+wSAX zkGy^RmUr*o{T4#Fkk#tskC!ih`Tfb0Cxj5Vy1F8SK-YDE!#OZB%*L~eNSa)23&d?U zSw1i0>gRr9IT1mtHP62Lmb0@nE-o&3^XAQ;^5Vq{d;a`6A3l8G`uZB@98Hs4A;w4} zZZ8P$T;_Us-Wa3LiY3JoBbsA{322^IDj+WNr!^z_J?9)<*YWV-LmoYP#Ov3u@#p8~ zTwPspd3nidwF01RTNaB2BC@r4CKHDcwm?9#oSA`>USgwAW7e}#gkM0Yvk41^nr1^7 z&N;5HuQ@q6;px+-_|@_O@8ADLBaYYwR2A=iy0?Jz0cyTE=eGiSB!O3eXvr9oHkkl) zJria&VhTXjdXO$lOS6-T2wfXkEEZf|Uh??yV|<K}&8EZqMAKriKvmhapII)KJ>9$6 z$kf}E2}3pUBO*h1vm}>TF;RnPvP?}ajZsZ(s`c^F`G#o9X1&4r25)A>7;$dUeu#sd zH0nr`HO-^wWQOLC8t2no3_(Fez${xkBmh<z%pgTD17`~?R&tDKoS7j`2$`~`StJ6w zZi88*Z6ne+HeH)HrHI&IfyxhR37Cb^xkN<hB<?(`7!b0hi!q9Q3ae)8!B7^fu}P05 zsAz}~I(!I$7-L>=yunfEn^?XuQ?3Ij+Zzn(@H!pav#Pqq_?!|nMq-S~Ct{2l-QZ~b zHR{$P`zF6tD!u{4zWIxhQbJa`7!wn!ntVca%bFsRXx#Sb;tV@Ca^rcTGS~=!F~4Rd zD^=}7d=H{l@KpDMcDE-M<BOS?g72+-!x2qHP%)xL+R!CAmBFTiWmJ=l%5~1#QaR{d zTAj(~Kon!{@<ZnwS|X{&!Lg?qwBGz2?fn8X?A*n%=RnlM=X^s|QywDAscl=ju1n|` zGf{HKF1?FLAHVMcq8vqb9c9GWV!w`t<pdB-S+^~I-ELU78=P~q*8Y;{^EFzLdiQya zE6C>beynXOK|hy7X0?B$O;vFv(d|Qf^dRaKe_z@t5t}6@ZhHA%GI8viucfZ4DLUOJ z%g-f2H+QV4licii=|7xc|4$k9K5-Z1_4nO<nfz-z`Hdi&rs<Eo{g<Z<$T@cu((<=K zDk3yZ(`WW_wklsv4(;4Gf`~Ep091AK(@F82L(9oG;%J&Z)@*8Nxuc9!{)eA_<i0ln zey)DjUojM0>T1!U>l1aAsH<udpMg&v_&Yz?FcerykwrLc-OeUp`VtqDBFjG+#F}y4 z?$9jkW1}$A0UMtw3EBG7Dk=wLVai7NLA?Mem7~sQ2D*v$kEQ%OCo7$@;xmBAaTem| qKomxLW_+gPnEw(nC#%ulBK`%3l#FT?MBUf`0000<MNUMnLSTaHVxb-Y diff --git a/share/qtcreator/qml/qmlobserver/browser/images/titlebar.sci b/share/qtcreator/qml/qmlobserver/browser/images/titlebar.sci deleted file mode 100644 index 0418d94cd60..00000000000 --- a/share/qtcreator/qml/qmlobserver/browser/images/titlebar.sci +++ /dev/null @@ -1,5 +0,0 @@ -border.left: 10 -border.top: 12 -border.bottom: 12 -border.right: 10 -source: titlebar.png diff --git a/share/qtcreator/qml/qmlobserver/browser/images/up.png b/share/qtcreator/qml/qmlobserver/browser/images/up.png deleted file mode 100644 index b05f8025d0157a5e7b2792b058cdb4553b1d6bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 662 zcmV;H0%`q;P)<h;3K|Lk000e1NJLTq000sI000sQ1^@s6R?d!B00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXS@ z05=qo0T_V*00I_CL_t(I%e|D(YZE~f$3JgoH`$m3@}o^mwTd1D5%pxX218XWdhp;M zphw$_)RW%4D|qkCKfwP$5EMK}QN)v=2r5-cHEDiqlbY=8dgyK&(l+YF2ag$;na}&a znfC_%qgkPkH2sJ5QY@}-Yg;ZEFX#X(fcaM?6REVlc=77N&h=Z9y~D@!Q=kIG{#KD_ zEd?iG-8nbA|7LkM?d-`_bvn~K;I=us*5re4_&%&`8%S#@WOB~KsY-Ef`a)9sdKu%p zWb&x&7?W<36YU1?e8V@u-wjkurtG_?%7wYg<s@QP@r;X70a`;Y581qwnyVbCukaqW zV1uB&skD8se7-b4J(JWrzJlkqP~u}L(4pt@kQ<kYW}QRzAAAD70%j0&<@8K!;p9{& z8%s2R4odt@Km=QN!8fQ>O7?ZT<Qp~K0JT9-=gUX$*UM+#cy(D7&zwyFJ*)^KU@K^@ z!s7kFyj|i|qsAlPHPBZBpwGYq;F_%+l1>I&zzW?CftG*>O<*2)0;~i6V8sT22XsZi zk^oBus4yj^Ktg5VUKdyc`am#T`ax75I*cAclmex}R)P>jK~3~(JNA$eAihC-5CH`U z8*?qet_?YCeyi2~`Qmwd%yl;oiwc1P{XQ5&ElO!C_;z!E8^H0fuk;S-F9DB%c61do w;_HY3aljr{4D`a++EgVYx?e`D2SX#j0sXq9GS=auNdN!<07*qoM6N<$g8bnhMgRZ+ diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation.cpp b/share/qtcreator/qml/qmlobserver/deviceorientation.cpp deleted file mode 100644 index ca26a935bf1..00000000000 --- a/share/qtcreator/qml/qmlobserver/deviceorientation.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "deviceorientation.h" - -QT_USE_NAMESPACE - -class DefaultDeviceOrientation : public DeviceOrientation -{ - Q_OBJECT -public: - DefaultDeviceOrientation() : DeviceOrientation(), m_orientation(DeviceOrientation::Portrait) {} - - Orientation orientation() const { - return m_orientation; - } - - void pauseListening() { - } - void resumeListening() { - } - - void setOrientation(Orientation o) { - if (o != m_orientation) { - m_orientation = o; - emit orientationChanged(); - } - } - - Orientation m_orientation; -}; - -DeviceOrientation* DeviceOrientation::instance() -{ - static DefaultDeviceOrientation *o = 0; - if (!o) - o = new DefaultDeviceOrientation; - return o; -} - -#include "deviceorientation.moc" - diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation.h b/share/qtcreator/qml/qmlobserver/deviceorientation.h deleted file mode 100644 index feda6e946e6..00000000000 --- a/share/qtcreator/qml/qmlobserver/deviceorientation.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef ORIENTATION_H -#define ORIENTATION_H - -#include <QObject> - -QT_BEGIN_NAMESPACE - -class DeviceOrientationPrivate; -class DeviceOrientation : public QObject -{ - Q_OBJECT - Q_ENUMS(Orientation) -public: - enum Orientation { - UnknownOrientation, - Portrait, - Landscape, - PortraitInverted, - LandscapeInverted - }; - - virtual Orientation orientation() const = 0; - virtual void setOrientation(Orientation) = 0; - - virtual void pauseListening() = 0; - virtual void resumeListening() = 0; - - static DeviceOrientation *instance(); - -signals: - void orientationChanged(); - -protected: - DeviceOrientation() {} - -private: - DeviceOrientationPrivate *d_ptr; - friend class DeviceOrientationPrivate; -}; - -QT_END_NAMESPACE - -#endif diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp b/share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp deleted file mode 100644 index 7b5e2526533..00000000000 --- a/share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "deviceorientation.h" - -#include <e32base.h> -#include <sensrvchannelfinder.h> -#include <sensrvdatalistener.h> -#include <sensrvchannel.h> -#include <sensrvorientationsensor.h> - -class SymbianOrientation : public DeviceOrientation, public MSensrvDataListener -{ - Q_OBJECT -public: - SymbianOrientation() - : DeviceOrientation(), m_current(UnknownOrientation), m_sensorChannel(0), m_channelOpen(false) - { - TRAP_IGNORE(initL()); - if (!m_sensorChannel) - qWarning("No valid sensors found."); - } - - ~SymbianOrientation() - { - if (m_sensorChannel) { - m_sensorChannel->StopDataListening(); - m_sensorChannel->CloseChannel(); - delete m_sensorChannel; - } - } - - void initL() - { - CSensrvChannelFinder *channelFinder = CSensrvChannelFinder::NewLC(); - RSensrvChannelInfoList channelInfoList; - CleanupClosePushL(channelInfoList); - - TSensrvChannelInfo searchConditions; - searchConditions.iChannelType = KSensrvChannelTypeIdOrientationData; - channelFinder->FindChannelsL(channelInfoList, searchConditions); - - for (int i = 0; i < channelInfoList.Count(); ++i) { - TRAPD(error, m_sensorChannel = CSensrvChannel::NewL(channelInfoList[i])); - if (!error) - TRAP(error, m_sensorChannel->OpenChannelL()); - if (!error) { - TRAP(error, m_sensorChannel->StartDataListeningL(this, 1, 1, 0)); - m_channelOpen = true; - break; - } - if (error) { - delete m_sensorChannel; - m_sensorChannel = 0; - } - } - - channelInfoList.Close(); - CleanupStack::Pop(&channelInfoList); - CleanupStack::PopAndDestroy(channelFinder); - } - - Orientation orientation() const - { - return m_current; - } - - void setOrientation(Orientation) { } - -private: - DeviceOrientation::Orientation m_current; - CSensrvChannel *m_sensorChannel; - bool m_channelOpen; - void pauseListening() { - if (m_sensorChannel && m_channelOpen) { - m_sensorChannel->StopDataListening(); - m_sensorChannel->CloseChannel(); - m_channelOpen = false; - } - } - - void resumeListening() { - if (m_sensorChannel && !m_channelOpen) { - TRAPD(error, m_sensorChannel->OpenChannelL()); - if (!error) { - TRAP(error, m_sensorChannel->StartDataListeningL(this, 1, 1, 0)); - if (!error) { - m_channelOpen = true; - } - } - if (error) { - delete m_sensorChannel; - m_sensorChannel = 0; - } - } - } - - void DataReceived(CSensrvChannel &channel, TInt count, TInt dataLost) - { - Q_UNUSED(dataLost) - if (channel.GetChannelInfo().iChannelType == KSensrvChannelTypeIdOrientationData) { - TSensrvOrientationData data; - for (int i = 0; i < count; ++i) { - TPckgBuf<TSensrvOrientationData> dataBuf; - channel.GetData(dataBuf); - data = dataBuf(); - Orientation orientation = UnknownOrientation; - switch (data.iDeviceOrientation) { - case TSensrvOrientationData::EOrientationDisplayUp: - orientation = Portrait; - break; - case TSensrvOrientationData::EOrientationDisplayRightUp: - orientation = Landscape; - break; - case TSensrvOrientationData::EOrientationDisplayLeftUp: - orientation = LandscapeInverted; - break; - case TSensrvOrientationData::EOrientationDisplayDown: - orientation = PortraitInverted; - break; - case TSensrvOrientationData::EOrientationUndefined: - case TSensrvOrientationData::EOrientationDisplayUpwards: - case TSensrvOrientationData::EOrientationDisplayDownwards: - default: - break; - } - - if (m_current != orientation && orientation != UnknownOrientation) { - m_current = orientation; - emit orientationChanged(); - } - } - } - } - - void DataError(CSensrvChannel& /* channel */, TSensrvErrorSeverity /* error */) - { - } - - void GetDataListenerInterfaceL(TUid /* interfaceUid */, TAny*& /* interface */) - { - } -}; - - -DeviceOrientation* DeviceOrientation::instance() -{ - static SymbianOrientation *o = 0; - if (!o) - o = new SymbianOrientation; - return o; -} - -#include "deviceorientation_symbian.moc" diff --git a/share/qtcreator/qml/qmlobserver/loggerwidget.cpp b/share/qtcreator/qml/qmlobserver/loggerwidget.cpp deleted file mode 100644 index 9700b45e879..00000000000 --- a/share/qtcreator/qml/qmlobserver/loggerwidget.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include <qglobal.h> -#include <QDebug> -#include <QSettings> -#include <QActionGroup> -#include <QMenu> -#include <QPlainTextEdit> -#ifdef Q_WS_MAEMO_5 -# include <QScrollArea> -# include <QVBoxLayout> -# include "texteditautoresizer_maemo5.h" -#endif - -#include "loggerwidget.h" - -QT_BEGIN_NAMESPACE - -LoggerWidget::LoggerWidget(QWidget *parent) : - QMainWindow(parent), - m_visibilityOrigin(SettingsOrigin) -{ - setAttribute(Qt::WA_QuitOnClose, false); - setWindowTitle(tr("Warnings")); - - m_plainTextEdit = new QPlainTextEdit(); - -#ifdef Q_WS_MAEMO_5 - new TextEditAutoResizer(m_plainTextEdit); - setAttribute(Qt::WA_Maemo5StackedWindow); - QScrollArea *area = new QScrollArea(); - area->setWidget(m_plainTextEdit); - area->setWidgetResizable(true); - setCentralWidget(area); -#else - setCentralWidget(m_plainTextEdit); -#endif - readSettings(); - setupPreferencesMenu(); -} - -void LoggerWidget::append(const QString &msg) -{ - m_plainTextEdit->appendPlainText(msg); - - if (!isVisible() && (defaultVisibility() == AutoShowWarnings)) - setVisible(true); -} - -LoggerWidget::Visibility LoggerWidget::defaultVisibility() const -{ - return m_visibility; -} - -void LoggerWidget::setDefaultVisibility(LoggerWidget::Visibility visibility) -{ - if (m_visibility == visibility) - return; - - m_visibility = visibility; - m_visibilityOrigin = CommandLineOrigin; - - m_preferencesMenu->setEnabled(m_visibilityOrigin == SettingsOrigin); -} - -QMenu *LoggerWidget::preferencesMenu() -{ - return m_preferencesMenu; -} - -QAction *LoggerWidget::showAction() -{ - return m_showWidgetAction; -} - -void LoggerWidget::readSettings() -{ - QSettings settings; - QString warningsPreferences = settings.value("warnings", "hide").toString(); - if (warningsPreferences == "show") { - m_visibility = ShowWarnings; - } else if (warningsPreferences == "hide") { - m_visibility = HideWarnings; - } else { - m_visibility = AutoShowWarnings; - } -} - -void LoggerWidget::saveSettings() -{ - if (m_visibilityOrigin != SettingsOrigin) - return; - - QString value = "autoShow"; - if (defaultVisibility() == ShowWarnings) { - value = "show"; - } else if (defaultVisibility() == HideWarnings) { - value = "hide"; - } - - QSettings settings; - settings.setValue("warnings", value); -} - -void LoggerWidget::warningsPreferenceChanged(QAction *action) -{ - Visibility newSetting = static_cast<Visibility>(action->data().toInt()); - m_visibility = newSetting; - saveSettings(); -} - -void LoggerWidget::showEvent(QShowEvent *event) -{ - QWidget::showEvent(event); - emit opened(); -} - -void LoggerWidget::closeEvent(QCloseEvent *event) -{ - QWidget::closeEvent(event); - emit closed(); -} - -void LoggerWidget::setupPreferencesMenu() -{ - m_preferencesMenu = new QMenu(tr("Warnings")); - QActionGroup *warnings = new QActionGroup(m_preferencesMenu); - warnings->setExclusive(true); - - connect(warnings, SIGNAL(triggered(QAction*)), this, SLOT(warningsPreferenceChanged(QAction*))); - - QAction *showWarningsPreference = new QAction(tr("Show by default"), m_preferencesMenu); - showWarningsPreference->setCheckable(true); - showWarningsPreference->setData(LoggerWidget::ShowWarnings); - warnings->addAction(showWarningsPreference); - m_preferencesMenu->addAction(showWarningsPreference); - - QAction *hideWarningsPreference = new QAction(tr("Hide by default"), m_preferencesMenu); - hideWarningsPreference->setCheckable(true); - hideWarningsPreference->setData(LoggerWidget::HideWarnings); - warnings->addAction(hideWarningsPreference); - m_preferencesMenu->addAction(hideWarningsPreference); - - QAction *autoWarningsPreference = new QAction(tr("Show for first warning"), m_preferencesMenu); - autoWarningsPreference->setCheckable(true); - autoWarningsPreference->setData(LoggerWidget::AutoShowWarnings); - warnings->addAction(autoWarningsPreference); - m_preferencesMenu->addAction(autoWarningsPreference); - - switch (defaultVisibility()) { - case LoggerWidget::ShowWarnings: - showWarningsPreference->setChecked(true); - break; - case LoggerWidget::HideWarnings: - hideWarningsPreference->setChecked(true); - break; - default: - autoWarningsPreference->setChecked(true); - } -} - -QT_END_NAMESPACE diff --git a/share/qtcreator/qml/qmlobserver/loggerwidget.h b/share/qtcreator/qml/qmlobserver/loggerwidget.h deleted file mode 100644 index 5461e20a085..00000000000 --- a/share/qtcreator/qml/qmlobserver/loggerwidget.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef LOGGERWIDGET_H -#define LOGGERWIDGET_H - -#include <QMainWindow> -#include <QMetaType> - -QT_BEGIN_NAMESPACE - -class QPlainTextEdit; -class QMenu; -class QAction; - -class LoggerWidget : public QMainWindow { - Q_OBJECT -public: - LoggerWidget(QWidget *parent=0); - - enum Visibility { ShowWarnings, HideWarnings, AutoShowWarnings }; - - Visibility defaultVisibility() const; - void setDefaultVisibility(Visibility visibility); - - QMenu *preferencesMenu(); - QAction *showAction(); - -public slots: - void append(const QString &msg); - -private slots: - void warningsPreferenceChanged(QAction *action); - void readSettings(); - void saveSettings(); - -protected: - void showEvent(QShowEvent *event); - void closeEvent(QCloseEvent *event); - -signals: - void opened(); - void closed(); - -private: - void setupPreferencesMenu(); - - QMenu *m_preferencesMenu; - QAction *m_showWidgetAction; - QPlainTextEdit *m_plainTextEdit; - - enum ConfigOrigin { CommandLineOrigin, SettingsOrigin }; - ConfigOrigin m_visibilityOrigin; - Visibility m_visibility; -}; - -QT_END_NAMESPACE - -Q_DECLARE_METATYPE(LoggerWidget::Visibility) - -#endif // LOGGERWIDGET_H diff --git a/share/qtcreator/qml/qmlobserver/main.cpp b/share/qtcreator/qml/qmlobserver/main.cpp deleted file mode 100644 index 7f61c99ee3e..00000000000 --- a/share/qtcreator/qml/qmlobserver/main.cpp +++ /dev/null @@ -1,562 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "qdeclarative.h" -#include "qmlruntime.h" -#include "qdeclarativeengine.h" -#include "loggerwidget.h" -#include <QWidget> -#include <QDir> -#include <QApplication> -#include <QTranslator> -#include <QDebug> -#include <QMessageBox> -#include <QAtomicInt> -#include "qdeclarativetester.h" -#include "qt_private/qdeclarativedebughelper_p.h" - -QT_USE_NAMESPACE - -QtMsgHandler systemMsgOutput = 0; - -static QDeclarativeViewer *openFile(const QString &fileName); -static void showViewer(QDeclarativeViewer *viewer); - -QWeakPointer<LoggerWidget> logger; - -QString warnings; -void exitApp(int i) -{ -#ifdef Q_OS_WIN - // Debugging output is not visible by default on Windows - - // therefore show modal dialog with errors instead. - if (!warnings.isEmpty()) { - QMessageBox::warning(0, QApplication::tr("Qt QML Viewer"), warnings); - } -#endif - exit(i); -} - -static QAtomicInt recursiveLock(0); - -void myMessageOutput(QtMsgType type, const char *msg) -{ - QString strMsg = QString::fromLatin1(msg); - - if (!QCoreApplication::closingDown()) { - if (!logger.isNull()) { - if (recursiveLock.testAndSetOrdered(0, 1)) { - QMetaObject::invokeMethod(logger.data(), "append", Q_ARG(QString, strMsg)); - recursiveLock = 0; - } - } else { - warnings += strMsg; - warnings += QLatin1Char('\n'); - } - } - if (systemMsgOutput) { // Windows - systemMsgOutput(type, msg); - } else { // Unix - fprintf(stderr, "%s\n", msg); - fflush(stderr); - } -} - -static QDeclarativeViewer* globalViewer = 0; - -// The qml file that is shown if the user didn't specify a QML file -QString initialFile = "qrc:/startup/startup.qml"; - -void usage() -{ - qWarning("Usage: qmlobserver [options] <filename>"); - qWarning(" "); - qWarning(" options:"); - qWarning(" -v, -version ............................. display version"); - qWarning(" -frameless ............................... run with no window frame"); - qWarning(" -maximized................................ run maximized"); - qWarning(" -fullscreen............................... run fullscreen"); - qWarning(" -stayontop................................ keep viewer window on top"); - qWarning(" -sizeviewtorootobject .................... the view resizes to the changes in the content"); - qWarning(" -sizerootobjecttoview .................... the content resizes to the changes in the view (default)"); - qWarning(" -qmlbrowser .............................. use a QML-based file browser"); - qWarning(" -warnings [show|hide]..................... show warnings in a separate log window"); -#ifndef NO_PRIVATE_HEADERS - qWarning(" -recordfile <output> ..................... set video recording file"); - qWarning(" - ImageMagick 'convert' for GIF)"); - qWarning(" - png file for raw frames"); - qWarning(" - 'ffmpeg' for other formats"); - qWarning(" -recorddither ordered|threshold|floyd .... set GIF dither recording mode"); - qWarning(" -recordrate <fps> ........................ set recording frame rate"); - qWarning(" -record arg .............................. add a recording process argument"); - qWarning(" -autorecord [from-]<tomilliseconds> ...... set recording to start and stop"); -#endif - qWarning(" -devicekeys .............................. use numeric keys (see F1)"); - qWarning(" -dragthreshold <size> .................... set mouse drag threshold size"); - qWarning(" -netcache <size> ......................... set disk cache to size bytes"); - qWarning(" -translation <translationfile> ........... set the language to run in"); - qWarning(" -I <directory> ........................... prepend to the module import search path,"); - qWarning(" display path if <directory> is empty"); - qWarning(" -P <directory> ........................... prepend to the plugin search path"); -#if defined(Q_OS_MAC) - qWarning(" -no-opengl ............................... don't use a QGLWidget for the viewport"); -#else - qWarning(" -opengl .................................. use a QGLWidget for the viewport"); -#endif -#ifndef NO_PRIVATE_HEADERS - qWarning(" -script <path> ........................... set the script to use"); - qWarning(" -scriptopts <options>|help ............... set the script options to use"); -#endif - - qWarning(" "); - qWarning(" Press F1 for interactive help"); - - exitApp(1); -} - -void scriptOptsUsage() -{ - qWarning("Usage: qmlobserver -scriptopts <option>[,<option>...] ..."); - qWarning(" options:"); - qWarning(" record ................................... record a new script"); - qWarning(" play ..................................... playback an existing script"); - qWarning(" testimages ............................... record images or compare images on playback"); - qWarning(" testerror ................................ test 'error' property of root item on playback"); - qWarning(" testskip ................................ test 'skip' property of root item on playback"); - qWarning(" snapshot ................................. file being recorded is static,"); - qWarning(" only one frame will be recorded or tested"); - qWarning(" exitoncomplete ........................... cleanly exit the viewer on script completion"); - qWarning(" exitonfailure ............................ immediately exit the viewer on script failure"); - qWarning(" saveonexit ............................... save recording on viewer exit"); - qWarning(" "); - qWarning(" One of record, play or both must be specified."); - - exitApp(1); -} - -enum WarningsConfig { ShowWarnings, HideWarnings, DefaultWarnings }; - -struct ViewerOptions -{ - ViewerOptions() - : frameless(false), - fps(0.0), - autorecord_from(0), - autorecord_to(0), - dither("none"), - runScript(false), - devkeys(false), - cache(0), - useGL(false), - fullScreen(false), - stayOnTop(false), - maximized(false), - useNativeFileBrowser(true), - experimentalGestures(false), - warningsConfig(DefaultWarnings), - sizeToView(true) - { -#if defined(Q_OS_MAC) - useGL = true; -#endif - } - - bool frameless; - double fps; - int autorecord_from; - int autorecord_to; - QString dither; - QString recordfile; - QStringList recordargs; - QStringList imports; - QStringList plugins; - QString script; - QString scriptopts; - bool runScript; - bool devkeys; - int cache; - QString translationFile; - bool useGL; - bool fullScreen; - bool stayOnTop; - bool maximized; - bool useNativeFileBrowser; - bool experimentalGestures; - - WarningsConfig warningsConfig; - bool sizeToView; - - QDeclarativeViewer::ScriptOptions scriptOptions; -}; - -static ViewerOptions opts; -static QStringList fileNames; - -class Application : public QApplication -{ - Q_OBJECT -public: - Application(int &argc, char **&argv) - : QApplication(argc, argv) - {} - -protected: - bool event(QEvent *ev) - { - if (ev->type() != QEvent::FileOpen) - return QApplication::event(ev); - - QFileOpenEvent *fev = static_cast<QFileOpenEvent *>(ev); - - globalViewer->open(fev->file()); - if (!globalViewer->isVisible()) - showViewer(globalViewer); - - return true; - } - -private Q_SLOTS: - void showInitialViewer() - { - QApplication::processEvents(); - - QDeclarativeViewer *viewer = globalViewer; - if (!viewer) - return; - if (viewer->currentFile().isEmpty()) { - if(opts.useNativeFileBrowser) - viewer->open(initialFile); - else - viewer->openFile(); - } - if (!viewer->isVisible()) - showViewer(viewer); - } -}; - -static void parseScriptOptions() -{ - QStringList options = - opts.scriptopts.split(QLatin1Char(','), QString::SkipEmptyParts); - - QDeclarativeViewer::ScriptOptions scriptOptions = 0; - for (int i = 0; i < options.count(); ++i) { - const QString &option = options.at(i); - if (option == QLatin1String("help")) { - scriptOptsUsage(); - } else if (option == QLatin1String("play")) { - scriptOptions |= QDeclarativeViewer::Play; - } else if (option == QLatin1String("record")) { - scriptOptions |= QDeclarativeViewer::Record; - } else if (option == QLatin1String("testimages")) { - scriptOptions |= QDeclarativeViewer::TestImages; - } else if (option == QLatin1String("testerror")) { - scriptOptions |= QDeclarativeViewer::TestErrorProperty; - } else if (option == QLatin1String("testskip")) { - scriptOptions |= QDeclarativeViewer::TestSkipProperty; - } else if (option == QLatin1String("exitoncomplete")) { - scriptOptions |= QDeclarativeViewer::ExitOnComplete; - } else if (option == QLatin1String("exitonfailure")) { - scriptOptions |= QDeclarativeViewer::ExitOnFailure; - } else if (option == QLatin1String("saveonexit")) { - scriptOptions |= QDeclarativeViewer::SaveOnExit; - } else if (option == QLatin1String("snapshot")) { - scriptOptions |= QDeclarativeViewer::Snapshot; - } else { - scriptOptsUsage(); - } - } - - opts.scriptOptions = scriptOptions; -} - -static void parseCommandLineOptions(const QStringList &arguments) -{ - for (int i = 1; i < arguments.count(); ++i) { - bool lastArg = (i == arguments.count() - 1); - QString arg = arguments.at(i); - if (arg == "-frameless") { - opts.frameless = true; - } else if (arg == "-maximized") { - opts.maximized = true; - } else if (arg == "-fullscreen") { - opts.fullScreen = true; - } else if (arg == "-stayontop") { - opts.stayOnTop = true; - } else if (arg == "-netcache") { - if (lastArg) usage(); - opts.cache = arguments.at(++i).toInt(); - } else if (arg == "-recordrate") { - if (lastArg) usage(); - opts.fps = arguments.at(++i).toDouble(); - } else if (arg == "-recordfile") { - if (lastArg) usage(); - opts.recordfile = arguments.at(++i); - } else if (arg == "-record") { - if (lastArg) usage(); - opts.recordargs << arguments.at(++i); - } else if (arg == "-recorddither") { - if (lastArg) usage(); - opts.dither = arguments.at(++i); - } else if (arg == "-autorecord") { - if (lastArg) usage(); - QString range = arguments.at(++i); - int dash = range.indexOf('-'); - if (dash > 0) - opts.autorecord_from = range.left(dash).toInt(); - opts.autorecord_to = range.mid(dash+1).toInt(); - } else if (arg == "-devicekeys") { - opts.devkeys = true; - } else if (arg == "-dragthreshold") { - if (lastArg) usage(); - qApp->setStartDragDistance(arguments.at(++i).toInt()); - } else if (arg == QLatin1String("-v") || arg == QLatin1String("-version")) { - qWarning("Qt QML Viewer version %s", qVersion()); - exitApp(0); - } else if (arg == "-translation") { - if (lastArg) usage(); - opts.translationFile = arguments.at(++i); -#if defined(Q_OS_MAC) - } else if (arg == "-no-opengl") { - opts.useGL = false; -#else - } else if (arg == "-opengl") { - opts.useGL = true; -#endif - } else if (arg == "-qmlbrowser") { - opts.useNativeFileBrowser = false; - } else if (arg == "-warnings") { - if (lastArg) usage(); - QString warningsStr = arguments.at(++i); - if (warningsStr == QLatin1String("show")) { - opts.warningsConfig = ShowWarnings; - } else if (warningsStr == QLatin1String("hide")) { - opts.warningsConfig = HideWarnings; - } else { - usage(); - } - } else if (arg == "-I" || arg == "-L") { - if (arg == "-L") - qWarning("-L option provided for compatibility only, use -I instead"); - if (lastArg) { - QDeclarativeEngine tmpEngine; - QString paths = tmpEngine.importPathList().join(QLatin1String(":")); - qWarning("Current search path: %s", paths.toLocal8Bit().constData()); - exitApp(0); - } - opts.imports << arguments.at(++i); - } else if (arg == "-P") { - if (lastArg) usage(); - opts.plugins << arguments.at(++i); - } else if (arg == "-script") { - if (lastArg) usage(); - opts.script = arguments.at(++i); - } else if (arg == "-scriptopts") { - if (lastArg) usage(); - opts.scriptopts = arguments.at(++i); - } else if (arg == "-savescript") { - if (lastArg) usage(); - opts.script = arguments.at(++i); - opts.runScript = false; - } else if (arg == "-playscript") { - if (lastArg) usage(); - opts.script = arguments.at(++i); - opts.runScript = true; - } else if (arg == "-sizeviewtorootobject") { - opts.sizeToView = false; - } else if (arg == "-sizerootobjecttoview") { - opts.sizeToView = true; - } else if (arg == "-experimentalgestures") { - opts.experimentalGestures = true; - } else if (!arg.startsWith('-')) { - fileNames.append(arg); - } else if (true || arg == "-help") { - usage(); - } - } - - if (!opts.scriptopts.isEmpty()) { - - parseScriptOptions(); - - if (opts.script.isEmpty()) - usage(); - - if (!(opts.scriptOptions & QDeclarativeViewer::Record) && !(opts.scriptOptions & QDeclarativeViewer::Play)) - scriptOptsUsage(); - } else if (!opts.script.isEmpty()) { - usage(); - } - -} - -static QDeclarativeViewer *createViewer() -{ - Qt::WFlags wflags = (opts.frameless ? Qt::FramelessWindowHint : Qt::Widget); - if (opts.stayOnTop) - wflags |= Qt::WindowStaysOnTopHint; - - QDeclarativeViewer *viewer = new QDeclarativeViewer(0, wflags); - viewer->setAttribute(Qt::WA_DeleteOnClose, true); - viewer->setUseGL(opts.useGL); - - if (!opts.scriptopts.isEmpty()) { - viewer->setScriptOptions(opts.scriptOptions); - viewer->setScript(opts.script); - } - - logger = viewer->warningsWidget(); - if (opts.warningsConfig == ShowWarnings) { - logger.data()->setDefaultVisibility(LoggerWidget::ShowWarnings); - logger.data()->show(); - } else if (opts.warningsConfig == HideWarnings){ - logger.data()->setDefaultVisibility(LoggerWidget::HideWarnings); - } - - if (opts.experimentalGestures) - viewer->enableExperimentalGestures(); - - foreach (const QString &lib, opts.imports) - viewer->addLibraryPath(lib); - - foreach (const QString &plugin, opts.plugins) - viewer->addPluginPath(plugin); - - viewer->setNetworkCacheSize(opts.cache); - viewer->setRecordFile(opts.recordfile); - viewer->setSizeToView(opts.sizeToView); - if (opts.fps > 0) - viewer->setRecordRate(opts.fps); - if (opts.autorecord_to) - viewer->setAutoRecord(opts.autorecord_from, opts.autorecord_to); - if (opts.devkeys) - viewer->setDeviceKeys(true); - viewer->setRecordDither(opts.dither); - if (opts.recordargs.count()) - viewer->setRecordArgs(opts.recordargs); - - viewer->setUseNativeFileBrowser(opts.useNativeFileBrowser); - - return viewer; -} - -void showViewer(QDeclarativeViewer *viewer) -{ - if (opts.fullScreen) - viewer->showFullScreen(); - else if (opts.maximized) - viewer->showMaximized(); - else - viewer->show(); - viewer->raise(); -} - -QDeclarativeViewer *openFile(const QString &fileName) -{ - QDeclarativeViewer *viewer = globalViewer; - - viewer->open(fileName); - showViewer(viewer); - - return viewer; -} - -int main(int argc, char ** argv) -{ - systemMsgOutput = qInstallMsgHandler(myMessageOutput); - -#if defined (Q_WS_X11) || defined (Q_OS_MAC) - //### default to using raster graphics backend for now - bool gsSpecified = false; - for (int i = 0; i < argc; ++i) { - QString arg = argv[i]; - if (arg == "-graphicssystem") { - gsSpecified = true; - break; - } - } - - if (!gsSpecified) - QApplication::setGraphicsSystem("raster"); -#endif - - Application app(argc, argv); - app.setApplicationName("QtQmlViewer"); - app.setOrganizationName("QtProject"); - app.setOrganizationDomain("qt-project.org"); - - QDeclarativeViewer::registerTypes(); - QDeclarativeTester::registerTypes(); - - parseCommandLineOptions(app.arguments()); - - QTranslator qmlTranslator; - if (!opts.translationFile.isEmpty()) { - qmlTranslator.load(opts.translationFile); - app.installTranslator(&qmlTranslator); - } - - if (opts.fullScreen && opts.maximized) - qWarning() << "Both -fullscreen and -maximized specified. Using -fullscreen."; - - if (fileNames.isEmpty()) { - QFile qmlapp(QLatin1String("qmlapp")); - if (qmlapp.exists() && qmlapp.open(QFile::ReadOnly)) { - QString content = QString::fromUtf8(qmlapp.readAll()); - qmlapp.close(); - - int newline = content.indexOf(QLatin1Char('\n')); - if (newline >= 0) - fileNames += content.left(newline); - else - fileNames += content; - } - } - - //enable remote debugging - QDeclarativeDebugHelper::enableDebugging(); - - globalViewer = createViewer(); - - if (fileNames.isEmpty()) { - // show the initial viewer delayed. - // This prevents an initial viewer popping up while there - // are FileOpen events coming through the event queue - QTimer::singleShot(1, &app, SLOT(showInitialViewer())); - } else { - foreach (const QString &fileName, fileNames) - openFile(fileName); - } - - QObject::connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); - - return app.exec(); -} - -#include "main.moc" diff --git a/share/qtcreator/qml/qmlobserver/proxysettings.cpp b/share/qtcreator/qml/qmlobserver/proxysettings.cpp deleted file mode 100644 index 473ec01c2b3..00000000000 --- a/share/qtcreator/qml/qmlobserver/proxysettings.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include <QIntValidator> -#include <QSettings> - -#include "proxysettings.h" - -QT_BEGIN_NAMESPACE - -ProxySettings::ProxySettings (QWidget * parent) - : QDialog (parent), Ui::ProxySettings() -{ - setupUi (this); - -#if !defined Q_WS_MAEMO_5 - // the onscreen keyboard can't cope with masks - proxyServerEdit->setInputMask ("000.000.000.000;_"); -#endif - QIntValidator *validator = new QIntValidator (0, 9999, this); - proxyPortEdit->setValidator (validator); - - QSettings settings; - proxyCheckBox->setChecked (settings.value ("http_proxy/use", 0).toBool ()); - proxyServerEdit->insert (settings.value ("http_proxy/hostname", "").toString ()); - proxyPortEdit->insert (settings.value ("http_proxy/port", "80").toString ()); - usernameEdit->insert (settings.value ("http_proxy/username", "").toString ()); - passwordEdit->insert (settings.value ("http_proxy/password", "").toString ()); -} - -ProxySettings::~ProxySettings() -{ -} - -void ProxySettings::accept () -{ - QSettings settings; - - settings.setValue ("http_proxy/use", proxyCheckBox->isChecked ()); - settings.setValue ("http_proxy/hostname", proxyServerEdit->text ()); - settings.setValue ("http_proxy/port", proxyPortEdit->text ()); - settings.setValue ("http_proxy/username", usernameEdit->text ()); - settings.setValue ("http_proxy/password", passwordEdit->text ()); - - QDialog::accept (); -} - -QNetworkProxy ProxySettings::httpProxy () -{ - QSettings settings; - QNetworkProxy proxy; - - bool proxyInUse = settings.value ("http_proxy/use", 0).toBool (); - if (proxyInUse) { - proxy.setType (QNetworkProxy::HttpProxy); - proxy.setHostName (settings.value ("http_proxy/hostname", "").toString ());// "192.168.220.5" - proxy.setPort (settings.value ("http_proxy/port", 80).toInt ()); // 8080 - proxy.setUser (settings.value ("http_proxy/username", "").toString ()); - proxy.setPassword (settings.value ("http_proxy/password", "").toString ()); - //QNetworkProxy::setApplicationProxy (proxy); - } else { - proxy.setType (QNetworkProxy::NoProxy); - } - return proxy; -} - -bool ProxySettings::httpProxyInUse() -{ - QSettings settings; - return settings.value ("http_proxy/use", 0).toBool (); -} - -QT_END_NAMESPACE diff --git a/share/qtcreator/qml/qmlobserver/proxysettings.h b/share/qtcreator/qml/qmlobserver/proxysettings.h deleted file mode 100644 index 95f224df41a..00000000000 --- a/share/qtcreator/qml/qmlobserver/proxysettings.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef PROXYSETTINGS_H -#define PROXYSETTINGS_H - -#include <QDialog> -#include <QNetworkProxy> -#ifdef Q_WS_MAEMO_5 -#include "ui_proxysettings_maemo5.h" -#else -#include "ui_proxysettings.h" -#endif - -QT_BEGIN_NAMESPACE -/** -*/ -class ProxySettings : public QDialog, public Ui::ProxySettings -{ - -Q_OBJECT - -public: - ProxySettings(QWidget * parent = 0); - - ~ProxySettings(); - - static QNetworkProxy httpProxy (); - static bool httpProxyInUse (); - -public slots: - virtual void accept (); -}; - -QT_END_NAMESPACE - -#endif // PROXYSETTINGS_H diff --git a/share/qtcreator/qml/qmlobserver/proxysettings.ui b/share/qtcreator/qml/qmlobserver/proxysettings.ui deleted file mode 100644 index 84e39fe03db..00000000000 --- a/share/qtcreator/qml/qmlobserver/proxysettings.ui +++ /dev/null @@ -1,115 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>ProxySettings</class> - <widget class="QDialog" name="ProxySettings"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>318</width> - <height>199</height> - </rect> - </property> - <property name="windowTitle"> - <string>Dialog</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0" colspan="2"> - <widget class="QCheckBox" name="proxyCheckBox"> - <property name="text"> - <string>Use http proxy</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="serverAddressLabel"> - <property name="text"> - <string>Server Address:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="proxyServerEdit"/> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Port:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="proxyPortEdit"/> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="usernameLabel"> - <property name="text"> - <string>Username:</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="usernameEdit"/> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="passwordLabel"> - <property name="text"> - <string>Password:</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QLineEdit" name="passwordEdit"> - <property name="echoMode"> - <enum>QLineEdit::Password</enum> - </property> - </widget> - </item> - <item row="5" column="0" colspan="2"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>ProxySettings</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>248</x> - <y>254</y> - </hint> - <hint type="destinationlabel"> - <x>157</x> - <y>274</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>ProxySettings</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>316</x> - <y>260</y> - </hint> - <hint type="destinationlabel"> - <x>286</x> - <y>274</y> - </hint> - </hints> - </connection> - </connections> -</ui> diff --git a/share/qtcreator/qml/qmlobserver/proxysettings_maemo5.ui b/share/qtcreator/qml/qmlobserver/proxysettings_maemo5.ui deleted file mode 100644 index 83f0c2a9de2..00000000000 --- a/share/qtcreator/qml/qmlobserver/proxysettings_maemo5.ui +++ /dev/null @@ -1,177 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>ProxySettings</class> - <widget class="QDialog" name="ProxySettings"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>449</width> - <height>164</height> - </rect> - </property> - <property name="windowTitle"> - <string>HTTP Proxy</string> - </property> - <layout class="QGridLayout" name="gridLayout_2"> - <property name="leftMargin"> - <number>16</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>16</number> - </property> - <property name="bottomMargin"> - <number>8</number> - </property> - <property name="horizontalSpacing"> - <number>16</number> - </property> - <property name="verticalSpacing"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QCheckBox" name="proxyCheckBox"> - <property name="text"> - <string>Use HTTP Proxy</string> - </property> - </widget> - </item> - <item row="0" column="1" rowspan="2"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item row="1" column="0" rowspan="2"> - <widget class="QWidget" name="widget" native="true"> - <layout class="QGridLayout" name="gridLayout"> - <property name="horizontalSpacing"> - <number>16</number> - </property> - <property name="verticalSpacing"> - <number>0</number> - </property> - <property name="margin"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="serverAddressLabel"> - <property name="text"> - <string>Server</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="proxyServerEdit"> - <property name="placeholderText"> - <string>Name or IP</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Port</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="proxyPortEdit"> - <property name="text"> - <string>8080</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="usernameLabel"> - <property name="text"> - <string>Username</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="usernameEdit"/> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="passwordLabel"> - <property name="text"> - <string>Password</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="passwordEdit"> - <property name="echoMode"> - <enum>QLineEdit::Password</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="2" column="1"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <tabstops> - <tabstop>proxyCheckBox</tabstop> - <tabstop>proxyServerEdit</tabstop> - <tabstop>proxyPortEdit</tabstop> - <tabstop>usernameEdit</tabstop> - <tabstop>passwordEdit</tabstop> - <tabstop>buttonBox</tabstop> - </tabstops> - <resources/> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>ProxySettings</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>318</x> - <y>100</y> - </hint> - <hint type="destinationlabel"> - <x>157</x> - <y>116</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>ProxySettings</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>318</x> - <y>100</y> - </hint> - <hint type="destinationlabel"> - <x>286</x> - <y>116</y> - </hint> - </hints> - </connection> - </connections> -</ui> diff --git a/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp b/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp deleted file mode 100644 index adcbaf76154..00000000000 --- a/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp +++ /dev/null @@ -1,445 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include <qdeclarativetester.h> -#include <qdeclarativeview.h> -#include <QDeclarativeComponent> -#include <QGraphicsObject> -#include <QApplication> -#include <QDebug> -#include <QFile> -#include <QDir> -#include <QCryptographicHash> - -#ifndef NO_PRIVATE_HEADERS -#include <private/qabstractanimation_p.h> -#include <private/qdeclarativeitem_p.h> -#endif - -QT_BEGIN_NAMESPACE - -extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled; - -QDeclarativeTester::QDeclarativeTester(const QString &script, QDeclarativeViewer::ScriptOptions opts, - QDeclarativeView *parent) -: QAbstractAnimation(parent), m_script(script), m_view(parent), filterEvents(true), options(opts), - testscript(0), hasCompleted(false), hasFailed(false) -{ - parent->viewport()->installEventFilter(this); - parent->installEventFilter(this); -#ifndef NO_PRIVATE_HEADERS - QUnifiedTimer::instance()->setConsistentTiming(true); -#endif - - //Font antialiasing makes tests system-specific, so disable it - QFont noAA = QApplication::font(); - noAA.setStyleStrategy(QFont::NoAntialias); - QApplication::setFont(noAA); - - if (options & QDeclarativeViewer::Play) - this->run(); - start(); -} - -QDeclarativeTester::~QDeclarativeTester() -{ - if (!hasFailed && - options & QDeclarativeViewer::Record && - options & QDeclarativeViewer::SaveOnExit) - save(); -} - -int QDeclarativeTester::duration() const -{ - return -1; -} - -void QDeclarativeTester::addMouseEvent(Destination dest, QMouseEvent *me) -{ - MouseEvent e(me); - e.destination = dest; - m_mouseEvents << e; -} - -void QDeclarativeTester::addKeyEvent(Destination dest, QKeyEvent *ke) -{ - KeyEvent e(ke); - e.destination = dest; - m_keyEvents << e; -} - -bool QDeclarativeTester::eventFilter(QObject *o, QEvent *e) -{ - if (!filterEvents) - return false; - - Destination destination; - if (o == m_view) { - destination = View; - } else if (o == m_view->viewport()) { - destination = ViewPort; - } else { - return false; - } - - switch (e->type()) { - case QEvent::KeyPress: - case QEvent::KeyRelease: - addKeyEvent(destination, (QKeyEvent *)e); - return true; - case QEvent::MouseButtonPress: - case QEvent::MouseButtonRelease: - case QEvent::MouseMove: - case QEvent::MouseButtonDblClick: - addMouseEvent(destination, (QMouseEvent *)e); - return true; - default: - break; - } - return false; -} - -void QDeclarativeTester::executefailure() -{ - hasFailed = true; - - if (options & QDeclarativeViewer::ExitOnFailure) - exit(-1); -} - -void QDeclarativeTester::imagefailure() -{ - hasFailed = true; - - if (options & QDeclarativeViewer::ExitOnFailure){ - testSkip(); - exit(hasFailed?-1:0); - } -} - -void QDeclarativeTester::testSkip() -{ - if (options & QDeclarativeViewer::TestSkipProperty){ - QString e = m_view->rootObject()->property("skip").toString(); - if (!e.isEmpty()) { - if(hasFailed){ - qWarning() << "Test failed, but skipping it: " << e; - }else{ - qWarning() << "Test skipped: " << e; - } - hasFailed = 0; - } - } -} - -void QDeclarativeTester::complete() -{ - if ((options & QDeclarativeViewer::TestErrorProperty) && !hasFailed) { - QString e = m_view->rootObject()->property("error").toString(); - if (!e.isEmpty()) { - qWarning() << "Test failed:" << e; - hasFailed = true; - } - } - - - testSkip(); - if (options & QDeclarativeViewer::ExitOnComplete) - QApplication::exit(hasFailed?-1:0); - - if (hasCompleted) - return; - hasCompleted = true; - - if (options & QDeclarativeViewer::Play) - qWarning("Script playback complete"); -} - -void QDeclarativeTester::run() -{ - QDeclarativeComponent c(m_view->engine(), m_script + QLatin1String(".qml")); - - testscript = qobject_cast<QDeclarativeVisualTest *>(c.create()); - if (testscript) testscript->setParent(this); - else { executefailure(); exit(-1); } - testscriptidx = 0; -} - -void QDeclarativeTester::save() -{ - QString filename = m_script + QLatin1String(".qml"); - QFileInfo filenameInfo(filename); - QDir saveDir = filenameInfo.absoluteDir(); - saveDir.mkpath("."); - - QFile file(filename); - file.open(QIODevice::WriteOnly); - QTextStream ts(&file); - - ts << "import Qt.VisualTest 4.7\n\n"; - ts << "VisualTest {\n"; - - int imgCount = 0; - QList<KeyEvent> keyevents = m_savedKeyEvents; - QList<MouseEvent> mouseevents = m_savedMouseEvents; - for (int ii = 0; ii < m_savedFrameEvents.count(); ++ii) { - const FrameEvent &fe = m_savedFrameEvents.at(ii); - ts << " Frame {\n"; - ts << " msec: " << fe.msec << "\n"; - if (!fe.hash.isEmpty()) { - ts << " hash: \"" << fe.hash.toHex() << "\"\n"; - } else if (!fe.image.isNull()) { - QString filename = filenameInfo.baseName() + QLatin1Char('.') - + QString::number(imgCount) + ".png"; - fe.image.save(m_script + QLatin1Char('.') + QString::number(imgCount) + ".png"); - imgCount++; - ts << " image: \"" << filename << "\"\n"; - } - ts << " }\n"; - - while (!mouseevents.isEmpty() && - mouseevents.first().msec == fe.msec) { - MouseEvent me = mouseevents.takeFirst(); - - ts << " Mouse {\n"; - ts << " type: " << me.type << "\n"; - ts << " button: " << me.button << "\n"; - ts << " buttons: " << me.buttons << "\n"; - ts << " x: " << me.pos.x() << "; y: " << me.pos.y() << "\n"; - ts << " modifiers: " << me.modifiers << "\n"; - if (me.destination == ViewPort) - ts << " sendToViewport: true\n"; - ts << " }\n"; - } - - while (!keyevents.isEmpty() && - keyevents.first().msec == fe.msec) { - KeyEvent ke = keyevents.takeFirst(); - - ts << " Key {\n"; - ts << " type: " << ke.type << "\n"; - ts << " key: " << ke.key << "\n"; - ts << " modifiers: " << ke.modifiers << "\n"; - ts << " text: \"" << ke.text.toUtf8().toHex() << "\"\n"; - ts << " autorep: " << (ke.autorep?"true":"false") << "\n"; - ts << " count: " << ke.count << "\n"; - if (ke.destination == ViewPort) - ts << " sendToViewport: true\n"; - ts << " }\n"; - } - } - - ts << "}\n"; - file.close(); -} - -void QDeclarativeTester::updateCurrentTime(int msec) -{ -#ifndef NO_PRIVATE_HEADERS - QDeclarativeItemPrivate::setConsistentTime(msec); -#endif - if (!testscript && msec > 16 && options & QDeclarativeViewer::Snapshot) - return; - - QImage img(m_view->width(), m_view->height(), QImage::Format_RGB32); - - if (options & QDeclarativeViewer::TestImages) { - img.fill(qRgb(255,255,255)); - -#ifdef Q_OS_MAC - bool oldSmooth = qt_applefontsmoothing_enabled; - qt_applefontsmoothing_enabled = false; -#endif - QPainter p(&img); -#ifdef Q_OS_MAC - qt_applefontsmoothing_enabled = oldSmooth; -#endif - - m_view->render(&p); - } - - bool snapshot = msec == 16 && (options & QDeclarativeViewer::Snapshot - || (testscript && testscript->count() == 2)); - - FrameEvent fe; - fe.msec = msec; - if (msec == 0 || !(options & QDeclarativeViewer::TestImages)) { - // Skip first frame, skip if not doing images - } else if (0 == ((m_savedFrameEvents.count()-1) % 60) || snapshot) { - fe.image = img; - } else { - QCryptographicHash hash(QCryptographicHash::Md5); - hash.addData((const char *)img.bits(), img.bytesPerLine() * img.height()); - fe.hash = hash.result(); - } - m_savedFrameEvents.append(fe); - - // Deliver mouse events - filterEvents = false; - - if (!testscript) { - for (int ii = 0; ii < m_mouseEvents.count(); ++ii) { - MouseEvent &me = m_mouseEvents[ii]; - me.msec = msec; - QMouseEvent event(me.type, me.pos, me.button, me.buttons, me.modifiers); - - if (me.destination == View) { - QCoreApplication::sendEvent(m_view, &event); - } else { - QCoreApplication::sendEvent(m_view->viewport(), &event); - } - } - - for (int ii = 0; ii < m_keyEvents.count(); ++ii) { - KeyEvent &ke = m_keyEvents[ii]; - ke.msec = msec; - QKeyEvent event(ke.type, ke.key, ke.modifiers, ke.text, ke.autorep, ke.count); - - if (ke.destination == View) { - QCoreApplication::sendEvent(m_view, &event); - } else { - QCoreApplication::sendEvent(m_view->viewport(), &event); - } - } - m_savedMouseEvents.append(m_mouseEvents); - m_savedKeyEvents.append(m_keyEvents); - } - - m_mouseEvents.clear(); - m_keyEvents.clear(); - - // Advance test script - while (testscript && testscript->count() > testscriptidx) { - - QObject *event = testscript->event(testscriptidx); - - if (QDeclarativeVisualTestFrame *frame = qobject_cast<QDeclarativeVisualTestFrame *>(event)) { - if (frame->msec() < msec) { - if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record)) { - qWarning() << "QDeclarativeTester(" << m_script << "): Extra frame. Seen:" - << msec << "Expected:" << frame->msec(); - imagefailure(); - } - } else if (frame->msec() == msec) { - if (!frame->hash().isEmpty() && frame->hash().toUtf8() != fe.hash.toHex()) { - if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record)) { - qWarning() << "QDeclarativeTester(" << m_script << "): Mismatched frame hash at" << msec - << ". Seen:" << fe.hash.toHex() - << "Expected:" << frame->hash().toUtf8(); - imagefailure(); - } - } - } else if (frame->msec() > msec) { - break; - } - - if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record) && !frame->image().isEmpty()) { - QImage goodImage(frame->image().toLocalFile()); - if (frame->msec() == 16 && goodImage.size() != img.size()){ - //Also an image mismatch, but this warning is more informative. Only checked at start though. - qWarning() << "QDeclarativeTester(" << m_script << "): Size mismatch. This test must be run at " << goodImage.size(); - imagefailure(); - } - if (goodImage != img) { - QString reject(frame->image().toLocalFile() + ".reject.png"); - qWarning() << "QDeclarativeTester(" << m_script << "): Image mismatch. Reject saved to:" - << reject; - img.save(reject); - bool doDiff = (goodImage.size() == img.size()); - if (doDiff) { - QImage diffimg(m_view->width(), m_view->height(), QImage::Format_RGB32); - diffimg.fill(qRgb(255,255,255)); - QPainter p(&diffimg); - int diffCount = 0; - for (int x = 0; x < img.width(); ++x) { - for (int y = 0; y < img.height(); ++y) { - if (goodImage.pixel(x,y) != img.pixel(x,y)) { - ++diffCount; - p.drawPoint(x,y); - } - } - } - QString diff(frame->image().toLocalFile() + ".diff.png"); - diffimg.save(diff); - qWarning().nospace() << " Diff (" << diffCount << " pixels differed) saved to: " << diff; - } - imagefailure(); - } - } - } else if (QDeclarativeVisualTestMouse *mouse = qobject_cast<QDeclarativeVisualTestMouse *>(event)) { - QPoint pos(mouse->x(), mouse->y()); - QPoint globalPos = m_view->mapToGlobal(QPoint(0, 0)) + pos; - QMouseEvent event((QEvent::Type)mouse->type(), pos, globalPos, (Qt::MouseButton)mouse->button(), (Qt::MouseButtons)mouse->buttons(), (Qt::KeyboardModifiers)mouse->modifiers()); - - MouseEvent me(&event); - me.msec = msec; - if (!mouse->sendToViewport()) { - QCoreApplication::sendEvent(m_view, &event); - me.destination = View; - } else { - QCoreApplication::sendEvent(m_view->viewport(), &event); - me.destination = ViewPort; - } - m_savedMouseEvents.append(me); - } else if (QDeclarativeVisualTestKey *key = qobject_cast<QDeclarativeVisualTestKey *>(event)) { - - QKeyEvent event((QEvent::Type)key->type(), key->key(), (Qt::KeyboardModifiers)key->modifiers(), QString::fromUtf8(QByteArray::fromHex(key->text().toUtf8())), key->autorep(), key->count()); - - KeyEvent ke(&event); - ke.msec = msec; - if (!key->sendToViewport()) { - QCoreApplication::sendEvent(m_view, &event); - ke.destination = View; - } else { - QCoreApplication::sendEvent(m_view->viewport(), &event); - ke.destination = ViewPort; - } - m_savedKeyEvents.append(ke); - } - testscriptidx++; - } - - filterEvents = true; - - if (testscript && testscript->count() <= testscriptidx) { - //if (msec == 16) //for a snapshot, leave it up long enough to see - // (void)::sleep(1); - complete(); - } -} - -void QDeclarativeTester::registerTypes() -{ - qmlRegisterType<QDeclarativeVisualTest>("Qt.VisualTest", 4,7, "VisualTest"); - qmlRegisterType<QDeclarativeVisualTestFrame>("Qt.VisualTest", 4,7, "Frame"); - qmlRegisterType<QDeclarativeVisualTestMouse>("Qt.VisualTest", 4,7, "Mouse"); - qmlRegisterType<QDeclarativeVisualTestKey>("Qt.VisualTest", 4,7, "Key"); -} - -QT_END_NAMESPACE diff --git a/share/qtcreator/qml/qmlobserver/qdeclarativetester.h b/share/qtcreator/qml/qmlobserver/qdeclarativetester.h deleted file mode 100644 index d370a102090..00000000000 --- a/share/qtcreator/qml/qmlobserver/qdeclarativetester.h +++ /dev/null @@ -1,280 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QDECLARATIVETESTER_H -#define QDECLARATIVETESTER_H - -#include <qmlruntime.h> - -#include <qdeclarativelist.h> -#include <qdeclarative.h> - -#include <QMouseEvent> -#include <QKeyEvent> -#include <QImage> -#include <QUrl> -#include <QEvent> -#include <QAbstractAnimation> - -QT_BEGIN_NAMESPACE - -class QDeclarativeVisualTest : public QObject -{ - Q_OBJECT - Q_PROPERTY(QDeclarativeListProperty<QObject> events READ events CONSTANT) - Q_CLASSINFO("DefaultProperty", "events") -public: - QDeclarativeVisualTest() {} - - QDeclarativeListProperty<QObject> events() { return QDeclarativeListProperty<QObject>(this, m_events); } - - int count() const { return m_events.count(); } - QObject *event(int idx) { return m_events.at(idx); } - -private: - QList<QObject *> m_events; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QDeclarativeVisualTest) - -QT_BEGIN_NAMESPACE - -class QDeclarativeVisualTestFrame : public QObject -{ - Q_OBJECT - Q_PROPERTY(int msec READ msec WRITE setMsec) - Q_PROPERTY(QString hash READ hash WRITE setHash) - Q_PROPERTY(QUrl image READ image WRITE setImage) -public: - QDeclarativeVisualTestFrame() : m_msec(-1) {} - - int msec() const { return m_msec; } - void setMsec(int m) { m_msec = m; } - - QString hash() const { return m_hash; } - void setHash(const QString &hash) { m_hash = hash; } - - QUrl image() const { return m_image; } - void setImage(const QUrl &image) { m_image = image; } - -private: - int m_msec; - QString m_hash; - QUrl m_image; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QDeclarativeVisualTestFrame) - -QT_BEGIN_NAMESPACE - -class QDeclarativeVisualTestMouse : public QObject -{ - Q_OBJECT - Q_PROPERTY(int type READ type WRITE setType) - Q_PROPERTY(int button READ button WRITE setButton) - Q_PROPERTY(int buttons READ buttons WRITE setButtons) - Q_PROPERTY(int x READ x WRITE setX) - Q_PROPERTY(int y READ y WRITE setY) - Q_PROPERTY(int modifiers READ modifiers WRITE setModifiers) - Q_PROPERTY(bool sendToViewport READ sendToViewport WRITE setSendToViewport) -public: - QDeclarativeVisualTestMouse() : m_type(0), m_button(0), m_buttons(0), m_x(0), m_y(0), m_modifiers(0), m_viewport(false) {} - - int type() const { return m_type; } - void setType(int t) { m_type = t; } - - int button() const { return m_button; } - void setButton(int b) { m_button = b; } - - int buttons() const { return m_buttons; } - void setButtons(int b) { m_buttons = b; } - - int x() const { return m_x; } - void setX(int x) { m_x = x; } - - int y() const { return m_y; } - void setY(int y) { m_y = y; } - - int modifiers() const { return m_modifiers; } - void setModifiers(int modifiers) { m_modifiers = modifiers; } - - bool sendToViewport() const { return m_viewport; } - void setSendToViewport(bool v) { m_viewport = v; } -private: - int m_type; - int m_button; - int m_buttons; - int m_x; - int m_y; - int m_modifiers; - bool m_viewport; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QDeclarativeVisualTestMouse) - -QT_BEGIN_NAMESPACE - -class QDeclarativeVisualTestKey : public QObject -{ - Q_OBJECT - Q_PROPERTY(int type READ type WRITE setType) - Q_PROPERTY(int key READ key WRITE setKey) - Q_PROPERTY(int modifiers READ modifiers WRITE setModifiers) - Q_PROPERTY(QString text READ text WRITE setText) - Q_PROPERTY(bool autorep READ autorep WRITE setAutorep) - Q_PROPERTY(int count READ count WRITE setCount) - Q_PROPERTY(bool sendToViewport READ sendToViewport WRITE setSendToViewport) -public: - QDeclarativeVisualTestKey() : m_type(0), m_key(0), m_modifiers(0), m_autorep(false), m_count(0), m_viewport(false) {} - - int type() const { return m_type; } - void setType(int t) { m_type = t; } - - int key() const { return m_key; } - void setKey(int k) { m_key = k; } - - int modifiers() const { return m_modifiers; } - void setModifiers(int m) { m_modifiers = m; } - - QString text() const { return m_text; } - void setText(const QString &t) { m_text = t; } - - bool autorep() const { return m_autorep; } - void setAutorep(bool a) { m_autorep = a; } - - int count() const { return m_count; } - void setCount(int c) { m_count = c; } - - bool sendToViewport() const { return m_viewport; } - void setSendToViewport(bool v) { m_viewport = v; } -private: - int m_type; - int m_key; - int m_modifiers; - QString m_text; - bool m_autorep; - int m_count; - bool m_viewport; -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPE(QDeclarativeVisualTestKey) - -QT_BEGIN_NAMESPACE - -class QDeclarativeTester : public QAbstractAnimation -{ -public: - QDeclarativeTester(const QString &script, QDeclarativeViewer::ScriptOptions options, QDeclarativeView *parent); - ~QDeclarativeTester(); - - static void registerTypes(); - - virtual int duration() const; - - void run(); - void save(); - - void executefailure(); -protected: - virtual void updateCurrentTime(int msecs); - virtual bool eventFilter(QObject *, QEvent *); - -private: - QString m_script; - - void imagefailure(); - void complete(); - void testSkip(); - - enum Destination { View, ViewPort }; - void addKeyEvent(Destination, QKeyEvent *); - void addMouseEvent(Destination, QMouseEvent *); - QDeclarativeView *m_view; - - struct MouseEvent { - MouseEvent(QMouseEvent *e) - : type(e->type()), button(e->button()), buttons(e->buttons()), - pos(e->pos()), modifiers(e->modifiers()), destination(View) {} - - QEvent::Type type; - Qt::MouseButton button; - Qt::MouseButtons buttons; - QPoint pos; - Qt::KeyboardModifiers modifiers; - Destination destination; - - int msec; - }; - struct KeyEvent { - KeyEvent(QKeyEvent *e) - : type(e->type()), key(e->key()), modifiers(e->modifiers()), text(e->text()), - autorep(e->isAutoRepeat()), count(e->count()), destination(View) {} - QEvent::Type type; - int key; - Qt::KeyboardModifiers modifiers; - QString text; - bool autorep; - ushort count; - Destination destination; - - int msec; - }; - struct FrameEvent { - QImage image; - QByteArray hash; - int msec; - }; - QList<MouseEvent> m_mouseEvents; - QList<KeyEvent> m_keyEvents; - - QList<MouseEvent> m_savedMouseEvents; - QList<KeyEvent> m_savedKeyEvents; - QList<FrameEvent> m_savedFrameEvents; - bool filterEvents; - - QDeclarativeViewer::ScriptOptions options; - int testscriptidx; - QDeclarativeVisualTest *testscript; - - bool hasCompleted; - bool hasFailed; -}; - - -QT_END_NAMESPACE - -#endif // QDECLARATIVETESTER_H diff --git a/share/qtcreator/qml/qmlobserver/qml.icns b/share/qtcreator/qml/qmlobserver/qml.icns deleted file mode 100644 index c76051626a1cc12076136ba4dd816f5e82c563cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196156 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%0AbTg)2p8Oj9<Aex9DSe&bouaHAweQ|8ux%o|Vc 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 diff --git a/share/qtcreator/qml/qmlobserver/qml.pri b/share/qtcreator/qml/qmlobserver/qml.pri deleted file mode 100644 index 827a273249f..00000000000 --- a/share/qtcreator/qml/qmlobserver/qml.pri +++ /dev/null @@ -1,37 +0,0 @@ -QT += declarative script network sql -contains(QT_CONFIG, opengl) { - QT += opengl - DEFINES += GL_SUPPORTED -} - -INCLUDEPATH += $$PWD - -HEADERS += $$PWD/qmlruntime.h \ - $$PWD/proxysettings.h \ - $$PWD/qdeclarativetester.h \ - $$PWD/deviceorientation.h \ - $$PWD/loggerwidget.h -SOURCES += $$PWD/qmlruntime.cpp \ - $$PWD/proxysettings.cpp \ - $$PWD/qdeclarativetester.cpp \ - $$PWD/loggerwidget.cpp - -RESOURCES = $$PWD/browser/browser.qrc \ - $$PWD/startup/startup.qrc - -maemo5 { - QT += dbus - HEADERS += $$PWD/texteditautoresizer_maemo5.h - SOURCES += $$PWD/deviceorientation_maemo5.cpp - FORMS = $$PWD/recopts_maemo5.ui \ - $$PWD/proxysettings_maemo5.ui -} else:linux-g++-maemo { - QT += dbus - SOURCES += $$PWD/deviceorientation_harmattan.cpp - FORMS = $$PWD/recopts.ui \ - $$PWD/proxysettings.ui -} else { - SOURCES += $$PWD/deviceorientation.cpp - FORMS = $$PWD/recopts.ui \ - $$PWD/proxysettings.ui -} diff --git a/share/qtcreator/qml/qmlobserver/qmlobserver.pro b/share/qtcreator/qml/qmlobserver/qmlobserver.pro deleted file mode 100644 index 503a375dc5d..00000000000 --- a/share/qtcreator/qml/qmlobserver/qmlobserver.pro +++ /dev/null @@ -1,73 +0,0 @@ -TEMPLATE = app - -CONFIG += qt uic - -include(qml.pri) - -SOURCES += main.cpp - -exists($$PWD/../qmljsdebugger/qmljsdebugger-src.pri) { - # directly compile in debugger files - include($$PWD/../qmljsdebugger/qmljsdebugger-src.pri) -} else { - # INCLUDEPATH and library path has to be extended by qmake call - DEBUGLIB=QmlJSDebugger - CONFIG(debug, debug|release) { - windows:DEBUGLIB = QmlJSDebuggerd - } - LIBS+=-l$$DEBUGLIB -} - -#INCLUDEPATH += ../../include/QtDeclarative -#INCLUDEPATH += ../../src/declarative/util -#INCLUDEPATH += ../../src/declarative/graphicsitems - -!exists($$[QT_INSTALL_HEADERS]/QtCore/private/qabstractanimation_p.h) { - DEFINES += NO_PRIVATE_HEADERS -} - -target.path = $$[QT_INSTALL_BINS] -INSTALLS += target - -wince* { - QT += xml - - contains(QT_CONFIG, scripttools) { - QT += scripttools - } - contains(QT_CONFIG, phonon) { - QT += phonon - } - contains(QT_CONFIG, xmlpatterns) { - QT += xmlpatterns - } - contains(QT_CONFIG, webkit) { - QT += webkit - } -} -maemo5 { - QT += maemo5 -} -symbian { - TARGET.UID3 = 0x20021317 - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) - TARGET.EPOCHEAPSIZE = 0x20000 0x4000000 - TARGET.CAPABILITY = NetworkServices ReadUserData - !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) { - LIBS += -lsensrvclient -lsensrvutil - } - contains(QT_CONFIG, s60): { - LIBS += -lavkon -lcone - } -} - -# generation of Info.plist from Info.plist.in is handled by static.pro -# compiling this project directly from the Qt Creator source tree does not work -OTHER_FILES+=Info.plist -mac { - QMAKE_INFO_PLIST=Info.plist - TARGET=QMLObserver - ICON=qml.icns -} else { - TARGET=qmlobserver -} diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.cpp b/share/qtcreator/qml/qmlobserver/qmlruntime.cpp deleted file mode 100644 index 39c39046b6d..00000000000 --- a/share/qtcreator/qml/qmlobserver/qmlruntime.cpp +++ /dev/null @@ -1,1633 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include <qdeclarativeview.h> - -#ifdef hz -#undef hz -#endif -#ifdef Q_WS_MAEMO_5 -# include <QMaemo5ValueButton> -# include <QMaemo5ListPickSelector> -# include <QWidgetAction> -# include <QStringListModel> -# include "ui_recopts_maemo5.h" -#else -# include "ui_recopts.h" -#endif - -#include "qmlruntime.h" -#include <qdeclarativecontext.h> -#include <qdeclarativeengine.h> -#include <qdeclarativenetworkaccessmanagerfactory.h> -#include "qdeclarative.h" -#include <QAbstractAnimation> -#ifndef NO_PRIVATE_HEADERS -#include <private/qabstractanimation_p.h> -#endif - -#include <qdeclarativeviewinspector.h> -#include <qdeclarativeinspectorservice.h> - -#include <QNetworkReply> -#include <QNetworkCookieJar> -#include <QNetworkDiskCache> -#include <QNetworkAccessManager> -#include <QNetworkProxyFactory> - -#include <QDeclarativeComponent> - -#include <QWidget> -#include <QApplication> -#include <QTextBrowser> -#include <QVBoxLayout> -#include <QProgressDialog> -#include <QMenuBar> -#include <QMenu> -#include <QAction> -#include <QFileDialog> -#include <QInputDialog> -#include <QGraphicsObject> -#include <QKeyEvent> - -#include <QSignalMapper> -#include <QSettings> -#include <QXmlStreamReader> -#include <QBuffer> -#include <QTranslator> -#include <QDir> -#include <QFile> -#include <QFileInfo> -#include <QProcess> -#include <QTimer> -#include <QMutex> -#include <QMutexLocker> - -#include "proxysettings.h" -#include "deviceorientation.h" - -#ifdef GL_SUPPORTED -#include <QGLWidget> -#endif - -#if defined(Q_WS_S60) -#include <aknappui.h> // For locking app orientation -#endif - -#include <qdeclarativetester.h> - -#include "jsdebuggeragent.h" - -QT_BEGIN_NAMESPACE - -class DragAndDropView : public QDeclarativeView -{ - Q_OBJECT -public: - DragAndDropView(QDeclarativeViewer *parent = 0) - : QDeclarativeView(parent) - { - setAcceptDrops(true); - } - - void dragEnterEvent(QDragEnterEvent *event) - { - const QMimeData *mimeData = event->mimeData(); - if (mimeData->hasUrls()) - event->acceptProposedAction(); - } - - void dragMoveEvent(QDragMoveEvent *event) - { - event->acceptProposedAction(); - } - - void dragLeaveEvent(QDragLeaveEvent *event) - { - event->accept(); - } - - void dropEvent(QDropEvent *event) - { - const QMimeData *mimeData = event->mimeData(); - if (!mimeData->hasUrls()) - return; - const QList<QUrl> urlList = mimeData->urls(); - foreach (const QUrl &url, urlList) { - if (url.scheme() == QLatin1String("file")) { - static_cast<QDeclarativeViewer *>(parent())->open(url.toLocalFile()); - event->accept(); - return; - } - } - } -}; - -class Runtime : public QObject -{ - Q_OBJECT - - Q_PROPERTY(bool isActiveWindow READ isActiveWindow NOTIFY isActiveWindowChanged) - Q_PROPERTY(DeviceOrientation::Orientation orientation READ orientation NOTIFY orientationChanged) - -public: - static Runtime* instance() - { - static Runtime *instance = 0; - if (!instance) - instance = new Runtime; - return instance; - } - - bool isActiveWindow() const { return activeWindow; } - void setActiveWindow(bool active) - { - if (active == activeWindow) - return; - activeWindow = active; - emit isActiveWindowChanged(); - } - - DeviceOrientation::Orientation orientation() const { return DeviceOrientation::instance()->orientation(); } - -Q_SIGNALS: - void isActiveWindowChanged(); - void orientationChanged(); - -private: - Runtime(QObject *parent=0) : QObject(parent), activeWindow(false) - { - connect(DeviceOrientation::instance(), SIGNAL(orientationChanged()), - this, SIGNAL(orientationChanged())); - } - - bool activeWindow; -}; - - - -#if defined(Q_WS_MAEMO_5) - -class Maemo5PickerAction : public QWidgetAction { - Q_OBJECT -public: - Maemo5PickerAction(const QString &text, QActionGroup *actions, QObject *parent) - : QWidgetAction(parent), m_text(text), m_actions(actions) - { } - - QWidget *createWidget(QWidget *parent) - { - QMaemo5ValueButton *button = new QMaemo5ValueButton(m_text, parent); - button->setValueLayout(QMaemo5ValueButton::ValueUnderTextCentered); - QMaemo5ListPickSelector *pick = new QMaemo5ListPickSelector(button); - button->setPickSelector(pick); - if (m_actions) { - QStringList sl; - int curIdx = -1, idx = 0; - foreach (QAction *a, m_actions->actions()) { - sl << a->text(); - if (a->isChecked()) - curIdx = idx; - idx++; - } - pick->setModel(new QStringListModel(sl)); - pick->setCurrentIndex(curIdx); - } else { - button->setEnabled(false); - } - connect(pick, SIGNAL(selected(QString)), this, SLOT(emitTriggered())); - return button; - } - -private slots: - void emitTriggered() - { - QMaemo5ListPickSelector *pick = qobject_cast<QMaemo5ListPickSelector *>(sender()); - if (!pick) - return; - int idx = pick->currentIndex(); - - if (m_actions && idx >= 0 && idx < m_actions->actions().count()) - m_actions->actions().at(idx)->trigger(); - } - -private: - QString m_text; - QPointer<QActionGroup> m_actions; -}; - -#endif // Q_WS_MAEMO_5 - -static struct { const char *name, *args; } ffmpegprofiles[] = { - {"Maximum Quality", "-sameq"}, - {"High Quality", "-qmax 2"}, - {"Medium Quality", "-qmax 6"}, - {"Low Quality", "-qmax 16"}, - {"Custom ffmpeg arguments", ""}, - {0,0} -}; - -class RecordingDialog : public QDialog, public Ui::RecordingOptions { - Q_OBJECT - -public: - RecordingDialog(QWidget *parent) : QDialog(parent) - { - setupUi(this); -#ifndef Q_WS_MAEMO_5 - hz->setValidator(new QDoubleValidator(hz)); -#endif - for (int i=0; ffmpegprofiles[i].name; ++i) { - profile->addItem(ffmpegprofiles[i].name); - } - } - - void setArguments(QString a) - { - int i; - for (i=0; ffmpegprofiles[i].args[0]; ++i) { - if (ffmpegprofiles[i].args == a) { - profile->setCurrentIndex(i); - args->setText(QLatin1String(ffmpegprofiles[i].args)); - return; - } - } - customargs = a; - args->setText(a); - profile->setCurrentIndex(i); - } - - QString arguments() const - { - int i = profile->currentIndex(); - return ffmpegprofiles[i].args[0] ? QLatin1String(ffmpegprofiles[i].args) : customargs; - } - - void setOriginalSize(const QSize &s) - { - QString str = tr("Original (%1x%2)").arg(s.width()).arg(s.height()); - -#ifdef Q_WS_MAEMO_5 - sizeCombo->setItemText(0, str); -#else - sizeOriginal->setText(str); - if (sizeWidth->value()<=1) { - sizeWidth->setValue(s.width()); - sizeHeight->setValue(s.height()); - } -#endif - } - - void showffmpegOptions(bool b) - { -#ifdef Q_WS_MAEMO_5 - profileLabel->setVisible(b); - profile->setVisible(b); - ffmpegHelp->setVisible(b); - args->setVisible(b); -#else - ffmpegOptions->setVisible(b); -#endif - } - - void showRateOptions(bool b) - { -#ifdef Q_WS_MAEMO_5 - rateLabel->setVisible(b); - rateCombo->setVisible(b); -#else - rateOptions->setVisible(b); -#endif - } - - void setVideoRate(int rate) - { -#ifdef Q_WS_MAEMO_5 - int idx; - if (rate >= 60) - idx = 0; - else if (rate >= 50) - idx = 2; - else if (rate >= 25) - idx = 3; - else if (rate >= 24) - idx = 4; - else if (rate >= 20) - idx = 5; - else if (rate >= 15) - idx = 6; - else - idx = 7; - rateCombo->setCurrentIndex(idx); -#else - if (rate == 24) - hz24->setChecked(true); - else if (rate == 25) - hz25->setChecked(true); - else if (rate == 50) - hz50->setChecked(true); - else if (rate == 60) - hz60->setChecked(true); - else { - hzCustom->setChecked(true); - hz->setText(QString::number(rate)); - } -#endif - } - - int videoRate() const - { -#ifdef Q_WS_MAEMO_5 - switch (rateCombo->currentIndex()) { - case 0: return 60; - case 1: return 50; - case 2: return 25; - case 3: return 24; - case 4: return 20; - case 5: return 15; - case 7: return 10; - default: return 60; - } -#else - if (hz24->isChecked()) - return 24; - else if (hz25->isChecked()) - return 25; - else if (hz50->isChecked()) - return 50; - else if (hz60->isChecked()) - return 60; - else { - return hz->text().toInt(); - } -#endif - } - - QSize videoSize() const - { -#ifdef Q_WS_MAEMO_5 - switch (sizeCombo->currentIndex()) { - case 0: return QSize(); - case 1: return QSize(640,480); - case 2: return QSize(320,240); - case 3: return QSize(1280,720); - default: return QSize(); - } -#else - if (sizeOriginal->isChecked()) - return QSize(); - else if (size720p->isChecked()) - return QSize(1280,720); - else if (sizeVGA->isChecked()) - return QSize(640,480); - else if (sizeQVGA->isChecked()) - return QSize(320,240); - else - return QSize(sizeWidth->value(), sizeHeight->value()); -#endif - } - - - -private slots: - void pickProfile(int i) - { - if (ffmpegprofiles[i].args[0]) { - args->setText(QLatin1String(ffmpegprofiles[i].args)); - } else { - args->setText(customargs); - } - } - - void storeCustomArgs(QString s) - { - setArguments(s); - } - -private: - QString customargs; -}; - -class PersistentCookieJar : public QNetworkCookieJar { -public: - PersistentCookieJar(QObject *parent) : QNetworkCookieJar(parent) { load(); } - ~PersistentCookieJar() { save(); } - - virtual QList<QNetworkCookie> cookiesForUrl(const QUrl &url) const - { - QMutexLocker lock(&mutex); - return QNetworkCookieJar::cookiesForUrl(url); - } - - virtual bool setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url) - { - QMutexLocker lock(&mutex); - return QNetworkCookieJar::setCookiesFromUrl(cookieList, url); - } - -private: - void save() - { - QMutexLocker lock(&mutex); - QList<QNetworkCookie> list = allCookies(); - QByteArray data; - foreach (const QNetworkCookie &cookie, list) { - if (!cookie.isSessionCookie()) { - data.append(cookie.toRawForm()); - data.append('\n'); - } - } - QSettings settings; - settings.setValue("Cookies",data); - } - - void load() - { - QMutexLocker lock(&mutex); - QSettings settings; - QByteArray data = settings.value("Cookies").toByteArray(); - setAllCookies(QNetworkCookie::parseCookies(data)); - } - - mutable QMutex mutex; -}; - -class SystemProxyFactory : public QNetworkProxyFactory -{ -public: - SystemProxyFactory() : proxyDirty(true), httpProxyInUse(false) { - } - - virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query) - { - if (proxyDirty) - setupProxy(); - QString protocolTag = query.protocolTag(); - if (httpProxyInUse && (protocolTag == "http" || protocolTag == "https")) { - QList<QNetworkProxy> ret; - ret << httpProxy; - return ret; - } -#ifdef Q_OS_WIN - // systemProxyForQuery can take insanely long on Windows (QTBUG-10106) - return QNetworkProxyFactory::proxyForQuery(query); -#else - return QNetworkProxyFactory::systemProxyForQuery(query); -#endif - } - - void setupProxy() { - // Don't bother locking because we know that the proxy only - // changes in response to the settings dialog and that - // the view will be reloaded. - proxyDirty = false; - httpProxyInUse = ProxySettings::httpProxyInUse(); - if (httpProxyInUse) - httpProxy = ProxySettings::httpProxy(); - } - - void proxyChanged() { - proxyDirty = true; - } - -private: - volatile bool proxyDirty; - bool httpProxyInUse; - QNetworkProxy httpProxy; -}; - -class NetworkAccessManagerFactory : public QObject, public QDeclarativeNetworkAccessManagerFactory -{ - Q_OBJECT -public: - NetworkAccessManagerFactory() : cacheSize(0) {} - ~NetworkAccessManagerFactory() {} - - QNetworkAccessManager *create(QObject *parent); - - void setCacheSize(int size) { - if (size != cacheSize) { - cacheSize = size; - } - } - - void proxyChanged() { - foreach (QNetworkAccessManager *nam, namList) { - static_cast<SystemProxyFactory*>(nam->proxyFactory())->proxyChanged(); - } - } - - static PersistentCookieJar *cookieJar; - -private slots: - void managerDestroyed(QObject *obj) { - namList.removeOne(static_cast<QNetworkAccessManager*>(obj)); - } - -private: - QMutex mutex; - int cacheSize; - QList<QNetworkAccessManager*> namList; -}; - -PersistentCookieJar *NetworkAccessManagerFactory::cookieJar = 0; - -static void cleanup_cookieJar() -{ - delete NetworkAccessManagerFactory::cookieJar; - NetworkAccessManagerFactory::cookieJar = 0; -} - -QNetworkAccessManager *NetworkAccessManagerFactory::create(QObject *parent) -{ - QMutexLocker lock(&mutex); - QNetworkAccessManager *manager = new QNetworkAccessManager(parent); - if (!cookieJar) { - qAddPostRoutine(cleanup_cookieJar); - cookieJar = new PersistentCookieJar(0); - } - manager->setCookieJar(cookieJar); - cookieJar->setParent(0); - manager->setProxyFactory(new SystemProxyFactory); - if (cacheSize > 0) { - QNetworkDiskCache *cache = new QNetworkDiskCache; - cache->setCacheDirectory(QDir::tempPath()+QLatin1String("/qml-viewer-network-cache")); - cache->setMaximumCacheSize(cacheSize); - manager->setCache(cache); - } else { - manager->setCache(0); - } - connect(manager, SIGNAL(destroyed(QObject*)), this, SLOT(managerDestroyed(QObject*))); - namList.append(manager); - qDebug() << "created new network access manager for" << parent; - return manager; -} - -QString QDeclarativeViewer::getVideoFileName() -{ - QString title = convertAvailable || ffmpegAvailable ? tr("Save Video File") : tr("Save PNG Frames"); - QStringList types; - if (ffmpegAvailable) types += tr("Common Video files")+QLatin1String(" (*.avi *.mpeg *.mov)"); - if (convertAvailable) types += tr("GIF Animation")+QLatin1String(" (*.gif)"); - types += tr("Individual PNG frames")+QLatin1String(" (*.png)"); - if (ffmpegAvailable) types += tr("All ffmpeg formats (*.*)"); - return QFileDialog::getSaveFileName(this, title, "", types.join(";; ")); -} - -QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) - : QMainWindow(parent, flags) - , loggerWindow(new LoggerWidget(this)) - , frame_stream(0) - , rotateAction(0) - , orientation(0) - , showWarningsWindow(0) - , designModeBehaviorAction(0) - , m_scriptOptions(0) - , tester(0) - , useQmlFileBrowser(true) - , translator(0) -{ - QDeclarativeViewer::registerTypes(); - setWindowTitle(tr("Qt QML Viewer")); -#ifdef Q_WS_MAEMO_5 - setAttribute(Qt::WA_Maemo5StackedWindow); -// setPalette(QApplication::palette("QLabel")); -#endif - - devicemode = false; - canvas = 0; - record_autotime = 0; - record_rate = 50; - record_args += QLatin1String("-sameq"); - - recdlg = new RecordingDialog(this); - connect(recdlg->pickfile, SIGNAL(clicked()), this, SLOT(pickRecordingFile())); - senseFfmpeg(); - senseImageMagick(); - if (!ffmpegAvailable) - recdlg->showffmpegOptions(false); - if (!ffmpegAvailable && !convertAvailable) - recdlg->showRateOptions(false); - QString warn; - if (!ffmpegAvailable) { - if (!convertAvailable) - warn = tr("ffmpeg and ImageMagick not available - no video output"); - else - warn = tr("ffmpeg not available - GIF and PNG outputs only"); - recdlg->warning->setText(warn); - } else { - recdlg->warning->hide(); - } - - canvas = new DragAndDropView(this); - inspector = new QmlJSDebugger::QDeclarativeViewInspector(canvas, this); - new QmlJSDebugger::JSDebuggerAgent(canvas->engine()); - - canvas->setAttribute(Qt::WA_OpaquePaintEvent); - canvas->setAttribute(Qt::WA_NoSystemBackground); - - canvas->setFocus(); - - QObject::connect(canvas, SIGNAL(sceneResized(QSize)), this, SLOT(sceneResized(QSize))); - QObject::connect(canvas, SIGNAL(statusChanged(QDeclarativeView::Status)), this, SLOT(statusChanged())); - QObject::connect(canvas->engine(), SIGNAL(quit()), this, SLOT(close())); - - QObject::connect(warningsWidget(), SIGNAL(opened()), this, SLOT(warningsWidgetOpened())); - QObject::connect(warningsWidget(), SIGNAL(closed()), this, SLOT(warningsWidgetClosed())); - - if (!(flags & Qt::FramelessWindowHint)) { - createMenu(); - changeOrientation(orientation->actions().value(0)); - } else { - setMenuBar(0); - } - - setCentralWidget(canvas); - - namFactory = new NetworkAccessManagerFactory; - canvas->engine()->setNetworkAccessManagerFactory(namFactory); - - connect(&autoStartTimer, SIGNAL(timeout()), this, SLOT(autoStartRecording())); - connect(&autoStopTimer, SIGNAL(timeout()), this, SLOT(autoStopRecording())); - connect(&recordTimer, SIGNAL(timeout()), this, SLOT(recordFrame())); - connect(DeviceOrientation::instance(), SIGNAL(orientationChanged()), - this, SLOT(orientationChanged()), Qt::QueuedConnection); - autoStartTimer.setSingleShot(true); - autoStopTimer.setSingleShot(true); - recordTimer.setSingleShot(false); - - QObject::connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(appAboutToQuit())); -} - -QDeclarativeViewer::~QDeclarativeViewer() -{ - delete loggerWindow; - canvas->engine()->setNetworkAccessManagerFactory(0); - delete namFactory; -} - -void QDeclarativeViewer::setDesignModeBehavior(bool value) -{ - if (designModeBehaviorAction) - designModeBehaviorAction->setChecked(value); - inspector->setDesignModeBehavior(value); -} - -void QDeclarativeViewer::enableExperimentalGestures() -{ -#ifndef QT_NO_GESTURES - canvas->viewport()->grabGesture(Qt::TapGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); - canvas->viewport()->grabGesture(Qt::TapAndHoldGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); - canvas->viewport()->grabGesture(Qt::PanGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); - canvas->viewport()->grabGesture(Qt::PinchGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); - canvas->viewport()->grabGesture(Qt::SwipeGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); - canvas->viewport()->setAttribute(Qt::WA_AcceptTouchEvents); -#endif -} - -QDeclarativeView *QDeclarativeViewer::view() const -{ - return canvas; -} - -LoggerWidget *QDeclarativeViewer::warningsWidget() const -{ - return loggerWindow; -} - -void QDeclarativeViewer::createMenu() -{ - QAction *openAction = new QAction(tr("&Open..."), this); - openAction->setShortcuts(QKeySequence::Open); - connect(openAction, SIGNAL(triggered()), this, SLOT(openFile())); - - QAction *openUrlAction = new QAction(tr("Open &URL..."), this); - connect(openUrlAction, SIGNAL(triggered()), this, SLOT(openUrl())); - - QAction *reloadAction = new QAction(tr("&Reload"), this); - reloadAction->setShortcuts(QKeySequence::Refresh); - connect(reloadAction, SIGNAL(triggered()), this, SLOT(reload())); - - QAction *snapshotAction = new QAction(tr("&Take Snapshot"), this); - snapshotAction->setShortcut(QKeySequence("F3")); - connect(snapshotAction, SIGNAL(triggered()), this, SLOT(takeSnapShot())); - - recordAction = new QAction(tr("Start Recording &Video"), this); - recordAction->setShortcut(QKeySequence("F9")); - connect(recordAction, SIGNAL(triggered()), this, SLOT(toggleRecordingWithSelection())); - - QAction *recordOptions = new QAction(tr("Video &Options..."), this); - connect(recordOptions, SIGNAL(triggered()), this, SLOT(chooseRecordingOptions())); - - QMenu *playSpeedMenu = new QMenu(tr("Animation Speed"), this); - playSpeedMenuActions = new QActionGroup(this); - playSpeedMenuActions->setExclusive(true); - - QAction *speedAction = playSpeedMenu->addAction(tr("1x"), this, SLOT(changeAnimationSpeed())); - speedAction->setCheckable(true); - speedAction->setChecked(true); - speedAction->setData(1.0f); - playSpeedMenuActions->addAction(speedAction); - - speedAction = playSpeedMenu->addAction(tr("0.5x"), this, SLOT(changeAnimationSpeed())); - speedAction->setCheckable(true); - speedAction->setData(2.0f); - playSpeedMenuActions->addAction(speedAction); - - speedAction = playSpeedMenu->addAction(tr("0.25x"), this, SLOT(changeAnimationSpeed())); - speedAction->setCheckable(true); - speedAction->setData(4.0f); - playSpeedMenuActions->addAction(speedAction); - - speedAction = playSpeedMenu->addAction(tr("0.125x"), this, SLOT(changeAnimationSpeed())); - speedAction->setCheckable(true); - speedAction->setData(8.0f); - playSpeedMenuActions->addAction(speedAction); - - speedAction = playSpeedMenu->addAction(tr("0.1x"), this, SLOT(changeAnimationSpeed())); - speedAction->setCheckable(true); - speedAction->setData(10.0f); - playSpeedMenuActions->addAction(speedAction); - - pauseAnimationsAction = playSpeedMenu->addAction(tr("Pause"), inspector, SLOT(setAnimationPaused(bool))); - pauseAnimationsAction->setCheckable(true); - pauseAnimationsAction->setShortcut(QKeySequence("Ctrl+.")); - - animationStepAction = playSpeedMenu->addAction(tr("Pause and step"), this, SLOT(stepAnimations())); - animationStepAction->setShortcut(QKeySequence("Ctrl+,")); - - animationSetStepAction = playSpeedMenu->addAction(tr("Set step"), this, SLOT(setAnimationStep())); - m_stepSize = 40; - - QAction *playSpeedAction = new QAction(tr("Animations"), this); - playSpeedAction->setMenu(playSpeedMenu); - - connect(inspector, SIGNAL(animationSpeedChanged(qreal)), SLOT(animationSpeedChanged(qreal))); - connect(inspector, SIGNAL(animationPausedChanged(bool)), pauseAnimationsAction, SLOT(setChecked(bool))); - - showWarningsWindow = new QAction(tr("Show Warnings"), this); - showWarningsWindow->setCheckable((true)); - showWarningsWindow->setChecked(loggerWindow->isVisible()); - connect(showWarningsWindow, SIGNAL(triggered(bool)), this, SLOT(showWarnings(bool))); - - designModeBehaviorAction = new QAction(tr("&Inspector Mode"), this); - designModeBehaviorAction->setShortcut(QKeySequence("Ctrl+D")); - designModeBehaviorAction->setCheckable(true); - designModeBehaviorAction->setChecked(inspector->designModeBehavior()); - designModeBehaviorAction->setEnabled(QmlJSDebugger::QDeclarativeInspectorService::hasDebuggingClient()); - connect(designModeBehaviorAction, SIGNAL(triggered(bool)), this, SLOT(setDesignModeBehavior(bool))); - connect(inspector, SIGNAL(designModeBehaviorChanged(bool)), designModeBehaviorAction, SLOT(setChecked(bool))); - connect(QmlJSDebugger::QDeclarativeInspectorService::instance(), SIGNAL(debuggingClientChanged(bool)), - designModeBehaviorAction, SLOT(setEnabled(bool))); - - appOnTopAction = new QAction(tr("Keep Window on Top"), this); - appOnTopAction->setCheckable(true); - appOnTopAction->setChecked(inspector->showAppOnTop()); - - connect(appOnTopAction, SIGNAL(triggered(bool)), inspector, SLOT(setShowAppOnTop(bool))); - connect(inspector, SIGNAL(showAppOnTopChanged(bool)), appOnTopAction, SLOT(setChecked(bool))); - - QAction *proxyAction = new QAction(tr("HTTP &Proxy..."), this); - connect(proxyAction, SIGNAL(triggered()), this, SLOT(showProxySettings())); - - QAction *fullscreenAction = new QAction(tr("Full Screen"), this); - fullscreenAction->setCheckable(true); - connect(fullscreenAction, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); - - rotateAction = new QAction(tr("Rotate orientation"), this); - rotateAction->setShortcut(QKeySequence("Ctrl+T")); - connect(rotateAction, SIGNAL(triggered()), this, SLOT(rotateOrientation())); - - orientation = new QActionGroup(this); - orientation->setExclusive(true); - connect(orientation, SIGNAL(triggered(QAction*)), this, SLOT(changeOrientation(QAction*))); - - QAction *portraitAction = new QAction(tr("Portrait"), this); - portraitAction->setCheckable(true); - QAction *landscapeAction = new QAction(tr("Landscape"), this); - landscapeAction->setCheckable(true); - QAction *portraitInvAction = new QAction(tr("Portrait (inverted)"), this); - portraitInvAction->setCheckable(true); - QAction *landscapeInvAction = new QAction(tr("Landscape (inverted)"), this); - landscapeInvAction->setCheckable(true); - - QAction *aboutAction = new QAction(tr("&About Qt..."), this); - aboutAction->setMenuRole(QAction::AboutQtRole); - connect(aboutAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); - - QAction *closeAction = new QAction(tr("&Close"), this); - closeAction->setShortcuts(QKeySequence::Close); - connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); - - QAction *quitAction = new QAction(tr("&Quit"), this); - quitAction->setMenuRole(QAction::QuitRole); - quitAction->setShortcuts(QKeySequence::Quit); - connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); - - QMenuBar *menu = menuBar(); - if (!menu) - return; - -#if defined(Q_WS_MAEMO_5) - menu->addAction(openAction); - menu->addAction(openUrlAction); - menu->addAction(reloadAction); - - menu->addAction(snapshotAction); - menu->addAction(recordAction); - - menu->addAction(recordOptions); - menu->addAction(proxyAction); - - menu->addAction(playSpeedMenu); - menu->addAction(showWarningsWindow); - - orientation->addAction(landscapeAction); - orientation->addAction(portraitAction); - menu->addAction(new Maemo5PickerAction(tr("Set orientation"), orientation, this)); - menu->addAction(fullscreenAction); - return; -#endif // Q_WS_MAEMO_5 - - QMenu *fileMenu = menu->addMenu(tr("&File")); - fileMenu->addAction(openAction); - fileMenu->addAction(openUrlAction); - fileMenu->addAction(reloadAction); - fileMenu->addSeparator(); - fileMenu->addAction(closeAction); - fileMenu->addAction(quitAction); - - QMenu *recordMenu = menu->addMenu(tr("&Recording")); - recordMenu->addAction(snapshotAction); - recordMenu->addAction(recordAction); - - QMenu *debugMenu = menu->addMenu(tr("&Debugging")); - debugMenu->addMenu(playSpeedMenu); - debugMenu->addAction(showWarningsWindow); - debugMenu->addAction(designModeBehaviorAction); - debugMenu->addAction(appOnTopAction); - - QMenu *settingsMenu = menu->addMenu(tr("&Settings")); - settingsMenu->addAction(proxyAction); - settingsMenu->addAction(recordOptions); - settingsMenu->addMenu(loggerWindow->preferencesMenu()); - settingsMenu->addAction(rotateAction); - - QMenu *propertiesMenu = settingsMenu->addMenu(tr("Properties")); - - orientation->addAction(portraitAction); - orientation->addAction(landscapeAction); - orientation->addAction(portraitInvAction); - orientation->addAction(landscapeInvAction); - propertiesMenu->addActions(orientation->actions()); - - QMenu *helpMenu = menu->addMenu(tr("&Help")); - helpMenu->addAction(aboutAction); -} - -void QDeclarativeViewer::showProxySettings() -{ - ProxySettings settingsDlg (this); - - connect(&settingsDlg, SIGNAL(accepted()), this, SLOT(proxySettingsChanged())); - - settingsDlg.exec(); -} - -void QDeclarativeViewer::proxySettingsChanged() -{ - namFactory->proxyChanged(); - reload (); -} - -void QDeclarativeViewer::rotateOrientation() -{ -#if defined(Q_WS_S60) - CAknAppUi *appUi = static_cast<CAknAppUi *>(CEikonEnv::Static()->AppUi()); - if (appUi) { - CAknAppUi::TAppUiOrientation oldOrientation = appUi->Orientation(); - QString newOrientation; - if (oldOrientation == CAknAppUi::EAppUiOrientationPortrait) { - newOrientation = QLatin1String("Landscape"); - } else { - newOrientation = QLatin1String("Portrait"); - } - foreach (QAction *action, orientation->actions()) { - if (action->text() == newOrientation) { - changeOrientation(action); - } - } - } -#else - QAction *current = orientation->checkedAction(); - QList<QAction *> actions = orientation->actions(); - int index = actions.indexOf(current); - if (index < 0) - return; - - QAction *newOrientation = actions[(index + 1) % actions.count()]; - changeOrientation(newOrientation); -#endif -} - -void QDeclarativeViewer::toggleFullScreen() -{ - if (isFullScreen()) - showMaximized(); - else - showFullScreen(); -} - -void QDeclarativeViewer::showWarnings(bool show) -{ - loggerWindow->setVisible(show); -} - -void QDeclarativeViewer::warningsWidgetOpened() -{ - showWarningsWindow->setChecked(true); -} - -void QDeclarativeViewer::warningsWidgetClosed() -{ - showWarningsWindow->setChecked(false); -} - -void QDeclarativeViewer::takeSnapShot() -{ - static int snapshotcount = 1; - QString snapFileName = QString(QLatin1String("snapshot%1.png")).arg(snapshotcount); - QPixmap::grabWidget(canvas).save(snapFileName); - qDebug() << "Wrote" << snapFileName; - ++snapshotcount; -} - -void QDeclarativeViewer::pickRecordingFile() -{ - QString fileName = getVideoFileName(); - if (!fileName.isEmpty()) - recdlg->file->setText(fileName); -} - -void QDeclarativeViewer::chooseRecordingOptions() -{ - // File - recdlg->file->setText(record_file); - - // Size - recdlg->setOriginalSize(canvas->size()); - - // Rate - recdlg->setVideoRate(record_rate); - - - // Profile - recdlg->setArguments(record_args.join(" ")); - if (recdlg->exec()) { - // File - record_file = recdlg->file->text(); - // Size - record_outsize = recdlg->videoSize(); - // Rate - record_rate = recdlg->videoRate(); - // Profile - record_args = recdlg->arguments().split(QLatin1Char(' '),QString::SkipEmptyParts); - } -} - -void QDeclarativeViewer::toggleRecordingWithSelection() -{ - if (!recordTimer.isActive()) { - if (record_file.isEmpty()) { - QString fileName = getVideoFileName(); - if (fileName.isEmpty()) - return; - if (!fileName.contains(QRegExp(".[^\\/]*$"))) - fileName += ".avi"; - setRecordFile(fileName); - } - } - toggleRecording(); -} - -void QDeclarativeViewer::toggleRecording() -{ -#ifndef NO_PRIVATE_HEADERS - if (record_file.isEmpty()) { - toggleRecordingWithSelection(); - return; - } - bool recording = !recordTimer.isActive(); - recordAction->setText(recording ? tr("&Stop Recording Video\tF9") : tr("&Start Recording Video\tF9")); - setRecording(recording); -#endif -} - -void QDeclarativeViewer::pauseAnimations() -{ - inspector->setAnimationPaused(true); -} - -void QDeclarativeViewer::stepAnimations() -{ - inspector->setAnimationPaused(false); - QTimer::singleShot(m_stepSize, this, SLOT(pauseAnimations())); - } - -void QDeclarativeViewer::setAnimationStep() -{ - bool ok; - int stepSize = QInputDialog::getInt(this, tr("Set animation step duration"), - tr("Step duration (ms):"), m_stepSize, 20, 10000, 1, &ok); - if (ok) m_stepSize = stepSize; -} - -void QDeclarativeViewer::changeAnimationSpeed() -{ - if (QAction *action = qobject_cast<QAction*>(sender())) - inspector->setAnimationSpeed(action->data().toFloat()); -} - -void QDeclarativeViewer::addLibraryPath(const QString& lib) -{ - canvas->engine()->addImportPath(lib); -} - -void QDeclarativeViewer::addPluginPath(const QString& plugin) -{ - canvas->engine()->addPluginPath(plugin); -} - -void QDeclarativeViewer::reload() -{ - launch(currentFileOrUrl); -} - -void QDeclarativeViewer::openFile() -{ - QString cur = canvas->source().toLocalFile(); - if (useQmlFileBrowser) { - open("qrc:/browser/Browser.qml"); - } else { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open QML file"), cur, tr("QML Files (*.qml)")); - if (!fileName.isEmpty()) { - QFileInfo fi(fileName); - open(fi.absoluteFilePath()); - } - } -} - -void QDeclarativeViewer::openUrl() -{ - QString cur = canvas->source().toLocalFile(); - QString url= QInputDialog::getText(this, tr("Open QML file"), tr("URL of main QML file:"), QLineEdit::Normal, cur); - if (!url.isEmpty()) - open(url); -} - -void QDeclarativeViewer::statusChanged() -{ - if (canvas->status() == QDeclarativeView::Error && tester) - tester->executefailure(); - - if (canvas->status() == QDeclarativeView::Ready) { - initialSize = canvas->initialSize(); - updateSizeHints(true); - } -} - -void QDeclarativeViewer::launch(const QString& file_or_url) -{ - QMetaObject::invokeMethod(this, "open", Qt::QueuedConnection, Q_ARG(QString, file_or_url)); -} - -void QDeclarativeViewer::loadTranslationFile(const QString& directory) -{ - if (!translator) { - translator = new QTranslator(this); - QApplication::installTranslator(translator); - } - - translator->load(QLatin1String("qml_" )+QLocale::system().name(), directory + QLatin1String("/i18n")); -} - -void QDeclarativeViewer::loadDummyDataFiles(const QString& directory) -{ - QDir dir(directory+"/dummydata", "*.qml"); - QStringList list = dir.entryList(); - for (int i = 0; i < list.size(); ++i) { - QString qml = list.at(i); - QDeclarativeComponent comp(canvas->engine(), dir.filePath(qml)); - QObject *dummyData = comp.create(); - - if(comp.isError()) { - QList<QDeclarativeError> errors = comp.errors(); - foreach (const QDeclarativeError &error, errors) { - qWarning() << error; - } - if (tester) tester->executefailure(); - } - - if (dummyData) { - qWarning() << "Loaded dummy data:" << dir.filePath(qml); - qml.truncate(qml.length()-4); - canvas->rootContext()->setContextProperty(qml, dummyData); - dummyData->setParent(this); - } - } -} - -bool QDeclarativeViewer::open(const QString& file_or_url) -{ - currentFileOrUrl = file_or_url; - - QUrl url; - QFileInfo fi(file_or_url); - if (fi.exists()) - url = QUrl::fromLocalFile(fi.absoluteFilePath()); - else - url = QUrl(file_or_url); - setWindowTitle(tr("%1 - Qt QML Viewer").arg(file_or_url)); - -#ifndef NO_PRIVATE_HEADERS - if (!m_script.isEmpty()) - tester = new QDeclarativeTester(m_script, m_scriptOptions, canvas); -#endif - - delete canvas->rootObject(); - canvas->engine()->clearComponentCache(); - QDeclarativeContext *ctxt = canvas->rootContext(); - ctxt->setContextProperty("qmlViewer", this); - ctxt->setContextProperty("qmlViewerFolder", QDir::currentPath()); - ctxt->setContextProperty("runtime", Runtime::instance()); - - QString fileName = url.toLocalFile(); - if (!fileName.isEmpty()) { - fi.setFile(fileName); - if (fi.exists()) { - if (fi.suffix().toLower() != QLatin1String("qml")) { - qWarning() << "qml cannot open non-QML file" << fileName; - return false; - } - - QFileInfo fi(fileName); - loadTranslationFile(fi.path()); - loadDummyDataFiles(fi.path()); - } else { - qWarning() << "qml cannot find file:" << fileName; - return false; - } - } - - QTime t; - t.start(); - - canvas->setSource(url); - - return true; -} - -void QDeclarativeViewer::setAutoRecord(int from, int to) -{ - if (from==0) from=1; // ensure resized - record_autotime = to-from; - autoStartTimer.setInterval(from); - autoStartTimer.start(); -} - -void QDeclarativeViewer::setRecordArgs(const QStringList& a) -{ - record_args = a; -} - -void QDeclarativeViewer::setRecordFile(const QString& f) -{ - record_file = f; -} - -void QDeclarativeViewer::setRecordRate(int fps) -{ - record_rate = fps; -} - -void QDeclarativeViewer::sceneResized(QSize) -{ - updateSizeHints(); -} - -void QDeclarativeViewer::keyPressEvent(QKeyEvent *event) -{ - if (event->key() == Qt::Key_0 && devicemode) - exit(0); - else if (event->key() == Qt::Key_F1 || (event->key() == Qt::Key_1 && devicemode)) { - qDebug() << "F1 - help\n" - << "F2 - save test script\n" - << "F3 - take PNG snapshot\n" - << "F4 - show items and state\n" - << "F5 - reload QML\n" - << "F6 - show object tree\n" - << "F7 - show timing\n" - << "F9 - toggle video recording\n" - << "F10 - toggle orientation\n" - << "device keys: 0=quit, 1..8=F1..F8" - ; - } else if (event->key() == Qt::Key_F2 || (event->key() == Qt::Key_2 && devicemode)) { - if (tester && m_scriptOptions & Record) - tester->save(); - } else if (event->key() == Qt::Key_F3 || (event->key() == Qt::Key_3 && devicemode)) { - takeSnapShot(); - } else if (event->key() == Qt::Key_F5 || (event->key() == Qt::Key_5 && devicemode)) { - reload(); - } else if (event->key() == Qt::Key_F9 || (event->key() == Qt::Key_9 && devicemode)) { - toggleRecording(); - } else if (event->key() == Qt::Key_F10) { - rotateOrientation(); - } - - QWidget::keyPressEvent(event); -} - -bool QDeclarativeViewer::event(QEvent *event) -{ - if (event->type() == QEvent::WindowActivate) { - Runtime::instance()->setActiveWindow(true); - DeviceOrientation::instance()->resumeListening(); - } else if (event->type() == QEvent::WindowDeactivate) { - Runtime::instance()->setActiveWindow(false); - DeviceOrientation::instance()->pauseListening(); - } - return QWidget::event(event); -} - -void QDeclarativeViewer::senseImageMagick() -{ - QProcess proc; - proc.start("convert", QStringList() << "-h"); - proc.waitForFinished(2000); - QString help = proc.readAllStandardOutput(); - convertAvailable = help.contains("ImageMagick"); -} - -void QDeclarativeViewer::senseFfmpeg() -{ - QProcess proc; - proc.start("ffmpeg", QStringList() << "-h"); - proc.waitForFinished(2000); - QString ffmpegHelp = proc.readAllStandardOutput(); - ffmpegAvailable = ffmpegHelp.contains("-s "); - ffmpegHelp = tr("Video recording uses ffmpeg:")+"\n\n"+ffmpegHelp; - - QDialog *d = new QDialog(recdlg); - QVBoxLayout *l = new QVBoxLayout(d); - QTextBrowser *b = new QTextBrowser(d); - QFont f = b->font(); - f.setFamily("courier"); - b->setFont(f); - b->setText(ffmpegHelp); - l->addWidget(b); - d->setLayout(l); - ffmpegHelpWindow = d; - connect(recdlg->ffmpegHelp,SIGNAL(clicked()), ffmpegHelpWindow, SLOT(show())); -} - -void QDeclarativeViewer::setRecording(bool on) -{ - if (on == recordTimer.isActive()) - return; - - int period = int(1000/record_rate+0.5); -#ifndef NO_PRIVATE_HEADERS - QUnifiedTimer::instance()->setTimingInterval(on ? period:16); - QUnifiedTimer::instance()->setConsistentTiming(on); -#endif - if (on) { - canvas->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); - recordTimer.setInterval(period); - recordTimer.start(); - frame_fmt = record_file.right(4).toLower(); - frame = QImage(canvas->width(),canvas->height(),QImage::Format_RGB32); - if (frame_fmt != ".png" && (!convertAvailable || frame_fmt != ".gif")) { - // Stream video to ffmpeg - - QProcess *proc = new QProcess(this); - connect(proc, SIGNAL(finished(int)), this, SLOT(ffmpegFinished(int))); - frame_stream = proc; - - QStringList args; - args << "-y"; - args << "-r" << QString::number(record_rate); - args << "-f" << "rawvideo"; - args << "-pix_fmt" << (frame_fmt == ".gif" ? "rgb24" : "rgb32"); - args << "-s" << QString("%1x%2").arg(canvas->width()).arg(canvas->height()); - args << "-i" << "-"; - if (record_outsize.isValid()) { - args << "-s" << QString("%1x%2").arg(record_outsize.width()).arg(record_outsize.height()); - args << "-aspect" << QString::number(double(canvas->width())/canvas->height()); - } - args += record_args; - args << record_file; - proc->start("ffmpeg",args); - - } else { - // Store frames, save to GIF/PNG - frame_stream = 0; - } - } else { - canvas->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); - recordTimer.stop(); - if (frame_stream) { - qDebug() << "Saving video..."; - frame_stream->close(); - qDebug() << "Wrote" << record_file; - } else { - QProgressDialog progress(tr("Saving frames..."), tr("Cancel"), 0, frames.count()+10, this); - progress.setWindowModality(Qt::WindowModal); - - int frame=0; - QStringList inputs; - qDebug() << "Saving frames..."; - - QString framename; - bool png_output = false; - if (record_file.right(4).toLower()==".png") { - if (record_file.contains('%')) - framename = record_file; - else - framename = record_file.left(record_file.length()-4)+"%04d"+record_file.right(4); - png_output = true; - } else { - framename = "tmp-frame%04d.png"; - png_output = false; - } - foreach (QImage* img, frames) { - progress.setValue(progress.value()+1); - if (progress.wasCanceled()) - break; - QString name; - name.sprintf(framename.toLocal8Bit(),frame++); - if (record_outsize.isValid()) - *img = img->scaled(record_outsize,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); - if (record_dither=="ordered") - img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither|Qt::OrderedDither).save(name); - else if (record_dither=="threshold") - img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither|Qt::ThresholdDither).save(name); - else if (record_dither=="floyd") - img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither).save(name); - else - img->save(name); - inputs << name; - delete img; - } - - if (!progress.wasCanceled()) { - if (png_output) { - framename.replace(QRegExp("%\\d*."),"*"); - qDebug() << "Wrote frames" << framename; - inputs.clear(); // don't remove them - } else { - // ImageMagick and gifsicle for GIF encoding - progress.setLabelText(tr("Converting frames to GIF file...")); - QStringList args; - args << "-delay" << QString::number(period/10); - args << inputs; - args << record_file; - qDebug() << "Converting..." << record_file << "(this may take a while)"; - if (0!=QProcess::execute("convert", args)) { - qWarning() << "Cannot run ImageMagick 'convert' - recorded frames not converted"; - inputs.clear(); // don't remove them - qDebug() << "Wrote frames tmp-frame*.png"; - } else { - if (record_file.right(4).toLower() == ".gif") { - qDebug() << "Compressing..." << record_file; - if (0!=QProcess::execute("gifsicle", QStringList() << "-O2" << "-o" << record_file << record_file)) - qWarning() << "Cannot run 'gifsicle' - not compressed"; - } - qDebug() << "Wrote" << record_file; - } - } - } - - progress.setValue(progress.maximum()-1); - foreach (const QString &name, inputs) - QFile::remove(name); - - frames.clear(); - } - } - qDebug() << "Recording: " << (recordTimer.isActive()?"ON":"OFF"); -} - -void QDeclarativeViewer::ffmpegFinished(int code) -{ - qDebug() << "ffmpeg returned" << code << frame_stream->readAllStandardError(); -} - -void QDeclarativeViewer::appAboutToQuit() -{ - // avoid QGLContext errors about invalid contexts on exit - canvas->setViewport(0); - - // avoid crashes if messages are received after app has closed - delete loggerWindow; - loggerWindow = 0; - delete tester; - tester = 0; -} - -void QDeclarativeViewer::autoStartRecording() -{ - setRecording(true); - autoStopTimer.setInterval(record_autotime); - autoStopTimer.start(); -} - -void QDeclarativeViewer::autoStopRecording() -{ - setRecording(false); -} - -void QDeclarativeViewer::recordFrame() -{ - canvas->QWidget::render(&frame); - if (frame_stream) { - if (frame_fmt == ".gif") { - // ffmpeg can't do 32bpp with gif - QImage rgb24 = frame.convertToFormat(QImage::Format_RGB888); - frame_stream->write((char*)rgb24.bits(),rgb24.numBytes()); - } else { - frame_stream->write((char*)frame.bits(),frame.numBytes()); - } - } else { - frames.append(new QImage(frame)); - } -} - -void QDeclarativeViewer::changeOrientation(QAction *action) -{ - if (!action) - return; - QString o = action->text(); - action->setChecked(true); -#if defined(Q_WS_S60) - CAknAppUi *appUi = static_cast<CAknAppUi *>(CEikonEnv::Static()->AppUi()); - if (appUi) { - CAknAppUi::TAppUiOrientation orientation = appUi->Orientation(); - if (o == QLatin1String("Auto-orientation")) { - appUi->SetOrientationL(CAknAppUi::EAppUiOrientationAutomatic); - rotateAction->setVisible(false); - } else if (o == QLatin1String("Portrait")) { - appUi->SetOrientationL(CAknAppUi::EAppUiOrientationPortrait); - rotateAction->setVisible(true); - } else if (o == QLatin1String("Landscape")) { - appUi->SetOrientationL(CAknAppUi::EAppUiOrientationLandscape); - rotateAction->setVisible(true); - } - } -#else - if (o == QLatin1String("Portrait")) - DeviceOrientation::instance()->setOrientation(DeviceOrientation::Portrait); - else if (o == QLatin1String("Landscape")) - DeviceOrientation::instance()->setOrientation(DeviceOrientation::Landscape); - else if (o == QLatin1String("Portrait (inverted)")) - DeviceOrientation::instance()->setOrientation(DeviceOrientation::PortraitInverted); - else if (o == QLatin1String("Landscape (inverted)")) - DeviceOrientation::instance()->setOrientation(DeviceOrientation::LandscapeInverted); -#endif -} - -void QDeclarativeViewer::orientationChanged() -{ - updateSizeHints(); -} - -void QDeclarativeViewer::animationSpeedChanged(qreal factor) -{ - foreach (QAction *action, playSpeedMenuActions->actions()) { - if (action->data().toFloat() == factor) { - action->setChecked(true); - break; - } - } -} - -void QDeclarativeViewer::setDeviceKeys(bool on) -{ - devicemode = on; -} - -void QDeclarativeViewer::setNetworkCacheSize(int size) -{ - namFactory->setCacheSize(size); -} - -void QDeclarativeViewer::setUseGL(bool useGL) -{ -#ifdef GL_SUPPORTED - if (useGL) { - QGLFormat format = QGLFormat::defaultFormat(); -#ifdef Q_OS_MAC - format.setSampleBuffers(true); -#else - format.setSampleBuffers(false); -#endif - - QGLWidget *glWidget = new QGLWidget(format); - //### potentially faster, but causes junk to appear if top-level is Item, not Rectangle - //glWidget->setAutoFillBackground(false); - - canvas->setViewport(glWidget); - } -#else - Q_UNUSED(useGL) -#endif -} - -void QDeclarativeViewer::setUseNativeFileBrowser(bool use) -{ - useQmlFileBrowser = !use; -} - -void QDeclarativeViewer::setSizeToView(bool sizeToView) -{ - QDeclarativeView::ResizeMode resizeMode = sizeToView ? QDeclarativeView::SizeRootObjectToView : QDeclarativeView::SizeViewToRootObject; - if (resizeMode != canvas->resizeMode()) { - canvas->setResizeMode(resizeMode); - updateSizeHints(); - } -} - -void QDeclarativeViewer::setStayOnTop(bool stayOnTop) -{ - appOnTopAction->setChecked(stayOnTop); -} - -void QDeclarativeViewer::updateSizeHints(bool initial) -{ - static bool isRecursive = false; - - if (isRecursive) - return; - isRecursive = true; - - if (initial || (canvas->resizeMode() == QDeclarativeView::SizeViewToRootObject)) { - QSize newWindowSize = initial ? initialSize : canvas->sizeHint(); - //qWarning() << "USH:" << (initial ? "INIT:" : "V2R:") << "setting fixed size " << newWindowSize; - if (!isFullScreen() && !isMaximized()) { - canvas->setFixedSize(newWindowSize); - resize(1, 1); - layout()->setSizeConstraint(QLayout::SetFixedSize); - layout()->activate(); - } - } - //qWarning() << "USH: R2V: setting free size "; - layout()->setSizeConstraint(QLayout::SetNoConstraint); - layout()->activate(); - setMinimumSize(minimumSizeHint()); - setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); - canvas->setMinimumSize(QSize(0,0)); - canvas->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); - - isRecursive = false; -} - -void QDeclarativeViewer::registerTypes() -{ - static bool registered = false; - - if (!registered) { - // registering only for exposing the DeviceOrientation::Orientation enum - qmlRegisterUncreatableType<DeviceOrientation>("Qt",4,7,"Orientation",""); - qmlRegisterUncreatableType<DeviceOrientation>("QtQuick",1,0,"Orientation",""); - registered = true; - } -} - -QT_END_NAMESPACE - -#include "qmlruntime.moc" diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.h b/share/qtcreator/qml/qmlobserver/qmlruntime.h deleted file mode 100644 index 7486373ac05..00000000000 --- a/share/qtcreator/qml/qmlobserver/qmlruntime.h +++ /dev/null @@ -1,214 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QMLRUNTIME_H -#define QMLRUNTIME_H - -#include <QMainWindow> -#include <QTimer> -#include <QTime> -#include <QList> - -#include "loggerwidget.h" - -namespace QmlJSDebugger { - class QDeclarativeViewInspector; -} - -QT_BEGIN_NAMESPACE - -class QDeclarativeView; -class PreviewDeviceSkin; -class QDeclarativeTestEngine; -class QProcess; -class RecordingDialog; -class QDeclarativeTester; -class QNetworkReply; -class QNetworkCookieJar; -class NetworkAccessManagerFactory; -class QTranslator; -class QActionGroup; -class QMenuBar; - -class QDeclarativeViewer - : public QMainWindow -{ - Q_OBJECT - -public: - QDeclarativeViewer(QWidget *parent = 0, Qt::WindowFlags flags = 0); - ~QDeclarativeViewer(); - - static void registerTypes(); - - enum ScriptOption { - Play = 0x00000001, - Record = 0x00000002, - TestImages = 0x00000004, - TestErrorProperty = 0x00000008, - SaveOnExit = 0x00000010, - ExitOnComplete = 0x00000020, - ExitOnFailure = 0x00000040, - Snapshot = 0x00000080, - TestSkipProperty = 0x00000100 - }; - Q_DECLARE_FLAGS(ScriptOptions, ScriptOption) - void setScript(const QString &s) { m_script = s; } - void setScriptOptions(ScriptOptions opt) { m_scriptOptions = opt; } - void setRecordDither(const QString& s) { record_dither = s; } - void setRecordRate(int fps); - void setRecordFile(const QString&); - void setRecordArgs(const QStringList&); - void setRecording(bool on); - bool isRecording() const { return recordTimer.isActive(); } - void setAutoRecord(int from, int to); - void setDeviceKeys(bool); - void setNetworkCacheSize(int size); - void addLibraryPath(const QString& lib); - void addPluginPath(const QString& plugin); - void setUseGL(bool use); - void setUseNativeFileBrowser(bool); - void setSizeToView(bool sizeToView); - void setStayOnTop(bool stayOnTop); - - QDeclarativeView *view() const; - LoggerWidget *warningsWidget() const; - QString currentFile() const { return currentFileOrUrl; } - - void enableExperimentalGestures(); - -public slots: - void setDesignModeBehavior(bool value); - void sceneResized(QSize size); - bool open(const QString&); - void openFile(); - void openUrl(); - void reload(); - void takeSnapShot(); - void toggleRecording(); - void toggleRecordingWithSelection(); - void ffmpegFinished(int code); - void showProxySettings (); - void proxySettingsChanged (); - void rotateOrientation(); - void statusChanged(); - void pauseAnimations(); - void stepAnimations(); - void setAnimationStep(); - void changeAnimationSpeed(); - void launch(const QString &); - -protected: - virtual void keyPressEvent(QKeyEvent *); - virtual bool event(QEvent *); - void createMenu(); - -private slots: - void appAboutToQuit(); - - void autoStartRecording(); - void autoStopRecording(); - void recordFrame(); - void chooseRecordingOptions(); - void pickRecordingFile(); - void toggleFullScreen(); - void changeOrientation(QAction*); - void orientationChanged(); - - void animationSpeedChanged(qreal factor); - - void showWarnings(bool show); - void warningsWidgetOpened(); - void warningsWidgetClosed(); - -private: - void updateSizeHints(bool initial = false); - - QString getVideoFileName(); - - LoggerWidget *loggerWindow; - QDeclarativeView *canvas; - QmlJSDebugger::QDeclarativeViewInspector *inspector; - QSize initialSize; - QString currentFileOrUrl; - QTimer recordTimer; - QString frame_fmt; - QImage frame; - QList<QImage*> frames; - QProcess* frame_stream; - QTimer autoStartTimer; - QTimer autoStopTimer; - QString record_dither; - QString record_file; - QSize record_outsize; - QStringList record_args; - int record_rate; - int record_autotime; - bool devicemode; - QAction *recordAction; - RecordingDialog *recdlg; - - void senseImageMagick(); - void senseFfmpeg(); - QWidget *ffmpegHelpWindow; - bool ffmpegAvailable; - bool convertAvailable; - - int m_stepSize; - QActionGroup *playSpeedMenuActions; - QAction *pauseAnimationsAction; - QAction *animationStepAction; - QAction *animationSetStepAction; - - QAction *rotateAction; - QActionGroup *orientation; - QAction *showWarningsWindow; - QAction *designModeBehaviorAction; - QAction *appOnTopAction; - - QString m_script; - ScriptOptions m_scriptOptions; - QDeclarativeTester *tester; - - QNetworkReply *wgtreply; - QString wgtdir; - NetworkAccessManagerFactory *namFactory; - - bool useQmlFileBrowser; - - QTranslator *translator; - void loadTranslationFile(const QString& directory); - - void loadDummyDataFiles(const QString& directory); -}; -Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeViewer::ScriptOptions) - -QT_END_NAMESPACE - -#endif // QMLRUNTIME_H diff --git a/share/qtcreator/qml/qmlobserver/recopts.ui b/share/qtcreator/qml/qmlobserver/recopts.ui deleted file mode 100644 index ce2da307673..00000000000 --- a/share/qtcreator/qml/qmlobserver/recopts.ui +++ /dev/null @@ -1,513 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>RecordingOptions</class> - <widget class="QDialog" name="RecordingOptions"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>316</width> - <height>436</height> - </rect> - </property> - <property name="windowTitle"> - <string>Video options</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QLabel" name="label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>File:</string> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="file"/> - </item> - <item> - <widget class="QToolButton" name="pickfile"> - <property name="text"> - <string>...</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string>Size</string> - </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> - <widget class="QRadioButton" name="sizeOriginal"> - <property name="text"> - <string/> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QRadioButton" name="sizeVGA"> - <property name="text"> - <string>VGA</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QRadioButton" name="size720p"> - <property name="text"> - <string>720p</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QRadioButton" name="sizeQVGA"> - <property name="text"> - <string>QVGA</string> - </property> - </widget> - </item> - <item row="2" column="0" colspan="3"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QRadioButton" name="sizeCustom"> - <property name="text"> - <string>Width:</string> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="sizeWidth"> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>9999</number> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Height:</string> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="sizeHeight"> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>9999</number> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="0" column="2"> - <spacer name="horizontalSpacer_4"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="rateOptions"> - <property name="title"> - <string>Rate</string> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="0"> - <widget class="QRadioButton" name="hz60"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>60Hz</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QRadioButton" name="hz50"> - <property name="text"> - <string>50Hz</string> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QRadioButton" name="hz25"> - <property name="text"> - <string>25Hz</string> - </property> - </widget> - </item> - <item row="2" column="0" colspan="4"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="QRadioButton" name="hzCustom"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="hz"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>60</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>100</width> - <height>16777215</height> - </size> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Hz</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="1" column="2"> - <widget class="QRadioButton" name="hz24"> - <property name="text"> - <string>24Hz</string> - </property> - </widget> - </item> - <item row="0" column="3"> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item row="0" column="1"> - <spacer name="horizontalSpacer_5"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="ffmpegOptions"> - <property name="title"> - <string>Profile</string> - </property> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0" colspan="3"> - <widget class="QComboBox" name="profile"/> - </item> - <item row="1" column="0" colspan="2"> - <widget class="QLineEdit" name="args"/> - </item> - <item row="1" column="2"> - <widget class="QToolButton" name="ffmpegHelp"> - <property name="text"> - <string>Help</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QLabel" name="warning"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <tabstops> - <tabstop>file</tabstop> - <tabstop>pickfile</tabstop> - <tabstop>sizeOriginal</tabstop> - <tabstop>sizeVGA</tabstop> - <tabstop>size720p</tabstop> - <tabstop>sizeQVGA</tabstop> - <tabstop>sizeCustom</tabstop> - <tabstop>sizeWidth</tabstop> - <tabstop>sizeHeight</tabstop> - <tabstop>hz60</tabstop> - <tabstop>hz25</tabstop> - <tabstop>hz50</tabstop> - <tabstop>hz24</tabstop> - <tabstop>hzCustom</tabstop> - <tabstop>hz</tabstop> - <tabstop>profile</tabstop> - <tabstop>args</tabstop> - <tabstop>ffmpegHelp</tabstop> - <tabstop>buttonBox</tabstop> - </tabstops> - <resources/> - <connections> - <connection> - <sender>hzCustom</sender> - <signal>clicked()</signal> - <receiver>hz</receiver> - <slot>setFocus()</slot> - <hints> - <hint type="sourcelabel"> - <x>43</x> - <y>257</y> - </hint> - <hint type="destinationlabel"> - <x>129</x> - <y>262</y> - </hint> - </hints> - </connection> - <connection> - <sender>hz</sender> - <signal>textChanged(QString)</signal> - <receiver>hzCustom</receiver> - <slot>toggle()</slot> - <hints> - <hint type="sourcelabel"> - <x>143</x> - <y>262</y> - </hint> - <hint type="destinationlabel"> - <x>43</x> - <y>257</y> - </hint> - </hints> - </connection> - <connection> - <sender>hz</sender> - <signal>selectionChanged()</signal> - <receiver>hzCustom</receiver> - <slot>toggle()</slot> - <hints> - <hint type="sourcelabel"> - <x>143</x> - <y>262</y> - </hint> - <hint type="destinationlabel"> - <x>43</x> - <y>257</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>RecordingOptions</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>258</x> - <y>424</y> - </hint> - <hint type="destinationlabel"> - <x>60</x> - <y>219</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>RecordingOptions</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>258</x> - <y>424</y> - </hint> - <hint type="destinationlabel"> - <x>92</x> - <y>219</y> - </hint> - </hints> - </connection> - <connection> - <sender>profile</sender> - <signal>activated(int)</signal> - <receiver>RecordingOptions</receiver> - <slot>pickProfile(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>92</x> - <y>329</y> - </hint> - <hint type="destinationlabel"> - <x>48</x> - <y>194</y> - </hint> - </hints> - </connection> - <connection> - <sender>args</sender> - <signal>textEdited(QString)</signal> - <receiver>RecordingOptions</receiver> - <slot>storeCustomArgs(QString)</slot> - <hints> - <hint type="sourcelabel"> - <x>128</x> - <y>357</y> - </hint> - <hint type="destinationlabel"> - <x>102</x> - <y>189</y> - </hint> - </hints> - </connection> - <connection> - <sender>sizeWidth</sender> - <signal>valueChanged(int)</signal> - <receiver>sizeCustom</receiver> - <slot>toggle()</slot> - <hints> - <hint type="sourcelabel"> - <x>108</x> - <y>133</y> - </hint> - <hint type="destinationlabel"> - <x>48</x> - <y>133</y> - </hint> - </hints> - </connection> - <connection> - <sender>sizeHeight</sender> - <signal>valueChanged(int)</signal> - <receiver>sizeCustom</receiver> - <slot>toggle()</slot> - <hints> - <hint type="sourcelabel"> - <x>212</x> - <y>133</y> - </hint> - <hint type="destinationlabel"> - <x>64</x> - <y>129</y> - </hint> - </hints> - </connection> - </connections> - <slots> - <signal>filePicked(QString)</signal> - <signal>argumentsPicked(QString)</signal> - <slot>pickFile()</slot> - <slot>pickProfile(int)</slot> - <slot>storeCustomArgs(QString)</slot> - </slots> -</ui> diff --git a/share/qtcreator/qml/qmlobserver/recopts_maemo5.ui b/share/qtcreator/qml/qmlobserver/recopts_maemo5.ui deleted file mode 100644 index 3bb5ecabd91..00000000000 --- a/share/qtcreator/qml/qmlobserver/recopts_maemo5.ui +++ /dev/null @@ -1,254 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>RecordingOptions</class> - <widget class="QDialog" name="RecordingOptions"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>469</width> - <height>142</height> - </rect> - </property> - <property name="windowTitle"> - <string>Video options</string> - </property> - <layout class="QGridLayout" name="gridLayout" columnstretch="0,2,0"> - <property name="sizeConstraint"> - <enum>QLayout::SetMinAndMaxSize</enum> - </property> - <property name="leftMargin"> - <number>16</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>16</number> - </property> - <property name="bottomMargin"> - <number>8</number> - </property> - <property name="horizontalSpacing"> - <number>16</number> - </property> - <property name="verticalSpacing"> - <number>0</number> - </property> - <item row="0" column="1"> - <widget class="QLineEdit" name="file"/> - </item> - <item row="0" column="2" rowspan="3"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>72</width> - <height>56</height> - </size> - </property> - </spacer> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string>Size</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QComboBox" name="sizeCombo"> - <item> - <property name="text"> - <string/> - </property> - </item> - <item> - <property name="text"> - <string>VGA</string> - </property> - </item> - <item> - <property name="text"> - <string>QVGA</string> - </property> - </item> - <item> - <property name="text"> - <string>720p</string> - </property> - </item> - </widget> - </item> - <item row="2" column="0" rowspan="2"> - <widget class="QLabel" name="rateLabel"> - <property name="text"> - <string>Rate</string> - </property> - </widget> - </item> - <item row="2" column="1" rowspan="2"> - <widget class="QComboBox" name="rateCombo"> - <item> - <property name="text"> - <string>60 Hz</string> - </property> - </item> - <item> - <property name="text"> - <string>50 Hz</string> - </property> - </item> - <item> - <property name="text"> - <string>25 Hz</string> - </property> - </item> - <item> - <property name="text"> - <string>24 Hz</string> - </property> - </item> - <item> - <property name="text"> - <string>20 Hz</string> - </property> - </item> - <item> - <property name="text"> - <string>15 Hz</string> - </property> - </item> - <item> - <property name="text"> - <string>10 Hz</string> - </property> - </item> - </widget> - </item> - <item row="5" column="1"> - <widget class="QLineEdit" name="args"/> - </item> - <item row="4" column="1"> - <widget class="QComboBox" name="profile"/> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="profileLabel"> - <property name="text"> - <string>Profile</string> - </property> - </widget> - </item> - <item row="6" column="0" colspan="2"> - <widget class="QLabel" name="warning"> - <property name="text"> - <string notr="true">warning</string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="4" column="2" rowspan="3"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QPushButton" name="pickfile"> - <property name="text"> - <string>File</string> - </property> - </widget> - </item> - <item row="5" column="0"> - <widget class="QPushButton" name="ffmpegHelp"> - <property name="text"> - <string>Options</string> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>RecordingOptions</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>258</x> - <y>424</y> - </hint> - <hint type="destinationlabel"> - <x>60</x> - <y>219</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>RecordingOptions</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>258</x> - <y>424</y> - </hint> - <hint type="destinationlabel"> - <x>92</x> - <y>219</y> - </hint> - </hints> - </connection> - <connection> - <sender>profile</sender> - <signal>activated(int)</signal> - <receiver>RecordingOptions</receiver> - <slot>pickProfile(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>92</x> - <y>329</y> - </hint> - <hint type="destinationlabel"> - <x>48</x> - <y>194</y> - </hint> - </hints> - </connection> - <connection> - <sender>args</sender> - <signal>textEdited(QString)</signal> - <receiver>RecordingOptions</receiver> - <slot>storeCustomArgs(QString)</slot> - <hints> - <hint type="sourcelabel"> - <x>128</x> - <y>357</y> - </hint> - <hint type="destinationlabel"> - <x>102</x> - <y>189</y> - </hint> - </hints> - </connection> - </connections> - <slots> - <signal>filePicked(QString)</signal> - <signal>argumentsPicked(QString)</signal> - <slot>pickFile()</slot> - <slot>pickProfile(int)</slot> - <slot>storeCustomArgs(QString)</slot> - </slots> -</ui> diff --git a/share/qtcreator/qml/qmlobserver/startup/Logo.qml b/share/qtcreator/qml/qmlobserver/startup/Logo.qml deleted file mode 100644 index 2bd7051e110..00000000000 --- a/share/qtcreator/qml/qmlobserver/startup/Logo.qml +++ /dev/null @@ -1,167 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -import QtQuick 2.1 - -Rectangle { - id: myApp - width: 411 - height: 411 - color: "transparent" - property alias logoState : myApp.state - signal animationFinished - - Item { - id: sketchBlueHolder - width: sketchLogo.width - height: sketchLogo.height - Image { - id: image1 - x: -44 - y: -45 - smooth: true - source: "shadow.png" - } - Item { - clip: true - width: sketchLogo.width - height: sketchLogo.height - Image { - id: sketchLogo - smooth: true - source: "qt-sketch.jpg" - } - Image { - id: blueLogo - y: -420 - smooth: true - source: "qt-blue.jpg" - } - } - } - - states: [ - State { - name: "showBlueprint" - PropertyChanges { - target: blueLogo - y: 0 - } - PropertyChanges { - target: sketchLogo - opacity: 0 - } - }, - State { - extend: "showBlueprint" - name: "finale" - PropertyChanges { - target: fullLogo - opacity: 1 - } - PropertyChanges { - target: backLogo - opacity: 1 - scale: 1 - } - PropertyChanges { - target: frontLogo - opacity: 1 - scale: 1 - } - PropertyChanges { - target: qtText - opacity: 1 - scale: 1 - } - PropertyChanges { - target: sketchBlueHolder - opacity: 0 - scale: 1.4 - } - } - ] - - transitions: [ - Transition { - to: "showBlueprint" - SequentialAnimation { - NumberAnimation { property: "y"; duration: 600; easing.type: "OutBounce" } - PropertyAction { target: sketchLogo; property: "opacity" } - } - }, - Transition { - to: "finale" - PropertyAction { target: fullLogo; property: "opacity" } - SequentialAnimation { - NumberAnimation { target: backLogo; properties: "scale, opacity"; duration: 300 } - NumberAnimation { target: frontLogo; properties: "scale, opacity"; duration: 300 } - ParallelAnimation { - NumberAnimation { target: qtText; properties: "opacity, scale"; duration: 400; easing.type: "OutQuad" } - NumberAnimation { target: sketchBlueHolder; property: "opacity"; duration: 300; easing.type: "OutQuad" } - NumberAnimation { target: sketchBlueHolder; property: "scale"; duration: 320; easing.type: "OutQuad" } - } - PauseAnimation { duration: 1000 } - ScriptAction { script: myApp.animationFinished() } - } - } - ] - - Item { - id: fullLogo - opacity: 0 - Image { - id: backLogo - x: -16 - y: -41 - opacity: 0 - scale: 0.7 - smooth: true - source: "qt-back.png" - } - Image { - id: frontLogo - x: -17 - y: -41 - opacity: 0 - scale: 1.2 - smooth: true - source: "qt-front.png" - } - Image { - id: qtText - x: -10 - y: -41 - opacity: 0 - scale: 1.2 - smooth: true - source: "qt-text.png" - } - } -} diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-back.png b/share/qtcreator/qml/qmlobserver/startup/qt-back.png deleted file mode 100644 index 077215f882f67b610bffdda72029ee8c2d7dd485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3549 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 Mj-hs$rhVw&00(;n>i_@% diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-blue.jpg b/share/qtcreator/qml/qmlobserver/startup/qt-blue.jpg deleted file mode 100644 index b2048964836a6ef5056b6caaef326212d9b65ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20900 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 ADF6Tf diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-front.png b/share/qtcreator/qml/qmlobserver/startup/qt-front.png deleted file mode 100644 index dbfb43e374bb55847bb209fa60db200d197f3bef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3318 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 Bie&%* diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-sketch.jpg b/share/qtcreator/qml/qmlobserver/startup/qt-sketch.jpg deleted file mode 100644 index 1ede6f079b534e6ea55c3fbbb1c4f01721054649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17048 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 MezF7YK@flc+2^Q6cmMzZ diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-text.png b/share/qtcreator/qml/qmlobserver/startup/qt-text.png deleted file mode 100644 index d44995c9b34ed3a9ff263becd861268e8a1b9441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14565 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 Q#RIyx3~rWQ|2yoz0ruY#x&QzG diff --git a/share/qtcreator/qml/qmlobserver/startup/quick-blur.png b/share/qtcreator/qml/qmlobserver/startup/quick-blur.png deleted file mode 100644 index 29ec2433874bc2da07776332cdca881e7a9c73c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2826 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 PX9R$@#30HpT)+DtH|&3( diff --git a/share/qtcreator/qml/qmlobserver/startup/quick-regular.png b/share/qtcreator/qml/qmlobserver/startup/quick-regular.png deleted file mode 100644 index 38321cbf19366635ad6f183a43a5ecda30304117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1399 zcmV--1&I2IP)<h;3K|Lk000e1NJLTq006!K002P*0{{R3ot^_?0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyFi=cXMgRZ*|NsC0|NsC0|NsC0|NsC0 z|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|4y&CKmY&$4|GyaQveYnGelKpcZiv) zyUgA0Mk@80000ESNkl<ZSi`kgy-piJ5MG19*npu+kso-02)Y!Jf;*Z>rcM#lrSuh% zh!iFG4UF;vcBJ(94UQB^N|GmlBt=R?FxdES<J;Z&*}Xjl#Cfap?d~_bGxL2jXCZDq zvUS<r6w@2~Qp&D(rZSn4{X4?XMIds=H&vI3rf)t93cux>I*ev6?})#w@K1eH?P%t2 zD)?ufnM|_fTl?oIF*2=G;=Aja$*GxI8u{5vzS-_w@hAN1m3$LR3V(XkTT}ScBlcDV zKb)>`$m{9h|3@C4Oy;|{j{aUl%F*6x^mrWMcaj#qSJ4?y3{-XgWf@)IXgbA-Ub#^J z9t9u|=j#1q^|s02Uz(i*k!fp@;&f3*yAWc*tUAz}=G*3XWP4UUd{;_w;)bFC3uP;( zp+uh11&+3476t0<>@n`T0Ae?Z2}~(6w6eQlM2gX67MxNvi!{F~xG6gJ0$C2VCtT|3 z5gPxl5MA(STV{=l=RDg~0~hSz%|A1IRT<=0j9<;B3m(m!c%<G|)pI`(GjAhUeYbTW z!f=(~^+|ek<p8!{v*_#~N&Doqp>p8URU;2$MEk*x{|FDgDADVTE=6)m72iH|f>;5k ztB27#!*8G~a^&BT=z>QxRxj~s=*UA4?)8ho&qyqs=F-BZ3u`<=SUTgvs2E-e@k||t z%XFSNqj&Z3>Bu@7SUtr}0ihTU&M0pEjtloD;dg~a7uI-?)eUt_N|KDJ`wtjFxaS7U zRU{9AB@bY==22tdphxA7jpwXTu$*L#2U$Hqo4mRoc#5#b)RD|0)H3DdEQO)~u4HP) zgBaB5thVJAV_M73Nv5P|HP(!1iP?6ej%NxSs50dwQ?4~g--6rbYPs6?)UajNSCA;P zoMcLhRvD#Pbszg$INnzfRD+sfhK1*gH492O2EG=TFD;@i%1OQet;W73v|QCaJp>a< z2F04;3N1K>^TiykgyV7pMcScPSJ+T2C%KZM)mR>C&n$X+T)wn!%R`Oip+ih)+2LU% zI@SF7Y2h~*KC+wTBvaCPwAyfF0Gj`kc!JXLj1ru4qFPj4!1Q(TfjCu1_UuA3hfpjh zbEKq;cKUW)lJ1&P7$o2q5NeHba*4K3`nvuHlIC1pvhc||lZP@%!3J7&n^_>Kj`LMQ zeD@KmLh=w&P7@QDe9$3=5Y166Kh@Gq8=<IA&@mZ1R4Mza`!(Kn*X8e!(qoJ-d(?*v zoI<(gd~7wqa;*0>P2W0pR|CZFlY6u)PLK%&rvpdgXo_@V&1Vxlp`p;|eMu2xg;KB8 zqV%F<gyS69IEdA+!DjZ5LFxN{5xF)t;7~oAbQSqch<o)(x4<~K?=}#bwzS5D{XrmQ z8UAqKMX}5ll#ExJn8WY|!Wv;5XCw;Rmqk$0JS&Ph3!lkVUb-~~zIx=y?b%d1m6qW= z))#u6<1dostc=wdSo(@x4UK+On**%jV^GXC!!NSB62@vwRtM{Y)l)v#dq3$Lmqe`S zqK95Xx5(XX)tKx%DgOlK{?K%6hw5eW$i9gju_takR@|l|<*~*6JB3kon~s!6-4Wfi zN9Yu#v`5?N=~Eu*{DGM~=B)o-(jO`Pftff8o{x_^j(;a72=SYzx`6-y002ovPDHLk FV1jOozfS-F diff --git a/share/qtcreator/qml/qmlobserver/startup/shadow.png b/share/qtcreator/qml/qmlobserver/startup/shadow.png deleted file mode 100644 index 44f92fee736f67843f88a74da87c109878d231ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1592 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8Y9LzwGKOFiyfRtp3YeY$Kep*R+Vo@rCV@iHf zs)A>3VtQ&&YGO)d;mK4RprZ2uJ|V6^`v3p`KyrA1M_*6e2l~XdB*-rq7${84EUawo z9GqO-JiL7T0)j%qViJ;4(lQE)O3G^L8k$-<x<;lJmR8m_PR{OLzW#xs(J=|hDQTIx zMJ44GHO=jvZd+E%GBB{L^K@|xskrs_j$_^vGXaN-T3)hGm@Hl2)o;8hskD023~mo* z-nNeW@zQZ0c6ObO`*G$%`Rfvv3#_r&(L(NB3$P+*@e;@D<u30#1O+Dw{^Pz`R_fyJ z5_0F^PWzY2O2)>@3*WcjyLk7m@~fv`?TVgAC=372dvZ7Q>ebTM&(HsEwkwi3UYPc5 z!^7{l-d??1ymm$4;(K$xoGG05yztq?!z<pKzPP&j_$*89-&eoRdu(C<yt2-y*x^3s z-d(??j2ADCcRT;Mo%!C@`r|)EV@tE8<b8K-zPs)GjzzB{zG_uH``~)++>5~Ut9!m? zzGhs~U6cN0g@3H&z1mH!*MFXqjWzC{?Z$u2`pevl+V0PMm$1M7`|RC?`5MJ3eY4F! z2$#6;HvDx$Msoe);QLjVKL2BVBl(TDnGZ+su*%{H9&W1=M_>qHLob^2up{g-0E!v9 z*n%^vsp=P;wtx~84un0pfWe3}#7MWL9Y>^4)t0|PRo3frU(es$cMg~;U#;7h`GsZg zoVUj&$K4IpUwl7a?icggSG)E;JkMV5eZkyq{_5(xCRH2masS#En;jc|e@~<Qn(wpz z|M~j;d9jS8k?iNV??1P$Gkv~h`}OLzru!G!6{~zXJ1_g{^<T5HubzIrxB6_4owhMM zNUZj(<@2iFe($?_*6mvJo%j0hS395m;hh|}`Spr3GK{tAUsk-Em%X;C@>2Gd6)Q~L zcU}6v`^xTByLK&#oBO5X)VWg*`;@EyOnZM%+pXNC?e4zEZU296{eAlVm)rXTZ<kBo kt*Cd#9((wr?*He1%qq`BvMN~bJq8u(p00i_>zopr0Q;ePmH+?% diff --git a/share/qtcreator/qml/qmlobserver/startup/startup.qml b/share/qtcreator/qml/qmlobserver/startup/startup.qml deleted file mode 100644 index cc33425e40c..00000000000 --- a/share/qtcreator/qml/qmlobserver/startup/startup.qml +++ /dev/null @@ -1,161 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -import QtQuick 1.0 - -Rectangle { - id: treatsApp - width: 800 - height: 480 - color: "darkgrey" - Component.onCompleted: treatsApp.state = "part1" - signal animationFinished - - Item { - width: 800 - height: 480 - anchors.centerIn: parent - clip: true - - Logo { - id: logo - x: 165 - y: 35 - rotation: -15 - scale: 0.6 - opacity: 0 - onAnimationFinished: treatsApp.animationFinished(); - } - - Item { - id: quickblur - x: 800//325 - y: 344 - Image { - id: blurText - source: "quick-blur.png" - } - Image { - id: quickregular - x: -1 - y: 0 - opacity: 0 - source: "quick-regular.png" - } - Image { - id: star - x: -1 - y: 0 - opacity: 0 - source: "white-star.png" - smooth: true - NumberAnimation on rotation { - from: 0 - to: 360 - loops: NumberAnimation.Infinite - running: true - duration: 2000 - } - } - } - } - - states: [ - State { - name: "part1" - PropertyChanges { - target: logo - scale: 0.8 - opacity: 1 - rotation: 0 - } - PropertyChanges { - target: treatsApp - color: "black" - } - PropertyChanges { - target: logo - y: 10 - } - PropertyChanges { - target: quickblur - x: logo.x + 145 - } - PropertyChanges { - target: blurText - opacity: 0 - } - PropertyChanges { - target: quickregular - opacity: 1 - } - PropertyChanges { - target: star - x: -7 - y: -37 - } - } - ] - - transitions: [ - Transition { - ParallelAnimation { - NumberAnimation { target: logo; property: "opacity"; duration: 500 } - NumberAnimation { target: logo; property: "scale"; duration: 4000; } - NumberAnimation { target: logo; property: "rotation"; duration: 2000; easing.type: "OutBack"} - ColorAnimation { duration: 3000} - SequentialAnimation { - PauseAnimation { duration: 1000 } - ScriptAction { script: logo.logoState = "showBlueprint" } - PauseAnimation { duration: 800 } - ScriptAction { script: logo.logoState = "finale" } - PauseAnimation { duration: 800 } - ParallelAnimation { - NumberAnimation { target: quickblur; property: "x"; duration: 200;} - SequentialAnimation { - PauseAnimation { duration: 200} - ParallelAnimation { - NumberAnimation { target: blurText; property: "opacity"; duration: 300;} - NumberAnimation { target: quickregular; property: "opacity"; duration: 300;} - } - NumberAnimation { target: star; property: "opacity"; from: 0; to: 1; duration: 500 } - PauseAnimation { duration: 200 } - NumberAnimation { target: star; property: "opacity"; from: 1; to: 0; duration: 500 } - } - SequentialAnimation { - PauseAnimation { duration: 150} - NumberAnimation { target: logo; property: "y"; duration: 300; easing.type: "OutBounce" } - } - } - } - } - } - ] - -} // treatsApp diff --git a/share/qtcreator/qml/qmlobserver/startup/startup.qrc b/share/qtcreator/qml/qmlobserver/startup/startup.qrc deleted file mode 100644 index 52e67050d94..00000000000 --- a/share/qtcreator/qml/qmlobserver/startup/startup.qrc +++ /dev/null @@ -1,16 +0,0 @@ -<RCC> - <qresource prefix="/startup"> - <file>Logo.qml</file> - <file>qt-back.png</file> - <file>qt-blue.jpg</file> - <file>qt-front.png</file> - <file>qt-sketch.jpg</file> - <file>qt-text.png</file> - <file>quick-blur.png</file> - <file>quick-regular.png</file> - <file>shadow.png</file> - <file>startup.qml</file> - <file>startup.qrc</file> - <file>white-star.png</file> - </qresource> -</RCC> diff --git a/share/qtcreator/qml/qmlobserver/startup/white-star.png b/share/qtcreator/qml/qmlobserver/startup/white-star.png deleted file mode 100644 index f467c9480e4fa553ea46c153ed8deec9b43394b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2651 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 diff --git a/share/qtcreator/qml/qmlobserver/texteditautoresizer_maemo5.h b/share/qtcreator/qml/qmlobserver/texteditautoresizer_maemo5.h deleted file mode 100644 index 579390a695d..00000000000 --- a/share/qtcreator/qml/qmlobserver/texteditautoresizer_maemo5.h +++ /dev/null @@ -1,101 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include <qplaintextedit.h> -#include <qtextedit.h> -#include <qabstractkineticscroller.h> -#include <qscrollarea.h> -#include <QDebug> - -#ifndef TEXTEDITAUTORESIZER_H -#define TEXTEDITAUTORESIZER_H - -class TextEditAutoResizer : public QObject -{ - Q_OBJECT -public: - TextEditAutoResizer(QWidget *parent) - : QObject(parent), plainTextEdit(qobject_cast<QPlainTextEdit *>(parent)), - textEdit(qobject_cast<QTextEdit *>(parent)), edit(qobject_cast<QFrame *>(parent)) - { - // parent must either inherit QPlainTextEdit or QTextEdit! - Q_ASSERT(plainTextEdit || textEdit); - - connect(parent, SIGNAL(textChanged()), this, SLOT(textEditChanged())); - connect(parent, SIGNAL(cursorPositionChanged()), this, SLOT(textEditChanged())); - - textEditChanged(); - } - -private Q_SLOTS: - inline void textEditChanged(); - -private: - QPlainTextEdit *plainTextEdit; - QTextEdit *textEdit; - QFrame *edit; -}; - -void TextEditAutoResizer::textEditChanged() -{ - QTextDocument *doc = textEdit ? textEdit->document() : plainTextEdit->document(); - QRect cursor = textEdit ? textEdit->cursorRect() : plainTextEdit->cursorRect(); - - QSize s = doc->size().toSize(); - if (plainTextEdit) - s.setHeight((s.height() + 2) * edit->fontMetrics().lineSpacing()); - - const QRect fr = edit->frameRect(); - const QRect cr = edit->contentsRect(); - - edit->setMinimumHeight(qMax(70, s.height() + (fr.height() - cr.height() - 1))); - - // make sure the cursor is visible in case we have a QAbstractScrollArea parent - QPoint pos = edit->pos(); - QWidget *pw = edit->parentWidget(); - while (pw) { - if (qobject_cast<QScrollArea *>(pw)) - break; - pw = pw->parentWidget(); - } - - if (pw) { - QScrollArea *area = static_cast<QScrollArea *>(pw); - QPoint scrollto = area->widget()->mapFrom(edit, cursor.center()); - QPoint margin(10 + cursor.width(), 2 * cursor.height()); - - if (QAbstractKineticScroller *scroller = area->property("kineticScroller").value<QAbstractKineticScroller *>()) { - scroller->ensureVisible(scrollto, margin.x(), margin.y()); - } else { - area->ensureVisible(scrollto.x(), scrollto.y(), margin.x(), margin.y()); - } - } -} - -#endif diff --git a/share/qtcreator/static.pro b/share/qtcreator/static.pro index 956659f6059..7795d9cec3a 100644 --- a/share/qtcreator/static.pro +++ b/share/qtcreator/static.pro @@ -72,9 +72,6 @@ OTHER_FILES += $$FILES dumpinfo.input = qml/qmldump/Info.plist.in dumpinfo.output = $$IDE_DATA_PATH/qml/qmldump/Info.plist QMAKE_SUBSTITUTES += dumpinfo - observerinfo.input = qml/qmlobserver/Info.plist.in - observerinfo.output = $$IDE_DATA_PATH/qml/qmlobserver/Info.plist - QMAKE_SUBSTITUTES += observerinfo puppetinfo.input = qml/qmlpuppet/qmlpuppet/Info.plist.in puppetinfo.output = $$IDE_DATA_PATH/qml/qmlpuppet/qmlpuppet/Info.plist QMAKE_SUBSTITUES += puppetinfo diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 6321d7a0dab..e7a1d5de2d5 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1663,9 +1663,6 @@ void ProjectExplorerPlugin::showRunErrorMessage(const QString &errorMessage) if (errorMessage.isNull()) { // a error occured, but message was not set QMessageBox::critical(ICore::mainWindow(), tr("Unknown error"), errorMessage); - } else if (errorMessage.isEmpty()) { - // a error, but the message was set to empty - // hack for qml observer warning, show nothing at all } else { QMessageBox::critical(ICore::mainWindow(), tr("Could Not Run"), errorMessage); } diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 76f5bd808c7..66e7802111e 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -366,8 +366,6 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step) : connect(m_ui->propertyEdit, SIGNAL(propertiesChanged()), this, SLOT(changeProperties())); connect(m_ui->qmlDebuggingLibraryCheckBox, SIGNAL(toggled(bool)), this, SLOT(linkQmlDebuggingLibraryChecked(bool))); - connect(m_ui->qmlDebuggingWarningText, SIGNAL(linkActivated(QString)), - this, SLOT(buildQmlDebuggingHelper())); connect(QtSupport::QtVersionManager::instance(), SIGNAL(dumpUpdatedFor(Utils::FileName)), this, SLOT(updateQmlDebuggingOption())); updateState(); @@ -531,12 +529,6 @@ void QbsBuildStepConfigWidget::linkQmlDebuggingLibraryChecked(bool checked) m_ignoreChange = false; } -void QbsBuildStepConfigWidget::buildQmlDebuggingHelper() -{ - QtSupport::BaseQtVersion::buildDebuggingHelper(m_step->target()->kit(), - static_cast<int>(QtSupport::DebuggingHelperBuildTask::QmlDebugging)); -} - // -------------------------------------------------------------------- // QbsBuildStepFactory: // -------------------------------------------------------------------- diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index a6e6827da94..f1ec50f67ba 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -134,7 +134,6 @@ private slots: // QML debugging: void linkQmlDebuggingLibraryChecked(bool checked); - void buildQmlDebuggingHelper(); private: Ui::QbsBuildStepConfigWidget *m_ui; diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index 81efeff72a3..5a128fe711c 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -193,25 +193,9 @@ QStringList QMakeStep::deducedArguments() QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); if (linkQmlDebuggingLibrary() && version) { - if (!version->needsQmlDebuggingLibrary()) { - // This Qt version has the QML debugging services built in, however - // they still need to be enabled at compile time - // TODO: For Qt5, we can pass both arguments as there can be Qt Quick 1/2 projects. - // Currently there is no support for debugging multiple engines. - arguments << QLatin1String(Constants::QMAKEVAR_QUICK1_DEBUG); - if (version->qtVersion().majorVersion >= 5) - arguments << QLatin1String(Constants::QMAKEVAR_QUICK2_DEBUG); - } else { - const QString qmlDebuggingHelperLibrary = version->qmlDebuggingHelperLibrary(true); - if (!qmlDebuggingHelperLibrary.isEmpty()) { - // Do not turn debugger path into native path separators: Qmake does not like that! - const QString debuggingHelperPath - = QFileInfo(qmlDebuggingHelperLibrary).dir().path(); - - arguments << QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH) - + QLatin1Char('=') + debuggingHelperPath; - } - } + arguments << QLatin1String(Constants::QMAKEVAR_QUICK1_DEBUG); + if (version->qtVersion().majorVersion >= 5) + arguments << QLatin1String(Constants::QMAKEVAR_QUICK2_DEBUG); } @@ -478,8 +462,6 @@ QMakeStepConfigWidget::QMakeStepConfigWidget(QMakeStep *step) this, SLOT(buildConfigurationSelected())); connect(m_ui->qmlDebuggingLibraryCheckBox, SIGNAL(toggled(bool)), this, SLOT(linkQmlDebuggingLibraryChecked(bool))); - connect(m_ui->qmlDebuggingWarningText, SIGNAL(linkActivated(QString)), - this, SLOT(buildQmlDebuggingHelper())); connect(step, SIGNAL(userArgumentsChanged()), this, SLOT(userArgumentsChanged())); connect(step, SIGNAL(linkQmlDebuggingLibraryChanged()), @@ -600,12 +582,6 @@ void QMakeStepConfigWidget::linkQmlDebuggingLibraryChecked(bool checked) question->show(); } -void QMakeStepConfigWidget::buildQmlDebuggingHelper() -{ - QtSupport::BaseQtVersion::buildDebuggingHelper(m_step->target()->kit(), - static_cast<int>(QtSupport::DebuggingHelperBuildTask::QmlDebugging)); -} - void QMakeStepConfigWidget::updateSummaryLabel() { QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(m_step->target()->kit()); diff --git a/src/plugins/qmakeprojectmanager/qmakestep.h b/src/plugins/qmakeprojectmanager/qmakestep.h index 1e1ab8fbc4b..9eb537e146e 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.h +++ b/src/plugins/qmakeprojectmanager/qmakestep.h @@ -157,9 +157,6 @@ private slots: void buildConfigurationSelected(); void linkQmlDebuggingLibraryChecked(bool checked); - // other - void buildQmlDebuggingHelper(); - private slots: void recompileMessageBoxFinished(int button); diff --git a/src/plugins/qmakeprojectmanager/qmakestep.ui b/src/plugins/qmakeprojectmanager/qmakestep.ui index 43c5828044b..0b6315c8788 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.ui +++ b/src/plugins/qmakeprojectmanager/qmakestep.ui @@ -14,7 +14,16 @@ <property name="fieldGrowthPolicy"> <enum>QFormLayout::ExpandingFieldsGrow</enum> </property> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item row="0" column="0"> @@ -27,7 +36,16 @@ <item row="0" column="1"> <widget class="QWidget" name="buildConfigurrationWidget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> @@ -86,7 +104,16 @@ <item row="2" column="1"> <widget class="QWidget" name="widget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.cpp b/src/plugins/qmlprofiler/qmlprofilerengine.cpp index de05868abfd..c66a8f81e73 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerengine.cpp @@ -113,16 +113,6 @@ bool QmlProfilerRunControl::startEngine() d->m_profilerState->setCurrentState(QmlProfilerStateManager::AppStarting); - if (ProjectExplorer::LocalApplicationRunConfiguration *rc = - qobject_cast<ProjectExplorer::LocalApplicationRunConfiguration *>(runConfiguration())) { - if (rc->executable().isEmpty()) { - showQmlObserverToolWarning(); - d->m_profilerState->setCurrentState(QmlProfilerStateManager::Idle); - AnalyzerManager::stopTool(); - return false; - } - } - if (startParameters().startMode == StartLocal) { d->m_noDebugOutputTimer.start(); } else { @@ -317,28 +307,5 @@ void QmlProfilerRunControl::profilerStateChanged() } } -void QmlProfilerRunControl::showQmlObserverToolWarning() -{ - QMessageBox dialog(QApplication::activeWindow()); - QPushButton *qtPref = dialog.addButton(tr("Open Qt Versions"), - QMessageBox::ActionRole); - dialog.addButton(QMessageBox::Cancel); - dialog.setDefaultButton(qtPref); - dialog.setWindowTitle(tr("QML Observer Missing")); - dialog.setText(tr("QML Observer could not be found for this Qt version.")); - dialog.setInformativeText(tr( - "QML Observer is used to offer debugging features for " - "Qt Quick UI projects in the Qt 4.7 series.\n\n" - "To compile QML Observer, go to the Qt Versions page, " - "select the current Qt version, " - "and click Build in the Helpers section.")); - dialog.exec(); - if (dialog.clickedButton() == qtPref) { - Core::ICore::showOptionsDialog( - ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY, - QtSupport::Constants::QTVERSION_SETTINGS_PAGE_ID); - } -} - } // namespace Internal } // namespace QmlProfiler diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.h b/src/plugins/qmlprofiler/qmlprofilerengine.h index cfacd6f8a8b..cf0b476f9f9 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.h +++ b/src/plugins/qmlprofiler/qmlprofilerengine.h @@ -75,9 +75,6 @@ private slots: private slots: void profilerStateChanged(); -private: - void showQmlObserverToolWarning(); - private: class QmlProfilerEnginePrivate; QmlProfilerEnginePrivate *d; diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index 067a9035a50..b871be07954 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -77,29 +77,6 @@ void QmlProjectPlugin::extensionsInitialized() { } -void QmlProjectPlugin::showQmlObserverToolWarning() -{ - QMessageBox dialog(QApplication::activeWindow()); - QPushButton *qtPref = dialog.addButton(tr("Open Qt Versions"), - QMessageBox::ActionRole); - dialog.addButton(QMessageBox::Cancel); - dialog.setDefaultButton(qtPref); - dialog.setWindowTitle(tr("QML Observer Missing")); - dialog.setText(tr("QML Observer could not be found for this Qt version.")); - dialog.setInformativeText(tr( - "QML Observer is used to offer debugging features for " - "Qt Quick UI projects in the Qt 4.7 series.\n\n" - "To compile QML Observer, go to the Qt Versions page, " - "select the current Qt version, " - "and click Build in the Helpers section.")); - dialog.exec(); - if (dialog.clickedButton() == qtPref) { - Core::ICore::showOptionsDialog( - ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY, - QtSupport::Constants::QTVERSION_SETTINGS_PAGE_ID); - } -} - } // namespace QmlProjectManager Q_EXPORT_PLUGIN(QmlProjectManager::QmlProjectPlugin) diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.h b/src/plugins/qmlprojectmanager/qmlprojectplugin.h index 6cd6ae7016c..9ea0e83506b 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.h +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.h @@ -47,8 +47,6 @@ public: virtual bool initialize(const QStringList &arguments, QString *errorString); virtual void extensionsInitialized(); - - static void showQmlObserverToolWarning(); }; } // namespace QmlProject diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 8ce33831b77..024a4bf5af1 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -110,10 +110,7 @@ QString QmlProjectRunConfiguration::executable() const if (id() == Constants::QML_SCENE_RC_ID) return version->qmlsceneCommand(); - if (!version->needsQmlDebuggingLibrary()) - return version->qmlviewerCommand(); - return version->qmlObserverTool(); - + return version->qmlviewerCommand(); } ProjectExplorer::LocalApplicationRunConfiguration::RunMode QmlProjectRunConfiguration::runMode() const diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index c8c0d942365..626e9415267 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -29,9 +29,7 @@ #include "baseqtversion.h" #include "qtconfigwidget.h" -#include "qmlobservertool.h" #include "qmldumptool.h" -#include "qmldebugginglibrary.h" #include "qtkitinformation.h" #include "qtversionmanager.h" @@ -141,8 +139,6 @@ BaseQtVersion::BaseQtVersion(const FileName &qmakeCommand, bool isAutodetected, m_isAutodetected(isAutodetected), m_hasDebuggingHelper(false), m_hasQmlDump(false), - m_hasQmlDebuggingLibrary(false), - m_hasQmlObserver(false), m_mkspecUpToDate(false), m_mkspecReadUpToDate(false), m_defaultConfigIsDebug(true), @@ -164,8 +160,6 @@ BaseQtVersion::BaseQtVersion() : m_id(-1), m_isAutodetected(false), m_hasDebuggingHelper(false), m_hasQmlDump(false), - m_hasQmlDebuggingLibrary(false), - m_hasQmlObserver(false), m_mkspecUpToDate(false), m_mkspecReadUpToDate(false), m_defaultConfigIsDebug(true), @@ -918,8 +912,6 @@ void BaseQtVersion::updateVersionInfo() const m_hasDocumentation = false; m_hasDebuggingHelper = false; m_hasQmlDump = false; - m_hasQmlDebuggingLibrary = false; - m_hasQmlObserver = false; if (!queryQMakeVariables(qmakeCommand(), qmakeRunEnvironment(), &m_versionInfo)) { m_qmakeIsExecutable = false; @@ -938,10 +930,6 @@ void BaseQtVersion::updateVersionInfo() const m_hasQmlDump = !QmlDumpTool::toolForQtPaths(qtInstallData, qtInstallBins, qtHeaderData, false).isEmpty() || !QmlDumpTool::toolForQtPaths(qtInstallData, qtInstallBins, qtHeaderData, true).isEmpty(); - m_hasQmlDebuggingLibrary - = !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, false).isEmpty() - || !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, true).isEmpty(); - m_hasQmlObserver = !QmlObserverTool::toolByInstallData(qtInstallData).isEmpty(); } } @@ -1107,23 +1095,6 @@ bool BaseQtVersion::needsQmlDump() const return qtVersion() < QtVersionNumber(4, 8, 0); } -bool BaseQtVersion::hasQmlDebuggingLibrary() const -{ - updateVersionInfo(); - return m_hasQmlDebuggingLibrary; -} - -bool BaseQtVersion::needsQmlDebuggingLibrary() const -{ - return qtVersion() < QtVersionNumber(4, 8, 0); -} - -bool BaseQtVersion::hasQmlObserver() const -{ - updateVersionInfo(); - return m_hasQmlObserver; -} - Environment BaseQtVersion::qmlToolsEnvironment() const { // FIXME: This seems broken! @@ -1160,22 +1131,6 @@ QString BaseQtVersion::qmlDumpTool(bool debugVersion) const return QmlDumpTool::toolForQtPaths(qtInstallData, qtInstallBins, qtHeaderData, debugVersion); } -QString BaseQtVersion::qmlDebuggingHelperLibrary(bool debugVersion) const -{ - QString qtInstallData = qmakeProperty("QT_INSTALL_DATA"); - if (qtInstallData.isEmpty()) - return QString(); - return QmlDebuggingLibrary::libraryByInstallData(qtInstallData, debugVersion); -} - -QString BaseQtVersion::qmlObserverTool() const -{ - QString qtInstallData = qmakeProperty("QT_INSTALL_DATA"); - if (qtInstallData.isEmpty()) - return QString(); - return QmlObserverTool::toolByInstallData(qtInstallData); -} - QStringList BaseQtVersion::debuggingHelperLibraryLocations() const { QString qtInstallData = qmakeProperty("QT_INSTALL_DATA"); @@ -1472,25 +1427,19 @@ bool BaseQtVersion::isQmlDebuggingSupported(Kit *k, QString *reason) bool BaseQtVersion::isQmlDebuggingSupported(QString *reason) const { - if (!needsQmlDebuggingLibrary() || hasQmlDebuggingLibrary()) - return true; - if (!isValid()) { if (reason) *reason = QCoreApplication::translate("BaseQtVersion", "Invalid Qt version."); return false; } - if (qtVersion() < QtVersionNumber(4, 7, 1)) { + if (qtVersion() < QtVersionNumber(4, 8, 0)) { if (reason) - *reason = QCoreApplication::translate("BaseQtVersion", "Requires Qt 4.7.1 or newer."); + *reason = QCoreApplication::translate("BaseQtVersion", "Requires Qt 4.8.0 or newer."); return false; } - if (reason) - *reason = QCoreApplication::translate("BaseQtVersion", "Library not available. <a href='compile'>Compile...</a>"); - - return false; + return true; } void BaseQtVersion::buildDebuggingHelper(Kit *k, int tools) diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index 40bb5908128..5b382c2d696 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -193,18 +193,13 @@ public: virtual bool supportsBinaryDebuggingHelper() const; virtual QString gdbDebuggingHelperLibrary() const; - virtual QString qmlDebuggingHelperLibrary(bool debugVersion) const; virtual QString qmlDumpTool(bool debugVersion) const; - virtual QString qmlObserverTool() const; virtual QStringList debuggingHelperLibraryLocations() const; virtual bool hasGdbDebuggingHelper() const; virtual bool hasQmlDump() const; virtual bool hasQmlDumpWithRelocatableFlag() const; virtual bool needsQmlDump() const; - virtual bool hasQmlDebuggingLibrary() const; - virtual bool needsQmlDebuggingLibrary() const; - virtual bool hasQmlObserver() const; Utils::Environment qmlToolsEnvironment() const; virtual QtConfigWidget *createConfigurationWidget() const; @@ -270,8 +265,6 @@ private: bool m_isAutodetected; mutable bool m_hasDebuggingHelper; // controlled by m_versionInfoUpToDate mutable bool m_hasQmlDump; // controlled by m_versionInfoUpToDate - mutable bool m_hasQmlDebuggingLibrary; // controlled by m_versionInfoUpdate - mutable bool m_hasQmlObserver; // controlled by m_versionInfoUpToDate mutable bool m_mkspecUpToDate; mutable bool m_mkspecReadUpToDate; mutable bool m_defaultConfigIsDebug; diff --git a/src/plugins/qtsupport/debugginghelper.ui b/src/plugins/qtsupport/debugginghelper.ui index 56c484de5c5..cd7dba4e4b4 100644 --- a/src/plugins/qtsupport/debugginghelper.ui +++ b/src/plugins/qtsupport/debugginghelper.ui @@ -6,16 +6,32 @@ <rect> <x>0</x> <y>0</y> - <width>404</width> - <height>176</height> + <width>330</width> + <height>85</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="2"> + <widget class="QPushButton" name="qmlDumpBuildButton"> + <property name="text"> + <string>Build</string> + </property> + </widget> + </item> <item row="1" column="0"> <widget class="QLabel" name="qmlDumpLabel"> <property name="toolTip"> @@ -26,31 +42,15 @@ </property> </widget> </item> - <item row="1" column="1"> - <widget class="QLabel" name="qmlDumpStatus"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>2</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string notr="true">TextLabel</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="qmlObserverLabel"> - <property name="toolTip"> - <string>A modified version of qmlviewer with support for QML/JS debugging.</string> - </property> + <item row="2" column="2"> + <widget class="QPushButton" name="gdbHelperBuildButton"> <property name="text"> - <string>QML Observer:</string> + <string>Build</string> </property> </widget> </item> - <item row="3" column="1"> - <widget class="QLabel" name="qmlObserverStatus"> + <item row="1" column="1"> + <widget class="QLabel" name="qmlDumpStatus"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>2</horstretch> @@ -63,26 +63,6 @@ </widget> </item> <item row="2" column="0"> - <widget class="QLabel" name="qmlDebuggingLibLabel"> - <property name="text"> - <string>QML Debugging Library:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="qmlDebuggingLibStatus"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>2</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string notr="true">TextLabel</string> - </property> - </widget> - </item> - <item row="4" column="0"> <widget class="QLabel" name="gdbHelperLabel"> <property name="toolTip"> <string>Helps showing content of Qt types. Only used in older versions of GDB.</string> @@ -92,7 +72,7 @@ </property> </widget> </item> - <item row="4" column="1"> + <item row="2" column="1"> <widget class="QLabel" name="gdbHelperStatus"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> @@ -105,34 +85,6 @@ </property> </widget> </item> - <item row="1" column="2"> - <widget class="QPushButton" name="qmlDumpBuildButton"> - <property name="text"> - <string>Build</string> - </property> - </widget> - </item> - <item row="2" column="2"> - <widget class="QPushButton" name="qmlDebuggingLibBuildButton"> - <property name="text"> - <string>Build</string> - </property> - </widget> - </item> - <item row="3" column="2"> - <widget class="QPushButton" name="qmlObserverBuildButton"> - <property name="text"> - <string>Build</string> - </property> - </widget> - </item> - <item row="4" column="2"> - <widget class="QPushButton" name="gdbHelperBuildButton"> - <property name="text"> - <string>Build</string> - </property> - </widget> - </item> </layout> </item> <item> diff --git a/src/plugins/qtsupport/debugginghelperbuildtask.cpp b/src/plugins/qtsupport/debugginghelperbuildtask.cpp index 9886945f7ec..090806562c4 100644 --- a/src/plugins/qtsupport/debugginghelperbuildtask.cpp +++ b/src/plugins/qtsupport/debugginghelperbuildtask.cpp @@ -30,8 +30,6 @@ #include "debugginghelperbuildtask.h" #include "debugginghelper.h" #include "qmldumptool.h" -#include "qmlobservertool.h" -#include "qmldebugginglibrary.h" #include "baseqtversion.h" #include "qtversionmanager.h" #include <utils/qtcassert.h> @@ -128,11 +126,6 @@ DebuggingHelperBuildTask::Tools DebuggingHelperBuildTask::availableTools(const B } if (QmlDumpTool::canBuild(version)) tools |= QmlDump; - if (QmlDebuggingLibrary::canBuild(version)) { - tools |= QmlDebugging; - if (QmlObserverTool::canBuild(version)) - tools |= QmlObserver; // requires QML debugging. - } return tools; } @@ -143,7 +136,7 @@ void DebuggingHelperBuildTask::showOutputOnError(bool show) void DebuggingHelperBuildTask::run(QFutureInterface<void> &future) { - future.setProgressRange(0, 5); + future.setProgressRange(0, 3); future.setProgressValue(1); if (m_invalidQt || !buildDebuggingHelper(future)) { @@ -203,47 +196,6 @@ bool DebuggingHelperBuildTask::buildDebuggingHelper(QFutureInterface<void> &futu return false; } future.setProgressValue(3); - - QString qmlDebuggingDirectory; - if (m_tools & QmlDebugging) { - QString output, error; - - qmlDebuggingDirectory = QmlDebuggingLibrary::copy(m_qtInstallData, &error); - - bool success = true; - arguments.directory = qmlDebuggingDirectory; - if (arguments.directory.isEmpty() - || !QmlDebuggingLibrary::build(arguments, &output, &error)) { - success = false; - } - - log(output, error); - if (!success) - return false; - } - future.setProgressValue(4); - - if (m_tools & QmlObserver) { - QString output, error; - bool success = true; - - arguments.directory = QmlObserverTool::copy(m_qtInstallData, &error); - arguments.qmakeArguments << QLatin1String("INCLUDEPATH+=\"\\\"") - + qmlDebuggingDirectory - + QLatin1String("include\\\"\""); - arguments.qmakeArguments << QLatin1String("LIBS+=-L\"\\\"") - + qmlDebuggingDirectory - + QLatin1String("\\\"\""); - - if (arguments.directory.isEmpty() - || !QmlObserverTool::build(arguments, &output, &error)) { - success = false; - } - log(output, error); - if (!success) - return false; - } - future.setProgressValue(5); return true; } diff --git a/src/plugins/qtsupport/debugginghelperbuildtask.h b/src/plugins/qtsupport/debugginghelperbuildtask.h index 6d8cd7efcaf..dc767cf0cf9 100644 --- a/src/plugins/qtsupport/debugginghelperbuildtask.h +++ b/src/plugins/qtsupport/debugginghelperbuildtask.h @@ -51,10 +51,8 @@ class QTSUPPORT_EXPORT DebuggingHelperBuildTask : public QObject public: enum DebuggingHelper { GdbDebugging = 0x01, - QmlDebugging = 0x02, - QmlObserver = 0x04, - QmlDump = 0x08, - AllTools = GdbDebugging | QmlDebugging | QmlObserver | QmlDump + QmlDump = 0x02, + AllTools = GdbDebugging | QmlDump }; Q_DECLARE_FLAGS(Tools, DebuggingHelper) diff --git a/src/plugins/qtsupport/qmldebugginglibrary.cpp b/src/plugins/qtsupport/qmldebugginglibrary.cpp deleted file mode 100644 index f2a90a45ad5..00000000000 --- a/src/plugins/qtsupport/qmldebugginglibrary.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "qmldebugginglibrary.h" - -#include "baseqtversion.h" -#include <coreplugin/icore.h> - -#include <QDesktopServices> -#include <QCoreApplication> -#include <QDir> -#include <QDebug> - -namespace QtSupport { - - -QString QmlDebuggingLibrary::libraryByInstallData(const QString &qtInstallData, bool debugBuild) -{ - if (!Core::ICore::instance()) - return QString(); - - const QStringList directories = installDirectories(qtInstallData); - - QStringList binFilenames; - if (debugBuild) { - binFilenames << QLatin1String("QmlJSDebuggerd.lib"); - binFilenames << QLatin1String("libQmlJSDebuggerd.a"); // mingw - } else { - binFilenames << QLatin1String("QmlJSDebugger.lib"); - } - binFilenames << QLatin1String("libQmlJSDebugger.a"); - binFilenames << QLatin1String("QmlJSDebugger.prl"); // Symbian. Note that the actual lib is in EPOCROOT - - return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false); -} - -bool QmlDebuggingLibrary::canBuild(const BaseQtVersion *qtVersion, QString *reason) -{ - if (qtVersion->qtVersion() < QtVersionNumber(4, 7, 1)) { - if (reason) - *reason = QCoreApplication::translate("QmakeProjectManager::QmlDebuggingLibrary", "Only available for Qt 4.7.1 or newer."); - return false; - } - if (qtVersion->qtVersion() >= QtVersionNumber(4, 8, 0)) { - if (reason) - *reason = QCoreApplication::translate("QmakeProjectManager::QmlDebuggingLibrary", "Not needed."); - return false; - } - return true; -} - -bool QmlDebuggingLibrary::build(BuildHelperArguments arguments, QString *log, QString *errorMessage) -{ - arguments.helperName = QCoreApplication::translate("QmakeProjectManager::QmlDebuggingLibrary", "QML Debugging"); - arguments.proFilename = QLatin1String("qmljsdebugger.pro"); - return buildHelper(arguments, log, errorMessage); -} - -static inline bool mkpath(const QString &targetDirectory, QString *errorMessage) -{ - if (!QDir().mkpath(targetDirectory)) { - *errorMessage = QCoreApplication::translate("QmakeProjectManager::QmlDebuggingLibrary", "The target directory %1 could not be created.").arg(targetDirectory); - return false; - } - return true; -} - -QString QmlDebuggingLibrary::copy(const QString &qtInstallData, QString *errorMessage) -{ - const QStringList directories = QmlDebuggingLibrary::installDirectories(qtInstallData); - - // Try to find a writeable directory. - foreach (const QString &directory, directories) { - if (!mkpath(directory, errorMessage)) - continue; - else - errorMessage->clear(); - - if (copyFiles(sourcePath(), sourceFileNames(), - directory, errorMessage)) - { - errorMessage->clear(); - return directory; - } - } - *errorMessage = QCoreApplication::translate("QmakeProjectManager::QmlDebuggingLibrary", - "QML Debugging library could not be built in any of the directories:\n- %1\n\nReason: %2") - .arg(directories.join(QLatin1String("\n- ")), *errorMessage); - return QString(); -} - -QStringList QmlDebuggingLibrary::recursiveFileList(const QDir &dir, const QString &prefix) -{ - QStringList files; - - QString _prefix = prefix; - if (!_prefix.isEmpty() && !_prefix.endsWith(QLatin1Char('/'))) - _prefix = _prefix + QLatin1Char('/'); - foreach (const QString &fileName, dir.entryList(QDir::Files)) { - files << _prefix + fileName; - } - - foreach (const QString &subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { - files += recursiveFileList(QDir(dir.absoluteFilePath(subDir)), _prefix + subDir); - } - return files; -} - -QStringList QmlDebuggingLibrary::installDirectories(const QString &qtInstallData) -{ - const QChar slash = QLatin1Char('/'); - const uint hash = qHash(qtInstallData); - QStringList directories; - directories - << (qtInstallData + QLatin1String("/qtc-qmldbg/")) - << QDir::cleanPath((QCoreApplication::applicationDirPath() + QLatin1String("/../qtc-qmldbg/") + QString::number(hash))) + slash - << (QDesktopServices::storageLocation(QDesktopServices::DataLocation) + QLatin1String("/qtc-qmldbg/") + QString::number(hash)) + slash; - return directories; -} - -QString QmlDebuggingLibrary::sourcePath() -{ - return Core::ICore::resourcePath() + QLatin1String("/qml/qmljsdebugger/"); -} - -QStringList QmlDebuggingLibrary::sourceFileNames() -{ - return recursiveFileList(QDir(sourcePath())); -} - -} // namespace diff --git a/src/plugins/qtsupport/qmldebugginglibrary.h b/src/plugins/qtsupport/qmldebugginglibrary.h deleted file mode 100644 index 64a16a1e874..00000000000 --- a/src/plugins/qtsupport/qmldebugginglibrary.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QMLDEBUGGINGLIBRARY_H -#define QMLDEBUGGINGLIBRARY_H - -#include <utils/buildablehelperlibrary.h> - -QT_FORWARD_DECLARE_CLASS(QDir) - -namespace Utils { - class Environment; -} - -namespace ProjectExplorer { - class Project; -} - -namespace QtSupport { - -class BaseQtVersion; - -class QmlDebuggingLibrary : public Utils::BuildableHelperLibrary -{ -public: - static QString libraryByInstallData(const QString &qtInstallData, bool debugBuild); - - static bool canBuild(const BaseQtVersion *qtVersion, QString *reason = 0); - static bool build(BuildHelperArguments arguments, QString *log, QString *errorMessage); - - static QString copy(const QString &qtInstallData, QString *errorMessage); - -private: - static QStringList recursiveFileList(const QDir &dir, const QString &prefix = QString()); - static QStringList installDirectories(const QString &qtInstallData); - static QString sourcePath(); - static QStringList sourceFileNames(); -}; - -} // namespace - -#endif // QMLDEBUGGINGLIBRARY_H diff --git a/src/plugins/qtsupport/qmlobservertool.cpp b/src/plugins/qtsupport/qmlobservertool.cpp deleted file mode 100644 index 9479645293f..00000000000 --- a/src/plugins/qtsupport/qmlobservertool.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "qmlobservertool.h" - -#include "qtsupportconstants.h" -#include "baseqtversion.h" -#include <coreplugin/icore.h> - -#include <QDesktopServices> -#include <QCoreApplication> -#include <QDir> -#include <QDebug> - -namespace QtSupport { - -static QStringList recursiveFileList(const QDir &dir, const QString &prefix) -{ - QStringList files; - - QString _prefix = prefix; - if (!_prefix.isEmpty() && !_prefix.endsWith(QLatin1Char('/'))) - _prefix.append(QLatin1Char('/')); - - foreach (const QString &fileName, dir.entryList(QDir::Files)) - files << _prefix + fileName; - - foreach (const QString &subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) - files += recursiveFileList(QDir(dir.absoluteFilePath(subDir)), _prefix + subDir); - - return files; -} - -static QStringList installDirectories(const QString &qtInstallData) -{ - const QChar slash = QLatin1Char('/'); - const uint hash = qHash(qtInstallData); - QStringList directories; - directories - << (qtInstallData + QLatin1String("/qtc-qmlobserver/")) - << QDir::cleanPath((QCoreApplication::applicationDirPath() + QLatin1String("/../qtc-qmlobserver/") + QString::number(hash))) + slash - << (QDesktopServices::storageLocation(QDesktopServices::DataLocation) + QLatin1String("/qtc-qmlobserver/") + QString::number(hash)) + slash; - return directories; -} - -static QString sourcePath() -{ - return Core::ICore::resourcePath() + QLatin1String("/qml/qmlobserver/"); -} - -static QStringList sourceFileNames() -{ - return recursiveFileList(QDir(sourcePath()), QString()); -} - -static QStringList validBinaryFilenames() -{ - return QStringList() - << QLatin1String("debug/qmlobserver.exe") - << QLatin1String("qmlobserver.exe") - << QLatin1String("qmlobserver") - << QLatin1String("QMLObserver.app/Contents/MacOS/QMLObserver"); -} - -bool QmlObserverTool::canBuild(const BaseQtVersion *qtVersion, QString *reason) -{ - if (qtVersion->type() != QLatin1String(Constants::DESKTOPQT) - && qtVersion->type() != QLatin1String(Constants::SIMULATORQT)) { - if (reason) - *reason = QCoreApplication::translate("QmakeProjectManager::QmlObserverTool", "Only available for Qt for Desktop or Qt for Qt Simulator."); - return false; - } - - if (qtVersion->qtVersion() < QtVersionNumber(4, 7, 1)) { - if (reason) - *reason = QCoreApplication::translate("QmakeProjectManager::QmlObserverTool", "Only available for Qt 4.7.1 or newer."); - return false; - } - if (qtVersion->qtVersion() >= QtVersionNumber(4, 8, 0)) { - if (reason) - *reason = QCoreApplication::translate("QmakeProjectManager::QmlObserverTool", "Not needed."); - return false; - } - return true; -} - -QString QmlObserverTool::toolByInstallData(const QString &qtInstallData) -{ - if (!Core::ICore::instance()) - return QString(); - - const QStringList directories = installDirectories(qtInstallData); - const QStringList binFilenames = validBinaryFilenames(); - - return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false); -} - -QStringList QmlObserverTool::locationsByInstallData(const QString &qtInstallData) -{ - QStringList result; - QFileInfo fileInfo; - const QStringList binFilenames = validBinaryFilenames(); - foreach (const QString &directory, installDirectories(qtInstallData)) { - if (getHelperFileInfoFor(binFilenames, directory, &fileInfo)) - result << fileInfo.filePath(); - } - return result; -} - -bool QmlObserverTool::build(BuildHelperArguments arguments, QString *log, QString *errorMessage) -{ - arguments.helperName = QCoreApplication::translate("QmakeProjectManager::QmlObserverTool", "QMLObserver"); - arguments.proFilename = QLatin1String("qmlobserver.pro"); - - return buildHelper(arguments, log, errorMessage); -} - -static inline bool mkpath(const QString &targetDirectory, QString *errorMessage) -{ - if (!QDir().mkpath(targetDirectory)) { - *errorMessage = QCoreApplication::translate("ProjectExplorer::QmlObserverTool", "The target directory %1 could not be created.").arg(targetDirectory); - return false; - } - return true; -} - -QString QmlObserverTool::copy(const QString &qtInstallData, QString *errorMessage) -{ - const QStringList directories = installDirectories(qtInstallData); - - // Try to find a writable directory. - foreach (const QString &directory, directories) { - if (!mkpath(directory, errorMessage)) - continue; - - errorMessage->clear(); - - if (copyFiles(sourcePath(), sourceFileNames(), directory, errorMessage)) { - errorMessage->clear(); - return directory; - } - } - *errorMessage = QCoreApplication::translate("ProjectExplorer::QmlObserverTool", - "QMLObserver could not be built in any of the directories:\n- %1\n\nReason: %2") - .arg(directories.join(QLatin1String("\n- ")), *errorMessage); - return QString(); -} - -} // namespace diff --git a/src/plugins/qtsupport/qmlobservertool.h b/src/plugins/qtsupport/qmlobservertool.h deleted file mode 100644 index ab7985853a4..00000000000 --- a/src/plugins/qtsupport/qmlobservertool.h +++ /dev/null @@ -1,56 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QMLOBSERVERTOOL_H -#define QMLOBSERVERTOOL_H - -#include "qtsupport_global.h" -#include <utils/buildablehelperlibrary.h> - -namespace QtSupport { - -class BaseQtVersion; - -class QTSUPPORT_EXPORT QmlObserverTool : public Utils::BuildableHelperLibrary -{ -public: - static bool canBuild(const BaseQtVersion *qtVersion, QString *reason = 0); - static QString toolByInstallData(const QString &qtInstallData); - static QStringList locationsByInstallData(const QString &qtInstallData); - - // Build the helpers and return the output log/errormessage. - static bool build(BuildHelperArguments arguments, QString *out, QString *err); - - // Copy the source files to a target location and return the chosen target location. - static QString copy(const QString &qtInstallData, QString *errorMessage); -}; - -} // namespace QtSupport - -#endif // QMLOBSERVERTOOL_H diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index e3047d39c1b..8ac4570e4f9 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -37,8 +37,6 @@ #include "qtversionmanager.h" #include "qtversionfactory.h" #include "qmldumptool.h" -#include "qmldebugginglibrary.h" -#include "qmlobservertool.h" #include <coreplugin/progressmanager/progressmanager.h> #include <projectexplorer/toolchainmanager.h> @@ -179,10 +177,6 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent) this, SLOT(buildGdbHelper())); connect(m_debuggingHelperUi->qmlDumpBuildButton, SIGNAL(clicked()), this, SLOT(buildQmlDump())); - connect(m_debuggingHelperUi->qmlDebuggingLibBuildButton, SIGNAL(clicked()), - this, SLOT(buildQmlDebuggingLibrary())); - connect(m_debuggingHelperUi->qmlObserverBuildButton, SIGNAL(clicked()), - this, SLOT(buildQmlObserver())); connect(m_debuggingHelperUi->showLogButton, SIGNAL(clicked()), this, SLOT(slotShowDebuggingBuildLog())); @@ -248,12 +242,8 @@ void QtOptionsPageWidget::debuggingHelperBuildFinished(int qtVersionId, const QS bool success = true; if (tools & DebuggingHelperBuildTask::GdbDebugging) success &= version->hasGdbDebuggingHelper(); - if (tools & DebuggingHelperBuildTask::QmlDebugging) - success &= version->hasQmlDebuggingLibrary(); if (tools & DebuggingHelperBuildTask::QmlDump) success &= version->hasQmlDump(); - if (tools & DebuggingHelperBuildTask::QmlObserver) - success &= version->hasQmlObserver(); if (!success) showDebuggingBuildLog(item); @@ -470,19 +460,6 @@ void QtOptionsPageWidget::buildQmlDump() buildDebuggingHelper(DebuggingHelperBuildTask::QmlDump); } -void QtOptionsPageWidget::buildQmlDebuggingLibrary() -{ - buildDebuggingHelper(DebuggingHelperBuildTask::QmlDebugging); -} - -void QtOptionsPageWidget::buildQmlObserver() -{ - DebuggingHelperBuildTask::Tools qmlDbgTools = - DebuggingHelperBuildTask::QmlObserver; - qmlDbgTools |= DebuggingHelperBuildTask::QmlDebugging; - buildDebuggingHelper(qmlDbgTools); -} - // Non-modal dialog class BuildLogDialog : public QDialog { public: @@ -741,28 +718,19 @@ void QtOptionsPageWidget::updateDebuggingHelperUi() const DebuggingHelperBuildTask::Tools availableTools = DebuggingHelperBuildTask::availableTools(version); const bool canBuildGdbHelper = availableTools & DebuggingHelperBuildTask::GdbDebugging; const bool canBuildQmlDumper = availableTools & DebuggingHelperBuildTask::QmlDump; - const bool canBuildQmlDebuggingLib = availableTools & DebuggingHelperBuildTask::QmlDebugging; - const bool canBuildQmlObserver = availableTools & DebuggingHelperBuildTask::QmlObserver; const bool hasGdbHelper = !version->gdbDebuggingHelperLibrary().isEmpty(); const bool hasQmlDumper = version->hasQmlDump(); const bool needsQmlDumper = version->needsQmlDump(); - const bool hasQmlDebuggingLib = version->hasQmlDebuggingLibrary(); - const bool needsQmlDebuggingLib = version->needsQmlDebuggingLibrary(); - const bool hasQmlObserver = !version->qmlObserverTool().isEmpty(); bool isBuildingGdbHelper = false; bool isBuildingQmlDumper = false; - bool isBuildingQmlDebuggingLib = false; - bool isBuildingQmlObserver = false; if (currentItem) { DebuggingHelperBuildTask::Tools buildingTools = currentItem->data(0, BuildRunningRole).value<DebuggingHelperBuildTask::Tools>(); isBuildingGdbHelper = buildingTools & DebuggingHelperBuildTask::GdbDebugging; isBuildingQmlDumper = buildingTools & DebuggingHelperBuildTask::QmlDump; - isBuildingQmlDebuggingLib = buildingTools & DebuggingHelperBuildTask::QmlDebugging; - isBuildingQmlObserver = buildingTools & DebuggingHelperBuildTask::QmlObserver; } // get names of tools from labels @@ -772,10 +740,6 @@ void QtOptionsPageWidget::updateDebuggingHelperUi() helperNames << m_debuggingHelperUi->gdbHelperLabel->text().remove(colon); if (hasQmlDumper) helperNames << m_debuggingHelperUi->qmlDumpLabel->text().remove(colon); - if (hasQmlDebuggingLib) - helperNames << m_debuggingHelperUi->qmlDebuggingLibLabel->text().remove(colon); - if (hasQmlObserver) - helperNames << m_debuggingHelperUi->qmlObserverLabel->text().remove(colon); QString status; if (helperNames.isEmpty()) { @@ -829,60 +793,6 @@ void QtOptionsPageWidget::updateDebuggingHelperUi() m_debuggingHelperUi->qmlDumpStatus->setToolTip(qmlDumpStatusToolTip); m_debuggingHelperUi->qmlDumpBuildButton->setEnabled(canBuildQmlDumper & !isBuildingQmlDumper); - QString qmlDebuggingLibStatusText, qmlDebuggingLibToolTip; - Qt::TextInteractionFlags qmlDebuggingLibStatusTextFlags = Qt::NoTextInteraction; - if (hasQmlDebuggingLib) { - qmlDebuggingLibStatusText = QDir::toNativeSeparators( - version->qmlDebuggingHelperLibrary(false)); - const QString debugPath = QDir::toNativeSeparators( - version->qmlDebuggingHelperLibrary(true)); - - if (qmlDebuggingLibStatusText != debugPath) { - if (!qmlDebuggingLibStatusText.isEmpty() - && !debugPath.isEmpty()) { - qmlDebuggingLibStatusText += QLatin1Char('\n'); - } - qmlDebuggingLibStatusText += debugPath; - } - qmlDebuggingLibStatusTextFlags = Qt::TextSelectableByMouse; - } else { - if (!needsQmlDebuggingLib) { - qmlDebuggingLibStatusText = tr("<i>Not needed.</i>"); - } else if (canBuildQmlDebuggingLib) { - qmlDebuggingLibStatusText = tr("<i>Not yet built.</i>"); - } else { - qmlDebuggingLibStatusText = tr("<i>Cannot be compiled.</i>"); - QmlDebuggingLibrary::canBuild(version, &qmlDebuggingLibToolTip); - } - } - m_debuggingHelperUi->qmlDebuggingLibStatus->setText(qmlDebuggingLibStatusText); - m_debuggingHelperUi->qmlDebuggingLibStatus->setTextInteractionFlags(qmlDebuggingLibStatusTextFlags); - m_debuggingHelperUi->qmlDebuggingLibStatus->setToolTip(qmlDebuggingLibToolTip); - m_debuggingHelperUi->qmlDebuggingLibBuildButton->setEnabled(needsQmlDebuggingLib - && canBuildQmlDebuggingLib - && !isBuildingQmlDebuggingLib); - - QString qmlObserverStatusText, qmlObserverToolTip; - Qt::TextInteractionFlags qmlObserverStatusTextFlags = Qt::NoTextInteraction; - if (hasQmlObserver) { - qmlObserverStatusText = QDir::toNativeSeparators(version->qmlObserverTool()); - qmlObserverStatusTextFlags = Qt::TextSelectableByMouse; - } else { - if (!needsQmlDebuggingLib) { - qmlObserverStatusText = tr("<i>Not needed.</i>"); - } else if (canBuildQmlObserver) { - qmlObserverStatusText = tr("<i>Not yet built.</i>"); - } else { - qmlObserverStatusText = tr("<i>Cannot be compiled.</i>"); - QmlObserverTool::canBuild(version, &qmlObserverToolTip); - } - } - m_debuggingHelperUi->qmlObserverStatus->setText(qmlObserverStatusText); - m_debuggingHelperUi->qmlObserverStatus->setTextInteractionFlags(qmlObserverStatusTextFlags); - m_debuggingHelperUi->qmlObserverStatus->setToolTip(qmlObserverToolTip); - m_debuggingHelperUi->qmlObserverBuildButton->setEnabled(canBuildQmlObserver - & !isBuildingQmlObserver); - QList<ToolChain*> toolchains = toolChains(currentVersion()); QString selectedToolChainId = currentItem->data(0, ToolChainIdRole).toString(); m_debuggingHelperUi->toolChainComboBox->clear(); @@ -901,13 +811,9 @@ void QtOptionsPageWidget::updateDebuggingHelperUi() m_debuggingHelperUi->showLogButton->setEnabled(hasLog); const bool canBuild = canBuildGdbHelper - || canBuildQmlDumper - || (canBuildQmlDebuggingLib && needsQmlDebuggingLib) - || canBuildQmlObserver; + || canBuildQmlDumper; const bool isBuilding = isBuildingGdbHelper - || isBuildingQmlDumper - || isBuildingQmlDebuggingLib - || isBuildingQmlObserver; + || isBuildingQmlDumper; m_debuggingHelperUi->rebuildButton->setEnabled(canBuild && !isBuilding); m_debuggingHelperUi->toolChainComboBox->setEnabled(canBuild && !isBuilding); @@ -1112,8 +1018,7 @@ QString QtOptionsPageWidget::searchKeywords() const ts << sep << m_versionUi->versionNameLabel->text() << sep << m_versionUi->pathLabel->text() << sep << m_debuggingHelperUi->gdbHelperLabel->text() - << sep << m_debuggingHelperUi->qmlDumpLabel->text() - << sep << m_debuggingHelperUi->qmlObserverLabel->text(); + << sep << m_debuggingHelperUi->qmlDumpLabel->text(); rc.remove(QLatin1Char('&')); return rc; diff --git a/src/plugins/qtsupport/qtoptionspage.h b/src/plugins/qtsupport/qtoptionspage.h index 2e68d391f7c..5d506c3bbe9 100644 --- a/src/plugins/qtsupport/qtoptionspage.h +++ b/src/plugins/qtsupport/qtoptionspage.h @@ -108,8 +108,6 @@ private slots: = DebuggingHelperBuildTask::AllTools); void buildGdbHelper(); void buildQmlDump(); - void buildQmlDebuggingLibrary(); - void buildQmlObserver(); void slotShowDebuggingBuildLog(); void debuggingHelperBuildFinished(int qtVersionId, const QString &output, DebuggingHelperBuildTask::Tools tools); diff --git a/src/plugins/qtsupport/qtsupport.pro b/src/plugins/qtsupport/qtsupport.pro index b6c5cd40c8c..df7fe51a81b 100644 --- a/src/plugins/qtsupport/qtsupport.pro +++ b/src/plugins/qtsupport/qtsupport.pro @@ -17,8 +17,6 @@ HEADERS += \ uicodemodelsupport.h \ baseqtversion.h \ qmldumptool.h \ - qmlobservertool.h \ - qmldebugginglibrary.h \ qtoptionspage.h \ customexecutablerunconfiguration.h \ customexecutableconfigurationwidget.h \ @@ -48,8 +46,6 @@ SOURCES += \ uicodemodelsupport.cpp \ baseqtversion.cpp \ qmldumptool.cpp \ - qmlobservertool.cpp \ - qmldebugginglibrary.cpp \ qtoptionspage.cpp \ customexecutablerunconfiguration.cpp \ customexecutableconfigurationwidget.cpp \ diff --git a/src/plugins/qtsupport/qtsupport.qbs b/src/plugins/qtsupport/qtsupport.qbs index e764c190cb5..72f0597a6ad 100644 --- a/src/plugins/qtsupport/qtsupport.qbs +++ b/src/plugins/qtsupport/qtsupport.qbs @@ -74,12 +74,8 @@ QtcPlugin { "exampleslistmodel.h", "profilereader.cpp", "profilereader.h", - "qmldebugginglibrary.cpp", - "qmldebugginglibrary.h", "qmldumptool.cpp", "qmldumptool.h", - "qmlobservertool.cpp", - "qmlobservertool.h", "qtkitconfigwidget.cpp", "qtkitconfigwidget.h", "qtkitinformation.cpp", -- GitLab