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