diff --git a/Modules/Bar/Extras/TrayMenu.qml b/Modules/Bar/Extras/TrayMenu.qml index ab11985a97..240718a9d9 100644 --- a/Modules/Bar/Extras/TrayMenu.qml +++ b/Modules/Bar/Extras/TrayMenu.qml @@ -22,6 +22,23 @@ PopupWindow { // Derive menu from trayItem (only used for non-submenus) readonly property QsMenuHandle menu: isSubMenu ? null : (trayItem ? trayItem.menu : null) + // Helper functions + function wildCardMatch(str, rule) { + if (!str || !rule) + return false; + if (str === rule) + return true; + const placeholder = '\uE000'; + let processedRule = rule.replace(/\*/g, placeholder); + let escaped = processedRule.replace(/[.+?^${}()|[\]\\]/g, '\\$&'); + let pattern = '^' + escaped.replace(new RegExp(placeholder, 'g'), '.*') + '$'; + try { + return new RegExp(pattern, 'i').test(str); + } catch (e) { + return false; + } + } + // Compute if current tray item is pinned readonly property bool isPinned: { if (!trayItem || widgetSection === "" || widgetIndex < 0) @@ -33,9 +50,9 @@ PopupWindow { if (!widgetSettings || widgetSettings.id !== "Tray") return false; var pinnedList = widgetSettings.pinned || []; - const itemName = trayItem.tooltipTitle || trayItem.name || trayItem.id || ""; + const itemName = trayItem.id || trayItem.title || trayItem.tooltipTitle || ""; for (var i = 0; i < pinnedList.length; i++) { - if (pinnedList[i] === itemName) + if (wildCardMatch(itemName, pinnedList[i])) return true; } return false; @@ -552,7 +569,7 @@ PopupWindow { Logger.w("TrayMenu", "Cannot pin: missing tray item or widget info"); return; } - const itemName = trayItem.tooltipTitle || trayItem.name || trayItem.id || ""; + const itemName = trayItem.id || trayItem.title || trayItem.tooltipTitle || ""; if (!itemName) { Logger.w("TrayMenu", "Cannot pin: tray item has no name"); return; @@ -598,7 +615,7 @@ PopupWindow { Logger.w("TrayMenu", "Cannot unpin: missing tray item or widget info"); return; } - const itemName = trayItem.tooltipTitle || trayItem.name || trayItem.id || ""; + const itemName = trayItem.id || trayItem.title || trayItem.tooltipTitle || ""; if (!itemName) { Logger.w("TrayMenu", "Cannot unpin: tray item has no name"); return; @@ -617,7 +634,7 @@ PopupWindow { var pinnedList = widgetSettings.pinned || []; var newPinned = []; for (var i = 0; i < pinnedList.length; i++) { - if (pinnedList[i] !== itemName) { + if (!wildCardMatch(itemName, pinnedList[i])) { newPinned.push(pinnedList[i]); } } diff --git a/Modules/Bar/Widgets/Tray.qml b/Modules/Bar/Widgets/Tray.qml index ef33111db5..a03c1b0764 100644 --- a/Modules/Bar/Widgets/Tray.qml +++ b/Modules/Bar/Widgets/Tray.qml @@ -142,7 +142,7 @@ Item { continue; } - const title = item.tooltipTitle || item.name || item.id || ""; + const title = item.id || item.title || item.tooltipTitle || ""; // Skip passive items if hidePassive is enabled if (root.hidePassive && item.status !== undefined && (item.status === SystemTray.Passive || item.status === 0)) { @@ -179,7 +179,7 @@ Item { let pinnedItems = []; for (var k = 0; k < newItems.length; k++) { const item2 = newItems[k]; - const title2 = item2.tooltipTitle || item2.name || item2.id || ""; + const title2 = item2.id || item2.title || item2.tooltipTitle || ""; for (var m = 0; m < pinned.length; m++) { const rule2 = pinned[m]; if (wildCardMatch(title2, rule2)) { @@ -470,7 +470,7 @@ Item { popupMenuWindow.close(); } root.hoveredItemIndex = trayDelegate.index; - TooltipService.show(tooltipAnchor, modelData.tooltipTitle || modelData.name || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name)); + TooltipService.show(tooltipAnchor, modelData.tooltipTitle || modelData.title || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name)); } else if (root.hoveredItemIndex === trayDelegate.index) { root.hoveredItemIndex = -1; TooltipService.hide(tooltipAnchor); diff --git a/Modules/Panels/Tray/TrayDrawerPanel.qml b/Modules/Panels/Tray/TrayDrawerPanel.qml index e490587c40..b20c964456 100644 --- a/Modules/Panels/Tray/TrayDrawerPanel.qml +++ b/Modules/Panels/Tray/TrayDrawerPanel.qml @@ -128,7 +128,7 @@ SmartPanel { function isPinned(item) { if (!pinnedList || pinnedList.length === 0) return false; - const title = item?.tooltipTitle || item?.name || item?.id || ""; + const title = item?.id || item?.title || item?.tooltipTitle || ""; for (var i = 0; i < pinnedList.length; i++) { if (wildCardMatch(title, pinnedList[i])) return true; @@ -277,7 +277,7 @@ SmartPanel { if (panelContent.popupMenuWindow) { panelContent.popupMenuWindow.close(); } - TooltipService.show(trayIcon, modelData.tooltipTitle || modelData.name || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name)); + TooltipService.show(trayIcon, modelData.tooltipTitle || modelData.title || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name)); } onExited: TooltipService.hide() }