Warning, /frameworks/kirigami/src/controls/private/BannerImage.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
0008 import QtQuick.Layouts
0009 import QtQuick.Controls as QQC2
0010 import org.kde.kirigami as Kirigami
0011 
0012 /**
0013  * This Component is used as the header of GlobalDrawer and as the header
0014  * of Card, It can be accessed there as a grouped property but can never
0015  * be instantiated directly.
0016  * \private
0017  */
0018 Kirigami.ShadowedImage {
0019     id: root
0020 
0021 //BEGIN properties
0022     /**
0023      * @brief This property holds an icon to be displayed alongside the title.
0024      *
0025      * It can be a QIcon, a FreeDesktop-compatible icon name, or any URL understood by QtQuick.Image.
0026      *
0027      * @property var titleIcon
0028      */
0029     property alias titleIcon: headingIcon.source
0030 
0031     /**
0032      * @brief This property holds the title's text which is to be displayed on top.
0033      * of the image.
0034      * @see QtQuick.Text::text
0035      * @property string title
0036      */
0037     property alias title: heading.text
0038 
0039     /**
0040      * @brief This property holds the title's position.
0041      *
0042      * default: ``Qt.AlignTop | Qt.AlignLeft``
0043      *
0044      * @property Qt::Alignment titleAlignment
0045      */
0046     property int titleAlignment: Qt.AlignTop | Qt.AlignLeft
0047 
0048     /**
0049      * @brief This property holds the title's level.
0050      *
0051      * Available text size values range from 1 (largest) to 5 (smallest).
0052      *
0053      * default: ``1``
0054      *
0055      * @see org::kde::kirigami::Heading::level
0056      * @property int titleLevel
0057      */
0058     property alias titleLevel: heading.level
0059 
0060     /**
0061      * @brief This property holds the title's wrap mode.
0062      *
0063      * default: ``Text.NoWrap``
0064      *
0065      * @see QtQuick.Text::wrapMode
0066      * @property int titleWrapMode
0067      */
0068     property alias titleWrapMode: heading.wrapMode
0069 
0070     /**
0071      * @brief This property holds whether the title is part of an item considered
0072      * checkable.
0073      *
0074      * If true, a checkbox will appear in the top-right corner of the title area.
0075      *
0076      * default: false
0077      *
0078      * @property bool checkable
0079      */
0080     property bool checkable: false
0081 
0082     /**
0083      * @brief This property holds whether the title's checkbox is currently checked.
0084      *
0085      * If using this outside of a GlobalDrawer or a Card, you must manually bind
0086      * this to the checked condition of the parent item, or whatever else in your
0087      * UI signals checkability. You must also handle the `toggled` signal when
0088      * the user manually clicks the checkbox.
0089      *
0090      * default: false
0091      *
0092      * @property bool checked
0093      */
0094     property bool checked: false
0095 
0096     property int leftPadding: headingIcon.valid ? Kirigami.Units.smallSpacing * 2 : Kirigami.Units.largeSpacing
0097     property int topPadding: headingIcon.valid ? Kirigami.Units.smallSpacing * 2 : Kirigami.Units.largeSpacing
0098     property int rightPadding: headingIcon.valid ? Kirigami.Units.smallSpacing * 2 : Kirigami.Units.largeSpacing
0099     property int bottomPadding: headingIcon.valid ? Kirigami.Units.smallSpacing * 2 : Kirigami.Units.largeSpacing
0100 
0101     property int implicitWidth: Layout.preferredWidth
0102 
0103     readonly property bool empty: title.length === 0 &&             // string
0104                                   source.toString().length === 0 && // QUrl
0105                                   !titleIcon                        // QVariant hanled by Kirigami.Icon
0106 //END properties
0107 
0108     signal toggled(bool checked)
0109 
0110     Layout.fillWidth: true
0111 
0112     Layout.preferredWidth: titleLayout.implicitWidth || sourceSize.width
0113     Layout.preferredHeight: titleLayout.completed && source.toString().length > 0 ? width/(sourceSize.width / sourceSize.height) : Layout.minimumHeight
0114     Layout.minimumHeight: titleLayout.implicitHeight > 0 ? titleLayout.implicitHeight + Kirigami.Units.smallSpacing * 2 : 0
0115 
0116     onTitleAlignmentChanged: {
0117         // VERTICAL ALIGNMENT
0118         titleLayout.anchors.top = undefined
0119         titleLayout.anchors.verticalCenter = undefined
0120         titleLayout.anchors.bottom = undefined
0121         shadowedRectangle.anchors.top = undefined
0122         shadowedRectangle.anchors.verticalCenter = undefined
0123         shadowedRectangle.anchors.bottom = undefined
0124 
0125         if (root.titleAlignment & Qt.AlignTop) {
0126             titleLayout.anchors.top = root.top
0127             shadowedRectangle.anchors.top = root.top
0128         }
0129         else if (root.titleAlignment & Qt.AlignVCenter) {
0130             titleLayout.anchors.verticalCenter = root.verticalCenter
0131             shadowedRectangle.anchors.verticalCenter = root.verticalCenter
0132         }
0133         else if (root.titleAlignment & Qt.AlignBottom) {
0134             titleLayout.anchors.bottom = root.bottom
0135             shadowedRectangle.anchors.bottom = root.bottom
0136         }
0137 
0138         // HORIZONTAL ALIGNMENT
0139         titleLayout.anchors.left = undefined
0140         titleLayout.anchors.horizontalCenter = undefined
0141         titleLayout.anchors.right = undefined
0142         if (root.titleAlignment & Qt.AlignRight) {
0143             titleLayout.anchors.right = root.right
0144         }
0145         else if (root.titleAlignment & Qt.AlignHCenter) {
0146             titleLayout.anchors.horizontalCenter = root.horizontalCenter
0147         }
0148         else if (root.titleAlignment & Qt.AlignLeft) {
0149             titleLayout.anchors.left = root.left
0150         }
0151     }
0152     fillMode: Image.PreserveAspectCrop
0153     asynchronous: true
0154 
0155     color: "transparent"
0156 
0157     Component.onCompleted: {
0158         titleLayout.completed = true;
0159     }
0160 
0161     Kirigami.ShadowedRectangle {
0162         id: shadowedRectangle
0163         anchors {
0164             left: parent.left
0165             right: parent.right
0166         }
0167         height: Math.min(parent.height, titleLayout.height * 1.5)
0168 
0169         opacity: 0.5
0170         color: "black"
0171 
0172         corners.topLeftRadius: root.titleAlignment & Qt.AlignTop ? root.corners.topLeftRadius : 0
0173         corners.topRightRadius: root.titleAlignment & Qt.AlignTop ? root.corners.topRightRadius : 0
0174         corners.bottomLeftRadius: root.titleAlignment & Qt.AlignBottom ? root.corners.bottomLeftRadius : 0
0175         corners.bottomRightRadius: root.titleAlignment & Qt.AlignBottom ? root.corners.bottomRightRadius : 0
0176 
0177         visible: root.source.toString().length !== 0 && root.title.length !== 0 && ((root.titleAlignment & Qt.AlignTop) || (root.titleAlignment & Qt.AlignVCenter) || (root.titleAlignment & Qt.AlignBottom))
0178     }
0179 
0180     RowLayout {
0181         id: titleLayout
0182         property bool completed: false
0183         anchors {
0184             leftMargin: root.leftPadding
0185             topMargin: root.topPadding
0186             rightMargin: root.rightPadding
0187             bottomMargin: root.bottomPadding
0188         }
0189         width: Math.min(implicitWidth, parent.width -root.leftPadding -root.rightPadding - (checkboxLoader.active ? Kirigami.Units.largeSpacing : 0))
0190         height: Math.min(implicitHeight, parent.height -root.topPadding -root.bottomPadding)
0191         Kirigami.Icon {
0192             id: headingIcon
0193             Layout.minimumWidth: Kirigami.Units.iconSizes.large
0194             Layout.minimumHeight: width
0195             visible: valid
0196             isMask: false
0197         }
0198         Kirigami.Heading {
0199             id: heading
0200             Layout.fillWidth: true
0201             Layout.fillHeight: true
0202             verticalAlignment: Text.AlignVCenter
0203             visible: text.length > 0
0204             level: 1
0205             color: root.source.toString().length > 0 ? "white" : Kirigami.Theme.textColor
0206             wrapMode: Text.NoWrap
0207             elide: Text.ElideRight
0208         }
0209     }
0210 
0211     Loader {
0212         id: checkboxLoader
0213         anchors {
0214             top: parent.top
0215             right: parent.right
0216             topMargin: root.topPadding
0217         }
0218         active: root.checkable
0219         sourceComponent: QQC2.CheckBox {
0220             checked: root.checked
0221             onToggled: root.toggled(checked);
0222         }
0223     }
0224 }