Merge remote-tracking branch 'origin/4.15'

Change-Id: I613b60f7d5cfca19ed611b3777548738d7bd7d67
This commit is contained in:
Eike Ziller
2021-04-14 11:33:16 +02:00
29 changed files with 266 additions and 88 deletions

View File

@@ -0,0 +1,4 @@
dependencies:
../../qt/qt5.git:
ref: "6.1"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2020 The Qt Company Ltd. ** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the Qt Creator documentation. ** This file is part of the Qt Creator documentation.
@@ -45,9 +45,9 @@
To run an example application on a Boot2Qt device, you must set up To run an example application on a Boot2Qt device, you must set up
Qt for Device Creation on the development host and create connections Qt for Device Creation on the development host and create connections
between the host and devices. For more information, see the between the host and devices. For more information, see
\l{http://doc.qt.io/QtForDeviceCreation/qtee-installation-guide.html} \l{https://doc.qt.io/QtForDeviceCreation/b2qt-installation-guides.html}
{Installation Guide} in the {Installation Guides} in the
\l{http://doc.qt.io/QtForDeviceCreation/index.html}{Qt for Device Creation} \l{http://doc.qt.io/QtForDeviceCreation/index.html}{Qt for Device Creation}
documentation. documentation.

View File

@@ -116,6 +116,10 @@
\endlist \endlist
If the \l{glossary-buildandrun-kit}{kit} specifies Qt for Android
version 5.14.0 or later, you can select the ABIs for the Android device
architectures to build the project for in the \uicontrol ABIs field.
The \uicontrol {Equivalent command line} field displays the build command The \uicontrol {Equivalent command line} field displays the build command
that is constructed based on the selected options. that is constructed based on the selected options.

View File

@@ -76,8 +76,8 @@
\li Merge File with Template \li Merge File with Template
\li \l{Merging Files with Templates} \li \l{Merging Files with Templates}
\row \row
\li Move Component into Separate File \li Move Component Instances into Separate Files
\li \l{Moving Components into Separate Files} \li \l{Moving Component Instances into Separate Files}
\row \row
\li Add New Signal Handler \li Add New Signal Handler
\li \l{Adding Signal Handlers} \li \l{Adding Signal Handlers}

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2020 The Qt Company Ltd. ** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the Qt Creator documentation. ** This file is part of the Qt Creator documentation.
@@ -42,73 +42,84 @@
A \e component is a reusable building block for a UI. A \e component is a reusable building block for a UI.
\QDS comes with \e {preset components} that you can use in your project. \QDS comes with \e {preset components} that you can use in your UI by
These are similar to \e Symbols in Sketch or \e Prefab in Unity. creating instances of them.
The preset components are similar to \e Symbols in Sketch or \e Prefab in
Unity.
Some of the preset components represent simple shapes, text, or images, Some of the preset components represent simple shapes, text, or images,
while others represent complex UI controls with full functionality, such while others represent complex UI controls with full functionality, such
as spin boxes or sliders. as spin boxes or sliders. You can also add instances of preset
\l {Using 3D Components}{3D components} to your UIs.
You can modify the \e properties of the preset components and combine them To build your own components, you can modify the \e properties of the
to build your own components. component instances and combine them.
A component is specified within one file (with the file extension A component is specified within one file (with the file extension
\e ui.qml or \e .qml). For example, a Button component may be defined \e ui.qml or \e .qml). For example, a Button component may be defined
in \e Button.ui.qml. Typically, the visual appearance of a component in \e Button.ui.qml. Typically, the visual appearance of a component
is defined in a \e {UI file} (ui.qml). is defined in a \e {UI file} (ui.qml). To create component files,
you can use \l{Creating Components from Scratch}{wizard templates}, or
\l{Moving Component Instances into Separate Files}
{move component instances into separate component files}.
The \l {Library} view \uicontrol Components tab lists the components that Select \l Library > \uicontrol Components to view the preset components that
have been added to your project. have been added to your project. If you cannot find the components you need,
add the relevant modules to your project, as described in
\l {Adding and Removing Modules}.
\image qmldesigner-qml-components.png "Components" \image qtquick-components-tab.png "Components in Library"
\note Use as few components as possible. To minimize the number of \note Use as few components as possible. To minimize the number of
components, use \l{Adding Property Aliases}{alias properties} and components, use \l{Adding Property Aliases}{alias properties} and
\l{Adding States}{states} to create the differences in your component \l{Adding States}{states} to create the differences in your component
instances. We recommend reusing components instead of duplicating them, instances. Using component instances instead of duplicating the components
so the components do not need to be processed as completely new component reduces the time needed to load and build the application, as well as the
types. This reduces the time needed to load and build the application, size of the application package.
as well as the size of the application package.
\section1 Adding Components to Designs \section1 Creating Component Instances
\image qmldesigner-editing-components.png "Editing components in Form Editor" \image qmldesigner-editing-components.png "Creating Component Instances"
\list 1 \list 1
\li Drag and drop components from \uicontrol Library (1) to \li Drag-and-drop components from \uicontrol Library (1) to
\uicontrol Navigator (2) or \uicontrol {Form Editor} (3). \uicontrol Navigator (2), \uicontrol {Form Editor} (3), or
\li Select components in \uicontrol Navigator to edit the \l {3D Editor} (4). This creates instances of the components in the
current component file.
\li Select component instances in \uicontrol Navigator to edit the
values of their properties in \uicontrol Properties. values of their properties in \uicontrol Properties.
\image qmldesigner-properties-view.png "Properties view" \image qmldesigner-properties-view.png "Properties view"
For more information, see \l {Specifying Component Properties}. For more information, see \l {Specifying Component Properties}.
\li To change the appearance and behavior of your components in ways \li To change the appearance and behavior of the component instances
that are not supported out of the box, you can define custom in ways that are not supported in \QDS by default, you can define
properties for your components in the \uicontrol Connections view, custom properties in \uicontrol {Connection View} >
\uicontrol Properties tab. \uicontrol {Properties}.
\image qmldesigner-dynamicprops.png "Connections view Properties tab" \image qmldesigner-dynamicprops.png "Connection View Properties tab"
For more information, see \l{Specifying Dynamic Properties}. For more information, see \l{Specifying Dynamic Properties}.
\li To enable users to interact with components, connect the components \li To enable users to interact with the component instances, connect
to signals in the \uicontrol Connections view. For example, you can the instances to signals in \uicontrol {Connection View} >
specify what happens when a component is clicked. \uicontrol Connections. For example, you can specify what happens
For more information, see \l{Connecting Components to Signals}. when a component instance is clicked. For more information, see
\image qmldesigner-connections.png "Connections view Connections tab" \l{Connecting Components to Signals}.
\li To dynamically change the behavior of an object when another object \image qmldesigner-connections.png "Connection View Connections tab"
changes, create bindings between components in the \li To dynamically change the behavior of a component instance when
\uicontrol {Connection View}, \uicontrol Bindings tab. another component instance changes, create bindings between them in
\uicontrol {Connection View} > \uicontrol Bindings.
For more information, see \l{Adding Bindings Between Properties}. For more information, see \l{Adding Bindings Between Properties}.
\image qmldesigner-bindings.png "Connections view Bindings tab" \image qmldesigner-bindings.png "Connection View Bindings tab"
\li Add states to apply sets of changes to the property values of one \li Add states to apply sets of changes to the property values of one
or several components in the \uicontrol States view. or several component instances in the \uicontrol States view.
For more information, see \l{Adding States}. For more information, see \l{Adding States}.
\li Animate component properties in the \uicontrol Timeline view. \li Animate the properties of component instances in the \uicontrol
For more information, see \l{Creating Animations}. Timeline view. For more information, see \l{Creating Animations}.
\endlist \endlist
\section1 Creating Your Own Components \section1 Creating Your Own Components
You can either use project wizard templates to create custom components and You can either use project wizard templates to create custom components and
controls or \l{Moving Components into Separate Files}{move subcomponents controls or move component instances into separate files to turn them into
into separate files} to make them reusable in other components. new components that you can create instances of. You can then use the
instances of the new components in other components.
\section2 Creating Components from Scratch \section2 Creating Components from Scratch
@@ -128,27 +139,30 @@
tab in the \uicontrol Library view only if the filename begins with tab in the \uicontrol Library view only if the filename begins with
a capital letter. a capital letter.
\li Click \uicontrol Design to open the component file (ui.qml] in \li Click \uicontrol Design to open the component file (ui.qml) in
\uicontrol {Form Editor}. \uicontrol {Form Editor}.
\li Drag and drop a component from \uicontrol Library to \li Drag-and-drop a component from \uicontrol Library to
\uicontrol Navigator or \uicontrol {Form Editor}. \uicontrol Navigator or \uicontrol {Form Editor}.
\li Edit component properties in \uicontrol Properties. \li Edit component properties in the \uicontrol Properties view.
\image qmldesigner-custom-component-properties.png \image qmldesigner-custom-component-properties.png
The available properties depend on the component type. You can The available properties depend on the component type. You can
\l{Specifying Dynamic Properties}{add properties for \l{Specifying Dynamic Properties}{add properties for
components} in the \uicontrol Properties tab of the components} in \uicontrol {Connection View} > \uicontrol Properties.
\uicontrol {Connection View}.
\li To change the appearance and behavior of the component instances
in ways that are not supported in \QDS by default, you can define
custom properties in \uicontrol {Connection View} >
\uicontrol {Properties}.
\endlist \endlist
The following sections contain more information about how to use The following sections contain more information about how to use
\uicontrol {Form Editor} to edit 2D content and \uicontrol {3D Editor} \uicontrol {Form Editor} to edit 2D content and \uicontrol {3D Editor}
to edit 3D scenes, as well as examples of how to create UI controls to edit 3D scenes, as well as examples of how to create UI controls
using basic components: using instances of basic components:
\list \list
@@ -166,26 +180,26 @@
\include qtdesignstudio-components.qdocinc creating studio components \include qtdesignstudio-components.qdocinc creating studio components
\endif \endif
\section2 Moving Components into Separate Files \section2 Moving Component Instances into Separate Files
An alternative way of creating reusable components is to move them An alternative way of creating reusable components is to move component
into separate component files (.ui.qml). Right-click a component instances into separate component files (.ui.qml). Right-click a component
in \uicontrol Navigator or \uicontrol {Form Editor} and select instance in \uicontrol Navigator or \uicontrol {Form Editor}, and select
\uicontrol {Move Component into Separate File} in the context menu. \uicontrol {Move Component into Separate File} in the context menu.
\image qtcreator-move-component-into-separate-file.png \image qtcreator-move-component-into-separate-file.png
Give the new component a name and select whether properties are set for Give the new component a name, and select whether properties are set for
the new component or for the original one. the new component or for the original one.
When you select \uicontrol OK, a new component file is created and a When you select \uicontrol OK, a new component file is created and an
reference to the component is added to the code in the current component instance of the component is added to the code in the current component
file. The way things look in \uicontrol {Form Editor} does not change. file. The look of your UI in \uicontrol {Form Editor} does not change.
To open the new component file for editing the properties that you want To open the new component file for editing the properties that you want
to change for all instances of the component, right-click the component to change for all instances of the component, right-click the component,
and then select \uicontrol {Go into Component} in the context menu. For and then select \uicontrol {Go into Component} in the context menu. For
additional ways of opening subcomponents, see \l{Moving Within Components}. additional ways of opening base components, see \l{Moving Within Components}.
For an example of creating a reusable custom component, see For an example of creating a reusable custom component, see
\if defined(qtcreator) \if defined(qtcreator)
@@ -194,17 +208,17 @@
\l{Progress Bar}. \l{Progress Bar}.
\endif \endif
Custom components are listed in the \uicontrol {My Components} section Custom components are listed in \uicontrol Library > \uicontrol Components
of the \uicontrol Components tab in \uicontrol Library and you can use > \uicontrol {My Components}, and you can use instances of them to build
them to build more components. more components.
\include qtquick-mcu-support.qdocinc mcu qtquick components \include qtquick-mcu-support.qdocinc mcu qtquick components
\section1 Merging Files with Templates \section1 Merging Files with Templates
You can merge the current component file against an existing second You can merge the current component file against an existing second
component file and using the second file in a way similar to using a component file using the second file in a way similar to using a CSS
CSS stylesheet. stylesheet.
To use this experimental feature, right-click a component in the To use this experimental feature, right-click a component in the
\uicontrol Navigator or \uicontrol {Form Editor} view and select \uicontrol Navigator or \uicontrol {Form Editor} view and select

View File

@@ -41,9 +41,10 @@
\image qtquick-components-tab.png "Library view Components tab" \image qtquick-components-tab.png "Library view Components tab"
\uicontrol Components displays modules that have been added to your project. \uicontrol Components displays modules that have been added to your project.
The modules contain visual components, such as basic shapes, UI controls, In many modules the components have been further organized into different
and 3D components, and add functionality to the project. All components have categories. The modules contain visual components, such as basic shapes,
a type. UI controls, and 3D components, and add functionality to the project.
All components have a type.
The UI controls can be styled to have the look and feel of a particular The UI controls can be styled to have the look and feel of a particular
operating system, such as \macOS, Windows, Android, or iOS. operating system, such as \macOS, Windows, Android, or iOS.
@@ -110,4 +111,24 @@
or \uicontrol {Form Editor}, components with a suitable type are or \uicontrol {Form Editor}, components with a suitable type are
automatically created for you. For example, components of the automatically created for you. For example, components of the
\l{Images}{Image} type will be created for graphics files. \l{Images}{Image} type will be created for graphics files.
\section1 Context Menu Commands
\image qtquick-library-context-menu.png "Context menu commands in Library"
\image qtquick-library-context-menu-hide.png "Context menu command Hide Category"
To use the context menu commands in Library, right-click on the name of
a module or category and select one of the following commands:
\list
\li \uicontrol {Remove Module}: removes the component module added to
\uicontrol Library.
\li \uicontrol {Expand All}: expands all the modules.
\li \uicontrol {Collapse All}: collapses all the modules.
\li \uicontrol {Hide Category}: hides the category from the module.
\li \uicontrol {Show Module Hidden Categories}: shows the hidden
categories of the module.
\li \uicontrol {Show All Hidden Categories}: shows the hidden
categories in all of the modules.
\endlist
*/ */

View File

@@ -78,7 +78,7 @@
\list \list
\li \l{Creating Components}{Library} \li \l{Creating Components}{Library}
\li \l{Component Types}{Preset Components} \li \l{Component Types}{Preset Components}
\li \l{Adding Components to Designs}{My Components} \li \l{Creating Component Instances}{My Components}
\endlist \endlist
\section1 Device \section1 Device

View File

@@ -32,6 +32,7 @@ from __future__ import print_function
import argparse import argparse
import collections import collections
import glob
import os import os
import common import common
@@ -63,20 +64,24 @@ def get_arguments():
args.with_debug_info = args.build_type == 'RelWithDebInfo' args.with_debug_info = args.build_type == 'RelWithDebInfo'
return args return args
def qtcreator_prefix_path(qt_creator_path):
# on macOS the prefix path must be inside the app bundle, but we want to allow
# simpler values for --qtc-path, so search in some variants of that
candidates = [qt_creator_path, os.path.join(qt_creator_path, 'Contents', 'Resources')]
candidates += [os.path.join(path, 'Contents', 'Resources')
for path in glob.glob(os.path.join(qt_creator_path, '*.app'))]
for path in candidates:
if os.path.exists(os.path.join(path, 'lib', 'cmake')):
return [path]
return [qt_creator_path]
def build(args, paths): def build(args, paths):
if not os.path.exists(paths.build): if not os.path.exists(paths.build):
os.makedirs(paths.build) os.makedirs(paths.build)
if not os.path.exists(paths.result): if not os.path.exists(paths.result):
os.makedirs(paths.result) os.makedirs(paths.result)
prefix_paths = [os.path.abspath(fp) for fp in args.prefix_paths] + [paths.qt_creator, paths.qt] prefix_paths = [os.path.abspath(fp) for fp in args.prefix_paths] + [paths.qt]
if common.is_mac_platform(): prefix_paths += qtcreator_prefix_path(paths.qt_creator)
# --qtc-path may be
# "/path/Qt Creator.app/Contents/Resources",
# "/path/Qt Creator.app", or
# "/path",
# so add some variants to the prefix path
prefix_paths += [os.path.join(paths.qt_creator, 'Contents', 'Resources'),
os.path.join(paths.qt_creator, 'Qt Creator.app', 'Contents', 'Resources')]
prefix_paths = [common.to_posix_path(fp) for fp in prefix_paths] prefix_paths = [common.to_posix_path(fp) for fp in prefix_paths]
separate_debug_info_option = 'ON' if args.with_debug_info else 'OFF' separate_debug_info_option = 'ON' if args.with_debug_info else 'OFF'
cmake_args = ['cmake', cmake_args = ['cmake',

View File

@@ -1782,7 +1782,7 @@ class DumperBase():
def metaString(self, metaObjectPtr, index, revision): def metaString(self, metaObjectPtr, index, revision):
ptrSize = self.ptrSize() ptrSize = self.ptrSize()
stringdataOffset = ptrSize stringdataOffset = ptrSize
if self.isWindowsTarget(): if self.isWindowsTarget() and self.qtVersion() >= 0x060000:
stringdataOffset += ptrSize # indirect super data member stringdataOffset += ptrSize # indirect super data member
stringdata = self.extractPointer(toInteger(metaObjectPtr) + stringdataOffset) stringdata = self.extractPointer(toInteger(metaObjectPtr) + stringdataOffset)

View File

@@ -27,6 +27,8 @@
#include <QDataStream> #include <QDataStream>
#include <vector>
namespace ClangBackEnd { namespace ClangBackEnd {
class ProjectPartId class ProjectPartId

View File

@@ -54,6 +54,7 @@ public:
#endif #endif
bool m_backgroundCheckered; bool m_backgroundCheckered;
bool m_alphaAllowed; bool m_alphaAllowed;
bool m_dialogOpen;
}; };
void QtColorButtonPrivate::slotEditColor() void QtColorButtonPrivate::slotEditColor()
@@ -61,9 +62,14 @@ void QtColorButtonPrivate::slotEditColor()
QColorDialog::ColorDialogOptions options; QColorDialog::ColorDialogOptions options;
if (m_alphaAllowed) if (m_alphaAllowed)
options |= QColorDialog::ShowAlphaChannel; options |= QColorDialog::ShowAlphaChannel;
emit q_ptr->colorChangeStarted();
m_dialogOpen = true;
const QColor newColor = QColorDialog::getColor(m_color, q_ptr, QString(), options); const QColor newColor = QColorDialog::getColor(m_color, q_ptr, QString(), options);
if (!newColor.isValid() || newColor == q_ptr->color()) m_dialogOpen = false;
if (!newColor.isValid() || newColor == q_ptr->color()) {
emit q_ptr->colorUnchanged();
return; return;
}
q_ptr->setColor(newColor); q_ptr->setColor(newColor);
emit q_ptr->colorChanged(m_color); emit q_ptr->colorChanged(m_color);
} }
@@ -117,6 +123,7 @@ QtColorButton::QtColorButton(QWidget *parent)
d_ptr->m_dragging = false; d_ptr->m_dragging = false;
d_ptr->m_backgroundCheckered = true; d_ptr->m_backgroundCheckered = true;
d_ptr->m_alphaAllowed = true; d_ptr->m_alphaAllowed = true;
d_ptr->m_dialogOpen = false;
setAcceptDrops(true); setAcceptDrops(true);
@@ -165,6 +172,11 @@ bool QtColorButton::isAlphaAllowed() const
return d_ptr->m_alphaAllowed; return d_ptr->m_alphaAllowed;
} }
bool QtColorButton::isDialogOpen() const
{
return d_ptr->m_dialogOpen;
}
void QtColorButton::paintEvent(QPaintEvent *event) void QtColorButton::paintEvent(QPaintEvent *event)
{ {
QToolButton::paintEvent(event); QToolButton::paintEvent(event);

View File

@@ -49,11 +49,16 @@ public:
QColor color() const; QColor color() const;
bool isDialogOpen() const;
public slots: public slots:
void setColor(const QColor &color); void setColor(const QColor &color);
signals: signals:
void colorChangeStarted();
void colorChanged(const QColor &color); void colorChanged(const QColor &color);
void colorUnchanged();
protected: protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
@@ -63,7 +68,7 @@ protected:
void dragLeaveEvent(QDragLeaveEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override;
void dropEvent(QDropEvent *event) override; void dropEvent(QDropEvent *event) override;
#endif #endif
private:
class QtColorButtonPrivate *d_ptr; class QtColorButtonPrivate *d_ptr;
friend class QtColorButtonPrivate; friend class QtColorButtonPrivate;
}; };

View File

@@ -388,6 +388,25 @@ void Project::setExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentP
} }
} }
void Project::updateExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths,
const DocUpdater &docUpdater)
{
for (const Utils::FilePath &fp : projectDocumentPaths) {
for (const auto &doc : d->m_extraProjectDocuments) {
if (doc->filePath() == fp) {
docUpdater(doc.get());
break;
}
}
}
}
void Project::updateExtraProjectFiles(const DocUpdater &docUpdater)
{
for (const auto &doc : qAsConst(d->m_extraProjectDocuments))
docUpdater(doc.get());
}
Target *Project::target(Utils::Id id) const Target *Project::target(Utils::Id id) const
{ {
return Utils::findOrDefault(d->m_targets, Utils::equal(&Target::id, id)); return Utils::findOrDefault(d->m_targets, Utils::equal(&Target::id, id));

View File

@@ -169,6 +169,9 @@ public:
void setExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths, void setExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths,
const DocGenerator &docGenerator = {}, const DocGenerator &docGenerator = {},
const DocUpdater &docUpdater = {}); const DocUpdater &docUpdater = {});
void updateExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentPaths,
const DocUpdater &docUpdater);
void updateExtraProjectFiles(const DocUpdater &docUpdater);
void setDisplayName(const QString &name); void setDisplayName(const QString &name);
void setProjectLanguage(Utils::Id id, bool enabled); void setProjectLanguage(Utils::Id id, bool enabled);

View File

@@ -122,7 +122,8 @@ public:
Q_UNUSED(errorString) Q_UNUSED(errorString)
Q_UNUSED(flag) Q_UNUSED(flag)
Q_UNUSED(type) Q_UNUSED(type)
m_priFile->scheduleUpdate(); if (m_priFile)
m_priFile->scheduleUpdate();
return true; return true;
} }
@@ -692,7 +693,26 @@ void QmakeBuildSystem::asyncUpdate()
return; return;
} }
// Make sure we ignore requests for re-evaluation for files whose QmakePriFile objects
// will get deleted during the parse.
const auto docUpdater = [](Core::IDocument *doc) {
static_cast<QmakePriFileDocument *>(doc)->setPriFile(nullptr);
};
if (m_asyncUpdateState != AsyncFullUpdatePending) {
QSet<FilePath> projectFilePaths;
for (QmakeProFile * const file : qAsConst(m_partialEvaluate)) {
QVector<QmakePriFile *> priFiles = file->children();
for (int i = 0; i < priFiles.count(); ++i) {
const QmakePriFile * const priFile = priFiles.at(i);
projectFilePaths << priFile->filePath();
priFiles << priFile->children();
}
}
project()->updateExtraProjectFiles(projectFilePaths, docUpdater);
}
if (m_asyncUpdateState == AsyncFullUpdatePending) { if (m_asyncUpdateState == AsyncFullUpdatePending) {
project()->updateExtraProjectFiles(docUpdater);
rootProFile()->asyncUpdate(); rootProFile()->asyncUpdate();
} else { } else {
foreach (QmakeProFile *file, m_partialEvaluate) foreach (QmakeProFile *file, m_partialEvaluate)

View File

@@ -187,12 +187,46 @@ void CommentValueDelegate::setEditorData(QWidget *editor, const QModelIndex &ind
auto *e = qobject_cast<QLineEdit *>(editor); auto *e = qobject_cast<QLineEdit *>(editor);
e->setText(data.toString()); e->setText(data.toString());
} else if (data.userType() == QMetaType::QColor) { } else if (data.userType() == QMetaType::QColor) {
auto *e = qobject_cast<Utils::QtColorButton *>(editor); auto *e = qobject_cast<AnnotationTableColorButton *>(editor);
e->setColor(data.value<QColor>()); e->setColor(data.value<QColor>());
e->installEventFilter(e);
connect(e,
&AnnotationTableColorButton::editorFinished,
this,
&CommentValueDelegate::slotEditorFinished,
Qt::UniqueConnection);
connect(e,
&AnnotationTableColorButton::editorCanceled,
this,
&CommentValueDelegate::slotEditorCanceled,
Qt::UniqueConnection);
} else } else
QItemDelegate::setEditorData(editor, index); QItemDelegate::setEditorData(editor, index);
} }
bool AnnotationTableColorButton::eventFilter(QObject *object, QEvent *event)
{
AnnotationTableColorButton *editor = qobject_cast<AnnotationTableColorButton*>(object);
if (editor && event->type() == QEvent::FocusOut && editor->isDialogOpen())
return true;
return QObject::eventFilter(object, event);
}
void CommentValueDelegate::slotEditorCanceled(QWidget *editor)
{
emit closeEditor(editor);
}
void CommentValueDelegate::slotEditorFinished(QWidget *editor)
{
AnnotationTableColorButton* e = qobject_cast<AnnotationTableColorButton *>(editor);
if (e) {
emit commitData(editor);
emit closeEditor(editor, QAbstractItemDelegate::SubmitModelCache);
}
}
void CommentValueDelegate::setModelData(QWidget *editor, void CommentValueDelegate::setModelData(QWidget *editor,
QAbstractItemModel *model, QAbstractItemModel *model,
const QModelIndex &index) const const QModelIndex &index) const
@@ -201,9 +235,11 @@ void CommentValueDelegate::setModelData(QWidget *editor,
if (data.userType() == qMetaTypeId<RichTextProxy>()) if (data.userType() == qMetaTypeId<RichTextProxy>())
return; return;
else if (data.userType() == QMetaType::QColor) else if (data.userType() == QMetaType::QColor)
{
model->setData(index, model->setData(index,
qobject_cast<Utils::QtColorButton *>(editor)->color(), qobject_cast<AnnotationTableColorButton *>(editor)->color(),
Qt::DisplayRole); Qt::DisplayRole);
}
else if (data.userType() == QMetaType::QString) else if (data.userType() == QMetaType::QString)
model->setData(index, qobject_cast<QLineEdit *>(editor)->text(), Qt::DisplayRole); model->setData(index, qobject_cast<QLineEdit *>(editor)->text(), Qt::DisplayRole);
else else
@@ -247,6 +283,16 @@ void RichTextCellEditor::mouseReleaseEvent(QMouseEvent *)
emit clicked(); emit clicked();
} }
AnnotationTableColorButton::AnnotationTableColorButton(QWidget *parent)
: Utils::QtColorButton(parent)
{
connect(this, &Utils::QtColorButton::colorChangeStarted, this, [this](){emit editorStarted(this);});
connect(this, &Utils::QtColorButton::colorChanged, this, [this](QColor){emit editorFinished(this);});
connect(this, &Utils::QtColorButton::colorUnchanged, this, [this](){emit editorCanceled(this);});
}
AnnotationTableColorButton::~AnnotationTableColorButton() {}
AnnotationTableView::AnnotationTableView(QWidget *parent) AnnotationTableView::AnnotationTableView(QWidget *parent)
: QTableView(parent) : QTableView(parent)
, m_model(std::make_unique<QStandardItemModel>()) , m_model(std::make_unique<QStandardItemModel>())
@@ -283,7 +329,7 @@ AnnotationTableView::AnnotationTableView(QWidget *parent)
m_editorFactory->registerEditor(qMetaTypeId<RichTextProxy>(), m_editorFactory->registerEditor(qMetaTypeId<RichTextProxy>(),
new QItemEditorCreator<RichTextCellEditor>("richText")); new QItemEditorCreator<RichTextCellEditor>("richText"));
m_editorFactory->registerEditor(QMetaType::QColor, m_editorFactory->registerEditor(QMetaType::QColor,
new QItemEditorCreator<Utils::QtColorButton>("color")); new QItemEditorCreator<AnnotationTableColorButton>("color"));
m_valueDelegate.setItemEditorFactory(m_editorFactory.get()); m_valueDelegate.setItemEditorFactory(m_editorFactory.get());
connect(&m_valueDelegate, connect(&m_valueDelegate,

View File

@@ -33,12 +33,15 @@
#include "annotation.h" #include "annotation.h"
#include "defaultannotations.h" #include "defaultannotations.h"
#include <utils/qtcolorbutton.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QStandardItemModel; class QStandardItemModel;
class QCompleter; class QCompleter;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace QmlDesigner { namespace QmlDesigner {
class CommentDelegate : public QItemDelegate class CommentDelegate : public QItemDelegate
{ {
Q_OBJECT Q_OBJECT
@@ -98,6 +101,11 @@ public:
void setModelData(QWidget *editor, void setModelData(QWidget *editor,
QAbstractItemModel *model, QAbstractItemModel *model,
const QModelIndex &index) const override; const QModelIndex &index) const override;
public slots:
void slotEditorFinished(QWidget* editor);
void slotEditorCanceled(QWidget* editor);
signals: signals:
void richTextEditorRequested(int index, QString const &richText); void richTextEditorRequested(int index, QString const &richText);
}; };
@@ -129,6 +137,21 @@ private:
QMetaObject::Connection m_connection; QMetaObject::Connection m_connection;
}; };
class AnnotationTableColorButton : public Utils::QtColorButton
{
Q_OBJECT
public:
AnnotationTableColorButton(QWidget* parent);
~AnnotationTableColorButton();
bool eventFilter(QObject *object, QEvent *event) override;
signals:
void editorStarted(QWidget* editor);
void editorFinished(QWidget* editor);
void editorCanceled(QWidget* editor);
};
class AnnotationTableView : public QTableView class AnnotationTableView : public QTableView
{ {
Q_OBJECT Q_OBJECT

View File

@@ -292,7 +292,7 @@ void ItemLibraryWidget::handleAddImport(int index)
} }
m_model->changeImports({import}, {}); m_model->changeImports({import}, {});
QmlDesignerPlugin::instance()->currentDesignDocument()->updateSubcomponentManager();
m_stackedWidget->setCurrentIndex(0); // switch to the Components view after import is added m_stackedWidget->setCurrentIndex(0); // switch to the Components view after import is added
updateSearch(); updateSearch();
} }

View File

@@ -3669,7 +3669,7 @@ void TextEditorWidgetPrivate::highlightSearchResults(const QTextBlock &block, co
QString text = block.text(); QString text = block.text();
text.replace(QChar::Nbsp, QLatin1Char(' ')); text.replace(QChar::Nbsp, QLatin1Char(' '));
int idx = -1; int idx = -1;
int l = 1; int l = 0;
const int left = data.viewportRect.left() - int(data.offset.x()); const int left = data.viewportRect.left() - int(data.offset.x());
const int right = data.viewportRect.right() - int(data.offset.x()); const int right = data.viewportRect.right() - int(data.offset.x());