forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/7.0'
Conflicts: src/plugins/android/androiddevice.h src/plugins/android/androidplugin.cpp src/plugins/android/androidplugin.h Change-Id: I1a68354415283fe4a7450706520a576d2a1775e0
This commit is contained in:
@@ -89,7 +89,9 @@ endif()
|
|||||||
# Crashpad
|
# Crashpad
|
||||||
set(CRASHPAD_BACKEND_URL "" CACHE STRING "Crashpad backend URL")
|
set(CRASHPAD_BACKEND_URL "" CACHE STRING "Crashpad backend URL")
|
||||||
set(BUILD_WITH_CRASHPAD OFF)
|
set(BUILD_WITH_CRASHPAD OFF)
|
||||||
if(CRASHPAD_BACKEND_URL AND (WIN32 OR APPLE)) # Linux is not supported for now
|
# Linux is not supported for now
|
||||||
|
# x86_64;arm64 is not supported for now
|
||||||
|
if(CRASHPAD_BACKEND_URL AND (WIN32 OR (APPLE AND NOT "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64;arm64")))
|
||||||
find_package(Crashpad QUIET)
|
find_package(Crashpad QUIET)
|
||||||
if(TARGET Crashpad::Crashpad)
|
if(TARGET Crashpad::Crashpad)
|
||||||
set(BUILD_WITH_CRASHPAD ON)
|
set(BUILD_WITH_CRASHPAD ON)
|
||||||
|
2
dist/copyright_template.txt
vendored
2
dist/copyright_template.txt
vendored
@@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2021 The Qt Company Ltd.
|
** Copyright (C) 2022 The Qt Company Ltd.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of Qt Creator.
|
** This file is part of Qt Creator.
|
||||||
|
@@ -279,6 +279,11 @@
|
|||||||
\li Always Show Camera Frustums
|
\li Always Show Camera Frustums
|
||||||
\li Toggles between always showing the camera frustum and showing it
|
\li Toggles between always showing the camera frustum and showing it
|
||||||
only for cameras selected in \uicontrol {3D Editor}.
|
only for cameras selected in \uicontrol {3D Editor}.
|
||||||
|
\row
|
||||||
|
\li Always Show Particle Emitters and Attractors
|
||||||
|
\li Toggle between always showing the particle emitter and attractor
|
||||||
|
visualizations and only showing them when the emitter or attractor is
|
||||||
|
selected in \uicontrol {3D Editor}.
|
||||||
\endtable
|
\endtable
|
||||||
|
|
||||||
\section1 Particle Editor
|
\section1 Particle Editor
|
||||||
|
@@ -729,8 +729,9 @@
|
|||||||
\l {Model Shape} component to use. The shape is scaled, positioned, and
|
\l {Model Shape} component to use. The shape is scaled, positioned, and
|
||||||
rotated based on the emitter node properties. When the shape \uicontrol Fill
|
rotated based on the emitter node properties. When the shape \uicontrol Fill
|
||||||
property is set to false, particles are emitted only from the surface of the
|
property is set to false, particles are emitted only from the surface of the
|
||||||
shape. When the shape is not defined, particles are emitted from the center
|
shape. When the shape is defined, it is visualized in
|
||||||
point of the emitter.
|
\uicontrol {3D Editor}. When the shape is not defined, particles are emitted
|
||||||
|
from the center point of the emitter.
|
||||||
|
|
||||||
In \uicontrol {Life span}, specify the lifespan of a single particle
|
In \uicontrol {Life span}, specify the lifespan of a single particle
|
||||||
in milliseconds. Specify variation in the particle lifespan in
|
in milliseconds. Specify variation in the particle lifespan in
|
||||||
@@ -883,7 +884,8 @@
|
|||||||
|
|
||||||
In \uicontrol Shape, select an instance of the \l {Particle Shape} or
|
In \uicontrol Shape, select an instance of the \l {Particle Shape} or
|
||||||
\l {Model Shape} component to attract particles into a random position
|
\l {Model Shape} component to attract particles into a random position
|
||||||
inside the shape.
|
inside the shape. When the shape is defined, it is visualized in
|
||||||
|
\uicontrol {3D Editor}.
|
||||||
|
|
||||||
\uicontrol Duration specifies the duration in milliseconds that it takes
|
\uicontrol Duration specifies the duration in milliseconds that it takes
|
||||||
for particles to reach the attraction position. When the value is -1,
|
for particles to reach the attraction position. When the value is -1,
|
||||||
|
@@ -265,7 +265,7 @@ Item {
|
|||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: DialogValues.gridMargins
|
anchors.margins: DialogValues.gridMargins
|
||||||
|
|
||||||
NewProjectView {
|
PresetView {
|
||||||
id: presetView
|
id: presetView
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
@@ -140,6 +140,7 @@ Item {
|
|||||||
id: delegateId
|
id: delegateId
|
||||||
width: stylesList.width
|
width: stylesList.width
|
||||||
height: DialogValues.styleListItemHeight
|
height: DialogValues.styleListItemHeight
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
onClicked: stylesList.currentIndex = index
|
onClicked: stylesList.currentIndex = index
|
||||||
|
|
||||||
@@ -161,13 +162,13 @@ Item {
|
|||||||
height: DialogValues.styleImageHeight
|
height: DialogValues.styleImageHeight
|
||||||
+ 2 * DialogValues.styleImageBorderWidth
|
+ 2 * DialogValues.styleImageBorderWidth
|
||||||
|
|
||||||
border.color: itemRectMouseArea.containsMouse
|
border.color: delegateId.hovered
|
||||||
? DialogValues.textColor
|
? DialogValues.textColor
|
||||||
: (index === stylesList.currentIndex
|
: (index === stylesList.currentIndex
|
||||||
? DialogValues.textColorInteraction
|
? DialogValues.textColorInteraction
|
||||||
: "transparent")
|
: "transparent")
|
||||||
|
|
||||||
border.width: index === stylesList.currentIndex || itemRectMouseArea.containsMouse
|
border.width: index === stylesList.currentIndex || delegateId.hovered
|
||||||
? DialogValues.styleImageBorderWidth
|
? DialogValues.styleImageBorderWidth
|
||||||
: 0
|
: 0
|
||||||
|
|
||||||
@@ -182,12 +183,6 @@ Item {
|
|||||||
asynchronous: false
|
asynchronous: false
|
||||||
source: "image://newprojectdialog_library/" + BackendApi.styleModel.iconId(model.index)
|
source: "image://newprojectdialog_library/" + BackendApi.styleModel.iconId(model.index)
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: itemRectMouseArea
|
|
||||||
anchors.fill: parent
|
|
||||||
hoverEnabled: true
|
|
||||||
}
|
|
||||||
} // Rectangle
|
} // Rectangle
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
@@ -3,5 +3,5 @@ PopupDialogButton 1.0 PopupDialogButton.qml
|
|||||||
PopupDialogButtonBox 1.0 PopupDialogButtonBox.qml
|
PopupDialogButtonBox 1.0 PopupDialogButtonBox.qml
|
||||||
Details 1.0 Details.qml
|
Details 1.0 Details.qml
|
||||||
singleton DialogValues 1.0 DialogValues.qml
|
singleton DialogValues 1.0 DialogValues.qml
|
||||||
NewProjectView 1.0 NewProjectView.qml
|
PresetView 1.0 PresetView.qml
|
||||||
Styles 1.0 Styles.qml
|
Styles 1.0 Styles.qml
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick 2.15
|
||||||
import QtQuick.Layouts 1.15
|
import QtQuick.Layouts 1.15
|
||||||
import HelperWidgets 2.0
|
import HelperWidgets 2.0
|
||||||
|
import StudioControls 1.0 as StudioControls
|
||||||
import StudioTheme 1.0 as StudioTheme
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
@@ -47,6 +48,40 @@ Section {
|
|||||||
ExpandingSpacer {}
|
ExpandingSpacer {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PropertyLabel { text: qsTr("Position") }
|
||||||
|
|
||||||
|
SecondColumnLayout {
|
||||||
|
SpinBox {
|
||||||
|
implicitWidth: StudioTheme.Values.twoControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
backendValue: backendValues.x
|
||||||
|
maximumValue: 0xffff
|
||||||
|
minimumValue: -0xffff
|
||||||
|
decimals: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
|
||||||
|
|
||||||
|
ControlLabel { text: "X" }
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlGap }
|
||||||
|
|
||||||
|
SpinBox {
|
||||||
|
implicitWidth: StudioTheme.Values.twoControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
backendValue: backendValues.y
|
||||||
|
maximumValue: 0xffff
|
||||||
|
minimumValue: -0xffff
|
||||||
|
decimals: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
|
||||||
|
|
||||||
|
ControlLabel { text: "Y" }
|
||||||
|
|
||||||
|
ExpandingSpacer {}
|
||||||
|
}
|
||||||
|
|
||||||
PropertyLabel { text: qsTr("Size") }
|
PropertyLabel { text: qsTr("Size") }
|
||||||
|
|
||||||
SecondColumnLayout {
|
SecondColumnLayout {
|
||||||
@@ -87,6 +122,92 @@ Section {
|
|||||||
ExpandingSpacer {}
|
ExpandingSpacer {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PropertyLabel {
|
||||||
|
text: qsTr("Minimum size")
|
||||||
|
tooltip: qsTr("Minimum size of the window.")
|
||||||
|
}
|
||||||
|
|
||||||
|
SecondColumnLayout {
|
||||||
|
SpinBox {
|
||||||
|
implicitWidth: StudioTheme.Values.twoControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
backendValue: backendValues.minimumWidth
|
||||||
|
minimumValue: 0
|
||||||
|
maximumValue: 0xffff
|
||||||
|
decimals: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
|
||||||
|
|
||||||
|
ControlLabel {
|
||||||
|
//: The width of the object
|
||||||
|
text: qsTr("W", "width")
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlGap }
|
||||||
|
|
||||||
|
SpinBox {
|
||||||
|
implicitWidth: StudioTheme.Values.twoControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
backendValue: backendValues.minimumHeight
|
||||||
|
minimumValue: 0
|
||||||
|
maximumValue: 0xffff
|
||||||
|
decimals: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
|
||||||
|
|
||||||
|
ControlLabel {
|
||||||
|
//: The height of the object
|
||||||
|
text: qsTr("H", "height")
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpandingSpacer {}
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyLabel {
|
||||||
|
text: qsTr("Maximum size")
|
||||||
|
tooltip: qsTr("Maximum size of the window.")
|
||||||
|
}
|
||||||
|
|
||||||
|
SecondColumnLayout {
|
||||||
|
SpinBox {
|
||||||
|
implicitWidth: StudioTheme.Values.twoControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
backendValue: backendValues.maximumWidth
|
||||||
|
minimumValue: 0
|
||||||
|
maximumValue: 0xffff
|
||||||
|
decimals: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
|
||||||
|
|
||||||
|
ControlLabel {
|
||||||
|
//: The width of the object
|
||||||
|
text: qsTr("W", "width")
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlGap }
|
||||||
|
|
||||||
|
SpinBox {
|
||||||
|
implicitWidth: StudioTheme.Values.twoControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
backendValue: backendValues.maximumHeight
|
||||||
|
minimumValue: 0
|
||||||
|
maximumValue: 0xffff
|
||||||
|
decimals: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
|
||||||
|
|
||||||
|
ControlLabel {
|
||||||
|
//: The height of the object
|
||||||
|
text: qsTr("H", "height")
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpandingSpacer {}
|
||||||
|
}
|
||||||
|
|
||||||
PropertyLabel { text: qsTr("Color") }
|
PropertyLabel { text: qsTr("Color") }
|
||||||
|
|
||||||
ColorEditor {
|
ColorEditor {
|
||||||
@@ -122,5 +243,316 @@ Section {
|
|||||||
|
|
||||||
ExpandingSpacer {}
|
ExpandingSpacer {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PropertyLabel { text: qsTr("Content orientation") }
|
||||||
|
|
||||||
|
SecondColumnLayout {
|
||||||
|
StudioControls.ComboBox {
|
||||||
|
id: contentOrientationComboBox
|
||||||
|
|
||||||
|
property bool __isCompleted: false
|
||||||
|
|
||||||
|
property variant backendValue: backendValues.contentOrientation
|
||||||
|
property variant valueFromBackend: contentOrientationComboBox.backendValue?.value ?? 0
|
||||||
|
property bool isInModel: contentOrientationComboBox.backendValue?.isInModel ?? false
|
||||||
|
property bool isInSubState: contentOrientationComboBox.backendValue?.isInSubState ?? false
|
||||||
|
property bool block: false
|
||||||
|
|
||||||
|
onIsInModelChanged: contentOrientationComboBox.evaluateValue()
|
||||||
|
onIsInSubStateChanged: contentOrientationComboBox.evaluateValue()
|
||||||
|
onBackendValueChanged: contentOrientationComboBox.evaluateValue()
|
||||||
|
onValueFromBackendChanged: contentOrientationComboBox.evaluateValue()
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: modelNodeBackend
|
||||||
|
function onSelectionChanged() { contentOrientationComboBox.evaluateValue() }
|
||||||
|
}
|
||||||
|
|
||||||
|
function indexOfContentOrientation() {
|
||||||
|
if (contentOrientationComboBox.backendValue === undefined
|
||||||
|
|| contentOrientationComboBox.backendValue.expression === undefined)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
let value = contentOrientationComboBox.backendValue.expression
|
||||||
|
|
||||||
|
if (value.indexOf("PrimaryOrientation") !== -1) return 0
|
||||||
|
if (value.indexOf("LandscapeOrientation") !== -1) return 1
|
||||||
|
if (value.indexOf("PortraitOrientation") !== -1) return 2
|
||||||
|
if (value.indexOf("InvertedLandscapeOrientation") !== -1) return 3
|
||||||
|
if (value.indexOf("InvertedPortraitOrientation") !== -1) return 4
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function evaluateValue() {
|
||||||
|
contentOrientationComboBox.block = true
|
||||||
|
contentOrientationComboBox.currentIndex = indexOfContentOrientation()
|
||||||
|
contentOrientationComboBox.block = false
|
||||||
|
}
|
||||||
|
|
||||||
|
implicitWidth: StudioTheme.Values.singleControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
width: implicitWidth
|
||||||
|
labelColor: contentOrientationComboBox.currentIndex === 0
|
||||||
|
? contentOrientationColorLogic.__defaultTextColor
|
||||||
|
: contentOrientationColorLogic.__changedTextColor
|
||||||
|
model: ["PrimaryOrientation", "LandscapeOrientation", "PortraitOrientation",
|
||||||
|
"InvertedLandscapeOrientation", "InvertedPortraitOrientation"]
|
||||||
|
|
||||||
|
ColorLogic { id: contentOrientationColorLogic }
|
||||||
|
|
||||||
|
actionIndicator.icon.color: contentOrientationExtFuncLogic.color
|
||||||
|
actionIndicator.icon.text: contentOrientationExtFuncLogic.glyph
|
||||||
|
actionIndicator.onClicked: contentOrientationExtFuncLogic.show()
|
||||||
|
actionIndicator.forceVisible: contentOrientationExtFuncLogic.menuVisible
|
||||||
|
actionIndicator.visible: true
|
||||||
|
|
||||||
|
ExtendedFunctionLogic {
|
||||||
|
id: contentOrientationExtFuncLogic
|
||||||
|
backendValue: backendValues.contentOrientation
|
||||||
|
onReseted: contentOrientationComboBox.currentIndex = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
onActivated: function(index) {
|
||||||
|
if (!contentOrientationComboBox.__isCompleted)
|
||||||
|
return
|
||||||
|
|
||||||
|
contentOrientationComboBox.currentIndex = index
|
||||||
|
contentOrientationComboBox.composeExpressionString()
|
||||||
|
}
|
||||||
|
|
||||||
|
function composeExpressionString() {
|
||||||
|
if (contentOrientationComboBox.block)
|
||||||
|
return
|
||||||
|
|
||||||
|
var expressionStr = ""
|
||||||
|
if (contentOrientationComboBox.currentIndex !== 0) {
|
||||||
|
expressionStr = "Qt." + contentOrientationComboBox.currentText
|
||||||
|
contentOrientationComboBox.backendValue.expression = expressionStr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
contentOrientationComboBox.evaluateValue()
|
||||||
|
contentOrientationComboBox.__isCompleted = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpandingSpacer {}
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyLabel { text: qsTr("Flags") }
|
||||||
|
|
||||||
|
SecondColumnLayout {
|
||||||
|
StudioControls.ComboBox {
|
||||||
|
id: flagsComboBox
|
||||||
|
|
||||||
|
property bool __isCompleted: false
|
||||||
|
|
||||||
|
property variant backendValue: backendValues.flags
|
||||||
|
property variant valueFromBackend: flagsComboBox.backendValue?.value ?? 0
|
||||||
|
property bool isInModel: flagsComboBox.backendValue?.isInModel ?? false
|
||||||
|
property bool isInSubState: flagsComboBox.backendValue?.isInSubState ?? false
|
||||||
|
property bool block: false
|
||||||
|
|
||||||
|
onIsInModelChanged: flagsComboBox.evaluateValue()
|
||||||
|
onIsInSubStateChanged: flagsComboBox.evaluateValue()
|
||||||
|
onBackendValueChanged: flagsComboBox.evaluateValue()
|
||||||
|
onValueFromBackendChanged: flagsComboBox.evaluateValue()
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: modelNodeBackend
|
||||||
|
function onSelectionChanged() { flagsComboBox.evaluateValue() }
|
||||||
|
}
|
||||||
|
|
||||||
|
function indexOfFlags() {
|
||||||
|
if (flagsComboBox.backendValue === undefined
|
||||||
|
|| flagsComboBox.backendValue.expression === undefined)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
let value = flagsComboBox.backendValue.expression
|
||||||
|
|
||||||
|
if (value.indexOf("Widget") !== -1) return 0
|
||||||
|
if (value.indexOf("Window") !== -1) return 1
|
||||||
|
if (value.indexOf("Dialog") !== -1) return 2
|
||||||
|
if (value.indexOf("Sheet") !== -1) return 3
|
||||||
|
if (value.indexOf("Drawer") !== -1) return 4
|
||||||
|
if (value.indexOf("Popup") !== -1) return 5
|
||||||
|
if (value.indexOf("Tool") !== -1) return 6
|
||||||
|
if (value.indexOf("ToolTip") !== -1) return 7
|
||||||
|
if (value.indexOf("SplashScreen") !== -1) return 8
|
||||||
|
if (value.indexOf("Desktop") !== -1) return 9
|
||||||
|
if (value.indexOf("SubWindow") !== -1) return 10
|
||||||
|
if (value.indexOf("ForeignWindow") !== -1) return 11
|
||||||
|
if (value.indexOf("CoverWindow") !== -1) return 12
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function evaluateValue() {
|
||||||
|
flagsComboBox.block = true
|
||||||
|
flagsComboBox.currentIndex = indexOfFlags()
|
||||||
|
flagsComboBox.block = false
|
||||||
|
}
|
||||||
|
|
||||||
|
implicitWidth: StudioTheme.Values.singleControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
width: implicitWidth
|
||||||
|
labelColor: flagsComboBox.currentIndex === 0 ? flagsColorLogic.__defaultTextColor
|
||||||
|
: flagsColorLogic.__changedTextColor
|
||||||
|
model: ["Widget", "Window", "Dialog", "Sheet", "Drawer", "Popup", "Tool", "ToolTip",
|
||||||
|
"SplashScreen", "Desktop", "SubWindow", "ForeignWindow", "CoverWindow"]
|
||||||
|
|
||||||
|
ColorLogic { id: flagsColorLogic }
|
||||||
|
|
||||||
|
actionIndicator.icon.color: flagsExtFuncLogic.color
|
||||||
|
actionIndicator.icon.text: flagsExtFuncLogic.glyph
|
||||||
|
actionIndicator.onClicked: flagsExtFuncLogic.show()
|
||||||
|
actionIndicator.forceVisible: flagsExtFuncLogic.menuVisible
|
||||||
|
actionIndicator.visible: true
|
||||||
|
|
||||||
|
ExtendedFunctionLogic {
|
||||||
|
id: flagsExtFuncLogic
|
||||||
|
backendValue: backendValues.flags
|
||||||
|
onReseted: flagsComboBox.currentIndex = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
onActivated: function(index) {
|
||||||
|
if (!flagsComboBox.__isCompleted)
|
||||||
|
return
|
||||||
|
|
||||||
|
flagsComboBox.currentIndex = index
|
||||||
|
flagsComboBox.composeExpressionString()
|
||||||
|
}
|
||||||
|
|
||||||
|
function composeExpressionString() {
|
||||||
|
if (flagsComboBox.block)
|
||||||
|
return
|
||||||
|
|
||||||
|
var expressionStr = ""
|
||||||
|
if (flagsComboBox.currentIndex !== 0) {
|
||||||
|
expressionStr = "Qt." + flagsComboBox.currentText
|
||||||
|
flagsComboBox.backendValue.expression = expressionStr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
flagsComboBox.evaluateValue()
|
||||||
|
flagsComboBox.__isCompleted = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpandingSpacer {}
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyLabel { text: qsTr("Modality") }
|
||||||
|
|
||||||
|
SecondColumnLayout {
|
||||||
|
StudioControls.ComboBox {
|
||||||
|
id: modalityComboBox
|
||||||
|
|
||||||
|
property bool __isCompleted: false
|
||||||
|
|
||||||
|
property variant backendValue: backendValues.modality
|
||||||
|
property variant valueFromBackend: modalityComboBox.backendValue?.value ?? 0
|
||||||
|
property bool isInModel: modalityComboBox.backendValue?.isInModel ?? false
|
||||||
|
property bool isInSubState: modalityComboBox.backendValue?.isInSubState ?? false
|
||||||
|
property bool block: false
|
||||||
|
|
||||||
|
onIsInModelChanged: modalityComboBox.evaluateValue()
|
||||||
|
onIsInSubStateChanged: modalityComboBox.evaluateValue()
|
||||||
|
onBackendValueChanged: modalityComboBox.evaluateValue()
|
||||||
|
onValueFromBackendChanged: modalityComboBox.evaluateValue()
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: modelNodeBackend
|
||||||
|
function onSelectionChanged() { modalityComboBox.evaluateValue() }
|
||||||
|
}
|
||||||
|
|
||||||
|
function indexOfModality() {
|
||||||
|
if (modalityComboBox.backendValue === undefined
|
||||||
|
|| modalityComboBox.backendValue.expression === undefined)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
let value = modalityComboBox.backendValue.expression
|
||||||
|
|
||||||
|
if (value.indexOf("NonModal") !== -1) return 0
|
||||||
|
if (value.indexOf("WindowModal") !== -1) return 1
|
||||||
|
if (value.indexOf("ApplicationModal") !== -1) return 2
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function evaluateValue() {
|
||||||
|
modalityComboBox.block = true
|
||||||
|
modalityComboBox.currentIndex = indexOfModality()
|
||||||
|
modalityComboBox.block = false
|
||||||
|
}
|
||||||
|
|
||||||
|
implicitWidth: StudioTheme.Values.singleControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
width: implicitWidth
|
||||||
|
labelColor: modalityComboBox.currentIndex === 0
|
||||||
|
? modalityColorLogic.__defaultTextColor
|
||||||
|
: modalityColorLogic.__changedTextColor
|
||||||
|
model: ["NonModal", "WindowModal", "ApplicationModal"]
|
||||||
|
|
||||||
|
ColorLogic { id: modalityColorLogic }
|
||||||
|
|
||||||
|
actionIndicator.icon.color: modalityExtFuncLogic.color
|
||||||
|
actionIndicator.icon.text: modalityExtFuncLogic.glyph
|
||||||
|
actionIndicator.onClicked: modalityExtFuncLogic.show()
|
||||||
|
actionIndicator.forceVisible: modalityExtFuncLogic.menuVisible
|
||||||
|
actionIndicator.visible: true
|
||||||
|
|
||||||
|
ExtendedFunctionLogic {
|
||||||
|
id: modalityExtFuncLogic
|
||||||
|
backendValue: backendValues.modality
|
||||||
|
onReseted: modalityComboBox.currentIndex = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
onActivated: function(index) {
|
||||||
|
if (!modalityComboBox.__isCompleted)
|
||||||
|
return
|
||||||
|
|
||||||
|
modalityComboBox.currentIndex = index
|
||||||
|
modalityComboBox.composeExpressionString()
|
||||||
|
}
|
||||||
|
|
||||||
|
function composeExpressionString() {
|
||||||
|
if (modalityComboBox.block)
|
||||||
|
return
|
||||||
|
|
||||||
|
var expressionStr = ""
|
||||||
|
if (modalityComboBox.currentIndex !== 0) {
|
||||||
|
expressionStr = "Qt." + modalityComboBox.currentText
|
||||||
|
modalityComboBox.backendValue.expression = expressionStr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
modalityComboBox.evaluateValue()
|
||||||
|
modalityComboBox.__isCompleted = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpandingSpacer {}
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyLabel { text: qsTr("Visibility") }
|
||||||
|
|
||||||
|
SecondColumnLayout {
|
||||||
|
ComboBox {
|
||||||
|
scope: "Window"
|
||||||
|
model: ["AutomaticVisibility", "Windowed", "Minimized", "Maximized", "FullScreen",
|
||||||
|
"Hidden"]
|
||||||
|
backendValue: backendValues.visibility
|
||||||
|
enabled: backendValues.visibility.isAvailable
|
||||||
|
implicitWidth: StudioTheme.Values.singleControlColumnWidth
|
||||||
|
+ StudioTheme.Values.actionIndicatorWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpandingSpacer {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,29 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2022 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 QtQuick 2.15
|
||||||
|
import "Window" as Original
|
||||||
|
|
||||||
|
Original.WindowSpecifics {}
|
@@ -54,6 +54,7 @@ T.TextField {
|
|||||||
color: StudioTheme.Values.themeTextColor
|
color: StudioTheme.Values.themeTextColor
|
||||||
selectionColor: StudioTheme.Values.themeTextSelectionColor
|
selectionColor: StudioTheme.Values.themeTextSelectionColor
|
||||||
selectedTextColor: StudioTheme.Values.themeTextSelectedTextColor
|
selectedTextColor: StudioTheme.Values.themeTextSelectedTextColor
|
||||||
|
placeholderTextColor: StudioTheme.Values.themePlaceholderTextColor
|
||||||
|
|
||||||
readOnly: false
|
readOnly: false
|
||||||
selectByMouse: true
|
selectByMouse: true
|
||||||
@@ -107,6 +108,23 @@ T.TextField {
|
|||||||
height: actionIndicator.visible ? myTextField.__actionIndicatorHeight : 0
|
height: actionIndicator.visible ? myTextField.__actionIndicatorHeight : 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: placeholder
|
||||||
|
x: myTextField.leftPadding
|
||||||
|
y: myTextField.topPadding
|
||||||
|
width: myTextField.width - (myTextField.leftPadding + myTextField.rightPadding)
|
||||||
|
height: myTextField.height - (myTextField.topPadding + myTextField.bottomPadding)
|
||||||
|
|
||||||
|
text: myTextField.placeholderText
|
||||||
|
font: myTextField.font
|
||||||
|
color: myTextField.placeholderTextColor
|
||||||
|
verticalAlignment: myTextField.verticalAlignment
|
||||||
|
visible: !myTextField.length && !myTextField.preeditText
|
||||||
|
&& (!myTextField.activeFocus || myTextField.horizontalAlignment !== Qt.AlignHCenter)
|
||||||
|
elide: Text.ElideRight
|
||||||
|
renderType: myTextField.renderType
|
||||||
|
}
|
||||||
|
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
id: textFieldBackground
|
id: textFieldBackground
|
||||||
color: StudioTheme.Values.themeControlBackground
|
color: StudioTheme.Values.themeControlBackground
|
||||||
@@ -138,6 +156,7 @@ T.TextField {
|
|||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: myTextField
|
target: myTextField
|
||||||
color: StudioTheme.Values.themeTextColor
|
color: StudioTheme.Values.themeTextColor
|
||||||
|
placeholderTextColor: StudioTheme.Values.themePlaceholderTextColor
|
||||||
}
|
}
|
||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: mouseArea
|
target: mouseArea
|
||||||
@@ -156,6 +175,7 @@ T.TextField {
|
|||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: myTextField
|
target: myTextField
|
||||||
color: StudioTheme.Values.themeTextColor
|
color: StudioTheme.Values.themeTextColor
|
||||||
|
placeholderTextColor: StudioTheme.Values.themePlaceholderTextColor
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
State {
|
State {
|
||||||
@@ -170,6 +190,7 @@ T.TextField {
|
|||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: myTextField
|
target: myTextField
|
||||||
color: StudioTheme.Values.themeTextColor
|
color: StudioTheme.Values.themeTextColor
|
||||||
|
placeholderTextColor: StudioTheme.Values.themePlaceholderTextColor
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
State {
|
State {
|
||||||
@@ -183,6 +204,7 @@ T.TextField {
|
|||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: myTextField
|
target: myTextField
|
||||||
color: StudioTheme.Values.themeTextColor
|
color: StudioTheme.Values.themeTextColor
|
||||||
|
placeholderTextColor: StudioTheme.Values.themePlaceholderTextColorInteraction
|
||||||
}
|
}
|
||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: mouseArea
|
target: mouseArea
|
||||||
@@ -200,6 +222,7 @@ T.TextField {
|
|||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: myTextField
|
target: myTextField
|
||||||
color: StudioTheme.Values.themeTextColorDisabled
|
color: StudioTheme.Values.themeTextColorDisabled
|
||||||
|
placeholderTextColor: StudioTheme.Values.themeTextColorDisabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@@ -33,6 +33,7 @@ SliderPopup 1.0 SliderPopup.qml
|
|||||||
SpinBox 1.0 SpinBox.qml
|
SpinBox 1.0 SpinBox.qml
|
||||||
SpinBoxIndicator 1.0 SpinBoxIndicator.qml
|
SpinBoxIndicator 1.0 SpinBoxIndicator.qml
|
||||||
SpinBoxInput 1.0 SpinBoxInput.qml
|
SpinBoxInput 1.0 SpinBoxInput.qml
|
||||||
|
Switch 1.0 Switch.qml
|
||||||
TabBar 1.0 TabBar.qml
|
TabBar 1.0 TabBar.qml
|
||||||
TabButton 1.0 TabButton.qml
|
TabButton 1.0 TabButton.qml
|
||||||
TextArea 1.0 TextArea.qml
|
TextArea 1.0 TextArea.qml
|
||||||
|
@@ -33,7 +33,7 @@ import Qt.labs.folderlistmodel %{QtQuickVersion}
|
|||||||
QtObject {
|
QtObject {
|
||||||
id: loader
|
id: loader
|
||||||
|
|
||||||
property url fontDirectory: Qt.resolvedUrl("../../" + relativeFontDirectory)
|
property url fontDirectory: Qt.resolvedUrl("../../content/" + relativeFontDirectory)
|
||||||
property string relativeFontDirectory: "fonts"
|
property string relativeFontDirectory: "fonts"
|
||||||
|
|
||||||
function loadFont(url) {
|
function loadFont(url) {
|
||||||
|
@@ -140,8 +140,9 @@ void LauncherInterfacePrivate::doStop()
|
|||||||
m_server->close();
|
m_server->close();
|
||||||
QTC_ASSERT(m_process, return);
|
QTC_ASSERT(m_process, return);
|
||||||
m_socket->shutdown();
|
m_socket->shutdown();
|
||||||
m_process->waitForFinished(3000);
|
m_process->waitForFinished(-1); // Let the process interface finish so that it finishes
|
||||||
ProcessReaper::reap(m_process);
|
// reaping any possible processes it has started.
|
||||||
|
delete m_process;
|
||||||
m_process = nullptr;
|
m_process = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -195,6 +195,7 @@ void ProcessReaper::reap(QProcess *process, int timeoutMs)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProcessReaper::instance();
|
||||||
new Internal::Reaper(process, timeoutMs);
|
new Internal::Reaper(process, timeoutMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -88,18 +88,15 @@ static bool isTimedOut(const chrono::high_resolution_clock::time_point &start,
|
|||||||
return timedOut;
|
return timedOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
static qint64 extractPID(const QByteArray &output, const QString &packageName)
|
static qint64 extractPID(const QString &output, const QString &packageName)
|
||||||
{
|
{
|
||||||
qint64 pid = -1;
|
qint64 pid = -1;
|
||||||
foreach (auto tuple, output.split('\n')) {
|
for (const QString &tuple : output.split('\n')) {
|
||||||
tuple = tuple.simplified();
|
// Make sure to remove null characters which might be present in the provided output
|
||||||
if (!tuple.isEmpty()) {
|
const QStringList parts = tuple.simplified().remove('\0').split(':');
|
||||||
auto parts = tuple.split(':');
|
if (parts.length() == 2 && parts.first() == packageName) {
|
||||||
QString commandName = QString::fromLocal8Bit(parts.first());
|
pid = parts.last().toLongLong();
|
||||||
if (parts.length() == 2 && commandName == packageName) {
|
break;
|
||||||
pid = parts.last().toLongLong();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pid;
|
return pid;
|
||||||
@@ -126,7 +123,7 @@ static void findProcessPID(QFutureInterface<qint64> &fi, QStringList selector,
|
|||||||
QtcProcess proc;
|
QtcProcess proc;
|
||||||
proc.setCommand({adbPath, args});
|
proc.setCommand({adbPath, args});
|
||||||
proc.runBlocking();
|
proc.runBlocking();
|
||||||
const QByteArray out = proc.allRawOutput();
|
const QString out = proc.allOutput();
|
||||||
if (preNougat) {
|
if (preNougat) {
|
||||||
processPID = extractPID(out, packageName);
|
processPID = extractPID(out, packageName);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -1018,9 +1018,12 @@ public:
|
|||||||
m_started = true;
|
m_started = true;
|
||||||
m_finalized = false;
|
m_finalized = false;
|
||||||
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": starting";
|
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": starting";
|
||||||
|
|
||||||
|
// Used by ThreadedSubtaskTimer to mark the end of the whole highlighting operation
|
||||||
|
m_startTimer.restart();
|
||||||
}
|
}
|
||||||
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": subtask started at "
|
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": subtask started at "
|
||||||
<< QDateTime::currentDateTime().toString();
|
<< QDateTime::currentDateTime().time().toString("hh:mm:ss.zzz");
|
||||||
QTC_CHECK(!m_timer.isValid());
|
QTC_CHECK(!m_timer.isValid());
|
||||||
m_timer.start();
|
m_timer.start();
|
||||||
}
|
}
|
||||||
@@ -1033,7 +1036,7 @@ public:
|
|||||||
if (--m_subtasks > 0) // See startSubtask().
|
if (--m_subtasks > 0) // See startSubtask().
|
||||||
return;
|
return;
|
||||||
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": subtask stopped at "
|
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": subtask stopped at "
|
||||||
<< QDateTime::currentDateTime().toString();
|
<< QDateTime::currentDateTime().time().toString("hh:mm:ss.zzz");
|
||||||
QTC_CHECK(m_timer.isValid());
|
QTC_CHECK(m_timer.isValid());
|
||||||
m_elapsedMs += m_timer.elapsed();
|
m_elapsedMs += m_timer.elapsed();
|
||||||
m_timer.invalidate();
|
m_timer.invalidate();
|
||||||
@@ -1041,9 +1044,12 @@ public:
|
|||||||
stopTask();
|
stopTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QElapsedTimer startTimer() const { return m_startTimer; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QString m_task;
|
const QString m_task;
|
||||||
QElapsedTimer m_timer;
|
QElapsedTimer m_timer;
|
||||||
|
QElapsedTimer m_startTimer;
|
||||||
qint64 m_elapsedMs = 0;
|
qint64 m_elapsedMs = 0;
|
||||||
int m_subtasks = 0;
|
int m_subtasks = 0;
|
||||||
bool m_started = false;
|
bool m_started = false;
|
||||||
@@ -1073,7 +1079,7 @@ public:
|
|||||||
class ThreadedSubtaskTimer
|
class ThreadedSubtaskTimer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ThreadedSubtaskTimer(const QString &task) : m_task(task)
|
ThreadedSubtaskTimer(const QString &task, const TaskTimer &taskTimer) : m_task(task), m_taskTimer(taskTimer)
|
||||||
{
|
{
|
||||||
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": starting thread";
|
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": starting thread";
|
||||||
m_timer.start();
|
m_timer.start();
|
||||||
@@ -1083,10 +1089,15 @@ public:
|
|||||||
{
|
{
|
||||||
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": took " << m_timer.elapsed()
|
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": took " << m_timer.elapsed()
|
||||||
<< " ms in dedicated thread";
|
<< " ms in dedicated thread";
|
||||||
|
|
||||||
|
qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": Start to end: "
|
||||||
|
<< m_taskTimer.startTimer().elapsed() << " ms";
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QString m_task;
|
const QString m_task;
|
||||||
QElapsedTimer m_timer;
|
QElapsedTimer m_timer;
|
||||||
|
const TaskTimer &m_taskTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MemoryTreeModel;
|
class MemoryTreeModel;
|
||||||
@@ -1212,6 +1223,13 @@ public:
|
|||||||
: LanguageClientCompletionAssistProcessor(client, snippetsGroup)
|
: LanguageClientCompletionAssistProcessor(client, snippetsGroup)
|
||||||
, m_client(client)
|
, m_client(client)
|
||||||
{
|
{
|
||||||
|
m_timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
~ClangdCompletionAssistProcessor()
|
||||||
|
{
|
||||||
|
qCDebug(clangdLogTiming).noquote().nospace()
|
||||||
|
<< "ClangdCompletionAssistProcessor took: " << m_timer.elapsed() << " ms";
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -1229,6 +1247,7 @@ private:
|
|||||||
const QList<LanguageServerProtocol::CompletionItem> &items) const override;
|
const QList<LanguageServerProtocol::CompletionItem> &items) const override;
|
||||||
|
|
||||||
ClangdClient * const m_client;
|
ClangdClient * const m_client;
|
||||||
|
QElapsedTimer m_timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
QList<AssistProposalItemInterface *>
|
QList<AssistProposalItemInterface *>
|
||||||
@@ -2757,9 +2776,10 @@ static void semanticHighlighter(QFutureInterface<HighlightingResult> &future,
|
|||||||
const QList<ExpandedSemanticToken> &tokens,
|
const QList<ExpandedSemanticToken> &tokens,
|
||||||
const QString &docContents, const AstNode &ast,
|
const QString &docContents, const AstNode &ast,
|
||||||
const QPointer<TextDocument> &textDocument,
|
const QPointer<TextDocument> &textDocument,
|
||||||
int docRevision, const QVersionNumber &clangdVersion)
|
int docRevision, const QVersionNumber &clangdVersion,
|
||||||
|
const TaskTimer &taskTimer)
|
||||||
{
|
{
|
||||||
ThreadedSubtaskTimer t("highlighting");
|
ThreadedSubtaskTimer t("highlighting", taskTimer);
|
||||||
if (future.isCanceled()) {
|
if (future.isCanceled()) {
|
||||||
future.reportFinished();
|
future.reportFinished();
|
||||||
return;
|
return;
|
||||||
@@ -3025,9 +3045,10 @@ void ClangdClient::Private::handleSemanticTokens(TextDocument *doc,
|
|||||||
const auto runner = [tokens, filePath = doc->filePath(),
|
const auto runner = [tokens, filePath = doc->filePath(),
|
||||||
text = doc->document()->toPlainText(), ast,
|
text = doc->document()->toPlainText(), ast,
|
||||||
doc = QPointer(doc), rev = doc->document()->revision(),
|
doc = QPointer(doc), rev = doc->document()->revision(),
|
||||||
clangdVersion = q->versionNumber()] {
|
clangdVersion = q->versionNumber(),
|
||||||
|
this] {
|
||||||
return Utils::runAsync(semanticHighlighter, filePath, tokens, text, ast, doc, rev,
|
return Utils::runAsync(semanticHighlighter, filePath, tokens, text, ast, doc, rev,
|
||||||
clangdVersion);
|
clangdVersion, highlightingTimer);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (isTesting) {
|
if (isTesting) {
|
||||||
|
@@ -2394,8 +2394,9 @@ void EditorManagerPrivate::handleContextChange(const QList<IContext *> &context)
|
|||||||
// the locator line edit) first activates the window and sets focus to its focus widget.
|
// the locator line edit) first activates the window and sets focus to its focus widget.
|
||||||
// Only afterwards the focus is shifted to the widget that received the click.
|
// Only afterwards the focus is shifted to the widget that received the click.
|
||||||
d->m_scheduledCurrentEditor = editor;
|
d->m_scheduledCurrentEditor = editor;
|
||||||
QMetaObject::invokeMethod(d, &EditorManagerPrivate::setCurrentEditorFromContextChange,
|
QTimer::singleShot(QApplication::doubleClickInterval() + 10,
|
||||||
Qt::QueuedConnection);
|
d,
|
||||||
|
&EditorManagerPrivate::setCurrentEditorFromContextChange);
|
||||||
} else {
|
} else {
|
||||||
updateActions();
|
updateActions();
|
||||||
}
|
}
|
||||||
|
@@ -141,8 +141,10 @@ QString DoxygenGenerator::generate(QTextCursor cursor,
|
|||||||
|
|
||||||
QString DoxygenGenerator::generate(QTextCursor cursor, DeclarationAST *decl)
|
QString DoxygenGenerator::generate(QTextCursor cursor, DeclarationAST *decl)
|
||||||
{
|
{
|
||||||
if (const TemplateDeclarationAST * const templDecl = decl->asTemplateDeclaration())
|
if (const TemplateDeclarationAST * const templDecl = decl->asTemplateDeclaration();
|
||||||
|
templDecl && templDecl->declaration) {
|
||||||
decl = templDecl->declaration;
|
decl = templDecl->declaration;
|
||||||
|
}
|
||||||
|
|
||||||
SpecifierAST *spec = nullptr;
|
SpecifierAST *spec = nullptr;
|
||||||
DeclaratorAST *decltr = nullptr;
|
DeclaratorAST *decltr = nullptr;
|
||||||
|
@@ -416,15 +416,6 @@ QQmlComponent *PropertyEditorContextObject::specificQmlComponent()
|
|||||||
return m_qmlComponent;
|
return m_qmlComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PropertyEditorContextObject::setGlobalBaseUrl(const QUrl &newBaseUrl)
|
|
||||||
{
|
|
||||||
if (newBaseUrl == m_globalBaseUrl)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_globalBaseUrl = newBaseUrl;
|
|
||||||
emit globalBaseUrlChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PropertyEditorContextObject::setSpecificsUrl(const QUrl &newSpecificsUrl)
|
void PropertyEditorContextObject::setSpecificsUrl(const QUrl &newSpecificsUrl)
|
||||||
{
|
{
|
||||||
if (newSpecificsUrl == m_specificsUrl)
|
if (newSpecificsUrl == m_specificsUrl)
|
||||||
|
@@ -42,7 +42,6 @@ class PropertyEditorContextObject : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
Q_PROPERTY(QUrl globalBaseUrl READ globalBaseUrl WRITE setGlobalBaseUrl NOTIFY globalBaseUrlChanged)
|
|
||||||
Q_PROPERTY(QUrl specificsUrl READ specificsUrl WRITE setSpecificsUrl NOTIFY specificsUrlChanged)
|
Q_PROPERTY(QUrl specificsUrl READ specificsUrl WRITE setSpecificsUrl NOTIFY specificsUrlChanged)
|
||||||
|
|
||||||
Q_PROPERTY(QString specificQmlData READ specificQmlData WRITE setSpecificQmlData NOTIFY specificQmlDataChanged)
|
Q_PROPERTY(QString specificQmlData READ specificQmlData WRITE setSpecificQmlData NOTIFY specificQmlDataChanged)
|
||||||
@@ -68,7 +67,6 @@ class PropertyEditorContextObject : public QObject
|
|||||||
public:
|
public:
|
||||||
PropertyEditorContextObject(QObject *parent = nullptr);
|
PropertyEditorContextObject(QObject *parent = nullptr);
|
||||||
|
|
||||||
QUrl globalBaseUrl() const {return m_globalBaseUrl; }
|
|
||||||
QUrl specificsUrl() const {return m_specificsUrl; }
|
QUrl specificsUrl() const {return m_specificsUrl; }
|
||||||
QString specificQmlData() const {return m_specificQmlData; }
|
QString specificQmlData() const {return m_specificQmlData; }
|
||||||
QString stateName() const {return m_stateName; }
|
QString stateName() const {return m_stateName; }
|
||||||
@@ -122,7 +120,6 @@ public:
|
|||||||
bool hasAliasExport() const { return m_aliasExport; }
|
bool hasAliasExport() const { return m_aliasExport; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void globalBaseUrlChanged();
|
|
||||||
void specificsUrlChanged();
|
void specificsUrlChanged();
|
||||||
void specificQmlDataChanged();
|
void specificQmlDataChanged();
|
||||||
void stateNameChanged();
|
void stateNameChanged();
|
||||||
@@ -139,7 +136,6 @@ signals:
|
|||||||
void hasActiveTimelineChanged();
|
void hasActiveTimelineChanged();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setGlobalBaseUrl(const QUrl &newBaseUrl);
|
|
||||||
|
|
||||||
void setSpecificsUrl(const QUrl &newSpecificsUrl);
|
void setSpecificsUrl(const QUrl &newSpecificsUrl);
|
||||||
|
|
||||||
@@ -161,7 +157,6 @@ public slots:
|
|||||||
void setHasAliasExport(bool hasAliasExport);
|
void setHasAliasExport(bool hasAliasExport);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QUrl m_globalBaseUrl;
|
|
||||||
QUrl m_specificsUrl;
|
QUrl m_specificsUrl;
|
||||||
|
|
||||||
QString m_specificQmlData;
|
QString m_specificQmlData;
|
||||||
|
@@ -549,8 +549,6 @@ void PropertyEditorQmlBackend::initialSetup(const TypeName &typeName, const QUrl
|
|||||||
contextObject()->setIsBaseState(true);
|
contextObject()->setIsBaseState(true);
|
||||||
|
|
||||||
contextObject()->setSpecificQmlData(QStringLiteral(""));
|
contextObject()->setSpecificQmlData(QStringLiteral(""));
|
||||||
|
|
||||||
contextObject()->setGlobalBaseUrl(QUrl());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString PropertyEditorQmlBackend::propertyEditorResourcesPath()
|
QString PropertyEditorQmlBackend::propertyEditorResourcesPath()
|
||||||
|
@@ -119,18 +119,13 @@ void PropertyEditorView::setupPane(const TypeName &typeName)
|
|||||||
if (!qmlBackend) {
|
if (!qmlBackend) {
|
||||||
qmlBackend = new PropertyEditorQmlBackend(this);
|
qmlBackend = new PropertyEditorQmlBackend(this);
|
||||||
|
|
||||||
qmlBackend->context()->setContextProperty("finishedNotify", QVariant(false) );
|
|
||||||
qmlBackend->initialSetup(typeName, qmlSpecificsFile, this);
|
qmlBackend->initialSetup(typeName, qmlSpecificsFile, this);
|
||||||
qmlBackend->setSource(qmlFile);
|
qmlBackend->setSource(qmlFile);
|
||||||
qmlBackend->context()->setContextProperty("finishedNotify", QVariant(true) );
|
|
||||||
|
|
||||||
m_stackedWidget->addWidget(qmlBackend->widget());
|
m_stackedWidget->addWidget(qmlBackend->widget());
|
||||||
m_qmlBackendHash.insert(qmlFile.toString(), qmlBackend);
|
m_qmlBackendHash.insert(qmlFile.toString(), qmlBackend);
|
||||||
} else {
|
} else {
|
||||||
qmlBackend->context()->setContextProperty("finishedNotify", QVariant(false) );
|
|
||||||
|
|
||||||
qmlBackend->initialSetup(typeName, qmlSpecificsFile, this);
|
qmlBackend->initialSetup(typeName, qmlSpecificsFile, this);
|
||||||
qmlBackend->context()->setContextProperty("finishedNotify", QVariant(true) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -499,14 +494,12 @@ void PropertyEditorView::setupQmlBackend()
|
|||||||
} else {
|
} else {
|
||||||
qmlObjectNode.reset(new QmlObjectNode);
|
qmlObjectNode.reset(new QmlObjectNode);
|
||||||
}
|
}
|
||||||
currentQmlBackend->context()->setContextProperty("finishedNotify", QVariant(false));
|
|
||||||
if (specificQmlData.isEmpty())
|
if (specificQmlData.isEmpty())
|
||||||
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
||||||
|
|
||||||
currentQmlBackend->contextObject()->setGlobalBaseUrl(qmlFile);
|
|
||||||
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
||||||
currentQmlBackend->setSource(qmlFile);
|
currentQmlBackend->setSource(qmlFile);
|
||||||
currentQmlBackend->context()->setContextProperty("finishedNotify", QVariant(true));
|
|
||||||
} else {
|
} else {
|
||||||
QScopedPointer<QmlObjectNode> qmlObjectNode;
|
QScopedPointer<QmlObjectNode> qmlObjectNode;
|
||||||
if (m_selectedNode.isValid())
|
if (m_selectedNode.isValid())
|
||||||
@@ -514,18 +507,14 @@ void PropertyEditorView::setupQmlBackend()
|
|||||||
else
|
else
|
||||||
qmlObjectNode.reset(new QmlObjectNode);
|
qmlObjectNode.reset(new QmlObjectNode);
|
||||||
|
|
||||||
currentQmlBackend->context()->setContextProperty("finishedNotify", QVariant(false));
|
|
||||||
if (specificQmlData.isEmpty())
|
if (specificQmlData.isEmpty())
|
||||||
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
||||||
currentQmlBackend->setup(*qmlObjectNode, currentStateName, qmlSpecificsFile, this);
|
currentQmlBackend->setup(*qmlObjectNode, currentStateName, qmlSpecificsFile, this);
|
||||||
currentQmlBackend->contextObject()->setGlobalBaseUrl(qmlFile);
|
|
||||||
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_stackedWidget->setCurrentWidget(currentQmlBackend->widget());
|
m_stackedWidget->setCurrentWidget(currentQmlBackend->widget());
|
||||||
|
|
||||||
currentQmlBackend->context()->setContextProperty("finishedNotify", QVariant(true));
|
|
||||||
|
|
||||||
currentQmlBackend->contextObject()->triggerSelectionChanged();
|
currentQmlBackend->contextObject()->triggerSelectionChanged();
|
||||||
|
|
||||||
m_qmlBackEndForCurrentType = currentQmlBackend;
|
m_qmlBackEndForCurrentType = currentQmlBackend;
|
||||||
|
@@ -91,31 +91,4 @@ void Quick2PropertyEditorView::registerQmlTypes()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Quick2PropertyEditorView::event(QEvent *e)
|
|
||||||
{
|
|
||||||
static std::vector<QKeySequence> overrideSequences = { QKeySequence(Qt::SHIFT + Qt::Key_Up),
|
|
||||||
QKeySequence(Qt::SHIFT + Qt::Key_Down),
|
|
||||||
QKeySequence(Qt::CTRL + Qt::Key_Up),
|
|
||||||
QKeySequence(Qt::CTRL + Qt::Key_Down)
|
|
||||||
};
|
|
||||||
|
|
||||||
if (e->type() == QEvent::ShortcutOverride) {
|
|
||||||
auto keyEvent = static_cast<QKeyEvent *>(e);
|
|
||||||
|
|
||||||
static const Qt::KeyboardModifiers relevantModifiers = Qt::ShiftModifier
|
|
||||||
| Qt::ControlModifier
|
|
||||||
| Qt::AltModifier
|
|
||||||
| Qt::MetaModifier;
|
|
||||||
|
|
||||||
QKeySequence keySqeuence(keyEvent->key() | (keyEvent->modifiers() & relevantModifiers));
|
|
||||||
for (const QKeySequence &overrideSequence : overrideSequences)
|
|
||||||
if (keySqeuence.matches(overrideSequence)) {
|
|
||||||
keyEvent->accept();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return QQuickWidget::event(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
} //QmlDesigner
|
} //QmlDesigner
|
||||||
|
@@ -38,9 +38,6 @@ public:
|
|||||||
explicit Quick2PropertyEditorView(QWidget *parent = nullptr);
|
explicit Quick2PropertyEditorView(QWidget *parent = nullptr);
|
||||||
|
|
||||||
static void registerQmlTypes();
|
static void registerQmlTypes();
|
||||||
|
|
||||||
protected:
|
|
||||||
bool event(QEvent *e) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} //QmlDesigner
|
} //QmlDesigner
|
||||||
|
@@ -30,10 +30,16 @@
|
|||||||
#include "iwidgetplugin.h"
|
#include "iwidgetplugin.h"
|
||||||
|
|
||||||
#include <coreplugin/messagebox.h>
|
#include <coreplugin/messagebox.h>
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
|
#include <utils/filepath.h>
|
||||||
|
|
||||||
#include "pluginmanager/widgetpluginmanager.h"
|
#include "pluginmanager/widgetpluginmanager.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QDirIterator>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -43,6 +49,30 @@ enum {
|
|||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
|
||||||
|
static QString globalMetaInfoPath()
|
||||||
|
{
|
||||||
|
#ifdef SHARE_QML_PATH
|
||||||
|
if (qEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE"))
|
||||||
|
return QLatin1String(SHARE_QML_PATH) + "/globalMetaInfo";
|
||||||
|
#endif
|
||||||
|
return Core::ICore::resourcePath("qmldesigner/globalMetaInfo").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils::FilePaths allGlobalMetaInfoFiles()
|
||||||
|
{
|
||||||
|
static Utils::FilePaths paths;
|
||||||
|
|
||||||
|
if (!paths.isEmpty())
|
||||||
|
return paths;
|
||||||
|
|
||||||
|
QDirIterator it(globalMetaInfoPath(), { "*.metainfo" }, QDir::Files, QDirIterator::Subdirectories);
|
||||||
|
while (it.hasNext())
|
||||||
|
paths.append(Utils::FilePath::fromString(it.next()));
|
||||||
|
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
class MetaInfoPrivate
|
class MetaInfoPrivate
|
||||||
{
|
{
|
||||||
Q_DISABLE_COPY(MetaInfoPrivate)
|
Q_DISABLE_COPY(MetaInfoPrivate)
|
||||||
@@ -99,6 +129,19 @@ void MetaInfoPrivate::parseItemLibraryDescriptions()
|
|||||||
errorMessage);
|
errorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Utils::FilePaths allMetaInfoFiles = allGlobalMetaInfoFiles();
|
||||||
|
for (const Utils::FilePath &path : allMetaInfoFiles) {
|
||||||
|
Internal::MetaInfoReader reader(*m_q);
|
||||||
|
try {
|
||||||
|
reader.readMetaInfoFile(path.toString());
|
||||||
|
} catch (const InvalidMetaInfoException &e) {
|
||||||
|
qWarning() << e.description();
|
||||||
|
const QString errorMessage = path.toString() + QLatin1Char('\n') + QLatin1Char('\n') + reader.errors().join(QLatin1Char('\n'));
|
||||||
|
Core::AsynchronousMessageBox::warning(QCoreApplication::translate("QmlDesigner::Internal::MetaInfoPrivate", "Invalid meta info"),
|
||||||
|
errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -196,7 +196,8 @@ static bool isIdToAvoid(const QString& id)
|
|||||||
"texture",
|
"texture",
|
||||||
"shaderInfo",
|
"shaderInfo",
|
||||||
"sprite",
|
"sprite",
|
||||||
"spriteSequence"
|
"spriteSequence",
|
||||||
|
"baseState"
|
||||||
};
|
};
|
||||||
|
|
||||||
return ids.contains(id);
|
return ids.contains(id);
|
||||||
|
@@ -335,7 +335,7 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
|||||||
if (!newQmlObjectNode.isValid())
|
if (!newQmlObjectNode.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
newQmlObjectNode.setId(view->model()->generateNewId(itemLibraryEntry.name()));
|
newQmlObjectNode.modelNode().setIdWithoutRefactoring(view->model()->generateNewId(itemLibraryEntry.name()));
|
||||||
|
|
||||||
for (const auto &propertyBindingEntry : propertyBindingList)
|
for (const auto &propertyBindingEntry : propertyBindingList)
|
||||||
newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second);
|
newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second);
|
||||||
|
@@ -958,6 +958,12 @@ static QList<QmlDesigner::Import> generatePossibleLibraryImports(const QHash<QSt
|
|||||||
int majorVersion = importKey.majorVersion;
|
int majorVersion = importKey.majorVersion;
|
||||||
if (majorVersion >= 0) {
|
if (majorVersion >= 0) {
|
||||||
int minorVersion = (importKey.minorVersion == LanguageUtils::ComponentVersion::NoVersion) ? 0 : importKey.minorVersion;
|
int minorVersion = (importKey.minorVersion == LanguageUtils::ComponentVersion::NoVersion) ? 0 : importKey.minorVersion;
|
||||||
|
|
||||||
|
if (libraryName.contains("QtQuick.Studio")) {
|
||||||
|
majorVersion = 1;
|
||||||
|
minorVersion = 0;
|
||||||
|
}
|
||||||
|
|
||||||
QString version = QStringLiteral("%1.%2").arg(majorVersion).arg(minorVersion);
|
QString version = QStringLiteral("%1.%2").arg(majorVersion).arg(minorVersion);
|
||||||
if (!libraryName.endsWith(".impl"))
|
if (!libraryName.endsWith(".impl"))
|
||||||
possibleImports.append(QmlDesigner::Import::createLibraryImport(libraryName, version));
|
possibleImports.append(QmlDesigner::Import::createLibraryImport(libraryName, version));
|
||||||
|
@@ -26,7 +26,14 @@ MetaInfo {
|
|||||||
"QtQuick.Controls.Imagine",
|
"QtQuick.Controls.Imagine",
|
||||||
"QtQuick.Controls.Universal",
|
"QtQuick.Controls.Universal",
|
||||||
"QtQuick.Controls.Material",
|
"QtQuick.Controls.Material",
|
||||||
"QtQuick.Controls.NativeStyle"
|
"QtQuick.Controls.NativeStyle",
|
||||||
|
"QtQuick.NativeStyle",
|
||||||
|
"QtRemoteObjects",
|
||||||
|
"Qt5Compat.GraphicalEffects",
|
||||||
|
"QtQuick.Templates",
|
||||||
|
"QtQuick.Shapes",
|
||||||
|
"QtQuick.Studio.EventSystem",
|
||||||
|
"QtQuick.Studio.EventSimulator"
|
||||||
]
|
]
|
||||||
|
|
||||||
showTagsForImports: [
|
showTagsForImports: [
|
||||||
|
@@ -99,6 +99,8 @@ QdsNewDialog::QdsNewDialog(QWidget *parent)
|
|||||||
QObject::connect(&m_wizard, &WizardHandler::statusMessageChanged, this, &QdsNewDialog::onStatusMessageChanged);
|
QObject::connect(&m_wizard, &WizardHandler::statusMessageChanged, this, &QdsNewDialog::onStatusMessageChanged);
|
||||||
QObject::connect(&m_wizard, &WizardHandler::projectCanBeCreated, this, &QdsNewDialog::onProjectCanBeCreatedChanged);
|
QObject::connect(&m_wizard, &WizardHandler::projectCanBeCreated, this, &QdsNewDialog::onProjectCanBeCreatedChanged);
|
||||||
|
|
||||||
|
m_dialog->installEventFilter(this);
|
||||||
|
|
||||||
QObject::connect(&m_wizard, &WizardHandler::wizardCreationFailed, this, [this]() {
|
QObject::connect(&m_wizard, &WizardHandler::wizardCreationFailed, this, [this]() {
|
||||||
QMessageBox::critical(m_dialog, tr("New project"), tr("Failed to initialize data"));
|
QMessageBox::critical(m_dialog, tr("New project"), tr("Failed to initialize data"));
|
||||||
reject();
|
reject();
|
||||||
@@ -110,6 +112,17 @@ QdsNewDialog::QdsNewDialog(QWidget *parent)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QdsNewDialog::eventFilter(QObject *obj, QEvent *event)
|
||||||
|
{
|
||||||
|
if (obj == m_dialog && event->type() == QEvent::KeyPress
|
||||||
|
&& static_cast<QKeyEvent *>(event)->key() == Qt::Key_Escape) {
|
||||||
|
reject();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void QdsNewDialog::onDeletingWizard()
|
void QdsNewDialog::onDeletingWizard()
|
||||||
{
|
{
|
||||||
m_screenSizeModel->setBackendModel(nullptr);
|
m_screenSizeModel->setBackendModel(nullptr);
|
||||||
|
@@ -42,6 +42,7 @@ class QStandardItemModel;
|
|||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace StudioWelcome {
|
namespace StudioWelcome {
|
||||||
|
|
||||||
class QdsNewDialog : public QObject, public Core::NewDialog
|
class QdsNewDialog : public QObject, public Core::NewDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -151,6 +152,7 @@ private:
|
|||||||
QString projectDescription() const { return m_qmlProjectDescription; }
|
QString projectDescription() const { return m_qmlProjectDescription; }
|
||||||
|
|
||||||
void updateScreenSizes();
|
void updateScreenSizes();
|
||||||
|
bool eventFilter(QObject *obj, QEvent *ev) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onDeletingWizard();
|
void onDeletingWizard();
|
||||||
|
@@ -256,7 +256,7 @@ extend_qtc_executable(qml2puppet
|
|||||||
qmlprivategate_56.cpp qmlprivategate.h
|
qmlprivategate_56.cpp qmlprivategate.h
|
||||||
)
|
)
|
||||||
|
|
||||||
if(DEFINED MULTILANGUAGE_SUPPORT_SUBDIRECTORY)
|
if(DEFINED MULTILANGUAGE_SUPPORT_SUBDIRECTORY AND Qt6_VERSION VERSION_GREATER_EQUAL 6.2.1)
|
||||||
add_subdirectory(${MULTILANGUAGE_SUPPORT_SUBDIRECTORY} multilanguagesupport_static_build)
|
add_subdirectory(${MULTILANGUAGE_SUPPORT_SUBDIRECTORY} multilanguagesupport_static_build)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@@ -46,10 +46,10 @@ def getWelcomeScreenSideBarButton(buttonLabel, isUrlButton = False):
|
|||||||
"unnamed='1'}")
|
"unnamed='1'}")
|
||||||
return __getWelcomeScreenButtonHelper__(buttonLabel, sideBar, isUrlButton)
|
return __getWelcomeScreenButtonHelper__(buttonLabel, sideBar, isUrlButton)
|
||||||
|
|
||||||
def getWelcomeScreenMainButton(buttonLabel):
|
def getWelcomeScreenBottomButton(buttonLabel):
|
||||||
stackedWidget = waitForObject(":Qt Creator.WelcomeScreenStackedWidget")
|
bottomArea = waitForObject("{type='Welcome::Internal::BottomArea' unnamed='1' "
|
||||||
currentStackWidget = stackedWidget.currentWidget()
|
"window=':Qt Creator_Core::Internal::MainWindow'}")
|
||||||
return __getWelcomeScreenButtonHelper__(buttonLabel, currentStackWidget)
|
return __getWelcomeScreenButtonHelper__(buttonLabel, bottomArea, False)
|
||||||
|
|
||||||
def getWelcomeTreeView(treeViewLabel):
|
def getWelcomeTreeView(treeViewLabel):
|
||||||
try:
|
try:
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
# Copyright (C) 2016 The Qt Company Ltd.
|
# Copyright (C) 2022 The Qt Company Ltd.
|
||||||
# Contact: https://www.qt.io/licensing/
|
# Contact: https://www.qt.io/licensing/
|
||||||
#
|
#
|
||||||
# This file is part of Qt Creator.
|
# This file is part of Qt Creator.
|
||||||
@@ -78,10 +78,8 @@ def main():
|
|||||||
continue
|
continue
|
||||||
if not startCreatorVerifyingClang(useClang):
|
if not startCreatorVerifyingClang(useClang):
|
||||||
continue
|
continue
|
||||||
targetToChoose = Targets.DESKTOP_4_8_7_DEFAULT
|
projectName = createNewNonQtProject(tempDir(), "project-csup03",
|
||||||
if not qt4Available:
|
[Targets.DESKTOP_5_14_1_DEFAULT])
|
||||||
targetToChoose = Targets.DESKTOP_5_14_1_DEFAULT
|
|
||||||
projectName = createNewNonQtProject(tempDir(), "project-csup03", [targetToChoose])
|
|
||||||
checkCodeModelSettings(useClang)
|
checkCodeModelSettings(useClang)
|
||||||
openDocument("%s.Sources.main\\.cpp" % projectName)
|
openDocument("%s.Sources.main\\.cpp" % projectName)
|
||||||
editor = getEditorForFileSuffix("main.cpp")
|
editor = getEditorForFileSuffix("main.cpp")
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
source("../../shared/qtcreator.py")
|
source("../../shared/qtcreator.py")
|
||||||
|
|
||||||
getStarted = 'Get Started Now'
|
getStarted = 'Get Started'
|
||||||
|
|
||||||
def clickItemVerifyHelpCombo(button, expectedHelpComboRegex, testDetails):
|
def clickItemVerifyHelpCombo(button, expectedHelpComboRegex, testDetails):
|
||||||
global getStarted
|
global getStarted
|
||||||
@@ -41,7 +41,7 @@ def clickItemVerifyHelpCombo(button, expectedHelpComboRegex, testDetails):
|
|||||||
"Verifying: '%s' button is being displayed." % getStarted)
|
"Verifying: '%s' button is being displayed." % getStarted)
|
||||||
def buttonActive(button):
|
def buttonActive(button):
|
||||||
# colors of the default theme for active button on Welcome page
|
# colors of the default theme for active button on Welcome page
|
||||||
(activeRed, activeGreen, activeBlue) = (64, 65, 66)
|
(activeRed, activeGreen, activeBlue) = (69, 206, 85)
|
||||||
# QPalette::Window (used background color of Welcome page buttons)
|
# QPalette::Window (used background color of Welcome page buttons)
|
||||||
enumQPaletteWindow = 10
|
enumQPaletteWindow = 10
|
||||||
color = button.palette.color(enumQPaletteWindow)
|
color = button.palette.color(enumQPaletteWindow)
|
||||||
@@ -92,8 +92,8 @@ def main():
|
|||||||
|
|
||||||
# select Projects and roughly check this
|
# select Projects and roughly check this
|
||||||
switchToSubMode('Projects')
|
switchToSubMode('Projects')
|
||||||
for button in ['New', 'Open']:
|
for button in ['Create Project...', 'Open Project...']:
|
||||||
wsButtonFrame, wsButtonLabel = getWelcomeScreenMainButton(button)
|
wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(button)
|
||||||
if test.verify(all((wsButtonFrame, wsButtonLabel)),
|
if test.verify(all((wsButtonFrame, wsButtonLabel)),
|
||||||
"Verified whether '%s' button is shown." % button):
|
"Verified whether '%s' button is shown." % button):
|
||||||
test.verify(not buttonActive(wsButtonFrame),
|
test.verify(not buttonActive(wsButtonFrame),
|
||||||
@@ -111,7 +111,7 @@ def main():
|
|||||||
'User Guide':'qthelp://org.qt-project.qtcreator/doc/index.html'
|
'User Guide':'qthelp://org.qt-project.qtcreator/doc/index.html'
|
||||||
}
|
}
|
||||||
for text, url in textUrls.items():
|
for text, url in textUrls.items():
|
||||||
button, label = getWelcomeScreenSideBarButton(text, True)
|
button, label = getWelcomeScreenBottomButton(text)
|
||||||
if test.verify(all((button, label)),
|
if test.verify(all((button, label)),
|
||||||
"Verifying whether link button (%s) exists." % text):
|
"Verifying whether link button (%s) exists." % text):
|
||||||
test.compare(str(button.toolTip), url, "Verifying URL for %s" % text)
|
test.compare(str(button.toolTip), url, "Verifying URL for %s" % text)
|
||||||
@@ -135,7 +135,7 @@ def main():
|
|||||||
switchToSubMode('Examples')
|
switchToSubMode('Examples')
|
||||||
test.verify(waitForButtonsState(False, True, False), "Buttons' states have changed.")
|
test.verify(waitForButtonsState(False, True, False), "Buttons' states have changed.")
|
||||||
|
|
||||||
expect = (("QTableView", "unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'",
|
expect = (("QListView", "unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'",
|
||||||
"examples list"),
|
"examples list"),
|
||||||
("QLineEdit", "placeholderText='Search in Examples...'", "examples search line edit"),
|
("QLineEdit", "placeholderText='Search in Examples...'", "examples search line edit"),
|
||||||
("QComboBox", "currentText~='.*Qt.*'", "Qt version combo box"))
|
("QComboBox", "currentText~='.*Qt.*'", "Qt version combo box"))
|
||||||
@@ -149,7 +149,7 @@ def main():
|
|||||||
# select Tutorials and roughly check them
|
# select Tutorials and roughly check them
|
||||||
switchToSubMode('Tutorials')
|
switchToSubMode('Tutorials')
|
||||||
test.verify(waitForButtonsState(False, False, True), "Buttons' states have changed.")
|
test.verify(waitForButtonsState(False, False, True), "Buttons' states have changed.")
|
||||||
expect = (("QTableView", "unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'",
|
expect = (("QListView", "unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'",
|
||||||
"tutorials list"),
|
"tutorials list"),
|
||||||
("QLineEdit", "placeholderText='Search in Tutorials...'",
|
("QLineEdit", "placeholderText='Search in Tutorials...'",
|
||||||
"tutorials search line edit"))
|
"tutorials search line edit"))
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
# Copyright (C) 2016 The Qt Company Ltd.
|
# Copyright (C) 2022 The Qt Company Ltd.
|
||||||
# Contact: https://www.qt.io/licensing/
|
# Contact: https://www.qt.io/licensing/
|
||||||
#
|
#
|
||||||
# This file is part of Qt Creator.
|
# This file is part of Qt Creator.
|
||||||
@@ -36,10 +36,7 @@ def main():
|
|||||||
return
|
return
|
||||||
|
|
||||||
runButton = findObject(':*Qt Creator.Run_Core::Internal::FancyToolButton')
|
runButton = findObject(':*Qt Creator.Run_Core::Internal::FancyToolButton')
|
||||||
targetToChoose = Targets.DESKTOP_4_8_7_DEFAULT
|
openQmakeProject(pathSpeedcrunch, [Targets.DESKTOP_5_14_1_DEFAULT])
|
||||||
if not qt4Available:
|
|
||||||
targetToChoose = Targets.DESKTOP_5_14_1_DEFAULT
|
|
||||||
openQmakeProject(pathSpeedcrunch, [targetToChoose])
|
|
||||||
# Wait for parsing to complete
|
# Wait for parsing to complete
|
||||||
waitFor("runButton.enabled", 30000)
|
waitFor("runButton.enabled", 30000)
|
||||||
# Starting before opening, because this is where Creator froze (QTCREATORBUG-10733)
|
# Starting before opening, because this is where Creator froze (QTCREATORBUG-10733)
|
||||||
|
Reference in New Issue
Block a user