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

0001 // SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
0002 // SPDX-FileCopyrightText: 2023 Rishi Kumar <rsi.dev17@gmail.com>
0003 // SPDX-FileCopyrightText: 2023 Carl Schwan <carl@carlschwan.eu>
0004 // SPDX-License-Identifier: LGPL-2.0-or-later
0005 
0006 import QtQml
0007 import QtQuick
0008 import QtQuick.Controls as QQC2
0009 import QtQuick.Templates as T
0010 import QtQuick.Layouts
0011 
0012 import org.kde.kirigami as Kirigami
0013 
0014 import "private" as Private
0015 
0016 /**
0017  * This component render a grid of small cards.
0018  *
0019  * This is used to display multiple information in a MobileForm.FormLayout
0020  * without taking too much vertical space.
0021  *
0022  * @code{.qml}
0023  * import org.kde.kirigamiaddons.labs.mobileform 0.1 as MobileForm
0024  *
0025  * MobileForm.FormGridContainer {
0026  *     id: container
0027  *
0028  *     Layout.topMargin: Kirigami.Units.largeSpacing
0029  *     Layout.fillWidth: true
0030  *
0031  *     infoCards: [
0032  *         MobileForm.FormGridContainer.InfoCard {
0033  *             title: "42"
0034  *             subtitle: i18nc("@info:Number of Posts", "Posts")
0035  *         },
0036  *         MobileForm.FormGridContainer.InfoCard {
0037  *             title: "42"
0038  *             subtitle: i18nc("@info:Number of followers.", "Followers")
0039  *         }
0040  *     ]
0041  * }
0042  * @endcode
0043  *
0044  *
0045  * @since KirigamiAddons 0.11.0
0046  *
0047  * @inherit QtQuick.Item
0048  */
0049 Item {
0050     id: root
0051 
0052     /**
0053      * This property holds the maximum width of the grid.
0054      */
0055     property real maximumWidth: Kirigami.Units.gridUnit * 30
0056 
0057     /**
0058      * @brief This property holds the padding used around the content edges.
0059      *
0060      * default: `0`
0061      */
0062     property real padding: 0
0063     property real verticalPadding: padding
0064     property real horizontalPadding: padding
0065     property real topPadding: verticalPadding
0066     property real bottomPadding: verticalPadding
0067     property real leftPadding: horizontalPadding
0068     property real rightPadding: horizontalPadding
0069 
0070     /**
0071      * This property holds whether the card's width is being restricted.
0072      */
0073     readonly property bool cardWidthRestricted: root.width > root.maximumWidth
0074 
0075     /**
0076      * This property holds the InfoCards which should be displayed.
0077      *
0078      * Each InfoCard contains a title and an optional subtitle
0079      *
0080      * @code{.qml}
0081      * import org.kde.kirigamiaddons.labs.mobileform 0.1 as MobileForm
0082      *
0083      * MobileForm.FormGridContainer {
0084      *     infoCards: [
0085      *         MobileForm.FormGridContainer.InfoCard {
0086      *             title: "42"
0087      *             subtitle: i18nc("@info:Number of Posts", "Posts")
0088      *         },
0089      *         MobileForm.FormGridContainer.InfoCard {
0090      *             title: "42"
0091      *         },
0092      *         MobileForm.FormGridContainer.InfoCard {
0093      *             title: "Details"
0094      *             action: Kirigami.Action {
0095      *                 onClicked: pageStack.push("Details.qml")
0096      *             }
0097      *         }
0098      *     ]
0099      * }
0100      * @endcode
0101      */
0102     property list<QtObject> infoCards
0103 
0104     component InfoCard: QtObject {
0105         property bool visible: true
0106         property string title
0107         property string subtitle
0108         property string buttonIcon
0109         property string tooltipText
0110         property int subtitleTextFormat: Text.AutoText
0111         property Kirigami.Action action
0112     }
0113 
0114     Kirigami.Theme.colorSet: Kirigami.Theme.View
0115     Kirigami.Theme.inherit: false
0116 
0117     implicitHeight: topPadding + bottomPadding + grid.implicitHeight
0118 
0119     Item {
0120         anchors {
0121             top: parent.top
0122             bottom: parent.bottom
0123             left: parent.left
0124             right: parent.right
0125 
0126             leftMargin: root.cardWidthRestricted ? Math.round((root.width - root.maximumWidth) / 2) : 0
0127             rightMargin: root.cardWidthRestricted ? Math.round((root.width - root.maximumWidth) / 2) : 0
0128         }
0129 
0130         GridLayout {
0131             id: grid
0132 
0133             readonly property int cellWidth: Kirigami.Units.gridUnit * 10
0134             readonly property int visibleChildrenCount: visibleChildren.length - 1
0135 
0136             anchors {
0137                 fill: parent
0138                 leftMargin: root.leftPadding
0139                 rightMargin: root.rightPadding
0140                 topMargin: root.topPadding
0141                 bottomMargin: root.bottomPadding
0142             }
0143 
0144             columns: root.cardWidthRestricted && grid.visibleChildrenCount % 3 === 0 ? 3 : 2
0145             columnSpacing: Kirigami.Units.smallSpacing
0146             rowSpacing: Kirigami.Units.smallSpacing
0147 
0148             Repeater {
0149                 id: cardRepeater
0150 
0151                 model: root.infoCards
0152 
0153                 QQC2.AbstractButton {
0154                     id: infoCardDelegate
0155 
0156                     required property int index
0157                     required property QtObject modelData
0158 
0159                     readonly property string title: modelData.title
0160                     readonly property string subtitle: modelData.subtitle
0161                     readonly property string buttonIcon: modelData.buttonIcon
0162                     readonly property string tooltipText: modelData.tooltipText
0163                     readonly property int subtitleTextFormat: modelData.subtitleTextFormat
0164 
0165                     visible: modelData.visible
0166 
0167                     action: modelData.action
0168 
0169                     leftPadding: Kirigami.Units.largeSpacing
0170                     rightPadding: Kirigami.Units.largeSpacing
0171                     topPadding: Kirigami.Units.largeSpacing
0172                     bottomPadding: Kirigami.Units.largeSpacing
0173 
0174                     leftInset: root.cardWidthRestricted ? 0 : -infoCardDelegate.background.border.width
0175                     rightInset: root.cardWidthRestricted ? 0 : -infoCardDelegate.background.border.width
0176 
0177                     hoverEnabled: true
0178 
0179                     Accessible.name: title + " " + subtitle
0180                     Accessible.role: action ? Accessible.Button : Accessible.Note
0181 
0182                     Layout.preferredWidth: grid.cellWidth
0183                     Layout.columnSpan: grid.visibleChildrenCount % grid.columns !== 0 && index === grid.visibleChildrenCount - 1 ? 2 : 1
0184                     Layout.fillWidth: true
0185                     Layout.fillHeight: true
0186 
0187                     QQC2.ToolTip.text: tooltipText
0188                     QQC2.ToolTip.visible: tooltipText && hovered
0189                     QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0190 
0191                     background: Rectangle {
0192                         radius: root.cardWidthRestricted ? Kirigami.Units.smallSpacing : 0
0193                         color: Kirigami.Theme.backgroundColor
0194 
0195                         border {
0196                             color: Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, Kirigami.Theme.frameContrast)
0197                             width: 1
0198                         }
0199 
0200                         Rectangle {
0201                             anchors.fill: parent
0202                             radius: root.cardWidthRestricted ? Kirigami.Units.smallSpacing : 0
0203 
0204                             color: {
0205                                 let alpha = 0;
0206 
0207                                 if (!infoCardDelegate.enabled || !infoCardDelegate.action) {
0208                                     alpha = 0;
0209                                 } else if (infoCardDelegate.pressed) {
0210                                     alpha = 0.2;
0211                                 } else if (infoCardDelegate.visualFocus) {
0212                                     alpha = 0.1;
0213                                 } else if (!Kirigami.Settings.tabletMode && infoCardDelegate.hovered) {
0214                                     alpha = 0.07;
0215                                 }
0216 
0217                                 return Qt.rgba(Kirigami.Theme.textColor.r, Kirigami.Theme.textColor.g, Kirigami.Theme.textColor.b, alpha)
0218                             }
0219 
0220                             Behavior on color {
0221                                 ColorAnimation { duration: Kirigami.Units.shortDuration }
0222                             }
0223                         }
0224                     }
0225 
0226                     contentItem: RowLayout {
0227                         Kirigami.Icon {
0228                             id: icon
0229 
0230                             source: infoCardDelegate.buttonIcon
0231                             visible: source
0232                             Layout.alignment: Qt.AlignTop
0233                         }
0234 
0235                         ColumnLayout {
0236                             spacing: 0
0237 
0238                             // Title
0239                             Kirigami.Heading {
0240                                 Layout.fillWidth: true
0241                                 level: 4
0242                                 text: infoCardDelegate.title
0243                                 verticalAlignment: Text.AlignVCenter
0244                                 horizontalAlignment: icon.visible ? Text.AlignLeft : Text.AlignHCenter
0245                                 maximumLineCount: 2
0246                                 elide: Text.ElideRight
0247                                 wrapMode: Text.Wrap
0248                             }
0249 
0250                             // Subtitle
0251                             QQC2.Label {
0252                                 Layout.fillWidth: true
0253                                 Layout.fillHeight: true
0254                                 visible: infoCardDelegate.subtitle
0255                                 text: infoCardDelegate.subtitle
0256                                 horizontalAlignment: icon.visible ? Text.AlignLeft : Text.AlignHCenter
0257                                 elide: Text.ElideRight
0258                                 wrapMode: Text.Wrap
0259                                 textFormat: infoCardDelegate.subtitleTextFormat
0260                                 opacity: 0.6
0261                                 verticalAlignment: Text.AlignTop
0262                                 onLinkActivated: (link) => modelData.linkActivated(link)
0263                             }
0264                         }
0265                     }
0266                 }
0267             }
0268         }
0269     }
0270 }