🏑 index : quine-global-labs/mirror-kde-plasma-desktop.git

/*
    SPDX-FileCopyrightText: 2011 Martin *GrÀßlin <mgraesslin@kde.org>
    SPDX-FileCopyrightText: 2012 Gregor Taetzner <gregor@freenet.de>
    SPDX-FileCopyrightText: 2014 Sebastian KΓΌgler <sebas@kde.org>
    SPDX-FileCopyrightText: 2015-2018 Eike Hein <hein@kde.org>
    SPDX-FileCopyrightText: 2021 Mikel Johnson <mikel5764@gmail.com>
    SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>
    SPDX-FileCopyrightText: 2022 Nate Graham <nate@kde.org>

    SPDX-License-Identifier: GPL-2.0-or-later
 */

pragma ComponentBehavior: Bound

import QtQuick
import QtQuick.Layouts
import org.kde.ksvg as KSvg
import org.kde.plasma.components as PC3
import org.kde.kirigami as Kirigami
import org.kde.plasma.plasmoid

AbstractKickoffItemDelegate {
    id: root

    property bool compact: Plasmoid.configuration.compactMode

    leftPadding: KickoffSingleton.listItemMetrics.margins.left
        + (mirrored ? KickoffSingleton.fontMetrics.descent : 0)
    rightPadding: KickoffSingleton.listItemMetrics.margins.right
        + (!mirrored ? KickoffSingleton.fontMetrics.descent : 0)
    // Otherwise it's *too* compact :)
    topPadding: compact && !isCategoryListItem ? Kirigami.Units.mediumSpacing : Kirigami.Units.smallSpacing
    bottomPadding: compact && !isCategoryListItem ? Kirigami.Units.mediumSpacing : Kirigami.Units.smallSpacing

    icon.width: compact || root.isCategoryListItem ? Kirigami.Units.iconSizes.smallMedium : Kirigami.Units.iconSizes.medium
    icon.height: compact || root.isCategoryListItem ? Kirigami.Units.iconSizes.smallMedium : Kirigami.Units.iconSizes.medium

    labelTruncated: label.truncated
    descriptionTruncated: descriptionLabel.truncated
    descriptionVisible: descriptionLabel.visible

    dragIconItem: icon

    contentItem: RowLayout {
        id: row
        spacing: KickoffSingleton.listItemMetrics.margins.left * 2

        Kirigami.Icon {
            id: icon
            implicitWidth: root.icon.width
            implicitHeight: root.icon.height
            Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter

            animated: false
            selected: root.iconAndLabelsShouldlookSelected
            source: root.removalPlaceholderActive ? "list-remove" : (root.decoration || root.icon.name || root.icon.source)
        }

        Item {
            id: gridLayoutWrapper // exists to break implicitWidth propagation

            implicitHeight: gridLayout.implicitHeight
            Layout.fillWidth: true

            GridLayout {
                id: gridLayout

                readonly property color textColor: root.iconAndLabelsShouldlookSelected ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor

                anchors.fill: parent
                visible: !root.removalPlaceholderActive

                rows: root.compact ? 1 : 2
                columns: root.compact ? 2 : 1
                rowSpacing: 0
                columnSpacing: Kirigami.Units.largeSpacing

                PC3.Label {
                    id: label
                    Layout.fillWidth: !descriptionLabel.visible
                    Layout.preferredWidth: Math.min(gridLayoutWrapper.width, implicitWidth)
                    text: root.text
                    textFormat: root.isMultilineText ? Text.StyledText : Text.PlainText
                    elide: Text.ElideRight
                    wrapMode: root.isMultilineText ? Text.WordWrap : Text.NoWrap
                    verticalAlignment: Text.AlignVCenter
                    maximumLineCount: root.isMultilineText ? Infinity : 1
                    color: gridLayout.textColor
                }

                PC3.Label {
                    id: descriptionLabel
                    Layout.fillWidth: true
                    visible: {
                        let isApplicationSearchResult = root.model?.group === "Applications" || root.model?.group === "System Settings"
                        let isSearchResultWithDescription = root.isSearchResult && (Plasmoid.configuration?.appNameFormat > 1 || !isApplicationSearchResult)
                        return text.length > 0 && (isSearchResultWithDescription || (text !== label.text && !root.isCategoryListItem && Plasmoid.configuration?.appNameFormat > 1))
                    }
                    opacity: 0.75
                    text: root.description
                    textFormat: Text.PlainText
                    font: Kirigami.Theme.smallFont
                    elide: Text.ElideRight
                    verticalAlignment: Text.AlignVCenter
                    horizontalAlignment: root.compact ? Text.AlignRight : Text.AlignLeft
                    maximumLineCount: 1
                    color: gridLayout.textColor
                }
            }
        }

        Loader {
            Layout.preferredWidth: root.isCategoryListItem ? Kirigami.Units.largeSpacing : implicitWidth
            Layout.preferredHeight: root.isCategoryListItem ? Kirigami.Units.largeSpacing : implicitHeight

            visible: active
            active: (root.model?.isNewlyInstalled ?? false) && !root.removalPlaceholderActive

            sourceComponent: Kirigami.Badge {
                text: root.isCategoryListItem ? "" : i18nc("Newly-installed app, badge, keep short", "New!")

                type: Kirigami.Badge.Type.Positive

                Accessible.description: root.isCategoryListItem
                    ? i18n("There is a newly-installed application in this category")
                    : i18n("Newly-installed application")
            }
        }
    }

    Loader {
        id: separatorLoader

        anchors.left: root.left
        anchors.right: root.right
        anchors.verticalCenter: root.verticalCenter

        active: root.isSeparator

        asynchronous: false
        sourceComponent: KSvg.SvgItem {
            width: parent.width
            height: KickoffSingleton.lineSvg.horLineHeight

            svg: KickoffSingleton.lineSvg
            elementId: "horizontal-line"
        }
    }
}