diff --git a/Modules/ControlCenter/Cards/TopCard.qml b/Modules/ControlCenter/Cards/TopCard.qml index 5d68b47a..4008229a 100644 --- a/Modules/ControlCenter/Cards/TopCard.qml +++ b/Modules/ControlCenter/Cards/TopCard.qml @@ -100,190 +100,200 @@ NBox { NDivider { Layout.fillWidth: true Layout.topMargin: Style.marginS * scaling - Layout.bottomMargin: Style.marginS * scaling + Layout.bottomMargin: Style.marginXS * scaling } RowLayout { id: utilitiesRow spacing: Style.marginM * scaling + Layout.alignment: Qt.AlignVCenter + Layout.topMargin: -(Style.marginXS * scaling) + Layout.fillWidth: true - // Wallpaper, Screen Rec. - RowLayout { - spacing: root.spacing + // Left group - Media & Display + Rectangle { + color: Color.mSurface + radius: Style.radiusM * scaling + Layout.preferredHeight: Style.baseWidgetSize * 1.2 * scaling + Layout.fillWidth: true - // Screen Recorder - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - icon: "camera-video" - visible: ProgramCheckerService.gpuScreenRecorderAvailable - tooltipText: ScreenRecorderService.isRecording ? I18n.tr("tooltips.stop-screen-recording") : I18n.tr("tooltips.start-screen-recording") - colorBg: ScreenRecorderService.isRecording ? Color.mPrimary : Color.mSurfaceVariant - colorFg: ScreenRecorderService.isRecording ? Color.mOnPrimary : Color.mPrimary - onClicked: { - ScreenRecorderService.toggleRecording() - // If we were not recording and we just initiated a start, close the panel - if (!ScreenRecorderService.isRecording) { - var panel = PanelService.getPanel("controlCenterPanel") - panel?.close() + RowLayout { + anchors.centerIn: parent + spacing: root.spacing + + // Screen Recorder + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + icon: "camera-video" + visible: ProgramCheckerService.gpuScreenRecorderAvailable + tooltipText: ScreenRecorderService.isRecording ? I18n.tr("tooltips.stop-screen-recording") : I18n.tr("tooltips.start-screen-recording") + colorBg: ScreenRecorderService.isRecording ? Color.mPrimary : Color.mSurfaceVariant + colorFg: ScreenRecorderService.isRecording ? Color.mOnPrimary : Color.mPrimary + onClicked: { + ScreenRecorderService.toggleRecording() + if (!ScreenRecorderService.isRecording) { + var panel = PanelService.getPanel("controlCenterPanel") + panel?.close() + } + } + } + + // Wallpaper + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + visible: Settings.data.wallpaper.enabled + icon: "wallpaper-selector" + tooltipText: I18n.tr("tooltips.wallpaper-selector") + onClicked: PanelService.getPanel("wallpaperPanel")?.toggle(this) + onRightClicked: WallpaperService.setRandomWallpaper() + } + + // Night Light + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + visible: ProgramCheckerService.wlsunsetAvailable + colorBg: Settings.data.nightLight.forced ? Color.mPrimary : Color.transparent + colorFg: Settings.data.nightLight.forced ? Color.mOnPrimary : Color.mPrimary + icon: Settings.data.nightLight.enabled ? (Settings.data.nightLight.forced ? "nightlight-forced" : "nightlight-on") : "nightlight-off" + tooltipText: Settings.data.nightLight.enabled ? (Settings.data.nightLight.forced ? I18n.tr("tooltips.night-light-forced") : I18n.tr("tooltips.night-light-enabled")) : I18n.tr("tooltips.night-light-disabled") + onClicked: { + if (!Settings.data.nightLight.enabled) { + Settings.data.nightLight.enabled = true + Settings.data.nightLight.forced = false + } else if (Settings.data.nightLight.enabled && !Settings.data.nightLight.forced) { + Settings.data.nightLight.forced = true + } else { + Settings.data.nightLight.enabled = false + Settings.data.nightLight.forced = false + } + } + + onRightClicked: { + var settingsPanel = PanelService.getPanel("settingsPanel") + settingsPanel.requestedTab = SettingsPanel.Tab.Display + settingsPanel.open() } } } - - // Wallpaper - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - visible: Settings.data.wallpaper.enabled - icon: "wallpaper-selector" - tooltipText: I18n.tr("tooltips.wallpaper-selector") - onClicked: PanelService.getPanel("wallpaperPanel")?.toggle(this) - onRightClicked: WallpaperService.setRandomWallpaper() - } } - NDivider { + // Center group - Network & Caffeine + Rectangle { + color: Color.mSurface + radius: Style.radiusM * scaling + Layout.preferredHeight: Style.baseWidgetSize * 1.2 * scaling Layout.fillWidth: true - } - // Network - RowLayout { - spacing: root.spacing + RowLayout { + anchors.centerIn: parent + spacing: root.spacing - // Wifi - NIconButton { - id: wifiButton - baseSize: Style.baseWidgetSize * 0.8 - tooltipText: I18n.tr("tooltips.manage-wifi") - icon: { - try { - if (NetworkService.ethernetConnected) { - return "ethernet" - } - let connected = false - let signalStrength = 0 - for (const net in NetworkService.networks) { - if (NetworkService.networks[net].connected) { - connected = true - signalStrength = NetworkService.networks[net].signal - break + // Wifi + NIconButton { + id: wifiButton + baseSize: Style.baseWidgetSize * 0.8 + tooltipText: I18n.tr("tooltips.manage-wifi") + icon: { + try { + if (NetworkService.ethernetConnected) { + return "ethernet" } + let connected = false + let signalStrength = 0 + for (const net in NetworkService.networks) { + if (NetworkService.networks[net].connected) { + connected = true + signalStrength = NetworkService.networks[net].signal + break + } + } + return connected ? NetworkService.signalIcon(signalStrength) : "wifi-off" + } catch (error) { + Logger.error("Wi-Fi", "Error getting icon:", error) + return "signal_wifi_bad" } - return connected ? NetworkService.signalIcon(signalStrength) : "wifi-off" - } catch (error) { - Logger.error("Wi-Fi", "Error getting icon:", error) - return "signal_wifi_bad" + } + onClicked: PanelService.getPanel("wifiPanel")?.toggle(this) + onRightClicked: PanelService.getPanel("wifiPanel")?.toggle(this) + } + + // Bluetooth + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + tooltipText: I18n.tr("tooltips.bluetooth-devices") + icon: BluetoothService.enabled ? "bluetooth" : "bluetooth-off" + onClicked: PanelService.getPanel("bluetoothPanel")?.toggle(this) + onRightClicked: PanelService.getPanel("bluetoothPanel")?.toggle(this) + } + + // Caffeine (Keep Awake) + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + icon: IdleInhibitorService.isInhibited ? "keep-awake-on" : "keep-awake-off" + tooltipText: IdleInhibitorService.isInhibited ? I18n.tr("tooltips.disable-keep-awake") : I18n.tr("tooltips.enable-keep-awake") + colorBg: IdleInhibitorService.isInhibited ? Color.mPrimary : Color.mSurfaceVariant + colorFg: IdleInhibitorService.isInhibited ? Color.mOnPrimary : Color.mPrimary + onClicked: { + IdleInhibitorService.manualToggle() } } - onClicked: PanelService.getPanel("wifiPanel")?.toggle(this) - onRightClicked: PanelService.getPanel("wifiPanel")?.toggle(this) - } - - // Bluetooth - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - tooltipText: I18n.tr("tooltips.bluetooth-devices") - icon: BluetoothService.enabled ? "bluetooth" : "bluetooth-off" - onClicked: PanelService.getPanel("bluetoothPanel")?.toggle(this) - onRightClicked: PanelService.getPanel("bluetoothPanel")?.toggle(this) } } - NDivider { + // Right group - Power Profiles + Rectangle { + color: Color.mSurface + radius: Style.radiusM * scaling + Layout.preferredHeight: Style.baseWidgetSize * 1.2 * scaling Layout.fillWidth: true - } - // NightLight, Keep-Awake - RowLayout { - spacing: root.spacing + RowLayout { + anchors.centerIn: parent + spacing: root.spacing - // Night Light - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - visible: ProgramCheckerService.wlsunsetAvailable - colorBg: Settings.data.nightLight.forced ? Color.mPrimary : Color.transparent - colorFg: Settings.data.nightLight.forced ? Color.mOnPrimary : Color.mPrimary - icon: Settings.data.nightLight.enabled ? (Settings.data.nightLight.forced ? "nightlight-forced" : "nightlight-on") : "nightlight-off" - tooltipText: Settings.data.nightLight.enabled ? (Settings.data.nightLight.forced ? I18n.tr("tooltips.night-light-forced") : I18n.tr("tooltips.night-light-enabled")) : I18n.tr("tooltips.night-light-disabled") - onClicked: { - if (!Settings.data.nightLight.enabled) { - Settings.data.nightLight.enabled = true - Settings.data.nightLight.forced = false - } else if (Settings.data.nightLight.enabled && !Settings.data.nightLight.forced) { - Settings.data.nightLight.forced = true - } else { - Settings.data.nightLight.enabled = false - Settings.data.nightLight.forced = false - } + // Performance + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + icon: PowerProfileService.getIcon(PowerProfile.Performance) + tooltipText: I18n.tr("tooltips.set-power-profile", { + "profile": PowerProfileService.getName(PowerProfile.Performance) + }) + enabled: hasPP + opacity: enabled ? Style.opacityFull : Style.opacityMedium + colorBg: (enabled && PowerProfileService.profile === PowerProfile.Performance) ? Color.mPrimary : Color.mSurfaceVariant + colorFg: (enabled && PowerProfileService.profile === PowerProfile.Performance) ? Color.mOnPrimary : Color.mPrimary + onClicked: PowerProfileService.setProfile(PowerProfile.Performance) } - onRightClicked: { - var settingsPanel = PanelService.getPanel("settingsPanel") - settingsPanel.requestedTab = SettingsPanel.Tab.Display - settingsPanel.open() + // Balanced + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + icon: PowerProfileService.getIcon(PowerProfile.Balanced) + tooltipText: I18n.tr("tooltips.set-power-profile", { + "profile": PowerProfileService.getName(PowerProfile.Balanced) + }) + enabled: hasPP + opacity: enabled ? Style.opacityFull : Style.opacityMedium + colorBg: (enabled && PowerProfileService.profile === PowerProfile.Balanced) ? Color.mPrimary : Color.mSurfaceVariant + colorFg: (enabled && PowerProfileService.profile === PowerProfile.Balanced) ? Color.mOnPrimary : Color.mPrimary + onClicked: PowerProfileService.setProfile(PowerProfile.Balanced) } - } - // Idle Inhibitor - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - icon: IdleInhibitorService.isInhibited ? "keep-awake-on" : "keep-awake-off" - tooltipText: IdleInhibitorService.isInhibited ? I18n.tr("tooltips.disable-keep-awake") : I18n.tr("tooltips.enable-keep-awake") - colorBg: IdleInhibitorService.isInhibited ? Color.mPrimary : Color.mSurfaceVariant - colorFg: IdleInhibitorService.isInhibited ? Color.mOnPrimary : Color.mPrimary - onClicked: { - IdleInhibitorService.manualToggle() + // Eco + NIconButton { + baseSize: Style.baseWidgetSize * 0.8 + icon: PowerProfileService.getIcon(PowerProfile.PowerSaver) + tooltipText: I18n.tr("tooltips.set-power-profile", { + "profile": PowerProfileService.getName(PowerProfile.PowerSaver) + }) + enabled: hasPP + opacity: enabled ? Style.opacityFull : Style.opacityMedium + colorBg: (enabled && PowerProfileService.profile === PowerProfile.PowerSaver) ? Color.mPrimary : Color.mSurfaceVariant + colorFg: (enabled && PowerProfileService.profile === PowerProfile.PowerSaver) ? Color.mOnPrimary : Color.mPrimary + onClicked: PowerProfileService.setProfile(PowerProfile.PowerSaver) } } } - - NDivider { - Layout.fillWidth: true - } - - RowLayout { - spacing: root.spacing - - // Performance - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - icon: PowerProfileService.getIcon(PowerProfile.Performance) - tooltipText: I18n.tr("tooltips.set-power-profile", { - "profile": PowerProfileService.getName(PowerProfile.Performance) - }) - enabled: hasPP - opacity: enabled ? Style.opacityFull : Style.opacityMedium - colorBg: (enabled && PowerProfileService.profile === PowerProfile.Performance) ? Color.mPrimary : Color.mSurfaceVariant - colorFg: (enabled && PowerProfileService.profile === PowerProfile.Performance) ? Color.mOnPrimary : Color.mPrimary - onClicked: PowerProfileService.setProfile(PowerProfile.Performance) - } - - // Balanced - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - icon: PowerProfileService.getIcon(PowerProfile.Balanced) - tooltipText: I18n.tr("tooltips.set-power-profile", { - "profile": PowerProfileService.getName(PowerProfile.Balanced) - }) - enabled: hasPP - opacity: enabled ? Style.opacityFull : Style.opacityMedium - colorBg: (enabled && PowerProfileService.profile === PowerProfile.Balanced) ? Color.mPrimary : Color.mSurfaceVariant - colorFg: (enabled && PowerProfileService.profile === PowerProfile.Balanced) ? Color.mOnPrimary : Color.mPrimary - onClicked: PowerProfileService.setProfile(PowerProfile.Balanced) - } - - // Eco - NIconButton { - baseSize: Style.baseWidgetSize * 0.8 - icon: PowerProfileService.getIcon(PowerProfile.PowerSaver) - tooltipText: I18n.tr("tooltips.set-power-profile", { - "profile": PowerProfileService.getName(PowerProfile.PowerSaver) - }) - enabled: hasPP - opacity: enabled ? Style.opacityFull : Style.opacityMedium - colorBg: (enabled && PowerProfileService.profile === PowerProfile.PowerSaver) ? Color.mPrimary : Color.mSurfaceVariant - colorFg: (enabled && PowerProfileService.profile === PowerProfile.PowerSaver) ? Color.mOnPrimary : Color.mPrimary - onClicked: PowerProfileService.setProfile(PowerProfile.PowerSaver) - } - } } }