Merge "Merge remote-tracking branch 'origin/4.14'"
@@ -13,14 +13,39 @@ elseif (TARGET clang-cpp)
|
|||||||
set(CLANG_TOOLING_LIBS libclang clang-cpp)
|
set(CLANG_TOOLING_LIBS libclang clang-cpp)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
SET(QTC_CLANG_BUILDMODE_MATCH ON)
|
|
||||||
if (WIN32 AND TARGET libclang)
|
if (WIN32 AND TARGET clangTooling)
|
||||||
string(TOLOWER ${CMAKE_BUILD_TYPE} _type)
|
# check that we can compile against clangTooling
|
||||||
get_target_property(_llvmConfigs libclang IMPORTED_CONFIGURATIONS)
|
# which requires the build modes to be compatible
|
||||||
string(TOLOWER ${_llvmConfigs} _llvm_configs)
|
# (debug vs release on Windows)
|
||||||
list(FIND _llvm_configs ${_type} _build_type_found)
|
include(CheckCxxSourceCompiles)
|
||||||
if (_build_type_found LESS 0)
|
|
||||||
set(QTC_CLANG_BUILDMODE_MATCH OFF)
|
set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})
|
||||||
message("Build mode mismatch (debug vs release): limiting clangTooling")
|
set(CMAKE_REQUIRED_INCLUDES ${CLANG_INCLUDE_DIRS})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES clangTooling)
|
||||||
|
|
||||||
|
check_cxx_source_compiles([=[
|
||||||
|
#include <clang/Tooling/CommonOptionsParser.h>
|
||||||
|
#include <clang/Tooling/Tooling.h>
|
||||||
|
using namespace clang;
|
||||||
|
using namespace clang::tooling;
|
||||||
|
llvm::cl::OptionCategory CheckToolCategory("check tool options");
|
||||||
|
int main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
CommonOptionsParser OptionsParser(argc, argv, CheckToolCategory);
|
||||||
|
ClangTool Tool(OptionsParser.getCompilations(),
|
||||||
|
OptionsParser.getSourcePathList());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]=] QTC_CLANG_BUILDMODE_MATCH
|
||||||
|
)
|
||||||
|
unset(CMAKE_TRY_COMPILE_CONFIGURATION)
|
||||||
|
unset(CMAKE_REQUIRED_INCLUDES)
|
||||||
|
unset(CMAKE_REQUIRED_LIBRARIES)
|
||||||
|
else()
|
||||||
|
set(QTC_CLANG_BUILDMODE_MATCH ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (NOT QTC_CLANG_BUILDMODE_MATCH)
|
||||||
|
message("Clang build mode mismatch (debug vs release): limiting clangTooling")
|
||||||
endif()
|
endif()
|
||||||
|
@@ -68,7 +68,8 @@ depends += qtandroidextras\
|
|||||||
qttestlib \
|
qttestlib \
|
||||||
qtuitools \
|
qtuitools \
|
||||||
qtxml \
|
qtxml \
|
||||||
qtlocation
|
qtlocation \
|
||||||
|
qtvirtualkeyboard
|
||||||
|
|
||||||
include(../../config/macros.qdocconf)
|
include(../../config/macros.qdocconf)
|
||||||
include(../../config/qt-cpp-ignore.qdocconf)
|
include(../../config/qt-cpp-ignore.qdocconf)
|
||||||
|
BIN
doc/qtcreator/images/extraimages/images/DVWd_xMMgvg.jpg
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
doc/qtcreator/images/extraimages/images/Ed8WS03C-Vk.jpg
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
doc/qtcreator/images/extraimages/images/FzmLuRHQXaw.jpg
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
doc/qtcreator/images/extraimages/images/UfvA04CIXv0.jpg
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
doc/qtcreator/images/extraimages/images/w1yhDl93YI0.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
@@ -1,4 +1,8 @@
|
|||||||
{HTML.extraimages,qhp.QtCreator.extraFiles} += \
|
{HTML.extraimages,qhp.QtCreator.extraFiles} += \
|
||||||
images/commercial.png \
|
images/commercial.png \
|
||||||
images/RfEYO-5Mw6s.jpg \
|
images/RfEYO-5Mw6s.jpg \
|
||||||
images/yOUdg1o2KJM.jpg
|
images/yOUdg1o2KJM.jpg \
|
||||||
|
images/DVWd_xMMgvg.jpg \
|
||||||
|
images/Ed8WS03C-Vk.jpg \
|
||||||
|
images/UfvA04CIXv0.jpg \
|
||||||
|
images/FzmLuRHQXaw.jpg
|
||||||
|
@@ -5,4 +5,9 @@
|
|||||||
images/aV6kFxH3Xws.jpg \
|
images/aV6kFxH3Xws.jpg \
|
||||||
images/ZzbucmQPU44.jpg \
|
images/ZzbucmQPU44.jpg \
|
||||||
images/RfEYO-5Mw6s.jpg \
|
images/RfEYO-5Mw6s.jpg \
|
||||||
images/yOUdg1o2KJM.jpg
|
images/yOUdg1o2KJM.jpg \
|
||||||
|
images/DVWd_xMMgvg.jpg \
|
||||||
|
images/Ed8WS03C-Vk.jpg \
|
||||||
|
images/UfvA04CIXv0.jpg \
|
||||||
|
images/FzmLuRHQXaw.jpg \
|
||||||
|
images/w1yhDl93YI0.jpg
|
||||||
|
@@ -34,7 +34,7 @@
|
|||||||
\endif
|
\endif
|
||||||
|
|
||||||
\title Managing Data Collection Settings
|
\title Managing Data Collection Settings
|
||||||
|
\if defined (qtcreator)
|
||||||
When you install \QC as a part of Qt installation, you are asked whether
|
When you install \QC as a part of Qt installation, you are asked whether
|
||||||
you allow it to collect pseudonymous information about your system and \QC
|
you allow it to collect pseudonymous information about your system and \QC
|
||||||
use. If you decline, the plugin is not installed and no analytics data is
|
use. If you decline, the plugin is not installed and no analytics data is
|
||||||
@@ -44,6 +44,14 @@
|
|||||||
you. You can change the settings for collecting and transmitting data any
|
you. You can change the settings for collecting and transmitting data any
|
||||||
time. By default, no data is collected and you have to select a telemetry
|
time. By default, no data is collected and you have to select a telemetry
|
||||||
mode for data collection to begin.
|
mode for data collection to begin.
|
||||||
|
\else
|
||||||
|
To enable the use of the telemetry plugin, you need to select \uicontrol
|
||||||
|
{Enable Usage Statistics} in the splash screen that appears when you first
|
||||||
|
launch \QDS. If the splash screen does not appear, you can enable the
|
||||||
|
telemetry plugin by selecting \uicontrol Help > \uicontrol {About Plugins} >
|
||||||
|
\uicontrol Utilities > \uicontrol UsageStatistics.
|
||||||
|
\image studio-usage-statistics.png "Enabling Usage Statistics"
|
||||||
|
\endif
|
||||||
|
|
||||||
\section1 Principles of Data Collection
|
\section1 Principles of Data Collection
|
||||||
|
|
||||||
@@ -58,7 +66,7 @@
|
|||||||
|
|
||||||
\section1 Collecting Usage Statistics
|
\section1 Collecting Usage Statistics
|
||||||
|
|
||||||
The Telemetry plugin uses the
|
The telemetry plugin uses the
|
||||||
\l{https://api.kde.org/frameworks/kuserfeedback/html/index.html}
|
\l{https://api.kde.org/frameworks/kuserfeedback/html/index.html}
|
||||||
{KUserFeedback} framework to collect the usage data. The library
|
{KUserFeedback} framework to collect the usage data. The library
|
||||||
has been designed from the user data privacy point of view and
|
has been designed from the user data privacy point of view and
|
||||||
@@ -75,10 +83,10 @@
|
|||||||
\list 1
|
\list 1
|
||||||
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol Telemetry
|
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol Telemetry
|
||||||
> \uicontrol {Usage Statistics}.
|
> \uicontrol {Usage Statistics}.
|
||||||
\image qtcreator-telemetry-settings.png
|
\image qtcreator-telemetry-settings.png "Telemetry settings"
|
||||||
\li In the \uicontrol {Telemetry mode} list, select the mode that
|
\li In the \uicontrol {Telemetry mode} list, select the mode that
|
||||||
determines what kind of data is collected.
|
determines what kind of data is collected.
|
||||||
\li In the \uicontrol {Data} list, select entries to view
|
\li In the \uicontrol {Data sources} list, select entries to view
|
||||||
exactly what data is collected. Deselect check boxes for data
|
exactly what data is collected. Deselect check boxes for data
|
||||||
that you do not want to transmit to the backend storage.
|
that you do not want to transmit to the backend storage.
|
||||||
\endlist
|
\endlist
|
||||||
@@ -104,5 +112,12 @@
|
|||||||
(\uicontrol {Qt Design Studio} > \uicontrol Preferences > \uicontrol
|
(\uicontrol {Qt Design Studio} > \uicontrol Preferences > \uicontrol
|
||||||
Environment > \uicontrol System on \macos), and then select
|
Environment > \uicontrol System on \macos), and then select
|
||||||
\uicontrol {Enable crash reporting}.
|
\uicontrol {Enable crash reporting}.
|
||||||
|
|
||||||
|
Since crash reports take up disk space, you may wish to remove them when
|
||||||
|
they are no longer needed. Select \uicontrol {Clear local crash reports} to
|
||||||
|
remove the crash report data.
|
||||||
|
|
||||||
|
\image studio-crashpad-checkbox.png "Checkbox for enabling crash reporting"
|
||||||
|
|
||||||
\endif
|
\endif
|
||||||
*/
|
*/
|
||||||
|
@@ -47,9 +47,9 @@
|
|||||||
|
|
||||||
\row
|
\row
|
||||||
\li View examples of what you can do with Qt
|
\li View examples of what you can do with Qt
|
||||||
\li \l{https://doc.qt.io/qt-5/all-examples.html}{List of Qt Examples}
|
\li \l{https://doc.qt.io/qt/all-examples.html}{List of Qt Examples}
|
||||||
|
|
||||||
\l{https://doc.qt.io/qt-5/qtquick-codesamples.html}
|
\l{https://doc.qt.io/qt/qtquick-codesamples.html}
|
||||||
{List of Qt Quick Examples}
|
{List of Qt Quick Examples}
|
||||||
|
|
||||||
\row
|
\row
|
||||||
|
@@ -138,7 +138,7 @@
|
|||||||
\li \l{Adding 3D Views}
|
\li \l{Adding 3D Views}
|
||||||
\li \l{Using 3D Components}
|
\li \l{Using 3D Components}
|
||||||
\list
|
\list
|
||||||
\li \l{Setting Node Properties}
|
\li \l{Setting Group Properties}
|
||||||
\li \l{Adding Models}
|
\li \l{Adding Models}
|
||||||
\li \l{Using Materials and Shaders}
|
\li \l{Using Materials and Shaders}
|
||||||
\li \l{Attaching Textures to Materials}
|
\li \l{Attaching Textures to Materials}
|
||||||
|
@@ -52,18 +52,15 @@
|
|||||||
target platforms.
|
target platforms.
|
||||||
|
|
||||||
\li \uicontrol {Qt Quick Application - Scroll} uses the
|
\li \uicontrol {Qt Quick Application - Scroll} uses the
|
||||||
\l{http://doc.qt.io/qt-5/qml-qtquick-controls2-scrollview.html}
|
\l{ScrollView} type to implement a scrollable list view
|
||||||
{ScrollView} type to implement a scrollable list view
|
|
||||||
(requires Qt 5.9 or later).
|
(requires Qt 5.9 or later).
|
||||||
|
|
||||||
\li \uicontrol {Qt Quick Application - Stack} uses the
|
\li \uicontrol {Qt Quick Application - Stack} uses the
|
||||||
\l{http://doc.qt.io/qt-5/qml-qtquick-controls2-stackview.html}
|
\l{StackView} type to implement a set of pages with a stack-based
|
||||||
{StackView} type to implement a set of pages with a stack-based
|
|
||||||
navigation model (requires Qt 5.7 or later).
|
navigation model (requires Qt 5.7 or later).
|
||||||
|
|
||||||
\li \uicontrol {Qt Quick Application - Swipe} uses the
|
\li \uicontrol {Qt Quick Application - Swipe} uses the
|
||||||
\l{http://doc.qt.io/qt-5/qml-qtquick-controls2-swipeview.html}
|
\l{SwipeView} type to implement a set of pages with a swipe-based
|
||||||
{SwipeWiew} type to implement a set of pages with a swipe-based
|
|
||||||
navigation model (requires Qt 5.7 or later).
|
navigation model (requires Qt 5.7 or later).
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
@@ -138,8 +135,7 @@
|
|||||||
that are used in the QML files.
|
that are used in the QML files.
|
||||||
|
|
||||||
\li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add
|
\li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add
|
||||||
support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
support for \l{Qt Virtual Keyboard} to the application.
|
||||||
{Qt Virtual Keyboard} to the application.
|
|
||||||
|
|
||||||
\note If you have not installed the Qt Virtual Keyboard module when
|
\note If you have not installed the Qt Virtual Keyboard module when
|
||||||
you installed Qt, an error message will appear when you try to open
|
you installed Qt, an error message will appear when you try to open
|
||||||
@@ -236,8 +232,7 @@
|
|||||||
since Qt 5.1).
|
since Qt 5.1).
|
||||||
|
|
||||||
\li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add
|
\li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add
|
||||||
support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html}
|
support for \l{Qt Virtual Keyboard} to the application.
|
||||||
{Qt Virtual Keyboard} to the application.
|
|
||||||
|
|
||||||
\note If you have not installed the Qt Virtual Keyboard module when
|
\note If you have not installed the Qt Virtual Keyboard module when
|
||||||
you installed Qt, an error message will appear when you try to open
|
you installed Qt, an error message will appear when you try to open
|
||||||
|
@@ -553,6 +553,10 @@
|
|||||||
You can set slider orientation to horizontal or vertical in the
|
You can set slider orientation to horizontal or vertical in the
|
||||||
\uicontrol Orientation field.
|
\uicontrol Orientation field.
|
||||||
|
|
||||||
|
For more information, watch the following video:
|
||||||
|
|
||||||
|
\youtube Ed8WS03C-Vk
|
||||||
|
|
||||||
A dial supports circular, horizontal, and vertical input modes. For
|
A dial supports circular, horizontal, and vertical input modes. For
|
||||||
applications where fast input is important, the circular input mode is
|
applications where fast input is important, the circular input mode is
|
||||||
useful, as clicking the dial will move it directly to that position.
|
useful, as clicking the dial will move it directly to that position.
|
||||||
|
@@ -26,7 +26,11 @@
|
|||||||
/*!
|
/*!
|
||||||
\page quick-data-models.html
|
\page quick-data-models.html
|
||||||
\previouspage quick-controls.html
|
\previouspage quick-controls.html
|
||||||
|
\if defined(qtdesignstudio)
|
||||||
|
\nextpage quick-2d-effects.html
|
||||||
|
\else
|
||||||
\nextpage quick-buttons.html
|
\nextpage quick-buttons.html
|
||||||
|
\endif
|
||||||
|
|
||||||
\title Lists and Other Data Models
|
\title Lists and Other Data Models
|
||||||
|
|
||||||
|
@@ -192,6 +192,10 @@
|
|||||||
If the image data comes from a sequential device (such as a socket),
|
If the image data comes from a sequential device (such as a socket),
|
||||||
Animated Image can only loop if caching is enabled.
|
Animated Image can only loop if caching is enabled.
|
||||||
|
|
||||||
|
For more information, watch the following video:
|
||||||
|
|
||||||
|
\youtube DVWd_xMMgvg
|
||||||
|
|
||||||
\section1 Summary of Images
|
\section1 Summary of Images
|
||||||
|
|
||||||
The following table lists the QML types that you can use to add images.
|
The following table lists the QML types that you can use to add images.
|
||||||
|
@@ -40,9 +40,9 @@
|
|||||||
text string, such as size in points or pixels, style name, emphasis,
|
text string, such as size in points or pixels, style name, emphasis,
|
||||||
alignment, and spacing.
|
alignment, and spacing.
|
||||||
|
|
||||||
For an example of editing the Text type, watch
|
For more information, watch the following video:
|
||||||
\l{https://www.youtube.com/watch?v=yOUdg1o2KJM}
|
|
||||||
{Qt Design Studio QuickTip: Text Element}.
|
\youtube yOUdg1o2KJM
|
||||||
|
|
||||||
To create a label with a background, use the \l Label type from the
|
To create a label with a background, use the \l Label type from the
|
||||||
Qt Quick Controls module.
|
Qt Quick Controls module.
|
||||||
|
@@ -30,8 +30,12 @@
|
|||||||
// **********************************************************************
|
// **********************************************************************
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\previouspage quick-data-models.html
|
|
||||||
\page quick-buttons.html
|
\page quick-buttons.html
|
||||||
|
\if defined(qtdesignstudio)
|
||||||
|
\previouspage quick-2d-effects.html
|
||||||
|
\else
|
||||||
|
\previouspage quick-data-models.html
|
||||||
|
\endif
|
||||||
\nextpage quick-scalable-image.html
|
\nextpage quick-scalable-image.html
|
||||||
|
|
||||||
\title Creating Buttons
|
\title Creating Buttons
|
||||||
|
@@ -123,14 +123,13 @@
|
|||||||
\li \l Images
|
\li \l Images
|
||||||
\li \l {User Interaction Methods}
|
\li \l {User Interaction Methods}
|
||||||
\li \l {Lists and Other Data Models}
|
\li \l {Lists and Other Data Models}
|
||||||
|
\if defined(qtdesignstudio)
|
||||||
|
\li \l {2D Effects}
|
||||||
|
\endif
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
\include qtquick-animation-types.qdocinc qtquick animation types
|
\include qtquick-animation-types.qdocinc qtquick animation types
|
||||||
|
|
||||||
\if defined(qtdesignstudio)
|
|
||||||
\include qtdesignstudio-visual-effects.qdocinc qml visual effects
|
|
||||||
\endif
|
|
||||||
|
|
||||||
\include qtquick-mcu-support.qdocinc mcu qtquick components
|
\include qtquick-mcu-support.qdocinc mcu qtquick components
|
||||||
|
|
||||||
\section1 Styling Controls
|
\section1 Styling Controls
|
||||||
|
@@ -72,6 +72,10 @@
|
|||||||
|
|
||||||
\image qmldesigner-binding-editor.png "Binding Editor"
|
\image qmldesigner-binding-editor.png "Binding Editor"
|
||||||
|
|
||||||
|
For more information, watch the following video:
|
||||||
|
|
||||||
|
\youtube UfvA04CIXv0
|
||||||
|
|
||||||
\include creator-logical-operators.qdocinc logical operators
|
\include creator-logical-operators.qdocinc logical operators
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -80,7 +80,7 @@
|
|||||||
\uicontrol {Text Editor}. For more information, see
|
\uicontrol {Text Editor}. For more information, see
|
||||||
\l {Specifying Item Properties}.
|
\l {Specifying Item Properties}.
|
||||||
|
|
||||||
\li \uicontrol Connections (5) enables you to create connections
|
\li \uicontrol {Connection View} (5) enables you to create connections
|
||||||
between objects, signals, and object properties. For more
|
between objects, signals, and object properties. For more
|
||||||
information, see \l{Adding Connections}.
|
information, see \l{Adding Connections}.
|
||||||
|
|
||||||
@@ -99,10 +99,20 @@
|
|||||||
the UI controls, their properties and behavior and the available
|
the UI controls, their properties and behavior and the available
|
||||||
actions. For more information, see \l{Adding States}.
|
actions. For more information, see \l{Adding States}.
|
||||||
|
|
||||||
|
\li \uicontrol {Transition Editor} enables you to make movement between
|
||||||
|
states smooth by animating the changes between states. For more
|
||||||
|
information, see \l{Animating Transitions Between States}.
|
||||||
|
|
||||||
\li \uicontrol Timeline (7) provides a timeline and keyframe based
|
\li \uicontrol Timeline (7) provides a timeline and keyframe based
|
||||||
editor that enables you to animate the properties of UI components.
|
editor that enables you to animate the properties of UI components.
|
||||||
For more information, see \l{Creating Animations}.
|
For more information, see \l{Creating Animations}.
|
||||||
|
|
||||||
|
\li \uicontrol {Curve Editor} enables you to view and modify the whole
|
||||||
|
animation curve by inserting keyframes to the curve and dragging
|
||||||
|
them and the point handlers to modify the curve. You can modify the
|
||||||
|
appearance of the curve in the style editor. For more information,
|
||||||
|
see \l {Editing Animation Curves}.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
You can move the views anywhere on the screen and save them as
|
You can move the views anywhere on the screen and save them as
|
||||||
|
@@ -46,7 +46,7 @@
|
|||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
For more information about integrating QML and C++, see
|
For more information about integrating QML and C++, see
|
||||||
\l{https://doc.qt.io/qt-5/qtqml-cppintegration-overview.html}
|
\l{https://doc.qt.io/qt/qtqml-cppintegration-overview.html}
|
||||||
{Overview - QML and C++ Integration}.
|
{Overview - QML and C++ Integration}.
|
||||||
|
|
||||||
You can use a Qt Creator wizard template to create a Qt Quick application
|
You can use a Qt Creator wizard template to create a Qt Quick application
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
|
|
||||||
The wizard automatically adds the \c QML_IMPORT_PATH option to the project
|
The wizard automatically adds the \c QML_IMPORT_PATH option to the project
|
||||||
file for specifying the required
|
file for specifying the required
|
||||||
\l{https://doc.qt.io/qt-5/qtqml-syntax-imports.html#qml-import-path}
|
\l{https://doc.qt.io/qt/qtqml-syntax-imports.html#qml-import-path}
|
||||||
{QML import path}. The path is only needed if more than one subdirectory
|
{QML import path}. The path is only needed if more than one subdirectory
|
||||||
contains QML files.
|
contains QML files.
|
||||||
|
|
||||||
|
@@ -63,6 +63,12 @@
|
|||||||
|
|
||||||
\section1 Creating States
|
\section1 Creating States
|
||||||
|
|
||||||
|
To open the \uicontrol States view, select \uicontrol View >
|
||||||
|
\uicontrol Views > \uicontrol States. To collapse or expand
|
||||||
|
the open view, select \uicontrol {Toggle States} or press
|
||||||
|
\key {Ctr+Alt+S}. You can also right-click the view and select
|
||||||
|
\uicontrol Collapse or \uicontrol Expand.
|
||||||
|
|
||||||
The \uicontrol States view displays the different \l{State}{states}
|
The \uicontrol States view displays the different \l{State}{states}
|
||||||
of a UI, beginning with a \e {base state}.
|
of a UI, beginning with a \e {base state}.
|
||||||
|
|
||||||
@@ -87,6 +93,10 @@
|
|||||||
and you attempt to remove states where you change the values of its
|
and you attempt to remove states where you change the values of its
|
||||||
properties, you are prompted to confirm the removal.
|
properties, you are prompted to confirm the removal.
|
||||||
|
|
||||||
|
For more information, watch the following video:
|
||||||
|
|
||||||
|
\youtube FzmLuRHQXaw
|
||||||
|
|
||||||
\section1 Setting the Default State
|
\section1 Setting the Default State
|
||||||
|
|
||||||
To determine the startup state of the application,
|
To determine the startup state of the application,
|
||||||
|
@@ -112,7 +112,7 @@
|
|||||||
In addition, all functions of the \c Math and \c Date objects are supported.
|
In addition, all functions of the \c Math and \c Date objects are supported.
|
||||||
|
|
||||||
For more information, see
|
For more information, see
|
||||||
\l{https://doc.qt.io/qt-5/qtqml-javascript-functionlist.html}
|
\l{https://doc.qt.io/qt/qtqml-javascript-functionlist.html}
|
||||||
{List of JavaScript Objects and Functions}.
|
{List of JavaScript Objects and Functions}.
|
||||||
|
|
||||||
\section2 Qt QML Methods
|
\section2 Qt QML Methods
|
||||||
@@ -159,7 +159,7 @@
|
|||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
For more information about using the methods, see
|
For more information about using the methods, see
|
||||||
\l{https://doc.qt.io/qt-5/qml-qtqml-qt.html}{Qt QML Methods}.
|
\l{https://doc.qt.io/qt/qml-qtqml-qt.html}{Qt QML Methods}.
|
||||||
|
|
||||||
\section1 Using Qt Quick UI Forms
|
\section1 Using Qt Quick UI Forms
|
||||||
|
|
||||||
|
@@ -79,7 +79,7 @@
|
|||||||
that rely on external files, like the generic highlighter. You can still
|
that rely on external files, like the generic highlighter. You can still
|
||||||
add \l{https://doc.qt.io/qtcreator/creator-project-wizards.html}{wizard
|
add \l{https://doc.qt.io/qtcreator/creator-project-wizards.html}{wizard
|
||||||
templates} this way, by adding the
|
templates} this way, by adding the
|
||||||
\l{https://doc.qt.io/qt-5/resources.html#using-resources-in-the-application}
|
\l{https://doc.qt.io/qt/resources.html#using-resources-in-the-application}
|
||||||
{path to the resource directory} into your QRC file with
|
{path to the resource directory} into your QRC file with
|
||||||
ProjectExplorer::JsonWizardFactory::addWizardPath(). Registering
|
ProjectExplorer::JsonWizardFactory::addWizardPath(). Registering
|
||||||
documentation and translations can be done in similar ways.
|
documentation and translations can be done in similar ways.
|
||||||
|
@@ -345,7 +345,7 @@
|
|||||||
You can use number icons in screenshots to highlight parts of the screenshot
|
You can use number icons in screenshots to highlight parts of the screenshot
|
||||||
(instead of using red arrows or borders, or something similar). You can then
|
(instead of using red arrows or borders, or something similar). You can then
|
||||||
refer to the numbers in text. For and example, see the
|
refer to the numbers in text. For and example, see the
|
||||||
\l{http://doc.qt.io/qt-5/topics-app-development.html}{Development Tools}
|
\l{https://doc.qt.io/qt/topics-app-development.html}{Development Tools}
|
||||||
topic in the Qt reference documentation.
|
topic in the Qt reference documentation.
|
||||||
|
|
||||||
This improves the consistency of the look and feel of Qt documentation,
|
This improves the consistency of the look and feel of Qt documentation,
|
||||||
@@ -424,10 +424,10 @@
|
|||||||
docs show a thumbnail of the video with a play button.
|
docs show a thumbnail of the video with a play button.
|
||||||
|
|
||||||
The support for the macro is defined in the
|
The support for the macro is defined in the
|
||||||
\c {qtcreator\doc\config\macros.qdocconf} file. To use the
|
\c {qtcreator\doc\config\macros.qdocconf} and
|
||||||
macro, you need to save a thumbnail of the video in
|
\c {qtcreator\doc\config\macros-online.qdocconf} files. To
|
||||||
\c {qtcreator\doc\qtcreator\images\videoicons} or
|
use the macro, you need to save a thumbnail of the video in
|
||||||
\c {qtcreator\doc\qtdesignstudio\images\videoicons}.
|
\c {qtcreator\doc\qtcreator\images\extraimages\images}.
|
||||||
|
|
||||||
You can use the following URL to open the thumbnail image in a browser:
|
You can use the following URL to open the thumbnail image in a browser:
|
||||||
\c {https://img.youtube.com/vi/<ID>/0.jpg}. The \e {<ID>} is the ID of
|
\c {https://img.youtube.com/vi/<ID>/0.jpg}. The \e {<ID>} is the ID of
|
||||||
@@ -436,24 +436,21 @@
|
|||||||
the ID is \c 9ihYeC0YJ0M. Save the image file as \c {9ihYeC0YJ0M.jpg}.
|
the ID is \c 9ihYeC0YJ0M. Save the image file as \c {9ihYeC0YJ0M.jpg}.
|
||||||
|
|
||||||
You must add the filename of the thumbnail file to
|
You must add the filename of the thumbnail file to
|
||||||
\c {\qtcreator\doc\qtcreator\config\qtcreator-project.qdocconf} and
|
\c {qtcreator-extraimages.qdocconf} and \c {qtdesignstudio-extraimages.qdocconf}
|
||||||
\c {\qtcreator\doc\qtdesignstudio\config\qtdesignstudio.qdocconf}
|
files in the \c {\qtcreator\doc\qtcreator\images\extraimages} folder.
|
||||||
to the value of the \c {HTML.extraimages,qhp.qtcreator.extraFiles}
|
|
||||||
or \c {HTML.extraimages,qhp.qtdesignstudio.extraFiles} option.
|
|
||||||
|
|
||||||
If you'll only link to the video from the \QC Manual or the \QDS Manual,
|
If you'll only link to the video from the \QC Manual or the \QDS Manual,
|
||||||
you'll only need to add the thumbnail filename to the \c .qdocconf file
|
you'll only need to add the thumbnail filename to the \c extraimages.qdocconf
|
||||||
for that project.
|
file for that project.
|
||||||
|
|
||||||
For example, to enable linking to a video with the thumbnail filename
|
For example, to enable linking to a video with the thumbnail filename
|
||||||
\c 9ihYeC0YJ0M.jpg in the \QDS Manual, the \c {qtdesignstudio.qdocconf}
|
\c 9ihYeC0YJ0M.jpg in the \QDS Manual, the \c {qtdesignstudio-extraimages.qdocconf}
|
||||||
file should contain the following entry:
|
file should contain the filename:
|
||||||
|
|
||||||
\code
|
\code
|
||||||
{HTML.extraimages,qhp.qtdesignstudio.extraFiles} += ../../config/images/commercial.png \
|
{HTML.extraimages,qhp.qtdesignstudio.extraFiles} += \
|
||||||
../images/videoicons/9ihYeC0YJ0M.jpg \
|
images/commercial.png \
|
||||||
../images/videoicons/aV6kFxH3Xws.jpg \
|
images/9ihYeC0YJ0M.jpg
|
||||||
../images/videoicons/ZzbucmQPU44.jpg
|
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
To add a link to the video in text, you would write:
|
To add a link to the video in text, you would write:
|
||||||
|
@@ -1,6 +1,3 @@
|
|||||||
; This file can be edited to change the style of the application
|
; This file can be edited to change the style of the application
|
||||||
; Read "Qt Quick Controls 2 Configuration File" for details:
|
; Read "Qt Quick Controls 2 Configuration File" for details:
|
||||||
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
|
; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
|
||||||
|
|
||||||
[Controls]
|
|
||||||
Style=Default
|
|
||||||
|
@@ -71,8 +71,9 @@
|
|||||||
\list 1
|
\list 1
|
||||||
\li Open \e {Screen01.ui.qml} for editing in the
|
\li Open \e {Screen01.ui.qml} for editing in the
|
||||||
\uicontrol {Form Editor} view.
|
\uicontrol {Form Editor} view.
|
||||||
\li Select \e logo in \uicontrol Navigator.
|
\li Select \e logo in the \uicontrol Navigator view.
|
||||||
\li Select the \inlineimage icons/anchor-top.png
|
\li In the \uicontrol Properties view, \uicontrol Layout tab,
|
||||||
|
select the \inlineimage icons/anchor-top.png
|
||||||
(\uicontrol Top) and \inlineimage icons/anchor-left.png
|
(\uicontrol Top) and \inlineimage icons/anchor-left.png
|
||||||
(\uicontrol Left) anchor buttons to anchor \e logo to the top left
|
(\uicontrol Left) anchor buttons to anchor \e logo to the top left
|
||||||
corner of its parent with 10-pixel margins.
|
corner of its parent with 10-pixel margins.
|
||||||
|
@@ -231,5 +231,5 @@
|
|||||||
alias to be able to switch the image inside the stack.
|
alias to be able to switch the image inside the stack.
|
||||||
|
|
||||||
For more information about the available Qt graphical effects, see
|
For more information about the available Qt graphical effects, see
|
||||||
\l {Applying Visual Effects}.
|
\l {2D Effects}.
|
||||||
*/
|
*/
|
||||||
|
@@ -1,6 +1,3 @@
|
|||||||
; This file can be edited to change the style of the application
|
; This file can be edited to change the style of the application
|
||||||
; Read "Qt Quick Controls 2 Configuration File" for details:
|
; Read "Qt Quick Controls 2 Configuration File" for details:
|
||||||
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
|
; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
|
||||||
|
|
||||||
[Controls]
|
|
||||||
Style=Basic
|
|
||||||
|
@@ -1,6 +1,3 @@
|
|||||||
; This file can be edited to change the style of the application
|
; This file can be edited to change the style of the application
|
||||||
; Read "Qt Quick Controls 2 Configuration File" for details:
|
; Read "Qt Quick Controls 2 Configuration File" for details:
|
||||||
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
|
; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
|
||||||
|
|
||||||
[Controls]
|
|
||||||
Style=Basic
|
|
||||||
|
@@ -1,6 +1,3 @@
|
|||||||
; This file can be edited to change the style of the application
|
; This file can be edited to change the style of the application
|
||||||
; Read "Qt Quick Controls 2 Configuration File" for details:
|
; Read "Qt Quick Controls 2 Configuration File" for details:
|
||||||
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
|
; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
|
||||||
|
|
||||||
[Controls]
|
|
||||||
Style=Basic
|
|
||||||
|
@@ -1,6 +1,3 @@
|
|||||||
; This file can be edited to change the style of the application
|
; This file can be edited to change the style of the application
|
||||||
; Read "Qt Quick Controls 2 Configuration File" for details:
|
; Read "Qt Quick Controls 2 Configuration File" for details:
|
||||||
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
|
; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
|
||||||
|
|
||||||
[Controls]
|
|
||||||
Style=Basic
|
|
||||||
|
BIN
doc/qtdesignstudio/images/icons/displace-16px.png
Normal file
After Width: | Height: | Size: 335 B |
BIN
doc/qtdesignstudio/images/icons/gamma-adjust-16px.png
Normal file
After Width: | Height: | Size: 273 B |
BIN
doc/qtdesignstudio/images/icons/gaussian-blur-16px.png
Normal file
After Width: | Height: | Size: 333 B |
BIN
doc/qtdesignstudio/images/icons/inner-shadow-16px.png
Normal file
After Width: | Height: | Size: 208 B |
BIN
doc/qtdesignstudio/images/icons/levels-16px.png
Normal file
After Width: | Height: | Size: 108 B |
BIN
doc/qtdesignstudio/images/icons/recursive-blur-16px.png
Normal file
After Width: | Height: | Size: 335 B |
BIN
doc/qtdesignstudio/images/icons/threshold-16px.png
Normal file
After Width: | Height: | Size: 147 B |
BIN
doc/qtdesignstudio/images/studio-2d-effects.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
doc/qtdesignstudio/images/studio-crashpad-checkbox.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
doc/qtdesignstudio/images/studio-usage-statistics.png
Normal file
After Width: | Height: | Size: 41 KiB |
@@ -89,9 +89,16 @@
|
|||||||
tools.
|
tools.
|
||||||
\li \l{Managing Data Collection Settings}
|
\li \l{Managing Data Collection Settings}
|
||||||
|
|
||||||
|
\if defined (qtcreator)
|
||||||
You can enable \QC to report crashes automatically. If you agreed to
|
You can enable \QC to report crashes automatically. If you agreed to
|
||||||
pseudonymous user statistics collection during the \QC installation,
|
pseudonymous user statistics collection during the \QC installation,
|
||||||
you can turn it on and determine what type of data is collected and
|
you can turn it on and determine what type of data is collected and
|
||||||
transmitted to the backend storage.
|
transmitted to the backend storage.
|
||||||
|
\else
|
||||||
|
You can enable \QDS to report crashes automatically. If you enable
|
||||||
|
the telemetry plugin, you can turn on the pseudonymous user
|
||||||
|
statistics collection and determine what type of data is collected
|
||||||
|
and transmitted to the backend storage.
|
||||||
|
\endif
|
||||||
\endlist
|
\endlist
|
||||||
*/
|
*/
|
||||||
|
@@ -86,6 +86,7 @@
|
|||||||
\li \l{Images}
|
\li \l{Images}
|
||||||
\li \l{User Interaction Methods}
|
\li \l{User Interaction Methods}
|
||||||
\li \l{Lists and Other Data Models}
|
\li \l{Lists and Other Data Models}
|
||||||
|
\li \l{2D Effects}
|
||||||
\li \l{Creating Buttons}
|
\li \l{Creating Buttons}
|
||||||
\li \l{Creating Scalable Buttons and Borders}
|
\li \l{Creating Scalable Buttons and Borders}
|
||||||
\endlist
|
\endlist
|
||||||
@@ -114,7 +115,7 @@
|
|||||||
\li \l{Adding 3D Views}
|
\li \l{Adding 3D Views}
|
||||||
\li \l{Using 3D Components}
|
\li \l{Using 3D Components}
|
||||||
\list
|
\list
|
||||||
\li \l{Setting Node Properties}
|
\li \l{Setting Group Properties}
|
||||||
\li \l{Adding Models}
|
\li \l{Adding Models}
|
||||||
\li \l{Using Materials and Shaders}
|
\li \l{Using Materials and Shaders}
|
||||||
\li \l{Attaching Textures to Materials}
|
\li \l{Attaching Textures to Materials}
|
||||||
|
@@ -1,117 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2020 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of the Qt Design Studio 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.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
//! [qml visual effects]
|
|
||||||
|
|
||||||
\section1 Applying Visual Effects
|
|
||||||
|
|
||||||
\QDS provides a set of Qt Quick Studio effects that inherit the types in the
|
|
||||||
\l {Qt Graphical Effects} module. To apply a visual effect to a component,
|
|
||||||
drag-and-drop it from \uicontrol Library > \uicontrol Effects to the
|
|
||||||
component in \uicontrol Navigator.
|
|
||||||
|
|
||||||
The following table summarizes the available effects and contains links to
|
|
||||||
the documentation of the inherited QML type.
|
|
||||||
|
|
||||||
\table
|
|
||||||
\header
|
|
||||||
\li Icon
|
|
||||||
\li Qt Quick Studio Effect
|
|
||||||
\li Description
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/blend-mode-16px.png
|
|
||||||
\li \l [QML] {Blend}
|
|
||||||
\li Merges two source components by using a blend mode.
|
|
||||||
|
|
||||||
The default mode is \c subtract, where the pixel value from the
|
|
||||||
component that is going to be blended over the source component
|
|
||||||
is subtracted from the source and written.
|
|
||||||
|
|
||||||
For a list of possible values and examples of their use, see
|
|
||||||
\l{Blend::mode}{Blend.mode}.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/fast-blur-16px.png
|
|
||||||
\li \l {FastBlur}{Blur}
|
|
||||||
\li Applies a fast blur effect to one or more source components.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/brightness-contrast-16px.png
|
|
||||||
\li \l {BrightnessContrast}{Brightness Contrast}
|
|
||||||
\li Adjusts brightness and contrast.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/colourize-16px.png
|
|
||||||
\li \l {ColorOverlay}{Color Overlay}
|
|
||||||
\li Alters the colors of the source component by applying an overlay
|
|
||||||
color.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/colourize-16px.png
|
|
||||||
\li \l Colorize
|
|
||||||
\li Sets the color in the HSL color space.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/directional-blur-16px.png
|
|
||||||
\li \l {DirectionalBlur}{Directional Blur}
|
|
||||||
\li Applies blur effect to the specified direction.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/drop-shadow-16px.png
|
|
||||||
\li \l {DropShadow}{Drop Shadow}
|
|
||||||
\li Generates a soft shadow behind the source component.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/glow-16px.png
|
|
||||||
\li \l [QML] {Glow}
|
|
||||||
\li Generates a halo-like glow around the source component.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/hue-saturation-16px.png
|
|
||||||
\li \l {HueSaturation}{Hue Saturation}
|
|
||||||
\li Alters the source component colors in the HSL color space.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/opacity-mask-16px.png
|
|
||||||
\li \l {OpacityMask}{Mask}
|
|
||||||
\li Masks the source component with another component.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/mask-blur-16px.png
|
|
||||||
\li \l {MaskedBlur}{Masked Blur}
|
|
||||||
\li Applies a blur effect with a varying intesity.
|
|
||||||
The \l GradientStop type is used to specify the color used at a
|
|
||||||
given position in a gradient, as represented by a gradient stop.
|
|
||||||
The default positions for the stops are 0.20, 0.50, 0.80, and 1.00.
|
|
||||||
The default color is black.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/radial-blur-16px.png
|
|
||||||
\li \l {RadialBlur}{Radial Blur}
|
|
||||||
\li Applies directional blur in a circular direction around the
|
|
||||||
component's center point.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/desaturation-16px.png
|
|
||||||
\li \l {Desaturate}{Saturation}
|
|
||||||
\li Reduces the saturation of the colors.
|
|
||||||
\row
|
|
||||||
\li \inlineimage icons/zoom-blur-16px.png
|
|
||||||
\li \l {ZoomBlur}{Zoom Blur}
|
|
||||||
\li Applies directional blur effect towards source component's center
|
|
||||||
point.
|
|
||||||
\endtable
|
|
||||||
|
|
||||||
//! [qml visual effects]
|
|
||||||
*/
|
|
@@ -94,4 +94,8 @@
|
|||||||
the same location as the FBX file.
|
the same location as the FBX file.
|
||||||
\li Select \uicontrol {Export All} to export files.
|
\li Select \uicontrol {Export All} to export files.
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
For more information, watch the following video:
|
||||||
|
|
||||||
|
\youtube w1yhDl93YI0
|
||||||
*/
|
*/
|
||||||
|
@@ -43,7 +43,7 @@
|
|||||||
view.
|
view.
|
||||||
|
|
||||||
\list
|
\list
|
||||||
\li \l {Setting Node Properties}
|
\li \l {Setting Group Properties}
|
||||||
|
|
||||||
You can set the opacity, visibility, and transform properties
|
You can set the opacity, visibility, and transform properties
|
||||||
of all 3D components.
|
of all 3D components.
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2019 The Qt Company Ltd.
|
** Copyright (C) 2020 The Qt Company Ltd.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of the Qt Design Studio documentation.
|
** This file is part of the Qt Design Studio documentation.
|
||||||
@@ -76,6 +76,10 @@
|
|||||||
For more information, see \l {Creating Animations}.
|
For more information, see \l {Creating Animations}.
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
For more information, watch the following video:
|
||||||
|
|
||||||
|
\youtube w1yhDl93YI0
|
||||||
|
|
||||||
For more information on other views, see
|
For more information on other views, see
|
||||||
\l {Editing QML Files in Design Mode}.
|
\l {Editing QML Files in Design Mode}.
|
||||||
*/
|
*/
|
||||||
|
@@ -28,12 +28,17 @@
|
|||||||
\page studio-3d-node.html
|
\page studio-3d-node.html
|
||||||
\nextpage studio-3d-model.html
|
\nextpage studio-3d-model.html
|
||||||
|
|
||||||
\title Setting Node Properties
|
\title Setting Group Properties
|
||||||
|
|
||||||
You can set the opacity, visibility, and transform properties of a 3D
|
The \uicontrol Group component is a \uicontrol Node type that can be used to
|
||||||
component in the \uicontrol Properties view.
|
wrap other objects for the purpose of grouping them. This allows you to
|
||||||
|
transform and set the opacity and visibility of multiple 3D components in
|
||||||
|
the \uicontrol Properties view simultaneously. To add a \uicontrol Group
|
||||||
|
component to your scene, drag-and-drop it from \uicontrol Library >
|
||||||
|
\uicontrol {QML Types} > \uicontrol {Qt Quick 3D} to the \uicontrol
|
||||||
|
{3D Editor} view or to a \uicontrol Scene component in \uicontrol Navigator.
|
||||||
|
|
||||||
\section1 Setting Component Opacity and Visibility
|
\section1 Setting Node Opacity and Visibility
|
||||||
|
|
||||||
All components have an \uicontrol Opacity value applied to them. The opacity
|
All components have an \uicontrol Opacity value applied to them. The opacity
|
||||||
of 100 makes a component fully opaque, while the opacity of 0 prevents a
|
of 100 makes a component fully opaque, while the opacity of 0 prevents a
|
||||||
|
@@ -35,7 +35,7 @@
|
|||||||
like a card. The front and back sides are specified by using any two types
|
like a card. The front and back sides are specified by using any two types
|
||||||
inside the Flipable type. The type with the higher z-order is the front
|
inside the Flipable type. The type with the higher z-order is the front
|
||||||
side. The \l opacityFront and \l opacityBack properties are used to hide
|
side. The \l opacityFront and \l opacityBack properties are used to hide
|
||||||
and show either the front or back side of the flipable item at a time.
|
and show either the front or back side of the item at a time.
|
||||||
|
|
||||||
The \l flipAngle property is used to animate the angle of the type to
|
The \l flipAngle property is used to animate the angle of the type to
|
||||||
produce the flipping effect. The \l xAxis or \l yAxis property is set
|
produce the flipping effect. The \l xAxis or \l yAxis property is set
|
||||||
@@ -43,8 +43,8 @@
|
|||||||
|
|
||||||
\section2 Example Usage
|
\section2 Example Usage
|
||||||
|
|
||||||
You can use the Flipable component in \QDS to create a flipable item. In
|
You can use the Flipable component in \QDS to create an item that can be
|
||||||
this example, the two sides of the flipable show ISO 7000 icons.
|
flipped. In this example, the two sides of the item show ISO 7000 icons.
|
||||||
|
|
||||||
\image studio-flipable.png
|
\image studio-flipable.png
|
||||||
|
|
||||||
@@ -85,19 +85,19 @@
|
|||||||
/*!
|
/*!
|
||||||
\qmlproperty real Flipable::opacityBack
|
\qmlproperty real Flipable::opacityBack
|
||||||
|
|
||||||
The opacity of the back side of the flipable type.
|
The opacity of the back side of the type.
|
||||||
|
|
||||||
The opacity can be set between 0 and 1 to hide or show the items on the
|
The opacity can be set between 0 and 1 to hide or show the items on the
|
||||||
back side of the flipable type.
|
back side of the type.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty real Flipable::opacityFront
|
\qmlproperty real Flipable::opacityFront
|
||||||
|
|
||||||
The opacity of the front side of the flipable type.
|
The opacity of the front side of the type.
|
||||||
|
|
||||||
The opacity can be set between 0 and 1 to hide or show the items on the
|
The opacity can be set between 0 and 1 to hide or show the items on the
|
||||||
front side of the flipable type.
|
front side of the type.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
|
|
||||||
Whether the type is rotated around the x-axis.
|
Whether the type is rotated around the x-axis.
|
||||||
|
|
||||||
This property is set to 1 to rotate the flipable type around the x-axis.
|
This property is set to 1 to rotate the type around the x-axis.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -113,13 +113,13 @@
|
|||||||
|
|
||||||
Whether the type is rotated around the y-axis.
|
Whether the type is rotated around the y-axis.
|
||||||
|
|
||||||
This property is set to 1 to rotate the flipable type around the y-axis.
|
This property is set to 1 to rotate the type around the y-axis.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty bool Flipable::flipped
|
\qmlproperty bool Flipable::flipped
|
||||||
|
|
||||||
Whether the flipable type has been flipped.
|
Whether the type has been flipped.
|
||||||
|
|
||||||
This property is set to \c true when the type is flipped.
|
This property is set to \c true when the type is flipped.
|
||||||
*/
|
*/
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
\l ShapeGradient subtypes and set using the \l gradient property.
|
\l ShapeGradient subtypes and set using the \l gradient property.
|
||||||
If both a color and a gradient are specified, the gradient is used.
|
If both a color and a gradient are specified, the gradient is used.
|
||||||
|
|
||||||
The \l strokeColor, \l strokeWidth, and \l strokeStyle, properties specify
|
The \l strokeColor, \l strokeWidth, and \l strokeStyle properties specify
|
||||||
the appearance of the pie outline. The \l dashPattern and \l dashOffset
|
the appearance of the pie outline. The \l dashPattern and \l dashOffset
|
||||||
properties specify the appearance of dashed lines.
|
properties specify the appearance of dashed lines.
|
||||||
|
|
||||||
|
@@ -34,8 +34,8 @@
|
|||||||
|
|
||||||
The Triangle type can be used to draw triangles with different dimensions
|
The Triangle type can be used to draw triangles with different dimensions
|
||||||
and shapes. The type is enclosed in an invisible \l Rectangle type. The size
|
and shapes. The type is enclosed in an invisible \l Rectangle type. The size
|
||||||
of the triagle is determined by the size of the bounding rectangle. The
|
of the triangle is determined by the size of the bounding rectangle. The
|
||||||
dimensions of the triangle can be changed to make it elongated or squatter
|
dimensions of the triangle can be changed to make it elongated or squat
|
||||||
with space around it by using the \l leftMargin, \l topMargin,
|
with space around it by using the \l leftMargin, \l topMargin,
|
||||||
\l rightMargin, and \l bottomMargin properties. The margins are set between
|
\l rightMargin, and \l bottomMargin properties. The margins are set between
|
||||||
the triangle and the edges of the parent rectangle.
|
the triangle and the edges of the parent rectangle.
|
||||||
|
@@ -0,0 +1,376 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2020 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Design Studio 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.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\page quick-2d-effects.html
|
||||||
|
\previouspage quick-data-models.html
|
||||||
|
\nextpage quick-buttons.html
|
||||||
|
|
||||||
|
\title 2D Effects
|
||||||
|
|
||||||
|
\QDS provides a set of Qt Quick Studio effects that inherit the types in the
|
||||||
|
\l {Qt Graphical Effects} module. To apply a visual effect to a component,
|
||||||
|
drag-and-drop it from \uicontrol Library > \uicontrol Effects to the
|
||||||
|
component in \uicontrol Navigator.
|
||||||
|
|
||||||
|
\image studio-2d-effects.png "Effects tab in Library"
|
||||||
|
|
||||||
|
Effects have one or more source properties for specifying the visual input
|
||||||
|
for which the effect is applied to an item. The altered visual output is
|
||||||
|
then presented in the effect item itself. The source can be another, often
|
||||||
|
hidden, item in the QML scene. More complex effects can have multiple
|
||||||
|
sources. The source item type can be any QML type, even video or another
|
||||||
|
effect. Pipelining multiple effects together is a simple way to create
|
||||||
|
even more impressive output.
|
||||||
|
|
||||||
|
Each effect has a set of properties that can be used to configure the effect
|
||||||
|
output. Properties can be animated just like any other QML properties. The
|
||||||
|
QML type documentation contains property descriptions and basic usage
|
||||||
|
examples.
|
||||||
|
|
||||||
|
In addition to the effects described in this topic, you can set linear,
|
||||||
|
radial, and conical gradients. For more information, see
|
||||||
|
\l{Picking Gradients}.
|
||||||
|
|
||||||
|
\section1 Caching and Borders
|
||||||
|
|
||||||
|
The \uicontrol Cached property allows the effect output pixels to be cached
|
||||||
|
in order to improve the rendering performance. Every time the source or
|
||||||
|
effect properties are changed, the pixels in the cache must be updated.
|
||||||
|
Memory consumption is increased, because an extra buffer of memory is
|
||||||
|
required for storing the effect output. We recommend that you disable the
|
||||||
|
cache when the source or the effect properties are animated.
|
||||||
|
|
||||||
|
The \uicontrol {Transparent border} property determines the blur behavior
|
||||||
|
near the edges of the item, where the pixel blurring is affected by
|
||||||
|
the pixels outside the source edges.
|
||||||
|
|
||||||
|
If the property is set to \c true, the pixels outside the source are
|
||||||
|
interpreted as being transparent, which is similar to OpenGL clamp-to-border
|
||||||
|
extension. The blur is expanded slightly outside the effect item area.
|
||||||
|
|
||||||
|
If the property is set to \c false, the pixels outside the source are
|
||||||
|
interpreted as containing the same color as the pixels at the edge of
|
||||||
|
the item, which is similar to OpenGL clamp-to-edge behavior. The blur
|
||||||
|
does not expand outside the effect item area.
|
||||||
|
|
||||||
|
\section1 Summary of 2D Effects
|
||||||
|
|
||||||
|
The following table summarizes the available effects and contains links to
|
||||||
|
the documentation of the inherited QML type.
|
||||||
|
|
||||||
|
\note The effects are available when running with OpenGL.
|
||||||
|
|
||||||
|
\table
|
||||||
|
\header
|
||||||
|
\li Icon
|
||||||
|
\li Qt Quick Studio Effect
|
||||||
|
\li Description
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/blend-mode-16px.png
|
||||||
|
\li \l [QML] {Blend}
|
||||||
|
\li Merges two source components by using a blend mode.
|
||||||
|
|
||||||
|
The default \uicontrol Mode is \c subtract, where the pixel value
|
||||||
|
from the component specified in the \uicontrol {Foreground source}
|
||||||
|
field, which is going to be blended over the source component,
|
||||||
|
is subtracted from the source and written over it.
|
||||||
|
|
||||||
|
For a list of possible \uicontrol Mode values and examples of their
|
||||||
|
use, see \l{Blend::mode}{Blend.mode}.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/brightness-contrast-16px.png
|
||||||
|
\li \l {BrightnessContrast}{Brightness Contrast}
|
||||||
|
\li Adjusts \uicontrol Brightness and \uicontrol Contrast.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/colourize-16px.png
|
||||||
|
\li \l {ColorOverlay}{Color Overlay}
|
||||||
|
\li Alters the colors of the source component by applying an
|
||||||
|
\uicontrol {Overlay Color}. You can use the color picker
|
||||||
|
to \l{Picking Colors}{select the color}.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/colourize-16px.png
|
||||||
|
\li \l Colorize
|
||||||
|
\li Sets the color in the HSL color space by specifying \uicontrol Hue,
|
||||||
|
\uicontrol Lightness, and \uicontrol Saturation values.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/desaturation-16px.png
|
||||||
|
\li \l {Desaturate}{Desaturation}
|
||||||
|
\li Reduces the saturation of the colors by the value set in the
|
||||||
|
\uicontrol Desaturation field. The value ranges from \c 0.0
|
||||||
|
(no change) to \c 1.0 (desaturated). Desaturated pixel values are
|
||||||
|
calculated as averages of the original RGB component values
|
||||||
|
of the source item.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/directional-blur-16px.png
|
||||||
|
\li \l {DirectionalBlur}{Directional Blur}
|
||||||
|
\li Applies a blur effect to the specified direction. The value of the
|
||||||
|
\uicontrol Angle field, defines the direction of the blur. This
|
||||||
|
effect makes the source item appear to be moving in the direction of
|
||||||
|
the blur. Blur is applied to both sides of each pixel, and therefore
|
||||||
|
setting the direction to \c 0 and \c 180 provides the same result.
|
||||||
|
|
||||||
|
The value of the \uicontrol Length field specifies the perceived
|
||||||
|
amount of movement for each pixel. The movement is divided evenly
|
||||||
|
to both sides of each pixel.
|
||||||
|
|
||||||
|
The quality of the blur depends on the value of the
|
||||||
|
\uicontrol Samples field. If the \uicontrol Length value is large,
|
||||||
|
more samples are needed to preserve high visual quality.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/displace-16px.png
|
||||||
|
\li \l Displace
|
||||||
|
\li Moves the pixels of the source item according to the displacement
|
||||||
|
map specified in the \uicontrol {Displacement source} field.
|
||||||
|
|
||||||
|
The value of the \uicontrol Displacement field specifies the
|
||||||
|
scale for the displacement. The larger the scale, the larger the
|
||||||
|
displacement of the pixels. The value set to \c 0.0 causes no
|
||||||
|
displacement. The value of \c -1.0 sets the inverted maximum shift
|
||||||
|
according to the displacement source value, while \c 1.0 sets the
|
||||||
|
maximum shift.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/drop-shadow-16px.png
|
||||||
|
\li \l {DropShadow}{Drop Shadow}
|
||||||
|
\li Generates a soft shadow behind the source component using a
|
||||||
|
gaussian blur. This effect blurs the alpha channel of the input and
|
||||||
|
colorizes the result, which it then places behind the source object
|
||||||
|
to create a soft shadow. You can set the shadow's color in the
|
||||||
|
\uicontrol {Drop Shadow Color} field and change its location in the
|
||||||
|
\uicontrol {Horizontal offset} and \uicontrol {Vertical offset}
|
||||||
|
fields.
|
||||||
|
|
||||||
|
The value of the \uicontrol Radius field specifies the softness of
|
||||||
|
the shadow. A larger radius causes the edges of the shadow to appear
|
||||||
|
more blurry. The ideal blur is achieved by setting the value of the
|
||||||
|
\uicontrol Samples field to twice as large as the highest required
|
||||||
|
radius value plus one (\c {samples = 1 + radius * 2}).
|
||||||
|
|
||||||
|
The soft shadow is created by blurring the image live using a
|
||||||
|
gaussian blur, which is a costly operation. Fullscreen gaussian
|
||||||
|
blur with even a moderate number of samples will only run at 60
|
||||||
|
FPS on high-end graphics hardware.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/fast-blur-16px.png
|
||||||
|
\li \l {FastBlur}{Fast Blur}
|
||||||
|
\li Applies a fast blur effect to one or more source components.
|
||||||
|
\uicontrol {Fast Blur} offers lower blur quality than
|
||||||
|
\uicontrol {Gaussian Blur}, but it is faster to render.
|
||||||
|
This effect softens the source content by blurring it with
|
||||||
|
an algorithm that uses source content downscaling and
|
||||||
|
bilinear filtering. Use this effect if the source content
|
||||||
|
is rapidly changing and the highest possible blur quality
|
||||||
|
is not needed.
|
||||||
|
|
||||||
|
The value of the \uicontrol Radius field specifies the distance of
|
||||||
|
the neighboring pixels that affect the blurring of an individual
|
||||||
|
pixel. A larger radius increases the blur effect. The fast blur
|
||||||
|
algorithm may internally reduce the accuracy of the radius in order
|
||||||
|
to provide good rendering performance.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/gamma-adjust-16px.png
|
||||||
|
\li \l [QML] {GammaAdjust}{Gamma Adjust}
|
||||||
|
\li Alters the luminance of the source item. This effect is applied
|
||||||
|
to each pixel according to the curve that is pre-defined as a
|
||||||
|
power-law expression, where the value of the \uicontrol Gamma
|
||||||
|
field is used as the reciprocal scaling exponent.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/gaussian-blur-16px.png
|
||||||
|
\li \l [QML] {GaussianBlur}{Gaussian Blur}
|
||||||
|
\li Applies a gaussian blur effect to one or more source components.
|
||||||
|
The effect softens the image by blurring it with an algorithm that
|
||||||
|
uses the gaussian function to calculate the effect. The effect
|
||||||
|
produces higher quality than \uicontrol {Fast Blur}, but is slower
|
||||||
|
to render. Performing blur live is a costly operation. Fullscreen
|
||||||
|
gaussian blur with even a moderate number of \uicontrol Samples
|
||||||
|
will only run at 60 FPS on high-end graphics hardware.
|
||||||
|
|
||||||
|
The value of the \uicontrol Radius field specifies the distance of
|
||||||
|
the neighboring pixels that affect the blurring of an individual
|
||||||
|
pixel. The value of the \uicontrol Distance field is a parameter to
|
||||||
|
the gaussian function that is used when calculating neighboring
|
||||||
|
pixel weights for the blurring. A larger deviation causes an image
|
||||||
|
to appear more blurry, but it also reduces the quality of the blur.
|
||||||
|
A very large deviation value causes the effect to look a bit similar
|
||||||
|
to what, for exmple, a box blur algorithm produces. A too small
|
||||||
|
deviation value makes the effect insignificant for the pixels near
|
||||||
|
the radius.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/glow-16px.png
|
||||||
|
\li \l [QML] {Glow}
|
||||||
|
\li Generates a halo-like glow around the source component. This effect
|
||||||
|
blurs the alpha channel of the source and colorizes it with
|
||||||
|
\uicontrol {Glow color}. It then places the alpha channel behind the
|
||||||
|
source, resulting in a halo or glow around the object. The quality
|
||||||
|
of the blurred edge can be controlled by using the values of the
|
||||||
|
\uicontrol Samples and \uicontrol Radius and the strength of the
|
||||||
|
glow can be changed using the value of the \uicontrol Spread field.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/hue-saturation-16px.png
|
||||||
|
\li \l {HueSaturation}{Hue Saturation}
|
||||||
|
\li Alters the source component colors in the HSL color space.
|
||||||
|
This effect is similar to the \uicontrol Colorize effect, but
|
||||||
|
the \uicontrol Hue and \uicontrol Saturation values are handled
|
||||||
|
differently. This effect always shifts these values, as well as
|
||||||
|
the \uicontrol Lightness value from the original, instead of
|
||||||
|
setting them.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/inner-shadow-16px.png
|
||||||
|
\li \l {InnerShadow}{Inner Shadow}
|
||||||
|
\li Generates a colorized and blurred shadow inside the source using
|
||||||
|
the color that you specify in the \uicontrol {Inner Shadow Color}
|
||||||
|
field.
|
||||||
|
|
||||||
|
The quality of the shadow can be controlled by the values of the
|
||||||
|
\uicontrol Samples and \uicontrol Radius fields. Ideally, the
|
||||||
|
sample value should be twice as large as the highest required
|
||||||
|
radius value. For example, if the radius is animated between
|
||||||
|
\c 0.0 and \c 4.0, samples should be set to \c 8.
|
||||||
|
|
||||||
|
The value of the \uicontrol Spread field specifies how large a part
|
||||||
|
of the shadow color is strengthened near the source edges.
|
||||||
|
The effect produces a high quality shadow image, and therefore the
|
||||||
|
rendering speed of the shadow might not be the highest possible.
|
||||||
|
The rendering speed is reduced especially if the shadow edges are
|
||||||
|
heavily softened. For use cases that require faster rendering speed
|
||||||
|
at the cost of high visual quality, select the \uicontrol Fast
|
||||||
|
check box.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/levels-16px.png
|
||||||
|
\li \l {LevelAdjust}{Level Adjust}
|
||||||
|
\li Adjusts color levels in the RGBA color space. This effect adjusts
|
||||||
|
the source item colors separately for each color channel. Source
|
||||||
|
item contrast can be adjusted and color balance altered.
|
||||||
|
|
||||||
|
The value of the \uicontrol Gamma field specifies the change factor
|
||||||
|
for how the value of each pixel color channel is altered according
|
||||||
|
to the equation. Setting the gamma values under
|
||||||
|
\c QtVector3d(1.0, 1.0, 1.0) makes the image darker, whereas the
|
||||||
|
values above \c QtVector3d(1.0, 1.0, 1.0) lighten it. The value
|
||||||
|
ranges from \c QtVector3d(0.0, 0.0, 0.0) (darkest) to \c inf
|
||||||
|
(lightest).
|
||||||
|
|
||||||
|
You can specify the maximum and minimum input and output levels for
|
||||||
|
each color channel. \uicontrol {Maximum input} sets the white-point,
|
||||||
|
which means that all pixels with a higher value are rendered as
|
||||||
|
white (per color channel). Decreasing this value lightens the light
|
||||||
|
areas. To darken the light areas and to increase the contrast,
|
||||||
|
decrease the value of the \uicontrol {Maximum output} field.
|
||||||
|
|
||||||
|
The value of the \uicontrol {Minimum input} field sets the minimum
|
||||||
|
input level for each color channel. It sets the black-point, which
|
||||||
|
means that all pixels with a lower value are rendered as black
|
||||||
|
(per color channel). Increasing this value darkens the dark areas.
|
||||||
|
To lighten the dark areas and to reduce the contrast, increase the
|
||||||
|
value of the \uicontrol {Minimum output} field.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/mask-blur-16px.png
|
||||||
|
\li \l {MaskedBlur}{Masked Blur}
|
||||||
|
\li Softens the image by blurring it. The intensity of the blur can be
|
||||||
|
controlled for each pixel by specifying a \uicontrol {Mask source},
|
||||||
|
so that some parts of the source are blurred more than others.
|
||||||
|
|
||||||
|
The value of the \uicontrol Radius field specifies the distance of
|
||||||
|
the neighboring pixels that affect the blurring of an individual
|
||||||
|
pixel.
|
||||||
|
|
||||||
|
The value of the \uicontrol Samples field specifies, how many
|
||||||
|
samples are taken per pixel when blur calculation is done. Larger
|
||||||
|
samples produce better quality, but are slower to render.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/opacity-mask-16px.png
|
||||||
|
\li \l {OpacityMask}{Opacity Mask}
|
||||||
|
\li Masks the source component with another component specified in the
|
||||||
|
\uicontrol {Mask source} field. The mask item gets rendered into an
|
||||||
|
intermediate pixel buffer and the alpha values from the result are
|
||||||
|
used to determine the visibility of the source item's pixels in the
|
||||||
|
display.
|
||||||
|
|
||||||
|
Select the \uicontrol Invert check box to specify that the
|
||||||
|
resulting opacity is the source alpha multiplied with the
|
||||||
|
inverse of the mask alpha: \c {As * (1 - Am)}. When this property
|
||||||
|
is \c false, the resulting opacity is the source alpha multiplied
|
||||||
|
with the mask alpha: \c {As * Am}.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/radial-blur-16px.png
|
||||||
|
\li \l {RadialBlur}{Radial Blur}
|
||||||
|
\li Applies a directional blur effect in a circular direction around the
|
||||||
|
component's center point. This effect makes the source item appear
|
||||||
|
to be rotating into the direction of the blur. Other available
|
||||||
|
motionblur effects are \uicontrol {Zoom Blur} and
|
||||||
|
\uicontrol {Directional Blur}.
|
||||||
|
|
||||||
|
The value of the \uicontrol Angle field specifies both the direction
|
||||||
|
of the blur and the level of blurring. The larger the angle, the
|
||||||
|
more blurred the result. The quality of the blur depends on the
|
||||||
|
value or the \uicontrol Samples field. If the angle is large, more
|
||||||
|
samples are needed to preserve high visual quality.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/recursive-blur-16px.png
|
||||||
|
\li \l {RecursiveBlur}{Recursive Blur}
|
||||||
|
\li Blurs repeatedly, providing a strong blur effect. This effect
|
||||||
|
softens the image by blurring it with an algorithm that uses a
|
||||||
|
recursive feedback loop to blur the source as many times as
|
||||||
|
set in the \uicontrol Loops field.
|
||||||
|
|
||||||
|
The value of the \uicontrol Radius field specifies the distance of
|
||||||
|
the neighboring pixels that affect the blurring of an individual
|
||||||
|
pixel.
|
||||||
|
|
||||||
|
The effect may produce more blurred results than
|
||||||
|
\uicontrol {Fast Blur} or \uicontrol {Gaussian Blur},
|
||||||
|
but the result is produced asynchronously and takes more time.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/threshold-16px.png
|
||||||
|
\li \l {ThresholdMask}{Threshold Mask}
|
||||||
|
\li Masks the source item with another item specified by
|
||||||
|
\uicontrol {Mask source}. The value of the \uicontrol Spread
|
||||||
|
field determines the smoothness of the mask edges near the
|
||||||
|
\uicontrol Threshold alpha value. Setting spread to \c 0.0 uses
|
||||||
|
the mask with the specified threshold. Setting higher spread values
|
||||||
|
softens the transition from the transparent mask pixels towards
|
||||||
|
opaque mask pixels by adding interpolated values between them.
|
||||||
|
\row
|
||||||
|
\li \inlineimage icons/zoom-blur-16px.png
|
||||||
|
\li \l {ZoomBlur}{Zoom Blur}
|
||||||
|
\li Applies a directional blur effect towards source component's
|
||||||
|
center point. This effect makes the source item appear to be
|
||||||
|
moving towards the center point in Z-direction or the camera
|
||||||
|
appear to be zooming rapidly.
|
||||||
|
|
||||||
|
The value of the \uicontrol Length field specifies the maximum
|
||||||
|
perceived amount of movement for each pixel. The amount is smaller
|
||||||
|
near the center specified by the \uicontrol {Horizontal offset} and
|
||||||
|
\uicontrol {Vertical offset} fields and reaches the specified value
|
||||||
|
at the edges.
|
||||||
|
|
||||||
|
The quality of the blur depends on the value of the
|
||||||
|
\uicontrol Samples field. If the length value is large,
|
||||||
|
more samples are needed to preserve high visual quality.
|
||||||
|
|
||||||
|
Other available motion blur effects are
|
||||||
|
\uicontrol {Directional Blur} and \uicontrol {Radial Blur}.
|
||||||
|
\endtable
|
||||||
|
*/
|
@@ -31,7 +31,8 @@
|
|||||||
The Qt Quick Studio Components module provides sets of components and
|
The Qt Quick Studio Components module provides sets of components and
|
||||||
effects enhanced for creating animated UIs. The components inherit
|
effects enhanced for creating animated UIs. The components inherit
|
||||||
\l {Qt Quick Shapes QML Types}. The effects inherit the types in the
|
\l {Qt Quick Shapes QML Types}. The effects inherit the types in the
|
||||||
\l {Qt Graphical Effects} module.
|
\l {Qt Graphical Effects} module. For more information about the effects,
|
||||||
|
see \l{2D Effects}.
|
||||||
|
|
||||||
\section1 Using Studio Components
|
\section1 Using Studio Components
|
||||||
|
|
||||||
@@ -46,6 +47,4 @@
|
|||||||
|
|
||||||
\annotatedlist qtquickstudio-components
|
\annotatedlist qtquickstudio-components
|
||||||
|
|
||||||
\include qtdesignstudio-visual-effects.qdocinc qml visual effects
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -113,7 +113,7 @@ def is_debug(fpath):
|
|||||||
try:
|
try:
|
||||||
output = subprocess.check_output(['dumpbin', '/imports', fpath])
|
output = subprocess.check_output(['dumpbin', '/imports', fpath])
|
||||||
return coredebug.search(output.decode(encoding)) != None
|
return coredebug.search(output.decode(encoding)) != None
|
||||||
except FileNotFoundError:
|
except OSError:
|
||||||
# dumpbin is not there, maybe MinGW ? Just ship all .dlls.
|
# dumpbin is not there, maybe MinGW ? Just ship all .dlls.
|
||||||
return debug_build
|
return debug_build
|
||||||
|
|
||||||
@@ -238,16 +238,10 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin):
|
|||||||
os.makedirs(clanglibdirtarget)
|
os.makedirs(clanglibdirtarget)
|
||||||
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'libclang.dll'),
|
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'libclang.dll'),
|
||||||
os.path.join(install_dir, 'bin')))
|
os.path.join(install_dir, 'bin')))
|
||||||
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang.exe'),
|
for binary in ['clang', 'clang-cl', 'clangd', 'clang-tidy', 'clazy-standalone']:
|
||||||
clangbindirtarget))
|
binary_filepath = os.path.join(llvm_install_dir, 'bin', 'clang.exe')
|
||||||
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang-cl.exe'),
|
if os.path.exists(binary_filepath):
|
||||||
clangbindirtarget))
|
deployinfo.append((binary_filepath, clangbindirtarget))
|
||||||
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clangd.exe'),
|
|
||||||
clangbindirtarget))
|
|
||||||
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang-tidy.exe'),
|
|
||||||
clangbindirtarget))
|
|
||||||
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clazy-standalone.exe'),
|
|
||||||
clangbindirtarget))
|
|
||||||
resourcetarget = os.path.join(clanglibdirtarget, 'clang')
|
resourcetarget = os.path.join(clanglibdirtarget, 'clang')
|
||||||
else:
|
else:
|
||||||
# libclang -> Qt Creator libraries
|
# libclang -> Qt Creator libraries
|
||||||
@@ -260,6 +254,7 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin):
|
|||||||
os.makedirs(clangbinary_targetdir)
|
os.makedirs(clangbinary_targetdir)
|
||||||
for binary in ['clang', 'clangd', 'clang-tidy', 'clazy-standalone']:
|
for binary in ['clang', 'clangd', 'clang-tidy', 'clazy-standalone']:
|
||||||
binary_filepath = os.path.join(llvm_install_dir, 'bin', binary)
|
binary_filepath = os.path.join(llvm_install_dir, 'bin', binary)
|
||||||
|
if os.path.exists(binary_filepath):
|
||||||
deployinfo.append((binary_filepath, clangbinary_targetdir))
|
deployinfo.append((binary_filepath, clangbinary_targetdir))
|
||||||
# add link target if binary is actually a symlink (to a binary in the same directory)
|
# add link target if binary is actually a symlink (to a binary in the same directory)
|
||||||
if os.path.islink(binary_filepath):
|
if os.path.islink(binary_filepath):
|
||||||
|
@@ -571,7 +571,7 @@ class DumperBase():
|
|||||||
(ref, alloc, size) = self.split('III', vector_data_ptr)
|
(ref, alloc, size) = self.split('III', vector_data_ptr)
|
||||||
data = vector_data_ptr + 16
|
data = vector_data_ptr + 16
|
||||||
self.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
|
self.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
|
||||||
return data, size, alloc
|
return data, size
|
||||||
|
|
||||||
def qArrayData(self, value):
|
def qArrayData(self, value):
|
||||||
if self.qtVersion() >= 0x60000:
|
if self.qtVersion() >= 0x60000:
|
||||||
@@ -1722,23 +1722,26 @@ class DumperBase():
|
|||||||
addr += 1
|
addr += 1
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def listChildrenGenerator(self, addr, innerType):
|
def listData(self, value, check=True):
|
||||||
base = self.extractPointer(addr)
|
if self.qtVersion() >= 0x60000:
|
||||||
|
dd, data, size = self.split('ppi', value)
|
||||||
|
return data, size
|
||||||
|
|
||||||
|
base = self.extractPointer(value)
|
||||||
(ref, alloc, begin, end) = self.split('IIII', base)
|
(ref, alloc, begin, end) = self.split('IIII', base)
|
||||||
array = base + 16
|
array = base + 16
|
||||||
if self.qtVersion() < 0x50000:
|
if self.qtVersion() < 0x50000:
|
||||||
array += self.ptrSize()
|
array += self.ptrSize()
|
||||||
size = end - begin
|
size = end - begin
|
||||||
|
|
||||||
|
if check:
|
||||||
|
self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000)
|
||||||
|
size = end - begin
|
||||||
|
self.check(size >= 0)
|
||||||
|
|
||||||
stepSize = self.ptrSize()
|
stepSize = self.ptrSize()
|
||||||
data = array + begin * stepSize
|
data = array + begin * stepSize
|
||||||
for i in range(size):
|
return data, size
|
||||||
yield self.createValue(data + i * stepSize, innerType)
|
|
||||||
#yield self.createValue(data + i * stepSize, 'void*')
|
|
||||||
|
|
||||||
def vectorChildrenGenerator(self, value, innerType):
|
|
||||||
data, size, _ = self.vectorData(value)
|
|
||||||
for i in range(size):
|
|
||||||
yield self.createValue(data + i * innerType.size(), innerType)
|
|
||||||
|
|
||||||
def putTypedPointer(self, name, addr, typeName):
|
def putTypedPointer(self, name, addr, typeName):
|
||||||
""" Prints a typed pointer, expandable if the type can be resolved,
|
""" Prints a typed pointer, expandable if the type can be resolved,
|
||||||
@@ -1798,6 +1801,9 @@ class DumperBase():
|
|||||||
metaObjectPtr, handle = value.split('pI')
|
metaObjectPtr, handle = value.split('pI')
|
||||||
if metaObjectPtr != 0:
|
if metaObjectPtr != 0:
|
||||||
if self.qtVersion() >= 0x060000:
|
if self.qtVersion() >= 0x060000:
|
||||||
|
if handle == 0:
|
||||||
|
self.putEmptyValue()
|
||||||
|
return
|
||||||
revision = 9
|
revision = 9
|
||||||
name, alias, flags, keyCount, data = self.split('IIIII', handle)
|
name, alias, flags, keyCount, data = self.split('IIIII', handle)
|
||||||
index = name
|
index = name
|
||||||
@@ -1830,7 +1836,6 @@ class DumperBase():
|
|||||||
# handle is what's store in QMetaMethod etc, pass -1 for QObject/QMetaObject
|
# handle is what's store in QMetaMethod etc, pass -1 for QObject/QMetaObject
|
||||||
# itself metaObjectPtr needs to point to a valid QMetaObject.
|
# itself metaObjectPtr needs to point to a valid QMetaObject.
|
||||||
def putQObjectGutsHelper(self, qobject, qobjectPtr, handle, metaObjectPtr, origType):
|
def putQObjectGutsHelper(self, qobject, qobjectPtr, handle, metaObjectPtr, origType):
|
||||||
intSize = 4
|
|
||||||
ptrSize = self.ptrSize()
|
ptrSize = self.ptrSize()
|
||||||
|
|
||||||
def putt(name, value, typeName=' '):
|
def putt(name, value, typeName=' '):
|
||||||
@@ -1871,50 +1876,29 @@ class DumperBase():
|
|||||||
if qobjectPtr:
|
if qobjectPtr:
|
||||||
dd = self.extractPointer(qobjectPtr + ptrSize)
|
dd = self.extractPointer(qobjectPtr + ptrSize)
|
||||||
if self.qtVersion() >= 0x50000:
|
if self.qtVersion() >= 0x50000:
|
||||||
(dvtablePtr, qptr, parentPtr, childrenDPtr, flags, postedEvents,
|
(dvtablePtr, qptr, parent, children, flags, postedEvents,
|
||||||
dynMetaObjectPtr, # Up to here QObjectData.
|
dynMetaObjectPtr, # Up to here QObjectData.
|
||||||
extraData, threadDataPtr, connectionListsPtr,
|
extraData, threadDataPtr, connectionListsPtr,
|
||||||
sendersPtr, currentSenderPtr) \
|
sendersPtr, currentSenderPtr) \
|
||||||
= self.split('ppppIIp' + 'ppppp', dd)
|
= self.split('pp{@QObject*}{@QList<@QObject *>}IIp' + 'ppppp', dd)
|
||||||
else:
|
else:
|
||||||
(dvtablePtr, qptr, parentPtr, childrenDPtr, flags, postedEvents,
|
(dvtablePtr, qptr, parent, children, flags, postedEvents,
|
||||||
dynMetaObjectPtr, # Up to here QObjectData
|
dynMetaObjectPtr, # Up to here QObjectData
|
||||||
objectName, extraData, threadDataPtr, connectionListsPtr,
|
objectName, extraData, threadDataPtr, connectionListsPtr,
|
||||||
sendersPtr, currentSenderPtr) \
|
sendersPtr, currentSenderPtr) \
|
||||||
= self.split('ppppIIp' + 'pppppp', dd)
|
= self.split('pp{@QObject*}{@QList<@QObject *>}IIp' + 'pppppp', dd)
|
||||||
|
|
||||||
if qobjectPtr:
|
|
||||||
qobjectType = self.createType('@QObject')
|
|
||||||
with SubItem(self, '[parent]'):
|
with SubItem(self, '[parent]'):
|
||||||
if not self.isCli:
|
if not self.isCli:
|
||||||
self.putSortGroup(9)
|
self.putSortGroup(9)
|
||||||
if parentPtr:
|
self.putItem(parent)
|
||||||
self.putItem(self.createValue(parentPtr, qobjectType))
|
|
||||||
else:
|
|
||||||
self.putValue('0x0')
|
|
||||||
self.putType('QObject *')
|
|
||||||
with SubItem(self, '[children]'):
|
with SubItem(self, '[children]'):
|
||||||
if not self.isCli:
|
if not self.isCli:
|
||||||
self.putSortGroup(8)
|
self.putSortGroup(8)
|
||||||
base = self.extractPointer(dd + 3 * ptrSize) # It's a QList<QObject *>
|
|
||||||
begin = self.extractInt(base + 8)
|
dvtablePtr, qptr, parentPtr, children = self.split('ppp{QList<QObject *>}', dd)
|
||||||
end = self.extractInt(base + 12)
|
self.putItem(children)
|
||||||
array = base + 16
|
|
||||||
if self.qtVersion() < 0x50000:
|
|
||||||
array += ptrSize
|
|
||||||
self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000)
|
|
||||||
size = end - begin
|
|
||||||
self.check(size >= 0)
|
|
||||||
self.putItemCount(size)
|
|
||||||
if size > 0:
|
|
||||||
self.putExpandable()
|
|
||||||
if self.isExpanded():
|
|
||||||
addrBase = array + begin * ptrSize
|
|
||||||
with Children(self, size):
|
|
||||||
for i in self.childRange():
|
|
||||||
with SubItem(self, i):
|
|
||||||
childPtr = self.extractPointer(addrBase + i * ptrSize)
|
|
||||||
self.putItem(self.createValue(childPtr, qobjectType))
|
|
||||||
|
|
||||||
if isQMetaObject:
|
if isQMetaObject:
|
||||||
with SubItem(self, '[strings]'):
|
with SubItem(self, '[strings]'):
|
||||||
@@ -2016,6 +2000,9 @@ class DumperBase():
|
|||||||
with Children(self):
|
with Children(self):
|
||||||
# Static properties.
|
# Static properties.
|
||||||
for i in range(propertyCount):
|
for i in range(propertyCount):
|
||||||
|
if self.qtVersion() >= 0x60000:
|
||||||
|
t = self.split('IIIII', dataPtr + properties * 4 + 20 * i)
|
||||||
|
else:
|
||||||
t = self.split('III', dataPtr + properties * 4 + 12 * i)
|
t = self.split('III', dataPtr + properties * 4 + 12 * i)
|
||||||
name = self.metaString(metaObjectPtr, t[0], revision)
|
name = self.metaString(metaObjectPtr, t[0], revision)
|
||||||
if qobject and self.qtPropertyFunc:
|
if qobject and self.qtPropertyFunc:
|
||||||
@@ -2045,19 +2032,38 @@ class DumperBase():
|
|||||||
|
|
||||||
# Dynamic properties.
|
# Dynamic properties.
|
||||||
if extraData:
|
if extraData:
|
||||||
|
def list6Generator(addr, innerType):
|
||||||
|
data, size = self.listData(addr)
|
||||||
|
for i in range(size):
|
||||||
|
yield self.createValue(data + i * innerType.size(), innerType)
|
||||||
|
|
||||||
|
def list5Generator(addr, innerType):
|
||||||
|
data, size = self.listData(addr)
|
||||||
|
for i in range(size):
|
||||||
|
yield self.createValue(data + i * ptrSize, innerType)
|
||||||
|
|
||||||
|
def vectorGenerator(addr, innerType):
|
||||||
|
data, size = self.vectorData(addr)
|
||||||
|
for i in range(size):
|
||||||
|
yield self.createValue(data + i * innerType.size(), innerType)
|
||||||
|
|
||||||
byteArrayType = self.createType('@QByteArray')
|
byteArrayType = self.createType('@QByteArray')
|
||||||
variantType = self.createType('@QVariant')
|
variantType = self.createType('@QVariant')
|
||||||
if self.qtVersion() >= 0x50600:
|
if self.qtVersion() >= 0x60000:
|
||||||
values = self.vectorChildrenGenerator(
|
values = vectorGenerator(extraData + 3 * ptrSize, variantType)
|
||||||
extraData + 2 * ptrSize, variantType)
|
elif self.qtVersion() >= 0x50600:
|
||||||
|
values = vectorGenerator(extraData + 2 * ptrSize, variantType)
|
||||||
elif self.qtVersion() >= 0x50000:
|
elif self.qtVersion() >= 0x50000:
|
||||||
values = self.listChildrenGenerator(
|
values = list5Generator(extraData + 2 * ptrSize, variantType)
|
||||||
extraData + 2 * ptrSize, variantType)
|
|
||||||
else:
|
else:
|
||||||
values = self.listChildrenGenerator(
|
values = list5Generator(extraData + 2 * ptrSize,
|
||||||
extraData + 2 * ptrSize, variantType.pointer())
|
variantType.pointer())
|
||||||
names = self.listChildrenGenerator(
|
|
||||||
extraData + ptrSize, byteArrayType)
|
if self.qtVersion() >= 0x60000:
|
||||||
|
names = list6Generator(extraData, byteArrayType)
|
||||||
|
else:
|
||||||
|
names = list5Generator(extraData + ptrSize, byteArrayType)
|
||||||
|
|
||||||
for (k, v) in zip(names, values):
|
for (k, v) in zip(names, values):
|
||||||
with SubItem(self, propertyCount + dynamicPropertyCount):
|
with SubItem(self, propertyCount + dynamicPropertyCount):
|
||||||
if not self.isCli:
|
if not self.isCli:
|
||||||
@@ -2163,7 +2169,7 @@ class DumperBase():
|
|||||||
with Children(self):
|
with Children(self):
|
||||||
innerType = connections.type[0]
|
innerType = connections.type[0]
|
||||||
# Should check: innerType == ns::QObjectPrivate::ConnectionList
|
# Should check: innerType == ns::QObjectPrivate::ConnectionList
|
||||||
data, size, _ = self.vectorData(connections)
|
data, size = self.vectorData(connections)
|
||||||
connectionType = self.createType('@QObjectPrivate::Connection')
|
connectionType = self.createType('@QObjectPrivate::Connection')
|
||||||
for i in range(size):
|
for i in range(size):
|
||||||
first = self.extractPointer(data + i * 2 * ptrSize)
|
first = self.extractPointer(data + i * 2 * ptrSize)
|
||||||
@@ -3853,7 +3859,12 @@ class DumperBase():
|
|||||||
def createType(self, typish, size=None):
|
def createType(self, typish, size=None):
|
||||||
if isinstance(typish, self.Type):
|
if isinstance(typish, self.Type):
|
||||||
#typish.check()
|
#typish.check()
|
||||||
|
if hasattr(typish, 'lbitsize') and typish.lbitsize is not None and typish.lbitsize > 0:
|
||||||
return typish
|
return typish
|
||||||
|
# Size 0 is sometimes reported by GDB but doesn't help at all.
|
||||||
|
# Force using the fallback:
|
||||||
|
typish = typish.name
|
||||||
|
|
||||||
if isinstance(typish, str):
|
if isinstance(typish, str):
|
||||||
ns = self.qtNamespace()
|
ns = self.qtNamespace()
|
||||||
typish = typish.replace('@', ns)
|
typish = typish.replace('@', ns)
|
||||||
@@ -3868,6 +3879,8 @@ class DumperBase():
|
|||||||
|
|
||||||
tdata = self.typeData.get(typish, None)
|
tdata = self.typeData.get(typish, None)
|
||||||
if tdata is not None:
|
if tdata is not None:
|
||||||
|
if tdata.lbitsize is not None:
|
||||||
|
if tdata.lbitsize > 0:
|
||||||
return self.Type(self, typish)
|
return self.Type(self, typish)
|
||||||
|
|
||||||
knownType = self.lookupType(typish)
|
knownType = self.lookupType(typish)
|
||||||
@@ -3881,9 +3894,13 @@ class DumperBase():
|
|||||||
tdata.name = typish
|
tdata.name = typish
|
||||||
tdata.typeId = typish
|
tdata.typeId = typish
|
||||||
tdata.templateArguments = self.listTemplateParameters(typish)
|
tdata.templateArguments = self.listTemplateParameters(typish)
|
||||||
|
|
||||||
if size is not None:
|
if size is not None:
|
||||||
tdata.lbitsize = 8 * size
|
tdata.lbitsize = 8 * size
|
||||||
|
if typish.endswith('*'):
|
||||||
|
tdata.code = TypeCode.Pointer
|
||||||
|
tdata.lbitsize = 8 * self.ptrSize()
|
||||||
|
tdata.ltarget = self.createType(typish[:-1].strip())
|
||||||
|
|
||||||
self.registerType(typish, tdata)
|
self.registerType(typish, tdata)
|
||||||
typeobj = self.Type(self, typish)
|
typeobj = self.Type(self, typish)
|
||||||
#DumperBase.warn('CREATE TYPE: %s' % typeobj.stringify())
|
#DumperBase.warn('CREATE TYPE: %s' % typeobj.stringify())
|
||||||
@@ -3918,27 +3935,6 @@ class DumperBase():
|
|||||||
val.ldata = proxy_data
|
val.ldata = proxy_data
|
||||||
return val
|
return val
|
||||||
|
|
||||||
def createContainerItem(self, data, innerTypish, container):
|
|
||||||
innerType = self.createType(innerTypish)
|
|
||||||
name = self.qtNamespace() + '%s<%s>' % (container, innerType.name)
|
|
||||||
typeId = name
|
|
||||||
tdata = self.TypeData(self)
|
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.name = name
|
|
||||||
tdata.templateArguments = [innerType]
|
|
||||||
tdata.lbitsize = 8 * self.ptrSize()
|
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
val = self.Value(self)
|
|
||||||
val.ldata = data
|
|
||||||
val.type = self.Type(self, typeId)
|
|
||||||
return val
|
|
||||||
|
|
||||||
def createListItem(self, data, innerTypish):
|
|
||||||
return self.createContainerItem(data, innerTypish, 'QList')
|
|
||||||
|
|
||||||
def createVectorItem(self, data, innerTypish):
|
|
||||||
return self.createContainerItem(data, innerTypish, 'QVector')
|
|
||||||
|
|
||||||
class StructBuilder():
|
class StructBuilder():
|
||||||
def __init__(self, dumper):
|
def __init__(self, dumper):
|
||||||
self.dumper = dumper
|
self.dumper = dumper
|
||||||
|
@@ -252,21 +252,26 @@ def qdump__QStandardItem(d, value):
|
|||||||
d.createType('@QStandardItemData') # warm up cache
|
d.createType('@QStandardItemData') # warm up cache
|
||||||
d.createType('@QStandardItem')
|
d.createType('@QStandardItem')
|
||||||
d.createType('@QStandardItem*')
|
d.createType('@QStandardItem*')
|
||||||
|
|
||||||
vtable, dptr = value.split('pp')
|
vtable, dptr = value.split('pp')
|
||||||
|
if d.qtVersion() >= 0x060000:
|
||||||
|
model, parent, values, children, rows, cols, item = \
|
||||||
|
d.split('pp{@QList<@QStandardItemData>}{@QList<@QStandardItem*>}IIp', dptr)
|
||||||
|
else:
|
||||||
# There used to be a virtual destructor that got removed in
|
# There used to be a virtual destructor that got removed in
|
||||||
# 88b6abcebf29b455438 on Apr 18 17:01:22 2017
|
# 88b6abcebf29b455438 on Apr 18 17:01:22 2017
|
||||||
if d.qtVersion() >= 0x050900 or d.isMsvcTarget():
|
if d.qtVersion() < 0x050900 and not d.isMsvcTarget():
|
||||||
model, parent, values, children, rows, cols, item = d.split('ppPPIIp', dptr)
|
dptr += d.ptrSize();
|
||||||
else:
|
model, parent, values, children, rows, cols, item = \
|
||||||
vtable1, model, parent, values, children, rows, cols, item = d.split('pppPPIIp', dptr)
|
d.split('pp{@QVector<@QStandardItemData>}{@QVector<@QStandardItem*>}IIp', dptr)
|
||||||
|
|
||||||
d.putEmptyValue()
|
d.putEmptyValue()
|
||||||
d.putExpandable()
|
d.putExpandable()
|
||||||
if d.isExpanded():
|
if d.isExpanded():
|
||||||
with Children(d):
|
with Children(d):
|
||||||
d.putSubItem('[model]', d.createValue(model, '@QStandardItemModel'))
|
d.putSubItem('[model]', d.createValue(model, '@QStandardItemModel'))
|
||||||
d.putSubItem('[values]', d.createVectorItem(values, '@QStandardItemData'))
|
d.putSubItem('[values]', values)
|
||||||
d.putSubItem('[children]', d.createVectorItem(children,
|
d.putSubItem('[children]', children)
|
||||||
d.createPointerType(value.type)))
|
|
||||||
|
|
||||||
|
|
||||||
def qdump__QDate(d, value):
|
def qdump__QDate(d, value):
|
||||||
@@ -651,7 +656,18 @@ def qdump__QFile(d, value):
|
|||||||
# 9fc0965 and a373ffcd change the layout of the private structure
|
# 9fc0965 and a373ffcd change the layout of the private structure
|
||||||
qtVersion = d.qtVersion()
|
qtVersion = d.qtVersion()
|
||||||
is32bit = d.ptrSize() == 4
|
is32bit = d.ptrSize() == 4
|
||||||
if qtVersion >= 0x050600 and d.qtTypeInfoVersion() >= 17:
|
if qtVersion >= 0x060000:
|
||||||
|
# FIXME: values 0 are wrong. As the file name is the
|
||||||
|
# only direct member of QFilePrivate, the offsets are
|
||||||
|
# equal to sizeof(QFileDevicePrivate), the base class.
|
||||||
|
if d.isWindowsTarget():
|
||||||
|
if d.isMsvcTarget():
|
||||||
|
offset = 0 if is32bit else 304
|
||||||
|
else:
|
||||||
|
offset = 0 if is32bit else 304
|
||||||
|
else:
|
||||||
|
offset = 0 if is32bit else 304
|
||||||
|
elif qtVersion >= 0x050600 and d.qtTypeInfoVersion() >= 17:
|
||||||
# Some QRingBuffer member got removed in 8f92baf5c9
|
# Some QRingBuffer member got removed in 8f92baf5c9
|
||||||
if d.isWindowsTarget():
|
if d.isWindowsTarget():
|
||||||
if d.isMsvcTarget():
|
if d.isMsvcTarget():
|
||||||
@@ -1047,8 +1063,7 @@ def qform__QList():
|
|||||||
|
|
||||||
|
|
||||||
def qdump__QList(d, value):
|
def qdump__QList(d, value):
|
||||||
inner_type = value.type.ltarget[0] if value.type.code == TypeCode.Typedef else value.type[0]
|
return qdumpHelper_QList(d, value, d.createType(value.type[0]))
|
||||||
return qdumpHelper_QList(d, value, value.type[0])
|
|
||||||
|
|
||||||
|
|
||||||
def qdump__QVariantList(d, value):
|
def qdump__QVariantList(d, value):
|
||||||
@@ -1056,25 +1071,16 @@ def qdump__QVariantList(d, value):
|
|||||||
|
|
||||||
|
|
||||||
def qdumpHelper_QList(d, value, innerType):
|
def qdumpHelper_QList(d, value, innerType):
|
||||||
if d.qtVersion() >= 0x60000:
|
data, size = d.listData(value, check=True)
|
||||||
dd, data, size = d.split('ppi', value)
|
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
|
|
||||||
|
if d.qtVersion() >= 0x60000:
|
||||||
d.putPlotData(data, size, innerType)
|
d.putPlotData(data, size, innerType)
|
||||||
return
|
return
|
||||||
base = d.extractPointer(value)
|
|
||||||
_, _, begin, end = d.split('IIII', base)
|
|
||||||
array = base + 16
|
|
||||||
if d.qtVersion() < 0x50000:
|
|
||||||
array += d.ptrSize()
|
|
||||||
d.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000)
|
|
||||||
size = end - begin
|
|
||||||
d.check(size >= 0)
|
|
||||||
|
|
||||||
d.putItemCount(size)
|
|
||||||
if d.isExpanded():
|
if d.isExpanded():
|
||||||
innerSize = innerType.size()
|
innerSize = innerType.size()
|
||||||
stepSize = d.ptrSize()
|
stepSize = d.ptrSize()
|
||||||
addr = array + begin * stepSize
|
|
||||||
# The exact condition here is:
|
# The exact condition here is:
|
||||||
# QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
|
# QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
|
||||||
# but this data is available neither in the compiled binary nor
|
# but this data is available neither in the compiled binary nor
|
||||||
@@ -1089,17 +1095,17 @@ def qdumpHelper_QList(d, value, innerType):
|
|||||||
isInternal = innerSize <= stepSize and innerType.isMovableType()
|
isInternal = innerSize <= stepSize and innerType.isMovableType()
|
||||||
if isInternal:
|
if isInternal:
|
||||||
if innerSize == stepSize:
|
if innerSize == stepSize:
|
||||||
d.putArrayData(addr, size, innerType)
|
d.putArrayData(data, size, innerType)
|
||||||
else:
|
else:
|
||||||
with Children(d, size, childType=innerType):
|
with Children(d, size, childType=innerType):
|
||||||
for i in d.childRange():
|
for i in d.childRange():
|
||||||
p = d.createValue(addr + i * stepSize, innerType)
|
p = d.createValue(data + i * stepSize, innerType)
|
||||||
d.putSubItem(i, p)
|
d.putSubItem(i, p)
|
||||||
else:
|
else:
|
||||||
# about 0.5s / 1000 items
|
# about 0.5s / 1000 items
|
||||||
with Children(d, size, maxNumChild=2000, childType=innerType):
|
with Children(d, size, maxNumChild=2000, childType=innerType):
|
||||||
for i in d.childRange():
|
for i in d.childRange():
|
||||||
p = d.extractPointer(addr + i * stepSize)
|
p = d.extractPointer(data + i * stepSize)
|
||||||
x = d.createValue(p, innerType)
|
x = d.createValue(p, innerType)
|
||||||
d.putSubItem(i, x)
|
d.putSubItem(i, x)
|
||||||
|
|
||||||
@@ -1661,27 +1667,34 @@ def qdump__QStack(d, value):
|
|||||||
|
|
||||||
|
|
||||||
def qdump__QPolygonF(d, value):
|
def qdump__QPolygonF(d, value):
|
||||||
data, size, _ = d.vectorData(value)
|
data, size = d.vectorData(value)
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
d.putPlotData(data, size, d.createType('@QPointF'))
|
d.putPlotData(data, size, d.createType('@QPointF'))
|
||||||
|
|
||||||
|
|
||||||
def qdump__QPolygon(d, value):
|
def qdump__QPolygon(d, value):
|
||||||
data, size, _ = d.vectorData(value)
|
data, size = d.vectorData(value)
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
d.putPlotData(data, size, d.createType('@QPoint'))
|
d.putPlotData(data, size, d.createType('@QPoint'))
|
||||||
|
|
||||||
|
|
||||||
def qdump__QGraphicsPolygonItem(d, value):
|
def qdump__QGraphicsPolygonItem(d, value):
|
||||||
(vtbl, dptr) = value.split('pp')
|
(vtbl, dptr) = value.split('pp')
|
||||||
# Assume sizeof(QGraphicsPolygonItemPrivate) == 400
|
if d.qtVersion() >= 0x060000:
|
||||||
|
if d.ptrSize() == 8:
|
||||||
|
offset = 424 # sizeof(QGraphicsPolygonItemPrivate), the base
|
||||||
|
else:
|
||||||
|
# Chicken out. Not worth maintaining.
|
||||||
|
d.putPlainChildren(value)
|
||||||
|
return
|
||||||
|
else:
|
||||||
if d.ptrSize() == 8:
|
if d.ptrSize() == 8:
|
||||||
offset = 384
|
offset = 384
|
||||||
elif d.isWindowsTarget():
|
elif d.isWindowsTarget():
|
||||||
offset = 328 if d.isMsvcTarget() else 320
|
offset = 328 if d.isMsvcTarget() else 320
|
||||||
else:
|
else:
|
||||||
offset = 308
|
offset = 308
|
||||||
data, size, alloc = d.vectorData(dptr + offset)
|
data, size = d.vectorData(dptr + offset)
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
d.putPlotData(data, size, d.createType('@QPointF'))
|
d.putPlotData(data, size, d.createType('@QPointF'))
|
||||||
|
|
||||||
@@ -2184,7 +2197,7 @@ def qdumpHelper__QVariant45(d, value):
|
|||||||
def qedit__QVector(d, value, data):
|
def qedit__QVector(d, value, data):
|
||||||
values = data.split(',')
|
values = data.split(',')
|
||||||
d.call('void', value, 'resize', str(len(values)))
|
d.call('void', value, 'resize', str(len(values)))
|
||||||
base, vsize, valloc = d.vectorData(value)
|
base, vsize = d.vectorData(value)
|
||||||
d.setValues(base, value.type[0].name, values)
|
d.setValues(base, value.type[0].name, values)
|
||||||
|
|
||||||
|
|
||||||
@@ -2194,24 +2207,22 @@ def qform__QVector():
|
|||||||
|
|
||||||
def qdump__QVector(d, value):
|
def qdump__QVector(d, value):
|
||||||
if d.qtVersion() >= 0x060000:
|
if d.qtVersion() >= 0x060000:
|
||||||
dd, data, size = value.split('ppi')
|
data, size = d.listData(value)
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
d.putPlotData(data, size, value.type.ltarget[0])
|
d.putPlotData(data, size, d.createType(value.type.ltarget[0]))
|
||||||
# g++ 9.3 does not add the template parameter list to the debug info.
|
# g++ 9.3 does not add the template parameter list to the debug info.
|
||||||
# Fake it for the common case:
|
# Fake it for the common case:
|
||||||
if value.type.name == d.qtNamespace() + "QVector":
|
if value.type.name == d.qtNamespace() + "QVector":
|
||||||
d.putBetterType(value.type.name + '<' + value.type.ltarget[0].name + '>')
|
d.putBetterType(value.type.name + '<' + value.type.ltarget[0].name + '>')
|
||||||
else:
|
else:
|
||||||
data, size, alloc = d.vectorData(value)
|
data, size = d.vectorData(value)
|
||||||
d.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
|
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
d.putPlotData(data, size, value.type[0])
|
d.putPlotData(data, size, d.createType(value.type[0]))
|
||||||
|
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
def qdump__QObjectConnectionList(d, value):
|
def qdump__QObjectConnectionList(d, value):
|
||||||
data, size, alloc = d.vectorData(value)
|
data, size = d.vectorData(value)
|
||||||
d.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
|
|
||||||
d.putItemCount(size)
|
d.putItemCount(size)
|
||||||
d.putPlotData(data, size, d.createType('@QObjectPrivate::ConnectionList'))
|
d.putPlotData(data, size, d.createType('@QObjectPrivate::ConnectionList'))
|
||||||
|
|
||||||
@@ -2756,7 +2767,10 @@ def qdump__QJSValue(d, value):
|
|||||||
if d.ptrSize() == 4:
|
if d.ptrSize() == 4:
|
||||||
qdump_32__QJSValue(d, value)
|
qdump_32__QJSValue(d, value)
|
||||||
else:
|
else:
|
||||||
qdump_64__QJSValue(d, value)
|
if d.qtVersion() >= 0x60000:
|
||||||
|
qdump_64__QJSValue_6(d, value)
|
||||||
|
else:
|
||||||
|
qdump_64__QJSValue_5(d, value)
|
||||||
|
|
||||||
|
|
||||||
def qdump_32__QJSValue(d, value):
|
def qdump_32__QJSValue(d, value):
|
||||||
@@ -2782,8 +2796,55 @@ def qdump_32__QJSValue(d, value):
|
|||||||
d.putType(' ')
|
d.putType(' ')
|
||||||
d.putFields(value)
|
d.putFields(value)
|
||||||
|
|
||||||
|
def qdump_64__QJSValue_6(d, value):
|
||||||
|
dd = value.split('Q')[0]
|
||||||
|
typ = dd >> 47
|
||||||
|
|
||||||
def qdump_64__QJSValue(d, value):
|
if dd == 0:
|
||||||
|
d.putValue('(undefined)')
|
||||||
|
d.putType(value.type.name + ' (undefined)')
|
||||||
|
elif typ == 5:
|
||||||
|
d.putValue('(null)')
|
||||||
|
d.putType(value.type.name + ' (null)')
|
||||||
|
elif typ == 6:
|
||||||
|
d.putValue('true' if dd & 1 else 'false')
|
||||||
|
d.putType(value.type.name + ' (bool)')
|
||||||
|
elif typ == 7:
|
||||||
|
d.putValue(dd & 0xfffffffff)
|
||||||
|
d.putType(value.type.name + ' (int)')
|
||||||
|
elif typ > 7:
|
||||||
|
val = d.Value(d)
|
||||||
|
val.ldata = struct.pack('q', dd ^ 0xfffc000000000000)
|
||||||
|
val.type = d.createType('double')
|
||||||
|
d.putItem(val)
|
||||||
|
d.putType(value.type.name + ' (double)')
|
||||||
|
elif typ <= 3: # Heap
|
||||||
|
if dd & 1: # String
|
||||||
|
val = d.Value(d)
|
||||||
|
val.ldata = struct.pack('q', dd & ~1)
|
||||||
|
val.type = d.createType('@QString*')
|
||||||
|
d.putItem(val)
|
||||||
|
d.putType(value.type.name + ' (QString)')
|
||||||
|
else:
|
||||||
|
# FIXME: Arrays, Objects missing.
|
||||||
|
val = d.split('{@QV4::Managed*}', value)[0]
|
||||||
|
d.putItem(val)
|
||||||
|
d.putItemCount(1)
|
||||||
|
else:
|
||||||
|
d.putEmptyValue()
|
||||||
|
d.putItemCount(1)
|
||||||
|
d.putPlainChildren(value)
|
||||||
|
return
|
||||||
|
|
||||||
|
if d.isExpanded():
|
||||||
|
with Children(d):
|
||||||
|
with SubItem(d, '[raw]'):
|
||||||
|
d.putValue('[0x%x]' % dd)
|
||||||
|
d.putType(' ')
|
||||||
|
d.putFields(value)
|
||||||
|
|
||||||
|
|
||||||
|
def qdump_64__QJSValue_5(d, value):
|
||||||
ns = d.qtNamespace()
|
ns = d.qtNamespace()
|
||||||
dd = value.split('Q')[0]
|
dd = value.split('Q')[0]
|
||||||
if dd == 0:
|
if dd == 0:
|
||||||
@@ -3163,20 +3224,30 @@ def qdump__QJsonValue(d, value):
|
|||||||
|
|
||||||
|
|
||||||
def qdump__QJsonArray(d, value):
|
def qdump__QJsonArray(d, value):
|
||||||
if d.qtVersion() >= 0x050f00:
|
if d.qtVersion() >= 0x060000:
|
||||||
|
dptr = d.extractPointer(value)
|
||||||
|
if not dptr:
|
||||||
|
d.putItemCount(0)
|
||||||
|
else:
|
||||||
|
qdumpHelper_QCbor_array(d, dptr, False)
|
||||||
|
elif d.qtVersion() >= 0x050f00:
|
||||||
_, container_ptr = value.split('pp')
|
_, container_ptr = value.split('pp')
|
||||||
qdumpHelper_QCbor_array(d, container_ptr, False)
|
qdumpHelper_QCbor_array(d, container_ptr, False)
|
||||||
return
|
else:
|
||||||
|
|
||||||
qdumpHelper_QJsonArray(d, value['d'].pointer(), value['a'].pointer())
|
qdumpHelper_QJsonArray(d, value['d'].pointer(), value['a'].pointer())
|
||||||
|
|
||||||
|
|
||||||
def qdump__QJsonObject(d, value):
|
def qdump__QJsonObject(d, value):
|
||||||
if d.qtVersion() >= 0x050f00:
|
if d.qtVersion() >= 0x060000:
|
||||||
|
dptr = d.extractPointer(value)
|
||||||
|
if not dptr:
|
||||||
|
d.putItemCount(0)
|
||||||
|
else:
|
||||||
|
qdumpHelper_QCbor_map(d, dptr, False)
|
||||||
|
elif d.qtVersion() >= 0x050f00:
|
||||||
_, container_ptr = value.split('pp')
|
_, container_ptr = value.split('pp')
|
||||||
qdumpHelper_QCbor_map(d, container_ptr, False)
|
qdumpHelper_QCbor_map(d, container_ptr, False)
|
||||||
return
|
else:
|
||||||
|
|
||||||
qdumpHelper_QJsonObject(d, value['d'].pointer(), value['o'].pointer())
|
qdumpHelper_QJsonObject(d, value['d'].pointer(), value['o'].pointer())
|
||||||
|
|
||||||
|
|
||||||
@@ -3248,12 +3319,13 @@ def qdump__qfloat16(d, value):
|
|||||||
def qdumpHelper_QCbor_string(d, container_ptr, element_index, is_bytes):
|
def qdumpHelper_QCbor_string(d, container_ptr, element_index, is_bytes):
|
||||||
# d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB,
|
# d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB,
|
||||||
# so be explicit:
|
# so be explicit:
|
||||||
pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8)
|
data_pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8)
|
||||||
elements_data_ptr, elements_size, _ = d.vectorData(pos + d.ptrSize())
|
elements_pos = data_pos + (3 * d.ptrSize() if d.qtVersion() >= 0x060000 else d.ptrSize())
|
||||||
element_at_n_addr = elements_data_ptr + element_index * 16 # sizeof(QtCbor::Element) == 15
|
elements_data_ptr, elements_size = d.vectorData(elements_pos)
|
||||||
|
element_at_n_addr = elements_data_ptr + element_index * 16 # sizeof(QtCbor::Element) == 16
|
||||||
element_value, _, element_flags = d.split('qII', element_at_n_addr)
|
element_value, _, element_flags = d.split('qII', element_at_n_addr)
|
||||||
enc = 'latin1' if is_bytes or (element_flags & 8) else 'utf16'
|
enc = 'latin1' if is_bytes or (element_flags & 8) else 'utf16'
|
||||||
bytedata, _, _ = d.qArrayData(pos)
|
bytedata, _, _ = d.qArrayData(data_pos)
|
||||||
bytedata += element_value
|
bytedata += element_value
|
||||||
if d.qtVersion() >= 0x060000:
|
if d.qtVersion() >= 0x060000:
|
||||||
bytedata_len = d.extractInt64(bytedata)
|
bytedata_len = d.extractInt64(bytedata)
|
||||||
@@ -3284,11 +3356,12 @@ def qdumpHelper_QCbor_array(d, container_ptr, is_cbor):
|
|||||||
return
|
return
|
||||||
# d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB,
|
# d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB,
|
||||||
# so be explicit:
|
# so be explicit:
|
||||||
pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8)
|
data_pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8)
|
||||||
elements_data_ptr, elements_size, _ = d.vectorData(pos + d.ptrSize())
|
elements_pos = data_pos + (3 * d.ptrSize() if d.qtVersion() >= 0x060000 else d.ptrSize())
|
||||||
|
elements_data_ptr, elements_size = d.vectorData(elements_pos)
|
||||||
d.putItemCount(elements_size)
|
d.putItemCount(elements_size)
|
||||||
if d.isExpanded():
|
if d.isExpanded():
|
||||||
bytedata, _, _ = d.qArrayData(pos)
|
bytedata, _, _ = d.qArrayData(data_pos)
|
||||||
with Children(d, maxNumChild=1000):
|
with Children(d, maxNumChild=1000):
|
||||||
for i in range(elements_size):
|
for i in range(elements_size):
|
||||||
d.putSubItem(i, qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, i, bytedata, is_cbor))
|
d.putSubItem(i, qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, i, bytedata, is_cbor))
|
||||||
@@ -3305,12 +3378,13 @@ def qdumpHelper_QCbor_map(d, container_ptr, is_cbor):
|
|||||||
return
|
return
|
||||||
# d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB,
|
# d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB,
|
||||||
# so be explicit:
|
# so be explicit:
|
||||||
pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8)
|
data_pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8)
|
||||||
elements_data_ptr, elements_size, _ = d.vectorData(pos + d.ptrSize())
|
elements_pos = data_pos + (3 * d.ptrSize() if d.qtVersion() >= 0x060000 else d.ptrSize())
|
||||||
|
elements_data_ptr, elements_size = d.vectorData(elements_pos)
|
||||||
elements_size = int(elements_size / 2)
|
elements_size = int(elements_size / 2)
|
||||||
d.putItemCount(elements_size)
|
d.putItemCount(elements_size)
|
||||||
if d.isExpanded():
|
if d.isExpanded():
|
||||||
bytedata, _, _ = d.qArrayDataHelper(pos)
|
bytedata, _, _ = d.qArrayDataHelper(data_pos)
|
||||||
with Children(d, maxNumChild=1000):
|
with Children(d, maxNumChild=1000):
|
||||||
for i in range(elements_size):
|
for i in range(elements_size):
|
||||||
key = qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, 2 * i, bytedata, is_cbor)
|
key = qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, 2 * i, bytedata, is_cbor)
|
||||||
@@ -3326,6 +3400,7 @@ def qdump__QCborMap(d, value):
|
|||||||
def qdump__QCborValue(d, value):
|
def qdump__QCborValue(d, value):
|
||||||
item_data, container_ptr, item_type = value.split('qpi')
|
item_data, container_ptr, item_type = value.split('qpi')
|
||||||
d.putItem(d.createProxyValue((item_data, container_ptr, item_type, True), 'QCborValue_proxy'))
|
d.putItem(d.createProxyValue((item_data, container_ptr, item_type, True), 'QCborValue_proxy'))
|
||||||
|
d.putPlainChildren(value)
|
||||||
|
|
||||||
def qdump__QCborValue_proxy(d, value):
|
def qdump__QCborValue_proxy(d, value):
|
||||||
item_data, container_ptr, item_type, is_cbor = value.data()
|
item_data, container_ptr, item_type, is_cbor = value.data()
|
||||||
|
@@ -2,6 +2,7 @@ QT += core gui widgets qml quick network
|
|||||||
QT += core-private qml-private quick-private gui-private
|
QT += core-private qml-private quick-private gui-private
|
||||||
|
|
||||||
CONFIG += c++17
|
CONFIG += c++17
|
||||||
|
win32: QMAKE_CXXFLAGS += /std:c++17
|
||||||
|
|
||||||
DEFINES -= QT_CREATOR
|
DEFINES -= QT_CREATOR
|
||||||
|
|
||||||
|
@@ -125,6 +125,7 @@ Column {
|
|||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("Horizontal tile mode")
|
text: qsTr("Horizontal tile mode")
|
||||||
|
disabledState: !backendValues.horizontalTileMode.isAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
SecondColumnLayout {
|
SecondColumnLayout {
|
||||||
@@ -134,11 +135,13 @@ Column {
|
|||||||
implicitWidth: 180
|
implicitWidth: 180
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
scope: "BorderImage"
|
scope: "BorderImage"
|
||||||
|
enabled: backendValue.isAvailable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("Vertical tile mode")
|
text: qsTr("Vertical tile mode")
|
||||||
|
disabledState: !backendValues.verticalTileMode.isAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
SecondColumnLayout {
|
SecondColumnLayout {
|
||||||
@@ -148,37 +151,42 @@ Column {
|
|||||||
implicitWidth: 180
|
implicitWidth: 180
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
scope: "BorderImage"
|
scope: "BorderImage"
|
||||||
|
enabled: backendValue.isAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("Source size")
|
text: qsTr("Source size")
|
||||||
|
disabledState: !backendValues.sourceSize.isAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
SecondColumnLayout {
|
SecondColumnLayout {
|
||||||
Label {
|
Label {
|
||||||
text: "W"
|
text: "W"
|
||||||
width: 12
|
width: 12
|
||||||
|
disabledStateSoft: !backendValues.sourceSize_width.isAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
SpinBox {
|
SpinBox {
|
||||||
backendValue: backendValues.sourceSize_width
|
backendValue: backendValues.sourceSize_width
|
||||||
minimumValue: -2000
|
minimumValue: -2000
|
||||||
maximumValue: 2000
|
maximumValue: 2000
|
||||||
|
enabled: backendValue.isAvailable
|
||||||
decimals: 0
|
decimals: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: "H"
|
text: "H"
|
||||||
width: 12
|
width: 12
|
||||||
|
disabledStateSoft: !backendValues.sourceSize_height.isAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
SpinBox {
|
SpinBox {
|
||||||
backendValue: backendValues.sourceSize_height
|
backendValue: backendValues.sourceSize_height
|
||||||
minimumValue: -2000
|
minimumValue: -2000
|
||||||
maximumValue: 2000
|
maximumValue: 2000
|
||||||
|
enabled: backendValue.isAvailable
|
||||||
decimals: 0
|
decimals: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,7 +27,6 @@ VersionData {
|
|||||||
name: "QUL 1.4"
|
name: "QUL 1.4"
|
||||||
|
|
||||||
bannedItems: ["QtQuick.AnimatedImage",
|
bannedItems: ["QtQuick.AnimatedImage",
|
||||||
"QtQuick.BorderImage",
|
|
||||||
"QtQuick.FocusScope",
|
"QtQuick.FocusScope",
|
||||||
"QtQuick.TextInput",
|
"QtQuick.TextInput",
|
||||||
"QtQuick.TextEdit",
|
"QtQuick.TextEdit",
|
||||||
@@ -104,6 +103,12 @@ VersionData {
|
|||||||
"sourceSize", "smooth"]
|
"sourceSize", "smooth"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QtQuick.BorderImage {
|
||||||
|
bannedProperties: ["asynchronous", "cache", "currentFrame", "frameCount",
|
||||||
|
"horizontalTileMode", "mirror", "progress", "smooth", "sourceSize",
|
||||||
|
"status", "verticalTileMode"]
|
||||||
|
}
|
||||||
|
|
||||||
QtQuick.Text {
|
QtQuick.Text {
|
||||||
allowChildren: false
|
allowChildren: false
|
||||||
allowedProperties: ["rotation", "scale", "transformOrigin"]
|
allowedProperties: ["rotation", "scale", "transformOrigin"]
|
||||||
|
@@ -12,8 +12,8 @@ set(CMAKE_CXX_STANDARD 11)
|
|||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
|
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
|
||||||
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
|
# Check https://doc.qt.io/qt/deployment-android.html for more information.
|
||||||
# They need to be set before the find_package(Qt5 ...) call.
|
# They need to be set before the find_package(...) calls below.
|
||||||
|
|
||||||
#if(ANDROID)
|
#if(ANDROID)
|
||||||
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
|
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
; This file can be edited to change the style of the application
|
; This file can be edited to change the style of the application
|
||||||
; Read "Qt Quick Controls 2 Configuration File" for details:
|
; Read "Qt Quick Controls 2 Configuration File" for details:
|
||||||
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
|
; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
|
||||||
|
@if '%{QtQuickControlsStyle}' != 'Default'
|
||||||
|
|
||||||
[Controls]
|
[Controls]
|
||||||
Style=%{QtQuickControlsStyle}
|
Style=%{QtQuickControlsStyle}
|
||||||
@@ -21,3 +22,4 @@ Theme=%{QtQuickControlsStyleTheme}
|
|||||||
;Foreground=Brown
|
;Foreground=Brown
|
||||||
;Background=Grey
|
;Background=Grey
|
||||||
@endif
|
@endif
|
||||||
|
@endif
|
||||||
|
@@ -12,8 +12,8 @@ set(CMAKE_CXX_STANDARD 11)
|
|||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
|
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
|
||||||
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
|
# Check https://doc.qt.io/qt/deployment-android.html for more information.
|
||||||
# They need to be set before the find_package(Qt5 ...) call.
|
# They need to be set before the find_package( ...) calls below.
|
||||||
|
|
||||||
#if(ANDROID)
|
#if(ANDROID)
|
||||||
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
|
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
|
||||||
|
@@ -257,6 +257,7 @@ PaletteWindowDisabled=backgroundColorDisabled
|
|||||||
PaletteWindowTextDisabled=textDisabled
|
PaletteWindowTextDisabled=textDisabled
|
||||||
PaletteBaseDisabled=backgroundColorDisabled
|
PaletteBaseDisabled=backgroundColorDisabled
|
||||||
PaletteTextDisabled=textDisabled
|
PaletteTextDisabled=textDisabled
|
||||||
|
PaletteMid=ffa0a0a0
|
||||||
|
|
||||||
QmlDesigner_BackgroundColor=qmlDesignerButtonColor
|
QmlDesigner_BackgroundColor=qmlDesignerButtonColor
|
||||||
QmlDesigner_HighlightColor=ff46a2da
|
QmlDesigner_HighlightColor=ff46a2da
|
||||||
|
@@ -385,6 +385,7 @@ PaletteWindowDisabled=backgroundColorDisabled
|
|||||||
PaletteWindowTextDisabled=textDisabled
|
PaletteWindowTextDisabled=textDisabled
|
||||||
PaletteBaseDisabled=backgroundColorDisabled
|
PaletteBaseDisabled=backgroundColorDisabled
|
||||||
PaletteTextDisabled=textDisabled
|
PaletteTextDisabled=textDisabled
|
||||||
|
PaletteMid=ffafafaf
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
ComboBoxDrawTextShadow=false
|
ComboBoxDrawTextShadow=false
|
||||||
|
@@ -275,6 +275,7 @@ PaletteWindowDisabled=backgroundColorDisabled
|
|||||||
PaletteWindowTextDisabled=textDisabled
|
PaletteWindowTextDisabled=textDisabled
|
||||||
PaletteBaseDisabled=backgroundColorDisabled
|
PaletteBaseDisabled=backgroundColorDisabled
|
||||||
PaletteTextDisabled=textDisabled
|
PaletteTextDisabled=textDisabled
|
||||||
|
PaletteMid=ffa0a0a0
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
ComboBoxDrawTextShadow=false
|
ComboBoxDrawTextShadow=false
|
||||||
|
@@ -1020,8 +1020,7 @@ FilePath AndroidConfig::defaultSdkPath()
|
|||||||
// Set default path of SDK as used by Android Studio
|
// Set default path of SDK as used by Android Studio
|
||||||
if (Utils::HostOsInfo::isMacHost()) {
|
if (Utils::HostOsInfo::isMacHost()) {
|
||||||
return Utils::FilePath::fromString(
|
return Utils::FilePath::fromString(
|
||||||
QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)
|
QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/Android/sdk");
|
||||||
+ "/../Android/sdk");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Utils::HostOsInfo::isWindowsHost()) {
|
if (Utils::HostOsInfo::isWindowsHost()) {
|
||||||
@@ -1348,7 +1347,11 @@ void AndroidConfigurations::updateAutomaticKitList()
|
|||||||
DeviceKitAspect::setDevice(k, device);
|
DeviceKitAspect::setDevice(k, device);
|
||||||
QStringList abis = static_cast<const AndroidQtVersion *>(qt)->androidAbis();
|
QStringList abis = static_cast<const AndroidQtVersion *>(qt)->androidAbis();
|
||||||
Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis, QtKitAspect::qtVersion(k)));
|
Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis, QtKitAspect::qtVersion(k)));
|
||||||
k->makeSticky();
|
|
||||||
|
k->setSticky(ToolChainKitAspect::id(), true);
|
||||||
|
k->setSticky(QtSupport::QtKitAspect::id(), true);
|
||||||
|
k->setSticky(DeviceKitAspect::id(), true);
|
||||||
|
k->setSticky(DeviceTypeKitAspect::id(), true);
|
||||||
|
|
||||||
QString versionStr = QLatin1String("Qt %{Qt:Version}");
|
QString versionStr = QLatin1String("Qt %{Qt:Version}");
|
||||||
if (!qt->isAutodetected())
|
if (!qt->isAutodetected())
|
||||||
@@ -1451,16 +1454,14 @@ AndroidConfigurations::~AndroidConfigurations() = default;
|
|||||||
|
|
||||||
static Utils::FilePath androidStudioPath()
|
static Utils::FilePath androidStudioPath()
|
||||||
{
|
{
|
||||||
if (Utils::HostOsInfo::isWindowsHost()) {
|
#if defined(Q_OS_WIN)
|
||||||
const QLatin1String registryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio");
|
const QLatin1String registryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio");
|
||||||
const QLatin1String valueName("Path");
|
const QLatin1String valueName("Path");
|
||||||
#if defined(Q_OS_WIN)
|
|
||||||
const QSettings settings64(registryKey, QSettings::Registry64Format);
|
const QSettings settings64(registryKey, QSettings::Registry64Format);
|
||||||
const QSettings settings32(registryKey, QSettings::Registry32Format);
|
const QSettings settings32(registryKey, QSettings::Registry32Format);
|
||||||
return Utils::FilePath::fromUserInput(
|
return Utils::FilePath::fromUserInput(
|
||||||
settings64.value(valueName, settings32.value(valueName).toString()).toString());
|
settings64.value(valueName, settings32.value(valueName).toString()).toString());
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
return {}; // TODO non-Windows
|
return {}; // TODO non-Windows
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include <projectexplorer/buildinfo.h>
|
#include <projectexplorer/buildinfo.h>
|
||||||
#include <projectexplorer/kitinformation.h>
|
#include <projectexplorer/kitinformation.h>
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
|
#include <projectexplorer/toolchainmanager.h>
|
||||||
|
|
||||||
#include <qtsupport/qtkitinformation.h>
|
#include <qtsupport/qtkitinformation.h>
|
||||||
|
|
||||||
@@ -318,7 +319,10 @@ bool CMakeProjectImporter::matchKit(void *directoryData, const Kit *k) const
|
|||||||
if (data->qt.qt && QtSupport::QtKitAspect::qtVersionId(k) != data->qt.qt->uniqueId())
|
if (data->qt.qt && QtSupport::QtKitAspect::qtVersionId(k) != data->qt.qt->uniqueId())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
const QList<Id> allLanguages = ToolChainManager::allLanguages();
|
||||||
for (const ToolChainDescription &tcd : data->toolChains) {
|
for (const ToolChainDescription &tcd : data->toolChains) {
|
||||||
|
if (!Utils::contains(allLanguages, [&tcd](const Id& language) {return language == tcd.language;}))
|
||||||
|
continue;
|
||||||
ToolChain *tc = ToolChainKitAspect::toolChain(k, tcd.language);
|
ToolChain *tc = ToolChainKitAspect::toolChain(k, tcd.language);
|
||||||
if (!tc || tc->compilerCommand() != tcd.compilerPath)
|
if (!tc || tc->compilerCommand() != tcd.compilerPath)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -637,7 +637,7 @@ QWidget *ICore::dialogParent()
|
|||||||
QWidget *active = QApplication::activeModalWidget();
|
QWidget *active = QApplication::activeModalWidget();
|
||||||
if (!active)
|
if (!active)
|
||||||
active = QApplication::activeWindow();
|
active = QApplication::activeWindow();
|
||||||
if (!active)
|
if (!active || (active && active->windowFlags().testFlag(Qt::SplashScreen)))
|
||||||
active = m_mainwindow;
|
active = m_mainwindow;
|
||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,6 @@ namespace Internal {
|
|||||||
namespace Constants {
|
namespace Constants {
|
||||||
const QLatin1String CUSTOMCOMMANDBUILDER_COMMAND("IncrediBuild.BuildConsole.%1.Command");
|
const QLatin1String CUSTOMCOMMANDBUILDER_COMMAND("IncrediBuild.BuildConsole.%1.Command");
|
||||||
const QLatin1String CUSTOMCOMMANDBUILDER_ARGS("IncrediBuild.BuildConsole.%1.Arguments");
|
const QLatin1String CUSTOMCOMMANDBUILDER_ARGS("IncrediBuild.BuildConsole.%1.Arguments");
|
||||||
const QLatin1String CUSTOMCOMMANDBUILDER_ARGSSET("IncrediBuild.BuildConsole.%1.ArgumentsSet");
|
|
||||||
} // namespace Constants
|
} // namespace Constants
|
||||||
|
|
||||||
void CommandBuilder::fromMap(const QVariantMap &map)
|
void CommandBuilder::fromMap(const QVariantMap &map)
|
||||||
|
@@ -39,6 +39,7 @@ const char KIT_MCUTARGET_SDKVERSION_KEY[] = "McuSupport.McuTargetSdkVersion";
|
|||||||
const char KIT_MCUTARGET_KITVERSION_KEY[] = "McuSupport.McuTargetKitVersion";
|
const char KIT_MCUTARGET_KITVERSION_KEY[] = "McuSupport.McuTargetKitVersion";
|
||||||
const char KIT_MCUTARGET_COLORDEPTH_KEY[] = "McuSupport.McuTargetColorDepth";
|
const char KIT_MCUTARGET_COLORDEPTH_KEY[] = "McuSupport.McuTargetColorDepth";
|
||||||
const char KIT_MCUTARGET_OS_KEY[] = "McuSupport.McuTargetOs";
|
const char KIT_MCUTARGET_OS_KEY[] = "McuSupport.McuTargetOs";
|
||||||
|
const char KIT_MCUTARGET_TOOCHAIN_KEY[] = "McuSupport.McuTargetToolchain";
|
||||||
|
|
||||||
const char SETTINGS_GROUP[] = "McuSupport";
|
const char SETTINGS_GROUP[] = "McuSupport";
|
||||||
const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_";
|
const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_";
|
||||||
|
@@ -65,7 +65,7 @@ using namespace Utils;
|
|||||||
namespace McuSupport {
|
namespace McuSupport {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
static const int KIT_VERSION = 7; // Bumps up whenever details in Kit creation change
|
static const int KIT_VERSION = 8; // Bumps up whenever details in Kit creation change
|
||||||
|
|
||||||
static QString packagePathFromSettings(const QString &settingsKey,
|
static QString packagePathFromSettings(const QString &settingsKey,
|
||||||
QSettings::Scope scope = QSettings::UserScope,
|
QSettings::Scope scope = QSettings::UserScope,
|
||||||
@@ -577,6 +577,7 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc
|
|||||||
k->setValue(KIT_MCUTARGET_SDKVERSION_KEY, mcuTarget->qulVersion().toString());
|
k->setValue(KIT_MCUTARGET_SDKVERSION_KEY, mcuTarget->qulVersion().toString());
|
||||||
k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION);
|
k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION);
|
||||||
k->setValue(KIT_MCUTARGET_OS_KEY, static_cast<int>(mcuTarget->os()));
|
k->setValue(KIT_MCUTARGET_OS_KEY, static_cast<int>(mcuTarget->os()));
|
||||||
|
k->setValue(KIT_MCUTARGET_TOOCHAIN_KEY, mcuTarget->toolChainPackage()->toolChainName());
|
||||||
k->setAutoDetected(true);
|
k->setAutoDetected(true);
|
||||||
k->makeSticky();
|
k->makeSticky();
|
||||||
if (mcuTarget->toolChainPackage()->isDesktopToolchain())
|
if (mcuTarget->toolChainPackage()->isDesktopToolchain())
|
||||||
@@ -741,6 +742,8 @@ QList<Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget)
|
|||||||
&& kit->value(KIT_MCUTARGET_COLORDEPTH_KEY) == mcuTarget->colorDepth()
|
&& kit->value(KIT_MCUTARGET_COLORDEPTH_KEY) == mcuTarget->colorDepth()
|
||||||
&& kit->value(KIT_MCUTARGET_OS_KEY).toInt()
|
&& kit->value(KIT_MCUTARGET_OS_KEY).toInt()
|
||||||
== static_cast<int>(mcuTarget->os())
|
== static_cast<int>(mcuTarget->os())
|
||||||
|
&& kit->value(KIT_MCUTARGET_TOOCHAIN_KEY)
|
||||||
|
== mcuTarget->toolChainPackage()->toolChainName()
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -59,7 +59,6 @@ using namespace Utils;
|
|||||||
const char BUILD_TARGETS_SUFFIX[] = ".BuildTargets";
|
const char BUILD_TARGETS_SUFFIX[] = ".BuildTargets";
|
||||||
const char MAKE_ARGUMENTS_SUFFIX[] = ".MakeArguments";
|
const char MAKE_ARGUMENTS_SUFFIX[] = ".MakeArguments";
|
||||||
const char MAKE_COMMAND_SUFFIX[] = ".MakeCommand";
|
const char MAKE_COMMAND_SUFFIX[] = ".MakeCommand";
|
||||||
const char CLEAN_SUFFIX[] = ".Clean";
|
|
||||||
const char OVERRIDE_MAKEFLAGS_SUFFIX[] = ".OverrideMakeflags";
|
const char OVERRIDE_MAKEFLAGS_SUFFIX[] = ".OverrideMakeflags";
|
||||||
const char JOBCOUNT_SUFFIX[] = ".JobCount";
|
const char JOBCOUNT_SUFFIX[] = ".JobCount";
|
||||||
|
|
||||||
|
@@ -3903,7 +3903,7 @@ void ProjectExplorerPlugin::addCustomParser(const CustomParserSettings &settings
|
|||||||
|
|
||||||
void ProjectExplorerPlugin::removeCustomParser(Id id)
|
void ProjectExplorerPlugin::removeCustomParser(Id id)
|
||||||
{
|
{
|
||||||
erase(dd->m_customParsers, [id](const CustomParserSettings &s) {
|
Utils::erase(dd->m_customParsers, [id](const CustomParserSettings &s) {
|
||||||
return s.id == id;
|
return s.id == id;
|
||||||
});
|
});
|
||||||
emit m_instance->customParsersChanged();
|
emit m_instance->customParsersChanged();
|
||||||
|
@@ -272,11 +272,7 @@ QString QbsBuildConfiguration::configurationName() const
|
|||||||
QString QbsBuildConfiguration::equivalentCommandLine(const QbsBuildStepData &stepData) const
|
QString QbsBuildConfiguration::equivalentCommandLine(const QbsBuildStepData &stepData) const
|
||||||
{
|
{
|
||||||
CommandLine commandLine;
|
CommandLine commandLine;
|
||||||
const QString qbsInstallDir = QString::fromLocal8Bit(qgetenv("QBS_INSTALL_DIR"));
|
commandLine.addArg(QDir::toNativeSeparators(QbsSettings::qbsExecutableFilePath().toString()));
|
||||||
const QString qbsFilePath = HostOsInfo::withExecutableSuffix(!qbsInstallDir.isEmpty()
|
|
||||||
? qbsInstallDir + QLatin1String("/bin/qbs")
|
|
||||||
: QCoreApplication::applicationDirPath() + QLatin1String("/qbs"));
|
|
||||||
commandLine.addArg(QDir::toNativeSeparators(qbsFilePath));
|
|
||||||
commandLine.addArg(stepData.command);
|
commandLine.addArg(stepData.command);
|
||||||
const QString buildDir = buildDirectory().toUserOutput();
|
const QString buildDir = buildDirectory().toUserOutput();
|
||||||
commandLine.addArgs({"-d", buildDir});
|
commandLine.addArgs({"-d", buildDir});
|
||||||
|
@@ -786,7 +786,9 @@ static void getExpandedCompilerFlags(QStringList &cFlags, QStringList &cxxFlags,
|
|||||||
cFlags = cxxFlags = commonFlags;
|
cFlags = cxxFlags = commonFlags;
|
||||||
|
|
||||||
const auto cxxLanguageVersion = arrayToStringList(getCppProp("cxxLanguageVersion"));
|
const auto cxxLanguageVersion = arrayToStringList(getCppProp("cxxLanguageVersion"));
|
||||||
if (cxxLanguageVersion.contains("c++17"))
|
if (cxxLanguageVersion.contains("c++20"))
|
||||||
|
cxxFlags << "-std=c++20";
|
||||||
|
else if (cxxLanguageVersion.contains("c++17"))
|
||||||
cxxFlags << "-std=c++17";
|
cxxFlags << "-std=c++17";
|
||||||
else if (cxxLanguageVersion.contains("c++14"))
|
else if (cxxLanguageVersion.contains("c++14"))
|
||||||
cxxFlags << "-std=c++14";
|
cxxFlags << "-std=c++14";
|
||||||
@@ -805,7 +807,11 @@ static void getExpandedCompilerFlags(QStringList &cFlags, QStringList &cxxFlags,
|
|||||||
cxxFlags << QLatin1String(enableRtti.toBool() ? "-frtti" : "-fno-rtti");
|
cxxFlags << QLatin1String(enableRtti.toBool() ? "-frtti" : "-fno-rtti");
|
||||||
|
|
||||||
const auto cLanguageVersion = arrayToStringList(getCppProp("cLanguageVersion"));
|
const auto cLanguageVersion = arrayToStringList(getCppProp("cLanguageVersion"));
|
||||||
if (cLanguageVersion.contains("c11"))
|
if (cLanguageVersion.contains("c18"))
|
||||||
|
cFlags << "-cstd=c18";
|
||||||
|
else if (cLanguageVersion.contains("c17"))
|
||||||
|
cFlags << "-std=c17";
|
||||||
|
else if (cLanguageVersion.contains("c11"))
|
||||||
cFlags << "-std=c11";
|
cFlags << "-std=c11";
|
||||||
else if (cLanguageVersion.contains("c99"))
|
else if (cLanguageVersion.contains("c99"))
|
||||||
cFlags << "-std=c99";
|
cFlags << "-std=c99";
|
||||||
|
@@ -57,7 +57,7 @@ void BindingModel::resetModel()
|
|||||||
QStringList({tr("Item"), tr("Property"), tr("Source Item"), tr("Source Property")}));
|
QStringList({tr("Item"), tr("Property"), tr("Source Item"), tr("Source Property")}));
|
||||||
|
|
||||||
if (connectionView()->isAttached()) {
|
if (connectionView()->isAttached()) {
|
||||||
for (const ModelNode modelNode : connectionView()->selectedModelNodes())
|
for (const ModelNode &modelNode : connectionView()->selectedModelNodes())
|
||||||
addModelNode(modelNode);
|
addModelNode(modelNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@ namespace {
|
|||||||
QStringList propertyNameListToStringList(const QmlDesigner::PropertyNameList &propertyNameList)
|
QStringList propertyNameListToStringList(const QmlDesigner::PropertyNameList &propertyNameList)
|
||||||
{
|
{
|
||||||
QStringList stringList;
|
QStringList stringList;
|
||||||
for (const QmlDesigner::PropertyName propertyName : propertyNameList) {
|
for (const QmlDesigner::PropertyName &propertyName : propertyNameList) {
|
||||||
stringList << QString::fromUtf8(propertyName);
|
stringList << QString::fromUtf8(propertyName);
|
||||||
}
|
}
|
||||||
stringList.removeDuplicates();
|
stringList.removeDuplicates();
|
||||||
|
@@ -134,7 +134,7 @@ void DynamicPropertiesModel::resetModel()
|
|||||||
QStringList({tr("Item"), tr("Property"), tr("Property Type"), tr("Property Value")}));
|
QStringList({tr("Item"), tr("Property"), tr("Property Type"), tr("Property Value")}));
|
||||||
|
|
||||||
if (connectionView()->isAttached()) {
|
if (connectionView()->isAttached()) {
|
||||||
for (const ModelNode modelNode : connectionView()->selectedModelNodes())
|
for (const ModelNode &modelNode : connectionView()->selectedModelNodes())
|
||||||
addModelNode(modelNode);
|
addModelNode(modelNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -44,6 +44,7 @@ Edit3DCanvas::Edit3DCanvas(Edit3DWidget *parent)
|
|||||||
{
|
{
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
|
setFocusPolicy(Qt::ClickFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Edit3DCanvas::updateRenderImage(const QImage &img)
|
void Edit3DCanvas::updateRenderImage(const QImage &img)
|
||||||
|
@@ -484,6 +484,8 @@ void ItemLibraryWidget::addImport(const QString &name, const QString &version)
|
|||||||
void ItemLibraryWidget::addPossibleImport(const QString &name)
|
void ItemLibraryWidget::addPossibleImport(const QString &name)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_model, return);
|
QTC_ASSERT(m_model, return);
|
||||||
|
QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_IMPORT_ADDED_FLOWTAG
|
||||||
|
+ name);
|
||||||
const Import import = m_model->highestPossibleImport(name);
|
const Import import = m_model->highestPossibleImport(name);
|
||||||
try {
|
try {
|
||||||
QList<Import> addedImports = {Import::createLibraryImport(name, import.version())};
|
QList<Import> addedImports = {Import::createLibraryImport(name, import.version())};
|
||||||
|
@@ -126,7 +126,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void walCheckpointFull()
|
void walCheckpointFull() override
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
database.walCheckpointFull();
|
database.walCheckpointFull();
|
||||||
|
@@ -39,10 +39,13 @@
|
|||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <QRectF>
|
#include <QRectF>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
#include <QTimer>
|
||||||
#include <QtGui/qevent.h>
|
#include <QtGui/qevent.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
QT_FORWARD_DECLARE_CLASS(QFileSystemWatcher)
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
class Target;
|
class Target;
|
||||||
}
|
}
|
||||||
@@ -219,6 +222,8 @@ private: // functions
|
|||||||
QVariant modelNodePreviewImageDataToVariant(const ModelNodePreviewImageData &imageData);
|
QVariant modelNodePreviewImageDataToVariant(const ModelNodePreviewImageData &imageData);
|
||||||
void updatePreviewImageForNode(const ModelNode &modelNode, const QImage &image);
|
void updatePreviewImageForNode(const ModelNode &modelNode, const QImage &image);
|
||||||
|
|
||||||
|
void updateWatcher(const QString &path);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QHash<QString, ModelNodePreviewImageData> m_imageDataMap;
|
QHash<QString, ModelNodePreviewImageData> m_imageDataMap;
|
||||||
|
|
||||||
@@ -236,7 +241,16 @@ private:
|
|||||||
|
|
||||||
// key: fileUrl value: (key: instance qml id, value: related tool states)
|
// key: fileUrl value: (key: instance qml id, value: related tool states)
|
||||||
QHash<QUrl, QHash<QString, QVariantMap>> m_edit3DToolStates;
|
QHash<QUrl, QHash<QString, QVariantMap>> m_edit3DToolStates;
|
||||||
|
|
||||||
std::function<void()> m_crashCallback{[this] { handleCrash(); }};
|
std::function<void()> m_crashCallback{[this] { handleCrash(); }};
|
||||||
|
|
||||||
|
// We use QFileSystemWatcher directly instead of Utils::FileSystemWatcher as we want
|
||||||
|
// shader changes to be applied immediately rather than requiring reactivation of
|
||||||
|
// the creator application.
|
||||||
|
QFileSystemWatcher *m_fileSystemWatcher;
|
||||||
|
QTimer m_resetTimer;
|
||||||
|
QTimer m_updateWatcherTimer;
|
||||||
|
QSet<QString> m_pendingUpdateDirs;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ProxyNodeInstanceView
|
} // namespace ProxyNodeInstanceView
|
||||||
|
@@ -190,6 +190,7 @@ protected: // functions
|
|||||||
private: //variables
|
private: //variables
|
||||||
ModelNode nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const;
|
ModelNode nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const;
|
||||||
void setupCanonicalHashes() const;
|
void setupCanonicalHashes() const;
|
||||||
|
void handleLibraryInfoUpdate();
|
||||||
|
|
||||||
TextModifier *m_textModifier = nullptr;
|
TextModifier *m_textModifier = nullptr;
|
||||||
int transactionLevel = 0;
|
int transactionLevel = 0;
|
||||||
@@ -210,6 +211,7 @@ private: //variables
|
|||||||
std::function<void(bool)> m_setWidgetStatusCallback;
|
std::function<void(bool)> m_setWidgetStatusCallback;
|
||||||
bool m_hasIncompleteTypeInformation = false;
|
bool m_hasIncompleteTypeInformation = false;
|
||||||
bool m_restoringAuxData = false;
|
bool m_restoringAuxData = false;
|
||||||
|
bool m_modelAttachPending = false;
|
||||||
|
|
||||||
mutable QHash<int, ModelNode> m_canonicalIntModelNode;
|
mutable QHash<int, ModelNode> m_canonicalIntModelNode;
|
||||||
mutable QHash<ModelNode, int> m_canonicalModelNodeInt;
|
mutable QHash<ModelNode, int> m_canonicalModelNodeInt;
|
||||||
|
@@ -100,6 +100,7 @@
|
|||||||
#include <QTimerEvent>
|
#include <QTimerEvent>
|
||||||
#include <QPicture>
|
#include <QPicture>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <QDirIterator>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
debug = false
|
debug = false
|
||||||
@@ -135,8 +136,44 @@ NodeInstanceView::NodeInstanceView(ConnectionManagerInterface &connectionManager
|
|||||||
: m_connectionManager(connectionManager)
|
: m_connectionManager(connectionManager)
|
||||||
, m_baseStatePreviewImage(QSize(100, 100), QImage::Format_ARGB32)
|
, m_baseStatePreviewImage(QSize(100, 100), QImage::Format_ARGB32)
|
||||||
, m_restartProcessTimerId(0)
|
, m_restartProcessTimerId(0)
|
||||||
|
, m_fileSystemWatcher(new QFileSystemWatcher(this))
|
||||||
{
|
{
|
||||||
m_baseStatePreviewImage.fill(0xFFFFFF);
|
m_baseStatePreviewImage.fill(0xFFFFFF);
|
||||||
|
|
||||||
|
// Interval > 0 is used for QFileSystemWatcher related timers to allow all notifications
|
||||||
|
// related to a single event to be received before we act.
|
||||||
|
m_resetTimer.setSingleShot(true);
|
||||||
|
m_resetTimer.setInterval(100);
|
||||||
|
QObject::connect(&m_resetTimer, &QTimer::timeout, [this] {
|
||||||
|
resetPuppet();
|
||||||
|
});
|
||||||
|
m_updateWatcherTimer.setSingleShot(true);
|
||||||
|
m_updateWatcherTimer.setInterval(100);
|
||||||
|
QObject::connect(&m_updateWatcherTimer, &QTimer::timeout, [this] {
|
||||||
|
for (const auto &path : qAsConst(m_pendingUpdateDirs))
|
||||||
|
updateWatcher(path);
|
||||||
|
m_pendingUpdateDirs.clear();
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged,
|
||||||
|
[this](const QString &path) {
|
||||||
|
const QSet<QString> pendingDirs = m_pendingUpdateDirs;
|
||||||
|
for (const auto &pendingPath : pendingDirs) {
|
||||||
|
if (path.startsWith(pendingPath)) {
|
||||||
|
// no need to add path, already handled by a pending parent path
|
||||||
|
return;
|
||||||
|
} else if (pendingPath.startsWith(path)) {
|
||||||
|
// Parent path to a pending path added, remove the pending path
|
||||||
|
m_pendingUpdateDirs.remove(pendingPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_pendingUpdateDirs.insert(path);
|
||||||
|
m_updateWatcherTimer.start();
|
||||||
|
|
||||||
|
});
|
||||||
|
connect(m_fileSystemWatcher, &QFileSystemWatcher::fileChanged, [this] {
|
||||||
|
m_resetTimer.start();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -210,6 +247,8 @@ void NodeInstanceView::modelAttached(Model *model)
|
|||||||
NodeInstance newStateInstance = instanceForModelNode(stateNode);
|
NodeInstance newStateInstance = instanceForModelNode(stateNode);
|
||||||
activateState(newStateInstance);
|
activateState(newStateInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateWatcher({});
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeInstanceView::modelAboutToBeDetached(Model * model)
|
void NodeInstanceView::modelAboutToBeDetached(Model * model)
|
||||||
@@ -227,6 +266,11 @@ void NodeInstanceView::modelAboutToBeDetached(Model * model)
|
|||||||
m_activeStateInstance = NodeInstance();
|
m_activeStateInstance = NodeInstance();
|
||||||
m_rootNodeInstance = NodeInstance();
|
m_rootNodeInstance = NodeInstance();
|
||||||
AbstractView::modelAboutToBeDetached(model);
|
AbstractView::modelAboutToBeDetached(model);
|
||||||
|
m_resetTimer.stop();
|
||||||
|
m_updateWatcherTimer.stop();
|
||||||
|
m_pendingUpdateDirs.clear();
|
||||||
|
m_fileSystemWatcher->removePaths(m_fileSystemWatcher->directories());
|
||||||
|
m_fileSystemWatcher->removePaths(m_fileSystemWatcher->files());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeInstanceView::handleCrash()
|
void NodeInstanceView::handleCrash()
|
||||||
@@ -378,6 +422,7 @@ void NodeInstanceView::resetVerticalAnchors(const ModelNode &modelNode)
|
|||||||
|
|
||||||
void NodeInstanceView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList)
|
void NodeInstanceView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
|
|
||||||
QList<ModelNode> nodeList;
|
QList<ModelNode> nodeList;
|
||||||
QList<AbstractProperty> nonNodePropertyList;
|
QList<AbstractProperty> nonNodePropertyList;
|
||||||
@@ -449,6 +494,7 @@ void NodeInstanceView::nodeTypeChanged(const ModelNode &, const TypeName &, int,
|
|||||||
|
|
||||||
void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags /*propertyChange*/)
|
void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags /*propertyChange*/)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
m_nodeInstanceServer->changePropertyBindings(createChangeBindingCommand(propertyList));
|
m_nodeInstanceServer->changePropertyBindings(createChangeBindingCommand(propertyList));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -463,6 +509,7 @@ void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& pr
|
|||||||
|
|
||||||
void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags /*propertyChange*/)
|
void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags /*propertyChange*/)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
updatePosition(propertyList);
|
updatePosition(propertyList);
|
||||||
m_nodeInstanceServer->changePropertyValues(createChangeValueCommand(propertyList));
|
m_nodeInstanceServer->changePropertyValues(createChangeValueCommand(propertyList));
|
||||||
}
|
}
|
||||||
@@ -478,6 +525,7 @@ void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& pr
|
|||||||
|
|
||||||
void NodeInstanceView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags /*propertyChange*/)
|
void NodeInstanceView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags /*propertyChange*/)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
if (!isSkippedNode(node)) {
|
if (!isSkippedNode(node)) {
|
||||||
updateChildren(newPropertyParent);
|
updateChildren(newPropertyParent);
|
||||||
m_nodeInstanceServer->reparentInstances(
|
m_nodeInstanceServer->reparentInstances(
|
||||||
@@ -487,11 +535,14 @@ void NodeInstanceView::nodeReparented(const ModelNode &node, const NodeAbstractP
|
|||||||
|
|
||||||
void NodeInstanceView::fileUrlChanged(const QUrl &/*oldUrl*/, const QUrl &newUrl)
|
void NodeInstanceView::fileUrlChanged(const QUrl &/*oldUrl*/, const QUrl &newUrl)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
m_nodeInstanceServer->changeFileUrl(createChangeFileUrlCommand(newUrl));
|
m_nodeInstanceServer->changeFileUrl(createChangeFileUrlCommand(newUrl));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeInstanceView::nodeIdChanged(const ModelNode& node, const QString& /*newId*/, const QString &oldId)
|
void NodeInstanceView::nodeIdChanged(const ModelNode& node, const QString& /*newId*/, const QString &oldId)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
|
|
||||||
if (hasInstanceForModelNode(node)) {
|
if (hasInstanceForModelNode(node)) {
|
||||||
NodeInstance instance = instanceForModelNode(node);
|
NodeInstance instance = instanceForModelNode(node);
|
||||||
m_nodeInstanceServer->changeIds(createChangeIdsCommand({instance}));
|
m_nodeInstanceServer->changeIds(createChangeIdsCommand({instance}));
|
||||||
@@ -502,6 +553,7 @@ void NodeInstanceView::nodeIdChanged(const ModelNode& node, const QString& /*new
|
|||||||
void NodeInstanceView::nodeOrderChanged(const NodeListProperty & listProperty,
|
void NodeInstanceView::nodeOrderChanged(const NodeListProperty & listProperty,
|
||||||
const ModelNode & /*movedNode*/, int /*oldIndex*/)
|
const ModelNode & /*movedNode*/, int /*oldIndex*/)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
QVector<ReparentContainer> containerList;
|
QVector<ReparentContainer> containerList;
|
||||||
PropertyName propertyName = listProperty.name();
|
PropertyName propertyName = listProperty.name();
|
||||||
qint32 containerInstanceId = -1;
|
qint32 containerInstanceId = -1;
|
||||||
@@ -530,6 +582,7 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node,
|
|||||||
const PropertyName &name,
|
const PropertyName &name,
|
||||||
const QVariant &value)
|
const QVariant &value)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
if (((node.isRootNode() && (name == "width" || name == "height")) || name == "invisible" || name == "locked")
|
if (((node.isRootNode() && (name == "width" || name == "height")) || name == "invisible" || name == "locked")
|
||||||
|| name.endsWith(PropertyName("@NodeInstance"))) {
|
|| name.endsWith(PropertyName("@NodeInstance"))) {
|
||||||
if (hasInstanceForModelNode(node)) {
|
if (hasInstanceForModelNode(node)) {
|
||||||
@@ -566,6 +619,7 @@ void NodeInstanceView::customNotification(const AbstractView *view, const QStrin
|
|||||||
|
|
||||||
void NodeInstanceView::nodeSourceChanged(const ModelNode &node, const QString & newNodeSource)
|
void NodeInstanceView::nodeSourceChanged(const ModelNode &node, const QString & newNodeSource)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_nodeInstanceServer, return);
|
||||||
if (hasInstanceForModelNode(node)) {
|
if (hasInstanceForModelNode(node)) {
|
||||||
NodeInstance instance = instanceForModelNode(node);
|
NodeInstance instance = instanceForModelNode(node);
|
||||||
ChangeNodeSourceCommand changeNodeSourceCommand(instance.instanceId(), newNodeSource);
|
ChangeNodeSourceCommand changeNodeSourceCommand(instance.instanceId(), newNodeSource);
|
||||||
@@ -1704,4 +1758,61 @@ void NodeInstanceView::updatePreviewImageForNode(const ModelNode &modelNode, con
|
|||||||
emitModelNodelPreviewPixmapChanged(modelNode, pixmap);
|
emitModelNodelPreviewPixmapChanged(modelNode, pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NodeInstanceView::updateWatcher(const QString &path)
|
||||||
|
{
|
||||||
|
QString rootPath;
|
||||||
|
QStringList oldFiles;
|
||||||
|
QStringList oldDirs;
|
||||||
|
QStringList newFiles;
|
||||||
|
QStringList newDirs;
|
||||||
|
|
||||||
|
if (path.isEmpty()) {
|
||||||
|
// Do full update
|
||||||
|
rootPath = QFileInfo(model()->fileUrl().toLocalFile()).absolutePath();
|
||||||
|
m_fileSystemWatcher->removePaths(m_fileSystemWatcher->directories());
|
||||||
|
m_fileSystemWatcher->removePaths(m_fileSystemWatcher->files());
|
||||||
|
} else {
|
||||||
|
rootPath = path;
|
||||||
|
const QStringList files = m_fileSystemWatcher->files();
|
||||||
|
const QStringList dirs = m_fileSystemWatcher->directories();
|
||||||
|
for (const auto &file : files) {
|
||||||
|
if (file.startsWith(path))
|
||||||
|
oldFiles.append(file);
|
||||||
|
}
|
||||||
|
for (const auto &dir : dirs) {
|
||||||
|
if (dir.startsWith(path))
|
||||||
|
oldDirs.append(dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newDirs.append(rootPath);
|
||||||
|
|
||||||
|
QDirIterator dirIterator(rootPath, {}, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
|
||||||
|
while (dirIterator.hasNext())
|
||||||
|
newDirs.append(dirIterator.next());
|
||||||
|
|
||||||
|
// Common shader suffixes
|
||||||
|
static const QStringList filterList {"*.frag", "*.vert",
|
||||||
|
"*.glsl", "*.glslv", "*.glslf",
|
||||||
|
"*.vsh","*.fsh"};
|
||||||
|
|
||||||
|
QDirIterator fileIterator(rootPath, filterList, QDir::Files, QDirIterator::Subdirectories);
|
||||||
|
while (fileIterator.hasNext())
|
||||||
|
newFiles.append(fileIterator.next());
|
||||||
|
|
||||||
|
if (oldDirs != newDirs) {
|
||||||
|
if (!oldDirs.isEmpty())
|
||||||
|
m_fileSystemWatcher->removePaths(oldDirs);
|
||||||
|
if (!newDirs.isEmpty())
|
||||||
|
m_fileSystemWatcher->addPaths(newDirs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newFiles != oldFiles) {
|
||||||
|
if (!oldFiles.isEmpty())
|
||||||
|
m_fileSystemWatcher->removePaths(oldFiles);
|
||||||
|
if (!newFiles.isEmpty())
|
||||||
|
m_fileSystemWatcher->addPaths(newFiles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -837,7 +837,7 @@ ModelNode QmlFlowItemNode::decisionNodeForTransition(const ModelNode &transition
|
|||||||
}
|
}
|
||||||
QmlFlowViewNode flowView(transition.view()->rootModelNode());
|
QmlFlowViewNode flowView(transition.view()->rootModelNode());
|
||||||
if (flowView.isValid()) {
|
if (flowView.isValid()) {
|
||||||
for (const ModelNode target : flowView.decicions()) {
|
for (const ModelNode &target : flowView.decicions()) {
|
||||||
if (target.hasBindingProperty("targets")
|
if (target.hasBindingProperty("targets")
|
||||||
&& target.bindingProperty("targets").resolveToModelNodeList().contains(transition))
|
&& target.bindingProperty("targets").resolveToModelNodeList().contains(transition))
|
||||||
return target;
|
return target;
|
||||||
@@ -853,7 +853,7 @@ ModelNode QmlFlowTargetNode::findSourceForDecisionNode() const
|
|||||||
if (!isFlowDecision())
|
if (!isFlowDecision())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
for (const ModelNode transition : flowView().transitionsForTarget(modelNode())) {
|
for (const ModelNode &transition : flowView().transitionsForTarget(modelNode())) {
|
||||||
if (transition.hasBindingProperty("from")) {
|
if (transition.hasBindingProperty("from")) {
|
||||||
const ModelNode source = transition.bindingProperty("from").resolveToModelNode();
|
const ModelNode source = transition.bindingProperty("from").resolveToModelNode();
|
||||||
if (source.isValid()) {
|
if (source.isValid()) {
|
||||||
|
@@ -64,6 +64,19 @@ namespace QmlDesigner {
|
|||||||
|
|
||||||
const char annotationsEscapeSequence[] = "##^##";
|
const char annotationsEscapeSequence[] = "##^##";
|
||||||
|
|
||||||
|
bool debugQmlPuppet()
|
||||||
|
{
|
||||||
|
#ifndef QMLDESIGNER_TEST
|
||||||
|
if (!QmlDesignerPlugin::instance())
|
||||||
|
return false;
|
||||||
|
const QString debugPuppet = QmlDesignerPlugin::instance()->settings().value(DesignerSettingsKey::
|
||||||
|
DEBUG_PUPPET).toString();
|
||||||
|
return !debugPuppet.isEmpty();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *parent):
|
RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *parent):
|
||||||
AbstractView(parent),
|
AbstractView(parent),
|
||||||
m_differenceHandling(differenceHandling),
|
m_differenceHandling(differenceHandling),
|
||||||
@@ -72,7 +85,12 @@ RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *paren
|
|||||||
m_textToModelMerger(new Internal::TextToModelMerger(this))
|
m_textToModelMerger(new Internal::TextToModelMerger(this))
|
||||||
{
|
{
|
||||||
m_amendTimer.setSingleShot(true);
|
m_amendTimer.setSingleShot(true);
|
||||||
|
m_amendTimer.setInterval(400);
|
||||||
connect(&m_amendTimer, &QTimer::timeout, this, &RewriterView::amendQmlText);
|
connect(&m_amendTimer, &QTimer::timeout, this, &RewriterView::amendQmlText);
|
||||||
|
|
||||||
|
QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance();
|
||||||
|
connect(modelManager, &QmlJS::ModelManagerInterface::libraryInfoUpdated,
|
||||||
|
this, &RewriterView::handleLibraryInfoUpdate, Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
RewriterView::~RewriterView() = default;
|
RewriterView::~RewriterView() = default;
|
||||||
@@ -89,6 +107,8 @@ Internal::TextToModelMerger *RewriterView::textToModelMerger() const
|
|||||||
|
|
||||||
void RewriterView::modelAttached(Model *model)
|
void RewriterView::modelAttached(Model *model)
|
||||||
{
|
{
|
||||||
|
m_modelAttachPending = false;
|
||||||
|
|
||||||
if (model && model->textModifier())
|
if (model && model->textModifier())
|
||||||
setTextModifier(model->textModifier());
|
setTextModifier(model->textModifier());
|
||||||
|
|
||||||
@@ -102,11 +122,13 @@ void RewriterView::modelAttached(Model *model)
|
|||||||
if (!(m_errors.isEmpty() && m_warnings.isEmpty()))
|
if (!(m_errors.isEmpty() && m_warnings.isEmpty()))
|
||||||
notifyErrorsAndWarnings(m_errors);
|
notifyErrorsAndWarnings(m_errors);
|
||||||
|
|
||||||
if (hasIncompleteTypeInformation())
|
if (hasIncompleteTypeInformation()) {
|
||||||
|
m_modelAttachPending = true;
|
||||||
QTimer::singleShot(1000, this, [this, model](){
|
QTimer::singleShot(1000, this, [this, model](){
|
||||||
modelAttached(model);
|
modelAttached(model);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RewriterView::modelAboutToBeDetached(Model * /*model*/)
|
void RewriterView::modelAboutToBeDetached(Model * /*model*/)
|
||||||
{
|
{
|
||||||
@@ -803,6 +825,13 @@ void RewriterView::setupCanonicalHashes() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RewriterView::handleLibraryInfoUpdate()
|
||||||
|
{
|
||||||
|
// Trigger dummy amend to reload document when library info changes
|
||||||
|
if (isAttached() && !m_modelAttachPending && !debugQmlPuppet())
|
||||||
|
m_amendTimer.start();
|
||||||
|
}
|
||||||
|
|
||||||
ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const
|
ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const
|
||||||
{
|
{
|
||||||
return nodeAtTextCursorPositionHelper(rootModelNode(), cursorPosition);
|
return nodeAtTextCursorPositionHelper(rootModelNode(), cursorPosition);
|
||||||
@@ -1005,7 +1034,7 @@ void RewriterView::qmlTextChanged()
|
|||||||
auto &viewManager = QmlDesignerPlugin::instance()->viewManager();
|
auto &viewManager = QmlDesignerPlugin::instance()->viewManager();
|
||||||
if (viewManager.usesRewriterView(this)) {
|
if (viewManager.usesRewriterView(this)) {
|
||||||
QmlDesignerPlugin::instance()->viewManager().disableWidgets();
|
QmlDesignerPlugin::instance()->viewManager().disableWidgets();
|
||||||
m_amendTimer.start(400);
|
m_amendTimer.start();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/*Keep test synchronous*/
|
/*Keep test synchronous*/
|
||||||
|
@@ -1672,7 +1672,7 @@ void ModelValidator::signalHandlerSourceDiffer(SignalHandlerProperty &modelPrope
|
|||||||
{
|
{
|
||||||
Q_UNUSED(modelProperty)
|
Q_UNUSED(modelProperty)
|
||||||
Q_UNUSED(javascript)
|
Q_UNUSED(javascript)
|
||||||
QTC_ASSERT(modelProperty.source() == javascript, return);
|
QTC_ASSERT(compareJavaScriptExpression(modelProperty.source(), javascript), return);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelValidator::shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, const QString & /*javascript*/)
|
void ModelValidator::shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, const QString & /*javascript*/)
|
||||||
|
@@ -86,6 +86,7 @@ const char EVENT_ANNOTATION_ADDED[] = "Annotation Added";
|
|||||||
const char EVENT_RESOURCE_IMPORTED[] = "Resource Imported ";
|
const char EVENT_RESOURCE_IMPORTED[] = "Resource Imported ";
|
||||||
const char EVENT_ACTION_EXECUTED[] = "Action Executed ";
|
const char EVENT_ACTION_EXECUTED[] = "Action Executed ";
|
||||||
const char EVENT_IMPORT_ADDED[] = "Import Added ";
|
const char EVENT_IMPORT_ADDED[] = "Import Added ";
|
||||||
|
const char EVENT_IMPORT_ADDED_FLOWTAG[] = "Import Added FlowTag ";
|
||||||
const char EVENT_BINDINGEDITOR_OPENED[] = "Binding Editor Opened";
|
const char EVENT_BINDINGEDITOR_OPENED[] = "Binding Editor Opened";
|
||||||
const char EVENT_RICHTEXT_OPENED[] = "Richtext Editor Opened";
|
const char EVENT_RICHTEXT_OPENED[] = "Richtext Editor Opened";
|
||||||
const char EVENT_FORMEDITOR_TIME[] = "Form Editor";
|
const char EVENT_FORMEDITOR_TIME[] = "Form Editor";
|
||||||
|
@@ -34,16 +34,6 @@
|
|||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
using namespace QtSupport;
|
using namespace QtSupport;
|
||||||
|
|
||||||
static QString format(const QString &fileName, int lineNo, const QString &msg)
|
|
||||||
{
|
|
||||||
if (lineNo > 0)
|
|
||||||
return QString::fromLatin1("%1(%2): %3").arg(fileName, QString::number(lineNo), msg);
|
|
||||||
else if (lineNo)
|
|
||||||
return QString::fromLatin1("%1: %3").arg(fileName, msg);
|
|
||||||
else
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
ProMessageHandler::ProMessageHandler(bool verbose, bool exact)
|
ProMessageHandler::ProMessageHandler(bool verbose, bool exact)
|
||||||
: m_verbose(verbose)
|
: m_verbose(verbose)
|
||||||
, m_exact(exact)
|
, m_exact(exact)
|
||||||
|
@@ -90,7 +90,7 @@ void RsyncDeployService::doDeploy()
|
|||||||
void RsyncDeployService::filterDeployableFiles() const
|
void RsyncDeployService::filterDeployableFiles() const
|
||||||
{
|
{
|
||||||
if (m_ignoreMissingFiles) {
|
if (m_ignoreMissingFiles) {
|
||||||
erase(m_deployableFiles, [](const DeployableFile &f) {
|
Utils::erase(m_deployableFiles, [](const DeployableFile &f) {
|
||||||
return !f.localFilePath().exists();
|
return !f.localFilePath().exists();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -345,7 +345,7 @@ WelcomeMode::WelcomeMode()
|
|||||||
|
|
||||||
setPriority(Core::Constants::P_MODE_WELCOME);
|
setPriority(Core::Constants::P_MODE_WELCOME);
|
||||||
setId(Core::Constants::MODE_WELCOME);
|
setId(Core::Constants::MODE_WELCOME);
|
||||||
setContextHelp("Qt Creator Manual");
|
setContextHelp("Qt Design Studio Manual");
|
||||||
setContext(Core::Context(Core::Constants::C_WELCOME_MODE));
|
setContext(Core::Context(Core::Constants::C_WELCOME_MODE));
|
||||||
|
|
||||||
m_modeWidget = new QQuickWidget;
|
m_modeWidget = new QQuickWidget;
|
||||||
|
@@ -40,9 +40,11 @@ endif()
|
|||||||
|
|
||||||
set(UtilsSourcesDir "../../libs/utils")
|
set(UtilsSourcesDir "../../libs/utils")
|
||||||
|
|
||||||
|
file(RELATIVE_PATH DATA_PATH "/${IDE_LIBEXEC_PATH}" "/${IDE_DATA_PATH}")
|
||||||
|
|
||||||
add_qtc_executable(sdktool
|
add_qtc_executable(sdktool
|
||||||
${DESTINATION}
|
${DESTINATION}
|
||||||
DEFINES DATA_PATH=\"${IDE_DATA_PATH}\"
|
DEFINES DATA_PATH=\"${DATA_PATH}\"
|
||||||
DEPENDS Qt5::Core
|
DEPENDS Qt5::Core
|
||||||
INCLUDES
|
INCLUDES
|
||||||
"${UtilsSourcesDir}/../"
|
"${UtilsSourcesDir}/../"
|
||||||
|
@@ -79,6 +79,14 @@ void printHelp(const std::vector<std::unique_ptr<Operation>> &operations)
|
|||||||
std::cout << " --help|-h Print this help text" << std::endl;
|
std::cout << " --help|-h Print this help text" << std::endl;
|
||||||
std::cout << " --sdkpath=PATH|-s PATH Set the path to the SDK files" << std::endl << std::endl;
|
std::cout << " --sdkpath=PATH|-s PATH Set the path to the SDK files" << std::endl << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Default sdkpath is \""
|
||||||
|
<< qPrintable(QDir::cleanPath(
|
||||||
|
Utils::FilePath::fromString(QCoreApplication::applicationDirPath())
|
||||||
|
.pathAppended(DATA_PATH)
|
||||||
|
.toUserOutput()))
|
||||||
|
<< "\"" << std::endl
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
std::cout << "OPERATION:" << std::endl;
|
std::cout << "OPERATION:" << std::endl;
|
||||||
std::cout << " One of:" << std::endl;
|
std::cout << " One of:" << std::endl;
|
||||||
for (const std::unique_ptr<Operation> &o : operations)
|
for (const std::unique_ptr<Operation> &o : operations)
|
||||||
|
@@ -3101,6 +3101,7 @@ void tst_Dumpers::dumper_data()
|
|||||||
+ Check5("mm", "destroyed", "@QMetaMethod")
|
+ Check5("mm", "destroyed", "@QMetaMethod")
|
||||||
+ Check4("mm", "destroyed(QObject*)", "@QMetaMethod")
|
+ Check4("mm", "destroyed(QObject*)", "@QMetaMethod")
|
||||||
+ Check("mm.handle", "14", TypeDef("unsigned int", "uint"))
|
+ Check("mm.handle", "14", TypeDef("unsigned int", "uint"))
|
||||||
|
% QtVersion(0, 0x5ffff) // Gone in Qt 6
|
||||||
+ Check("mp", "objectName", "@QMetaProperty");
|
+ Check("mp", "objectName", "@QMetaProperty");
|
||||||
|
|
||||||
|
|
||||||
@@ -6635,7 +6636,7 @@ void tst_Dumpers::dumper_data()
|
|||||||
"boost::shared_ptr<int> s;\n"
|
"boost::shared_ptr<int> s;\n"
|
||||||
"boost::shared_ptr<int> i(new int(43));\n"
|
"boost::shared_ptr<int> i(new int(43));\n"
|
||||||
"boost::shared_ptr<int> j = i;\n"
|
"boost::shared_ptr<int> j = i;\n"
|
||||||
"boost::shared_ptr<QStringList> sl(new QStringList(QStringList() << \"HUH!\"));",
|
"boost::shared_ptr<QList<QString>> sl(new QList<QString>(QList<QString>() << \"HUH!\"));",
|
||||||
|
|
||||||
"&s, &i, &j, &sl")
|
"&s, &i, &j, &sl")
|
||||||
|
|
||||||
@@ -6645,7 +6646,7 @@ void tst_Dumpers::dumper_data()
|
|||||||
+ Check("s", "(null)", "boost::shared_ptr<int>")
|
+ Check("s", "(null)", "boost::shared_ptr<int>")
|
||||||
+ Check("i", "43", "boost::shared_ptr<int>")
|
+ Check("i", "43", "boost::shared_ptr<int>")
|
||||||
+ Check("j", "43", "boost::shared_ptr<int>")
|
+ Check("j", "43", "boost::shared_ptr<int>")
|
||||||
+ Check("sl", "<1 items>", " boost::shared_ptr<@QStringList>")
|
+ Check("sl", "<1 items>", " boost::shared_ptr<@QList<@QString>>")
|
||||||
+ Check("sl.0", "[0]", "\"HUH!\"", "@QString");
|
+ Check("sl.0", "[0]", "\"HUH!\"", "@QString");
|
||||||
|
|
||||||
|
|
||||||
@@ -6886,13 +6887,13 @@ void tst_Dumpers::dumper_data()
|
|||||||
<< Data("#include <QMap>\n"
|
<< Data("#include <QMap>\n"
|
||||||
"struct CustomStruct {\n"
|
"struct CustomStruct {\n"
|
||||||
" int id;\n"
|
" int id;\n"
|
||||||
" double dvalue;\n"
|
" double dval;\n"
|
||||||
"};",
|
"};",
|
||||||
|
|
||||||
"QMap<int, CustomStruct> map;\n"
|
"QMap<int, CustomStruct> map;\n"
|
||||||
"CustomStruct cs1;\n"
|
"CustomStruct cs1;\n"
|
||||||
"cs1.id = 1;\n"
|
"cs1.id = 1;\n"
|
||||||
"cs1.dvalue = 3.14;\n"
|
"cs1.dval = 3.14;\n"
|
||||||
"CustomStruct cs2 = cs1;\n"
|
"CustomStruct cs2 = cs1;\n"
|
||||||
"cs2.id = -1;\n"
|
"cs2.id = -1;\n"
|
||||||
"map.insert(cs1.id, cs1);\n"
|
"map.insert(cs1.id, cs1);\n"
|
||||||
@@ -6904,10 +6905,11 @@ void tst_Dumpers::dumper_data()
|
|||||||
+ CoreProfile()
|
+ CoreProfile()
|
||||||
|
|
||||||
+ Check("map", "<2 items>", "@QMap<int, CustomStruct>")
|
+ Check("map", "<2 items>", "@QMap<int, CustomStruct>")
|
||||||
+ Check("map.0.key", "-1", "int")
|
+ CheckPairish("map.0.key", "-1", "int")
|
||||||
+ CheckType("map.0.value", "CustomStruct")
|
+ CheckType("map.0.value", "CustomStruct") % Qt5
|
||||||
+ Check("map.0.value.dvalue", FloatValue("3.14"), "double")
|
+ CheckType("map.0.second", "CustomStruct") % Qt6
|
||||||
+ Check("map.0.value.id", "-1", "int");
|
+ CheckPairish("map.0.value.dval", FloatValue("3.14"), "double")
|
||||||
|
+ CheckPairish("map.0.value.id", "-1", "int");
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@@ -7597,7 +7599,7 @@ void tst_Dumpers::dumper_data()
|
|||||||
|
|
||||||
|
|
||||||
const QtVersion jsonv1{0, 0x50f00};
|
const QtVersion jsonv1{0, 0x50f00};
|
||||||
const QtVersion jsonv2{0x50f00};
|
const QtVersion jsonv2{0x50f00, 0x60000};
|
||||||
|
|
||||||
QTest::newRow("QJson")
|
QTest::newRow("QJson")
|
||||||
<< Data("#include <QString>\n"
|
<< Data("#include <QString>\n"
|
||||||
@@ -7740,6 +7742,7 @@ void tst_Dumpers::dumper_data()
|
|||||||
"v18.setProperty(\"PropA\", 1);\n"
|
"v18.setProperty(\"PropA\", 1);\n"
|
||||||
"v18.setProperty(\"PropB\", 2.5);\n"
|
"v18.setProperty(\"PropB\", 2.5);\n"
|
||||||
"v18.setProperty(\"PropC\", v10);\n\n"
|
"v18.setProperty(\"PropC\", v10);\n\n"
|
||||||
|
"#if QT_VERSION < 0x60000\n"
|
||||||
"QV4::Value s11, *p11 = QJSValuePrivate::valueForData(&v11, &s11);\n"
|
"QV4::Value s11, *p11 = QJSValuePrivate::valueForData(&v11, &s11);\n"
|
||||||
"QV4::Value s12, *p12 = QJSValuePrivate::valueForData(&v12, &s12);\n"
|
"QV4::Value s12, *p12 = QJSValuePrivate::valueForData(&v12, &s12);\n"
|
||||||
"QV4::Value s13, *p13 = QJSValuePrivate::valueForData(&v13, &s13);\n"
|
"QV4::Value s13, *p13 = QJSValuePrivate::valueForData(&v13, &s13);\n"
|
||||||
@@ -7747,10 +7750,11 @@ void tst_Dumpers::dumper_data()
|
|||||||
"QV4::Value s15, *p15 = QJSValuePrivate::valueForData(&v15, &s15);\n"
|
"QV4::Value s15, *p15 = QJSValuePrivate::valueForData(&v15, &s15);\n"
|
||||||
"QV4::Value s16, *p16 = QJSValuePrivate::valueForData(&v16, &s16);\n"
|
"QV4::Value s16, *p16 = QJSValuePrivate::valueForData(&v16, &s16);\n"
|
||||||
"QV4::Value s17, *p17 = QJSValuePrivate::valueForData(&v17, &s17);\n"
|
"QV4::Value s17, *p17 = QJSValuePrivate::valueForData(&v17, &s17);\n"
|
||||||
"QV4::Value s18, *p18 = QJSValuePrivate::valueForData(&v18, &s18);\n",
|
"QV4::Value s18, *p18 = QJSValuePrivate::valueForData(&v18, &s18);\n"
|
||||||
|
"unused(&p11, &p12, &p13, &p14, &p15, &p16, &p17, &p18);\n"
|
||||||
|
"#endif\n",
|
||||||
|
|
||||||
"&v10, &v11, &v12, &v13, &v14, &v15, &v16, &v17, &v18, "
|
"&v10, &v11, &v12, &v13, &v14, &v15, &v16, &v17, &v18")
|
||||||
"&p11, &p12, &p13, &p14, &p15, &p16, &p17, &p18")
|
|
||||||
|
|
||||||
+ QmlPrivateProfile()
|
+ QmlPrivateProfile()
|
||||||
+ QtVersion(0x50000)
|
+ QtVersion(0x50000)
|
||||||
@@ -8008,7 +8012,7 @@ void tst_Dumpers::dumper_data()
|
|||||||
|
|
||||||
+ CorePrivateProfile()
|
+ CorePrivateProfile()
|
||||||
+ QmlPrivateProfile()
|
+ QmlPrivateProfile()
|
||||||
+ QtVersion(0x50800)
|
+ QtVersion(0x50800, 0x5ffff) // Both test cases are gone in Qt6
|
||||||
|
|
||||||
+ Check("d.Log10_2_100000", "30103", "int")
|
+ Check("d.Log10_2_100000", "30103", "int")
|
||||||
+ Check("p.FlagBit", "<optimized out>", "") % NoCdbEngine
|
+ Check("p.FlagBit", "<optimized out>", "") % NoCdbEngine
|
||||||
|