Merge remote-tracking branch 'origin/4.13' into master
Change-Id: I565a0bd783dc80b53d4715fdc153dba1f1d3f7c7
@@ -33,6 +33,7 @@ imagedirs = ../images \
|
||||
../../../src/plugins/qmldesigner/components/navigator \
|
||||
../../../src/plugins/qmldesigner/components/timelineeditor/images \
|
||||
../../../src/plugins/qmldesigner/qmlpreviewplugin/images \
|
||||
../../../src/plugins/qmldesigner/qtquickplugin/images \
|
||||
../../../src/plugins/scxmleditor/common/images \
|
||||
../../../src/plugins/texteditor/images \
|
||||
../../../src/plugins/valgrind/images \
|
||||
|
BIN
doc/qtcreator/images/icons/transparent-icon.png
Normal file
After Width: | Height: | Size: 129 B |
BIN
doc/qtcreator/images/qml-shapes-rectangle.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
doc/qtcreator/images/qml-shapes.png
Normal file
After Width: | Height: | Size: 13 KiB |
@@ -97,6 +97,7 @@
|
||||
\li \l {Creating Components}
|
||||
\list
|
||||
\li \l{Editing 2D Content}
|
||||
\li \l{Shapes}
|
||||
\li \l{Creating Buttons}
|
||||
\li \l{Creating Scalable Buttons and Borders}
|
||||
\endlist
|
||||
|
266
doc/qtcreator/src/qtquick/library/qtquick-shapes.qdoc
Normal file
@@ -0,0 +1,266 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2020 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the Qt Creator documentation.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Free Documentation License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Free
|
||||
** Documentation License version 1.3 as published by the Free Software
|
||||
** Foundation and appearing in the file included in the packaging of
|
||||
** this file. Please review the following information to ensure
|
||||
** the GNU Free Documentation License version 1.3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/*!
|
||||
\page quick-shapes.html
|
||||
\previouspage qtquick-form-editor.html
|
||||
\nextpage quick-buttons.html
|
||||
|
||||
\title Shapes
|
||||
|
||||
\if defined(qtdesignstudio)
|
||||
\QDS is a UI design tool rather than a generic drawing tool, and therefore,
|
||||
the focus is on providing ready-made UI controls that you can modify
|
||||
according to your needs. The values of some properties of the controls are
|
||||
specified by using styling, and therefore you cannot change them.
|
||||
|
||||
However, you can use some of the components in \uicontrol Library to draw
|
||||
basic shapes, such as rectangles. In addition, \QDS comes with a set of
|
||||
more powerful and flexible graphical primitives, that allow creating more
|
||||
complex shapes, such as lines, triangles, arcs, and pies in
|
||||
\uicontrol {Form Editor}.
|
||||
|
||||
\image studio-shapes.png "Shapes in Form Editor"
|
||||
|
||||
\else
|
||||
You can use the Rectangle type to draw basic shapes in
|
||||
\uicontrol {Form Editor}.
|
||||
\image qml-shapes.png "Shapes in Form Editor"
|
||||
\endif
|
||||
|
||||
Most visual types in \uicontrol Library are based on the \l [QtQuick]
|
||||
{Item} type. Even though it has no visual appearance itself (similarly
|
||||
to a mouse area, for example), it defines all the properties that are
|
||||
common across visual types, such as position, size, and visibility. For
|
||||
more information, see \l{Specifying Basic Item Properties}.
|
||||
|
||||
In addition, each type has a set of properties that specify its visual
|
||||
appearance and behavior. You can modify the property values to set fill
|
||||
and border colors, stroke width, and other characteristics of the shapes.
|
||||
|
||||
The following sections describe the available shapes and their properties
|
||||
in more detail. You can modify the values of the properties in the
|
||||
\uicontrol Properties view.
|
||||
|
||||
\section1 Rectangle
|
||||
|
||||
The basic \l [QtQuick] {Rectangle} QML type is used for drawing shapes
|
||||
with four sides and corners, as well as a solid border.
|
||||
|
||||
\if defined(qtdesignstudio)
|
||||
\image qml-shapes-rectangle.png "A rectangle and its properties"
|
||||
\endif
|
||||
|
||||
Rectangles can be filled either with a solid fill color or a linear
|
||||
gradient that you set in the \uicontrol Color field. You can
|
||||
also use a \l{Picking Colors}{color picker} to select colors and a
|
||||
\l{Picking Gradients}{gradient picker} to select gradients from a
|
||||
predefined set of \l{https://webgradients.com/}{WebGradients}.
|
||||
|
||||
An optional solid border can be added to a rectangle with its own color
|
||||
and thickness by setting the values of the \uicontrol {Border Color} and
|
||||
\uicontrol Border fields. To create a border without a fill color, select
|
||||
the \inlineimage icons/transparent-icon.png
|
||||
button that sets the color to \e transparent.
|
||||
|
||||
By setting the value of the \uicontrol Radius field, you can create shapes
|
||||
with rounded corners. With the right combination of the values of the
|
||||
rectangle width, height, and radius properties, you can create oval and
|
||||
circular shapes. For example, to draw a full circle, first draw a rectangle
|
||||
with all four sides equal, and then set its radius to half the side length.
|
||||
|
||||
When drawing curved edges, consider enabling the \uicontrol Antialiasing
|
||||
check box in the \uicontrol Advanced tab of the \uicontrol Properties view
|
||||
to improve the appearance of your shape.
|
||||
|
||||
\if defined(qtdesignstudio)
|
||||
\section2 Studio Rectangle
|
||||
|
||||
If you want to draw asymmetric shapes or use a dashed border, for example,
|
||||
select the Rectangle type in the \uicontrol {Studio Components} tab of
|
||||
\uicontrol Library instead of the basic rectangle type. By setting the
|
||||
values of properties in the \uicontrol {Corner Radiuses} and
|
||||
\uicontrol {Corner Bevel} groups, you can create shapes with cut corners.
|
||||
|
||||
\image studio-shapes-rectangle.png "A studio rectangle with cut corners"
|
||||
|
||||
In addition to linear gradients, you can specify conical and radial
|
||||
gradients in the \uicontrol {Fill Color} field.
|
||||
|
||||
In the \uicontrol {Stroke Details} group, you can specify the border
|
||||
mode, line style, and dash pattern for dashed and dotted lines.
|
||||
For more information, see \l{Strokes}.
|
||||
|
||||
\section1 Border
|
||||
|
||||
The Border type is used to create borders out of four segments:
|
||||
left, top, right, and bottom. By selecting the \uicontrol {Draw top},
|
||||
\uicontrol {Draw right}, \uicontrol {Draw bottom}, and
|
||||
\uicontrol {Draw left} check boxes, you can determine whether each
|
||||
of the segments is visible. This enables you to draw solid or dashed
|
||||
lines with specified dash patterns and joint and cap styles.
|
||||
|
||||
\image studio-shapes-border.png "Border properties"
|
||||
|
||||
\section2 Strokes
|
||||
|
||||
In the \uicontrol {Stroke Details} group, you can specify the border mode,
|
||||
line style, and dash pattern for dashed and dotted lines.
|
||||
|
||||
\image studio-shapes-stroke-properties.png "Stroke properties"
|
||||
|
||||
In the \uicontrol {Stroke width} field, you can set the thickness of the
|
||||
line.
|
||||
|
||||
In the \uicontrol {Border mode} field, you can specify whether the border
|
||||
is drawn along the inside or outside edge of the item, or on top of the
|
||||
edge.
|
||||
|
||||
If you select a dashed or dotted pattern in the \uicontrol {Stroke style}
|
||||
field, you can specify the dash pattern as the dashes and the gaps between
|
||||
them in the \uicontrol {Dash pattern} field. The dash pattern is specified
|
||||
in units of the stroke width. That is, a dash with the length 5 and width
|
||||
10 is 50 pixels long.
|
||||
|
||||
The value of the \uicontrol {Dash offset} field specifies the starting point
|
||||
of the dash pattern for a line. It is measured in terms of the units used to
|
||||
specify the dash pattern. For example, a pattern where each stroke is four
|
||||
units long, followed by a gap of two units, will begin with the stroke when
|
||||
drawn as a line. However, if the dash offset is set to 4.0, any line drawn
|
||||
will begin with the gap. Values of the offset up to 4.0 will cause part of
|
||||
the stroke to be drawn first, and values of the offset between 4.0 and 6.0
|
||||
will cause the line to begin with part of the gap.
|
||||
|
||||
In the \uicontrol {Joint style} field, select \uicontrol {Miter join} to
|
||||
extend the outer edges of the lines to meet at an angle and to fill the
|
||||
area between them. Select \uicontrol {Bevel join} to fill the triangular
|
||||
notch between the two lines. Select \uicontrol {Round join} to fill a
|
||||
circular arc between the two lines.
|
||||
|
||||
The value of the \uicontrol {Cap style} property specifies whether line
|
||||
ends are square or rounded.
|
||||
|
||||
\section1 Triangle
|
||||
|
||||
The Triangle type can be used to draw triangles with different dimensions
|
||||
and shapes. The type is enclosed in an invisible rectangle that determines
|
||||
its size. The dimensions of the triangle can be changed to make it elongated
|
||||
or squatter with space around it by setting the left, right, top, and bottom
|
||||
margins in the \uicontrol Margins group. The margins are set between the
|
||||
triangle and the edges of the parent rectangle.
|
||||
|
||||
\image studio-shapes-triangle.png "Triangle properties"
|
||||
|
||||
The fill color property values are set in the same way as for a rectangle.
|
||||
The border property values are described in \l{Strokes}.
|
||||
|
||||
\section1 Arc
|
||||
|
||||
An arc is specified by setting values in degrees in the \uicontrol Begin and
|
||||
\uicontrol End fields. The arc can be just a line or a filled outline.
|
||||
The properties of the line or outline are described in \l{Strokes}.
|
||||
|
||||
\image studio-shapes-arc.png "Arc properties"
|
||||
|
||||
The area between the arc's start and end points or the area inside the
|
||||
outline are painted using either a solid fill color or a gradient.
|
||||
|
||||
To create an arc with an outline, select the \uicontrol {Full outline}
|
||||
check box. The \uicontrol {Arc outline width} field sets the width of
|
||||
the arc outline, including the stroke. The \uicontrol {Arc outline begin}
|
||||
and \uicontrol {Arc outline end} fields set the width of the start and
|
||||
end points of the outline separately. The width of the outline between
|
||||
them is calculated automatically. You can adjust the inner and outer
|
||||
curves of the outline in the \uicontrol {Radius inner adjust} and
|
||||
\uicontrol {Radius outer adjust} fields.
|
||||
|
||||
The \uicontrol {Round outline}, \uicontrol {Round begin outline}, and
|
||||
\uicontrol {Round end outline} properties specify whether the end points
|
||||
of the arc outline have rounded caps. For an arc that does not have an
|
||||
outline, the \uicontrol {Cap style} property specifies whether the line
|
||||
ends are square or rounded.
|
||||
|
||||
\section1 Pie
|
||||
|
||||
The Pie type is used to create a pie slice, a pie that is missing slices,
|
||||
or just the pie rind (similar to an arc), depending on the values of the
|
||||
\uicontrol Begin, \uicontrol End, and \uicontrol {Hide line} properties.
|
||||
|
||||
\image studio-shapes-pie.png "Pie properties"
|
||||
|
||||
The filling of the pie is painted using either a solid fill color or a
|
||||
gradient. The fill color property values are set in the same way as for
|
||||
a rectangle. The border property values are described in \l{Strokes}.
|
||||
|
||||
\section1 Summary of Shapes
|
||||
|
||||
The following table lists the QML types that you can use to draw shapes.
|
||||
The \e Location column contains the tab name where you can find the type
|
||||
in \uicontrol Library.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Icon
|
||||
\li Name
|
||||
\li Location
|
||||
\li Purpose
|
||||
\row
|
||||
\li \inlineimage icons/item-arc-16px.png
|
||||
\li \l Arc
|
||||
\li Studio Components
|
||||
\li An arc that begins and ends at given positions.
|
||||
\row
|
||||
\li \inlineimage icons/custom-border-16px.png
|
||||
\li \l Border
|
||||
\li Studio Components
|
||||
\li A line with four segments that you can show and shape individually.
|
||||
\row
|
||||
\li \inlineimage icons/item-pie-16px.png
|
||||
\li \l Pie
|
||||
\li Studio Components
|
||||
\li A pie slice or a pie with a slice missing from it.
|
||||
\row
|
||||
\li \inlineimage rect-icon16.png
|
||||
\li \l Rectangle
|
||||
\li Qt Quick - Basic
|
||||
\li A rectangle that is painted with a solid fill color or linear
|
||||
gradient and an optional border. You can use the radius property
|
||||
to draw circles.
|
||||
\row
|
||||
\li \inlineimage icons/custom-rectangle-16px.png
|
||||
\li \l{Studio Rectangle}{Rectangle}
|
||||
\li Studio Components
|
||||
\li An extended rectangle that is painted with a solid fill color or
|
||||
linear, conical, or radial gradients, and corners that you can
|
||||
shape independently of each other.
|
||||
\row
|
||||
\li \inlineimage icons/item-triangle-16px.png
|
||||
\li \l Triangle
|
||||
\li Studio Components
|
||||
\li A triangle with different dimensions and shapes that is
|
||||
enclosed in an invisible rectangle.
|
||||
\endtable
|
||||
\endif
|
||||
*/
|
@@ -55,6 +55,8 @@
|
||||
such as your own QML components, basic types, layouts, positioner types, and
|
||||
views.
|
||||
|
||||
\section1 QML Imports
|
||||
|
||||
Sets of UI components with the look and feel of a particular mobile device
|
||||
platform have been defined for Qt Quick 1. Since Qt 5.1, ready-made Qt
|
||||
Quick Controls, Dialogs, and Layouts are available for creating user
|
||||
@@ -66,9 +68,16 @@
|
||||
the import statements automatically. You can remove import statements in
|
||||
\uicontrol {QML Imports}.
|
||||
|
||||
\section1 Assets
|
||||
|
||||
\uicontrol {Assets} displays the images and other files that you import to
|
||||
the project folder by selecting \uicontrol {Add New Assets}.
|
||||
|
||||
When you drag and drop assets from the tab to \uicontrol Navigator or
|
||||
\uicontrol {Form Editor}, QML components with a suitable type are
|
||||
automatically created for you. For example, when using graphical
|
||||
assets to create components, the components will be of the Image type.
|
||||
|
||||
\section1 Adding Components to Designs
|
||||
|
||||
\image qmldesigner-editing-components.png "Editing QML components in Design mode"
|
||||
@@ -103,7 +112,20 @@
|
||||
For more information, see \l{Creating Animations}.
|
||||
\endlist
|
||||
|
||||
\section1 Using Basic QML Types
|
||||
\section1 Component Types
|
||||
|
||||
The following sections describe the types of components that you can create
|
||||
in the Design mode.
|
||||
|
||||
\list
|
||||
\li \l Shapes
|
||||
\li Text
|
||||
\li Images
|
||||
\li UI controls
|
||||
\li Screens
|
||||
\endlist
|
||||
|
||||
\section2 Basic QML Types
|
||||
|
||||
You can use the following QML types to create components:
|
||||
|
||||
@@ -129,7 +151,7 @@
|
||||
plain text that can be validated.
|
||||
\endlist
|
||||
|
||||
\section1 Using Data Models
|
||||
\section2 Using Data Models
|
||||
|
||||
You can create the following types of views to organize items provided by
|
||||
\l{Models and Views in Qt Quick}{data models}:
|
||||
@@ -431,7 +453,7 @@
|
||||
application style and theme.
|
||||
\endlist
|
||||
|
||||
\section1 Adding User Interaction Methods
|
||||
\section1 User Interaction Methods
|
||||
|
||||
You can use the following QML types to add basic interaction methods to
|
||||
UIs:
|
||||
|
@@ -26,7 +26,7 @@
|
||||
/*!
|
||||
\page qtquick-form-editor.html
|
||||
\previouspage quick-components.html
|
||||
\nextpage quick-buttons.html
|
||||
\nextpage quick-shapes.html
|
||||
|
||||
\title Editing 2D Content
|
||||
|
||||
|
@@ -35,6 +35,7 @@ imagedirs = ../images \
|
||||
../../../src/plugins/qmldesigner/components/navigator \
|
||||
../../../src/plugins/qmldesigner/components/timelineeditor/images \
|
||||
../../../src/plugins/qmldesigner/qmlpreviewplugin/images \
|
||||
../../../src/plugins/qmldesigner/qtquickplugin/images \
|
||||
../../../src/plugins/texteditor/images
|
||||
|
||||
excludefiles += ../../qtcreator/src/qtcreator.qdoc \
|
||||
|
BIN
doc/qtdesignstudio/images/icons/custom-border-16px.png
Normal file
After Width: | Height: | Size: 170 B |
BIN
doc/qtdesignstudio/images/icons/custom-rectangle-16px.png
Normal file
After Width: | Height: | Size: 135 B |
BIN
doc/qtdesignstudio/images/icons/item-arc-16px.png
Normal file
After Width: | Height: | Size: 397 B |
BIN
doc/qtdesignstudio/images/icons/item-pie-16px.png
Normal file
After Width: | Height: | Size: 315 B |
BIN
doc/qtdesignstudio/images/icons/item-triangle-16px.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
doc/qtdesignstudio/images/studio-shapes-arc.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
doc/qtdesignstudio/images/studio-shapes-border.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
doc/qtdesignstudio/images/studio-shapes-pie.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
doc/qtdesignstudio/images/studio-shapes-rectangle.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
doc/qtdesignstudio/images/studio-shapes-stroke-properties.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
doc/qtdesignstudio/images/studio-shapes-triangle.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
doc/qtdesignstudio/images/studio-shapes.png
Normal file
After Width: | Height: | Size: 15 KiB |
@@ -28,8 +28,7 @@
|
||||
|
||||
\section1 Studio Components
|
||||
|
||||
A set of ready-made studio components are available for creating differently
|
||||
shaped objects, such as arcs, pies, or triangles, as well as objects with
|
||||
A set of ready-made studio components are available for creating objects with
|
||||
particular abilities, such as being visibly \e flipped between their front
|
||||
and back sides, like a card. The studio components are built on top of
|
||||
\l {Qt Quick Shapes QML Types}, with some additional properties.
|
||||
@@ -39,17 +38,10 @@
|
||||
\uicontrol Navigator:
|
||||
|
||||
\list
|
||||
\li \l Arc adds an arc that begins and ends at given positions.
|
||||
\li \l Border adds a border with corners that you can shape
|
||||
independently of each other.
|
||||
\li \l Flipable provides a surface that can be flipped.
|
||||
\li \l Group provides an item with the size property.
|
||||
\li \l {Iso}{Iso Icon} adds a container for an ISO 7000 icon.
|
||||
\li \l Pie adds a pie slice or a pie with a slice missing from it.
|
||||
\li \l Rectangle adds a rectangle with corners that you can shape
|
||||
independently of each other.
|
||||
\li \l SvgPath adds an SVG path.
|
||||
\li \l Triangle adds a triangle.
|
||||
\endlist
|
||||
|
||||
//! [studio components]
|
||||
|
@@ -77,6 +77,7 @@
|
||||
\li \l{Creating Components}
|
||||
\list
|
||||
\li \l{Editing 2D Content}
|
||||
\li \l{Shapes}
|
||||
\li \l{Creating Buttons}
|
||||
\li \l{Creating Scalable Buttons and Borders}
|
||||
\endlist
|
||||
|
@@ -138,10 +138,22 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg
|
||||
m_iconButtons.push_back(xxxhIconButton);
|
||||
iconLayout->addStretch(3);
|
||||
|
||||
auto handleIconModification = [this] {
|
||||
bool iconsMaybeChanged = hasIcons();
|
||||
if (m_hasIcons != iconsMaybeChanged)
|
||||
iconsModified();
|
||||
m_hasIcons = iconsMaybeChanged;
|
||||
};
|
||||
for (auto &&iconButton : m_iconButtons) {
|
||||
connect(masterIconButton, &AndroidManifestEditorIconWidget::iconSelected,
|
||||
iconButton, &AndroidManifestEditorIconWidget::setIconFromPath);
|
||||
connect(iconButton, &AndroidManifestEditorIconWidget::iconRemoved,
|
||||
this, handleIconModification);
|
||||
connect(iconButton, &AndroidManifestEditorIconWidget::iconSelected,
|
||||
this, handleIconModification);
|
||||
}
|
||||
connect(masterIconButton, &AndroidManifestEditorIconWidget::iconSelected,
|
||||
this, handleIconModification);
|
||||
}
|
||||
|
||||
void AndroidManifestEditorIconContainerWidget::setIconFileName(const QString &name)
|
||||
@@ -160,6 +172,7 @@ void AndroidManifestEditorIconContainerWidget::loadIcons()
|
||||
iconButton->setTargetIconFileName(m_iconFileName + imageSuffix);
|
||||
iconButton->loadIcon();
|
||||
}
|
||||
m_hasIcons = hasIcons();
|
||||
}
|
||||
|
||||
bool AndroidManifestEditorIconContainerWidget::hasIcons() const
|
||||
|
@@ -42,7 +42,7 @@ class AndroidManifestEditorIconWidget;
|
||||
|
||||
class AndroidManifestEditorIconContainerWidget : public QWidget
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidManifestEditorIconContainerWidget)
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AndroidManifestEditorIconContainerWidget(QWidget *parent,
|
||||
@@ -54,6 +54,9 @@ public:
|
||||
private:
|
||||
QVector<AndroidManifestEditorIconWidget *> m_iconButtons;
|
||||
QString m_iconFileName = QLatin1String("icon");
|
||||
bool m_hasIcons = false;
|
||||
signals:
|
||||
void iconsModified();
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
@@ -502,6 +502,8 @@ QGroupBox *AndroidManifestEditorWidget::createAdvancedGroupBox(QWidget *parent)
|
||||
this, &AndroidManifestEditorWidget::setInvalidServiceInfo);
|
||||
connect(m_splashButtons, &SplashIconContainerWidget::splashScreensModified,
|
||||
this, [this]() { setDirty(); });
|
||||
connect(m_iconButtons, &AndroidManifestEditorIconContainerWidget::iconsModified,
|
||||
this, [this]() { setDirty(); });
|
||||
|
||||
formLayout->addRow(m_advanvedTabWidget);
|
||||
otherGroupBox->setLayout(formLayout);
|
||||
|
@@ -177,9 +177,11 @@ public:
|
||||
|
||||
// Wait for updated documents
|
||||
for (TextEditor::BaseTextEditor *editor : qAsConst(editors)) {
|
||||
QElapsedTimer t;
|
||||
t.start();
|
||||
const QString filePath = editor->document()->filePath().toString();
|
||||
if (auto parser = BuiltinEditorDocumentParser::get(filePath)) {
|
||||
forever {
|
||||
while (t.elapsed() < 2000) {
|
||||
if (Document::Ptr document = parser->document()) {
|
||||
if (document->editorRevision() == 2)
|
||||
break;
|
||||
@@ -193,6 +195,7 @@ public:
|
||||
const auto cppDocumentParser = BuiltinEditorDocumentParser::get(cppFile);
|
||||
QVERIFY(cppDocumentParser);
|
||||
const Document::Ptr cppDocument = cppDocumentParser->document();
|
||||
QCOMPARE(cppDocument->editorRevision(), 2);
|
||||
QVERIFY(checkDiagsnosticMessages(cppDocument));
|
||||
|
||||
const auto hDocumentParser = BuiltinEditorDocumentParser::get(hFile);
|
||||
|
@@ -2179,6 +2179,9 @@ QSet<QPair<QString, QString> > TextToModelMerger::qrcMapping() const
|
||||
QList<QmlTypeData> TextToModelMerger::getQMLSingletons() const
|
||||
{
|
||||
QList<QmlTypeData> list;
|
||||
if (!m_scopeChain || !m_scopeChain->document())
|
||||
return list;
|
||||
|
||||
const QmlJS::Imports *imports = m_scopeChain->context()->imports(
|
||||
m_scopeChain->document().data());
|
||||
|
||||
|
@@ -7,6 +7,6 @@ HOOK_SUB_PROCESSES=false
|
||||
IMPLICITAUTSTART=0
|
||||
LANGUAGE=Python
|
||||
OBJECTMAP=../objects.map
|
||||
TEST_CASES=tst_basic_cpp_support tst_delete_externally tst_edit_externally tst_generic_highlighter tst_memberoperator tst_modify_readonly tst_qml_editor tst_qml_indent tst_rename_macros tst_revert_changes tst_select_all
|
||||
TEST_CASES=tst_basic_cpp_support tst_clean_whitespaces tst_delete_externally tst_edit_externally tst_generic_highlighter tst_memberoperator tst_modify_readonly tst_qml_editor tst_qml_indent tst_rename_macros tst_revert_changes tst_select_all
|
||||
VERSION=2
|
||||
WRAPPERS=Qt
|
||||
|
144
tests/system/suite_editors/tst_clean_whitespaces/test.py
Normal file
@@ -0,0 +1,144 @@
|
||||
############################################################################
|
||||
#
|
||||
# Copyright (C) 2020 The Qt Company Ltd.
|
||||
# Contact: https://www.qt.io/licensing/
|
||||
#
|
||||
# This file is part of Qt Creator.
|
||||
#
|
||||
# Commercial License Usage
|
||||
# Licensees holding valid commercial Qt licenses may use this file in
|
||||
# accordance with the commercial license agreement provided with the
|
||||
# Software or, alternatively, in accordance with the terms contained in
|
||||
# a written agreement between you and The Qt Company. For licensing terms
|
||||
# and conditions see https://www.qt.io/terms-conditions. For further
|
||||
# information use the contact form at https://www.qt.io/contact-us.
|
||||
#
|
||||
# GNU General Public License Usage
|
||||
# Alternatively, this file may be used under the terms of the GNU
|
||||
# General Public License version 3 as published by the Free Software
|
||||
# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
# included in the packaging of this file. Please review the following
|
||||
# information to ensure the GNU General Public License requirements will
|
||||
# be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
source("../../shared/qtcreator.py")
|
||||
|
||||
# This tests for QTCREATORBUG-24565
|
||||
|
||||
TabBlankTab = '\t \t'
|
||||
TripleTab = '\t\t\t'
|
||||
|
||||
|
||||
def main():
|
||||
files = map(lambda record: os.path.join(srcPath, testData.field(record, "filename")),
|
||||
testData.dataset("files.tsv"))
|
||||
files = filter(lambda x: not x.endswith(".bin"), files)
|
||||
for currentFile in files:
|
||||
if not neededFilePresent(currentFile):
|
||||
return
|
||||
|
||||
startQC()
|
||||
if not startedWithoutPluginError():
|
||||
return
|
||||
|
||||
ignoredFiles = ignoredFilesFromSettings()
|
||||
directory = tempDir()
|
||||
|
||||
for currentFile in files:
|
||||
baseName = os.path.basename(currentFile)
|
||||
fileName = os.path.join(directory, baseName)
|
||||
test.log("Testing file %s" % fileName)
|
||||
content = readFile(currentFile)
|
||||
preparedContent, emptyLine, trailingWS = prepareFileExternal(fileName, content)
|
||||
isIgnored = isIgnoredFile(baseName, ignoredFiles)
|
||||
test.verify(preparedContent.find('\t') != -1, "Added at least one tab.")
|
||||
test.log("Expecting file to be cleaned (trailing whitespace): %s" % str(not isIgnored))
|
||||
|
||||
invokeMenuItem("File", "Open File or Project...")
|
||||
selectFromFileDialog(fileName, True)
|
||||
editor = getEditorForFileSuffix(fileName)
|
||||
if editor == None:
|
||||
test.fatal("Could not get the editor for '%s'" % fileName,
|
||||
"Skipping this file for now.")
|
||||
continue
|
||||
|
||||
fileCombo = waitForObject(":Qt Creator_FilenameQComboBox")
|
||||
invokeMenuItem("Edit", "Advanced", "Clean Whitespace")
|
||||
if emptyLine or (trailingWS and not isIgnored):
|
||||
waitFor("str(fileCombo.currentText).endswith('*')", 2500)
|
||||
|
||||
currentContent = str(editor.toPlainText())
|
||||
if trailingWS and not isIgnored:
|
||||
test.verify(currentContent.find(TabBlankTab) == -1, "Trailing whitespace cleaned.")
|
||||
expectedContent = preparedContent.replace(TabBlankTab, '')
|
||||
if emptyLine:
|
||||
expectedContent = expectedContent.replace(TripleTab, '')
|
||||
test.compare(currentContent, expectedContent,
|
||||
"'%s' vs '%s'" % (currentContent, expectedContent))
|
||||
else:
|
||||
test.verify(currentContent.find(TabBlankTab) != -1, "Trailing whitespace still present.")
|
||||
if emptyLine:
|
||||
test.compare(currentContent.find(TripleTab), -1, "Indentation cleaned.")
|
||||
|
||||
hasBeenCleaned = str(fileCombo.currentText).endswith('*')
|
||||
test.compare(hasBeenCleaned, emptyLine or (trailingWS and not isIgnored),
|
||||
"Cleaned as expected.")
|
||||
if hasBeenCleaned:
|
||||
invokeMenuItem('File', 'Save "%s"' % os.path.basename(fileName))
|
||||
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
|
||||
def prepareFileExternal(fileName, content):
|
||||
if content.find('\t') != -1:
|
||||
test.fatal("Tabs present before edit (%s)." % fileName)
|
||||
modifiedContent = ''
|
||||
emptyLine = trailingWS = False
|
||||
lines = content.splitlines(True)
|
||||
|
||||
for currentLine in lines:
|
||||
if not emptyLine:
|
||||
if len(currentLine) == 1: # just the line break
|
||||
currentLine = TripleTab + '\n'
|
||||
emptyLine = True
|
||||
test.log("Replaced empty line by 3 tabs.")
|
||||
elif not trailingWS:
|
||||
if re.match(r"^.*\S+.*$", currentLine) is not None:
|
||||
currentLine = currentLine[:-1] + TabBlankTab + '\n'
|
||||
trailingWS = True
|
||||
test.log("Added trailing whitespace.")
|
||||
modifiedContent += currentLine
|
||||
|
||||
with open(fileName, "w") as f:
|
||||
f.write(modifiedContent)
|
||||
|
||||
if not emptyLine or not trailingWS:
|
||||
test.warning("Could not completely prepare test file %s." % fileName)
|
||||
return modifiedContent, emptyLine, trailingWS
|
||||
|
||||
|
||||
def isIgnoredFile(fileName, ignoredFiles):
|
||||
for filePattern in ignoredFiles:
|
||||
pattern = filePattern.replace('.', r'\.')
|
||||
pattern = pattern.replace('*', '.*')
|
||||
pattern = pattern.replace('?', '.')
|
||||
pattern = '^' + pattern + '$'
|
||||
if re.match(pattern, fileName) is not None:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def ignoredFilesFromSettings():
|
||||
invokeMenuItem("Tools", "Options...")
|
||||
mouseClick(waitForObjectItem(":Options_QListView", "Text Editor"))
|
||||
waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' "
|
||||
"text='Behavior'}")
|
||||
clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Behavior")
|
||||
ensureChecked("{type='QCheckBox' name='skipTrailingWhitespace'}")
|
||||
ignoredLineEdit = waitForObject("{type='QLineEdit' name='ignoreFileTypes'}")
|
||||
ignoredFiles = str(ignoredLineEdit.text).split(',')
|
||||
test.log("Ignored files: %s" % str(ignoredFiles))
|
||||
clickButton(":Options.Cancel_QPushButton")
|
||||
return ignoredFiles
|
@@ -53,7 +53,6 @@ def getOrModifyFilePatternsFor(mimeType, filter='', toBePresent=None):
|
||||
|
||||
result = []
|
||||
invokeMenuItem("Tools", "Options...")
|
||||
waitForObjectItem(":Options_QListView", "Environment")
|
||||
mouseClick(waitForObjectItem(":Options_QListView", "Environment"))
|
||||
waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' "
|
||||
"text='MIME Types'}")
|
||||
@@ -117,7 +116,6 @@ def addHighlighterDefinition(*languages):
|
||||
toBeChecked = (os.path.join(syntaxDirectory, x + ".xml") for x in languages)
|
||||
test.log("Updating highlighter definitions...")
|
||||
invokeMenuItem("Tools", "Options...")
|
||||
waitForObjectItem(":Options_QListView", "Text Editor")
|
||||
mouseClick(waitForObjectItem(":Options_QListView", "Text Editor"))
|
||||
waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' "
|
||||
"text='Generic Highlighter'}")
|
||||
|