From 05fa0cc0dba94b30f8f1c7f4c6479af49d2f96b3 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 24 Oct 2016 09:17:27 +0200 Subject: [PATCH 01/81] AutoTest: Let results pane only pop up on finish It is quite annoying if one minimizes results pane while a long test is running and for each result item the pane comes up again. Change-Id: I7020ae698cd61df01ed5b1402cc06d26fb018978 Reviewed-by: David Schulz --- src/plugins/autotest/testresultspane.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/autotest/testresultspane.cpp b/src/plugins/autotest/testresultspane.cpp index 0f4b6c9c241..d2a8781bcf5 100644 --- a/src/plugins/autotest/testresultspane.cpp +++ b/src/plugins/autotest/testresultspane.cpp @@ -208,8 +208,6 @@ void TestResultsPane::addTestResult(const TestResultPtr &result) m_atEnd = scrollBar ? scrollBar->value() == scrollBar->maximum() : true; m_model->addTestResult(result, m_expandCollapse->isChecked()); - if (!m_treeView->isVisible()) - popup(Core::IOutputPane::NoModeSwitch); setIconBadgeNumber(m_model->resultTypeCount(Result::Fail) + m_model->resultTypeCount(Result::UnexpectedPass)); flash(); @@ -498,6 +496,8 @@ void TestResultsPane::onTestRunFinished() m_model->removeCurrentTestMessage(); disconnect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged, this, &TestResultsPane::onScrollBarRangeChanged); + if (!m_treeView->isVisible()) + popup(Core::IOutputPane::NoModeSwitch); } void TestResultsPane::onScrollBarRangeChanged(int, int max) From f84c6b99e5ff8610d2114a64d41cbea2bdc698aa Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 19 Oct 2016 16:56:00 +0200 Subject: [PATCH 02/81] Doc: Describe automatically hiding debug view title bars Change-Id: Id287806933f0f0926fd7c274f58ca9263605b676 Reviewed-by: hjk --- doc/src/debugger/creator-debugger.qdoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/src/debugger/creator-debugger.qdoc b/doc/src/debugger/creator-debugger.qdoc index ec6571f64f9..4ae778d7c03 100644 --- a/doc/src/debugger/creator-debugger.qdoc +++ b/doc/src/debugger/creator-debugger.qdoc @@ -417,6 +417,9 @@ \uicontrol Window > \uicontrol Views > \uicontrol {Reset to Default Layout} to reset the views to their original sizes and positions. + To save space on the screen, select \uicontrol Window > \uicontrol Views > + \uicontrol {Automatically Hide View Titlebars}. + Once the program starts running under the control of the debugger, it behaves and performs as usual. You can interrupt a running C++ program by selecting \uicontrol Debug > \uicontrol Interrupt. The program is From 9f353b56b64d9cc8cb3daf2c28c4eca21864c07e Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 24 Oct 2016 07:30:19 +0200 Subject: [PATCH 03/81] QmlDesigner: use noquote, to respect line separators Change-Id: I98241fe605b9fb9925e9ab70bffc1ae6608cea3b Reviewed-by: Thomas Hartmann --- .../designercore/model/rewriterview.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 1671d408187..208a16ac6e7 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -369,8 +369,8 @@ void RewriterView::applyChanges() if (inErrorState()) { const QString content = textModifierContent(); - qDebug() << "RewriterView::applyChanges() got called while in error state. Will do a quick-exit now."; - qDebug() << "Content:" << content; + qDebug().noquote() << "RewriterView::applyChanges() got called while in error state. Will do a quick-exit now."; + qDebug().noquote() << "Content: " << content; throw RewritingException(__LINE__, __FUNCTION__, __FILE__, "RewriterView::applyChanges() already in error state", content); } @@ -382,8 +382,8 @@ void RewriterView::applyChanges() enterErrorState(errors().first().description()); } catch (const Exception &e) { const QString content = textModifierContent(); - qDebug() << "RewriterException:" << m_rewritingErrorMessage; - qDebug() << "Content:" << content; + qDebug().noquote() << "RewriterException:" << m_rewritingErrorMessage; + qDebug().noquote() << "Content: " << qPrintable(content); enterErrorState(e.description()); } @@ -391,10 +391,10 @@ void RewriterView::applyChanges() if (inErrorState()) { const QString content = textModifierContent(); - qDebug() << "RewriterException:" << m_rewritingErrorMessage; - qDebug() << "Content:" << content; + qDebug().noquote() << "RewriterException: " << m_rewritingErrorMessage; + qDebug().noquote() << "Content: " << content; if (!errors().isEmpty()) - qDebug() << "Error:" << errors().first().description(); + qDebug().noquote() << "Error:" << errors().first().description(); throw RewritingException(__LINE__, __FUNCTION__, __FILE__, qPrintable(m_rewritingErrorMessage), content); } } From 711f54bd8f413c45fecc8bc42ba7cf21aaa15a87 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 24 Oct 2016 11:43:04 +0200 Subject: [PATCH 04/81] QmlDesigner: move static methods Change-Id: I3f1998ddbddadd9ffc782d1ca87884564d6ad83c Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/qmldesignerplugin.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index b8b45729314..a0ba2a936ee 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -130,6 +130,18 @@ static bool shouldAssertInException() return !processEnvironment.value("QMLDESIGNER_ASSERT_ON_EXCEPTION").isEmpty(); } +static bool warningsForQmlFilesInsteadOfUiQmlEnabled() +{ + DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); + return settings.value(DesignerSettingsKey::WARNING_FOR_QML_FILES_INSTEAD_OF_UIQML_FILES).toBool(); +} + +static bool showWarningsForFeaturesInDesigner() +{ + DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); + return settings.value(DesignerSettingsKey::WARNING_FOR_FEATURES_IN_DESIGNER).toBool(); +} + QmlDesignerPlugin::QmlDesignerPlugin() { m_instance = this; @@ -298,18 +310,6 @@ void QmlDesignerPlugin::createDesignModeWidget() }); } -static bool warningsForQmlFilesInsteadOfUiQmlEnabled() -{ - DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); - return settings.value(DesignerSettingsKey::WARNING_FOR_QML_FILES_INSTEAD_OF_UIQML_FILES).toBool(); -} - -static bool showWarningsForFeaturesInDesigner() -{ - DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); - return settings.value(DesignerSettingsKey::WARNING_FOR_FEATURES_IN_DESIGNER).toBool(); -} - void QmlDesignerPlugin::showDesigner() { QTC_ASSERT(!d->documentManager.hasCurrentDesignDocument(), return); From 6cd31a2b985e419531fe7c67e55be4c1de2f37cf Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 24 Oct 2016 11:49:40 +0200 Subject: [PATCH 05/81] QmlDesigner: deactivate use of F4 to switch in design mode Introduce a setting for a not implemented in design text edit. Change-Id: Ie4973ec4fcb2c9b2e2534e40187cf33a0202abaa Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designersettings.h | 1 + src/plugins/qmldesigner/qmldesignerplugin.cpp | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index bc53d15aca1..0756be0d974 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -60,6 +60,7 @@ const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput"; const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* This Setting is not exposed in ui. The setting can be used to turn off the feature, if there are serious issues */ +const char TEXTEDIT_IN_DESIGNMODE[] = "TextEditInDesignMode"; } class DesignerSettings : public QHash diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index a0ba2a936ee..0cca310bc7f 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -130,6 +130,12 @@ static bool shouldAssertInException() return !processEnvironment.value("QMLDESIGNER_ASSERT_ON_EXCEPTION").isEmpty(); } +static bool useTextEditInDesignMode() +{ + DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); + return settings.value(DesignerSettingsKey::TEXTEDIT_IN_DESIGNMODE, false).toBool(); +} + static bool warningsForQmlFilesInsteadOfUiQmlEnabled() { DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); @@ -208,12 +214,11 @@ bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *e createDesignModeWidget(); connect(switchTextDesignAction, &QAction::triggered, this, [](){ - if (Core::ModeManager::currentMode() == Core::Constants::MODE_EDIT) { - Core::IEditor *editor = Core::EditorManager::currentEditor(); - if (checkIfEditorIsQtQuick(editor)) - Core::ModeManager::activateMode(Core::Constants::MODE_DESIGN); - } else if (Core::ModeManager::currentMode() == Core::Constants::MODE_DESIGN) { - Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); + if (Core::ModeManager::currentMode() == Core::Constants::MODE_DESIGN) { + if (useTextEditInDesignMode()) + qDebug() << "not implemented"; + else + Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); } }); From f45293dae6b3b9012b6f64bfc8389b4122ae40fb Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 19 Oct 2016 17:31:15 +0200 Subject: [PATCH 06/81] BareMetal: Themable, HighDPI-able device icon Change-Id: Id8d9c0885895f582dbb034546b701ec82f1492e6 Reviewed-by: hjk Reviewed-by: Alessandro Portale --- src/plugins/baremetal/baremetal.pro | 3 + src/plugins/baremetal/baremetal.qbs | 1 + src/plugins/baremetal/baremetal.qrc | 8 ++ src/plugins/baremetal/baremetaldevice.cpp | 13 ++ .../baremetal/images/baremetaldevice.png | Bin 0 -> 184 bytes .../baremetal/images/baremetaldevice@2x.png | Bin 0 -> 277 bytes .../baremetal/images/baremetaldevicesmall.png | Bin 0 -> 183 bytes .../images/baremetaldevicesmall@2x.png | Bin 0 -> 194 bytes src/tools/icons/qtcreatoricons.svg | 122 ++++++++++++++++++ 9 files changed, 147 insertions(+) create mode 100644 src/plugins/baremetal/baremetal.qrc create mode 100644 src/plugins/baremetal/images/baremetaldevice.png create mode 100644 src/plugins/baremetal/images/baremetaldevice@2x.png create mode 100644 src/plugins/baremetal/images/baremetaldevicesmall.png create mode 100644 src/plugins/baremetal/images/baremetaldevicesmall@2x.png diff --git a/src/plugins/baremetal/baremetal.pro b/src/plugins/baremetal/baremetal.pro index b79db4aac5c..f77ad11412a 100644 --- a/src/plugins/baremetal/baremetal.pro +++ b/src/plugins/baremetal/baremetal.pro @@ -47,3 +47,6 @@ HEADERS += baremetalplugin.h \ openocdgdbserverprovider.h \ defaultgdbserverprovider.h \ stlinkutilgdbserverprovider.h + +RESOURCES += \ + baremetal.qrc diff --git a/src/plugins/baremetal/baremetal.qbs b/src/plugins/baremetal/baremetal.qbs index 81b4503f7d7..0474e562d13 100644 --- a/src/plugins/baremetal/baremetal.qbs +++ b/src/plugins/baremetal/baremetal.qbs @@ -13,6 +13,7 @@ QtcPlugin { Depends { name: "QtSupport" } files: [ + "baremetal.qrc", "baremetalconstants.h", "baremetalcustomrunconfiguration.cpp", "baremetalcustomrunconfiguration.h", "baremetaldevice.cpp", "baremetaldevice.h", diff --git a/src/plugins/baremetal/baremetal.qrc b/src/plugins/baremetal/baremetal.qrc new file mode 100644 index 00000000000..8badc224d0d --- /dev/null +++ b/src/plugins/baremetal/baremetal.qrc @@ -0,0 +1,8 @@ + + + images/baremetaldevice.png + images/baremetaldevice@2x.png + images/baremetaldevicesmall.png + images/baremetaldevicesmall@2x.png + + diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index 67c80b7c410..643355c06a8 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -152,16 +153,28 @@ DeviceProcess *BareMetalDevice::createProcess(QObject *parent) const return new GdbServerProviderProcess(sharedFromThis(), parent); } +static const QList &bareMetalDeviceIcon() +{ + static const QList icon = { + Utils::Icon({{":/baremetal/images/baremetaldevicesmall.png", + Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint), + Utils::Icon({{":/baremetal/images/baremetaldevice.png", + Utils::Theme::IconsBaseColor}})}; + return icon; +} + BareMetalDevice::BareMetalDevice(const QString &name, Core::Id type, MachineType machineType, Origin origin, Core::Id id) : IDevice(type, origin, machineType, id) { setDisplayName(name); + setDeviceIcon(bareMetalDeviceIcon()); } BareMetalDevice::BareMetalDevice(const BareMetalDevice &other) : IDevice(other) { setGdbServerProviderId(other.gdbServerProviderId()); + setDeviceIcon(bareMetalDeviceIcon()); } } //namespace Internal diff --git a/src/plugins/baremetal/images/baremetaldevice.png b/src/plugins/baremetal/images/baremetaldevice.png new file mode 100644 index 0000000000000000000000000000000000000000..34ac48c118a97f9f7bc5bc10ebde42a888e4ed9d GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2=dQTU}5R22vKl~XCE`&2O z3oUAG`YXfZ(U5GvtI3(^Bd>>oXM+ALroI+7kqHMHmo+S8V)Kp*A7UwKgEYHZGpU(17LPR;E}+x0I{wtk)lRt~uPKadEE3 jj_Freocmp@8!Ckv_Obnys(jn;26B?8tDnm{r-UW|Cm=cW literal 0 HcmV?d00001 diff --git a/src/plugins/baremetal/images/baremetaldevice@2x.png b/src/plugins/baremetal/images/baremetaldevice@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d1341f90ee688a8ff1c3e8b942e56b1d360d2782 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4h9AWhJGeJCI$wEJDx6%ArXh)PBY|dHsEpn z&p6AkBW|Iyg=4YyEW;qbXcxVUempG+>^_>VKbgHBE&oxkD4oABfI*#&;blJK8x{`U zw9@*I4ROsA-dQ?i1la!Vd6WB#O=pF_kWzzNuB~FU^JIpGHQ(j*JIFA242KvX7WE(|n?|&ZCQBQX#swG1hf^wsXJQ9&a#1bh&o*BYVbA dp$y9zY8ckUeL3^dGO`WiUr$#*mvv4FO#m@4XQu!F literal 0 HcmV?d00001 diff --git a/src/plugins/baremetal/images/baremetaldevicesmall.png b/src/plugins/baremetal/images/baremetaldevicesmall.png new file mode 100644 index 0000000000000000000000000000000000000000..19aeca1b357b25b7bbb53e0fded0e5c2fbe12922 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdsSyd_r86m6cUgR8&<}y}iAC ze0+R;eFFjlLPA0!BO?~h3^XJe1|NlSv#P`Px3=AHgE{-7_(aAfwS$R(M z+_(`Da_r%!PmeY$xLtX7cXv`_&xJg3@%Psv7I=JrcXxO7LZ#h-u2M_Non4r=D(-qG kH`}uKR^*#72L^_J2g36Y`>n}gU|?YIboFyt=akR{0M+qE-~a#s literal 0 HcmV?d00001 diff --git a/src/plugins/baremetal/images/baremetaldevicesmall@2x.png b/src/plugins/baremetal/images/baremetaldevicesmall@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..633f0d847a8f9c477c4b9939ee1a030d7440d651 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2=PEQxd5R22vKl~XCE<`r2 z*JtAIXqtbI$K$|n^<7Qzc5K1vhYp$uZc3l))9iu!(6ypaj>2yAA$~yQB@)ESN1_#KKZs7{M5*aN>YM$9dl1KvAF6 u108F091q&qOmsEa#i=&KapJ0zXJ<3~5nz{)m(qU$a-65DpUXO@geCy}=RYq1 literal 0 HcmV?d00001 diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 7002b7fd402..a413bed3b53 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -6424,5 +6424,127 @@ inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc" /> + + + + + + + + + + + + + + + + + + + + + + From f7214157b978cb7521caa4beecddb4108c2a1029 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 24 Oct 2016 13:30:42 +0200 Subject: [PATCH 07/81] Debugger: Don't force dumper test to be build with forced debug Does not seem to be needed and breaks builds on OS X 10.10 with qmake CONFIG+=release CONFIG-=debug BUILD_TESTS=1: "ld: library not found for -lUtils_debug" Change-Id: I3c3e91d4045768f56ed6737410e09666e4e182ad Reviewed-by: Christian Stenger --- tests/auto/debugger/dumpers.pro | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/auto/debugger/dumpers.pro b/tests/auto/debugger/dumpers.pro index ed66def4055..39cf6770135 100644 --- a/tests/auto/debugger/dumpers.pro +++ b/tests/auto/debugger/dumpers.pro @@ -2,10 +2,6 @@ QT = core network QTC_LIB_DEPENDS += utils -!win32 { -CONFIG -= release -CONFIG += debug -} include(../qttest.pri) msvc { From 3735506400b61798a7d1c4458f407f460f0413a3 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 18 Oct 2016 10:28:11 +0200 Subject: [PATCH 08/81] Wizards: Add empty QML_DESIGNER_IMPORT_PATH to templates QML_DESIGNER_IMPORT_PATH can be used to create "mockup" QML files, just for Qt Quick Designer. Change-Id: Icd0c4143031a4b49afb89a2465622bdf2376745f Reviewed-by: Alessandro Portale --- .../wizards/projects/qmake/qtquickapplication/app.pro | 3 +++ .../wizards/projects/qmake/qtquickcontrols2application/app.pro | 3 +++ .../wizards/projects/qmake/qtquickcontrolsapplication/app.pro | 3 +++ 3 files changed, 9 insertions(+) diff --git a/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro b/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro index 68acc52a40a..5eecb7b319a 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro @@ -10,6 +10,9 @@ RESOURCES += qml.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin diff --git a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro index f15dcb65f46..3308ed251cd 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro @@ -9,6 +9,9 @@ RESOURCES += qml.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin diff --git a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro index 9b50176b3a2..227fd034897 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro @@ -15,6 +15,9 @@ RESOURCES += qml.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin From 12ad7233498824791b2e914e79c17201c7cf5aec Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 24 Oct 2016 12:03:27 +0200 Subject: [PATCH 09/81] QmlDesigner: reorder css lines No behavior change Change-Id: Ib05d9a369d5cba0132636efdccfea873890027b5 Reviewed-by: Thomas Hartmann --- .../components/resources/stylesheet.css | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/plugins/qmldesigner/components/resources/stylesheet.css b/src/plugins/qmldesigner/components/resources/stylesheet.css index 126ac51b29e..2992e0e7fa2 100644 --- a/src/plugins/qmldesigner/components/resources/stylesheet.css +++ b/src/plugins/qmldesigner/components/resources/stylesheet.css @@ -21,22 +21,11 @@ QStackedWidget { background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; } - QGraphicsView { border: 0px; background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; } -QTabWidget { - border: 0px; - background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; -} - -QTabWidget::pane { /* The tab widget frame */ - border: 0px; - background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; -} - QLineEdit#itemLibrarySearchInput { color: creatorTheme.PanelTextColorLight; @@ -70,21 +59,30 @@ QLineEdit#itemLibrarySearchInput selection-color: #404040; } +QTabWidget { + border: 0px; + background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; +} + +QTabWidget::pane { /* The tab widget frame */ + border: 0px; + background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; +} + QTabBar::tab { - border-image: none; - width: 80px; - height: 22px; + + border-image: none; + background-color: creatorTheme.QmlDesignerTabDark; + color: creatorTheme.QmlDesignerTabLight; + margin-top: 0x; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; font: bold; - font-size: 11px; - background-color: creatorTheme.QmlDesignerTabDark; - - color: creatorTheme.QmlDesignerTabLight; + font-size: 11px; } QTabBar::tab:selected { From dafdf290d0f9cd30fc1258b42349e036b586e6d6 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 24 Oct 2016 11:12:03 +0200 Subject: [PATCH 10/81] QmlDesigner: prepare centerWidget to use styled QTabWidget Change-Id: Ibcc6e7d5866df50448b54ecc4f2aff340b353f77 Reviewed-by: Thomas Hartmann --- .../components/resources/centerwidget.css | 33 +++++++++++++++++++ .../components/resources/resources.qrc | 1 + src/plugins/qmldesigner/designmodewidget.cpp | 15 ++++++--- 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 src/plugins/qmldesigner/components/resources/centerwidget.css diff --git a/src/plugins/qmldesigner/components/resources/centerwidget.css b/src/plugins/qmldesigner/components/resources/centerwidget.css new file mode 100644 index 00000000000..dd60f7f7186 --- /dev/null +++ b/src/plugins/qmldesigner/components/resources/centerwidget.css @@ -0,0 +1,33 @@ +QWidget { + background-color: creatorTheme.QmlDesignerTabDark +} + +QTabWidget#centralTabWidget::pane { + border: 0px; + background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; +} + +QTabWidget#centralTabWidget::tab-bar { alignment: right; } + +QTabBar::tab:selected { + border: none; + background-color: creatorTheme.QmlDesignerTabLight; + color: creatorTheme.QmlDesignerTabDark; +} + +QTabBar::tab { + width: 16px; + height: 80px; + + border-image: none; + background-color: creatorTheme.QmlDesignerTabDark; + color: creatorTheme.QmlDesignerTabLight; + + margin-top: 0x; + margin-bottom: 0px; + margin-left: 0px; + margin-right: 0px; + font: bold; + font-size: 11px; +} + diff --git a/src/plugins/qmldesigner/components/resources/resources.qrc b/src/plugins/qmldesigner/components/resources/resources.qrc index 8adecdd5db1..aeb286a4143 100644 --- a/src/plugins/qmldesigner/components/resources/resources.qrc +++ b/src/plugins/qmldesigner/components/resources/resources.qrc @@ -4,5 +4,6 @@ stylesheet.css scrollbar.css formeditorstylesheet.css + centerwidget.css diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index b162816ebdd..64c5bbc26bf 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -471,7 +471,7 @@ void DesignModeWidget::addNavigatorHistoryEntry(const Utils::FileName &fileName) ++m_navigatorHistoryCounter; } -static QWidget *createWidgetsInTabWidget(const QList &widgetInfos) +static QTabWidget *createWidgetsInTabWidget(const QList &widgetInfos) { QTabWidget *tabWidget = new QTabWidget; @@ -512,13 +512,18 @@ static Core::MiniSplitter *createCentralSplitter(const QList &widget auto outputPanePlaceholder = new StyledOutputpanePlaceHolder(Core::Constants::MODE_DESIGN, outputPlaceholderSplitter); - if (centralWidgetInfos.count() == 1) - outputPlaceholderSplitter->addWidget(centralWidgetInfos.first().widget); - else - outputPlaceholderSplitter->addWidget(createWidgetsInTabWidget(centralWidgetInfos)); + QTabWidget* tabWidget = createWidgetsInTabWidget(centralWidgetInfos); + tabWidget->setObjectName("centralTabWidget"); + tabWidget->setTabPosition(QTabWidget::East); + tabWidget->setTabBarAutoHide(true); + + outputPlaceholderSplitter->addWidget(tabWidget); outputPlaceholderSplitter->addWidget(outputPanePlaceholder); + QByteArray sheet = Utils::FileReader::fetchQrc(":/qmldesigner/centerwidget.css"); + tabWidget->setStyleSheet(Theming::replaceCssColors(QString::fromUtf8(sheet))); + outputPlaceholderSplitter->setStyleSheet(Theming::replaceCssColors(QString::fromUtf8(sheet))); return outputPlaceholderSplitter; } From 5c756cb260e317ec8575f6e56e5c5632b49f9220 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 24 Oct 2016 13:55:54 +0200 Subject: [PATCH 11/81] README: Add statement about web engine based help viewer Even though it is stating an obvious prerequisite, it might help people to realize that the web engine based backend exists. Change-Id: I8d43d8a0fd7786de050b67d1438fefa3b95ec7df Reviewed-by: hjk Reviewed-by: Leena Miettinen --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f5567748de7..ef348fb758b 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ macOS 10.8 or later Prerequisites: * Qt 5.6.0 or later +* Qt WebEngine module for QtWebEngine based help viewer * On Windows: * ActiveState Active Perl * MinGW with g++ 4.8 or Visual Studio 2015 or later From ee8cb08e2c7f6a4a3b9292c7b7b6921c99b30396 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 24 Oct 2016 17:12:12 +0200 Subject: [PATCH 12/81] Utils: "Zoom in" and "Zoom out" icons Change-Id: I596cde174d63e23cf29c4d528c6b3b9b70e17aaa Reviewed-by: Alessandro Portale --- src/libs/utils/images/zoomin_overlay.png | Bin 0 -> 98 bytes src/libs/utils/images/zoomin_overlay@2x.png | Bin 0 -> 102 bytes src/libs/utils/images/zoomout_overlay.png | Bin 0 -> 94 bytes src/libs/utils/images/zoomout_overlay@2x.png | Bin 0 -> 97 bytes src/libs/utils/utils.qrc | 4 +++ src/libs/utils/utilsicons.cpp | 6 ++++ src/libs/utils/utilsicons.h | 2 ++ src/tools/icons/qtcreatoricons.svg | 35 +++++++++++++++++++ 8 files changed, 47 insertions(+) create mode 100644 src/libs/utils/images/zoomin_overlay.png create mode 100644 src/libs/utils/images/zoomin_overlay@2x.png create mode 100644 src/libs/utils/images/zoomout_overlay.png create mode 100644 src/libs/utils/images/zoomout_overlay@2x.png diff --git a/src/libs/utils/images/zoomin_overlay.png b/src/libs/utils/images/zoomin_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..051f9246ed335851f327fa283ad4839964e80e03 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRdMrH;E236Z!B?bltwg8_HR|W=#|Ns9ly*d9b z0|SG&r;B3zopr05IYj Aga7~l literal 0 HcmV?d00001 diff --git a/src/libs/utils/images/zoomin_overlay@2x.png b/src/libs/utils/images/zoomin_overlay@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f022c80cbe1f30e681eeb6611ef4c7a5f7705565 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;IMrH;E2G1=owlgp=um$*pxH2#>{Qv)d>CO3f z85kI(JzX3_IHHq(@U!r^2tGILwC6Eknys^o@reLK->mAtUZRS77(fQN`njxgN@xNA D*G?P3 literal 0 HcmV?d00001 diff --git a/src/libs/utils/images/zoomout_overlay.png b/src/libs/utils/images/zoomout_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ee112fcd0cf39ca4feea7f6c6e0432a7a5cb69 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRdMrH;E236Z!B?bltwg8_HR|W=#|Ns9ly*d9b w0|SGwr;B3{Qv)d>CO3f x85kJEJY5_^IHHq(@U!qd5vrF+U@?o#5@3+YtgSU$t-gu@q}SEYWt~$(697DS86p4x literal 0 HcmV?d00001 diff --git a/src/libs/utils/utils.qrc b/src/libs/utils/utils.qrc index 6378073fc12..798e3bb2055 100644 --- a/src/libs/utils/utils.qrc +++ b/src/libs/utils/utils.qrc @@ -161,5 +161,9 @@ images/bookmark@2x.png images/snapshot.png images/snapshot@2x.png + images/zoomin_overlay.png + images/zoomin_overlay@2x.png + images/zoomout_overlay.png + images/zoomout_overlay@2x.png diff --git a/src/libs/utils/utilsicons.cpp b/src/libs/utils/utilsicons.cpp index e81aa34af7f..c59d1b8b8ab 100644 --- a/src/libs/utils/utilsicons.cpp +++ b/src/libs/utils/utilsicons.cpp @@ -48,6 +48,12 @@ const Icon ZOOM({ {QLatin1String(":/utils/images/zoom.png"), Theme::PanelTextColorMid}}, Icon::Tint); const Icon ZOOM_TOOLBAR({ {QLatin1String(":/utils/images/zoom.png"), Theme::IconsBaseColor}}); +const Icon ZOOMIN_TOOLBAR({ + {QLatin1String(":/utils/images/zoom.png"), Theme::IconsBaseColor}, + {QLatin1String(":/utils/images/zoomin_overlay.png"), Theme::IconsBaseColor}}); +const Icon ZOOMOUT_TOOLBAR({ + {QLatin1String(":/utils/images/zoom.png"), Theme::IconsBaseColor}, + {QLatin1String(":/utils/images/zoomout_overlay.png"), Theme::IconsBaseColor}}); const Icon OK({ {QLatin1String(":/utils/images/ok.png"), Theme::IconsRunToolBarColor}}, Icon::Tint); const Icon NOTLOADED({ diff --git a/src/libs/utils/utilsicons.h b/src/libs/utils/utilsicons.h index 8a1dc4ed04c..51bc6e40e50 100644 --- a/src/libs/utils/utilsicons.h +++ b/src/libs/utils/utilsicons.h @@ -41,6 +41,8 @@ QTCREATOR_UTILS_EXPORT extern const Icon PREV; QTCREATOR_UTILS_EXPORT extern const Icon PREV_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon ZOOM; QTCREATOR_UTILS_EXPORT extern const Icon ZOOM_TOOLBAR; +QTCREATOR_UTILS_EXPORT extern const Icon ZOOMIN_TOOLBAR; +QTCREATOR_UTILS_EXPORT extern const Icon ZOOMOUT_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon OK; QTCREATOR_UTILS_EXPORT extern const Icon NOTLOADED; QTCREATOR_UTILS_EXPORT extern const Icon BROKEN; diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index a413bed3b53..733bda9b8a6 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -3734,6 +3734,41 @@ d="m 1236,579.75 1.75,0 0,-1.75" style="fill:none;stroke:#808080;stroke-width:0.5" /> + + + + + + + + Date: Mon, 24 Oct 2016 17:13:49 +0200 Subject: [PATCH 13/81] ImageViewer, ScxmlEditor: Use the new "Zoom In"/"Zoom Out" icons Change-Id: Ib01060918924644b57d35083a4269614fba900c5 Reviewed-by: Alessandro Portale --- src/plugins/imageviewer/imageviewer.cpp | 4 ++-- src/plugins/scxmleditor/common/common.qrc | 2 -- .../scxmleditor/common/images/icon-zoom-in.png | Bin 1119 -> 0 bytes .../scxmleditor/common/images/icon-zoom-out.png | Bin 1053 -> 0 bytes .../plugin_interface/actionhandler.cpp | 4 ++-- 5 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 src/plugins/scxmleditor/common/images/icon-zoom-in.png delete mode 100644 src/plugins/scxmleditor/common/images/icon-zoom-out.png diff --git a/src/plugins/imageviewer/imageviewer.cpp b/src/plugins/imageviewer/imageviewer.cpp index 02a6c9dca24..069e1a36225 100644 --- a/src/plugins/imageviewer/imageviewer.cpp +++ b/src/plugins/imageviewer/imageviewer.cpp @@ -107,8 +107,8 @@ void ImageViewer::ctor() {QLatin1String(":/utils/images/desktopdevicesmall.png"), Utils::Theme::IconsBaseColor}}); d->ui_toolbar.toolButtonBackground->setIcon(backgroundIcon.icon()); d->ui_toolbar.toolButtonOutline->setIcon(Utils::Icons::BOUNDING_RECT.icon()); - d->ui_toolbar.toolButtonZoomIn->setIcon(Utils::Icons::PLUS_TOOLBAR.icon()); - d->ui_toolbar.toolButtonZoomOut->setIcon(Utils::Icons::MINUS.icon()); + d->ui_toolbar.toolButtonZoomIn->setIcon(Utils::Icons::ZOOMIN_TOOLBAR.icon()); + d->ui_toolbar.toolButtonZoomOut->setIcon(Utils::Icons::ZOOMIN_TOOLBAR.icon()); d->ui_toolbar.toolButtonFitToScreen->setIcon(Utils::Icons::ZOOM_TOOLBAR.icon()); d->ui_toolbar.toolButtonOriginalSize->setIcon(Utils::Icons::EYE_OPEN_TOOLBAR.icon()); // icons update - try to use system theme diff --git a/src/plugins/scxmleditor/common/common.qrc b/src/plugins/scxmleditor/common/common.qrc index 49ee31ce666..b3b7bd9664f 100644 --- a/src/plugins/scxmleditor/common/common.qrc +++ b/src/plugins/scxmleditor/common/common.qrc @@ -18,8 +18,6 @@ images/icon-export-canvas@2x.png images/icon-fit-screen.png images/icon-pan.png - images/icon-zoom-in.png - images/icon-zoom-out.png images/initial.png images/more_colors.png images/navigator.png diff --git a/src/plugins/scxmleditor/common/images/icon-zoom-in.png b/src/plugins/scxmleditor/common/images/icon-zoom-in.png deleted file mode 100644 index b8679e7ec5d0e95469342d945641b04ad5f508b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4rT@hhU+WOo?>8N3JvfHab;s;`~Uwx+h7G8 z9PAvN?3`R|Tp+~G#m&ym&B@Kf#>30W%ge>b&nY0xCMd)$B+4c%#vv*uAR)~oDI*{) z$1kTKCa27)q$;VbDy5>ut*R-Zp(m_m#HnS(t!>P!ZNi~r%&%)AXlTu2Vl8Q6BWh}? zVrr#mYAbARqiSWR;p8js62#{kB;*w#<{zOO7;YUDX%!M<8WOJ+mZ%q&#U7p^8Ih(K zoh=ueVHlgKmyqt5T%?(jXP;VZlv*K^S!$hGshwS;lUrq*SLUBrYn0zElHbXb-^E_o zB~a98QPd$-*6dc+;#AfvRnZt&(Wg+^;$77i&^k}KYrc8+e7o*NhP?~z`&P+MTBAE@ zE622*eA5@_Okd?cV@2eQtr|0TiOgP=Fnf>G>;rsrHhRz5VmEh>(!7Hr^Y>{kSf9M$ zu=K)BaSONkF5Kz9XnpRYtx<~)8ZADgwdAPs^6lx%4_hriuDxPg>55%REB1x2JP^3@ zgz@TACTmaGtlL+({z&5bGq#(~xotVrxb0%VuFH{oPB-nlmbCv`=D~|i2XAB@y;Xet zM%VFMjVJHcoVwL>>Q3{S`z>ehcAmdK<@|&0i;pH=c`}_%b@>zq1_qOoAirP+24*%+ zAyElwMRhG*1A8Y|4{yJy*o5S?%>1H?>c*D#uHFfgr_J1Q;PA;a=WpD8_~iMwpW?Sx z+-G25Z1r?;4AD5BoN$Cug2SU@mGtZxFHUVVR$%amh_PPz{=>%P*{5Sf0#%;u4VSUq zReyBbV)ySVt2ZgAEZI{g7b%duB=^C^iWeU1xMG@aR{cFFW*itQ>?=6+#a?!$BMCx6 zn!l$-eO_Vqe)gJ^3+C+4-zMhcl>Y9WhbQaSU3Y~|u2%Slzx(#I&BI{kyBi5B0z&o| zTyOhTWxe!LZ092ZPQLAL|3>{S*(`RJ?~(q;a1rNOFcIa!xe1U}z3xjThZ>)_j6Ik7vq z_)o|OeUp_o7JXbJLC6}vuc2=a~CQ;mKnjs6#H@7R_|$NI6|6Otrt(&Rh$tsXZgG>4X#J$SOzmqNf7Gk$!QW2ig8%i z;QIB<%*lVIN=#TJmb83=>(eVM_d3={2=O>Q3$=a8w`PVA&ml9vt~oprDiRSl8dw-g YOiB*CdKQq+z`(%Z>FVdQ&MBb@03|k(r2qf` diff --git a/src/plugins/scxmleditor/common/images/icon-zoom-out.png b/src/plugins/scxmleditor/common/images/icon-zoom-out.png deleted file mode 100644 index d492a2e8c4a6acd757f88837323826fa96afd88e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1053 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4rT@hhU+WOo?>8N(hKkjab;s;`~Uwx+u#En z9PAvN?3`R|Tp+~G#m&ym&B@Kf#>30W%ge>b&nY0xCMd)$B+4c%#vv*uAR)~oDI*{) z$1kTKCa27)q$;VbDy5>ut*R-Zp(m_m#HnS(t!>P!ZNi~r%&%)AXlTu2Vl8Q6BWh}? zVrr#mYAbARqiSWR;p8js62#{kB;*w#<{zOO7;YUDX%!M<8WOJ+mZ%q&#U7p^8Ih(K zoh=ueVHlgKmyqt5T%?(jXP;VZlv*K^S!$hGshwM8n^)$a-!78h$&=s3Uf3m2)M!!E zAywAmRMsn1(HL0Kr%=@v&^k}Kd%j)wBE!B_@{`u+PTI;bZ71LK#W~Yg`Ony@F>{y5 z>^)Mm5Ae;|VmEh>(!7Hr^Y>{kSf9M$u=K)BaSONkF5Kz9XnpSDgGP%FX)QUbynK85 z^21ikk87{kR=Q$W(u#fID^D1&K4r4@l+C(*h3k(bu0LbD>73h^Lyg-m2JE^Vx#x7# zzH3SQuVo&**mUql*3nzV$8U5Uztwp1Zq2D%J*Vz8pSj<1_HO6-`%}(8=)U-9;*}@U zxn4=1V_;w~DhcunW?*1u;}jB=kXBUJ(lxMma`o``i%m#Q%gisTsBUa&@9Lc}dD_e^ z2Tqlzqzq7^V}&}>uc((HYlj5*j~$-FO|Ar<@2!3rPbSvVw!FiU7Thm zEV!UF=F~)Kv-ZwIDn}-po!jz+ac6U*qh|SI7Ty^x*Ort%6#BF(;Xt-c`CM~zm!^{y zUz2KoHfb4b2-Jy^)@Pgepdj+@!k661vFFySiuQ0--zSHjA}s6*s7;@s_yTbo3fkJzq4x{P?<4h&#LqWhu}4p zPkSWy{_EP1kS-Eb%+uFdczvRff%Z&`ji>zu)efFGp{AjCj`a!GjH%zhmj2Q*QgGEh z;-|Rz(z|!p80>gB*%U8tnigUm=EKRBsLjsm$EG91qm$#n#Bi}M%{keu? Date: Sat, 22 Oct 2016 20:40:35 +0300 Subject: [PATCH 14/81] Utils: Fix Guard documentation Change-Id: I18a23c4410424f3799b9ec5bcacccac742713c63 Reviewed-by: Jarek Kobus Reviewed-by: Leena Miettinen Reviewed-by: Tobias Hunger --- src/libs/utils/guard.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libs/utils/guard.cpp b/src/libs/utils/guard.cpp index 925bdb226f9..69f872db00e 100644 --- a/src/libs/utils/guard.cpp +++ b/src/libs/utils/guard.cpp @@ -54,8 +54,8 @@ void MyClass::updateOtherObject() { - GuardLocker updatelocker(updateGuard); - otherObject->update(); // this may trigger a signal + GuardLocker updatelocker(updateGuard); + otherObject->update(); // this may trigger a signal } \endcode @@ -66,16 +66,16 @@ \code void MyClass::otherObjectUpdated() { - if (updateGuard.isLocked) - return; + if (updateGuard.isLocked()) + return; - // we didn't trigger the update - // so do update now - \dots + // we didn't trigger the update + // so do update now + \dots } \endcode - The GuardLock unlocks the Guard in it's destructor. + The GuardLocker unlocks the Guard in its destructor. The Guard object is recursive, you may declare many GuardLocker objects for the same Guard instance and the Guard will be locked From ff2c49538b89210c56c5b034675c69b98bc6de28 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 24 Oct 2016 18:25:19 +0200 Subject: [PATCH 15/81] ScxmlEditor: Improved "Export Canvas" icon Change-Id: Ibca3ec6fbe593644bdae223bad469dea2aede41b Reviewed-by: Alessandro Portale --- .../common/images/icon-export-canvas.png | Bin 164 -> 161 bytes .../common/images/icon-export-canvas@2x.png | Bin 256 -> 245 bytes src/tools/icons/qtcreatoricons.svg | 15 ++++++++------- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/plugins/scxmleditor/common/images/icon-export-canvas.png b/src/plugins/scxmleditor/common/images/icon-export-canvas.png index d2d47205a8f2df6cb40ad5e12472455d0fe12d17..cd6f0cea56a8ec41fe2c1bef4f02afcfbc3b8e93 100644 GIT binary patch delta 132 zcmZ3&xR7yzN^ORxi(`ny)Z`!iY!U`6|33bV{e7N+WzFw}T6R8y)=X)gZ(B2ODt_K2 zcfyKCjB$40Le?b?yAqhL^6(T$JM56t_<4WdJvluFwyzE+8kTUmvby~J_uqrb;p^|` p|J{Q>{EbavYKqLKd!QSaJWqyeGqo ty8nOvXK4NV?{3QM%D}hbrx?Q@!@bX*Y8KvOU|?YIboFyt=aj(M1OQD0Is*Uz diff --git a/src/plugins/scxmleditor/common/images/icon-export-canvas@2x.png b/src/plugins/scxmleditor/common/images/icon-export-canvas@2x.png index bdc82b7ade6b4af26d989f7af0c0a84b07751c5c..5dd92fbba32c5ad6a66cd5c8c58059d38f4d8e3e 100644 GIT binary patch delta 217 zcmZo*`pP&#rGAg6i(`nz>Es{&3n;zi1${N^&I#}>d8Nn|r?|4==OZ!u!+-vN^K(Sm^)& delta 228 zcmey$*uXSFrT)05i(`nz>Es{&36!Y1dT~dY$2>o|G5R50%E%-h!)7NOFytWVZZ#D z2$tSO3JiJr%poGaj8ShAwH$8vv9jKf?R@j^KX1gI&Np>lq9zQCio*XM2Q>&uTkQ4R i$K>NMi;3%#8bi(7AAt&rWnK&n3=E#GelF{r5}E) - + From 6032847c8d1a9cddaef5621ca54963df98ad6b76 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 24 Oct 2016 10:29:13 +0200 Subject: [PATCH 16/81] Doc: Using pattern substitution when expanding variables Change-Id: Ifaf8dddf7b5991d6b472d80cb9e94f42de75c1e7 Reviewed-by: Orgad Shaneh --- .../creator-projects-settings-build.qdoc | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/src/projects/creator-projects-settings-build.qdoc b/doc/src/projects/creator-projects-settings-build.qdoc index ca38fa89d54..ad317c2b944 100644 --- a/doc/src/projects/creator-projects-settings-build.qdoc +++ b/doc/src/projects/creator-projects-settings-build.qdoc @@ -111,6 +111,30 @@ (\uicontrol {Variables}) button in a field to select from a list of variables that are available in a particular context. + \QC uses pattern substitution when expanding variable names. To replace the + first match of \e pattern within \e variable with \e replacement, use: + + \badcode + %{variable/pattern/replacement} + \endcode + + To replace all matches of \e pattern within \e variable with \e replacement, + use: + + \badcode + %{variable//pattern/replacement} + \endcode + + The pattern can be a regular expression and the replacement can contain + backreferences. For example, if \c %{variable} is \c my123var, then + \c %{variable/(..)(\d+)/\2\1} is expanded to \c {123myvar}. + + To use the default value if the variable is not set, use: + + \badcode + %{variable:-default} + \endcode + \section1 Build Steps The build system of \QC is built on qmake and make. In \uicontrol{Build Steps} you From 280ad905109754cad3940334e5a46e4969883ea7 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 19 Oct 2016 16:02:50 +0200 Subject: [PATCH 17/81] Doc: Using environment variables as Qt Creator variables Change-Id: I96a9092c6cda806cbac04d50f61b740ae59def8f Reviewed-by: Tobias Hunger --- doc/src/projects/creator-projects-settings-build.qdoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/src/projects/creator-projects-settings-build.qdoc b/doc/src/projects/creator-projects-settings-build.qdoc index ad317c2b944..dfe29d5cc14 100644 --- a/doc/src/projects/creator-projects-settings-build.qdoc +++ b/doc/src/projects/creator-projects-settings-build.qdoc @@ -111,6 +111,9 @@ (\uicontrol {Variables}) button in a field to select from a list of variables that are available in a particular context. + The following syntax enables you to use environment variables as \QC + variables: %{Env:VARNAME}. + \QC uses pattern substitution when expanding variable names. To replace the first match of \e pattern within \e variable with \e replacement, use: From e83dd1755446134c94537b9d98b193faf9a8260f Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 24 Oct 2016 07:29:39 +0200 Subject: [PATCH 18/81] QmlDesigner: reduce max puppet start wait time Change-Id: I6b68d58ea870a17f9639a9dd174baa9b12ca082e Reviewed-by: Thomas Hartmann --- .../instances/nodeinstanceserverproxy.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 819f39e8240..f507fb83619 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -141,16 +141,18 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV SLOT(processFinished(int,QProcess::ExitStatus))); } - if (m_qmlPuppetEditorProcess->waitForStarted(10000)) { + const int second = 1000; + const int waitConstant = 8 * second; + if (m_qmlPuppetEditorProcess->waitForStarted(waitConstant)) { connect(m_qmlPuppetEditorProcess.data(), static_cast(&QProcess::finished), m_qmlPuppetEditorProcess.data(), &QProcess::deleteLater); if (runModus == NormalModus) { - m_qmlPuppetPreviewProcess->waitForStarted(); + m_qmlPuppetPreviewProcess->waitForStarted(waitConstant / 2); connect(m_qmlPuppetPreviewProcess.data(), static_cast(&QProcess::finished), m_qmlPuppetPreviewProcess.data(), &QProcess::deleteLater); - m_qmlPuppetRenderProcess->waitForStarted(); + m_qmlPuppetRenderProcess->waitForStarted(waitConstant / 2); connect(m_qmlPuppetRenderProcess.data(), static_cast(&QProcess::finished), m_qmlPuppetRenderProcess.data(), &QProcess::deleteLater); } @@ -158,7 +160,7 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV bool connectedToPuppet = true; if (!m_localServer->hasPendingConnections()) - connectedToPuppet = m_localServer->waitForNewConnection(3000); + connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4); if (connectedToPuppet) { m_firstSocket = m_localServer->nextPendingConnection(); @@ -166,14 +168,14 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV if (runModus == NormalModus) { if (!m_localServer->hasPendingConnections()) - connectedToPuppet = m_localServer->waitForNewConnection(3000); + connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4); if (connectedToPuppet) { m_secondSocket = m_localServer->nextPendingConnection(); connect(m_secondSocket.data(), SIGNAL(readyRead()), this, SLOT(readSecondDataStream())); if (!m_localServer->hasPendingConnections()) - connectedToPuppet = m_localServer->waitForNewConnection(3000); + connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4); if (connectedToPuppet) { m_thirdSocket = m_localServer->nextPendingConnection(); From 2a3cb8d7cb95b7708723a142c61b53c81d0b1fdf Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 24 Oct 2016 13:18:20 +0200 Subject: [PATCH 19/81] Qmake: Add variable chooser to build directory path chooser Task-number: QTCREATORBUG-17160 Change-Id: I11974b04f1ab7f757fddb7a62bff787a977838ba Reviewed-by: Tim Jenssen Reviewed-by: Orgad Shaneh --- src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp index c2f52f6284f..7ba94adea81 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp @@ -31,6 +31,7 @@ #include "ui_qmakeprojectconfigwidget.h" #include +#include #include #include @@ -82,6 +83,9 @@ QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc) m_ui->inSourceBuildDirEdit->setReadOnly(true); m_ui->inSourceBuildDirEdit->setEnabled(false); + auto chooser = new Core::VariableChooser(this); + chooser->addSupportedWidget(m_ui->shadowBuildDirEdit->lineEdit()); + m_ui->shadowBuildCheckBox->setChecked(isShadowBuild); connect(m_ui->shadowBuildCheckBox, &QAbstractButton::clicked, From 6dec313692dab8d13eb53c4bece0bb34d286674e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 25 Oct 2016 09:51:39 +0200 Subject: [PATCH 20/81] Document QML_IMPORT_PATH and QML_DESIGNER_IMPORT_PATH QML_IMPORT_PATH has never been officially documented and QML_DESIGNER_IMPORT_PATH was added recently. Change-Id: I932445404a185286d8f03077df492a34db9b0ea6 Reviewed-by: Leena Miettinen --- doc/src/qtquick/qtquick-modules-with-plugins.qdoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/src/qtquick/qtquick-modules-with-plugins.qdoc b/doc/src/qtquick/qtquick-modules-with-plugins.qdoc index c2def1cdc7a..f336a6163da 100644 --- a/doc/src/qtquick/qtquick-modules-with-plugins.qdoc +++ b/doc/src/qtquick/qtquick-modules-with-plugins.qdoc @@ -55,6 +55,11 @@ Classes registered with \c qmlRegisterType() can be used as backend objects in the \QMLD. For more information, see \l {Adding Connections}. + By default, \QC will look in the QML import path of Qt for QML modules. + If your applications adds additional import paths that \QC should use, + then you can specify those using \c{QML_IMPORT_PATH} in the \c{.pro} file of your + application. + Ideally, QML modules have a \c{plugins.qmltypes} file in the same directory as the \c qmldir file. The \c qmltypes file contains a description of the types exported by the module's plugins and is loaded by \QC when the @@ -117,4 +122,9 @@ environment variable to check whether the plugin is currently being run by an application or edited in the \uicontrol Design mode. + If you want to use a different module in \QMLD than in your actual + application for example to mockup C++ items, then you can use \c{QML_DESIGNER_IMPORT_PATH} + in the \c{.pro} file. + Modules in the import paths defined in \c{QML_DESIGNER_IMPORT_PATH} will be used only in \QMLD. + */ From e373061119e5dda661f63a70f7bdf40791383776 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 24 Oct 2016 10:38:09 +0200 Subject: [PATCH 21/81] Clang: Explicitly add extra space in diagnostic widget ...otherwise the one that is there will be ignored for long diagnostic messages. Change-Id: If9327f40b2af3315941cdb7cdf40d9e44854408b Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index 1275ab81cd3..265069ec7f7 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -190,7 +190,7 @@ private: const QString text = QString::fromLatin1( "" " " - " " + " " " " " " "
%1: %1: %2
") From a423f523109068e94dda4c6594956acb24b6e0fa Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 23 Oct 2016 05:52:51 +0300 Subject: [PATCH 22/81] QbsPM: Move QbsBuildStepConfigWidget to cpp file Change-Id: I9ad8598ca0fae7d5c48f7debb30a364c88456a46 Reviewed-by: Christian Kandeler --- .../qbsprojectmanager/qbsbuildstep.cpp | 38 +++++++++++++++++++ src/plugins/qbsprojectmanager/qbsbuildstep.h | 38 ------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 9c20578393e..fddbade83b0 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -62,6 +62,42 @@ static const char QBS_CLEAN_INSTALL_ROOT[] = "Qbs.CleanInstallRoot"; namespace QbsProjectManager { namespace Internal { +class QbsBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget +{ + Q_OBJECT +public: + QbsBuildStepConfigWidget(QbsBuildStep *step); + ~QbsBuildStepConfigWidget(); + QString summaryText() const; + QString displayName() const; + +private: + void updateState(); + void updateQmlDebuggingOption(); + void updatePropertyEdit(const QVariantMap &data); + + void changeBuildVariant(int); + void changeShowCommandLines(bool show); + void changeKeepGoing(bool kg); + void changeJobCount(int count); + void changeInstall(bool install); + void changeCleanInstallRoot(bool clean); + void changeForceProbes(bool forceProbes); + void applyCachedProperties(); + + // QML debugging: + void linkQmlDebuggingLibraryChecked(bool checked); + + bool validateProperties(Utils::FancyLineEdit *edit, QString *errorMessage); + + Ui::QbsBuildStepConfigWidget *m_ui; + + QList > m_propertyCache; + QbsBuildStep *m_step; + QString m_summary; + bool m_ignoreChange; +}; + // -------------------------------------------------------------------- // QbsBuildStep: // -------------------------------------------------------------------- @@ -752,3 +788,5 @@ ProjectExplorer::BuildStep *QbsBuildStepFactory::clone(ProjectExplorer::BuildSte } // namespace Internal } // namespace QbsProjectManager + +#include "qbsbuildstep.moc" diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index 5264b2fa35b..365507ac4f9 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -125,44 +125,6 @@ private: friend class QbsBuildStepConfigWidget; }; -namespace Ui { class QbsBuildStepConfigWidget; } - -class QbsBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget -{ - Q_OBJECT -public: - QbsBuildStepConfigWidget(QbsBuildStep *step); - ~QbsBuildStepConfigWidget(); - QString summaryText() const; - QString displayName() const; - -private: - void updateState(); - void updateQmlDebuggingOption(); - void updatePropertyEdit(const QVariantMap &data); - - void changeBuildVariant(int); - void changeShowCommandLines(bool show); - void changeKeepGoing(bool kg); - void changeJobCount(int count); - void changeInstall(bool install); - void changeCleanInstallRoot(bool clean); - void changeForceProbes(bool forceProbes); - void applyCachedProperties(); - - // QML debugging: - void linkQmlDebuggingLibraryChecked(bool checked); - - bool validateProperties(Utils::FancyLineEdit *edit, QString *errorMessage); - - Ui::QbsBuildStepConfigWidget *m_ui; - - QList > m_propertyCache; - QbsBuildStep *m_step; - QString m_summary; - bool m_ignoreChange; -}; - class QbsBuildStepFactory : public ProjectExplorer::IBuildStepFactory { Q_OBJECT From 2f6e20f37f90f2f5f17a6443c98cbd04b7c62138 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 24 Oct 2016 14:06:18 +0200 Subject: [PATCH 23/81] Debugger: Add QStringData dumper for cdb QStringData is a typedef for QTypedArrayData. Cdb doesn't return typedefed type names, but the original type. So we just need to call the QStringData dumper from the QTypedArrayData dumper. Change-Id: Id4e17ea8af3888e17c0d40bd9dcc5678490e845f Reviewed-by: Christian Stenger --- share/qtcreator/debugger/qttypes.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 5ce5531c682..6e8cb59892e 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -1275,6 +1275,12 @@ def qdump__QStaticStringData(d, value): d.putValue(d.hexencode(data), 'utf16') d.putPlainChildren(value) +def qdump__QTypedArrayData(d, value): + if value.type[0].name == 'unsigned short': + qdump__QStringData(d, value) + else: + qdump__QArrayData(d, value) + def qdump__QStringData(d, value): (ref, size, alloc, pad, offset) = value.split('III@p') elided, shown = d.computeLimit(size, d.displayStringLimit) From a826f5c6f61cc52a88966aea902a3fe8926b0282 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 24 Oct 2016 14:09:58 +0200 Subject: [PATCH 24/81] Debugger: Fix some python std dumper for cdb std::deque std::list std::shared_ptr std::valarray Change-Id: Ibc9f54b22d47a2a26c08c633d599a48d48694700 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/stdtypes.py | 41 ++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index 8e1f198a7e6..2733253bf45 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -56,7 +56,7 @@ def qdump__std____1__complex(d, value): def qdump__std__deque(d, value): - if d.isQnxTarget(): + if d.isQnxTarget() or d.isMsvcTarget(): qdump__std__deque__QNX(d, value) return @@ -117,15 +117,20 @@ def qdump__std__deque__QNX(d, value): else: bufsize = 1 - myoff = value['_Myoff'] - mysize = value['_Mysize'] - mapsize = value['_Mapsize'] + try: + val = value['_Mypair']['_Myval2'] + except: + val = value + + myoff = val['_Myoff'].integer() + mysize = val['_Mysize'].integer() + mapsize = val['_Mapsize'].integer() d.check(0 <= mapsize and mapsize <= 1000 * 1000 * 1000) d.putItemCount(mysize) if d.isExpanded(): with Children(d, mysize, maxNumChild=2000, childType=innerType): - map = value['_Map'] + map = val['_Map'] for i in d.childRange(): block = myoff / bufsize offset = myoff - (block * bufsize) @@ -139,7 +144,7 @@ def qdump__std____debug__deque(d, value): def qdump__std__list(d, value): - if d.isQnxTarget(): + if d.isQnxTarget() or d.isMsvcTarget(): qdump__std__list__QNX(d, value) return @@ -167,7 +172,7 @@ def qdump__std__list(d, value): def qdump__std__list__QNX(d, value): node = value["_Myhead"] - size = value["_Mysize"] + size = value["_Mysize"].integer() d.putItemCount(size, 1000) @@ -607,16 +612,25 @@ def qdump__std____1__wstring(d, value): def qdump__std__shared_ptr(d, value): - i = value["_M_ptr"] + if d.isMsvcTarget: + i = value["_Ptr"] + else: + i = value["_M_ptr"] + if i.integer() == 0: d.putValue("(null)") d.putNumChild(0) return with Children(d): short = d.putSubItem("data", i) - refcount = value["_M_refcount"]["_M_pi"] - d.putIntItem("usecount", refcount["_M_use_count"]) - d.putIntItem("weakcount", refcount["_M_weak_count"]) + if d.isMsvcTarget: + refcount = value["_Rep"] + d.putIntItem("usecount", refcount["_Uses"]) + d.putIntItem("weakcount", refcount["_Weaks"]) + else: + refcount = value["_M_refcount"]["_M_pi"] + d.putIntItem("usecount", refcount["_M_use_count"]) + d.putIntItem("weakcount", refcount["_M_weak_count"]) d.putValue(short.value, short.encoding) def qdump__std____1__shared_ptr(d, value): @@ -767,7 +781,10 @@ def qform__std__valarray(): return arrayForms() def qdump__std__valarray(d, value): - (size, data) = value.split('pp') + if d.isMsvcTarget(): + (data, size) = value.split('pp') + else: + (size, data) = value.split('pp') d.putItemCount(size) d.putPlotData(data, size, value.type[0]) From 9596d6790b37ecce967b3929a0c2b7134a2223ea Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 14 Jul 2016 16:48:25 +0200 Subject: [PATCH 25/81] print no message at all when no argument is supplied to error() this is useful when an adequate message has already been emitted by other means, like various built-ins do. Change-Id: I092771f55969fad8b214204d666327664727c572 Reviewed-by: Lars Knoll (cherry picked from qtbase/22d1351ddea193f5c00d4ae12229358dea826c62) --- src/shared/proparser/qmakebuiltins.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp index 8ceebd9cf0b..d1772302563 100644 --- a/src/shared/proparser/qmakebuiltins.cpp +++ b/src/shared/proparser/qmakebuiltins.cpp @@ -1581,7 +1581,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( #ifdef PROEVALUATOR_FULL fputs(msg.toLatin1().constData(), stderr); #endif - } else { + } else if (!msg.isEmpty() || func_t != T_ERROR) { m_handler->fileMessage( (func_t == T_ERROR ? QMakeHandler::ErrorMessage : func_t == T_WARNING ? QMakeHandler::WarningMessage : From 69a4f6c2b549e8baadda39dd9c012da01ea1f5c6 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 15 Jul 2016 18:09:24 +0200 Subject: [PATCH 26/81] add support for returning the command's exit status to $$system() ... and make use of it in qtRunLoggedCommand(). Change-Id: I242dfde344f555800cef1f55d3cb85418a93277f Reviewed-by: Lars Knoll (cherry picked from qtbase/0eff800e81f3e7f803dffd77737faaed73002ac8) --- src/shared/proparser/qmakebuiltins.cpp | 21 ++++++++++++++++----- src/shared/proparser/qmakeevaluator.h | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp index d1772302563..ab0f54bfad4 100644 --- a/src/shared/proparser/qmakebuiltins.cpp +++ b/src/shared/proparser/qmakebuiltins.cpp @@ -441,12 +441,13 @@ void QMakeEvaluator::runProcess(QProcess *proc, const QString &command) const } #endif -QByteArray QMakeEvaluator::getCommandOutput(const QString &args) const +QByteArray QMakeEvaluator::getCommandOutput(const QString &args, int *exitCode) const { QByteArray out; #ifndef QT_BOOTSTRAPPED QProcess proc; runProcess(&proc, args); + *exitCode = (proc.exitStatus() == QProcess::NormalExit) ? proc.exitCode() : -1; QByteArray errout = proc.readAllStandardError(); # ifdef PROEVALUATOR_FULL // FIXME: Qt really should have the option to set forwarding per channel @@ -476,7 +477,12 @@ QByteArray QMakeEvaluator::getCommandOutput(const QString &args) const break; out += QByteArray(buff, read_in); } - QT_PCLOSE(proc); + int ec = QT_PCLOSE(proc); +# ifdef Q_OS_WIN + *exitCode = ec >= 0 ? ec : -1; +# else + *exitCode = WIFEXITED(ec) ? WEXITSTATUS(ec) : -1; +# endif } # ifdef Q_OS_WIN out.replace("\r\n", "\n"); @@ -866,8 +872,8 @@ ProStringList QMakeEvaluator::evaluateBuiltinExpand( break; case E_SYSTEM: if (!m_skipLevel) { - if (args.count() < 1 || args.count() > 2) { - evalError(fL1S("system(execute) requires one or two arguments.")); + if (args.count() < 1 || args.count() > 3) { + evalError(fL1S("system(command, [mode], [stsvar]) requires one to three arguments.")); } else { bool blob = false; bool lines = false; @@ -881,7 +887,12 @@ ProStringList QMakeEvaluator::evaluateBuiltinExpand( else if (!m_tmp2.compare(QLatin1String("lines"), Qt::CaseInsensitive)) lines = true; } - QByteArray bytes = getCommandOutput(args.at(0).toQString(m_tmp2)); + int exitCode; + QByteArray bytes = getCommandOutput(args.at(0).toQString(m_tmp2), &exitCode); + if (args.count() > 2 && !args.at(2).isEmpty()) { + m_valuemapStack.top()[args.at(2).toKey()] = + ProStringList(ProString(QString::number(exitCode))); + } if (lines) { QTextStream stream(bytes); while (!stream.atEnd()) diff --git a/src/shared/proparser/qmakeevaluator.h b/src/shared/proparser/qmakeevaluator.h index e9cff77c67e..8f7a2072b5f 100644 --- a/src/shared/proparser/qmakeevaluator.h +++ b/src/shared/proparser/qmakeevaluator.h @@ -236,7 +236,7 @@ public: #ifndef QT_BOOTSTRAPPED void runProcess(QProcess *proc, const QString &command) const; #endif - QByteArray getCommandOutput(const QString &args) const; + QByteArray getCommandOutput(const QString &args, int *exitCode) const; QMakeEvaluator *m_caller; #ifdef PROEVALUATOR_CUMULATIVE From f9097b7efdad57a476d04547de2a2b662b2a115e Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 23 Aug 2016 14:05:54 +0200 Subject: [PATCH 27/81] add discard_from() function this function discards all values that come from a specific file. it will be needed for configure bootstrapping, but is too obscure to document it for general use. Change-Id: I62c18aeb1847712e33d0599dbb0b90ffa1722438 Reviewed-by: Lars Knoll (cherry picked from qtbase/12bb328bb0be8efe54aae750c21938aab4d17539) --- src/shared/proparser/qmakebuiltins.cpp | 37 +++++++++++++++++++++++++- src/shared/proparser/qmakeparser.cpp | 10 ++++--- src/shared/proparser/qmakeparser.h | 3 ++- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp index ab0f54bfad4..3a8e3b110ed 100644 --- a/src/shared/proparser/qmakebuiltins.cpp +++ b/src/shared/proparser/qmakebuiltins.cpp @@ -47,6 +47,8 @@ # include #endif +#include + #ifdef Q_OS_UNIX #include #include @@ -92,7 +94,7 @@ enum ExpandFunc { enum TestFunc { T_INVALID = 0, T_REQUIRES, T_GREATERTHAN, T_LESSTHAN, T_EQUALS, T_EXISTS, T_EXPORT, T_CLEAR, T_UNSET, T_EVAL, T_CONFIG, T_SYSTEM, - T_DEFINED, T_CONTAINS, T_INFILE, + T_DEFINED, T_DISCARD_FROM, T_CONTAINS, T_INFILE, T_COUNT, T_ISEMPTY, T_PARSE_JSON, T_INCLUDE, T_LOAD, T_DEBUG, T_LOG, T_MESSAGE, T_WARNING, T_ERROR, T_IF, T_MKPATH, T_WRITE_FILE, T_TOUCH, T_CACHE }; @@ -173,6 +175,7 @@ void QMakeEvaluator::initFunctionStatics() { "if", T_IF }, { "isActiveConfig", T_CONFIG }, { "system", T_SYSTEM }, + { "discard_from", T_DISCARD_FROM }, { "defined", T_DEFINED }, { "contains", T_CONTAINS }, { "infile", T_INFILE }, @@ -1288,6 +1291,38 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( } return ReturnTrue; } + case T_DISCARD_FROM: { + if (args.count() != 1 || args.at(0).isEmpty()) { + evalError(fL1S("discard_from(file) requires one argument.")); + return ReturnFalse; + } + if (m_valuemapStack.count() != 1) { + evalError(fL1S("discard_from() cannot be called from functions.")); + return ReturnFalse; + } + QString fn = resolvePath(args.at(0).toQString(m_tmp1)); + ProFile *pro = m_parser->parsedProFile(fn, QMakeParser::ParseOnlyCached); + if (!pro) + return ReturnFalse; + ProValueMap &vmap = m_valuemapStack.first(); + for (auto vit = vmap.begin(); vit != vmap.end(); ) { + if (!vit->isEmpty()) { + auto isFrom = [pro](const ProString &s) { + return s.sourceFile() == pro; + }; + vit->erase(std::remove_if(vit->begin(), vit->end(), isFrom), vit->end()); + if (vit->isEmpty()) { + // When an initially non-empty variable becomes entirely empty, + // undefine it altogether. + vit = vmap.erase(vit); + continue; + } + } + ++vit; + } + pro->deref(); + return ReturnTrue; + } case T_INFILE: if (args.count() < 2 || args.count() > 3) { evalError(fL1S("infile(file, var, [values]) requires two or three arguments.")); diff --git a/src/shared/proparser/qmakeparser.cpp b/src/shared/proparser/qmakeparser.cpp index 7751265e916..429ef3b500d 100644 --- a/src/shared/proparser/qmakeparser.cpp +++ b/src/shared/proparser/qmakeparser.cpp @@ -162,7 +162,7 @@ QMakeParser::QMakeParser(ProFileCache *cache, QMakeVfs *vfs, QMakeParserHandler ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags) { ProFile *pro; - if ((flags & ParseUseCache) && m_cache) { + if ((flags & (ParseUseCache|ParseOnlyCached)) && m_cache) { ProFileCache::Entry *ent; #ifdef PROPARSER_THREAD_SAFE QMutexLocker locker(&m_cache->mutex); @@ -184,7 +184,7 @@ ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags) #endif if ((pro = ent->pro)) pro->ref(); - } else { + } else if (!(flags & ParseOnlyCached)) { ent = &m_cache->parsed_files[fileName]; #ifdef PROPARSER_THREAD_SAFE ent->locker = new ProFileCache::Entry::Locker; @@ -209,13 +209,17 @@ ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags) ent->locker = 0; } #endif + } else { + pro = 0; } - } else { + } else if (!(flags & ParseOnlyCached)) { pro = new ProFile(fileName); if (!read(pro, flags)) { delete pro; pro = 0; } + } else { + pro = 0; } return pro; } diff --git a/src/shared/proparser/qmakeparser.h b/src/shared/proparser/qmakeparser.h index d370d17cbba..07a9f07753b 100644 --- a/src/shared/proparser/qmakeparser.h +++ b/src/shared/proparser/qmakeparser.h @@ -74,7 +74,8 @@ public: enum ParseFlag { ParseDefault = 0, ParseUseCache = 1, - ParseReportMissing = 2 + ParseOnlyCached = 2, + ParseReportMissing = 4 }; Q_DECLARE_FLAGS(ParseFlags, ParseFlag) From c0ddf0a34407f9d3ad9f575176550ba33d536d12 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 20 Oct 2016 15:02:34 +0200 Subject: [PATCH 28/81] make message about not found mkspec less confusing Change-Id: I9cfa2c9476d3d7fdb68b0a23e175eea4b3b11ad9 Reviewed-by: Tobias Hunger --- src/shared/proparser/qmakeevaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/proparser/qmakeevaluator.cpp b/src/shared/proparser/qmakeevaluator.cpp index 7d43610a31c..3f78878e630 100644 --- a/src/shared/proparser/qmakeevaluator.cpp +++ b/src/shared/proparser/qmakeevaluator.cpp @@ -1239,7 +1239,7 @@ bool QMakeEvaluator::loadSpec() goto cool; } } - evalError(fL1S("Could not find qmake configuration file %1.").arg(qmakespec)); + evalError(fL1S("Could not find qmake spec '%1'.").arg(qmakespec)); return false; } cool: From 5e148f1147c533589a24e7781ac227789cb71531 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 24 Oct 2016 20:24:44 +0200 Subject: [PATCH 29/81] actually show errors from bogus SUBDIRS entries this got lost in 51ba32bcc. Change-Id: Ic0c982cff8d4030eae8e942f9324fd6f49c68aa9 Reviewed-by: Tobias Hunger --- src/plugins/qmakeprojectmanager/qmakenodes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 616f14a0026..cd5273fe1c4 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -1858,8 +1858,8 @@ EvalResult *QmakeProFileNode::evaluate(const EvalInput &input) if (result->state == EvalResult::EvalOk) { if (result->projectType == SubDirsTemplate) { QStringList errors; - result->errors.append(errors); FileNameList subDirs = subDirsPaths(input.readerExact, input.projectDir, &result->subProjectsNotToDeploy, &errors); + result->errors.append(errors); foreach (const Utils::FileName &subDirName, subDirs) { IncludedPriFile *subDir = new IncludedPriFile; From 65c32320dffcfd4299a710ce2632c474f7597beb Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 21 Oct 2016 21:24:24 +0200 Subject: [PATCH 30/81] don't process SOURCES twice moc.prf also adds an extra compiler which takes SOURCES as input. as we add it to the list manually, we have to filter it just like HEADERS. Change-Id: I81b8b68965c1b65fd0cef6a68c01ad00d51d6dee Reviewed-by: Tobias Hunger --- src/plugins/qmakeprojectmanager/qmakenodes.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index cd5273fe1c4..b21616bf540 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -1376,10 +1376,11 @@ QStringList QmakePriFileNode::varNames(FileType type, QtSupport::ProFileReader * foreach (const QString &var, listOfExtraCompilers) { QStringList inputs = readerExact->values(var + QLatin1String(".input")); foreach (const QString &input, inputs) - // FORMS, RESOURCES, and STATECHARTS are handled below, HEADERS above + // FORMS, RESOURCES, and STATECHARTS are handled below, HEADERS and SOURCES above if (input != QLatin1String("FORMS") && input != QLatin1String("STATECHARTS") && input != QLatin1String("RESOURCES") + && input != QLatin1String("SOURCES") && input != QLatin1String("HEADERS")) vars << input; } From 7754606beab6110f59c5f5f72ba523912764dc8b Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 21 Oct 2016 18:51:35 +0200 Subject: [PATCH 31/81] don't collect dynamic variable names from cumulative reader we actually use variable values only from the exact reader, based on the idea that the cumulative parse is too dangerous, as using recursive watches on inexact data may be a bit heavy. using additional variable names from the cumulative reader sort of defeats the idea. Change-Id: I8bf3e298bf89593dcc77548cc3d2cbf7881202dd Reviewed-by: Tobias Hunger --- .../qmakeprojectmanager/qmakenodes.cpp | 30 +++++-------------- src/plugins/qmakeprojectmanager/qmakenodes.h | 2 +- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index b21616bf540..3c7a752aa14 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -646,17 +646,15 @@ PriFileEvalResult QmakePriFileNode::extractValues(const EvalInput &input, { PriFileEvalResult result; - // Figure out DEPLOYMENT and INSTALL folders - QStringList dynamicVariables = dynamicVarNames(input.readerExact, input.readerCumulative, input.isQt5); + // Figure out DEPLOYMENT and INSTALL folders. + // Ignore stuff from cumulative parse, as we are recursively enumerating + // all the files from those folders and add watchers for them. That's too + // dangerous if we get the folders wrong and enumerate the whole project + // tree multiple times. + QStringList dynamicVariables = dynamicVarNames(input.readerExact, input.isQt5); foreach (ProFile *includeFileExact, includeFilesExact) - foreach (const QString &dynamicVar, dynamicVariables) { + foreach (const QString &dynamicVar, dynamicVariables) result.folders += input.readerExact->values(dynamicVar, includeFileExact); - // Ignore stuff from cumulative parse - // we are recursively enumerating all the files from those folders - // and add watchers for them, that's too dangerous if we get the folders - // wrong and enumerate the whole project tree multiple times - } - for (int i=0; i < result.folders.size(); ++i) { const QFileInfo fi(result.folders.at(i)); @@ -1475,7 +1473,7 @@ QStringList QmakePriFileNode::varNamesForRemoving() return vars; } -QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative, +QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerExact, bool isQt5) { QStringList result; @@ -1487,12 +1485,6 @@ QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerEx foreach (const QString &var, listOfVars) { result << (var + sources); } - if (readerCumulative) { - QStringList listOfVars = readerCumulative->values(deployment); - foreach (const QString &var, listOfVars) { - result << (var + sources); - } - } const QString installs = QLatin1String("INSTALLS"); const QString files = QLatin1String(".files"); @@ -1500,12 +1492,6 @@ QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerEx foreach (const QString &var, listOfVars) { result << (var + files); } - if (readerCumulative) { - QStringList listOfVars = readerCumulative->values(installs); - foreach (const QString &var, listOfVars) { - result << (var + files); - } - } result.removeDuplicates(); return result; } diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h index 8d8d651c3fe..1bb881f482a 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.h +++ b/src/plugins/qmakeprojectmanager/qmakenodes.h @@ -180,7 +180,7 @@ protected: static QStringList varNames(ProjectExplorer::FileType type, QtSupport::ProFileReader *readerExact); static QStringList varNamesForRemoving(); static QString varNameForAdding(const QString &mimeType); - static QStringList dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative, bool isQt5); + static QStringList dynamicVarNames(QtSupport::ProFileReader *readerExact, bool isQt5); static QSet filterFilesProVariables(ProjectExplorer::FileType fileType, const QSet &files); static QSet filterFilesRecursiveEnumerata(ProjectExplorer::FileType fileType, const QSet &files); From bd3f39a3589458c02970e635e7bbf6aa0f2a53ba Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 21 Oct 2016 12:19:47 +0200 Subject: [PATCH 32/81] accept absolute paths in qrc file elements while untypical, it's perfectly legitimate to have absolute paths in qrc files. auto-generated files (like the ones created by resources.prf when shadow-building) can make good use of them. Change-Id: I59da260b5241096f7c44b9de5ee04f65e8c1218c Reviewed-by: Tobias Hunger --- src/libs/qmljs/qmljsqrcparser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/qmljs/qmljsqrcparser.cpp b/src/libs/qmljs/qmljsqrcparser.cpp index dd9d0892905..d4e0d2c40ff 100644 --- a/src/libs/qmljs/qmljsqrcparser.cpp +++ b/src/libs/qmljs/qmljsqrcparser.cpp @@ -271,6 +271,7 @@ QrcParserPrivate::QrcParserPrivate(QrcParser *) bool QrcParserPrivate::parseFile(const QString &path) { + QDir baseDir(QFileInfo(path).path()); QFile file(path); if (!file.open(QIODevice::ReadOnly)) { m_errorMessages.append(file.errorString()); @@ -304,9 +305,8 @@ bool QrcParserPrivate::parseFile(const QString &path) QDomElement felt = relt.firstChildElement(QLatin1String("file")); for (; !felt.isNull(); felt = felt.nextSiblingElement(QLatin1String("file"))) { const QString fileName = felt.text(); - QTC_CHECK(!QDir::isAbsolutePath(fileName)); const QString alias = felt.attribute(QLatin1String("alias")); - QString filePath = QFileInfo(path).path() + QLatin1Char('/') + fileName; + QString filePath = baseDir.absoluteFilePath(fileName); QString accessPath; if (!alias.isEmpty()) accessPath = language + prefix + alias; From b8ea6e8f0e083d234c092f46dbffc220d5448949 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 21 Oct 2016 15:27:51 +0200 Subject: [PATCH 33/81] remove redundancy from QmakePriFileNode::recursiveEnumerate() we *know* that this function is called only with folders; it's part of its api. Change-Id: Idada1e6672a916c0d550d191770396ebbc54b02f Reviewed-by: Tobias Hunger --- .../qmakeprojectmanager/qmakenodes.cpp | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 3c7a752aa14..e194c73882e 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -622,19 +622,13 @@ QStringList QmakePriFileNode::fullVPaths(const QStringList &baseVPaths, QtSuppor QSet QmakePriFileNode::recursiveEnumerate(const QString &folder) { QSet result; - QFileInfo fi(folder); - if (fi.isDir()) { - QDir dir(folder); - dir.setFilter(dir.filter() | QDir::NoDotAndDotDot); - - foreach (const QFileInfo &file, dir.entryInfoList()) { - if (file.isDir() && !file.isSymLink()) - result += recursiveEnumerate(file.absoluteFilePath()); - else if (!Core::EditorManager::isAutoSaveFile(file.fileName())) - result += FileName(file); - } - } else if (fi.exists()) { - result << FileName(fi); + QDir dir(folder); + dir.setFilter(dir.filter() | QDir::NoDotAndDotDot); + foreach (const QFileInfo &file, dir.entryInfoList()) { + if (file.isDir() && !file.isSymLink()) + result += recursiveEnumerate(file.absoluteFilePath()); + else if (!Core::EditorManager::isAutoSaveFile(file.fileName())) + result += FileName(file); } return result; } From ed7d13b6fc3950dede4c21b4566f1bb69dd1e7ba Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 21 Oct 2016 16:11:30 +0200 Subject: [PATCH 34/81] remove dead variable from QmakeProject::updateCppCodeModel() allFiles was never read. Change-Id: I96aa00ec43db342a572a41f1662ad3d76979f3b4 Reviewed-by: Tobias Hunger --- src/plugins/qmakeprojectmanager/qmakeproject.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index f2a433b06e0..db652823cc1 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -423,7 +423,6 @@ void QmakeProject::updateCppCodeModel() } QList generators; - QStringList allFiles; foreach (QmakeProFileNode *pro, proFiles) { warnOnToolChainMismatch(pro); @@ -465,11 +464,9 @@ void QmakeProject::updateCppCodeModel() { // C++ files: // part->files foreach (const QString &file, pro->variableValue(CppSourceVar)) { - allFiles << file; cppPart->files << ProjectFile(file, ProjectFile::CXXSource); } foreach (const QString &file, pro->variableValue(CppHeaderVar)) { - allFiles << file; cppPart->files << ProjectFile(file, ProjectFile::CXXHeader); } } @@ -477,13 +474,11 @@ void QmakeProject::updateCppCodeModel() ProjectPart::Ptr objcppPart = templatePart->copy(); { // ObjC++ files: foreach (const QString &file, pro->variableValue(ObjCSourceVar)) { - allFiles << file; // Although the enum constant is called ObjCSourceVar, it actually is ObjC++ source // code, as qmake does not handle C (and ObjC). objcppPart->files << ProjectFile(file, ProjectFile::ObjCXXSource); } foreach (const QString &file, pro->variableValue(ObjCHeaderVar)) { - allFiles << file; objcppPart->files << ProjectFile(file, ProjectFile::ObjCXXHeader); } @@ -505,7 +500,6 @@ void QmakeProject::updateCppCodeModel() foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) { ec->forEachTarget([&](const Utils::FileName &generatedFile) { QString name = generatedFile.toString(); - allFiles << name; ProjectFile::Kind kind = ProjectFile::classify(name); switch (kind) { case ProjectFile::CHeader: From e9aaf017c200b393668e3b4aa1456e355f07bcb6 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Mon, 10 Oct 2016 16:57:22 +0100 Subject: [PATCH 35/81] Project wizards: warn when using deprecated APIs in new projects As discussed at QtCS, almost none of our users know that they can get warnings when they use deprecated APIs, and/or disable them altogether. A first step would be getting the relevant defines added by the new project wizards. Change-Id: I5d4260b5aa094ac2a077b7b00eaa577108e5f612 Reviewed-by: Alessandro Portale --- .../wizards/projects/qmake/consoleapp/file.pro | 11 +++++++++++ .../projects/qmake/qtcanvas3dapplication/app.pro | 11 +++++++++++ .../projects/qmake/qtquickapplication/app.pro | 11 +++++++++++ .../qmake/qtquickcontrols2application/app.pro | 11 +++++++++++ .../qmake/qtquickcontrolsapplication/app.pro | 11 +++++++++++ .../wizards/qtprojectparameters.cpp | 13 +++++++++++++ 6 files changed, 68 insertions(+) diff --git a/share/qtcreator/templates/wizards/projects/qmake/consoleapp/file.pro b/share/qtcreator/templates/wizards/projects/qmake/consoleapp/file.pro index ad2b74f6490..9df9214a845 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/consoleapp/file.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/consoleapp/file.pro @@ -10,3 +10,14 @@ CONFIG -= app_bundle TEMPLATE = app SOURCES += %{MainCppName} + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 diff --git a/share/qtcreator/templates/wizards/projects/qmake/qtcanvas3dapplication/app.pro b/share/qtcreator/templates/wizards/projects/qmake/qtcanvas3dapplication/app.pro index 91b0337e7b8..e211b30bfa6 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/qtcanvas3dapplication/app.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/qtcanvas3dapplication/app.pro @@ -11,6 +11,17 @@ RESOURCES += qml.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin diff --git a/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro b/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro index 5eecb7b319a..cef1a05e987 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/qtquickapplication/app.pro @@ -13,6 +13,17 @@ QML_IMPORT_PATH = # Additional import path used to resolve QML modules just for Qt Quick Designer QML_DESIGNER_IMPORT_PATH = +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin diff --git a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro index 3308ed251cd..190b79c9e5b 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrols2application/app.pro @@ -12,6 +12,17 @@ QML_IMPORT_PATH = # Additional import path used to resolve QML modules just for Qt Quick Designer QML_DESIGNER_IMPORT_PATH = +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin diff --git a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro index 227fd034897..7c8a5e31d5a 100644 --- a/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro +++ b/share/qtcreator/templates/wizards/projects/qmake/qtquickcontrolsapplication/app.pro @@ -18,6 +18,17 @@ QML_IMPORT_PATH = # Additional import path used to resolve QML modules just for Qt Quick Designer QML_DESIGNER_IMPORT_PATH = +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin diff --git a/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp b/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp index ed71f55b5ab..e97a4d1ab50 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp @@ -112,6 +112,19 @@ void QtProjectParameters::writeProFile(QTextStream &str) const if (!targetDirectory.isEmpty()) str << "\nDESTDIR = " << targetDirectory << '\n'; + + if (qtVersionSupport != SupportQt4Only) { + str << "\n" + "# The following define makes your compiler emit warnings if you use\n" + "# any feature of Qt which as been marked as deprecated (the exact warnings\n" + "# depend on your compiler). Please consult the documentation of the\n" + "# deprecated API in order to know how to port your code away from it.\n" + "DEFINES += QT_DEPRECATED_WARNINGS\n\n" + "# You can also make your code fail to compile if you use deprecated APIs.\n" + "# In order to do so, uncomment the following line.\n" + "# You can also select to disable deprecated APIs only up to a certain version of Qt.\n" + "#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0\n"; + } } void QtProjectParameters::writeProFileHeader(QTextStream &str) From e9b4cab80798e71b6d24c5df0e14b228b046b184 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 25 Oct 2016 15:18:13 +0200 Subject: [PATCH 36/81] QmlDesigner: Adding manual test for cpp mockups This is a typical test case for mocking cpp types. Change-Id: Ibd76429c3d1190c46a223062d77d676f728fec77 Reviewed-by: Tim Jenssen --- .../testprojects/cppmockup/MainForm.ui.qml | 60 +++++++++++++++++++ .../testprojects/cppmockup/MyComponent.qml | 51 ++++++++++++++++ .../qml/testprojects/cppmockup/cppmockup.pro | 22 +++++++ .../qml/testprojects/cppmockup/main.cpp | 42 +++++++++++++ .../qml/testprojects/cppmockup/main.qml | 41 +++++++++++++ .../cppmockup/mockups/MyPlugin/MyObject.qml | 5 ++ .../cppmockup/mockups/MyPlugin/qmldir | 2 + .../cppmockup/mybackendobject.cpp | 41 +++++++++++++ .../testprojects/cppmockup/mybackendobject.h | 47 +++++++++++++++ .../manual/qml/testprojects/cppmockup/qml.qrc | 7 +++ 10 files changed, 318 insertions(+) create mode 100644 tests/manual/qml/testprojects/cppmockup/MainForm.ui.qml create mode 100644 tests/manual/qml/testprojects/cppmockup/MyComponent.qml create mode 100644 tests/manual/qml/testprojects/cppmockup/cppmockup.pro create mode 100644 tests/manual/qml/testprojects/cppmockup/main.cpp create mode 100644 tests/manual/qml/testprojects/cppmockup/main.qml create mode 100644 tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/MyObject.qml create mode 100644 tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/qmldir create mode 100644 tests/manual/qml/testprojects/cppmockup/mybackendobject.cpp create mode 100644 tests/manual/qml/testprojects/cppmockup/mybackendobject.h create mode 100644 tests/manual/qml/testprojects/cppmockup/qml.qrc diff --git a/tests/manual/qml/testprojects/cppmockup/MainForm.ui.qml b/tests/manual/qml/testprojects/cppmockup/MainForm.ui.qml new file mode 100644 index 00000000000..14aa0928337 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/MainForm.ui.qml @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.7 + +Rectangle { + property alias mouseArea: mouseArea + property alias textEdit: textEdit + + width: 360 + height: 360 + + MouseArea { + id: mouseArea + anchors.fill: parent + + MyComponent { + id: myComponent + x: 174 + y: 180 + } + } + + TextEdit { + id: textEdit + text: qsTr("Enter some text...") + verticalAlignment: Text.AlignVCenter + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + anchors.topMargin: 20 + Rectangle { + anchors.fill: parent + anchors.margins: -10 + color: "transparent" + border.width: 1 + } + } +} diff --git a/tests/manual/qml/testprojects/cppmockup/MyComponent.qml b/tests/manual/qml/testprojects/cppmockup/MyComponent.qml new file mode 100644 index 00000000000..3e6cf1694c0 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/MyComponent.qml @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.6 +import MyPlugin 1.0 + +Item { + width: 40 + height: 40 + MyObject { + test: true + } + Rectangle { + anchors.fill: parent + gradient: Gradient { + GradientStop { + position: 0 + color: "#ffffff" + } + + GradientStop { + position: 1 + color: "#000000" + } + } + + } + +} diff --git a/tests/manual/qml/testprojects/cppmockup/cppmockup.pro b/tests/manual/qml/testprojects/cppmockup/cppmockup.pro new file mode 100644 index 00000000000..1f8ea65d427 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/cppmockup.pro @@ -0,0 +1,22 @@ +TEMPLATE = app + +QT += qml quick +CONFIG += c++11 + +SOURCES += main.cpp \ + mybackendobject.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +### QML_IMPORT_PATH = $$PWD/mockups +QML_DESIGNER_IMPORT_PATH = $$PWD/mockups + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +HEADERS += \ + mybackenmodel.h \ + mybackendobject.h diff --git a/tests/manual/qml/testprojects/cppmockup/main.cpp b/tests/manual/qml/testprojects/cppmockup/main.cpp new file mode 100644 index 00000000000..32c7a2d4721 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/main.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + qmlRegisterType("MyPlugin", 1, 0, "MyObject"); + + return app.exec(); +} diff --git a/tests/manual/qml/testprojects/cppmockup/main.qml b/tests/manual/qml/testprojects/cppmockup/main.qml new file mode 100644 index 00000000000..aff0f6ae262 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/main.qml @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Window 2.2 + +Window { + visible: true + width: 640 + height: 480 + title: qsTr("Hello World") + + MainForm { + anchors.fill: parent + mouseArea.onClicked: { + console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"')) + } + } +} diff --git a/tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/MyObject.qml b/tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/MyObject.qml new file mode 100644 index 00000000000..0df2d302067 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/MyObject.qml @@ -0,0 +1,5 @@ +import QtQuick 2.6 + +QtObject { + property bool test +} diff --git a/tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/qmldir b/tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/qmldir new file mode 100644 index 00000000000..2ee4872b4b8 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/mockups/MyPlugin/qmldir @@ -0,0 +1,2 @@ +module MyPlugin +MyObject 1.0 MyObject.qml diff --git a/tests/manual/qml/testprojects/cppmockup/mybackendobject.cpp b/tests/manual/qml/testprojects/cppmockup/mybackendobject.cpp new file mode 100644 index 00000000000..ea93896af03 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/mybackendobject.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "mybackendobject.h" + +MyBackendObject::MyBackendObject(QObject *parent) : QObject(parent) +{ + +} + +bool MyBackendObject::test() const +{ + return false; +} + +void MyBackendObject::setTest(bool) +{ + +} diff --git a/tests/manual/qml/testprojects/cppmockup/mybackendobject.h b/tests/manual/qml/testprojects/cppmockup/mybackendobject.h new file mode 100644 index 00000000000..e637ac12a6e --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/mybackendobject.h @@ -0,0 +1,47 @@ + +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#ifndef MYBACKENDOBJECT_H +#define MYBACKENDOBJECT_H + +#include + +class MyBackendObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(bool test READ test write setTest) + +public: + explicit MyBackendObject(QObject *parent = 0); + + bool test() const; + void setTest(bool b); + +public slots: +}; + +#endif // MYBACKENDOBJECT_H diff --git a/tests/manual/qml/testprojects/cppmockup/qml.qrc b/tests/manual/qml/testprojects/cppmockup/qml.qrc new file mode 100644 index 00000000000..cabeffdb5a6 --- /dev/null +++ b/tests/manual/qml/testprojects/cppmockup/qml.qrc @@ -0,0 +1,7 @@ + + + main.qml + MainForm.ui.qml + MyComponent.qml + + From 4b624ba7e9f9dd0cb2720db4a5c3023bbc481e89 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 25 Oct 2016 13:52:43 +0200 Subject: [PATCH 37/81] Vcs: Optionally pass binary to run Change-Id: I33eb1ce7d874bea27979068aca310f607ec7fde8 Reviewed-by: Orgad Shaneh --- src/plugins/vcsbase/vcsbaseclient.cpp | 18 +++++++++++++----- src/plugins/vcsbase/vcsbaseclient.h | 4 ++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index aded32bdc4a..76e560597dd 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -175,6 +175,18 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in) return in; } +Utils::SynchronousProcessResponse +VcsBaseClientImpl::vcsFullySynchronousExec(const QString &workingDir, const Utils::FileName &binary, + const QStringList &args, unsigned flags, + int timeoutS, QTextCodec *codec) const +{ + VcsCommand command(workingDir, processEnvironment()); + command.addFlags(flags); + if (codec) + command.setCodec(codec); + return command.runCommand(binary, args, (timeoutS > 0) ? timeoutS : vcsTimeoutS()); +} + void VcsBaseClientImpl::resetCachedVcsInfo(const QString &workingDir) { Core::VcsManager::resetVersionControlForDirectory(workingDir); @@ -197,11 +209,7 @@ Utils::SynchronousProcessResponse VcsBaseClientImpl::vcsFullySynchronousExec(const QString &workingDir, const QStringList &args, unsigned flags, int timeoutS, QTextCodec *codec) const { - VcsCommand command(workingDir, processEnvironment()); - command.addFlags(flags); - if (codec) - command.setCodec(codec); - return command.runCommand(vcsBinary(), args, (timeoutS > 0) ? timeoutS : vcsTimeoutS()); + return vcsFullySynchronousExec(workingDir, vcsBinary(), args, flags, timeoutS, codec); } VcsCommand *VcsBaseClientImpl::vcsExec(const QString &workingDirectory, const QStringList &arguments, diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index 62a7bde3a33..2c97afb0761 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -103,6 +103,10 @@ public: Utils::SynchronousProcessResponse vcsFullySynchronousExec(const QString &workingDir, const QStringList &args, unsigned flags = 0, int timeoutS = -1, QTextCodec *codec = nullptr) const; + Utils::SynchronousProcessResponse + vcsFullySynchronousExec(const QString &workingDir, const Utils::FileName &binary, const QStringList &args, + unsigned flags = 0, int timeoutS = -1, QTextCodec *codec = nullptr) const; + // Simple helper to execute a single command using createCommand and enqueueJob. VcsCommand *vcsExec(const QString &workingDirectory, const QStringList &arguments, From f72e564bed858d8bf937999c0d2ec5d40c0f0dfa Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 25 Oct 2016 15:09:29 +0200 Subject: [PATCH 38/81] Doc: Changes in session management Session details are now available in the Welcome mode, including options to clone, rename, and delete sessions. Also, new keyboard shortcuts can be used to open sessions. Updated screenshot. Change-Id: I70603e27530a83175501b1e2902f85516485e815 Reviewed-by: Tim Jenssen --- doc/images/qtcreator-welcome-session.png | Bin 6637 -> 5543 bytes doc/src/howto/creator-sessions.qdoc | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/images/qtcreator-welcome-session.png b/doc/images/qtcreator-welcome-session.png index 9675d8676939dd4ae8236079624be489f57ee64f..e55908261520af218748c9e910a2c86a6e044478 100644 GIT binary patch literal 5543 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, where \e is the number of the session to + open (available for the first nine sessions). \image qtcreator-welcome-session.png + To view more information about a session, select the down arrow icon that + appears when you move the mouse cursor over the session name. Select actions + to clone, rename, and delete sessions. + When you start \QC from the command line, you can give the name of a session as argument and \QC will start with this session. From 148e5a27929aaa27738bfd125af3d6abf461aa4a Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 21 Oct 2016 19:00:02 +0200 Subject: [PATCH 39/81] QmlDesigner: Adding warning Change-Id: I72fded3037ce912a5d01531c86da5a35c1996e3a Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index a0e75e314a7..438862d6c4f 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1611,7 +1611,9 @@ void ModelValidator::variantValuesDiffer(VariantProperty &modelProperty, const Q QTC_ASSERT(modelProperty.dynamicTypeName() == dynamicTypeName, return); } - QTC_ASSERT(equals(modelProperty.value(), qmlVariantValue), return); + + + QTC_ASSERT(equals(modelProperty.value(), qmlVariantValue), qWarning() << modelProperty.value() << qmlVariantValue); QTC_ASSERT(0, return); } From cb86cc3bdd3ee9211a522ac98c7043f0f4844c33 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 25 Oct 2016 15:19:36 +0200 Subject: [PATCH 40/81] QmlDesigner: Only register mockup object if not available If a cpp type is somehow available do not create the mockup. Change-Id: Ibd76429c3d1190c46a223062d77d676f728fe666 Reviewed-by: Tim Jenssen --- .../instances/nodeinstanceserver.cpp | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index ab31bda00dc..149db2a501f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -685,16 +685,36 @@ void NodeInstanceServer::setupDummysForContext(QQmlContext *context) } } +static bool isTypeAvailable(const MockupTypeContainer &mockupType, QQmlEngine *engine) +{ + QString qmlSource; + qmlSource.append("import " + + mockupType.importUri() + + " " + + QString::number(mockupType.majorVersion()) + + "." + QString::number(mockupType.minorVersion()) + + "\n"); + + qmlSource.append(QString::fromUtf8(mockupType.typeName()) + "{\n}\n"); + + QQmlComponent component(engine); + component.setData(qmlSource.toUtf8(), QUrl()); + + return !component.isError(); +} + void NodeInstanceServer::setupMockupTypes(const QVector &container) { for (const MockupTypeContainer &mockupType : container) { + if (!isTypeAvailable(mockupType, engine())) #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) - QQuickDesignerSupportMetaInfo::registerMockupObject(mockupType.importUri().toUtf8(), + + QQuickDesignerSupportMetaInfo::registerMockupObject(mockupType.importUri().toUtf8(), mockupType.majorVersion(), mockupType.minorVersion(), mockupType.typeName()); #else - qmlRegisterType(QUrl("qrc:/qtquickplugin/mockfiles/GenericBackend.qml"), + qmlRegisterType(QUrl("qrc:/qtquickplugin/mockfiles/GenericBackend.qml"), mockupType.importUri().toUtf8(), mockupType.majorVersion(), mockupType.minorVersion(), From f2db3a91a692be155b7007a2664c01b93eb4ec4a Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 25 Oct 2016 15:45:29 +0200 Subject: [PATCH 41/81] QmlDesigner: Disable validator for connection source Change-Id: If51f2336364b9e2a44ad7f4657b9b6245a66143b Reviewed-by: Tim Jenssen --- .../qmldesignerextension/connectioneditor/delegates.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp index a5204efe405..c27c17a292d 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp @@ -313,6 +313,7 @@ QWidget *ConnectionDelegate::createEditor(QWidget *parent, const QStyleOptionVie QString itemText = tr("Change to default state"); QString source = QString::fromLatin1("{ %1.state = \"\" }").arg(rootModelNode.id()); connectionComboBox->addItem(itemText, source); + connectionComboBox->disableValidator(); foreach (const QmlModelState &state, QmlItemNode(rootModelNode).states().allStates()) { QString itemText = tr("Change state to %1").arg(state.name()); From 791e8af5dd71b670370c0abb5cdfb42c1622c32b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 25 Oct 2016 15:54:26 +0200 Subject: [PATCH 42/81] Doc: Describe adding shortcuts for typical mouse operations Some functions are only available by using the mouse, unless users specify keyboard shortcuts for them. Change-Id: Id97a63cc0e498b708c411fc4c507f4dcee2532a8 Reviewed-by: Eike Ziller --- doc/src/howto/creator-keyboard-shortcuts.qdoc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/src/howto/creator-keyboard-shortcuts.qdoc b/doc/src/howto/creator-keyboard-shortcuts.qdoc index c8fab9e4474..cb4dcca5fe2 100644 --- a/doc/src/howto/creator-keyboard-shortcuts.qdoc +++ b/doc/src/howto/creator-keyboard-shortcuts.qdoc @@ -38,9 +38,13 @@ \title Keyboard Shortcuts \QC provides various keyboard shortcuts to speed up your development - process. + process. In addition, you can specify your own keyboard shortcuts for some + functions that can be easily performed with a mouse, and therefore do not + appear in menus or have default keyboard shortcuts. For example, selecting + and deleting words or lines in an editor. - To view all keyboard shortcuts defined in \QC, and to change them, select + To view all functions available in \QC and the keyboard shortcuts defined + for them, select \uicontrol {Tools > Options > Environment > Keyboard}. The shortcuts are listed by category. To find a keyboard shortcut in the list, enter a function name or shortcut in the \uicontrol Filter From f35d71478ddadecf5197c4c7909e2a81ceb87cb8 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 25 Oct 2016 08:56:45 +0200 Subject: [PATCH 43/81] QmlDesigner: use list initialization Change-Id: Iecc075d82c5b26589a6201a3b1adb04f59c92db0 Reviewed-by: Thomas Hartmann --- .../designercore/model/modeltotextmerger.cpp | 52 +++++++++---------- .../designercore/model/modeltotextmerger.h | 3 +- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index b9b12934f20..bddfcf9b986 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -85,7 +85,7 @@ void ModelToTextMerger::propertiesChanged(const QList& propert ModelNode containedModelNode; const int indentDepth = m_rewriterView->textModifier()->indentDepth(); - const QString propertyTextValue = QmlTextGenerator(getPropertyOrder(), + const QString propertyTextValue = QmlTextGenerator(propertyOrder(), indentDepth)(property); switch (propertyChange) { @@ -162,14 +162,14 @@ void ModelToTextMerger::nodeReparented(const ModelNode &node, const NodeAbstract switch (propertyChange) { case AbstractView::PropertiesAdded: schedule(new AddPropertyRewriteAction(newPropertyParent, - QmlTextGenerator(getPropertyOrder())(node), + QmlTextGenerator(propertyOrder())(node), propertyType(newPropertyParent), node)); break; case AbstractView::NoAdditionalChanges: schedule(new ChangePropertyRewriteAction(newPropertyParent, - QmlTextGenerator(getPropertyOrder())(node), + QmlTextGenerator(propertyOrder())(node), propertyType(newPropertyParent), node)); break; @@ -212,7 +212,7 @@ void ModelToTextMerger::applyChanges() return; dumpRewriteActions(QStringLiteral("Before compression")); - RewriteActionCompressor compress(getPropertyOrder()); + RewriteActionCompressor compress(propertyOrder()); compress(m_rewriteActions); dumpRewriteActions(QStringLiteral("After compression")); @@ -241,7 +241,7 @@ void ModelToTextMerger::applyChanges() ModelNodePositionRecalculator positionRecalculator(m_rewriterView->positionStorage(), m_rewriterView->positionStorage()->modelNodes()); positionRecalculator.connectTo(textModifier); - QmlRefactoring refactoring(tmpDocument, *textModifier, getPropertyOrder()); + QmlRefactoring refactoring(tmpDocument, *textModifier, propertyOrder()); textModifier->deactivateChangeSignals(); textModifier->startGroup(); @@ -348,31 +348,27 @@ QmlRefactoring::PropertyType ModelToTextMerger::propertyType(const AbstractPrope return (QmlRefactoring::PropertyType) -1; } -PropertyNameList ModelToTextMerger::m_propertyOrder; - -PropertyNameList ModelToTextMerger::getPropertyOrder() +PropertyNameList ModelToTextMerger::propertyOrder() { - if (m_propertyOrder.isEmpty()) { - m_propertyOrder - << PropertyName("id") - << PropertyName("name") - << PropertyName("target") - << PropertyName("property") - << PropertyName("x") - << PropertyName("y") - << PropertyName("width") - << PropertyName("height") - << PropertyName("position") - << PropertyName("color") - << PropertyName("radius") - << PropertyName("text") - << PropertyName() - << PropertyName("states") - << PropertyName("transitions") - ; - } + static const PropertyNameList properties = { + PropertyName("id"), + PropertyName("name"), + PropertyName("target"), + PropertyName("property"), + PropertyName("x"), + PropertyName("y"), + PropertyName("width"), + PropertyName("height"), + PropertyName("position"), + PropertyName("color"), + PropertyName("radius"), + PropertyName("text"), + PropertyName(), + PropertyName("states"), + PropertyName("transitions") + }; - return m_propertyOrder; + return properties; } bool ModelToTextMerger::isInHierarchy(const AbstractProperty &property) { diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h index e51bb8084bd..582a78542fe 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h @@ -37,7 +37,6 @@ namespace Internal { class ModelToTextMerger { typedef AbstractView::PropertyChangeFlags PropertyChangeFlags; - static PropertyNameList m_propertyOrder; public: ModelToTextMerger(RewriterView *reWriterView); @@ -75,7 +74,7 @@ protected: { return m_rewriteActions; } static QmlDesigner::QmlRefactoring::PropertyType propertyType(const AbstractProperty &property, const QString &textValue = QString()); - static PropertyNameList getPropertyOrder(); + static PropertyNameList propertyOrder(); static bool isInHierarchy(const AbstractProperty &property); From dc25b692fa9f5acdff1194075af4c55cacae69bf Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 25 Oct 2016 00:05:26 +0200 Subject: [PATCH 44/81] ScxmlEditor: Themable toolbar icons for Adjust and Align actions Change-Id: Ibd3a70a17362431fb1b11aecd18e9af6276b30c3 Reviewed-by: Alessandro Portale --- src/plugins/scxmleditor/common/common.qrc | 9 + .../common/images/adjust_height.png | Bin 1305 -> 132 bytes .../common/images/adjust_height@2x.png | Bin 0 -> 130 bytes .../scxmleditor/common/images/adjust_size.png | Bin 2452 -> 133 bytes .../common/images/adjust_size@2x.png | Bin 0 -> 134 bytes .../common/images/adjust_width.png | Bin 1137 -> 158 bytes .../common/images/adjust_width@2x.png | Bin 0 -> 140 bytes .../common/images/align_bottom.png | Bin 1263 -> 136 bytes .../common/images/align_bottom@2x.png | Bin 0 -> 130 bytes .../common/images/align_horizontal.png | Bin 1060 -> 139 bytes .../common/images/align_horizontal@2x.png | Bin 0 -> 140 bytes .../scxmleditor/common/images/align_left.png | Bin 1069 -> 158 bytes .../common/images/align_left@2x.png | Bin 0 -> 136 bytes .../scxmleditor/common/images/align_right.png | Bin 1061 -> 154 bytes .../common/images/align_right@2x.png | Bin 0 -> 133 bytes .../scxmleditor/common/images/align_top.png | Bin 1261 -> 139 bytes .../common/images/align_top@2x.png | Bin 0 -> 134 bytes .../common/images/align_vertical.png | Bin 973 -> 174 bytes .../common/images/align_vertical@2x.png | Bin 0 -> 143 bytes src/plugins/scxmleditor/common/mainwidget.cpp | 8 +- src/plugins/scxmleditor/common/mainwidget.h | 2 +- .../plugin_interface/actionhandler.cpp | 18 +- src/tools/icons/qtcreatoricons.svg | 220 ++++++++++++++++++ 23 files changed, 243 insertions(+), 14 deletions(-) create mode 100644 src/plugins/scxmleditor/common/images/adjust_height@2x.png create mode 100644 src/plugins/scxmleditor/common/images/adjust_size@2x.png create mode 100644 src/plugins/scxmleditor/common/images/adjust_width@2x.png create mode 100644 src/plugins/scxmleditor/common/images/align_bottom@2x.png create mode 100644 src/plugins/scxmleditor/common/images/align_horizontal@2x.png create mode 100644 src/plugins/scxmleditor/common/images/align_left@2x.png create mode 100644 src/plugins/scxmleditor/common/images/align_right@2x.png create mode 100644 src/plugins/scxmleditor/common/images/align_top@2x.png create mode 100644 src/plugins/scxmleditor/common/images/align_vertical@2x.png diff --git a/src/plugins/scxmleditor/common/common.qrc b/src/plugins/scxmleditor/common/common.qrc index b3b7bd9664f..36cdafe2414 100644 --- a/src/plugins/scxmleditor/common/common.qrc +++ b/src/plugins/scxmleditor/common/common.qrc @@ -1,14 +1,23 @@ images/adjust_height.png + images/adjust_height@2x.png images/adjust_size.png + images/adjust_size@2x.png images/adjust_width.png + images/adjust_width@2x.png images/align_bottom.png + images/align_bottom@2x.png images/align_horizontal.png + images/align_horizontal@2x.png images/align_left.png + images/align_left@2x.png images/align_right.png + images/align_right@2x.png images/align_top.png + images/align_top@2x.png images/align_vertical.png + images/align_vertical@2x.png images/colorthemes.png images/final.png images/font_color.png diff --git a/src/plugins/scxmleditor/common/images/adjust_height.png b/src/plugins/scxmleditor/common/images/adjust_height.png index 3a8388385190883810550a2d592c0116843d569c..f3917bd462bfc785def1b99e3b50b430cd8ec1d0 100644 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdqsCd_r6q7#K`UOp=q6H*em2 z=FFM@|Nk4dZ_#03V9@n+aSY*zPUdK3YI9HxR7grl||jCTIWv literal 1305 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#RHU#*DxH2#>u(7dKPg1I$ zq+C5&sb-Q=%_QZT$x1bol^dq3HcVG*n4#J*L#=VTYU6aZ#u=)OGt^qu)-+r> z+c$bkV*~qc$3!h);nA`4Y@YeO%~|T-XYU2||F$aD*0TMYb>7$R@2>rIUpAbqZ8~ml zWVdX>_ut{>mD|0y|E@Xlr{;L_^uxRPb*nEMIk2euR^PnREfxOfZuR}o|GwBX_v>3} zii9@BUfyx~JU=hD_?&D(j@KfeD(m8O9kfJ+Q(m>|N7slhu<+(tmE|+3>dzMe&u)gs z*ACl!ExTvL*Is_gVE^aD-MdE2F)9jT9xl_(TlKv>7RoN_xRO=y>eD*5RTARg!oI$7 zm_EPkVQ2$$gr{qO7~dC*3pO)1&l2zpnI0CucIWBFFn{iV)f3nR3g20*KHqrl-T7M* z6_<|{+n&GGae7(rOI5RJBDc+!iQiapYFqDDR0tUm) zdhgQ$l7*}?qH-=u1yBFZ?#0k^WDUROubQ2bVsksXC#z4od}f!7!cVOR^}v}r=a*Im zO`m`3%PN+pxqOqJJ)GX57oXR*MdzemL}}g<-a5Vao2GtlQF*#bE$n3Q^!aVCuIA0z zq?IgN*lhSzFaF$-vMs&r9vYg9dRKpBnE$in>7S2h{yhGod|v66Y2wtfdy{t9sP{|m z_wC=ixYu@;PN>%9Gy8T#u_anhuH|r_cXR%F{rmdm&A-;ZQCzv=k&tdKe`c-REonxD zRHhZaE{Ds*=O2IkKKe5Q*Sel1pUT(y`ZB*?^H6Nlv-5jDAJ1QJDzUw9+s3GdH^tKz zZCv+WiPMKyR9~xYxCCKp5-B|BI2%ZD-w&>@^-~d15n581rhnaGnsTMhbLPzd z|NpD`9`i9UFc^BeIEF}sC;#AQIim7K{V9@h)aSY*zPUdK3YGYs%7br;ONIiO3AV{duU`lUjNBV)%#x{2 literal 2452 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 diff --git a/src/plugins/scxmleditor/common/images/adjust_size@2x.png b/src/plugins/scxmleditor/common/images/adjust_size@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..62162d1dc772908ac0f03651dab95405e2123ff8 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EJOMr-t_%zen>TMhbLPzd z|NpD`9`i9UFqnF}IEF}sC;#AQ^Zs(pjg8!g1bDwLl4j1+ykY)_ m;}|=efkRTls)HQ73^^QA-_ literal 0 HcmV?d00001 diff --git a/src/plugins/scxmleditor/common/images/adjust_width.png b/src/plugins/scxmleditor/common/images/adjust_width.png index 89e509878c4b75707380472df648bc63a8aced1e..a261321bb417c1207c0c8067b3e33f9b4063a5e1 100644 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdr%jd_r6q7#Iu<4J|D#V`5^G zlasTuvNmtteCEuV|NsA|8ath3U|_KGba4#fh)#adz|`iJY%n1q!;_hrpJlP82#<-x zgRa05$!XKW8$_2cFmTw_zopr0LC#f;Q#;t literal 1137 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE~)joO=c#X;bo zT}fdDx5|-8YSmlX+ zTrXz-_@dkGP`d5Kliy0Vc1l~`{g%CBpKKs#^}p8QM`!BI(0{vjt+K0*kNmvbWb-ro z|5Z|AtY*5)#fu#p7XQ^}Xy_L&=4e>l{`1F|r`Eig!TaqDn`8>(*ERg! zDK*zMrE|77s5D#OTw9-Zy7UXf#+k-?MqWG~laAbKD9m=?3SaQCdZph5WA}wOH-)U8 zxp?_uFSkU-%tG$&Q{pFO)%F``EY~QmV+0fO1s<)EqApF)s?PeRd44UanEdkg?eEnr z9g`p1PwIa!C@@DRewE>sKXROprarHVx7ripx#pf!_1|~vq@{aymmFr$oW|I?H9kAc zE7^w0N_ORw#TB1Fy|404%F9{7`b&YwAbR1=4JMxh!~}x_^Q^ZsLG4B}3C5nqwSh4cp0TaHFW!HlW7FwW2}ivG*`<@YW4^x&*uc#bEAn>pjaQRj>Ki3L zWwcFTP#2#Oqp(EDBqM%7*WD{0W1dQ}zP<3p(`2c^o~9VRvvRrd2O`rdoHRp!l09tTy7)pGCL&tqQegPq?b3uzKo|wzu3r-aR@caU?lX_nYvdhK0YGraDF3 z=2=_!+x=!zUd_pOS6m|6x8U__ z#+ZTMhbLPzd z|NpD`9`i9UFj#xKIEF}sC;#AQ+rK4-4{jOy9!tEwD)jZiTh1P7 t2eu{~N;-X3Hca4iHZZu7FoT)ljrO9c_bRUHGcYhPc)I$ztaD0e0sz&WE;s-H literal 0 HcmV?d00001 diff --git a/src/plugins/scxmleditor/common/images/align_bottom.png b/src/plugins/scxmleditor/common/images/align_bottom.png index f827993a211093a8d390be309c49697bc6f40b9a..6b24ef1bba2e06e9fcbdd3aefbd2d7d5ead2796d 100644 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdu#id_r6q7#K`UOp=q6H*enj z|Ns9dav4G(Ax{^_5RT~Nf<`7bcU3`-!zUwHrI|JO6B#()@F==!IN#*3X3l7tpmaiJ j$5K9?gab_Cj0`vRq_m?QKOSXZU|{fc^>bP0l+XkK*Q+Fp literal 1263 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE)O%~BLM5)5~8&~{_I9@?~^L11E`_{-*7Dgq~Wx%Eo8#$4}UY*E;F%bQO~ zcEOH-6%vV43SyTFEL!!b#^lp(r}%q5&37kpnk0x6#vWxAI{jcqQ%Q_?WZ+7{#T~D; z^c-Z59(JE;TKz=gLz>=&rocm`Q-ds)=|vh?`>ooYx_!$5jh*K#*a9^5I{#Hh-efww zh-rmx>*L%LOXggEp5(LaMsi4zDciv%LSEPHGLNRLcF#Ym@o-lgcSld^ihyOB5qhPv zn$pZ0+AnpjlxEjU5EKlb^9Io-k!#rN0kt@fSEeSv-6#yZ*HNgh7Fhk6g} zX-+&edA0XPrj8?qZCP)RO*1?9XU}>s%QjB`b$U-7C!C(^d&Baf1bd3E$=ig8k0~#M z-Y{jRKPW%)dw+c1)vX(44!5WWPcP!Wz`8<9z;N#8-0P{;5@I$xcZnQl$n~_#V6_j< z6O)hJ08$q|T}u2xlYZ~-sXsPONd_C1%E)tAW7QYmqmDV>)U74dYLoc4`is{d}Rua^hcyRJ+Z(mKDYMs-D99a=J^5#+FTHP7fA0FqnQtef z;M3RY4Br`Q*d8RC?6LmPc#_lMdGhIahI_n+Kji-iw3ph={(!NeonhaH|0Uu_7=N%F zkUWsj5XbbRdJ{wK{qFle-5K_M?^Y~7amqTMb3Sv$TJZ-Z&gTO%|NpVZmdKI;Vst0F_-Q<^TWy literal 1060 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#RrUv+gxH2#>u+beu)-+r@xmY~tG)7#P$_ zg8YIR7@1gj#U-TV6tr~ojEo(eJqsIp`Eaj?aro`@z`VyEJTCDQb#LBdnGyZw=XV>+_U4ZfS=Z_;ByXJ32r$|I^1c|C>nBrB z(|@0~3bdU@iWK6hX1TM9 zyQOujvqDwkB)80PNpIf@uZ|gf)lLE)VJp8qRVa+@KWnx(iNEumuY=IU*gxt8W4|9t0~hYOMm&$1LrKjNNntkQw~Y;U_& zP16sirz|s!9KXxdH2pZ_*t+}BXMw)l4*h_6>|Hxg@@xL!`N$^Ne6NS~ASW~am1?QLxjzr0%@|6I*;?JTVaTbh1wiU@u^ zefqkEe5m2mDRml;=L>9)ZEIV8GGDRhG9y!~k>H2V-`?(U`J?W!D<;o#&F5;NdX_TQ zu>6REeVl(Hlq&3jJ}b`6Wqu^@xU28g+Dm^A zFrU)ys26F-PzlIjepEl}oNTy{WbK`XAMWhUrM8ZjA1{tp+IKHtSsLS}*LK%bAHDvY zu&0#gaKZgu(>m6FZ?06ivROW>>Q=*#<1#xYzB?sX`2LId^xn&s&6Pg0uf(p=zrDP8 zzntny{&&0GW_zkS9@zI$@3d{V$joY)mN{(aPcnDjK3*Nr=(%EFy1hoCwd0X}rt6nD zUJu?>e6;ZFT8Wn%%bhLFq^?iqx%Kox&A-*Te_Pkje;+?DpRwUTqhqvvQabBwO$G)A N22WQ%mvv4FO#o0hz5)OM diff --git a/src/plugins/scxmleditor/common/images/align_horizontal@2x.png b/src/plugins/scxmleditor/common/images/align_horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..574f4dce0da312719a254ea6be2d20d5dc483652 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EoB=)|t_%zen>TO%|NpbP0l+XkKXHY07 literal 0 HcmV?d00001 diff --git a/src/plugins/scxmleditor/common/images/align_left.png b/src/plugins/scxmleditor/common/images/align_left.png index e015bc93e8fdb2796a6b7a120545cff2a8f2fad6..24a597bb59318662cf389cc852202f7cd4ac14d0 100644 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdnK1d_r6q7#Iu<4J|D#V`5^G zlasTuvNmtt{Qv)dUP0B93=9m8o-U3d9MQ=d?M!V=PRRlS=^7fI%#7tKZh;ycD~v@H zG|gBxI%Wl3kZ@h-C?F^@x$%@D8`D%}LkBhHsm2H9FfzDIH~z$TX=wxl0|SGntDnm{ Hr-UW|8G9<} literal 1069 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEoXT(@i9uND{I-WCTZC#Q0cZJV71Z*QF2 ze>?ix?vr^jbA;4ye(t%yr&3P+z#YEb8&?Nwx~|>&B}UsyVeQv2*$pRpq8WB@K3Es@ zO21(}LtWO|+?x9*Zx&8GXtS$+S1F6mrq9w0^B60*9>^T1W{_w2bK|8%)KV8Wb9=f?OEPmX{WADvCJ7toix6M>$~AzPnZo4F4Eb+zD8{ZlPp$ zbcoY?j{C|D8~V$Z{M3H;Y@)&eh9A5R?&l1CI$yhyvP^Z>ohgwo=P2zxquqS&);{KG z3^^&?rL`-k`?PMm`J%vifA%3$aiwI(172q(CQCd!Dn;O5$l_UcLeLQr8p)$@3$A1zHsv9$744WJmPh($vnBo zwQ#O^cCN6DP+_a}`mgR%`9d#ythRccwf~#-zut1e908+aWzV?l9gbZ&oM3CcVrh(+ zhDOVpjpqcKrkt2};^xKrx2G4b{*{=^GDXPAkZH-`!rGH*5&1bW>{EoDj@@D?eJ@(r z;TXWi9Pd2&G0t&q-5t0nC> z1gz(nsFP~+>U;X+fTn9<2X9z?_B4)8TvB&H&$#+p*`@9Nwm#0Bue44+?)+{0%_Zo^ zHkHLGn@_ydICx!uzo_z3O%2C=zbn@F2q-OI#Ny4V$hOryPcQ@Kle)5+{u(Rmb1F zyj-ZY~c5JvI zF~jD4`-LupGLgq>3N6bvNKNUyb*fi!!Ig6XE6qX#EDtqqpZJz%X=MEt)`_`$l#Jgs zc`Tf}Fr_`=4C}-oYv)-1{!I!&dFd+(PpsH}tm`e$#MSGQpEaF`5tzxXRP30d*Kvk* z;!Xu4ahI|UQaZnqey`rX-Mp{CoLSgxm$~cq-gVm63Af`*r{)#AYFNiF`sZ?N@^Z)H z;>y3@G;lNA53Dz0FRv-|;QPV)z=W$e`13=9mOu6{1-oD!MTO%|Np$pQlD=^CEQjO8kBff^huHXA!! zb&@!wa8#j9+QX2`S=4uhE&{o8+|rQ#8Kd% zRtwuli4Tj?4{m;<>Z0;w((daqEMHX@g)64VJ2>8$F2Krf*O;`2qv^=ulJnErSH4>} zZ~u`u=lssU`=Yp{x+;Cy>V3anz0P8raXZia))(ep!{&SYHM-V44+<2Ck-sm0_|yrN5H{{p>PHh(+tK%5=VL13STdN$5g@efU&`rp`Wov;x5BAE~c5QT$@sB zPf5&Lv18UM&u;5y+X`Yh6Er9PPdUhVZPx~kvxn|fRC}${5O85A)Snw2xn=6V{ICBz z6dwpWG&Sv*GfPvWw>xagmcMpeR2i1nJxFX0sa+X)#YG*J!ZE<~%|G`!(6ElsL zYmE)sLcH<8?JF!N3p!of_27?JcF4VJ=Tl4m|#`ixF|$q-6xAu!G#yJ zCi^^$+Qr*r#H*Tdwf6SSt<66t?>VUzdM}2*XE95z0ItlZGGHwz6D*eeFlo9ma`gS|@DwR*jfd{oz!m%FLdrJ)XRW zmw1O=Ts&F8X`|V5PJP}(Df8tl`lmSBY&w~K=~`3RG^Z6CQX`htuc)`1eCcng;$p!E z>Y1{FI#YKFRDFG9y>0JT$p-aZ%f8O#;Vo@44%vP3qRg&2XE+)BlcDS91e zSSRjOFcNnuD>L`dkG~&n&2-Ml_*GBCxgYO;{K~q0D@O3vr?0w!wMvhJTaK3Qm$*6U zoA?3N2Je^gCvKdRcp%=;%JsFiXY0E++t*1Ze+#HJs9eBP6e)7FXnDsu3Fl)HhwjXJ aE6-^5Gb40XMI!?P1B0ilpUXO@geCwVgzQ=X diff --git a/src/plugins/scxmleditor/common/images/align_right@2x.png b/src/plugins/scxmleditor/common/images/align_right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7e50ee73797c1ab03ea9151be2a6fb7b1035d9a2 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EoB=)|t_%zen>TO%|NpFVdQ&MBb@0B^S@*#H0l literal 1261 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE;N<7jp!2_(`3Hj&k0hVqC61p0KHp2e z+WZdeepYRf^#pus!I3$?@pI!YZb7P@ti!v`)|Q{<_R(mH#fMM{W#x!Qi=Uy1<0GlPZ56 zZE2e##lt-BO@x=agN0Hh6XWscN(?VIhlj`nH6|XIEbaY~<-%cs2R#n!!~Yn+Hkegu zl&pE4p}{FYnBg(k(k-`3Uoaf*QrDjLiRZ&)t*lUvf^7$nuzQCkMSMt!3yxq3zZ96X zD)7=)5zXTU4^Q?jt>8XlYqhS!%e*b<^o*)C2R1x7*}L@J0q6UD7XMU)>$g1aGh9Y*)MBb5)V$6_V(p{;Iu{M*U|T}@8q(-8Gy`Od4nlt%c=!7sZ0H*C(Zbf zay&@6#U-dxOX6~9SjhA#$umAYITobcnyNZ|hg$k%r)m9(M<hz3PWY7&i|{p7&02d|)37E3)z(eDgenY@sTF}N)1JYyTDf1b|L zbp|`HMj!2dFYw9iwISPwFSD=v&inD$eScc~Y*R-6dA0{G=l>7bTY9a3*`d>}ruW~S ze=Tu;e}zWv^#%`COG{n%bC)EIn{bbDOdl-9b9!xz8gxoKhI;%F#MmBH4AiiIwG{tOFX4H)S>7 z`WC!w`I+!kMUNEG)vSwKR;z3`KW_bF)0Uej3|-F`_7%^0EK^?jhkf47pktpzZT~Vb PFfe$!`njxgN@xNAu%J;e diff --git a/src/plugins/scxmleditor/common/images/align_top@2x.png b/src/plugins/scxmleditor/common/images/align_top@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d387248dd064cde8d392469b9cc7fc4c190f67de GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EoB=)|t_%zen>TO%|Np@;i*o~us00sBz_C@KB1Q}N lnk}YEumv#BVo&5@I3ZSQ*xtXukAZ=K!PC{xWt~$(696KIBIW=9 literal 0 HcmV?d00001 diff --git a/src/plugins/scxmleditor/common/images/align_vertical.png b/src/plugins/scxmleditor/common/images/align_vertical.png index 036f8d40b73620d07a4f49e80094070a3c823143..f72b06483e336986be4db9cd531c4b6ff1549c03 100644 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdnK1d_r6q7#Iu<4J|D#V`5^G zlasTuvNmtt{Qv)dUP0B93=9l`o-U3d9MQ=d?M!V&iOI=n$;pLnMccQSY};Z|uF{s3 zp^=@j!iw2L*IJ-i;?S8#0&UW>t)-l&hRP~21?%vbM9Qc>F}VkIObB*dapzbsIs9zw?q=+A=c^mCsUI-PN#bo$~QL(TghmIaoscCiLmI zyxR07{pF=%6|ZwPtWjU<55ygA=(r$RvyJ&-RQ4*ShD-a_t@`rh*hbTSA}y>vwA*&~J}*M2>gllEb&Xz{inzvVXKemy1R_GxAXJa$}wO^`Mc6q&g?U8qS z&s^{CXH!^vO@HB{01J!TVRBmAPsGhn5O4QfDvI;vxJ;NQQ59?3feRU&^;RoY`V@vM$_N8u=$?uC}s9<@pk@3m8RjXvT krJS>zcl!6?+1u*%f~>1VX1;jOz`(%Z>FVdQ&MBb@0GMsK?*IS* diff --git a/src/plugins/scxmleditor/common/images/align_vertical@2x.png b/src/plugins/scxmleditor/common/images/align_vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..218c904f63c12fb8665f231eff6779e9c53d8dca GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EoB=)|t_%zen>TO%|Np9L7{fq}u()z4*}Q$iB}Zo4SL literal 0 HcmV?d00001 diff --git a/src/plugins/scxmleditor/common/mainwidget.cpp b/src/plugins/scxmleditor/common/mainwidget.cpp index 09c00c0f623..3952b35812c 100644 --- a/src/plugins/scxmleditor/common/mainwidget.cpp +++ b/src/plugins/scxmleditor/common/mainwidget.cpp @@ -289,8 +289,8 @@ void MainWidget::init() // Init ToolButtons auto stateColorButton = new ColorToolButton("StateColor", ":/scxmleditor/images/state_color.png", tr("State Color")); auto fontColorButton = new ColorToolButton("FontColor", ":/scxmleditor/images/font_color.png", tr("Font Color")); - QToolButton *alignToolButton = createToolButton(":/scxmleditor/images/align_left.png", tr("Align Left"), QToolButton::MenuButtonPopup); - QToolButton *adjustToolButton = createToolButton(":/scxmleditor/images/adjust_width.png", tr("Adjust Width"), QToolButton::MenuButtonPopup); + QToolButton *alignToolButton = createToolButton(m_actionHandler->action(ActionAlignLeft)->icon(), tr("Align Left"), QToolButton::MenuButtonPopup); + QToolButton *adjustToolButton = createToolButton(m_actionHandler->action(ActionAdjustWidth)->icon(), tr("Adjust Width"), QToolButton::MenuButtonPopup); // Connect state color change connect(stateColorButton, &ColorToolButton::colorSelected, [this](const QString &color) { @@ -725,10 +725,10 @@ void MainWidget::setMagnifier(bool m) } } -QToolButton *MainWidget::createToolButton(const QString &iconName, const QString &tooltip, QToolButton::ToolButtonPopupMode mode) +QToolButton *MainWidget::createToolButton(const QIcon &icon, const QString &tooltip, QToolButton::ToolButtonPopupMode mode) { auto button = new QToolButton; - button->setIcon(QIcon(iconName)); + button->setIcon(icon); button->setToolTip(tooltip); button->setPopupMode(mode); diff --git a/src/plugins/scxmleditor/common/mainwidget.h b/src/plugins/scxmleditor/common/mainwidget.h index 6b75895b0f3..984c364f5b1 100644 --- a/src/plugins/scxmleditor/common/mainwidget.h +++ b/src/plugins/scxmleditor/common/mainwidget.h @@ -108,7 +108,7 @@ signals: void dirtyChanged(bool dirty); private: - QToolButton *createToolButton(const QString &iconName, const QString &tooltip, QToolButton::ToolButtonPopupMode mode); + QToolButton *createToolButton(const QIcon &icon, const QString &tooltip, QToolButton::ToolButtonPopupMode mode); void documentChanged(); void createUi(); void init(); diff --git a/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp b/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp index b697e0e8d8e..026e442557a 100644 --- a/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp +++ b/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp @@ -59,15 +59,15 @@ ActionHandler::ActionHandler(QObject *parent) { Utils::Icon({{":/scxmleditor/images/icon-export-canvas.png", Utils::Theme::IconsBaseColor}}), AH::tr("Export to Image"), AH::tr("Export to Image"), "Ctrl+Shift+E", false }, { Utils::Icon(":/scxmleditor/images/fullnamespace.png"), AH::tr("Toggle Full Namespace"), AH::tr("Toggle Full Namespace"), "Ctrl+Shift+N", true }, - { Utils::Icon(":/scxmleditor/images/align_left.png"), AH::tr("Align Left"), AH::tr("Align Left (Ctrl+L,1)"), "Ctrl+L,1", false }, - { Utils::Icon(":/scxmleditor/images/align_right.png"), AH::tr("Align Right"), AH::tr("Align Right (Ctrl+L,2)"), "Ctrl+L,2", false }, - { Utils::Icon(":/scxmleditor/images/align_top.png"), AH::tr("Align Top"), AH::tr("Align Top (Ctrl+L,3)"), "Ctrl+L,3", false }, - { Utils::Icon(":/scxmleditor/images/align_bottom.png"), AH::tr("Align Bottom"), AH::tr("Align Bottom (Ctrl+L,4)"), "Ctrl+L,4", false }, - { Utils::Icon(":/scxmleditor/images/align_horizontal.png"), AH::tr("Align Horizontal"), AH::tr("Align Horizontal (Ctrl+L,5)"), "Ctrl+L,5", false }, - { Utils::Icon(":/scxmleditor/images/align_vertical.png"), AH::tr("Align Vertical"), AH::tr("Align Vertical (Ctrl+L,6)"), "Ctrl+L,6", false }, - { Utils::Icon(":/scxmleditor/images/adjust_width.png"), AH::tr("Adjust Width"), AH::tr("Adjust Width (Ctrl+L,7)"), "Ctrl+L,7", false }, - { Utils::Icon(":/scxmleditor/images/adjust_height.png"), AH::tr("Adjust Height"), AH::tr("Adjust Height (Ctrl+L,8)"), "Ctrl+L,8", false }, - { Utils::Icon(":/scxmleditor/images/adjust_size.png"), AH::tr("Adjust Size"), AH::tr("Adjust Size (Ctrl+L,9)"), "Ctrl+L,9", false }, + { Utils::Icon({{":/scxmleditor/images/align_left.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Left"), AH::tr("Align Left (Ctrl+L,1)"), "Ctrl+L,1", false }, + { Utils::Icon({{":/scxmleditor/images/align_right.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Right"), AH::tr("Align Right (Ctrl+L,2)"), "Ctrl+L,2", false }, + { Utils::Icon({{":/scxmleditor/images/align_top.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Top"), AH::tr("Align Top (Ctrl+L,3)"), "Ctrl+L,3", false }, + { Utils::Icon({{":/scxmleditor/images/align_bottom.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Bottom"), AH::tr("Align Bottom (Ctrl+L,4)"), "Ctrl+L,4", false }, + { Utils::Icon({{":/scxmleditor/images/align_horizontal.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Horizontal"), AH::tr("Align Horizontal (Ctrl+L,5)"), "Ctrl+L,5", false }, + { Utils::Icon({{":/scxmleditor/images/align_vertical.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Vertical"), AH::tr("Align Vertical (Ctrl+L,6)"), "Ctrl+L,6", false }, + { Utils::Icon({{":/scxmleditor/images/adjust_width.png", Utils::Theme::IconsBaseColor}}), AH::tr("Adjust Width"), AH::tr("Adjust Width (Ctrl+L,7)"), "Ctrl+L,7", false }, + { Utils::Icon({{":/scxmleditor/images/adjust_height.png", Utils::Theme::IconsBaseColor}}), AH::tr("Adjust Height"), AH::tr("Adjust Height (Ctrl+L,8)"), "Ctrl+L,8", false }, + { Utils::Icon({{":/scxmleditor/images/adjust_size.png", Utils::Theme::IconsBaseColor}}), AH::tr("Adjust Size"), AH::tr("Adjust Size (Ctrl+L,9)"), "Ctrl+L,9", false }, { Utils::Icon(":/scxmleditor/images/statistics.png"), AH::tr("Show Statistics..."), AH::tr("Show Statistics"), "", false } }; diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 0daf90e7c70..5bcdd09f53d 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -3770,6 +3770,226 @@ d="m 1240,574.5 -5,0" sodipodi:nodetypes="cc" />
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Date: Wed, 26 Oct 2016 00:05:40 +0200 Subject: [PATCH 45/81] Utils: New "Fit to view" icon Change-Id: I2592cb79a8dd7bad100c466cb45cf30039bace18 Reviewed-by: Alessandro Portale --- src/libs/utils/images/fittoview.png | Bin 0 -> 114 bytes src/libs/utils/images/fittoview@2x.png | Bin 0 -> 126 bytes src/libs/utils/utils.qrc | 3 ++- src/libs/utils/utilsicons.cpp | 2 ++ src/libs/utils/utilsicons.h | 1 + src/tools/icons/qtcreatoricons.svg | 17 +++++++++++++++++ 6 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/libs/utils/images/fittoview.png create mode 100644 src/libs/utils/images/fittoview@2x.png diff --git a/src/libs/utils/images/fittoview.png b/src/libs/utils/images/fittoview.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9d1329f74b14202ca0d79228ab06809a0348bd GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRdMrH;E236Z!B?bltwg8_HR|W=#|Ns9ly*d9b z0|SG)r;B3zopr0Oc_raR2}S literal 0 HcmV?d00001 diff --git a/src/libs/utils/images/fittoview@2x.png b/src/libs/utils/images/fittoview@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e98dce6536f5e003af3917dcf1adf508fa472176 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;IMrH;E2G1=owlgp=um$*pxH2#>{Qv)d>CO3f z85kIhJzX3_IHHq(@U!q_9ARW*OXDc~_y7NSfk!<5*^@Os{XYabaO=18U?CR&T&MBb@0Gk*n!vFvP literal 0 HcmV?d00001 diff --git a/src/libs/utils/utils.qrc b/src/libs/utils/utils.qrc index 798e3bb2055..dd551f21fc2 100644 --- a/src/libs/utils/utils.qrc +++ b/src/libs/utils/utils.qrc @@ -31,7 +31,6 @@ images/notloaded@2x.png images/ok.png images/ok@2x.png - images/clean_pane_small.png images/clean_pane_small@2x.png images/compile_error_taskbar.png @@ -165,5 +164,7 @@ images/zoomin_overlay@2x.png images/zoomout_overlay.png images/zoomout_overlay@2x.png + images/fittoview.png + images/fittoview@2x.png diff --git a/src/libs/utils/utilsicons.cpp b/src/libs/utils/utilsicons.cpp index c59d1b8b8ab..94a32467b64 100644 --- a/src/libs/utils/utilsicons.cpp +++ b/src/libs/utils/utilsicons.cpp @@ -54,6 +54,8 @@ const Icon ZOOMIN_TOOLBAR({ const Icon ZOOMOUT_TOOLBAR({ {QLatin1String(":/utils/images/zoom.png"), Theme::IconsBaseColor}, {QLatin1String(":/utils/images/zoomout_overlay.png"), Theme::IconsBaseColor}}); +const Icon FITTOVIEW_TOOLBAR({ + {QLatin1String(":/utils/images/fittoview.png"), Theme::IconsBaseColor}}); const Icon OK({ {QLatin1String(":/utils/images/ok.png"), Theme::IconsRunToolBarColor}}, Icon::Tint); const Icon NOTLOADED({ diff --git a/src/libs/utils/utilsicons.h b/src/libs/utils/utilsicons.h index 51bc6e40e50..747ebc3a36f 100644 --- a/src/libs/utils/utilsicons.h +++ b/src/libs/utils/utilsicons.h @@ -43,6 +43,7 @@ QTCREATOR_UTILS_EXPORT extern const Icon ZOOM; QTCREATOR_UTILS_EXPORT extern const Icon ZOOM_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon ZOOMIN_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon ZOOMOUT_TOOLBAR; +QTCREATOR_UTILS_EXPORT extern const Icon FITTOVIEW_TOOLBAR; QTCREATOR_UTILS_EXPORT extern const Icon OK; QTCREATOR_UTILS_EXPORT extern const Icon NOTLOADED; QTCREATOR_UTILS_EXPORT extern const Icon BROKEN; diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 5bcdd09f53d..b3f436cf257 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -3990,6 +3990,23 @@ transform="matrix(0,1,1,0,964,-948)" width="100%" height="100%" /> + + + + Date: Wed, 26 Oct 2016 00:07:34 +0200 Subject: [PATCH 46/81] ImageViewer, ScxmlEditor: Use the new "Fit to view" icon Change-Id: I4261e2a91b2c2b310b571ac2657998dcc0756be6 Reviewed-by: Alessandro Portale --- src/plugins/imageviewer/imageviewer.cpp | 4 ++-- src/plugins/scxmleditor/common/common.qrc | 1 - .../scxmleditor/common/images/icon-fit-screen.png | Bin 244 -> 0 bytes .../plugin_interface/actionhandler.cpp | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 src/plugins/scxmleditor/common/images/icon-fit-screen.png diff --git a/src/plugins/imageviewer/imageviewer.cpp b/src/plugins/imageviewer/imageviewer.cpp index 069e1a36225..b891524d1c7 100644 --- a/src/plugins/imageviewer/imageviewer.cpp +++ b/src/plugins/imageviewer/imageviewer.cpp @@ -108,8 +108,8 @@ void ImageViewer::ctor() d->ui_toolbar.toolButtonBackground->setIcon(backgroundIcon.icon()); d->ui_toolbar.toolButtonOutline->setIcon(Utils::Icons::BOUNDING_RECT.icon()); d->ui_toolbar.toolButtonZoomIn->setIcon(Utils::Icons::ZOOMIN_TOOLBAR.icon()); - d->ui_toolbar.toolButtonZoomOut->setIcon(Utils::Icons::ZOOMIN_TOOLBAR.icon()); - d->ui_toolbar.toolButtonFitToScreen->setIcon(Utils::Icons::ZOOM_TOOLBAR.icon()); + d->ui_toolbar.toolButtonZoomOut->setIcon(Utils::Icons::ZOOMOUT_TOOLBAR.icon()); + d->ui_toolbar.toolButtonFitToScreen->setIcon(Utils::Icons::FITTOVIEW_TOOLBAR.icon()); d->ui_toolbar.toolButtonOriginalSize->setIcon(Utils::Icons::EYE_OPEN_TOOLBAR.icon()); // icons update - try to use system theme updateButtonIconByTheme(d->ui_toolbar.toolButtonZoomIn, QLatin1String("zoom-in")); diff --git a/src/plugins/scxmleditor/common/common.qrc b/src/plugins/scxmleditor/common/common.qrc index 36cdafe2414..78c35d708e9 100644 --- a/src/plugins/scxmleditor/common/common.qrc +++ b/src/plugins/scxmleditor/common/common.qrc @@ -25,7 +25,6 @@ images/history.png images/icon-export-canvas.png images/icon-export-canvas@2x.png - images/icon-fit-screen.png images/icon-pan.png images/initial.png images/more_colors.png diff --git a/src/plugins/scxmleditor/common/images/icon-fit-screen.png b/src/plugins/scxmleditor/common/images/icon-fit-screen.png deleted file mode 100644 index d5d5a3395635c1549e4649bd4077d69aaf4906ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|7G?$p2BAoW(+ms@>H$6>uK)l4X9I(o`#5JG z;Gcg;e9;lPrN`7x-)lVgpyT4B36~#FyZUtYCOe@`3=9lRB|(0{4Ab)e|Mp~HV5stR zaSV~ToSblgw`Ix{76}Q7sZ&H6W#$^Ei%3Y!I5)?V Date: Fri, 21 Oct 2016 15:23:27 +0200 Subject: [PATCH 47/81] CDB extension: Also look for QV4::ExecutionEngine for the QML stack The struct has been renamed from QV4::ExecutionContext to QV4::ExecutionEngine in Qt 5.7. Task-number: QTCREATORBUG-17097 Change-Id: If9685d039d3d1f9caf369ec847ac6705747ae9f7 Reviewed-by: David Schulz --- src/libs/qtcreatorcdbext/extensioncontext.cpp | 32 ++++++++++++------- src/libs/qtcreatorcdbext/extensioncontext.h | 2 +- .../qtcreatorcdbext/qtcreatorcdbextension.cpp | 12 +++---- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/libs/qtcreatorcdbext/extensioncontext.cpp b/src/libs/qtcreatorcdbext/extensioncontext.cpp index 5fba498dee9..11d035eb2a8 100644 --- a/src/libs/qtcreatorcdbext/extensioncontext.cpp +++ b/src/libs/qtcreatorcdbext/extensioncontext.cpp @@ -202,14 +202,22 @@ static std::string findModule(CIDebugSymbols *syms, } // Try to find a JS execution context passed as parameter in a complete stack dump (kp) -static ULONG64 jsExecutionContextFromStackTrace(const std::wstring &stack) +static ULONG64 jsExecutionEngineFromStackTrace(const std::wstring &stack) { - // Search for "QV4::ExecutionContext * - varying variable names - 0x...[,)]" - const wchar_t needle[] = L"struct QV4::ExecutionContext * "; // .. varying variable names .. 0x... - const std::string::size_type varPos = stack.find(needle); - if (varPos == std::string::npos) + // Search for "QV4::ExecutionEngine * - varying variable names - 0x...[,)]" + const wchar_t needle[] = L"struct QV4::ExecutionEngine * "; // Qt 5.7 onwards + std::string::size_type varEnd = std::string::npos; + std::string::size_type varPos = stack.find(needle); + if (varPos != std::string::npos) { + varEnd = varPos + sizeof(needle) / sizeof(wchar_t) - 1; + } else { + const wchar_t needle56[] = L"struct QV4::ExecutionContext * "; // up to Qt 5.6 + varPos = stack.find(needle56); + if (varPos != std::string::npos) + varEnd = varPos + sizeof(needle56) / sizeof(wchar_t) - 1; + } + if (varEnd == std::string::npos) return 0; - const std::string::size_type varEnd = varPos + sizeof(needle) / sizeof(wchar_t) - 1; std::string::size_type numPos = stack.find(L"0x", varEnd); if (numPos == std::string::npos || numPos > (varEnd + 20)) return 0; @@ -227,10 +235,10 @@ static ULONG64 jsExecutionContextFromStackTrace(const std::wstring &stack) return str.fail() ? 0 : result; } -// Try to find address of jsExecutionContext by looking at the +// Try to find address of jsExecutionEngine by looking at the // stack trace in case QML is loaded. -ULONG64 ExtensionContext::jsExecutionContext(ExtensionCommandContext &exc, - std::string *errorMessage) +ULONG64 ExtensionContext::jsExecutionEngine(ExtensionCommandContext &exc, + std::string *errorMessage) { const QtInfo &qtInfo = QtInfo::get(SymbolGroupValueContext(exc.dataSpaces(), exc.symbols())); @@ -241,7 +249,7 @@ ULONG64 ExtensionContext::jsExecutionContext(ExtensionCommandContext &exc, *errorMessage = "QML not loaded"; return 0; } - // Retrieve full stack (costly) and try to find a JS execution context passed as parameter + // Retrieve full stack (costly) and try to find a JS execution engine passed as parameter startRecordingOutput(); StateNotificationBlocker blocker(this); const HRESULT hr = m_control->Execute(DEBUG_OUTCTL_ALL_CLIENTS, "kp", DEBUG_EXECUTE_ECHO); @@ -255,9 +263,9 @@ ULONG64 ExtensionContext::jsExecutionContext(ExtensionCommandContext &exc, *errorMessage = "Unable to obtain stack (output redirection in place?)"; return 0; } - const ULONG64 result = jsExecutionContextFromStackTrace(fullStackTrace); + const ULONG64 result = jsExecutionEngineFromStackTrace(fullStackTrace); if (!result) - *errorMessage = "JS ExecutionContext address not found in stack"; + *errorMessage = "JS ExecutionEngine address not found in stack"; return result; } diff --git a/src/libs/qtcreatorcdbext/extensioncontext.h b/src/libs/qtcreatorcdbext/extensioncontext.h index f1b08cce694..687cadffaaf 100644 --- a/src/libs/qtcreatorcdbext/extensioncontext.h +++ b/src/libs/qtcreatorcdbext/extensioncontext.h @@ -115,7 +115,7 @@ public: const Parameters ¶meters() const { return m_parameters; } Parameters ¶meters() { return m_parameters; } - ULONG64 jsExecutionContext(ExtensionCommandContext &exc, std::string *errorMessage); + ULONG64 jsExecutionEngine(ExtensionCommandContext &exc, std::string *errorMessage); bool stateNotification() const { return m_stateNotification; } void setStateNotification(bool s) { m_stateNotification = s; } diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index 5cf04d9441b..63e79777fd0 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -1091,7 +1091,7 @@ extern "C" HRESULT CALLBACK qmlstack(CIDebugClient *client, PCSTR argsIn) int token = 0; bool humanReadable = false; - ULONG64 jsExecutionContext = 0; + ULONG64 jsExecutionEngine = 0; std::string stackDump; do { @@ -1101,16 +1101,16 @@ extern "C" HRESULT CALLBACK qmlstack(CIDebugClient *client, PCSTR argsIn) tokens.pop_front(); } if (!tokens.empty()) { - if (!integerFromString(tokens.front(), &jsExecutionContext)) { + if (!integerFromString(tokens.front(), &jsExecutionEngine)) { errorMessage = "Invalid address " + tokens.front(); break; } tokens.pop_front(); } ExtensionCommandContext exc(client); - if (!jsExecutionContext) { // Try to find execution context unless it was given. - jsExecutionContext = ExtensionContext::instance().jsExecutionContext(exc, &errorMessage); - if (!jsExecutionContext) + if (!jsExecutionEngine) { // Try to find execution engine unless it was given. + jsExecutionEngine = ExtensionContext::instance().jsExecutionEngine(exc, &errorMessage); + if (!jsExecutionEngine) break; } // call function to get stack trace. Call with exceptions handled right from @@ -1118,7 +1118,7 @@ extern "C" HRESULT CALLBACK qmlstack(CIDebugClient *client, PCSTR argsIn) std::ostringstream callStr; const QtInfo &qtInfo = QtInfo::get(SymbolGroupValueContext(exc.dataSpaces(), exc.symbols())); callStr << qtInfo.prependQtModule("qt_v4StackTrace(", QtInfo::Qml) << std::showbase << std::hex - << jsExecutionContext << std::dec << std::noshowbase << ')'; + << jsExecutionEngine << std::dec << std::noshowbase << ')'; std::wstring wOutput; if (!ExtensionContext::instance().call(callStr.str(), ExtensionContext::CallWithExceptionsHandled, &wOutput, &errorMessage)) break; From 5378aef691dbf5501cb98a5fdc3e078042bd0908 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 21 Oct 2016 15:27:31 +0200 Subject: [PATCH 48/81] CDB extension: Limit number of frames in the QML stack Retrieving the full stack has been observed to hang. Task-number: QTCREATORBUG-17097 Change-Id: I628ac5f2ff9790b700e6eb97e341d3996a03c8d8 Reviewed-by: David Schulz --- src/libs/qtcreatorcdbext/extensioncontext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/qtcreatorcdbext/extensioncontext.cpp b/src/libs/qtcreatorcdbext/extensioncontext.cpp index 11d035eb2a8..0d8864ee972 100644 --- a/src/libs/qtcreatorcdbext/extensioncontext.cpp +++ b/src/libs/qtcreatorcdbext/extensioncontext.cpp @@ -249,10 +249,10 @@ ULONG64 ExtensionContext::jsExecutionEngine(ExtensionCommandContext &exc, *errorMessage = "QML not loaded"; return 0; } - // Retrieve full stack (costly) and try to find a JS execution engine passed as parameter + // Retrieve top frames of stack and try to find a JS execution engine passed as parameter startRecordingOutput(); StateNotificationBlocker blocker(this); - const HRESULT hr = m_control->Execute(DEBUG_OUTCTL_ALL_CLIENTS, "kp", DEBUG_EXECUTE_ECHO); + const HRESULT hr = m_control->Execute(DEBUG_OUTCTL_ALL_CLIENTS, "kp 15", DEBUG_EXECUTE_ECHO); if (FAILED(hr)) { stopRecordingOutput(); *errorMessage = msgDebugEngineComFailed("Execute", hr); From 371ab14c6ea64d51b106fb4a3299e0f6c4c60618 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 25 Oct 2016 15:37:40 +0200 Subject: [PATCH 49/81] VariableChooser: Sort model Task-number: QTCREATORBUG-16670 Change-Id: I9dc3641409dbd351491f8b91795bb0adafcb686d Reviewed-by: hjk --- src/plugins/coreplugin/variablechooser.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/variablechooser.cpp b/src/plugins/coreplugin/variablechooser.cpp index fc02e1b21fb..4e5a05d68e3 100644 --- a/src/plugins/coreplugin/variablechooser.cpp +++ b/src/plugins/coreplugin/variablechooser.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -257,7 +258,10 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) m_variableTree = new VariableTreeView(q, this); m_variableDescription = new QLabel(q); - m_variableTree->setModel(&m_model); + auto sorter = new QSortFilterProxyModel(this); + sorter->setSourceModel(&m_model); + sorter->sort(0); + m_variableTree->setModel(sorter); m_variableDescription->setText(m_defaultDescription); m_variableDescription->setMinimumSize(QSize(0, 60)); m_variableDescription->setAlignment(Qt::AlignLeft|Qt::AlignTop); From 44f534397042af60e38f8728d35ad74b258bdb52 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 25 Oct 2016 17:36:27 +0300 Subject: [PATCH 50/81] ProjectExplorer: Use Build by default in Build & Run settings This preserves the behavior of 4.1. Change-Id: I071ef1c6bf0be88aa7b9787114cbac5292910125 Reviewed-by: Tobias Hunger Reviewed-by: hjk --- src/plugins/projectexplorer/targetsettingspanel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 49ebd5e8564..c62d9aa60f6 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -280,7 +280,7 @@ class TargetItem : public TypedTreeItem Q_DECLARE_TR_FUNCTIONS(TargetSettingsPanelWidget) public: - enum { DefaultPage = 1 }; // Run page. + enum { DefaultPage = 0 }; // Build page. TargetItem(Project *project, Id kitId) : m_project(project), m_kitId(kitId) @@ -802,7 +802,7 @@ void TargetGroupItemPrivate::handleAddedKit(Kit *kit) void TargetItem::updateSubItems() { if (children().isEmpty() && isEnabled()) - m_currentChild = 1; // We will add children below. Use 'Run' item by default. + m_currentChild = DefaultPage; // We will add children below. removeChildren(); if (isEnabled()) { appendChild(new BuildOrRunItem(m_project, m_kitId, BuildOrRunItem::BuildPage)); From f911ddba869bc026fe67b7b902b88e39ec0be497 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 25 Oct 2016 17:14:28 +0200 Subject: [PATCH 51/81] QbsProjectManager: Remove a redundant header file Somebody mistakenly introduced qbsconstants.h, even though qbsprojectmanagerconstants.h already existed for that purpose. Merge these two files and remove the newer one. Change-Id: I6103509d902880d0e9c181873ec4cf56acf04424 Reviewed-by: Jake Petroules --- .../defaultpropertyprovider.cpp | 2 +- src/plugins/qbsprojectmanager/qbsconstants.h | 54 ------------------- src/plugins/qbsprojectmanager/qbsinfopage.cpp | 2 +- .../qbsprofilessettingspage.cpp | 2 +- .../qbsprojectmanager/qbsprojectmanager.pro | 3 +- .../qbsprojectmanager/qbsprojectmanager.qbs | 1 - .../qbsprojectmanagerconstants.h | 22 ++++++++ 7 files changed, 26 insertions(+), 60 deletions(-) delete mode 100644 src/plugins/qbsprojectmanager/qbsconstants.h diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp index a83e814a300..703f41305b5 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp @@ -24,7 +24,7 @@ ****************************************************************************/ #include "defaultpropertyprovider.h" -#include "qbsconstants.h" +#include "qbsprojectmanagerconstants.h" #include #include diff --git a/src/plugins/qbsprojectmanager/qbsconstants.h b/src/plugins/qbsprojectmanager/qbsconstants.h deleted file mode 100644 index 8ed4ace4a61..00000000000 --- a/src/plugins/qbsprojectmanager/qbsconstants.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -namespace QbsProjectManager { -namespace Constants { - -// Toolchain related settings: -const char QBS_TARGETOS[] = "qbs.targetOS"; -const char QBS_SYSROOT[] = "qbs.sysroot"; -const char QBS_ARCHITECTURE[] = "qbs.architecture"; -const char QBS_TOOLCHAIN[] = "qbs.toolchain"; -const char CPP_TOOLCHAINPATH[] = "cpp.toolchainInstallPath"; -const char CPP_TOOLCHAINPREFIX[] = "cpp.toolchainPrefix"; -const char CPP_COMPILERNAME[] = "cpp.compilerName"; -const char CPP_CXXCOMPILERNAME[] = "cpp.cxxCompilerName"; -const char CPP_PLATFORMCOMMONCOMPILERFLAGS[] = "cpp.platformCommonCompilerFlags"; -const char CPP_PLATFORMLINKERFLAGS[] = "cpp.platformLinkerFlags"; -const char CPP_PLATFORMPATH[] = "cpp.platformPath"; -const char CPP_XCODESDKNAME[] = "cpp.xcodeSdkName"; -const char CPP_XCODESDKVERSION[] = "cpp.xcodeSdkVersion"; - -// Settings page -const char QBS_SETTINGS_CATEGORY[] = "YM.qbs"; -const char QBS_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("QbsProjectManager", "Qbs"); -const char QBS_SETTINGS_CATEGORY_ICON[] = ":/projectexplorer/images/build.png"; - -const char QBS_PROPERTIES_KEY_FOR_KITS[] = "QbsProjectManager.qbs-properties"; - -} // namespace Constants -} // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsinfopage.cpp b/src/plugins/qbsprojectmanager/qbsinfopage.cpp index af65f9e5be6..794d984a613 100644 --- a/src/plugins/qbsprojectmanager/qbsinfopage.cpp +++ b/src/plugins/qbsprojectmanager/qbsinfopage.cpp @@ -26,7 +26,7 @@ #include "qbsinfopage.h" #include "ui_qbsinfowidget.h" -#include "qbsconstants.h" +#include "qbsprojectmanagerconstants.h" #include diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index e576f52778f..112572b73e1 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -27,8 +27,8 @@ #include "ui_qbsprofilessettingswidget.h" #include "customqbspropertiesdialog.h" -#include "qbsconstants.h" #include "qbsprojectmanager.h" +#include "qbsprojectmanagerconstants.h" #include "qbsprojectmanagersettings.h" #include diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro index cd2e5d16d83..94afeae5a76 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro @@ -41,8 +41,7 @@ HEADERS = \ qbsprojectmanagerplugin.h \ qbsprojectmanagersettings.h \ qbsprojectparser.h \ - qbsrunconfiguration.h \ - qbsconstants.h + qbsrunconfiguration.h SOURCES = \ customqbspropertiesdialog.cpp \ diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs index 7b0434920e2..98ce172aa13 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs @@ -75,7 +75,6 @@ QtcPlugin { "qbscleanstep.cpp", "qbscleanstep.h", "qbscleanstepconfigwidget.ui", - "qbsconstants.h", "qbsdeployconfigurationfactory.cpp", "qbsdeployconfigurationfactory.h", "qbsinfopage.cpp", diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h index 05667062f53..36fd3cfb28e 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h @@ -65,6 +65,28 @@ const char QBS_FORCE_PROBES_KEY[] = "qbspm.forceProbes"; static const char QBS_GROUP_ICON[] = ":/qbsprojectmanager/images/groups.png"; static const char QBS_PRODUCT_OVERLAY_ICON[] = ":/qbsprojectmanager/images/productgear.png"; +// Toolchain related settings: +const char QBS_TARGETOS[] = "qbs.targetOS"; +const char QBS_SYSROOT[] = "qbs.sysroot"; +const char QBS_ARCHITECTURE[] = "qbs.architecture"; +const char QBS_TOOLCHAIN[] = "qbs.toolchain"; +const char CPP_TOOLCHAINPATH[] = "cpp.toolchainInstallPath"; +const char CPP_TOOLCHAINPREFIX[] = "cpp.toolchainPrefix"; +const char CPP_COMPILERNAME[] = "cpp.compilerName"; +const char CPP_CXXCOMPILERNAME[] = "cpp.cxxCompilerName"; +const char CPP_PLATFORMCOMMONCOMPILERFLAGS[] = "cpp.platformCommonCompilerFlags"; +const char CPP_PLATFORMLINKERFLAGS[] = "cpp.platformLinkerFlags"; +const char CPP_PLATFORMPATH[] = "cpp.platformPath"; +const char CPP_XCODESDKNAME[] = "cpp.xcodeSdkName"; +const char CPP_XCODESDKVERSION[] = "cpp.xcodeSdkVersion"; + +// Settings page +const char QBS_SETTINGS_CATEGORY[] = "YM.qbs"; +const char QBS_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("QbsProjectManager", "Qbs"); +const char QBS_SETTINGS_CATEGORY_ICON[] = ":/projectexplorer/images/build.png"; + +const char QBS_PROPERTIES_KEY_FOR_KITS[] = "QbsProjectManager.qbs-properties"; + const char QBS_PROFILING_ENV[] = "QTC_QBS_PROFILING"; } // namespace Constants From a102ee0729c9de0b72f766bc1de9b707df2cb0b2 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 25 Oct 2016 11:40:32 +0200 Subject: [PATCH 52/81] Clang: Allow avoiding supportive translation unit for debugging ...by providing QTC_CLANG_NO_SUPPORTIVE_TRANSLATIONUNIT=1 in the run environment. Change-Id: If4e92521dfbc2752e4446e7037876d28683c1f66 Reviewed-by: David Schulz --- .../ipcsource/clangcodemodelserver.cpp | 20 ++++++++++++++++--- .../ipcsource/clangcodemodelserver.h | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp index 62070b37b0b..3cbbd494453 100644 --- a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp @@ -55,6 +55,12 @@ #include #include +static bool useSupportiveTranslationUnit() +{ + static bool use = !qEnvironmentVariableIntValue("QTC_CLANG_NO_SUPPORTIVE_TRANSLATIONUNIT"); + return use; +} + namespace ClangBackEnd { ClangCodeModelServer::ClangCodeModelServer() @@ -116,9 +122,7 @@ void ClangCodeModelServer::updateTranslationUnitsForEditor(const UpdateTranslati // we might block the translation unit for a completion request // that comes right after this message. updateDocumentAnnotationsTimer.start(0); - QTimer::singleShot(0, [this, updateDocuments](){ - startInitializingSupportiveTranslationUnits(updateDocuments); - }); + delayStartInitializingSupportiveTranslationUnits(updateDocuments); } } catch (const std::exception &exception) { qWarning() << "Error in ClangCodeModelServer::updateTranslationUnitsForEditor:" << exception.what(); @@ -329,6 +333,16 @@ void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector &documents) +{ + if (useSupportiveTranslationUnit()) { + QTimer::singleShot(0, [this, documents](){ + startInitializingSupportiveTranslationUnits(documents); + }); + } +} + void ClangCodeModelServer::startInitializingSupportiveTranslationUnits( const std::vector &documents) { diff --git a/src/tools/clangbackend/ipcsource/clangcodemodelserver.h b/src/tools/clangbackend/ipcsource/clangcodemodelserver.h index b03b4327faf..2622c01db69 100644 --- a/src/tools/clangbackend/ipcsource/clangcodemodelserver.h +++ b/src/tools/clangbackend/ipcsource/clangcodemodelserver.h @@ -72,6 +72,7 @@ private: void startDocumentAnnotationsTimerIfFileIsNotOpenAsDocument(const Utf8String &filePath); void processInitialJobsForDocuments(const std::vector &documents); + void delayStartInitializingSupportiveTranslationUnits(const std::vector &documents); void startInitializingSupportiveTranslationUnits(const std::vector &documents); void processJobsForDirtyAndVisibleDocuments(); From ab03ddae252a36e6c168c85974ae2b80b59e1894 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 26 Oct 2016 09:36:45 +0200 Subject: [PATCH 53/81] Doc: List keyboard shortcuts for opening projects There are new shortcuts for opening top projects in the list of recently opened projects. Change-Id: I70f2b29a72e3cf26940d35428ac9ec3fe7537613 Reviewed-by: Eike Ziller --- .../projects/creator-projects-opening.qdoc | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/doc/src/projects/creator-projects-opening.qdoc b/doc/src/projects/creator-projects-opening.qdoc index 774f875b621..7c880d64482 100644 --- a/doc/src/projects/creator-projects-opening.qdoc +++ b/doc/src/projects/creator-projects-opening.qdoc @@ -75,14 +75,36 @@ \list 1 - \li Select \uicontrol File > \uicontrol{Open File or Project} and select the project - to open. + \li Select \uicontrol File > \uicontrol {Open File or Project} + (\key Ctrl+O or \key Cmd+O on \macos) and select the project to + open. \li In the \uicontrol {Configure Project} tab, select kits for building and running your project, and click \uicontrol {Configure Project}. \endlist + You can use the following keyboard shortcuts to open projects, depending on + the mode you are currently in: + + \list + + \li In all modes, select \key Ctrl+O (\key Cmd+O on \macos) to open the + \uicontrol {Open File} dialog, where you can select a project file + to open a project. + + \li In all modes, except the \uicontrol Help mode, select + \key Ctrl+Shift+O (\key Cmd+Shift+O on \macos) to open the + \uicontrol {Load Project} dialog, where you can select a project + file to open a project. + + \li In the \uicontrol Welcome mode, \uicontrol Projects tab, select + \key Ctrl+Shift+number (\key Cmd+Shift+number on \macos), where + the number is the number of a project in the list of recently opened + projects. + + \endlist + \QC parses all the source files in the project and performs a semantic analysis to build up the information that it needs for functions such as navigation and finding usages. A progress bar is displayed during parsing. From 99a82f7035f7bb9230d30f151f56c61085df4c13 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 24 Oct 2016 09:00:20 +0200 Subject: [PATCH 54/81] AutoTest: Simplify settingspage creation for frameworks Change-Id: Icb262e48a7980748cb0f03e578a49ca26d0c6b29 Reviewed-by: David Schulz --- src/plugins/autotest/autotest.pro | 3 +- src/plugins/autotest/autotest.qbs | 1 + src/plugins/autotest/autotestconstants.h | 2 +- src/plugins/autotest/gtest/gtestframework.cpp | 4 +- src/plugins/autotest/gtest/gtestframework.h | 2 +- .../autotest/gtest/gtestsettingspage.cpp | 14 ++-- .../autotest/gtest/gtestsettingspage.h | 7 +- src/plugins/autotest/itestframework.h | 5 +- src/plugins/autotest/itestsettingspage.h | 70 +++++++++++++++++++ .../autotest/qtest/qttestframework.cpp | 4 +- src/plugins/autotest/qtest/qttestframework.h | 2 +- .../autotest/qtest/qttestsettingspage.cpp | 14 ++-- .../autotest/qtest/qttestsettingspage.h | 7 +- src/plugins/autotest/testframeworkmanager.cpp | 2 +- 14 files changed, 99 insertions(+), 38 deletions(-) create mode 100644 src/plugins/autotest/itestsettingspage.h diff --git a/src/plugins/autotest/autotest.pro b/src/plugins/autotest/autotest.pro index 07d38fdab3a..9cf411299d4 100644 --- a/src/plugins/autotest/autotest.pro +++ b/src/plugins/autotest/autotest.pro @@ -102,7 +102,8 @@ HEADERS += \ quick/quicktestvisitors.h \ quick/quicktestframework.h \ testframeworkmanager.h \ - testrunconfiguration.h + testrunconfiguration.h \ + itestsettingspage.h RESOURCES += \ autotest.qrc diff --git a/src/plugins/autotest/autotest.qbs b/src/plugins/autotest/autotest.qbs index fcef33b454c..9552909ed7d 100644 --- a/src/plugins/autotest/autotest.qbs +++ b/src/plugins/autotest/autotest.qbs @@ -72,6 +72,7 @@ QtcPlugin { "itestparser.h", "itestframework.h", "iframeworksettings.h", + "itestsettingspage.h", "testframeworkmanager.cpp", "testframeworkmanager.h", "testrunconfiguration.h" diff --git a/src/plugins/autotest/autotestconstants.h b/src/plugins/autotest/autotestconstants.h index b4bef1400c1..7c1aaa0dac2 100644 --- a/src/plugins/autotest/autotestconstants.h +++ b/src/plugins/autotest/autotestconstants.h @@ -42,7 +42,7 @@ const char AUTOTEST_SETTINGS_CATEGORY[] = "ZY.Tests"; const char AUTOTEST_SETTINGS_TR[] = QT_TRANSLATE_NOOP("AutoTest", "Test Settings"); const char FRAMEWORK_PREFIX[] = "AutoTest.Framework."; - +const char SETTINGSPAGE_PREFIX[] = "A.AutoTest."; const char SETTINGSGROUP[] = "Autotest"; } // namespace Constants } // namespace Autotest diff --git a/src/plugins/autotest/gtest/gtestframework.cpp b/src/plugins/autotest/gtest/gtestframework.cpp index 4ec6cd9962d..3117e9d3f1b 100644 --- a/src/plugins/autotest/gtest/gtestframework.cpp +++ b/src/plugins/autotest/gtest/gtestframework.cpp @@ -61,9 +61,9 @@ IFrameworkSettings *GTestFramework::createFrameworkSettings() const return new GTestSettings; } -Core::IOptionsPage *GTestFramework::createSettingsPage(QSharedPointer settings) const +ITestSettingsPage *GTestFramework::createSettingsPage(QSharedPointer settings) const { - return new GTestSettingsPage(settings); + return new GTestSettingsPage(settings, this); } bool GTestFramework::hasFrameworkSettings() const diff --git a/src/plugins/autotest/gtest/gtestframework.h b/src/plugins/autotest/gtest/gtestframework.h index 6645da15336..42c91118f52 100644 --- a/src/plugins/autotest/gtest/gtestframework.h +++ b/src/plugins/autotest/gtest/gtestframework.h @@ -37,7 +37,7 @@ public: const char *name() const override; unsigned priority() const override; IFrameworkSettings *createFrameworkSettings() const override; - Core::IOptionsPage *createSettingsPage(QSharedPointer settings) const override; + ITestSettingsPage *createSettingsPage(QSharedPointer settings) const override; bool hasFrameworkSettings() const override; protected: ITestParser *createTestParser() const override; diff --git a/src/plugins/autotest/gtest/gtestsettingspage.cpp b/src/plugins/autotest/gtest/gtestsettingspage.cpp index 77b34d0d45d..932fc947dea 100644 --- a/src/plugins/autotest/gtest/gtestsettingspage.cpp +++ b/src/plugins/autotest/gtest/gtestsettingspage.cpp @@ -65,18 +65,14 @@ GTestSettings GTestSettingsWidget::settings() const return result; } -GTestSettingsPage::GTestSettingsPage(QSharedPointer settings) - : m_settings(qSharedPointerCast(settings)), m_widget(0) +GTestSettingsPage::GTestSettingsPage(QSharedPointer settings, + const ITestFramework *framework) + : ITestSettingsPage(framework), + m_settings(qSharedPointerCast(settings)), + m_widget(0) { - setId("A.AutoTest.10.GTest"); // FIXME setDisplayName(QCoreApplication::translate("GTestFramework", GTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); - setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); - setDisplayCategory(QCoreApplication::translate("AutoTest", Constants::AUTOTEST_SETTINGS_TR)); -} - -GTestSettingsPage::~GTestSettingsPage() -{ } QWidget *GTestSettingsPage::widget() diff --git a/src/plugins/autotest/gtest/gtestsettingspage.h b/src/plugins/autotest/gtest/gtestsettingspage.h index cdef183de09..c17753be4b5 100644 --- a/src/plugins/autotest/gtest/gtestsettingspage.h +++ b/src/plugins/autotest/gtest/gtestsettingspage.h @@ -27,7 +27,7 @@ #include "ui_gtestsettingspage.h" -#include +#include "../itestsettingspage.h" #include @@ -50,12 +50,11 @@ private: Ui::GTestSettingsPage m_ui; }; -class GTestSettingsPage : public Core::IOptionsPage +class GTestSettingsPage : public ITestSettingsPage { Q_OBJECT public: - explicit GTestSettingsPage(QSharedPointer settings); - ~GTestSettingsPage(); + GTestSettingsPage(QSharedPointer settings, const ITestFramework *framework); QWidget *widget() override; void apply() override; diff --git a/src/plugins/autotest/itestframework.h b/src/plugins/autotest/itestframework.h index d752da02506..ae6e0ec437c 100644 --- a/src/plugins/autotest/itestframework.h +++ b/src/plugins/autotest/itestframework.h @@ -28,12 +28,11 @@ #include "testtreeitem.h" #include "itestparser.h" -namespace Core { class IOptionsPage; } - namespace Autotest { namespace Internal { class IFrameworkSettings; +class ITestSettingsPage; class ITestFramework { @@ -49,7 +48,7 @@ public: virtual unsigned priority() const = 0; // should this be modifyable? virtual bool hasFrameworkSettings() const { return false; } virtual IFrameworkSettings *createFrameworkSettings() const { return 0; } - virtual Core::IOptionsPage *createSettingsPage(QSharedPointer settings) const + virtual ITestSettingsPage *createSettingsPage(QSharedPointer settings) const { Q_UNUSED(settings); return 0; diff --git a/src/plugins/autotest/itestsettingspage.h b/src/plugins/autotest/itestsettingspage.h new file mode 100644 index 00000000000..cce44e8bc3f --- /dev/null +++ b/src/plugins/autotest/itestsettingspage.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "autotestconstants.h" +#include "itestframework.h" + +#include + +namespace Autotest { +namespace Internal { + +class IFrameworkSettings; + +class ITestSettingsPage : public Core::IOptionsPage +{ +public: + explicit ITestSettingsPage(const ITestFramework *framework) + { + setId(Core::Id(Constants::SETTINGSPAGE_PREFIX).withSuffix( + QString("%1.%2").arg(framework->priority()).arg(QLatin1String(framework->name())))); + setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); + setDisplayCategory(QCoreApplication::translate("AutoTest", + Constants::AUTOTEST_SETTINGS_TR)); + } + + virtual ~ITestSettingsPage() {} + +private: + void setId(Core::Id id) + { + Core::IOptionsPage::setId(id); + } + + void setCategory(Core::Id category) + { + Core::IOptionsPage::setCategory(category); + } + + void setDisplayCategory(const QString &displayCategory) + { + Core::IOptionsPage::setDisplayCategory(displayCategory); + } +}; + +} // namespace Internal +} // namespace Autotest diff --git a/src/plugins/autotest/qtest/qttestframework.cpp b/src/plugins/autotest/qtest/qttestframework.cpp index 8bcefb248b0..25250e83bc6 100644 --- a/src/plugins/autotest/qtest/qttestframework.cpp +++ b/src/plugins/autotest/qtest/qttestframework.cpp @@ -51,9 +51,9 @@ IFrameworkSettings *QtTestFramework::createFrameworkSettings() const return new QtTestSettings; } -Core::IOptionsPage *QtTestFramework::createSettingsPage(QSharedPointer settings) const +ITestSettingsPage *QtTestFramework::createSettingsPage(QSharedPointer settings) const { - return new QtTestSettingsPage(settings); + return new QtTestSettingsPage(settings, this); } bool QtTestFramework::hasFrameworkSettings() const diff --git a/src/plugins/autotest/qtest/qttestframework.h b/src/plugins/autotest/qtest/qttestframework.h index a6cfcb9f2a5..e9a181591ff 100644 --- a/src/plugins/autotest/qtest/qttestframework.h +++ b/src/plugins/autotest/qtest/qttestframework.h @@ -37,7 +37,7 @@ public: const char *name() const override; unsigned priority() const override; IFrameworkSettings *createFrameworkSettings() const override; - Core::IOptionsPage *createSettingsPage(QSharedPointer settings) const override; + ITestSettingsPage *createSettingsPage(QSharedPointer settings) const override; bool hasFrameworkSettings() const override; protected: diff --git a/src/plugins/autotest/qtest/qttestsettingspage.cpp b/src/plugins/autotest/qtest/qttestsettingspage.cpp index fbaf252fdaf..54e081a02d3 100644 --- a/src/plugins/autotest/qtest/qttestsettingspage.cpp +++ b/src/plugins/autotest/qtest/qttestsettingspage.cpp @@ -86,18 +86,14 @@ QtTestSettings QtTestSettingsWidget::settings() const return result; } -QtTestSettingsPage::QtTestSettingsPage(QSharedPointer settings) - : m_settings(qSharedPointerCast(settings)), m_widget(0) +QtTestSettingsPage::QtTestSettingsPage(QSharedPointer settings, + const ITestFramework *framework) + : ITestSettingsPage(framework), + m_settings(qSharedPointerCast(settings)), + m_widget(0) { - setId("A.AutoTest.1.QtTest"); // FIXME setDisplayName(QCoreApplication::translate("QtTestFramework", QtTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); - setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); - setDisplayCategory(QCoreApplication::translate("AutoTest", Constants::AUTOTEST_SETTINGS_TR)); -} - -QtTestSettingsPage::~QtTestSettingsPage() -{ } QWidget *QtTestSettingsPage::widget() diff --git a/src/plugins/autotest/qtest/qttestsettingspage.h b/src/plugins/autotest/qtest/qttestsettingspage.h index 2b5c64d5340..abfca142c96 100644 --- a/src/plugins/autotest/qtest/qttestsettingspage.h +++ b/src/plugins/autotest/qtest/qttestsettingspage.h @@ -27,7 +27,7 @@ #include "ui_qttestsettingspage.h" -#include +#include "../itestsettingspage.h" #include @@ -50,12 +50,11 @@ private: Ui::QtTestSettingsPage m_ui; }; -class QtTestSettingsPage : public Core::IOptionsPage +class QtTestSettingsPage : public ITestSettingsPage { Q_OBJECT public: - explicit QtTestSettingsPage(QSharedPointer settings); - ~QtTestSettingsPage(); + QtTestSettingsPage(QSharedPointer settings, const ITestFramework *framework); QWidget *widget() override; void apply() override; diff --git a/src/plugins/autotest/testframeworkmanager.cpp b/src/plugins/autotest/testframeworkmanager.cpp index 0b65a79e179..16a33d74251 100644 --- a/src/plugins/autotest/testframeworkmanager.cpp +++ b/src/plugins/autotest/testframeworkmanager.cpp @@ -29,12 +29,12 @@ #include "iframeworksettings.h" #include "itestframework.h" #include "itestparser.h" +#include "itestsettingspage.h" #include "testrunner.h" #include "testsettings.h" #include "testtreeitem.h" #include "testtreemodel.h" -#include #include #include From 2b27f30538d165a14a5029580f722c8e9d417812 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 24 Oct 2016 12:51:03 +0200 Subject: [PATCH 55/81] AutoTest: Reduce re-parsings while editing single file Change-Id: If3dbcb3026733873881921cb9208b7c9da33c8de Reviewed-by: David Schulz --- src/plugins/autotest/testcodeparser.cpp | 49 ++++++++++++++++++++----- src/plugins/autotest/testcodeparser.h | 16 +++++--- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index a30cd608a51..2cbf9f703e5 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -45,7 +45,6 @@ #include #include #include -#include static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.testcodeparser") @@ -54,13 +53,7 @@ namespace Internal { TestCodeParser::TestCodeParser(TestTreeModel *parent) : QObject(parent), - m_model(parent), - m_codeModelParsing(false), - m_fullUpdatePostponed(false), - m_partialUpdatePostponed(false), - m_dirty(false), - m_singleShotScheduled(false), - m_parserState(Disabled) + m_model(parent) { // connect to ProgressManager to postpone test parsing when CppModelManager is parsing auto progressManager = qobject_cast(Core::ProgressManager::instance()); @@ -77,6 +70,8 @@ TestCodeParser::TestCodeParser(TestTreeModel *parent) emit testParseResultReady(m_futureWatcher.resultAt(index)); }); connect(this, &TestCodeParser::parsingFinished, this, &TestCodeParser::releaseParserInternals); + m_reparseTimer.setSingleShot(true); + connect(&m_reparseTimer, &QTimer::timeout, this, &TestCodeParser::parsePostponedFiles); } TestCodeParser::~TestCodeParser() @@ -111,7 +106,8 @@ void TestCodeParser::setState(State state) } else if (m_partialUpdatePostponed) { m_partialUpdatePostponed = false; qCDebug(LOG) << "calling scanForTests with postponed files (setState)"; - scanForTests(m_postponedFiles.toList()); + if (!m_reparseTimer.isActive()) + scanForTests(m_postponedFiles.toList()); } } } @@ -267,6 +263,30 @@ bool TestCodeParser::postponed(const QStringList &fileList) { switch (m_parserState) { case Idle: + if (fileList.size() == 1) { + if (m_reparseTimerTimedOut) + return false; + switch (m_postponedFiles.size()) { + case 0: + m_postponedFiles.insert(fileList.first()); + m_reparseTimer.setInterval(1000); + m_reparseTimer.start(); + return true; + case 1: + if (m_postponedFiles.contains(fileList.first())) { + m_reparseTimer.start(); + return true; + } + // intentional fall-through + default: + m_postponedFiles.insert(fileList.first()); + m_reparseTimer.stop(); + m_reparseTimer.setInterval(0); + m_reparseTimerTimedOut = false; + m_reparseTimer.start(); + return true; + } + } return false; case PartialParse: case FullParse: @@ -313,6 +333,8 @@ void TestCodeParser::scanForTests(const QStringList &fileList) if (postponed(fileList)) return; + m_reparseTimer.stop(); + m_reparseTimerTimedOut = false; m_postponedFiles.clear(); bool isFullParse = fileList.isEmpty(); QStringList list; @@ -436,7 +458,8 @@ void TestCodeParser::onPartialParsingFinished() } else if (m_partialUpdatePostponed) { m_partialUpdatePostponed = false; qCDebug(LOG) << "calling scanForTests with postponed files (onPartialParsingFinished)"; - scanForTests(m_postponedFiles.toList()); + if (!m_reparseTimer.isActive()) + scanForTests(m_postponedFiles.toList()); } else { m_dirty |= m_codeModelParsing; if (m_dirty) { @@ -454,6 +477,12 @@ void TestCodeParser::onPartialParsingFinished() } } +void TestCodeParser::parsePostponedFiles() +{ + m_reparseTimerTimedOut = true; + scanForTests(m_postponedFiles.toList()); +} + void TestCodeParser::releaseParserInternals() { for (ITestParser *parser : m_testCodeParsers) diff --git a/src/plugins/autotest/testcodeparser.h b/src/plugins/autotest/testcodeparser.h index ac095c14aac..9967c3d08b8 100644 --- a/src/plugins/autotest/testcodeparser.h +++ b/src/plugins/autotest/testcodeparser.h @@ -32,6 +32,7 @@ #include #include #include +#include namespace Core { class Id; @@ -89,19 +90,22 @@ private: void onAllTasksFinished(Core::Id type); void onFinished(); void onPartialParsingFinished(); + void parsePostponedFiles(); void releaseParserInternals(); TestTreeModel *m_model; - bool m_codeModelParsing; - bool m_fullUpdatePostponed; - bool m_partialUpdatePostponed; - bool m_dirty; - bool m_singleShotScheduled; + bool m_codeModelParsing = false; + bool m_fullUpdatePostponed = false; + bool m_partialUpdatePostponed = false; + bool m_dirty = false; + bool m_singleShotScheduled = false; + bool m_reparseTimerTimedOut = false; QSet m_postponedFiles; - State m_parserState; + State m_parserState = Disabled; QFutureWatcher m_futureWatcher; QVector m_testCodeParsers; // ptrs are still owned by TestFrameworkManager + QTimer m_reparseTimer; }; } // namespace Internal From cbc4ee0af6cde378ebb8f17158ae476b335497bd Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 25 Oct 2016 14:30:51 +0200 Subject: [PATCH 56/81] AutoTest: Fix enabled state of global Tests menu If tests are running the Tests menu's (current) items are all disabled which led to having the menu disabled as well. Ensure to have the menu enabled regardless the sub items' state. Change-Id: I561f1eb75637f03a27df012129455e06be38ea87 Reviewed-by: David Schulz --- src/plugins/autotest/autotestplugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/autotest/autotestplugin.cpp b/src/plugins/autotest/autotestplugin.cpp index abde0d4d69a..976bee11c85 100644 --- a/src/plugins/autotest/autotestplugin.cpp +++ b/src/plugins/autotest/autotestplugin.cpp @@ -95,6 +95,7 @@ void AutotestPlugin::initializeMenuEntries() { ActionContainer *menu = ActionManager::createMenu(Constants::MENU_ID); menu->menu()->setTitle(tr("&Tests")); + menu->setOnAllDisabledBehavior(ActionContainer::Show); QAction *action = new QAction(tr("Run &All Tests"), this); Command *command = ActionManager::registerAction(action, Constants::ACTION_RUN_ALL_ID); From 492c0cd00496473f2579d1fbe12dad75092aa1d9 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 26 Oct 2016 10:22:38 +0200 Subject: [PATCH 57/81] AutoTest: Make separating line of test results slightly darker Especially for darker themes the brighter color was quite too aggressive. Change-Id: Ib37e7524c035e300768159e0950e593036c7f6a4 Reviewed-by: David Schulz --- src/plugins/autotest/testresultdelegate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/autotest/testresultdelegate.cpp b/src/plugins/autotest/testresultdelegate.cpp index 66365c8780a..b39f232fb5c 100644 --- a/src/plugins/autotest/testresultdelegate.cpp +++ b/src/plugins/autotest/testresultdelegate.cpp @@ -130,7 +130,7 @@ void TestResultDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op } painter->setClipRect(opt.rect); - painter->setPen(opt.palette.midlight().color()); + painter->setPen(opt.palette.mid().color()); painter->drawLine(0, opt.rect.bottom(), opt.rect.right(), opt.rect.bottom()); painter->restore(); } From 77f68653b045802e76a30ec8703533757cf5e288 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 26 Oct 2016 11:08:44 +0200 Subject: [PATCH 58/81] ScxmlEditor: Themable "Pan" icon Change-Id: I2041801fb8d300515c3bea26bccda0c606cd2abe Reviewed-by: Alessandro Portale --- src/plugins/scxmleditor/common/common.qrc | 1 + .../scxmleditor/common/images/icon-pan.png | Bin 783 -> 199 bytes .../scxmleditor/common/images/icon-pan@2x.png | Bin 0 -> 240 bytes .../plugin_interface/actionhandler.cpp | 2 +- src/tools/icons/qtcreatoricons.svg | 45 ++++++++++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/plugins/scxmleditor/common/images/icon-pan@2x.png diff --git a/src/plugins/scxmleditor/common/common.qrc b/src/plugins/scxmleditor/common/common.qrc index 78c35d708e9..df4997beca5 100644 --- a/src/plugins/scxmleditor/common/common.qrc +++ b/src/plugins/scxmleditor/common/common.qrc @@ -26,6 +26,7 @@ images/icon-export-canvas.png images/icon-export-canvas@2x.png images/icon-pan.png + images/icon-pan@2x.png images/initial.png images/more_colors.png images/navigator.png diff --git a/src/plugins/scxmleditor/common/images/icon-pan.png b/src/plugins/scxmleditor/common/images/icon-pan.png index e157880417dd0a7feb217604c65e65815f01072b..753b3bf02ba1d4338fa20e07a2ef799bb581343e 100644 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#KuFMa9I#_U_%g zZ{NQC`}ZF_c<|7nLx&F^zI*rXy?giW-@pIh!Gq7AKY#i1<^TWx*}D&}VPIeg@^oc8{q literal 783 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4rT@hhU+WOo?>8NYzXiPab;s;`~Uwx8;t=6 z2Rk<}8xJo#FE1A_A2+`MH@_f(!44b4JyNtY$tP+osiny|>l(MR{vL>I3rhuBZ zn7X!vww{cxp`5M-tDXhBv8Ak;otU|es)e1rm9w~=lb&k`ziSw)UzAEnyjEnIW^|@n zY^Gj9x?^I2Mrt*GTE263vq)L5R7Iac)daQLNxHSOd72jpbnFFC5b z^nlg!!&b|WYp>WBzIuP$>Qg3bcUP=Gn700C)cP~F8}`<2JRY;@oZGgG0ozX&?zkAS z>vH72Ye@%hWF5WId-PWE$-6bD?lhmd-*Wyz_r*sOy~URuU|?WSED7=pW?*3B3K`$7YE1iSL?ExA?u zCN4^Hs@pez(W1b*SyN4Y|dE0 zvFOJf_b@{()2q>evsxuh*QD$XI&dIPKv$r03iG7K1I}#9b}UiN~((hb* sS)BN#T>E + + + + + + + Date: Tue, 25 Oct 2016 17:02:18 +0200 Subject: [PATCH 59/81] Change log: Small addition and fixes Change-Id: If0ac153b886cf23fd3e8a03541bca99caf1cf889 Reviewed-by: Leena Miettinen --- dist/changes-4.2.0.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dist/changes-4.2.0.md b/dist/changes-4.2.0.md index d44ae8a81fa..f437be4322a 100644 --- a/dist/changes-4.2.0.md +++ b/dist/changes-4.2.0.md @@ -91,7 +91,7 @@ QML Profiler Qt Quick Designer -* Added completion expression editor +* Added completion to expression editor * Added menu for editing `when` condition of states * Added editor for managing C++ backend objects * Added reformatting of `.ui.qml` files on save @@ -106,9 +106,11 @@ Qt Quick Designer Diff Viewer -* Added local diff for modified files in Qt Creator (`Diff` > - `Diff Current File`, `Diff` > `Diff All Modified Files`) +* Added local diff for modified files in Qt Creator (`Tools` > `Diff` > + `Diff Current File`, `Tools` > `Diff` > `Diff Open Files`) (QTCREATORBUG-9732) +* Added option to diff files when they changed on disk + (QTCREATORBUG-1531) * Fixed that reload prompt was shown when reverting change Version Control Systems From d54da12af90242d168d883212c0ef27f83c7f4c8 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 26 Oct 2016 12:38:12 +0200 Subject: [PATCH 60/81] CPlusPlus, Utils: Move namespace icon from CPlusPlus to Utils ...so that it can be used in the ScxmlEditor plugin Change-Id: I0e0ed050f7765bcc901db3bb2c3273456a228b5e Reviewed-by: Alessandro Portale --- src/libs/cplusplus/Icons.cpp | 2 +- src/libs/cplusplus/cplusplus.qrc | 2 -- .../{cplusplus => utils}/images/namespace.png | Bin .../{cplusplus => utils}/images/namespace@2x.png | Bin src/libs/utils/utils.qrc | 2 ++ src/plugins/scxmleditor/common/common.qrc | 1 - .../scxmleditor/common/images/fullnamespace.png | Bin 108 -> 0 bytes .../plugin_interface/actionhandler.cpp | 2 +- src/tools/icons/qtcreatoricons.svg | 2 +- 9 files changed, 5 insertions(+), 6 deletions(-) rename src/libs/{cplusplus => utils}/images/namespace.png (100%) rename src/libs/{cplusplus => utils}/images/namespace@2x.png (100%) delete mode 100644 src/plugins/scxmleditor/common/images/fullnamespace.png diff --git a/src/libs/cplusplus/Icons.cpp b/src/libs/cplusplus/Icons.cpp index 7a539c67eb8..27e4b92d09f 100644 --- a/src/libs/cplusplus/Icons.cpp +++ b/src/libs/cplusplus/Icons.cpp @@ -215,7 +215,7 @@ QIcon Icons::iconForType(IconType type) } case NamespaceIconType: { const static QIcon icon(Icon({ - {QLatin1String(":/codemodel/images/namespace.png"), Theme::IconsCodeModelKeywordColor} + {QLatin1String(":/utils/images/namespace.png"), Theme::IconsCodeModelKeywordColor} }, Icon::Tint).icon()); return icon; } diff --git a/src/libs/cplusplus/cplusplus.qrc b/src/libs/cplusplus/cplusplus.qrc index d0135fdee80..32d9a712495 100644 --- a/src/libs/cplusplus/cplusplus.qrc +++ b/src/libs/cplusplus/cplusplus.qrc @@ -8,8 +8,6 @@ images/keyword@2x.png images/macro.png images/macro@2x.png - images/namespace.png - images/namespace@2x.png images/signal.png images/signal@2x.png images/slot.png diff --git a/src/libs/cplusplus/images/namespace.png b/src/libs/utils/images/namespace.png similarity index 100% rename from src/libs/cplusplus/images/namespace.png rename to src/libs/utils/images/namespace.png diff --git a/src/libs/cplusplus/images/namespace@2x.png b/src/libs/utils/images/namespace@2x.png similarity index 100% rename from src/libs/cplusplus/images/namespace@2x.png rename to src/libs/utils/images/namespace@2x.png diff --git a/src/libs/utils/utils.qrc b/src/libs/utils/utils.qrc index dd551f21fc2..9c6e7c6a08a 100644 --- a/src/libs/utils/utils.qrc +++ b/src/libs/utils/utils.qrc @@ -166,5 +166,7 @@ images/zoomout_overlay@2x.png images/fittoview.png images/fittoview@2x.png + images/namespace.png + images/namespace@2x.png diff --git a/src/plugins/scxmleditor/common/common.qrc b/src/plugins/scxmleditor/common/common.qrc index df4997beca5..7981a023097 100644 --- a/src/plugins/scxmleditor/common/common.qrc +++ b/src/plugins/scxmleditor/common/common.qrc @@ -21,7 +21,6 @@ images/colorthemes.png images/final.png images/font_color.png - images/fullnamespace.png images/history.png images/icon-export-canvas.png images/icon-export-canvas@2x.png diff --git a/src/plugins/scxmleditor/common/images/fullnamespace.png b/src/plugins/scxmleditor/common/images/fullnamespace.png deleted file mode 100644 index ee890ccf5b637ab75d4a28c491223e8cd2103676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;IMrH;E2G1=owlgp=um$*pxH2#>{Q39qWV1pr z0|NtNNswPKgTu2MX$%YuBAzaeAso@k2@0H7PCQmP5#lbu!0?TkjsN50^~V@M#<=>q JtaD0e0sv5a9b5na diff --git a/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp b/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp index dfa715be8e7..660293186f6 100644 --- a/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp +++ b/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp @@ -57,7 +57,7 @@ ActionHandler::ActionHandler(QObject *parent) { Utils::Icon({{":/utils/images/editpaste.png", Utils::Theme::IconsBaseColor}}), AH::tr("Paste"), AH::tr("Paste (Ctrl + V)"), "Ctrl+V", false }, { Utils::Icons::SNAPSHOT_TOOLBAR, AH::tr("Screenshot"), AH::tr("Screenshot (Ctrl + Shift + C)"), "Ctrl+Shift+C", false }, { Utils::Icon({{":/scxmleditor/images/icon-export-canvas.png", Utils::Theme::IconsBaseColor}}), AH::tr("Export to Image"), AH::tr("Export to Image"), "Ctrl+Shift+E", false }, - { Utils::Icon(":/scxmleditor/images/fullnamespace.png"), AH::tr("Toggle Full Namespace"), AH::tr("Toggle Full Namespace"), "Ctrl+Shift+N", true }, + { Utils::Icon({{":/utils/images/namespace.png", Utils::Theme::IconsBaseColor}}), AH::tr("Toggle Full Namespace"), AH::tr("Toggle Full Namespace"), "Ctrl+Shift+N", true }, { Utils::Icon({{":/scxmleditor/images/align_left.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Left"), AH::tr("Align Left (Ctrl+L,1)"), "Ctrl+L,1", false }, { Utils::Icon({{":/scxmleditor/images/align_right.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Right"), AH::tr("Align Right (Ctrl+L,2)"), "Ctrl+L,2", false }, diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index e0f41d12d98..7d55635c446 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -4775,7 +4775,7 @@ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + id="src/libs/utils/images/namespace"> Date: Wed, 26 Oct 2016 10:47:21 +0200 Subject: [PATCH 61/81] QmlProfiler: Don't delete QObjects from outside their home thread We cannot do this because the parent object needs to be notified. Change-Id: Id70de2acea4aa241ea0e85b5b02327e1f91b7e68 Reviewed-by: Christian Stenger --- src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index e004d229a26..4c933040e64 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -344,7 +344,7 @@ void QmlProfilerModelManager::save(const QString &filename) writer->saveQtd(file); else writer->saveQzt(file); - delete writer; + writer->deleteLater(); file->deleteLater(); }); From ca6f37f3bde21cd5b5061fb969eb468bd6315ddb Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 25 Oct 2016 14:00:18 +0200 Subject: [PATCH 62/81] SVN: Fix topic Use svnversion in favor of svn info to report the topic for SVN versions. Task-number: QTCREATORBUG-13611 Change-Id: Ia1f61c0d3b9bfb871d42449478029835c7b2796f Reviewed-by: Orgad Shaneh --- src/plugins/subversion/subversionclient.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index 93b4dcf5f40..f263669eb29 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -39,6 +39,8 @@ #include #include +#include + #include #include #include @@ -136,19 +138,20 @@ QStringList SubversionClient::addAuthenticationOptions(const VcsBaseClientSettin QString SubversionClient::synchronousTopic(const QString &repository) { QStringList args; - args << QLatin1String("info"); - const SynchronousProcessResponse result = vcsFullySynchronousExec(repository, args); + QString svnVersionBinary = vcsBinary().toString(); + int pos = svnVersionBinary.lastIndexOf('/'); + if (pos < 0) + svnVersionBinary.clear(); + else + svnVersionBinary = svnVersionBinary.left(pos + 1); + svnVersionBinary.append(HostOsInfo::withExecutableSuffix("svnversion")); + const SynchronousProcessResponse result + = vcsFullySynchronousExec(repository, FileName::fromString(svnVersionBinary), args); if (result.result != SynchronousProcessResponse::Finished) return QString(); - const QString revisionString = QLatin1String("Revision: "); - // stdOut is ASCII only (at least in those areas we care about). - foreach (const QString &line, result.stdOut().split(QLatin1Char('\n'))) { - if (line.startsWith(revisionString)) - return QString::fromLatin1("r") + line.mid(revisionString.count()); - } - return QString(); + return result.stdOut().trimmed(); } class DiffController : public DiffEditorController From 2d950574345842f6c834c7bb4196571f47b460b1 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 26 Oct 2016 13:34:44 +0200 Subject: [PATCH 63/81] QmlProfiler: Open load and save dialogs deferred This works around QTBUG-56746, by decoupling the dialog from the context menu. Change-Id: I2f13b01003a10598e6f69b14bb7eb8e9141acad8 Task-number: QTCREATORBUG-17149 Reviewed-by: Christian Stenger --- src/plugins/qmlprofiler/qmlprofilertool.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 83970db1956..72498a20d81 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -169,13 +169,13 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent) QAction *act = d->m_loadQmlTrace = new QAction(tr("Load QML Trace"), options); command = ActionManager::registerAction(act, Constants::QmlProfilerLoadActionId); - connect(act, &QAction::triggered, this, &QmlProfilerTool::showLoadDialog); + connect(act, &QAction::triggered, this, &QmlProfilerTool::showLoadDialog, Qt::QueuedConnection); options->addAction(command); act = d->m_saveQmlTrace = new QAction(tr("Save QML Trace"), options); d->m_saveQmlTrace->setEnabled(false); command = ActionManager::registerAction(act, Constants::QmlProfilerSaveActionId); - connect(act, &QAction::triggered, this, &QmlProfilerTool::showSaveDialog); + connect(act, &QAction::triggered, this, &QmlProfilerTool::showSaveDialog, Qt::QueuedConnection); options->addAction(command); d->m_recordingTimer.setInterval(100); From 759c2d562f9dac7cde25578e2039a98a93af713f Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 26 Oct 2016 13:00:12 +0200 Subject: [PATCH 64/81] Change log: Small correction Change-Id: I7524f982a1733dca253ac78c6c49b711aa0534a8 Reviewed-by: Eike Ziller --- dist/changes-4.2.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/changes-4.2.0.md b/dist/changes-4.2.0.md index f437be4322a..baba9053d88 100644 --- a/dist/changes-4.2.0.md +++ b/dist/changes-4.2.0.md @@ -65,12 +65,12 @@ C++ Support * Added preview of images to tool tip on Qt resource URLs * Added option to skip big files when indexing (QTCREATORBUG-16712) -* Added notification for parsing errors in headers * Fixed `Move Definition to Class` for functions in template class and template member functions (QTCREATORBUG-14354) * Fixed issues with `Add Declaration`, `Add Definition`, and `Move Definition Outside Class` for template functions * Clang Code Model + * Added notification for parsing errors in headers * Improved responsiveness of completion and highlighting Debugging From b383eeae82dba434deb81cfaa996fd642e5e403d Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 26 Oct 2016 15:13:41 +0300 Subject: [PATCH 65/81] Changelog: Add credits Change-Id: I56dc048d65e2665f1b5e3489b7dfff6891f67c41 Reviewed-by: Eike Ziller --- dist/changes-4.2.0.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/dist/changes-4.2.0.md b/dist/changes-4.2.0.md index baba9053d88..0f01dd61e54 100644 --- a/dist/changes-4.2.0.md +++ b/dist/changes-4.2.0.md @@ -142,3 +142,45 @@ Android * Fixed handling of minimum required API level (QTCREATORBUG-16740) Credits for these changes go to: +Aaron Barany +Alessandro Portale +Alexander Drozdov +Andre Hartmann +André Pönitz +Arnold Dumas +Christian Kandeler +Christian Stenger +Daniel Langner +Daniel Trevitz +David Schulz +Eike Ziller +Florian Apolloner +Francois Ferrand +Friedemann Kleint +Giuseppe D'Angelo +Jake Petroules +Jaroslaw Kobus +Jochen Becher +Konstantin Shtepa +Kudryavtsev Alexander +Leena Miettinen +Louai Al-Khanji +Marc Reilly +Marco Benelli +Marco Bubke +Mitch Curtis +Nazar Gerasymchuk +Nikita Baryshnikov +Nikolai Kosjar +Orgad Shaneh +Oswald Buddenhagen +Øystein Walle +Robert Löhning +Serhii Moroz +Takumi ASAKI +Tasuku Suzuki +Thomas Hartmann +Tim Jenssen +Tobias Hunger +Ulf Hermann +Vikas Pachdha From 3cfa0c0de71eee4b550206742a8831f245b3e03a Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 26 Oct 2016 12:48:17 +0200 Subject: [PATCH 66/81] Qt: Do not send dataChanged if nothing changed When setting the warning/error icon on a Qt version in the Qt options page: Do not send dataChanged if the icon has not actually changed. This fixes the selection getting broken when two Qt versions happen to have the same displayName. Task-number: QTCREATORBUG-16644 Change-Id: I7722fbc021388be237e59a59bd136c61f611ad52 Reviewed-by: Tobias Hunger --- src/plugins/qtsupport/qtoptionspage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 9667a5aa89e..30290d76987 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -116,6 +116,8 @@ public: void setIcon(const QIcon &icon) { + if (m_icon.cacheKey() == icon.cacheKey()) + return; m_icon = icon; update(); } From 63c339ffba259ba5473aa51c9b82046b49c4f94a Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 26 Oct 2016 10:32:20 +0200 Subject: [PATCH 67/81] Wizards: Generate header guard of cpp classes based on header file name Generate header guard of cpp classes based on the header file name, not based on the class name (plus the preferred extension for header files). Task-number: QTCREATORBUG-15864 Change-Id: I8c2b5d4a78e59a2389091ed5933b5bdeae8e5730 Reviewed-by: Tobias Hunger --- share/qtcreator/templates/wizards/classes/cpp/wizard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/templates/wizards/classes/cpp/wizard.json b/share/qtcreator/templates/wizards/classes/cpp/wizard.json index 781b6471424..6ac5bf21d6c 100644 --- a/share/qtcreator/templates/wizards/classes/cpp/wizard.json +++ b/share/qtcreator/templates/wizards/classes/cpp/wizard.json @@ -17,7 +17,7 @@ { "key": "CN", "value": "%{JS: Cpp.className('%{Class}')}" }, { "key": "Base", "value": "%{JS: ( '%{BaseCB}' === '' ) ? '%{BaseEdit}' : '%{BaseCB}'}" }, { "key": "isQObject", "value": "%{JS: [ 'QObject', 'QWidget', 'QMainWindow', 'QDeclarativeItem', 'QQuickItem'].indexOf('%{Base}') >= 0 }" }, - { "key": "GUARD", "value": "%{JS: Cpp.classToHeaderGuard('%{Class}', '%{JS: Util.preferredSuffix('text/x-c++hdr')}')}" }, + { "key": "GUARD", "value": "%{JS: Cpp.headerGuard('%{HdrFileName}')}" }, { "key": "SharedDataInit", "value": "%{JS: ('%{IncludeQSharedData}') ? 'data(new %{CN}Data)' : '' }" } ], From 4d1d4a5e2d896d597948b9b9420fadf40947d5c7 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 25 Oct 2016 17:07:36 +0200 Subject: [PATCH 68/81] Doc: Add link to Clang Code Model settings documentation ...to the list in the Configuring Projects topic. Change-Id: Iab1c540a85172aa3b7d99be387b2208320f4d5f9 Reviewed-by: Nikolai Kosjar --- doc/src/projects/creator-projects-settings-overview.qdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/projects/creator-projects-settings-overview.qdoc b/doc/src/projects/creator-projects-settings-overview.qdoc index df2b6a61a5f..cd8e785adf3 100644 --- a/doc/src/projects/creator-projects-settings-overview.qdoc +++ b/doc/src/projects/creator-projects-settings-overview.qdoc @@ -99,6 +99,8 @@ \li \l{Specifying Dependencies}{Dependencies} + \li \l{Parsing C++ Files}{Clang Code Model} (experimental) + \li \l{Using Clang Static Analyzer}{Clang Static Analyzer} \li \l{To-Do Entries}{To-Do} (experimental) From dfcd6537d23bf90f2202b563b080571da248a401 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 25 Oct 2016 17:34:27 +0200 Subject: [PATCH 69/81] Doc: C and C++ compilers can now be added separately Update screenshots. Change-Id: I02be7d5be7865f58d6842be0e064a205034becf2 Reviewed-by: Tobias Hunger --- doc/images/qtcreator-kits.png | Bin 22715 -> 25059 bytes doc/images/qtcreator-toolchains.png | Bin 9727 -> 13634 bytes .../projects/creator-projects-compilers.qdoc | 8 +++++--- .../projects/creator-projects-targets.qdoc | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/images/qtcreator-kits.png b/doc/images/qtcreator-kits.png index f31acca4ca977c95d6401c01dee120525e736287..0eaf814d07dd3a3a78d5d2f0f0a04adaa5917248 100644 GIT binary patch literal 25059 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 Uhx-R(1_lNOPgg&ebxsLQ0GA;UCjbBd literal 22715 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 diff --git a/doc/images/qtcreator-toolchains.png b/doc/images/qtcreator-toolchains.png index cf4cf05cdec9db8f45e4989dd086f96b42498bcc..0b573f034a7da14faf0817de61a3a4ac9dfa7a5f 100644 GIT binary patch literal 13634 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 J);T3K0RSaKC~^P* literal 9727 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 KxvX \uicontrol Options > - \uicontrol {Build & Run} > \uicontrol Compilers > \uicontrol Add - and select a compiler in the list. + \uicontrol {Build & Run} > \uicontrol Compilers > \uicontrol Add, + then select a compiler in the list, and then select \uicontrol C or + \uicontrol C++ to add a C or C++ compiler. \image qtcreator-toolchains.png @@ -124,7 +125,8 @@ \list 1 \li Select \uicontrol Tools > \uicontrol Options > \uicontrol {Build & Run} > - \uicontrol Compilers > \uicontrol Add > \uicontrol Custom. + \uicontrol Compilers > \uicontrol Add > \uicontrol Custom > + \uicontrol C or \uicontrol C++. \li In the \uicontrol Name field, enter a name for the compiler. diff --git a/doc/src/projects/creator-projects-targets.qdoc b/doc/src/projects/creator-projects-targets.qdoc index 2871f3a8695..9617b8addcd 100644 --- a/doc/src/projects/creator-projects-targets.qdoc +++ b/doc/src/projects/creator-projects-targets.qdoc @@ -91,8 +91,8 @@ image is located. If you are not cross-compiling, leave this field empty. - \li In the \uicontrol {Compiler} field, select the compiler required - to build the project. You can add compilers to the list + \li In the \uicontrol {Compiler} field, select the C or C++ compiler + used to build the project. You can add compilers to the list if they are installed on the development PC, but were not detected automatically. For more information, see \l{Adding Compilers}. From 2534cb017ba36953f0da1c04d6ca361acde42938 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 26 Oct 2016 16:52:53 +0200 Subject: [PATCH 70/81] ScxmlEditor: Fix the align* and adjust* icons Use toolbar variants in the toolbar and menu variants in the menu. Change-Id: Ie79631d80ff0f2c4c3b19b216def10d79bdd8454 Reviewed-by: Alessandro Portale --- src/plugins/scxmleditor/common/mainwidget.cpp | 50 +++++++++++++++++-- .../plugin_interface/actionhandler.cpp | 18 +++---- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/plugins/scxmleditor/common/mainwidget.cpp b/src/plugins/scxmleditor/common/mainwidget.cpp index 3952b35812c..d67003eb8b3 100644 --- a/src/plugins/scxmleditor/common/mainwidget.cpp +++ b/src/plugins/scxmleditor/common/mainwidget.cpp @@ -77,6 +77,7 @@ #include #include #include +#include using namespace ScxmlEditor::PluginInterface; using namespace ScxmlEditor::Common; @@ -120,6 +121,47 @@ void msgHandler(QtMsgType type, const QMessageLogContext &context, const QString abort(); } +static QIcon toolButtonIcon(ActionType actionType) +{ + QString iconFileName; + + switch (actionType) { + case ActionAlignLeft: + iconFileName = ":/scxmleditor/images/align_left.png"; + break; + case ActionAlignRight: + iconFileName = ":/scxmleditor/images/align_right.png"; + break; + case ActionAlignTop: + iconFileName = ":/scxmleditor/images/align_top.png"; + break; + case ActionAlignBottom: + iconFileName = ":/scxmleditor/images/align_bottom.png"; + break; + case ActionAlignHorizontal: + iconFileName = ":/scxmleditor/images/align_horizontal.png"; + break; + case ActionAlignVertical: + iconFileName = ":/scxmleditor/images/align_vertical.png"; + break; + + case ActionAdjustWidth: + iconFileName = ":/scxmleditor/images/adjust_width.png"; + break; + case ActionAdjustHeight: + iconFileName = ":/scxmleditor/images/adjust_height.png"; + break; + case ActionAdjustSize: + iconFileName = ":/scxmleditor/images/adjust_size.png"; + break; + + default: + return QIcon(); + } + + return Utils::Icon({{iconFileName, Utils::Theme::IconsBaseColor}}).icon(); +} + MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { @@ -289,8 +331,8 @@ void MainWidget::init() // Init ToolButtons auto stateColorButton = new ColorToolButton("StateColor", ":/scxmleditor/images/state_color.png", tr("State Color")); auto fontColorButton = new ColorToolButton("FontColor", ":/scxmleditor/images/font_color.png", tr("Font Color")); - QToolButton *alignToolButton = createToolButton(m_actionHandler->action(ActionAlignLeft)->icon(), tr("Align Left"), QToolButton::MenuButtonPopup); - QToolButton *adjustToolButton = createToolButton(m_actionHandler->action(ActionAdjustWidth)->icon(), tr("Adjust Width"), QToolButton::MenuButtonPopup); + QToolButton *alignToolButton = createToolButton(toolButtonIcon(ActionAlignLeft), tr("Align Left"), QToolButton::MenuButtonPopup); + QToolButton *adjustToolButton = createToolButton(toolButtonIcon(ActionAdjustWidth), tr("Adjust Width"), QToolButton::MenuButtonPopup); // Connect state color change connect(stateColorButton, &ColorToolButton::colorSelected, [this](const QString &color) { @@ -738,7 +780,7 @@ QToolButton *MainWidget::createToolButton(const QIcon &icon, const QString &tool void MainWidget::alignButtonClicked(ActionType alignType) { if (alignType >= ActionAlignLeft && alignType <= ActionAlignVertical) { - m_toolButtons[ToolButtonAlignment]->setIcon(m_actionHandler->action(alignType)->icon()); + m_toolButtons[ToolButtonAlignment]->setIcon(toolButtonIcon(alignType)); m_toolButtons[ToolButtonAlignment]->setToolTip(m_actionHandler->action(alignType)->toolTip()); m_toolButtons[ToolButtonAlignment]->setProperty("currentAlignment", alignType); StateView *view = m_views.last(); @@ -750,7 +792,7 @@ void MainWidget::alignButtonClicked(ActionType alignType) void MainWidget::adjustButtonClicked(ActionType adjustType) { if (adjustType >= ActionAdjustWidth && adjustType <= ActionAdjustSize) { - m_toolButtons[ToolButtonAdjustment]->setIcon(m_actionHandler->action(adjustType)->icon()); + m_toolButtons[ToolButtonAdjustment]->setIcon(toolButtonIcon(adjustType)); m_toolButtons[ToolButtonAdjustment]->setToolTip(m_actionHandler->action(adjustType)->toolTip()); m_toolButtons[ToolButtonAdjustment]->setProperty("currentAdjustment", adjustType); StateView *view = m_views.last(); diff --git a/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp b/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp index 660293186f6..e8067fd0165 100644 --- a/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp +++ b/src/plugins/scxmleditor/plugin_interface/actionhandler.cpp @@ -59,15 +59,15 @@ ActionHandler::ActionHandler(QObject *parent) { Utils::Icon({{":/scxmleditor/images/icon-export-canvas.png", Utils::Theme::IconsBaseColor}}), AH::tr("Export to Image"), AH::tr("Export to Image"), "Ctrl+Shift+E", false }, { Utils::Icon({{":/utils/images/namespace.png", Utils::Theme::IconsBaseColor}}), AH::tr("Toggle Full Namespace"), AH::tr("Toggle Full Namespace"), "Ctrl+Shift+N", true }, - { Utils::Icon({{":/scxmleditor/images/align_left.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Left"), AH::tr("Align Left (Ctrl+L,1)"), "Ctrl+L,1", false }, - { Utils::Icon({{":/scxmleditor/images/align_right.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Right"), AH::tr("Align Right (Ctrl+L,2)"), "Ctrl+L,2", false }, - { Utils::Icon({{":/scxmleditor/images/align_top.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Top"), AH::tr("Align Top (Ctrl+L,3)"), "Ctrl+L,3", false }, - { Utils::Icon({{":/scxmleditor/images/align_bottom.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Bottom"), AH::tr("Align Bottom (Ctrl+L,4)"), "Ctrl+L,4", false }, - { Utils::Icon({{":/scxmleditor/images/align_horizontal.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Horizontal"), AH::tr("Align Horizontal (Ctrl+L,5)"), "Ctrl+L,5", false }, - { Utils::Icon({{":/scxmleditor/images/align_vertical.png", Utils::Theme::IconsBaseColor}}), AH::tr("Align Vertical"), AH::tr("Align Vertical (Ctrl+L,6)"), "Ctrl+L,6", false }, - { Utils::Icon({{":/scxmleditor/images/adjust_width.png", Utils::Theme::IconsBaseColor}}), AH::tr("Adjust Width"), AH::tr("Adjust Width (Ctrl+L,7)"), "Ctrl+L,7", false }, - { Utils::Icon({{":/scxmleditor/images/adjust_height.png", Utils::Theme::IconsBaseColor}}), AH::tr("Adjust Height"), AH::tr("Adjust Height (Ctrl+L,8)"), "Ctrl+L,8", false }, - { Utils::Icon({{":/scxmleditor/images/adjust_size.png", Utils::Theme::IconsBaseColor}}), AH::tr("Adjust Size"), AH::tr("Adjust Size (Ctrl+L,9)"), "Ctrl+L,9", false }, + { Utils::Icon({{":/scxmleditor/images/align_left.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Align Left"), AH::tr("Align Left (Ctrl+L,1)"), "Ctrl+L,1", false }, + { Utils::Icon({{":/scxmleditor/images/align_right.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Align Right"), AH::tr("Align Right (Ctrl+L,2)"), "Ctrl+L,2", false }, + { Utils::Icon({{":/scxmleditor/images/align_top.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Align Top"), AH::tr("Align Top (Ctrl+L,3)"), "Ctrl+L,3", false }, + { Utils::Icon({{":/scxmleditor/images/align_bottom.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Align Bottom"), AH::tr("Align Bottom (Ctrl+L,4)"), "Ctrl+L,4", false }, + { Utils::Icon({{":/scxmleditor/images/align_horizontal.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Align Horizontal"), AH::tr("Align Horizontal (Ctrl+L,5)"), "Ctrl+L,5", false }, + { Utils::Icon({{":/scxmleditor/images/align_vertical.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Align Vertical"), AH::tr("Align Vertical (Ctrl+L,6)"), "Ctrl+L,6", false }, + { Utils::Icon({{":/scxmleditor/images/adjust_width.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Adjust Width"), AH::tr("Adjust Width (Ctrl+L,7)"), "Ctrl+L,7", false }, + { Utils::Icon({{":/scxmleditor/images/adjust_height.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Adjust Height"), AH::tr("Adjust Height (Ctrl+L,8)"), "Ctrl+L,8", false }, + { Utils::Icon({{":/scxmleditor/images/adjust_size.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint), AH::tr("Adjust Size"), AH::tr("Adjust Size (Ctrl+L,9)"), "Ctrl+L,9", false }, { Utils::Icon(":/scxmleditor/images/statistics.png"), AH::tr("Show Statistics..."), AH::tr("Show Statistics"), "", false } }; From e25ac57f387d8c5538a6258bfd6d6fab68b8887d Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 25 Oct 2016 19:14:24 +0200 Subject: [PATCH 71/81] QmlDesigner: spaces only change Change-Id: I1ecb9425148843558e8bf2deffde2aa2290ded4b Reviewed-by: Thomas Hartmann --- .../components/formeditor/abstractformeditortool.cpp | 2 +- src/plugins/qmldesigner/designmodecontext.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index a43c1985d00..bc5645ae24a 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -134,7 +134,6 @@ bool AbstractFormEditorTool::topSelectedItemIsMovable(const QList &/*itemList*/) { return false; @@ -149,6 +148,7 @@ QGraphicsItem *AbstractFormEditorTool::topMovableGraphicsItem(const QList &itemList, bool selectOnlyContentItems) { foreach (QGraphicsItem *item, itemList) { diff --git a/src/plugins/qmldesigner/designmodecontext.cpp b/src/plugins/qmldesigner/designmodecontext.cpp index e8c0e33e155..3158e2dbb31 100644 --- a/src/plugins/qmldesigner/designmodecontext.cpp +++ b/src/plugins/qmldesigner/designmodecontext.cpp @@ -44,7 +44,6 @@ QString DesignModeContext::contextHelpId() const return qobject_cast(m_widget)->contextHelpId(); } - FormEditorContext::FormEditorContext(QWidget *widget) : IContext(widget) { From a0f1473dc17ea53faf18249f586be582e360c6f6 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 25 Oct 2016 19:15:07 +0200 Subject: [PATCH 72/81] QmlDesigner: remove unnecessary code Change-Id: Ib10fa0513f326b3047b93f8cbedc1a11f2bd1f90 Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designmodewidget.cpp | 22 ++------------------ src/plugins/qmldesigner/designmodewidget.h | 3 --- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 64c5bbc26bf..2f2a9b67d58 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -248,21 +248,6 @@ void DesignModeWidget::updateErrorStatus(const QList &errors) } } -TextEditor::BaseTextEditor *DesignModeWidget::textEditor() const -{ - return currentDesignDocument()->textEditor(); -} - -void DesignModeWidget::setCurrentDesignDocument(DesignDocument *newDesignDocument) -{ - if (debug) - qDebug() << Q_FUNC_INFO << newDesignDocument; - - //viewManager().setDesignDocument(newDesignDocument); - - -} - static void hideToolButtons(QList &buttons) { foreach (QToolButton *button, buttons) @@ -319,13 +304,10 @@ void DesignModeWidget::setup() m_warningWidget->setVisible(false); connect(m_warningWidget.data(), &DocumentWarningWidget::gotoCodeClicked, [=] (const QString &filePath, int codeLine, int codeColumn) { - Q_UNUSED(filePath); - QTC_ASSERT(textEditor(), return;); - QTC_ASSERT(textEditor()->textDocument()->filePath().toString() == filePath, - qDebug() << Q_FUNC_INFO << textEditor()->textDocument()->filePath().toString() << filePath; ); - textEditor()->gotoLine(codeLine, codeColumn); + if (currentDesignDocument() && currentDesignDocument()->textEditor()) + currentDesignDocument()->textEditor()->gotoLine(codeLine, codeColumn); Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); }); diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index a865bf6105f..f743432d515 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -68,8 +68,6 @@ public: void readSettings(); void saveSettings(); - TextEditor::BaseTextEditor *textEditor() const; - DesignDocument *currentDesignDocument() const; ViewManager &viewManager(); @@ -97,7 +95,6 @@ private slots: private: // functions enum InitializeStatus { NotInitialized, Initializing, Initialized }; - void setCurrentDesignDocument(DesignDocument *newDesignDocument); void setup(); bool isInNodeDefinition(int nodeOffset, int nodeLength, int cursorPos) const; QmlDesigner::ModelNode nodeForPosition(int cursorPos) const; From de6021c71a7f6067581fe9b0b71d81b6f5d0c07f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 26 Oct 2016 16:53:32 +0200 Subject: [PATCH 73/81] QmlDesigner: If no types are available the dialog is implicitly canceled Task-number: QTCREATORBUG-17179 Change-Id: I89cf2240f9f54072dc35c40fb56a709284ff3187 Reviewed-by: Tim Jenssen --- .../connectioneditor/addnewbackenddialog.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/addnewbackenddialog.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/addnewbackenddialog.cpp index cad3da8fcfd..1ba26dcfc8a 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/addnewbackenddialog.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/addnewbackenddialog.cpp @@ -26,6 +26,8 @@ #include "addnewbackenddialog.h" #include "ui_addnewbackenddialog.h" +#include + namespace QmlDesigner { AddNewBackendDialog::AddNewBackendDialog(QWidget *parent) : @@ -57,6 +59,7 @@ void AddNewBackendDialog::setupPossibleTypes(const QList &types) for (const CppTypeData &typeData : types) m_ui->comboBox->addItem(typeData.typeName); + m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(m_ui->comboBox->count() > 0); invalidate(); blockSignals(block); } From 99aaf86a33ce08536b1a0f34940687c589026b6f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 26 Oct 2016 14:15:02 +0200 Subject: [PATCH 74/81] QmlJSCheck: Add error for ambiguous ids Certain ids can be ambiguous and have name clashes with properties. Those ids are not supported in the designer. Change-Id: Ida293d24611c467df6ef813a541e8abfc06b51cb Reviewed-by: Tim Jenssen --- src/libs/qmljs/qmljscheck.cpp | 43 +++++++++++++++++++ src/libs/qmljs/qmljsstaticanalysismessage.cpp | 2 + src/libs/qmljs/qmljsstaticanalysismessage.h | 1 + 3 files changed, 46 insertions(+) diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 9610a95f72d..c9c136d1781 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -489,6 +489,42 @@ private: bool _seenNonDeclarationStatement; }; +class IdsThatShouldNotBeUsedInDesigner : public QStringList +{ +public: + IdsThatShouldNotBeUsedInDesigner() : QStringList({ "top", + "bottom", + "left", + "right", + "width", + "height", + "x", + "y", + "opacity", + "parent", + "item", + "flow", + "color", + "margin", + "padding", + "border", + "font", + "text", + "source", + "state", + "visible", + "focus", + "data", + "clip", + "layer", + "scale", + "enabled", + "anchors"}) + { + } + +}; + class VisualAspectsPropertyBlackList : public QStringList { public: @@ -563,6 +599,7 @@ public: } // end of anonymous namespace +Q_GLOBAL_STATIC(IdsThatShouldNotBeUsedInDesigner, idsThatShouldNotBeUsedInDesigner) Q_GLOBAL_STATIC(VisualAspectsPropertyBlackList, visualAspectsPropertyBlackList) Q_GLOBAL_STATIC(UnsupportedTypesByVisualDesigner, unsupportedTypesByVisualDesigner) Q_GLOBAL_STATIC(UnsupportedRootObjectTypesByVisualDesigner, unsupportedRootObjectTypesByVisualDesigner) @@ -634,6 +671,7 @@ void Check::enableQmlDesignerChecks() enableMessage(WarnReferenceToParentItemNotSupportedByVisualDesigner); enableMessage(WarnAboutQtQuick1InsteadQtQuick2); enableMessage(ErrUnsupportedRootTypeInVisualDesigner); + enableMessage(ErrInvalidIdeInVisualDesigner); //## triggers too often ## check.enableMessage(StaticAnalysis::WarnUndefinedValueForVisualDesigner); } @@ -645,6 +683,7 @@ void Check::disableQmlDesignerChecks() disableMessage(WarnUndefinedValueForVisualDesigner); disableMessage(WarnStatesOnlyInRootItemForVisualDesigner); disableMessage(ErrUnsupportedRootTypeInVisualDesigner); + disableMessage(ErrInvalidIdeInVisualDesigner); } void Check::enableQmlDesignerUiFileChecks() @@ -927,6 +966,10 @@ bool Check::visit(UiScriptBinding *ast) return false; } + if (idsThatShouldNotBeUsedInDesigner->contains(id)) { + addMessage(ErrInvalidIdeInVisualDesigner, loc); + } + if (m_idStack.top().contains(id)) { addMessage(ErrDuplicateId, loc); return false; diff --git a/src/libs/qmljs/qmljsstaticanalysismessage.cpp b/src/libs/qmljs/qmljsstaticanalysismessage.cpp index fe5213b6bc5..157537be1a2 100644 --- a/src/libs/qmljs/qmljsstaticanalysismessage.cpp +++ b/src/libs/qmljs/qmljsstaticanalysismessage.cpp @@ -220,6 +220,8 @@ StaticAnalysisMessages::StaticAnalysisMessages() "and might not show up in Qt Quick Designer as expected.")); newMsg(WarnStatesOnlyInRootItemForVisualDesigner, Warning, tr("Qt Quick Designer only supports states in the root item.")); + newMsg(ErrInvalidIdeInVisualDesigner, Error, + tr("This id might be ambiguous and is not supported in the Qt Quick Designer")); newMsg(WarnAboutQtQuick1InsteadQtQuick2, Warning, tr("Using Qt Quick 1 code model instead of Qt Quick 2.")); newMsg(ErrUnsupportedRootTypeInVisualDesigner, Error, diff --git a/src/libs/qmljs/qmljsstaticanalysismessage.h b/src/libs/qmljs/qmljsstaticanalysismessage.h index ced78ee686a..4d07614c8d5 100644 --- a/src/libs/qmljs/qmljsstaticanalysismessage.h +++ b/src/libs/qmljs/qmljsstaticanalysismessage.h @@ -97,6 +97,7 @@ enum Type WarnUndefinedValueForVisualDesigner = 206, WarnStatesOnlyInRootItemForVisualDesigner = 207, ErrUnsupportedRootTypeInVisualDesigner = 208, + ErrInvalidIdeInVisualDesigner = 209, ErrUnsupportedRootTypeInQmlUi = 220, ErrUnsupportedTypeInQmlUi = 221, ErrFunctionsNotSupportedInQmlUi = 222, From e012e42ff2680151057677571a3b869ab4b4da35 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 26 Oct 2016 13:32:51 +0200 Subject: [PATCH 75/81] QmlDesigner: Do not allow certain ids Some ids are likely to create issues, because they collide with property names. Change-Id: I688ed0751c227afdd3ef59ba0f31b1334b26eaea Reviewed-by: Tim Jenssen --- .../designercore/model/modelnode.cpp | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index eafc521815e..2614ca939ca 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -179,6 +179,42 @@ static bool idIsQmlKeyWord(const QString& id) return keywords.contains(id); } +static bool isIdToAvoid(const QString& id) +{ + static const QSet ids = { + "top", + "bottom", + "left", + "right", + "width", + "height", + "x", + "y", + "opacity", + "parent", + "item", + "flow", + "color", + "margin", + "padding", + "border", + "font", + "text", + "source", + "state", + "visible", + "focus", + "data", + "clip", + "layer", + "scale", + "enabled", + "anchors" + }; + + return ids.contains(id); +} + static bool idContainsWrongLetter(const QString& id) { static QRegExp idExpr(QStringLiteral("[a-z_][a-zA-Z0-9_]*")); @@ -187,7 +223,7 @@ static bool idContainsWrongLetter(const QString& id) bool ModelNode::isValidId(const QString &id) { - return id.isEmpty() || (!idContainsWrongLetter(id) && !idIsQmlKeyWord(id)); + return id.isEmpty() || (!idContainsWrongLetter(id) && !idIsQmlKeyWord(id)) && !isIdToAvoid(id); } bool ModelNode::hasId() const From 61dadc6da1ab73e43e2072485f7a7ec6860e8ed9 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 26 Oct 2016 18:12:44 +0200 Subject: [PATCH 76/81] QmlDesigner: Disable validator in any case We have to disable the validator even if the root node has no id. Change-Id: I021c33909dfa7c3aa3154d1782a589cef9151af5 Reviewed-by: Tim Jenssen --- .../qmldesignerextension/connectioneditor/delegates.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp index c27c17a292d..8d47c3ca521 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp @@ -321,6 +321,7 @@ QWidget *ConnectionDelegate::createEditor(QWidget *parent, const QStyleOptionVie connectionComboBox->addItem(itemText, source); } } + connectionComboBox->disableValidator(); } break; default: qWarning() << "ConnectionDelegate::createEditor column" << index.column(); From 55db42fe2cc10795c137e9f8338bdf084d1f9cba Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Wed, 26 Oct 2016 15:33:06 +0200 Subject: [PATCH 77/81] QmlDesigner: remove styling of the output pane Setting objectnames to reduce possible influence to other widgets. Introduce a background QWidget to set the background color. AutofillBackground was not working for unclear reason. Change-Id: I4acd5b7ed5ff9d63b5320b133a82099c5888b839 Task-number: QTCREATORBUG-17172 Reviewed-by: Thomas Hartmann --- .../components/resources/centerwidget.css | 4 +- src/plugins/qmldesigner/designmodewidget.cpp | 21 +++--- src/plugins/qmldesigner/qmldesignerplugin.pri | 2 - src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 - .../styledoutputpaneplaceholder.cpp | 65 ------------------- .../qmldesigner/styledoutputpaneplaceholder.h | 46 ------------- 6 files changed, 15 insertions(+), 125 deletions(-) delete mode 100644 src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp delete mode 100644 src/plugins/qmldesigner/styledoutputpaneplaceholder.h diff --git a/src/plugins/qmldesigner/components/resources/centerwidget.css b/src/plugins/qmldesigner/components/resources/centerwidget.css index dd60f7f7186..fd2b8f6d1b1 100644 --- a/src/plugins/qmldesigner/components/resources/centerwidget.css +++ b/src/plugins/qmldesigner/components/resources/centerwidget.css @@ -1,4 +1,4 @@ -QWidget { +QWidget#backgroundWidget { background-color: creatorTheme.QmlDesignerTabDark } @@ -15,7 +15,7 @@ QTabBar::tab:selected { color: creatorTheme.QmlDesignerTabDark; } -QTabBar::tab { +QTabBar#centralTabBar::tab { width: 16px; height: 80px; diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 2f2a9b67d58..3c4349bd624 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -25,7 +25,7 @@ #include "designmodewidget.h" -#include "styledoutputpaneplaceholder.h" +#include #include "qmldesignerplugin.h" #include "crumblebar.h" #include "documentwarningwidget.h" @@ -492,20 +492,25 @@ static Core::MiniSplitter *createCentralSplitter(const QList &widget outputPlaceholderSplitter->setStretchFactor(1, 0); outputPlaceholderSplitter->setOrientation(Qt::Vertical); - auto outputPanePlaceholder = new StyledOutputpanePlaceHolder(Core::Constants::MODE_DESIGN, outputPlaceholderSplitter); + auto outputPanePlaceholder = new Core::OutputPanePlaceHolder(Core::Constants::MODE_DESIGN, outputPlaceholderSplitter); QTabWidget* tabWidget = createWidgetsInTabWidget(centralWidgetInfos); tabWidget->setObjectName("centralTabWidget"); tabWidget->setTabPosition(QTabWidget::East); - tabWidget->setTabBarAutoHide(true); + tabWidget->tabBar()->setObjectName("centralTabBar"); - outputPlaceholderSplitter->addWidget(tabWidget); - - outputPlaceholderSplitter->addWidget(outputPanePlaceholder); + QWidget *backgroundWidget = new QWidget(); + backgroundWidget->setObjectName("backgroundWidget"); + backgroundWidget->setLayout(new QVBoxLayout()); + backgroundWidget->layout()->setMargin(0); + backgroundWidget->layout()->addWidget(tabWidget); QByteArray sheet = Utils::FileReader::fetchQrc(":/qmldesigner/centerwidget.css"); - tabWidget->setStyleSheet(Theming::replaceCssColors(QString::fromUtf8(sheet))); - outputPlaceholderSplitter->setStyleSheet(Theming::replaceCssColors(QString::fromUtf8(sheet))); + backgroundWidget->setStyleSheet(Theming::replaceCssColors(QString::fromUtf8(sheet))); + + outputPlaceholderSplitter->addWidget(backgroundWidget); + outputPlaceholderSplitter->addWidget(outputPanePlaceholder); + return outputPlaceholderSplitter; } diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pri b/src/plugins/qmldesigner/qmldesignerplugin.pri index b9be0d0a558..b900f8d883e 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pri +++ b/src/plugins/qmldesigner/qmldesignerplugin.pri @@ -7,7 +7,6 @@ HEADERS += $$PWD/qmldesignerconstants.h \ $$PWD/designmodecontext.h \ $$PWD/documentmanager.h \ $$PWD/documentwarningwidget.h \ - $$PWD/styledoutputpaneplaceholder.h \ $$PWD/qmldesignericons.h \ $$PWD/openuiqmlfiledialog.h @@ -19,7 +18,6 @@ SOURCES += $$PWD/qmldesignerplugin.cpp \ $$PWD/designmodecontext.cpp \ $$PWD/documentmanager.cpp \ $$PWD/documentwarningwidget.cpp \ - $$PWD/styledoutputpaneplaceholder.cpp \ $$PWD/openuiqmlfiledialog.cpp FORMS += $$PWD/settingspage.ui \ diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 8e24fd09a7f..e593a32b3d3 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -646,8 +646,6 @@ Project { "settingspage.ui", "shortcutmanager.cpp", "shortcutmanager.h", - "styledoutputpaneplaceholder.cpp", - "styledoutputpaneplaceholder.h", ] } } diff --git a/src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp b/src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp deleted file mode 100644 index b8793740fbe..00000000000 --- a/src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "styledoutputpaneplaceholder.h" -#include "theming.h" - -#include - -#include -#include - -namespace QmlDesigner { -namespace Internal { - -StyledOutputpanePlaceHolder::StyledOutputpanePlaceHolder(Core::Id mode, QSplitter *parent) - : Core::OutputPanePlaceHolder(mode, parent) -{ - QByteArray sheet = Utils::FileReader::fetchQrc(":/qmldesigner/scrollbar.css"); - m_customStylesheet = Theming::replaceCssColors(QString::fromUtf8(sheet)); -} - -void StyledOutputpanePlaceHolder::childEvent(QChildEvent *event) -{ - Core::OutputPanePlaceHolder::childEvent(event); - - if (event->type() == QEvent::ChildAdded) { - if (QWidget *child = qobject_cast(event->child())) { - QList widgets = child->findChildren(); - if (!widgets.isEmpty()) - widgets.first()->parentWidget()->setStyleSheet(m_customStylesheet); - } - } else if (event->type() == QEvent::ChildRemoved) { - QWidget *child = qobject_cast(event->child()); - if (child) { - QList widgets = child->findChildren(); - if (!widgets.isEmpty()) - widgets.first()->parentWidget()->setStyleSheet(QString()); - } - } -} - -} // namespace Internal -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/styledoutputpaneplaceholder.h b/src/plugins/qmldesigner/styledoutputpaneplaceholder.h deleted file mode 100644 index c55830115d8..00000000000 --- a/src/plugins/qmldesigner/styledoutputpaneplaceholder.h +++ /dev/null @@ -1,46 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include - -namespace QmlDesigner { -namespace Internal { - -class StyledOutputpanePlaceHolder : public Core::OutputPanePlaceHolder -{ -public: - explicit StyledOutputpanePlaceHolder(Core::Id mode, QSplitter *parent = 0); - -protected: - void childEvent(QChildEvent *event) override;; - -private: - QString m_customStylesheet; -}; - -} // namespace Internal -} // namespace QmlDesigner From 6eddf4188601eaa0414ef1bf801b6da4f6acc5d2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 26 Oct 2016 18:19:49 +0200 Subject: [PATCH 78/81] Documenting QmlJS error message I also fixed the "." Change-Id: I65cdc6be8b2de31af411d1172780281afd20a4f9 Reviewed-by: Tim Jenssen --- doc/src/editors/creator-editors.qdoc | 6 ++++++ src/libs/qmljs/qmljsstaticanalysismessage.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/src/editors/creator-editors.qdoc b/doc/src/editors/creator-editors.qdoc index bc631612aa7..3ccaaf3eb88 100644 --- a/doc/src/editors/creator-editors.qdoc +++ b/doc/src/editors/creator-editors.qdoc @@ -554,6 +554,12 @@ \row \li M208 \li Error + \li This id might be ambiguous and is not supported in the \QMLD. + \li + + \row + \li M209 + \li Error \li This type (type name) is not supported as a root element by \QMLD. \li diff --git a/src/libs/qmljs/qmljsstaticanalysismessage.cpp b/src/libs/qmljs/qmljsstaticanalysismessage.cpp index 157537be1a2..34929ab3b64 100644 --- a/src/libs/qmljs/qmljsstaticanalysismessage.cpp +++ b/src/libs/qmljs/qmljsstaticanalysismessage.cpp @@ -221,7 +221,7 @@ StaticAnalysisMessages::StaticAnalysisMessages() newMsg(WarnStatesOnlyInRootItemForVisualDesigner, Warning, tr("Qt Quick Designer only supports states in the root item.")); newMsg(ErrInvalidIdeInVisualDesigner, Error, - tr("This id might be ambiguous and is not supported in the Qt Quick Designer")); + tr("This id might be ambiguous and is not supported in the Qt Quick Designer.")); newMsg(WarnAboutQtQuick1InsteadQtQuick2, Warning, tr("Using Qt Quick 1 code model instead of Qt Quick 2.")); newMsg(ErrUnsupportedRootTypeInVisualDesigner, Error, From 0bf4bfcade0cc9f24b5b9a8a8a4a8811e8378b8e Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 26 Oct 2016 23:53:04 +0200 Subject: [PATCH 79/81] Debugger: Don't optimize dumper tests Better finish a slow build than waiting forever for a potentially faster one. Change-Id: Idec49294ec10f8dee41b061b3eeb7bf1e696d2a5 Reviewed-by: Christian Stenger --- tests/auto/debugger/dumpers.pro | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/auto/debugger/dumpers.pro b/tests/auto/debugger/dumpers.pro index 39cf6770135..a22349dc04d 100644 --- a/tests/auto/debugger/dumpers.pro +++ b/tests/auto/debugger/dumpers.pro @@ -41,4 +41,5 @@ HEADERS += \ INCLUDEPATH += $$DEBUGGERDIR # clang 3.5 does not like to optimize long functions. -clang: QMAKE_CXXFLAGS_RELEASE = +# likewise gcc 5.4 +QMAKE_CXXFLAGS_RELEASE = From 0e134d260ead7d0a7336221164e9b5baba8244a9 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 27 Oct 2016 10:54:54 +0300 Subject: [PATCH 80/81] Theme: Remove unused icon entries Change-Id: I867aa0b8737b56fc3e8d357bb1559acad740ccf0 Reviewed-by: Alessandro Portale --- share/qtcreator/themes/dark.creatortheme | 4 ---- src/libs/utils/theme/theme.h | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/share/qtcreator/themes/dark.creatortheme b/share/qtcreator/themes/dark.creatortheme index 2e7f5f7000f..ff8a66cf1c3 100644 --- a/share/qtcreator/themes/dark.creatortheme +++ b/share/qtcreator/themes/dark.creatortheme @@ -244,7 +244,3 @@ IconOverlayPri=:/qtsupport/images/dark_qt_project.png IconOverlayPro=:/qtsupport/images/dark_qt_project.png StandardPixmapFileIcon=:/core/images/dark_fileicon.png StandardPixmapDirIcon=:/core/images/dark_foldericon.png -BuildStepDisable=:/projectexplorer/images/lightdisabledbuildstep.png -BuildStepRemove=:/core/images/lightclose.png -BuildStepMoveDown=:/core/images/lightarrowdown.png -BuildStepMoveUp=:/core/images/lightarrowup.png diff --git a/src/libs/utils/theme/theme.h b/src/libs/utils/theme/theme.h index 5980bf16718..0b8970423b6 100644 --- a/src/libs/utils/theme/theme.h +++ b/src/libs/utils/theme/theme.h @@ -318,11 +318,7 @@ public: IconOverlayPrf, IconOverlayPro, StandardPixmapFileIcon, - StandardPixmapDirIcon, - BuildStepDisable, - BuildStepRemove, - BuildStepMoveDown, - BuildStepMoveUp + StandardPixmapDirIcon }; enum Flag { From c777bd32bc9dd2d1129630b029111d0e2a50099f Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 26 Oct 2016 12:30:39 +0200 Subject: [PATCH 81/81] QtSupport: Do not show Type column in Qt options page Nothing ever fills that column, so do not bother to show it. Change-Id: I5787aa72ee5c414fbf01ca01eed3aea20b6b7201 Reviewed-by: Tim Jenssen --- src/plugins/qtsupport/qtoptionspage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 30290d76987..97fc03e5fab 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -226,7 +226,7 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent) m_manualItem = new StaticTreeItem(tr("Manual")); m_model = new TreeModel(); - m_model->setHeader({tr("Name"), tr("qmake Location"), tr("Type")}); + m_model->setHeader({tr("Name"), tr("qmake Location")}); m_model->rootItem()->appendChild(m_autoItem); m_model->rootItem()->appendChild(m_manualItem);