Merge remote-tracking branch 'origin/3.1'
Conflicts: qtcreator.pri qtcreator.qbs Change-Id: I5b27eba0a9536d3e6867577ebf2b59d58a13b827
118
dist/changes-3.1.0
vendored
@@ -7,28 +7,35 @@ list of changes, see the Git log for the Qt Creator sources that
|
||||
you can check out from the public Git repository. For example:
|
||||
|
||||
git clone git://gitorious.org/qt-creator/qt-creator.git
|
||||
git log --cherry-pick --pretty=oneline origin/3.0..origin/master
|
||||
git log --cherry-pick --pretty=oneline origin/3.0..origin/3.1
|
||||
|
||||
General
|
||||
* Added support for "~" as an alias for the user's home directory in the directory in file
|
||||
system search (QTCREATORBUG-7753)
|
||||
* Added Beautifier plugin that allows to fix coding style of files with external coding
|
||||
style tools (Artistic Style, Clang-format, Uncrustify) (QTCREATORBUG-7489)
|
||||
|
||||
Editing
|
||||
* Added File > Reload
|
||||
* Added File > Reload for files that are open and unmodified in Qt Creator but might be
|
||||
different on disk
|
||||
* Added option to not hide the mouse cursor while typing (QTCREATORBUG-3584)
|
||||
* Made visible margin configurable per project
|
||||
* Fixed reloading contents in binary editor (QTCREATORBUG-6275)
|
||||
* Fixed names and saving of custom locator filters (QTCREATORBUG-11051)
|
||||
|
||||
Managing and Building Projects
|
||||
|
||||
Compilers
|
||||
|
||||
Devices
|
||||
* Re-added option to import existing builds even after project configuration (QTCREATORBUG-7836)
|
||||
* Fixed that compiler output in issues list was not using monospace font (QTCREATORBUG-11345)
|
||||
|
||||
QMake Projects
|
||||
* Added context menu item "Add Existing Directory" that adds all
|
||||
files from a directory (QTCREATORBUG-9081)
|
||||
|
||||
CMake Projects
|
||||
* Added support for QMAKE_EXTRA_COMPILERS (QTCREATORBUG-11212)
|
||||
* Fixed issues with absolute paths in TARGET
|
||||
|
||||
Qbs Projects
|
||||
* Added option for building with --check-timestamps
|
||||
* Fixed that compiler flags were not set (QBS-481)
|
||||
|
||||
Generic Projects
|
||||
* Added context menu item "Add Existing Directory" that adds all
|
||||
@@ -38,42 +45,51 @@ Generic Projects
|
||||
Debugging
|
||||
* Removed support for GDB without Python
|
||||
* Added context menu item for saving backtrace as tasks-file
|
||||
* GDB
|
||||
* GDB, LLDB
|
||||
* Added pretty printer for std::unordered_set
|
||||
* Fixed various pretty printers
|
||||
* CDB
|
||||
* Added pretty printer for std::complex and C++11 std::array
|
||||
* LLDB
|
||||
* QML
|
||||
|
||||
Analyzer
|
||||
* Fixed that debugging was not possible with MallocScribble environment variable set
|
||||
(QTCREATORBUG-11371)
|
||||
* Fixed "Jump to Line", "Run to Line" and "Jump to Address"
|
||||
|
||||
QML Profiler
|
||||
* Improved performance (QTCREATORBUG-10950)
|
||||
* Improved layout of details views
|
||||
* Added JavaScript calls in Events view and Timeline view
|
||||
* Fixed opening files from JavaScript profiling output (QTCREATORBUG-11094)
|
||||
|
||||
C++ Support
|
||||
* Added code model inspector
|
||||
* Added experimental support for Clang-based code model
|
||||
* Added support for multiline strings and comments (QTCREATORBUG-662)
|
||||
* Fixed parsing of ??< ??> ??( ??) trigraphs (QTCREATORBUG-2474)
|
||||
* Fixed adding definition for function with rvalue-reference
|
||||
(QTCREATORBUG-10555)
|
||||
* Fixed semantic highlighting after "Save as"
|
||||
* Fixed syntax highlighting of multiline strings and comments (QTCREATORBUG-662)
|
||||
* Fixed that symbol dropdown was jumping to the wrong editor (QTCREATORBUG-11157)
|
||||
* Fixed highlighting when #undef is used (QTCREATORBUG-10454)
|
||||
* Improved the Insert Virtual Functions refactoring action:
|
||||
* Check only pure virtual functions by default
|
||||
* Display all overrides of a function
|
||||
* Do not include final functions
|
||||
|
||||
Python Support
|
||||
|
||||
GLSL Support
|
||||
QML Support
|
||||
* Simplified Qt Quick Application templates (QTCREATORBUG-11264)
|
||||
* Improved performance when using split views
|
||||
|
||||
Qt Quick Designer
|
||||
* Fixed selecting overlapping items with same z-value (QTCREATORBUG-11066)
|
||||
* Fixed setting text alignment (QTCREATORBUG-11054)
|
||||
* Fixed crash with anchors (QTCREATORBUG-11138)
|
||||
* Fixed issue with warning text not being readable (QTCREATORBUG-9603)
|
||||
|
||||
Diff Viewer
|
||||
* Fixed display of inserted lines at end of file (QTCREATORBUG-11281)
|
||||
* Fixed handling of whitespace changes (QTCREATORBUG-11002)
|
||||
|
||||
Version Control Systems
|
||||
* Git
|
||||
@@ -81,20 +97,25 @@ Version Control Systems
|
||||
* Enabled option to push commit directly after fixup
|
||||
* Enabled choosing non-fast-forward merge when fast-forward is applicable
|
||||
* Added completion in change selection dialog
|
||||
* Fixed freeze after resolving conflict with cherry-pick or revert
|
||||
* Added support for local branch selection in the Push to Gerrit dialog
|
||||
* ClearCase
|
||||
* Improved performance of indexing dynamic views
|
||||
* Added warning when editing Derived Objects
|
||||
* Bazaar
|
||||
* Added support for uncommit command
|
||||
* Mercurial
|
||||
* Added current branch to project and window title
|
||||
|
||||
FakeVim
|
||||
* Added "gj", "gk", "g0", "g^" and "g$" commands
|
||||
* Added toggle ("!") and print ("?") options to "set" command
|
||||
* Added support for relative line numbering
|
||||
* Made dot command work for letter case commands in visual mode
|
||||
* Fixed backward incremental search (QTCREATORBUG-7251)
|
||||
|
||||
Platform Specific
|
||||
|
||||
Linux
|
||||
|
||||
Qt Support
|
||||
* Custom wizards now use class "qmakeproject" instead of "qt4project"
|
||||
|
||||
@@ -104,16 +125,73 @@ QNX
|
||||
(QTCREATORBUG-9673, QTCREATORBUG-9001)
|
||||
* Added line and column information to text based BAR descriptor editor
|
||||
(QTCREATORBUG-10395)
|
||||
* Added simple management of user debug tokens
|
||||
* Added simple management of runtime configurations
|
||||
* Added support for attaching debugger to running applications
|
||||
* Fixed several issues with certificate password dialog in BlackBerry
|
||||
options (QTCREATORBUG-10948)
|
||||
|
||||
Android
|
||||
* Made it possible to cancel waiting for an AVD to boot up
|
||||
* Added download buttons for Android toolkit parts to Options page
|
||||
* Added warning for invalid JDK setting (QTCREATORBUG-11218)
|
||||
* Added minimal support for editing Java, with indentation of blocks and keyword completion
|
||||
(QTCREATORBUG-11220)
|
||||
* Added Java file wizard (QTCREATORBUG-11220)
|
||||
* Fixed opening Java files from error messages (QTCREATORBUG-10904)
|
||||
* Fixed colors in AndroidManifest editor (QTCREATORBUG-10597)
|
||||
* Fixed modified state of AndroidManifest editor (QTCREATORBUG-11163)
|
||||
* Fixed apply-behavior of Android Options page (QTCREATORBUG-7724)
|
||||
* Fixed that Qt Creator restart was required after configuring Android SDK (QTCREATORBUG-10936)
|
||||
|
||||
Remote Linux
|
||||
|
||||
Bare Metal
|
||||
iOS
|
||||
* Added check for already running application on device
|
||||
* Added automatic detection that developer mode becomes activated on connected device
|
||||
|
||||
Credits for these changes go to:
|
||||
|
||||
Alessandro Portale
|
||||
Alexander Kondratskiy
|
||||
Andre Hartmann
|
||||
Andre Pönitz
|
||||
Aurindam Jana
|
||||
Christian Kandeler
|
||||
Christian Stenger
|
||||
Daniel Teske
|
||||
David Kaspar
|
||||
David Schulz
|
||||
Eike Ziller
|
||||
El Mehdi Fekari
|
||||
Erik Verbruggen
|
||||
Falko Arps
|
||||
Fawzi Mohamed
|
||||
Frantisek Vacek
|
||||
Frederik Gladhorn
|
||||
Friedemann Kleint
|
||||
Hugues Delorme
|
||||
Jarek Kobus
|
||||
Jörg Bornemann
|
||||
Kai Köhne
|
||||
Knut Petter Svendsen
|
||||
Leena Miettinen
|
||||
Leo Lei
|
||||
Lukas Holecek
|
||||
Lorenz Haas
|
||||
Marco Bubke
|
||||
Martin Bohacek
|
||||
Nikolai Kosjar
|
||||
Orgad Shaneh
|
||||
Oswald Buddenhagen
|
||||
Pawel Faron
|
||||
Petar Perisin
|
||||
Povilas Kanapickas
|
||||
Przemyslaw Gorszkowski
|
||||
Rafael Roquetto
|
||||
Robert Löhning
|
||||
Sebastian Paluchiewicz
|
||||
Takumi Asaki
|
||||
Thiago Macieira
|
||||
Thomas Hartmann
|
||||
Tobias Hunger
|
||||
Tobias Nätterlund
|
||||
Ulf Hermann
|
||||
|
||||
@@ -43,8 +43,9 @@ exists(src/shared/qbs/qbs.pro) {
|
||||
system("echo QBS_LIB_INSTALL_DIR = $${QTC_PREFIX}/$${IDE_LIBRARY_BASENAME}/qtcreator >> $$qmake_cache")
|
||||
system("echo QBS_RESOURCES_BUILD_DIR = $${maybe_backslash}\"$${IDE_DATA_PATH}/qbs$${maybe_backslash}\" >> $$qmake_cache")
|
||||
system("echo QBS_RESOURCES_INSTALL_DIR = $${QTC_PREFIX}/share/qtcreator/qbs >> $$qmake_cache")
|
||||
system("echo QBS_PLUGINS_BUILD_DIR = $${maybe_backslash}\"$${IDE_BUILD_TREE}/lib/qtcreator/$${maybe_backslash}\" >> $$qmake_cache")
|
||||
system("echo QBS_PLUGINS_INSTALL_DIR = $${QTC_PREFIX}/lib/qtcreator >> $$qmake_cache")
|
||||
system("echo QBS_PLUGINS_BUILD_DIR = $${maybe_backslash}\"$${IDE_BUILD_TREE}/$${IDE_LIBRARY_BASENAME}/qtcreator/$${maybe_backslash}\" >> $$qmake_cache")
|
||||
system("echo QBS_PLUGINS_INSTALL_DIR = $${QTC_PREFIX}/$${IDE_LIBRARY_BASENAME}/qtcreator >> $$qmake_cache")
|
||||
system("echo QBS_LIBRARY_DIRNAME = $${IDE_LIBRARY_BASENAME} >> $$qmake_cache")
|
||||
system("echo CONFIG += qbs_no_dev_install >> $$qmake_cache")
|
||||
}
|
||||
|
||||
|
||||
@@ -16,19 +16,20 @@ Project {
|
||||
property pathList additionalPlugins: []
|
||||
property pathList additionalLibs: []
|
||||
property pathList additionalTools: []
|
||||
property string libDirName: "lib"
|
||||
property string ide_library_path: {
|
||||
if (qbs.targetOS.contains("osx"))
|
||||
return ide_app_target + ".app/Contents/PlugIns"
|
||||
else if (qbs.targetOS.contains("windows"))
|
||||
return ide_app_path
|
||||
else
|
||||
return "lib/qtcreator"
|
||||
return libDirName + "/qtcreator"
|
||||
}
|
||||
property string ide_plugin_path: {
|
||||
if (qbs.targetOS.contains("osx"))
|
||||
return ide_library_path
|
||||
else if (qbs.targetOS.contains("windows"))
|
||||
return "lib/qtcreator/plugins"
|
||||
return libDirName + "/qtcreator/plugins"
|
||||
else
|
||||
return ide_library_path + "/plugins"
|
||||
}
|
||||
@@ -47,7 +48,7 @@ Project {
|
||||
property bool testsEnabled: qbs.getenv("TEST") || qbs.buildVariant === "debug"
|
||||
property stringList generalDefines: [
|
||||
"QT_CREATOR",
|
||||
'IDE_LIBRARY_BASENAME="lib"',
|
||||
'IDE_LIBRARY_BASENAME="' + libDirName + '"',
|
||||
"QT_DISABLE_DEPRECATED_BEFORE=0x040900",
|
||||
"QT_NO_CAST_TO_ASCII",
|
||||
"QT_NO_CAST_FROM_ASCII"
|
||||
|
||||
@@ -990,10 +990,7 @@ class DumperBase:
|
||||
self.putCallItem(name, qobject, "property", '"' + name + '"')
|
||||
|
||||
# Dynamic properties.
|
||||
if extraData == 0:
|
||||
self.putItemCount(0)
|
||||
self.putNumChild(0)
|
||||
else:
|
||||
if extraData:
|
||||
propertyNames = extraData + ptrSize
|
||||
propertyValues = extraData + 2 * ptrSize
|
||||
|
||||
|
||||
@@ -1742,7 +1742,7 @@ class Dumper(DumperBase):
|
||||
# See http://sourceware.org/bugzilla/show_bug.cgi?id=11912
|
||||
exp = "(class '%s'*)0" % ts
|
||||
try:
|
||||
type = parseAndEvaluate(exp).type.target()
|
||||
type = self.parseAndEvaluate(exp).type.target()
|
||||
except:
|
||||
# Can throw "RuntimeError: No type named class Foo."
|
||||
pass
|
||||
|
||||
@@ -4,4 +4,9 @@ CppApplication {
|
||||
type: "application" // To suppress bundle generation on Mac
|
||||
consoleApplication: true
|
||||
files: "main.c"
|
||||
|
||||
Group { // Properties for the produced executable
|
||||
fileTagsFilter: product.type
|
||||
qbs.install: true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,4 +4,9 @@ CppApplication {
|
||||
type: "application" // To suppress bundle generation on Mac
|
||||
consoleApplication: true
|
||||
files: "main.cpp"
|
||||
|
||||
Group { // Properties for the produced executable
|
||||
fileTagsFilter: product.type
|
||||
qbs.install: true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,52 +2,124 @@
|
||||
<instructionals module="Qt">
|
||||
<tutorials>
|
||||
<tutorial imageUrl="images/icons/buildrun.png" difficulty="" docUrl="qthelp://org.qt-project.qtcreator/doc/creator-build-example-application.html" projectPath="" name="Building and Running an Example Application">
|
||||
<description><![CDATA[You can test that your installation is successful by opening an existing example application project.]]></description>
|
||||
<description><![CDATA[Testing that your installation is successful by opening an existing example application project.]]></description>
|
||||
<tags>qt creator,build,compile</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/qwidget.png" difficulty="" docUrl="qthelp://org.qt-project.qtcreator/doc/creator-writing-program.html" projectPath="" name="Creating a Qt Widget Based Application">
|
||||
<description><![CDATA[This tutorial describes how to use Qt Creator to create a small Qt application, Text Finder.]]></description>
|
||||
<tags>qt,c++,text,qt designer,qt creator</tags>
|
||||
<description><![CDATA[Using Qt Creator to create a small Qt application, Text Finder.]]></description>
|
||||
<tags>qt creator,qt designer,widgets,c++,text</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/tutorialicon.png" difficulty="" docUrl="qthelp://org.qt-project.qtdoc/qtdoc/gettingstartedqt.html" projectPath="" name="Getting Started Programming with Qt Widgets">
|
||||
<description><![CDATA[Developing Qt applications using C++ and the Qt Widgets module.]]></description>
|
||||
<tags>qt,qt creator,qt designer,widgets,c++</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/qtquick.png" difficulty="" docUrl="qthelp://org.qt-project.qtcreator/doc/creator-qml-application.html" projectPath="" name="Creating a Qt Quick Application">
|
||||
<description><![CDATA[This tutorial uses basic elements and illustrates basic concepts of Qt Quick.]]></description>
|
||||
<tags>qt quick,qml,states,transitions,visual designer,qt creator</tags>
|
||||
<description><![CDATA[Using basic QML elements and learning about basic concepts of Qt Quick.]]></description>
|
||||
<tags>qt creator,qt quick designer,qt quick,qml,states,transitions</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays09.png" difficulty="" projectPath="" name="Qt Creator Bootcamp" isVideo="true" videoUrl="http://developer.qt.nokia.com/videos/watch/qt_creator_bootcamp" videoLength="58:29">
|
||||
<description><![CDATA[All you need to start with Qt Creator - a cross-platform IDE Are you developing cross-platform applications with Qt, but are missing a cross-platform development environment?]]></description>
|
||||
<tags>qt sdk,qt creator</tags>
|
||||
<tutorial imageUrl="images/icons/androidapp.png" difficulty="" docUrl="qthelp://org.qt-project.qtcreator/doc/creator-android-app-tutorial.html" projectPath="" name="Creating an Android Application">
|
||||
<description><![CDATA[Developing Qt Quick applications for Android devices using Qt Quick Controls.]]></description>
|
||||
<tags>qt creator,qt quick designer,qml,android</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays11.png" difficulty="" projectPath="" name="Qt Quick - Rapid User Interface Prototyping" isVideo="true" videoUrl="http://qt-project.org/videos/watch/using-qt-quick-for-rapid-ui-prototyping-and-development" videoLength="55:47">
|
||||
<description><![CDATA[Skip Flash & PhotoShop. Go straight to Qt Quick! Creating an application with a great user experience is a challenge. Traditionally a lot of effort goes into upfront design where tools such as Flash or PhotoShop are used to prototype ideas.]]></description>
|
||||
<tags>qt quick,qml,qt sdk,qt creator</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays10.png" difficulty="" projectPath="" name="Meet Qt Quick" isVideo="true" videoUrl="http://developer.qt.nokia.com/videos/watch/meet_qt_quick" videoLength="1:08:24">
|
||||
<description><![CDATA[The fundamental elements behind Qt Quick and how to quickly create fluid, animated user interfaces! Qt Quick is a set of technologies that makes it easier for developers and designers to create modern and attractive UIs.]]></description>
|
||||
<tags>qt quick, qml</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays11.png" difficulty="" projectPath="" name="What’s new in QtQuick 2.0" isVideo="true" videoUrl="http://qt-project.org/videos/watch/whats-new-in-qtquick-2.0" videoLength="46:10">
|
||||
<description><![CDATA[Qt Quick 1.0 brought a suite of technologies to make it easy for designers and developers to easily create fluid animated interfaces. QtQuick 2.0 takes this further with the introduction of a built-in Scene Graph rendering system and more.]]></description>
|
||||
<tags>qt quick, qml</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays11.png" difficulty="" projectPath="" name="Qt Quick Best Practices and Design Patterns" isVideo="true" videoUrl="http://qt-project.org/videos/watch/qt-quick-best-practices-and-design-patterns" videoLength="48:51">
|
||||
<description><![CDATA[This talk discusses various QML best practices and design patterns for building powerful and scalable Qt Quick applications with QML and C++ code.]]></description>
|
||||
<tags>qt quick, qml</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays12.png" difficulty="" projectPath="" name="What is New in QtWebKit in 5.0" isVideo="true" videoUrl="http://www.youtube.com/watch?v=xEuapSGxaeU" videoLength="1:01:55">
|
||||
<description><![CDATA[The web platform continues to evolve at breakneck speed. With our WebKit port to Qt 5 we are bringing these latest web technologies to the Qt world.]]></description>
|
||||
<tags>qt, webkit</tags>
|
||||
<tutorial imageUrl="images/icons/tutorialicon.png" difficulty="" docUrl="qthelp://org.qt-project.qtdoc/qtdoc/gettingstartedqml.html" projectPath="" name="Getting Started Programming with Qt Quick">
|
||||
<description><![CDATA[Developing Qt Quick applications using QML and C++.]]></description>
|
||||
<tags>qt quick,qml,c++</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays12.png" difficulty="" projectPath="" name="Qt Creator 101" isVideo="true" videoUrl="http://www.youtube.com/watch?v=s7PgHmuFaGY" videoLength="55:38">
|
||||
<description><![CDATA[The presentation provides a short introduction into Qt Creator, demonstrates targeting different environments from within the IDE and highlights new features found in Qt Creator 2.6.]]></description>
|
||||
<description><![CDATA[Getting started with using Qt Creator for cross-platform development.]]></description>
|
||||
<tags>qt creator</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays12.png" difficulty="" projectPath="" name="Qt 5 Roadmap" isVideo="true" videoUrl="http://www.youtube.com/watch?v=3QgG9oYhH-c" videoLength="1:01:43">
|
||||
<description><![CDATA[Qt 5.0 is a major step forward for Qt. It includes many new features and forms a great basis for the years to come. The talk gives an overview over these, as well as an outlook towards upcoming Qt release.]]></description>
|
||||
<tags>qt 5, qt</tags>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Extending Qt Creator Without Writing Code" isVideo="true" videoUrl="http://www.youtube.com/watch?v=DP0lMoLVneY" videoLength="59:49">
|
||||
<description><![CDATA[Customizing Qt Creator to fit your own or your customers' purposes.]]></description>
|
||||
<tags>qt creator,configuration</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays12.png" difficulty="" projectPath="" name="QML Coding, Performance and Debugging: Usage of Tools" isVideo="true" videoUrl="http://www.youtube.com/watch?v=mPXn6L2Wftc" videoLength="53:52">
|
||||
<description><![CDATA[The presentation shows the usage of the various QtQuick tools. The Editor provides code navigation, code completion and validation and context help, among other features.]]></description>
|
||||
<tags>qt quick, qml, qt creator</tags>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Qt Creator Plugin Development" isVideo="true" videoUrl="http://www.youtube.com/watch?v=6AEYgVPjl-s" videoLength="59:49">
|
||||
<description><![CDATA[Adding plugins to Qt Creator.]]></description>
|
||||
<tags>qt creator,plugins</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Targeting Multiple Mobile Platforms with Qt Creator" isVideo="true" videoUrl="http://www.youtube.com/watch?v=jDRup5z2qz0" videoLength="52:38">
|
||||
<description><![CDATA[Using Qt Creator to develop a cross-platform application for mobile devices and other small devices.]]></description>
|
||||
<tags>qt creator,qt quick,qml,c++,android,blackberry,sailfishos</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Step by Step Qt on Android Tutorial" isVideo="true" videoUrl="http://www.youtube.com/watch?v=yhdi6JONtQo" videoLength="1:02:30">
|
||||
<description><![CDATA[Using Qt Creator to develop a Qt Quick application for Android devices.]]></description>
|
||||
<tags>qt creator,qt quick,qml,android</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Qt for iOS" isVideo="true" videoUrl="http://www.youtube.com/watch?v=HNQpJG2F6ow" videoLength="1:00:48">
|
||||
<description><![CDATA[Using Qt Creator to develop a Qt Quick application for iOS that uses sensors and the native camera on the device.]]></description>
|
||||
<tags>qt creator,qt quick,ios,sensors,camera</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Qt Creator for BareMetal Development" isVideo="true" videoUrl="http://www.youtube.com/watch?v=hrKz63Q_Rf0" videoLength="9:35">
|
||||
<description><![CDATA[Using Qt Creator to develop for BareMetal devices.]]></description>
|
||||
<tags>qt creator,baremetal</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Qt on WinRT" isVideo="true" videoUrl="http://www.youtube.com/watch?v=NubVGd_LcxQ" videoLength="50:01">
|
||||
<description><![CDATA[Learning about the experimental Qt on Windows Runtime port.]]></description>
|
||||
<tags>qt,winrt</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Developing Embedded Linux Applications with Qt" isVideo="true" videoUrl="http://www.youtube.com/watch?v=lyQVw1RtaH4" videoLength="53:27">
|
||||
<description><![CDATA[Getting started with developing Qt applications for embedded Linux devices.]]></description>
|
||||
<tags>qt, embedded</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Introduction to Qt Quick Controls" isVideo="true" videoUrl="http://www.youtube.com/watch?v=JLLIYysXsj8" videoLength="57:34">
|
||||
<description><![CDATA[Using Qt Quick Controls, a set of UI elements, to create user interfaces using Qt Quick 2.]]></description>
|
||||
<tags>qt quick,controls</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Adaptable UIs with Qt Quick" isVideo="true" videoUrl="http://www.youtube.com/watch?v=7zlvbHow9Gw" videoLength="46:16">
|
||||
<description><![CDATA[Implementing adaptable Qt QUick UIs using layouts, bindings, file selectors, and loaders.]]></description>
|
||||
<tags>qt quick,layouts,bindings</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Qt Quick and Input Events (Touch, Mouse, Keyboard)" isVideo="true" videoUrl="http://www.youtube.com/watch?v=yTsCkfTAl1s" videoLength="1:07:05">
|
||||
<description><![CDATA[Handling user input with Qt Quick.]]></description>
|
||||
<tags>qt quick,qml,input</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Building 3D OpenGL Scenes with Qt 5 and QML" isVideo="true" videoUrl="http://www.youtube.com/watch?v=29wCpA0DBZI" videoLength="52:38">
|
||||
<description><![CDATA[Using QQuickWindow's OpenGL context to render 3D objects.]]></description>
|
||||
<tags>qt quick,qml,3d</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Integrating Qt Quick with 3D renderers" isVideo="true" videoUrl="http://www.youtube.com/watch?v=BfIaTccy6HQ" videoLength="1:00:04">
|
||||
<description><![CDATA[Integrating Qt Quick with other 3D scene rendering models.]]></description>
|
||||
<tags>qt quick,qt,scenegraph,3d</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Qt 5.2's QML Engine in Depth" isVideo="true" videoUrl="http://www.youtube.com/watch?v=QdyRZApt5ww" videoLength="52:35">
|
||||
<description><![CDATA[Learning about data types in JavaScript and QML, the old and new Qt architecture, and future optimizations to Qt.]]></description>
|
||||
<tags>qt,qml,data types</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="QML Tricks and Treats" isVideo="true" videoUrl="http://www.youtube.com/watch?v=JNDFUHOoPSM" videoLength="56:20">
|
||||
<description><![CDATA[Structuring an application that combines QML and C++ code, looking up QML language scope and names, creating custom views, handling user input, and styling applications.]]></description>
|
||||
<tags>qt quick,qml,c++,build,compile,input,styling</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Speeding up Your Qt App with New QtNetwork Features" isVideo="true" videoUrl="http://www.youtube.com/watch?v=OM9BgcXr9ys" videoLength="49:10">
|
||||
<description><![CDATA[Making applications load network data faster.]]></description>
|
||||
<tags>qt quick,qml,network</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Introducing QtWebEngine" isVideo="true" videoUrl="http://www.youtube.com/watch?v=Pc5zKGmeYN0" videoLength="1:03:06">
|
||||
<description><![CDATA[Introduces the Qt Web Engine technology preview for desktop and embedded platforms.]]></description>
|
||||
<tags>qt,web engine</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="QmlWeb - Running Qt Quick Applications on the Web" isVideo="true" videoUrl="http://www.youtube.com/watch?v=Ea8Maw4FTw8" videoLength="57:05">
|
||||
<description><![CDATA[Taking QML to the web.]]></description>
|
||||
<tags>qml,qt quick,web</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Signals and Slots in Qt 5" isVideo="true" videoUrl="http://www.youtube.com/watch?v=pwNd8gq6PZY" videoLength="55:30">
|
||||
<description><![CDATA[Learning about the signal and slot syntax in Qt 5.]]></description>
|
||||
<tags>qt,signals,slots</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="KDE Frameworks 5: Qt Add-ons Overview" isVideo="true" videoUrl="http://www.youtube.com/watch?v=P5RP46ZUk6s" videoLength="53:27">
|
||||
<description><![CDATA[Using Qt add-ons for data compression, plotting with axis, multithreaded tasks, configuration, modeling items, and core tasks.]]></description>
|
||||
<tags>qt,add-ons,compression,plotting,configuration</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Applied Type Erasure in Qt 5" isVideo="true" videoUrl="http://www.youtube.com/watch?v=MOzQX4C29os" videoLength="45:46">
|
||||
<description><![CDATA[Learning about type erasure based on QVariant and the capabilities introduced in Qt 5.2.]]></description>
|
||||
<tags>qt,data types</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Analysing & Solving Qt UI Performance Problems on Embedded Hardware" isVideo="true" videoUrl="http://www.youtube.com/watch?v=TI_LJkQtZtA" videoLength="50:57">
|
||||
<description><![CDATA[Using trace viewing and analysis and profiling tools to solve typical Qt UI performance problems on embedded devices.]]></description>
|
||||
<tags>qt quick,qml,qt creator,qml profiler,embedded</tags>
|
||||
</tutorial>
|
||||
<tutorial imageUrl="images/icons/ddays13.png" difficulty="" projectPath="" name="Take Your Apps on the Road — an Automotive 101 for Developers" isVideo="true" videoUrl="http://www.youtube.com/watch?v=Hq8XkUtyjsA" videoLength="1:02:36">
|
||||
<description><![CDATA[Developing applications for the automotive industry.]]></description>
|
||||
<tags>qt quick,qml,automotive</tags>
|
||||
</tutorial>
|
||||
</tutorials>
|
||||
</instructionals>
|
||||
|
||||
|
After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 9.1 KiB |
BIN
share/qtcreator/welcomescreen/widgets/images/icons/ddays13.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
@@ -5,7 +5,7 @@ Application {
|
||||
consoleApplication: qbs.debugInformation
|
||||
|
||||
cpp.rpaths: qbs.targetOS.contains("osx") ? ["@executable_path/.."]
|
||||
: ["$ORIGIN/../lib/qtcreator"]
|
||||
: ["$ORIGIN/../" + project.libDirName + "/qtcreator"]
|
||||
cpp.defines: project.generalDefines
|
||||
cpp.linkerFlags: {
|
||||
if (qbs.buildVariant == "release" && (qbs.toolchain.contains("gcc") || qbs.toolchain.contains("mingw")))
|
||||
|
||||
@@ -93,7 +93,8 @@ void FileWidget::comboBoxChanged()
|
||||
|
||||
void FileWidget::onButtonReleased()
|
||||
{
|
||||
QString newFile = QFileDialog::getOpenFileName(0, tr("Open File"), m_path.toLocalFile(), m_filter);
|
||||
QString newFile = QFileDialog::getOpenFileName(this, tr("Open File"),
|
||||
m_path.toLocalFile(), m_filter);
|
||||
if (!newFile.isEmpty())
|
||||
setFileNameStr(newFile);
|
||||
}
|
||||
|
||||
@@ -71,9 +71,8 @@ public:
|
||||
void killProcess();
|
||||
void killStub();
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
qint64 applicationMainThreadID() const;
|
||||
#else
|
||||
#ifndef Q_OS_WIN
|
||||
void detachStub();
|
||||
#endif
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "qtcprocess.h"
|
||||
|
||||
#include <utils/hostosinfo.h>
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QTimer>
|
||||
@@ -64,6 +65,12 @@ ConsoleProcess::ConsoleProcess(QObject *parent) :
|
||||
d->m_process.setProcessChannelMode(QProcess::ForwardedChannels);
|
||||
}
|
||||
|
||||
qint64 ConsoleProcess::applicationMainThreadID() const
|
||||
{
|
||||
QTC_CHECK(false);
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ConsoleProcess::setSettings(QSettings *settings)
|
||||
{
|
||||
d->m_settings = settings;
|
||||
|
||||
@@ -342,7 +342,7 @@ namespace Utils {
|
||||
namespace Internal {
|
||||
QString matchCaseReplacement(const QString &originalText, const QString &replaceText)
|
||||
{
|
||||
if (originalText.isEmpty())
|
||||
if (originalText.isEmpty() || replaceText.isEmpty())
|
||||
return replaceText;
|
||||
|
||||
//Now proceed with actual case matching
|
||||
|
||||
@@ -160,10 +160,10 @@ void AndroidRunner::checkPID()
|
||||
if (m_wasStarted) {
|
||||
m_wasStarted = false;
|
||||
m_checkPIDTimer.stop();
|
||||
emit remoteProcessFinished(tr("\n\n'%1' died.").arg(m_packageName));
|
||||
emit remoteProcessFinished(QLatin1String("\n\n") + tr("\"%1\" died.").arg(m_packageName));
|
||||
} else {
|
||||
if (++m_tries > 3)
|
||||
emit remoteProcessFinished(tr("\n\nUnable to start '%1'").arg(m_packageName));
|
||||
emit remoteProcessFinished(QLatin1String("\n\n") + tr("Unable to start \"%1\"").arg(m_packageName));
|
||||
}
|
||||
} else if (!m_wasStarted){
|
||||
if (m_useCppDebugger) {
|
||||
@@ -343,7 +343,7 @@ void AndroidRunner::stop()
|
||||
m_tries = 0;
|
||||
if (m_processPID != -1) {
|
||||
forceStop();
|
||||
emit remoteProcessFinished(tr("\n\n'%1' terminated.").arg(m_packageName));
|
||||
emit remoteProcessFinished(QLatin1String("\n\n") + tr("\"%1\" terminated.").arg(m_packageName));
|
||||
}
|
||||
//QObject::disconnect(&m_adbLogcatProcess, 0, this, 0);
|
||||
m_adbLogcatProcess.kill();
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/hostosinfo.h>
|
||||
#include <utils/pathchooser.h>
|
||||
#include <projectexplorer/toolchainmanager.h>
|
||||
#include <projectexplorer/kitmanager.h>
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
@@ -136,6 +137,11 @@ AndroidSettingsWidget::AndroidSettingsWidget(QWidget *parent)
|
||||
m_ui->downloadAntToolButton->setVisible(Utils::HostOsInfo::isWindowsHost());
|
||||
m_ui->downloadOpenJDKToolButton->setVisible(Utils::HostOsInfo::isWindowsHost());
|
||||
|
||||
m_ui->SDKLocationPushButton->setText(Utils::PathChooser::browseButtonLabel());
|
||||
m_ui->NDKLocationPushButton->setText(Utils::PathChooser::browseButtonLabel());
|
||||
m_ui->AntLocationPushButton->setText(Utils::PathChooser::browseButtonLabel());
|
||||
m_ui->OpenJDKLocationPushButton->setText(Utils::PathChooser::browseButtonLabel());
|
||||
|
||||
check(All);
|
||||
applyToUi(All);
|
||||
}
|
||||
|
||||
@@ -100,8 +100,8 @@ bool BeautifierPlugin::initialize(const QStringList &arguments, QString *errorSt
|
||||
void BeautifierPlugin::extensionsInitialized()
|
||||
{
|
||||
if (const Core::EditorManager *editorManager = Core::EditorManager::instance()) {
|
||||
connect(editorManager, SIGNAL(currentEditorChanged(Core::IEditor *)),
|
||||
this, SLOT(updateActions(Core::IEditor *)));
|
||||
connect(editorManager, SIGNAL(currentEditorChanged(Core::IEditor*)),
|
||||
this, SLOT(updateActions(Core::IEditor*)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1173,9 +1173,8 @@ void ClangCompletionAssistProcessor::completeIncludePath(const QString &realPath
|
||||
const QStringList &suffixes)
|
||||
{
|
||||
QDirIterator i(realPath, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
|
||||
const QString hint =
|
||||
QObject::tr("Location: ", "Parent folder for proposed #include completion")
|
||||
+ QDir::cleanPath(realPath);
|
||||
//: Parent folder for proposed #include completion
|
||||
const QString hint = tr("Location: %1").arg(QDir::toNativeSeparators(QDir::cleanPath(realPath)));
|
||||
while (i.hasNext()) {
|
||||
const QString fileName = i.next();
|
||||
const QFileInfo fileInfo = i.fileInfo();
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
|
||||
#include <QStringList>
|
||||
#include <QTextCursor>
|
||||
#include <QCoreApplication>
|
||||
|
||||
namespace ClangCodeModel {
|
||||
|
||||
@@ -104,6 +105,8 @@ private:
|
||||
|
||||
class CLANG_EXPORT ClangCompletionAssistProcessor : public TextEditor::IAssistProcessor
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(ClangCodeModel::Internal::ClangCompletionAssistProcessor)
|
||||
|
||||
public:
|
||||
ClangCompletionAssistProcessor();
|
||||
virtual ~ClangCompletionAssistProcessor();
|
||||
|
||||
@@ -53,7 +53,8 @@ QString ModelManagerSupport::id() const
|
||||
|
||||
QString ModelManagerSupport::displayName() const
|
||||
{
|
||||
return QCoreApplication::translate("ModelManagerSupport::displayName",
|
||||
//: Display name
|
||||
return QCoreApplication::translate("ClangCodeModel::Internal::ModelManagerSupport",
|
||||
"Clang");
|
||||
}
|
||||
|
||||
|
||||
@@ -48,8 +48,7 @@ QString ClangProjectSettingsPanelFactory::id() const
|
||||
|
||||
QString ClangProjectSettingsPanelFactory::displayName() const
|
||||
{
|
||||
return QCoreApplication::translate("ClangProjectSettingsPropertiesPage",
|
||||
"Clang Settings");
|
||||
return ClangProjectSettingsWidget::tr("Clang Settings");
|
||||
}
|
||||
|
||||
int ClangProjectSettingsPanelFactory::priority() const
|
||||
@@ -67,9 +66,7 @@ bool ClangProjectSettingsPanelFactory::supports(Project *project)
|
||||
PropertiesPanel *ClangProjectSettingsPanelFactory::createPanel(Project *project)
|
||||
{
|
||||
PropertiesPanel *panel = new PropertiesPanel;
|
||||
panel->setDisplayName(QCoreApplication::translate(
|
||||
"ClangProjectSettingsPropertiesPage",
|
||||
"Clang Settings"));
|
||||
panel->setDisplayName(ClangProjectSettingsWidget::tr("Clang Settings"));
|
||||
panel->setWidget(new ClangProjectSettingsWidget(project));
|
||||
return panel;
|
||||
}
|
||||
|
||||
@@ -96,7 +96,8 @@ void CompletionProposalsBuilder::operator ()(const CXCompletionResult &cxResult)
|
||||
|
||||
if (m_resultAvailability == CodeCompletionResult::Deprecated) {
|
||||
m_comment += QLatin1String("<b>@note</b> ");
|
||||
m_comment += QCoreApplication::translate("deprecated C++ symbol", "Is deprecated");
|
||||
//: deprecated C++ symbol
|
||||
m_comment += tr("Is deprecated");
|
||||
}
|
||||
|
||||
m_hint = QLatin1String("<p>");
|
||||
@@ -675,9 +676,9 @@ void CompletionProposalsBuilder::concatSlotSignalSignature(const CXCompletionStr
|
||||
|
||||
const QString parent = Internal::getQString(clang_getCompletionParent(cxString, NULL));
|
||||
if (m_resultKind == CodeCompletionResult::SlotCompletionKind)
|
||||
m_hint += QObject::tr("Slot of %1, returns %2").arg(parent).arg(resultType);
|
||||
m_hint += tr("Slot of %1, returns %2").arg(parent, resultType);
|
||||
else
|
||||
m_hint += QObject::tr("Signal of %1, returns %2").arg(parent).arg(resultType);
|
||||
m_hint += tr("Signal of %1, returns %2").arg(parent, resultType);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -34,10 +34,14 @@
|
||||
#include "clang_global.h"
|
||||
#include <clang-c/Index.h>
|
||||
|
||||
#include <QCoreApplication>
|
||||
|
||||
namespace ClangCodeModel {
|
||||
|
||||
class CLANG_EXPORT CompletionProposalsBuilder
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(ClangCodeModel::CompletionProposalsBuilder)
|
||||
|
||||
public:
|
||||
CompletionProposalsBuilder(QList<CodeCompletionResult> &results, quint64 contexts, bool isSignalSlotCompletion);
|
||||
void operator ()(const CXCompletionResult &cxResult);
|
||||
|
||||
@@ -52,11 +52,11 @@ const QString Diagnostic::severityAsString() const
|
||||
return QString();
|
||||
|
||||
static QStringList strs = QStringList()
|
||||
<< QCoreApplication::translate("Diagnostic", "ignored")
|
||||
<< QCoreApplication::translate("Diagnostic", "note")
|
||||
<< QCoreApplication::translate("Diagnostic", "warning")
|
||||
<< QCoreApplication::translate("Diagnostic", "error")
|
||||
<< QCoreApplication::translate("Diagnostic", "fatal")
|
||||
<< QCoreApplication::translate("ClangCodeModel::Diagnostic", "ignored")
|
||||
<< QCoreApplication::translate("ClangCodeModel::Diagnostic", "note")
|
||||
<< QCoreApplication::translate("ClangCodeModel::Diagnostic", "warning")
|
||||
<< QCoreApplication::translate("ClangCodeModel::Diagnostic", "error")
|
||||
<< QCoreApplication::translate("ClangCodeModel::Diagnostic", "fatal")
|
||||
;
|
||||
|
||||
return strs.at(m_severity);
|
||||
|
||||
@@ -232,7 +232,8 @@ void ReadOnlyFilesDialog::promptFailWarning(const QStringList &files, ReadOnlyRe
|
||||
} else {
|
||||
title = tr("Could Not Change Permissions on Some Files");
|
||||
message = d->failWarning;
|
||||
message += tr("\nSee details for a complete list of files.");
|
||||
message += QLatin1Char('\n');
|
||||
message += tr("See details for a complete list of files.");
|
||||
details = files.join(QLatin1String("\n"));
|
||||
}
|
||||
QMessageBox msgBox(QMessageBox::Warning, title, message);
|
||||
|
||||
@@ -349,7 +349,6 @@ void MainWindow::extensionsInitialized()
|
||||
updateContext();
|
||||
|
||||
emit m_coreImpl->coreAboutToOpen();
|
||||
show();
|
||||
// Delay restoreWindowState, since it is overridden by LayoutRequest event
|
||||
QTimer::singleShot(0, this, SLOT(restoreWindowState()));
|
||||
QTimer::singleShot(0, m_coreImpl, SIGNAL(coreOpened()));
|
||||
@@ -1270,4 +1269,5 @@ void MainWindow::restoreWindowState()
|
||||
resize(1008, 700); // size without window decoration
|
||||
restoreState(m_settings->value(QLatin1String(windowStateKey)).toByteArray());
|
||||
m_settings->endGroup();
|
||||
show();
|
||||
}
|
||||
|
||||
@@ -12,9 +12,9 @@ QtcTool {
|
||||
Depends { name: "CppTools" }
|
||||
|
||||
cpp.rpaths: [
|
||||
"$ORIGIN/../lib/qtcreator",
|
||||
"$ORIGIN/../lib/qtcreator/plugins",
|
||||
"$ORIGIN/../lib/qtcreator/plugins/QtProject"
|
||||
"$ORIGIN/../" + project.libDirName + "/qtcreator",
|
||||
"$ORIGIN/../" + project.libDirName + "/qtcreator/plugins",
|
||||
"$ORIGIN/../" + project.libDirName + "/qtcreator/plugins/QtProject"
|
||||
]
|
||||
|
||||
Group {
|
||||
|
||||
@@ -224,11 +224,14 @@ void CppHighlighter::highlightBlock(const QString &text)
|
||||
if (text.length() > lastTokenEnd)
|
||||
highlightLine(text, lastTokenEnd, text.length() - lastTokenEnd, formatForCategory(CppVisualWhitespace));
|
||||
|
||||
if (!initialLexerState && lexerState && !tokens.isEmpty() && tokens.last().isComment()) {
|
||||
if (!initialLexerState && lexerState && !tokens.isEmpty()) {
|
||||
const Token &lastToken = tokens.last();
|
||||
if (lastToken.is(T_COMMENT) || lastToken.is(T_DOXY_COMMENT)) {
|
||||
parentheses.append(Parenthesis(Parenthesis::Opened, QLatin1Char('+'),
|
||||
tokens.last().begin()));
|
||||
lastToken.begin()));
|
||||
++braceDepth;
|
||||
}
|
||||
}
|
||||
|
||||
BaseTextDocumentLayout::setParentheses(currentBlock(), parentheses);
|
||||
|
||||
|
||||
@@ -1804,7 +1804,7 @@ void DebuggerEngine::checkForReleaseBuild(const DebuggerStartParameters &sp)
|
||||
|
||||
foreach (const QByteArray &name, interesting) {
|
||||
const QString found = seen.contains(name) ? tr("Found.") : tr("Not found.");
|
||||
detailedWarning.append(tr("\nSection %1: %2").arg(_(name)).arg(found));
|
||||
detailedWarning.append(QLatin1Char('\n') + tr("Section %1: %2").arg(_(name)).arg(found));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
using namespace Utils;
|
||||
|
||||
namespace Debugger {
|
||||
namespace Internal {
|
||||
|
||||
@@ -120,12 +122,11 @@ void GdbTermEngine::setupInferior()
|
||||
{
|
||||
QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
|
||||
const qint64 attachedPID = m_stubProc.applicationPID();
|
||||
#ifdef Q_OS_WIN
|
||||
const qint64 attachedMainThreadID = m_stubProc.applicationMainThreadID();
|
||||
showMessage(QString::fromLatin1("Attaching to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID), LogMisc);
|
||||
#else
|
||||
showMessage(QString::fromLatin1("Attaching to %1").arg(attachedPID), LogMisc);
|
||||
#endif
|
||||
const QString msg = (attachedMainThreadID != -1)
|
||||
? QString::fromLatin1("Attaching to %1 (%2)").arg(attachedPID).arg(attachedMainThreadID)
|
||||
: QString::fromLatin1("Attaching to %1").arg(attachedPID);
|
||||
showMessage(msg, LogMisc);
|
||||
notifyInferiorPid(attachedPID);
|
||||
postCommand("attach " + QByteArray::number(attachedPID),
|
||||
CB(handleStubAttached));
|
||||
@@ -143,11 +144,7 @@ void GdbTermEngine::handleStubAttached(const GdbResponse &response)
|
||||
} else {
|
||||
QString errorMessage;
|
||||
// Resume thread that was suspended by console stub process (see stub code).
|
||||
#ifdef Q_OS_WIN
|
||||
const qint64 mainThreadId = m_stubProc.applicationMainThreadID();
|
||||
#else
|
||||
const qint64 mainThreadId = -1;
|
||||
#endif
|
||||
if (winResumeThread(mainThreadId, &errorMessage)) {
|
||||
showMessage(QString::fromLatin1("Inferior attached, thread %1 resumed").
|
||||
arg(mainThreadId), LogMisc);
|
||||
|
||||
@@ -2876,8 +2876,8 @@ QString GitClient::extendedShowDescription(const QString &workingDirectory, cons
|
||||
// If there are more than 20 branches, list first 10 followed by a hint
|
||||
if (branchCount > 20) {
|
||||
const int leave = 10;
|
||||
//: Displayed after the untranslated message "Branches: branch1, branch2 'and %1 more'" in git show.
|
||||
moreBranches = QLatin1Char(' ') + tr("and %1 more", 0, branchCount - leave);
|
||||
//: Displayed after the untranslated message "Branches: branch1, branch2 'and %n more'" in git show.
|
||||
moreBranches = QLatin1Char(' ') + tr("and %n more", 0, branchCount - leave);
|
||||
branches.erase(branches.begin() + leave, branches.end());
|
||||
}
|
||||
if (!branches.isEmpty()) {
|
||||
|
||||
@@ -868,11 +868,14 @@ void HelpPlugin::activateContext()
|
||||
links = HelpManager::linksForIdentifier(m_idFromContext);
|
||||
if (links.isEmpty()) {
|
||||
// Maybe this is already an URL...
|
||||
// Require protocol specifier, otherwise most strings would be 'local file names'
|
||||
if (m_idFromContext.contains(QLatin1Char(':'))) {
|
||||
QUrl url(m_idFromContext);
|
||||
if (url.isValid())
|
||||
links.insert(m_idFromContext, m_idFromContext);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (HelpViewer* viewer = viewerForContextMode()) {
|
||||
if (links.isEmpty()) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<plugin name=\"Ios\" version=\"$$QTCREATOR_VERSION\" compatVersion=\"$$QTCREATOR_VERSION\" experimental=\"true\">
|
||||
<plugin name=\"Ios\" version=\"$$QTCREATOR_VERSION\" compatVersion=\"$$QTCREATOR_VERSION\">
|
||||
<vendor>Digia Plc</vendor>
|
||||
<copyright>(C) 2014 Digia Plc</copyright>
|
||||
<platform>Mac OS.*</platform>
|
||||
|
||||
@@ -170,7 +170,8 @@ void DeviceUsedPortsGatherer::handleProcessClosed(int exitStatus)
|
||||
|
||||
if (!errMsg.isEmpty()) {
|
||||
if (!d->remoteStderr.isEmpty()) {
|
||||
errMsg += tr("\nRemote error output was: %1")
|
||||
errMsg += QLatin1Char('\n');
|
||||
errMsg += tr("Remote error output was: %1")
|
||||
.arg(QString::fromUtf8(d->remoteStderr));
|
||||
}
|
||||
emit error(errMsg);
|
||||
|
||||
@@ -118,7 +118,7 @@ void SshDeviceProcessList::handleProcessError(const QString &errorMessage)
|
||||
QString fullMessage = errorMessage;
|
||||
const QByteArray remoteStderr = d->process.readAllStandardError();
|
||||
if (!remoteStderr.isEmpty())
|
||||
fullMessage += tr("\nRemote stderr was: %1").arg(QString::fromUtf8(remoteStderr));
|
||||
fullMessage += QLatin1Char('\n') + tr("Remote stderr was: %1").arg(QString::fromUtf8(remoteStderr));
|
||||
reportError(fullMessage);
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,8 @@ using namespace ProjectExplorer;
|
||||
|
||||
namespace {
|
||||
// optional full path, make executable name, optional exe extension, optional number in square brackets, colon space
|
||||
const char * const MAKE_PATTERN("^(([A-Za-z]:)?[/\\\\][^:]*[/\\\\])?(mingw(32|64)-|g)?make(.exe)?(\\[\\d+\\])?:\\s");
|
||||
const char * const MAKEEXEC_PATTERN("^(.*[/\\\\])?(mingw(32|64)-|g)?make(.exe)?(\\[\\d+\\])?:\\s");
|
||||
const char * const MAKEFILE_PATTERN("^((.*[/\\\\])?[Mm]akefile(\\.[a-zA-Z]+)?):(\\d+):\\s");
|
||||
}
|
||||
|
||||
GnuMakeParser::GnuMakeParser() :
|
||||
@@ -49,16 +50,16 @@ GnuMakeParser::GnuMakeParser() :
|
||||
m_fatalErrorCount(0)
|
||||
{
|
||||
setObjectName(QLatin1String("GnuMakeParser"));
|
||||
m_makeDir.setPattern(QLatin1String(MAKE_PATTERN) +
|
||||
m_makeDir.setPattern(QLatin1String(MAKEEXEC_PATTERN) +
|
||||
QLatin1String("(\\w+) directory .(.+).$"));
|
||||
m_makeDir.setMinimal(true);
|
||||
QTC_CHECK(m_makeDir.isValid());
|
||||
m_makeLine.setPattern(QLatin1String(MAKE_PATTERN) + QLatin1String("(\\*\\*\\*\\s)?(.*)$"));
|
||||
m_makeLine.setPattern(QLatin1String(MAKEEXEC_PATTERN) + QLatin1String("(.*)$"));
|
||||
m_makeLine.setMinimal(true);
|
||||
QTC_CHECK(m_makeLine.isValid());
|
||||
m_makefileError.setPattern(QLatin1String("^(.*):(\\d+):\\s\\*\\*\\*\\s(.*)$"));
|
||||
m_makefileError.setMinimal(true);
|
||||
QTC_CHECK(m_makefileError.isValid());
|
||||
m_errorInMakefile.setPattern(QLatin1String(MAKEFILE_PATTERN) + QLatin1String("(.*)$"));
|
||||
m_errorInMakefile.setMinimal(true);
|
||||
QTC_CHECK(m_errorInMakefile.isValid());
|
||||
}
|
||||
|
||||
void GnuMakeParser::setWorkingDirectory(const QString &workingDirectory)
|
||||
@@ -77,47 +78,67 @@ void GnuMakeParser::stdOutput(const QString &line)
|
||||
const QString lne = rightTrimmed(line);
|
||||
|
||||
if (m_makeDir.indexIn(lne) > -1) {
|
||||
if (m_makeDir.cap(7) == QLatin1String("Leaving"))
|
||||
removeDirectory(m_makeDir.cap(8));
|
||||
if (m_makeDir.cap(6) == QLatin1String("Leaving"))
|
||||
removeDirectory(m_makeDir.cap(7));
|
||||
else
|
||||
addDirectory(m_makeDir.cap(8));
|
||||
addDirectory(m_makeDir.cap(7));
|
||||
return;
|
||||
}
|
||||
|
||||
IOutputParser::stdOutput(line);
|
||||
}
|
||||
|
||||
class Result {
|
||||
public:
|
||||
Result() : isFatal(false), type(Task::Error) { }
|
||||
|
||||
QString description;
|
||||
bool isFatal;
|
||||
Task::TaskType type;
|
||||
};
|
||||
|
||||
static Result parseDescription(const QString &description)
|
||||
{
|
||||
Result result;
|
||||
if (description.startsWith(QLatin1String("warning: "), Qt::CaseInsensitive)) {
|
||||
result.description = description.mid(9);
|
||||
result.type = Task::Warning;
|
||||
result.isFatal = false;
|
||||
} else if (description.startsWith(QLatin1String("*** "))) {
|
||||
result.description = description.mid(4);
|
||||
result.type = Task::Error;
|
||||
result.isFatal = true;
|
||||
} else {
|
||||
result.description = description;
|
||||
result.type = Task::Error;
|
||||
result.isFatal = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void GnuMakeParser::stdError(const QString &line)
|
||||
{
|
||||
const QString lne = rightTrimmed(line);
|
||||
|
||||
if (m_makefileError.indexIn(lne) > -1) {
|
||||
if (m_errorInMakefile.indexIn(lne) > -1) {
|
||||
Result res = parseDescription(m_errorInMakefile.cap(5));
|
||||
if (res.isFatal)
|
||||
++m_fatalErrorCount;
|
||||
if (!m_suppressIssues) {
|
||||
m_suppressIssues = true;
|
||||
emit addTask(Task(Task::Error,
|
||||
m_makefileError.cap(3),
|
||||
Utils::FileName::fromUserInput(m_makefileError.cap(1)),
|
||||
m_makefileError.cap(2).toInt(),
|
||||
taskAdded(Task(res.type, res.description,
|
||||
Utils::FileName::fromUserInput(m_errorInMakefile.cap(1)) /* filename */,
|
||||
m_errorInMakefile.cap(4).toInt(), /* line */
|
||||
Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)));
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (m_makeLine.indexIn(lne) > -1) {
|
||||
if (!m_makeLine.cap(7).isEmpty())
|
||||
Result res = parseDescription(m_makeLine.cap(6));
|
||||
if (res.isFatal)
|
||||
++m_fatalErrorCount;
|
||||
if (!m_suppressIssues) {
|
||||
m_suppressIssues = true;
|
||||
QString description = m_makeLine.cap(8);
|
||||
Task::TaskType type = Task::Error;
|
||||
if (description.startsWith(QLatin1String("warning: "), Qt::CaseInsensitive)) {
|
||||
description = description.mid(9);
|
||||
type = Task::Warning;
|
||||
}
|
||||
|
||||
emit addTask(Task(type, description,
|
||||
Utils::FileName() /* filename */,
|
||||
-1, /* line */
|
||||
taskAdded(Task(res.type, res.description,
|
||||
Utils::FileName() /* filename */, -1, /* line */
|
||||
Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)));
|
||||
}
|
||||
return;
|
||||
@@ -368,6 +389,18 @@ void ProjectExplorerPlugin::testGnuMakeParserParsing_data()
|
||||
Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)))
|
||||
<< QString()
|
||||
<< QStringList();
|
||||
QTest::newRow("warning in Makefile")
|
||||
<< QStringList()
|
||||
<< QString::fromLatin1("Makefile:794: warning: overriding commands for target `xxxx.app/Contents/Info.plist'")
|
||||
<< OutputParserTester::STDERR
|
||||
<< QString() << QString()
|
||||
<< (QList<Task>()
|
||||
<< Task(Task::Warning,
|
||||
QString::fromLatin1("overriding commands for target `xxxx.app/Contents/Info.plist'"),
|
||||
Utils::FileName::fromString(QLatin1String("Makefile")), 794,
|
||||
Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)))
|
||||
<< QString()
|
||||
<< QStringList();
|
||||
}
|
||||
|
||||
void ProjectExplorerPlugin::testGnuMakeParserParsing()
|
||||
|
||||
@@ -62,7 +62,8 @@ private:
|
||||
|
||||
QRegExp m_makeDir;
|
||||
QRegExp m_makeLine;
|
||||
QRegExp m_makefileError;
|
||||
QRegExp m_threeStarError;
|
||||
QRegExp m_errorInMakefile;
|
||||
|
||||
QStringList m_directories;
|
||||
|
||||
|
||||
@@ -230,7 +230,7 @@ struct ProjectExplorerPluginPrivate {
|
||||
Internal::AppOutputPane *m_outputPane;
|
||||
|
||||
QList<QPair<QString, QString> > m_recentProjects; // pair of filename, displayname
|
||||
static const int m_maxRecentProjects = 7;
|
||||
static const int m_maxRecentProjects = 25;
|
||||
|
||||
QString m_lastOpenDirectory;
|
||||
RunConfiguration *m_delayedRunConfiguration;
|
||||
@@ -2938,7 +2938,9 @@ void ProjectExplorerPlugin::removeFile()
|
||||
return;
|
||||
}
|
||||
|
||||
DocumentManager::expectFileChange(filePath);
|
||||
Core::FileUtils::removeFile(filePath, deleteFile);
|
||||
DocumentManager::unexpectFileChange(filePath);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -136,13 +136,17 @@ bool sortNodes(Node *n1, Node *n2)
|
||||
|
||||
// must be file nodes
|
||||
{
|
||||
int result = caseFriendlyCompare(n1->displayName(), n2->displayName());
|
||||
if (result != 0)
|
||||
return result < 0;
|
||||
|
||||
const QString filePath1 = n1->path();
|
||||
const QString filePath2 = n2->path();
|
||||
|
||||
const QString fileName1 = QFileInfo(filePath1).fileName();
|
||||
const QString fileName2 = QFileInfo(filePath2).fileName();
|
||||
|
||||
int result = caseFriendlyCompare(fileName1, fileName2);
|
||||
result = caseFriendlyCompare(fileName1, fileName2);
|
||||
if (result != 0) {
|
||||
return result < 0; // sort by filename
|
||||
} else {
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
#include "ui_qbsbuildstepconfigwidget.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <projectexplorer/buildsteplist.h>
|
||||
#include <projectexplorer/kit.h>
|
||||
#include <projectexplorer/projectexplorerconstants.h>
|
||||
@@ -234,16 +235,26 @@ QVariantMap QbsBuildStep::toMap() const
|
||||
|
||||
void QbsBuildStep::buildingDone(bool success)
|
||||
{
|
||||
m_lastWasSuccess = success;
|
||||
// Report errors:
|
||||
foreach (const qbs::ErrorItem &item, m_job->error().items())
|
||||
createTaskAndOutput(ProjectExplorer::Task::Error, item.description(),
|
||||
item.codeLocation().fileName(), item.codeLocation().line());
|
||||
|
||||
// Building can uncover additional target artifacts.
|
||||
static_cast<QbsProject *>(project())->parseCurrentBuildConfiguration(true);
|
||||
QbsProject *pro = static_cast<QbsProject *>(project());
|
||||
connect(pro, SIGNAL(projectParsingDone(bool)), this, SLOT(reparsingDone()));
|
||||
|
||||
// Building can uncover additional target artifacts.
|
||||
// Wait for reparsing to finish, since before that our run configurations may not be valid.
|
||||
pro->parseCurrentBuildConfiguration(true);
|
||||
}
|
||||
|
||||
void QbsBuildStep::reparsingDone()
|
||||
{
|
||||
disconnect(static_cast<QbsProject *>(project()), SIGNAL(projectParsingDone(bool)),
|
||||
this, SLOT(reparsingDone()));
|
||||
QTC_ASSERT(m_fi, return);
|
||||
m_fi->reportResult(success);
|
||||
m_fi->reportResult(m_lastWasSuccess);
|
||||
m_fi = 0; // do not delete, it is not ours
|
||||
m_job->deleteLater();
|
||||
m_job = 0;
|
||||
@@ -421,6 +432,8 @@ void QbsBuildStepConfigWidget::updateState()
|
||||
m_ui->buildVariantComboBox->setCurrentIndex(idx);
|
||||
|
||||
QString command = QLatin1String("qbs build ");
|
||||
command += QString::fromLatin1("--settings-dir ")
|
||||
+ QDir::toNativeSeparators(Core::ICore::userResourcePath()) + QLatin1String(" ");
|
||||
if (m_step->dryRun())
|
||||
command += QLatin1String("--dry-run ");
|
||||
if (m_step->keepGoing())
|
||||
|
||||
@@ -80,6 +80,7 @@ signals:
|
||||
|
||||
private slots:
|
||||
void buildingDone(bool success);
|
||||
void reparsingDone();
|
||||
void handleTaskStarted(const QString &desciption, int max);
|
||||
void handleProgress(int value);
|
||||
void handleCommandDescriptionReport(const QString &highlight, const QString &message);
|
||||
@@ -108,6 +109,7 @@ private:
|
||||
QFutureInterface<bool> *m_fi;
|
||||
qbs::BuildJob *m_job;
|
||||
int m_progressBase;
|
||||
bool m_lastWasSuccess;
|
||||
ProjectExplorer::IOutputParser *m_parser;
|
||||
|
||||
friend class QbsBuildStepConfigWidget;
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
#include "ui_qbsinstallstepconfigwidget.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <projectexplorer/buildsteplist.h>
|
||||
#include <projectexplorer/deployconfiguration.h>
|
||||
#include <projectexplorer/kit.h>
|
||||
@@ -312,6 +313,8 @@ void QbsInstallStepConfigWidget::updateState()
|
||||
m_ui->installRootChooser->setBaseDirectory(data.buildDirectory());
|
||||
|
||||
QString command = QLatin1String("qbs install ");
|
||||
command += QString::fromLatin1("--settings-dir ")
|
||||
+ QDir::toNativeSeparators(Core::ICore::userResourcePath()) + QLatin1String(" ");
|
||||
if (m_step->dryRun())
|
||||
command += QLatin1String("--dry-run ");
|
||||
if (m_step->keepGoing())
|
||||
|
||||
@@ -362,6 +362,12 @@ void QbsProject::buildConfigurationChanged(BuildConfiguration *bc)
|
||||
|
||||
void QbsProject::startParsing()
|
||||
{
|
||||
// Qbs does update the build graph during the build. So we cannot
|
||||
// start to parse while a build is running or we will lose information.
|
||||
// Just return since the qbsbuildstep will trigger a reparse after the build.
|
||||
if (ProjectExplorer::BuildManager::isBuilding(this))
|
||||
return;
|
||||
|
||||
parseCurrentBuildConfiguration(false);
|
||||
}
|
||||
|
||||
@@ -383,12 +389,6 @@ void QbsProject::parseCurrentBuildConfiguration(bool force)
|
||||
if (!m_forceParsing)
|
||||
m_forceParsing = force;
|
||||
|
||||
// Qbs does update the build graph during the build. So we cannot
|
||||
// start to parse while a build is running or we will lose information.
|
||||
// Just return since the qbsbuildstep will trigger a reparse after the build.
|
||||
if (ProjectExplorer::BuildManager::isBuilding(this))
|
||||
return;
|
||||
|
||||
if (!activeTarget())
|
||||
return;
|
||||
QbsBuildConfiguration *bc = qobject_cast<QbsBuildConfiguration *>(activeTarget()->activeBuildConfiguration());
|
||||
@@ -727,7 +727,7 @@ QString QbsProject::pluginsBaseDirectory() const
|
||||
if (!qbsInstallDir.isEmpty())
|
||||
return qbsInstallDir + QLatin1String("/lib/");
|
||||
return QDir::cleanPath(QCoreApplication::applicationDirPath()
|
||||
+ QLatin1String("/../lib/qtcreator"));
|
||||
+ QLatin1String("/../" IDE_LIBRARY_BASENAME "/qtcreator"));
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -476,7 +476,13 @@ void QbsProjectManagerPlugin::buildProducts(QbsProject *project, const QStringLi
|
||||
|
||||
void QbsProjectManagerPlugin::reparseCurrentProject()
|
||||
{
|
||||
if (m_currentProject)
|
||||
if (!m_currentProject || BuildManager::isBuilding(m_currentProject)) {
|
||||
// Qbs does update the build graph during the build. So we cannot
|
||||
// start to parse while a build is running or we will lose information.
|
||||
// Just return since the qbsbuildstep will trigger a reparse after the build.
|
||||
return;
|
||||
}
|
||||
|
||||
m_currentProject->parseCurrentBuildConfiguration(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -141,6 +141,9 @@ void QbsRunConfiguration::ctor()
|
||||
connect(target(), SIGNAL(activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration*)),
|
||||
this, SLOT(installStepChanged()));
|
||||
installStepChanged();
|
||||
|
||||
if (isConsoleApplication())
|
||||
m_runMode = Console;
|
||||
}
|
||||
|
||||
QWidget *QbsRunConfiguration::createConfigurationWidget()
|
||||
@@ -206,13 +209,10 @@ QString QbsRunConfiguration::executable() const
|
||||
|
||||
ProjectExplorer::LocalApplicationRunConfiguration::RunMode QbsRunConfiguration::runMode() const
|
||||
{
|
||||
if (forcedGuiMode())
|
||||
return LocalApplicationRunConfiguration::Gui;
|
||||
|
||||
return m_runMode;
|
||||
}
|
||||
|
||||
bool QbsRunConfiguration::forcedGuiMode() const
|
||||
bool QbsRunConfiguration::isConsoleApplication() const
|
||||
{
|
||||
QbsProject *pro = static_cast<QbsProject *>(target()->project());
|
||||
const qbs::ProductData product = findProduct(pro->qbsProjectData(), m_qbsProduct);
|
||||
@@ -358,6 +358,7 @@ QbsRunConfigurationWidget::QbsRunConfigurationWidget(QbsRunConfiguration *rc, QW
|
||||
|
||||
m_executableLineEdit = new QLineEdit(this);
|
||||
m_executableLineEdit->setEnabled(false);
|
||||
m_executableLineEdit->setPlaceholderText(tr("<unknown>"));
|
||||
toplayout->addRow(tr("Executable:"), m_executableLineEdit);
|
||||
|
||||
QLabel *argumentsLabel = new QLabel(tr("Arguments:"), this);
|
||||
@@ -388,8 +389,6 @@ QbsRunConfigurationWidget::QbsRunConfigurationWidget(QbsRunConfiguration *rc, QW
|
||||
|
||||
QHBoxLayout *innerBox = new QHBoxLayout();
|
||||
m_useTerminalCheck = new QCheckBox(tr("Run in terminal"), this);
|
||||
m_useTerminalCheck->setChecked(m_rc->runMode() == ProjectExplorer::LocalApplicationRunConfiguration::Console);
|
||||
m_useTerminalCheck->setVisible(!m_rc->forcedGuiMode());
|
||||
innerBox->addWidget(m_useTerminalCheck);
|
||||
|
||||
innerBox->addStretch();
|
||||
@@ -436,6 +435,8 @@ void QbsRunConfigurationWidget::runConfigurationEnabledChange()
|
||||
m_disabledIcon->setVisible(!enabled);
|
||||
m_disabledReason->setVisible(!enabled);
|
||||
m_disabledReason->setText(m_rc->disabledReason());
|
||||
|
||||
m_useTerminalCheck->setChecked(m_rc->runMode() == ProjectExplorer::LocalApplicationRunConfiguration::Console);
|
||||
targetInformationHasChanged();
|
||||
}
|
||||
|
||||
@@ -495,10 +496,8 @@ void QbsRunConfigurationWidget::commandLineArgumentsChanged(const QString &args)
|
||||
|
||||
void QbsRunConfigurationWidget::runModeChanged(ProjectExplorer::LocalApplicationRunConfiguration::RunMode runMode)
|
||||
{
|
||||
if (!m_ignoreChange) {
|
||||
m_useTerminalCheck->setVisible(!m_rc->forcedGuiMode());
|
||||
if (!m_ignoreChange)
|
||||
m_useTerminalCheck->setChecked(runMode == ProjectExplorer::LocalApplicationRunConfiguration::Console);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
@@ -564,10 +563,11 @@ QList<Core::Id> QbsRunConfigurationFactory::availableCreationIds(ProjectExplorer
|
||||
if (!project || !project->qbsProject().isValid())
|
||||
return result;
|
||||
|
||||
foreach (const qbs::ProductData &product, project->qbsProjectData().allProducts()) {
|
||||
if (!project->qbsProject().targetExecutable(product, qbs::InstallOptions()).isEmpty())
|
||||
// Create one RC per product. There is no information on what those products actually
|
||||
// are or whether they are going to get installed before a project is built.
|
||||
foreach (const qbs::ProductData &product, project->qbsProjectData().allProducts())
|
||||
result << Core::Id::fromString(QString::fromLatin1(QBS_RC_PREFIX) + product.name());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,6 @@ public:
|
||||
|
||||
QString executable() const;
|
||||
RunMode runMode() const;
|
||||
bool forcedGuiMode() const;
|
||||
QString workingDirectory() const;
|
||||
QString commandLineArguments() const;
|
||||
|
||||
@@ -91,6 +90,7 @@ public:
|
||||
void addToBaseEnvironment(Utils::Environment &env) const;
|
||||
|
||||
QString qbsProduct() const;
|
||||
bool isConsoleApplication() const;
|
||||
|
||||
signals:
|
||||
void commandLineArgumentsChanged(const QString&);
|
||||
|
||||
@@ -12,6 +12,7 @@ QTC_PLUGIN_DEPENDS += \
|
||||
INCLUDEPATH *= \
|
||||
$$PWD \
|
||||
$$PWD/../../../share/qtcreator/qml/qmlpuppet/interfaces \
|
||||
$$PWD/../../../share/qtcreator/qml/qmlpuppet/types \
|
||||
$$PWD/designercore \
|
||||
$$PWD/designercore/include \
|
||||
$$PWD/components/componentcore \
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
#include <qmljs/qmljsdocument.h>
|
||||
#include <qmljs/qmljspropertyreader.h>
|
||||
#include <qmljs/qmljsrewriter.h>
|
||||
#include <qmljs/qmljsindenter.h>
|
||||
#include <qmljstools/qmljsindenter.h>
|
||||
#include <qmljs/qmljscontext.h>
|
||||
#include <qmljs/qmljsbind.h>
|
||||
#include <qmljs/qmljsscopebuilder.h>
|
||||
@@ -327,24 +327,7 @@ void QuickToolBar::setProperty(const QString &propertyName, const QVariant &valu
|
||||
m_editor->convertPosition(changeSetPos, &line, &column); //get line
|
||||
m_editor->convertPosition(changeSetPos + changeSetLength, &endLine, &column); //get line
|
||||
|
||||
if (line > 0) {
|
||||
TextEditor::TabSettings ts = m_editor->baseTextDocument()->tabSettings();
|
||||
QmlJSIndenter indenter;
|
||||
indenter.setTabSize(ts.m_tabSize);
|
||||
indenter.setIndentSize(ts.m_indentSize);
|
||||
|
||||
for (int i=line;i<=endLine;i++) {
|
||||
QTextBlock start = m_editor->baseTextDocument()->document()->findBlockByNumber(i);
|
||||
QTextBlock end = m_editor->baseTextDocument()->document()->findBlockByNumber(i);
|
||||
|
||||
if (end.isValid()) {
|
||||
const int indent = indenter.indentForBottomLine(m_editor->baseTextDocument()
|
||||
->document()->begin(),
|
||||
end.next(), QChar::Null);
|
||||
ts.indentLine(start, indent);
|
||||
}
|
||||
}
|
||||
}
|
||||
indentLines(line, endLine);
|
||||
tc.endEditBlock();
|
||||
}
|
||||
}
|
||||
@@ -439,6 +422,21 @@ void QuickToolBar::onEnabledChanged(bool b)
|
||||
settings.set();
|
||||
}
|
||||
|
||||
void QuickToolBar::indentLines(int startLine, int endLine)
|
||||
{
|
||||
if (startLine > 0) {
|
||||
TextEditor::TabSettings tabSettings = m_editor->baseTextDocument()->tabSettings();
|
||||
for (int i = startLine; i <= endLine; i++) {
|
||||
QTextBlock start = m_editor->editorWidget()->document()->findBlockByNumber(i);
|
||||
|
||||
if (start.isValid()) {
|
||||
QmlJSEditor::Internal::Indenter indenterMy;
|
||||
indenterMy.indentBlock(m_editor->editorWidget()->document(), start, QChar::Null, tabSettings);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ContextPaneWidget* QuickToolBar::contextWidget()
|
||||
{
|
||||
if (m_widget.isNull()) { //lazily recreate widget
|
||||
|
||||
@@ -62,6 +62,8 @@ public slots:
|
||||
void onEnabledChanged(bool);
|
||||
|
||||
private:
|
||||
void indentLines(int startLine, int endLine);
|
||||
|
||||
QmlEditorWidgets::ContextPaneWidget* contextWidget();
|
||||
QPointer<QmlEditorWidgets::ContextPaneWidget> m_widget;
|
||||
QmlJS::Document::Ptr m_doc;
|
||||
|
||||
@@ -146,8 +146,8 @@ void BlackBerryCheckDeviceStatusStep::checkDeviceInfo(int status)
|
||||
}
|
||||
|
||||
bool ok = true;
|
||||
if (deviceRuntimeVersion.toString() != apiLevelVersion.toString()) {
|
||||
raiseError(tr("The device runtime version (%1) does not match API level version (%2)")
|
||||
if (apiLevelVersion > deviceRuntimeVersion) {
|
||||
raiseError(tr("The device runtime version (%1) is inferior to the API level version (%2)")
|
||||
.arg(deviceRuntimeVersion.toString(), apiLevelVersion.toString()));
|
||||
|
||||
QMetaObject::invokeMethod(this, "handleVersionMismatch", Qt::BlockingQueuedConnection,
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<item>
|
||||
<widget class="QRadioButton" name="apiLevelButton">
|
||||
<property name="text">
|
||||
<string>Install Api Level</string>
|
||||
<string>Install API Level</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -398,23 +398,23 @@ BlackBerryInstallWizardProcessPage::~BlackBerryInstallWizardProcessPage()
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void BlackBerryInstallWizardProcessPage::initializePage()
|
||||
static QString msgTarget(BlackBerryInstallerDataHandler::Target t)
|
||||
{
|
||||
QString target;
|
||||
switch (m_data.installTarget) {
|
||||
switch (t) {
|
||||
case BlackBerryInstallerDataHandler::ApiLevel:
|
||||
target = tr("API level version: ");
|
||||
break;
|
||||
return BlackBerryInstallWizardProcessPage::tr("API level");
|
||||
case BlackBerryInstallerDataHandler::Simulator:
|
||||
target = tr("simulator version: ");
|
||||
break;
|
||||
return BlackBerryInstallWizardProcessPage::tr("simulator");
|
||||
case BlackBerryInstallerDataHandler::Runtime:
|
||||
target = tr("runtime version: ");
|
||||
break;
|
||||
return BlackBerryInstallWizardProcessPage::tr("runtime");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
void BlackBerryInstallWizardProcessPage::initializePage()
|
||||
{
|
||||
if (m_data.mode == BlackBerryInstallerDataHandler::UninstallMode) {
|
||||
if (m_data.version.isEmpty()) {
|
||||
wizard()->next();
|
||||
@@ -429,9 +429,11 @@ void BlackBerryInstallWizardProcessPage::initializePage()
|
||||
}
|
||||
}
|
||||
|
||||
m_ui->label->setText(tr("Uninstalling ") + target + m_data.version);
|
||||
m_ui->label->setText(tr("Uninstalling %1 version: %2")
|
||||
.arg(msgTarget(m_data.installTarget), m_data.version));
|
||||
} else {
|
||||
m_ui->label->setText(tr("Installing ") + target + m_data.version);
|
||||
m_ui->label->setText(tr("Installing %1 version: %2")
|
||||
.arg(msgTarget(m_data.installTarget), m_data.version));
|
||||
}
|
||||
// m_targetProcess could be running
|
||||
if (m_targetProcess->state() == QProcess::Running) {
|
||||
@@ -542,30 +544,17 @@ void BlackBerryInstallWizardFinalPage::initializePage()
|
||||
}
|
||||
|
||||
QString message;
|
||||
QString target;
|
||||
switch (m_data.installTarget) {
|
||||
case BlackBerryInstallerDataHandler::ApiLevel:
|
||||
target = tr("API level version: ");
|
||||
break;
|
||||
case BlackBerryInstallerDataHandler::Simulator:
|
||||
target = tr("simulator version: ");
|
||||
break;
|
||||
case BlackBerryInstallerDataHandler::Runtime:
|
||||
target = tr("runtime version: ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
const QString target = msgTarget(m_data.installTarget);
|
||||
|
||||
if (m_data.exitCode == 0 && m_data.exitStatus == QProcess::NormalExit) {
|
||||
message = m_data.mode == BlackBerryInstallerDataHandler::UninstallMode ?
|
||||
tr("Finished uninstalling %1:\n %2").arg(target, m_data.version) :
|
||||
tr("Finished installing %1:\n %2").arg(target, m_data.version);
|
||||
tr("Finished uninstalling %1 version:\n %2").arg(target, m_data.version) :
|
||||
tr("Finished installing %1 version:\n %2").arg(target, m_data.version);
|
||||
emit done();
|
||||
} else {
|
||||
message = m_data.mode == BlackBerryInstallerDataHandler::UninstallMode ?
|
||||
tr("An error has occurred while uninstalling %1:\n %2").arg(target, m_data.version) :
|
||||
tr("An error has occurred while installing %1:\n %2").arg(target, m_data.version);
|
||||
tr("An error has occurred while uninstalling %1 version:\n %2").arg(target, m_data.version) :
|
||||
tr("An error has occurred while installing %1 version:\n %2").arg(target, m_data.version);
|
||||
}
|
||||
label->setText(message);
|
||||
}
|
||||
|
||||
@@ -338,7 +338,7 @@ void BlackBerryKeysWidget::requestFinished(int status)
|
||||
default:
|
||||
m_utils.clearCertificatePassword();
|
||||
m_utils.clearCskPassword();
|
||||
errorString += tr("An unknwon error has occurred.");
|
||||
errorString += tr("An unknown error has occurred.");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ BlackBerryNDKSettingsWidget::BlackBerryNDKSettingsWidget(QWidget *parent) :
|
||||
m_ui->ndksTreeWidget->setColumnCount(1);
|
||||
|
||||
m_apiLevels = new QTreeWidgetItem(m_ui->ndksTreeWidget);
|
||||
m_apiLevels->setText(0, tr("Api Levels"));
|
||||
m_apiLevels->setText(0, tr("API Levels"));
|
||||
m_runtimes = new QTreeWidgetItem(m_ui->ndksTreeWidget);
|
||||
m_runtimes->setText(0, tr("Runtimes"));
|
||||
|
||||
@@ -181,7 +181,7 @@ void BlackBerryNDKSettingsWidget::updateConfigurationList()
|
||||
item->setIcon(0, config->isValid() ? QIcon() : invalidConfigIcon);
|
||||
// TODO: Do the same if qmake, qcc, debugger are no longer detected...
|
||||
if (!config->isValid()) {
|
||||
QString toolTip = tr("Invalid target %1: ").arg(config->targetName());
|
||||
QString toolTip = tr("Invalid target %1:").arg(config->targetName());
|
||||
if (config->isAutoDetected() && !config->autoDetectionSource().toFileInfo().exists())
|
||||
toolTip += QLatin1Char('\n') + tr("- Target no longer installed.");
|
||||
|
||||
@@ -322,7 +322,7 @@ void BlackBerryNDKSettingsWidget::updateUi(QTreeWidgetItem *item)
|
||||
item->setFont(0, font);
|
||||
|
||||
m_ui->activateNdkTargetButton->setEnabled(!contains);
|
||||
m_ui->deactivateNdkTargetButton->setEnabled(contains && m_activatedApiLevel.size() > 1);
|
||||
m_ui->deactivateNdkTargetButton->setEnabled(contains);
|
||||
// Disable remove button for auto detected pre-10.2 NDKs (uninstall wizard doesn't handle them)
|
||||
m_ui->removeConfigButton->setEnabled(!(config->isAutoDetected()
|
||||
&& QnxUtils::sdkInstallerPath(config->ndkPath()).isEmpty()));
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
#include <QVariantMap>
|
||||
#include <QFileInfo>
|
||||
#include <QCoreApplication>
|
||||
|
||||
namespace Qnx {
|
||||
namespace Internal {
|
||||
@@ -54,7 +55,7 @@ BlackBerryRuntimeConfiguration::BlackBerryRuntimeConfiguration(
|
||||
m_version = BlackBerryVersionNumber::fromFileName(QFileInfo(path).baseName(),
|
||||
QRegExp(QLatin1String("^runtime_(.*)$")));
|
||||
|
||||
m_displayName = QObject::tr("Runtime ") + m_version.toString();
|
||||
m_displayName = QCoreApplication::translate("Qnx::Internal::BlackBerryRuntimeConfiguration", "Runtime %1").arg(m_version.toString());
|
||||
}
|
||||
|
||||
BlackBerryRuntimeConfiguration::BlackBerryRuntimeConfiguration(const QVariantMap &data)
|
||||
|
||||
@@ -314,10 +314,11 @@ void AbstractRemoteLinuxDeployService::handleConnectionFailure()
|
||||
break;
|
||||
case Connecting: {
|
||||
QString errorMsg = tr("Could not connect to host: %1").arg(d->connection->errorString());
|
||||
errorMsg += QLatin1Char('\n');
|
||||
if (deviceConfiguration()->machineType() == IDevice::Emulator)
|
||||
errorMsg += tr("\nDid the emulator fail to start?");
|
||||
errorMsg += tr("Did the emulator fail to start?");
|
||||
else
|
||||
errorMsg += tr("\nIs the device connected and set up for network access?");
|
||||
errorMsg += tr("Is the device connected and set up for network access?");
|
||||
emit errorMessage(errorMsg);
|
||||
setFinished();
|
||||
break;
|
||||
|
||||
@@ -101,7 +101,7 @@ void RemoteLinuxEnvironmentReader::remoteProcessFinished()
|
||||
const QString remoteStderr
|
||||
= QString::fromUtf8(m_deviceProcess->readAllStandardError()).trimmed();
|
||||
if (!remoteStderr.isEmpty())
|
||||
errorMessage += tr("\nRemote stderr was: '%1'").arg(remoteStderr);
|
||||
errorMessage += QLatin1Char('\n') + tr("Remote stderr was: \"%1\"").arg(remoteStderr);
|
||||
emit error(errorMessage);
|
||||
} else {
|
||||
QString remoteOutput = QString::fromUtf8(m_deviceProcess->readAllStandardOutput());
|
||||
|
||||
@@ -73,7 +73,7 @@ CodecSelector::CodecSelector(QWidget *parent, BaseTextDocument *doc)
|
||||
m_label = new QLabel(this);
|
||||
QString decodingErrorHint;
|
||||
if (m_hasDecodingError)
|
||||
decodingErrorHint = tr("\nThe following encodings are likely to fit:");
|
||||
decodingErrorHint = QLatin1Char('\n') + tr("The following encodings are likely to fit:");
|
||||
m_label->setText(tr("Select encoding for \"%1\".%2").arg(QFileInfo(doc->filePath()).fileName()).arg(decodingErrorHint));
|
||||
|
||||
m_listWidget = new CodecListWidget(this);
|
||||
|
||||
@@ -467,7 +467,7 @@ void Manager::downloadDefinitionsFinished()
|
||||
else
|
||||
text = tr("Error downloading one or more definitions.");
|
||||
if (writeError)
|
||||
text.append(tr("\nPlease check the directory's access rights."));
|
||||
text.append(QLatin1Char('\n') + tr("Please check the directory's access rights."));
|
||||
QMessageBox::critical(0, tr("Download Error"), text);
|
||||
}
|
||||
|
||||
|
||||
@@ -303,6 +303,7 @@ static QString wrappedText(const QTextEdit *e)
|
||||
const QString block = cursor.block().text();
|
||||
if (block.startsWith(QLatin1Char('\t'))) { // Don't wrap
|
||||
rc += block + newLine;
|
||||
cursor.movePosition(QTextCursor::EndOfBlock);
|
||||
} else {
|
||||
forever {
|
||||
cursor.select(QTextCursor::LineUnderCursor);
|
||||
|
||||
@@ -27,7 +27,7 @@ Project {
|
||||
property path libRPaths: qbs.targetOS.contains("osx")
|
||||
? ["@loader_path/.."] : ["$ORIGIN/.."]
|
||||
property path resourcesInstallDir: project.ide_data_path + "/qbs"
|
||||
property string pluginsInstallDir: "lib/qtcreator"
|
||||
property string pluginsInstallDir: project.libDirName + "/qtcreator"
|
||||
|
||||
references: [
|
||||
qbsBaseDir + "/src/lib/libs.qbs",
|
||||
|
||||
@@ -21,7 +21,8 @@ CppApplication {
|
||||
// absolute paths to resources in the build directory.
|
||||
// cpp.rpaths: qbs.targetOS.contains("osx")
|
||||
// ? ["@executable_path/.."]
|
||||
// : ["$ORIGIN/../lib/qtcreator", "$ORIGIN/../lib/qtcreator/plugins/QtProject"]
|
||||
// : ["$ORIGIN/../" + project.libDirName + "/qtcreator",
|
||||
// "$ORIGIN/../" project.libDirName + "/qtcreator/plugins/QtProject"]
|
||||
// Group {
|
||||
// fileTagsFilter: product.type
|
||||
// qbs.install: true
|
||||
|
||||
@@ -11,8 +11,8 @@ DynamicLibrary {
|
||||
targetName: QtcFunctions.qtLibraryName(qbs, name.split('_')[1])
|
||||
destinationDirectory: FileInfo.relativePath(project.ide_source_tree, sourceDirectory)
|
||||
cpp.rpaths: [
|
||||
buildDirectory + "/lib/qtcreator",
|
||||
buildDirectory + "/lib/qtcreator/plugins/QtProject"
|
||||
buildDirectory + "/" + project.libDirName + "/qtcreator",
|
||||
buildDirectory + "/" + project.libDirName + "/qtcreator/plugins/QtProject"
|
||||
].concat(additionalRPaths)
|
||||
property pathList filesToCopy
|
||||
property pathList additionalRPaths: []
|
||||
|
||||
@@ -126,10 +126,16 @@ def removeOldBreakpoints():
|
||||
# param expectedBPOrder holds a list of dicts where the dicts contain always
|
||||
# only 1 key:value pair - the key is the name of the file, the value is
|
||||
# line number where the debugger should stop
|
||||
def doSimpleDebugging(kitCount, currentKit, currentConfigName, pressContinueCount=1, expectedBPOrder=[]):
|
||||
def doSimpleDebugging(kitCount, currentKit, currentConfigName, pressContinueCount=1,
|
||||
expectedBPOrder=[], enableQml=True):
|
||||
expectedLabelTexts = ['Stopped\.', 'Stopped at breakpoint \d+ \(\d+\) in thread \d+\.']
|
||||
if len(expectedBPOrder) == 0:
|
||||
expectedLabelTexts.append("Running\.")
|
||||
switchViewTo(ViewConstants.PROJECTS)
|
||||
switchToBuildOrRunSettingsFor(kitCount, currentKit, ProjectSettings.RUN)
|
||||
ensureChecked(waitForObject("{container=':Qt Creator.scrollArea_QScrollArea' text='Enable QML' "
|
||||
"type='QCheckBox' unnamed='1' visible='1'}"), enableQml)
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
if not __startDebugger__(kitCount, currentKit, currentConfigName):
|
||||
return False
|
||||
statusLabel = findObject(":Debugger Toolbar.StatusText_Utils::StatusLabel")
|
||||
|
||||
@@ -73,7 +73,7 @@ def main():
|
||||
continue
|
||||
allowAppThroughWinFW(workingDir, projectName, False)
|
||||
if not doSimpleDebugging(len(checkedTargets), kit, config,
|
||||
2, expectedBreakpointsOrder):
|
||||
len(expectedBreakpointsOrder), expectedBreakpointsOrder):
|
||||
try:
|
||||
stopB = findObject(':Qt Creator.Stop_QToolButton')
|
||||
if stopB.enabled:
|
||||
@@ -85,6 +85,12 @@ def main():
|
||||
ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
|
||||
clickButton(waitForObject("{type='CloseButton' unnamed='1' visible='1' "
|
||||
"window=':Qt Creator_Core::Internal::MainWindow'}"))
|
||||
if platform.system() == 'Darwin' and JIRA.isBugStillOpen(11595):
|
||||
try:
|
||||
expectedBreakpointsOrder.remove({os.path.join(workingDir, projectName, "main.cpp"):10})
|
||||
test.warning("Removed cpp file after first run. (QTCREATORBUG-11595)")
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
test.fatal("Setting breakpoints failed - leaving without testing.")
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
@@ -227,6 +227,7 @@ def __getExpectedDebuggers__():
|
||||
def __getCDB__():
|
||||
result = []
|
||||
possibleLocations = ["C:\\Program Files\\Debugging Tools for Windows (x64)",
|
||||
"C:\\Program Files (x86)\\Debugging Tools for Windows (x86)",
|
||||
"C:\\Program Files (x86)\\Windows Kits\\8.0\\Debuggers\\x86",
|
||||
"C:\\Program Files\\Windows Kits\\8.0\\Debuggers\\x86",
|
||||
"C:\\Program Files (x86)\\Windows Kits\\8.1\\Debuggers\\x86",
|
||||
|
||||