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 */ 0054 property Kirigami.Action leadingAction 0055 0056 /** 0057 * This property holds the trailing action. 0058 */ 0059 property Kirigami.Action trailingAction 0060 0061 // Note: binding corners to each other results in binding loops, because 0062 // they share one common NOTIFY signal. Storing properties wastes memory. 0063 // So these two expressions are implemented as little helper functions. 0064 0065 // Left for leading and right for trailing buttons 0066 function __radiusA(): real { 0067 return LayoutMirroring.enabled ? 0 : radius; 0068 } 0069 0070 // and vice-versa 0071 function __radiusB(): real { 0072 return LayoutMirroring.enabled ? radius : 0; 0073 } 0074 0075 readonly property real __padding: Kirigami.Settings.hasTransientTouchInput ? (Kirigami.Units.largeSpacing * 2) : Kirigami.Units.largeSpacing 0076 0077 radius: Kirigami.Units.largeSpacing 0078 color: "transparent" 0079 0080 implicitHeight: Math.max(leadingButton.implicitContentHeight, trailingButton.implicitContentHeight) + __padding * 2 0081 implicitWidth: 2 * implicitHeight - 1 0082 0083 shadow { 0084 size: 10 0085 xOffset: 0 0086 yOffset: 2 0087 color: Qt.rgba(0, 0, 0, 0.2) 0088 } 0089 0090 QQC2.Button { 0091 id: leadingButton 0092 0093 LayoutMirroring.enabled: root.LayoutMirroring.enabled 0094 0095 z: (down || visualFocus || (enabled && hovered)) ? 2 : leadingButtonBorderAnimation.running ? 1 : 0 0096 0097 background: Kirigami.ShadowedRectangle { 0098 id: leadingButtonBackground 0099 0100 Kirigami.Theme.inherit: false 0101 Kirigami.Theme.colorSet: Kirigami.Theme.Window 0102 0103 corners { 0104 topLeftRadius: root.__radiusA() 0105 bottomLeftRadius: root.__radiusA() 0106 topRightRadius: root.__radiusB() 0107 bottomRightRadius: root.__radiusB() 0108 } 0109 0110 border { 0111 width: 1 0112 color: if (leadingButton.down || leadingButton.visualFocus) { 0113 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.4) 0114 } else if (leadingButton.enabled && leadingButton.hovered) { 0115 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6) 0116 } else { 0117 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, Kirigami.Theme.frameContrast) 0118 } 0119 } 0120 0121 color: if (leadingButton.down || leadingButton.visualFocus) { 0122 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6) 0123 } else if (leadingButton.enabled && leadingButton.hovered) { 0124 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.8) 0125 } else { 0126 Kirigami.Theme.backgroundColor 0127 } 0128 0129 Behavior on color { 0130 enabled: true 0131 ColorAnimation { 0132 duration: Kirigami.Units.longDuration 0133 easing.type: Easing.OutCubic 0134 } 0135 } 0136 0137 Behavior on border.color { 0138 enabled: true 0139 ColorAnimation { 0140 id: leadingButtonBorderAnimation 0141 duration: Kirigami.Units.longDuration 0142 easing.type: Easing.OutCubic 0143 } 0144 } 0145 } 0146 0147 contentItem: Item { 0148 implicitHeight: leadingIcon.implicitHeight 0149 implicitWidth: leadingIcon.implicitWidth 0150 Kirigami.Icon { 0151 id: leadingIcon 0152 implicitHeight: if (leadingAction.icon.height) { 0153 leadingButton.icon.height 0154 } else { 0155 Kirigami.Units.iconSizes.medium 0156 } 0157 implicitWidth: if (leadingAction.icon.width) { 0158 leadingButton.icon.width 0159 } else { 0160 Kirigami.Units.iconSizes.medium 0161 } 0162 source: if (leadingButton.icon.name) { 0163 leadingButton.icon.name 0164 } else { 0165 leadingButton.icon.source 0166 } 0167 anchors.centerIn: parent 0168 } 0169 } 0170 action: root.leadingAction 0171 anchors.left: root.left 0172 height: root.height 0173 width: root.height 0174 enabled: action ? action.enabled : false 0175 display: QQC2.AbstractButton.IconOnly 0176 } 0177 0178 QQC2.Button { 0179 id: trailingButton 0180 0181 LayoutMirroring.enabled: root.LayoutMirroring.enabled 0182 0183 z: (down || visualFocus || (enabled && hovered)) ? 2 : trailingButtonBorderAnimation.running ? 1 : 0 0184 0185 background: Kirigami.ShadowedRectangle { 0186 Kirigami.Theme.inherit: false 0187 Kirigami.Theme.colorSet: Kirigami.Theme.Window 0188 0189 corners { 0190 topLeftRadius: root.__radiusB() 0191 bottomLeftRadius: root.__radiusB() 0192 topRightRadius: root.__radiusA() 0193 bottomRightRadius: root.__radiusA() 0194 } 0195 0196 border { 0197 width: 1 0198 color: if (trailingButton.down || trailingButton.visualFocus) { 0199 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.4) 0200 } else if (trailingButton.enabled && trailingButton.hovered) { 0201 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6) 0202 } else { 0203 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, Kirigami.Theme.frameContrast) 0204 } 0205 } 0206 0207 color: if (trailingButton.down || trailingButton.visualFocus) { 0208 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.6) 0209 } else if (trailingButton.enabled && trailingButton.hovered) { 0210 Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.hoverColor, Kirigami.Theme.backgroundColor, 0.8) 0211 } else { 0212 Kirigami.Theme.backgroundColor 0213 } 0214 0215 Behavior on color { 0216 enabled: true 0217 ColorAnimation { 0218 duration: Kirigami.Units.longDuration 0219 easing.type: Easing.OutCubic 0220 } 0221 } 0222 0223 Behavior on border.color { 0224 id: trailingButtonBorderAnimation 0225 enabled: true 0226 ColorAnimation { 0227 duration: Kirigami.Units.longDuration 0228 easing.type: Easing.OutCubic 0229 } 0230 } 0231 } 0232 0233 contentItem: Item { 0234 implicitHeight: trailingIcon.implicitHeight 0235 implicitWidth: trailingIcon.implicitWidth 0236 Kirigami.Icon { 0237 id: trailingIcon 0238 implicitHeight: if (trailingAction.icon.height) { 0239 trailingButton.icon.height 0240 } else { 0241 Kirigami.Units.iconSizes.medium 0242 } 0243 implicitWidth: if (trailingAction.icon.width) { 0244 trailingButton.icon.width 0245 } else { 0246 Kirigami.Units.iconSizes.medium 0247 } 0248 source: if (trailingButton.icon.name) { 0249 trailingButton.icon.name 0250 } else { 0251 trailingButton.icon.source 0252 } 0253 anchors.centerIn: parent 0254 } 0255 } 0256 0257 action: root.trailingAction 0258 anchors.right: root.right 0259 height: root.height 0260 width: root.height 0261 enabled: action ? action.enabled : false 0262 display: QQC2.AbstractButton.IconOnly 0263 } 0264 }