// 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 anchors.left: parent.left anchors.right: parent.right caption: qsTr("Font") property string fontName: "font" property bool showStyle: false property bool showHinting: true function getBackendValue(name) { return backendValues[root.fontName + "_" + name] } property variant fontFamily: root.getBackendValue("family") property variant pointSize: root.getBackendValue("pointSize") property variant pixelSize: root.getBackendValue("pixelSize") property variant boldStyle: root.getBackendValue("bold") property variant italicStyle: root.getBackendValue("italic") property variant underlineStyle: root.getBackendValue("underline") property variant strikeoutStyle: root.getBackendValue("strikeout") onPointSizeChanged: sizeWidget.setPointPixelSize() onPixelSizeChanged: sizeWidget.setPointPixelSize() SectionLayout { PropertyLabel { text: qsTr("Font") tooltip: qsTr("Sets the font of the text.") } SecondColumnLayout { FontComboBox { id: fontComboBox property string familyName: fontComboBox.backendValue.value backendValue: root.fontFamily implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: fontComboBox.implicitWidth } ExpandingSpacer {} } PropertyLabel { text: qsTr("Size") tooltip: qsTr("Sets the font size in pixels or points.") } SecondColumnLayout { id: sizeWidget property bool selectionFlag: selectionChanged property bool pixelSize: sizeType.currentText === "px" property bool isSetup function setPointPixelSize() { sizeWidget.isSetup = true sizeType.currentIndex = 1 if (root.pixelSize.isInModel) sizeType.currentIndex = 0 sizeWidget.isSetup = false } onSelectionFlagChanged: sizeWidget.setPointPixelSize() Item { id: sizeSpinBoxItem implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: sizeSpinBoxItem.implicitWidth height: sizeSpinBoxPoint.height SpinBox { id: sizeSpinBoxPoint implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: sizeSpinBoxPoint.implicitWidth minimumValue: 0 visible: !sizeWidget.pixelSize z: !sizeWidget.pixelSize ? 1 : 0 maximumValue: 400 backendValue: root.pointSize } SpinBox { id: sizeSpinBoxPixel implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: sizeSpinBoxPixel.implicitWidth minimumValue: 0 visible: sizeWidget.pixelSize z: sizeWidget.pixelSize ? 1 : 0 maximumValue: 400 backendValue: root.pixelSize } } Spacer { implicitWidth: StudioTheme.Values.twoControlColumnGap + StudioTheme.Values.actionIndicatorWidth } StudioControls.ComboBox { id: sizeType implicitWidth: StudioTheme.Values.twoControlColumnWidth width: sizeType.implicitWidth model: ["px", "pt"] actionIndicatorVisible: false onActivated: { if (sizeWidget.isSetup) return if (sizeType.currentText === "px") { root.pointSize.resetValue() root.pixelSize.value = 8 } else { root.pixelSize.resetValue() } } } ExpandingSpacer {} } PropertyLabel { text: qsTr("Emphasis") tooltip: qsTr("Sets the text to bold, italic, underlined, or strikethrough.") blockedByTemplate: !root.boldStyle.isAvailable && !root.italicStyle.isAvailable && !root.underlineStyle.isAvailable && !root.strikeoutStyle.isAvailable } FontStyleButtons { bold: root.boldStyle italic: root.italicStyle underline: root.underlineStyle strikeout: root.strikeoutStyle enabled: !styleNameComboBox.styleSet } PropertyLabel { text: qsTr("Capitalization") tooltip: qsTr("Sets capitalization rules for the text.") blockedByTemplate: !root.getBackendValue("capitalization").isAvailable } SecondColumnLayout { ComboBox { id: capitalizationComboBox implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: capitalizationComboBox.implicitWidth backendValue: root.getBackendValue("capitalization") scope: "Font" model: ["MixedCase", "AllUppercase", "AllLowercase", "SmallCaps", "Capitalize"] enabled: capitalizationComboBox.backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Weight") tooltip: qsTr("Sets the overall thickness of the font.") blockedByTemplate: styleNameComboBox.styleSet } SecondColumnLayout { ComboBox { id: weightComboBox implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: weightComboBox.implicitWidth backendValue: root.getBackendValue("weight") model: ["Normal", "Light", "ExtraLight", "Thin", "Medium", "DemiBold", "Bold", "ExtraBold", "Black"] scope: "Font" enabled: !styleNameComboBox.styleSet } ExpandingSpacer {} } PropertyLabel { text: qsTr("Style name") tooltip: qsTr("Sets the style of the selected font. This is prioritized over Weight and Emphasis.") blockedByTemplate: !styleNameComboBox.enabled } SecondColumnLayout { ComboBox { id: styleNameComboBox property bool styleSet: backendValue.isInModel implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: styleNameComboBox.implicitWidth backendValue: root.getBackendValue("styleName") model: styleNamesForFamily(fontComboBox.familyName) valueType: ComboBox.String enabled: styleNameComboBox.backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { visible: root.showStyle text: qsTr("Style") tooltip: qsTr("Sets the font style.") blockedByTemplate: !styleComboBox.enabled } SecondColumnLayout { visible: root.showStyle ComboBox { id: styleComboBox implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: styleComboBox.implicitWidth backendValue: (backendValues.style === undefined) ? dummyBackendValue : backendValues.style scope: "Text" model: ["Normal", "Outline", "Raised", "Sunken"] enabled: styleComboBox.backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Style color") tooltip: qsTr("Sets the color for the font style.") visible: root.showStyle && backendValues.styleColor.isAvailable } ColorEditor { visible: root.showStyle && backendValues.styleColor.isAvailable backendValue: backendValues.styleColor supportGradient: false } PropertyLabel { visible: root.showHinting text: qsTr("Hinting") tooltip: qsTr("Sets how to interpolate the text to render it more clearly when scaled.") blockedByTemplate: !root.getBackendValue("hintingPreference").isAvailable } SecondColumnLayout { visible: root.showHinting ComboBox { id: hintingPreferenceComboBox implicitWidth: StudioTheme.Values.singleControlColumnWidth + StudioTheme.Values.actionIndicatorWidth width: hintingPreferenceComboBox.implicitWidth backendValue: root.getBackendValue("hintingPreference") scope: "Font" model: ["PreferDefaultHinting", "PreferNoHinting", "PreferVerticalHinting", "PreferFullHinting"] enabled: hintingPreferenceComboBox.backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Letter spacing") tooltip: qsTr("Sets the letter spacing for the text.") blockedByTemplate: !root.getBackendValue("letterSpacing").isAvailable } SecondColumnLayout { SpinBox { id: letterSpacingSpinBox implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth backendValue: root.getBackendValue("letterSpacing") decimals: 2 minimumValue: -500 maximumValue: 500 stepSize: 0.1 enabled: letterSpacingSpinBox.backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Word spacing") tooltip: qsTr("Sets the word spacing for the text.") blockedByTemplate: !root.getBackendValue("wordSpacing").isAvailable } SecondColumnLayout { SpinBox { id: wordSpacingSpinBox implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth backendValue: root.getBackendValue("wordSpacing") decimals: 2 minimumValue: -500 maximumValue: 500 stepSize: 0.1 enabled: wordSpacingSpinBox.backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Auto kerning") tooltip: qsTr("Resolves the gap between texts if turned true.") blockedByTemplate: !root.getBackendValue("kerning").isAvailable } SecondColumnLayout { CheckBox { id: kerningCheckBox text: kerningCheckBox.backendValue.valueToString implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth backendValue: root.getBackendValue("kerning") enabled: kerningCheckBox.backendValue.isAvailable } ExpandingSpacer {} } PropertyLabel { text: qsTr("Prefer shaping") tooltip: qsTr("Toggles the disables font-specific special features.") blockedByTemplate: !root.getBackendValue("preferShaping").isAvailable } SecondColumnLayout { CheckBox { id: preferShapingCheckBox text: preferShapingCheckBox.backendValue.valueToString implicitWidth: StudioTheme.Values.twoControlColumnWidth + StudioTheme.Values.actionIndicatorWidth backendValue: root.getBackendValue("preferShaping") enabled: preferShapingCheckBox.backendValue.isAvailable } ExpandingSpacer {} } } }