Warning, /graphics/spectacle/src/Gui/AnnotationOptionsToolBarContents.qml is written in an unsupported language. File is not indexed.
0001 /* SPDX-FileCopyrightText: 2022 Noah Davis <noahadvs@gmail.com>
0002 * SPDX-License-Identifier: LGPL-2.0-or-later
0003 */
0004
0005 import QtQuick
0006 import QtQuick.Controls as QQC
0007 import QtQuick.Templates as T
0008 import org.kde.kirigami as Kirigami
0009 import org.kde.spectacle.private
0010 import "Annotations"
0011
0012 Row {
0013 id: root
0014 readonly property bool useSelectionOptions: AnnotationDocument.tool.type === AnnotationTool.SelectTool || (AnnotationDocument.tool.type === AnnotationTool.TextTool && AnnotationDocument.selectedItem.options & AnnotationTool.TextOption)
0015 property int displayMode: QQC.AbstractButton.TextBesideIcon
0016 property int focusPolicy: Qt.StrongFocus
0017 readonly property bool mirrored: effectiveLayoutDirection === Qt.RightToLeft
0018
0019 clip: childrenRect.width > width || childrenRect.height > height
0020 spacing: Kirigami.Units.mediumSpacing
0021
0022 Timer {
0023 id: commitChangesTimer
0024 interval: 250
0025 onTriggered: AnnotationDocument.selectedItem.commitChanges()
0026 }
0027
0028 Connections {
0029 target: AnnotationDocument
0030 function onSelectedItemWrapperChanged() {
0031 commitChangesTimer.stop()
0032 }
0033 }
0034
0035 component ToolButton: QQC.ToolButton {
0036 implicitHeight: QmlUtils.iconTextButtonHeight
0037 width: display === QQC.ToolButton.IconOnly ? height : implicitWidth
0038 focusPolicy: root.focusPolicy
0039 display: root.displayMode
0040 QQC.ToolTip.text: text
0041 QQC.ToolTip.visible: (hovered || pressed) && display === QQC.ToolButton.IconOnly
0042 QQC.ToolTip.delay: Kirigami.Units.toolTipDelay
0043 }
0044
0045 Loader { // stroke
0046 id: strokeLoader
0047 anchors.verticalCenter: parent.verticalCenter
0048 visible: active
0049 active: useSelectionOptions ?
0050 AnnotationDocument.selectedItem.options & AnnotationTool.StrokeOption
0051 : AnnotationDocument.tool.options & AnnotationTool.StrokeOption
0052 sourceComponent: Row {
0053 spacing: root.spacing
0054
0055 QQC.CheckBox {
0056 anchors.verticalCenter: parent.verticalCenter
0057 text: i18n("Stroke:")
0058 checked: colorRect.color.a > 0
0059 onToggled: if (root.useSelectionOptions) {
0060 AnnotationDocument.selectedItem.strokeColor.a = checked
0061 } else {
0062 AnnotationDocument.tool.strokeColor.a = checked
0063 }
0064 }
0065
0066 QQC.SpinBox {
0067 id: spinBox
0068 function setStrokeWidth() {
0069 if (root.useSelectionOptions
0070 && AnnotationDocument.selectedItem.strokeWidth !== spinBox.value) {
0071 AnnotationDocument.selectedItem.strokeWidth = spinBox.value
0072 commitChangesTimer.restart()
0073 } else {
0074 AnnotationDocument.tool.strokeWidth = spinBox.value
0075 }
0076 }
0077 anchors.verticalCenter: parent.verticalCenter
0078 from: fillLoader.active ? 0 : 1
0079 to: 99
0080 stepSize: 1
0081 value: root.useSelectionOptions ?
0082 AnnotationDocument.selectedItem.strokeWidth
0083 : AnnotationDocument.tool.strokeWidth
0084 textFromValue: (value, locale) => {
0085 // we don't use the locale here because the px suffix
0086 // needs to be treated as a translatable string, which
0087 // doesn't take into account the locale passed in here.
0088 // but it's going to be the application locale
0089 // which ki18n uses so it doesn't matter that much
0090 // unless someone decides to set the locale for a specific
0091 // part of spectacle in the future.
0092 return i18ncp("px: pixels", "%1px", "%1px", Math.round(value))
0093 }
0094 valueFromText: (text, locale) => {
0095 return Number.fromLocaleString(locale, text.replace(/\D/g,''))
0096 }
0097 QQC.ToolTip.text: i18n("Stroke Width")
0098 QQC.ToolTip.visible: hovered
0099 QQC.ToolTip.delay: Kirigami.Units.toolTipDelay
0100 // not using onValueModified because of https://bugreports.qt.io/browse/QTBUG-91281
0101 onValueChanged: Qt.callLater(setStrokeWidth)
0102 Binding {
0103 target: spinBox.contentItem
0104 property: "horizontalAlignment"
0105 value: Text.AlignRight
0106 restoreMode: Binding.RestoreNone
0107 }
0108 }
0109
0110 ToolButton {
0111 anchors.verticalCenter: parent.verticalCenter
0112 display: QQC.ToolButton.IconOnly
0113 QQC.ToolTip.text: i18n("Stroke Color")
0114 Rectangle { // should we use some kind of image provider instead?
0115 id: colorRect
0116 anchors.centerIn: parent
0117 width: Kirigami.Units.gridUnit
0118 height: Kirigami.Units.gridUnit
0119 radius: height / 2
0120 color: root.useSelectionOptions ?
0121 AnnotationDocument.selectedItem.strokeColor
0122 : AnnotationDocument.tool.strokeColor
0123 border.color: Qt.rgba(parent.palette.windowText.r,
0124 parent.palette.windowText.g,
0125 parent.palette.windowText.b, 0.5)
0126 border.width: 1
0127 }
0128 onClicked: {
0129 contextWindow.showColorDialog(AnnotationTool.StrokeOption)
0130 }
0131 }
0132 }
0133 }
0134
0135 QQC.ToolSeparator {
0136 anchors.verticalCenter: parent.verticalCenter
0137 visible: strokeLoader.visible && fillLoader.visible
0138 height: QmlUtils.iconTextButtonHeight
0139 }
0140
0141 Loader { // fill
0142 id: fillLoader
0143 anchors.verticalCenter: parent.verticalCenter
0144 visible: active
0145 active: useSelectionOptions ?
0146 AnnotationDocument.selectedItem.options & AnnotationTool.FillOption
0147 : AnnotationDocument.tool.options & AnnotationTool.FillOption
0148 sourceComponent: Row {
0149 spacing: root.spacing
0150
0151 QQC.CheckBox {
0152 anchors.verticalCenter: parent.verticalCenter
0153 text: i18n("Fill:")
0154 checked: colorRect.color.a > 0
0155 onToggled: if (root.useSelectionOptions) {
0156 AnnotationDocument.selectedItem.fillColor.a = checked
0157 } else {
0158 AnnotationDocument.tool.fillColor.a = checked
0159 }
0160 }
0161
0162 ToolButton {
0163 anchors.verticalCenter: parent.verticalCenter
0164 display: QQC.ToolButton.IconOnly
0165 QQC.ToolTip.text: i18n("Fill Color")
0166 Rectangle {
0167 id: colorRect
0168 anchors.centerIn: parent
0169 width: Kirigami.Units.gridUnit
0170 height: Kirigami.Units.gridUnit
0171 radius: height / 2
0172 color: root.useSelectionOptions ?
0173 AnnotationDocument.selectedItem.fillColor
0174 : AnnotationDocument.tool.fillColor
0175 border.color: Qt.rgba(parent.palette.windowText.r,
0176 parent.palette.windowText.g,
0177 parent.palette.windowText.b, 0.5)
0178 border.width: 1
0179 }
0180 onClicked: {
0181 contextWindow.showColorDialog(AnnotationTool.FillOption)
0182 }
0183 }
0184 }
0185 }
0186
0187 QQC.ToolSeparator {
0188 anchors.verticalCenter: parent.verticalCenter
0189 visible: fillLoader.visible && fontLoader.visible
0190 height: QmlUtils.iconTextButtonHeight
0191 }
0192
0193 Loader { // font
0194 id: fontLoader
0195 anchors.verticalCenter: parent.verticalCenter
0196 visible: active
0197 active: useSelectionOptions ?
0198 AnnotationDocument.selectedItem.options & AnnotationTool.FontOption
0199 : AnnotationDocument.tool.options & AnnotationTool.FontOption
0200 sourceComponent: Row {
0201 spacing: root.spacing
0202
0203 QQC.Label {
0204 leftPadding: root.mirrored ? 0 : parent.spacing
0205 rightPadding: root.mirrored ? parent.spacing : 0
0206 width: contextWindow.dprRound(implicitWidth)
0207 anchors.verticalCenter: parent.verticalCenter
0208 text: i18n("Font:")
0209 }
0210
0211 ToolButton {
0212 anchors.verticalCenter: parent.verticalCenter
0213 implicitWidth: contextWindow.dprRound(implicitContentWidth)
0214 display: QQC.ToolButton.TextOnly
0215 contentItem: QQC.Label {
0216 readonly property font currentFont: root.useSelectionOptions ?
0217 AnnotationDocument.selectedItem.font
0218 : AnnotationDocument.tool.font
0219 leftPadding: Kirigami.Units.mediumSpacing
0220 rightPadding: leftPadding
0221 font.family: currentFont.family
0222 font.styleName: currentFont.styleName
0223 text: font.styleName !== "" ?
0224 i18ncp("%2 font family, %3 font style name, %1 font point size", "%2 %3 %1pt", "%2 %3 %1pts", currentFont.pointSize, font.family, font.styleName) :
0225 i18ncp("%2 font family %1 font point size", "%2 %1pt", "%2 %1pts", currentFont.pointSize, font.family)
0226 elide: Text.ElideNone
0227 wrapMode: Text.NoWrap
0228 horizontalAlignment: Text.AlignHCenter
0229 verticalAlignment: Text.AlignVCenter
0230 }
0231 onClicked: contextWindow.showFontDialog()
0232 }
0233
0234 ToolButton {
0235 anchors.verticalCenter: parent.verticalCenter
0236 display: QQC.ToolButton.IconOnly
0237 QQC.ToolTip.text: i18n("Font Color")
0238 Rectangle {
0239 id: colorRect
0240 anchors.centerIn: parent
0241 width: Kirigami.Units.gridUnit
0242 height: Kirigami.Units.gridUnit
0243 radius: height / 2
0244 color: root.useSelectionOptions ?
0245 AnnotationDocument.selectedItem.fontColor
0246 : AnnotationDocument.tool.fontColor
0247 border.color: Qt.rgba(parent.palette.windowText.r,
0248 parent.palette.windowText.g,
0249 parent.palette.windowText.b, 0.5)
0250 border.width: 1
0251 }
0252 onClicked: {
0253 contextWindow.showColorDialog(AnnotationTool.FontOption)
0254 }
0255 }
0256 }
0257 }
0258
0259 QQC.ToolSeparator {
0260 anchors.verticalCenter: parent.verticalCenter
0261 visible: fontLoader.visible && numberLoader.visible
0262 height: QmlUtils.iconTextButtonHeight
0263 }
0264
0265 Loader { // stroke
0266 id: numberLoader
0267 anchors.verticalCenter: parent.verticalCenter
0268 visible: active
0269 active: useSelectionOptions ?
0270 AnnotationDocument.selectedItem.options & AnnotationTool.NumberOption
0271 : AnnotationDocument.tool.options & AnnotationTool.NumberOption
0272 sourceComponent: Row {
0273 spacing: root.spacing
0274
0275 QQC.Label {
0276 leftPadding: root.mirrored ? 0 : parent.spacing
0277 rightPadding: root.mirrored ? parent.spacing : 0
0278 width: contextWindow.dprRound(implicitWidth)
0279 anchors.verticalCenter: parent.verticalCenter
0280 text: i18n("Number:")
0281 }
0282
0283 QQC.SpinBox {
0284 id: spinBox
0285 readonly property int number: root.useSelectionOptions ?
0286 AnnotationDocument.selectedItem.number : AnnotationDocument.tool.number
0287 anchors.verticalCenter: parent.verticalCenter
0288 function setNumber() {
0289 if (root.useSelectionOptions
0290 && AnnotationDocument.selectedItem.number !== spinBox.value) {
0291 AnnotationDocument.selectedItem.number = spinBox.value
0292 commitChangesTimer.restart()
0293 } else {
0294 AnnotationDocument.tool.number = spinBox.value
0295 }
0296 }
0297 from: -99
0298 to: Math.max(999, number + 1)
0299 stepSize: 1
0300 value: number
0301 QQC.ToolTip.text: i18n("Number for number annotations")
0302 QQC.ToolTip.visible: hovered
0303 QQC.ToolTip.delay: Kirigami.Units.toolTipDelay
0304 // not using onValueModified because of https://bugreports.qt.io/browse/QTBUG-91281
0305 onValueChanged: Qt.callLater(setNumber)
0306 Binding {
0307 target: spinBox.contentItem
0308 property: "horizontalAlignment"
0309 value: Text.AlignRight
0310 restoreMode: Binding.RestoreNone
0311 }
0312 }
0313 }
0314 }
0315
0316 QQC.ToolSeparator {
0317 anchors.verticalCenter: parent.verticalCenter
0318 visible: shadowCheckBox.visible
0319 height: QmlUtils.iconTextButtonHeight
0320 }
0321
0322 QQC.CheckBox {
0323 id: shadowCheckBox
0324 anchors.verticalCenter: parent.verticalCenter
0325 visible: root.useSelectionOptions ?
0326 AnnotationDocument.selectedItem.options & AnnotationTool.ShadowOption
0327 : AnnotationDocument.tool.options & AnnotationTool.ShadowOption
0328 text: i18n("Shadow")
0329 checked: {
0330 if (AnnotationDocument.tool.type === AnnotationTool.TextTool && AnnotationDocument.selectedItem.options & AnnotationTool.TextOption) {
0331 return AnnotationDocument.tool.shadow;
0332 } else if (root.useSelectionOptions) {
0333 return AnnotationDocument.selectedItem.shadow;
0334 } else {
0335 return AnnotationDocument.tool.shadow;
0336 }
0337 }
0338 onToggled: {
0339 let changed = false
0340 if (AnnotationDocument.tool.type === AnnotationTool.TextTool && AnnotationDocument.selectedItem.options & AnnotationTool.TextOption) {
0341 changed = AnnotationDocument.selectedItem.shadow !== checked
0342 AnnotationDocument.selectedItem.shadow = checked;
0343 AnnotationDocument.tool.shadow = checked;
0344 } else if (root.useSelectionOptions) {
0345 changed = AnnotationDocument.selectedItem.shadow !== checked
0346 AnnotationDocument.selectedItem.shadow = checked;
0347 } else {
0348 AnnotationDocument.tool.shadow = checked;
0349 }
0350 if (changed) {
0351 commitChangesTimer.restart();
0352 }
0353 }
0354 }
0355 }