// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 import QtQuick 2.15 import QtQuick.Layouts 1.15 import HelperWidgets 2.0 import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme Section { id: root property bool showIsWrapping: false // TODO not used property bool showElide: false property bool showVerticalAlignment: false property bool showFormatProperty: false property bool showFontSizeMode: false property bool showLineHeight: false property bool richTextEditorAvailable: false anchors.left: parent.left anchors.right: parent.right caption: qsTr("Text") SectionLayout { PropertyLabel { text: qsTr("Text") } SecondColumnLayout { LineEdit { implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: implicitWidth backendValue: backendValues.text } Spacer { implicitWidth: StudioTheme.Values.twoControlColumnGap } Rectangle { id: richTextEditorIndicator visible: root.richTextEditorAvailable color: "transparent" border.color: "transparent" implicitWidth: StudioTheme.Values.iconAreaWidth // TODO dedicated value implicitHeight: StudioTheme.Values.height // TODO dedicated value Label { id: richTextEditorIcon anchors.fill: parent text: StudioTheme.Constants.edit color: StudioTheme.Values.themeTextColor font.family: StudioTheme.Constants.iconFont.family font.pixelSize: StudioTheme.Values.myIconFontSize + 4 // TODO verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter states: [ State { name: "default" when: !richTextEditorMouseArea.containsMouse PropertyChanges { target: richTextEditorIcon color: StudioTheme.Values.themeLinkIndicatorColor } }, State { name: "hover" when: richTextEditorMouseArea.containsMouse PropertyChanges { target: richTextEditorIcon color: StudioTheme.Values.themeLinkIndicatorColorHover } } ] } MouseArea { id: richTextEditorMouseArea anchors.fill: parent hoverEnabled: true onClicked: richTextDialogLoader.show() } } ExpandingSpacer {} RichTextEditor { onRejected: hideWidget() onAccepted: hideWidget() } } PropertyLabel { text: qsTr("Text color") } ColorEditor { backendValue: backendValues.color supportGradient: false } PropertyLabel { visible: root.showVerticalAlignment text: qsTr("Wrap mode") tooltip: qsTr("Sets how overflowing text is handled.") blockedByTemplate: !backendValues.wrapMode.isAvailable } SecondColumnLayout { ComboBox { visible: root.showVerticalAlignment implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: implicitWidth backendValue: backendValues.wrapMode scope: "Text" model: ["NoWrap", "WordWrap", "WrapAnywhere", "Wrap"] enabled: backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { visible: root.showElide text: qsTr("Elide") tooltip: qsTr("Sets how to indicate that more text is available.") blockedByTemplate: !backendValues.elide.isAvailable } SecondColumnLayout { ComboBox { visible: root.showElide implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: implicitWidth backendValue: backendValues.elide scope: "Text" model: ["ElideNone", "ElideLeft", "ElideMiddle", "ElideRight"] enabled: backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { visible: root.showElide text: qsTr("Max line count") tooltip: qsTr("Sets the max number of lines that the text component shows.") blockedByTemplate: !backendValues.maximumLineCount.isAvailable } SecondColumnLayout { SpinBox { visible: root.showElide implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth backendValue: backendValues.maximumLineCount minimumValue: 0 maximumValue: 10000 decimals: 0 enabled: backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Alignment H") } SecondColumnLayout { AlignmentHorizontalButtons {} ExpandingSpacer {} } PropertyLabel { text: qsTr("Alignment V") } SecondColumnLayout { AlignmentVerticalButtons { visible: root.showVerticalAlignment } ExpandingSpacer {} } PropertyLabel { visible: root.showFormatProperty text: qsTr("Format") tooltip: qsTr("Sets the formatting method of the text.") blockedByTemplate: !backendValues.textFormat.isAvailable } SecondColumnLayout { ComboBox { visible: root.showFormatProperty implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: implicitWidth scope: "Text" model: ["PlainText", "RichText", "AutoText"] backendValue: backendValues.textFormat enabled: backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Render type") tooltip: qsTr("Sets the rendering type for this component.") blockedByTemplate: !backendValues.renderType.isAvailable } SecondColumnLayout { ComboBox { implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: implicitWidth scope: "Text" model: ["QtRendering", "NativeRendering"] backendValue: backendValues.renderType enabled: backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { visible: root.showFontSizeMode text: qsTr("Size mode") tooltip: qsTr("Sets how the font size is determined.") blockedByTemplate: !backendValues.fontSizeMode.isAvailable } SecondColumnLayout { ComboBox { id: fontSizeMode visible: root.showFontSizeMode implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: implicitWidth scope: "Text" model: ["FixedSize", "HorizontalFit", "VerticalFit", "Fit"] backendValue: backendValues.fontSizeMode enabled: backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { visible: root.showFontSizeMode text: qsTr("Min size") tooltip: qsTr("Sets the minimum font size to use. This has no effect when Size mode is set to Fixed.") blockedByTemplate: !backendValues.minimumPixelSize.isAvailable && !backendValues.minimumPointSize.isAvailable } SecondColumnLayout { visible: root.showFontSizeMode SpinBox { enabled: (fontSizeMode.currentIndex !== 0) || backendValue.isAvailable minimumValue: 0 maximumValue: 500 decimals: 0 backendValue: backendValues.minimumPixelSize implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth } Spacer { implicitWidth: StudioTheme.Values.controlLabelGap } ControlLabel { text: "px" tooltip: qsTr("Minimum font pixel size of scaled text.") enabled: backendValues.minimumPixelSize.isAvailable } Spacer { implicitWidth: StudioTheme.Values.controlGap } SpinBox { enabled: (fontSizeMode.currentIndex !== 0) || backendValue.isAvailable minimumValue: 0 maximumValue: 500 decimals: 0 backendValue: backendValues.minimumPointSize implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth } Spacer { implicitWidth: StudioTheme.Values.controlLabelGap } ControlLabel { text: "pt" tooltip: qsTr("Minimum font point size of scaled text.") enabled: backendValues.minimumPointSize.isAvailable } ExpandingSpacer {} } PropertyLabel { visible: root.showLineHeight text: qsTr("Line height") tooltip: qsTr("Line height for the text.") blockedByTemplate: !lineHeightSpinBox.enabled } SecondColumnLayout { visible: root.showLineHeight SpinBox { id: lineHeightSpinBox implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth backendValue: (backendValues.lineHeight === undefined) ? 1.0 : backendValues.lineHeight decimals: 2 minimumValue: 0 maximumValue: 500 stepSize: 0.1 enabled: (backendValues.lineHeight === undefined) ? false : backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { visible: root.showLineHeight text: qsTr("Line height mode") tooltip: qsTr("Sets how to calculate the line height based on the Line height value.") blockedByTemplate: !backendValues.lineHeightMode.isAvailable } SecondColumnLayout { ComboBox { visible: root.showLineHeight scope: "Text" model: ["ProportionalHeight", "FixedHeight"] backendValue: backendValues.lineHeightMode implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: implicitWidth enabled: backendValue.isAvailable } ExpandingSpacer {} } } Loader { id: richTextDialogLoader visible: false active: visible function show() { richTextDialogLoader.visible = true } sourceComponent: Item { id: richTextEditorParent Component.onCompleted: { richTextEditor.showWidget() richTextEditor.richText = backendValues.text.value } RichTextEditor { id: richTextEditor onRejected: { hideWidget() richTextDialogLoader.visible = false } onAccepted: { backendValues.text.value = richTextEditor.richText backendValues.textFormat.setEnumeration("Text", "RichText") hideWidget() richTextDialogLoader.visible = false } } } } }