feat(island): add clipboard support & align launcher sizing options

This commit is contained in:
purian23
2026-09-29 03:30:58 -04:00
parent 97ec64ff97
commit 35faa3130c
15 changed files with 280 additions and 42 deletions
+2
View File
@@ -2704,6 +2704,8 @@ Singleton {
return "islandRouteWeather";
case "wallpaper":
return "islandRouteWallpaper";
case "clipboard":
return "islandRouteClipboard";
}
return "";
}
@@ -16,6 +16,7 @@ var ISLAND_DEFAULTS = {
islandRouteLauncher: "follow",
islandRouteControlCenter: "follow",
islandRouteNotificationCenter: "follow",
islandRouteClipboard: "follow",
islandRouteDash: "island",
islandRouteMedia: "island",
islandRouteWeather: "island",
+3 -3
View File
@@ -1466,7 +1466,7 @@ Item {
if (!PopoutService.clipboardHistoryModal) {
return "CLIPBOARD_NOT_AVAILABLE";
}
PopoutService.clipboardHistoryModal.show();
PopoutService.openClipboardHistory();
return "CLIPBOARD_OPEN_SUCCESS";
}
@@ -1474,7 +1474,7 @@ Item {
if (!PopoutService.clipboardHistoryModal) {
return "CLIPBOARD_NOT_AVAILABLE";
}
PopoutService.clipboardHistoryModal.hide();
PopoutService.closeClipboardHistory();
return "CLIPBOARD_CLOSE_SUCCESS";
}
@@ -1482,7 +1482,7 @@ Item {
if (!PopoutService.clipboardHistoryModal) {
return "CLIPBOARD_NOT_AVAILABLE";
}
PopoutService.clipboardHistoryModal.toggle();
PopoutService.toggleClipboardHistory();
return "CLIPBOARD_TOGGLE_SUCCESS";
}
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import qs.Common
import qs.Modals.DankLauncherV2.Components
import qs.Services
Item {
@@ -24,8 +25,8 @@ Item {
readonly property real screenWidth: usingFallback ? fallback.screenWidth : Theme.mediumBreakpoint * 2
readonly property real screenHeight: usingFallback ? fallback.screenHeight : Theme.mediumBreakpoint
readonly property real dpr: usingFallback ? fallback.dpr : 1
readonly property int modalWidth: usingFallback ? fallback.modalWidth : Theme.launcherWidthWide
readonly property int modalHeight: usingFallback ? fallback.modalHeight : Theme.launcherHeightDefault
readonly property int modalWidth: usingFallback ? fallback.modalWidth : LauncherMetrics.sizeWidth(SettingsData.dankLauncherV2Size)
readonly property int modalHeight: usingFallback ? fallback.modalHeight : LauncherMetrics.sizeHeight(SettingsData.dankLauncherV2Size)
readonly property real modalX: usingFallback ? fallback.modalX : 0
readonly property real modalY: usingFallback ? fallback.modalY : 0
readonly property bool frameOwnsConnectedChrome: false
@@ -0,0 +1,87 @@
pragma ComponentBehavior: Bound
import QtQuick
import qs.Common
import qs.Modals.Clipboard
import qs.Modals.Common
import qs.Services
FocusScope {
id: root
required property var controller
property var transientSurfaceTracker: null
property var effectiveScreen: null
property real alignedX: 0
property real alignedY: 0
clip: true
function focusFace() {
clipboardContent.searchField?.forceActiveFocus();
return true;
}
function beginSession() {
clipboardContent.resetState();
if (ClipboardService.clipboardAvailable)
ClipboardService.refresh();
clipboardContent.searchField.text = "";
root.focusFace();
}
QtObject {
id: hostContract
readonly property var effectiveScreen: root.effectiveScreen
readonly property real alignedX: root.alignedX
readonly property real alignedY: root.alignedY
}
Ref {
service: ClipboardService
}
ConfirmModal {
id: clearConfirmDialog
confirmButtonText: I18n.tr("Clear All")
confirmButtonColor: Theme.primary
useOverlayLayer: true
onShouldBeVisibleChanged: {
root.controller.keyboardYielded = shouldBeVisible;
if (shouldBeVisible) {
selectedButton = 0;
keyboardNavigation = true;
return;
}
Qt.callLater(root.focusFace);
}
}
ClipboardHistoryContent {
id: clipboardContent
anchors.fill: parent
surfaceHost: hostContract
transientSurfaceTracker: root.transientSurfaceTracker
clearConfirmDialog: clearConfirmDialog
onCloseRequested: root.controller.requestCollapse()
onInstantCloseRequested: root.controller.requestCollapse()
}
Connections {
target: root.controller
function onSessionStarted(activityId) {
if (activityId === "clipboard")
Qt.callLater(root.beginSession);
}
}
Component.onCompleted: root.controller.markVisualsReady("clipboard")
Component.onDestruction: {
root.controller.keyboardYielded = false;
root.controller.setVisualsReady("clipboard", false);
}
}
@@ -120,6 +120,7 @@ Item {
case "wallpaper":
case "weather":
case "notificationcenter":
case "clipboard":
return requested;
case "control-center":
case "cc":
@@ -149,6 +150,8 @@ Item {
return host.islandController.requestWeather(false);
case "notificationcenter":
return host.islandController.requestNotificationCenter(false);
case "clipboard":
return host.islandController.requestClipboard(false);
}
return host.islandController.requestActivity(activityId, true, true);
}
@@ -267,6 +270,7 @@ Item {
"wallpaperAvailable": true,
"weatherAvailable": true,
"notificationCenterAvailable": true,
"clipboardAvailable": true,
"launcherInputFocused": host.islandController.launcherInputFocused,
"launcherResultCount": host.launcherResultCount,
"compactHeight": host.islandController.compactThickness,
@@ -427,6 +427,8 @@ Item {
notificationExpandedComponent: expandedNotificationComponent
notificationCenterCompactComponent: compactNotificationCenterComponent
notificationCenterExpandedComponent: expandedNotificationCenterComponent
clipboardCompactComponent: compactClipboardComponent
clipboardExpandedComponent: expandedClipboardComponent
}
HoverHandler {
@@ -725,6 +727,29 @@ Item {
}
}
Component {
id: compactClipboardComponent
DestinationCompact {
controller: root.controller
activityId: "clipboard"
iconName: "content_paste"
label: I18n.tr("Clipboard")
}
}
Component {
id: expandedClipboardComponent
ClipboardExpanded {
controller: root.controller
transientSurfaceTracker: root.launcherTransientSurfaceTracker
effectiveScreen: root.effectiveScreen
alignedX: root.targetScreenX
alignedY: root.targetScreenY
}
}
Component {
id: expandedNotificationComponent
@@ -147,8 +147,8 @@ Item {
readonly property var springDampingRange: [10, 100]
readonly property var springMassRange: [0.25, 3]
readonly property int destinationMaxHeight: Math.max(destinationMinHeight, Math.min(destinationMaxHeightLimit, (root.screen?.height ?? referenceScreenHeight) - screenMargin))
readonly property int maxActivityHeight: Math.max(controller.dashboardHeight, controller.controlCenterHeight, destinationMaxHeight)
readonly property int maxActivityWidth: Math.max(controller.dashboardMaxWidth, controller.controlCenterMaxWidth, Math.min(activityMaxWidth, Math.max(activityMinWidth, (root.screen?.width ?? referenceScreenWidth) - screenMargin)))
readonly property int maxActivityHeight: Math.max(controller.dashboardHeight, controller.controlCenterHeight, controller.launcherExpandedTarget.height, controller.clipboardExpandedTarget.height, destinationMaxHeight)
readonly property int maxActivityWidth: Math.max(controller.dashboardMaxWidth, controller.controlCenterMaxWidth, controller.launcherExpandedTarget.width, controller.clipboardExpandedTarget.width, Math.min(activityMaxWidth, Math.max(activityMinWidth, (root.screen?.width ?? referenceScreenWidth) - screenMargin)))
readonly property int hostThickness: outerGap + nearInset + (root.isVertical ? maxActivityWidth : maxActivityHeight) + Theme.spacingS
readonly property real maximumAlongOffset: root.isVertical ? Math.max(0, (height - maxActivityHeight) / 2 - Theme.spacingS) : Math.max(0, (width - maxActivityWidth) / 2 - Theme.spacingS)
readonly property bool scrollEnabled: root.barConfig?.scrollEnabled ?? true
@@ -46,6 +46,8 @@ Item {
required property Component notificationExpandedComponent
required property Component notificationCenterCompactComponent
required property Component notificationCenterExpandedComponent
required property Component clipboardCompactComponent
required property Component clipboardExpandedComponent
readonly property real compactFade: root.fadeCompact(root.morphProgress)
readonly property real expandedFade: root.fadeExpanded(root.morphProgress)
@@ -93,6 +95,7 @@ Item {
"wallpaper": wallpaperExpandedLoader,
"weather": weatherExpandedLoader,
"notificationcenter": notificationCenterExpandedLoader,
"clipboard": clipboardExpandedLoader,
"controlcenter": controlCenterExpandedLoader
})
@@ -318,6 +321,23 @@ Item {
opacity: root.expandedOpacity("notificationcenter")
}
CompactFace {
active: root.surfaceActive("clipboard")
activity: "clipboard"
face: root.clipboardCompactComponent
opacity: root.compactOpacity("clipboard")
}
ExpandedFace {
id: clipboardExpandedLoader
activity: "clipboard"
active: root.controller.visualsRequested("clipboard")
asynchronous: true
sourceComponent: root.clipboardExpandedComponent
opacity: root.expandedOpacity("clipboard")
}
CompactFace {
active: root.systemSurfaceActive
activity: "volume"
@@ -2,6 +2,8 @@ pragma ComponentBehavior: Bound
import QtQuick
import qs.Common
import qs.Modals.Clipboard
import qs.Modals.DankLauncherV2.Components
import qs.Modules.ControlCenter
import qs.Modules.DankBar
import qs.Modules.DankDash
@@ -152,8 +154,8 @@ QtObject {
mediaContentLength = next;
}
readonly property var destinations: ["launcher", "controlcenter", "wallpaper", "weather", "notificationcenter"]
readonly property var blankClickOwners: ["launcher", "controlcenter", "wallpaper", "notificationcenter"]
readonly property var destinations: ["launcher", "controlcenter", "wallpaper", "weather", "notificationcenter", "clipboard"]
readonly property var blankClickOwners: ["launcher", "controlcenter", "wallpaper", "notificationcenter", "clipboard"]
readonly property var destinationDefaults: ({
"launcher": {
"contentLength": 160,
@@ -174,6 +176,10 @@ QtObject {
"notificationcenter": {
"contentLength": 170,
"contentHeight": 320
},
"clipboard": {
"contentLength": 150,
"contentHeight": 0
}
})
property var destinationState: root.freshDestinationState()
@@ -330,6 +336,7 @@ QtObject {
controlCenterPendingSection = "";
return;
case "wallpaper":
case "clipboard":
keyboardYielded = false;
return;
}
@@ -423,13 +430,14 @@ QtObject {
readonly property var mediaCompactTarget: pillTarget(mediaCompactLength, compactFaceThickness)
readonly property var homeExpandedTarget: dashboardTargetFor("home")
readonly property var mediaExpandedTarget: dashboardTargetFor("media")
readonly property var launcherExpandedTarget: sheetTarget(680, 560)
readonly property var launcherExpandedTarget: sheetTarget(Math.min(dashboardAvailableWidth, LauncherMetrics.sizeWidth(SettingsData.dankLauncherV2Size)), Math.min(dashboardAvailableHeight, LauncherMetrics.sizeHeight(SettingsData.dankLauncherV2Size)))
readonly property var controlCenterExpandedTarget: sheetTarget(controlCenterSheetWidth + controlCenterSheetInset + editGutterFor("controlcenter") * 2, controlCenterHeight)
readonly property var systemCompactTarget: pillTarget(root.isVertical ? 240 : (SettingsData.osdAlwaysShowValue ? 330 : 282), compactFaceThickness)
readonly property var systemExpandedTarget: sheetTarget(460, 176)
readonly property var notificationCompactTarget: pillTarget(Math.ceil(Math.max(notificationCompactMinLength, Math.min(notificationCompactMaxLength, notificationContentLength))), compactFaceThickness)
readonly property var notificationExpandedTarget: sheetTarget(520, 220)
readonly property var notificationCenterExpandedTarget: dashboardTargetFor("notificationcenter")
readonly property var clipboardExpandedTarget: sheetTarget(Math.min(dashboardAvailableWidth, ClipboardConstants.sizeWidth(SettingsData.clipboardSize)), Math.min(dashboardAvailableHeight, ClipboardConstants.sizeHeight(SettingsData.clipboardSize)))
readonly property bool systemActivityActive: activeActivity === "volume" || activeActivity === "brightness"
readonly property bool notificationActive: activeActivity === "notification"
@@ -471,6 +479,8 @@ QtObject {
return controlCenterExpandedTarget;
case "notificationcenter":
return notificationCenterExpandedTarget;
case "clipboard":
return clipboardExpandedTarget;
case "media":
return mediaExpandedTarget;
}
@@ -699,6 +709,12 @@ QtObject {
return requestActivity("notificationcenter", true, true);
}
function requestClipboard(shouldToggle) {
if (shouldToggle === true && activeActivity === "clipboard" && expanded)
return requestCollapse();
return requestActivity("clipboard", true, true);
}
function cycleActivity(direction, shouldExpand) {
const activities = ["home"];
if (mediaAvailable)
@@ -14,7 +14,7 @@ SettingsCard {
readonly property var routingValues: ["normal", "always", "last-used"]
readonly property var interactionModeValues: ["click", "hybrid"]
readonly property var routeActivities: ["launcher", "controlcenter", "notificationcenter", "home", "media", "weather", "wallpaper"]
readonly property var routeActivities: ["launcher", "controlcenter", "notificationcenter", "clipboard", "home", "media", "weather", "wallpaper"]
readonly property var routeKeys: routeActivities.map(activity => SettingsData.islandRouteKey(activity))
readonly property string sharedRouting: SettingsData.islandSharedRoutingMode(root.store.config)
@@ -39,7 +39,7 @@ SettingsCard {
SettingsRow {
settingKey: root.keyPrefix + "RouteActivities"
tags: ["island", "routing", "shortcuts", "launcher", "control center", "notification center", "dashboard", "media", "weather", "wallpaper", "ipc"]
tags: ["island", "routing", "shortcuts", "launcher", "control center", "notification center", "clipboard", "dashboard", "media", "weather", "wallpaper", "ipc"]
visible: root.hosted || root.sharedRouting !== "always"
resetStore: root.store
resetKeys: root.routeKeys
@@ -71,6 +71,14 @@ SettingsCard {
text: I18n.tr("Notification Center")
}
IslandRouteRow {
settingKey: root.keyPrefix + "RouteClipboard"
store: root.store
hosted: root.hosted
activity: "clipboard"
text: I18n.tr("Clipboard")
}
IslandRouteRow {
settingKey: root.keyPrefix + "RouteDash"
store: root.store
@@ -191,6 +191,7 @@ Item {
widgetItem: clipboardWidget,
section: root.getWidgetSection(parent) || "right",
triggerSource: "clipboard",
islandActivity: "clipboard",
mode: mode || "click",
prepare: popout => {
if (initialTab)
+13
View File
@@ -723,13 +723,26 @@ Singleton {
}
function openClipboardHistory() {
if (routeToIsland("clipboard", null, false))
return;
clipboardHistoryModal?.show();
}
function closeClipboardHistory() {
closeIslandActivity("clipboard");
clipboardHistoryModal?.hide();
}
function toggleClipboardHistory() {
if (clipboardHistoryModal?.shouldBeVisible) {
clipboardHistoryModal.hide();
return;
}
if (routeToIsland("clipboard", null, true))
return;
clipboardHistoryModal?.toggle();
}
function unloadClipboardHistoryPopout() {
_scheduleUnload("clipboardHistory");
}
+11 -11
View File
@@ -73,7 +73,7 @@ ShellRoot {
const entry = () => SettingsData.islandWidgetEntry(SettingsData.getBarConfig(root.barId));
const shared = root.findRow(page, "islandWidgetSharedRouting");
const routes = root.findRow(page, "islandWidgetRouteActivities");
const routeSuffixes = ["Launcher", "ControlCenter", "NotificationCenter", "Dash", "Media", "Weather", "Wallpaper"];
const routeSuffixes = ["Launcher", "ControlCenter", "NotificationCenter", "Clipboard", "Dash", "Media", "Weather", "Wallpaper"];
const routeRows = routeSuffixes.map(suffix => root.findRow(page, "islandWidgetRoute" + suffix));
const popups = root.findRow(page, "islandWidgetNotificationPopups");
const mode = root.findRow(page, "islandWidgetInteractionMode");
@@ -83,8 +83,8 @@ ShellRoot {
throw new Error("rows never appeared: " + [shared, routes, popups, mode].map(row => !!row).join(","));
}
root.check(!shared.visible, "a hosted island has no shared rule to pick");
root.check(routeRows.every(row => row.visible), "all seven destination rows are visible");
root.check(routeRows.every((row, index) => row.checked === (index >= 3)), "legacy dashboard routing is reflected in every dashboard activity");
root.check(routeRows.every(row => row.visible), "all eight destination rows are visible");
root.check(routeRows.every((row, index) => row.checked === (index >= 4)), "legacy dashboard routing is reflected in every dashboard activity");
root.check(popups.checked === false, "rows read the widget entry, not the defaults");
root.check(mode.visible, "a hosted island is always docked, so expansion mode shows");
popups.toggled(true);
@@ -93,16 +93,16 @@ ShellRoot {
root.check(entry().islandRouteControlCenter === "island", "a pick routes that activity to the island: " + JSON.stringify(entry()));
routeRows[1].toggled(false);
root.check(entry().islandRouteControlCenter === "bar", "an unpick hands it back to the bar's popout: " + JSON.stringify(entry()));
routeRows[4].toggled(false);
root.check(!routeRows[4].checked && routeRows[3].checked && routeRows[5].checked, "media changes independently and rows follow persisted values");
routeRows[3].toggled(false);
root.check(!routeRows[3].checked && !routeRows[4].checked && routeRows[5].checked && routeRows[6].checked, "editing dashboard preserves the other legacy destinations");
routeRows[5].toggled(false);
root.check(!routeRows[5].checked, "weather can override its island default");
routeRows[5].resetRequested();
root.check(entry().islandRouteWeather === "island" && routeRows[5].checked && !routeRows[3].checked && !routeRows[4].checked, "reset returns weather to the island without changing dashboard or media");
root.check(!routeRows[5].checked && routeRows[4].checked && routeRows[6].checked, "media changes independently and rows follow persisted values");
routeRows[4].toggled(false);
root.check(!routeRows[4].checked && !routeRows[5].checked && routeRows[6].checked && routeRows[7].checked, "editing dashboard preserves the other legacy destinations");
routeRows[6].toggled(false);
root.check(!routeRows[6].checked, "weather can override its island default");
routeRows[6].resetRequested();
root.check(entry().islandRouteWeather === "island" && routeRows[6].checked && !routeRows[4].checked && !routeRows[5].checked, "reset returns weather to the island without changing dashboard or media");
routes.resetRequested();
root.check(routeRows.every((row, index) => row.checked === (index >= 3)), "group reset restores dashboard activities to the island and other destinations to standard surfaces");
root.check(routeRows.every((row, index) => row.checked === (index >= 4)), "group reset restores dashboard activities to the island and other destinations to standard surfaces");
root.check(SettingsData.islandWidgetEntry(SettingsData.getBarConfig(root.barId)).islandSharedRouting === undefined, "the shared rule is never written for a hosted island");
console.log("FIXTURE_PASS");
} catch (error) {
@@ -3015,6 +3015,31 @@
"parentLabel": "Bar",
"description": "Clicks on empty bar space reach the windows below"
},
{
"section": "islandRouteClipboard",
"label": "Clipboard",
"tabIndex": 3,
"category": "General",
"keywords": [
"bar",
"clipboard",
"cliphist",
"copy",
"general",
"history",
"ipc",
"island",
"panel",
"paste",
"routing",
"shortcuts",
"statusbar",
"taskbar",
"topbar"
],
"parentLabel": "Bar",
"conditionKey": "islandEnabled"
},
{
"section": "islandRouteControlCenter",
"label": "Control Center",
@@ -3594,6 +3619,7 @@
"category": "General",
"keywords": [
"bar",
"clipboard",
"control center",
"dashboard",
"general",
@@ -9530,13 +9556,21 @@
"optionFile": "PrivacyOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:25",
"section": "barWidgetOption:IslandOptions.qml:26",
"label": "Clear badge on open",
"tabIndex": 22,
"keywords": [],
"runtimeType": "barWidgetOption",
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:12",
"label": "Clipboard",
"tabIndex": 22,
"keywords": [],
"runtimeType": "barWidgetOption",
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:2",
"label": "Clock style",
@@ -9690,7 +9724,7 @@
"optionFile": "AppsDockOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:12",
"section": "barWidgetOption:IslandOptions.qml:13",
"label": "Dashboard",
"tabIndex": 22,
"keywords": [],
@@ -9730,7 +9764,7 @@
"optionFile": "AppsDockOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:24",
"section": "barWidgetOption:IslandOptions.qml:25",
"label": "Expand by default",
"tabIndex": 22,
"keywords": [],
@@ -9738,7 +9772,7 @@
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:16",
"section": "barWidgetOption:IslandOptions.qml:17",
"label": "Expansion mode",
"tabIndex": 22,
"keywords": [],
@@ -9810,7 +9844,7 @@
"optionFile": "WorkspaceSwitcherOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:19",
"section": "barWidgetOption:IslandOptions.qml:20",
"label": "Hide delay",
"tabIndex": 22,
"keywords": [],
@@ -9842,7 +9876,7 @@
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:17",
"section": "barWidgetOption:IslandOptions.qml:18",
"label": "Hybrid peeks the current compact face on hover. Click pins a destination so it stays open",
"tabIndex": 22,
"keywords": [],
@@ -9922,7 +9956,7 @@
"optionFile": "ControlCenterOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:20",
"section": "barWidgetOption:IslandOptions.qml:21",
"label": "Keep clock with media",
"tabIndex": 22,
"keywords": [],
@@ -9986,7 +10020,7 @@
"optionFile": "SystemTrayOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:13",
"section": "barWidgetOption:IslandOptions.qml:14",
"label": "Media",
"tabIndex": 22,
"keywords": [],
@@ -10018,7 +10052,7 @@
"optionFile": "WorkspaceSwitcherOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:26",
"section": "barWidgetOption:IslandOptions.qml:27",
"label": "Motion",
"tabIndex": 22,
"keywords": [],
@@ -10066,7 +10100,7 @@
"optionFile": "ClockOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:21",
"section": "barWidgetOption:IslandOptions.qml:22",
"label": "Notifications",
"tabIndex": 22,
"keywords": [],
@@ -10082,7 +10116,7 @@
"optionFile": "BatteryOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:18",
"section": "barWidgetOption:IslandOptions.qml:19",
"label": "Open delay",
"tabIndex": 22,
"keywords": [],
@@ -10114,7 +10148,7 @@
"optionFile": "AppsDockOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:27",
"section": "barWidgetOption:IslandOptions.qml:28",
"label": "Reduce motion",
"tabIndex": 22,
"keywords": [],
@@ -10330,7 +10364,7 @@
"optionFile": "AppsDockOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:29",
"section": "barWidgetOption:IslandOptions.qml:30",
"label": "Spring damping",
"tabIndex": 22,
"keywords": [],
@@ -10338,7 +10372,7 @@
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:30",
"section": "barWidgetOption:IslandOptions.qml:31",
"label": "Spring mass",
"tabIndex": 22,
"keywords": [],
@@ -10346,7 +10380,7 @@
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:28",
"section": "barWidgetOption:IslandOptions.qml:29",
"label": "Spring stiffness",
"tabIndex": 22,
"keywords": [],
@@ -10410,7 +10444,7 @@
"optionFile": "SystemTrayOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:23",
"section": "barWidgetOption:IslandOptions.qml:24",
"label": "Use standard OSDs",
"tabIndex": 22,
"keywords": [],
@@ -10418,7 +10452,7 @@
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:22",
"section": "barWidgetOption:IslandOptions.qml:23",
"label": "Use standard popups",
"tabIndex": 22,
"keywords": [],
@@ -10442,7 +10476,7 @@
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:15",
"section": "barWidgetOption:IslandOptions.qml:16",
"label": "Wallpapers",
"tabIndex": 22,
"keywords": [],
@@ -10450,7 +10484,7 @@
"optionFile": "IslandOptions.qml"
},
{
"section": "barWidgetOption:IslandOptions.qml:14",
"section": "barWidgetOption:IslandOptions.qml:15",
"label": "Weather",
"tabIndex": 22,
"keywords": [],
@@ -16413,6 +16447,31 @@
"parentLabel": "Bar",
"conditionKey": "dotEnabled"
},
{
"section": "dotRouteClipboard",
"label": "Clipboard",
"tabIndex": 65,
"category": "Dot",
"keywords": [
"bar",
"clipboard",
"cliphist",
"copy",
"dot",
"history",
"ipc",
"island",
"panel",
"paste",
"routing",
"shortcuts",
"statusbar",
"taskbar",
"topbar"
],
"parentLabel": "Bar",
"conditionKey": "dotEnabled"
},
{
"section": "dotRouteControlCenter",
"label": "Control Center",
@@ -16787,6 +16846,7 @@
"category": "Dot",
"keywords": [
"bar",
"clipboard",
"control center",
"dashboard",
"dot",