pragma Singleton import qs.config import Quickshell import Quickshell.Services.Notifications import QtQuick Singleton { id: root readonly property var weatherIcons: ({ "0": "clear_day", "1": "clear_day", "2": "partly_cloudy_day", "3": "cloud", "45": "foggy", "48": "foggy", "51": "rainy", "53": "rainy", "55": "rainy", "56": "rainy", "57": "rainy", "61": "rainy", "63": "rainy", "65": "rainy", "66": "rainy", "67": "rainy", "71": "cloudy_snowing", "73": "cloudy_snowing", "75": "snowing_heavy", "77": "cloudy_snowing", "80": "rainy", "81": "rainy", "82": "rainy", "85": "cloudy_snowing", "86": "snowing_heavy", "95": "thunderstorm", "96": "thunderstorm", "99": "thunderstorm" }) readonly property var categoryIcons: ({ WebBrowser: "web", Printing: "print", Security: "security", Network: "chat", Archiving: "archive", Compression: "archive", Development: "code", IDE: "code", TextEditor: "edit_note", Audio: "music_note", Music: "music_note", Player: "music_note", Recorder: "mic", Game: "sports_esports", FileTools: "files", FileManager: "files", Filesystem: "files", FileTransfer: "files", Settings: "settings", DesktopSettings: "settings", HardwareSettings: "settings", TerminalEmulator: "terminal", ConsoleOnly: "terminal", Utility: "build", Monitor: "monitor_heart", Midi: "graphic_eq", Mixer: "graphic_eq", AudioVideoEditing: "video_settings", AudioVideo: "music_video", Video: "videocam", Building: "construction", Graphics: "photo_library", "2DGraphics": "photo_library", RasterGraphics: "photo_library", TV: "tv", System: "host", Office: "content_paste" }) function getAppIcon(name: string, fallback: string): string { const icon = DesktopEntries.heuristicLookup(name)?.icon; if (fallback !== "undefined") return Quickshell.iconPath(icon, fallback); return Quickshell.iconPath(icon); } function getAppCategoryIcon(name: string, fallback: string): string { const categories = DesktopEntries.heuristicLookup(name)?.categories; if (categories) for (const [key, value] of Object.entries(categoryIcons)) if (categories.includes(key)) return value; return fallback; } function getNetworkIcon(strength: int, isSecure = false): string { if (isSecure) { if (strength >= 80) return "network_wifi_locked"; if (strength >= 60) return "network_wifi_3_bar_locked"; if (strength >= 40) return "network_wifi_2_bar_locked"; if (strength >= 20) return "network_wifi_1_bar_locked"; return "signal_wifi_0_bar"; } else { if (strength >= 80) return "network_wifi"; if (strength >= 60) return "network_wifi_3_bar"; if (strength >= 40) return "network_wifi_2_bar"; if (strength >= 20) return "network_wifi_1_bar"; return "signal_wifi_0_bar"; } } function getBluetoothIcon(icon: string): string { if (icon.includes("headset") || icon.includes("headphones")) return "headphones"; if (icon.includes("audio")) return "speaker"; if (icon.includes("phone")) return "smartphone"; if (icon.includes("mouse")) return "mouse"; if (icon.includes("keyboard")) return "keyboard"; return "bluetooth"; } function getWeatherIcon(code: string): string { if (weatherIcons.hasOwnProperty(code)) return weatherIcons[code]; return "air"; } function getNotifIcon(summary: string, urgency: int): string { summary = summary.toLowerCase(); if (summary.includes("reboot")) return "restart_alt"; if (summary.includes("recording")) return "screen_record"; if (summary.includes("battery")) return "power"; if (summary.includes("screenshot")) return "screenshot_monitor"; if (summary.includes("welcome")) return "waving_hand"; if (summary.includes("time") || summary.includes("a break")) return "schedule"; if (summary.includes("installed")) return "download"; if (summary.includes("update")) return "update"; if (summary.includes("unable to")) return "deployed_code_alert"; if (summary.includes("profile")) return "person"; if (summary.includes("file")) return "folder_copy"; if (urgency === NotificationUrgency.Critical) return "release_alert"; return "chat"; } function getVolumeIcon(volume: real, isMuted: bool): string { if (isMuted) return "no_sound"; if (volume >= 0.5) return "volume_up"; if (volume > 0) return "volume_down"; return "volume_mute"; } function getMicVolumeIcon(volume: real, isMuted: bool): string { if (!isMuted && volume > 0) return "mic"; return "mic_off"; } function getSpecialWsIcon(name: string): string { name = name.toLowerCase().slice("special:".length); for (const iconConfig of Config.bar.workspaces.specialWorkspaceIcons) { if (iconConfig.name === name) { return iconConfig.icon; } } if (name === "special") return "star"; if (name === "communication") return "forum"; if (name === "music") return "music_cast"; if (name === "todo") return "checklist"; if (name === "sysmon") return "monitor_heart"; return name[0].toUpperCase(); } function getTrayIcon(id: string, icon: string): string { for (const sub of Config.bar.tray.iconSubs) if (sub.id === id) return sub.image ? Qt.resolvedUrl(sub.image) : Quickshell.iconPath(sub.icon); if (icon.includes("?path=")) { const [name, path] = icon.split("?path="); icon = Qt.resolvedUrl(`${path}/${name.slice(name.lastIndexOf("/") + 1)}`); } return icon; } }