forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/4.7'
Conflicts: qbs/modules/qtc/qtc.qbs qtcreator.pri Change-Id: I29916313f12e25f3942ac926f8e4d4490074978e
This commit is contained in:
@@ -54,8 +54,8 @@ include(qt-defines.qdocconf)
|
|||||||
sources.fileextensions = "*.qdoc"
|
sources.fileextensions = "*.qdoc"
|
||||||
|
|
||||||
qhp.projects = QtCreator
|
qhp.projects = QtCreator
|
||||||
qhp.QtCreator.file = $IDE_ID.qhp
|
qhp.QtCreator.file = qtcreator.qhp
|
||||||
qhp.QtCreator.namespace = org.qt-project.$IDE_ID.$QTC_VERSION_TAG
|
qhp.QtCreator.namespace = org.qt-project.qtcreator.$QTC_VERSION_TAG
|
||||||
qhp.QtCreator.virtualFolder = doc
|
qhp.QtCreator.virtualFolder = doc
|
||||||
qhp.QtCreator.indexTitle = $IDE_DISPLAY_NAME Manual $QTC_VERSION
|
qhp.QtCreator.indexTitle = $IDE_DISPLAY_NAME Manual $QTC_VERSION
|
||||||
qhp.QtCreator.filterAttributes = $IDE_ID $QTC_VERSION
|
qhp.QtCreator.filterAttributes = $IDE_ID $QTC_VERSION
|
||||||
|
@@ -570,44 +570,45 @@
|
|||||||
\row
|
\row
|
||||||
\li M203
|
\li M203
|
||||||
\li Warning
|
\li Warning
|
||||||
\li Imperative code is not supported in the Qt Quick Designer
|
\li Imperative code is not supported in the Design mode
|
||||||
\li
|
\li
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\li M204
|
\li M204
|
||||||
\li Warning
|
\li Warning
|
||||||
\li This QML type is not supported in the Qt Quick Designer
|
\li This QML type is not supported in the Design mode
|
||||||
\li
|
\li
|
||||||
\row
|
\row
|
||||||
\li M205
|
\li M205
|
||||||
\li Warning
|
\li Warning
|
||||||
\li Reference to parent QML type cannot be resolved correctly by the Qt
|
\li Reference to parent QML type cannot be resolved correctly by the
|
||||||
Quick Designer
|
Design mode
|
||||||
\li
|
\li
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\li M206
|
\li M206
|
||||||
\li Warning
|
\li Warning
|
||||||
\li This visual property binding cannot be evaluated in the local
|
\li This visual property binding cannot be evaluated in the local
|
||||||
context and might not show up in Qt Quick Designer as expected
|
context and might not show up in Design mode as expected
|
||||||
\li
|
\li
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\li M207
|
\li M207
|
||||||
\li Warning
|
\li Warning
|
||||||
\li Qt Quick Designer only supports states in the root QML type
|
\li Design mode only supports states in the root QML type
|
||||||
\li
|
\li
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\li M208
|
\li M208
|
||||||
\li Error
|
\li Error
|
||||||
\li This id might be ambiguous and is not supported in the \QMLD.
|
\li This id might be ambiguous and is not supported in the Design mode.
|
||||||
\li
|
\li
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\li M209
|
\li M209
|
||||||
\li Error
|
\li Error
|
||||||
\li This type (type name) is not supported as a root element by \QMLD.
|
\li This type (type name) is not supported as a root element in the
|
||||||
|
Design mode.
|
||||||
\li
|
\li
|
||||||
|
|
||||||
\row
|
\row
|
||||||
@@ -813,15 +814,15 @@
|
|||||||
instead of Qt Quick 2}.
|
instead of Qt Quick 2}.
|
||||||
|
|
||||||
You can see the error message when you move the mouse pointer over code that
|
You can see the error message when you move the mouse pointer over code that
|
||||||
\QC underlines in the code editor or when you open a QML file in the
|
\QC underlines in the code editor or when you open a QML file in the Design
|
||||||
\uicontrol Design mode.
|
mode.
|
||||||
|
|
||||||
To reset the code model, select \uicontrol Tools > \uicontrol {QML/JS} >
|
To reset the code model, select \uicontrol Tools > \uicontrol {QML/JS} >
|
||||||
\uicontrol {Reset Code Model}.
|
\uicontrol {Reset Code Model}.
|
||||||
|
|
||||||
If this does not help, try changing the QML emulation layer to the one that
|
If this does not help, try changing the QML emulation layer to the one that
|
||||||
was built with the same Qt version as the one selected in the build and run
|
was built with the same Qt version as the one selected in the build and run
|
||||||
kit. For more information, see \l{Running QML Modules in Qt Quick Designer}.
|
kit. For more information, see \l{Running QML Modules in Design Mode}.
|
||||||
|
|
||||||
\section1 Inspecting QML and JavaScript
|
\section1 Inspecting QML and JavaScript
|
||||||
|
|
||||||
@@ -2729,7 +2730,7 @@
|
|||||||
\image qtcreator-move-component-into-separate-file.png
|
\image qtcreator-move-component-into-separate-file.png
|
||||||
|
|
||||||
\li QML type name. This action is also available in the
|
\li QML type name. This action is also available in the
|
||||||
\uicontrol {Form Editor} in \QMLD.
|
\uicontrol {Form Editor} in the Design mode.
|
||||||
\row
|
\row
|
||||||
\li Split Initializer
|
\li Split Initializer
|
||||||
\li Reformats a one-line type into a multi-line type. For example,
|
\li Reformats a one-line type into a multi-line type. For example,
|
||||||
|
@@ -235,7 +235,7 @@
|
|||||||
select \uicontrol {GTest Filter} and specify the filter to use in the
|
select \uicontrol {GTest Filter} and specify the filter to use in the
|
||||||
\uicontrol {Active filter} field. For more information about GTest
|
\uicontrol {Active filter} field. For more information about GTest
|
||||||
filters, see
|
filters, see
|
||||||
\l{https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#running-a-subset-of-the-tests}
|
\l{https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#running-a-subset-of-the-tests}
|
||||||
{Running a Subset of the Tests}.
|
{Running a Subset of the Tests}.
|
||||||
|
|
||||||
\image qtcreator-autotests-options.png
|
\image qtcreator-autotests-options.png
|
||||||
|
@@ -539,7 +539,10 @@
|
|||||||
\li Ctrl+0
|
\li Ctrl+0
|
||||||
\endtable
|
\endtable
|
||||||
|
|
||||||
\section2 Qt Quick Designer Keyboard Shortcuts
|
\section2 Design Mode Keyboard Shortcuts
|
||||||
|
|
||||||
|
You can use the following keyboard shortcuts when editing QML files in the
|
||||||
|
Design mode.
|
||||||
|
|
||||||
\table
|
\table
|
||||||
\header
|
\header
|
||||||
|
@@ -152,8 +152,9 @@
|
|||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
For more information about the sidebar views that are only available in
|
For more information about the sidebar views that are only
|
||||||
\QMLD, see \l{Using Qt Quick Designer}.
|
available when editing QML files in the Design mode, see
|
||||||
|
\l{Editing QML Files in Design Mode}.
|
||||||
|
|
||||||
You can change the view of the sidebars in the following ways:
|
You can change the view of the sidebars in the following ways:
|
||||||
|
|
||||||
|
@@ -104,7 +104,7 @@
|
|||||||
|
|
||||||
\b {What should I do when \QC complains about missing OpenGL support?}
|
\b {What should I do when \QC complains about missing OpenGL support?}
|
||||||
|
|
||||||
Some parts of \QC, such as \QMLD and QML Profiler, use Qt Quick 2, which
|
Some parts of \QC, such as the Design mode and QML Profiler, use Qt Quick 2, which
|
||||||
relies on OpenGL API for drawing. Unfortunately, the use of OpenGL can cause
|
relies on OpenGL API for drawing. Unfortunately, the use of OpenGL can cause
|
||||||
problems, especially in remote setups and with outdated drivers. In these
|
problems, especially in remote setups and with outdated drivers. In these
|
||||||
cases, \QC displays OpenGL-related error messages on the console or records
|
cases, \QC displays OpenGL-related error messages on the console or records
|
||||||
|
@@ -36,6 +36,12 @@
|
|||||||
|
|
||||||
\title Acknowledgements
|
\title Acknowledgements
|
||||||
|
|
||||||
|
\section1 Credits
|
||||||
|
|
||||||
|
We would like to thank our contributors, who are listed in the \QC
|
||||||
|
\l{https://code.qt.io/cgit/qt-creator/qt-creator.git/tree/dist}{change logs}
|
||||||
|
for each release.
|
||||||
|
|
||||||
\section1 Third-party Components
|
\section1 Third-party Components
|
||||||
|
|
||||||
\QC contains the following third-party components:
|
\QC contains the following third-party components:
|
||||||
|
@@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
\li \l{Analyzing CPU Usage}{Performance Analyzer}
|
\li \l{Analyzing CPU Usage}{Performance Analyzer}
|
||||||
\li \l{Browsing ISO 7000 Icons} in \QMLD
|
\li \l{Browsing ISO 7000 Icons} in the Design mode
|
||||||
\li \l{http://doc.qt.io/QtForDeviceCreation/index.html}{Developing for
|
\li \l{http://doc.qt.io/QtForDeviceCreation/index.html}{Developing for
|
||||||
embedded devices}
|
embedded devices}
|
||||||
\li \l{http://doc.qt.io/qtcreator/creator-overview-qtasam.html}
|
\li \l{http://doc.qt.io/qtcreator/creator-overview-qtasam.html}
|
||||||
|
@@ -39,16 +39,16 @@
|
|||||||
|
|
||||||
\image creator_designinguserinterface.png
|
\image creator_designinguserinterface.png
|
||||||
|
|
||||||
\QC provides two integrated visual editors, \QMLD and \QD. The integration
|
\QC provides integrated visual editors for designing Qt Quick and
|
||||||
|
widget-based applications in the Design mode. The integration
|
||||||
includes project management and code completion.
|
includes project management and code completion.
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\li \l{Developing Qt Quick Applications}
|
\li \l{Developing Qt Quick Applications}
|
||||||
|
|
||||||
You can use wizards to create Qt Quick projects that contain
|
You can use wizards to create Qt Quick projects containing
|
||||||
boiler-plate code. You can use \QMLD to develop Qt Quick
|
boiler-plate code that you can edit in the Design mode.
|
||||||
applications in the \uicontrol Design mode.
|
|
||||||
|
|
||||||
\li \l{Developing Widget Based Applications}
|
\li \l{Developing Widget Based Applications}
|
||||||
|
|
||||||
|
@@ -149,11 +149,11 @@
|
|||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
\section1 Qt Quick Designer Issues
|
\section1 Design Mode Issues
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\li \QMLD uses a QML emulation layer (QML Puppet) to render and preview
|
\li The Design mode uses a QML emulation layer (QML Puppet) to render and preview
|
||||||
images and to collect data. Executing C++ code might cause the QML
|
images and to collect data. Executing C++ code might cause the QML
|
||||||
emulation layer to crash. If it crashes, an error message is displayed and
|
emulation layer to crash. If it crashes, an error message is displayed and
|
||||||
you can continue editing the QML file in the code editor.
|
you can continue editing the QML file in the code editor.
|
||||||
|
@@ -64,7 +64,8 @@
|
|||||||
\l{Managing Projects}.
|
\l{Managing Projects}.
|
||||||
\li \b {\l{Designing User Interfaces}}
|
\li \b {\l{Designing User Interfaces}}
|
||||||
|
|
||||||
\QC provides two integrated visual editors, \QMLD and \QD.
|
\QC provides integrated visual editors for creating Qt Quick and
|
||||||
|
widget-based applications in the Design mode.
|
||||||
To create intuitive, modern-looking, fluid user interfaces, you
|
To create intuitive, modern-looking, fluid user interfaces, you
|
||||||
can use \l{Qt Quick}.
|
can use \l{Qt Quick}.
|
||||||
If you need a traditional user interface that is clearly
|
If you need a traditional user interface that is clearly
|
||||||
|
@@ -47,7 +47,7 @@
|
|||||||
|
|
||||||
\li \l{Creating a Qt Quick Application}
|
\li \l{Creating a Qt Quick Application}
|
||||||
|
|
||||||
Learn how to use \QMLD to create a Qt Quick application.
|
Learn how to use the Design mode to create a Qt Quick application.
|
||||||
|
|
||||||
\li \l{Creating a Qt Widget Based Application}
|
\li \l{Creating a Qt Widget Based Application}
|
||||||
|
|
||||||
|
@@ -90,7 +90,7 @@
|
|||||||
files, as defined by the wizard.
|
files, as defined by the wizard.
|
||||||
|
|
||||||
For example, if you choose to create a Qt Quick application, \QC generates a
|
For example, if you choose to create a Qt Quick application, \QC generates a
|
||||||
QML file that you can modify with the integrated \QMLD.
|
QML file that you can modify in the Design mode.
|
||||||
|
|
||||||
\section1 Selecting Project Type
|
\section1 Selecting Project Type
|
||||||
|
|
||||||
|
@@ -39,9 +39,9 @@
|
|||||||
|
|
||||||
\image creator_managingprojects.png
|
\image creator_managingprojects.png
|
||||||
|
|
||||||
One of the major advantages of \QC is that it allows a team of developers
|
One of the major advantages of \QC is that it allows a team of designers and
|
||||||
to share a project across different development platforms with a common tool
|
developers to share a project across different development platforms with a
|
||||||
for development and debugging.
|
common tool for design, development, and debugging.
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
@@ -55,21 +55,14 @@
|
|||||||
\li \l{Using Version Control Systems}
|
\li \l{Using Version Control Systems}
|
||||||
|
|
||||||
The recommended way to set up a project is to use a version control
|
The recommended way to set up a project is to use a version control
|
||||||
system. Store and edit only project source files and build system
|
system. Store and edit only project source files and configuration
|
||||||
configuration files (for example, .pro and .pri files for qmake).
|
files. Do not store generated files.
|
||||||
Do not store files generated by the build system or \QC, such as
|
|
||||||
makefiles, .pro.user, and object files.
|
|
||||||
|
|
||||||
\li \l{Configuring Projects}
|
\li \l{Configuring Projects}
|
||||||
|
|
||||||
\QC allows you to specify separate build settings for each
|
Installation programs and project wizards create default
|
||||||
development platform. By default, \l{glossary-shadow-build}
|
configurations for \QC and your projects. You can modify
|
||||||
{shadow builds} are used to keep the build specific files separate
|
the settings in the Projects mode.
|
||||||
from the source. You can create separate versions of project files
|
|
||||||
to keep platform-dependent code separate. You can use qmake
|
|
||||||
\l{Adding Platform Specific Source Files}
|
|
||||||
{scopes} to select the file to process depending on which platform
|
|
||||||
qmake is run on.
|
|
||||||
|
|
||||||
\li \l{Managing Sessions}
|
\li \l{Managing Sessions}
|
||||||
|
|
||||||
|
@@ -75,6 +75,11 @@
|
|||||||
\uicontrol General, and enter a period (.) in the
|
\uicontrol General, and enter a period (.) in the
|
||||||
\uicontrol {Default build directory} field.
|
\uicontrol {Default build directory} field.
|
||||||
|
|
||||||
|
You can create separate versions of project files to keep platform-dependent
|
||||||
|
code separate. You can use qmake \l{Adding Platform Specific Source Files}
|
||||||
|
{scopes} to select the file to process depending on which platform qmake is
|
||||||
|
run on.
|
||||||
|
|
||||||
\include creator-projects-cmake-building.qdocinc cmake build configuration
|
\include creator-projects-cmake-building.qdocinc cmake build configuration
|
||||||
|
|
||||||
\section1 Starting External Processes
|
\section1 Starting External Processes
|
||||||
|
@@ -87,9 +87,16 @@
|
|||||||
\list
|
\list
|
||||||
\li \l {Creating Qt Quick Projects}
|
\li \l {Creating Qt Quick Projects}
|
||||||
\li \l {Qt Quick UI Forms}
|
\li \l {Qt Quick UI Forms}
|
||||||
\li \l {Using Qt Quick Designer}
|
\li \l {Editing QML Files in Design Mode}
|
||||||
\li \l {Editing PathView Properties}
|
\li \l {Editing PathView Properties}
|
||||||
\li \l {Adding Connections}
|
\li \l {Adding Connections}
|
||||||
|
\list
|
||||||
|
\li \l{Connecting Objects to Signals}
|
||||||
|
\li \l{Specifying Dynamic Properties}
|
||||||
|
\li \l{Adding Bindings Between Properties}
|
||||||
|
\li \l{Managing C++ Backend Objects}
|
||||||
|
\endlist
|
||||||
|
\li \l {Adding States}
|
||||||
\li \l {Creating Components}
|
\li \l {Creating Components}
|
||||||
\li \l {Creating Buttons}
|
\li \l {Creating Buttons}
|
||||||
\li \l {Creating Scalable Buttons and Borders}
|
\li \l {Creating Scalable Buttons and Borders}
|
||||||
|
@@ -133,5 +133,8 @@
|
|||||||
You can also join the \QC mailing list at:
|
You can also join the \QC mailing list at:
|
||||||
\l{http://lists.qt-project.org/mailman/listinfo/}
|
\l{http://lists.qt-project.org/mailman/listinfo/}
|
||||||
{lists.qt-project.org Mailing Lists}.
|
{lists.qt-project.org Mailing Lists}.
|
||||||
|
|
||||||
|
For credits and a list of third-party libraries, see
|
||||||
|
\l {Acknowledgements}.
|
||||||
\endtable
|
\endtable
|
||||||
*/
|
*/
|
||||||
|
@@ -78,12 +78,12 @@
|
|||||||
The image appears in \uicontrol Resources. You can also use any other
|
The image appears in \uicontrol Resources. You can also use any other
|
||||||
image or a QML type, instead.
|
image or a QML type, instead.
|
||||||
|
|
||||||
To create the UI in the \uicontrol Design mode:
|
To create the UI in the Design mode:
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
\li In the \uicontrol Projects view, double-click the \e Page1Form.ui.qml
|
\li In the \uicontrol Projects view, double-click the \e Page1Form.ui.qml
|
||||||
file to open it in \QMLD.
|
file to open it in the Design mode.
|
||||||
|
|
||||||
\li In the \uicontrol Navigator, select \uicontrol Label and press
|
\li In the \uicontrol Navigator, select \uicontrol Label and press
|
||||||
\key Delete to delete it.
|
\key Delete to delete it.
|
||||||
@@ -119,7 +119,8 @@
|
|||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
We want to modify the properties of the bubble in ways that are not
|
We want to modify the properties of the bubble in ways that are not
|
||||||
supported by \QMLD, and therefore we create a custom QML type for it:
|
supported in the Design mode, and therefore we create a custom QML
|
||||||
|
type for it:
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
|
@@ -50,10 +50,10 @@
|
|||||||
(.ui.qml files). The forms use a purely declarative subset of the
|
(.ui.qml files). The forms use a purely declarative subset of the
|
||||||
QML language and you can edit them in the Design mode.
|
QML language and you can edit them in the Design mode.
|
||||||
|
|
||||||
\li \l {Using Qt Quick Designer}
|
\li \l {Editing QML Files in Design Mode}
|
||||||
|
|
||||||
You can use the \uicontrol {Form Editor} or the
|
You can use the \uicontrol {Form Editor} or the
|
||||||
\uicontrol {Text Editor} of \QMLD in the \uicontrol Design mode to
|
\uicontrol {Text Editor} in the Design mode to
|
||||||
develop Qt Quick applications.
|
develop Qt Quick applications.
|
||||||
|
|
||||||
\li \l {Editing PathView Properties}
|
\li \l {Editing PathView Properties}
|
||||||
|
@@ -48,8 +48,8 @@
|
|||||||
|
|
||||||
\image qmldesigner-tutorial.png "States and transitions example"
|
\image qmldesigner-tutorial.png "States and transitions example"
|
||||||
|
|
||||||
For more information about using \QMLD, see
|
For more information about developing Qt Quick applications in the Design
|
||||||
\l{Developing Qt Quick Applications}.
|
mode, see \l{Developing Qt Quick Applications}.
|
||||||
|
|
||||||
For examples of using Qt Quick Controls 2, see
|
For examples of using Qt Quick Controls 2, see
|
||||||
\l{Qt Quick Controls 2 Examples}.
|
\l{Qt Quick Controls 2 Examples}.
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
\li In the \uicontrol Projects view, double-click the \e Page1Form.ui.qml
|
\li In the \uicontrol Projects view, double-click the \e Page1Form.ui.qml
|
||||||
file to open it in \QMLD.
|
file to open it in the Design mode.
|
||||||
|
|
||||||
\image qmldesigner-tutorial-design-mode.png "Transitions project in Design Mode"
|
\image qmldesigner-tutorial-design-mode.png "Transitions project in Design Mode"
|
||||||
|
|
||||||
|
@@ -32,7 +32,7 @@
|
|||||||
/*!
|
/*!
|
||||||
|
|
||||||
\contentspage {Qt Creator Manual}
|
\contentspage {Qt Creator Manual}
|
||||||
\previouspage qmldesigner-connections.html
|
\previouspage quick-states.html
|
||||||
\page quick-components.html
|
\page quick-components.html
|
||||||
\nextpage quick-buttons.html
|
\nextpage quick-buttons.html
|
||||||
|
|
||||||
@@ -92,13 +92,13 @@
|
|||||||
|
|
||||||
Qt Quick Controls 2 achieve improved efficiency by employing a simplified
|
Qt Quick Controls 2 achieve improved efficiency by employing a simplified
|
||||||
\l {Styling Qt Quick Controls 2}{styling architecture} when compared to
|
\l {Styling Qt Quick Controls 2}{styling architecture} when compared to
|
||||||
Qt Quick Controls, on which the module is based. \QMLD reads the
|
Qt Quick Controls, on which the module is based. The visual editor reads the
|
||||||
\c qtquickcontrols2.conf file that specifies the preferred style and some
|
\c qtquickcontrols2.conf file that specifies the preferred style and some
|
||||||
style-specific arguments. To change the style, select another style from
|
style-specific arguments. To change the style, select another style from
|
||||||
the list on the toolbar. This enables you to check how your UI looks when
|
the list on the toolbar. This enables you to check how your UI looks when
|
||||||
using the available styles.
|
using the available styles.
|
||||||
|
|
||||||
For an example of defining your own style and using it in \QMLD, see
|
For an example of defining your own style and using it in the Design mode, see
|
||||||
\l {Qt Quick Controls 2 - Flat Style}.
|
\l {Qt Quick Controls 2 - Flat Style}.
|
||||||
|
|
||||||
Qt Quick Controls 2 work in conjunction with Qt Quick and Qt Quick Layouts.
|
Qt Quick Controls 2 work in conjunction with Qt Quick and Qt Quick Layouts.
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
Some ready-made controls, such as a gauge, dial, status indicator, and
|
Some ready-made controls, such as a gauge, dial, status indicator, and
|
||||||
tumbler, are provided by the \l {Qt Quick Extras} module.
|
tumbler, are provided by the \l {Qt Quick Extras} module.
|
||||||
|
|
||||||
\section1 Creating Components in Qt Quick Designer
|
\section1 Creating Components in Design Mode
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@
|
|||||||
the \uicontrol Library only if the filename begins with a capital
|
the \uicontrol Library only if the filename begins with a capital
|
||||||
letter.
|
letter.
|
||||||
|
|
||||||
\li Click \uicontrol Design to open the .qml file in \QMLD.
|
\li Click \uicontrol Design to open the .qml file in the Design mode.
|
||||||
|
|
||||||
\li Drag and drop a QML type from the \uicontrol Library to the
|
\li Drag and drop a QML type from the \uicontrol Library to the
|
||||||
\uicontrol Navigator or \uicontrol {Form Editor}.
|
\uicontrol Navigator or \uicontrol {Form Editor}.
|
||||||
|
74
doc/src/qtquick/qtquick-connection-editor-backend.qdoc
Normal file
74
doc/src/qtquick/qtquick-connection-editor-backend.qdoc
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Creator documentation.
|
||||||
|
**
|
||||||
|
** 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 Free Documentation License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Free
|
||||||
|
** Documentation License version 1.3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file included in the packaging of
|
||||||
|
** this file. Please review the following information to ensure
|
||||||
|
** the GNU Free Documentation License version 1.3 requirements
|
||||||
|
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\contentspage {Qt Creator Manual}
|
||||||
|
\previouspage quick-property-bindings.html
|
||||||
|
\page quick-connections-backend.html
|
||||||
|
\nextpage quick-states.html
|
||||||
|
|
||||||
|
\title Managing C++ Backend Objects
|
||||||
|
|
||||||
|
Many applications provide QObject objects implemented in C++ that work as a
|
||||||
|
bridge between QML and C++. Such objects are typically registered with
|
||||||
|
\c qmlRegisterType or \c qmlRegisterSingletonType and then used by QML to
|
||||||
|
communicate with the C++ backend. Another example of such objects are the
|
||||||
|
state machines created by the \l {Using the Qt SCXML Compiler (qscxmlc)}
|
||||||
|
{Qt SCXML Compiler}.
|
||||||
|
|
||||||
|
Backend objects in a QML file are accessible if the QML file contains the
|
||||||
|
required imports. In addition, for a non-singleton QObject, a dynamic
|
||||||
|
property that contains the QObject must be specified.
|
||||||
|
|
||||||
|
A \e local QObject is instantiated in the current \e .qml file, as follows:
|
||||||
|
|
||||||
|
\badcode
|
||||||
|
property MyType myType: MyType {}.
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
Otherwise the property is just defined, as follows:
|
||||||
|
|
||||||
|
\badcode
|
||||||
|
property MyType myType
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
To manage backend objects:
|
||||||
|
|
||||||
|
\list 1
|
||||||
|
|
||||||
|
\li In the \uicontrol {Connections} view, select the
|
||||||
|
\uicontrol Backends tab to view accessible backend objects.
|
||||||
|
\image qmldesigner-backends.png
|
||||||
|
\li Select the \inlineimage plus.png
|
||||||
|
(\uicontrol Add) button to add a backend object in the
|
||||||
|
\uicontrol {Add New C++ Backend} dialog.
|
||||||
|
\li In the \uicontrol Type field, select the type of the backend QObject
|
||||||
|
to add.
|
||||||
|
\li Select the \uicontrol {Define object locally} check box if the
|
||||||
|
QObject is not registered as a singleton.
|
||||||
|
\li Select \uicontrol OK to add the required import and to create the
|
||||||
|
property for a non-singleton object.
|
||||||
|
\endlist
|
||||||
|
*/
|
65
doc/src/qtquick/qtquick-connection-editor-bindings.qdoc
Normal file
65
doc/src/qtquick/qtquick-connection-editor-bindings.qdoc
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Creator documentation.
|
||||||
|
**
|
||||||
|
** 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 Free Documentation License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Free
|
||||||
|
** Documentation License version 1.3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file included in the packaging of
|
||||||
|
** this file. Please review the following information to ensure
|
||||||
|
** the GNU Free Documentation License version 1.3 requirements
|
||||||
|
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\contentspage {Qt Creator Manual}
|
||||||
|
\previouspage quick-dynamic-properties.html
|
||||||
|
\page quick-property-bindings.html
|
||||||
|
\nextpage quick-connections-backend.html
|
||||||
|
|
||||||
|
\title Adding Bindings Between Properties
|
||||||
|
|
||||||
|
To dynamically change the behavior of an object, you can create a \e binding
|
||||||
|
between the properties of two objects. To create a property binding, a
|
||||||
|
property is assigned a JavaScript expression that evaluates to the desired
|
||||||
|
value. At its simplest, a binding may be a reference to another property.
|
||||||
|
For example, the height of an object can be bound to the height of its
|
||||||
|
parent, so that when the parent height changes, the object height is
|
||||||
|
adjusted automatically.
|
||||||
|
|
||||||
|
For more information about the use of property bindings, see
|
||||||
|
\l{Property Binding}.
|
||||||
|
|
||||||
|
You can create bindings between objects in the \uicontrol Connections view.
|
||||||
|
|
||||||
|
\image qmldesigner-bindings.png
|
||||||
|
|
||||||
|
To bind a property of an object to the property of another object:
|
||||||
|
|
||||||
|
\list 1
|
||||||
|
\li In the \uicontrol {Connections} view, select the
|
||||||
|
\uicontrol {Bindings} tab.
|
||||||
|
\li Select the \inlineimage plus.png
|
||||||
|
(\uicontrol Add) button to add a binding.
|
||||||
|
\li Select \uicontrol Item to select the target object whose property
|
||||||
|
you want to change dynamically.
|
||||||
|
\li Select \uicontrol Property to select the property to bind to a
|
||||||
|
source property.
|
||||||
|
\li Select \uicontrol {Source Item} to select the object whose property
|
||||||
|
you want to use to determine the behavior of the target object.
|
||||||
|
\li Select \uicontrol {Source Property} to select the property to bind
|
||||||
|
the target property to.
|
||||||
|
\endlist
|
||||||
|
*/
|
58
doc/src/qtquick/qtquick-connection-editor-properties.qdoc
Normal file
58
doc/src/qtquick/qtquick-connection-editor-properties.qdoc
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Creator documentation.
|
||||||
|
**
|
||||||
|
** 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 Free Documentation License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Free
|
||||||
|
** Documentation License version 1.3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file included in the packaging of
|
||||||
|
** this file. Please review the following information to ensure
|
||||||
|
** the GNU Free Documentation License version 1.3 requirements
|
||||||
|
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\contentspage {Qt Creator Manual}
|
||||||
|
\previouspage qmldesigner-connections.html
|
||||||
|
\page quick-dynamic-properties.html
|
||||||
|
\nextpage quick-property-bindings.html
|
||||||
|
|
||||||
|
\title Specifying Dynamic Properties
|
||||||
|
|
||||||
|
You can bind object properties to dynamic expressions to define global
|
||||||
|
properties for an object that can be read by other objects. For example,
|
||||||
|
you can specify global properties for the root object that you can use in
|
||||||
|
the child objects.
|
||||||
|
|
||||||
|
You can specify dynamic properties for objects in the
|
||||||
|
\uicontrol Connections view.
|
||||||
|
|
||||||
|
\image qmldesigner-dynamicprops.png
|
||||||
|
|
||||||
|
To specify dynamic properties for an object:
|
||||||
|
|
||||||
|
\list 1
|
||||||
|
\li In the \uicontrol {Connections} view, select the
|
||||||
|
\uicontrol {Properties} tab.
|
||||||
|
\li Select \uicontrol Item to select the object to specify the property
|
||||||
|
for.
|
||||||
|
\li Select \uicontrol Property to give a name to the property.
|
||||||
|
\li Select \uicontrol {Property Type} to specify the type of the
|
||||||
|
property.
|
||||||
|
\li Select \uicontrol {Property Value} to specify the value of the
|
||||||
|
property.
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
*/
|
71
doc/src/qtquick/qtquick-connection-editor-signals.qdoc
Normal file
71
doc/src/qtquick/qtquick-connection-editor-signals.qdoc
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Creator documentation.
|
||||||
|
**
|
||||||
|
** 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 Free Documentation License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Free
|
||||||
|
** Documentation License version 1.3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file included in the packaging of
|
||||||
|
** this file. Please review the following information to ensure
|
||||||
|
** the GNU Free Documentation License version 1.3 requirements
|
||||||
|
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\contentspage {Qt Creator Manual}
|
||||||
|
\previouspage qmldesigner-connections.html
|
||||||
|
\page quick-signals.html
|
||||||
|
\nextpage quick-dynamic-properties.html
|
||||||
|
|
||||||
|
\title Connecting Objects to Signals
|
||||||
|
|
||||||
|
To receive a notification when a particular signal is emitted for a
|
||||||
|
particular object, the object definition should declare a signal handler
|
||||||
|
named \e {on<Signal>} where \e {<Signal>} is the name of the signal, with
|
||||||
|
the first letter capitalized. The signal handler should contain the
|
||||||
|
JavaScript code to be executed when the signal handler is invoked.
|
||||||
|
|
||||||
|
QML types have predefined signals that are emitted when users interact with
|
||||||
|
the application. For example, the \l MouseArea type from the \l QtQuick
|
||||||
|
module has a \c clicked signal that is emitted whenever the mouse is
|
||||||
|
clicked within the area. Since the signal name is \c clicked, the signal
|
||||||
|
handler for receiving this signal is named \c onClicked.
|
||||||
|
|
||||||
|
For more information about signals and signal handlers, see
|
||||||
|
\l{Signal and Handler Event System}.
|
||||||
|
|
||||||
|
To access a signal outside of the object that emits it, you can use the
|
||||||
|
\l Connections type for connecting to signals of arbitrary objects. A
|
||||||
|
connections object can receive any signal from its specified target.
|
||||||
|
You can connect objects to signals that are available to them in the
|
||||||
|
\uicontrol Connections view.
|
||||||
|
|
||||||
|
\image qmldesigner-connections.png
|
||||||
|
|
||||||
|
To connect objects to signals:
|
||||||
|
|
||||||
|
\list 1
|
||||||
|
\li In the \uicontrol {Connections} view, select the
|
||||||
|
\uicontrol {Connections} tab.
|
||||||
|
\li Select the \inlineimage plus.png
|
||||||
|
(\uicontrol Add) button to add a connection.
|
||||||
|
\li Select \uicontrol Target to add the object to connect to a signal.
|
||||||
|
\li Select \uicontrol {Signal Handler} to select the signal that the
|
||||||
|
connection will listen to from a list of all signals available for
|
||||||
|
the object.
|
||||||
|
\li Select \uicontrol Actions to specify the action to perform when
|
||||||
|
the signal is emitted. You use JavaScript to specify the actions.
|
||||||
|
\endlist
|
||||||
|
*/
|
@@ -27,153 +27,45 @@
|
|||||||
\contentspage {Qt Creator Manual}
|
\contentspage {Qt Creator Manual}
|
||||||
\previouspage qmldesigner-pathview-editor.html
|
\previouspage qmldesigner-pathview-editor.html
|
||||||
\page qmldesigner-connections.html
|
\page qmldesigner-connections.html
|
||||||
\nextpage quick-components.html
|
\nextpage quick-signals.html
|
||||||
|
|
||||||
\title Adding Connections
|
\title Adding Connections
|
||||||
|
|
||||||
You can use the \uicontrol {Connections} view to:
|
The user interface components and the application need to communicate with
|
||||||
|
each other. For example, a button needs to know that the user has clicked
|
||||||
|
on it. The button may then change color to indicate its state or perform an
|
||||||
|
action. Further, the application needs to know whether the user is clicking
|
||||||
|
the button, because it may need to relay this clicking event to other
|
||||||
|
applications.
|
||||||
|
|
||||||
|
QML has a signal and handler mechanism, that enables components to respond
|
||||||
|
to application events. Events are represented by \e signals. When a signal
|
||||||
|
is emitted, the corresponding \e {signal handler} is invoked to respond to
|
||||||
|
the event by using scripts or other operations placed in the handler.
|
||||||
|
|
||||||
|
To access a signal outside of the object that emits it, you can use the
|
||||||
|
\l Connections type for connecting to signals of arbitrary objects. A
|
||||||
|
Connections object can receive any signal from its specified target.
|
||||||
|
|
||||||
|
A component's property can be assigned a static value which stays constant
|
||||||
|
until it is explicitly assigned a new value. However, to make the fullest
|
||||||
|
use of QML and its built-in support for dynamic object behaviors, most QML
|
||||||
|
types use property bindings. This means that you can specify relationships
|
||||||
|
between different object properties so that when a property's sependencies
|
||||||
|
change in value, the property's value is automatically updated accordingly.
|
||||||
|
|
||||||
|
Behind the scenes, the QML engine monitors the property's dependencies (that
|
||||||
|
is, the variables in the binding expression). When a change is detected, the
|
||||||
|
QML engine re-evaluates the binding expression and applies the new result to
|
||||||
|
the property.
|
||||||
|
|
||||||
|
The following sections describe how to use the \uicontrol {Connections} view
|
||||||
|
to perform the following tasks:
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
\li \l{Connecting Objects to Signals}
|
||||||
\li Connect objects to signals.
|
\li \l{Specifying Dynamic Properties}
|
||||||
|
\li \l{Adding Bindings Between Properties}
|
||||||
\li Specify dynamic properties for objects.
|
\li \l{Managing C++ Backend Objects}
|
||||||
|
|
||||||
\li Create bindings between the properties of two objects.
|
|
||||||
|
|
||||||
\li Manage backend QObjects.
|
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
For examples of adding connections, see
|
|
||||||
\l{Creating Scalable Buttons and Borders}.
|
|
||||||
|
|
||||||
\section1 Connecting Objects to Signals
|
|
||||||
|
|
||||||
To connect objects to signals in QML, create \l{Connections} objects.
|
|
||||||
|
|
||||||
\image qmldesigner-connections.png
|
|
||||||
|
|
||||||
To create the connections:
|
|
||||||
|
|
||||||
\list 1
|
|
||||||
|
|
||||||
\li Select the \uicontrol {Connections} tab.
|
|
||||||
|
|
||||||
\li Select the \inlineimage plus.png
|
|
||||||
(\uicontrol Add) button to add a connection.
|
|
||||||
|
|
||||||
\li Select \uicontrol Target to add the object to connect to a signal.
|
|
||||||
|
|
||||||
\li Select \uicontrol {Signal Handler} to select the signal that the connection
|
|
||||||
will listen to from a list of all signals available for the object.
|
|
||||||
|
|
||||||
\li Select \uicontrol Actions to specify the action to perform when
|
|
||||||
the signal is emitted. You use JavaScript to specify the actions.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
\section1 Specifying Dynamic Properties
|
|
||||||
|
|
||||||
You can bind \l{Properties} to dynamic expressions to define global properties for an
|
|
||||||
object that can be read by other objects. For example, you can specify
|
|
||||||
global properties for the root object that you can use in the child objects.
|
|
||||||
|
|
||||||
\image qmldesigner-dynamicprops.png
|
|
||||||
|
|
||||||
To specify dynamic properties for an object:
|
|
||||||
|
|
||||||
\list 1
|
|
||||||
|
|
||||||
\li Select the \uicontrol {Properties} tab.
|
|
||||||
|
|
||||||
\li Select \uicontrol Item to select the object to specify the property for.
|
|
||||||
|
|
||||||
\li Select \uicontrol Property to give a name to the property.
|
|
||||||
|
|
||||||
\li Select \uicontrol {Property Type} to specify the type of the property.
|
|
||||||
|
|
||||||
\li Select \uicontrol {Property Value} to specify the value of the property.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
\section1 Adding Bindings Between Properties
|
|
||||||
|
|
||||||
To dynamically change the behavior of an object, you can create a
|
|
||||||
\l{Property Binding} between the properties of two objects.
|
|
||||||
|
|
||||||
\image qmldesigner-bindings.png
|
|
||||||
|
|
||||||
To bind a property of an object to the property of another object:
|
|
||||||
|
|
||||||
\list 1
|
|
||||||
|
|
||||||
\li Select the \uicontrol {Bindings} tab.
|
|
||||||
|
|
||||||
\li Select the \inlineimage plus.png
|
|
||||||
(\uicontrol Add) button to add a binding.
|
|
||||||
|
|
||||||
\li Select \uicontrol Item to select the target object whose property you want
|
|
||||||
to change dynamically.
|
|
||||||
|
|
||||||
\li Select \uicontrol Property to select the property to bind to a source
|
|
||||||
property.
|
|
||||||
|
|
||||||
\li Select \uicontrol {Source Item} to select the object whose property you
|
|
||||||
want to use to determine the behavior of the target object.
|
|
||||||
|
|
||||||
\li Select \uicontrol {Source Property} to select the property to bind the
|
|
||||||
target property to.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
\section1 Managing C++ Backend Objects
|
|
||||||
|
|
||||||
Many applications provide QObject objects implemented in C++ that work as a
|
|
||||||
bridge between QML and C++. Such objects are typically registered with
|
|
||||||
qmlRegisterType or qmlRegisterSingletonType and then used by QML to
|
|
||||||
communicate with the C++ backend. Another example of such objects are the
|
|
||||||
state machines created by the \l {Using the Qt SCXML Compiler (qscxmlc)}
|
|
||||||
{Qt SCXML Compiler}.
|
|
||||||
|
|
||||||
Backend objects in a QML file are accessible if the QML file contains the
|
|
||||||
required imports. In addition, for a non-singleton QObject, a dynamic
|
|
||||||
property that contains the QObject must be specified.
|
|
||||||
|
|
||||||
A \e local QObject is instantiated in the current \e .qml file, as follows:
|
|
||||||
|
|
||||||
\badcode
|
|
||||||
property MyType myType: MyType {}.
|
|
||||||
\endcode
|
|
||||||
|
|
||||||
Otherwise the property is just defined, as follows:
|
|
||||||
|
|
||||||
\badcode
|
|
||||||
property MyType myType
|
|
||||||
\endcode
|
|
||||||
|
|
||||||
To manage backend objects:
|
|
||||||
|
|
||||||
\list 1
|
|
||||||
|
|
||||||
\li Select the \uicontrol Backends tab to view accessible backend
|
|
||||||
objects.
|
|
||||||
|
|
||||||
\image qmldesigner-backends.png
|
|
||||||
|
|
||||||
\li Select the \inlineimage plus.png
|
|
||||||
(\uicontrol Add) button to add a backend object in the
|
|
||||||
\uicontrol {Add New C++ Backend} dialog.
|
|
||||||
|
|
||||||
\li In the \uicontrol Type field, select the type of the backend QObject
|
|
||||||
to add.
|
|
||||||
|
|
||||||
\li Select the \uicontrol {Define object locally} check box if the
|
|
||||||
QObject is not registered as a singleton.
|
|
||||||
|
|
||||||
\li Select \uicontrol OK to add the required import and to create the
|
|
||||||
property for a non-singleton object.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -137,7 +137,8 @@
|
|||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
\QC generates a QML file, \e main.qml, that you can modify in \QMLD.
|
\QC generates a QML file, \e main.qml, that you can modify in the Design
|
||||||
|
mode.
|
||||||
|
|
||||||
\section1 Creating Qt Quick Controls 2 Applications
|
\section1 Creating Qt Quick Controls 2 Applications
|
||||||
|
|
||||||
@@ -184,11 +185,11 @@
|
|||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
For the Scroll application, \QC creates a QML file, \e main.qml, that you
|
For the Scroll application, \QC creates a QML file, \e main.qml, that you
|
||||||
can modify in \QMLD.
|
can modify in the Design mode.
|
||||||
|
|
||||||
For the Stack and Swipe applications, \QC generates two UI files,
|
For the Stack and Swipe applications, \QC generates two UI files,
|
||||||
\e Page1Form.ui.qml and \e Page2Form.ui.qml, that you can modify in the
|
\e Page1Form.ui.qml and \e Page2Form.ui.qml, that you can modify in the
|
||||||
\QMLD \uicontrol {Form Editor} and a QML file, \e main.qml, that you can
|
\uicontrol {Form Editor} and a QML file, \e main.qml, that you can
|
||||||
modify in the \uicontrol {Text Editor} to add the application logic.
|
modify in the \uicontrol {Text Editor} to add the application logic.
|
||||||
|
|
||||||
\section1 Creating Qt Quick UI Projects
|
\section1 Creating Qt Quick UI Projects
|
||||||
|
@@ -35,16 +35,16 @@
|
|||||||
\page creator-using-qt-quick-designer.html
|
\page creator-using-qt-quick-designer.html
|
||||||
\nextpage qmldesigner-pathview-editor.html
|
\nextpage qmldesigner-pathview-editor.html
|
||||||
|
|
||||||
\title Using Qt Quick Designer
|
\title Editing QML Files in Design Mode
|
||||||
|
|
||||||
You can edit \l{Qt Quick UI Forms} (ui.qml files) in \QMLD. \QC opens the
|
\QC opens \l{Qt Quick UI Forms}{UI forms} (ui.qml files) in the
|
||||||
UI forms in the \uicontrol {Form Editor} tab in the \uicontrol Design mode.
|
\uicontrol {Form Editor} tab in the Design mode. It is
|
||||||
It is recommended that you use UI forms for components that you want to
|
recommended that you use UI forms for components that you want to
|
||||||
design in \QMLD.
|
edit in the Design mode.
|
||||||
|
|
||||||
\image qmldesigner-visual-editor.png "Visual editor"
|
\image qmldesigner-visual-editor.png "Visual editor"
|
||||||
|
|
||||||
Use \QMLD to manage your project:
|
To manage your project in the Design mode:
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
\li \uicontrol {State} pane (6) displays the different states of the item.
|
\li \uicontrol {State} pane (6) displays the different states of the item.
|
||||||
QML states typically describe user interface configurations, such as
|
QML states typically describe user interface configurations, such as
|
||||||
the UI controls, their properties and behavior and the available
|
the UI controls, their properties and behavior and the available
|
||||||
actions.
|
actions. For more information, see \l{Adding States}.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
@@ -170,9 +170,9 @@
|
|||||||
|
|
||||||
\section2 Switching Parent Items
|
\section2 Switching Parent Items
|
||||||
|
|
||||||
When you drag and drop instances of QML types to the canvas, Qt Quick Designer
|
When you drag and drop instances of QML types to the canvas, the new item
|
||||||
adds the new item as a child of the item beneath it.
|
is added as a child of the item beneath it. When you move items on the
|
||||||
When you move items on the canvas, Qt Quick Designer cannot determine
|
canvas, it is not possible to determine
|
||||||
whether you want to adjust their position or attach them to a new
|
whether you want to adjust their position or attach them to a new
|
||||||
parent item. Therefore, the parent item is not automatically
|
parent item. Therefore, the parent item is not automatically
|
||||||
changed. To change the parent of the item, press down the \key Shift
|
changed. To change the parent of the item, press down the \key Shift
|
||||||
@@ -307,7 +307,7 @@
|
|||||||
|
|
||||||
If you use text IDs instead of plain text, change the default call to
|
If you use text IDs instead of plain text, change the default call to
|
||||||
\c qsTrId(). Select \uicontrol Tools > \uicontrol Options >
|
\c qsTrId(). Select \uicontrol Tools > \uicontrol Options >
|
||||||
\uicontrol {Qt Quick} > \uicontrol {Qt Quick Designer}, and then select the
|
\uicontrol {Qt Quick} > \uicontrol {\QMLD}, and then select the
|
||||||
\uicontrol {qsTrId()} radio button in the \uicontrol Internationalization
|
\uicontrol {qsTrId()} radio button in the \uicontrol Internationalization
|
||||||
group. For more information about text ID based translations, see
|
group. For more information about text ID based translations, see
|
||||||
\l {Qt Linguist Manual: Text ID Based Translations}.
|
\l {Qt Linguist Manual: Text ID Based Translations}.
|
||||||
@@ -321,19 +321,20 @@
|
|||||||
|
|
||||||
\section2 Loading Placeholder Data
|
\section2 Loading Placeholder Data
|
||||||
|
|
||||||
\QMLD supports views, models, and delegates, so that when you add a Grid
|
The Design mode supports views, models, and delegates, so that when you add
|
||||||
View, List View, or Path View item, the ListModel and the delegate
|
a Grid View, List View, or Path View item, the ListModel and the delegate
|
||||||
item are added automatically.
|
item are added automatically.
|
||||||
|
|
||||||
However, the missing context of the application presents a challenge for
|
However, the missing context of the application presents a challenge.
|
||||||
\QMLD. Specific models defined in C++ are the most obvious case. Often,
|
Specific models defined in C++ are the most obvious case. Often,
|
||||||
the context is missing simple properties, which are either defined in C++,
|
the context is missing simple properties, which are either defined in C++,
|
||||||
or in other QML files. A typical example is an item that uses the
|
or in other QML files. A typical example is an item that uses the
|
||||||
properties of its parent, such as \c parent.width.
|
properties of its parent, such as \c parent.width.
|
||||||
|
|
||||||
\section3 Using Dummy Models
|
\section3 Using Dummy Models
|
||||||
|
|
||||||
If you open a file in \QMLD that references a C++ model, you see nothing on
|
If you open a file in the Design mode that references a C++ model, you see
|
||||||
|
nothing on
|
||||||
the canvas. If the data in the model is fetched from the internet, you have
|
the canvas. If the data in the model is fetched from the internet, you have
|
||||||
no control over it. To get reliable data, \e {dummy data} was introduced.
|
no control over it. To get reliable data, \e {dummy data} was introduced.
|
||||||
|
|
||||||
@@ -387,8 +388,8 @@
|
|||||||
}
|
}
|
||||||
\endqml
|
\endqml
|
||||||
|
|
||||||
This works nicely for applications but \QMLD displays a zero-sized item.
|
This works nicely for applications but the Design mode displays a zero-sized
|
||||||
A parent for the opened file does not exist, because the context is
|
item. A parent for the opened file does not exist, because the context is
|
||||||
missing. To get around the missing context, the idea of a \e {dummy
|
missing. To get around the missing context, the idea of a \e {dummy
|
||||||
context} is introduced. If you place a file with the same name as the
|
context} is introduced. If you place a file with the same name as the
|
||||||
application (here, example.qml) in the \c {dummydata/context} directory,
|
application (here, example.qml) in the \c {dummydata/context} directory,
|
||||||
@@ -425,70 +426,6 @@
|
|||||||
|
|
||||||
\image qmldesigner-inline-editing.png
|
\image qmldesigner-inline-editing.png
|
||||||
|
|
||||||
\section1 Adding States
|
|
||||||
|
|
||||||
User interfaces are designed to present different interface configurations
|
|
||||||
in different scenarios, or to modify their appearances in response to user
|
|
||||||
interaction. Often, there are a set of changes that are made concurrently,
|
|
||||||
such that the interface could be seen to be internally changing from one
|
|
||||||
\e state to another.
|
|
||||||
|
|
||||||
This applies generally to interfaces regardless of their complexity.
|
|
||||||
A photo viewer may initially present images in a grid, and when an image is
|
|
||||||
clicked, change to a detailed state where the individual image is expanded
|
|
||||||
and the interface is changed to present new options for image editing.
|
|
||||||
On the other end of the scale, when a simple button is pressed, it may change
|
|
||||||
to a \e pressed state in which its color and position is modified to give a
|
|
||||||
pressed appearance.
|
|
||||||
|
|
||||||
In QML, any item can change between different states to apply sets of
|
|
||||||
changes that modify the properties of relevant items. Each state can present
|
|
||||||
a different configuration that can, for example:
|
|
||||||
|
|
||||||
\list
|
|
||||||
|
|
||||||
\li Show some UI items and hide others.
|
|
||||||
|
|
||||||
\li Present different available actions to the user.
|
|
||||||
|
|
||||||
\li Start, stop or pause animations.
|
|
||||||
|
|
||||||
\li Execute some script required in the new state.
|
|
||||||
|
|
||||||
\li Change a property value for a particular item.
|
|
||||||
|
|
||||||
\li Show a different view or screen.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
The \uicontrol State pane displays the different \l{State}{states}
|
|
||||||
of the component in the Qt Quick Designer. The \uicontrol State pane is
|
|
||||||
collapsed by default to save space. Select \uicontrol Expand in the context
|
|
||||||
menu to view the whole pane.
|
|
||||||
|
|
||||||
\image qmldesigner-transitions.png "State pane"
|
|
||||||
|
|
||||||
To add states, click the \inlineimage plus.png
|
|
||||||
button. Then modify the new state in the editor.
|
|
||||||
For example, to change the appearance of a button, you can hide the button
|
|
||||||
image and show another image in its place. Or, to add movement to the screen,
|
|
||||||
you can change the position of an object on the canvas and then add animation
|
|
||||||
to the change between the states.
|
|
||||||
|
|
||||||
To determine when the state should be applied, select
|
|
||||||
\uicontrol {Set when Condition} in the menu and specify a
|
|
||||||
\l [QtQuick]{State::when}{when} property for the state.
|
|
||||||
|
|
||||||
You can preview the states in the \uicontrol State pane and click them to switch
|
|
||||||
between states on the canvas.
|
|
||||||
|
|
||||||
For more information on using states, see \l{Creating Screens}.
|
|
||||||
|
|
||||||
If you add animation to the states, you can run the application to test the
|
|
||||||
animation.
|
|
||||||
|
|
||||||
For more information on adding animation, see \l{Animating Screens}.
|
|
||||||
|
|
||||||
\section1 Working with QML Types on Canvas
|
\section1 Working with QML Types on Canvas
|
||||||
|
|
||||||
You design applications on the canvas by placing items on it.
|
You design applications on the canvas by placing items on it.
|
||||||
@@ -502,8 +439,9 @@
|
|||||||
Click the \inlineimage snapping_and_anchoring.png
|
Click the \inlineimage snapping_and_anchoring.png
|
||||||
button to anchor the item to the items that you snap to.
|
button to anchor the item to the items that you snap to.
|
||||||
|
|
||||||
Choose \uicontrol {Tools > Options > Qt Quick > Qt Quick Designer} to specify
|
Choose \uicontrol Tools > \uicontrol Options > \uicontrol {Qt Quick} >
|
||||||
settings for snapping. In the \uicontrol {Parent item padding} field, specify the
|
\uicontrol {\QMLD} to specify settings for snapping. In the
|
||||||
|
\uicontrol {Parent item padding} field, specify the
|
||||||
distance in pixels between the parent item and the snapping lines. In the
|
distance in pixels between the parent item and the snapping lines. In the
|
||||||
\uicontrol {Sibling item spacing} field, specify the distance in pixels between
|
\uicontrol {Sibling item spacing} field, specify the distance in pixels between
|
||||||
sibling items and the snapping lines.
|
sibling items and the snapping lines.
|
||||||
@@ -515,7 +453,7 @@
|
|||||||
|
|
||||||
\section2 Hiding Item Boundaries
|
\section2 Hiding Item Boundaries
|
||||||
|
|
||||||
\QMLD displays the boundaries of items on the canvas. To hide
|
The Design mode displays the boundaries of items on the canvas. To hide
|
||||||
the boundaries, click the \inlineimage boundingrect.png
|
the boundaries, click the \inlineimage boundingrect.png
|
||||||
button.
|
button.
|
||||||
|
|
||||||
@@ -549,14 +487,14 @@
|
|||||||
|
|
||||||
\section2 Specifying Canvas Size
|
\section2 Specifying Canvas Size
|
||||||
|
|
||||||
To change the canvas size, select \uicontrol {Tools > Options > Qt Quick
|
To change the canvas size, select \uicontrol Tools > \uicontrol Options >
|
||||||
> Qt Quick Designer} and
|
\uicontrol {Qt Quick} > \uicontrol {\QMLD} and
|
||||||
specify the canvas width and height in the \uicontrol Canvas group.
|
specify the canvas width and height in the \uicontrol Canvas group.
|
||||||
|
|
||||||
\section2 Refreshing the Canvas
|
\section2 Refreshing the Canvas
|
||||||
|
|
||||||
When you open QML files in \QMLD, the items in the file are drawn on
|
When you open QML files in the Design mode, the items in the file are drawn
|
||||||
the canvas. When you edit the item properties in \QMLD, the QML file and
|
on the canvas. When you edit the item properties, the QML file and
|
||||||
the image on the canvas might get out of sync. For example, when you change
|
the image on the canvas might get out of sync. For example, when you change
|
||||||
the position of an item within a column or a row, the new position might
|
the position of an item within a column or a row, the new position might
|
||||||
not be displayed correctly on the canvas.
|
not be displayed correctly on the canvas.
|
||||||
|
@@ -66,7 +66,7 @@
|
|||||||
development PC. Each layer is exported as an item.
|
development PC. Each layer is exported as an item.
|
||||||
|
|
||||||
You can open the QML file in \QC for editing. By default, the export scripts
|
You can open the QML file in \QC for editing. By default, the export scripts
|
||||||
generate Qt Quick 1 files. To edit the files in \QMLD, change the import
|
generate Qt Quick 1 files. To edit the files in the Design mode, change the import
|
||||||
statements in the export scripts to import Qt Quick 2. Or, you can change
|
statements in the export scripts to import Qt Quick 2. Or, you can change
|
||||||
the import statement in each file after generating the files.
|
the import statement in each file after generating the files.
|
||||||
|
|
||||||
@@ -146,8 +146,8 @@
|
|||||||
|
|
||||||
On Linux, run the following command: \c {chmod u+rx}
|
On Linux, run the following command: \c {chmod u+rx}
|
||||||
|
|
||||||
\li To generate QML files that you can edit in \QMLD, edit the import
|
\li To generate QML files that you can edit in the Design mode, edit the
|
||||||
statement in \e qmlexporter.py. For example:
|
import statement in \e qmlexporter.py. For example:
|
||||||
|
|
||||||
\code
|
\code
|
||||||
f.write('import QtQuick 2.5\n')
|
f.write('import QtQuick 2.5\n')
|
||||||
|
@@ -43,7 +43,7 @@
|
|||||||
information for code completion and the semantic checks to work correctly.
|
information for code completion and the semantic checks to work correctly.
|
||||||
|
|
||||||
To create a QML module and make it appear in the \uicontrol Library in
|
To create a QML module and make it appear in the \uicontrol Library in
|
||||||
\QMLD:
|
the Design mode:
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
|
|
||||||
@@ -69,15 +69,15 @@
|
|||||||
.pro file: \c {QML_IMPORT_PATH += path/to/module}.
|
.pro file: \c {QML_IMPORT_PATH += path/to/module}.
|
||||||
For more information, see \l {Importing QML Modules}.
|
For more information, see \l {Importing QML Modules}.
|
||||||
|
|
||||||
\li Make sure that the QML emulation layer of \QMLD is built with
|
\li Make sure that the QML emulation layer used in the Design mode is built with
|
||||||
the same Qt version as your QML modules. For more information, see
|
the same Qt version as your QML modules. For more information, see
|
||||||
\l {Running QML Modules in Qt Quick Designer}. You can also try
|
\l {Running QML Modules in Design Mode}. You can also try
|
||||||
skipping this step and take it later, if necessary.
|
skipping this step and take it later, if necessary.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
Your module should now appear in the \uicontrol Imports tab in the
|
Your module should now appear in the \uicontrol Imports tab in the
|
||||||
\uicontrol Library in \QMLD. Your components should appear in the
|
\uicontrol Library in the Design mode. Your components should appear in the
|
||||||
\uicontrol {QML Types} tab if a valid \c .metainfo file is in place.
|
\uicontrol {QML Types} tab if a valid \c .metainfo file is in place.
|
||||||
|
|
||||||
\section1 Registering QML Types
|
\section1 Registering QML Types
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
for QML modules with plugins before distributing them.
|
for QML modules with plugins before distributing them.
|
||||||
|
|
||||||
Classes registered with \c qmlRegisterType() can be used as backend objects
|
Classes registered with \c qmlRegisterType() can be used as backend objects
|
||||||
in the \QMLD. For more information, see \l {Adding Connections}.
|
in the Design mode. For more information, see \l {Adding Connections}.
|
||||||
|
|
||||||
\section1 Generating qmltypes Files
|
\section1 Generating qmltypes Files
|
||||||
|
|
||||||
@@ -150,10 +150,10 @@
|
|||||||
|
|
||||||
The import path affects all the targets built by the CMake project.
|
The import path affects all the targets built by the CMake project.
|
||||||
|
|
||||||
\section1 Running QML Modules in Qt Quick Designer
|
\section1 Running QML Modules in Design Mode
|
||||||
|
|
||||||
\QMLD uses a QML emulation layer (also called QML Puppet) to render and
|
A QML emulation layer (also called QML Puppet) is used in the Design mode to
|
||||||
preview images and to collect data. To be able to render custom types
|
render and preview images and to collect data. To be able to render custom types
|
||||||
correctly from QML modules, the emulation layer must be built with the same
|
correctly from QML modules, the emulation layer must be built with the same
|
||||||
Qt version as the QML modules.
|
Qt version as the QML modules.
|
||||||
|
|
||||||
@@ -163,20 +163,21 @@
|
|||||||
|
|
||||||
To use an emulation layer that is built with the Qt
|
To use an emulation layer that is built with the Qt
|
||||||
configured in the build and run kit for the project, select \uicontrol Tools >
|
configured in the build and run kit for the project, select \uicontrol Tools >
|
||||||
\uicontrol Options > \uicontrol {Qt Quick} > \uicontrol {Qt Quick Designer} >
|
\uicontrol Options > \uicontrol {Qt Quick} > \uicontrol {\QMLD} >
|
||||||
\uicontrol {Use QML emulation layer which is built by the selected Qt} radio button.
|
\uicontrol {Use QML emulation layer which is built by the selected Qt} radio button.
|
||||||
\QC builds the emulation layer when you select the \uicontrol Design mode.
|
\QC builds the emulation layer when you select the Design mode.
|
||||||
|
|
||||||
A plugin should behave differently depending on whether it is run by the
|
A plugin should behave differently depending on whether it is run by the
|
||||||
emulation layer or an application. For example, animations should not be run
|
emulation layer or an application. For example, animations should not be run
|
||||||
in the \uicontrol Design mode. You can use the value of the QML_PUPPET_MODE
|
in the Design mode. You can use the value of the QML_PUPPET_MODE
|
||||||
environment variable to check whether the plugin is currently being run
|
environment variable to check whether the plugin is currently being run
|
||||||
by an application or edited in the \uicontrol Design mode.
|
by an application or edited in the Design mode.
|
||||||
|
|
||||||
If you want to use a different module in \QMLD than in your actual
|
If you want to use a different module in the Design mode than in your actual
|
||||||
application for example to mockup C++ items, then you can use \c{QML_DESIGNER_IMPORT_PATH}
|
application for example to mockup C++ items, then you can use \c{QML_DESIGNER_IMPORT_PATH}
|
||||||
in the \c{.pro} file.
|
in the \c{.pro} file.
|
||||||
Modules in the import paths defined in \c{QML_DESIGNER_IMPORT_PATH} will be used only in \QMLD.
|
Modules in the import paths defined in \c{QML_DESIGNER_IMPORT_PATH} will be
|
||||||
|
used only in the Design mode.
|
||||||
For an example, see \l {Qt Quick Controls 2 - Contact List}.
|
For an example, see \l {Qt Quick Controls 2 - Contact List}.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -120,8 +120,8 @@
|
|||||||
|
|
||||||
Property bindings are created implicitly in QML whenever a property is
|
Property bindings are created implicitly in QML whenever a property is
|
||||||
assigned a JavaScript expression. To set JavaScript expressions as values of
|
assigned a JavaScript expression. To set JavaScript expressions as values of
|
||||||
properties in \QMLD, click the circle icon next to a property to open a
|
properties in the Design mode, click the circle icon next to a property to
|
||||||
context menu, and select \uicontrol {Set Binding}.
|
open a context menu, and select \uicontrol {Set Binding}.
|
||||||
|
|
||||||
\image qmldesigner-set-expression.png "Type properties context menu"
|
\image qmldesigner-set-expression.png "Type properties context menu"
|
||||||
|
|
||||||
@@ -141,7 +141,8 @@
|
|||||||
For more information on the JavaScript environment provided by QML, see
|
For more information on the JavaScript environment provided by QML, see
|
||||||
\l{Integrating QML and JavaScript}.
|
\l{Integrating QML and JavaScript}.
|
||||||
|
|
||||||
Bindings are a black box for \QMLD and using them might have a negative impact on
|
Bindings are a black box for the Design mode and using them might have a
|
||||||
|
negative impact on
|
||||||
performance, so consider setting anchors and margins for items, instead.
|
performance, so consider setting anchors and margins for items, instead.
|
||||||
For example, instead of setting \c {parent.width} for an item, you could
|
For example, instead of setting \c {parent.width} for an item, you could
|
||||||
anchor the item to its sibling items on the left and the right.
|
anchor the item to its sibling items on the left and the right.
|
||||||
@@ -167,8 +168,8 @@
|
|||||||
(\uicontrol {Reset Anchors}) button to reset the anchors to their saved
|
(\uicontrol {Reset Anchors}) button to reset the anchors to their saved
|
||||||
state.
|
state.
|
||||||
|
|
||||||
Specifying the baseline anchor in \QMLD is not supported. You can specify it
|
You can specify the baseline anchor in the \uicontrol {Text Editor} in the
|
||||||
in the \uicontrol {Text Editor}.
|
Design mode.
|
||||||
|
|
||||||
For performance reasons, you can only anchor an item to its siblings and
|
For performance reasons, you can only anchor an item to its siblings and
|
||||||
direct parent. By default, an item is anchored to its parent when you
|
direct parent. By default, an item is anchored to its parent when you
|
||||||
@@ -393,9 +394,9 @@
|
|||||||
|
|
||||||
\section2 Using SCXML State Machines
|
\section2 Using SCXML State Machines
|
||||||
|
|
||||||
To use QML and \QMLD together with an SCXML state machine, add states and
|
To use QML together with an SCXML state machine, add states and bind them to
|
||||||
bind them to the state machine in the \uicontrol Backends tab, as described
|
the state machine in the \uicontrol Backends tab in the Design mode, as
|
||||||
in \l {Managing C++ Backend Objects}.
|
described in \l {Managing C++ Backend Objects}.
|
||||||
|
|
||||||
In the \uicontrol States pane, you can edit the \c when condition of states
|
In the \uicontrol States pane, you can edit the \c when condition of states
|
||||||
to map QML states to the states of the SCXML state machine. For an example,
|
to map QML states to the states of the SCXML state machine. For an example,
|
||||||
|
88
doc/src/qtquick/qtquick-states.qdoc
Normal file
88
doc/src/qtquick/qtquick-states.qdoc
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Creator documentation.
|
||||||
|
**
|
||||||
|
** 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 Free Documentation License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Free
|
||||||
|
** Documentation License version 1.3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file included in the packaging of
|
||||||
|
** this file. Please review the following information to ensure
|
||||||
|
** the GNU Free Documentation License version 1.3 requirements
|
||||||
|
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\contentspage {Qt Creator Manual}
|
||||||
|
\previouspage quick-connections-backend.html
|
||||||
|
\page quick-states.html
|
||||||
|
\nextpage quick-components.html
|
||||||
|
|
||||||
|
\title Adding States
|
||||||
|
|
||||||
|
User interfaces are designed to present different interface configurations
|
||||||
|
in different scenarios, or to modify their appearances in response to user
|
||||||
|
interaction. Often, there are a set of changes that are made concurrently,
|
||||||
|
such that the interface could be seen to be internally changing from one
|
||||||
|
\e state to another.
|
||||||
|
|
||||||
|
This applies generally to interfaces regardless of their complexity. A photo
|
||||||
|
viewer may initially present images in a grid, and when an image is clicked,
|
||||||
|
change to a detailed state where the individual image is expanded and the
|
||||||
|
interface is changed to present new options for image editing. At the other
|
||||||
|
end of the scale, when a button is pressed, it may change to a
|
||||||
|
\e pressed state in which its color and position are modified so that it
|
||||||
|
appears to be pressed down.
|
||||||
|
|
||||||
|
In QML, any item can change between different states to apply sets of
|
||||||
|
changes that modify the properties of relevant items. Each state can
|
||||||
|
present a different configuration that can, for example:
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li Show some UI items and hide others.
|
||||||
|
\li Present different available actions to the user.
|
||||||
|
\li Start, stop or pause animations.
|
||||||
|
\li Execute some script required in the new state.
|
||||||
|
\li Change a property value for a particular item.
|
||||||
|
\li Show a different view or screen.
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
The \uicontrol State pane displays the different \l{State}{states}
|
||||||
|
of the component in the Design mode. The \uicontrol State pane is
|
||||||
|
collapsed by default to save space. Select \uicontrol Expand in
|
||||||
|
the context menu to view the whole pane.
|
||||||
|
|
||||||
|
\image qmldesigner-transitions.png "State pane"
|
||||||
|
|
||||||
|
To add states, click the \inlineimage plus.png
|
||||||
|
button. Then modify the new state in the editor. For example, to change the
|
||||||
|
appearance of a button, you can hide the button image and show another image
|
||||||
|
in its place. Or, to add movement to the screen, you can change the position
|
||||||
|
of an object on the canvas and then add animation to the change between the
|
||||||
|
states.
|
||||||
|
|
||||||
|
To determine when the state should be applied, select
|
||||||
|
\uicontrol {Set when Condition} in the menu and specify a
|
||||||
|
\l [QtQuick]{State::when}{when} property for the state.
|
||||||
|
|
||||||
|
You can preview the states in the \uicontrol State pane and click them to
|
||||||
|
switch between states on the canvas.
|
||||||
|
|
||||||
|
For more information about using states, see \l{Creating Screens}.
|
||||||
|
|
||||||
|
If you add animation to the states, you can run the application to test the
|
||||||
|
animation.
|
||||||
|
|
||||||
|
For more information about adding animation, see \l{Animating Screens}.
|
||||||
|
*/
|
@@ -990,7 +990,7 @@ class Dumper(DumperBase):
|
|||||||
if self.isWindowsTarget():
|
if self.isWindowsTarget():
|
||||||
qtCoreMatch = re.match('.*Qt5?Core[^/.]*d?\.dll', name)
|
qtCoreMatch = re.match('.*Qt5?Core[^/.]*d?\.dll', name)
|
||||||
else:
|
else:
|
||||||
qtCoreMatch = re.match('.*/libQt5?Core[^/.]\.so', name)
|
qtCoreMatch = re.match('.*/libQt5?Core[^/.]*\.so', name)
|
||||||
|
|
||||||
if qtCoreMatch is not None:
|
if qtCoreMatch is not None:
|
||||||
self.handleQtCoreLoaded(objfile)
|
self.handleQtCoreLoaded(objfile)
|
||||||
|
@@ -131,6 +131,14 @@
|
|||||||
"QtQuick 2.8",
|
"QtQuick 2.8",
|
||||||
"QtQuick 2.9",
|
"QtQuick 2.9",
|
||||||
"QtTest 1.0",
|
"QtTest 1.0",
|
||||||
|
"QtWebEngine 1.0",
|
||||||
|
"QtWebEngine 1.1",
|
||||||
|
"QtWebEngine 1.2",
|
||||||
|
"QtWebEngine 1.3",
|
||||||
|
"QtWebEngine 1.4",
|
||||||
|
"QtWebEngine 1.5",
|
||||||
|
"QtWebEngine 1.6",
|
||||||
|
"QtWebEngine 1.7",
|
||||||
"QtWebKit 3.0",
|
"QtWebKit 3.0",
|
||||||
"Enginio 1.0"
|
"Enginio 1.0"
|
||||||
]
|
]
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -70,7 +70,7 @@ public:
|
|||||||
_message = Message(type, _location);
|
_message = Message(type, _location);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void visit(const NumberValue *value)
|
void visit(const NumberValue *value) override
|
||||||
{
|
{
|
||||||
if (const QmlEnumValue *enumValue = value_cast<QmlEnumValue>(value)) {
|
if (const QmlEnumValue *enumValue = value_cast<QmlEnumValue>(value)) {
|
||||||
if (StringLiteral *stringLiteral = cast<StringLiteral *>(_ast)) {
|
if (StringLiteral *stringLiteral = cast<StringLiteral *>(_ast)) {
|
||||||
@@ -90,7 +90,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void visit(const BooleanValue *)
|
void visit(const BooleanValue *) override
|
||||||
{
|
{
|
||||||
UnaryMinusExpression *unaryMinus = cast<UnaryMinusExpression *>(_ast);
|
UnaryMinusExpression *unaryMinus = cast<UnaryMinusExpression *>(_ast);
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void visit(const StringValue *value)
|
void visit(const StringValue *value) override
|
||||||
{
|
{
|
||||||
UnaryMinusExpression *unaryMinus = cast<UnaryMinusExpression *>(_ast);
|
UnaryMinusExpression *unaryMinus = cast<UnaryMinusExpression *>(_ast);
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void visit(const ColorValue *)
|
void visit(const ColorValue *) override
|
||||||
{
|
{
|
||||||
if (StringLiteral *stringLiteral = cast<StringLiteral *>(_ast)) {
|
if (StringLiteral *stringLiteral = cast<StringLiteral *>(_ast)) {
|
||||||
if (!toQColor(stringLiteral->value.toString()).isValid())
|
if (!toQColor(stringLiteral->value.toString()).isValid())
|
||||||
@@ -142,7 +142,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void visit(const AnchorLineValue *)
|
void visit(const AnchorLineValue *) override
|
||||||
{
|
{
|
||||||
if (! (_rhsValue->asAnchorLineValue() || _rhsValue->asUnknownValue()))
|
if (! (_rhsValue->asAnchorLineValue() || _rhsValue->asUnknownValue()))
|
||||||
setMessage(ErrAnchorLineExpected);
|
setMessage(ErrAnchorLineExpected);
|
||||||
@@ -189,7 +189,7 @@ protected:
|
|||||||
return _state;
|
return _state;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool preVisit(Node *ast)
|
bool preVisit(Node *ast) override
|
||||||
{
|
{
|
||||||
if (ast->expressionCast())
|
if (ast->expressionCast())
|
||||||
return false;
|
return false;
|
||||||
@@ -204,7 +204,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(LabelledStatement *ast)
|
bool visit(LabelledStatement *ast) override
|
||||||
{
|
{
|
||||||
// get the target statement
|
// get the target statement
|
||||||
Statement *end = ast->statement;
|
Statement *end = ast->statement;
|
||||||
@@ -219,7 +219,7 @@ protected:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(BreakStatement *ast)
|
bool visit(BreakStatement *ast) override
|
||||||
{
|
{
|
||||||
_state = Break;
|
_state = Break;
|
||||||
if (!ast->label.isEmpty()) {
|
if (!ast->label.isEmpty()) {
|
||||||
@@ -232,12 +232,12 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// labelled continues don't change control flow...
|
// labelled continues don't change control flow...
|
||||||
virtual bool visit(ContinueStatement *) { _state = Continue; return false; }
|
bool visit(ContinueStatement *) override { _state = Continue; return false; }
|
||||||
|
|
||||||
virtual bool visit(ReturnStatement *) { _state = ReturnOrThrow; return false; }
|
bool visit(ReturnStatement *) override { _state = ReturnOrThrow; return false; }
|
||||||
virtual bool visit(ThrowStatement *) { _state = ReturnOrThrow; return false; }
|
bool visit(ThrowStatement *) override { _state = ReturnOrThrow; return false; }
|
||||||
|
|
||||||
virtual bool visit(IfStatement *ast)
|
bool visit(IfStatement *ast) override
|
||||||
{
|
{
|
||||||
State ok = check(ast->ok);
|
State ok = check(ast->ok);
|
||||||
State ko = check(ast->ko);
|
State ko = check(ast->ko);
|
||||||
@@ -256,7 +256,7 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(SwitchStatement *ast)
|
bool visit(SwitchStatement *ast) override
|
||||||
{
|
{
|
||||||
if (!ast->block)
|
if (!ast->block)
|
||||||
return false;
|
return false;
|
||||||
@@ -282,7 +282,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(TryStatement *ast)
|
bool visit(TryStatement *ast) override
|
||||||
{
|
{
|
||||||
State tryBody = check(ast->statement);
|
State tryBody = check(ast->statement);
|
||||||
State catchBody = ReturnOrThrow;
|
State catchBody = ReturnOrThrow;
|
||||||
@@ -303,13 +303,13 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(WhileStatement *ast) { return preconditionLoopStatement(ast, ast->statement); }
|
bool visit(WhileStatement *ast) override { return preconditionLoopStatement(ast, ast->statement); }
|
||||||
virtual bool visit(ForStatement *ast) { return preconditionLoopStatement(ast, ast->statement); }
|
bool visit(ForStatement *ast) override { return preconditionLoopStatement(ast, ast->statement); }
|
||||||
virtual bool visit(ForEachStatement *ast) { return preconditionLoopStatement(ast, ast->statement); }
|
bool visit(ForEachStatement *ast) override { return preconditionLoopStatement(ast, ast->statement); }
|
||||||
virtual bool visit(LocalForStatement *ast) { return preconditionLoopStatement(ast, ast->statement); }
|
bool visit(LocalForStatement *ast) override { return preconditionLoopStatement(ast, ast->statement); }
|
||||||
virtual bool visit(LocalForEachStatement *ast) { return preconditionLoopStatement(ast, ast->statement); }
|
bool visit(LocalForEachStatement *ast) override { return preconditionLoopStatement(ast, ast->statement); }
|
||||||
|
|
||||||
virtual bool visit(DoWhileStatement *ast)
|
bool visit(DoWhileStatement *ast) override
|
||||||
{
|
{
|
||||||
check(ast->statement);
|
check(ast->statement);
|
||||||
// not necessarily an infinite loop due to labelled breaks
|
// not necessarily an infinite loop due to labelled breaks
|
||||||
@@ -335,7 +335,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual State check(Node *node)
|
State check(Node *node) override
|
||||||
{
|
{
|
||||||
bool oldwarning = _emittedWarning;
|
bool oldwarning = _emittedWarning;
|
||||||
_emittedWarning = false;
|
_emittedWarning = false;
|
||||||
@@ -344,7 +344,7 @@ protected:
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void onUnreachable(Node *node)
|
void onUnreachable(Node *node) override
|
||||||
{
|
{
|
||||||
if (_emittedWarning)
|
if (_emittedWarning)
|
||||||
return;
|
return;
|
||||||
|
@@ -119,7 +119,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool visit(CompoundStatementAST *ast)
|
bool visit(CompoundStatementAST *ast) override
|
||||||
{
|
{
|
||||||
CompoundStatementAST *old = _compound;
|
CompoundStatementAST *old = _compound;
|
||||||
_compound = ast;
|
_compound = ast;
|
||||||
@@ -128,7 +128,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(CallAST *ast)
|
bool visit(CallAST *ast) override
|
||||||
{
|
{
|
||||||
if (checkForQmlRegisterType(ast))
|
if (checkForQmlRegisterType(ast))
|
||||||
return false;
|
return false;
|
||||||
|
@@ -103,27 +103,27 @@ public:
|
|||||||
|
|
||||||
const Value *value() const { return m_value; }
|
const Value *value() const { return m_value; }
|
||||||
|
|
||||||
virtual bool processProperty(const QString &name, const Value *value, const PropertyInfo &)
|
bool processProperty(const QString &name, const Value *value, const PropertyInfo &) override
|
||||||
{
|
{
|
||||||
return process(name, value);
|
return process(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processEnumerator(const QString &name, const Value *value)
|
bool processEnumerator(const QString &name, const Value *value) override
|
||||||
{
|
{
|
||||||
return process(name, value);
|
return process(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processSignal(const QString &name, const Value *value)
|
bool processSignal(const QString &name, const Value *value) override
|
||||||
{
|
{
|
||||||
return process(name, value);
|
return process(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processSlot(const QString &name, const Value *value)
|
bool processSlot(const QString &name, const Value *value) override
|
||||||
{
|
{
|
||||||
return process(name, value);
|
return process(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processGeneratedSlot(const QString &name, const Value *value)
|
bool processGeneratedSlot(const QString &name, const Value *value) override
|
||||||
{
|
{
|
||||||
return process(name, value);
|
return process(name, value);
|
||||||
}
|
}
|
||||||
@@ -2574,31 +2574,31 @@ class MemberDumper: public MemberProcessor
|
|||||||
public:
|
public:
|
||||||
MemberDumper() {}
|
MemberDumper() {}
|
||||||
|
|
||||||
virtual bool processProperty(const QString &name, const Value *, const PropertyInfo &pInfo)
|
bool processProperty(const QString &name, const Value *, const PropertyInfo &pInfo) override
|
||||||
{
|
{
|
||||||
qCDebug(qmljsLog) << "property: " << name << " flags:" << pInfo.toString();
|
qCDebug(qmljsLog) << "property: " << name << " flags:" << pInfo.toString();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processEnumerator(const QString &name, const Value *)
|
bool processEnumerator(const QString &name, const Value *) override
|
||||||
{
|
{
|
||||||
qCDebug(qmljsLog) << "enumerator: " << name;
|
qCDebug(qmljsLog) << "enumerator: " << name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processSignal(const QString &name, const Value *)
|
bool processSignal(const QString &name, const Value *) override
|
||||||
{
|
{
|
||||||
qCDebug(qmljsLog) << "signal: " << name;
|
qCDebug(qmljsLog) << "signal: " << name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processSlot(const QString &name, const Value *)
|
bool processSlot(const QString &name, const Value *) override
|
||||||
{
|
{
|
||||||
qCDebug(qmljsLog) << "slot: " << name;
|
qCDebug(qmljsLog) << "slot: " << name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool processGeneratedSlot(const QString &name, const Value *)
|
bool processGeneratedSlot(const QString &name, const Value *) override
|
||||||
{
|
{
|
||||||
qCDebug(qmljsLog) << "generated slot: " << name;
|
qCDebug(qmljsLog) << "generated slot: " << name;
|
||||||
return true;
|
return true;
|
||||||
|
@@ -53,12 +53,12 @@ protected:
|
|||||||
BlockData data;
|
BlockData data;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual void saveBlockData(QTextBlock *block, const BlockData &data) const
|
void saveBlockData(QTextBlock *block, const BlockData &data) const override
|
||||||
{
|
{
|
||||||
block->setUserData(new FormatterData(data));
|
block->setUserData(new FormatterData(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool loadBlockData(const QTextBlock &block, BlockData *data) const
|
bool loadBlockData(const QTextBlock &block, BlockData *data) const override
|
||||||
{
|
{
|
||||||
if (!block.userData())
|
if (!block.userData())
|
||||||
return false;
|
return false;
|
||||||
@@ -67,12 +67,12 @@ protected:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void saveLexerState(QTextBlock *block, int state) const
|
void saveLexerState(QTextBlock *block, int state) const override
|
||||||
{
|
{
|
||||||
block->setUserState(state);
|
block->setUserState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int loadLexerState(const QTextBlock &block) const
|
int loadLexerState(const QTextBlock &block) const override
|
||||||
{
|
{
|
||||||
return block.userState();
|
return block.userState();
|
||||||
}
|
}
|
||||||
@@ -464,7 +464,7 @@ protected:
|
|||||||
loc.length += 2;
|
loc.length += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool preVisit(Node *ast)
|
bool preVisit(Node *ast) override
|
||||||
{
|
{
|
||||||
SourceLocation firstLoc;
|
SourceLocation firstLoc;
|
||||||
if (ExpressionNode *expr = ast->expressionCast())
|
if (ExpressionNode *expr = ast->expressionCast())
|
||||||
@@ -486,7 +486,7 @@ protected:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void postVisit(Node *ast)
|
void postVisit(Node *ast) override
|
||||||
{
|
{
|
||||||
SourceLocation lastLoc;
|
SourceLocation lastLoc;
|
||||||
if (ExpressionNode *expr = ast->expressionCast())
|
if (ExpressionNode *expr = ast->expressionCast())
|
||||||
@@ -525,14 +525,14 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiPragma *ast)
|
bool visit(UiPragma *ast) override
|
||||||
{
|
{
|
||||||
out("pragma ", ast->pragmaToken);
|
out("pragma ", ast->pragmaToken);
|
||||||
accept(ast->pragmaType);
|
accept(ast->pragmaType);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiImport *ast)
|
bool visit(UiImport *ast) override
|
||||||
{
|
{
|
||||||
out("import ", ast->importToken);
|
out("import ", ast->importToken);
|
||||||
if (!ast->fileName.isNull())
|
if (!ast->fileName.isNull())
|
||||||
@@ -550,7 +550,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiObjectDefinition *ast)
|
bool visit(UiObjectDefinition *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->qualifiedTypeNameId);
|
accept(ast->qualifiedTypeNameId);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -558,7 +558,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiObjectInitializer *ast)
|
bool visit(UiObjectInitializer *ast) override
|
||||||
{
|
{
|
||||||
out(ast->lbraceToken);
|
out(ast->lbraceToken);
|
||||||
if (ast->members)
|
if (ast->members)
|
||||||
@@ -568,7 +568,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiParameterList *list)
|
bool visit(UiParameterList *list) override
|
||||||
{
|
{
|
||||||
for (UiParameterList *it = list; it; it = it->next) {
|
for (UiParameterList *it = list; it; it = it->next) {
|
||||||
out(it->propertyTypeToken);
|
out(it->propertyTypeToken);
|
||||||
@@ -580,7 +580,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiPublicMember *ast)
|
bool visit(UiPublicMember *ast) override
|
||||||
{
|
{
|
||||||
if (ast->type == UiPublicMember::Property) {
|
if (ast->type == UiPublicMember::Property) {
|
||||||
if (ast->isDefaultMember)
|
if (ast->isDefaultMember)
|
||||||
@@ -618,7 +618,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiObjectBinding *ast)
|
bool visit(UiObjectBinding *ast) override
|
||||||
{
|
{
|
||||||
if (ast->hasOnToken) {
|
if (ast->hasOnToken) {
|
||||||
accept(ast->qualifiedTypeNameId);
|
accept(ast->qualifiedTypeNameId);
|
||||||
@@ -634,7 +634,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiScriptBinding *ast)
|
bool visit(UiScriptBinding *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->qualifiedId);
|
accept(ast->qualifiedId);
|
||||||
out(": ", ast->colonToken);
|
out(": ", ast->colonToken);
|
||||||
@@ -642,7 +642,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiArrayBinding *ast)
|
bool visit(UiArrayBinding *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->qualifiedId);
|
accept(ast->qualifiedId);
|
||||||
out(ast->colonToken);
|
out(ast->colonToken);
|
||||||
@@ -654,16 +654,16 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ThisExpression *ast) { out(ast->thisToken); return true; }
|
bool visit(ThisExpression *ast) override { out(ast->thisToken); return true; }
|
||||||
virtual bool visit(NullExpression *ast) { out(ast->nullToken); return true; }
|
bool visit(NullExpression *ast) override { out(ast->nullToken); return true; }
|
||||||
virtual bool visit(TrueLiteral *ast) { out(ast->trueToken); return true; }
|
bool visit(TrueLiteral *ast) override { out(ast->trueToken); return true; }
|
||||||
virtual bool visit(FalseLiteral *ast) { out(ast->falseToken); return true; }
|
bool visit(FalseLiteral *ast) override { out(ast->falseToken); return true; }
|
||||||
virtual bool visit(IdentifierExpression *ast) { out(ast->identifierToken); return true; }
|
bool visit(IdentifierExpression *ast) override { out(ast->identifierToken); return true; }
|
||||||
virtual bool visit(StringLiteral *ast) { out(ast->literalToken); return true; }
|
bool visit(StringLiteral *ast) override { out(ast->literalToken); return true; }
|
||||||
virtual bool visit(NumericLiteral *ast) { out(ast->literalToken); return true; }
|
bool visit(NumericLiteral *ast) override { out(ast->literalToken); return true; }
|
||||||
virtual bool visit(RegExpLiteral *ast) { out(ast->literalToken); return true; }
|
bool visit(RegExpLiteral *ast) override { out(ast->literalToken); return true; }
|
||||||
|
|
||||||
virtual bool visit(ArrayLiteral *ast)
|
bool visit(ArrayLiteral *ast) override
|
||||||
{
|
{
|
||||||
out(ast->lbracketToken);
|
out(ast->lbracketToken);
|
||||||
if (ast->elements)
|
if (ast->elements)
|
||||||
@@ -676,7 +676,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ObjectLiteral *ast)
|
bool visit(ObjectLiteral *ast) override
|
||||||
{
|
{
|
||||||
out(ast->lbraceToken);
|
out(ast->lbraceToken);
|
||||||
lnAcceptIndented(ast->properties);
|
lnAcceptIndented(ast->properties);
|
||||||
@@ -685,7 +685,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ElementList *ast)
|
bool visit(ElementList *ast) override
|
||||||
{
|
{
|
||||||
for (ElementList *it = ast; it; it = it->next) {
|
for (ElementList *it = ast; it; it = it->next) {
|
||||||
if (it->elision)
|
if (it->elision)
|
||||||
@@ -700,7 +700,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(PropertyAssignmentList *ast)
|
bool visit(PropertyAssignmentList *ast) override
|
||||||
{
|
{
|
||||||
for (PropertyAssignmentList *it = ast; it; it = it->next) {
|
for (PropertyAssignmentList *it = ast; it; it = it->next) {
|
||||||
PropertyNameAndValue *assignment = AST::cast<PropertyNameAndValue *>(it->assignment);
|
PropertyNameAndValue *assignment = AST::cast<PropertyNameAndValue *>(it->assignment);
|
||||||
@@ -739,7 +739,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(NestedExpression *ast)
|
bool visit(NestedExpression *ast) override
|
||||||
{
|
{
|
||||||
out(ast->lparenToken);
|
out(ast->lparenToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
@@ -747,11 +747,11 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(IdentifierPropertyName *ast) { out(ast->id.toString()); return true; }
|
bool visit(IdentifierPropertyName *ast) override { out(ast->id.toString()); return true; }
|
||||||
virtual bool visit(StringLiteralPropertyName *ast) { out(ast->id.toString()); return true; }
|
bool visit(StringLiteralPropertyName *ast) override { out(ast->id.toString()); return true; }
|
||||||
virtual bool visit(NumericLiteralPropertyName *ast) { out(QString::number(ast->id)); return true; }
|
bool visit(NumericLiteralPropertyName *ast) override { out(QString::number(ast->id)); return true; }
|
||||||
|
|
||||||
virtual bool visit(ArrayMemberExpression *ast)
|
bool visit(ArrayMemberExpression *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->base);
|
accept(ast->base);
|
||||||
out(ast->lbracketToken);
|
out(ast->lbracketToken);
|
||||||
@@ -760,7 +760,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(FieldMemberExpression *ast)
|
bool visit(FieldMemberExpression *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->base);
|
accept(ast->base);
|
||||||
out(ast->dotToken);
|
out(ast->dotToken);
|
||||||
@@ -768,7 +768,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(NewMemberExpression *ast)
|
bool visit(NewMemberExpression *ast) override
|
||||||
{
|
{
|
||||||
out("new ", ast->newToken);
|
out("new ", ast->newToken);
|
||||||
accept(ast->base);
|
accept(ast->base);
|
||||||
@@ -778,14 +778,14 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(NewExpression *ast)
|
bool visit(NewExpression *ast) override
|
||||||
{
|
{
|
||||||
out("new ", ast->newToken);
|
out("new ", ast->newToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(CallExpression *ast)
|
bool visit(CallExpression *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->base);
|
accept(ast->base);
|
||||||
out(ast->lparenToken);
|
out(ast->lparenToken);
|
||||||
@@ -795,84 +795,84 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(PostIncrementExpression *ast)
|
bool visit(PostIncrementExpression *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->base);
|
accept(ast->base);
|
||||||
out(ast->incrementToken);
|
out(ast->incrementToken);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(PostDecrementExpression *ast)
|
bool visit(PostDecrementExpression *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->base);
|
accept(ast->base);
|
||||||
out(ast->decrementToken);
|
out(ast->decrementToken);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(PreIncrementExpression *ast)
|
bool visit(PreIncrementExpression *ast) override
|
||||||
{
|
{
|
||||||
out(ast->incrementToken);
|
out(ast->incrementToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(PreDecrementExpression *ast)
|
bool visit(PreDecrementExpression *ast) override
|
||||||
{
|
{
|
||||||
out(ast->decrementToken);
|
out(ast->decrementToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(DeleteExpression *ast)
|
bool visit(DeleteExpression *ast) override
|
||||||
{
|
{
|
||||||
out("delete ", ast->deleteToken);
|
out("delete ", ast->deleteToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(VoidExpression *ast)
|
bool visit(VoidExpression *ast) override
|
||||||
{
|
{
|
||||||
out("void ", ast->voidToken);
|
out("void ", ast->voidToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(TypeOfExpression *ast)
|
bool visit(TypeOfExpression *ast) override
|
||||||
{
|
{
|
||||||
out("typeof ", ast->typeofToken);
|
out("typeof ", ast->typeofToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UnaryPlusExpression *ast)
|
bool visit(UnaryPlusExpression *ast) override
|
||||||
{
|
{
|
||||||
out(ast->plusToken);
|
out(ast->plusToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UnaryMinusExpression *ast)
|
bool visit(UnaryMinusExpression *ast) override
|
||||||
{
|
{
|
||||||
out(ast->minusToken);
|
out(ast->minusToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(TildeExpression *ast)
|
bool visit(TildeExpression *ast) override
|
||||||
{
|
{
|
||||||
out(ast->tildeToken);
|
out(ast->tildeToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(NotExpression *ast)
|
bool visit(NotExpression *ast) override
|
||||||
{
|
{
|
||||||
out(ast->notToken);
|
out(ast->notToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(BinaryExpression *ast)
|
bool visit(BinaryExpression *ast) override
|
||||||
{
|
{
|
||||||
++_binaryExpDepth;
|
++_binaryExpDepth;
|
||||||
accept(ast->left);
|
accept(ast->left);
|
||||||
@@ -893,7 +893,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ConditionalExpression *ast)
|
bool visit(ConditionalExpression *ast) override
|
||||||
{
|
{
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
out(" ? ", ast->questionToken);
|
out(" ? ", ast->questionToken);
|
||||||
@@ -903,7 +903,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(Block *ast)
|
bool visit(Block *ast) override
|
||||||
{
|
{
|
||||||
out(ast->lbraceToken);
|
out(ast->lbraceToken);
|
||||||
lnAcceptIndented(ast->statements);
|
lnAcceptIndented(ast->statements);
|
||||||
@@ -912,14 +912,14 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(VariableStatement *ast)
|
bool visit(VariableStatement *ast) override
|
||||||
{
|
{
|
||||||
out("var ", ast->declarationKindToken);
|
out("var ", ast->declarationKindToken);
|
||||||
accept(ast->declarations);
|
accept(ast->declarations);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(VariableDeclaration *ast)
|
bool visit(VariableDeclaration *ast) override
|
||||||
{
|
{
|
||||||
out(ast->identifierToken);
|
out(ast->identifierToken);
|
||||||
if (ast->expression) {
|
if (ast->expression) {
|
||||||
@@ -929,13 +929,13 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(EmptyStatement *ast)
|
bool visit(EmptyStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->semicolonToken);
|
out(ast->semicolonToken);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(IfStatement *ast)
|
bool visit(IfStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->ifToken);
|
out(ast->ifToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -955,7 +955,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(DoWhileStatement *ast)
|
bool visit(DoWhileStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->doToken);
|
out(ast->doToken);
|
||||||
acceptBlockOrIndented(ast->statement, true);
|
acceptBlockOrIndented(ast->statement, true);
|
||||||
@@ -967,7 +967,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(WhileStatement *ast)
|
bool visit(WhileStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->whileToken);
|
out(ast->whileToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -978,7 +978,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ForStatement *ast)
|
bool visit(ForStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->forToken);
|
out(ast->forToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -993,7 +993,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(LocalForStatement *ast)
|
bool visit(LocalForStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->forToken);
|
out(ast->forToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -1010,7 +1010,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ForEachStatement *ast)
|
bool visit(ForEachStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->forToken);
|
out(ast->forToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -1023,7 +1023,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(LocalForEachStatement *ast)
|
bool visit(LocalForEachStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->forToken);
|
out(ast->forToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -1038,7 +1038,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ContinueStatement *ast)
|
bool visit(ContinueStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->continueToken);
|
out(ast->continueToken);
|
||||||
if (!ast->label.isNull()) {
|
if (!ast->label.isNull()) {
|
||||||
@@ -1048,7 +1048,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(BreakStatement *ast)
|
bool visit(BreakStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->breakToken);
|
out(ast->breakToken);
|
||||||
if (!ast->label.isNull()) {
|
if (!ast->label.isNull()) {
|
||||||
@@ -1058,7 +1058,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ReturnStatement *ast)
|
bool visit(ReturnStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->returnToken);
|
out(ast->returnToken);
|
||||||
if (ast->expression) {
|
if (ast->expression) {
|
||||||
@@ -1068,7 +1068,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ThrowStatement *ast)
|
bool visit(ThrowStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->throwToken);
|
out(ast->throwToken);
|
||||||
if (ast->expression) {
|
if (ast->expression) {
|
||||||
@@ -1078,7 +1078,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(WithStatement *ast)
|
bool visit(WithStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->withToken);
|
out(ast->withToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -1089,7 +1089,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(SwitchStatement *ast)
|
bool visit(SwitchStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->switchToken);
|
out(ast->switchToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -1101,7 +1101,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(CaseBlock *ast)
|
bool visit(CaseBlock *ast) override
|
||||||
{
|
{
|
||||||
out(ast->lbraceToken);
|
out(ast->lbraceToken);
|
||||||
newLine();
|
newLine();
|
||||||
@@ -1117,7 +1117,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(CaseClause *ast)
|
bool visit(CaseClause *ast) override
|
||||||
{
|
{
|
||||||
out("case ", ast->caseToken);
|
out("case ", ast->caseToken);
|
||||||
accept(ast->expression);
|
accept(ast->expression);
|
||||||
@@ -1127,7 +1127,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(DefaultClause *ast)
|
bool visit(DefaultClause *ast) override
|
||||||
{
|
{
|
||||||
out(ast->defaultToken);
|
out(ast->defaultToken);
|
||||||
out(ast->colonToken);
|
out(ast->colonToken);
|
||||||
@@ -1135,7 +1135,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(LabelledStatement *ast)
|
bool visit(LabelledStatement *ast) override
|
||||||
{
|
{
|
||||||
out(ast->identifierToken);
|
out(ast->identifierToken);
|
||||||
out(": ", ast->colonToken);
|
out(": ", ast->colonToken);
|
||||||
@@ -1143,7 +1143,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(TryStatement *ast)
|
bool visit(TryStatement *ast) override
|
||||||
{
|
{
|
||||||
out("try ", ast->tryToken);
|
out("try ", ast->tryToken);
|
||||||
accept(ast->statement);
|
accept(ast->statement);
|
||||||
@@ -1158,7 +1158,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(Catch *ast)
|
bool visit(Catch *ast) override
|
||||||
{
|
{
|
||||||
out(ast->catchToken);
|
out(ast->catchToken);
|
||||||
out(" ");
|
out(" ");
|
||||||
@@ -1169,19 +1169,19 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(Finally *ast)
|
bool visit(Finally *ast) override
|
||||||
{
|
{
|
||||||
out("finally ", ast->finallyToken);
|
out("finally ", ast->finallyToken);
|
||||||
accept(ast->statement);
|
accept(ast->statement);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(FunctionDeclaration *ast)
|
bool visit(FunctionDeclaration *ast) override
|
||||||
{
|
{
|
||||||
return visit(static_cast<FunctionExpression *>(ast));
|
return visit(static_cast<FunctionExpression *>(ast));
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(FunctionExpression *ast)
|
bool visit(FunctionExpression *ast) override
|
||||||
{
|
{
|
||||||
out("function ", ast->functionToken);
|
out("function ", ast->functionToken);
|
||||||
if (!ast->name.isNull())
|
if (!ast->name.isNull())
|
||||||
@@ -1200,7 +1200,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual bool visit(UiHeaderItemList *ast)
|
bool visit(UiHeaderItemList *ast) override
|
||||||
{
|
{
|
||||||
for (UiHeaderItemList *it = ast; it; it = it->next) {
|
for (UiHeaderItemList *it = ast; it; it = it->next) {
|
||||||
accept(it->headerItem);
|
accept(it->headerItem);
|
||||||
@@ -1210,7 +1210,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiObjectMemberList *ast)
|
bool visit(UiObjectMemberList *ast) override
|
||||||
{
|
{
|
||||||
for (UiObjectMemberList *it = ast; it; it = it->next) {
|
for (UiObjectMemberList *it = ast; it; it = it->next) {
|
||||||
accept(it->member);
|
accept(it->member);
|
||||||
@@ -1220,7 +1220,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiArrayMemberList *ast)
|
bool visit(UiArrayMemberList *ast) override
|
||||||
{
|
{
|
||||||
for (UiArrayMemberList *it = ast; it; it = it->next) {
|
for (UiArrayMemberList *it = ast; it; it = it->next) {
|
||||||
accept(it->member);
|
accept(it->member);
|
||||||
@@ -1232,7 +1232,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiQualifiedId *ast)
|
bool visit(UiQualifiedId *ast) override
|
||||||
{
|
{
|
||||||
for (UiQualifiedId *it = ast; it; it = it->next) {
|
for (UiQualifiedId *it = ast; it; it = it->next) {
|
||||||
out(it->identifierToken);
|
out(it->identifierToken);
|
||||||
@@ -1242,13 +1242,13 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(UiQualifiedPragmaId *ast)
|
bool visit(UiQualifiedPragmaId *ast) override
|
||||||
{
|
{
|
||||||
out(ast->identifierToken);
|
out(ast->identifierToken);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(Elision *ast)
|
bool visit(Elision *ast) override
|
||||||
{
|
{
|
||||||
for (Elision *it = ast; it; it = it->next) {
|
for (Elision *it = ast; it; it = it->next) {
|
||||||
if (it->next)
|
if (it->next)
|
||||||
@@ -1257,7 +1257,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(ArgumentList *ast)
|
bool visit(ArgumentList *ast) override
|
||||||
{
|
{
|
||||||
for (ArgumentList *it = ast; it; it = it->next) {
|
for (ArgumentList *it = ast; it; it = it->next) {
|
||||||
accept(it->expression);
|
accept(it->expression);
|
||||||
@@ -1269,7 +1269,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(StatementList *ast)
|
bool visit(StatementList *ast) override
|
||||||
{
|
{
|
||||||
for (StatementList *it = ast; it; it = it->next) {
|
for (StatementList *it = ast; it; it = it->next) {
|
||||||
// ### work around parser bug: skip empty statements with wrong tokens
|
// ### work around parser bug: skip empty statements with wrong tokens
|
||||||
@@ -1285,7 +1285,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(SourceElements *ast)
|
bool visit(SourceElements *ast) override
|
||||||
{
|
{
|
||||||
for (SourceElements *it = ast; it; it = it->next) {
|
for (SourceElements *it = ast; it; it = it->next) {
|
||||||
accept(it->element);
|
accept(it->element);
|
||||||
@@ -1295,7 +1295,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(VariableDeclarationList *ast)
|
bool visit(VariableDeclarationList *ast) override
|
||||||
{
|
{
|
||||||
for (VariableDeclarationList *it = ast; it; it = it->next) {
|
for (VariableDeclarationList *it = ast; it; it = it->next) {
|
||||||
accept(it->declaration);
|
accept(it->declaration);
|
||||||
@@ -1305,7 +1305,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(CaseClauses *ast)
|
bool visit(CaseClauses *ast) override
|
||||||
{
|
{
|
||||||
for (CaseClauses *it = ast; it; it = it->next) {
|
for (CaseClauses *it = ast; it; it = it->next) {
|
||||||
accept(it->clause);
|
accept(it->clause);
|
||||||
@@ -1315,7 +1315,7 @@ protected:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visit(FormalParameterList *ast)
|
bool visit(FormalParameterList *ast) override
|
||||||
{
|
{
|
||||||
for (FormalParameterList *it = ast; it; it = it->next) {
|
for (FormalParameterList *it = ast; it; it = it->next) {
|
||||||
if (it->commaToken.isValid())
|
if (it->commaToken.isValid())
|
||||||
|
@@ -342,7 +342,7 @@ void TimelineItemsGeometry::updateCurrentNode(float itemRight, float itemTop)
|
|||||||
class TimelineExpandedRowNode : public QSGNode {
|
class TimelineExpandedRowNode : public QSGNode {
|
||||||
public:
|
public:
|
||||||
TimelineItemsMaterial material;
|
TimelineItemsMaterial material;
|
||||||
virtual ~TimelineExpandedRowNode() {}
|
~TimelineExpandedRowNode() override {}
|
||||||
};
|
};
|
||||||
|
|
||||||
static qint64 startTime(const TimelineModel *model, const TimelineRenderState *parentState, int i)
|
static qint64 startTime(const TimelineModel *model, const TimelineRenderState *parentState, int i)
|
||||||
@@ -436,12 +436,12 @@ class TimelineItemsMaterialShader : public QSGMaterialShader
|
|||||||
public:
|
public:
|
||||||
TimelineItemsMaterialShader();
|
TimelineItemsMaterialShader();
|
||||||
|
|
||||||
virtual void updateState(const RenderState &state, QSGMaterial *newEffect,
|
void updateState(const RenderState &state, QSGMaterial *newEffect,
|
||||||
QSGMaterial *oldEffect);
|
QSGMaterial *oldEffect) override;
|
||||||
virtual char const *const *attributeNames() const;
|
char const *const *attributeNames() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void initialize();
|
void initialize() override;
|
||||||
|
|
||||||
int m_matrix_id;
|
int m_matrix_id;
|
||||||
int m_scale_id;
|
int m_scale_id;
|
||||||
|
@@ -220,12 +220,12 @@ class NotesMaterialShader : public QSGMaterialShader
|
|||||||
public:
|
public:
|
||||||
NotesMaterialShader();
|
NotesMaterialShader();
|
||||||
|
|
||||||
virtual void updateState(const RenderState &state, QSGMaterial *newEffect,
|
void updateState(const RenderState &state, QSGMaterial *newEffect,
|
||||||
QSGMaterial *oldEffect);
|
QSGMaterial *oldEffect) override;
|
||||||
virtual char const *const *attributeNames() const;
|
char const *const *attributeNames() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void initialize();
|
void initialize() override;
|
||||||
|
|
||||||
int m_matrix_id;
|
int m_matrix_id;
|
||||||
int m_z_range_id;
|
int m_z_range_id;
|
||||||
|
@@ -85,7 +85,7 @@ class FancyLineEditPrivate : public QObject
|
|||||||
public:
|
public:
|
||||||
explicit FancyLineEditPrivate(FancyLineEdit *parent);
|
explicit FancyLineEditPrivate(FancyLineEdit *parent);
|
||||||
|
|
||||||
virtual bool eventFilter(QObject *obj, QEvent *event);
|
bool eventFilter(QObject *obj, QEvent *event) override;
|
||||||
|
|
||||||
FancyLineEdit *m_lineEdit;
|
FancyLineEdit *m_lineEdit;
|
||||||
IconButton *m_iconbutton[2];
|
IconButton *m_iconbutton[2];
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 127 B After Width: | Height: | Size: 164 B |
Binary file not shown.
Before Width: | Height: | Size: 170 B After Width: | Height: | Size: 193 B |
BIN
src/libs/utils/images/toolbuttonexpandarrow.png
Normal file
BIN
src/libs/utils/images/toolbuttonexpandarrow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 110 B |
BIN
src/libs/utils/images/toolbuttonexpandarrow@2x.png
Normal file
BIN
src/libs/utils/images/toolbuttonexpandarrow@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 128 B |
@@ -147,7 +147,7 @@ public:
|
|||||||
BinaryVersionToolTipEventFilter(pe->lineEdit()), m_pathChooser(pe) {}
|
BinaryVersionToolTipEventFilter(pe->lineEdit()), m_pathChooser(pe) {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual QString defaultToolTip() const
|
QString defaultToolTip() const override
|
||||||
{ return m_pathChooser->errorMessage(); }
|
{ return m_pathChooser->errorMessage(); }
|
||||||
|
|
||||||
const PathChooser *m_pathChooser = nullptr;
|
const PathChooser *m_pathChooser = nullptr;
|
||||||
|
@@ -70,7 +70,7 @@ class PathListPlainTextEdit : public QPlainTextEdit {
|
|||||||
public:
|
public:
|
||||||
explicit PathListPlainTextEdit(QWidget *parent = 0);
|
explicit PathListPlainTextEdit(QWidget *parent = 0);
|
||||||
protected:
|
protected:
|
||||||
virtual void insertFromMimeData (const QMimeData *source);
|
void insertFromMimeData (const QMimeData *source) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
PathListPlainTextEdit::PathListPlainTextEdit(QWidget *parent) :
|
PathListPlainTextEdit::PathListPlainTextEdit(QWidget *parent) :
|
||||||
|
@@ -126,7 +126,7 @@ bool SaveFile::commit()
|
|||||||
m_tempFile.reset();
|
m_tempFile.reset();
|
||||||
bool result = ReplaceFile(finalFileName.toStdWString().data(),
|
bool result = ReplaceFile(finalFileName.toStdWString().data(),
|
||||||
fileName().toStdWString().data(),
|
fileName().toStdWString().data(),
|
||||||
nullptr, 0, nullptr, nullptr);
|
nullptr, REPLACEFILE_IGNORE_MERGE_ERRORS, nullptr, nullptr);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
const DWORD replaceErrorCode = GetLastError();
|
const DWORD replaceErrorCode = GetLastError();
|
||||||
QString errorStr;
|
QString errorStr;
|
||||||
|
@@ -276,6 +276,7 @@ void ShellCommand::run(QFutureInterface<void> &future)
|
|||||||
QString stdOut;
|
QString stdOut;
|
||||||
QString stdErr;
|
QString stdErr;
|
||||||
|
|
||||||
|
emit started();
|
||||||
if (d->m_progressParser)
|
if (d->m_progressParser)
|
||||||
d->m_progressParser->setFuture(&future);
|
d->m_progressParser->setFuture(&future);
|
||||||
else
|
else
|
||||||
|
@@ -154,6 +154,7 @@ public:
|
|||||||
signals:
|
signals:
|
||||||
void stdOutText(const QString &);
|
void stdOutText(const QString &);
|
||||||
void stdErrText(const QString &);
|
void stdErrText(const QString &);
|
||||||
|
void started();
|
||||||
void finished(bool ok, int exitCode, const QVariant &cookie);
|
void finished(bool ok, int exitCode, const QVariant &cookie);
|
||||||
void success(const QVariant &cookie);
|
void success(const QVariant &cookie);
|
||||||
|
|
||||||
|
@@ -90,7 +90,7 @@ public:
|
|||||||
void setFlags(unsigned tc) { m_flags = tc; }
|
void setFlags(unsigned tc) { m_flags = tc; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void setupChildProcess();
|
void setupChildProcess() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned m_flags;
|
unsigned m_flags;
|
||||||
|
@@ -207,5 +207,7 @@
|
|||||||
<file>images/lightbulb@2x.png</file>
|
<file>images/lightbulb@2x.png</file>
|
||||||
<file>images/lightbulbcap.png</file>
|
<file>images/lightbulbcap.png</file>
|
||||||
<file>images/lightbulbcap@2x.png</file>
|
<file>images/lightbulbcap@2x.png</file>
|
||||||
|
<file>images/toolbuttonexpandarrow.png</file>
|
||||||
|
<file>images/toolbuttonexpandarrow@2x.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@@ -176,7 +176,8 @@ const Icon CLOSE_SPLIT_LEFT({
|
|||||||
const Icon CLOSE_SPLIT_RIGHT({
|
const Icon CLOSE_SPLIT_RIGHT({
|
||||||
{QLatin1String(":/utils/images/splitbutton_closeright.png"), Theme::IconsBaseColor}});
|
{QLatin1String(":/utils/images/splitbutton_closeright.png"), Theme::IconsBaseColor}});
|
||||||
const Icon FILTER({
|
const Icon FILTER({
|
||||||
{QLatin1String(":/utils/images/filtericon.png"), Theme::IconsBaseColor}});
|
{QLatin1String(":/utils/images/filtericon.png"), Theme::IconsBaseColor},
|
||||||
|
{QLatin1String(":/utils/images/toolbuttonexpandarrow.png"), Theme::IconsBaseColor}});
|
||||||
const Icon LINK({
|
const Icon LINK({
|
||||||
{QLatin1String(":/utils/images/linkicon.png"), Theme::PanelTextColorMid}}, Icon::Tint);
|
{QLatin1String(":/utils/images/linkicon.png"), Theme::PanelTextColorMid}}, Icon::Tint);
|
||||||
const Icon LINK_TOOLBAR({
|
const Icon LINK_TOOLBAR({
|
||||||
|
@@ -33,8 +33,9 @@
|
|||||||
#include <cpptools/cppmodelmanager.h>
|
#include <cpptools/cppmodelmanager.h>
|
||||||
#include <projectexplorer/session.h>
|
#include <projectexplorer/session.h>
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
|
#include <utils/icon.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
#include <utils/utilsicons.h>
|
#include <utils/theme/theme.h>
|
||||||
|
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
|
|
||||||
@@ -112,7 +113,9 @@ QVariant GTestTreeItem::data(int column, int role) const
|
|||||||
case Qt::DecorationRole:
|
case Qt::DecorationRole:
|
||||||
if (type() == GroupNode
|
if (type() == GroupNode
|
||||||
&& GTestFramework::groupMode() == GTest::Constants::GTestFilter) {
|
&& GTestFramework::groupMode() == GTest::Constants::GTestFilter) {
|
||||||
return Utils::Icons::FILTER.icon(); // TODO replace by an 'inked' filter w/o arrow
|
static const QIcon filterIcon = Utils::Icon({{":/utils/images/filtericon.png",
|
||||||
|
Utils::Theme::PanelTextColorMid}}).icon();
|
||||||
|
return filterIcon;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Qt::ToolTipRole:
|
case Qt::ToolTipRole:
|
||||||
|
@@ -205,7 +205,8 @@ bool QtTestResult::matchesTestFunction(const TestTreeItem *item) const
|
|||||||
}
|
}
|
||||||
if (type == TestTreeItem::TestDataTag) {
|
if (type == TestTreeItem::TestDataTag) {
|
||||||
TestTreeItem *grandParentItem = parentItem->parentItem();
|
TestTreeItem *grandParentItem = parentItem->parentItem();
|
||||||
return parentItem->name() == m_function && grandParentItem->name() == name();
|
return parentItem->name() == m_function && grandParentItem->name() == name()
|
||||||
|
&& item->name() == m_dataTag;
|
||||||
}
|
}
|
||||||
return item->name() == m_function && parentItem->name() == name();
|
return item->name() == m_function && parentItem->name() == name();
|
||||||
}
|
}
|
||||||
|
@@ -87,6 +87,8 @@ bool Uncrustify::initialize()
|
|||||||
connect(m_settings, &UncrustifySettings::supportedMimeTypesChanged,
|
connect(m_settings, &UncrustifySettings::supportedMimeTypesChanged,
|
||||||
[this] { updateActions(Core::EditorManager::currentEditor()); });
|
[this] { updateActions(Core::EditorManager::currentEditor()); });
|
||||||
|
|
||||||
|
new UncrustifyOptionsPage(m_settings, this);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -36,12 +36,24 @@ namespace Internal {
|
|||||||
class FileInfo
|
class FileInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
FileInfo() = default;
|
||||||
|
FileInfo(Utils::FileName file,
|
||||||
|
CppTools::ProjectFile::Kind kind,
|
||||||
|
CppTools::ProjectPart::Ptr projectPart)
|
||||||
|
: file(std::move(file))
|
||||||
|
, kind(kind)
|
||||||
|
, projectPart(projectPart)
|
||||||
|
{}
|
||||||
Utils::FileName file;
|
Utils::FileName file;
|
||||||
CppTools::ProjectFile::Kind kind;
|
CppTools::ProjectFile::Kind kind;
|
||||||
CppTools::ProjectPart::Ptr projectPart;
|
CppTools::ProjectPart::Ptr projectPart;
|
||||||
};
|
};
|
||||||
|
|
||||||
using FileInfos = QVector<FileInfo>;
|
inline bool operator==(const FileInfo &lhs, const FileInfo &rhs) {
|
||||||
|
return lhs.file == rhs.file;
|
||||||
|
}
|
||||||
|
|
||||||
|
using FileInfos = std::vector<FileInfo>;
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace ClangTools
|
} // namespace ClangTools
|
||||||
|
@@ -42,11 +42,11 @@ using namespace Utils;
|
|||||||
namespace ClangTools {
|
namespace ClangTools {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
int FixitsRefactoringFile::position(unsigned line, unsigned column) const
|
int FixitsRefactoringFile::position(const QString &filePath, unsigned line, unsigned column) const
|
||||||
{
|
{
|
||||||
QTC_ASSERT(line != 0, return -1);
|
QTC_ASSERT(line != 0, return -1);
|
||||||
QTC_ASSERT(column != 0, return -1);
|
QTC_ASSERT(column != 0, return -1);
|
||||||
return document()->findBlockByNumber(line - 1).position() + column - 1;
|
return document(filePath)->findBlockByNumber(line - 1).position() + column - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QDebug operator<<(QDebug debug, const ReplacementOperation &op)
|
static QDebug operator<<(QDebug debug, const ReplacementOperation &op)
|
||||||
@@ -71,23 +71,22 @@ bool FixitsRefactoringFile::apply()
|
|||||||
|
|
||||||
QTC_ASSERT(!m_filePath.isEmpty(), return false);
|
QTC_ASSERT(!m_filePath.isEmpty(), return false);
|
||||||
|
|
||||||
// Check for permissions
|
|
||||||
if (!QFileInfo(m_filePath).isWritable())
|
|
||||||
return false; // Error file not writable
|
|
||||||
|
|
||||||
// Apply changes
|
// Apply changes
|
||||||
QTextDocument *doc = document();
|
|
||||||
QTextCursor cursor(doc);
|
|
||||||
|
|
||||||
for (int i=0; i < m_replacementOperations.size(); ++i) {
|
for (int i=0; i < m_replacementOperations.size(); ++i) {
|
||||||
ReplacementOperation &op = *m_replacementOperations[i];
|
ReplacementOperation &op = *m_replacementOperations[i];
|
||||||
if (op.apply) {
|
if (op.apply) {
|
||||||
|
// Check for permissions
|
||||||
|
if (!QFileInfo(op.fileName).isWritable())
|
||||||
|
return false; // Error file not writable
|
||||||
|
|
||||||
qCDebug(fixitsLog) << " " << i << "Applying" << op;
|
qCDebug(fixitsLog) << " " << i << "Applying" << op;
|
||||||
|
|
||||||
// Shift subsequent operations that are affected
|
// Shift subsequent operations that are affected
|
||||||
shiftAffectedReplacements(op, i + 1);
|
shiftAffectedReplacements(op, i + 1);
|
||||||
|
|
||||||
// Apply
|
// Apply
|
||||||
|
QTextDocument *doc = document(op.fileName);
|
||||||
|
QTextCursor cursor(doc);
|
||||||
cursor.setPosition(op.pos);
|
cursor.setPosition(op.pos);
|
||||||
cursor.setPosition(op.pos + op.length, QTextCursor::KeepAnchor);
|
cursor.setPosition(op.pos + op.length, QTextCursor::KeepAnchor);
|
||||||
cursor.insertText(op.text);
|
cursor.insertText(op.text);
|
||||||
@@ -99,40 +98,45 @@ bool FixitsRefactoringFile::apply()
|
|||||||
return false; // Error reading file
|
return false; // Error reading file
|
||||||
|
|
||||||
QString error;
|
QString error;
|
||||||
if (!m_textFileFormat.writeFile(m_filePath, doc->toPlainText(), &error)) {
|
for (auto it = m_documents.begin(); it != m_documents.end(); ++it) {
|
||||||
qCDebug(fixitsLog) << "ERROR: Could not write file" << m_filePath << ":" << error;
|
if (!m_textFileFormat.writeFile(it.key(), it.value()->toPlainText(), &error)) {
|
||||||
return false; // Error writing file
|
qCDebug(fixitsLog) << "ERROR: Could not write file" << it.key() << ":" << error;
|
||||||
|
return false; // Error writing file
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextDocument *FixitsRefactoringFile::document() const
|
QTextDocument *FixitsRefactoringFile::document(const QString &filePath) const
|
||||||
{
|
{
|
||||||
if (!m_document) {
|
if (m_documents.find(filePath) == m_documents.end()) {
|
||||||
QString fileContents;
|
QString fileContents;
|
||||||
if (!m_filePath.isEmpty()) {
|
if (!filePath.isEmpty()) {
|
||||||
QString error;
|
QString error;
|
||||||
QTextCodec *defaultCodec = Core::EditorManager::defaultTextCodec();
|
QTextCodec *defaultCodec = Core::EditorManager::defaultTextCodec();
|
||||||
TextFileFormat::ReadResult result = TextFileFormat::readFile(
|
TextFileFormat::ReadResult result = TextFileFormat::readFile(
|
||||||
m_filePath, defaultCodec,
|
filePath, defaultCodec,
|
||||||
&fileContents, &m_textFileFormat,
|
&fileContents, &m_textFileFormat,
|
||||||
&error);
|
&error);
|
||||||
if (result != TextFileFormat::ReadSuccess) {
|
if (result != TextFileFormat::ReadSuccess) {
|
||||||
qCDebug(fixitsLog) << "ERROR: Could not read " << m_filePath << ":" << error;
|
qCDebug(fixitsLog) << "ERROR: Could not read " << filePath << ":" << error;
|
||||||
m_textFileFormat.codec = nullptr;
|
m_textFileFormat.codec = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// always make a QTextDocument to avoid excessive null checks
|
// always make a QTextDocument to avoid excessive null checks
|
||||||
m_document = new QTextDocument(fileContents);
|
m_documents[filePath] = new QTextDocument(fileContents);
|
||||||
}
|
}
|
||||||
return m_document;
|
return m_documents[filePath];
|
||||||
}
|
}
|
||||||
|
|
||||||
void FixitsRefactoringFile::shiftAffectedReplacements(const ReplacementOperation &op, int startIndex)
|
void FixitsRefactoringFile::shiftAffectedReplacements(const ReplacementOperation &op, int startIndex)
|
||||||
{
|
{
|
||||||
for (int i = startIndex; i < m_replacementOperations.size(); ++i) {
|
for (int i = startIndex; i < m_replacementOperations.size(); ++i) {
|
||||||
ReplacementOperation ¤t = *m_replacementOperations[i];
|
ReplacementOperation ¤t = *m_replacementOperations[i];
|
||||||
|
if (op.fileName != current.fileName)
|
||||||
|
continue;
|
||||||
|
|
||||||
ReplacementOperation before = current;
|
ReplacementOperation before = current;
|
||||||
|
|
||||||
if (op.pos <= current.pos)
|
if (op.pos <= current.pos)
|
||||||
|
@@ -41,6 +41,7 @@ public:
|
|||||||
int pos = -1;
|
int pos = -1;
|
||||||
int length = -1;
|
int length = -1;
|
||||||
QString text;
|
QString text;
|
||||||
|
QString fileName;
|
||||||
bool apply = false;
|
bool apply = false;
|
||||||
};
|
};
|
||||||
using ReplacementOperations = QVector<ReplacementOperation *>;
|
using ReplacementOperations = QVector<ReplacementOperation *>;
|
||||||
@@ -52,20 +53,21 @@ class FixitsRefactoringFile
|
|||||||
public:
|
public:
|
||||||
FixitsRefactoringFile() = default;
|
FixitsRefactoringFile() = default;
|
||||||
FixitsRefactoringFile(const QString &filePath) : m_filePath(filePath) {}
|
FixitsRefactoringFile(const QString &filePath) : m_filePath(filePath) {}
|
||||||
|
~FixitsRefactoringFile() { qDeleteAll(m_documents); }
|
||||||
|
|
||||||
bool isValid() const { return !m_filePath.isEmpty(); }
|
bool isValid() const { return !m_filePath.isEmpty(); }
|
||||||
int position(unsigned line, unsigned column) const;
|
int position(const QString &filePath, unsigned line, unsigned column) const;
|
||||||
|
|
||||||
void setReplacements(const ReplacementOperations &ops) { m_replacementOperations = ops; }
|
void setReplacements(const ReplacementOperations &ops) { m_replacementOperations = ops; }
|
||||||
bool apply();
|
bool apply();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTextDocument *document() const;
|
QTextDocument *document(const QString &filePath) const;
|
||||||
void shiftAffectedReplacements(const ReplacementOperation &op, int startIndex);
|
void shiftAffectedReplacements(const ReplacementOperation &op, int startIndex);
|
||||||
|
|
||||||
QString m_filePath;
|
QString m_filePath;
|
||||||
mutable Utils::TextFileFormat m_textFileFormat;
|
mutable Utils::TextFileFormat m_textFileFormat;
|
||||||
mutable QTextDocument *m_document = nullptr;
|
mutable QHash<QString, QTextDocument *> m_documents;
|
||||||
ReplacementOperations m_replacementOperations; // Not owned.
|
ReplacementOperations m_replacementOperations; // Not owned.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -155,7 +155,7 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!node->isDir)
|
if (!node->isDir)
|
||||||
result += static_cast<TreeWithFileInfo *>(node)->info;
|
result.push_back(static_cast<TreeWithFileInfo *>(node)->info);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
@@ -194,7 +194,7 @@ private:
|
|||||||
Tree *projectDirTree = buildProjectDirTree(project->projectDirectory(),
|
Tree *projectDirTree = buildProjectDirTree(project->projectDirectory(),
|
||||||
fileInfos,
|
fileInfos,
|
||||||
outOfBaseDirFiles);
|
outOfBaseDirFiles);
|
||||||
if (outOfBaseDirFiles.isEmpty()) {
|
if (outOfBaseDirFiles.empty()) {
|
||||||
// Showing the project file and beneath the project dir is pointless in this case,
|
// Showing the project file and beneath the project dir is pointless in this case,
|
||||||
// so get rid of the root node and modify the project dir node as the new root node.
|
// so get rid of the root node and modify the project dir node as the new root node.
|
||||||
projectDirTree->name = m_root->name;
|
projectDirTree->name = m_root->name;
|
||||||
@@ -229,7 +229,7 @@ private:
|
|||||||
|
|
||||||
for (const FileInfo &fileInfo : fileInfos) {
|
for (const FileInfo &fileInfo : fileInfos) {
|
||||||
if (!fileInfo.file.isChildOf(projectDirNode->fullPath)) {
|
if (!fileInfo.file.isChildOf(projectDirNode->fullPath)) {
|
||||||
outOfBaseDirFiles += fileInfo;
|
outOfBaseDirFiles.push_back(fileInfo);
|
||||||
continue; // Handle these separately.
|
continue; // Handle these separately.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -119,13 +119,14 @@ public:
|
|||||||
|
|
||||||
const Debugger::DiagnosticLocation start = step.ranges.first();
|
const Debugger::DiagnosticLocation start = step.ranges.first();
|
||||||
const Debugger::DiagnosticLocation end = step.ranges.last();
|
const Debugger::DiagnosticLocation end = step.ranges.last();
|
||||||
const int startPos = file.position(start.line, start.column);
|
const int startPos = file.position(start.filePath, start.line, start.column);
|
||||||
const int endPos = file.position(end.line, end.column);
|
const int endPos = file.position(start.filePath, end.line, end.column);
|
||||||
|
|
||||||
auto op = new ReplacementOperation;
|
auto op = new ReplacementOperation;
|
||||||
op->pos = startPos;
|
op->pos = startPos;
|
||||||
op->length = endPos - startPos;
|
op->length = endPos - startPos;
|
||||||
op->text = step.message;
|
op->text = step.message;
|
||||||
|
op->fileName = start.filePath;
|
||||||
op->apply = apply;
|
op->apply = apply;
|
||||||
|
|
||||||
replacements += op;
|
replacements += op;
|
||||||
@@ -332,7 +333,7 @@ void ClangTidyClazyTool::startTool(bool askUserForFileSelection)
|
|||||||
QTC_ASSERT(project, return);
|
QTC_ASSERT(project, return);
|
||||||
|
|
||||||
const FileInfos fileInfos = collectFileInfos(project, askUserForFileSelection);
|
const FileInfos fileInfos = collectFileInfos(project, askUserForFileSelection);
|
||||||
if (fileInfos.isEmpty())
|
if (fileInfos.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto clangTool = new ClangTidyClazyRunControl(runControl,
|
auto clangTool = new ClangTidyClazyRunControl(runControl,
|
||||||
|
@@ -78,13 +78,13 @@ static FileInfos sortedFileInfos(const QVector<CppTools::ProjectPart::Ptr> &proj
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (CppTools::ProjectFile::isSource(file.kind)) {
|
if (CppTools::ProjectFile::isSource(file.kind)) {
|
||||||
const FileInfo info{Utils::FileName::fromString(file.path), file.kind, projectPart};
|
fileInfos.emplace_back(Utils::FileName::fromString(file.path), file.kind, projectPart);
|
||||||
fileInfos.append(info);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils::sort(fileInfos, &FileInfo::file);
|
Utils::sort(fileInfos, &FileInfo::file);
|
||||||
|
fileInfos.erase(std::unique(fileInfos.begin(), fileInfos.end()), fileInfos.end());
|
||||||
|
|
||||||
return fileInfos;
|
return fileInfos;
|
||||||
}
|
}
|
||||||
|
@@ -157,6 +157,7 @@ public:
|
|||||||
|
|
||||||
QFileSystemWatcher *m_fileWatcher = nullptr; // Delayed creation.
|
QFileSystemWatcher *m_fileWatcher = nullptr; // Delayed creation.
|
||||||
QFileSystemWatcher *m_linkWatcher = nullptr; // Delayed creation (only UNIX/if a link is seen).
|
QFileSystemWatcher *m_linkWatcher = nullptr; // Delayed creation (only UNIX/if a link is seen).
|
||||||
|
bool m_postponeAutoReload = false;
|
||||||
bool m_blockActivated = false;
|
bool m_blockActivated = false;
|
||||||
bool m_checkOnFocusChange = false;
|
bool m_checkOnFocusChange = false;
|
||||||
QString m_lastVisitedDirectory = QDir::currentPath();
|
QString m_lastVisitedDirectory = QDir::currentPath();
|
||||||
@@ -597,6 +598,13 @@ void DocumentManager::unexpectFileChange(const QString &fileName)
|
|||||||
updateExpectedState(filePathKey(fileName, ResolveLinks));
|
updateExpectedState(filePathKey(fileName, ResolveLinks));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DocumentManager::setAutoReloadPostponed(bool postponed)
|
||||||
|
{
|
||||||
|
d->m_postponeAutoReload = postponed;
|
||||||
|
if (!postponed)
|
||||||
|
QTimer::singleShot(500, m_instance, &DocumentManager::checkForReload);
|
||||||
|
}
|
||||||
|
|
||||||
static bool saveModifiedFilesHelper(const QList<IDocument *> &documents,
|
static bool saveModifiedFilesHelper(const QList<IDocument *> &documents,
|
||||||
const QString &message, bool *cancelled, bool silently,
|
const QString &message, bool *cancelled, bool silently,
|
||||||
const QString &alwaysSaveMessage, bool *alwaysSave,
|
const QString &alwaysSaveMessage, bool *alwaysSave,
|
||||||
@@ -990,7 +998,7 @@ void DocumentManager::changedFile(const QString &fileName)
|
|||||||
|
|
||||||
void DocumentManager::checkForReload()
|
void DocumentManager::checkForReload()
|
||||||
{
|
{
|
||||||
if (d->m_changedFiles.isEmpty())
|
if (d->m_postponeAutoReload || d->m_changedFiles.isEmpty())
|
||||||
return;
|
return;
|
||||||
if (QApplication::applicationState() != Qt::ApplicationActive)
|
if (QApplication::applicationState() != Qt::ApplicationActive)
|
||||||
return;
|
return;
|
||||||
|
@@ -69,6 +69,8 @@ public:
|
|||||||
static void expectFileChange(const QString &fileName);
|
static void expectFileChange(const QString &fileName);
|
||||||
static void unexpectFileChange(const QString &fileName);
|
static void unexpectFileChange(const QString &fileName);
|
||||||
|
|
||||||
|
static void setAutoReloadPostponed(bool enabled);
|
||||||
|
|
||||||
// recent files
|
// recent files
|
||||||
static void addToRecentFiles(const QString &fileName, Id editorId = Id());
|
static void addToRecentFiles(const QString &fileName, Id editorId = Id());
|
||||||
Q_SLOT void clearRecentFiles();
|
Q_SLOT void clearRecentFiles();
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include "fancyactionbar.h"
|
#include "fancyactionbar.h"
|
||||||
|
|
||||||
#include <utils/hostosinfo.h>
|
#include <utils/hostosinfo.h>
|
||||||
|
#include <utils/qtcassert.h>
|
||||||
#include <utils/styledbar.h>
|
#include <utils/styledbar.h>
|
||||||
#include <utils/stylehelper.h>
|
#include <utils/stylehelper.h>
|
||||||
#include <utils/theme/theme.h>
|
#include <utils/theme/theme.h>
|
||||||
@@ -599,6 +600,12 @@ void FancyTabWidget::showWidget(int index)
|
|||||||
{
|
{
|
||||||
emit currentAboutToShow(index);
|
emit currentAboutToShow(index);
|
||||||
m_modesStack->setCurrentIndex(index);
|
m_modesStack->setCurrentIndex(index);
|
||||||
|
QWidget *w = m_modesStack->currentWidget();
|
||||||
|
if (QTC_GUARD(w)) {
|
||||||
|
if (QWidget *focusWidget = w->focusWidget())
|
||||||
|
w = focusWidget;
|
||||||
|
w->setFocus();
|
||||||
|
}
|
||||||
emit currentChanged(index);
|
emit currentChanged(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1882,8 +1882,8 @@ bool matchName(const Name *name, QList<Core::LocatorFilterEntry> *matches, QStri
|
|||||||
if (!name)
|
if (!name)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (CppClassesFilter *classesFilter
|
if (Core::ILocatorFilter *classesFilter
|
||||||
= ExtensionSystem::PluginManager::getObject<CppClassesFilter>()) {
|
= CppTools::CppModelManager::instance()->classesFilter()) {
|
||||||
QFutureInterface<Core::LocatorFilterEntry> dummy;
|
QFutureInterface<Core::LocatorFilterEntry> dummy;
|
||||||
|
|
||||||
const Overview oo;
|
const Overview oo;
|
||||||
|
@@ -129,28 +129,10 @@ void CompilerOptionsBuilder::enableExceptions()
|
|||||||
add(QLatin1String("-fexceptions"));
|
add(QLatin1String("-fexceptions"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static Utils::FileName absoluteDirectory(const QString &filePath)
|
|
||||||
{
|
|
||||||
return Utils::FileName::fromString(QFileInfo(filePath + '/').absolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
static Utils::FileName projectTopLevelDirectory(const ProjectPart &projectPart)
|
|
||||||
{
|
|
||||||
if (!projectPart.project)
|
|
||||||
return Utils::FileName();
|
|
||||||
const Utils::FileName result = projectPart.project->projectDirectory();
|
|
||||||
const Utils::FileName vcsTopLevel = Utils::FileName::fromString(
|
|
||||||
Core::VcsManager::findTopLevelForDirectory(result.toString()));
|
|
||||||
if (result.isChildOf(vcsTopLevel))
|
|
||||||
return vcsTopLevel;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CompilerOptionsBuilder::addHeaderPathOptions()
|
void CompilerOptionsBuilder::addHeaderPathOptions()
|
||||||
{
|
{
|
||||||
typedef ProjectPartHeaderPath HeaderPath;
|
typedef ProjectPartHeaderPath HeaderPath;
|
||||||
const QString defaultPrefix = includeDirOption();
|
const QString defaultPrefix = includeDirOption();
|
||||||
const Utils::FileName projectDirectory = projectTopLevelDirectory(m_projectPart);
|
|
||||||
|
|
||||||
QStringList result;
|
QStringList result;
|
||||||
|
|
||||||
@@ -170,14 +152,7 @@ void CompilerOptionsBuilder::addHeaderPathOptions()
|
|||||||
default: // This shouldn't happen, but let's be nice..:
|
default: // This shouldn't happen, but let's be nice..:
|
||||||
// intentional fall-through:
|
// intentional fall-through:
|
||||||
case HeaderPath::IncludePath:
|
case HeaderPath::IncludePath:
|
||||||
path = absoluteDirectory(headerPath.path);
|
prefix = defaultPrefix;
|
||||||
if (projectDirectory.isEmpty()
|
|
||||||
|| path == projectDirectory
|
|
||||||
|| path.isChildOf(projectDirectory)) {
|
|
||||||
prefix = defaultPrefix;
|
|
||||||
} else {
|
|
||||||
prefix = SYSTEM_INCLUDE_PREFIX;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -96,7 +96,7 @@ class CppCurrentDocumentFilterTestCase
|
|||||||
public:
|
public:
|
||||||
CppCurrentDocumentFilterTestCase(const QString &fileName,
|
CppCurrentDocumentFilterTestCase(const QString &fileName,
|
||||||
const ResultDataList &expectedResults)
|
const ResultDataList &expectedResults)
|
||||||
: BasicLocatorFilterTest(PluginManager::getObject<CppCurrentDocumentFilter>())
|
: BasicLocatorFilterTest(CppTools::CppModelManager::instance()->currentDocumentFilter())
|
||||||
, m_editor(0)
|
, m_editor(0)
|
||||||
, m_fileName(fileName)
|
, m_fileName(fileName)
|
||||||
{
|
{
|
||||||
@@ -158,9 +158,11 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data()
|
|||||||
QTest::addColumn<QString>("searchText");
|
QTest::addColumn<QString>("searchText");
|
||||||
QTest::addColumn<ResultDataList>("expectedResults");
|
QTest::addColumn<ResultDataList>("expectedResults");
|
||||||
|
|
||||||
ILocatorFilter *cppFunctionsFilter = PluginManager::getObject<CppFunctionsFilter>();
|
CppModelManager *cppModelManager = CppModelManager::instance();
|
||||||
ILocatorFilter *cppClassesFilter = PluginManager::getObject<CppClassesFilter>();
|
|
||||||
ILocatorFilter *cppLocatorFilter = PluginManager::getObject<CppLocatorFilter>();
|
ILocatorFilter *cppFunctionsFilter = cppModelManager->functionsFilter();
|
||||||
|
ILocatorFilter *cppClassesFilter = cppModelManager->classesFilter();
|
||||||
|
ILocatorFilter *cppLocatorFilter = cppModelManager->locatorFilter();
|
||||||
|
|
||||||
MyTestDataDir testDirectory("testdata_basic");
|
MyTestDataDir testDirectory("testdata_basic");
|
||||||
const QString testFile = testDirectory.file("file1.cpp");
|
const QString testFile = testDirectory.file("file1.cpp");
|
||||||
|
@@ -390,6 +390,36 @@ void CppModelManager::setCurrentDocumentFilter(std::unique_ptr<Core::ILocatorFil
|
|||||||
setFilter(d->m_currentDocumentFilter, std::move(filter));
|
setFilter(d->m_currentDocumentFilter, std::move(filter));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Core::ILocatorFilter *CppModelManager::locatorFilter() const
|
||||||
|
{
|
||||||
|
return d->m_locatorFilter.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::ILocatorFilter *CppModelManager::classesFilter() const
|
||||||
|
{
|
||||||
|
return d->m_classesFilter.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::ILocatorFilter *CppModelManager::includesFilter() const
|
||||||
|
{
|
||||||
|
return d->m_includesFilter.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::ILocatorFilter *CppModelManager::functionsFilter() const
|
||||||
|
{
|
||||||
|
return d->m_functionsFilter.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::IFindFilter *CppModelManager::symbolsFindFilter() const
|
||||||
|
{
|
||||||
|
return d->m_symbolsFindFilter.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::ILocatorFilter *CppModelManager::currentDocumentFilter() const
|
||||||
|
{
|
||||||
|
return d->m_currentDocumentFilter.get();
|
||||||
|
}
|
||||||
|
|
||||||
FollowSymbolInterface &CppModelManager::followSymbolInterface() const
|
FollowSymbolInterface &CppModelManager::followSymbolInterface() const
|
||||||
{
|
{
|
||||||
return d->m_activeModelManagerSupport->followSymbolInterface();
|
return d->m_activeModelManagerSupport->followSymbolInterface();
|
||||||
|
@@ -219,6 +219,13 @@ public:
|
|||||||
void setSymbolsFindFilter(std::unique_ptr<Core::IFindFilter> &&filter);
|
void setSymbolsFindFilter(std::unique_ptr<Core::IFindFilter> &&filter);
|
||||||
void setCurrentDocumentFilter(std::unique_ptr<Core::ILocatorFilter> &&filter);
|
void setCurrentDocumentFilter(std::unique_ptr<Core::ILocatorFilter> &&filter);
|
||||||
|
|
||||||
|
Core::ILocatorFilter *locatorFilter() const;
|
||||||
|
Core::ILocatorFilter *classesFilter() const;
|
||||||
|
Core::ILocatorFilter *includesFilter() const;
|
||||||
|
Core::ILocatorFilter *functionsFilter() const;
|
||||||
|
Core::IFindFilter *symbolsFindFilter() const;
|
||||||
|
Core::ILocatorFilter *currentDocumentFilter() const;
|
||||||
|
|
||||||
void renameIncludes(const QString &oldFileName, const QString &newFileName);
|
void renameIncludes(const QString &oldFileName, const QString &newFileName);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
@@ -486,6 +486,7 @@ void DebuggerEngine::start()
|
|||||||
d->m_runTool->runControl()->setApplicationProcessHandle(d->m_inferiorPid);
|
d->m_runTool->runControl()->setApplicationProcessHandle(d->m_inferiorPid);
|
||||||
|
|
||||||
action(OperateByInstruction)->setEnabled(hasCapability(DisassemblerCapability));
|
action(OperateByInstruction)->setEnabled(hasCapability(DisassemblerCapability));
|
||||||
|
action(OperateByInstruction)->setChecked(boolSetting(OperateByInstruction));
|
||||||
|
|
||||||
QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished,
|
QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished,
|
||||||
qDebug() << state());
|
qDebug() << state());
|
||||||
@@ -534,8 +535,10 @@ void DebuggerEngine::gotoLocation(const Location &loc)
|
|||||||
const QString file = QDir::cleanPath(loc.fileName());
|
const QString file = QDir::cleanPath(loc.fileName());
|
||||||
const int line = loc.lineNumber();
|
const int line = loc.lineNumber();
|
||||||
bool newEditor = false;
|
bool newEditor = false;
|
||||||
IEditor *editor = EditorManager::openEditor(file, Id(),
|
IEditor *editor = EditorManager::openEditor(
|
||||||
EditorManager::IgnoreNavigationHistory, &newEditor);
|
file, Id(),
|
||||||
|
EditorManager::IgnoreNavigationHistory | EditorManager::DoNotSwitchToDesignMode,
|
||||||
|
&newEditor);
|
||||||
QTC_ASSERT(editor, return); // Unreadable file?
|
QTC_ASSERT(editor, return); // Unreadable file?
|
||||||
|
|
||||||
editor->gotoLine(line, 0, !boolSetting(StationaryEditorWhileStepping));
|
editor->gotoLine(line, 0, !boolSetting(StationaryEditorWhileStepping));
|
||||||
|
@@ -108,7 +108,8 @@ bool ElementTasks::hasClassDefinition(const qmt::MElement *element) const
|
|||||||
? klass->name()
|
? klass->name()
|
||||||
: klass->umlNamespace() + "::" + klass->name();
|
: klass->umlNamespace() + "::" + klass->name();
|
||||||
|
|
||||||
CppTools::CppClassesFilter *classesFilter = ExtensionSystem::PluginManager::getObject<CppTools::CppClassesFilter>();
|
Core::ILocatorFilter *classesFilter
|
||||||
|
= CppTools::CppModelManager::instance()->classesFilter();
|
||||||
if (!classesFilter)
|
if (!classesFilter)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -144,7 +145,8 @@ void ElementTasks::openClassDefinition(const qmt::MElement *element)
|
|||||||
? klass->name()
|
? klass->name()
|
||||||
: klass->umlNamespace() + "::" + klass->name();
|
: klass->umlNamespace() + "::" + klass->name();
|
||||||
|
|
||||||
CppTools::CppClassesFilter *classesFilter = ExtensionSystem::PluginManager::getObject<CppTools::CppClassesFilter>();
|
Core::ILocatorFilter *classesFilter
|
||||||
|
= CppTools::CppModelManager::instance()->classesFilter();
|
||||||
if (!classesFilter)
|
if (!classesFilter)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@@ -160,7 +160,7 @@ ApplicationLauncherPrivate::ApplicationLauncherPrivate(ApplicationLauncher *pare
|
|||||||
connect(WinDebugInterface::instance(), &WinDebugInterface::cannotRetrieveDebugOutput,
|
connect(WinDebugInterface::instance(), &WinDebugInterface::cannotRetrieveDebugOutput,
|
||||||
this, &ApplicationLauncherPrivate::cannotRetrieveLocalDebugOutput);
|
this, &ApplicationLauncherPrivate::cannotRetrieveLocalDebugOutput);
|
||||||
connect(WinDebugInterface::instance(), &WinDebugInterface::debugOutput,
|
connect(WinDebugInterface::instance(), &WinDebugInterface::debugOutput,
|
||||||
this, &ApplicationLauncherPrivate::checkLocalDebugOutput, Qt::BlockingQueuedConnection);
|
this, &ApplicationLauncherPrivate::checkLocalDebugOutput);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -604,6 +604,7 @@ bool FolderNode::isAncesterOf(Node *n)
|
|||||||
|
|
||||||
bool FolderNode::replaceSubtree(Node *oldNode, std::unique_ptr<Node> &&newNode)
|
bool FolderNode::replaceSubtree(Node *oldNode, std::unique_ptr<Node> &&newNode)
|
||||||
{
|
{
|
||||||
|
std::unique_ptr<Node> keepAlive;
|
||||||
if (!oldNode) {
|
if (!oldNode) {
|
||||||
addNode(std::move(newNode)); // Happens e.g. when a project is registered
|
addNode(std::move(newNode)); // Happens e.g. when a project is registered
|
||||||
} else {
|
} else {
|
||||||
@@ -614,9 +615,10 @@ bool FolderNode::replaceSubtree(Node *oldNode, std::unique_ptr<Node> &&newNode)
|
|||||||
QTC_ASSERT(it != m_nodes.end(), return false);
|
QTC_ASSERT(it != m_nodes.end(), return false);
|
||||||
if (newNode) {
|
if (newNode) {
|
||||||
newNode->setParentFolderNode(this);
|
newNode->setParentFolderNode(this);
|
||||||
|
keepAlive = std::move(*it);
|
||||||
*it = std::move(newNode);
|
*it = std::move(newNode);
|
||||||
} else {
|
} else {
|
||||||
takeNode(oldNode); // Happens e.g. when project is shutting down
|
keepAlive = takeNode(oldNode); // Happens e.g. when project is shutting down
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
handleSubTreeChanged(this);
|
handleSubTreeChanged(this);
|
||||||
|
@@ -331,10 +331,18 @@ TaskFilterModel::TaskFilterModel(TaskModel *sourceModel, QObject *parent) : QAbs
|
|||||||
|
|
||||||
connect(m_sourceModel, &QAbstractItemModel::rowsInserted,
|
connect(m_sourceModel, &QAbstractItemModel::rowsInserted,
|
||||||
this, &TaskFilterModel::handleNewRows);
|
this, &TaskFilterModel::handleNewRows);
|
||||||
|
|
||||||
connect(m_sourceModel, &QAbstractItemModel::rowsAboutToBeRemoved,
|
connect(m_sourceModel, &QAbstractItemModel::rowsAboutToBeRemoved,
|
||||||
this, &TaskFilterModel::handleRowsAboutToBeRemoved);
|
this, &TaskFilterModel::handleRowsAboutToBeRemoved);
|
||||||
|
connect(m_sourceModel, &QAbstractItemModel::rowsRemoved,
|
||||||
|
this, [this](const QModelIndex &parent, int, int) {
|
||||||
|
QTC_ASSERT(!parent.isValid(), return);
|
||||||
|
endRemoveRows();
|
||||||
|
});
|
||||||
|
|
||||||
connect(m_sourceModel, &QAbstractItemModel::modelReset,
|
connect(m_sourceModel, &QAbstractItemModel::modelReset,
|
||||||
this, &TaskFilterModel::handleReset);
|
this, &TaskFilterModel::invalidateFilter);
|
||||||
|
|
||||||
connect(m_sourceModel, &QAbstractItemModel::dataChanged,
|
connect(m_sourceModel, &QAbstractItemModel::dataChanged,
|
||||||
this, &TaskFilterModel::handleDataChanged);
|
this, &TaskFilterModel::handleDataChanged);
|
||||||
|
|
||||||
@@ -383,8 +391,9 @@ static QPair<int, int> findFilteredRange(int first, int last, const QList<int> &
|
|||||||
|
|
||||||
void TaskFilterModel::handleNewRows(const QModelIndex &index, int first, int last)
|
void TaskFilterModel::handleNewRows(const QModelIndex &index, int first, int last)
|
||||||
{
|
{
|
||||||
if (index.isValid())
|
QTC_ASSERT(!index.isValid(), return);
|
||||||
return;
|
|
||||||
|
const int newItemCount = last - first + 1;
|
||||||
|
|
||||||
QList<int> newMapping;
|
QList<int> newMapping;
|
||||||
for (int i = first; i <= last; ++i) {
|
for (int i = first; i <= last; ++i) {
|
||||||
@@ -393,8 +402,8 @@ void TaskFilterModel::handleNewRows(const QModelIndex &index, int first, int las
|
|||||||
newMapping.append(i);
|
newMapping.append(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
const int newItems = newMapping.count();
|
const int newMappingCount = newMapping.count();
|
||||||
if (!newItems)
|
if (!newMappingCount)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int filteredFirst = -1;
|
int filteredFirst = -1;
|
||||||
@@ -403,36 +412,35 @@ void TaskFilterModel::handleNewRows(const QModelIndex &index, int first, int las
|
|||||||
else
|
else
|
||||||
filteredFirst = std::lower_bound(m_mapping.constBegin(), m_mapping.constEnd(), first) - m_mapping.constBegin();
|
filteredFirst = std::lower_bound(m_mapping.constBegin(), m_mapping.constEnd(), first) - m_mapping.constBegin();
|
||||||
|
|
||||||
const int filteredLast = filteredFirst + newItems - 1;
|
const int filteredLast = filteredFirst + newMappingCount - 1;
|
||||||
beginInsertRows(QModelIndex(), filteredFirst, filteredLast);
|
beginInsertRows(QModelIndex(), filteredFirst, filteredLast);
|
||||||
if (filteredFirst == m_mapping.count()) {
|
if (filteredFirst == m_mapping.count()) {
|
||||||
m_mapping.append(newMapping);
|
m_mapping.append(newMapping);
|
||||||
} else {
|
} else {
|
||||||
QList<int> rest = m_mapping.mid(filteredFirst);
|
const QList<int> rest = m_mapping.mid(filteredFirst);
|
||||||
|
|
||||||
m_mapping.reserve(m_mapping.count() + newItems);
|
m_mapping.reserve(m_mapping.count() + newMappingCount);
|
||||||
m_mapping.erase(m_mapping.begin() + filteredFirst, m_mapping.end());
|
m_mapping.erase(m_mapping.begin() + filteredFirst, m_mapping.end());
|
||||||
m_mapping.append(newMapping);
|
m_mapping.append(newMapping);
|
||||||
foreach (int pos, rest)
|
for (int pos : rest)
|
||||||
m_mapping.append(pos + newItems);
|
m_mapping.append(pos + newItemCount);
|
||||||
}
|
}
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskFilterModel::handleRowsAboutToBeRemoved(const QModelIndex &index, int first, int last)
|
void TaskFilterModel::handleRowsAboutToBeRemoved(const QModelIndex &index, int first, int last)
|
||||||
{
|
{
|
||||||
if (index.isValid())
|
QTC_ASSERT(!index.isValid(), return);
|
||||||
return;
|
|
||||||
|
|
||||||
const QPair<int, int> range = findFilteredRange(first, last, m_mapping);
|
const QPair<int, int> range = findFilteredRange(first, last, m_mapping);
|
||||||
if (range.first > range.second)
|
if (range.first > range.second) // rows to be removed are filtered out
|
||||||
return;
|
return;
|
||||||
|
|
||||||
beginRemoveRows(QModelIndex(), range.first, range.second);
|
beginRemoveRows(QModelIndex(), range.first, range.second);
|
||||||
m_mapping.erase(m_mapping.begin() + range.first, m_mapping.begin() + range.second + 1);
|
m_mapping.erase(m_mapping.begin() + range.first, m_mapping.begin() + range.second + 1);
|
||||||
|
const int sourceRemovedCount = (last - first) + 1;
|
||||||
for (int i = range.first; i < m_mapping.count(); ++i)
|
for (int i = range.first; i < m_mapping.count(); ++i)
|
||||||
m_mapping[i] = m_mapping.at(i) - (last - first) - 1;
|
m_mapping[i] = m_mapping.at(i) - sourceRemovedCount;
|
||||||
endRemoveRows();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskFilterModel::handleDataChanged(const QModelIndex &top, const QModelIndex &bottom)
|
void TaskFilterModel::handleDataChanged(const QModelIndex &top, const QModelIndex &bottom)
|
||||||
@@ -444,24 +452,21 @@ void TaskFilterModel::handleDataChanged(const QModelIndex &top, const QModelInde
|
|||||||
emit dataChanged(index(range.first, top.column()), index(range.second, bottom.column()));
|
emit dataChanged(index(range.first, top.column()), index(range.second, bottom.column()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskFilterModel::handleReset()
|
|
||||||
{
|
|
||||||
invalidateFilter();
|
|
||||||
}
|
|
||||||
|
|
||||||
QModelIndex TaskFilterModel::mapFromSource(const QModelIndex &idx) const
|
QModelIndex TaskFilterModel::mapFromSource(const QModelIndex &idx) const
|
||||||
{
|
{
|
||||||
auto it = std::lower_bound(m_mapping.constBegin(), m_mapping.constEnd(), idx.row());
|
if (!idx.isValid())
|
||||||
if (it == m_mapping.constEnd() || idx.row() != *it)
|
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
|
auto it = std::lower_bound(m_mapping.constBegin(), m_mapping.constEnd(), idx.row());
|
||||||
|
QTC_ASSERT(it != m_mapping.constEnd() && idx.row() == *it, return QModelIndex());
|
||||||
return index(it - m_mapping.constBegin(), 0);
|
return index(it - m_mapping.constBegin(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex TaskFilterModel::mapToSource(const QModelIndex &index) const
|
QModelIndex TaskFilterModel::mapToSource(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
int row = index.row();
|
if (!index.isValid())
|
||||||
if (row >= m_mapping.count())
|
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
|
int row = index.row();
|
||||||
|
QTC_ASSERT(row >= 0 && row < m_mapping.count(), return QModelIndex());
|
||||||
return m_sourceModel->index(m_mapping.at(row), index.column(), index.parent());
|
return m_sourceModel->index(m_mapping.at(row), index.column(), index.parent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -159,7 +159,6 @@ private:
|
|||||||
void handleNewRows(const QModelIndex &index, int first, int last);
|
void handleNewRows(const QModelIndex &index, int first, int last);
|
||||||
void handleRowsAboutToBeRemoved(const QModelIndex &index, int first, int last);
|
void handleRowsAboutToBeRemoved(const QModelIndex &index, int first, int last);
|
||||||
void handleDataChanged(const QModelIndex &top, const QModelIndex &bottom);
|
void handleDataChanged(const QModelIndex &top, const QModelIndex &bottom);
|
||||||
void handleReset();
|
|
||||||
|
|
||||||
QModelIndex mapToSource(const QModelIndex &index) const;
|
QModelIndex mapToSource(const QModelIndex &index) const;
|
||||||
void invalidateFilter();
|
void invalidateFilter();
|
||||||
|
@@ -27,10 +27,11 @@
|
|||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
|
||||||
#include <windows.h>
|
#include <utils/qtcassert.h>
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QMap>
|
#include <qt_windows.h>
|
||||||
#include <QTime>
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class ProjectExplorer::Internal::WinDebugInterface
|
\class ProjectExplorer::Internal::WinDebugInterface
|
||||||
@@ -67,6 +68,8 @@ WinDebugInterface::WinDebugInterface(QObject *parent) :
|
|||||||
m_instance = this;
|
m_instance = this;
|
||||||
m_creatorPid = QCoreApplication::applicationPid();
|
m_creatorPid = QCoreApplication::applicationPid();
|
||||||
setObjectName(QLatin1String("WinDebugInterfaceThread"));
|
setObjectName(QLatin1String("WinDebugInterfaceThread"));
|
||||||
|
connect(this, &WinDebugInterface::_q_debugOutputReady,
|
||||||
|
this, &WinDebugInterface::dispatchDebugOutput, Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
WinDebugInterface::~WinDebugInterface()
|
WinDebugInterface::~WinDebugInterface()
|
||||||
@@ -131,41 +134,18 @@ bool WinDebugInterface::runLoop()
|
|||||||
|
|
||||||
SetEvent(m_bufferReadyEvent);
|
SetEvent(m_bufferReadyEvent);
|
||||||
|
|
||||||
QTime timer; // time since last signal sent
|
|
||||||
timer.start();
|
|
||||||
|
|
||||||
QMap<qint64, QString> delayedMessages;
|
|
||||||
|
|
||||||
auto flushMessages = [this, &delayedMessages, &timer](){
|
|
||||||
auto it = delayedMessages.constBegin();
|
|
||||||
auto end = delayedMessages.constEnd();
|
|
||||||
for (; it != end; ++it)
|
|
||||||
emit debugOutput(it.key(), it.value());
|
|
||||||
delayedMessages.clear();
|
|
||||||
timer.start();
|
|
||||||
};
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
DWORD timeout = INFINITE;
|
const DWORD ret = WaitForMultipleObjects(HandleCount, m_waitHandles, FALSE, INFINITE);
|
||||||
if (!delayedMessages.isEmpty()) // if we have delayed message, don't wait forever
|
|
||||||
timeout = qMax(60 - timer.elapsed(), 1);
|
|
||||||
const DWORD ret = WaitForMultipleObjects(HandleCount, m_waitHandles, FALSE, timeout);
|
|
||||||
|
|
||||||
if (ret == WAIT_FAILED || ret - WAIT_OBJECT_0 == TerminateEventHandle) {
|
if (ret == WAIT_FAILED || ret - WAIT_OBJECT_0 == TerminateEventHandle) {
|
||||||
flushMessages();
|
std::lock_guard<std::mutex> guard(m_outputMutex);
|
||||||
|
emitReadySignal();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ret == WAIT_TIMEOUT) {
|
if (ret - WAIT_OBJECT_0 == DataReadyEventHandle) {
|
||||||
flushMessages();
|
|
||||||
SetEvent(m_bufferReadyEvent);
|
|
||||||
} else if (ret - WAIT_OBJECT_0 == DataReadyEventHandle) {
|
|
||||||
if (*processId != m_creatorPid) {
|
if (*processId != m_creatorPid) {
|
||||||
if (timer.elapsed() < 60) {
|
std::lock_guard<std::mutex> guard(m_outputMutex);
|
||||||
delayedMessages[*processId].append(QString::fromLocal8Bit(message));
|
m_debugOutput[*processId].push_back(QString::fromLocal8Bit(message));
|
||||||
} else {
|
emitReadySignal();
|
||||||
delayedMessages[*processId] += QString::fromLocal8Bit(message);
|
|
||||||
flushMessages();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SetEvent(m_bufferReadyEvent);
|
SetEvent(m_bufferReadyEvent);
|
||||||
}
|
}
|
||||||
@@ -173,6 +153,49 @@ bool WinDebugInterface::runLoop()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WinDebugInterface::emitReadySignal()
|
||||||
|
{
|
||||||
|
// This function must be called from the WinDebugInterface thread only.
|
||||||
|
QTC_ASSERT(QThread::currentThread() == this, return);
|
||||||
|
|
||||||
|
if (m_debugOutput.empty() || m_readySignalEmitted)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_readySignalEmitted = true;
|
||||||
|
emit _q_debugOutputReady();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WinDebugInterface::dispatchDebugOutput()
|
||||||
|
{
|
||||||
|
// Called in the thread this object was created in, not in the WinDebugInterfaceThread.
|
||||||
|
QTC_ASSERT(QThread::currentThread() == QCoreApplication::instance()->thread(), return);
|
||||||
|
|
||||||
|
static size_t maxMessagesToSend = 100;
|
||||||
|
std::vector<std::pair<qint64, QString>> output;
|
||||||
|
bool hasMoreOutput = false;
|
||||||
|
|
||||||
|
m_outputMutex.lock();
|
||||||
|
for (auto &entry : m_debugOutput) {
|
||||||
|
std::vector<QString> &src = entry.second;
|
||||||
|
QString dst;
|
||||||
|
size_t n = std::min(maxMessagesToSend, src.size());
|
||||||
|
for (size_t i = 0; i < n; ++i)
|
||||||
|
dst += src.at(i);
|
||||||
|
src.erase(src.begin(), std::next(src.begin(), n));
|
||||||
|
if (!src.empty())
|
||||||
|
hasMoreOutput = true;
|
||||||
|
output.emplace_back(entry.first, std::move(dst));
|
||||||
|
}
|
||||||
|
if (!hasMoreOutput)
|
||||||
|
m_readySignalEmitted = false;
|
||||||
|
m_outputMutex.unlock();
|
||||||
|
|
||||||
|
for (auto p : output)
|
||||||
|
emit debugOutput(p.first, p.second);
|
||||||
|
if (hasMoreOutput)
|
||||||
|
emit _q_debugOutputReady();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|
||||||
@@ -193,6 +216,10 @@ void WinDebugInterface::run() { }
|
|||||||
|
|
||||||
bool WinDebugInterface::runLoop() { return false; }
|
bool WinDebugInterface::runLoop() { return false; }
|
||||||
|
|
||||||
|
void WinDebugInterface::emitReadySignal() { }
|
||||||
|
|
||||||
|
void WinDebugInterface::dispatchDebugOutput() { }
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|
||||||
|
@@ -25,8 +25,13 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <QMap>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <mutex>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
@@ -45,12 +50,15 @@ public:
|
|||||||
signals:
|
signals:
|
||||||
void debugOutput(qint64 pid, const QString &message);
|
void debugOutput(qint64 pid, const QString &message);
|
||||||
void cannotRetrieveDebugOutput();
|
void cannotRetrieveDebugOutput();
|
||||||
|
void _q_debugOutputReady();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum Handles { DataReadyEventHandle, TerminateEventHandle, HandleCount };
|
enum Handles { DataReadyEventHandle, TerminateEventHandle, HandleCount };
|
||||||
|
|
||||||
void run() override;
|
void run() override;
|
||||||
bool runLoop();
|
bool runLoop();
|
||||||
|
void emitReadySignal();
|
||||||
|
void dispatchDebugOutput();
|
||||||
|
|
||||||
static WinDebugInterface *m_instance;
|
static WinDebugInterface *m_instance;
|
||||||
|
|
||||||
@@ -59,6 +67,9 @@ private:
|
|||||||
Qt::HANDLE m_bufferReadyEvent = nullptr;
|
Qt::HANDLE m_bufferReadyEvent = nullptr;
|
||||||
Qt::HANDLE m_sharedFile = nullptr;
|
Qt::HANDLE m_sharedFile = nullptr;
|
||||||
void *m_sharedMem = nullptr;
|
void *m_sharedMem = nullptr;
|
||||||
|
std::mutex m_outputMutex;
|
||||||
|
bool m_readySignalEmitted = false;
|
||||||
|
std::map<qint64, std::vector<QString>> m_debugOutput;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -45,6 +45,7 @@
|
|||||||
#include <utils/qtcprocess.h>
|
#include <utils/qtcprocess.h>
|
||||||
#include <utils/mimetypes/mimedatabase.h>
|
#include <utils/mimetypes/mimedatabase.h>
|
||||||
#include <utils/stringutils.h>
|
#include <utils/stringutils.h>
|
||||||
|
#include <utils/temporarydirectory.h>
|
||||||
#include <utils/QtConcurrentTools>
|
#include <utils/QtConcurrentTools>
|
||||||
|
|
||||||
#include <QLoggingCategory>
|
#include <QLoggingCategory>
|
||||||
@@ -1870,9 +1871,11 @@ FileName QmakeProFile::buildDir(QmakeBuildConfiguration *bc) const
|
|||||||
const QString relativeDir = srcDirRoot.relativeFilePath(directoryPath().toString());
|
const QString relativeDir = srcDirRoot.relativeFilePath(directoryPath().toString());
|
||||||
if (!bc && m_project->activeTarget())
|
if (!bc && m_project->activeTarget())
|
||||||
bc = static_cast<QmakeBuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration());
|
bc = static_cast<QmakeBuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration());
|
||||||
if (!bc)
|
const QString buildConfigBuildDir = bc ? bc->buildDirectory().toString() : QString();
|
||||||
return { };
|
const QString buildDir = buildConfigBuildDir.isEmpty()
|
||||||
return FileName::fromString(QDir::cleanPath(QDir(bc->buildDirectory().toString()).absoluteFilePath(relativeDir)));
|
? m_project->projectDirectory().toString()
|
||||||
|
: buildConfigBuildDir;
|
||||||
|
return FileName::fromString(QDir::cleanPath(QDir(buildDir).absoluteFilePath(relativeDir)));
|
||||||
}
|
}
|
||||||
|
|
||||||
FileNameList QmakeProFile::generatedFiles(const FileName &buildDir,
|
FileNameList QmakeProFile::generatedFiles(const FileName &buildDir,
|
||||||
|
@@ -107,6 +107,7 @@ void MoveTool::mouseMoveEvent(const QList<QGraphicsItem*> &itemList,
|
|||||||
FormEditorItem *containerItem = containerFormEditorItem(itemList, m_movingItems);
|
FormEditorItem *containerItem = containerFormEditorItem(itemList, m_movingItems);
|
||||||
if (containerItem && view()->currentState().isBaseState()) {
|
if (containerItem && view()->currentState().isBaseState()) {
|
||||||
if (containerItem != m_movingItems.constFirst()->parentItem()
|
if (containerItem != m_movingItems.constFirst()->parentItem()
|
||||||
|
&& event->modifiers().testFlag(Qt::ControlModifier)
|
||||||
&& event->modifiers().testFlag(Qt::ShiftModifier)) {
|
&& event->modifiers().testFlag(Qt::ShiftModifier)) {
|
||||||
|
|
||||||
const FormEditorItem *movingItem = m_movingItems.constFirst();
|
const FormEditorItem *movingItem = m_movingItems.constFirst();
|
||||||
|
@@ -49,6 +49,7 @@
|
|||||||
#include <qmljs/qmljsmodelmanagerinterface.h>
|
#include <qmljs/qmljsmodelmanagerinterface.h>
|
||||||
#include <qmljs/qmljssimplereader.h>
|
#include <qmljs/qmljssimplereader.h>
|
||||||
|
|
||||||
|
#include <utils/algorithm.h>
|
||||||
#include <utils/changeset.h>
|
#include <utils/changeset.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
@@ -483,14 +484,20 @@ QString RewriterView::auxiliaryDataAsQML() const
|
|||||||
str += QString::number(node.internalId());
|
str += QString::number(node.internalId());
|
||||||
str += ";";
|
str += ";";
|
||||||
|
|
||||||
for (auto i = data.begin(); i != data.end(); ++i) {
|
QStringList keys = Utils::transform(data.keys(), [](const PropertyName &name) {
|
||||||
const QVariant value = i.value();
|
return QString::fromUtf8(name);
|
||||||
|
});
|
||||||
|
|
||||||
|
keys.sort();
|
||||||
|
|
||||||
|
for (const QString &key : keys) {
|
||||||
|
const QVariant value = data.value(key.toUtf8());
|
||||||
QString strValue = value.toString();
|
QString strValue = value.toString();
|
||||||
if (static_cast<QMetaType::Type>(value.type()) == QMetaType::QString)
|
if (static_cast<QMetaType::Type>(value.type()) == QMetaType::QString)
|
||||||
strValue = "\"" + strValue + "\"";
|
strValue = "\"" + strValue + "\"";
|
||||||
|
|
||||||
if (!strValue.isEmpty()) {
|
if (!strValue.isEmpty()) {
|
||||||
str += replaceIllegalPropertyNameChars(QString::fromUtf8(i.key())) + ":";
|
str += replaceIllegalPropertyNameChars(key) + ":";
|
||||||
str += strValue;
|
str += strValue;
|
||||||
str += ";";
|
str += ";";
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <formeditorscene.h>
|
#include <formeditorscene.h>
|
||||||
#include <nodemetainfo.h>
|
#include <nodemetainfo.h>
|
||||||
|
#include <rewritingexception.h>
|
||||||
|
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
#include <QTextEdit>
|
#include <QTextEdit>
|
||||||
@@ -48,12 +49,17 @@ TextEditItem::~TextEditItem()
|
|||||||
void TextEditItem::writeTextToProperty()
|
void TextEditItem::writeTextToProperty()
|
||||||
{
|
{
|
||||||
if (m_formEditorItem) {
|
if (m_formEditorItem) {
|
||||||
if (text().isEmpty())
|
try {
|
||||||
m_formEditorItem->qmlItemNode().removeProperty("text");
|
if (text().isEmpty())
|
||||||
else if (m_formEditorItem->qmlItemNode().isTranslatableText("text"))
|
m_formEditorItem->qmlItemNode().removeProperty("text");
|
||||||
m_formEditorItem->qmlItemNode().setBindingProperty("text", QmlObjectNode::generateTranslatableText(text()));
|
else if (m_formEditorItem->qmlItemNode().isTranslatableText("text"))
|
||||||
else
|
m_formEditorItem->qmlItemNode().setBindingProperty("text", QmlObjectNode::generateTranslatableText(text()));
|
||||||
m_formEditorItem->qmlItemNode().setVariantProperty("text", text());
|
else
|
||||||
|
m_formEditorItem->qmlItemNode().setVariantProperty("text", text());
|
||||||
|
}
|
||||||
|
catch (const RewritingException &e) {
|
||||||
|
e.showException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -85,6 +85,7 @@ namespace {
|
|||||||
static const QLatin1String kDetect2Chars("Detect2Chars");
|
static const QLatin1String kDetect2Chars("Detect2Chars");
|
||||||
static const QLatin1String kAnyChar("AnyChar");
|
static const QLatin1String kAnyChar("AnyChar");
|
||||||
static const QLatin1String kStringDetect("StringDetect");
|
static const QLatin1String kStringDetect("StringDetect");
|
||||||
|
static const QLatin1String kWordDetect("WordDetect");
|
||||||
static const QLatin1String kRegExpr("RegExpr");
|
static const QLatin1String kRegExpr("RegExpr");
|
||||||
static const QLatin1String kKeyword("keyword");
|
static const QLatin1String kKeyword("keyword");
|
||||||
static const QLatin1String kInt("Int");
|
static const QLatin1String kInt("Int");
|
||||||
@@ -153,6 +154,8 @@ bool HighlightDefinitionHandler::startElement(const QString &,
|
|||||||
anyCharStarted(atts);
|
anyCharStarted(atts);
|
||||||
else if (qName == kStringDetect)
|
else if (qName == kStringDetect)
|
||||||
stringDetectedStarted(atts);
|
stringDetectedStarted(atts);
|
||||||
|
else if (qName == kWordDetect)
|
||||||
|
wordDetectStarted(atts);
|
||||||
else if (qName == kRegExpr)
|
else if (qName == kRegExpr)
|
||||||
regExprStarted(atts);
|
regExprStarted(atts);
|
||||||
else if (qName == kKeyword)
|
else if (qName == kKeyword)
|
||||||
@@ -189,7 +192,8 @@ bool HighlightDefinitionHandler::endElement(const QString &, const QString &, co
|
|||||||
m_currentList->addKeyword(m_currentKeyword.trimmed());
|
m_currentList->addKeyword(m_currentKeyword.trimmed());
|
||||||
m_processingKeyword = false;
|
m_processingKeyword = false;
|
||||||
} else if (qName == kDetectChar || qName == kDetect2Chars || qName == kAnyChar ||
|
} else if (qName == kDetectChar || qName == kDetect2Chars || qName == kAnyChar ||
|
||||||
qName == kStringDetect || qName == kRegExpr || qName == kKeyword || qName == kInt ||
|
qName == kStringDetect || qName == kWordDetect || qName == kRegExpr ||
|
||||||
|
qName == kKeyword || qName == kInt ||
|
||||||
qName == kFloat || qName == kHlCOct || qName == kHlCHex || qName == kHlCStringChar ||
|
qName == kFloat || qName == kHlCOct || qName == kHlCHex || qName == kHlCStringChar ||
|
||||||
qName == kHlCChar || qName == kRangeDetect || qName == kLineContinue ||
|
qName == kHlCChar || qName == kRangeDetect || qName == kLineContinue ||
|
||||||
qName == kDetectSpaces || qName == kDetectIdentifier) {
|
qName == kDetectSpaces || qName == kDetectIdentifier) {
|
||||||
@@ -333,6 +337,15 @@ void HighlightDefinitionHandler::stringDetectedStarted(const QXmlAttributes &att
|
|||||||
ruleElementStarted(atts, QSharedPointer<Rule>(rule));
|
ruleElementStarted(atts, QSharedPointer<Rule>(rule));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HighlightDefinitionHandler::wordDetectStarted(const QXmlAttributes &atts)
|
||||||
|
{
|
||||||
|
WordDetectRule *rule = new WordDetectRule;
|
||||||
|
rule->setString(atts.value(kString));
|
||||||
|
rule->setInsensitive(atts.value(kInsensitive));
|
||||||
|
rule->setActive(atts.value(kDynamic));
|
||||||
|
ruleElementStarted(atts, QSharedPointer<Rule>(rule));
|
||||||
|
}
|
||||||
|
|
||||||
void HighlightDefinitionHandler::regExprStarted(const QXmlAttributes &atts)
|
void HighlightDefinitionHandler::regExprStarted(const QXmlAttributes &atts)
|
||||||
{
|
{
|
||||||
RegExprRule *rule = new RegExprRule;
|
RegExprRule *rule = new RegExprRule;
|
||||||
|
@@ -67,6 +67,7 @@ private:
|
|||||||
void detect2CharsStarted(const QXmlAttributes &atts);
|
void detect2CharsStarted(const QXmlAttributes &atts);
|
||||||
void anyCharStarted(const QXmlAttributes &atts);
|
void anyCharStarted(const QXmlAttributes &atts);
|
||||||
void stringDetectedStarted(const QXmlAttributes &atts);
|
void stringDetectedStarted(const QXmlAttributes &atts);
|
||||||
|
void wordDetectStarted(const QXmlAttributes &atts);
|
||||||
void regExprStarted(const QXmlAttributes &atts);
|
void regExprStarted(const QXmlAttributes &atts);
|
||||||
void keywordStarted(const QXmlAttributes &atts);
|
void keywordStarted(const QXmlAttributes &atts);
|
||||||
void intStarted(const QXmlAttributes &atts);
|
void intStarted(const QXmlAttributes &atts);
|
||||||
|
@@ -171,6 +171,21 @@ bool StringDetectRule::doMatchSucceed(const QString &text,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool WordDetectRule::doMatchSucceed(const QString &text, const int length, ProgressData *progress)
|
||||||
|
{
|
||||||
|
const int offset = progress->offset();
|
||||||
|
if (length - offset < m_length)
|
||||||
|
return false;
|
||||||
|
if (offset > 0 && !definition()->isDelimiter(text.at(offset - 1)))
|
||||||
|
return false;
|
||||||
|
if (text.midRef(offset, m_string.size()).compare(m_string, m_caseSensitivity) != 0)
|
||||||
|
return false;
|
||||||
|
if (length > offset + m_string.size() && !definition()->isDelimiter(text.at(offset + m_string.size())))
|
||||||
|
return false;
|
||||||
|
progress->incrementOffset(m_length);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// RegExpr
|
// RegExpr
|
||||||
RegExprRule::~RegExprRule()
|
RegExprRule::~RegExprRule()
|
||||||
{
|
{
|
||||||
|
@@ -99,7 +99,7 @@ public:
|
|||||||
void setString(const QString &s);
|
void setString(const QString &s);
|
||||||
void setInsensitive(const QString &insensitive);
|
void setInsensitive(const QString &insensitive);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
virtual bool doMatchSucceed(const QString &text,
|
virtual bool doMatchSucceed(const QString &text,
|
||||||
const int length,
|
const int length,
|
||||||
ProgressData *progress);
|
ProgressData *progress);
|
||||||
@@ -111,6 +111,15 @@ private:
|
|||||||
Qt::CaseSensitivity m_caseSensitivity = Qt::CaseSensitive;
|
Qt::CaseSensitivity m_caseSensitivity = Qt::CaseSensitive;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class WordDetectRule : public StringDetectRule
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
virtual bool doMatchSucceed(const QString &text,
|
||||||
|
const int length,
|
||||||
|
ProgressData *progress);
|
||||||
|
virtual WordDetectRule *doClone() const { return new WordDetectRule(*this); }
|
||||||
|
};
|
||||||
|
|
||||||
class RegExprRule : public DynamicRule
|
class RegExprRule : public DynamicRule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@@ -351,6 +351,8 @@ public:
|
|||||||
|
|
||||||
void onHandlerFinished(int documentRevision, int position, int priority)
|
void onHandlerFinished(int documentRevision, int position, int priority)
|
||||||
{
|
{
|
||||||
|
if (!m_widget)
|
||||||
|
return;
|
||||||
QTC_ASSERT(m_currentHandlerIndex < m_handlers.size(), return);
|
QTC_ASSERT(m_currentHandlerIndex < m_handlers.size(), return);
|
||||||
QTC_ASSERT(documentRevision == m_documentRevision, return);
|
QTC_ASSERT(documentRevision == m_documentRevision, return);
|
||||||
QTC_ASSERT(position == m_position, return);
|
QTC_ASSERT(position == m_position, return);
|
||||||
@@ -376,7 +378,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TextEditorWidget *m_widget = nullptr;
|
QPointer<TextEditorWidget> m_widget;
|
||||||
const QList<BaseHoverHandler *> &m_handlers;
|
const QList<BaseHoverHandler *> &m_handlers;
|
||||||
|
|
||||||
struct LastHandlerInfo {
|
struct LastHandlerInfo {
|
||||||
|
@@ -1303,14 +1303,14 @@ int VcsBaseEditor::lineNumberOfCurrentEditor(const QString ¤tFile)
|
|||||||
const BaseTextEditor *eda = qobject_cast<const BaseTextEditor *>(ed);
|
const BaseTextEditor *eda = qobject_cast<const BaseTextEditor *>(ed);
|
||||||
if (!eda)
|
if (!eda)
|
||||||
return -1;
|
return -1;
|
||||||
const int cursorLine = eda->textCursor().blockNumber();
|
const int cursorLine = eda->textCursor().blockNumber() + 1;
|
||||||
auto const edw = qobject_cast<const TextEditorWidget *>(ed->widget());
|
auto const edw = qobject_cast<const TextEditorWidget *>(ed->widget());
|
||||||
if (edw) {
|
if (edw) {
|
||||||
const int firstLine = edw->firstVisibleBlockNumber();
|
const int firstLine = edw->firstVisibleBlockNumber() + 1;
|
||||||
const int lastLine = edw->lastVisibleBlockNumber();
|
const int lastLine = edw->lastVisibleBlockNumber() + 1;
|
||||||
if (firstLine <= cursorLine && cursorLine < lastLine)
|
if (firstLine <= cursorLine && cursorLine < lastLine)
|
||||||
return cursorLine;
|
return cursorLine;
|
||||||
return edw->centerVisibleBlockNumber();
|
return edw->centerVisibleBlockNumber() + 1;
|
||||||
}
|
}
|
||||||
return cursorLine;
|
return cursorLine;
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
#include "vcsbaseplugin.h"
|
#include "vcsbaseplugin.h"
|
||||||
#include "vcsoutputwindow.h"
|
#include "vcsoutputwindow.h"
|
||||||
|
|
||||||
|
#include <coreplugin/documentmanager.h>
|
||||||
#include <coreplugin/vcsmanager.h>
|
#include <coreplugin/vcsmanager.h>
|
||||||
#include <utils/synchronousprocess.h>
|
#include <utils/synchronousprocess.h>
|
||||||
|
|
||||||
@@ -56,6 +57,14 @@ VcsCommand::VcsCommand(const QString &workingDirectory,
|
|||||||
|
|
||||||
return proxy;
|
return proxy;
|
||||||
});
|
});
|
||||||
|
connect(this, &VcsCommand::started, this, [this] {
|
||||||
|
if (flags() & ExpectRepoChanges)
|
||||||
|
Core::DocumentManager::setAutoReloadPostponed(true);
|
||||||
|
});
|
||||||
|
connect(this, &VcsCommand::finished, this, [this] {
|
||||||
|
if (flags() & ExpectRepoChanges)
|
||||||
|
Core::DocumentManager::setAutoReloadPostponed(false);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const QProcessEnvironment VcsCommand::processEnvironment() const
|
const QProcessEnvironment VcsCommand::processEnvironment() const
|
||||||
|
@@ -87,6 +87,9 @@ WinRtDeployStepFactory::WinRtDeployStepFactory()
|
|||||||
setDisplayName(QCoreApplication::translate("WinRt::Internal::WinRtDeployStepFactory", "Run windeployqt"));
|
setDisplayName(QCoreApplication::translate("WinRt::Internal::WinRtDeployStepFactory", "Run windeployqt"));
|
||||||
setFlags(BuildStepInfo::Unclonable);
|
setFlags(BuildStepInfo::Unclonable);
|
||||||
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY);
|
setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY);
|
||||||
|
setSupportedDeviceTypes({Constants::WINRT_DEVICE_TYPE_LOCAL,
|
||||||
|
Constants::WINRT_DEVICE_TYPE_EMULATOR,
|
||||||
|
Constants::WINRT_DEVICE_TYPE_PHONE});
|
||||||
setRepeatable(false);
|
setRepeatable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
src/share/3rdparty/generic-highlighter/bash.xml
vendored
12
src/share/3rdparty/generic-highlighter/bash.xml
vendored
@@ -8,7 +8,7 @@
|
|||||||
<!ENTITY noword "(?![\w$+-])"> <!-- no word, $, + or - following -->
|
<!ENTITY noword "(?![\w$+-])"> <!-- no word, $, + or - following -->
|
||||||
<!ENTITY pathpart "([\w_@.%*?+-]|\\ )"> <!-- valid character in a file name -->
|
<!ENTITY pathpart "([\w_@.%*?+-]|\\ )"> <!-- valid character in a file name -->
|
||||||
]>
|
]>
|
||||||
<language name="Bash" version="6" kateversion="5.0" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass;*.nix;.bashrc;.bash_profile;.bash_login;.profile;PKGBUILD" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL">
|
<language name="Bash" version="8" kateversion="5.0" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass;*.nix;.bashrc;.bash_profile;.bash_login;.profile;PKGBUILD;APKBUILD" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL">
|
||||||
|
|
||||||
<!-- (c) 2004 by Wilbert Berendsen (wilbert@kde.nl)
|
<!-- (c) 2004 by Wilbert Berendsen (wilbert@kde.nl)
|
||||||
Changes by Matthew Woehlke (mw_triad@users.sourceforge.net)
|
Changes by Matthew Woehlke (mw_triad@users.sourceforge.net)
|
||||||
@@ -540,7 +540,7 @@
|
|||||||
<RegExpr attribute="Variable" context="AssignSubscr" String="\b&varname;(?=\[.+\]\+?=)" />
|
<RegExpr attribute="Variable" context="AssignSubscr" String="\b&varname;(?=\[.+\]\+?=)" />
|
||||||
<!-- handle functions with function keyword before keywords -->
|
<!-- handle functions with function keyword before keywords -->
|
||||||
<StringDetect attribute="Function" context="#stay" String=":()" />
|
<StringDetect attribute="Function" context="#stay" String=":()" />
|
||||||
<RegExpr attribute="Keyword" context="FunctionDef" String="\bfunction\b" />
|
<WordDetect attribute="Keyword" context="FunctionDef" String="function" />
|
||||||
<!-- mark function definitions without function keyword -->
|
<!-- mark function definitions without function keyword -->
|
||||||
<RegExpr attribute="Function" context="#stay" String="&funcname;\s*\(\)" />
|
<RegExpr attribute="Function" context="#stay" String="&funcname;\s*\(\)" />
|
||||||
<!-- handle keywords -->
|
<!-- handle keywords -->
|
||||||
@@ -551,7 +551,7 @@
|
|||||||
<!-- handle here-string -->
|
<!-- handle here-string -->
|
||||||
<RegExpr attribute="Redirection" context="#stay" String="\d*<<<" />
|
<RegExpr attribute="Redirection" context="#stay" String="\d*<<<" />
|
||||||
<!-- handle here document -->
|
<!-- handle here document -->
|
||||||
<StringDetect attribute="Redirection" context="HereDoc" String="<<" lookAhead="true" />
|
<Detect2Chars attribute="Redirection" context="HereDoc" char="<" char1="<" lookAhead="true" />
|
||||||
<!-- handle process subst -->
|
<!-- handle process subst -->
|
||||||
<RegExpr attribute="Redirection" context="ProcessSubst" String="[<>]\(" />
|
<RegExpr attribute="Redirection" context="ProcessSubst" String="[<>]\(" />
|
||||||
<!-- handle redirection -->
|
<!-- handle redirection -->
|
||||||
@@ -580,7 +580,7 @@
|
|||||||
<!-- handle here-string -->
|
<!-- handle here-string -->
|
||||||
<RegExpr attribute="Redirection" context="#stay" String="\d*<<<" />
|
<RegExpr attribute="Redirection" context="#stay" String="\d*<<<" />
|
||||||
<!-- handle here document -->
|
<!-- handle here document -->
|
||||||
<StringDetect attribute="Redirection" context="HereDoc" String="<<" lookAhead="true" />
|
<Detect2Chars attribute="Redirection" context="HereDoc" char="<" char1="<" lookAhead="true" />
|
||||||
<!-- handle process subst -->
|
<!-- handle process subst -->
|
||||||
<RegExpr attribute="Redirection" context="ProcessSubst" String="[<>]\(" />
|
<RegExpr attribute="Redirection" context="ProcessSubst" String="[<>]\(" />
|
||||||
<!-- handle redirection -->
|
<!-- handle redirection -->
|
||||||
@@ -647,7 +647,7 @@
|
|||||||
<RegExpr attribute="Variable" context="VarBrace" String="\$\{[*@#?$!_0-9-](?=[:#%/=?+-])" />
|
<RegExpr attribute="Variable" context="VarBrace" String="\$\{[*@#?$!_0-9-](?=[:#%/=?+-])" />
|
||||||
<StringDetect attribute="Variable" context="ExprDblParenSubst" String="$((" beginRegion="expression" />
|
<StringDetect attribute="Variable" context="ExprDblParenSubst" String="$((" beginRegion="expression" />
|
||||||
<StringDetect attribute="Redirection" context="SubstFile" String="$(<" />
|
<StringDetect attribute="Redirection" context="SubstFile" String="$(<" />
|
||||||
<StringDetect attribute="Variable" context="SubstCommand" String="$(" />
|
<Detect2Chars attribute="Variable" context="SubstCommand" char="$" char1="(" />
|
||||||
<DetectChar attribute="Backquote" context="SubstBackq" char="`" />
|
<DetectChar attribute="Backquote" context="SubstBackq" char="`" />
|
||||||
<RegExpr attribute="Escape" context="#stay" String="\\[`$\\]" />
|
<RegExpr attribute="Escape" context="#stay" String="\\[`$\\]" />
|
||||||
</context>
|
</context>
|
||||||
@@ -902,7 +902,7 @@
|
|||||||
<RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*'(&word;)')" lookAhead="true" />
|
<RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*'(&word;)')" lookAhead="true" />
|
||||||
<RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*\\(&word;))" lookAhead="true" />
|
<RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*\\(&word;))" lookAhead="true" />
|
||||||
<RegExpr attribute="Redirection" context="HereDocNQ" String="(<<\s*(&word;))" lookAhead="true" />
|
<RegExpr attribute="Redirection" context="HereDocNQ" String="(<<\s*(&word;))" lookAhead="true" />
|
||||||
<StringDetect attribute="Redirection" context="#pop" String="<<" /><!-- always met -->
|
<Detect2Chars attribute="Redirection" context="#pop" char="<" char1="<" /><!-- always met -->
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
<context attribute="Normal Text" lineEndContext="#pop" name="HereDocRemainder">
|
<context attribute="Normal Text" lineEndContext="#pop" name="HereDocRemainder">
|
||||||
|
4109
src/share/3rdparty/generic-highlighter/cmake.xml
vendored
4109
src/share/3rdparty/generic-highlighter/cmake.xml
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE language SYSTEM "language.dtd">
|
<!DOCTYPE language SYSTEM "language.dtd">
|
||||||
<language name="INI Files" section="Configuration" extensions="*.ini;*.pls;*.kcfgc" mimetype="" version="2" kateversion="2.4" author="Jan Janssen (medhefgo@web.de)" license="LGPL">
|
<language name="INI Files" section="Configuration" extensions="*.ini;*.pls;*.kcfgc" mimetype="" version="3" kateversion="2.4" author="Jan Janssen (medhefgo@web.de)" license="LGPL">
|
||||||
|
|
||||||
<highlighting>
|
<highlighting>
|
||||||
<list name="keywords">
|
<list name="keywords">
|
||||||
@@ -44,8 +44,6 @@
|
|||||||
<Float attribute="Float" />
|
<Float attribute="Float" />
|
||||||
<Int attribute="Int" />
|
<Int attribute="Int" />
|
||||||
<keyword attribute="Keyword" String="keywords" />
|
<keyword attribute="Keyword" String="keywords" />
|
||||||
<RegExpr attribute="Comment" context="#pop" String=";.*$" />
|
|
||||||
<RegExpr attribute="Comment" context="#pop" String="#.*$" />
|
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
<context name="Comment" attribute="Comment" lineEndContext="#pop">
|
<context name="Comment" attribute="Comment" lineEndContext="#pop">
|
||||||
|
@@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
Enhance tr/// and y/// support.
|
Enhance tr/// and y/// support.
|
||||||
-->
|
-->
|
||||||
<language name="Perl" version="5" kateversion="2.4" section="Scripts" extensions="*.pl;*.PL;*.pm" mimetype="application/x-perl;text/x-perl" priority="5" author="Anders Lund (anders@alweb.dk)" license="LGPLv2">
|
<language name="Perl" version="6" kateversion="2.4" section="Scripts" extensions="*.pl;*.PL;*.pm;*.pl6;*.PL6;*.p6;*.pm6;" mimetype="application/x-perl;text/x-perl" priority="5" author="Anders Lund (anders@alweb.dk)" license="LGPLv2">
|
||||||
<highlighting>
|
<highlighting>
|
||||||
<list name="keywords">
|
<list name="keywords">
|
||||||
<item>if</item>
|
<item>if</item>
|
||||||
|
134
src/share/3rdparty/generic-highlighter/yacc.xml
vendored
134
src/share/3rdparty/generic-highlighter/yacc.xml
vendored
@@ -10,6 +10,17 @@ This code is released under the LGPL as part of kdelibs/kate.
|
|||||||
|
|
||||||
|
|
||||||
== UPDATE HISTORY ==
|
== UPDATE HISTORY ==
|
||||||
|
2018-02-20 // Nibaldo González <nibgonz@gmail.com>
|
||||||
|
|
||||||
|
Fix '$' symbol, highlighted as 'dsError' by C++ (isocpp.xml).
|
||||||
|
Update syntax for Bison (3.0.4):
|
||||||
|
- Add declarations, directives in rules and the '@' variable.
|
||||||
|
- Allow a tag in '%union', declarations in multiple lines and
|
||||||
|
grammar declarations in the grammar rules section.
|
||||||
|
- The ';' char is not necessary to finish a rule. Allow '; |'
|
||||||
|
within rules.
|
||||||
|
Add mimetypes and extensions '*.ypp' & '*.y++'.
|
||||||
|
|
||||||
2007-10-01 // Sebastian Pipping <webmaster@hartwork.org>
|
2007-10-01 // Sebastian Pipping <webmaster@hartwork.org>
|
||||||
|
|
||||||
Added: Extension "*.yy" for Bison
|
Added: Extension "*.yy" for Bison
|
||||||
@@ -19,13 +30,9 @@ This code is released under the LGPL as part of kdelibs/kate.
|
|||||||
YACC.XML 1.00 - First released.
|
YACC.XML 1.00 - First released.
|
||||||
|
|
||||||
|
|
||||||
== TODO ==
|
|
||||||
- Add a mime type (cannot find it !?)
|
|
||||||
|
|
||||||
|
|
||||||
========================================================================
|
========================================================================
|
||||||
-->
|
-->
|
||||||
<language name="Yacc/Bison" version="3" kateversion="2.4" section="Sources" extensions="*.y;*.yy" author="Jan Villat (jan.villat@net2000.ch)" license="LGPL">
|
<language name="Yacc/Bison" version="4" kateversion="2.4" section="Sources" extensions="*.y;*.yy;*.ypp;*.y++" mimetype="text/x-yacc;text/x-bison" priority="5" author="Jan Villat (jan.villat@net2000.ch)" license="LGPL">
|
||||||
|
|
||||||
<highlighting>
|
<highlighting>
|
||||||
<contexts>
|
<contexts>
|
||||||
@@ -44,16 +51,32 @@ This code is released under the LGPL as part of kdelibs/kate.
|
|||||||
|
|
||||||
<context name="Declarations" attribute="Normal Text" lineEndContext="#stay">
|
<context name="Declarations" attribute="Normal Text" lineEndContext="#stay">
|
||||||
<IncludeRules context="Comment" />
|
<IncludeRules context="Comment" />
|
||||||
<StringDetect attribute="Directive" context="Union Start" String="%union" />
|
|
||||||
<Detect2Chars attribute="Content-Type Delimiter" context="Rules" char="%" char1="%" beginRegion="rules" endRegion="declarations" />
|
<Detect2Chars attribute="Content-Type Delimiter" context="Rules" char="%" char1="%" beginRegion="rules" endRegion="declarations" />
|
||||||
|
<!-- Prologue Declarations -->
|
||||||
<!-- not sure that strict yacc allows that ... but it is commonly used -->
|
|
||||||
<Detect2Chars attribute="Content-Type Delimiter" context="C Declarations" char="%" char1="{" beginRegion="cdeclarations" column="0" />
|
<Detect2Chars attribute="Content-Type Delimiter" context="C Declarations" char="%" char1="{" beginRegion="cdeclarations" column="0" />
|
||||||
|
<IncludeRules context="Grammar Declarations" />
|
||||||
|
<WordDetect attribute="Directive" context="Code-Symbols Start" String="%initial-action" />
|
||||||
|
<WordDetect attribute="Directive" context="Code-Symbols Start" String="%param" />
|
||||||
|
<WordDetect attribute="Directive" context="Code-Symbols Start" String="%lex-param" />
|
||||||
|
<WordDetect attribute="Directive" context="Code-Symbols Start" String="%parse-param" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%<flag>" />
|
||||||
|
<!-- Any word followed by '%' (End with ';' or '%') -->
|
||||||
<DetectChar attribute="Directive" context="Percent Command" char="%" />
|
<DetectChar attribute="Directive" context="Percent Command" char="%" />
|
||||||
|
</context>
|
||||||
|
<context name="Grammar Declarations" attribute="Normal Text" lineEndContext="#stay">
|
||||||
|
<WordDetect attribute="Directive" context="Union Start" String="%union" />
|
||||||
|
<WordDetect attribute="Directive" context="Union Start" String="%code" />
|
||||||
|
<WordDetect attribute="Directive" context="Code-Symbols Start" String="%destructor" />
|
||||||
|
<WordDetect attribute="Directive" context="Code-Symbols Start" String="%printer" />
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
<context name="Union Start" attribute="Normal Text" lineEndContext="#stay">
|
<context name="Union Start" attribute="Normal Text" lineEndContext="#stay">
|
||||||
|
<IncludeRules context="Comment" />
|
||||||
|
<DetectSpaces />
|
||||||
|
<DetectChar attribute="Normal Text" context="Union In" char="{" beginRegion="union" />
|
||||||
|
<RegExpr attribute="Normal Text" context="#pop!Union Tag" String="[^\s\{](?=(\s|$|//))" />
|
||||||
|
</context>
|
||||||
|
<context name="Union Tag" attribute="Normal Text" lineEndContext="#stay">
|
||||||
<IncludeRules context="Comment" />
|
<IncludeRules context="Comment" />
|
||||||
<DetectSpaces />
|
<DetectSpaces />
|
||||||
<DetectChar attribute="Normal Text" context="Union In" char="{" beginRegion="union" />
|
<DetectChar attribute="Normal Text" context="Union In" char="{" beginRegion="union" />
|
||||||
@@ -70,39 +93,109 @@ This code is released under the LGPL as part of kdelibs/kate.
|
|||||||
<IncludeRules context="##C++" />
|
<IncludeRules context="##C++" />
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
|
<!-- '%'<decl> ('{' <Code-Symbols In> '}')+ <Percent Command In> [';'] -->
|
||||||
|
<context name="Code-Symbols Start" attribute="Normal Text" lineEndContext="#stay">
|
||||||
|
<IncludeRules context="Comment" />
|
||||||
|
<DetectSpaces />
|
||||||
|
<DetectChar attribute="Normal Text" context="Code-Symbols In" char="{" beginRegion="code-symbols" />
|
||||||
|
<RegExpr attribute="Alert" context="#pop" String="." />
|
||||||
|
</context>
|
||||||
|
<context name="Code-Symbols In" attribute="Normal Text" lineEndContext="#stay">
|
||||||
|
<DetectChar attribute="Normal Text" context="#pop#pop!Code-Symbols End" char="}" endRegion="code-symbols" />
|
||||||
|
<DetectChar attribute="Normal Text" context="Code-Symbols InIn" char="{" />
|
||||||
|
<IncludeRules context="Symbol-Variable" />
|
||||||
|
<IncludeRules context="##C++" />
|
||||||
|
</context>
|
||||||
|
<context name="Code-Symbols InIn" attribute="Normal Text" lineEndContext="#stay">
|
||||||
|
<DetectChar attribute="Normal Text" context="Code-Symbols InIn" char="{" />
|
||||||
|
<DetectChar attribute="Normal Text" context="#pop" char="}" />
|
||||||
|
<IncludeRules context="Symbol-Variable" />
|
||||||
|
<IncludeRules context="##C++" />
|
||||||
|
</context>
|
||||||
|
<context name="Code-Symbols End" attribute="Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="#pop!Percent Command In">
|
||||||
|
<IncludeRules context="Comment" />
|
||||||
|
<DetectSpaces />
|
||||||
|
<DetectChar attribute="Normal Text" context="#pop" char=";" lookAhead="true" />
|
||||||
|
<DetectChar attribute="Normal Text" context="Code-Symbols In" char="{" beginRegion="code-symbols" />
|
||||||
|
</context>
|
||||||
|
|
||||||
<context name="Rules" attribute="Rule" lineEndContext="#stay">
|
<context name="Rules" attribute="Rule" lineEndContext="#stay">
|
||||||
<IncludeRules context="Comment" />
|
<IncludeRules context="Comment" />
|
||||||
<Detect2Chars attribute="Content-Type Delimiter" context="User Code" char="%" char1="%" beginRegion="code" endRegion="rules" />
|
<Detect2Chars attribute="Content-Type Delimiter" context="User Code" char="%" char1="%" beginRegion="code" endRegion="rules" />
|
||||||
<DetectChar attribute="Normal Text" context="Rule In" char=":" beginRegion="rule" />
|
<DetectChar attribute="Normal Text" context="Rule In" char=":" beginRegion="rule" />
|
||||||
|
<DetectChar attribute="Rule" context="Grammar Declaration Start" char="%" lookAhead="true" />
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
<context name="Rule In" attribute="Definition" lineEndContext="#stay">
|
<context name="Rule In" attribute="Definition" lineEndContext="#stay">
|
||||||
<IncludeRules context="Comment" />
|
<IncludeRules context="Comment" />
|
||||||
<DetectChar attribute="Normal Text" context="#pop" char=";" endRegion="rule" />
|
<DetectChar attribute="Normal Text" context="Rule End" char=";" endRegion="rule" />
|
||||||
<DetectChar attribute="Normal Text" context="Normal C Bloc" char="{" beginRegion="bloc" />
|
<DetectChar attribute="Normal Text" context="Normal C Bloc" char="{" beginRegion="bloc" />
|
||||||
<DetectChar attribute="Normal Text" context="#stay" char="|" />
|
<DetectChar attribute="Normal Text" context="#stay" char="|" />
|
||||||
<IncludeRules context="StringOrChar" />
|
<IncludeRules context="StringOrChar" />
|
||||||
|
<RegExpr attribute="Directive" context="#stay" String="%\?(?=\{)" />
|
||||||
|
<WordDetect attribute="Directive" context="#stay" String="%empty" />
|
||||||
|
<WordDetect attribute="Directive" context="#stay" String="%prec" />
|
||||||
|
<WordDetect attribute="Directive" context="#stay" String="%dprec" />
|
||||||
|
<WordDetect attribute="Directive" context="#stay" String="%merge" />
|
||||||
|
|
||||||
|
<!-- Finish rule without the ';' character (see the 'rhses.1' rule in the 'src/parse-gram.y' file, from the Bison source) -->
|
||||||
|
<RegExpr attribute="Open Rule" context="#pop" String="[\w\-\.](?=[\w\-\.]*:)" column="0" endRegion="rule" />
|
||||||
|
<Detect2Chars attribute="Content-Type Delimiter" context="#pop" char="%" char1="%" lookAhead="true" firstNonSpace="true" endRegion="rule" />
|
||||||
|
<RegExpr attribute="Directive" context="#pop" String="%(union|code|destructor|printer|start|(no\-)?default\-prec|nterm|token|type|left|right|nonassoc|precedence)\b" lookAhead="true" column="0" endRegion="rule" />
|
||||||
|
</context>
|
||||||
|
<!-- The Bison parser allows to have ';' followed by '|', without the rule ending.
|
||||||
|
The problem here is that the ';' char has endRegion="rule" (although it is not very relevant). -->
|
||||||
|
<context name="Rule End" attribute="Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="#pop#pop">
|
||||||
|
<DetectSpaces />
|
||||||
|
<DetectChar attribute="Normal Text" context="#stay" char=";" />
|
||||||
|
<DetectChar attribute="Normal Text" context="#pop" char="|" />
|
||||||
|
<IncludeRules context="Comment" />
|
||||||
|
</context>
|
||||||
|
|
||||||
|
<context name="Grammar Declaration Start" attribute="Normal Text" lineEndContext="#stay">
|
||||||
|
<!-- In the rules section, only highlighting exact declarations -->
|
||||||
|
<IncludeRules context="Grammar Declarations" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%start" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%default-prec" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%no-default-prec" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%nterm" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%token" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%type" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%left" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%right" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%nonassoc" />
|
||||||
|
<WordDetect attribute="Directive" context="Percent Command In" String="%precedence" />
|
||||||
|
|
||||||
|
<DetectChar attribute="Rule" context="#pop" char="%" /> <!-- End when there is an invalid declaration -->
|
||||||
|
<DetectChar attribute="Normal Text" context="#pop" char=";" />
|
||||||
|
<IncludeRules context="Comment" />
|
||||||
|
<DetectSpaces />
|
||||||
|
<RegExpr attribute="Alert" context="#pop" String=".+" />
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
<context name="User Code" attribute="Normal Text" lineEndContext="#stay">
|
<context name="User Code" attribute="Normal Text" lineEndContext="#stay">
|
||||||
<IncludeRules context="##C++" />
|
<IncludeRules context="##C++" />
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
<context name="Percent Command" attribute="Directive" lineEndContext="#pop">
|
<context name="Percent Command" attribute="Directive" lineEndContext="#pop!Percent Command In">
|
||||||
<IncludeRules context="Comment" />
|
<IncludeRules context="Comment" />
|
||||||
<RegExpr attribute="Normal Text" context="Percent Command In" String="\W" lookAhead="true" />
|
<RegExpr attribute="Normal Text" context="#pop!Percent Command In" String="[^\w\-]" lookAhead="true" />
|
||||||
</context>
|
</context>
|
||||||
<context name="Percent Command In" attribute="Normal Text" lineEndContext="#pop#pop">
|
<context name="Percent Command In" attribute="Normal Text" lineEndContext="#stay">
|
||||||
|
<!-- This can be applied to multiple lines -->
|
||||||
|
<DetectChar attribute="Normal Text" context="#pop" char=";" lookAhead="true" />
|
||||||
|
<DetectChar attribute="Normal Text" context="#pop" char="%" lookAhead="true" firstNonSpace="true" />
|
||||||
|
<Detect2Chars attribute="Normal Text" context="#pop" char="%" char1="%" lookAhead="true" />
|
||||||
<IncludeRules context="StringOrChar" />
|
<IncludeRules context="StringOrChar" />
|
||||||
<DetectChar attribute="Data Type" context="PC type" char="<" />
|
<DetectChar attribute="Data Type" context="PC type" char="<" />
|
||||||
|
<IncludeRules context="Comment" />
|
||||||
</context>
|
</context>
|
||||||
<context name="PC type" attribute="Data Type" lineEndContext="#pop#pop#pop">
|
<context name="PC type" attribute="Data Type" lineEndContext="#pop#pop">
|
||||||
<DetectChar attribute="Data Type" context="#pop" char=">" />
|
<DetectChar attribute="Data Type" context="#pop" char=">" />
|
||||||
</context>
|
</context>
|
||||||
|
|
||||||
<context name="Comment" attribute="Comment" lineEndContext="#stay">
|
<context name="Comment" attribute="Comment" lineEndContext="#stay">
|
||||||
<Detect2Chars attribute="Comment" context="CommentStar" char="/" char1="*" />
|
<Detect2Chars attribute="Comment" context="CommentStar" char="/" char1="*" />
|
||||||
<!-- not sure that strict yacc allows that ... but I saw it in some sources ... -->
|
|
||||||
<Detect2Chars attribute="Comment" context="CommentSlash" char="/" char1="/" />
|
<Detect2Chars attribute="Comment" context="CommentSlash" char="/" char1="/" />
|
||||||
</context>
|
</context>
|
||||||
<context name="CommentStar" attribute="Comment" lineEndContext="#stay">
|
<context name="CommentStar" attribute="Comment" lineEndContext="#stay">
|
||||||
@@ -128,15 +221,20 @@ This code is released under the LGPL as part of kdelibs/kate.
|
|||||||
<context name="Normal C Bloc" attribute="Normal Text" lineEndContext="#stay">
|
<context name="Normal C Bloc" attribute="Normal Text" lineEndContext="#stay">
|
||||||
<DetectChar attribute="Normal Text" context="Normal C Bloc" char="{" beginRegion="bloc" />
|
<DetectChar attribute="Normal Text" context="Normal C Bloc" char="{" beginRegion="bloc" />
|
||||||
<DetectChar attribute="Normal Text" context="#pop" char="}" endRegion="bloc" />
|
<DetectChar attribute="Normal Text" context="#pop" char="}" endRegion="bloc" />
|
||||||
|
<IncludeRules context="Symbol-Variable" />
|
||||||
<IncludeRules context="##C++" />
|
<IncludeRules context="##C++" />
|
||||||
|
</context>
|
||||||
|
<context name="Symbol-Variable" attribute="Normal Text" lineEndContext="#stay">
|
||||||
<DetectChar attribute="Directive" context="Dol" char="$" />
|
<DetectChar attribute="Directive" context="Dol" char="$" />
|
||||||
|
<RegExpr attribute="Directive" context="#stay" String="@(\$?)(\d+|[A-Za-z_]\w*)?" />
|
||||||
</context>
|
</context>
|
||||||
<context name="Dol" attribute="Normal Text" fallthrough="true" fallthroughContext="DolEnd" lineEndContext="#stay">
|
<context name="Dol" attribute="Normal Text" fallthrough="true" fallthroughContext="DolEnd" lineEndContext="#stay">
|
||||||
<RegExpr attribute="Data Type" context="DolEnd" String="<[^>]+>" />
|
<RegExpr attribute="Data Type" context="DolEnd" String="<[^>]+>" />
|
||||||
</context>
|
</context>
|
||||||
<context name="DolEnd" attribute="Normal Text" lineEndContext="#stay">
|
<context name="DolEnd" attribute="Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="#pop#pop">
|
||||||
<RegExpr attribute="Directive" context="#pop#pop" String="\d+" />
|
<RegExpr attribute="Directive" context="#pop#pop" String="@?\d+" />
|
||||||
<DetectChar attribute="Directive" context="#pop#pop" char="$" />
|
<DetectChar attribute="Directive" context="#pop#pop" char="$" />
|
||||||
|
<DetectIdentifier attribute="Directive" context="#pop#pop" />
|
||||||
</context>
|
</context>
|
||||||
</contexts>
|
</contexts>
|
||||||
|
|
||||||
@@ -147,6 +245,7 @@ This code is released under the LGPL as part of kdelibs/kate.
|
|||||||
<itemData name="Content-Type Delimiter" defStyleNum="dsBaseN" bold="1" />
|
<itemData name="Content-Type Delimiter" defStyleNum="dsBaseN" bold="1" />
|
||||||
<itemData name="Directive" defStyleNum="dsKeyword"/>
|
<itemData name="Directive" defStyleNum="dsKeyword"/>
|
||||||
<itemData name="Rule" defStyleNum="dsString" />
|
<itemData name="Rule" defStyleNum="dsString" />
|
||||||
|
<itemData name="Open Rule" defStyleNum="dsString" bold="1" />
|
||||||
<itemData name="Backslash Code" defStyleNum="dsString" bold="1" />
|
<itemData name="Backslash Code" defStyleNum="dsString" bold="1" />
|
||||||
<itemData name="Alert" defStyleNum="dsAlert" />
|
<itemData name="Alert" defStyleNum="dsAlert" />
|
||||||
<itemData name="String" defStyleNum="dsString"/>
|
<itemData name="String" defStyleNum="dsString"/>
|
||||||
@@ -158,6 +257,7 @@ This code is released under the LGPL as part of kdelibs/kate.
|
|||||||
<general>
|
<general>
|
||||||
<comments>
|
<comments>
|
||||||
<comment name="multiLine" start="/*" end="*/" />
|
<comment name="multiLine" start="/*" end="*/" />
|
||||||
|
<comment name="singleLine" start="//" />
|
||||||
</comments>
|
</comments>
|
||||||
</general>
|
</general>
|
||||||
</language>
|
</language>
|
||||||
|
Submodule src/shared/qbs updated: 29420ab469...872e4b883d
@@ -51,4 +51,9 @@ enum class PreferredTranslationUnit
|
|||||||
# define IS_LIMITSKIPFUNCTIONBODIESTOPREAMBLE_SUPPORTED
|
# define IS_LIMITSKIPFUNCTIONBODIESTOPREAMBLE_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// CLANG-UPGRADE-CHECK: Remove IS_SKIPWARNINGSFROMINCLUDEDFILES_SUPPORTED once we require clang >= 7.0
|
||||||
|
#if defined(CINDEX_VERSION_HAS_SKIPWARNINGSFROMINCLUDEDFILES_BACKPORTED) || CINDEX_VERSION_MINOR >= 46
|
||||||
|
# define IS_SKIPWARNINGSFROMINCLUDEDFILES_SUPPORTED
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace ClangBackEnd
|
} // namespace ClangBackEnd
|
||||||
|
@@ -237,17 +237,6 @@ static bool isHeaderErrorDiagnostic(const Utf8String &mainFilePath, const Diagno
|
|||||||
return isCritical && diagnostic.location().filePath() != mainFilePath;
|
return isCritical && diagnostic.location().filePath() != mainFilePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isIgnoredHeaderErrorDiagnostic(const Diagnostic &diagnostic)
|
|
||||||
{
|
|
||||||
// FIXME: This diagnostic can appear if e.g. a main file includes a -isystem header and then the
|
|
||||||
// header is opened in the editor - the provided unsaved file for the newly opened editor
|
|
||||||
// overrides the file from the preamble. In this case, clang uses the version from the preamble
|
|
||||||
// and changes in the header are not reflected in the main file. Typically that's not a problem
|
|
||||||
// because only non-project headers are opened as -isystem headers.
|
|
||||||
return diagnostic.text().endsWith(
|
|
||||||
Utf8StringLiteral("from the precompiled header has been overridden"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TranslationUnit::extractDiagnostics(DiagnosticContainer &firstHeaderErrorDiagnostic,
|
void TranslationUnit::extractDiagnostics(DiagnosticContainer &firstHeaderErrorDiagnostic,
|
||||||
QVector<DiagnosticContainer> &mainFileDiagnostics) const
|
QVector<DiagnosticContainer> &mainFileDiagnostics) const
|
||||||
{
|
{
|
||||||
@@ -257,9 +246,7 @@ void TranslationUnit::extractDiagnostics(DiagnosticContainer &firstHeaderErrorDi
|
|||||||
bool hasFirstHeaderErrorDiagnostic = false;
|
bool hasFirstHeaderErrorDiagnostic = false;
|
||||||
|
|
||||||
for (const Diagnostic &diagnostic : diagnostics()) {
|
for (const Diagnostic &diagnostic : diagnostics()) {
|
||||||
if (!hasFirstHeaderErrorDiagnostic
|
if (!hasFirstHeaderErrorDiagnostic && isHeaderErrorDiagnostic(m_filePath, diagnostic)) {
|
||||||
&& isHeaderErrorDiagnostic(m_filePath, diagnostic)
|
|
||||||
&& !isIgnoredHeaderErrorDiagnostic(diagnostic)) {
|
|
||||||
hasFirstHeaderErrorDiagnostic = true;
|
hasFirstHeaderErrorDiagnostic = true;
|
||||||
firstHeaderErrorDiagnostic = diagnostic.toDiagnosticContainer();
|
firstHeaderErrorDiagnostic = diagnostic.toDiagnosticContainer();
|
||||||
}
|
}
|
||||||
|
@@ -180,6 +180,9 @@ uint TranslationUnitUpdater::defaultParseOptions()
|
|||||||
#ifdef IS_LIMITSKIPFUNCTIONBODIESTOPREAMBLE_SUPPORTED
|
#ifdef IS_LIMITSKIPFUNCTIONBODIESTOPREAMBLE_SUPPORTED
|
||||||
| CXTranslationUnit_SkipFunctionBodies
|
| CXTranslationUnit_SkipFunctionBodies
|
||||||
| CXTranslationUnit_LimitSkipFunctionBodiesToPreamble
|
| CXTranslationUnit_LimitSkipFunctionBodiesToPreamble
|
||||||
|
#endif
|
||||||
|
#ifdef IS_SKIPWARNINGSFROMINCLUDEDFILES_SUPPORTED
|
||||||
|
| CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles
|
||||||
#endif
|
#endif
|
||||||
| CXTranslationUnit_IncludeBriefCommentsInCodeCompletion
|
| CXTranslationUnit_IncludeBriefCommentsInCodeCompletion
|
||||||
| CXTranslationUnit_DetailedPreprocessingRecord
|
| CXTranslationUnit_DetailedPreprocessingRecord
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user