Skip to content

Commit 743637c

Browse files
committed
Adds a Database view page to see all compression results
1 parent 7f5bd48 commit 743637c

File tree

9 files changed

+483
-0
lines changed

9 files changed

+483
-0
lines changed

CompactGUI/Application.xaml.vb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ Partial Public Class Application
5858
services.AddSingleton(Of SettingsPage)()
5959
services.AddSingleton(Of SettingsViewModel)()
6060

61+
services.AddSingleton(Of DatabasePage)()
62+
services.AddTransient(Of DatabaseViewModel)()
6163

6264
'Other services
6365
services.AddSingleton(Of Watcher.Watcher)(Function()

CompactGUI/Components/Converters/Converters.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
<local:IsSteamFolderConverter x:Key="IsSteamFolderConverter"/>
2828
<local:AnimationFactorToValueConverter x:Key="AnimationFactorToValueConverter" />
2929
<local:FolderActionStateWorkingToVisibilityConverter x:Key="FolderActionStateWorkingToVisibilityConverter" />
30+
<local:ZeroCountToVisibilityConverter x:Key="ZeroCountToVisibilityConverter"/>
3031

3132
<converters:ValueConverterGroup x:Key="IsSteamFolderToVisibilityConverter">
3233
<local:IsSteamFolderConverter/>

CompactGUI/Components/Converters/IValueConverters.vb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,4 +391,21 @@ Public Class FolderActionStateWorkingToVisibilityConverter
391391
Throw New NotImplementedException()
392392
End Function
393393

394+
End Class
395+
396+
Public Class ZeroCountToVisibilityConverter
397+
Implements IValueConverter
398+
399+
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
400+
Dim val = CType(value, Integer)
401+
If val = 0 Then
402+
Return Visibility.Collapsed
403+
Else
404+
Return Visibility.Visible
405+
End If
406+
End Function
407+
408+
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
409+
Throw New NotImplementedException()
410+
End Function
394411
End Class

CompactGUI/MainWindow.xaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@
6161
</ui:NavigationViewItem.Icon>
6262
</ui:NavigationViewItem>
6363

64+
<ui:NavigationViewItem Content="Compression DB"
65+
Margin="15,2,15,10"
66+
NavigationCacheMode="Disabled"
67+
Tag="{Binding}"
68+
TargetPageType="{x:Type local:DatabasePage}">
69+
<ui:NavigationViewItem.Icon>
70+
<ui:SymbolIcon Filled="False" Symbol="Database24" />
71+
</ui:NavigationViewItem.Icon>
72+
</ui:NavigationViewItem>
6473

6574
</ui:NavigationView.MenuItems>
6675

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
Imports CommunityToolkit.Mvvm.ComponentModel
2+
3+
Public Class DatabaseCompressionResult : Inherits ObservableObject
4+
5+
Public Property GameName As String
6+
Public Property SteamID As Integer
7+
Public Property Confidence As DBResultConfidence
8+
9+
Public Property Result_X4K As CompressionResult
10+
Public Property Result_X8K As CompressionResult
11+
Public Property Result_X16K As CompressionResult
12+
Public Property Result_LZX As CompressionResult
13+
14+
Public Property PoorlyCompressedExtensions As List(Of DBPoorlyCompressedExtension)
15+
16+
Public ReadOnly Property MaxSavings As Decimal
17+
Get
18+
Return Math.Max(
19+
Math.Max(
20+
If(Result_X4K IsNot Nothing, Result_X4K.CompressionSavings, 0D),
21+
If(Result_X8K IsNot Nothing, Result_X8K.CompressionSavings, 0D)
22+
),
23+
Math.Max(
24+
If(Result_X16K IsNot Nothing, Result_X16K.CompressionSavings, 0D),
25+
If(Result_LZX IsNot Nothing, Result_LZX.CompressionSavings, 0D)
26+
)
27+
)
28+
End Get
29+
End Property
30+
31+
32+
End Class
33+
34+
Public Enum DBResultConfidence
35+
Low = 0
36+
Medium = 1
37+
High = 2
38+
End Enum
39+
40+
Public Structure DBPoorlyCompressedExtension
41+
Public Property Extension As String
42+
Public Property Count As Integer
43+
End Structure

CompactGUI/Services/WikiService.vb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Imports System.Text.Json
44
Public Interface IWikiService
55
Function GetUpdatedJSONAsync() As Task
66
Function ParseData(appid As Integer) As Task(Of (estimatedRatio As Decimal, confidence As Integer, poorlyCompressedList As Dictionary(Of String, Integer), compressionResults As List(Of CompressionResult)))
7+
Function GetAllDatabaseCompressionResultsAsync() As Task(Of List(Of DatabaseCompressionResult))
78
Function SubmitToWiki(folderpath As String, analysisResults As List(Of Core.AnalysedFileDetails), poorlyCompressedFiles As List(Of Core.ExtensionResult), compressionMode As Integer) As Task(Of Boolean)
89
Function SubmitURLForm(url As String, submissionstring As String) As Task(Of Boolean)
910
End Interface
@@ -76,6 +77,39 @@ Public Class WikiService : Implements IWikiService
7677
End Function
7778

7879

80+
Public Async Function GetAllDatabaseCompressionResultsAsync() As Task(Of List(Of DatabaseCompressionResult)) Implements IWikiService.GetAllDatabaseCompressionResultsAsync
81+
Dim JSONFile As New IO.FileInfo(filePath)
82+
If Not JSONFile.Exists Then Return New List(Of DatabaseCompressionResult)()
83+
84+
Using jStream As IO.FileStream = JSONFile.OpenRead()
85+
' Deserialize the JSON into a list of SteamResultsData (or your source model)
86+
Dim parsedResults = Await JsonSerializer.DeserializeAsync(Of List(Of SteamResultsData))(jStream, JsonDefaultSettings).ConfigureAwait(False)
87+
If parsedResults Is Nothing Then Return New List(Of DatabaseCompressionResult)()
88+
89+
' Map each SteamResultsData to DatabaseCompressionResult
90+
Dim results As New List(Of DatabaseCompressionResult)
91+
For Each item In parsedResults
92+
Dim dbResult As New DatabaseCompressionResult With {
93+
.GameName = item.GameName,
94+
.SteamID = item.SteamID,
95+
.Confidence = CType(item.Confidence, DBResultConfidence),
96+
.Result_X4K = item.CompressionResults.FirstOrDefault(Function(r) r.CompType = 0),
97+
.Result_X8K = item.CompressionResults.FirstOrDefault(Function(r) r.CompType = 1),
98+
.Result_X16K = item.CompressionResults.FirstOrDefault(Function(r) r.CompType = 2),
99+
.Result_LZX = item.CompressionResults.FirstOrDefault(Function(r) r.CompType = 3),
100+
.PoorlyCompressedExtensions = item.PoorlyCompressedExtensions?.Select(Function(kvp) New DBPoorlyCompressedExtension With {.Extension = kvp.Key, .Count = kvp.Value}).ToList()
101+
}
102+
results.Add(dbResult)
103+
Next
104+
105+
Return results
106+
End Using
107+
End Function
108+
109+
110+
111+
112+
79113
Async Function SubmitToWiki(folderpath As String, analysisResults As List(Of Core.AnalysedFileDetails), poorlyCompressedFiles As List(Of Core.ExtensionResult), compressionMode As Integer) As Task(Of Boolean) Implements IWikiService.SubmitToWiki
80114
Dim wikiSubmitURI = "https://docs.google.com/forms/d/e/1FAIpQLSdQyMwHIfldsuKKdDYBE9DNEyro8bidBDInq8EafGogFu382A/formResponse?entry.1019946248=%3CCompactGUI3%3E"
81115

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
Imports System.Collections.ObjectModel
2+
Imports System.ComponentModel
3+
4+
Imports CommunityToolkit.Mvvm.ComponentModel
5+
Imports CommunityToolkit.Mvvm.Input
6+
7+
Public Class DatabaseViewModel : Inherits ObservableObject
8+
9+
Public Property DatabaseResults As ObservableCollection(Of DatabaseCompressionResult)
10+
Public ReadOnly Property FilteredResults As ICollectionView
11+
12+
Public ReadOnly Property DatabaseGamesCount As Integer
13+
Get
14+
Return DatabaseResults.Count
15+
End Get
16+
End Property
17+
18+
Public ReadOnly Property DatabaseSubmissionsCount As Integer
19+
Get
20+
Return DatabaseResults.Sum(Function(result) _
21+
(If(result.Result_X4K?.TotalResults, 0)) +
22+
(If(result.Result_X8K?.TotalResults, 0)) +
23+
(If(result.Result_X16K?.TotalResults, 0)) +
24+
(If(result.Result_LZX?.TotalResults, 0))
25+
)
26+
End Get
27+
End Property
28+
29+
30+
Public ReadOnly Property LastUpdatedDatabase As DateTime
31+
Get
32+
Return SettingsHandler.AppSettings.ResultsDBLastUpdated
33+
End Get
34+
End Property
35+
36+
37+
Private _searchText As String
38+
Public Property SearchText As String
39+
Get
40+
Return _searchText
41+
End Get
42+
Set(value As String)
43+
SetProperty(_searchText, value)
44+
FilteredResults.Refresh()
45+
End Set
46+
End Property
47+
48+
Public Sub New()
49+
DatabaseResults = New ObservableCollection(Of DatabaseCompressionResult)(Application.GetService(Of IWikiService).GetAllDatabaseCompressionResultsAsync().GetAwaiter.GetResult)
50+
51+
FilteredResults = CollectionViewSource.GetDefaultView(DatabaseResults)
52+
FilteredResults.Filter = AddressOf FilterResults
53+
End Sub
54+
55+
56+
Private Function NormalizeString(input As String) As String
57+
If String.IsNullOrEmpty(input) Then Return String.Empty
58+
Return New String(input.Where(Function(c) Char.IsLetterOrDigit(c) OrElse Char.IsWhiteSpace(c)).ToArray()).ToLowerInvariant()
59+
End Function
60+
61+
Private Function FilterResults(obj As Object) As Boolean
62+
If String.IsNullOrWhiteSpace(SearchText) Then Return True
63+
Dim item = TryCast(obj, DatabaseCompressionResult)
64+
If item Is Nothing OrElse item.GameName Is Nothing Then Return False
65+
66+
' Normalize GameName for punctuation-insensitive search
67+
Dim normalizedGameName = NormalizeString(item.GameName)
68+
69+
Return (item.GameName.IndexOf(SearchText, StringComparison.OrdinalIgnoreCase) >= 0) OrElse
70+
(normalizedGameName.Contains(SearchText)) OrElse
71+
(item.SteamID.ToString().Contains(SearchText))
72+
End Function
73+
74+
Public ReadOnly Property SortCommand As ICommand = New RelayCommand(Of Object)(Sub(f) SortResults(f))
75+
76+
77+
Private Sub SortResults(param As Object)
78+
Dim sortOption = param?.ToString()
79+
FilteredResults.SortDescriptions.Clear()
80+
81+
Select Case sortOption
82+
Case "GameNameAsc"
83+
FilteredResults.SortDescriptions.Add(New SortDescription("GameName", ListSortDirection.Ascending))
84+
Case "GameNameDesc"
85+
FilteredResults.SortDescriptions.Add(New SortDescription("GameName", ListSortDirection.Descending))
86+
Case "SteamIDAsc"
87+
FilteredResults.SortDescriptions.Add(New SortDescription("SteamID", ListSortDirection.Ascending))
88+
Case "SteamIDDesc"
89+
FilteredResults.SortDescriptions.Add(New SortDescription("SteamID", ListSortDirection.Descending))
90+
Case "MaxSavingsAsc"
91+
FilteredResults.SortDescriptions.Add(New SortDescription("MaxSavings", ListSortDirection.Ascending))
92+
Case "MaxSavingsDesc"
93+
FilteredResults.SortDescriptions.Add(New SortDescription("MaxSavings", ListSortDirection.Descending))
94+
End Select
95+
End Sub
96+
97+
98+
End Class

0 commit comments

Comments
 (0)