/*SPDX-FileCopyrightText: 2025 Vlad Zahorodnii <vlad.zahorodnii@kde.org>SPDX-License-Identifier: GPL-2.0-or-later*/pragma ComponentBehavior: Boundimport QtQuickimport QtQuick.Controlsimport QtQuick.Layoutsimport org.kde.kirigami as Kirigamiimport org.kde.plasma.landingpage.kcmColumn {id: rootrequired property ButtonGroup groupproperty string packageIdproperty int variantproperty alias checked: button.checkedproperty alias popupEnabled: indicator.visibleproperty alias preview: button.contentItemproperty string text: metaData.namereadonly property alias previewImage: previewImagereadonly property int implicitButtonHeight: Kirigami.Units.gridUnit * 5readonly property int implicitButtonWidth: implicitButtonHeight * 1.6readonly property alias hovered: button.hoveredsignal toggled()signal accepted(id: string)spacing: Kirigami.Units.smallSpacingAbstractButton {id: buttontext: root.textimplicitWidth: root.implicitButtonWidth + implicitIndicatorWidthimplicitHeight: root.implicitButtonHeightButtonGroup.group: root.groupcheckable: trueKirigami.Theme.inherit: falseKirigami.Theme.colorSet: Kirigami.Theme.Viewpadding: Kirigami.Units.smallSpacingrightPadding: Kirigami.Units.smallSpacing + implicitIndicatorWidthonToggled: root.toggled()contentItem: Image {id: previewImagesourceSize: Qt.size(width * Screen.devicePixelRatio, height * Screen.devicePixelRatio)source: metaData.previewlayer.enabled: true}background: Kirigami.ShadowedRectangle {Rectangle {width: root.implicitButtonWidthheight: root.implicitButtonHeighttopLeftRadius: parent.radiusbottomLeftRadius: parent.radiustopRightRadius: indicator.visible ? 0 : parent.radius;bottomRightRadius: indicator.visible ? 0 : parent.radiuscolor: {if (button.checked) {return Kirigami.Theme.highlightColor;} else if (button.hovered) {return Qt.rgba(Kirigami.Theme.highlightColor.r, Kirigami.Theme.highlightColor.g, Kirigami.Theme.highlightColor.b, 0.5);} else {return Kirigami.Theme.backgroundColor;}}}color: Kirigami.Theme.backgroundColorradius: Kirigami.Units.cornerRadiusshadow {xOffset: 0yOffset: 2size: 10color: Qt.rgba(0, 0, 0, 0.3)}}indicator: AbstractButton {id: indicatoranchors.right: parent.rightimplicitWidth: visible ? Kirigami.Units.iconSizes.small + leftPadding + rightPadding : 0implicitHeight: root.implicitButtonHeightpadding: Kirigami.Units.smallSpacingvisible: root.popupEnabledtext: i18nc("@action:button", "Change global theme")display: AbstractButton.IconOnlyAccessible.role: Accessible.ButtonMenuproperty Popup popupcontentItem: Kirigami.Icon {source: "arrow-down"}background: Rectangle {color: {if (indicator.pressed || indicator.popup?.visible) {return Kirigami.Theme.highlightColor;} else if (indicator.hovered || indicator.visualFocus) {return Qt.rgba(Kirigami.Theme.highlightColor.r, Kirigami.Theme.highlightColor.g, Kirigami.Theme.highlightColor.b, 0.5);} else {return Kirigami.Theme.backgroundColor;}}topRightRadius: Kirigami.Units.cornerRadiusbottomRightRadius: Kirigami.Units.cornerRadius}onClicked: {if (popup) {popup.close();} else {popup = popupComponent.createObject(root)popup.open();}}}}Label {id: labelwidth: button.implicitWidthtext: root.texttextFormat: Text.PlainTexthorizontalAlignment: Text.AlignHCenterwrapMode: Text.WrapRectangle {anchors.horizontalCenter: parent.horizontalCenteranchors.bottom: parent.bottomwidth: parent.paintedWidthheight: 1color: Kirigami.Theme.highlightColoropacity: button.visualFocus ? 1 : 0}}Component {id: popupComponentPopup {id: popupy: button.heightimplicitHeight: Math.min(contentItem.implicitHeight + topPadding + bottomPadding, Kirigami.Units.gridUnit * 40, root.Window.height - Kirigami.Units.gridUnit * 10)focus: truepopupType: Popup.Itempadding: 1clip: falsemodal: truecontentItem: ScrollView {ScrollBar.horizontal.policy: ScrollBar.AlwaysOffcontentWidth: listView.implicitWidthcontentHeight: listView.implicitHeightfocus: trueclip: truebottomPadding: leftPadding > 0 ? leftPadding : Kirigami.Units.mediumSpacingListView {id: listViewAccessible.role: Accessible.List // TODO: remove once Qt sets this automaticallyAccessible.name: i18nc("@label accessible", "Global theme")focus: trueimplicitWidth: button.widthimplicitHeight: contentHeight// Note: Make sure this model is not part of the direct instantiation of the main// page, to avoid doing a lot of potentially unnecessary lookup of LookAndFeel// data from disk. In this case, this popup is dynamically created so we only// load data when the popup is visible.model: LookAndFeelModel {variant: root.variant}delegate: ItemDelegate {id: delegaterequired property string packageIdrequired property string previewrequired property string nametext: namewidth: ListView.view.widthcontentItem: Column {spacing: Kirigami.Units.smallSpacingImage {width: parent.widthheight: width / 1.6source: delegate.preview}Label {width: parent.widthhorizontalAlignment: Text.AlignHCentertext: delegate.texttextFormat: Text.PlainTextelide: Text.ElideRight}}onClicked: {root.accepted(delegate.packageId);popup.close();}}}}background: Kirigami.ShadowedRectangle {Kirigami.Theme.inherit: falseKirigami.Theme.colorSet: Kirigami.Theme.Viewcolor: Kirigami.Theme.backgroundColorradius: Kirigami.Units.cornerRadiusborder.width: 1border.color: Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, Kirigami.Theme.frameContrast)shadow {size: 10yOffset: 2color: Qt.rgba(0, 0, 0, 0.2)}}onAboutToShow: {listView.currentIndex = listView.model.indexOf(root.packageId);}onClosed: {if (indicator.popup) {indicator.popup.destroy()indicator.popup = null}}}}LookAndFeelMetaData {id: metaDatapackageId: root.packageId}}