forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/master' into 4.12
Change-Id: I091e191d1a9398cacd0ff0e063f89ffbe308189f
This commit is contained in:
@@ -75,7 +75,7 @@
|
||||
|
||||
To use \e {Bluebubble.svg} in your project,
|
||||
copy it to the project directory (same subdirectory as the QML file).
|
||||
The image appears in \uicontrol Resources. You can also use any other
|
||||
The image appears in \uicontrol Assets. You can also use any other
|
||||
image or a QML type, instead.
|
||||
|
||||
To create the UI in the Design mode:
|
||||
@@ -106,7 +106,7 @@
|
||||
|
||||
\endlist
|
||||
|
||||
\li In \uicontrol Library > \uicontrol Resources, select Bluebubble.svg
|
||||
\li In \uicontrol Library > \uicontrol Assets, select Bluebubble.svg
|
||||
and drag and drop it to \e mainWindow in the navigator.
|
||||
|
||||
\li In the \uicontrol Properties pane, \uicontrol Id field, enter
|
||||
@@ -257,15 +257,15 @@
|
||||
After adding the dependencies, select \uicontrol Build > \uicontrol {Run qmake} to apply
|
||||
the changes to the Makefile of the project.
|
||||
|
||||
\section1 Adding Resources
|
||||
\section1 Adding Assets
|
||||
|
||||
You need to add the Bluebubble.svg image file to the application resources
|
||||
You need to add the Bluebubble.svg image file to the application assets
|
||||
for deployment to mobile devices:
|
||||
|
||||
\list 1
|
||||
|
||||
\li In the \uicontrol Projects view, double-click the qml.qrc file to open it
|
||||
in the resource editor.
|
||||
in the assets editor.
|
||||
|
||||
\li Select \uicontrol Add to add Bluebubble.svg.
|
||||
|
||||
|
@@ -62,7 +62,7 @@
|
||||
|
||||
To use the \e qt-logo.png image in your application, you must copy it from
|
||||
the Qt examples directory to the project directory (same subdirectory as
|
||||
the QML file). The image appears in \uicontrol Resources. You can also use
|
||||
the QML file). The image appears in \uicontrol Assets. You can also use
|
||||
any other image or a QML type, instead.
|
||||
|
||||
\list 1
|
||||
@@ -78,7 +78,7 @@
|
||||
\li Select \uicontrol Page in the navigator, and enter \e page in the
|
||||
\uicontrol Id field.
|
||||
|
||||
\li In \uicontrol Library > \uicontrol Resources, select qt-logo.png and
|
||||
\li In \uicontrol Library > \uicontrol Assets, select qt-logo.png and
|
||||
drag and drop it to the \e page in the navigator.
|
||||
|
||||
\image qmldesigner-tutorial-user-icon.png "Image properties"
|
||||
|
@@ -48,7 +48,7 @@
|
||||
applications.
|
||||
|
||||
The \uicontrol {Library} pane lists the available QML types, UI
|
||||
components, resources, and imports.
|
||||
components, assets, and imports.
|
||||
|
||||
\image qmldesigner-qml-components.png "QML Components"
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
the import statements automatically. You can remove import statements in
|
||||
\uicontrol Imports
|
||||
|
||||
\uicontrol {Resources} displays the images and other files that you copy
|
||||
\uicontrol {Assets} displays the images and other files that you copy
|
||||
to the project folder (to the same subfolder as the QML files).
|
||||
|
||||
\section1 Adding Components to Designs
|
||||
|
@@ -42,8 +42,8 @@
|
||||
To add fonts:
|
||||
|
||||
\list 1
|
||||
\li Select \uicontrol Library > \uicontrol Resources >
|
||||
\uicontrol {Add New Resources}.
|
||||
\li Select \uicontrol Library > \uicontrol Assets >
|
||||
\uicontrol {Add New Assets}.
|
||||
\li Browse to the folder that contains the font files and select them.
|
||||
\li Enter the name of the directory to save the fonts. By default, \QDS
|
||||
suggests the project directory.
|
||||
|
@@ -77,8 +77,8 @@
|
||||
instructions of the wizard to create an empty project.
|
||||
\li In \uicontrol Projects, double-click \e Screen01.ui.qml to move to
|
||||
the Design mode.
|
||||
\li Select \uicontrol Library > \uicontrol Resources >
|
||||
\uicontrol {Add New Resources}.
|
||||
\li Select \uicontrol Library > \uicontrol Assets >
|
||||
\uicontrol {Add New Assets}.
|
||||
\li Select the folder where you exported the assets.
|
||||
\li Select \uicontrol {Exported Assets (*.metadata)} in the dropdown
|
||||
menu to filter \e .metadata files.
|
||||
@@ -106,7 +106,7 @@
|
||||
might take a little while for complex projects.
|
||||
\endlist
|
||||
|
||||
The imported assets are displayed in the \uicontrol Resources tab in the
|
||||
The imported assets are displayed in the \uicontrol Assets tab in the
|
||||
\uicontrol Library as PNG images. The components that you specified in
|
||||
the design tool are displayed in the \uicontrol {My QML Components} tab,
|
||||
as well as in the \uicontrol Project tab of the \uicontrol Navigator as
|
||||
@@ -161,8 +161,8 @@
|
||||
To import 3D assets to \QDS projects:
|
||||
|
||||
\list 1
|
||||
\li In the Design mode, select \uicontrol Library > \uicontrol Resources
|
||||
> \uicontrol {Add New Resources}.
|
||||
\li In the Design mode, select \uicontrol Library > \uicontrol Assets
|
||||
> \uicontrol {Add New Assets}.
|
||||
\li Select \uicontrol {3D Assets} in the dropdown menu to filter 3D
|
||||
graphics files.
|
||||
\li Select a file to import, and then select \uicontrol Open.
|
||||
|
@@ -36,7 +36,7 @@
|
||||
|
||||
\list
|
||||
\li Group files together
|
||||
\li Include forms and resource files
|
||||
\li Include forms and assets files
|
||||
\li Specify settings for previewing UIs
|
||||
\endlist
|
||||
|
||||
|
@@ -32,7 +32,7 @@
|
||||
\title Editing 3D Assets in Design Mode
|
||||
|
||||
\QDS opens QML files that contain 3D scenes in the Design mode and the
|
||||
scenes in the 3D editor. You can add imported 3D assets as resources
|
||||
scenes in the 3D editor. You can add imported 3D assets
|
||||
to projects and edit them to create scenes and states, as well as the
|
||||
transitions between them.
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
\li \uicontrol {Library} (3) displays the building blocks that you
|
||||
can use to create scenes: predefined Qt Quick 3D Components,
|
||||
Qt Quick Controls, your own 3D assets that you import to the
|
||||
project, and other resources. For more information, see
|
||||
project, and other assets. For more information, see
|
||||
\l {Adding 3D Views}.
|
||||
\li \uicontrol {Navigator} (4) displays the items in the current QML
|
||||
file as a tree structure. For more information, see
|
||||
|
@@ -48,8 +48,8 @@
|
||||
\li \l {Editing 3D Assets in Design Mode}
|
||||
|
||||
\QDS opens QML files that contain 3D scenes in the Design mode and
|
||||
the scenes in the 3D editor. You can add imported 3D assets as
|
||||
resources to projects as 3D components.
|
||||
the scenes in the 3D editor. You can add imported 3D assets
|
||||
to projects as 3D components.
|
||||
\li \l {Working in the 3D Editor}
|
||||
|
||||
You can select 3D components in the 3D editor to move, rotate, and
|
||||
|
@@ -0,0 +1,104 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Section {
|
||||
id: section
|
||||
caption: qsTr("Animation")
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
property bool showDuration: true
|
||||
|
||||
SectionLayout {
|
||||
Label {
|
||||
text: qsTr("Running")
|
||||
tooltip: qsTr("Sets whether the animation should run to completion when it is stopped.")
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
text: backendValues.running.valueToString
|
||||
backendValue: backendValues.running
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr("Paused")
|
||||
tooltip: qsTr("Sets whether the animation is currently paused.")
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
text: backendValues.paused.valueToString
|
||||
backendValue: backendValues.paused
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Loops")
|
||||
tooltip: qsTr("Sets the number of times the animation should play.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -1
|
||||
backendValue: backendValues.loops
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumWidth: 100
|
||||
}
|
||||
|
||||
ExpandingSpacer {
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
visible: section.showDuration
|
||||
text: qsTr("Duration")
|
||||
tooltip: qsTr("Sets the duration of the animation, in milliseconds.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
visible: section.showDuration
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -9999999
|
||||
backendValue: backendValues.duration
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumWidth: 100
|
||||
}
|
||||
|
||||
ExpandingSpacer {
|
||||
}
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Always Run To End")
|
||||
tooltip: qsTr("Sets whether the animation should run to completion when it is stopped.")
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
text: backendValues.alwaysRunToEnd.valueToString
|
||||
backendValue: backendValues.alwaysRunToEnd
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,70 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Section {
|
||||
id: section
|
||||
caption: qsTr("Animation Targets")
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
SectionLayout {
|
||||
Label {
|
||||
text: qsTr("Target")
|
||||
tooltip: qsTr("Sets the target to animate the properties of.")
|
||||
}
|
||||
SecondColumnLayout {
|
||||
ItemFilterComboBox {
|
||||
typeFilter: "QtQuick.QtObject"
|
||||
validator: RegExpValidator { regExp: /(^$|^[a-z_]\w*)/ }
|
||||
backendValue: backendValues.target
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
ExpandingSpacer {
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr("Property")
|
||||
tooltip: qsTr("Sets the property to animate.")
|
||||
}
|
||||
LineEdit {
|
||||
backendValue: backendValues.property
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
Label {
|
||||
text: qsTr("Properties")
|
||||
tooltip: qsTr("Sets the properties to animate.")
|
||||
}
|
||||
LineEdit {
|
||||
backendValue: backendValues.properties
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,62 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
Section {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
caption: qsTr("To Color")
|
||||
|
||||
ColorEditor {
|
||||
backendValue: backendValues.to
|
||||
supportGradient: false
|
||||
}
|
||||
}
|
||||
|
||||
Section {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
caption: qsTr("From Color")
|
||||
|
||||
ColorEditor {
|
||||
backendValue: backendValues.from
|
||||
supportGradient: false
|
||||
}
|
||||
}
|
||||
|
||||
AnimationTargetSection {
|
||||
|
||||
}
|
||||
|
||||
AnimationSection {
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,84 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
Section {
|
||||
caption: qsTr("Number Animation")
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
SectionLayout {
|
||||
Label {
|
||||
text: qsTr("From")
|
||||
tooltip: qsTr("Sets the starting value for the animation.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -1
|
||||
backendValue: backendValues.from
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumWidth: 100
|
||||
}
|
||||
|
||||
ExpandingSpacer {
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr("To")
|
||||
tooltip: qsTr("Sets the end value for the animation.")
|
||||
}
|
||||
|
||||
SecondColumnLayout {
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -1
|
||||
backendValue: backendValues.to
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumWidth: 100
|
||||
}
|
||||
|
||||
ExpandingSpacer {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AnimationTargetSection {
|
||||
|
||||
}
|
||||
|
||||
AnimationSection {
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,37 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
AnimationSection {
|
||||
showDuration: false
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,36 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
AnimationSection {
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,60 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
Section {
|
||||
id: section
|
||||
caption: qsTr("Property Action")
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
SectionLayout {
|
||||
Label {
|
||||
text: qsTr("Value")
|
||||
tooltip: qsTr("Sets the value of the property.")
|
||||
}
|
||||
LineEdit {
|
||||
backendValue: backendValues.value
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
AnimationTargetSection {
|
||||
|
||||
}
|
||||
|
||||
AnimationSection {
|
||||
showDuration: false
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,40 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
AnimationTargetSection {
|
||||
|
||||
}
|
||||
|
||||
AnimationSection {
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,37 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
AnimationSection {
|
||||
showDuration: false
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,37 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import HelperWidgets 2.0
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Layouts 1.1
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
AnimationSection {
|
||||
showDuration: false
|
||||
}
|
||||
}
|
||||
|
@@ -45,7 +45,7 @@ namespace Internal {
|
||||
|
||||
class ActionHandler::ActionHandlerPrivate {
|
||||
public:
|
||||
Core::Context context;
|
||||
Core::Context context{Constants::MODEL_EDITOR_ID};
|
||||
QAction *undoAction = nullptr;
|
||||
QAction *redoAction = nullptr;
|
||||
QAction *cutAction = nullptr;
|
||||
@@ -60,11 +60,9 @@ public:
|
||||
QAction *exportSelectedElementsAction = nullptr;
|
||||
};
|
||||
|
||||
ActionHandler::ActionHandler(const Core::Context &context, QObject *parent)
|
||||
: QObject(parent),
|
||||
d(new ActionHandlerPrivate)
|
||||
ActionHandler::ActionHandler()
|
||||
: d(new ActionHandlerPrivate)
|
||||
{
|
||||
d->context = context;
|
||||
}
|
||||
|
||||
ActionHandler::~ActionHandler()
|
||||
|
@@ -52,7 +52,7 @@ class ActionHandler :
|
||||
class ActionHandlerPrivate;
|
||||
|
||||
public:
|
||||
ActionHandler(const Core::Context &context, QObject *parent = nullptr);
|
||||
ActionHandler();
|
||||
~ActionHandler();
|
||||
|
||||
public:
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include "modelsmanager.h"
|
||||
#include "settingscontroller.h"
|
||||
#include "uicontroller.h"
|
||||
#include "actionhandler.h"
|
||||
|
||||
#include "qmt/infrastructure/uid.h"
|
||||
|
||||
@@ -59,7 +60,8 @@ class ModelEditorPluginPrivate final
|
||||
public:
|
||||
ModelsManager modelsManager;
|
||||
UiController uiController;
|
||||
ModelEditorFactory modelFactory{&uiController};
|
||||
ActionHandler actionHandler;
|
||||
ModelEditorFactory modelFactory{&uiController, &actionHandler};
|
||||
SettingsController settingsController;
|
||||
};
|
||||
|
||||
@@ -93,10 +95,7 @@ bool ModelEditorPlugin::initialize(const QStringList &arguments, QString *errorS
|
||||
|
||||
void ModelEditorPlugin::extensionsInitialized()
|
||||
{
|
||||
// Retrieve objects from the plugin manager's object pool
|
||||
// In the extensionsInitialized method, a plugin can be sure that all
|
||||
// plugins that depend on it are completely initialized.
|
||||
d->modelFactory.extensionsInitialized();
|
||||
d->actionHandler.createActions();
|
||||
d->settingsController.load(Core::ICore::settings());
|
||||
}
|
||||
|
||||
|
@@ -34,24 +34,12 @@
|
||||
namespace ModelEditor {
|
||||
namespace Internal {
|
||||
|
||||
ModelEditorFactory::ModelEditorFactory(UiController *uiController)
|
||||
ModelEditorFactory::ModelEditorFactory(UiController *uiController, ActionHandler *actionHandler)
|
||||
{
|
||||
setId(Constants::MODEL_EDITOR_ID);
|
||||
setDisplayName(QCoreApplication::translate("OpenWith::Editors", Constants::MODEL_EDITOR_DISPLAY_NAME));
|
||||
addMimeType(Constants::MIME_TYPE_MODEL);
|
||||
m_uiController = uiController;
|
||||
m_actionHandler = new ActionHandler(Core::Context(Constants::MODEL_EDITOR_ID), this);
|
||||
setEditorCreator([this] { return new ModelEditor(m_uiController, m_actionHandler); });
|
||||
}
|
||||
|
||||
ModelEditorFactory::~ModelEditorFactory()
|
||||
{
|
||||
delete m_actionHandler;
|
||||
}
|
||||
|
||||
void ModelEditorFactory::extensionsInitialized()
|
||||
{
|
||||
m_actionHandler->createActions();
|
||||
setEditorCreator([uiController, actionHandler] { return new ModelEditor(uiController, actionHandler); });
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
|
@@ -37,14 +37,7 @@ class UiController;
|
||||
class ModelEditorFactory : public Core::IEditorFactory
|
||||
{
|
||||
public:
|
||||
explicit ModelEditorFactory(UiController *uiController);
|
||||
~ModelEditorFactory();
|
||||
|
||||
void extensionsInitialized();
|
||||
|
||||
private:
|
||||
UiController *m_uiController = nullptr;
|
||||
ActionHandler *m_actionHandler = nullptr;
|
||||
ModelEditorFactory(UiController *uiController, ActionHandler *actionHandler);
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
@@ -261,84 +261,7 @@ QString QbsBuildConfiguration::configurationName() const
|
||||
return m_configurationName->value();
|
||||
}
|
||||
|
||||
class StepProxy
|
||||
{
|
||||
public:
|
||||
StepProxy(const BuildStep *buildStep)
|
||||
: m_qbsBuildStep(qobject_cast<const QbsBuildStep *>(buildStep))
|
||||
, m_qbsCleanStep(qobject_cast<const QbsCleanStep *>(buildStep))
|
||||
, m_qbsInstallStep(qobject_cast<const QbsInstallStep *>(buildStep))
|
||||
{
|
||||
}
|
||||
|
||||
QString command() const {
|
||||
if (m_qbsBuildStep)
|
||||
return QLatin1String("build");
|
||||
if (m_qbsInstallStep)
|
||||
return QLatin1String("install");
|
||||
return QLatin1String("clean");
|
||||
}
|
||||
|
||||
bool dryRun() const {
|
||||
if (m_qbsBuildStep)
|
||||
return false;
|
||||
if (m_qbsInstallStep)
|
||||
return m_qbsInstallStep->dryRun();
|
||||
return m_qbsCleanStep->dryRun();
|
||||
}
|
||||
|
||||
bool keepGoing() const {
|
||||
if (m_qbsBuildStep)
|
||||
return m_qbsBuildStep->keepGoing();
|
||||
if (m_qbsInstallStep)
|
||||
return m_qbsInstallStep->keepGoing();
|
||||
return m_qbsCleanStep->keepGoing();
|
||||
}
|
||||
|
||||
bool forceProbeExecution() const { return m_qbsBuildStep && m_qbsBuildStep->forceProbes(); }
|
||||
|
||||
bool showCommandLines() const {
|
||||
return m_qbsBuildStep ? m_qbsBuildStep->showCommandLines() : false;
|
||||
}
|
||||
|
||||
bool noInstall() const {
|
||||
return m_qbsBuildStep ? !m_qbsBuildStep->install() : false;
|
||||
}
|
||||
|
||||
bool noBuild() const { return m_qbsInstallStep; }
|
||||
|
||||
bool cleanInstallRoot() const {
|
||||
if (m_qbsBuildStep)
|
||||
return m_qbsBuildStep->cleanInstallRoot();
|
||||
if (m_qbsInstallStep)
|
||||
return m_qbsInstallStep->removeFirst();
|
||||
return false;
|
||||
}
|
||||
|
||||
int jobCount() const {
|
||||
return m_qbsBuildStep ? m_qbsBuildStep->maxJobs() : 0;
|
||||
}
|
||||
|
||||
Utils::FilePath installRoot() const {
|
||||
const QbsBuildStep *bs = nullptr;
|
||||
if (m_qbsBuildStep) {
|
||||
bs = m_qbsBuildStep;
|
||||
} else if (m_qbsInstallStep) {
|
||||
bs = static_cast<QbsBuildConfiguration *>(m_qbsInstallStep->deployConfiguration()
|
||||
->target()->activeBuildConfiguration())->qbsStep();
|
||||
}
|
||||
if (bs)
|
||||
return bs->installRoot();
|
||||
return Utils::FilePath();
|
||||
}
|
||||
|
||||
private:
|
||||
const QbsBuildStep * const m_qbsBuildStep;
|
||||
const QbsCleanStep * const m_qbsCleanStep;
|
||||
const QbsInstallStep * const m_qbsInstallStep;
|
||||
};
|
||||
|
||||
QString QbsBuildConfiguration::equivalentCommandLine(const BuildStep *buildStep) const
|
||||
QString QbsBuildConfiguration::equivalentCommandLine(const QbsBuildStepData &stepData) const
|
||||
{
|
||||
CommandLine commandLine;
|
||||
const QString qbsInstallDir = QString::fromLocal8Bit(qgetenv("QBS_INSTALL_DIR"));
|
||||
@@ -346,42 +269,41 @@ QString QbsBuildConfiguration::equivalentCommandLine(const BuildStep *buildStep)
|
||||
? qbsInstallDir + QLatin1String("/bin/qbs")
|
||||
: QCoreApplication::applicationDirPath() + QLatin1String("/qbs"));
|
||||
commandLine.addArg(QDir::toNativeSeparators(qbsFilePath));
|
||||
const StepProxy stepProxy(buildStep);
|
||||
commandLine.addArg(stepProxy.command());
|
||||
commandLine.addArg(stepData.command);
|
||||
const QString buildDir = buildDirectory().toUserOutput();
|
||||
commandLine.addArgs({"-d", buildDir});
|
||||
commandLine.addArgs({"-f", buildStep->project()->projectFilePath().toUserOutput()});
|
||||
commandLine.addArgs({"-f", project()->projectFilePath().toUserOutput()});
|
||||
if (QbsSettings::useCreatorSettingsDirForQbs()) {
|
||||
commandLine.addArgs({"--settings-dir",
|
||||
QDir::toNativeSeparators(QbsSettings::qbsSettingsBaseDir())});
|
||||
}
|
||||
if (stepProxy.dryRun())
|
||||
if (stepData.dryRun)
|
||||
commandLine.addArg("--dry-run");
|
||||
if (stepProxy.keepGoing())
|
||||
if (stepData.keepGoing)
|
||||
commandLine.addArg("--keep-going");
|
||||
if (stepProxy.forceProbeExecution())
|
||||
if (stepData.forceProbeExecution)
|
||||
commandLine.addArg("--force-probe-execution");
|
||||
if (stepProxy.showCommandLines())
|
||||
if (stepData.showCommandLines)
|
||||
commandLine.addArgs({"--command-echo-mode", "command-line"});
|
||||
if (stepProxy.noInstall())
|
||||
if (stepData.noInstall)
|
||||
commandLine.addArg("--no-install");
|
||||
if (stepProxy.noBuild())
|
||||
if (stepData.noBuild)
|
||||
commandLine.addArg("--no-build");
|
||||
if (stepProxy.cleanInstallRoot())
|
||||
if (stepData.cleanInstallRoot)
|
||||
commandLine.addArg("--clean-install-root");
|
||||
const int jobCount = stepProxy.jobCount();
|
||||
const int jobCount = stepData.jobCount;
|
||||
if (jobCount > 0)
|
||||
commandLine.addArgs({"--jobs", QString::number(jobCount)});
|
||||
|
||||
const QString profileName = QbsProfileManager::profileNameForKit(buildStep->target()->kit());
|
||||
const QString profileName = QbsProfileManager::profileNameForKit(target()->kit());
|
||||
const QString buildVariant = qbsConfiguration()
|
||||
.value(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY)).toString();
|
||||
commandLine.addArg("config:" + configurationName());
|
||||
commandLine.addArg(QString(Constants::QBS_CONFIG_VARIANT_KEY) + ':' + buildVariant);
|
||||
const FilePath installRoot = stepProxy.installRoot();
|
||||
const FilePath installRoot = stepData.installRoot;
|
||||
if (!installRoot.isEmpty()) {
|
||||
commandLine.addArg(QString(Constants::QBS_INSTALL_ROOT_KEY) + ':' + installRoot.toUserOutput());
|
||||
if (qobject_cast<const QbsInstallStep *>(buildStep))
|
||||
if (stepData.isInstallStep)
|
||||
commandLine.addArgs({"--installRoot", installRoot.toUserOutput()});
|
||||
}
|
||||
commandLine.addArg("profile:" + profileName);
|
||||
|
@@ -40,7 +40,22 @@ namespace QbsProjectManager {
|
||||
namespace Internal {
|
||||
|
||||
class QbsBuildStep;
|
||||
class QbsProject;
|
||||
|
||||
class QbsBuildStepData
|
||||
{
|
||||
public:
|
||||
QString command;
|
||||
bool dryRun = false;
|
||||
bool keepGoing = false;
|
||||
bool forceProbeExecution = false;
|
||||
bool showCommandLines = false;
|
||||
bool noInstall = false;
|
||||
bool noBuild = false;
|
||||
bool cleanInstallRoot = false;
|
||||
bool isInstallStep = false;
|
||||
int jobCount = 0;
|
||||
Utils::FilePath installRoot;
|
||||
};
|
||||
|
||||
class QbsBuildConfiguration final : public ProjectExplorer::BuildConfiguration
|
||||
{
|
||||
@@ -73,7 +88,7 @@ public:
|
||||
QStringList products() const;
|
||||
|
||||
QString configurationName() const;
|
||||
QString equivalentCommandLine(const ProjectExplorer::BuildStep *buildStep) const;
|
||||
QString equivalentCommandLine(const QbsBuildStepData &stepData) const;
|
||||
|
||||
bool isQmlDebuggingEnabled() const;
|
||||
ProjectExplorer::TriState qmlDebuggingSetting() const;
|
||||
|
@@ -523,6 +523,23 @@ void QbsBuildStep::finish()
|
||||
emit finished(m_lastWasSuccess);
|
||||
}
|
||||
|
||||
QbsBuildStepData QbsBuildStep::stepData() const
|
||||
{
|
||||
QbsBuildStepData data;
|
||||
data.command = "build";
|
||||
data.dryRun = false;
|
||||
data.keepGoing = m_keepGoing;
|
||||
data.forceProbeExecution = m_forceProbes;
|
||||
data.showCommandLines = m_showCommandLines;
|
||||
data.noInstall = !m_install;
|
||||
data.noBuild = false;
|
||||
data.cleanInstallRoot = m_cleanInstallDir;
|
||||
data.jobCount = maxJobs();
|
||||
data.installRoot = installRoot();
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// QbsBuildStepConfigWidget:
|
||||
// --------------------------------------------------------------------
|
||||
@@ -674,7 +691,8 @@ void QbsBuildStepConfigWidget::updateState()
|
||||
const int idx = (buildVariant == Constants::QBS_VARIANT_DEBUG) ? 0 : 1;
|
||||
buildVariantComboBox->setCurrentIndex(idx);
|
||||
const auto qbsBuildConfig = static_cast<QbsBuildConfiguration *>(step()->buildConfiguration());
|
||||
QString command = qbsBuildConfig->equivalentCommandLine(qbsStep());
|
||||
|
||||
QString command = qbsBuildConfig->equivalentCommandLine(qbsStep()->stepData());
|
||||
|
||||
for (int i = 0; i < m_propertyCache.count(); ++i) {
|
||||
command += ' ' + m_propertyCache.at(i).name + ':' + m_propertyCache.at(i).effectiveValue;
|
||||
|
@@ -70,6 +70,7 @@ public:
|
||||
bool forceProbes() const { return m_forceProbes; }
|
||||
|
||||
QbsBuildSystem *qbsBuildSystem() const;
|
||||
QbsBuildStepData stepData() const;
|
||||
|
||||
signals:
|
||||
void qbsConfigurationChanged();
|
||||
|
@@ -67,8 +67,12 @@ QbsCleanStep::QbsCleanStep(BuildStepList *bsl, Core::Id id)
|
||||
effectiveCommandAspect->setLabelText(tr("Equivalent command line:"));
|
||||
|
||||
setSummaryUpdater([this, effectiveCommandAspect] {
|
||||
QbsBuildStepData data;
|
||||
data.command = "clean";
|
||||
data.dryRun = m_dryRunAspect->value();
|
||||
data.keepGoing = m_keepGoingAspect->value();
|
||||
QString command = static_cast<QbsBuildConfiguration *>(buildConfiguration())
|
||||
->equivalentCommandLine(this);
|
||||
->equivalentCommandLine(data);
|
||||
effectiveCommandAspect->setValue(command);
|
||||
return tr("<b>Qbs:</b> %1").arg(command);
|
||||
});
|
||||
|
@@ -44,8 +44,7 @@ public:
|
||||
QbsCleanStep(ProjectExplorer::BuildStepList *bsl, Core::Id id);
|
||||
~QbsCleanStep() override;
|
||||
|
||||
bool dryRun() const { return m_dryRunAspect->value(); }
|
||||
bool keepGoing() const { return m_keepGoingAspect->value(); }
|
||||
QbsBuildStepData stepData() const;
|
||||
|
||||
private:
|
||||
bool init() override;
|
||||
|
@@ -182,7 +182,7 @@ void QbsInstallStep::installDone(const ErrorInfo &error)
|
||||
m_session = nullptr;
|
||||
|
||||
for (const ErrorInfoItem &item : error.items)
|
||||
createTaskAndOutput(Task::Error, item.description, item.filePath.toString(), item.line);
|
||||
createTaskAndOutput(Task::Error, item.description, item.filePath, item.line);
|
||||
|
||||
emit finished(!error.hasError());
|
||||
}
|
||||
@@ -199,10 +199,10 @@ void QbsInstallStep::handleProgress(int value)
|
||||
emit progress(value * 100 / m_maxProgress, m_description);
|
||||
}
|
||||
|
||||
void QbsInstallStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type,
|
||||
const QString &message, const QString &file, int line)
|
||||
void QbsInstallStep::createTaskAndOutput(Task::TaskType type, const QString &message,
|
||||
const Utils::FilePath &file, int line)
|
||||
{
|
||||
const CompileTask task(type, message, Utils::FilePath::fromString(file), line);
|
||||
const CompileTask task(type, message, file, line);
|
||||
emit addTask(task, 1);
|
||||
emit addOutput(message, OutputFormat::Stdout);
|
||||
}
|
||||
@@ -231,6 +231,21 @@ void QbsInstallStep::setKeepGoing(bool kg)
|
||||
emit changed();
|
||||
}
|
||||
|
||||
QbsBuildStepData QbsInstallStep::stepData() const
|
||||
{
|
||||
QbsBuildStepData data;
|
||||
data.command = "install";
|
||||
data.dryRun = dryRun();
|
||||
data.keepGoing = keepGoing();
|
||||
data.noBuild = true;
|
||||
data.cleanInstallRoot = removeFirst();
|
||||
data.isInstallStep = true;
|
||||
auto bs = static_cast<QbsBuildConfiguration *>(target()->activeBuildConfiguration())->qbsStep();
|
||||
if (bs)
|
||||
data.installRoot = bs->installRoot();
|
||||
return data;
|
||||
};
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// QbsInstallStepConfigWidget:
|
||||
// --------------------------------------------------------------------
|
||||
@@ -320,7 +335,7 @@ void QbsInstallStepConfigWidget::updateState()
|
||||
m_keepGoingCheckBox->setChecked(m_step->keepGoing());
|
||||
}
|
||||
|
||||
QString command = m_step->buildConfig()->equivalentCommandLine(m_step);
|
||||
QString command = m_step->buildConfig()->equivalentCommandLine(m_step->stepData());
|
||||
|
||||
m_commandLineTextEdit->setPlainText(command);
|
||||
|
||||
|
@@ -48,6 +48,7 @@ public:
|
||||
bool removeFirst() const { return m_cleanInstallRoot; }
|
||||
bool dryRun() const { return m_dryRun; }
|
||||
bool keepGoing() const { return m_keepGoing; }
|
||||
QbsBuildStepData stepData() const;
|
||||
|
||||
signals:
|
||||
void changed();
|
||||
@@ -66,7 +67,7 @@ private:
|
||||
void handleProgress(int value);
|
||||
|
||||
void createTaskAndOutput(ProjectExplorer::Task::TaskType type,
|
||||
const QString &message, const QString &file, int line);
|
||||
const QString &message, const Utils::FilePath &file, int line);
|
||||
|
||||
void setRemoveFirst(bool rf);
|
||||
void setDryRun(bool dr);
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <nodeabstractproperty.h>
|
||||
#include <exception.h>
|
||||
#include <nodemetainfo.h>
|
||||
#include <nodelistproperty.h>
|
||||
|
||||
#include <QStandardItemModel>
|
||||
#include <QMessageBox>
|
||||
@@ -210,6 +211,10 @@ void ConnectionModel::updateTargetNode(int rowNumber)
|
||||
ModelNode connectionNode = signalHandlerProperty.parentModelNode();
|
||||
|
||||
if (!newTarget.isEmpty()) {
|
||||
const ModelNode parent = connectionView()->modelNodeForId(newTarget);
|
||||
if (parent.isValid() && QmlItemNode::isValidQmlItemNode(parent))
|
||||
parent.nodeListProperty("data").reparentHere(connectionNode);
|
||||
|
||||
connectionView()->executeInTransaction("ConnectionModel::updateTargetNode", [= ,&connectionNode](){
|
||||
connectionNode.bindingProperty("target").setExpression(newTarget);
|
||||
});
|
||||
@@ -255,14 +260,21 @@ void ConnectionModel::addConnection()
|
||||
nodeMetaInfo.majorVersion(),
|
||||
nodeMetaInfo.minorVersion());
|
||||
|
||||
rootModelNode.nodeAbstractProperty(rootModelNode.metaInfo().defaultPropertyName()).reparentHere(newNode);
|
||||
newNode.signalHandlerProperty("onClicked").setSource(QLatin1String("print(\"clicked\")"));
|
||||
|
||||
if (connectionView()->selectedModelNodes().count() == 1
|
||||
&& !connectionView()->selectedModelNodes().constFirst().id().isEmpty()) {
|
||||
if (connectionView()->selectedModelNodes().count() == 1) {
|
||||
const ModelNode selectedNode = connectionView()->selectedModelNodes().constFirst();
|
||||
if (QmlItemNode::isValidQmlItemNode(selectedNode))
|
||||
selectedNode.nodeAbstractProperty("data").reparentHere(newNode);
|
||||
else
|
||||
rootModelNode.nodeAbstractProperty(rootModelNode.metaInfo().defaultPropertyName()).reparentHere(newNode);
|
||||
|
||||
if (!connectionView()->selectedModelNodes().constFirst().id().isEmpty())
|
||||
newNode.bindingProperty("target").setExpression(selectedNode.id());
|
||||
else
|
||||
newNode.bindingProperty("target").setExpression(QLatin1String("parent"));
|
||||
} else {
|
||||
rootModelNode.nodeAbstractProperty(rootModelNode.metaInfo().defaultPropertyName()).reparentHere(newNode);
|
||||
newNode.bindingProperty("target").setExpression(QLatin1String("parent"));
|
||||
}
|
||||
});
|
||||
|
@@ -394,6 +394,9 @@ static void scatterItem(const ModelNode &pastedNode, const ModelNode &targetNode
|
||||
if (targetNode.metaInfo().isValid() && targetNode.metaInfo().isLayoutable())
|
||||
return;
|
||||
|
||||
if (!(pastedNode.hasVariantProperty("x") && pastedNode.hasVariantProperty("y")))
|
||||
return;
|
||||
|
||||
bool scatter = false;
|
||||
foreach (const ModelNode &childNode, targetNode.directSubModelNodes()) {
|
||||
if ((childNode.variantProperty("x").value() == pastedNode.variantProperty("x").value()) &&
|
||||
|
@@ -120,7 +120,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) :
|
||||
/* other widgets */
|
||||
auto tabBar = new QTabBar(this);
|
||||
tabBar->addTab(tr("QML Types", "Title of library QML types view"));
|
||||
tabBar->addTab(tr("Resources", "Title of library resources view"));
|
||||
tabBar->addTab(tr("Assets", "Title of library assets view"));
|
||||
tabBar->addTab(tr("Imports", "Title of library imports view"));
|
||||
tabBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
connect(tabBar, &QTabBar::currentChanged, this, &ItemLibraryWidget::setCurrentIndexOfStackedWidget);
|
||||
@@ -184,8 +184,8 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) :
|
||||
font.setPixelSize(Theme::instance()->smallFontPixelSize());
|
||||
button->setFont(font);
|
||||
button->setIcon(Utils::Icons::PLUS.icon());
|
||||
button->setText(tr("Add New Resources..."));
|
||||
button->setToolTip(tr("Add new resources to project."));
|
||||
button->setText(tr("Add New Assets..."));
|
||||
button->setToolTip(tr("Add new assets to project."));
|
||||
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
||||
flowLayout->addWidget(button);
|
||||
connect(button, &QToolButton::clicked, this, &ItemLibraryWidget::addResources);
|
||||
@@ -511,7 +511,7 @@ void ItemLibraryWidget::addResources()
|
||||
const QString currentDir = lastDir.isEmpty() ? document->fileName().parentDir().toString() : lastDir;
|
||||
|
||||
const auto fileNames = QFileDialog::getOpenFileNames(Core::ICore::mainWindow(),
|
||||
tr("Add Resources"),
|
||||
tr("Add Assets"),
|
||||
currentDir,
|
||||
filters.join(";;"));
|
||||
|
||||
|
@@ -149,10 +149,10 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-10000</number>
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
<number>100000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -244,10 +244,10 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-10000</number>
|
||||
<number>-100000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
<number>100000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -313,10 +313,10 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-10000</number>
|
||||
<number>-100000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
<number>100000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@@ -47,8 +47,6 @@ TimelineForm::TimelineForm(QWidget *parent)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->duration->setVisible(false);
|
||||
|
||||
connect(ui->expressionBindingLineEdit, &QLineEdit::editingFinished, [this]() {
|
||||
QTC_ASSERT(m_timeline.isValid(), return );
|
||||
|
||||
@@ -135,13 +133,10 @@ void TimelineForm::setTimeline(const QmlTimeline &timeline)
|
||||
|
||||
if (m_timeline.isValid()) {
|
||||
ui->idLineEdit->setText(m_timeline.modelNode().displayName());
|
||||
ui->duration->setValue(qRound(m_timeline.duration()));
|
||||
ui->startFrame->setValue(
|
||||
m_timeline.modelNode().variantProperty("startFrame").value().toInt());
|
||||
ui->endFrame->setValue(m_timeline.modelNode().variantProperty("endFrame").value().toInt());
|
||||
|
||||
ui->duration->setValue(qRound(m_timeline.duration()));
|
||||
|
||||
if (m_timeline.modelNode().hasBindingProperty("currentFrame")) {
|
||||
ui->expressionBindingLineEdit->setText(
|
||||
m_timeline.modelNode().bindingProperty("currentFrame").expression());
|
||||
@@ -173,7 +168,6 @@ void TimelineForm::setProperty(const PropertyName &propertyName, const QVariant
|
||||
} catch (const Exception &e) {
|
||||
e.showException();
|
||||
}
|
||||
ui->duration->setValue(qRound(m_timeline.duration()));
|
||||
}
|
||||
|
||||
void TimelineForm::connectSpinBox(QSpinBox *spinBox, const PropertyName &propertyName)
|
||||
|
@@ -6,16 +6,19 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>627</width>
|
||||
<width>641</width>
|
||||
<height>170</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="8" colspan="2">
|
||||
<spacer name="horizontalSpacer_11">
|
||||
<item row="3" column="6" colspan="2">
|
||||
<spacer name="horizontalSpacer_12">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>49</width>
|
||||
@@ -24,72 +27,8 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="5">
|
||||
<widget class="QSpinBox" name="endFrame">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-10000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2" colspan="2">
|
||||
<widget class="QSpinBox" name="startFrame">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-10000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="6">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>Duration</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Expression binding:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="8" colspan="2">
|
||||
<spacer name="horizontalSpacer_10">
|
||||
<item row="1" column="6" colspan="2">
|
||||
<spacer name="horizontalSpacer_11">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
@@ -111,66 +50,18 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="3" colspan="2">
|
||||
<widget class="QRadioButton" name="animation">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Animation</string>
|
||||
<string>Start frame:</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="8" colspan="2">
|
||||
<spacer name="horizontalSpacer_12">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>49</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="4" column="1" colspan="5">
|
||||
<widget class="QLineEdit" name="expressionBindingLineEdit">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>240</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="8" colspan="2">
|
||||
<spacer name="horizontalSpacer_9">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>49</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="7">
|
||||
<widget class="QSpinBox" name="duration">
|
||||
<item row="2" column="2" colspan="2">
|
||||
<widget class="QSpinBox" name="startFrame">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
@@ -183,11 +74,11 @@
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
<property name="minimum">
|
||||
<number>-100000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>20000</number>
|
||||
<number>100000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -201,13 +92,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="5">
|
||||
<widget class="QLineEdit" name="idLineEdit">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
@@ -237,16 +121,100 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<item row="3" column="3" colspan="2">
|
||||
<widget class="QRadioButton" name="animation">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Start frame:</string>
|
||||
<string>Animation</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="6" colspan="2">
|
||||
<spacer name="horizontalSpacer_9">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>49</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Expression binding:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="5">
|
||||
<widget class="QSpinBox" name="endFrame">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-100000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="5">
|
||||
<widget class="QLineEdit" name="idLineEdit">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" colspan="5">
|
||||
<widget class="QLineEdit" name="expressionBindingLineEdit">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>240</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="6" colspan="2">
|
||||
<spacer name="horizontalSpacer_10">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>49</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
@@ -275,4 +275,149 @@ MetaInfo {
|
||||
Property { name: "height"; type: "int"; value: 400; }
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.PropertyAnimation"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "Property Animation"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.PauseAnimation"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "Pause Animation"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.SequentialAnimation"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "Sequential Animation"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.ParallelAnimation"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "Parallel Animation"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.PropertyAction"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "Property Action"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.ScriptAction"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "Script Action"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.ColorAnimation"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "ColorAnimation"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Type {
|
||||
name: "QtQuick.NumberAnimation"
|
||||
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||
|
||||
Hints {
|
||||
visibleInNavigator: true
|
||||
canBeDroppedInNavigator: true
|
||||
canBeDroppedInFormEditor: false
|
||||
}
|
||||
|
||||
ItemLibraryEntry {
|
||||
name: "Number Animation"
|
||||
category: "Qt Quick - Animation"
|
||||
libraryIcon: ":/qtquickplugin/images/item-icon.png"
|
||||
version: "2.0"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user