Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

namespace Microsoft.CmdPal.Ext.PerformanceMonitor;

/// <summary>
/// Controls the unit used to display network transmission speed.
/// </summary>
internal enum NetworkSpeedUnit
{
/// <summary>Bits per second (Kbps, Mbps, Gbps) — SI decimal prefixes.</summary>
BitsPerSecond,

/// <summary>Bytes per second (KB/s, MB/s, GB/s) — SI decimal prefixes.</summary>
BytesPerSecond,

/// <summary>Bytes per second (KiB/s, MiB/s, GiB/s) — IEC binary prefixes.</summary>
BinaryBytesPerSecond,
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public partial class PerformanceMonitorCommandsProvider : CommandProvider
internal static ProviderCrashSentinel CrashSentinel { get; } = new(ProviderIdValue);

private readonly Lock _stateLock = new();
private readonly SettingsManager _settingsManager = new();
private ICommandItem[] _commands = [];
private ICommandItem _band = new CommandItem();
private PerformanceWidgetsPage? _mainPage;
Expand All @@ -33,6 +34,8 @@ public PerformanceMonitorCommandsProvider(bool softDisabled = false)
Id = ProviderIdValue;
Icon = Icons.PerformanceMonitorIcon;

Settings = _settingsManager.Settings;

if (softDisabled)
{
SetDisabledState();
Expand Down Expand Up @@ -121,12 +124,16 @@ private void SetEnabledState()
{
DisposeActivePages();

_mainPage = new PerformanceWidgetsPage(false);
_bandPage = new PerformanceWidgetsPage(true);
_mainPage = new PerformanceWidgetsPage(_settingsManager, false);
_bandPage = new PerformanceWidgetsPage(_settingsManager, true);
_band = new CommandItem(_bandPage) { Title = DisplayName };
_commands =
[
new CommandItem(_mainPage) { Title = DisplayName },
new CommandItem(_mainPage)
{
Title = DisplayName,
MoreCommands = [new CommandContextItem(_settingsManager.Settings.SettingsPage)],
},
];
_softDisabled = false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ internal sealed partial class PerformanceWidgetsPage : OnLoadStaticListPage, IDi
private readonly SystemMemoryUsageWidgetPage _memoryPage = new();
private readonly ListItem _memoryItem;

private readonly SystemNetworkUsageWidgetPage _networkPage = new();
private readonly SystemNetworkUsageWidgetPage _networkPage;
private readonly ListItem _networkItem;

private readonly SystemGPUUsageWidgetPage _gpuPage = new();
Expand All @@ -55,9 +55,10 @@ internal sealed partial class PerformanceWidgetsPage : OnLoadStaticListPage, IDi
private string _networkUpSpeed = string.Empty;
private string _networkDownSpeed = string.Empty;

public PerformanceWidgetsPage(bool isBandPage = false)
public PerformanceWidgetsPage(SettingsManager settingsManager, bool isBandPage = false)
{
_isBandPage = isBandPage;
_networkPage = new SystemNetworkUsageWidgetPage(settingsManager);
_cpuItem = new ListItem(_cpuPage)
{
Title = _cpuPage.GetItemTitle(isBandPage),
Expand Down Expand Up @@ -532,10 +533,12 @@ internal sealed partial class SystemNetworkUsageWidgetPage : WidgetPage, IDispos
public override IconInfo Icon => Icons.NetworkIcon;

private readonly DataManager _dataManager;
private readonly SettingsManager _settingsManager;
private int _networkIndex;

public SystemNetworkUsageWidgetPage()
public SystemNetworkUsageWidgetPage(SettingsManager settingsManager)
{
_settingsManager = settingsManager;
_dataManager = new(DataType.Network, () => UpdateWidget());
Commands = [
new CommandContextItem(new PrevNetworkCommand(this) { Name = Resources.GetResource("Previous_Network_Title") }),
Expand All @@ -561,8 +564,8 @@ protected override void LoadContentData()
var networkStats = currentData.GetNetworkUsage(_networkIndex);

ContentData["networkUsage"] = FloatToPercentString(networkStats.Usage);
ContentData["netSent"] = BytesToBitsPerSecString(networkStats.Sent);
ContentData["netReceived"] = BytesToBitsPerSecString(networkStats.Received);
ContentData["netSent"] = SpeedToString(networkStats.Sent);
ContentData["netReceived"] = SpeedToString(networkStats.Received);
ContentData["networkName"] = netName;
ContentData["netGraphUrl"] = currentData.CreateNetImageUrl(_networkIndex);
ContentData["chartHeight"] = ChartHelper.ChartHeight + "px";
Expand Down Expand Up @@ -627,7 +630,17 @@ public string GetDownSpeed()
}
}

private string BytesToBitsPerSecString(float value)
private string SpeedToString(float bytesPerSec)
{
return _settingsManager.NetworkSpeedUnit switch
{
NetworkSpeedUnit.BytesPerSecond => FormatAsBytesPerSecString(bytesPerSec),
NetworkSpeedUnit.BinaryBytesPerSecond => FormatAsBinaryBytesPerSecString(bytesPerSec),
_ => FormatAsBitsPerSecString(bytesPerSec),
};
}

private static string FormatAsBitsPerSecString(float value)
{
// Bytes to bits
value *= 8;
Expand Down Expand Up @@ -666,6 +679,78 @@ private string BytesToBitsPerSecString(float value)
return string.Format(CultureInfo.InvariantCulture, "{0:0} Gbps", value);
}

private static string FormatAsBytesPerSecString(float value)
{
// Bytes to KB
value /= 1024;
if (value < 1024)
{
if (value < 100)
{
return string.Format(CultureInfo.InvariantCulture, "{0:0.0} KB/s", value);
}

return string.Format(CultureInfo.InvariantCulture, "{0:0} KB/s", value);
}

// KB to MB
value /= 1024;
if (value < 1024)
{
if (value < 100)
{
return string.Format(CultureInfo.InvariantCulture, "{0:0.0} MB/s", value);
}

return string.Format(CultureInfo.InvariantCulture, "{0:0} MB/s", value);
}

// MB to GB
value /= 1024;
if (value < 100)
{
return string.Format(CultureInfo.InvariantCulture, "{0:0.0} GB/s", value);
}

return string.Format(CultureInfo.InvariantCulture, "{0:0} GB/s", value);
}

private static string FormatAsBinaryBytesPerSecString(float value)
{
// Bytes to KiB
value /= 1024;
if (value < 1024)
{
if (value < 100)
{
return string.Format(CultureInfo.InvariantCulture, "{0:0.0} KiB/s", value);
}

return string.Format(CultureInfo.InvariantCulture, "{0:0} KiB/s", value);
}

// KiB to MiB
value /= 1024;
if (value < 1024)
{
if (value < 100)
{
return string.Format(CultureInfo.InvariantCulture, "{0:0.0} MiB/s", value);
}

return string.Format(CultureInfo.InvariantCulture, "{0:0} MiB/s", value);
}

// MiB to GiB
value /= 1024;
if (value < 100)
{
return string.Format(CultureInfo.InvariantCulture, "{0:0.0} GiB/s", value);
}

return string.Format(CultureInfo.InvariantCulture, "{0:0} GiB/s", value);
}

internal override void PushActivate()
{
base.PushActivate();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.IO;
using CoreWidgetProvider.Helpers;
using Microsoft.CommandPalette.Extensions.Toolkit;

namespace Microsoft.CmdPal.Ext.PerformanceMonitor;

internal sealed class SettingsManager : JsonSettingsManager
{
private const string Namespace = "performanceMonitor";

private static string Namespaced(string propertyName) => $"{Namespace}.{propertyName}";

private readonly ChoiceSetSetting _networkSpeedUnit = new(
Namespaced(nameof(NetworkSpeedUnit)),
Resources.GetResource("Network_Speed_Unit_Setting_Title"),
Resources.GetResource("Network_Speed_Unit_Setting_Description"),
[
new ChoiceSetSetting.Choice(Resources.GetResource("Network_Speed_Unit_BitsPerSec"), NetworkSpeedUnit.BitsPerSecond.ToString("G")),
new ChoiceSetSetting.Choice(Resources.GetResource("Network_Speed_Unit_BytesPerSec"), NetworkSpeedUnit.BytesPerSecond.ToString("G")),
new ChoiceSetSetting.Choice(Resources.GetResource("Network_Speed_Unit_BinaryBytesPerSec"), NetworkSpeedUnit.BinaryBytesPerSecond.ToString("G")),
]);

public NetworkSpeedUnit NetworkSpeedUnit =>
Enum.TryParse<NetworkSpeedUnit>(_networkSpeedUnit.Value, out var unit)
? unit
: NetworkSpeedUnit.BitsPerSecond;

private static string SettingsJsonPath()
{
var directory = Utilities.BaseSettingsPath("Microsoft.CmdPal");
Directory.CreateDirectory(directory);
return Path.Combine(directory, "settings.json");
}

public SettingsManager()
{
FilePath = SettingsJsonPath();

Settings.Add(_networkSpeedUnit);

LoadSettings();

Settings.SettingsChanged += (_, _) => SaveSettings();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -276,4 +276,19 @@
<data name="Network_Receive_Subtitle" xml:space="preserve">
<value>Receive ↓</value>
</data>
<data name="Network_Speed_Unit_Setting_Title" xml:space="preserve">
<value>Network speed unit</value>
</data>
<data name="Network_Speed_Unit_Setting_Description" xml:space="preserve">
<value>Choose the unit used to display network transmission speed</value>
</data>
<data name="Network_Speed_Unit_BitsPerSec" xml:space="preserve">
<value>Bits per second (Kbps, Mbps, Gbps)</value>
</data>
<data name="Network_Speed_Unit_BytesPerSec" xml:space="preserve">
<value>Bytes per second (KB/s, MB/s, GB/s)</value>
</data>
<data name="Network_Speed_Unit_BinaryBytesPerSec" xml:space="preserve">
<value>Binary bytes per second (KiB/s, MiB/s, GiB/s)</value>
</data>
</root>
Loading