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 }