/* * Copyright (c) 2024 ETH Zürich, IT Services * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using SafeExamBrowser.I18n.Contracts; using SafeExamBrowser.SystemComponents.Contracts.PowerSupply; using SafeExamBrowser.UserInterface.Contracts.Shell; namespace SafeExamBrowser.UserInterface.Desktop.Controls.ActionCenter { internal partial class PowerSupplyControl : UserControl, ISystemControl { private Brush initialBrush; private bool infoShown, warningShown; private double maxWidth; private IPowerSupply powerSupply; private IText text; internal PowerSupplyControl(IPowerSupply powerSupply, IText text) { this.powerSupply = powerSupply; this.text = text; InitializeComponent(); InitializePowerSupplyControl(); } public void Close() { } public void SetInformation(string text) { Dispatcher.InvokeAsync(() => Text.Text = text); } private void InitializePowerSupplyControl() { initialBrush = BatteryCharge.Fill; maxWidth = BatteryCharge.Width; powerSupply.StatusChanged += PowerSupply_StatusChanged; UpdateStatus(powerSupply.GetStatus()); } private void PowerSupply_StatusChanged(IPowerSupplyStatus status) { Dispatcher.InvokeAsync(() => UpdateStatus(status)); } private void UpdateStatus(IPowerSupplyStatus status) { var percentage = Math.Round(status.BatteryCharge * 100); var tooltip = string.Empty; RenderCharge(status.BatteryCharge, status.BatteryChargeStatus); if (status.IsOnline) { infoShown = false; warningShown = false; tooltip = text.Get(percentage == 100 ? TextKey.SystemControl_BatteryCharged : TextKey.SystemControl_BatteryCharging); tooltip = tooltip.Replace("%%CHARGE%%", percentage.ToString()); } else { tooltip = text.Get(TextKey.SystemControl_BatteryRemainingCharge); tooltip = tooltip.Replace("%%CHARGE%%", percentage.ToString()); tooltip = tooltip.Replace("%%HOURS%%", status.BatteryTimeRemaining.Hours.ToString()); tooltip = tooltip.Replace("%%MINUTES%%", status.BatteryTimeRemaining.Minutes.ToString()); HandleBatteryStatus(status.BatteryChargeStatus); } if (!infoShown && !warningShown) { Button.ToolTip = tooltip; } PowerPlug.Visibility = status.IsOnline ? Visibility.Visible : Visibility.Collapsed; Text.Text = tooltip; Warning.Visibility = status.BatteryChargeStatus == BatteryChargeStatus.Critical ? Visibility.Visible : Visibility.Collapsed; this.SetValue(System.Windows.Automation.AutomationProperties.NameProperty, tooltip); } private void RenderCharge(double charge, BatteryChargeStatus status) { var width = maxWidth * charge; BatteryCharge.Width = width > maxWidth ? maxWidth : (width < 0 ? 0 : width); switch (status) { case BatteryChargeStatus.Critical: BatteryCharge.Fill = Brushes.Red; break; case BatteryChargeStatus.Low: BatteryCharge.Fill = Brushes.Orange; break; default: BatteryCharge.Fill = initialBrush; break; } } private void HandleBatteryStatus(BatteryChargeStatus chargeStatus) { if (chargeStatus == BatteryChargeStatus.Low && !infoShown) { Button.ToolTip = text.Get(TextKey.SystemControl_BatteryChargeLowInfo); infoShown = true; } if (chargeStatus == BatteryChargeStatus.Critical && !warningShown) { Button.ToolTip = text.Get(TextKey.SystemControl_BatteryChargeCriticalWarning); warningShown = true; } } } }