Skip to content
Draft
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
2 changes: 1 addition & 1 deletion src/UniGetUI.Core.Settings/SettingsEngine_Lists.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public static void SetList<T>(string setting, List<T> value)
public static void AddToList<T>(string setting, T value)
{
List<T>? list = _getList<T>(setting);
if (list == null) return;
list ??= [];

list.Add(value);
SetList(setting, list);
Expand Down
29 changes: 26 additions & 3 deletions src/UniGetUI.PackageEngine.Operations/PackageOperations.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
using UniGetUI.Core.Classes;
using UniGetUI.Core.Data;
using UniGetUI.Core.Logging;
using UniGetUI.Core.SettingsEngine;
using UniGetUI.Core.Tools;
using UniGetUI.Interface.Enums;
using UniGetUI.PackageEngine.Classes.Packages.Classes;
using UniGetUI.PackageEngine.Enums;
using UniGetUI.PackageEngine.Interfaces;
using UniGetUI.PackageEngine.Managers.WingetManager;
using UniGetUI.PackageEngine.PackageClasses;
using UniGetUI.PackageEngine.PackageLoader;
using UniGetUI.PackageOperations;

Expand Down Expand Up @@ -47,9 +49,30 @@ public PackageOperation(

Package.SetTag(PackageTag.OnQueue);
};
CancelRequested += (_, _) => Package.SetTag(PackageTag.Default);
OperationSucceeded += (_, _) => HandleSuccess();
OperationFailed += (_, _) => HandleFailure();
CancelRequested += (_, _) =>
{
Settings.AddToList("AdvancedOperationHistory", new AdvancedOperationHistoryEntry(
Package, Role, OperationStatus.Canceled,
string.Join("\n", GetOutput().Select(item => item.Item1))
));
Package.SetTag(PackageTag.Default);
};
OperationSucceeded += (_, _) =>
{
Settings.AddToList("AdvancedOperationHistory", new AdvancedOperationHistoryEntry(
Package, Role, OperationStatus.Succeeded,
string.Join("\n", GetOutput().Select(item => item.Item1))
));
HandleSuccess();
};
OperationFailed += (_, _) =>
{
Settings.AddToList("AdvancedOperationHistory", new AdvancedOperationHistoryEntry(
Package, Role, OperationStatus.Failed,
string.Join("\n", GetOutput().Select(item => item.Item1))
));
HandleFailure();
};
}

private bool RequiresAdminRights()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,21 +98,26 @@ public Package(

ignoredId = IgnoredUpdatesDatabase.GetIgnoredIdForPackage(this);

_iconId = Manager.Name switch
_iconId = GetPackageIconId(id, Manager.Name, Source.Name);
}

public static string GetPackageIconId(string PackageId, string ManagerName, string SourceName)
{
return ManagerName switch
{
"Winget" => Source.Name switch
"Winget" => SourceName switch
{
"Steam" => id.ToLower().Split("\\")[^1].Replace("steam app ", "steam-").Trim(),
"Local PC" => id.ToLower().Split("\\")[^1],
"Microsoft Store" => id.IndexOf('_') < id.IndexOf('.') ? // If the first underscore is before the period, this ID has no publisher
string.Join('_', id.ToLower().Split("\\")[1].Split("_")[0..^4]) : // no publisher: remove `MSIX\`, then the standard ending _version_arch__{random id}
string.Join('_', string.Join('.', id.ToLower().Split(".")[1..]).Split("_")[0..^4]), // remove the publisher (before the first .), then the standard _version_arch__{random id}
_ => string.Join('.', id.ToLower().Split(".")[1..]),
"Steam" => PackageId.ToLower().Split("\\")[^1].Replace("steam app ", "steam-").Trim(),
"Local PC" => PackageId.ToLower().Split("\\")[^1],
"Microsoft Store" => PackageId.IndexOf('_') < PackageId.IndexOf('.') ? // If the first underscore is before the period, this ID has no publisher
string.Join('_', PackageId.ToLower().Split("\\")[1].Split("_")[0..^4]) : // no publisher: remove `MSIX\`, then the standard ending _version_arch__{random id}
string.Join('_', string.Join('.', PackageId.ToLower().Split(".")[1..]).Split("_")[0..^4]), // remove the publisher (before the first .), then the standard _version_arch__{random id}
_ => string.Join('.', PackageId.ToLower().Split(".")[1..]),
},
"Scoop" => id.ToLower().Replace(".app", ""),
"Chocolatey" => id.ToLower().Replace(".install", "").Replace(".portable", ""),
"vcpkg" => id.ToLower().Split(":")[0].Split("[")[0],
_ => id.ToLower()
"Scoop" => PackageId.ToLower().Replace(".app", ""),
"Chocolatey" => PackageId.ToLower().Replace(".install", "").Replace(".portable", ""),
"vcpkg" => PackageId.ToLower().Split(":")[0].Split("[")[0],
_ => PackageId.ToLower()
};
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using System.Text.Json.Serialization;
using UniGetUI.Interface.Enums;
using UniGetUI.PackageEngine.Enums;
using UniGetUI.PackageEngine.Interfaces;

namespace UniGetUI.PackageEngine.PackageClasses
{
public class SimplePackage
{
public SimplePackage(IPackage source)
{
Description = "Not loaded";
Tags = [];
Name = source.Name;
Id = source.Id;
VersionString = source.VersionString;
NewVersionString = source.NewVersionString;
IconId = Package.GetPackageIconId(source.Id, source.Manager.Name, source.Source.Name);
ManagerName = source.Manager.Name;
ManagerDisplayName = source.Manager.DisplayName;
ManagerIconId = source.Manager.Properties.IconId;
SourceName = source.Source.Name;
SourceUrl = source.Source.Url;
SourceIconId = source.Source.IconId;
}

[JsonConstructor]
public SimplePackage(
string description, string[] tags, string name, string id,
string versionString, string newVersionString, string iconId,
string managerName, string managerDisplayName, IconType managerIconId,
string sourceName, Uri sourceUrl, IconType sourceIconId)
{
Description = description;
Tags = tags;
Name = name;
Id = id;
VersionString = versionString;
NewVersionString = newVersionString;
IconId = iconId;
ManagerName = managerName;
ManagerDisplayName = managerDisplayName;
ManagerIconId = managerIconId;
SourceName = sourceName;
SourceUrl = sourceUrl;
SourceIconId = sourceIconId;
}

public string Description { get; }
public string[] Tags { get; }
public string Name { get; }
public string Id { get; }
public string VersionString { get; }
public string NewVersionString { get; }
public string IconId { get; }
public string ManagerName { get; }
public string ManagerDisplayName { get; }
public IconType ManagerIconId { get; }
public string SourceName { get; }
public Uri SourceUrl { get; }
public IconType SourceIconId { get; }
}

public class AdvancedOperationHistoryEntry : SimplePackage
{
public AdvancedOperationHistoryEntry(IPackage source, OperationType type, OperationStatus status, string logs) : base(source)
{
Type = type;
Status = status;
Logs = logs;
}

[JsonConstructor]
public AdvancedOperationHistoryEntry(
OperationType type, OperationStatus status, string logs,
string description, string[] tags, string name, string id,
string versionString, string newVersionString, string iconId,
string managerName, string managerDisplayName, IconType managerIconId,
string sourceName, Uri sourceUrl, IconType sourceIconId)
: base(description, tags, name, id, versionString, newVersionString, iconId,
managerName, managerDisplayName, managerIconId, sourceName, sourceUrl, sourceIconId)
{
Type = type;
Status = status;
Logs = logs;
}

public OperationType Type { get; }
public OperationStatus Status { get; }
public string Logs { get; }
};
}
71 changes: 71 additions & 0 deletions src/UniGetUI/Pages/AdvancedOperationHistoryPage.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<Page
x:Class="UniGetUI.Interface.Pages.AdvancedOperationHistoryPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:UniGetUI.Interface.Pages"
xmlns:packages="using:UniGetUI.PackageEngine.PackageClasses"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:animations="using:CommunityToolkit.WinUI.Animations"
xmlns:Toolkit="using:CommunityToolkit.WinUI.Controls"
xmlns:widgets="using:UniGetUI.Interface.Widgets"
mc:Ignorable="d">

<animations:Implicit.ShowAnimations>
<animations:TranslationAnimation Duration="0:0:0.25" From="0,100,0" To="0"/>
<animations:OpacityAnimation Duration="0:0:0.25" From="0" To="1"/>
</animations:Implicit.ShowAnimations>

<Grid>
<StackPanel x:Name="MainLayout" HorizontalAlignment="Stretch" Grid.Column="1" Grid.Row="0" Orientation="Vertical" Spacing="8" Margin="0,0,0,20">
<widgets:TranslatedTextBlock FontSize="40" FontWeight="Bold" WrappingMode="NoWrap" Text="Advanced Operation History" HorizontalAlignment="Center"/>
<ListView x:Name="AdvancedOperationHistoryList" VerticalAlignment="Stretch" HorizontalAlignment="Center" Width="800">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Grid>
<ContentPresenter />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate x:DataType="packages:AdvancedOperationHistoryEntry">
<Expander HorizontalAlignment="Stretch" MaxWidth="800" BorderThickness="0" Margin="0,0,0,10">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<widgets:LocalIcon Icon="Android" />
<TextBlock Text="{x:Bind Name}" Margin="20,0,0,0" />
</StackPanel>
</Expander.Header>
<Expander.Content>
<ScrollViewer Height="100">
<TextBlock TextWrapping="Wrap">
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia
deserunt mollit anim id est laborum.
</TextBlock>
</ScrollViewer>
</Expander.Content>
</Expander>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
</Page>
43 changes: 43 additions & 0 deletions src/UniGetUI/Pages/AdvancedOperationHistoryPage.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using System.Collections.ObjectModel;
using Microsoft.UI.Xaml.Controls;
using UniGetUI.Core.SettingsEngine;
using UniGetUI.Core.Logging;
using UniGetUI.Core.Tools;
using UniGetUI.Interface.Enums;
using UniGetUI.PackageEngine.Enums;
using UniGetUI.PackageEngine.PackageClasses;

namespace UniGetUI.Interface.Pages
{

public partial class AdvancedOperationHistoryPage : IKeyboardShortcutListener, IEnterLeaveListener
{
private ObservableCollection<AdvancedOperationHistoryEntry> Items = [];

public AdvancedOperationHistoryPage()
{
InitializeComponent();

LoadOperationHistory();
}

private void LoadOperationHistory()
{
Items.Clear();

Items = [.. Settings.GetList<AdvancedOperationHistoryEntry>("AdvancedOperationHistory") ?? []];
AdvancedOperationHistoryList.ItemsSource = Items;
}

public void ReloadTriggered()
=> LoadOperationHistory();
public void SelectAllTriggered()
{ }
public void SearchTriggered()
{ }
public void OnEnter()
=> LoadOperationHistory();
public void OnLeave()
{ }
}
}
8 changes: 7 additions & 1 deletion src/UniGetUI/Pages/MainView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,13 @@
<MenuFlyoutSeparator Height="5"/>
<widgets:BetterMenuItem Text="WingetUI Log" IconName="buggy" Name="WingetUILogs" Click="UniGetUILogs_Click" />
<widgets:BetterMenuItem Text="Package Manager logs" IconName="console" Name="ManagerLogsMenu" Click="ManagerLogsMenu_Click" />
<widgets:BetterMenuItem Text="Operation history" IconName="history" Name="OperationHistoryMenu" Click="OperationHistoryMenu_Click" />
<MenuFlyoutSubItem x:Name="OperationHistorySubMenu" Text="Operation history">
<MenuFlyoutSubItem.Icon>
<widgets:LocalIcon FontSize="24" Icon="History" />
</MenuFlyoutSubItem.Icon>
<widgets:BetterMenuItem Text="Operation logs" Name="OperationHistoryMenu" Click="OperationHistoryMenu_Click" />
<widgets:BetterMenuItem Text="Advanced operation history" Name="AdvancedOperationHistoryMenu" Click="AdvancedOperationHistoryMenu_Click" />
</MenuFlyoutSubItem>
<MenuFlyoutSeparator Height="5"/>
<widgets:BetterMenuItem x:Name="VersionMenuItem" IconName="info_round" IsEnabled="False" />
<widgets:BetterMenuItem Text="Release notes" IconName="megaphone" Name="ReleaseNotesMenu" Click="ReleaseNotesMenu_Click" />
Expand Down
11 changes: 10 additions & 1 deletion src/UniGetUI/Pages/MainView.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public enum PageType
OwnLog,
ManagerLog,
OperationHistory,
AdvancedOperationHistory,
Help,
Null // Used for initializers
}
Expand All @@ -45,6 +46,7 @@ public sealed partial class MainView : UserControl
private UniGetUILogPage? UniGetUILogPage;
private ManagerLogsPage? ManagerLogPage;
private OperationHistoryPage? OperationHistoryPage;
private AdvancedOperationHistoryPage? AdvancedOperationHistoryPage;
private HelpPage? HelpPage;

private PageType OldPage_t = PageType.Null;
Expand Down Expand Up @@ -137,6 +139,7 @@ public void LoadDefaultPage()
"installed" => PageType.Installed,
"bundles" => PageType.Bundles,
"settings" => PageType.Settings,
"ophist" => PageType.AdvancedOperationHistory,
_ => MainApp.Tooltip.AvailableUpdates > 0 ? PageType.Updates : PageType.Discover
};
NavigateTo(type);
Expand Down Expand Up @@ -172,6 +175,7 @@ private Page GetPageForType(PageType type)
PageType.OwnLog => UniGetUILogPage ??= new UniGetUILogPage(),
PageType.ManagerLog => ManagerLogPage ??= new ManagerLogsPage(),
PageType.OperationHistory => OperationHistoryPage ??= new OperationHistoryPage(),
PageType.AdvancedOperationHistory => AdvancedOperationHistoryPage ??= new AdvancedOperationHistoryPage(),
PageType.Help => HelpPage ??= new HelpPage(),
PageType.Null => throw new InvalidCastException("Page type is Null"),
_ => throw new InvalidDataException($"Unknown page type {type}")
Expand All @@ -189,6 +193,7 @@ private static PageType GetNextPage(PageType type)

// "Extra" pages
PageType.OperationHistory => PageType.Discover,
PageType.AdvancedOperationHistory => PageType.Discover,
PageType.OwnLog => PageType.Discover,
PageType.ManagerLog => PageType.Discover,
PageType.Help => PageType.Discover,
Expand All @@ -208,6 +213,7 @@ private static PageType GetPreviousPage(PageType type)

// "Extra" pages
PageType.OperationHistory => PageType.Discover,
PageType.AdvancedOperationHistory => PageType.Discover,
PageType.OwnLog => PageType.Discover,
PageType.ManagerLog => PageType.Discover,
PageType.Help => PageType.Discover,
Expand All @@ -227,7 +233,7 @@ private void SelectNavButtonForPage(PageType page)

SettingsNavButton.IsChecked = page is PageType.Settings;
AboutNavButton.IsChecked = false;
MoreNavButton.IsChecked = page is PageType.Help or PageType.ManagerLog or PageType.OperationHistory or PageType.OwnLog;
MoreNavButton.IsChecked = page is PageType.Help or PageType.ManagerLog or PageType.OperationHistory or PageType.AdvancedOperationHistory or PageType.OwnLog;
}

private async void AboutNavButton_Click(object sender, EventArgs e)
Expand Down Expand Up @@ -279,6 +285,9 @@ private void ReleaseNotesMenu_Click(object sender, RoutedEventArgs e)
private void OperationHistoryMenu_Click(object sender, RoutedEventArgs e)
=> NavigateTo(PageType.OperationHistory);

private void AdvancedOperationHistoryMenu_Click(object sender, RoutedEventArgs e)
=> NavigateTo(PageType.AdvancedOperationHistory);

private void ManagerLogsMenu_Click(object sender, RoutedEventArgs e)
=> OpenManagerLogs();

Expand Down
1 change: 1 addition & 0 deletions src/UniGetUI/Pages/SettingsPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ public SettingsPage()
StartupPageSelector.AddItem(CoreTools.AutoTranslated("Installed Packages"), "installed");
StartupPageSelector.AddItem(CoreTools.AutoTranslated("Package Bundles"), "bundles");
StartupPageSelector.AddItem(CoreTools.AutoTranslated("Settings"), "settings");
StartupPageSelector.AddItem(CoreTools.AutoTranslated("Operation History"), "ophist");
StartupPageSelector.ShowAddedItems();

for (int i = 1; i <= 10; i++)
Expand Down