Warning, /libraries/kirigami-addons/src/components/DoubleFloatingButton.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2023 Mathis BrĂ¼chert <mbb@kaidan.im>
0002 // SPDX-FileCopyrightText: 2023 Carl Schwan <carl@carlschwan.eu>
0003 //
0004 // SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 
0006 import QtQuick 2.15
0007 import QtQuick.Layouts 1.15
0008 import QtQuick.Controls 2.15 as QQC2
0009 import org.kde.kirigami 2.20 as Kirigami
0010 
0011 /**
0012  * This component allows to display two buttons at the bottom of a page.
0013  *
0014  * @code{.qml}
0015  * import QtQuick 2.15
0016  * import QtQuick.Controls 2.15 as QQC2
0017  * import org.kde.kirigami 2.20 as Kirigami
0018  * import org.kde.kirigamiaddons.components 1.0 as KirigamiComponents
0019  *
0020  * Kirigami.ScrollablePage {
0021  *     ListView {
0022  *         model: []
0023  *         delegate: QQC2.ItemDelegate {}
0024  *
0025  *         KirigamiComponents.DoubleFloatingButton {
0026  *             anchors {
0027  *                 right: parent.right
0028  *                 bottom: parent.bottom
0029  *                 margins: Kirigami.Units.largeSpacing
0030  *             }
0031  *
0032  *             leadingAction: Kirigami.Action {
0033  *                 text: "Zoom Out"
0034  *                 icon.name: "list-remove"
0035  *             }
0036  *
0037  *             trailingAction: Kirigami.Action {
0038  *                 text: "Zoom In"
0039  *                 icon.name: "list-add"
0040  *             }
0041  *         }
0042  *     }
0043  * }
0044  * @endcode
0045  *
0046  * @since Kirigami Addons 0.11
0047  */
0048 Kirigami.ShadowedRectangle {
0049     id: root
0050 
0051     /**
0052      * This property holds the leading action.
0053      * @deprecated Set leadingAction instead.
0054      */
0055     property alias leftAction: root.leadingAction
0056 
0057     /**
0058      * This property holds the trailing action.
0059      * @deprecated Set trailingAction instead.
0060      */
0061     property alias rightAction: root.trailingAction
0062 
0063     /**
0064      * This property holds the leading action.
0065      */
0066     property Kirigami.Action leadingAction
0067 
0068     /**
0069      * This property holds the trailing action.
0070      */
0071     property Kirigami.Action trailingAction
0072 
0073     // Note: binding corners to each other results in binding loops, because
0074     // they share one common NOTIFY signal. Storing properties wastes memory.
0075     // So these two expressions are implemented as little helper functions.
0076 
0077     // Left for leading and right for trailing buttons
0078     function __radiusA(): real {
0079         return LayoutMirroring.enabled ? 0 : radius;
0080     }
0081 
0082     // and vice-versa
0083     function __radiusB(): real {
0084         return LayoutMirroring.enabled ? radius : 0;
0085     }
0086 
0087     radius: Kirigami.Units.largeSpacing
0088     color: "transparent"
0089     height: Math.round(Kirigami.Units.gridUnit * 2.5)
0090     width: 2 * height - 1
0091 
0092     shadow {
0093         size: 10
0094         xOffset: 0
0095         yOffset: 2
0096         color: Qt.rgba(0, 0, 0, 0.2)
0097     }
0098 
0099     QQC2.Button {
0100         id: leadingButton
0101 
0102         LayoutMirroring.enabled: root.LayoutMirroring.enabled
0103 
0104         z: (down || visualFocus || (enabled && hovered)) ? 2 : leadingButtonBorderAnimation.running ? 1 : 0
0105 
0106         background: Kirigami.ShadowedRectangle {
0107             id: leadingButtonBackground
0108 
0109             Kirigami.Theme.inherit: false
0110             Kirigami.Theme.colorSet: Kirigami.Theme.Window
0111 
0112             corners {
0113                 topLeftRadius: root.__radiusA()
0114                 bottomLeftRadius: root.__radiusA()
0115                 topRightRadius: root.__radiusB()
0116                 bottomRightRadius: root.__radiusB()
0117             }
0118 
0119             border {
0120                 width: 1
0121                 color: if (leadingButton.down || leadingButton.visualFocus) {
0122                     Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.4)
0123                 } else if (leadingButton.enabled && leadingButton.hovered) {
0124                     Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6)
0125                 } else {
0126                     Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, 0.2)
0127                 }
0128             }
0129 
0130             color: if (leadingButton.down || leadingButton.visualFocus) {
0131                 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6)
0132             } else if (leadingButton.enabled && leadingButton.hovered) {
0133                 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.8)
0134             } else {
0135                 Kirigami.Theme.backgroundColor
0136             }
0137 
0138             Behavior on color {
0139                 enabled: true
0140                 ColorAnimation {
0141                     duration: Kirigami.Units.longDuration
0142                     easing.type: Easing.OutCubic
0143                 }
0144             }
0145 
0146             Behavior on border.color {
0147                 enabled: true
0148                 ColorAnimation {
0149                     id: leadingButtonBorderAnimation
0150                     duration: Kirigami.Units.longDuration
0151                     easing.type: Easing.OutCubic
0152                 }
0153             }
0154         }
0155 
0156         contentItem: Item {
0157             Kirigami.Icon {
0158                 implicitHeight: if (leadingButton.icon.height) {
0159                     leadingButton.icon.height
0160                 } else {
0161                     Kirigami.Units.iconSizes.medium
0162                 }
0163                 implicitWidth: if (leadingButton.icon.width) {
0164                     leadingButton.icon.width
0165                 } else {
0166                     Kirigami.Units.iconSizes.medium
0167                 }
0168                 source: if (leadingButton.icon.name) {
0169                     leadingButton.icon.name
0170                 } else {
0171                     leadingButton.icon.source
0172                 }
0173                 anchors.centerIn: parent
0174             }
0175         }
0176         action: root.leadingAction
0177         anchors.left: root.left
0178         height: root.height
0179         width: root.height
0180         enabled: action ? action.enabled : false
0181         display: QQC2.AbstractButton.IconOnly
0182     }
0183 
0184     QQC2.Button {
0185         id: trailingButton
0186 
0187         LayoutMirroring.enabled: root.LayoutMirroring.enabled
0188 
0189         z: (down || visualFocus || (enabled && hovered)) ? 2 : trailingButtonBorderAnimation.running ? 1 : 0
0190 
0191         background: Kirigami.ShadowedRectangle {
0192             Kirigami.Theme.inherit: false
0193             Kirigami.Theme.colorSet: Kirigami.Theme.Window
0194 
0195             corners {
0196                 topLeftRadius: root.__radiusB()
0197                 bottomLeftRadius: root.__radiusB()
0198                 topRightRadius: root.__radiusA()
0199                 bottomRightRadius: root.__radiusA()
0200             }
0201 
0202             border {
0203                 width: 1
0204                 color: if (trailingButton.down || trailingButton.visualFocus) {
0205                     Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.4)
0206                 } else if (trailingButton.enabled && trailingButton.hovered) {
0207                     Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6)
0208                 } else {
0209                     Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, 0.2)
0210                 }
0211             }
0212 
0213             color: if (trailingButton.down || trailingButton.visualFocus) {
0214                 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6)
0215             } else if (trailingButton.enabled && trailingButton.hovered) {
0216                 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.8)
0217             } else {
0218                 Kirigami.Theme.backgroundColor
0219             }
0220 
0221             Behavior on color {
0222                 enabled: true
0223                 ColorAnimation {
0224                     duration: Kirigami.Units.longDuration
0225                     easing.type: Easing.OutCubic
0226                 }
0227             }
0228 
0229             Behavior on border.color {
0230                 id: trailingButtonBorderAnimation
0231                 enabled: true
0232                 ColorAnimation {
0233                     duration: Kirigami.Units.longDuration
0234                     easing.type: Easing.OutCubic
0235                 }
0236             }
0237         }
0238 
0239         contentItem: Item {
0240             Kirigami.Icon {
0241                 implicitHeight: if (trailingButton.icon.height) {
0242                     trailingButton.icon.height
0243                 } else {
0244                     Kirigami.Units.iconSizes.medium
0245                 }
0246                 implicitWidth: if (trailingButton.icon.width) {
0247                     trailingButton.icon.width
0248                 } else {
0249                     Kirigami.Units.iconSizes.medium
0250                 }
0251                 source: if (trailingButton.icon.name) {
0252                     trailingButton.icon.name
0253                 } else {
0254                     trailingButton.icon.source
0255                 }
0256                 anchors.centerIn: parent
0257             }
0258         }
0259 
0260         action: root.trailingAction
0261         anchors.right: root.right
0262         height: root.height
0263         width: root.height
0264         enabled: action ? action.enabled : false
0265         display: QQC2.AbstractButton.IconOnly
0266     }
0267 }