import QtQuick import QtQuick.Layouts import QtQuick.Controls import org.kde.plasma.plasmoid import org.kde.plasma.components 3.0 as PlasmaComponents import org.kde.kirigami as Kirigami PlasmoidItem { id: root // Data Management ListModel { id: charModel Component.onCompleted: loadChars() } function loadChars() { charModel.clear() var configStr = Plasmoid.configuration.savedCharacters || '[]' try { var chars = JSON.parse(configStr) for (var i = 0; i < chars.length; i++) { charModel.append({ "charText": chars[i] }) } } catch (e) { console.log("Error loading characters: " + e) } } function saveChars() { var chars = [] for (var i = 0; i < charModel.count; i++) { chars.push(charModel.get(i).charText) } Plasmoid.configuration.savedCharacters = JSON.stringify(chars) } function resetToDefaults() { // Explicitly set to the defaults defined in your main.xml Plasmoid.configuration.savedCharacters = '["Ä", "ä", "Å", "å", "Ö", "ö", "€"]' loadChars() } function clearAll() { charModel.clear() Plasmoid.configuration.savedCharacters = "[]" } function addChar(text) { if (text.trim() === "") return charModel.append({ "charText": text }) saveChars() } function removeChar(index) { charModel.remove(index) saveChars() } TextEdit { id: clipboardHelper visible: false } function copyToClipboard(str) { clipboardHelper.text = str clipboardHelper.selectAll() clipboardHelper.copy() } compactRepresentation: PlasmaComponents.Button { icon.name: "accessories-character-map" flat: true padding: 0 onClicked: root.expanded = !root.expanded } fullRepresentation: Item { implicitWidth: Kirigami.Units.gridUnit * 12 implicitHeight: Kirigami.Units.gridUnit * 14 ColumnLayout { anchors.fill: parent anchors.margins: Kirigami.Units.smallSpacing // --- HEADER --- RowLayout { Layout.fillWidth: true PlasmaComponents.Label { text: "Quick Characters" font.bold: true Layout.fillWidth: true } // Reset to Defaults Button PlasmaComponents.Button { icon.name: "edit-undo" flat: true onClicked: root.resetToDefaults() display: PlasmaComponents.AbstractButton.IconOnly // Use the standard ToolTip component ToolTip.text: "Reset to defaults" ToolTip.visible: hovered } // Clear All Button PlasmaComponents.Button { icon.name: "edit-clear-all" flat: true onClicked: root.clearAll() display: PlasmaComponents.AbstractButton.IconOnly ToolTip.text: "Clear all" ToolTip.visible: hovered } } // --- GRID & PLACEHOLDER --- Item { Layout.fillWidth: true Layout.fillHeight: true // Dimmed placeholder label PlasmaComponents.Label { anchors.centerIn: parent text: "Add a character..." opacity: 0.5 font.italic: true visible: charModel.count === 0 } ScrollView { anchors.fill: parent visible: charModel.count > 0 ScrollBar.horizontal.policy: ScrollBar.AlwaysOff GridView { id: grid model: charModel cellWidth: 60 cellHeight: 60 clip: true delegate: Item { width: grid.cellWidth height: grid.cellHeight PlasmaComponents.Button { anchors.centerIn: parent width: 48 height: 48 text: model.charText onClicked: { copyToClipboard(model.charText) root.expanded = false } MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton onClicked: root.removeChar(index) } } } } } } // --- INPUT --- RowLayout { PlasmaComponents.TextField { id: inputField Layout.fillWidth: true placeholderText: "Add..." onAccepted: { addChar(text) text = "" } } PlasmaComponents.Button { icon.name: "list-add" onClicked: { addChar(inputField.text) inputField.text = "" } } } } } }