summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample
diff options
context:
space:
mode:
authorAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
committerAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
commit70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 (patch)
treeab1123d4067c1b086dd6faa7ee4ea643236b565a /raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample
parent5d94c0a7d44a2255b81815a52a7056a94a39842d (diff)
downloadRaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.tar.gz
RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.zip
Replaced file structures for themes in the correct format
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesLauncher.qml174
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesSettings.qml263
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/plugin.json17
3 files changed, 454 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesLauncher.qml b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesLauncher.qml
new file mode 100644
index 0000000..42e4001
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesLauncher.qml
@@ -0,0 +1,174 @@
+import QtQuick
+import Quickshell
+import qs.Services
+
+Item {
+ id: root
+
+ property var pluginService: null
+ property string trigger: "n"
+
+ signal itemsChanged
+
+ property var notes: []
+ property int maxNotes: 50
+
+ Component.onCompleted: {
+ if (!pluginService)
+ return;
+ trigger = pluginService.loadPluginData("quickNotesExample", "trigger", "n");
+ maxNotes = pluginService.loadPluginData("quickNotesExample", "maxNotes", 50);
+
+ // Load notes from plugin STATE (persistent across sessions, separate file)
+ notes = pluginService.loadPluginState("quickNotesExample", "notes", []);
+ }
+
+ function getItems(query) {
+ const items = [];
+
+ if (query && query.trim().length > 0) {
+ const text = query.trim();
+ items.push({
+ name: "Save note: " + text,
+ icon: "material:note_add",
+ comment: "Save as a new note",
+ action: "add:" + text,
+ categories: ["Quick Notes"]
+ });
+
+ items.push({
+ name: "Copy: " + text,
+ icon: "material:content_copy",
+ comment: "Copy text to clipboard",
+ action: "copy:" + text,
+ categories: ["Quick Notes"]
+ });
+ }
+
+ const filteredNotes = query ? notes.filter(n => n.text.toLowerCase().includes(query.toLowerCase())) : notes;
+
+ for (let i = 0; i < Math.min(20, filteredNotes.length); i++) {
+ const note = filteredNotes[i];
+ const age = _formatAge(note.timestamp);
+ items.push({
+ name: note.text,
+ icon: "material:sticky_note_2",
+ comment: age + " — select to copy, hold for options",
+ action: "copy:" + note.text,
+ categories: ["Quick Notes"]
+ });
+ }
+
+ if (notes.length > 0 && !query) {
+ items.push({
+ name: "Clear all notes (" + notes.length + ")",
+ icon: "material:delete_sweep",
+ comment: "Remove all saved notes",
+ action: "clear:",
+ categories: ["Quick Notes"]
+ });
+ }
+
+ return items;
+ }
+
+ function executeItem(item) {
+ if (!item?.action)
+ return;
+
+ const colonIdx = item.action.indexOf(":");
+ const actionType = item.action.substring(0, colonIdx);
+ const actionData = item.action.substring(colonIdx + 1);
+
+ switch (actionType) {
+ case "add":
+ addNote(actionData);
+ break;
+ case "copy":
+ copyToClipboard(actionData);
+ break;
+ case "remove":
+ removeNote(actionData);
+ break;
+ case "clear":
+ clearAllNotes();
+ break;
+ default:
+ showToast("Unknown action: " + actionType);
+ }
+ }
+
+ function addNote(text) {
+ if (!text)
+ return;
+
+ const existing = notes.findIndex(n => n.text === text);
+ if (existing !== -1)
+ notes.splice(existing, 1);
+
+ notes.unshift({
+ text: text,
+ timestamp: Date.now()
+ });
+
+ if (notes.length > maxNotes)
+ notes = notes.slice(0, maxNotes);
+
+ _saveNotes();
+ showToast("Note saved");
+ }
+
+ function removeNote(text) {
+ notes = notes.filter(n => n.text !== text);
+ _saveNotes();
+ showToast("Note removed");
+ }
+
+ function clearAllNotes() {
+ notes = [];
+ pluginService.clearPluginState("quickNotesExample");
+ showToast("All notes cleared");
+ itemsChanged();
+ }
+
+ function _saveNotes() {
+ if (!pluginService)
+ return;
+ // Save to plugin STATE — writes to quickNotesExample_state.json
+ // This is separate from plugin SETTINGS (plugin_settings.json)
+ pluginService.savePluginState("quickNotesExample", "notes", notes);
+ itemsChanged();
+ }
+
+ function copyToClipboard(text) {
+ Quickshell.execDetached(["dms", "cl", "copy", text]);
+ showToast("Copied to clipboard");
+ }
+
+ function showToast(message) {
+ if (typeof ToastService !== "undefined")
+ ToastService.showInfo("Quick Notes", message);
+ }
+
+ function _formatAge(timestamp) {
+ if (!timestamp)
+ return "";
+ const seconds = Math.floor((Date.now() - timestamp) / 1000);
+ if (seconds < 60)
+ return "just now";
+ const minutes = Math.floor(seconds / 60);
+ if (minutes < 60)
+ return minutes + "m ago";
+ const hours = Math.floor(minutes / 60);
+ if (hours < 24)
+ return hours + "h ago";
+ const days = Math.floor(hours / 24);
+ return days + "d ago";
+ }
+
+ onTriggerChanged: {
+ if (!pluginService)
+ return;
+ pluginService.savePluginData("quickNotesExample", "trigger", trigger);
+ }
+}
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesSettings.qml b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesSettings.qml
new file mode 100644
index 0000000..9659614
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/QuickNotesSettings.qml
@@ -0,0 +1,263 @@
+import QtQuick
+import qs.Widgets
+
+FocusScope {
+ id: root
+
+ property var pluginService: null
+
+ implicitHeight: settingsColumn.implicitHeight
+ height: implicitHeight
+
+ Column {
+ id: settingsColumn
+ anchors.fill: parent
+ anchors.margins: 16
+ spacing: 16
+
+ Text {
+ text: "Quick Notes Settings"
+ font.pixelSize: 18
+ font.weight: Font.Bold
+ color: "#FFFFFF"
+ }
+
+ Text {
+ text: "Demonstrates the plugin state API — notes are stored in a separate state file (quickNotesExample_state.json) rather than plugin_settings.json."
+ font.pixelSize: 14
+ color: "#CCFFFFFF"
+ wrapMode: Text.WordWrap
+ width: parent.width - 32
+ }
+
+ Rectangle {
+ width: parent.width - 32
+ height: 1
+ color: "#30FFFFFF"
+ }
+
+ Column {
+ spacing: 12
+ width: parent.width - 32
+
+ Text {
+ text: "Trigger Configuration"
+ font.pixelSize: 16
+ font.weight: Font.Medium
+ color: "#FFFFFF"
+ }
+
+ Row {
+ spacing: 12
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ Text {
+ text: "Trigger:"
+ font.pixelSize: 14
+ color: "#FFFFFF"
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ DankTextField {
+ id: triggerField
+ width: 100
+ height: 40
+ text: loadSettings("trigger", "n")
+ placeholderText: "n"
+ backgroundColor: "#30FFFFFF"
+ textColor: "#FFFFFF"
+
+ onTextEdited: {
+ saveSettings("trigger", text.trim() || "n");
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ width: parent.width - 32
+ height: 1
+ color: "#30FFFFFF"
+ }
+
+ Column {
+ spacing: 12
+ width: parent.width - 32
+
+ Text {
+ text: "Storage"
+ font.pixelSize: 16
+ font.weight: Font.Medium
+ color: "#FFFFFF"
+ }
+
+ Row {
+ spacing: 12
+
+ Text {
+ text: "Max notes:"
+ font.pixelSize: 14
+ color: "#FFFFFF"
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ DankTextField {
+ id: maxNotesField
+ width: 80
+ height: 40
+ text: loadSettings("maxNotes", 50).toString()
+ placeholderText: "50"
+ backgroundColor: "#30FFFFFF"
+ textColor: "#FFFFFF"
+
+ onTextEdited: {
+ const val = parseInt(text);
+ if (!isNaN(val) && val > 0)
+ saveSettings("maxNotes", val);
+ }
+ }
+ }
+
+ Text {
+ text: {
+ const count = loadState("notes", []).length;
+ return "Currently storing " + count + " note(s)";
+ }
+ font.pixelSize: 12
+ color: "#AAFFFFFF"
+ }
+
+ Rectangle {
+ width: clearRow.implicitWidth + 24
+ height: clearRow.implicitHeight + 16
+ radius: 8
+ color: clearMouseArea.containsMouse ? "#40FF5252" : "#30FF5252"
+
+ Row {
+ id: clearRow
+ anchors.centerIn: parent
+ spacing: 8
+
+ Text {
+ text: "🗑"
+ font.pixelSize: 14
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ Text {
+ text: "Clear all notes"
+ font.pixelSize: 14
+ color: "#FF5252"
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+
+ MouseArea {
+ id: clearMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: {
+ if (pluginService) {
+ pluginService.clearPluginState("quickNotesExample");
+ }
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ width: parent.width - 32
+ height: 1
+ color: "#30FFFFFF"
+ }
+
+ Column {
+ spacing: 8
+ width: parent.width - 32
+
+ Text {
+ text: "API Usage (for plugin developers):"
+ font.pixelSize: 14
+ font.weight: Font.Medium
+ color: "#FFFFFF"
+ }
+
+ Column {
+ spacing: 4
+ leftPadding: 16
+ bottomPadding: 24
+
+ Text {
+ text: "• pluginService.savePluginState(id, key, value)"
+ font.pixelSize: 12
+ color: "#CCFFFFFF"
+ font.family: "monospace"
+ }
+
+ Text {
+ text: " Writes to ~/.local/state/.../id_state.json"
+ font.pixelSize: 11
+ color: "#AAFFFFFF"
+ }
+
+ Text {
+ text: "• pluginService.loadPluginState(id, key, default)"
+ font.pixelSize: 12
+ color: "#CCFFFFFF"
+ font.family: "monospace"
+ }
+
+ Text {
+ text: " Reads from the per-plugin state file"
+ font.pixelSize: 11
+ color: "#AAFFFFFF"
+ }
+
+ Text {
+ text: "• pluginService.clearPluginState(id)"
+ font.pixelSize: 12
+ color: "#CCFFFFFF"
+ font.family: "monospace"
+ }
+
+ Text {
+ text: " Clears all state for a plugin"
+ font.pixelSize: 11
+ color: "#AAFFFFFF"
+ }
+
+ Text {
+ text: "• pluginService.removePluginStateKey(id, key)"
+ font.pixelSize: 12
+ color: "#CCFFFFFF"
+ font.family: "monospace"
+ }
+
+ Text {
+ text: " Removes a single key from plugin state"
+ font.pixelSize: 11
+ color: "#AAFFFFFF"
+ }
+ }
+ }
+ }
+
+ function saveSettings(key, value) {
+ if (pluginService)
+ pluginService.savePluginData("quickNotesExample", key, value);
+ }
+
+ function loadSettings(key, defaultValue) {
+ if (pluginService)
+ return pluginService.loadPluginData("quickNotesExample", key, defaultValue);
+ return defaultValue;
+ }
+
+ function loadState(key, defaultValue) {
+ if (pluginService)
+ return pluginService.loadPluginState("quickNotesExample", key, defaultValue);
+ return defaultValue;
+ }
+}
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/plugin.json b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/plugin.json
new file mode 100644
index 0000000..fcf3458
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/PLUGINS/QuickNotesExample/plugin.json
@@ -0,0 +1,17 @@
+{
+ "id": "quickNotesExample",
+ "name": "Quick Notes",
+ "description": "Example launcher plugin demonstrating the plugin state API for persistent data like history and notes",
+ "version": "1.0.0",
+ "author": "DankMaterialShell",
+ "icon": "sticky_note_2",
+ "type": "launcher",
+ "capabilities": ["clipboard"],
+ "component": "./QuickNotesLauncher.qml",
+ "settings": "./QuickNotesSettings.qml",
+ "trigger": "n",
+ "permissions": [
+ "settings_read",
+ "settings_write"
+ ]
+}