Examples

Some examples of using Plasma scripting capability

Iterate all widgets and print their config values

var allDesktops = desktops();
for (var desktopIndex = 0; desktopIndex < allDesktops.length; desktopIndex++) {
    var d = allDesktops[desktopIndex];
    print(d);

    var widgets = d.widgets();
    for (var widgetIndex = 0; widgetIndex < widgets.length; widgetIndex++) {
        var w = widgets[widgetIndex];
        print("\t" + w.type + ": ");

        var configGroups = w.configGroups.concat([]); // concat is used to clone the array
        for (var groupIndex = 0; groupIndex < configGroups.length; groupIndex++) {
            var g = configGroups[groupIndex];
            print("\t\t" + g + ": ");
            w.currentConfigGroup = [g];

            for (var keyIndex = 0; keyIndex < w.configKeys.length; keyIndex++) {
                var configKey = w.configKeys[keyIndex];
                print("\t\t\t" + configKey + ": " + w.readConfig(configKey));
            }
        }
    }
}

var allPanels = panels();
for (var panelIndex = 0; panelIndex < allPanels.length; panelIndex++) {
    var p = allPanels[panelIndex];
    print(p);

    var widgets = p.widgets();
    for (var widgetIndex = 0; widgetIndex < widgets.length; widgetIndex++) {
        var w = widgets[widgetIndex];
        print("\t" + w.type + ": ");

        var configGroups = w.configGroups.concat([]); // concat is used to clone the array
        for (var groupIndex = 0; groupIndex < configGroups.length; groupIndex++) {
            var g = configGroups[groupIndex];
            print("\t\t" + g + ": ");
            w.currentConfigGroup = [g];

            for (var keyIndex = 0; keyIndex < w.configKeys.length; keyIndex++) {
                var configKey = w.configKeys[keyIndex];
                print("\t\t\t" + configKey + ": " + w.readConfig(configKey));
            }
        }
    }
}
function forEachWidgetInContainmentList(containmentList, callback) {
    for (var containmentIndex = 0; containmentIndex < containmentList.length; containmentIndex++) {
        var containment = containmentList[containmentIndex];

        var widgets = containment.widgets();
        for (var widgetIndex = 0; widgetIndex < widgets.length; widgetIndex++) {
            var widget = widgets[widgetIndex];
            callback(widget, containment);
        }
    }
}

function forEachWidget(callback) {
    forEachWidgetInContainmentList(desktops(), callback);
    forEachWidgetInContainmentList(panels(), callback);
}

function forEachWidgetByType(type, callback) {
    forEachWidget(function(widget, containment) {
        if (widget.type == type) {
            callback(widget, containment);
        }
    });
}

function logWidget(widget) {
    print("" + widget.type + ": ");

    var configGroups = widget.configGroups.slice(); // slice is used to clone the array
    for (var groupIndex = 0; groupIndex < configGroups.length; groupIndex++) {
        var configGroup = configGroups[groupIndex];
        print("\t" + configGroup + ": ");
        widget.currentConfigGroup = [configGroup];

        for (var keyIndex = 0; keyIndex < widget.configKeys.length; keyIndex++) {
            var configKey = widget.configKeys[keyIndex];
            var configValue = widget.readConfig(configKey);
            print("\t\t" + configKey + ": " + configValue);
        }
    }
}

//------

forEachWidget(function(widget){
    logWidget(widget);
});

Adding a widget to the System Tray

var widgetName = "org.kde.plasma.printmanager";

for (i = 0; i < panelIds.length; ++i) { //search through the panels
    panel = panelById(pids[i]);
    if (!panel) continue;

    for (tmpIndex = 0; tmpIndex < panel.widgetIds.length; tmpIndex ++) {
        appletWidget = panel.widgetById(panel.widgetIds[tmpIndex]);

        if (appletWidget.type == "org.kde.plasma.systemtray") {
            systemtrayId = appletWidget.readConfig("SystrayContainmentId");
            if (systemtrayId) {
               print("systemtray id: " + systemtrayId)
               var systray = desktopById(systemtrayId);
               systray.currentConfigGroup = ["General"];
               var extraItems = systray.readConfig("extraItems").split(",");
               if (extraItems.indexOf(widgetName) === -1) {
                   extraItems.push(widgetName)
                   systray.writeConfig("extraItems", extraItems);
                   systray.reloadConfig();
               }
            }
        }
    }
}

Changing a config value for each instance of a specific widget

// See previous examples for these functions.
function forEachWidgetInContainmentList(containmentList, callback) { ... }
function forEachWidget(callback) { ... }
function forEachWidgetByType(type, callback) { ... }

function widgetSetProperty(args) {
    if (!(args.widgetType && args.configKey)) {
        return;
    }

    forEachWidgetByType(args.widgetType, function(widget){        
        var configGroups = widget.configGroups.slice(); // slice is used to clone the array
        for (var groupIndex = 0; groupIndex < configGroups.length; groupIndex++) {
            var configGroup = configGroups[groupIndex];

            widget.currentConfigGroup = [configGroup];

            if (args.configGroup && args.configGroup != configGroup) {
                continue;
            }

            for (var keyIndex = 0; keyIndex < widget.configKeys.length; keyIndex++) {
                var configKey = widget.configKeys[keyIndex];
                if (args.configKey != configKey) {
                    continue;
                }

                // Delete when done debugging
                var configValue = widget.readConfig(configKey);
                var valueType = typeof configValue;
                print("" + widget.type + " (id: " + widget.id + "):");
                print("\t[" + configGroup + "] " + configKey + ": " + configValue + " (" + valueType + ") => " + args.configValue);
                // End debugging

                widget.writeConfig(configKey, args.configValue);
            }
        }
    });
}

widgetSetProperty({
    widgetType: "org.kde.plasma.taskmanager",
    configGroup: "", // Optional, will search all groups for configKey if empty.
    configKey: "separateLaunchers",
    configValue: "false",
});