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

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 Arjen Hiemstra <ahiemstra@heimr.nl>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 import QtQuick 2.3
0008 import org.krita.sketch.components 1.0
0009 import org.krita.sketch 1.0
0010 
0011 Item {
0012     id: base;
0013     anchors.fill: parent;
0014     property QtObject layersModel: null;
0015     property bool isInitialised: false;
0016     property bool isShown: false;
0017     property bool isChangingConfig: false;
0018     onIsShownChanged: {
0019         if (!isShown)
0020             return;
0021         var filterConfig = layersModel.activeFilterConfig;
0022         if (filterConfig !== null) {
0023             var categoryIndex = filtersCategoryModel.categoryIndexForConfig(filterConfig);
0024             var filterIndex = filtersCategoryModel.filterIndexForConfig(categoryIndex, filterConfig);
0025             filtersCategoryList.currentIndex = categoryIndex;
0026             fullFilters.currentIndex = filterIndex;
0027             if (configLoader.item && typeof(configLoader.item.configuration) !== "undefined") {
0028                 configLoader.item.configuration = filterConfig;
0029             }
0030         }
0031         base.isInitialised = (layersModel !== null);
0032     }
0033     // tile goes here
0034 
0035     CompositeOpModel {
0036         id: compositeOpModel;
0037         view: sketchView.view;
0038     }
0039 
0040     PanelTextField {
0041         id: layerName;
0042         anchors {
0043             top: parent.top;
0044             left: parent.left;
0045             right: parent.right;
0046             margins: Constants.DefaultMargin;
0047         }
0048         placeholder: "Name";
0049         text: layersModel ? layersModel.activeName : "";
0050         onAccepted: if (layersModel) layersModel.activeName = text;
0051         onFocusLost: if (layersModel) layersModel.activeName = text;
0052     }
0053     ExpandingListView {
0054         id: compositeOpList;
0055         anchors {
0056             top: layerName.bottom;
0057             left: parent.left;
0058             right: parent.right;
0059             margins: Constants.DefaultMargin;
0060         }
0061         visible: layersModel ? (layersModel.activeType === "KisPaintLayer") : false;
0062         height: visible ? Constants.GridHeight / 2 : 0;
0063         model: compositeOpModel; // composite ops list
0064         currentIndex: layersModel ? layersModel.activeCompositeOp : 0;
0065         onNewIndex: if (layersModel) layersModel.activeCompositeOp = currentIndex;
0066     }
0067 
0068     FiltersCategoryModel {
0069         id: filtersCategoryModel;
0070         view: sketchView.view;
0071     }
0072     ExpandingListView {
0073         id: filtersCategoryList;
0074         anchors {
0075             top: compositeOpList.bottom;
0076             left: parent.left;
0077             right: parent.right;
0078             margins: Constants.DefaultMargin;
0079         }
0080         visible: layersModel ? (layersModel.activeType === "KisFilterMask" || layersModel.activeType === "KisAdjustmentLayer") : false;
0081         height: visible ? Constants.GridHeight / 2 : 0;
0082         model: filtersCategoryModel;
0083         onModelChanged: currentIndex = 0;
0084         onCurrentIndexChanged: {
0085             model.activateItem(currentIndex)
0086             if (base.isInitialised) {
0087                 fullFilters.currentIndex = 0;
0088             }
0089         }
0090     }
0091     ExpandingListView {
0092         id: fullFilters;
0093         anchors {
0094             top: filtersCategoryList.bottom;
0095             left: parent.left;
0096             right: parent.right;
0097             margins: Constants.DefaultMargin;
0098         }
0099         visible: layersModel ? (layersModel.activeType === "KisFilterMask" || layersModel.activeType === "KisAdjustmentLayer") : false;
0100         height: visible ? Constants.GridHeight / 2 : 0;
0101         model: filtersCategoryModel.filterModel;
0102         function applyConfiguration(configuration) {
0103             if (base.isChangingConfig === true) {
0104                 return;
0105             }
0106             base.isChangingConfig = true;
0107             if (base.isInitialised) {
0108                 layersModel.activeFilterConfig = configuration;
0109             }
0110             base.isChangingConfig = false;
0111         }
0112         onCurrentIndexChanged: {
0113             if (layersModel.activeType === "KisFilterMask" || layersModel.activeType === "KisAdjustmentLayer") {
0114                 filtersCategoryModel.filterSelected(currentIndex);
0115                 if (base.isInitialised) {
0116                     //console.debug("Setting new configuration...");
0117                     base.isChangingConfig = true;
0118                     layersModel.activeFilterConfig = model.configuration(currentIndex);
0119                     base.isChangingConfig = false;
0120                 }
0121                 if (model.filterRequiresConfiguration(currentIndex)) {
0122                     configLoader.source = "filterconfigpages/" + model.filterID(currentIndex) + ".qml";
0123                 }
0124                 else {
0125                     configLoader.source = "filterconfigpages/nothing-to-configure.qml";
0126                 }
0127             }
0128         }
0129     }
0130     RangeInput {
0131         id: opacitySlider;
0132         anchors {
0133             top: fullFilters.bottom;
0134             left: parent.left;
0135             right: parent.right;
0136             margins: Constants.DefaultMargin;
0137         }
0138         placeholder: "Opacity"
0139         min: 0; max: 255; decimals: 0;
0140         value: layersModel ? layersModel.activeOpacity : 0;
0141         onValueChanged: if (layersModel) layersModel.activeOpacity = value;
0142     }
0143     Row {
0144         id: visibleAndLockRow;
0145         anchors {
0146             top: opacitySlider.bottom;
0147             horizontalCenter: parent.horizontalCenter;
0148             margins: Constants.DefaultMargin;
0149         }
0150         height: childrenRect.height;
0151         width: childrenRect.width;
0152         Button {
0153             id: visibilityButton
0154             width: height;
0155             height: Constants.GridHeight
0156             image: (layersModel && layersModel.activeVisible) ? Settings.theme.icon("visible_on-black") : Settings.theme.icon("visible_off-black");
0157             onClicked: if (layersModel) layersModel.activeVisible = !layersModel.activeVisible;
0158         }
0159         Button {
0160             id: lockstateButton
0161             width: height;
0162             height: Constants.GridHeight
0163             image: (layersModel && layersModel.activeLocked) ? Settings.theme.icon("locked_on-black") : Settings.theme.icon("locked_off-black");
0164             onClicked: if (layersModel) layersModel.activeLocked = !layersModel.activeLocked;
0165         }
0166     }
0167     Label {
0168         id: channelsLabel;
0169         anchors {
0170             top: visibleAndLockRow.bottom;
0171             topMargin: Constants.DefaultMargin;
0172             left: parent.left;
0173             leftMargin: Constants.DefaultMargin;
0174         }
0175         visible: layersModel ? (layersModel.activeType === "KisPaintLayer" || layersModel.activeType === "KisGroupLayer") : false;
0176         horizontalAlignment: Text.AlignLeft;
0177         font.pixelSize: Constants.DefaultFontSize;
0178         font.bold: true;
0179         height: visible ? Constants.GridHeight / 2 : 0;
0180         text: "Active Channels:";
0181     }
0182     Row {
0183         id: channelsRow;
0184         anchors {
0185             top: channelsLabel.bottom;
0186             horizontalCenter: parent.horizontalCenter;
0187             margins: Constants.DefaultMargin;
0188         }
0189         visible: layersModel ? (layersModel.activeType === "KisPaintLayer" || layersModel.activeType === "KisGroupLayer") : false;
0190         height: visible ? childrenRect.height : 0;
0191         width: childrenRect.width;
0192         spacing: Constants.DefaultMargin;
0193 
0194         Button {
0195             id: redChannel
0196             height: Constants.DefaultFontSize + Constants.DefaultMargin * 2;
0197             width: height;
0198             text: "R";
0199             textColor: d.buttonTextColor;
0200             bold: true;
0201             border { width: 1; color: d.buttonBorderColor; }
0202             radius: Constants.DefaultMargin;
0203             color: (layersModel && layersModel.activeRChannelActive) ? d.buttonActiveColor : d.buttonInactiveColor;
0204             onClicked: if (layersModel) layersModel.activeRChannelActive = !layersModel.activeRChannelActive;
0205         }
0206         Button {
0207             id: greenChannel
0208             height: Constants.DefaultFontSize + Constants.DefaultMargin * 2;
0209             width: height;
0210             text: "G";
0211             textColor: d.buttonTextColor;
0212             bold: true;
0213             border { width: 1; color: d.buttonBorderColor; }
0214             radius: Constants.DefaultMargin;
0215             color: (layersModel && layersModel.activeGChannelActive) ? d.buttonActiveColor : d.buttonInactiveColor;
0216             onClicked: if (layersModel) layersModel.activeGChannelActive = !layersModel.activeGChannelActive;
0217         }
0218         Button {
0219             id: blueChannel
0220             height: Constants.DefaultFontSize + Constants.DefaultMargin * 2;
0221             width: height;
0222             text: "B";
0223             textColor: d.buttonTextColor;
0224             bold: true;
0225             border { width: 1; color: d.buttonBorderColor; }
0226             radius: Constants.DefaultMargin;
0227             color: (layersModel && layersModel.activeBChannelActive) ? d.buttonActiveColor : d.buttonInactiveColor;
0228             onClicked: if (layersModel) layersModel.activeBChannelActive = !layersModel.activeBChannelActive;
0229         }
0230         Button {
0231             id: alphaChannel
0232             height: Constants.DefaultFontSize + Constants.DefaultMargin * 2;
0233             width: height;
0234             text: "A";
0235             textColor: d.buttonTextColor;
0236             bold: true;
0237             border { width: 1; color: d.buttonBorderColor; }
0238             radius: Constants.DefaultMargin;
0239             color: (layersModel && layersModel.activeAChannelActive) ? d.buttonActiveColor : d.buttonInactiveColor;
0240             onClicked: if (layersModel) layersModel.activeAChannelActive = !layersModel.activeAChannelActive;
0241         }
0242     }
0243     Label {
0244         id: channelsLockedLabel;
0245         anchors {
0246             top: channelsRow.bottom;
0247             topMargin: Constants.DefaultMargin;
0248             left: parent.left;
0249             leftMargin: Constants.DefaultMargin;
0250         }
0251         visible: layersModel ? (layersModel.activeType === "KisPaintLayer" || layersModel.activeType === "KisGroupLayer") : false;
0252         horizontalAlignment: Text.AlignLeft;
0253         font.pixelSize: Constants.DefaultFontSize;
0254         font.bold: true;
0255         height: visible ? Constants.GridHeight / 2 : 0;
0256         text: "Locked Channels:";
0257     }
0258     Row {
0259         id: lockedChannelsRow;
0260         anchors {
0261             top: channelsLockedLabel.bottom;
0262             horizontalCenter: parent.horizontalCenter;
0263             margins: Constants.DefaultMargin;
0264         }
0265         visible: layersModel ? (layersModel.activeType === "KisPaintLayer" || layersModel.activeType === "KisGroupLayer") : false;
0266         height: visible ? childrenRect.height : 0;
0267         width: childrenRect.width;
0268         spacing: Constants.DefaultMargin;
0269     }
0270     Flickable {
0271         id: configNeeded;
0272         visible: layersModel ? (layersModel.activeType === "KisFilterMask" || layersModel.activeType === "KisAdjustmentLayer") : false;
0273         anchors {
0274            top: lockedChannelsRow.bottom;
0275            left: parent.left;
0276            right: parent.right;
0277            bottom: parent.bottom;
0278         }
0279         MouseArea {
0280             anchors.fill: parent;
0281             hoverEnabled: true;
0282             onContainsMouseChanged: configLoader.focus = containsMouse;
0283         }
0284         Loader {
0285             id: configLoader;
0286             width: parent.width;
0287             height: item ? item.height : 1;
0288             onItemChanged: {
0289                 if (item && typeof(item.configuration) !== 'undefined') {
0290                     item.configuration = layersModel.activeFilterConfig;
0291                 }
0292             }
0293             Connections {
0294                 target: layersModel;
0295                 onActiveFilterConfigChanged: {
0296                     if (base.isChangingConfig === false && typeof(configLoader.item.configuration) !== 'undefined') {
0297                         base.isChangingConfig = true;
0298                         var filterConfig = layersModel.activeFilterConfig;
0299                         configLoader.item.configuration = filterConfig;
0300                         if (filterConfig.name !== fullFilters.model.filterID(fullFilters.currentIndex)) {
0301                             var categoryIndex = filtersCategoryModel.categoryIndexForConfig(filterConfig);
0302                             var filterIndex = filtersCategoryModel.filterIndexForConfig(categoryIndex, filterConfig);
0303                             filtersCategoryList.currentIndex = categoryIndex;
0304                             fullFilters.currentIndex = filterIndex;
0305                         }
0306                         base.isChangingConfig = false;
0307                     }
0308                 }
0309             }
0310         }
0311     }
0312 
0313     QtObject {
0314         id: d;
0315 
0316         property color buttonTextColor: Settings.theme.color("panels/layers/editorButtons/text");
0317         property color buttonBorderColor: Settings.theme.color("panels/layers/editorButtons/border");
0318         property color buttonActiveColor: Settings.theme.color("panels/layers/editorButtons/active");
0319         property color buttonInactiveColor: Settings.theme.color("panels/layers/editorButtons/inactive");
0320     }
0321 }