Merge remote-tracking branch 'origin/4.1'
Change-Id: Ia442f30f387fe9292217582260bbe79e54608810
1
.qmake.conf
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CONFIG += c++14
|
13
dist/changes-4.1.0.md
vendored
@@ -21,6 +21,8 @@ Editing
|
|||||||
* Added highlighting of automatically inserted characters
|
* Added highlighting of automatically inserted characters
|
||||||
* Added option for skipping automatically inserted character, and changed
|
* Added option for skipping automatically inserted character, and changed
|
||||||
it to be done only if the cursor stays before the character
|
it to be done only if the cursor stays before the character
|
||||||
|
* Added `Modnokai Night Shift v2`, `Qt Creator Dark`,
|
||||||
|
`Solarized Dark` and `Solarized Light` editor schemes
|
||||||
* Fixed that replacing could change selection (QTCREATORBUG-15623)
|
* Fixed that replacing could change selection (QTCREATORBUG-15623)
|
||||||
|
|
||||||
All Projects
|
All Projects
|
||||||
@@ -90,6 +92,7 @@ Qt Quick Designer
|
|||||||
* Added support for Qt Quick Controls 2 styles
|
* Added support for Qt Quick Controls 2 styles
|
||||||
* Added `Move to Component` action
|
* Added `Move to Component` action
|
||||||
* Added `Add New Signal Handler` action
|
* Added `Add New Signal Handler` action
|
||||||
|
* Added support of Qt Creator themes in the Designer UI
|
||||||
* Improved performance
|
* Improved performance
|
||||||
* Improved error dialog (QTCREATORBUG-15772)
|
* Improved error dialog (QTCREATORBUG-15772)
|
||||||
* Fixed crumble bar for component navigation
|
* Fixed crumble bar for component navigation
|
||||||
@@ -152,11 +155,14 @@ Credits for these changes go to:
|
|||||||
Albert Astals Cid
|
Albert Astals Cid
|
||||||
Alessandro Portale
|
Alessandro Portale
|
||||||
Alexander Drozdov
|
Alexander Drozdov
|
||||||
|
Alexandru Croitor
|
||||||
Andre Hartmann
|
Andre Hartmann
|
||||||
André Pönitz
|
André Pönitz
|
||||||
Antoine Poliakov
|
Antoine Poliakov
|
||||||
|
Anton Kudryavtsev
|
||||||
Arnold Dumas
|
Arnold Dumas
|
||||||
BogDan Vatra
|
BogDan Vatra
|
||||||
|
Brett Stottlemyer
|
||||||
Christian Kandeler
|
Christian Kandeler
|
||||||
Christian Stenger
|
Christian Stenger
|
||||||
Cristian Adam
|
Cristian Adam
|
||||||
@@ -171,20 +177,25 @@ Jake Petroules
|
|||||||
Jaroslaw Kobus
|
Jaroslaw Kobus
|
||||||
Jean Gressmann
|
Jean Gressmann
|
||||||
Jochen Becher
|
Jochen Becher
|
||||||
|
Lars Knoll
|
||||||
Leena Miettinen
|
Leena Miettinen
|
||||||
Lorenz Haas
|
Lorenz Haas
|
||||||
Lukas Holecek
|
Lukas Holecek
|
||||||
|
Marc Mutz
|
||||||
|
Marc Reilly
|
||||||
Marco Benelli
|
Marco Benelli
|
||||||
Marco Bubke
|
Marco Bubke
|
||||||
Marc Reilly
|
|
||||||
Mashrab Kuvatov
|
Mashrab Kuvatov
|
||||||
|
Mat Sutcliffe
|
||||||
Maurice Kalinowski
|
Maurice Kalinowski
|
||||||
|
Nazar Gerasymchuk
|
||||||
Nikita Baryshnikov
|
Nikita Baryshnikov
|
||||||
Nikolai Kosjar
|
Nikolai Kosjar
|
||||||
Orgad Shaneh
|
Orgad Shaneh
|
||||||
Oswald Buddenhagen
|
Oswald Buddenhagen
|
||||||
Philip Lorenz
|
Philip Lorenz
|
||||||
Robert Löhning
|
Robert Löhning
|
||||||
|
Serhii Moroz
|
||||||
Shinnok
|
Shinnok
|
||||||
Takumi ASAKI
|
Takumi ASAKI
|
||||||
Thiago Macieira
|
Thiago Macieira
|
||||||
|
@@ -156,7 +156,7 @@
|
|||||||
|
|
||||||
\section2 Taking Screen Shots
|
\section2 Taking Screen Shots
|
||||||
|
|
||||||
\QC has the native look and feel on Windows, Linux, and OS X, and therefore,
|
\QC has the native look and feel on Windows, Linux, and \macos, and therefore,
|
||||||
screen shots can end up looking very different, depending on who takes them
|
screen shots can end up looking very different, depending on who takes them
|
||||||
and which system they use. To try to preserve a consistent look and feel in
|
and which system they use. To try to preserve a consistent look and feel in
|
||||||
the \QC Manual, observe the guidelines listed in this section when taking
|
the \QC Manual, observe the guidelines listed in this section when taking
|
||||||
@@ -207,7 +207,7 @@
|
|||||||
You can use a web service, such as \l{https://tinypng.com}, or an image
|
You can use a web service, such as \l{https://tinypng.com}, or an image
|
||||||
optimization tool to shrink the images. For example, you can use the Radical
|
optimization tool to shrink the images. For example, you can use the Radical
|
||||||
Image Optimization Tool (RIOT) on Windows (very efficient) or ImageOptim on
|
Image Optimization Tool (RIOT) on Windows (very efficient) or ImageOptim on
|
||||||
OS X (much less efficient), or some other tool available on Linux.
|
\macos (much less efficient), or some other tool available on Linux.
|
||||||
|
|
||||||
With ImageOptim, you simply drag and drop the image files to the
|
With ImageOptim, you simply drag and drop the image files to the
|
||||||
application. The following section describes the settings to use for RIOT.
|
application. The following section describes the settings to use for RIOT.
|
||||||
@@ -278,7 +278,7 @@
|
|||||||
\list
|
\list
|
||||||
\li nmake docs (on Windows)
|
\li nmake docs (on Windows)
|
||||||
|
|
||||||
\li make docs (on Linux and OS X)
|
\li make docs (on Linux and \macos)
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
The \QC Manual HTML files are generated in the \c {doc/html} directory.
|
The \QC Manual HTML files are generated in the \c {doc/html} directory.
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
\c {doc/html-dev} directory. The help files (\c {.qch}) are generated in the
|
\c {doc/html-dev} directory. The help files (\c {.qch}) are generated in the
|
||||||
\c {share/doc/qtcreator} directory in the \QC build directory on Windows and
|
\c {share/doc/qtcreator} directory in the \QC build directory on Windows and
|
||||||
Linux, and in the \c {bin/Qt Creator.app/Contents/Resources/app} directory
|
Linux, and in the \c {bin/Qt Creator.app/Contents/Resources/app} directory
|
||||||
on OS X. You can view the HTML files in a browser and the help files in
|
on \macos. You can view the HTML files in a browser and the help files in
|
||||||
the \QC \uicontrol Help mode. For more information about adding the help
|
the \QC \uicontrol Help mode. For more information about adding the help
|
||||||
files to \QC, see
|
files to \QC, see
|
||||||
\l{http://doc.qt.io/qtcreator/creator-help.html#adding-external-documentation}
|
\l{http://doc.qt.io/qtcreator/creator-help.html#adding-external-documentation}
|
||||||
|
@@ -12,6 +12,7 @@ macro.hr.HTML = "<hr />"
|
|||||||
macro.iacute.HTML = "í"
|
macro.iacute.HTML = "í"
|
||||||
macro.key = "\\b"
|
macro.key = "\\b"
|
||||||
macro.menu = "\\b"
|
macro.menu = "\\b"
|
||||||
|
macro.macos = "macOS"
|
||||||
macro.note = "\\b{Note:}"
|
macro.note = "\\b{Note:}"
|
||||||
macro.oslash.HTML = "ø"
|
macro.oslash.HTML = "ø"
|
||||||
macro.ouml.HTML = "ö"
|
macro.ouml.HTML = "ö"
|
||||||
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 64 KiB |
BIN
doc/images/qt-creator-beautifier-options-general.png
Normal file
After Width: | Height: | Size: 6.2 KiB |
BIN
doc/images/qtcreator-clang-code-model-options.png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 9.6 KiB |
BIN
doc/images/qtcreator-code-style-getter-setter.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 21 KiB |
BIN
doc/images/qtcreator-search-filesystem.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
@@ -47,7 +47,7 @@
|
|||||||
for which you set up a project in \QC and applications for which you do not
|
for which you set up a project in \QC and applications for which you do not
|
||||||
have a project.
|
have a project.
|
||||||
|
|
||||||
Valgrind tools are supported locally only on Linux and OS X. However,
|
Valgrind tools are supported locally only on Linux and \macos. However,
|
||||||
according to Valgrind.org, support on OS X 10.8 and 10.9 is experimental and
|
according to Valgrind.org, support on OS X 10.8 and 10.9 is experimental and
|
||||||
mostly broken. You can run the tools on a remote Linux machine or device
|
mostly broken. You can run the tools on a remote Linux machine or device
|
||||||
from any development host.
|
from any development host.
|
||||||
|
@@ -64,7 +64,7 @@
|
|||||||
the Symbol Server provided by Microsoft to the symbol search path of the
|
the Symbol Server provided by Microsoft to the symbol search path of the
|
||||||
debugger. For more information, see \l{Setting CDB Paths on Windows}.
|
debugger. For more information, see \l{Setting CDB Paths on Windows}.
|
||||||
|
|
||||||
\note To use the Free Software Foundation (FSF) version of GDB on OS X, you
|
\note To use the Free Software Foundation (FSF) version of GDB on \macos, you
|
||||||
must sign it and modify your \l{glossary-buildandrun-kit}{kit} settings.
|
must sign it and modify your \l{glossary-buildandrun-kit}{kit} settings.
|
||||||
|
|
||||||
This section explains the options you have for debugging C++ code and
|
This section explains the options you have for debugging C++ code and
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
Qt Creator supports native debuggers when working with compiled code. On
|
Qt Creator supports native debuggers when working with compiled code. On
|
||||||
most supported platforms, the GNU Symbolic Debugger GDB can be used. On
|
most supported platforms, the GNU Symbolic Debugger GDB can be used. On
|
||||||
Microsoft Windows, when using the Microsoft tool chain the Microsoft Console
|
Microsoft Windows, when using the Microsoft tool chain the Microsoft Console
|
||||||
Debugger CDB, is needed. On OS X, the LLDB debugger can be used. Basic
|
Debugger CDB, is needed. On \macos, the LLDB debugger can be used. Basic
|
||||||
support for LLDB is also available on Linux, but it is restricted by LLDB's
|
support for LLDB is also available on Linux, but it is restricted by LLDB's
|
||||||
capabilities there, and considered experimental.
|
capabilities there, and considered experimental.
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
\li GCC, ICC
|
\li GCC, ICC
|
||||||
\li GDB
|
\li GDB
|
||||||
\row
|
\row
|
||||||
\li OS X
|
\li \macos
|
||||||
\li GCC, Clang
|
\li GCC, Clang
|
||||||
\li LLDB, FSF GDB (experimental)
|
\li LLDB, FSF GDB (experimental)
|
||||||
\row
|
\row
|
||||||
@@ -130,11 +130,11 @@
|
|||||||
\section2 Supported LLDB Versions
|
\section2 Supported LLDB Versions
|
||||||
|
|
||||||
The LLDB native debugger has similar functionality to the GDB debugger. LLDB
|
The LLDB native debugger has similar functionality to the GDB debugger. LLDB
|
||||||
is the default debugger in Xcode on OS X for supporting C++ on the desktop.
|
is the default debugger in Xcode on \macos for supporting C++ on the desktop.
|
||||||
LLDB is typically used with the Clang compiler (even though you can use it
|
LLDB is typically used with the Clang compiler (even though you can use it
|
||||||
with GCC, too).
|
with GCC, too).
|
||||||
|
|
||||||
On OS X you can use the LLDB version delivered with Xcode or build from source.
|
On \macos you can use the LLDB version delivered with Xcode or build from source.
|
||||||
The minimum supported version is LLDB 320.4.
|
The minimum supported version is LLDB 320.4.
|
||||||
|
|
||||||
On Linux, the minimum supported version is LLDB 3.8.
|
On Linux, the minimum supported version is LLDB 3.8.
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
most Linux distributions the GDB builds shipped with the system
|
most Linux distributions the GDB builds shipped with the system
|
||||||
are sufficient. You can also build your own. Follow the
|
are sufficient. You can also build your own. Follow the
|
||||||
instructions in \l{http://wiki.qt.io/QtCreator_Build_Gdb}
|
instructions in \l{http://wiki.qt.io/QtCreator_Build_Gdb}
|
||||||
{Building GDB}. Builds of GDB shipped with Xcode on OS X are no
|
{Building GDB}. Builds of GDB shipped with Xcode on \macos are no
|
||||||
longer supported.
|
longer supported.
|
||||||
|
|
||||||
\row
|
\row
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
\l{Setting CDB Paths on Windows}.
|
\l{Setting CDB Paths on Windows}.
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\li Debugging tools for OS X
|
\li Debugging tools for \macos
|
||||||
\li The Qt binary distribution contains both debug and release
|
\li The Qt binary distribution contains both debug and release
|
||||||
variants of the libraries. But you have to explicitly tell the
|
variants of the libraries. But you have to explicitly tell the
|
||||||
runtime linker that you want to use the debug libraries even if
|
runtime linker that you want to use the debug libraries even if
|
||||||
@@ -223,7 +223,7 @@
|
|||||||
\uicontrol Projects mode. In the run configuration, select
|
\uicontrol Projects mode. In the run configuration, select
|
||||||
\uicontrol{Use debug version of frameworks}.
|
\uicontrol{Use debug version of frameworks}.
|
||||||
|
|
||||||
For more detailed information about debugging on OS X,
|
For more detailed information about debugging on \macos,
|
||||||
see: \l{http://developer.apple.com/library/mac/#technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391}
|
see: \l{http://developer.apple.com/library/mac/#technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391}
|
||||||
{Mac OS X Debugging Magic}.
|
{Mac OS X Debugging Magic}.
|
||||||
|
|
||||||
@@ -282,9 +282,9 @@
|
|||||||
directly from version control or the web, enter the following string in
|
directly from version control or the web, enter the following string in
|
||||||
the \uicontrol {Source Paths} field: \c srv*.
|
the \uicontrol {Source Paths} field: \c srv*.
|
||||||
|
|
||||||
\section1 Setting up FSF GDB for OS X
|
\section1 Setting up FSF GDB for \macos
|
||||||
|
|
||||||
To use FSF GDB on OS X, you must sign it and add it to the \QC
|
To use FSF GDB on \macos, you must sign it and add it to the \QC
|
||||||
\l{glossary-buildandrun-kit}{kits}.
|
\l{glossary-buildandrun-kit}{kits}.
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
@@ -448,18 +448,18 @@
|
|||||||
\li To finish debugging, press \key {Shift+F5}.
|
\li To finish debugging, press \key {Shift+F5}.
|
||||||
|
|
||||||
\li To execute a line of code as a whole, press \key F10
|
\li To execute a line of code as a whole, press \key F10
|
||||||
(\key {Command+Shift+O} on OS X).
|
(\key {Command+Shift+O} on \macos).
|
||||||
|
|
||||||
\li To step into a function or a subfunction, press \key F11
|
\li To step into a function or a subfunction, press \key F11
|
||||||
(\key {Command+Shift+I} on OS X).
|
(\key {Command+Shift+I} on \macos).
|
||||||
|
|
||||||
\li To leave the current function or subfunction, press \key {Shift+F11}
|
\li To leave the current function or subfunction, press \key {Shift+F11}
|
||||||
(\key {Command+Shift+T} on OS X).
|
(\key {Command+Shift+T} on \macos).
|
||||||
|
|
||||||
\li To continue running the program, press \key F5.
|
\li To continue running the program, press \key F5.
|
||||||
|
|
||||||
\li To run to the line containing the cursor, press \key {Ctrl+F10}
|
\li To run to the line containing the cursor, press \key {Ctrl+F10}
|
||||||
(\key {Shift+F8} on OS X).
|
(\key {Shift+F8} on \macos).
|
||||||
|
|
||||||
\li To run to the selected function when you are stepping into a nested
|
\li To run to the selected function when you are stepping into a nested
|
||||||
function, press \key {Ctrl+F6}.
|
function, press \key {Ctrl+F6}.
|
||||||
@@ -521,7 +521,7 @@
|
|||||||
\list
|
\list
|
||||||
|
|
||||||
\li In the code editor, click the left margin or press \key F9
|
\li In the code editor, click the left margin or press \key F9
|
||||||
(\key F8 for OS X) at a particular line you want the
|
(\key F8 for \macos) at a particular line you want the
|
||||||
program to stop.
|
program to stop.
|
||||||
|
|
||||||
\li In the \uicontrol Breakpoints view, double-click in the empty
|
\li In the \uicontrol Breakpoints view, double-click in the empty
|
||||||
@@ -685,7 +685,7 @@
|
|||||||
|
|
||||||
\row
|
\row
|
||||||
\li GDB and LLDB, and therefore \QC's debugger, also work for optimized
|
\li GDB and LLDB, and therefore \QC's debugger, also work for optimized
|
||||||
builds on Linux and OS X. Optimization can lead to re-ordering
|
builds on Linux and \macos. Optimization can lead to re-ordering
|
||||||
of instructions or removal of some local variables, causing the
|
of instructions or removal of some local variables, causing the
|
||||||
\uicontrol {Locals and Expressions} view to show unexpected
|
\uicontrol {Locals and Expressions} view to show unexpected
|
||||||
data.
|
data.
|
||||||
@@ -780,11 +780,11 @@
|
|||||||
|
|
||||||
For more information, see \l{Using Command Line Options}.
|
For more information, see \l{Using Command Line Options}.
|
||||||
|
|
||||||
\section2 Stepping into Frameworks in OS X
|
\section2 Stepping into Frameworks in \macos
|
||||||
|
|
||||||
In OS X, external libraries are usually built into so-called Frameworks,
|
In \macos, external libraries are usually built into so-called Frameworks,
|
||||||
which may contain both release and debug versions of the library. When you
|
which may contain both release and debug versions of the library. When you
|
||||||
run applications on the OS X desktop, the release version of Frameworks is
|
run applications on the \macos desktop, the release version of Frameworks is
|
||||||
used by default. To step into Frameworks, select the
|
used by default. To step into Frameworks, select the
|
||||||
\uicontrol {Use debug versions of Frameworks} option in the project run
|
\uicontrol {Use debug versions of Frameworks} option in the project run
|
||||||
settings.
|
settings.
|
||||||
@@ -801,7 +801,7 @@
|
|||||||
The \uicontrol Modules view displays information that the debugger plugin
|
The \uicontrol Modules view displays information that the debugger plugin
|
||||||
has about modules included in the application that is being debugged. A
|
has about modules included in the application that is being debugged. A
|
||||||
module is a dynamic link library (\c {.dll}) in Windows, a shared object
|
module is a dynamic link library (\c {.dll}) in Windows, a shared object
|
||||||
(\c {.so}) in Linux, and a dynamic shared library (\c {.dylib}) in OS X.
|
(\c {.so}) in Linux, and a dynamic shared library (\c {.dylib}) in \macos.
|
||||||
|
|
||||||
In addition, the view displays symbols within the modules and indicates
|
In addition, the view displays symbols within the modules and indicates
|
||||||
where each module was loaded.
|
where each module was loaded.
|
||||||
|
@@ -76,8 +76,26 @@
|
|||||||
|
|
||||||
\li Restart \QC to be able to use the plugin.
|
\li Restart \QC to be able to use the plugin.
|
||||||
|
|
||||||
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol Beautifier
|
\li Select \uicontrol Tools > \uicontrol Options >
|
||||||
to specify settings for the tool you want to use.
|
\uicontrol Beautifier to specify settings for beautifying files.
|
||||||
|
|
||||||
|
\li Select the \uicontrol {Enable auto format on file save} check box to
|
||||||
|
automatically beautify files when you save them using the tool you
|
||||||
|
select in the \uicontrol Tool field.
|
||||||
|
|
||||||
|
\image qt-creator-beautifier-options-general.png
|
||||||
|
|
||||||
|
\li In the \uicontrol {Restrict to MIME types} field, define the MIME
|
||||||
|
types of the files to beautify, separated by semicolons. Leave the
|
||||||
|
field empty to apply the tool on all files.
|
||||||
|
|
||||||
|
\li Select the \uicontrol {Restrict to files contained in the current
|
||||||
|
project} check box to only beautify files that belong to the
|
||||||
|
current project.
|
||||||
|
|
||||||
|
\li Select \uicontrol {Artistic Style}, \uicontrol {Clang Format}, or
|
||||||
|
\uicontrol Uncrustify to specify settings for the tool you want to
|
||||||
|
use.
|
||||||
|
|
||||||
\image beautifier_options.png
|
\image beautifier_options.png
|
||||||
|
|
||||||
@@ -86,10 +104,6 @@
|
|||||||
\uicontrol {Clang Format command}, or
|
\uicontrol {Clang Format command}, or
|
||||||
\uicontrol {Uncrustify command} field.
|
\uicontrol {Uncrustify command} field.
|
||||||
|
|
||||||
\li In the \uicontrol {Restrict to MIME types} field, define the MIME
|
|
||||||
types of the files to beautify, separated by semicolons. Leave the
|
|
||||||
field empty to apply the tool on all files.
|
|
||||||
|
|
||||||
\li In the \uicontrol Options group, select the configuration file that
|
\li In the \uicontrol Options group, select the configuration file that
|
||||||
defines the style to use in the source files. If you select several
|
defines the style to use in the source files. If you select several
|
||||||
options, they are applied from top down.
|
options, they are applied from top down.
|
||||||
@@ -117,8 +131,8 @@
|
|||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
\li Select \uicontrol Tools > \uicontrol Beautifier >
|
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol Beautifier
|
||||||
\uicontrol {Artistic Style}, \uicontrol ClangFormat, or
|
> \uicontrol {Artistic Style}, \uicontrol ClangFormat, or
|
||||||
\uicontrol Uncrustify > \uicontrol {Format Current File} to format
|
\uicontrol Uncrustify > \uicontrol {Format Current File} to format
|
||||||
the currently open file.
|
the currently open file.
|
||||||
|
|
||||||
@@ -133,21 +147,4 @@
|
|||||||
file in this case when using Clang, select the
|
file in this case when using Clang, select the
|
||||||
\uicontrol {Format entire file if no text was selected} check box in the
|
\uicontrol {Format entire file if no text was selected} check box in the
|
||||||
\uicontrol {Clang Format} options.
|
\uicontrol {Clang Format} options.
|
||||||
|
|
||||||
To automatically format files when they are saved, select \uicontrol Tools >
|
|
||||||
\uicontrol Beautifier > \uicontrol General:
|
|
||||||
|
|
||||||
\list 1
|
|
||||||
|
|
||||||
\li In the \uicontrol Tool field, select the tool for formatting.
|
|
||||||
|
|
||||||
\li In the \uicontrol {Restrict to MIME types} field, specify a
|
|
||||||
semicolon-separated list of MIME types. One of these types must
|
|
||||||
match the MIME type of the file that is auto formatted.
|
|
||||||
An empty list accepts all files.
|
|
||||||
|
|
||||||
\li Select the \uicontrol {Restrict to files contained in the current
|
|
||||||
project} check box to only auto format files in the current project.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
*/
|
*/
|
||||||
|
@@ -84,8 +84,37 @@
|
|||||||
include several files, processing a single file and all the included files
|
include several files, processing a single file and all the included files
|
||||||
can take a while.
|
can take a while.
|
||||||
|
|
||||||
To make parsing faster, pre-compiled headers are ignored by default. You can
|
To make parsing faster, pre-compiled headers are ignored by default. To
|
||||||
specify that Clang processes them in \uicontrol {Code Model} options.
|
specify that Clang processes them, select \uicontrol Tools >
|
||||||
|
\uicontrol Options > \uicontrol C++ > \uicontrol {Code Model}, and
|
||||||
|
deselect the \uicontrol {Ignore pre-compiled headers} check box.
|
||||||
|
|
||||||
|
When Clang encounters risky or possibly erroneous constructions, it issues
|
||||||
|
warnings. To request or suppress warnings, select \uicontrol Tools >
|
||||||
|
\uicontrol Options > \uicontrol C++ > \uicontrol {Code Model}. You can
|
||||||
|
either select one of the predefined configurations, or create a copy of a
|
||||||
|
configuration and edit it to fit your needs:
|
||||||
|
|
||||||
|
\list
|
||||||
|
|
||||||
|
\li \uicontrol {Pedantic Warnings} uses the \c -Wpendantic option that
|
||||||
|
requests all the warnings demanded by strict ISO C and ISO C++.
|
||||||
|
|
||||||
|
\li \uicontrol {Warnings for Questionable Constructs} combines the
|
||||||
|
\c -Wall and \c -Wextra options to request all warnings about easily
|
||||||
|
avoidable questionable constructions and some additional warnings.
|
||||||
|
|
||||||
|
\li \uicontrol {Warnings for Almost Everything} uses the \c -Weverything
|
||||||
|
option with negative options to suppress some warnings.
|
||||||
|
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
You can edit the predefined configurations to request specific warnings
|
||||||
|
beginning with \c -W. Each of these warnings also has a negative version
|
||||||
|
that begins with \c -Wno. Keep in mind that some options turn on other
|
||||||
|
options. For more information, see
|
||||||
|
\l{https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html}
|
||||||
|
{Options to Request or Suppress Warnings} or the GCC or Clang manual pages.
|
||||||
|
|
||||||
The following services are currently implemented in the experimental Clang
|
The following services are currently implemented in the experimental Clang
|
||||||
code model plugin:
|
code model plugin:
|
||||||
@@ -147,8 +176,17 @@
|
|||||||
|
|
||||||
\li Restart \QC to be able to use the plugin.
|
\li Restart \QC to be able to use the plugin.
|
||||||
|
|
||||||
\li To process pre-compiled headers before processing any project files,
|
\li To specify settings for the Clang code model, select
|
||||||
deselect the \uicontrol {Ignore pre-compiled headers} check box.
|
\uicontrol Tools > \uicontrol Options > \uicontrol C++ >
|
||||||
|
\uicontrol {Code Model}.
|
||||||
|
|
||||||
|
\image qtcreator-clang-code-model-options.png
|
||||||
|
|
||||||
|
\li In the \uicontrol {Configuration to use} list, select the
|
||||||
|
warnings to request.
|
||||||
|
|
||||||
|
\li To have Clang process pre-compiled headers, deselect the
|
||||||
|
\uicontrol {Ignore pre-compiled headers} check box.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
@@ -65,7 +65,7 @@
|
|||||||
alphabetic order.
|
alphabetic order.
|
||||||
|
|
||||||
To jump to a line and column in the current file, select the line and column
|
To jump to a line and column in the current file, select the line and column
|
||||||
indicator (3) or press \key {Ctrl+L} (or \key {Cmd+L} on OS X) to open the
|
indicator (3) or press \key {Ctrl+L} (or \key {Cmd+L} on \macos) to open the
|
||||||
locator. Enter the line number and column number in the locator, separated
|
locator. Enter the line number and column number in the locator, separated
|
||||||
by a colon (:).
|
by a colon (:).
|
||||||
|
|
||||||
|
@@ -142,6 +142,17 @@
|
|||||||
\uicontrol Tools > \uicontrol Options > \uicontrol {Text Editor} >
|
\uicontrol Tools > \uicontrol Options > \uicontrol {Text Editor} >
|
||||||
\uicontrol Display and deselect \uicontrol {Animate matching parentheses}.
|
\uicontrol Display and deselect \uicontrol {Animate matching parentheses}.
|
||||||
|
|
||||||
|
You can use keyboard shortcuts to move within and between blocks. To go to
|
||||||
|
block end, press \key {Ctrl+]} and to go to block start, press
|
||||||
|
\key {Ctrl+[}. To also select the lines from the cursor position to the end
|
||||||
|
or beginning of the block, press \key {Ctrl+Shift+]} and
|
||||||
|
\key {Ctrl+Shift+[}, respectively.
|
||||||
|
|
||||||
|
To select the current block, press \key Ctrl+U. A second key press extends
|
||||||
|
the selection to the parent block. To undo the last selection, press
|
||||||
|
\key {Ctrl+Alt+Shift+U}. To enable smart block selection, select
|
||||||
|
\uicontrol Tools > \uicontrol Options > \uicontrol {Text Editor} >
|
||||||
|
\uicontrol Behavior > \uicontrol {Enable smart selection changing}.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -193,7 +204,7 @@
|
|||||||
schemas. \QC looks for a JSON schema file with a
|
schemas. \QC looks for a JSON schema file with a
|
||||||
name that matches the name of the JSON instance file in the user
|
name that matches the name of the JSON instance file in the user
|
||||||
configuration folder. For example, \c {~/config/QtProject/qtcreator/json} on
|
configuration folder. For example, \c {~/config/QtProject/qtcreator/json} on
|
||||||
Linux and OS X and
|
Linux and \macos and
|
||||||
\c {C:\Users\username\AppData\Roaming\QtCreator\qtcreator\json}
|
\c {C:\Users\username\AppData\Roaming\QtCreator\qtcreator\json}
|
||||||
in Windows. To check JSON data structure, copy the JSON schema file to the
|
in Windows. To check JSON data structure, copy the JSON schema file to the
|
||||||
above folder.
|
above folder.
|
||||||
@@ -491,6 +502,12 @@
|
|||||||
expressions only
|
expressions only
|
||||||
\li
|
\li
|
||||||
|
|
||||||
|
\row
|
||||||
|
\li M128
|
||||||
|
\li Error
|
||||||
|
\li A state cannot have the specified child item
|
||||||
|
\li
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\li M201
|
\li M201
|
||||||
\li Hint
|
\li Hint
|
||||||
@@ -894,6 +911,8 @@
|
|||||||
|
|
||||||
\li QML code snippets, which specify QML code constructs
|
\li QML code snippets, which specify QML code constructs
|
||||||
|
|
||||||
|
\li Nim code snippets, which specify Nim code constructs
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
\section3 Adding and Editing Snippets
|
\section3 Adding and Editing Snippets
|
||||||
@@ -1036,9 +1055,9 @@
|
|||||||
copy the URL of the post on the code pasting service to the
|
copy the URL of the post on the code pasting service to the
|
||||||
clipboard when you paste a post.
|
clipboard when you paste a post.
|
||||||
|
|
||||||
\li Select the \uicontrol {Display Output pane after sending a post} to
|
\li Select the \uicontrol {Display Output pane after sending a post}
|
||||||
display the URL in the \uicontrol {General Messages} output pane
|
check box to display the URL in the \uicontrol {General Messages}
|
||||||
when you paste a post.
|
output pane when you paste a post.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@@ -1240,6 +1259,8 @@
|
|||||||
identifiers, type names, or left or right \c const or \c volatile
|
identifiers, type names, or left or right \c const or \c volatile
|
||||||
keywords.
|
keywords.
|
||||||
|
|
||||||
|
\li Name getter functions.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
You can use the live preview to see how the options change the indentation.
|
You can use the live preview to see how the options change the indentation.
|
||||||
@@ -1423,6 +1444,14 @@
|
|||||||
|
|
||||||
\image qtcreator-pointers-references.png "Pointers and References options"
|
\image qtcreator-pointers-references.png "Pointers and References options"
|
||||||
|
|
||||||
|
\section1 Naming Getters
|
||||||
|
|
||||||
|
To prefer getter names without the string \e get, select the
|
||||||
|
\uicontrol {Prefer getter names without "get"} check box in the
|
||||||
|
\uicontrol {Getter and Setter} tab.
|
||||||
|
|
||||||
|
\image qtcreator-code-style-getter-setter.png
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -1548,6 +1577,8 @@
|
|||||||
\li \uicontrol {Files in File System} recursively searches files
|
\li \uicontrol {Files in File System} recursively searches files
|
||||||
matching the defined file pattern in the selected directory.
|
matching the defined file pattern in the selected directory.
|
||||||
|
|
||||||
|
\image qtcreator-search-filesystem.png
|
||||||
|
|
||||||
Select the \uicontrol {Use Git Grep} check box to use Git to
|
Select the \uicontrol {Use Git Grep} check box to use Git to
|
||||||
only search tracked files in the Git work tree. To restrict
|
only search tracked files in the Git work tree. To restrict
|
||||||
the search to the HEAD, a tag, a local or remote branch, or
|
the search to the HEAD, a tag, a local or remote branch, or
|
||||||
@@ -2442,7 +2473,7 @@
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\li Press \key {Ctrl+K} (\key {Cmd+K} on OS X).
|
\li Press \key {Ctrl+K} (\key {Cmd+K} on \macos).
|
||||||
|
|
||||||
\li Select \uicontrol Tools > \uicontrol Locate.
|
\li Select \uicontrol Tools > \uicontrol Locate.
|
||||||
|
|
||||||
|
@@ -61,7 +61,7 @@
|
|||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
On OS X:
|
On \macos:
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
|
@@ -81,7 +81,7 @@
|
|||||||
\section1 Using External Text Editors
|
\section1 Using External Text Editors
|
||||||
|
|
||||||
You can open files for editing in the default text editor for your system:
|
You can open files for editing in the default text editor for your system:
|
||||||
Notepad on Windows and vi on Linux and OS X.
|
Notepad on Windows and vi on Linux and \macos.
|
||||||
To open the file you are currently viewing in an external editor, select
|
To open the file you are currently viewing in an external editor, select
|
||||||
\uicontrol Tools > \uicontrol External > \uicontrol Text >
|
\uicontrol Tools > \uicontrol External > \uicontrol Text >
|
||||||
\uicontrol {Edit with Notepad} or \uicontrol {Edit with vi}, depending on
|
\uicontrol {Edit with Notepad} or \uicontrol {Edit with vi}, depending on
|
||||||
@@ -157,7 +157,7 @@
|
|||||||
The tool configurations that you add and modify are stored in XML format in
|
The tool configurations that you add and modify are stored in XML format in
|
||||||
the user configuration folder. For example,
|
the user configuration folder. For example,
|
||||||
\c {~/config/QtProject/qtcreator/externaltools}
|
\c {~/config/QtProject/qtcreator/externaltools}
|
||||||
on Linux and OS X and
|
on Linux and \macos and
|
||||||
\c {C:\Users\username\AppData\Roaming\QtProject\qtcreator\externaltools}
|
\c {C:\Users\username\AppData\Roaming\QtProject\qtcreator\externaltools}
|
||||||
in Windows. To share a configuration with other users, copy an XML
|
in Windows. To share a configuration with other users, copy an XML
|
||||||
configuration file to the folder.
|
configuration file to the folder.
|
||||||
|
@@ -200,19 +200,19 @@
|
|||||||
\li Ctrl+6
|
\li Ctrl+6
|
||||||
\row
|
\row
|
||||||
\li Toggle \uicontrol{Issues} pane
|
\li Toggle \uicontrol{Issues} pane
|
||||||
\li Alt+1 (Cmd+1 on OS X)
|
\li Alt+1 (Cmd+1 on \macos)
|
||||||
\row
|
\row
|
||||||
\li Toggle \uicontrol{Search Results} pane
|
\li Toggle \uicontrol{Search Results} pane
|
||||||
\li Alt+2 (Cmd+2 on OS X)
|
\li Alt+2 (Cmd+2 on \macos)
|
||||||
\row
|
\row
|
||||||
\li Toggle \uicontrol{Application Output} pane
|
\li Toggle \uicontrol{Application Output} pane
|
||||||
\li Alt+3 (Cmd+3 on OS X)
|
\li Alt+3 (Cmd+3 on \macos)
|
||||||
\row
|
\row
|
||||||
\li Toggle \uicontrol{Compile Output} pane
|
\li Toggle \uicontrol{Compile Output} pane
|
||||||
\li Alt+4 (Cmd+4 on OS X)
|
\li Alt+4 (Cmd+4 on \macos)
|
||||||
\row
|
\row
|
||||||
\li Toggle other output panes
|
\li Toggle other output panes
|
||||||
\li Alt+number (Cmd+number on OS X)
|
\li Alt+number (Cmd+number on \macos)
|
||||||
|
|
||||||
Where the number is the number of the output pane.
|
Where the number is the number of the output pane.
|
||||||
\row
|
\row
|
||||||
@@ -241,7 +241,7 @@
|
|||||||
\li Ctrl+Shift+F11
|
\li Ctrl+Shift+F11
|
||||||
\row
|
\row
|
||||||
\li Toggle the sidebar
|
\li Toggle the sidebar
|
||||||
\li Alt+0 (Cmd+0 on OS X)
|
\li Alt+0 (Cmd+0 on \macos)
|
||||||
\row
|
\row
|
||||||
\li Undo
|
\li Undo
|
||||||
\li Ctrl+Z
|
\li Ctrl+Z
|
||||||
@@ -337,11 +337,25 @@
|
|||||||
\li Go to block start
|
\li Go to block start
|
||||||
\li Ctrl+[
|
\li Ctrl+[
|
||||||
\row
|
\row
|
||||||
\li Go to block end with selection
|
\li Go to block end and select the lines between the current cursor
|
||||||
\li Ctrl+}
|
position and the end of the block
|
||||||
|
\li Ctrl+Shift+]
|
||||||
\row
|
\row
|
||||||
\li Go to block start with selection
|
\li Go to block start and select the lines between the current
|
||||||
\li Ctrl+{
|
cursor position and the beginning of the block
|
||||||
|
\li Ctrl+Shift+[
|
||||||
|
\row
|
||||||
|
\li Select the current block
|
||||||
|
|
||||||
|
The second press extends the selection to the parent block. To
|
||||||
|
enable this behavior, select \uicontrol Tools >
|
||||||
|
\uicontrol Options > \uicontrol {Text Editor} >
|
||||||
|
\uicontrol Behavior >
|
||||||
|
\uicontrol {Enable smart selection changing}.
|
||||||
|
\li Ctrl+U
|
||||||
|
\row
|
||||||
|
\li Undo the latest smart block selection
|
||||||
|
\li Ctrl+Alt+Shift+U
|
||||||
\row
|
\row
|
||||||
\li Move current line down
|
\li Move current line down
|
||||||
\li Ctrl+Shift+Down
|
\li Ctrl+Shift+Down
|
||||||
@@ -354,11 +368,6 @@
|
|||||||
\row
|
\row
|
||||||
\li Rewrap paragraph
|
\li Rewrap paragraph
|
||||||
\li Ctrl+E, R
|
\li Ctrl+E, R
|
||||||
\row
|
|
||||||
\li Select the current block
|
|
||||||
|
|
||||||
The second press extends the selection to the parent block
|
|
||||||
\li Ctrl+U
|
|
||||||
\row
|
\row
|
||||||
\li Enable text wrapping
|
\li Enable text wrapping
|
||||||
\li Ctrl+E, Ctrl+W
|
\li Ctrl+E, Ctrl+W
|
||||||
@@ -469,6 +478,37 @@
|
|||||||
\li Alt+V, n, where n is the number of the user action, from 1 to 9
|
\li Alt+V, n, where n is the number of the user action, from 1 to 9
|
||||||
\endtable
|
\endtable
|
||||||
|
|
||||||
|
\section3 Emacs Shortcuts
|
||||||
|
|
||||||
|
You can specify shortcuts for executing actions in a way that is familiar to
|
||||||
|
\l{https://www.gnu.org/software/emacs/manual/html_node/emacs/index.html}
|
||||||
|
{Emacs} editor users. The actions are not bound to any key combinations by
|
||||||
|
default. The following actions are available:
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li Copy
|
||||||
|
\li Cut
|
||||||
|
\li Delete Character
|
||||||
|
\li Exchange Cursor and Mark
|
||||||
|
\li Go to File End
|
||||||
|
\li Go to File Start
|
||||||
|
\li Go to Line End
|
||||||
|
\li Go to Line Start
|
||||||
|
\li Go to Next Character
|
||||||
|
\li Go to Next Line
|
||||||
|
\li Go to Next Word
|
||||||
|
\li Go to Previous Character
|
||||||
|
\li Go to Previous Line
|
||||||
|
\li Go to Previous Word
|
||||||
|
\li Insert Line and Indent
|
||||||
|
\li Kill Line
|
||||||
|
\li Kill Word
|
||||||
|
\li Mark
|
||||||
|
\li Scroll Half Screen Down
|
||||||
|
\li Scroll Half Screen Up
|
||||||
|
\li Yank
|
||||||
|
\endlist
|
||||||
|
|
||||||
\section2 Image Viewer Shortcuts
|
\section2 Image Viewer Shortcuts
|
||||||
|
|
||||||
\table
|
\table
|
||||||
|
@@ -61,8 +61,8 @@
|
|||||||
\key Ctrl+Tab.
|
\key Ctrl+Tab.
|
||||||
|
|
||||||
To move forward in the location history, press \key {Alt+Right}
|
To move forward in the location history, press \key {Alt+Right}
|
||||||
(\key {Cmd+Opt+Right} on OS X). To move backward, press \key {Alt+Left}
|
(\key {Cmd+Opt+Right} on \macos). To move backward, press \key {Alt+Left}
|
||||||
(\key {Cmd+Opt+Left} on OS X). For example, if you use the \uicontrol Locator
|
(\key {Cmd+Opt+Left} on \macos). For example, if you use the \uicontrol Locator
|
||||||
to jump to a symbol in the same file, you can jump back to your original
|
to jump to a symbol in the same file, you can jump back to your original
|
||||||
location in that file by pressing \key {Alt+Left}.
|
location in that file by pressing \key {Alt+Left}.
|
||||||
|
|
||||||
@@ -96,13 +96,13 @@
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\li \uicontrol{Issues} pane Alt+1 (Cmd+1 on OS X)
|
\li \uicontrol{Issues} pane Alt+1 (Cmd+1 on \macos)
|
||||||
|
|
||||||
\li \uicontrol{Search Results} pane Alt+2 (Cmd+2 on OS X)
|
\li \uicontrol{Search Results} pane Alt+2 (Cmd+2 on \macos)
|
||||||
|
|
||||||
\li \uicontrol{Application Output} pane Alt+3 (Cmd+3 on OS X)
|
\li \uicontrol{Application Output} pane Alt+3 (Cmd+3 on \macos)
|
||||||
|
|
||||||
\li \uicontrol{Compile Output} pane Alt+4 (Cmd+4 on OS X)
|
\li \uicontrol{Compile Output} pane Alt+4 (Cmd+4 on \macos)
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@
|
|||||||
|
|
||||||
To toggle the sidebar in the \uicontrol Edit and \uicontrol Debug modes, click
|
To toggle the sidebar in the \uicontrol Edit and \uicontrol Debug modes, click
|
||||||
\inlineimage sidebaricon.png
|
\inlineimage sidebaricon.png
|
||||||
or press \key Alt+0 (\key Cmd+0 on OS X).
|
or press \key Alt+0 (\key Cmd+0 on \macos).
|
||||||
|
|
||||||
For more information on using the sidebar, see
|
For more information on using the sidebar, see
|
||||||
\l {Browsing Project Contents}.
|
\l {Browsing Project Contents}.
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
select the symbol in the list. For more information on using the locator,
|
select the symbol in the list. For more information on using the locator,
|
||||||
see \l{Searching with the Locator}.
|
see \l{Searching with the Locator}.
|
||||||
|
|
||||||
Press \key Ctrl (\key Cmd on OS X) and click a symbol to move directly to
|
Press \key Ctrl (\key Cmd on \macos) and click a symbol to move directly to
|
||||||
the definition or the declaration of the symbol. You can also move the
|
the definition or the declaration of the symbol. You can also move the
|
||||||
cursor on the symbol and press \key {F2}. For more information, see
|
cursor on the symbol and press \key {F2}. For more information, see
|
||||||
\l{Moving to Symbol Definition or Declaration}.
|
\l{Moving to Symbol Definition or Declaration}.
|
||||||
|
@@ -157,7 +157,7 @@
|
|||||||
|
|
||||||
\li To toggle the sidebar, click \inlineimage sidebaricon.png
|
\li To toggle the sidebar, click \inlineimage sidebaricon.png
|
||||||
(\uicontrol {Hide Sidebar/Show Sidebar}) or press \key Alt+0
|
(\uicontrol {Hide Sidebar/Show Sidebar}) or press \key Alt+0
|
||||||
(\key Cmd+0 on OS X).
|
(\key Cmd+0 on \macos).
|
||||||
|
|
||||||
\li To split the sidebar, click \inlineimage splitbutton_horizontal.png
|
\li To split the sidebar, click \inlineimage splitbutton_horizontal.png
|
||||||
(\uicontrol {Split}). Select new content to view in the split view.
|
(\uicontrol {Split}). Select new content to view in the split view.
|
||||||
@@ -574,7 +574,7 @@
|
|||||||
\e options or \e preferences. In this manual, the names and locations on
|
\e options or \e preferences. In this manual, the names and locations on
|
||||||
Windows and Linux are usually used to keep the instructions short. Here are
|
Windows and Linux are usually used to keep the instructions short. Here are
|
||||||
some places to check if you cannot find a function, dialog, or keyboard
|
some places to check if you cannot find a function, dialog, or keyboard
|
||||||
shortcut on OS X when following the instructions:
|
shortcut on \macos when following the instructions:
|
||||||
|
|
||||||
\table
|
\table
|
||||||
\header
|
\header
|
||||||
|
@@ -668,7 +668,7 @@
|
|||||||
To start a graphical interface to Git, select \uicontrol Tools > \uicontrol Git >
|
To start a graphical interface to Git, select \uicontrol Tools > \uicontrol Git >
|
||||||
\uicontrol {Git Tools} > \uicontrol {Git Gui}.
|
\uicontrol {Git Tools} > \uicontrol {Git Gui}.
|
||||||
|
|
||||||
\note On OS X, the default Git installation does not contain Git Gui. To
|
\note On \macos, the default Git installation does not contain Git Gui. To
|
||||||
use Git Gui, install it separately. To start Git Gui from \QC, select
|
use Git Gui, install it separately. To start Git Gui from \QC, select
|
||||||
\uicontrol Preferences > \uicontrol {Version Control} > \uicontrol Git, and set the path to
|
\uicontrol Preferences > \uicontrol {Version Control} > \uicontrol Git, and set the path to
|
||||||
the environment that contains Git Gui in the \uicontrol {Prepend to PATH} field.
|
the environment that contains Git Gui in the \uicontrol {Prepend to PATH} field.
|
||||||
|
@@ -129,7 +129,7 @@
|
|||||||
The location depends on the platform. On Linux and other Unix platforms, the files
|
The location depends on the platform. On Linux and other Unix platforms, the files
|
||||||
are located in \c {~/.config/QtProject} and \c {~/.local/share/data/QtProject/qtcreator}.
|
are located in \c {~/.config/QtProject} and \c {~/.local/share/data/QtProject/qtcreator}.
|
||||||
|
|
||||||
On OS X, the files are located in \c {~/.config/QtProject} and
|
On \macos, the files are located in \c {~/.config/QtProject} and
|
||||||
\c {~/Library/Application Support/QtProject/Qt Creator}.
|
\c {~/Library/Application Support/QtProject/Qt Creator}.
|
||||||
|
|
||||||
On Windows XP, the files are located in
|
On Windows XP, the files are located in
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
for the application. Many plugins specify either the path to the tool they
|
for the application. Many plugins specify either the path to the tool they
|
||||||
need or the environment they run in.
|
need or the environment they run in.
|
||||||
|
|
||||||
This is especially relevant for the OS X where \c {/usr/local/bin} might
|
This is especially relevant for the \macos where \c {/usr/local/bin} might
|
||||||
not be in the path when \QC is started.
|
not be in the path when \QC is started.
|
||||||
|
|
||||||
\b {How do I change the interface language for \QC?}
|
\b {How do I change the interface language for \QC?}
|
||||||
@@ -193,7 +193,7 @@
|
|||||||
\b {If I have a choice of GDB versions, which should I use?}
|
\b {If I have a choice of GDB versions, which should I use?}
|
||||||
|
|
||||||
On Linux and Windows, use the Python-enabled GDB versions that are
|
On Linux and Windows, use the Python-enabled GDB versions that are
|
||||||
installed when you install \QC and \QSDK. On OS X, GDB is no longer
|
installed when you install \QC and \QSDK. On \macos, GDB is no longer
|
||||||
officially supported. To build your own Python-enabled GDB, follow the
|
officially supported. To build your own Python-enabled GDB, follow the
|
||||||
instructions in
|
instructions in
|
||||||
\l{https://wiki.qt.io/QtCreator_Build_Gdb}{Building GDB}.
|
\l{https://wiki.qt.io/QtCreator_Build_Gdb}{Building GDB}.
|
||||||
@@ -218,7 +218,7 @@
|
|||||||
|
|
||||||
\b {How can I make use of my multi-core CPU with \QC?}
|
\b {How can I make use of my multi-core CPU with \QC?}
|
||||||
|
|
||||||
On Linux and OS X, go to \uicontrol Project mode, select your configuration
|
On Linux and \macos, go to \uicontrol Project mode, select your configuration
|
||||||
in the \uicontrol {Build Settings}, locate the \uicontrol {Build Steps}, and add the
|
in the \uicontrol {Build Settings}, locate the \uicontrol {Build Steps}, and add the
|
||||||
following value, where \c{<num>} is the amount of cores in your CPU:
|
following value, where \c{<num>} is the amount of cores in your CPU:
|
||||||
\c{-j <num>}
|
\c{-j <num>}
|
||||||
@@ -259,7 +259,7 @@
|
|||||||
|
|
||||||
\b {Where is application output shown in \QC?}
|
\b {Where is application output shown in \QC?}
|
||||||
|
|
||||||
\b {On Unix (Linux and OS X):} \c qDebug() and related functions use
|
\b {On Unix (Linux and \macos):} \c qDebug() and related functions use
|
||||||
the standard output and error output. When you run or debug the
|
the standard output and error output. When you run or debug the
|
||||||
application, you can view the output in the \uicontrol{Application Output} pane.
|
application, you can view the output in the \uicontrol{Application Output} pane.
|
||||||
|
|
||||||
|
@@ -35,7 +35,7 @@
|
|||||||
You can connect iOS devices to a Mac computer with a USB cable to
|
You can connect iOS devices to a Mac computer with a USB cable to
|
||||||
build and run applications on them from \QC.
|
build and run applications on them from \QC.
|
||||||
|
|
||||||
To be able to use \QC on OS X, you must install Xcode, and therefore,
|
To be able to use \QC on \macos, you must install Xcode, and therefore,
|
||||||
you already have the tool chain for building applications for iOS. \QC
|
you already have the tool chain for building applications for iOS. \QC
|
||||||
automatically detects the tool chain and creates the necessary
|
automatically detects the tool chain and creates the necessary
|
||||||
\l{glossary-buildandrun-kit}{kits} for building and running applications on
|
\l{glossary-buildandrun-kit}{kits} for building and running applications on
|
||||||
|
@@ -113,7 +113,7 @@
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\li Xcode tools for your OS X version available on the
|
\li Xcode tools for your \macos version available on the
|
||||||
Mac App Store.
|
Mac App Store.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
@@ -43,7 +43,7 @@
|
|||||||
\li {3,1} Development Platform
|
\li {3,1} Development Platform
|
||||||
\header
|
\header
|
||||||
\li Linux
|
\li Linux
|
||||||
\li OS X
|
\li \macos
|
||||||
\li Windows
|
\li Windows
|
||||||
|
|
||||||
\row
|
\row
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
and deploy configurations, select \uicontrol Tools > \uicontrol Options >
|
and deploy configurations, select \uicontrol Tools > \uicontrol Options >
|
||||||
\uicontrol {Build & Run}. By
|
\uicontrol {Build & Run}. By
|
||||||
default, the \uicontrol {Always build project before deploying it} and the
|
default, the \uicontrol {Always build project before deploying it} and the
|
||||||
\uicontrol {Always deploy project before running it} options are enabled.
|
\uicontrol {Always deploy project before running it} options (1) are enabled.
|
||||||
Therefore, when you select the \uicontrol Run function, \QC checks for changes in
|
Therefore, when you select the \uicontrol Run function, \QC checks for changes in
|
||||||
the project files and also builds and deploys the project if necessary.
|
the project files and also builds and deploys the project if necessary.
|
||||||
|
|
||||||
|
@@ -47,6 +47,13 @@
|
|||||||
You can add paths to other CMake executables and use them in different
|
You can add paths to other CMake executables and use them in different
|
||||||
build and run \l{glossary-buildandrun-kit}{kits}.
|
build and run \l{glossary-buildandrun-kit}{kits}.
|
||||||
|
|
||||||
|
\QC automatically runs CMake to regenerate makefiles when you edit a
|
||||||
|
\c CMakeLists.txt configuration file in a project. If the project uses
|
||||||
|
several configuration files, you can disable the automatic generation of
|
||||||
|
makefiles by selecting \uicontrol Tools > \uicontrol Options >
|
||||||
|
\uicontrol {Build & Run} > \uicontrol CMake. Makefiles are automatically
|
||||||
|
regenerated when you build the project.
|
||||||
|
|
||||||
\section1 Adding CMake Tools
|
\section1 Adding CMake Tools
|
||||||
|
|
||||||
\QC supports CMake version 3.0, or later. For best results you should use
|
\QC supports CMake version 3.0, or later. For best results you should use
|
||||||
@@ -67,6 +74,10 @@
|
|||||||
\li In the \uicontrol Path field, specify the path to the CMake
|
\li In the \uicontrol Path field, specify the path to the CMake
|
||||||
executable.
|
executable.
|
||||||
|
|
||||||
|
\li Deselect the \uicontrol {Autorun CMake} check box to prevent \QC
|
||||||
|
from running CMake when you make changes to \c {CMakeLists.txt}
|
||||||
|
files.
|
||||||
|
|
||||||
\li Select \uicontrol Apply to save your changes.
|
\li Select \uicontrol Apply to save your changes.
|
||||||
|
|
||||||
\li Select the \uicontrol Kits tab to add the CMake tool to a build and
|
\li Select the \uicontrol Kits tab to add the CMake tool to a build and
|
||||||
@@ -94,7 +105,7 @@
|
|||||||
|
|
||||||
\li In the \uicontrol {Create in} field, enter the path for the project
|
\li In the \uicontrol {Create in} field, enter the path for the project
|
||||||
files, and then select \uicontrol Next (or \uicontrol Continue on
|
files, and then select \uicontrol Next (or \uicontrol Continue on
|
||||||
OS X).
|
\macos).
|
||||||
|
|
||||||
\li In the \uicontrol {Build system} field, select \uicontrol CMake, and
|
\li In the \uicontrol {Build system} field, select \uicontrol CMake, and
|
||||||
then select \uicontrol Next.
|
then select \uicontrol Next.
|
||||||
@@ -103,7 +114,7 @@
|
|||||||
application for, and then select \uicontrol Next.
|
application for, and then select \uicontrol Next.
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol{Finish} (or
|
\li Review the project settings, and click \uicontrol{Finish} (or
|
||||||
\uicontrol Done on OS X).
|
\uicontrol Done on \macos).
|
||||||
|
|
||||||
\li Select \uicontrol {Run CMake} to generate a .cbp file.
|
\li Select \uicontrol {Run CMake} to generate a .cbp file.
|
||||||
|
|
||||||
@@ -159,7 +170,7 @@
|
|||||||
\section1 Building CMake Projects
|
\section1 Building CMake Projects
|
||||||
|
|
||||||
To build CMake projects, select \uicontrol {Build Project} or press
|
To build CMake projects, select \uicontrol {Build Project} or press
|
||||||
\key Ctrl+B (or \key Cmd+B on OS X).
|
\key Ctrl+B (or \key Cmd+B on \macos).
|
||||||
|
|
||||||
\QC builds CMake projects by running \c make, \c mingw32-make, \c nmake, or
|
\QC builds CMake projects by running \c make, \c mingw32-make, \c nmake, or
|
||||||
\c ninja depending on the selected kit.
|
\c ninja depending on the selected kit.
|
||||||
@@ -206,7 +217,7 @@
|
|||||||
\image qtcreator-cmake-run-settings.png
|
\image qtcreator-cmake-run-settings.png
|
||||||
|
|
||||||
To run CMake projects, select \uicontrol Run or press \key Ctrl+R (or
|
To run CMake projects, select \uicontrol Run or press \key Ctrl+R (or
|
||||||
\key Cmd+R on OS X).
|
\key Cmd+R on \macos).
|
||||||
|
|
||||||
\section1 Deploying CMake Projects to Embedded Linux Devices
|
\section1 Deploying CMake Projects to Embedded Linux Devices
|
||||||
|
|
||||||
|
@@ -51,7 +51,7 @@
|
|||||||
\list
|
\list
|
||||||
|
|
||||||
\li GNU Compiler Collection (GCC) is a compiler for Linux and
|
\li GNU Compiler Collection (GCC) is a compiler for Linux and
|
||||||
OS X.
|
\macos.
|
||||||
|
|
||||||
\li MinGW (Minimalist GNU for Windows) is a native software port of GCC
|
\li MinGW (Minimalist GNU for Windows) is a native software port of GCC
|
||||||
and GNU Binutils for use in the development of native Microsoft
|
and GNU Binutils for use in the development of native Microsoft
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
for Linux.
|
for Linux.
|
||||||
|
|
||||||
\li Clang is a C, C++, Objective C, and Objective C++ front-end for the
|
\li Clang is a C, C++, Objective C, and Objective C++ front-end for the
|
||||||
LLVM compiler for Windows, Linux, and OS X.
|
LLVM compiler for Windows, Linux, and \macos.
|
||||||
|
|
||||||
\li QCC is the interface for compiling C++ applications for QNX.
|
\li QCC is the interface for compiling C++ applications for QNX.
|
||||||
|
|
||||||
|
@@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
\li the local user's configuration folder,
|
\li the local user's configuration folder,
|
||||||
\c {$HOME/.config/QtProject/qtcreator/templates/wizards} on Linux
|
\c {$HOME/.config/QtProject/qtcreator/templates/wizards} on Linux
|
||||||
and OS X or \c {%APPDATA%\QtProject\qtcreator\templates\wizards} on
|
and \macos or \c {%APPDATA%\QtProject\qtcreator\templates\wizards} on
|
||||||
Windows
|
Windows
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
@@ -63,10 +63,10 @@
|
|||||||
(PRE_TARGETDEPS) in the project file.
|
(PRE_TARGETDEPS) in the project file.
|
||||||
|
|
||||||
Depending on the development platform, some options might be detected
|
Depending on the development platform, some options might be detected
|
||||||
automatically. For example, on OS X, the library type (\uicontrol Library or
|
automatically. For example, on \macos, the library type (\uicontrol Library or
|
||||||
\uicontrol Framework) is detected automatically and the option is hidden. However,
|
\uicontrol Framework) is detected automatically and the option is hidden. However,
|
||||||
if you develop on another platform than OS X and want to build your
|
if you develop on another platform than \macos and want to build your
|
||||||
project for OS X, you must specify the library type.
|
project for \macos, you must specify the library type.
|
||||||
|
|
||||||
The default convention on Windows is that the debug and release versions
|
The default convention on Windows is that the debug and release versions
|
||||||
of a library have the same name, but are placed in different subdirectories,
|
of a library have the same name, but are placed in different subdirectories,
|
||||||
|
@@ -74,6 +74,8 @@
|
|||||||
|
|
||||||
\li \l{Configuring Fonts}
|
\li \l{Configuring Fonts}
|
||||||
|
|
||||||
|
\li \l{Highlighting and Folding Blocks}
|
||||||
|
|
||||||
\li \l{Viewing Function Tooltips}
|
\li \l{Viewing Function Tooltips}
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
you use deployment steps.
|
you use deployment steps.
|
||||||
|
|
||||||
The \uicontrol {Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)} option
|
The \uicontrol {Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)} option
|
||||||
(only available on OS X) enables you to debug (for example, step into)
|
(only available on \macos) enables you to debug (for example, step into)
|
||||||
linked frameworks, such as the Qt framework itself. You do not need this
|
linked frameworks, such as the Qt framework itself. You do not need this
|
||||||
option for debugging your application code.
|
option for debugging your application code.
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
\QC uses the compiler specified in the QNX tool chain to build the
|
\QC uses the compiler specified in the QNX tool chain to build the
|
||||||
application.
|
application.
|
||||||
|
|
||||||
\note Debugging is currently only fully supported on Linux and OS X.
|
\note Debugging is currently only fully supported on Linux and \macos.
|
||||||
It is not possible to insert breakpoints during runtime on Windows.
|
It is not possible to insert breakpoints during runtime on Windows.
|
||||||
|
|
||||||
\section2 Troubleshooting Errors
|
\section2 Troubleshooting Errors
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
(IDE) for application developers to create applications for multiple
|
(IDE) for application developers to create applications for multiple
|
||||||
desktop, \l {http://doc.qt.io/QtForDeviceCreation/index.html}{embedded},
|
desktop, \l {http://doc.qt.io/QtForDeviceCreation/index.html}{embedded},
|
||||||
and mobile device platforms, such as \l{Connecting Android Devices}{Android}
|
and mobile device platforms, such as \l{Connecting Android Devices}{Android}
|
||||||
and \l{Connecting iOS Devices}{iOS}. It is available for Linux, OS X and
|
and \l{Connecting iOS Devices}{iOS}. It is available for Linux, \macos and
|
||||||
Windows
|
Windows
|
||||||
operating systems. For more information, see \l{Supported Platforms}.
|
operating systems. For more information, see \l{Supported Platforms}.
|
||||||
|
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
\li In the \uicontrol {Create in} field, enter the path for the project
|
\li In the \uicontrol {Create in} field, enter the path for the project
|
||||||
files, and then select \uicontrol Next (or \uicontrol Continue on
|
files, and then select \uicontrol Next (or \uicontrol Continue on
|
||||||
OS X).
|
\macos).
|
||||||
|
|
||||||
\li In the \uicontrol {Minimal required Qt version} field, select
|
\li In the \uicontrol {Minimal required Qt version} field, select
|
||||||
\uicontrol {Qt 5.4}, or later.
|
\uicontrol {Qt 5.4}, or later.
|
||||||
@@ -30,12 +30,12 @@
|
|||||||
Tools > \uicontrol Options > \uicontrol {Build & Run} >
|
Tools > \uicontrol Options > \uicontrol {Build & Run} >
|
||||||
\uicontrol Kits (on Windows and Linux) or in \uicontrol {Qt Creator}
|
\uicontrol Kits (on Windows and Linux) or in \uicontrol {Qt Creator}
|
||||||
> \uicontrol Preferences \uicontrol {Build & Run} > \uicontrol Kits
|
> \uicontrol Preferences \uicontrol {Build & Run} > \uicontrol Kits
|
||||||
(on OS X).
|
(on \macos).
|
||||||
|
|
||||||
\li Select \uicontrol Next.
|
\li Select \uicontrol Next.
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol{Finish} (or
|
\li Review the project settings, and click \uicontrol{Finish} (or
|
||||||
\uicontrol Done on OS X).
|
\uicontrol Done on \macos).
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
@@ -115,7 +115,7 @@
|
|||||||
\uicontrol Kits.
|
\uicontrol Kits.
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol Finish (on Windows
|
\li Review the project settings, and click \uicontrol Finish (on Windows
|
||||||
and Linux) or \uicontrol Done (on OS X) to create the project.
|
and Linux) or \uicontrol Done (on \macos) to create the project.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
@@ -61,7 +61,7 @@
|
|||||||
|
|
||||||
\li In the \uicontrol {Create in} field, enter the path for the project files.
|
\li In the \uicontrol {Create in} field, enter the path for the project files.
|
||||||
For example, \c {C:\Qt\examples}, and then click \uicontrol{Next} (on
|
For example, \c {C:\Qt\examples}, and then click \uicontrol{Next} (on
|
||||||
Windows and Linux) or \uicontrol Continue (on OS X).
|
Windows and Linux) or \uicontrol Continue (on \macos).
|
||||||
|
|
||||||
The \uicontrol {Kit Selection} dialog opens.
|
The \uicontrol {Kit Selection} dialog opens.
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
\note If only one kit is specified in \uicontrol Tools > \uicontrol Options >
|
\note If only one kit is specified in \uicontrol Tools > \uicontrol Options >
|
||||||
\uicontrol {Build & Run} > \uicontrol Kits (on Windows and Linux) or in
|
\uicontrol {Build & Run} > \uicontrol Kits (on Windows and Linux) or in
|
||||||
\uicontrol {Qt Creator} > \uicontrol Preferences \uicontrol {Build & Run} > \uicontrol Kits
|
\uicontrol {Qt Creator} > \uicontrol Preferences \uicontrol {Build & Run} > \uicontrol Kits
|
||||||
(on OS X), this dialog is skipped.
|
(on \macos), this dialog is skipped.
|
||||||
|
|
||||||
The \uicontrol{Class Information} dialog opens.
|
The \uicontrol{Class Information} dialog opens.
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
\image qtcreator-new-project-summary-qt-gui.png "Project Management dialog"
|
\image qtcreator-new-project-summary-qt-gui.png "Project Management dialog"
|
||||||
|
|
||||||
\li Review the project settings, and click \uicontrol{Finish} (on Windows and
|
\li Review the project settings, and click \uicontrol{Finish} (on Windows and
|
||||||
Linux) or \uicontrol Done (on OS X) to create the project.
|
Linux) or \uicontrol Done (on \macos) to create the project.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@
|
|||||||
|
|
||||||
\li Press \key {Ctrl+A} (or \key {Cmd+A}) to select the widgets and
|
\li Press \key {Ctrl+A} (or \key {Cmd+A}) to select the widgets and
|
||||||
click \uicontrol{Lay out Horizontally} (or press \uicontrol{Ctrl+H} on Linux or
|
click \uicontrol{Lay out Horizontally} (or press \uicontrol{Ctrl+H} on Linux or
|
||||||
Windows or \key {Ctrl+Shift+H} on OS X) to apply a horizontal
|
Windows or \key {Ctrl+Shift+H} on \macos) to apply a horizontal
|
||||||
layout (QHBoxLayout).
|
layout (QHBoxLayout).
|
||||||
|
|
||||||
\image qtcreator-texfinder-ui-horizontal-layout.png "Applying horizontal layout"
|
\image qtcreator-texfinder-ui-horizontal-layout.png "Applying horizontal layout"
|
||||||
|
@@ -59,8 +59,8 @@
|
|||||||
|
|
||||||
The integrated \QD fetches plugins from the \c {\bin\plugins\designer}
|
The integrated \QD fetches plugins from the \c {\bin\plugins\designer}
|
||||||
directory in the \QC installation directory on Windows and Linux. For
|
directory in the \QC installation directory on Windows and Linux. For
|
||||||
information about how to configure plugins on OS X, see
|
information about how to configure plugins on \macos, see
|
||||||
\l{Configuring Qt Designer Plugins on OS X}.
|
\l{Configuring Qt Designer Plugins on \macos}.
|
||||||
|
|
||||||
To check which plugins were loaded successfully and which failed, choose
|
To check which plugins were loaded successfully and which failed, choose
|
||||||
\uicontrol Tools > \uicontrol {Form Editor} >
|
\uicontrol Tools > \uicontrol {Form Editor} >
|
||||||
@@ -72,16 +72,16 @@
|
|||||||
of \c bin. To check which plugins were loaded successfully and which failed,
|
of \c bin. To check which plugins were loaded successfully and which failed,
|
||||||
choose \uicontrol Help > \uicontrol {About Plugins}.
|
choose \uicontrol Help > \uicontrol {About Plugins}.
|
||||||
|
|
||||||
\section2 Configuring Qt Designer Plugins on OS X
|
\section2 Configuring Qt Designer Plugins on \macos
|
||||||
|
|
||||||
On OS X, a GUI application must be built and run from a bundle. A bundle
|
On \macos, a GUI application must be built and run from a bundle. A bundle
|
||||||
is a directory structure that appears as a single entity when viewed in the
|
is a directory structure that appears as a single entity when viewed in the
|
||||||
Finder. A bundle for an application typcially contains the executable and
|
Finder. A bundle for an application typcially contains the executable and
|
||||||
all the resources it needs.
|
all the resources it needs.
|
||||||
|
|
||||||
\QC uses its own set of Qt Libraries located in the bundle, and therefore,
|
\QC uses its own set of Qt Libraries located in the bundle, and therefore,
|
||||||
you need to configure the \QD plugins that you want to use with \QC.
|
you need to configure the \QD plugins that you want to use with \QC.
|
||||||
Fore more information about how to deploy applications to OS X, see
|
For more information about how to deploy applications to \macos, see
|
||||||
\l{Qt for OS X - Deployment}.
|
\l{Qt for OS X - Deployment}.
|
||||||
|
|
||||||
The following example illustrates how to configure version 5.2.1 of the
|
The following example illustrates how to configure version 5.2.1 of the
|
||||||
|
@@ -25,7 +25,10 @@ QtcProduct {
|
|||||||
name: "Qt.test"
|
name: "Qt.test"
|
||||||
}
|
}
|
||||||
|
|
||||||
cpp.internalVersion: ""
|
Properties {
|
||||||
|
condition: qbs.targetOS.contains("unix")
|
||||||
|
cpp.internalVersion: ""
|
||||||
|
}
|
||||||
cpp.defines: base.concat([name.toUpperCase() + "_LIBRARY"])
|
cpp.defines: base.concat([name.toUpperCase() + "_LIBRARY"])
|
||||||
cpp.sonamePrefix: qbs.targetOS.contains("macos")
|
cpp.sonamePrefix: qbs.targetOS.contains("macos")
|
||||||
? "@rpath"
|
? "@rpath"
|
||||||
|
@@ -21,12 +21,6 @@ Product {
|
|||||||
|
|
||||||
cpp.cxxLanguageVersion: "c++11"
|
cpp.cxxLanguageVersion: "c++11"
|
||||||
cpp.defines: qtc.generalDefines
|
cpp.defines: qtc.generalDefines
|
||||||
cpp.linkerFlags: {
|
|
||||||
var flags = [];
|
|
||||||
if (qbs.buildVariant == "release" && (qbs.toolchain.contains("gcc") || qbs.toolchain.contains("mingw")))
|
|
||||||
flags.push("-Wl,-s");
|
|
||||||
return flags;
|
|
||||||
}
|
|
||||||
cpp.minimumOsxVersion: "10.7"
|
cpp.minimumOsxVersion: "10.7"
|
||||||
cpp.minimumWindowsVersion: qbs.architecture === "x86" ? "5.1" : "5.2"
|
cpp.minimumWindowsVersion: qbs.architecture === "x86" ? "5.1" : "5.2"
|
||||||
cpp.useCxxPrecompiledHeader: useNonGuiPchFile || useGuiPchFile
|
cpp.useCxxPrecompiledHeader: useNonGuiPchFile || useGuiPchFile
|
||||||
|
@@ -6,9 +6,6 @@ QTCREATOR_COMPAT_VERSION = 4.1.82
|
|||||||
VERSION = $$QTCREATOR_VERSION
|
VERSION = $$QTCREATOR_VERSION
|
||||||
BINARY_ARTIFACTS_BRANCH = master
|
BINARY_ARTIFACTS_BRANCH = master
|
||||||
|
|
||||||
# enable c++11
|
|
||||||
CONFIG += c++11
|
|
||||||
|
|
||||||
defineReplace(qtLibraryTargetName) {
|
defineReplace(qtLibraryTargetName) {
|
||||||
unset(LIBRARY_NAME)
|
unset(LIBRARY_NAME)
|
||||||
LIBRARY_NAME = $$1
|
LIBRARY_NAME = $$1
|
||||||
|
@@ -1301,8 +1301,12 @@ class DumperBase:
|
|||||||
return p > 100000 and (p & 0x7 == 0) and (p < 0x7fffffffffff)
|
return p > 100000 and (p & 0x7 == 0) and (p < 0x7fffffffffff)
|
||||||
|
|
||||||
def couldBeQObject():
|
def couldBeQObject():
|
||||||
(vtablePtr, dd) \
|
try:
|
||||||
= self.extractStruct('PP', objectPtr, 2 * ptrSize)
|
(vtablePtr, dd) \
|
||||||
|
= self.extractStruct('PP', objectPtr, 2 * ptrSize)
|
||||||
|
except:
|
||||||
|
self.bump("nostruct-1")
|
||||||
|
return False
|
||||||
if not canBePointer(vtablePtr):
|
if not canBePointer(vtablePtr):
|
||||||
self.bump("vtable")
|
self.bump("vtable")
|
||||||
return False
|
return False
|
||||||
@@ -1310,8 +1314,12 @@ class DumperBase:
|
|||||||
self.bump("d_d_ptr")
|
self.bump("d_d_ptr")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
(dvtablePtr, qptr, parentPtr, childrenDPtr, flags) \
|
try:
|
||||||
= self.extractStruct('PPPPI', dd, 4 * ptrSize + 4)
|
(dvtablePtr, qptr, parentPtr, childrenDPtr, flags) \
|
||||||
|
= self.extractStruct('PPPPI', dd, 4 * ptrSize + 4)
|
||||||
|
except:
|
||||||
|
self.bump("nostruct-2")
|
||||||
|
return False
|
||||||
#warn("STRUCT DD: %s %s" % (self.currentIName, x))
|
#warn("STRUCT DD: %s %s" % (self.currentIName, x))
|
||||||
if not canBePointer(dvtablePtr):
|
if not canBePointer(dvtablePtr):
|
||||||
self.bump("dvtable")
|
self.bump("dvtable")
|
||||||
@@ -1343,6 +1351,11 @@ class DumperBase:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def extractMetaObjectPtrFromAddress():
|
def extractMetaObjectPtrFromAddress():
|
||||||
|
return 0
|
||||||
|
# FIXME: Calling "works" but seems to impact memory contents(!)
|
||||||
|
# in relevant places. One symptom is that object name
|
||||||
|
# contents "vanishes" as the reported size of the string
|
||||||
|
# gets zeroed out(?).
|
||||||
# Try vtable, metaObject() is the first entry.
|
# Try vtable, metaObject() is the first entry.
|
||||||
vtablePtr = self.extractPointer(objectPtr)
|
vtablePtr = self.extractPointer(objectPtr)
|
||||||
metaObjectFunc = self.extractPointer(vtablePtr)
|
metaObjectFunc = self.extractPointer(vtablePtr)
|
||||||
@@ -1493,6 +1506,23 @@ class DumperBase:
|
|||||||
for i in range(size):
|
for i in range(size):
|
||||||
yield self.createValue(data + i * innerSize, innerType)
|
yield self.createValue(data + i * innerSize, innerType)
|
||||||
|
|
||||||
|
def putTypedPointer(self, name, addr, typeName):
|
||||||
|
""" Prints a typed pointer, expandable if the type can be resolved,
|
||||||
|
and without children otherwise """
|
||||||
|
with SubItem(self, name):
|
||||||
|
self.putAddress(addr)
|
||||||
|
self.putValue("@0x%x" % addr)
|
||||||
|
typeObj = self.lookupType(typeName)
|
||||||
|
if typeObj:
|
||||||
|
self.putType(typeObj)
|
||||||
|
self.putNumChild(1)
|
||||||
|
if self.isExpanded():
|
||||||
|
with Children(self):
|
||||||
|
self.putFields(self.createValue(addr, typeObj))
|
||||||
|
else:
|
||||||
|
self.putType(typeName)
|
||||||
|
self.putNumChild(0)
|
||||||
|
|
||||||
def putStructGuts(self, value):
|
def putStructGuts(self, value):
|
||||||
self.putEmptyValue()
|
self.putEmptyValue()
|
||||||
#metaObjectPtr = self.extractMetaObjectPtr(self.addressOf(value), value.type)
|
#metaObjectPtr = self.extractMetaObjectPtr(self.addressOf(value), value.type)
|
||||||
@@ -1600,11 +1630,18 @@ class DumperBase:
|
|||||||
|
|
||||||
extraData = 0
|
extraData = 0
|
||||||
if qobjectPtr:
|
if qobjectPtr:
|
||||||
isQt5 = self.qtVersion() >= 0x50000
|
#isQt5 = self.qtVersion() >= 0x50000
|
||||||
extraDataOffset = 5 * ptrSize + 8 if isQt5 else 6 * ptrSize + 8
|
#extraDataOffset = 5 * ptrSize + 8 if isQt5 else 6 * ptrSize + 8
|
||||||
# dd = value["d_ptr"]["d"] is just behind the vtable.
|
# (QObjectData/QObjectPrivate) dd = value["d_ptr"]["d"] is just behind the vtable.
|
||||||
dd = self.extractPointer(qobjectPtr + ptrSize)
|
dd = self.extractPointer(qobjectPtr + ptrSize)
|
||||||
extraData = self.extractPointer(dd + extraDataOffset)
|
if self.qtVersion() >= 0x50000:
|
||||||
|
(dvtablePtr, qptr, parentPtr, childrenDPtr, flags, postedEvents, dynMetaObjectPtr,
|
||||||
|
extraData, threadDataPtr, connectionListsPtr, sendersPtr, currentSenderPtr) \
|
||||||
|
= self.extractStruct('PPPPIIPPPPPP', dd, 10 * ptrSize + 8)
|
||||||
|
else:
|
||||||
|
(dvtablePtr, qptr, parentPtr, childrenDPtr, flags, postedEvents, dynMetaObjectPtr,
|
||||||
|
extraData, threadDataPtr, connectionListsPtr, sendersPtr, currentSenderPtr) \
|
||||||
|
= (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
|
|
||||||
if qobjectPtr:
|
if qobjectPtr:
|
||||||
qobjectType = self.lookupQtType("QObject")
|
qobjectType = self.lookupQtType("QObject")
|
||||||
@@ -1684,14 +1721,35 @@ class DumperBase:
|
|||||||
t = self.extractStruct('IIIII', dataPtr + 56 + i * 20, 20)
|
t = self.extractStruct('IIIII', dataPtr + 56 + i * 20, 20)
|
||||||
putt("method %d" % i, "%s %s %s %s %s" % t)
|
putt("method %d" % i, "%s %s %s %s %s" % t)
|
||||||
|
|
||||||
putt("[extraData]", "0x%x" % toInteger(extraData), "void *")
|
if isQObject:
|
||||||
|
with SubItem(self, "[extra]"):
|
||||||
|
self.put('sortgroup="1"')
|
||||||
|
self.putEmptyValue()
|
||||||
|
self.putNumChild(1)
|
||||||
|
if self.isExpanded():
|
||||||
|
with Children(self):
|
||||||
|
if extraData:
|
||||||
|
self.putTypedPointer("[extraData]", extraData,
|
||||||
|
self.qtNamespace() + "QObjectPrivate::ExtraData")
|
||||||
|
|
||||||
|
if connectionListsPtr:
|
||||||
|
self.putTypedPointer("[connectionLists]", connectionListsPtr,
|
||||||
|
self.qtNamespace() + "QObjectConnectionListVector")
|
||||||
|
|
||||||
|
with SubItem(self, "[metaObject]"):
|
||||||
|
self.putAddress(metaObjectPtr)
|
||||||
|
self.putNumChild(1)
|
||||||
|
if self.isExpanded():
|
||||||
|
with Children(self):
|
||||||
|
self.putQObjectGutsHelper(0, 0, -1, metaObjectPtr, "QMetaObject")
|
||||||
|
|
||||||
|
|
||||||
if isQMetaObject or isQObject:
|
if isQMetaObject or isQObject:
|
||||||
with SubItem(self, "[properties]"):
|
with SubItem(self, "[properties]"):
|
||||||
self.put('sortgroup="5"')
|
self.put('sortgroup="5"')
|
||||||
self.putItemCount(propertyCount)
|
|
||||||
if self.isExpanded():
|
if self.isExpanded():
|
||||||
usesVector = self.qtVersion() >= 0x50700
|
usesVector = self.qtVersion() >= 0x50700
|
||||||
|
dynamicPropertyCount = 0
|
||||||
with Children(self):
|
with Children(self):
|
||||||
# Static properties.
|
# Static properties.
|
||||||
for i in range(propertyCount):
|
for i in range(propertyCount):
|
||||||
@@ -1712,11 +1770,12 @@ class DumperBase:
|
|||||||
else:
|
else:
|
||||||
values = self.listChildrenGenerator(extraData + 2 * ptrSize, variantType)
|
values = self.listChildrenGenerator(extraData + 2 * ptrSize, variantType)
|
||||||
for (k, v) in zip(names, values):
|
for (k, v) in zip(names, values):
|
||||||
with SubItem(self, propertyCount):
|
with SubItem(self, propertyCount + dynamicPropertyCount):
|
||||||
self.put('key="%s",' % self.encodeByteArray(k))
|
self.put('key="%s",' % self.encodeByteArray(k))
|
||||||
self.put('keyencoded="latin1",')
|
self.put('keyencoded="latin1",')
|
||||||
self.putItem(v)
|
self.putItem(v)
|
||||||
propertyCount += 1
|
dynamicPropertyCount += 1
|
||||||
|
self.putItemCount(propertyCount + dynamicPropertyCount)
|
||||||
else:
|
else:
|
||||||
# We need a handle to [x] for the user to expand the item
|
# We need a handle to [x] for the user to expand the item
|
||||||
# before we know whether there are actual children. Counting
|
# before we know whether there are actual children. Counting
|
||||||
@@ -1768,21 +1827,18 @@ class DumperBase:
|
|||||||
putt("[globalindex]", str(globalOffset + i))
|
putt("[globalindex]", str(globalOffset + i))
|
||||||
|
|
||||||
if isQObject:
|
if isQObject:
|
||||||
with SubItem(self, "[metaObject]"):
|
with SubItem(self, "[d]"):
|
||||||
self.putAddress(metaObjectPtr)
|
|
||||||
self.putNumChild(1)
|
|
||||||
if self.isExpanded():
|
|
||||||
with Children(self):
|
|
||||||
self.putQObjectGutsHelper(0, 0, -1, metaObjectPtr, "QMetaObject")
|
|
||||||
|
|
||||||
if isQObject:
|
|
||||||
with SubItem(self, "d"):
|
|
||||||
self.put('sortgroup="15"')
|
self.put('sortgroup="15"')
|
||||||
try:
|
try:
|
||||||
self.putItem(qobject["d_ptr"]["d"])
|
qobjectPrivateType = self.lookupQtType("QObjectPrivate")
|
||||||
|
self.putItem(qobject["d_ptr"]["d"].dereference().cast(qobjectPrivateType))
|
||||||
except:
|
except:
|
||||||
self.putNumChild(0)
|
try:
|
||||||
self.putSpecialValue("notaccessible")
|
self.putItem(qobject["d_ptr"]["d"])
|
||||||
|
except:
|
||||||
|
self.putNumChild(0)
|
||||||
|
self.putType(self.qtNamespace() + "QObjectData *")
|
||||||
|
self.putSpecialValue("notaccessible")
|
||||||
|
|
||||||
if isQMetaObject:
|
if isQMetaObject:
|
||||||
with SubItem(self, "[superdata]"):
|
with SubItem(self, "[superdata]"):
|
||||||
|
@@ -2,12 +2,12 @@
|
|||||||
<style-scheme version="1.0" name="Qt Creator Dark">
|
<style-scheme version="1.0" name="Qt Creator Dark">
|
||||||
<style name="Text" foreground="#d6cf9a" background="#2e2f30"/>
|
<style name="Text" foreground="#d6cf9a" background="#2e2f30"/>
|
||||||
<style name="Link" foreground="#d6c540"/>
|
<style name="Link" foreground="#d6c540"/>
|
||||||
<style name="Selection" background="#1d545c"/>
|
<style name="Selection" foreground="#bec0c2" background="#1d545c"/>
|
||||||
<style name="LineNumber" foreground="#bec0c2" background="#404244"/>
|
<style name="LineNumber" foreground="#bec0c2" background="#404244"/>
|
||||||
<style name="SearchResult" background="#8a7f2c"/>
|
<style name="SearchResult" background="#8a7f2c"/>
|
||||||
<style name="SearchScope" background="#8a602c"/>
|
<style name="SearchScope" background="#8a602c"/>
|
||||||
<style name="Parentheses" foreground="#bec0c2" background="#1d545c"/>
|
<style name="Parentheses" foreground="#bec0c2" background="#1d545c"/>
|
||||||
<style name="ParenthesesMismatch" background="#d64564"/>
|
<style name="ParenthesesMismatch" background="#ff6aad"/>
|
||||||
<style name="AutoComplete" foreground="#2c408a" background="#9aa7d6"/>
|
<style name="AutoComplete" foreground="#2c408a" background="#9aa7d6"/>
|
||||||
<style name="CurrentLine" background="#373737"/>
|
<style name="CurrentLine" background="#373737"/>
|
||||||
<style name="CurrentLineNumber" foreground="#d6c540" bold="true"/>
|
<style name="CurrentLineNumber" foreground="#d6c540" bold="true"/>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<style name="Keyword" foreground="#45c6d6" italic="true"/>
|
<style name="Keyword" foreground="#45c6d6" italic="true"/>
|
||||||
<style name="PrimitiveType" foreground="#d69aa7"/>
|
<style name="PrimitiveType" foreground="#d69aa7"/>
|
||||||
<style name="Operator" foreground="#d6bb9a"/>
|
<style name="Operator" foreground="#d6bb9a"/>
|
||||||
<style name="Preprocessor" foreground="#d64564"/>
|
<style name="Preprocessor" foreground="#ff6aad"/>
|
||||||
<style name="Label" foreground="#d6c540"/>
|
<style name="Label" foreground="#d6c540"/>
|
||||||
<style name="Comment" foreground="#a8abb0" italic="true"/>
|
<style name="Comment" foreground="#a8abb0" italic="true"/>
|
||||||
<style name="Doxygen.Comment" foreground="#65676a" bold="true" italic="true"/>
|
<style name="Doxygen.Comment" foreground="#65676a" bold="true" italic="true"/>
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
<style name="JsImportVar" foreground="#4564d6" italic="true"/>
|
<style name="JsImportVar" foreground="#4564d6" italic="true"/>
|
||||||
<style name="JsGlobalVar" foreground="#4564d6" italic="true"/>
|
<style name="JsGlobalVar" foreground="#4564d6" italic="true"/>
|
||||||
<style name="QmlStateName" foreground="#45c6d6" italic="true"/>
|
<style name="QmlStateName" foreground="#45c6d6" italic="true"/>
|
||||||
<style name="Binding" foreground="#d64564"/>
|
<style name="Binding" foreground="#ff6aad"/>
|
||||||
<style name="DisabledCode" foreground="#969696" background="#474747"/>
|
<style name="DisabledCode" foreground="#969696" background="#474747"/>
|
||||||
<style name="AddedLine" foreground="#45c6d6"/>
|
<style name="AddedLine" foreground="#45c6d6"/>
|
||||||
<style name="RemovedLine" foreground="#d65645"/>
|
<style name="RemovedLine" foreground="#d65645"/>
|
||||||
|
@@ -28,7 +28,9 @@ bool %{CN}::setHeaderData(int section, Qt::Orientation orientation, const QVaria
|
|||||||
|
|
||||||
int %{CN}::rowCount(const QModelIndex &parent) const
|
int %{CN}::rowCount(const QModelIndex &parent) const
|
||||||
{
|
{
|
||||||
if (!parent.isValid())
|
// For list models only the root node (an invalid parent) should return the list's size. For all
|
||||||
|
// other (valid) parents, rowCount() should return 0 so that it does not become a tree model.
|
||||||
|
if (parent.isValid())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// FIXME: Implement me!
|
// FIXME: Implement me!
|
||||||
|
@@ -97,7 +97,7 @@ MenuBarItemTextColorDisabled=textDisabled
|
|||||||
MenuBarItemTextColorNormal=text
|
MenuBarItemTextColorNormal=text
|
||||||
MenuItemTextColorDisabled=textDisabled
|
MenuItemTextColorDisabled=textDisabled
|
||||||
MenuItemTextColorNormal=text
|
MenuItemTextColorNormal=text
|
||||||
MiniProjectTargetSelectorBackgroundColor=shadowBackground
|
MiniProjectTargetSelectorBackgroundColor=normalBackground
|
||||||
MiniProjectTargetSelectorBorderColor=shadowBackground
|
MiniProjectTargetSelectorBorderColor=shadowBackground
|
||||||
MiniProjectTargetSelectorSummaryBackgroundColor=shadowBackground
|
MiniProjectTargetSelectorSummaryBackgroundColor=shadowBackground
|
||||||
MiniProjectTargetSelectorTextColor=text
|
MiniProjectTargetSelectorTextColor=text
|
||||||
@@ -200,6 +200,7 @@ PaletteWindowTextDisabled=textDisabled
|
|||||||
PaletteBaseDisabled=backgroundColorDisabled
|
PaletteBaseDisabled=backgroundColorDisabled
|
||||||
PaletteTextDisabled=textDisabled
|
PaletteTextDisabled=textDisabled
|
||||||
|
|
||||||
|
QmlDesigner_BackgroundColor=ff3c3e40
|
||||||
QmlDesigner_HighlightColor=ff46a2da
|
QmlDesigner_HighlightColor=ff46a2da
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
|
@@ -171,6 +171,7 @@ ProjectExplorer_TaskWarn_TextMarkColor=ffffa500
|
|||||||
ClangCodeModel_Error_TextMarkColor=ffff882f
|
ClangCodeModel_Error_TextMarkColor=ffff882f
|
||||||
ClangCodeModel_Warning_TextMarkColor=ffc6c132
|
ClangCodeModel_Warning_TextMarkColor=ffc6c132
|
||||||
|
|
||||||
|
QmlDesigner_BackgroundColor=ff4c4e50
|
||||||
QmlDesigner_HighlightColor=ff46a2da
|
QmlDesigner_HighlightColor=ff46a2da
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
|
@@ -185,7 +185,8 @@ ProjectExplorer_TaskWarn_TextMarkColor=ffffff40
|
|||||||
ClangCodeModel_Error_TextMarkColor=ffff882f
|
ClangCodeModel_Error_TextMarkColor=ffff882f
|
||||||
ClangCodeModel_Warning_TextMarkColor=ffceff40
|
ClangCodeModel_Warning_TextMarkColor=ffceff40
|
||||||
|
|
||||||
QmlDesigner_HighlightColor=ff46a2da
|
QmlDesigner_BackgroundColor=ff4c4e50
|
||||||
|
QmlDesigner_HighlightColor=ff3f91c4
|
||||||
|
|
||||||
PaletteWindow=normalBackground
|
PaletteWindow=normalBackground
|
||||||
PaletteWindowText=text
|
PaletteWindowText=text
|
||||||
|
@@ -39,7 +39,7 @@ DockWidgetResizeHandleColor=splitter
|
|||||||
DoubleTabWidget1stSeparatorColor=ffff0000
|
DoubleTabWidget1stSeparatorColor=ffff0000
|
||||||
DoubleTabWidget1stTabActiveTextColor=ff000000
|
DoubleTabWidget1stTabActiveTextColor=ff000000
|
||||||
DoubleTabWidget1stTabBackgroundColor=ffff0000
|
DoubleTabWidget1stTabBackgroundColor=ffff0000
|
||||||
DoubleTabWidget1stTabInactiveTextColor=ffffffff
|
DoubleTabWidget1stTabInactiveTextColor=ff555555
|
||||||
DoubleTabWidget2ndSeparatorColor=ffff0000
|
DoubleTabWidget2ndSeparatorColor=ffff0000
|
||||||
DoubleTabWidget2ndTabActiveTextColor=ffffffff
|
DoubleTabWidget2ndTabActiveTextColor=ffffffff
|
||||||
DoubleTabWidget2ndTabBackgroundColor=ffff0000
|
DoubleTabWidget2ndTabBackgroundColor=ffff0000
|
||||||
@@ -182,6 +182,7 @@ ProjectExplorer_TaskWarn_TextMarkColor=ffffa500
|
|||||||
ClangCodeModel_Error_TextMarkColor=ffff882f
|
ClangCodeModel_Error_TextMarkColor=ffff882f
|
||||||
ClangCodeModel_Warning_TextMarkColor=ffc6c132
|
ClangCodeModel_Warning_TextMarkColor=ffc6c132
|
||||||
|
|
||||||
|
QmlDesigner_BackgroundColor=fff8f8f8
|
||||||
QmlDesigner_HighlightColor=ff46a2da
|
QmlDesigner_HighlightColor=ff46a2da
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
|
@@ -181,6 +181,7 @@ ProjectExplorer_TaskWarn_TextMarkColor=ffffa500
|
|||||||
ClangCodeModel_Error_TextMarkColor=ffff882f
|
ClangCodeModel_Error_TextMarkColor=ffff882f
|
||||||
ClangCodeModel_Warning_TextMarkColor=ffc6c132
|
ClangCodeModel_Warning_TextMarkColor=ffc6c132
|
||||||
|
|
||||||
|
QmlDesigner_BackgroundColor=ff4c4e50
|
||||||
QmlDesigner_HighlightColor=ff46a2da
|
QmlDesigner_HighlightColor=ff46a2da
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
|
@@ -51,6 +51,7 @@
|
|||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#ifdef WITH_TESTS
|
#ifdef WITH_TESTS
|
||||||
|
#include <utils/hostosinfo.h>
|
||||||
#include <QTest>
|
#include <QTest>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1025,7 +1026,8 @@ static int executeTestPlan(const TestPlan &testPlan)
|
|||||||
<< QLatin1String("-maxwarnings") << QLatin1String("0"); // unlimit output
|
<< QLatin1String("-maxwarnings") << QLatin1String("0"); // unlimit output
|
||||||
qExecArguments << functions;
|
qExecArguments << functions;
|
||||||
// avoid being stuck in QTBUG-24925
|
// avoid being stuck in QTBUG-24925
|
||||||
qExecArguments << "-nocrashhandler";
|
if (!Utils::HostOsInfo::isWindowsHost())
|
||||||
|
qExecArguments << "-nocrashhandler";
|
||||||
failedTests += QTest::qExec(testObject, qExecArguments);
|
failedTests += QTest::qExec(testObject, qExecArguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -38,6 +38,7 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
@@ -282,6 +282,7 @@ public:
|
|||||||
ClangCodeModel_Warning_TextMarkColor,
|
ClangCodeModel_Warning_TextMarkColor,
|
||||||
|
|
||||||
/* QmlDesigner */
|
/* QmlDesigner */
|
||||||
|
QmlDesigner_BackgroundColor,
|
||||||
QmlDesigner_HighlightColor
|
QmlDesigner_HighlightColor
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -258,23 +258,6 @@ static int extractPid(const QString &exeName, const QByteArray &psOutput)
|
|||||||
return extractPidFromChunk(psOutput, from);
|
return extractPidFromChunk(psOutput, from);
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray AndroidRunner::runPs()
|
|
||||||
{
|
|
||||||
if (QThread::currentThread() != thread()) {
|
|
||||||
QByteArray ret;
|
|
||||||
QMetaObject::invokeMethod(this, "runPs", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QByteArray, ret));
|
|
||||||
return ret;
|
|
||||||
} else {
|
|
||||||
QByteArray psLine("ps");
|
|
||||||
if (m_isBusyBox)
|
|
||||||
psLine += " -w";
|
|
||||||
psLine += '\n';
|
|
||||||
m_psProc.write(psLine);
|
|
||||||
m_psProc.waitForBytesWritten(psLine.size());
|
|
||||||
return m_psProc.readAllStandardOutput();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AndroidRunner::launchAVDProcesses()
|
void AndroidRunner::launchAVDProcesses()
|
||||||
{
|
{
|
||||||
// Its assumed that the device or avd serial returned by selector() is online.
|
// Its assumed that the device or avd serial returned by selector() is online.
|
||||||
@@ -284,8 +267,13 @@ void AndroidRunner::launchAVDProcesses()
|
|||||||
|
|
||||||
void AndroidRunner::checkPID()
|
void AndroidRunner::checkPID()
|
||||||
{
|
{
|
||||||
QByteArray psOut = runPs();
|
// Don't write to m_psProc from a different thread
|
||||||
m_processPID = extractPid(m_androidRunnable.packageName, psOut);
|
QTC_ASSERT(QThread::currentThread() == thread(), return);
|
||||||
|
|
||||||
|
QByteArray psLine(m_isBusyBox ? "ps -w\n" : "ps\n");
|
||||||
|
m_psProc.write(psLine);
|
||||||
|
m_psProc.waitForBytesWritten(psLine.size());
|
||||||
|
m_processPID = extractPid(m_androidRunnable.packageName, m_psProc.readAllStandardOutput());
|
||||||
|
|
||||||
if (m_processPID == -1) {
|
if (m_processPID == -1) {
|
||||||
if (m_wasStarted) {
|
if (m_wasStarted) {
|
||||||
@@ -320,11 +308,17 @@ void AndroidRunner::checkPID()
|
|||||||
|
|
||||||
void AndroidRunner::forceStop()
|
void AndroidRunner::forceStop()
|
||||||
{
|
{
|
||||||
|
// Don't run Utils::SynchronousProcess on the GUI thread
|
||||||
|
QTC_ASSERT(QThread::currentThread() != thread(), return);
|
||||||
|
|
||||||
runAdb(selector() << _("shell") << _("am") << _("force-stop") << m_androidRunnable.packageName,
|
runAdb(selector() << _("shell") << _("am") << _("force-stop") << m_androidRunnable.packageName,
|
||||||
nullptr, 30);
|
nullptr, 30);
|
||||||
|
|
||||||
// try killing it via kill -9
|
// try killing it via kill -9
|
||||||
const QByteArray out = runPs();
|
const QByteArray out = Utils::SynchronousProcess()
|
||||||
|
.runBlocking(m_adb, selector() << _("shell") << _(m_isBusyBox ? "ps -w" : "ps"))
|
||||||
|
.allRawOutput();
|
||||||
|
|
||||||
int from = 0;
|
int from = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
const int to = out.indexOf('\n', from);
|
const int to = out.indexOf('\n', from);
|
||||||
@@ -346,7 +340,7 @@ void AndroidRunner::start()
|
|||||||
launchAVD();
|
launchAVD();
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils::runAsync(&AndroidRunner::asyncStart, this);
|
Utils::runAsync(&AndroidRunner::asyncStart, this).waitForFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidRunner::asyncStart()
|
void AndroidRunner::asyncStart()
|
||||||
@@ -588,8 +582,6 @@ void AndroidRunner::handleRemoteDebuggerRunning()
|
|||||||
|
|
||||||
void AndroidRunner::stop()
|
void AndroidRunner::stop()
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&m_mutex);
|
|
||||||
|
|
||||||
if (m_avdFutureInterface.isRunning()) {
|
if (m_avdFutureInterface.isRunning()) {
|
||||||
m_avdFutureInterface.cancel();
|
m_avdFutureInterface.cancel();
|
||||||
m_avdFutureInterface.waitForFinished();
|
m_avdFutureInterface.waitForFinished();
|
||||||
@@ -597,16 +589,21 @@ void AndroidRunner::stop()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_checkPIDTimer.stop();
|
m_checkPIDTimer.stop();
|
||||||
|
m_adbLogcatProcess.kill();
|
||||||
|
m_psProc.kill();
|
||||||
|
Utils::runAsync(&AndroidRunner::asyncStop, this).waitForFinished();
|
||||||
|
m_adbLogcatProcess.waitForFinished();
|
||||||
|
m_psProc.waitForFinished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidRunner::asyncStop()
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
m_tries = 0;
|
m_tries = 0;
|
||||||
if (m_processPID != -1) {
|
if (m_processPID != -1) {
|
||||||
forceStop();
|
forceStop();
|
||||||
emit remoteProcessFinished(QLatin1String("\n\n") + tr("\"%1\" terminated.").arg(m_androidRunnable.packageName));
|
emit remoteProcessFinished(QLatin1String("\n\n") + tr("\"%1\" terminated.").arg(m_androidRunnable.packageName));
|
||||||
}
|
}
|
||||||
//QObject::disconnect(&m_adbLogcatProcess, 0, this, 0);
|
|
||||||
m_adbLogcatProcess.kill();
|
|
||||||
m_adbLogcatProcess.waitForFinished();
|
|
||||||
m_psProc.kill();
|
|
||||||
m_psProc.waitForFinished();
|
|
||||||
foreach (const QStringList &entry, m_androidRunnable.afterFinishADBCommands)
|
foreach (const QStringList &entry, m_androidRunnable.afterFinishADBCommands)
|
||||||
runAdb(selector() << entry);
|
runAdb(selector() << entry);
|
||||||
}
|
}
|
||||||
|
@@ -80,7 +80,7 @@ private:
|
|||||||
void logcatReadStandardError();
|
void logcatReadStandardError();
|
||||||
void logcatReadStandardOutput();
|
void logcatReadStandardOutput();
|
||||||
void asyncStart();
|
void asyncStart();
|
||||||
Q_INVOKABLE QByteArray runPs();
|
void asyncStop();
|
||||||
Q_INVOKABLE void launchAVDProcesses();
|
Q_INVOKABLE void launchAVDProcesses();
|
||||||
void adbKill(qint64 pid);
|
void adbKill(qint64 pid);
|
||||||
QStringList selector() const { return m_selector; }
|
QStringList selector() const { return m_selector; }
|
||||||
|
@@ -318,8 +318,13 @@ void TestCodeParser::scanForTests(const QStringList &fileList)
|
|||||||
QStringList list;
|
QStringList list;
|
||||||
if (isFullParse) {
|
if (isFullParse) {
|
||||||
list = ProjectExplorer::SessionManager::startupProject()->files(ProjectExplorer::Project::SourceFiles);
|
list = ProjectExplorer::SessionManager::startupProject()->files(ProjectExplorer::Project::SourceFiles);
|
||||||
if (list.isEmpty())
|
if (list.isEmpty()) {
|
||||||
|
// at least project file should be there, but might happen if parsing current project
|
||||||
|
// takes too long, especially when opening sessions holding multiple projects
|
||||||
|
qCDebug(LOG) << "File list empty (FullParse) - trying again in a sec";
|
||||||
|
emitUpdateTestTree();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
qCDebug(LOG) << "setting state to FullParse (scanForTests)";
|
qCDebug(LOG) << "setting state to FullParse (scanForTests)";
|
||||||
m_parserState = FullParse;
|
m_parserState = FullParse;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -288,6 +288,19 @@
|
|||||||
</slots>
|
</slots>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>toolTree</tabstop>
|
||||||
|
<tabstop>addButton</tabstop>
|
||||||
|
<tabstop>removeButton</tabstop>
|
||||||
|
<tabstop>revertButton</tabstop>
|
||||||
|
<tabstop>description</tabstop>
|
||||||
|
<tabstop>arguments</tabstop>
|
||||||
|
<tabstop>outputBehavior</tabstop>
|
||||||
|
<tabstop>errorOutputBehavior</tabstop>
|
||||||
|
<tabstop>environmentButton</tabstop>
|
||||||
|
<tabstop>modifiesDocumentCheckbox</tabstop>
|
||||||
|
<tabstop>inputText</tabstop>
|
||||||
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
@@ -128,25 +128,42 @@ IFindSupport::Result ItemViewFind::findStep(const QString &txt, FindFlags findFl
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
QFrame *ItemViewFind::createSearchableWrapper(QAbstractItemView *treeView, ColorOption lightColored, FetchOption option)
|
static QFrame *createHelper(QAbstractItemView *treeView,
|
||||||
|
ItemViewFind::ColorOption colorOption,
|
||||||
|
ItemViewFind *finder)
|
||||||
{
|
{
|
||||||
QFrame *widget = new QFrame;
|
auto widget = new QFrame;
|
||||||
widget->setFrameStyle(QFrame::NoFrame);
|
widget->setFrameStyle(QFrame::NoFrame);
|
||||||
QVBoxLayout *vbox = new QVBoxLayout(widget);
|
|
||||||
|
auto placeHolder = new FindToolBarPlaceHolder(widget);
|
||||||
|
placeHolder->setLightColored(colorOption);
|
||||||
|
|
||||||
|
auto vbox = new QVBoxLayout(widget);
|
||||||
vbox->setMargin(0);
|
vbox->setMargin(0);
|
||||||
vbox->setSpacing(0);
|
vbox->setSpacing(0);
|
||||||
vbox->addWidget(treeView);
|
vbox->addWidget(treeView);
|
||||||
auto placeHolder = new FindToolBarPlaceHolder(widget);
|
|
||||||
placeHolder->setLightColored(lightColored);
|
|
||||||
vbox->addWidget(placeHolder);
|
vbox->addWidget(placeHolder);
|
||||||
|
|
||||||
Aggregation::Aggregate *agg = new Aggregation::Aggregate;
|
auto agg = new Aggregation::Aggregate;
|
||||||
agg->add(treeView);
|
agg->add(treeView);
|
||||||
agg->add(new ItemViewFind(treeView, Qt::DisplayRole, option));
|
agg->add(finder);
|
||||||
|
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QFrame *ItemViewFind::createSearchableWrapper(QAbstractItemView *treeView,
|
||||||
|
ColorOption colorOption,
|
||||||
|
FetchOption option)
|
||||||
|
{
|
||||||
|
return createHelper(treeView, colorOption, new ItemViewFind(treeView, Qt::DisplayRole, option));
|
||||||
|
}
|
||||||
|
|
||||||
|
QFrame *ItemViewFind::createSearchableWrapper(ItemViewFind *finder,
|
||||||
|
ItemViewFind::ColorOption colorOption)
|
||||||
|
{
|
||||||
|
return createHelper(finder->d->m_view, colorOption, finder);
|
||||||
|
}
|
||||||
|
|
||||||
IFindSupport::Result ItemViewFind::find(const QString &searchTxt,
|
IFindSupport::Result ItemViewFind::find(const QString &searchTxt,
|
||||||
FindFlags findFlags,
|
FindFlags findFlags,
|
||||||
bool startFromCurrentIndex,
|
bool startFromCurrentIndex,
|
||||||
|
@@ -65,8 +65,10 @@ public:
|
|||||||
Result findIncremental(const QString &txt, FindFlags findFlags);
|
Result findIncremental(const QString &txt, FindFlags findFlags);
|
||||||
Result findStep(const QString &txt, FindFlags findFlags);
|
Result findStep(const QString &txt, FindFlags findFlags);
|
||||||
|
|
||||||
static QFrame *createSearchableWrapper(QAbstractItemView *treeView, ColorOption lightColored = DarkColored,
|
static QFrame *createSearchableWrapper(QAbstractItemView *treeView, ColorOption colorOption = DarkColored,
|
||||||
FetchOption option = DoNotFetchMoreWhileSearching);
|
FetchOption option = DoNotFetchMoreWhileSearching);
|
||||||
|
static QFrame *createSearchableWrapper(ItemViewFind *finder, ColorOption colorOption = DarkColored);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Result find(const QString &txt, FindFlags findFlags,
|
Result find(const QString &txt, FindFlags findFlags,
|
||||||
bool startFromCurrentIndex, bool *wrapped);
|
bool startFromCurrentIndex, bool *wrapped);
|
||||||
|
@@ -155,6 +155,12 @@
|
|||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>colorButton</tabstop>
|
||||||
|
<tabstop>resetColorButton</tabstop>
|
||||||
|
<tabstop>languageBox</tabstop>
|
||||||
|
<tabstop>resetWarningsButton</tabstop>
|
||||||
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
@@ -238,6 +238,15 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>valueLineEdit</tabstop>
|
||||||
|
<tabstop>typeSelector</tabstop>
|
||||||
|
<tabstop>maskLineEdit</tabstop>
|
||||||
|
<tabstop>useRecommendedGroupBox</tabstop>
|
||||||
|
<tabstop>startRangeSpinBox</tabstop>
|
||||||
|
<tabstop>endRangeSpinBox</tabstop>
|
||||||
|
<tabstop>prioritySpinBox</tabstop>
|
||||||
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
|
@@ -169,6 +169,16 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>filterLineEdit</tabstop>
|
||||||
|
<tabstop>mimeTypesTreeView</tabstop>
|
||||||
|
<tabstop>resetButton</tabstop>
|
||||||
|
<tabstop>patternsLineEdit</tabstop>
|
||||||
|
<tabstop>magicHeadersTreeWidget</tabstop>
|
||||||
|
<tabstop>addMagicButton</tabstop>
|
||||||
|
<tabstop>editMagicButton</tabstop>
|
||||||
|
<tabstop>removeMagicButton</tabstop>
|
||||||
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
@@ -374,6 +374,21 @@
|
|||||||
</slots>
|
</slots>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>terminalComboBox</tabstop>
|
||||||
|
<tabstop>resetTerminalButton</tabstop>
|
||||||
|
<tabstop>externalFileBrowserEdit</tabstop>
|
||||||
|
<tabstop>resetFileBrowserButton</tabstop>
|
||||||
|
<tabstop>helpExternalFileBrowserButton</tabstop>
|
||||||
|
<tabstop>fileSystemCaseSensitivityChooser</tabstop>
|
||||||
|
<tabstop>reloadBehavior</tabstop>
|
||||||
|
<tabstop>autoSaveCheckBox</tabstop>
|
||||||
|
<tabstop>autoSaveInterval</tabstop>
|
||||||
|
<tabstop>autoSuspendCheckBox</tabstop>
|
||||||
|
<tabstop>autoSuspendMinDocumentCount</tabstop>
|
||||||
|
<tabstop>warnBeforeOpeningBigFiles</tabstop>
|
||||||
|
<tabstop>bigFilesLimitSpinBox</tabstop>
|
||||||
|
</tabstops>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="core.qrc"/>
|
<include location="core.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -371,7 +371,7 @@ void CppEditorPlugin::test_autoBackspace_data()
|
|||||||
|
|
||||||
QTest::newRow((QLatin1String("Inside ") + charGroupTestName(c)).toLatin1().data())
|
QTest::newRow((QLatin1String("Inside ") + charGroupTestName(c)).toLatin1().data())
|
||||||
<< fileContent(InBetween, c)
|
<< fileContent(InBetween, c)
|
||||||
<< QString("([").contains(c);
|
<< QString("(['\"").contains(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,9 +18,6 @@ HEADERS += \
|
|||||||
cpphighlighter.h \
|
cpphighlighter.h \
|
||||||
cpphoverhandler.h \
|
cpphoverhandler.h \
|
||||||
cppincludehierarchy.h \
|
cppincludehierarchy.h \
|
||||||
cppincludehierarchyitem.h \
|
|
||||||
cppincludehierarchymodel.h \
|
|
||||||
cppincludehierarchytreeview.h \
|
|
||||||
cppinsertvirtualmethods.h \
|
cppinsertvirtualmethods.h \
|
||||||
cpplocalrenaming.h \
|
cpplocalrenaming.h \
|
||||||
cppoutline.h \
|
cppoutline.h \
|
||||||
@@ -48,9 +45,6 @@ SOURCES += \
|
|||||||
cpphighlighter.cpp \
|
cpphighlighter.cpp \
|
||||||
cpphoverhandler.cpp \
|
cpphoverhandler.cpp \
|
||||||
cppincludehierarchy.cpp \
|
cppincludehierarchy.cpp \
|
||||||
cppincludehierarchyitem.cpp \
|
|
||||||
cppincludehierarchymodel.cpp \
|
|
||||||
cppincludehierarchytreeview.cpp \
|
|
||||||
cppinsertvirtualmethods.cpp \
|
cppinsertvirtualmethods.cpp \
|
||||||
cpplocalrenaming.cpp \
|
cpplocalrenaming.cpp \
|
||||||
cppoutline.cpp \
|
cppoutline.cpp \
|
||||||
|
@@ -37,9 +37,6 @@ QtcPlugin {
|
|||||||
"cpphighlighter.cpp", "cpphighlighter.h",
|
"cpphighlighter.cpp", "cpphighlighter.h",
|
||||||
"cpphoverhandler.cpp", "cpphoverhandler.h",
|
"cpphoverhandler.cpp", "cpphoverhandler.h",
|
||||||
"cppincludehierarchy.cpp", "cppincludehierarchy.h",
|
"cppincludehierarchy.cpp", "cppincludehierarchy.h",
|
||||||
"cppincludehierarchyitem.cpp", "cppincludehierarchyitem.h",
|
|
||||||
"cppincludehierarchymodel.cpp", "cppincludehierarchymodel.h",
|
|
||||||
"cppincludehierarchytreeview.cpp", "cppincludehierarchytreeview.h",
|
|
||||||
"cppinsertvirtualmethods.cpp",
|
"cppinsertvirtualmethods.cpp",
|
||||||
"cppinsertvirtualmethods.h",
|
"cppinsertvirtualmethods.h",
|
||||||
"cpplocalrenaming.cpp", "cpplocalrenaming.h",
|
"cpplocalrenaming.cpp", "cpplocalrenaming.h",
|
||||||
|
@@ -29,50 +29,341 @@
|
|||||||
#include "cppeditorconstants.h"
|
#include "cppeditorconstants.h"
|
||||||
#include "cppeditorplugin.h"
|
#include "cppeditorplugin.h"
|
||||||
#include "cppelementevaluator.h"
|
#include "cppelementevaluator.h"
|
||||||
#include "cppincludehierarchymodel.h"
|
|
||||||
#include "cppincludehierarchytreeview.h"
|
|
||||||
|
|
||||||
#include <texteditor/textdocument.h>
|
|
||||||
|
|
||||||
#include <coreplugin/editormanager/editormanager.h>
|
#include <coreplugin/editormanager/editormanager.h>
|
||||||
|
#include <coreplugin/fileiconprovider.h>
|
||||||
#include <coreplugin/find/itemviewfind.h>
|
#include <coreplugin/find/itemviewfind.h>
|
||||||
|
|
||||||
|
#include <cpptools/baseeditordocumentprocessor.h>
|
||||||
|
#include <cpptools/cppmodelmanager.h>
|
||||||
|
#include <cpptools/cpptoolsbridge.h>
|
||||||
|
#include <cpptools/editordocumenthandle.h>
|
||||||
|
|
||||||
#include <cplusplus/CppDocument.h>
|
#include <cplusplus/CppDocument.h>
|
||||||
|
|
||||||
#include <utils/annotateditemdelegate.h>
|
#include <utils/annotateditemdelegate.h>
|
||||||
|
#include <utils/dropsupport.h>
|
||||||
#include <utils/fileutils.h>
|
#include <utils/fileutils.h>
|
||||||
|
#include <utils/navigationtreeview.h>
|
||||||
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QCoreApplication>
|
||||||
|
#include <QKeyEvent>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QLatin1String>
|
#include <QStackedWidget>
|
||||||
#include <QModelIndex>
|
|
||||||
#include <QStandardItem>
|
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
using namespace Core;
|
||||||
|
using namespace CPlusPlus;
|
||||||
|
using namespace CppTools;
|
||||||
using namespace TextEditor;
|
using namespace TextEditor;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
namespace CppEditor {
|
namespace CppEditor {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
// CppIncludeHierarchyWidget
|
enum {
|
||||||
CppIncludeHierarchyWidget::CppIncludeHierarchyWidget() :
|
AnnotationRole = Qt::UserRole + 1,
|
||||||
QWidget(0),
|
LinkRole
|
||||||
m_treeView(0),
|
};
|
||||||
m_model(0),
|
|
||||||
m_delegate(0),
|
static Snapshot globalSnapshot()
|
||||||
m_includeHierarchyInfoLabel(0),
|
|
||||||
m_editor(0)
|
|
||||||
{
|
{
|
||||||
|
return CppModelManager::instance()->snapshot();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct FileAndLine
|
||||||
|
{
|
||||||
|
FileAndLine() {}
|
||||||
|
FileAndLine(const QString &f, int l) : file(f), line(l) {}
|
||||||
|
|
||||||
|
QString file;
|
||||||
|
int line = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
using FileAndLines = QList<FileAndLine>;
|
||||||
|
|
||||||
|
static FileAndLines findIncluders(const QString &filePath)
|
||||||
|
{
|
||||||
|
FileAndLines result;
|
||||||
|
const Snapshot snapshot = globalSnapshot();
|
||||||
|
for (auto cit = snapshot.begin(), citEnd = snapshot.end(); cit != citEnd; ++cit) {
|
||||||
|
const QString filePathFromSnapshot = cit.key().toString();
|
||||||
|
Document::Ptr doc = cit.value();
|
||||||
|
const QList<Document::Include> resolvedIncludes = doc->resolvedIncludes();
|
||||||
|
for (const auto &includeFile : resolvedIncludes) {
|
||||||
|
const QString includedFilePath = includeFile.resolvedFileName();
|
||||||
|
if (includedFilePath == filePath)
|
||||||
|
result.append(FileAndLine(filePathFromSnapshot, int(includeFile.line())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FileAndLines findIncludes(const QString &filePath, const Snapshot &snapshot)
|
||||||
|
{
|
||||||
|
FileAndLines result;
|
||||||
|
if (Document::Ptr doc = snapshot.document(filePath)) {
|
||||||
|
const QList<Document::Include> resolvedIncludes = doc->resolvedIncludes();
|
||||||
|
for (const auto &includeFile : resolvedIncludes)
|
||||||
|
result.append(FileAndLine(includeFile.resolvedFileName(), 0));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CppIncludeHierarchyItem
|
||||||
|
: public TypedTreeItem<CppIncludeHierarchyItem, CppIncludeHierarchyItem>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum SubTree { RootItem, InIncludes, InIncludedBy };
|
||||||
|
CppIncludeHierarchyItem() {}
|
||||||
|
|
||||||
|
void createChild(const QString &filePath, SubTree subTree,
|
||||||
|
int line = 0, bool definitelyNoChildren = false)
|
||||||
|
{
|
||||||
|
auto item = new CppIncludeHierarchyItem;
|
||||||
|
item->m_fileName = filePath.mid(filePath.lastIndexOf('/') + 1);
|
||||||
|
item->m_filePath = filePath;
|
||||||
|
item->m_line = line;
|
||||||
|
item->m_subTree = subTree;
|
||||||
|
appendChild(item);
|
||||||
|
for (auto ancestor = this; ancestor; ancestor = ancestor->parent()) {
|
||||||
|
if (ancestor->filePath() == filePath) {
|
||||||
|
item->m_isCyclic = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (filePath == model()->editorFilePath() || definitelyNoChildren)
|
||||||
|
item->setChildrenChecked();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString filePath() const
|
||||||
|
{
|
||||||
|
return isPhony() ? model()->editorFilePath() : m_filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isPhony() const { return !parent() || !parent()->parent(); }
|
||||||
|
void setChildrenChecked() { m_checkedForChildren = true; }
|
||||||
|
|
||||||
|
CppIncludeHierarchyModel *model() const
|
||||||
|
{
|
||||||
|
return static_cast<CppIncludeHierarchyModel *>(TreeItem::model());
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant data(int column, int role) const override;
|
||||||
|
|
||||||
|
Qt::ItemFlags flags(int) const override
|
||||||
|
{
|
||||||
|
TextEditorWidget::Link link(m_filePath, m_line);
|
||||||
|
if (link.hasValidTarget())
|
||||||
|
return Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||||
|
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool canFetchMore() const override;
|
||||||
|
void fetchMore() override;
|
||||||
|
|
||||||
|
QString m_fileName;
|
||||||
|
QString m_filePath;
|
||||||
|
int m_line = 0;
|
||||||
|
SubTree m_subTree = RootItem;
|
||||||
|
bool m_isCyclic = false;
|
||||||
|
bool m_checkedForChildren = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
QVariant CppIncludeHierarchyItem::data(int column, int role) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(column);
|
||||||
|
if (role == Qt::DisplayRole) {
|
||||||
|
if (isPhony() && childCount() == 0)
|
||||||
|
return QString(m_fileName + ' ' + CppIncludeHierarchyModel::tr("(none)"));
|
||||||
|
if (m_isCyclic)
|
||||||
|
return QString(m_fileName + ' ' + CppIncludeHierarchyModel::tr("(cyclic)"));
|
||||||
|
return m_fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isPhony())
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
switch (role) {
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
return m_filePath;
|
||||||
|
case Qt::DecorationRole:
|
||||||
|
return FileIconProvider::icon(QFileInfo(m_filePath));
|
||||||
|
case LinkRole:
|
||||||
|
return QVariant::fromValue(TextEditorWidget::Link(m_filePath, m_line));
|
||||||
|
}
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CppIncludeHierarchyItem::canFetchMore() const
|
||||||
|
{
|
||||||
|
if (m_isCyclic || m_checkedForChildren || !children().isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !model()->m_searching || !model()->m_seen.contains(m_filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppIncludeHierarchyItem::fetchMore()
|
||||||
|
{
|
||||||
|
QTC_ASSERT(canFetchMore(), setChildrenChecked(); return);
|
||||||
|
QTC_ASSERT(model(), return);
|
||||||
|
QTC_ASSERT(m_subTree != RootItem, return); // Root should always be populated.
|
||||||
|
|
||||||
|
model()->m_seen.insert(m_filePath);
|
||||||
|
|
||||||
|
const QString editorFilePath = model()->editorFilePath();
|
||||||
|
|
||||||
|
setChildrenChecked();
|
||||||
|
if (m_subTree == InIncludes) {
|
||||||
|
auto processor = CppToolsBridge::baseEditorDocumentProcessor(editorFilePath);
|
||||||
|
QTC_ASSERT(processor, return);
|
||||||
|
const Snapshot snapshot = processor->snapshot();
|
||||||
|
const FileAndLines includes = findIncludes(filePath(), snapshot);
|
||||||
|
for (const FileAndLine &include : includes) {
|
||||||
|
const FileAndLines subIncludes = findIncludes(include.file, snapshot);
|
||||||
|
bool definitelyNoChildren = subIncludes.isEmpty();
|
||||||
|
createChild(include.file, InIncludes, include.line, definitelyNoChildren);
|
||||||
|
}
|
||||||
|
} else if (m_subTree == InIncludedBy) {
|
||||||
|
const FileAndLines includers = findIncluders(filePath());
|
||||||
|
for (const FileAndLine &includer : includers) {
|
||||||
|
const FileAndLines subIncluders = findIncluders(includer.file);
|
||||||
|
bool definitelyNoChildren = subIncluders.isEmpty();
|
||||||
|
createChild(includer.file, InIncludedBy, includer.line, definitelyNoChildren);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppIncludeHierarchyModel::buildHierarchy(const QString &document)
|
||||||
|
{
|
||||||
|
m_editorFilePath = document;
|
||||||
|
rootItem()->removeChildren();
|
||||||
|
rootItem()->createChild(tr("Includes"), CppIncludeHierarchyItem::InIncludes);
|
||||||
|
rootItem()->createChild(tr("Included by"), CppIncludeHierarchyItem::InIncludedBy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppIncludeHierarchyModel::setSearching(bool on)
|
||||||
|
{
|
||||||
|
m_searching = on;
|
||||||
|
m_seen.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// CppIncludeHierarchyModel
|
||||||
|
|
||||||
|
CppIncludeHierarchyModel::CppIncludeHierarchyModel()
|
||||||
|
{
|
||||||
|
setRootItem(new CppIncludeHierarchyItem); // FIXME: Remove in 4.2
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt::DropActions CppIncludeHierarchyModel::supportedDragActions() const
|
||||||
|
{
|
||||||
|
return Qt::MoveAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList CppIncludeHierarchyModel::mimeTypes() const
|
||||||
|
{
|
||||||
|
return DropSupport::mimeTypesForFilePaths();
|
||||||
|
}
|
||||||
|
|
||||||
|
QMimeData *CppIncludeHierarchyModel::mimeData(const QModelIndexList &indexes) const
|
||||||
|
{
|
||||||
|
auto data = new DropMimeData;
|
||||||
|
foreach (const QModelIndex &index, indexes) {
|
||||||
|
auto link = index.data(LinkRole).value<TextEditorWidget::Link>();
|
||||||
|
if (link.hasValidTarget())
|
||||||
|
data->addFile(link.targetFileName, link.targetLine, link.targetColumn);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// CppIncludeHierarchyTreeView
|
||||||
|
|
||||||
|
class CppIncludeHierarchyTreeView : public NavigationTreeView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CppIncludeHierarchyTreeView()
|
||||||
|
{
|
||||||
|
setDragEnabled(true);
|
||||||
|
setDragDropMode(QAbstractItemView::DragOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void keyPressEvent(QKeyEvent *event) override
|
||||||
|
{
|
||||||
|
if (event->key())
|
||||||
|
QAbstractItemView::keyPressEvent(event);
|
||||||
|
else
|
||||||
|
NavigationTreeView::keyPressEvent(event);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// IncludeFinder
|
||||||
|
|
||||||
|
class IncludeFinder : public ItemViewFind
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IncludeFinder(QAbstractItemView *view, CppIncludeHierarchyModel *model)
|
||||||
|
: ItemViewFind(view, Qt::DisplayRole, FetchMoreWhileSearching)
|
||||||
|
, m_model(model)
|
||||||
|
{}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Result findIncremental(const QString &txt, FindFlags findFlags)
|
||||||
|
{
|
||||||
|
m_model->setSearching(true);
|
||||||
|
Result result = ItemViewFind::findIncremental(txt, findFlags);
|
||||||
|
m_model->setSearching(false);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
CppIncludeHierarchyModel *m_model; // Not owned.
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// CppIncludeHierarchyWidget
|
||||||
|
|
||||||
|
class CppIncludeHierarchyWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_DECLARE_TR_FUNCTIONS(CppEditor::CppIncludeHierarchy)
|
||||||
|
|
||||||
|
public:
|
||||||
|
CppIncludeHierarchyWidget();
|
||||||
|
~CppIncludeHierarchyWidget() { delete m_treeView; }
|
||||||
|
|
||||||
|
void perform();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onItemActivated(const QModelIndex &index);
|
||||||
|
void editorsClosed(QList<IEditor *> editors);
|
||||||
|
void showNoIncludeHierarchyLabel();
|
||||||
|
void showIncludeHierarchy();
|
||||||
|
|
||||||
|
CppIncludeHierarchyTreeView *m_treeView = nullptr;
|
||||||
|
CppIncludeHierarchyModel m_model;
|
||||||
|
AnnotatedItemDelegate m_delegate;
|
||||||
|
TextEditorLinkLabel *m_inspectedFile = nullptr;
|
||||||
|
QLabel *m_includeHierarchyInfoLabel = nullptr;
|
||||||
|
BaseTextEditor *m_editor = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
CppIncludeHierarchyWidget::CppIncludeHierarchyWidget()
|
||||||
|
{
|
||||||
|
m_delegate.setDelimiter(" ");
|
||||||
|
m_delegate.setAnnotationRole(AnnotationRole);
|
||||||
|
|
||||||
m_inspectedFile = new TextEditorLinkLabel(this);
|
m_inspectedFile = new TextEditorLinkLabel(this);
|
||||||
m_inspectedFile->setMargin(5);
|
m_inspectedFile->setMargin(5);
|
||||||
m_model = new CppIncludeHierarchyModel(this);
|
|
||||||
m_treeView = new CppIncludeHierarchyTreeView(this);
|
m_treeView = new CppIncludeHierarchyTreeView;
|
||||||
m_delegate = new AnnotatedItemDelegate(this);
|
m_treeView->setModel(&m_model);
|
||||||
m_delegate->setDelimiter(QLatin1String(" "));
|
|
||||||
m_delegate->setAnnotationRole(AnnotationRole);
|
|
||||||
m_treeView->setModel(m_model);
|
|
||||||
m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||||
m_treeView->setItemDelegate(m_delegate);
|
m_treeView->setItemDelegate(&m_delegate);
|
||||||
connect(m_treeView, &QAbstractItemView::activated, this, &CppIncludeHierarchyWidget::onItemActivated);
|
connect(m_treeView, &QAbstractItemView::activated, this, &CppIncludeHierarchyWidget::onItemActivated);
|
||||||
|
|
||||||
m_includeHierarchyInfoLabel = new QLabel(tr("No include hierarchy available"), this);
|
m_includeHierarchyInfoLabel = new QLabel(tr("No include hierarchy available"), this);
|
||||||
@@ -81,69 +372,53 @@ CppIncludeHierarchyWidget::CppIncludeHierarchyWidget() :
|
|||||||
m_includeHierarchyInfoLabel->setBackgroundRole(QPalette::Base);
|
m_includeHierarchyInfoLabel->setBackgroundRole(QPalette::Base);
|
||||||
m_includeHierarchyInfoLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
|
m_includeHierarchyInfoLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
|
||||||
|
|
||||||
QVBoxLayout *layout = new QVBoxLayout;
|
auto layout = new QVBoxLayout(this);
|
||||||
layout->setMargin(0);
|
layout->setMargin(0);
|
||||||
layout->setSpacing(0);
|
layout->setSpacing(0);
|
||||||
layout->addWidget(m_inspectedFile);
|
layout->addWidget(m_inspectedFile);
|
||||||
layout->addWidget(Core::ItemViewFind::createSearchableWrapper(
|
layout->addWidget(ItemViewFind::createSearchableWrapper(new IncludeFinder(m_treeView, &m_model)));
|
||||||
m_treeView,
|
|
||||||
Core::ItemViewFind::DarkColored,
|
|
||||||
Core::ItemViewFind::FetchMoreWhileSearching));
|
|
||||||
layout->addWidget(m_includeHierarchyInfoLabel);
|
layout->addWidget(m_includeHierarchyInfoLabel);
|
||||||
setLayout(layout);
|
|
||||||
|
|
||||||
connect(CppEditorPlugin::instance(), &CppEditorPlugin::includeHierarchyRequested,
|
connect(CppEditorPlugin::instance(), &CppEditorPlugin::includeHierarchyRequested,
|
||||||
this, &CppIncludeHierarchyWidget::perform);
|
this, &CppIncludeHierarchyWidget::perform);
|
||||||
connect(Core::EditorManager::instance(), &Core::EditorManager::editorsClosed,
|
connect(EditorManager::instance(), &EditorManager::editorsClosed,
|
||||||
this, &CppIncludeHierarchyWidget::editorsClosed);
|
this, &CppIncludeHierarchyWidget::editorsClosed);
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
CppIncludeHierarchyWidget::~CppIncludeHierarchyWidget()
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppIncludeHierarchyWidget::perform()
|
void CppIncludeHierarchyWidget::perform()
|
||||||
{
|
{
|
||||||
showNoIncludeHierarchyLabel();
|
showNoIncludeHierarchyLabel();
|
||||||
|
|
||||||
m_editor = qobject_cast<CppEditor *>(Core::EditorManager::currentEditor());
|
m_editor = qobject_cast<CppEditor *>(EditorManager::currentEditor());
|
||||||
if (!m_editor)
|
if (!m_editor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CppEditorWidget *widget = qobject_cast<CppEditorWidget *>(m_editor->widget());
|
QString document = m_editor->textDocument()->filePath().toString();
|
||||||
if (!widget)
|
m_model.buildHierarchy(document);
|
||||||
return;
|
|
||||||
|
|
||||||
m_model->clear();
|
m_inspectedFile->setText(m_editor->textDocument()->displayName());
|
||||||
m_model->buildHierarchy(m_editor, widget->textDocument()->filePath().toString());
|
m_inspectedFile->setLink(TextEditorWidget::Link(document));
|
||||||
if (m_model->isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_inspectedFile->setText(widget->textDocument()->displayName());
|
// expand "Includes" adn "Included by"
|
||||||
m_inspectedFile->setLink(TextEditorWidget::Link(widget->textDocument()->filePath().toString()));
|
m_treeView->expand(m_model.index(0, 0));
|
||||||
|
m_treeView->expand(m_model.index(1, 0));
|
||||||
//expand "Includes"
|
|
||||||
m_treeView->expand(m_model->index(0, 0));
|
|
||||||
//expand "Included by"
|
|
||||||
m_treeView->expand(m_model->index(1, 0));
|
|
||||||
|
|
||||||
showIncludeHierarchy();
|
showIncludeHierarchy();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppIncludeHierarchyWidget::onItemActivated(const QModelIndex &index)
|
void CppIncludeHierarchyWidget::onItemActivated(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
const TextEditorWidget::Link link = index.data(LinkRole).value<TextEditorWidget::Link>();
|
const auto link = index.data(LinkRole).value<TextEditorWidget::Link>();
|
||||||
if (link.hasValidTarget())
|
if (link.hasValidTarget())
|
||||||
Core::EditorManager::openEditorAt(link.targetFileName,
|
EditorManager::openEditorAt(link.targetFileName,
|
||||||
link.targetLine,
|
link.targetLine,
|
||||||
link.targetColumn,
|
link.targetColumn,
|
||||||
Constants::CPPEDITOR_ID);
|
Constants::CPPEDITOR_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppIncludeHierarchyWidget::editorsClosed(QList<Core::IEditor *> editors)
|
void CppIncludeHierarchyWidget::editorsClosed(QList<IEditor *> editors)
|
||||||
{
|
{
|
||||||
foreach (Core::IEditor *editor, editors) {
|
foreach (IEditor *editor, editors) {
|
||||||
if (m_editor == editor)
|
if (m_editor == editor)
|
||||||
perform();
|
perform();
|
||||||
}
|
}
|
||||||
@@ -163,20 +438,9 @@ void CppIncludeHierarchyWidget::showIncludeHierarchy()
|
|||||||
m_includeHierarchyInfoLabel->hide();
|
m_includeHierarchyInfoLabel->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
// CppIncludeHierarchyStackedWidget
|
|
||||||
CppIncludeHierarchyStackedWidget::CppIncludeHierarchyStackedWidget(QWidget *parent) :
|
|
||||||
QStackedWidget(parent),
|
|
||||||
m_typeHiearchyWidgetInstance(new CppIncludeHierarchyWidget)
|
|
||||||
{
|
|
||||||
addWidget(m_typeHiearchyWidgetInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
CppIncludeHierarchyStackedWidget::~CppIncludeHierarchyStackedWidget()
|
|
||||||
{
|
|
||||||
delete m_typeHiearchyWidgetInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CppIncludeHierarchyFactory
|
// CppIncludeHierarchyFactory
|
||||||
|
|
||||||
CppIncludeHierarchyFactory::CppIncludeHierarchyFactory()
|
CppIncludeHierarchyFactory::CppIncludeHierarchyFactory()
|
||||||
{
|
{
|
||||||
setDisplayName(tr("Include Hierarchy"));
|
setDisplayName(tr("Include Hierarchy"));
|
||||||
@@ -184,12 +448,16 @@ CppIncludeHierarchyFactory::CppIncludeHierarchyFactory()
|
|||||||
setId(Constants::INCLUDE_HIERARCHY_ID);
|
setId(Constants::INCLUDE_HIERARCHY_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::NavigationView CppIncludeHierarchyFactory::createWidget()
|
NavigationView CppIncludeHierarchyFactory::createWidget()
|
||||||
{
|
{
|
||||||
CppIncludeHierarchyStackedWidget *w = new CppIncludeHierarchyStackedWidget;
|
auto hierarchyWidget = new CppIncludeHierarchyWidget;
|
||||||
static_cast<CppIncludeHierarchyWidget *>(w->currentWidget())->perform();
|
hierarchyWidget->perform();
|
||||||
Core::NavigationView navigationView;
|
|
||||||
navigationView.widget = w;
|
auto stack = new QStackedWidget;
|
||||||
|
stack->addWidget(hierarchyWidget);
|
||||||
|
|
||||||
|
NavigationView navigationView;
|
||||||
|
navigationView.widget = stack;
|
||||||
return navigationView;
|
return navigationView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,83 +26,52 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <coreplugin/inavigationwidgetfactory.h>
|
#include <coreplugin/inavigationwidgetfactory.h>
|
||||||
|
#include <utils/treemodel.h>
|
||||||
|
|
||||||
#include <QString>
|
#include <QSet>
|
||||||
#include <QStackedWidget>
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
class QStandardItemModel;
|
|
||||||
class QStandardItem;
|
|
||||||
class QModelIndex;
|
|
||||||
class QLabel;
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
namespace Core { class IEditor; }
|
|
||||||
|
|
||||||
namespace TextEditor {
|
|
||||||
class BaseTextEditor;
|
|
||||||
class TextEditorLinkLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Utils {
|
|
||||||
class AnnotatedItemDelegate;
|
|
||||||
class FileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace CppEditor {
|
namespace CppEditor {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
class CppEditor;
|
class CppIncludeHierarchyItem;
|
||||||
class CppEditorWidget;
|
|
||||||
class CppInclude;
|
|
||||||
class CppIncludeHierarchyModel;
|
|
||||||
class CppIncludeHierarchyTreeView;
|
|
||||||
|
|
||||||
class CppIncludeHierarchyWidget : public QWidget
|
class CppIncludeHierarchyModel : public Utils::TreeModel<CppIncludeHierarchyItem>
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
typedef Utils::TreeModel<CppIncludeHierarchyItem> base_type;
|
||||||
CppIncludeHierarchyWidget();
|
|
||||||
virtual ~CppIncludeHierarchyWidget();
|
|
||||||
|
|
||||||
void perform();
|
public:
|
||||||
|
CppIncludeHierarchyModel();
|
||||||
|
|
||||||
|
Qt::DropActions supportedDragActions() const override;
|
||||||
|
QStringList mimeTypes() const override;
|
||||||
|
QMimeData *mimeData(const QModelIndexList &indexes) const override;
|
||||||
|
|
||||||
|
void buildHierarchy(const QString &filePath);
|
||||||
|
QString editorFilePath() const { return m_editorFilePath; }
|
||||||
|
void setSearching(bool on);
|
||||||
|
QString toString() const;
|
||||||
|
|
||||||
|
#if WITH_TESTS
|
||||||
|
using base_type::canFetchMore;
|
||||||
|
using base_type::fetchMore;
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onItemActivated(const QModelIndex &index);
|
friend class CppIncludeHierarchyItem;
|
||||||
void editorsClosed(QList<Core::IEditor *> editors);
|
QString m_editorFilePath;
|
||||||
void showNoIncludeHierarchyLabel();
|
QSet<QString> m_seen;
|
||||||
void showIncludeHierarchy();
|
bool m_searching = false;
|
||||||
|
|
||||||
CppEditorWidget *m_cppEditor;
|
|
||||||
CppIncludeHierarchyTreeView *m_treeView;
|
|
||||||
CppIncludeHierarchyModel *m_model;
|
|
||||||
Utils::AnnotatedItemDelegate *m_delegate;
|
|
||||||
TextEditor::TextEditorLinkLabel *m_inspectedFile;
|
|
||||||
QLabel *m_includeHierarchyInfoLabel;
|
|
||||||
TextEditor::BaseTextEditor *m_editor;
|
|
||||||
};
|
|
||||||
|
|
||||||
// @todo: Pretty much the same design as the OutlineWidgetStack. Maybe we can generalize the
|
|
||||||
// outline factory so that it works for different widgets that support the same editor.
|
|
||||||
class CppIncludeHierarchyStackedWidget : public QStackedWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
CppIncludeHierarchyStackedWidget(QWidget *parent = 0);
|
|
||||||
virtual ~CppIncludeHierarchyStackedWidget();
|
|
||||||
|
|
||||||
private:
|
|
||||||
CppIncludeHierarchyWidget *m_typeHiearchyWidgetInstance;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class CppIncludeHierarchyFactory : public Core::INavigationWidgetFactory
|
class CppIncludeHierarchyFactory : public Core::INavigationWidgetFactory
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CppIncludeHierarchyFactory();
|
CppIncludeHierarchyFactory();
|
||||||
|
|
||||||
Core::NavigationView createWidget();
|
Core::NavigationView createWidget() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include "cppeditorplugin.h"
|
#include "cppeditorplugin.h"
|
||||||
#include "cppeditortestcase.h"
|
#include "cppeditortestcase.h"
|
||||||
#include "cppincludehierarchymodel.h"
|
#include "cppincludehierarchy.h"
|
||||||
|
|
||||||
#include <coreplugin/editormanager/editormanager.h>
|
#include <coreplugin/editormanager/editormanager.h>
|
||||||
#include <cpptools/cppmodelmanager.h>
|
#include <cpptools/cppmodelmanager.h>
|
||||||
@@ -61,6 +61,8 @@ QString toString(CppIncludeHierarchyModel &model, const QModelIndex &index, int
|
|||||||
|
|
||||||
QString toString(CppIncludeHierarchyModel &model)
|
QString toString(CppIncludeHierarchyModel &model)
|
||||||
{
|
{
|
||||||
|
model.fetchMore(model.index(0, 0));
|
||||||
|
model.fetchMore(model.index(1, 0));
|
||||||
return toString(model, model.index(0, 0))
|
return toString(model, model.index(0, 0))
|
||||||
+ toString(model, model.index(1, 0));
|
+ toString(model, model.index(1, 0));
|
||||||
}
|
}
|
||||||
@@ -98,8 +100,8 @@ public:
|
|||||||
closeEditorAtEndOfTestCase(editor);
|
closeEditorAtEndOfTestCase(editor);
|
||||||
|
|
||||||
// Test model
|
// Test model
|
||||||
CppIncludeHierarchyModel model(0);
|
CppIncludeHierarchyModel model;
|
||||||
model.buildHierarchy(editor, fileName);
|
model.buildHierarchy(editor->document()->filePath().toString());
|
||||||
const QString actualHierarchy = toString(model);
|
const QString actualHierarchy = toString(model);
|
||||||
QCOMPARE(actualHierarchy, expectedHierarchy);
|
QCOMPARE(actualHierarchy, expectedHierarchy);
|
||||||
}
|
}
|
||||||
|
@@ -1,123 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
|
|
||||||
** 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 "cppincludehierarchyitem.h"
|
|
||||||
|
|
||||||
namespace CppEditor {
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem::CppIncludeHierarchyItem(const QString &filePath,
|
|
||||||
CppIncludeHierarchyItem *parent,
|
|
||||||
bool isCyclic)
|
|
||||||
: m_fileName(filePath.mid(filePath.lastIndexOf(QLatin1Char('/')) + 1))
|
|
||||||
, m_filePath(filePath)
|
|
||||||
, m_parentItem(parent)
|
|
||||||
, m_isCyclic(isCyclic)
|
|
||||||
, m_hasChildren(false)
|
|
||||||
, m_line(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem::~CppIncludeHierarchyItem()
|
|
||||||
{
|
|
||||||
removeChildren();
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString &CppIncludeHierarchyItem::fileName() const
|
|
||||||
{
|
|
||||||
return m_fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString &CppIncludeHierarchyItem::filePath() const
|
|
||||||
{
|
|
||||||
return m_filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *CppIncludeHierarchyItem::parent() const
|
|
||||||
{
|
|
||||||
return m_parentItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CppIncludeHierarchyItem::isCyclic() const
|
|
||||||
{
|
|
||||||
return m_isCyclic;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyItem::appendChild(CppIncludeHierarchyItem *childItem)
|
|
||||||
{
|
|
||||||
m_childItems.append(childItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *CppIncludeHierarchyItem::child(int row)
|
|
||||||
{
|
|
||||||
return m_childItems.at(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
int CppIncludeHierarchyItem::row() const
|
|
||||||
{
|
|
||||||
if (m_parentItem)
|
|
||||||
return m_parentItem->m_childItems.indexOf(const_cast<CppIncludeHierarchyItem*>(this));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CppIncludeHierarchyItem::childCount() const
|
|
||||||
{
|
|
||||||
return m_childItems.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyItem::removeChildren()
|
|
||||||
{
|
|
||||||
qDeleteAll(m_childItems);
|
|
||||||
m_childItems.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CppIncludeHierarchyItem::needChildrenPopulate() const
|
|
||||||
{
|
|
||||||
return m_hasChildren && m_childItems.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CppIncludeHierarchyItem::hasChildren() const
|
|
||||||
{
|
|
||||||
return m_hasChildren;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyItem::setHasChildren(bool hasChildren)
|
|
||||||
{
|
|
||||||
m_hasChildren = hasChildren;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CppIncludeHierarchyItem::line() const
|
|
||||||
{
|
|
||||||
return m_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyItem::setLine(int line)
|
|
||||||
{
|
|
||||||
m_line = line;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Internal
|
|
||||||
} // namespace CppEditor
|
|
@@ -1,68 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
|
|
||||||
** 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 <QList>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
namespace CppEditor {
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
class CppIncludeHierarchyItem
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CppIncludeHierarchyItem(const QString &filePath, CppIncludeHierarchyItem *parent = 0,
|
|
||||||
bool isCyclic = false);
|
|
||||||
virtual ~CppIncludeHierarchyItem();
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *parent() const;
|
|
||||||
CppIncludeHierarchyItem *child(int row);
|
|
||||||
int childCount() const;
|
|
||||||
void appendChild(CppIncludeHierarchyItem *childItem);
|
|
||||||
void removeChildren();
|
|
||||||
bool needChildrenPopulate() const;
|
|
||||||
int row() const;
|
|
||||||
bool isCyclic() const;
|
|
||||||
|
|
||||||
const QString &fileName() const;
|
|
||||||
const QString &filePath() const;
|
|
||||||
bool hasChildren() const;
|
|
||||||
void setHasChildren(bool hasChildren);
|
|
||||||
int line() const;
|
|
||||||
void setLine(int line);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QString m_fileName;
|
|
||||||
QString m_filePath;
|
|
||||||
QList<CppIncludeHierarchyItem *> m_childItems;
|
|
||||||
CppIncludeHierarchyItem *m_parentItem;
|
|
||||||
bool m_isCyclic;
|
|
||||||
bool m_hasChildren;
|
|
||||||
int m_line;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Internal
|
|
||||||
} // namespace CppEditor
|
|
@@ -1,371 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
|
|
||||||
** 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 "cppincludehierarchymodel.h"
|
|
||||||
|
|
||||||
#include "cppincludehierarchyitem.h"
|
|
||||||
|
|
||||||
#include <coreplugin/fileiconprovider.h>
|
|
||||||
#include <cpptools/baseeditordocumentprocessor.h>
|
|
||||||
#include <cpptools/cppmodelmanager.h>
|
|
||||||
#include <cpptools/cpptoolsbridge.h>
|
|
||||||
#include <cpptools/editordocumenthandle.h>
|
|
||||||
#include <texteditor/texteditor.h>
|
|
||||||
|
|
||||||
#include <cplusplus/CppDocument.h>
|
|
||||||
#include <utils/dropsupport.h>
|
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <QSet>
|
|
||||||
|
|
||||||
using namespace CPlusPlus;
|
|
||||||
using namespace CppTools;
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
Snapshot globalSnapshot()
|
|
||||||
{
|
|
||||||
return CppModelManager::instance()->snapshot();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // anonymous namespace
|
|
||||||
|
|
||||||
namespace CppEditor {
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
CppIncludeHierarchyModel::CppIncludeHierarchyModel(QObject *parent)
|
|
||||||
: QAbstractItemModel(parent)
|
|
||||||
, m_rootItem(new CppIncludeHierarchyItem(QString()))
|
|
||||||
, m_includesItem(new CppIncludeHierarchyItem(tr("Includes"), m_rootItem))
|
|
||||||
, m_includedByItem(new CppIncludeHierarchyItem(tr("Included by"), m_rootItem))
|
|
||||||
, m_editor(0)
|
|
||||||
{
|
|
||||||
m_rootItem->appendChild(m_includesItem);
|
|
||||||
m_rootItem->appendChild(m_includedByItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
CppIncludeHierarchyModel::~CppIncludeHierarchyModel()
|
|
||||||
{
|
|
||||||
delete m_rootItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
QModelIndex CppIncludeHierarchyModel::index(int row, int column, const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
if (!hasIndex(row, column, parent))
|
|
||||||
return QModelIndex();
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *parentItem = parent.isValid()
|
|
||||||
? static_cast<CppIncludeHierarchyItem*>(parent.internalPointer())
|
|
||||||
: m_rootItem;
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *childItem = parentItem->child(row);
|
|
||||||
return childItem ? createIndex(row, column, childItem) : QModelIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
QModelIndex CppIncludeHierarchyModel::parent(const QModelIndex &index) const
|
|
||||||
{
|
|
||||||
if (!index.isValid())
|
|
||||||
return QModelIndex();
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *childItem
|
|
||||||
= static_cast<CppIncludeHierarchyItem*>(index.internalPointer());
|
|
||||||
CppIncludeHierarchyItem *parentItem = childItem->parent();
|
|
||||||
|
|
||||||
if (parentItem == m_rootItem)
|
|
||||||
return QModelIndex();
|
|
||||||
|
|
||||||
return createIndex(parentItem->row(), 0, parentItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
int CppIncludeHierarchyModel::rowCount(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
CppIncludeHierarchyItem *parentItem;
|
|
||||||
|
|
||||||
if (!parent.isValid())
|
|
||||||
parentItem = m_rootItem;
|
|
||||||
else
|
|
||||||
parentItem = static_cast<CppIncludeHierarchyItem*>(parent.internalPointer());
|
|
||||||
|
|
||||||
return parentItem->childCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
int CppIncludeHierarchyModel::columnCount(const QModelIndex &) const
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant CppIncludeHierarchyModel::data(const QModelIndex &index, int role) const
|
|
||||||
{
|
|
||||||
if (!index.isValid())
|
|
||||||
return QVariant();
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *item = static_cast<CppIncludeHierarchyItem*>(index.internalPointer());
|
|
||||||
|
|
||||||
if (!item)
|
|
||||||
return QVariant();
|
|
||||||
|
|
||||||
if (role == Qt::DisplayRole) {
|
|
||||||
if ((item == m_includesItem && m_includesItem->childCount() == 0)
|
|
||||||
|| (item == m_includedByItem && m_includedByItem->childCount() == 0)) {
|
|
||||||
return QString(item->fileName() + QLatin1Char(' ') + tr("(none)"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item->isCyclic())
|
|
||||||
return QString(item->fileName() + QLatin1Char(' ') + tr("(cyclic)"));
|
|
||||||
|
|
||||||
return item->fileName();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item == m_rootItem || item == m_includesItem || item == m_includedByItem)
|
|
||||||
return QVariant();
|
|
||||||
|
|
||||||
switch (role) {
|
|
||||||
case Qt::ToolTipRole:
|
|
||||||
return item->filePath();
|
|
||||||
case Qt::DecorationRole:
|
|
||||||
return Core::FileIconProvider::icon(QFileInfo(item->filePath()));
|
|
||||||
case LinkRole: {
|
|
||||||
QVariant itemLink;
|
|
||||||
TextEditor::TextEditorWidget::Link link(item->filePath(), item->line());
|
|
||||||
itemLink.setValue(link);
|
|
||||||
return itemLink;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyModel::fetchMore(const QModelIndex &parent)
|
|
||||||
{
|
|
||||||
if (!parent.isValid())
|
|
||||||
return;
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *parentItem
|
|
||||||
= static_cast<CppIncludeHierarchyItem*>(parent.internalPointer());
|
|
||||||
Q_ASSERT(parentItem);
|
|
||||||
|
|
||||||
if (parentItem == m_rootItem || parentItem == m_includesItem || parentItem == m_includedByItem)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (parentItem->needChildrenPopulate()) {
|
|
||||||
const QString editorFilePath = m_editor->document()->filePath().toString();
|
|
||||||
QSet<QString> cyclic;
|
|
||||||
cyclic << editorFilePath;
|
|
||||||
CppIncludeHierarchyItem *item = parentItem->parent();
|
|
||||||
while (!(item == m_includesItem || item == m_includedByItem)) {
|
|
||||||
cyclic << item->filePath();
|
|
||||||
item = item->parent();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item == m_includesItem) {
|
|
||||||
auto *processor = CppToolsBridge::baseEditorDocumentProcessor(editorFilePath);
|
|
||||||
QTC_ASSERT(processor, return);
|
|
||||||
const Snapshot editorDocumentSnapshot = processor->snapshot();
|
|
||||||
buildHierarchyIncludes_helper(parentItem->filePath(), parentItem,
|
|
||||||
editorDocumentSnapshot, &cyclic);
|
|
||||||
} else {
|
|
||||||
buildHierarchyIncludedBy_helper(parentItem->filePath(), parentItem,
|
|
||||||
globalSnapshot(), &cyclic);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CppIncludeHierarchyModel::canFetchMore(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
if (!parent.isValid())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *parentItem
|
|
||||||
= static_cast<CppIncludeHierarchyItem*>(parent.internalPointer());
|
|
||||||
Q_ASSERT(parentItem);
|
|
||||||
|
|
||||||
if (parentItem == m_includesItem || parentItem == m_includedByItem)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (parentItem->needChildrenPopulate())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyModel::clear()
|
|
||||||
{
|
|
||||||
beginResetModel();
|
|
||||||
m_includesItem->removeChildren();
|
|
||||||
m_includedByItem->removeChildren();
|
|
||||||
endResetModel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyModel::buildHierarchy(TextEditor::BaseTextEditor *editor,
|
|
||||||
const QString &filePath)
|
|
||||||
{
|
|
||||||
m_editor = editor;
|
|
||||||
beginResetModel();
|
|
||||||
buildHierarchyIncludes(filePath);
|
|
||||||
buildHierarchyIncludedBy(filePath);
|
|
||||||
endResetModel();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CppIncludeHierarchyModel::hasChildren(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
if (!parent.isValid())
|
|
||||||
return true;
|
|
||||||
CppIncludeHierarchyItem *parentItem
|
|
||||||
= static_cast<CppIncludeHierarchyItem*>(parent.internalPointer());
|
|
||||||
|
|
||||||
Q_ASSERT(parentItem);
|
|
||||||
return parentItem->hasChildren();
|
|
||||||
}
|
|
||||||
|
|
||||||
Qt::ItemFlags CppIncludeHierarchyModel::flags(const QModelIndex &index) const
|
|
||||||
{
|
|
||||||
const TextEditor::TextEditorWidget::Link link
|
|
||||||
= index.data(LinkRole).value<TextEditor::TextEditorWidget::Link>();
|
|
||||||
if (link.hasValidTarget())
|
|
||||||
return Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
|
||||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
|
||||||
}
|
|
||||||
|
|
||||||
Qt::DropActions CppIncludeHierarchyModel::supportedDragActions() const
|
|
||||||
{
|
|
||||||
return Qt::MoveAction;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList CppIncludeHierarchyModel::mimeTypes() const
|
|
||||||
{
|
|
||||||
return Utils::DropSupport::mimeTypesForFilePaths();
|
|
||||||
}
|
|
||||||
|
|
||||||
QMimeData *CppIncludeHierarchyModel::mimeData(const QModelIndexList &indexes) const
|
|
||||||
{
|
|
||||||
auto data = new Utils::DropMimeData;
|
|
||||||
foreach (const QModelIndex &index, indexes) {
|
|
||||||
const TextEditor::TextEditorWidget::Link link
|
|
||||||
= index.data(LinkRole).value<TextEditor::TextEditorWidget::Link>();
|
|
||||||
if (link.hasValidTarget())
|
|
||||||
data->addFile(link.targetFileName, link.targetLine, link.targetColumn);
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CppIncludeHierarchyModel::isEmpty() const
|
|
||||||
{
|
|
||||||
return !m_includesItem->hasChildren() && !m_includedByItem->hasChildren();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyModel::buildHierarchyIncludes(const QString ¤tFilePath)
|
|
||||||
{
|
|
||||||
if (!m_editor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const QString editorFilePath = m_editor->document()->filePath().toString();
|
|
||||||
auto *documentProcessor = CppToolsBridge::baseEditorDocumentProcessor(editorFilePath);
|
|
||||||
QTC_ASSERT(documentProcessor, return);
|
|
||||||
const Snapshot editorDocumentSnapshot = documentProcessor->snapshot();
|
|
||||||
QSet<QString> cyclic;
|
|
||||||
buildHierarchyIncludes_helper(currentFilePath, m_includesItem, editorDocumentSnapshot, &cyclic);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyModel::buildHierarchyIncludes_helper(const QString &filePath,
|
|
||||||
CppIncludeHierarchyItem *parent,
|
|
||||||
Snapshot snapshot,
|
|
||||||
QSet<QString> *cyclic,
|
|
||||||
bool recursive)
|
|
||||||
{
|
|
||||||
Document::Ptr doc = snapshot.document(filePath);
|
|
||||||
if (!doc)
|
|
||||||
return;
|
|
||||||
|
|
||||||
parent->setHasChildren(doc->resolvedIncludes().size() > 0);
|
|
||||||
if (!recursive)
|
|
||||||
return;
|
|
||||||
|
|
||||||
cyclic->insert(filePath);
|
|
||||||
|
|
||||||
foreach (const Document::Include &includeFile, doc->resolvedIncludes()) {
|
|
||||||
const QString includedFilePath = includeFile.resolvedFileName();
|
|
||||||
CppIncludeHierarchyItem *item = 0;
|
|
||||||
|
|
||||||
if (cyclic->contains(includedFilePath)) {
|
|
||||||
item = new CppIncludeHierarchyItem(includedFilePath, parent, true);
|
|
||||||
parent->appendChild(item);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
item = new CppIncludeHierarchyItem(includedFilePath, parent);
|
|
||||||
parent->appendChild(item);
|
|
||||||
buildHierarchyIncludes_helper(includedFilePath, item, snapshot, cyclic, false);
|
|
||||||
|
|
||||||
}
|
|
||||||
cyclic->remove(filePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyModel::buildHierarchyIncludedBy(const QString ¤tFilePath)
|
|
||||||
{
|
|
||||||
QSet<QString> cyclic;
|
|
||||||
buildHierarchyIncludedBy_helper(currentFilePath, m_includedByItem, globalSnapshot(), &cyclic);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyModel::buildHierarchyIncludedBy_helper(const QString &filePath,
|
|
||||||
CppIncludeHierarchyItem *parent,
|
|
||||||
Snapshot snapshot,
|
|
||||||
QSet<QString> *cyclic,
|
|
||||||
bool recursive)
|
|
||||||
{
|
|
||||||
cyclic->insert(filePath);
|
|
||||||
Snapshot::const_iterator citEnd = snapshot.end();
|
|
||||||
for (Snapshot::const_iterator cit = snapshot.begin(); cit != citEnd; ++cit) {
|
|
||||||
const QString filePathFromSnapshot = cit.key().toString();
|
|
||||||
Document::Ptr doc = cit.value();
|
|
||||||
foreach (const Document::Include &includeFile, doc->resolvedIncludes()) {
|
|
||||||
const QString includedFilePath = includeFile.resolvedFileName();
|
|
||||||
|
|
||||||
if (includedFilePath == filePath) {
|
|
||||||
parent->setHasChildren(true);
|
|
||||||
if (!recursive) {
|
|
||||||
cyclic->remove(filePath);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const bool isCyclic = cyclic->contains(filePathFromSnapshot);
|
|
||||||
CppIncludeHierarchyItem *item = new CppIncludeHierarchyItem(filePathFromSnapshot,
|
|
||||||
parent,
|
|
||||||
isCyclic);
|
|
||||||
item->setLine(includeFile.line());
|
|
||||||
parent->appendChild(item);
|
|
||||||
|
|
||||||
if (isCyclic)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
buildHierarchyIncludedBy_helper(filePathFromSnapshot, item, snapshot, cyclic,
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cyclic->remove(filePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Internal
|
|
||||||
} // namespace CppEditor
|
|
@@ -1,90 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
|
|
||||||
** 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 <QAbstractItemModel>
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
enum ItemRole {
|
|
||||||
AnnotationRole = Qt::UserRole + 1,
|
|
||||||
LinkRole
|
|
||||||
};
|
|
||||||
|
|
||||||
} // Anonymous
|
|
||||||
|
|
||||||
namespace CPlusPlus { class Snapshot; }
|
|
||||||
namespace TextEditor { class BaseTextEditor; }
|
|
||||||
|
|
||||||
namespace CppEditor {
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
class CppEditor;
|
|
||||||
class CppIncludeHierarchyItem;
|
|
||||||
|
|
||||||
class CppIncludeHierarchyModel : public QAbstractItemModel
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit CppIncludeHierarchyModel(QObject *parent);
|
|
||||||
~CppIncludeHierarchyModel();
|
|
||||||
|
|
||||||
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
|
||||||
QModelIndex parent(const QModelIndex &index) const;
|
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
|
||||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
|
||||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
|
||||||
void fetchMore(const QModelIndex &parent);
|
|
||||||
bool canFetchMore(const QModelIndex &parent) const;
|
|
||||||
bool hasChildren(const QModelIndex &parent) const;
|
|
||||||
Qt::ItemFlags flags(const QModelIndex &index) const;
|
|
||||||
|
|
||||||
Qt::DropActions supportedDragActions() const;
|
|
||||||
QStringList mimeTypes() const;
|
|
||||||
QMimeData *mimeData(const QModelIndexList &indexes) const;
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
void buildHierarchy(TextEditor::BaseTextEditor *editor, const QString &filePath);
|
|
||||||
bool isEmpty() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void buildHierarchyIncludes(const QString ¤tFilePath);
|
|
||||||
void buildHierarchyIncludes_helper(const QString &filePath, CppIncludeHierarchyItem *parent,
|
|
||||||
CPlusPlus::Snapshot snapshot,
|
|
||||||
QSet<QString> *cyclic, bool recursive = true);
|
|
||||||
void buildHierarchyIncludedBy(const QString ¤tFilePath);
|
|
||||||
void buildHierarchyIncludedBy_helper(const QString &filePath, CppIncludeHierarchyItem *parent,
|
|
||||||
CPlusPlus::Snapshot snapshot, QSet<QString> *cyclic,
|
|
||||||
bool recursive = true);
|
|
||||||
|
|
||||||
CppIncludeHierarchyItem *m_rootItem;
|
|
||||||
CppIncludeHierarchyItem *m_includesItem;
|
|
||||||
CppIncludeHierarchyItem *m_includedByItem;
|
|
||||||
TextEditor::BaseTextEditor *m_editor;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Internal
|
|
||||||
} // namespace CppEditor
|
|
@@ -1,52 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
|
|
||||||
** 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 "cppincludehierarchytreeview.h"
|
|
||||||
|
|
||||||
#include <QKeyEvent>
|
|
||||||
|
|
||||||
namespace CppEditor {
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
CppIncludeHierarchyTreeView::CppIncludeHierarchyTreeView(QWidget *parent/* = 0*/)
|
|
||||||
: NavigationTreeView(parent)
|
|
||||||
{
|
|
||||||
setDragEnabled(true);
|
|
||||||
setDragDropMode(QAbstractItemView::DragOnly);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CppIncludeHierarchyTreeView::keyPressEvent(QKeyEvent *event)
|
|
||||||
{
|
|
||||||
switch (event->key()) {
|
|
||||||
case Qt::Key_Asterisk:
|
|
||||||
QAbstractItemView::keyPressEvent(event);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NavigationTreeView::keyPressEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Internal
|
|
||||||
} // namespace CppEditor
|
|
@@ -1,42 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
|
|
||||||
** 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 <utils/navigationtreeview.h>
|
|
||||||
|
|
||||||
namespace CppEditor {
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
class CppIncludeHierarchyTreeView : public Utils::NavigationTreeView
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CppIncludeHierarchyTreeView(QWidget *parent = 0);
|
|
||||||
protected:
|
|
||||||
void keyPressEvent(QKeyEvent *event);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Internal
|
|
||||||
} // namespace CppEditor
|
|
@@ -1516,12 +1516,15 @@ void CdbEngine::postFetchMemory(const MemoryViewCookie &cookie)
|
|||||||
str << cookie.address << ' ' << cookie.length;
|
str << cookie.address << ' ' << cookie.length;
|
||||||
cmd.args = args;
|
cmd.args = args;
|
||||||
cmd.callback = [this, cookie](const DebuggerResponse &response) {
|
cmd.callback = [this, cookie](const DebuggerResponse &response) {
|
||||||
if (response.resultClass == ResultDone && cookie.agent) {
|
if (!cookie.agent)
|
||||||
|
return;
|
||||||
|
if (response.resultClass == ResultDone) {
|
||||||
const QByteArray data = QByteArray::fromHex(response.data.data().toUtf8());
|
const QByteArray data = QByteArray::fromHex(response.data.data().toUtf8());
|
||||||
if (unsigned(data.size()) == cookie.length)
|
if (unsigned(data.size()) == cookie.length)
|
||||||
cookie.agent->addData(cookie.address, data);
|
cookie.agent->addData(cookie.address, data);
|
||||||
} else {
|
} else {
|
||||||
showMessage(response.data["msg"].data(), LogWarning);
|
showMessage(response.data["msg"].data(), LogWarning);
|
||||||
|
cookie.agent->addData(cookie.address, QByteArray(int(cookie.length), char()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
runCommand(cmd);
|
runCommand(cmd);
|
||||||
|
@@ -142,16 +142,6 @@ void DebuggerKitConfigWidget::currentDebuggerChanged(int)
|
|||||||
m_kit->setValue(DebuggerKitInformation::id(), id);
|
m_kit->setValue(DebuggerKitInformation::id(), id);
|
||||||
}
|
}
|
||||||
|
|
||||||
int DebuggerKitConfigWidget::indexOf(const QVariant &id)
|
|
||||||
{
|
|
||||||
QTC_ASSERT(id.isValid(), return -1);
|
|
||||||
for (int i = 0; i < m_comboBox->count(); ++i) {
|
|
||||||
if (id == m_comboBox->itemData(i))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant DebuggerKitConfigWidget::currentId() const
|
QVariant DebuggerKitConfigWidget::currentId() const
|
||||||
{
|
{
|
||||||
return m_comboBox->itemData(m_comboBox->currentIndex());
|
return m_comboBox->itemData(m_comboBox->currentIndex());
|
||||||
|
@@ -68,7 +68,6 @@ private:
|
|||||||
void manageDebuggers();
|
void manageDebuggers();
|
||||||
void currentDebuggerChanged(int idx);
|
void currentDebuggerChanged(int idx);
|
||||||
|
|
||||||
int indexOf(const QVariant &id);
|
|
||||||
QVariant currentId() const;
|
QVariant currentId() const;
|
||||||
void updateComboBox(const QVariant &id);
|
void updateComboBox(const QVariant &id);
|
||||||
|
|
||||||
|
@@ -1650,8 +1650,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments,
|
|||||||
cmd->setAttribute(Command::CA_UpdateText);
|
cmd->setAttribute(Command::CA_UpdateText);
|
||||||
debugMenu->addAction(cmd);
|
debugMenu->addAction(cmd);
|
||||||
|
|
||||||
cmd = ActionManager::registerAction(m_stepOutAction,
|
cmd = ActionManager::registerAction(m_stepOutAction, Constants::STEPOUT);
|
||||||
Constants::STEPOUT, cppDebuggercontext);
|
|
||||||
cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Ctrl+Shift+T") : tr("Shift+F11")));
|
cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Ctrl+Shift+T") : tr("Shift+F11")));
|
||||||
cmd->setAttribute(Command::CA_Hide);
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
debugMenu->addAction(cmd);
|
debugMenu->addAction(cmd);
|
||||||
|
@@ -441,17 +441,19 @@ static DebuggerRunControl *doCreate(DebuggerRunParameters rp, RunConfiguration *
|
|||||||
|
|
||||||
if (rp.languages & QmlLanguage) {
|
if (rp.languages & QmlLanguage) {
|
||||||
if (rp.device && rp.device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) {
|
if (rp.device && rp.device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) {
|
||||||
QTcpServer server;
|
if (rp.qmlServer.host.isEmpty() || !rp.qmlServer.port.isValid()) {
|
||||||
const bool canListen = server.listen(QHostAddress::LocalHost)
|
QTcpServer server;
|
||||||
|| server.listen(QHostAddress::LocalHostIPv6);
|
const bool canListen = server.listen(QHostAddress::LocalHost)
|
||||||
if (!canListen) {
|
|| server.listen(QHostAddress::LocalHostIPv6);
|
||||||
errors->append(DebuggerPlugin::tr("Not enough free ports for QML debugging.") + ' ');
|
if (!canListen) {
|
||||||
return 0;
|
errors->append(DebuggerPlugin::tr("Not enough free ports for QML debugging.") + ' ');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
TcpServerConnection conn;
|
||||||
|
conn.host = server.serverAddress().toString();
|
||||||
|
conn.port = Utils::Port(server.serverPort());
|
||||||
|
rp.qmlServer = conn;
|
||||||
}
|
}
|
||||||
TcpServerConnection conn;
|
|
||||||
conn.host = server.serverAddress().toString();
|
|
||||||
conn.port = Utils::Port(server.serverPort());
|
|
||||||
rp.qmlServer = conn;
|
|
||||||
|
|
||||||
// Makes sure that all bindings go through the JavaScript engine, so that
|
// Makes sure that all bindings go through the JavaScript engine, so that
|
||||||
// breakpoints are actually hit!
|
// breakpoints are actually hit!
|
||||||
|
@@ -49,7 +49,8 @@ using namespace Utils;
|
|||||||
static const char* qtBuildPaths[] = {
|
static const char* qtBuildPaths[] = {
|
||||||
"Q:/qt5_workdir/w/s",
|
"Q:/qt5_workdir/w/s",
|
||||||
"C:/work/build/qt5_workdir/w/s",
|
"C:/work/build/qt5_workdir/w/s",
|
||||||
"c:/users/qt/work/qt"
|
"c:/users/qt/work/qt",
|
||||||
|
"c:/Users/qt/work/install"
|
||||||
};
|
};
|
||||||
#elif defined(Q_OS_MAC)
|
#elif defined(Q_OS_MAC)
|
||||||
static const char* qtBuildPaths[] = {};
|
static const char* qtBuildPaths[] = {};
|
||||||
|
@@ -91,6 +91,10 @@ void PdbEngine::postDirectCommand(const QString &command)
|
|||||||
|
|
||||||
void PdbEngine::runCommand(const DebuggerCommand &cmd)
|
void PdbEngine::runCommand(const DebuggerCommand &cmd)
|
||||||
{
|
{
|
||||||
|
if (state() == EngineSetupRequested) { // cmd has been triggered too early
|
||||||
|
showMessage("IGNORED COMMAND: " + cmd.function);
|
||||||
|
return;
|
||||||
|
}
|
||||||
QTC_ASSERT(m_proc.state() == QProcess::Running, notifyEngineIll());
|
QTC_ASSERT(m_proc.state() == QProcess::Running, notifyEngineIll());
|
||||||
QString command = "qdebug('" + cmd.function + "'," + cmd.argsToPython() + ")";
|
QString command = "qdebug('" + cmd.function + "'," + cmd.argsToPython() + ")";
|
||||||
showMessage(command, LogInput);
|
showMessage(command, LogInput);
|
||||||
|
@@ -1084,7 +1084,7 @@ void QmlEngine::quitDebugger()
|
|||||||
d->noDebugOutputTimer.stop();
|
d->noDebugOutputTimer.stop();
|
||||||
d->automaticConnect = false;
|
d->automaticConnect = false;
|
||||||
d->retryOnConnectFail = false;
|
d->retryOnConnectFail = false;
|
||||||
DebuggerEngine::quitDebugger();
|
shutdownInferior();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlEngine::disconnected()
|
void QmlEngine::disconnected()
|
||||||
@@ -2150,7 +2150,7 @@ void QmlEnginePrivate::handleFrame(const QVariantMap &response)
|
|||||||
|
|
||||||
StackHandler *stackHandler = engine->stackHandler();
|
StackHandler *stackHandler = engine->stackHandler();
|
||||||
WatchHandler * watchHandler = engine->watchHandler();
|
WatchHandler * watchHandler = engine->watchHandler();
|
||||||
watchHandler->notifyUpdateStarted();
|
watchHandler->notifyUpdateStarted({"local"});
|
||||||
|
|
||||||
const int frameIndex = stackHandler->currentIndex();
|
const int frameIndex = stackHandler->currentIndex();
|
||||||
if (frameIndex < 0)
|
if (frameIndex < 0)
|
||||||
|
@@ -2042,6 +2042,13 @@ void WatchHandler::notifyUpdateFinished()
|
|||||||
foreach (auto item, toRemove)
|
foreach (auto item, toRemove)
|
||||||
m_model->destroyItem(item);
|
m_model->destroyItem(item);
|
||||||
|
|
||||||
|
m_model->forAllItems([this](WatchItem *item) {
|
||||||
|
if (item->wantsChildren && isExpandedIName(item->iname)) {
|
||||||
|
m_model->m_engine->showMessage(QString("ADJUSTING CHILD EXPECTATION FOR " + item->iname));
|
||||||
|
item->wantsChildren = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
m_model->m_contentsValid = true;
|
m_model->m_contentsValid = true;
|
||||||
updateWatchersWindow();
|
updateWatchersWindow();
|
||||||
m_model->reexpandItems();
|
m_model->reexpandItems();
|
||||||
|
@@ -81,7 +81,7 @@ static QString defaultFallbackFontFamily()
|
|||||||
if (Utils::HostOsInfo::isMacHost())
|
if (Utils::HostOsInfo::isMacHost())
|
||||||
return QString("Helvetica");
|
return QString("Helvetica");
|
||||||
if (Utils::HostOsInfo::isAnyUnixHost())
|
if (Utils::HostOsInfo::isAnyUnixHost())
|
||||||
return QString("sans-serif");
|
return QString("Sans Serif");
|
||||||
return QString("Arial");
|
return QString("Arial");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -106,14 +106,12 @@ bool NimBuildConfiguration::canRestore(const QVariantMap &map)
|
|||||||
bool NimBuildConfiguration::hasNimCompilerBuildStep() const
|
bool NimBuildConfiguration::hasNimCompilerBuildStep() const
|
||||||
{
|
{
|
||||||
BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
|
BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
|
||||||
QTC_ASSERT(steps, return false);
|
return steps ? steps->contains(Constants::C_NIMCOMPILERBUILDSTEP_ID) : false;
|
||||||
return steps->contains(Constants::C_NIMCOMPILERBUILDSTEP_ID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NimBuildConfiguration::hasNimCompilerCleanStep() const
|
bool NimBuildConfiguration::hasNimCompilerCleanStep() const
|
||||||
{
|
{
|
||||||
BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
|
BuildStepList *steps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
|
||||||
QTC_ASSERT(steps, return false);
|
|
||||||
return steps ? steps->contains(Constants::C_NIMCOMPILERCLEANSTEP_ID) : false;
|
return steps ? steps->contains(Constants::C_NIMCOMPILERCLEANSTEP_ID) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -80,6 +80,7 @@ Runnable NimRunConfiguration::runnable() const
|
|||||||
result.executable = m_executable;
|
result.executable = m_executable;
|
||||||
result.commandLineArguments = m_argumentAspect->arguments();
|
result.commandLineArguments = m_argumentAspect->arguments();
|
||||||
result.workingDirectory = m_workingDirectoryAspect->workingDirectory().toString();
|
result.workingDirectory = m_workingDirectoryAspect->workingDirectory().toString();
|
||||||
|
result.environment = m_localEnvironmentAspect->environment();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -110,7 +110,6 @@ private:
|
|||||||
void paint(QPainter *painter,
|
void paint(QPainter *painter,
|
||||||
const QStyleOptionViewItem &option,
|
const QStyleOptionViewItem &option,
|
||||||
const QModelIndex &index) const;
|
const QModelIndex &index) const;
|
||||||
mutable QImage selectionGradient;
|
|
||||||
ListWidget *m_listWidget;
|
ListWidget *m_listWidget;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -128,9 +127,6 @@ void TargetSelectorDelegate::paint(QPainter *painter,
|
|||||||
painter->save();
|
painter->save();
|
||||||
painter->setClipping(false);
|
painter->setClipping(false);
|
||||||
|
|
||||||
if (selectionGradient.isNull())
|
|
||||||
selectionGradient.load(QLatin1String(":/projectexplorer/images/targetpanel_gradient.png"));
|
|
||||||
|
|
||||||
if (option.state & QStyle::State_Selected) {
|
if (option.state & QStyle::State_Selected) {
|
||||||
const QColor color = (option.state & QStyle::State_HasFocus) ?
|
const QColor color = (option.state & QStyle::State_HasFocus) ?
|
||||||
option.palette.highlight().color() :
|
option.palette.highlight().color() :
|
||||||
@@ -139,6 +135,7 @@ void TargetSelectorDelegate::paint(QPainter *painter,
|
|||||||
painter->fillRect(option.rect, color);
|
painter->fillRect(option.rect, color);
|
||||||
} else {
|
} else {
|
||||||
painter->fillRect(option.rect, color.darker(140));
|
painter->fillRect(option.rect, color.darker(140));
|
||||||
|
static const QImage selectionGradient(":/projectexplorer/images/targetpanel_gradient.png");
|
||||||
StyleHelper::drawCornerImage(selectionGradient, painter, option.rect.adjusted(0, 0, 0, -1), 5, 5, 5, 5);
|
StyleHelper::drawCornerImage(selectionGradient, painter, option.rect.adjusted(0, 0, 0, -1), 5, 5, 5, 5);
|
||||||
const QRectF borderRect = QRectF(option.rect).adjusted(0.5, 0.5, -0.5, -0.5);
|
const QRectF borderRect = QRectF(option.rect).adjusted(0.5, 0.5, -0.5, -0.5);
|
||||||
painter->setPen(QColor(255, 255, 255, 60));
|
painter->setPen(QColor(255, 255, 255, 60));
|
||||||
@@ -1596,7 +1593,7 @@ void MiniProjectTargetSelector::paintEvent(QPaintEvent *)
|
|||||||
if (creatorTheme()->flag(Theme::DrawTargetSelectorBottom)) {
|
if (creatorTheme()->flag(Theme::DrawTargetSelectorBottom)) {
|
||||||
// draw thicker border on the bottom
|
// draw thicker border on the bottom
|
||||||
QRect bottomRect(0, rect().height() - 8, rect().width(), 8);
|
QRect bottomRect(0, rect().height() - 8, rect().width(), 8);
|
||||||
static QImage image(QLatin1String(":/projectexplorer/images/targetpanel_bottom.png"));
|
static const QImage image(":/projectexplorer/images/targetpanel_bottom.png");
|
||||||
StyleHelper::drawCornerImage(image, &painter, bottomRect, 1, 1, 1, 1);
|
StyleHelper::drawCornerImage(image, &painter, bottomRect, 1, 1, 1, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1229,7 +1229,7 @@ QPair<ProFile *, QStringList> QmakePriFileNode::readProFile(const QString &file)
|
|||||||
QMakeVfs vfs;
|
QMakeVfs vfs;
|
||||||
QtSupport::ProMessageHandler handler;
|
QtSupport::ProMessageHandler handler;
|
||||||
QMakeParser parser(0, &vfs, &handler);
|
QMakeParser parser(0, &vfs, &handler);
|
||||||
includeFile = parser.parsedProBlock(contents, file, 1);
|
includeFile = parser.parsedProBlock(QStringRef(&contents), file, 1);
|
||||||
}
|
}
|
||||||
return qMakePair(includeFile, lines);
|
return qMakePair(includeFile, lines);
|
||||||
}
|
}
|
||||||
@@ -1264,7 +1264,8 @@ bool QmakePriFileNode::renameFile(const QString &oldName,
|
|||||||
|
|
||||||
// We need to re-parse here: The file has changed.
|
// We need to re-parse here: The file has changed.
|
||||||
QMakeParser parser(0, 0, 0);
|
QMakeParser parser(0, 0, 0);
|
||||||
includeFile = parser.parsedProBlock(lines.join(QLatin1Char('\n')),
|
QString contents = lines.join(QLatin1Char('\n'));
|
||||||
|
includeFile = parser.parsedProBlock(QStringRef(&contents),
|
||||||
m_projectFilePath.toString(), 1, QMakeParser::FullGrammar);
|
m_projectFilePath.toString(), 1, QMakeParser::FullGrammar);
|
||||||
QTC_ASSERT(includeFile, return false); // The file should still be valid after what we did.
|
QTC_ASSERT(includeFile, return false); // The file should still be valid after what we did.
|
||||||
|
|
||||||
|
@@ -33,13 +33,6 @@
|
|||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
|
|
||||||
QColor midtone(const QColor &a, const QColor &b)
|
|
||||||
{
|
|
||||||
QColor alphaB = b;
|
|
||||||
alphaB.setAlpha(128);
|
|
||||||
return Utils::StyleHelper::alphaBlendedColors(a ,alphaB);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Theming::insertTheme(QQmlPropertyMap *map)
|
void Theming::insertTheme(QQmlPropertyMap *map)
|
||||||
{
|
{
|
||||||
const QVariantHash creatorTheme = Utils::creatorTheme()->values();
|
const QVariantHash creatorTheme = Utils::creatorTheme()->values();
|
||||||
@@ -47,6 +40,7 @@ void Theming::insertTheme(QQmlPropertyMap *map)
|
|||||||
map->insert(it.key(), it.value());
|
map->insert(it.key(), it.value());
|
||||||
|
|
||||||
/* Define QmlDesigner colors and remove alpha channels */
|
/* Define QmlDesigner colors and remove alpha channels */
|
||||||
|
const QColor backgroundColor = Utils::creatorTheme()->color(Utils::Theme::QmlDesigner_BackgroundColor);
|
||||||
const QColor panelStatusBarBackgroundColor = Utils::creatorTheme()->color(Utils::Theme::PanelStatusBarBackgroundColor);
|
const QColor panelStatusBarBackgroundColor = Utils::creatorTheme()->color(Utils::Theme::PanelStatusBarBackgroundColor);
|
||||||
const QColor fancyToolButtonSelectedColor = Utils::creatorTheme()->color(Utils::Theme::FancyToolButtonSelectedColor);
|
const QColor fancyToolButtonSelectedColor = Utils::creatorTheme()->color(Utils::Theme::FancyToolButtonSelectedColor);
|
||||||
const QColor darkerBackground = Utils::StyleHelper::alphaBlendedColors(panelStatusBarBackgroundColor, fancyToolButtonSelectedColor);
|
const QColor darkerBackground = Utils::StyleHelper::alphaBlendedColors(panelStatusBarBackgroundColor, fancyToolButtonSelectedColor);
|
||||||
@@ -65,7 +59,7 @@ void Theming::insertTheme(QQmlPropertyMap *map)
|
|||||||
}
|
}
|
||||||
|
|
||||||
map->insert("QmlDesignerBackgroundColorDarker", darkerBackground);
|
map->insert("QmlDesignerBackgroundColorDarker", darkerBackground);
|
||||||
map->insert("QmlDesignerBackgroundColorDarkAlternate", midtone(panelStatusBarBackgroundColor, buttonColor));
|
map->insert("QmlDesignerBackgroundColorDarkAlternate", backgroundColor);
|
||||||
map->insert("QmlDesignerTabLight", tabLight);
|
map->insert("QmlDesignerTabLight", tabLight);
|
||||||
map->insert("QmlDesignerTabDark", tabDark);
|
map->insert("QmlDesignerTabDark", tabDark);
|
||||||
map->insert("QmlDesignerButtonColor", buttonColor);
|
map->insert("QmlDesignerButtonColor", buttonColor);
|
||||||
|
@@ -320,13 +320,13 @@ void DesignModeWidget::setup()
|
|||||||
connect(m_warningWidget.data(), &DocumentWarningWidget::gotoCodeClicked, [=]
|
connect(m_warningWidget.data(), &DocumentWarningWidget::gotoCodeClicked, [=]
|
||||||
(const QString &filePath, int codeLine, int codeColumn) {
|
(const QString &filePath, int codeLine, int codeColumn) {
|
||||||
Q_UNUSED(filePath);
|
Q_UNUSED(filePath);
|
||||||
|
|
||||||
|
QTC_ASSERT(textEditor(), return;);
|
||||||
QTC_ASSERT(textEditor()->textDocument()->filePath().toString() == filePath,
|
QTC_ASSERT(textEditor()->textDocument()->filePath().toString() == filePath,
|
||||||
qDebug() << Q_FUNC_INFO << textEditor()->textDocument()->filePath().toString() <<
|
qDebug() << Q_FUNC_INFO << textEditor()->textDocument()->filePath().toString() << filePath; );
|
||||||
filePath; );
|
textEditor()->gotoLine(codeLine, codeColumn);
|
||||||
textEditor()->gotoLine(codeLine, codeColumn);
|
Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
|
||||||
Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
|
});
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
QList<Core::SideBarItem*> sideBarItems;
|
QList<Core::SideBarItem*> sideBarItems;
|
||||||
QList<Core::SideBarItem*> leftSideBarItems;
|
QList<Core::SideBarItem*> leftSideBarItems;
|
||||||
|