Warning, /graphics/krita/libs/libqml/plugins/components/Button.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 
0010 Item {
0011     id: base;
0012 
0013     signal clicked();
0014 
0015     property alias image: icon.source;
0016     //property color color: Settings.theme.color("components/button/base");
0017     // define background and highlight color transparent by default,
0018     // so they can be defined depending on the context; also make the icon half transparent on click
0019     // if the color is transparent #00000000
0020     property color color: "#00000000"
0021     property alias border: fill.border;
0022     property alias radius: fill.radius;
0023     property alias text: label.text;
0024     property color textColor: Settings.theme.color("components/button/text");
0025     property alias textSize: label.font.pixelSize;
0026     property alias bold: label.font.bold;
0027     property bool shadow: false;
0028     property bool enabled: true; // XXX: visualize disabledness
0029     property alias asynchronous: icon.asynchronous;
0030 
0031     property bool highlight: false;
0032     //property color highlightColor: Settings.theme.color("components/button/highlight");
0033     property color highlightColor: "#00000000"
0034 
0035     property bool checkable: false;
0036     property bool checked: false;
0037     property color checkedColor: Settings.theme.color("components/button/checked");
0038 
0039     property bool hasFocus: false;
0040 
0041     property string tooltip: "";
0042 
0043     width: Constants.GridWidth;
0044     height: Constants.GridHeight;
0045 
0046     Rectangle {
0047         id: fill;
0048         anchors.fill: parent;
0049         anchors.margins: 0;
0050         color: base.highlight && mouse.pressed && base.enabled ? base.highlightColor : base.color;
0051         visible: true
0052 
0053         Rectangle {
0054             anchors {
0055                 left: parent.left;
0056                 right: parent.right;
0057                 bottom: parent.bottom;
0058                 margins: fill.radius / 2;
0059             }
0060             height: fill.radius / 2;
0061             radius: fill.radius / 4;
0062             color: base.textColor;
0063             visible: base.hasFocus;
0064             opacity: 0.3
0065         }
0066 
0067         Rectangle {
0068             id: checkedVisualiser;
0069             opacity: base.checked ? 1 : 0;
0070             Behavior on opacity { NumberAnimation { duration: Constants.AnimationDuration; } }
0071             anchors.fill: parent;
0072             anchors.margins: 2;
0073             color: base.checkedColor;
0074             radius: base.height === base.width ? base.height / 2 - 1 : base.radius;
0075         }
0076 
0077         Image {
0078             id: icon;
0079             anchors.centerIn: parent
0080             width: parent.width > parent.height ? parent.height * 0.9 : parent.width * 0.9;
0081             height: width
0082             fillMode: Image.PreserveAspectFit;
0083             smooth: true;
0084             asynchronous: true;
0085             opacity: base.enabled ? (mouse.pressed && base.highlightColor == "#00000000" ? 0.5 : 1) : 0.7;
0086             Behavior on opacity { NumberAnimation { duration: Constants.AnimationDuration * 0.5; } }
0087 
0088             sourceSize.width: width;
0089             sourceSize.height: width;
0090         }
0091 
0092         Label {
0093             id: label;
0094             anchors.verticalCenter: parent.verticalCenter;
0095             height: font.pixelSize;
0096             width: parent.width;
0097             horizontalAlignment: Text.AlignHCenter;
0098             elide: Text.ElideRight;
0099             opacity: base.enabled ? 1 : 0.7;
0100             color: base.textColor;
0101         }
0102 //         Rectangle {
0103 //             id: enabledVisualiser;
0104 //             opacity: base.enabled ? 0 : 0.7;
0105 //             anchors.fill: parent;
0106 //             color: "black";
0107 //         }
0108     }
0109 
0110     SimpleTouchArea {
0111         anchors.fill: parent;
0112         onTouched: {
0113             if (base.enabled) {
0114                 base.clicked();
0115                 if (base.checkable) {
0116                     base.checked = !base.checked;
0117                 }
0118             }
0119         }
0120     }
0121     MouseArea {
0122         id: mouse;
0123         anchors.fill: parent;
0124         hoverEnabled: true;
0125         acceptedButtons: Qt.LeftButton | Qt.RightButton;
0126 
0127         onClicked: {
0128             if(mouse.button == Qt.LeftButton && base.enabled) {
0129                 base.clicked();
0130                 if(base.checkable) {
0131                     base.checked = !base.checked;
0132                 }
0133             } else if(mouse.button == Qt.RightButton && base.tooltip != "") {
0134                 tooltip.show(base.width / 2, 0);
0135             }
0136         }
0137         onEntered: {
0138             hoverDelayTimer.start();
0139         }
0140         onPositionChanged: {
0141             if(hoverDelayTimer.running) {
0142                 hoverDelayTimer.restart();
0143             }
0144         }
0145         onExited: {
0146             hoverDelayTimer.stop();
0147             tooltip.hide();
0148         }
0149     }
0150 
0151     Timer {
0152         id: hoverDelayTimer;
0153         interval: 1000;
0154         onTriggered: { if(base.tooltip != "") tooltip.show(base.width / 2, 0) }
0155     }
0156 
0157     Tooltip {
0158         id: tooltip;
0159         text: base.tooltip;
0160     }
0161 
0162     states: State {
0163         name: "pressed";
0164         when: (mouse.pressed || base.checked) && enabled;
0165 
0166         PropertyChanges {
0167             target: fill
0168             color: base.highlightColor
0169             anchors.topMargin: 0
0170         }
0171     }
0172 
0173     transitions: Transition {
0174         from: "";
0175         to: "down";
0176         reversible: true;
0177         ParallelAnimation {
0178             NumberAnimation { properties: "size"; duration: 150; }
0179             ColorAnimation { duration: 150; }
0180         }
0181     }
0182 }