Warning, /frameworks/kirigami/src/controls/templates/AbstractCard.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  *  SPDX-FileCopyrightText: 2018 Marco Martin <mart@kde.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 import QtQuick 2.15
0008 import QtQuick.Layouts 1.15
0009 import QtQuick.Templates 2.15 as T
0010 import org.kde.kirigami 2.20 as Kirigami
0011 
0012 /**
0013  * A AbstractCard is the base for cards. A Card is a visual object that serves
0014  * as an entry point for more detailed information. An abstractCard is empty,
0015  * providing just the look and the base properties and signals for an ItemDelegate.
0016  * It can be filled with any custom layout of items, its content is organized
0017  * in 3 properties: header, contentItem and footer.
0018  * Use this only when you need particular custom contents, for a standard layout
0019  * for cards, use the Card component.
0020  *
0021  * @see Card
0022  * @inherit QtQuick.Controls.ItemDelegate
0023  * @since 2.4
0024  */
0025 T.ItemDelegate {
0026     id: root
0027 
0028 //BEGIN properties
0029     /**
0030      * @brief This property holds an item that serves as a header.
0031      *
0032      * This item will be positioned on top if headerOrientation is ``Qt.Vertical``
0033      * or on the left if it is ``Qt.Horizontal``.
0034      */
0035     property alias header: headerFooterLayout.header
0036 
0037     /**
0038      * @brief This property sets the card's orientation.
0039      *
0040      * * ``Qt.Vertical``: the header will be positioned on top
0041      * * ``Qt.Horizontal``: the header will be positioned on the left (or right if an RTL layout is used)
0042      *
0043      * default: ``Qt.Vertical``
0044      *
0045      * @property Qt::Orientation headerOrientation
0046      */
0047     property int headerOrientation: Qt.Vertical
0048 
0049     /**
0050      * @brief This property holds an item that serves as a footer.
0051      *
0052      * This item will be positioned at the bottom if headerOrientation is ``Qt.Vertical``
0053      * or on the right if it is ``Qt.Horizontal``.
0054      */
0055     property alias footer: headerFooterLayout.footer
0056 
0057     /**
0058      * @brief This property sets whether clicking or tapping on the card area shows a visual click feedback.
0059      *
0060      * Use this if you want to do an action in the onClicked signal handler of the card.
0061      *
0062      * default: ``false``
0063      */
0064     property bool showClickFeedback: false
0065 
0066 //END properties
0067 
0068     Layout.fillWidth: true
0069 
0070     implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
0071                             outerPaddingLayout.implicitWidth)
0072     implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
0073                              outerPaddingLayout.implicitHeight)
0074 
0075     hoverEnabled: !Kirigami.Settings.tabletMode && showClickFeedback
0076 
0077     Kirigami.Theme.inherit: false
0078     Kirigami.Theme.colorSet: Kirigami.Theme.View
0079 
0080     width: ListView.view ? ListView.view.width - ListView.view.leftMargin - ListView.view.rightMargin : undefined
0081     padding: Kirigami.Units.largeSpacing
0082 
0083     // Card component repurposes control's contentItem property, so it has to
0084     // reimplement content layout and its padding manually.
0085     Kirigami.Padding {
0086         id: outerPaddingLayout
0087 
0088         anchors.fill: parent
0089 
0090         topPadding: root.topPadding
0091         leftPadding: root.leftPadding
0092         rightPadding: root.rightPadding
0093         bottomPadding: root.bottomPadding
0094 
0095         contentItem: Kirigami.HeaderFooterLayout {
0096             id: headerFooterLayout
0097 
0098             contentItem: Kirigami.Padding {
0099                 id: innerPaddingLayout
0100 
0101                 contentItem: root.contentItem
0102 
0103                 // Hide it altogether, so that vertical padding won't be
0104                 // included in control's total implicit height.
0105                 visible: contentItem !== null
0106 
0107                 topPadding: headerFooterLayout.header ? Kirigami.Units.largeSpacing : 0
0108                 bottomPadding: headerFooterLayout.footer ? Kirigami.Units.largeSpacing : 0
0109             }
0110         }
0111     }
0112 
0113     // HACK: A Control like this ItemDelegate tries to manage its
0114     // contentItem's positioning, so we need to override that. This is
0115     // equivalent to declaring x/y/width/height bindings in QQC2 style
0116     // implementations.
0117     Connections {
0118         target: root.contentItem
0119 
0120         function onXChanged() {
0121             root.contentItem.x = 0;
0122         }
0123 
0124         function onYChanged() {
0125             root.contentItem.y = Qt.binding(() => innerPaddingLayout.topPadding);
0126         }
0127     }
0128 }