// Version 9 import QtQuick 2.0 import QtQuick.Controls 2.0 as QQC2 import QtQuick.Layouts 1.0 import org.kde.kirigami 2.0 as Kirigami import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.kquickcontrolsaddons 2.0 as KQuickAddons RowLayout { id: iconField default property alias _contentChildren: content.data property string configKey: '' property alias value: textField.text readonly property string configValue: configKey ? plasmoid.configuration[configKey] : "" onConfigValueChanged: { if (!textField.focus && value != configValue) { value = configValue } } property int previewIconSize: Kirigami.Units.iconSizes.medium property string defaultValue: "" property alias placeholderValue: textField.placeholderText property var presetValues: [] // Based on org.kde.plasma.kickoff QQC2.Button { id: iconButton padding: Kirigami.Units.smallSpacing Layout.alignment: Qt.AlignTop // KDE QQC2 sets implicitSize to background.implicitSize ignoring padding/inset properties. implicitWidth: leftPadding + contentItem.implicitWidth + rightPadding implicitHeight: topPadding + contentItem.implicitHeight + bottomPadding onPressed: iconMenu.opened ? iconMenu.close() : iconMenu.open() contentItem: PlasmaCore.FrameSvgItem { id: previewFrame imagePath: plasmoid.location === PlasmaCore.Types.Vertical || plasmoid.location === PlasmaCore.Types.Horizontal ? "widgets/panel-background" : "widgets/background" implicitWidth: fixedMargins.left + previewIconSize + fixedMargins.right implicitHeight: fixedMargins.top + previewIconSize + fixedMargins.bottom PlasmaCore.IconItem { anchors.fill: parent anchors.leftMargin: previewFrame.fixedMargins.left anchors.topMargin: previewFrame.fixedMargins.top anchors.rightMargin: previewFrame.fixedMargins.right anchors.bottomMargin: previewFrame.fixedMargins.bottom source: iconField.value || iconField.placeholderValue active: iconButton.hovered } } QQC2.Menu { id: iconMenu // Appear below the button y: +parent.height QQC2.MenuItem { text: i18ndc("plasma_applet_org.kde.plasma.kickoff", "@item:inmenu Open icon chooser dialog", "Choose...") icon.name: "document-open" onClicked: dialogLoader.active = true } QQC2.MenuItem { text: i18ndc("plasma_applet_org.kde.plasma.kickoff", "@item:inmenu Reset icon to default", "Clear Icon") icon.name: "edit-clear" onClicked: iconField.value = iconField.defaultValue } } } ColumnLayout { id: content Layout.fillWidth: true RowLayout { QQC2.TextField { id: textField Layout.fillWidth: true text: iconField.configValue onTextChanged: serializeTimer.restart() rightPadding: clearButton.width + Kirigami.Units.smallSpacing QQC2.ToolButton { id: clearButton visible: iconField.configValue != iconField.defaultValue icon.name: iconField.defaultValue === "" ? "edit-clear" : "edit-undo" onClicked: iconField.value = iconField.defaultValue anchors.top: parent.top anchors.right: parent.right anchors.bottom: parent.bottom width: height } } QQC2.Button { id: browseButton icon.name: "document-open" onClicked: dialogLoader.active = true } } Flow { Layout.fillWidth: true Layout.maximumWidth: Kirigami.Units.gridUnit * 30 Repeater { model: presetValues QQC2.Button { icon.name: modelData text: modelData onClicked: iconField.value = modelData } } } } Loader { id: dialogLoader active: false sourceComponent: KQuickAddons.IconDialog { id: dialog visible: true modality: Qt.WindowModal onIconNameChanged: { iconField.value = iconName } onVisibleChanged: { if (!visible) { dialogLoader.active = false } } } } Timer { // throttle id: serializeTimer interval: 300 onTriggered: { if (configKey) { plasmoid.configuration[configKey] = iconField.value } } } }