Warning, /graphics/krita/libs/libqml/qml/panels/toolconfigpages/transform.qml is written in an unsupported language. File is not indexed.

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 Dan Leinir Turthra Jensen <admin@leinir.dk>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 import QtQuick 2.3
0008 import org.krita.sketch 1.0 as Krita
0009 import org.krita.sketch.components 1.0
0010 
0011 Column {
0012     id: base;
0013 
0014     property bool fullView: true;
0015 
0016     function apply() {
0017         toolManager.currentTool.applyTransform();
0018     }
0019 
0020     height: buttonRow.height + freeModeOptions.height + Krita.Constants.DefaultMargin * 5
0021     anchors.margins: Krita.Constants.DefaultMargin;
0022     spacing: Krita.Constants.DefaultMargin;
0023 
0024     Item {
0025         height: Krita.Constants.DefaultMargin;
0026         width: parent.width;
0027     }
0028     Row {
0029         id: buttonRow;
0030         anchors.horizontalCenter: parent.horizontalCenter;
0031         spacing: Krita.Constants.DefaultMargin;
0032 
0033         Button {
0034             id: freeModeButton;
0035 
0036             width: base.width * 0.4;
0037             height: textSize + Krita.Constants.DefaultMargin * 2
0038 
0039             textColor: "black";
0040             color: "#63ffffff";
0041 
0042             border.width: 1;
0043             border.color: "silver";
0044 
0045             radius: Krita.Constants.DefaultMargin;
0046 
0047             checkable: true;
0048             checked: true;
0049             onCheckedChanged: {
0050                 if (checked) {
0051                     warpModeButton.checked = false;
0052                     toolManager.currentTool.transformMode = 0;
0053                 } else if ( !warpModeButton.checked ) {
0054                     checked = true;
0055                 }
0056             }
0057 
0058             highlight: true;
0059             highlightColor: "#aaffffff";
0060 
0061             text: "Free"
0062         }
0063 
0064         Button {
0065             id: warpModeButton;
0066 
0067             width: base.width * 0.4;
0068             height: textSize + Krita.Constants.DefaultMargin * 2
0069 
0070             textColor: "black";
0071             color: "#63ffffff";
0072 
0073             border.width: 1;
0074             border.color: "silver";
0075 
0076             radius: Krita.Constants.DefaultMargin;
0077 
0078             checkable: true;
0079             onCheckedChanged: {
0080                 if (checked) {
0081                     freeModeButton.checked = false;
0082                     toolManager.currentTool.transformMode = 1;
0083                 } else if ( !freeModeButton.checked ) {
0084                     checked = true;
0085                 }
0086             }
0087 
0088             highlight: true;
0089             highlightColor: "#aaffffff";
0090 
0091             text: "Warp"
0092         }
0093     }
0094 
0095     Item {
0096         width: parent.width;
0097         height: freeModeOptions.height;
0098 
0099         Column {
0100             id: freeModeOptions;
0101 
0102             width: parent.width;
0103 
0104             opacity: freeModeButton.checked ? 1.0 : 0.0;
0105             Behavior on opacity { NumberAnimation { } }
0106 
0107             Label { height: font.pixelSize + Krita.Constants.DefaultMargin; text: "Translation" }
0108 
0109             PanelTextField { id: translateX; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "X" }
0110             PanelTextField { id: translateY; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "Y" }
0111 
0112             Label { height: font.pixelSize + Krita.Constants.DefaultMargin; text: "Rotation" }
0113 
0114 //             ExpandingListView {
0115 //                 width: parent.width;
0116 //
0117 //                 model: ListModel {
0118 //                     ListElement { text: "Top Left"; }
0119 //                     ListElement { text: "Top Center"; }
0120 //                     ListElement { text: "Top Right"; }
0121 //                     ListElement { text: "Middle Left"; }
0122 //                     ListElement { text: "Center"; }
0123 //                     ListElement { text: "Middle Right"; }
0124 //                     ListElement { text: "Bottom Left"; }
0125 //                     ListElement { text: "Bottom Center"; }
0126 //                     ListElement { text: "Bottom Right"; }
0127 //                 }
0128 //             }
0129 
0130             PanelTextField { id: rotateX; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "X" }
0131             PanelTextField { id: rotateY; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "Y" }
0132             PanelTextField { id: rotateZ; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "Z" }
0133 
0134             Label { height: font.pixelSize + Krita.Constants.DefaultMargin; text: "Scaling" }
0135 
0136             PanelTextField { id: scaleX; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "X" }
0137             PanelTextField { id: scaleY; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "Y" }
0138 
0139             Label { height: font.pixelSize + Krita.Constants.DefaultMargin; text: "Shear" }
0140 
0141             PanelTextField { id: shearX; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "X" }
0142             PanelTextField { id: shearY; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "Y" }
0143 
0144             //Button { text: "Update"; onClicked: parent.updateTransform(); }
0145 
0146 //             ExpandingListView {
0147 //                 model: ListModel {
0148 //                     ListElement { text: "Box"; }
0149 //                     ListElement { text: "Bilinear"; }
0150 //                     ListElement { text: "Bicubic"; }
0151 //                 }
0152 //             }
0153 
0154             Connections {
0155                 target: toolManager.currentTool;
0156                 ignoreUnknownSignals: true;
0157 
0158                 onTransformModeChanged: { }
0159                 onFreeTransformChanged: {
0160                     freeModeOptions.preventUpdate = true;
0161                     freeModeOptions.updateFreeTransformText();
0162                     freeModeOptions.preventUpdate = false;
0163                 }
0164             }
0165 
0166             property bool preventUpdate: false;
0167             property bool preventUpdateText: false;
0168 
0169             function updateTransform() {
0170                 if ( preventUpdate )
0171                     return;
0172 
0173                 toolManager.currentTool.translateX = parseFloat(translateX.text);
0174                 toolManager.currentTool.translateY = parseFloat(translateY.text);
0175 
0176                 toolManager.currentTool.rotateX = parseFloat(rotateX.text);
0177                 toolManager.currentTool.rotateY = parseFloat(rotateY.text);
0178                 toolManager.currentTool.rotateZ = parseFloat(rotateZ.text);
0179 
0180                 toolManager.currentTool.scaleX = parseFloat(scaleX.text) * 100;
0181                 toolManager.currentTool.scaleY = parseFloat(scaleY.text) * 100;
0182 
0183                 toolManager.currentTool.shearX = parseFloat(shearX.text);
0184                 toolManager.currentTool.shearY = parseFloat(shearY.text);
0185             }
0186 
0187             function updateFreeTransformText() {
0188                 if (preventUpdateText)
0189                     return;
0190 
0191                 translateX.text = toolManager.currentTool.translateX;
0192                 translateY.text = toolManager.currentTool.translateY;
0193 
0194                 rotateX.text = toolManager.currentTool.rotateX;
0195                 rotateY.text = toolManager.currentTool.rotateY;
0196                 rotateZ.text = toolManager.currentTool.rotateZ;
0197 
0198                 scaleX.text = toolManager.currentTool.scaleX;
0199                 scaleY.text = toolManager.currentTool.scaleY;
0200 
0201                 shearX.text = toolManager.currentTool.shearX;
0202                 shearY.text = toolManager.currentTool.shearY;
0203             }
0204 
0205             Component.onCompleted: {
0206                 preventUpdate = true;
0207                 updateFreeTransformText();
0208                 preventUpdate = false;
0209             }
0210         }
0211 
0212         Column {
0213             id: warpModeOptions;
0214 
0215             width: parent.width;
0216             spacing: Krita.Constants.DefaultMargin;
0217 
0218             opacity: warpModeButton.checked ? 1.0 : 0.0;
0219             Behavior on opacity { NumberAnimation { } }
0220 
0221             ExpandingListView {
0222                 id: warpTypeCombo;
0223 
0224                 width: parent.width;
0225                 expandedHeight: Krita.Constants.GridHeight * 2
0226 
0227                 onCurrentIndexChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; }
0228 
0229                 model: ListModel {
0230                     ListElement { text: "Rigid"; }
0231                     ListElement { text: "Affine"; }
0232                     ListElement { text: "Similitude"; }
0233                 }
0234             }
0235 
0236             PanelTextField { id: warpFlexibilityField; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "Flexibility"; }
0237             PanelTextField { id: warpDensityField; onTextChanged: { parent.preventUpdateText = true; parent.updateTransform(); parent.preventUpdateText = false; } placeholder: "Density"; }
0238 
0239             property bool preventUpdate: false;
0240             property bool preventUpdateText: false;
0241 
0242             function updateTransform() {
0243                 if (preventUpdate)
0244                     return;
0245 
0246                 toolManager.currentTool.warpType = warpTypeCombo.currentIndex;
0247                 toolManager.currentTool.warpFlexibility = parseFloat(warpFlexibilityField.text);
0248                 toolManager.currentTool.warpPointDensity = parseInt(warpDensityField.text);
0249             }
0250 
0251             function updateTransformText() {
0252                 if (preventUpdateText)
0253                     return;
0254 
0255                 warpTypeCombo.currentIndex = toolManager.currentTool.warpType;
0256                 warpFlexibilityField.text = toolManager.currentTool.warpFlexibility;
0257                 warpDensityField.text = toolManager.currentTool.warpPointDensity;
0258             }
0259 
0260             Component.onCompleted: {
0261                 preventUpdate = true;
0262                 updateTransformText();
0263                 preventUpdate = false;
0264             }
0265         }
0266     }
0267 }