Warning, /graphics/krita/libs/libqml/qml/panels/Panel.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 1.0
0009 import org.krita.draganddrop 1.0 as DnD
0010 import org.krita.sketch.components 1.0
0011
0012 Item {
0013 id: base;
0014
0015 property bool roundTop: false;
0016
0017 property string colorSet: "base";
0018 property string name;
0019
0020 property alias actions: actionsLayout.children;
0021 property alias peekContents: peek.children;
0022 property alias fullContents: full.children;
0023
0024 property real editWidth: Constants.GridWidth * 4;
0025
0026 property Item page;
0027 property Item lastArea;
0028
0029 signal collapsed();
0030 signal peek();
0031 signal full();
0032 signal dragStarted();
0033 signal drop(int action);
0034
0035 state: "collapsed";
0036
0037 Item {
0038 id: fill;
0039
0040 width: parent.width;
0041 height: parent.height;
0042 z: 2;
0043
0044 Rectangle {
0045 id: rectangle3
0046 anchors.fill: parent;
0047 color: "transparent";// base.panelColor;
0048 clip: true;
0049
0050 MouseArea {
0051 // This mouse area blocks any mouse click from passing through the panel. We need this to ensure we don't accidentally pass
0052 // any clicks to the collapsing area, or to the canvas, by accident.
0053 anchors.fill: parent;
0054 // This will always work, and never do anything - but we need some kind of processed thing in here to activate the mouse area
0055 onClicked: parent.focus = true;
0056 }
0057 SimpleTouchArea {
0058 // As above, but for touch events
0059 anchors.fill: parent;
0060 onTouched: parent.focus = true;
0061 }
0062
0063 Rectangle {
0064 id: background;
0065 anchors {
0066 top: parent.top;
0067 bottom: parent.bottom;
0068 left: parent.left;
0069 right: parent.right;
0070 topMargin: Constants.DefaultMargin;
0071 bottomMargin: Constants.DefaultMargin;
0072 }
0073 color: Settings.theme.color("panels/" + base.colorSet + "/base");
0074 // Rectangle {
0075 // id: rectangle4
0076 // anchors.fill: parent;
0077 // color: "#ffffff"
0078 // opacity: 0.630
0079 // color: Settings.theme.color(base.colorSet + "/subheader")
0080 // }
0081 }
0082
0083 Item {
0084 id: peek;
0085 clip: true;
0086 anchors.top: parent.top;
0087 anchors.bottom: header.top;
0088 anchors.left: parent.left;
0089 anchors.right: parent.right;
0090 }
0091
0092 Item {
0093 id: full;
0094 clip: true;
0095 anchors.top: header.bottom;
0096 anchors.bottom: footer.top;
0097 anchors.left: parent.left;
0098 anchors.right: parent.right;
0099 }
0100
0101 Item {
0102 id: header;
0103
0104 anchors.left: parent.left
0105 anchors.right: parent.right;
0106 height: Constants.GridHeight;
0107
0108 Rectangle {
0109 id: rectangle1
0110 anchors.fill: parent;
0111 color: Settings.theme.color("panels/" + base.colorSet + "/header");
0112 radius: Constants.DefaultMargin;
0113 }
0114
0115 Rectangle {
0116 id: headerCornerFill;
0117 anchors.bottom: parent.bottom;
0118 anchors.left: parent.left;
0119 anchors.right: parent.right;
0120 height: Constants.DefaultMargin;
0121 color: Settings.theme.color("panels/" + base.colorSet + "/header");
0122 }
0123
0124 DnD.DragArea {
0125 anchors.fill: parent;
0126 delegate: base.dragDelegate;
0127 source: base;
0128 enabled: base.state === "full";
0129
0130 onDragStarted: {
0131 handle.opacity = 1;
0132 handle.dragStarted();
0133 }
0134 onDrop: {
0135 if (action == Qt.IgnoreAction) {
0136 handle.opacity = 0;
0137 }
0138 handle.drop(action);
0139 }
0140
0141 MouseArea {
0142
0143 }
0144 }
0145
0146 Flow {
0147 id: actionsLayout;
0148 anchors {
0149 verticalCenter: parent.verticalCenter;
0150 left: parent.left;
0151 right: parent.right;
0152 }
0153 height: Constants.ToolbarButtonSize;
0154 }
0155 }
0156
0157 Shadow { anchors { top: header.bottom; left: header.left; right: header.right; } }
0158
0159 Item {
0160 id: footer;
0161
0162 anchors.bottom: parent.bottom;
0163 width: parent.width;
0164 height: Constants.GridHeight;
0165 clip: true;
0166
0167 Rectangle {
0168 id: rectanglefoot
0169 color: Settings.theme.color("panels/" + base.colorSet + "/header");
0170 width: parent.width;
0171 height: parent.height + Constants.DefaultMargin;
0172 y: -Constants.DefaultMargin;
0173 radius: Constants.DefaultMargin;
0174 }
0175
0176 Rectangle {
0177 anchors.fill: parent;
0178 color: "transparent";//base.panelColor;
0179
0180 Label {
0181 anchors.left: parent.left;
0182 anchors.leftMargin: 16;
0183 anchors.baseline: parent.bottom;
0184 anchors.baselineOffset: -16;
0185
0186 text: base.name;
0187 color: Settings.theme.color("panels/" + base.colorSet + "/headerText");
0188 font: Settings.theme.font("panelHeader");
0189 }
0190 }
0191
0192 DnD.DragArea {
0193 anchors.fill: parent;
0194 delegate: base.dragDelegate;
0195 source: base;
0196
0197 onDragStarted: {
0198 handle.opacity = 1;
0199 handle.dragStarted();
0200 }
0201 onDrop: {
0202 if (action == Qt.IgnoreAction) {
0203 handle.opacity = 0;
0204 }
0205 handle.drop(action);
0206 }
0207
0208 MouseArea {
0209
0210 }
0211 }
0212 }
0213
0214 Shadow { anchors { bottom: footer.top; left: footer.left; right: footer.right; } rotation: 180; }
0215 }
0216 }
0217
0218 Item {
0219 id: handle;
0220
0221 Behavior on y { id: yHandleAnim; enabled: false; NumberAnimation { onRunningChanged: handle.fixParent(); } }
0222 Behavior on x { id: xHandleAnim; enabled: false; NumberAnimation { onRunningChanged: handle.fixParent(); } }
0223
0224 width: Constants.GridWidth;
0225 height: Constants.GridHeight / 2;
0226 opacity: 0;
0227
0228 property bool dragging: false;
0229
0230 function fixParent() {
0231 if (!handleDragArea.dragging && !xHandleAnim.animation.running && !yHandleAnim.animation.running) {
0232 xHandleAnim.enabled = false;
0233 yHandleAnim.enabled = false;
0234 handle.parent = base;
0235 handle.x = 0;
0236 handle.y = 0;
0237 }
0238 }
0239
0240 function dragStarted() {
0241 base.dragStarted();
0242 handle.parent = base.page;
0243 Krita.MouseTracker.addItem(handle, Qt.point(-handle.width / 2, -handle.height / 2));
0244 handle.dragging = true;
0245 }
0246
0247 function drop(action) {
0248 base.drop(action);
0249
0250 Krita.MouseTracker.removeItem(handle);
0251
0252 xHandleAnim.enabled = true;
0253 yHandleAnim.enabled = true;
0254 dragging = false;
0255
0256 var handlePos = base.mapToItem(base.page, 0, 0);
0257 handle.x = handlePos.x;
0258 handle.y = handlePos.y;
0259 }
0260
0261 Rectangle {
0262 visible: (base.state === "collapsed") ? !base.roundTop : true;
0263 anchors {
0264 top: parent.top;
0265 left: handleBackground.left;
0266 right: handleBackground.right;
0267 }
0268 color: Settings.theme.color("panels/" + base.colorSet + "/header");
0269 radius: 0
0270
0271 height: (base.state === "peek") ? Constants.GridHeight / 2 : Constants.GridHeight / 4 + 1
0272 }
0273
0274 Rectangle {
0275 id: handleBackground
0276
0277 width: Constants.GridWidth;
0278 height: Constants.GridHeight / 2;
0279
0280 color: Settings.theme.color("panels/" + base.colorSet + "/header");
0281 radius: 8
0282
0283 Label {
0284 id: handleLabel;
0285
0286 anchors.centerIn: parent;
0287
0288 text: base.name;
0289 color: Settings.theme.color("panels/" + base.colorSet + "/headerText");
0290 font: Settings.theme.font("panelHandle");
0291 }
0292 }
0293
0294 DnD.DragArea {
0295 id: handleDragArea;
0296
0297 anchors.fill: parent;
0298
0299 source: base;
0300
0301 onDragStarted: {
0302 base.lastArea = base.parent;
0303 handle.dragStarted();
0304 }
0305 onDrop: {
0306 handle.drop(action);
0307 }
0308
0309 MouseArea {
0310 anchors.fill: parent;
0311 onClicked: base.state = base.state == "peek" ? "collapsed" : "peek";
0312 }
0313 SimpleTouchArea {
0314 anchors.fill: parent;
0315 onTouched: base.state = base.state == "peek" ? "collapsed" : "peek";
0316 }
0317 }
0318 }
0319
0320 states: [
0321 State {
0322 name: "collapsed";
0323
0324 PropertyChanges { target: base; width: Constants.GridWidth; }
0325 PropertyChanges { target: fill; opacity: 0; height: 0; }
0326 PropertyChanges { target: handle; opacity: 1; }
0327 PropertyChanges { target: background; anchors.topMargin: 0; }
0328 },
0329 State {
0330 name: "peek";
0331
0332 PropertyChanges { target: base; width: Constants.IsLandscape ? Constants.GridWidth * 4 : Constants.GridWidth * 2; }
0333 PropertyChanges { target: fill; height: Constants.GridHeight * 3.75; y: handle.height; }
0334 PropertyChanges { target: handle; opacity: 1; }
0335 PropertyChanges { target: peek; opacity: 1; }
0336 PropertyChanges { target: full; opacity: 0; }
0337 AnchorChanges { target: header; anchors.bottom: rectangle3.bottom }
0338 PropertyChanges { target: footer; opacity: 0; }
0339 PropertyChanges { target: background; anchors.topMargin: 0; }
0340 PropertyChanges { target: headerCornerFill; height: Constants.DefaultMargin; }
0341 AnchorChanges { target: headerCornerFill; anchors.bottom: undefined; anchors.top: header.top; }
0342 },
0343 State {
0344 name: "full";
0345 PropertyChanges { target: peek; opacity: 0; }
0346 PropertyChanges { target: full; opacity: 1; }
0347 PropertyChanges { target: handle; height: 0; }
0348 },
0349 State {
0350 name: "edit";
0351 PropertyChanges { target: peek; opacity: 0; }
0352 PropertyChanges { target: full; opacity: 1; }
0353 PropertyChanges { target: base; width: base.editWidth; }
0354 }
0355 ]
0356
0357 transitions: [
0358 Transition {
0359 from: "collapsed";
0360 to: "peek";
0361
0362 SequentialAnimation {
0363 ScriptAction { script: base.peek(); }
0364 AnchorAnimation { targets: [ header ] ; duration: 0; }
0365 PropertyAction { targets: [ header, footer ]; properties: "height,width,opacity" }
0366 PropertyAction { targets: [ base ]; properties: "width"; }
0367 PropertyAction { targets: [ fill ]; properties: "y"; }
0368 NumberAnimation { targets: [ base, fill, handle, peek, full ]; properties: "height,opacity"; duration: Constants.AnimationDuration; }
0369 }
0370 },
0371 Transition {
0372 from: "peek";
0373 to: "collapsed";
0374
0375 SequentialAnimation {
0376 NumberAnimation { targets: [ base, fill, handle, peek, full ]; properties: "height,opacity"; duration: Constants.AnimationDuration; }
0377 AnchorAnimation { targets: [ header ] ; duration: 0; }
0378 PropertyAction { targets: [ fill ]; properties: "y"; }
0379 PropertyAction { targets: [ base ]; properties: "width"; }
0380 PropertyAction { targets: [ header, footer ]; properties: "height,width,opacity" }
0381 ScriptAction { script: base.collapsed(); }
0382 }
0383 },
0384 Transition {
0385 from: "peek";
0386 to: "full";
0387 reversible: true;
0388
0389 NumberAnimation { properties: "height,width,opacity"; duration: 0; }
0390 ScriptAction { script: base.full(); }
0391 },
0392 Transition {
0393 from: "collapsed";
0394 to: "full";
0395
0396 NumberAnimation { properties: "opacity"; duration: 100; }
0397 ScriptAction { script: base.full(); }
0398 },
0399 Transition {
0400 from: "full";
0401 to: "collapsed";
0402
0403 NumberAnimation { properties: "opacity"; duration: 100; }
0404 ScriptAction { script: base.collapsed(); }
0405 },
0406 Transition {
0407 from: "full"
0408 to: "edit"
0409 reversible: true;
0410
0411 NumberAnimation { properties: "width"; duration: Constants.AnimationDuration; }
0412 }
0413 ]
0414 }