From 3cdbfe490f48ab6ba4ffa9009bb0fa914844e381 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:34:01 +0100 Subject: [PATCH 001/294] Replace the font with Atkinson Hyperlegible, make it consistent everywhere --- .gitignore | 2 +- .../Fonts/AtkinsonHyperlegible-Bold.ttf | Bin 0 -> 43756 bytes .../Fonts/AtkinsonHyperlegible-BoldItalic.ttf | Bin 0 -> 44664 bytes .../Fonts/AtkinsonHyperlegible-Italic.ttf | Bin 0 -> 43540 bytes .../Fonts/AtkinsonHyperlegible-Regular.ttf | Bin 0 -> 42596 bytes Wabbajack.App.Wpf/Themes/Styles.xaml | 20 ++++++++++-------- .../Views/Common/DetailImageView.xaml | 12 +++++------ .../Views/Common/TopProgressView.xaml | 4 ++-- .../Views/Common/UnderMaintenanceOverlay.xaml | 8 +++---- .../Compilers/CompilationCompleteView.xaml | 2 +- .../Installers/InstallationCompleteView.xaml | 2 +- .../InstallationConfigurationView.xaml | 2 +- .../Views/Installers/InstallationView.xaml | 2 +- .../ConfirmationInterventionView.xaml | 2 +- Wabbajack.App.Wpf/Views/ModListTileView.xaml | 4 ++-- .../Views/ModeSelectionView.xaml | 3 +++ .../Views/Settings/AuthorFilesView.xaml | 2 +- .../Views/Settings/LoginSettingsView.xaml | 2 +- .../Views/Settings/MiscSettingsView.xaml | 2 +- .../Settings/PerformanceSettingsView.xaml | 2 +- .../Views/Settings/SettingsView.xaml | 2 +- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 19 +++++++++++++++++ 22 files changed, 58 insertions(+), 34 deletions(-) create mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Bold.ttf create mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-BoldItalic.ttf create mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Italic.ttf create mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Regular.ttf diff --git a/.gitignore b/.gitignore index cf1eb9bc8..7ee716998 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ obj *.user .\packages\* /VERSION.txt -*.opencover.xml \ No newline at end of file +*.opencover.xml diff --git a/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Bold.ttf b/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..14b719618a199672eab4aacda3b9bee5ec5529d7 GIT binary patch literal 43756 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 C)jy2|0F%#U0q#W-*0{I`c{P_ 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 VLP|*Mg8Q|Sy941QuKhEm{|^Ahhob-h literal 0 HcmV?d00001 diff --git a/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Italic.ttf b/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..89e5ce4bc785e9a44f929509591f69f3f4ff3caa GIT binary patch literal 43540 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 literal 0 HcmV?d00001 diff --git a/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Regular.ttf b/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c4fa6fbe19063e315ba204adf1db3cf10ee0d0b3 GIT binary patch literal 42596 zcmb@v31HjBl|Mf7m2LTyE$g%-%U|iM+md|9vV6yud?c|G+liCdNeFgq=YU+~;4ZY3 zc3BFv4JBMD+qC8Z@!Xj=V00X{|;Y$ z=R4mwGw;25^WK{`GhY~Ij8)^OfXV&qR}J9_51-qLd+|{Jz#yyS^^9Hr3Z9KaW25VT zYB_W_p5JE7`kSHk8LX;OP2>=B5`9Zewi6rGTHF-8*yO+rRnU^LT!a zG0oB0ix11@Tgt9u>@pAD@7Zx+=U&~ef2d~cf<27s%685iI>5Bdj{1Lw_vJhHT(;x$ z_W1&!6lQGe4ZG%N=FD5ahx(_F<9+KcWN3#9H=+IsJbQNSJ$&gi`tEwO;vJ|AJM^r-{;4;?;lF#RH9 z*G@84^!@_}=MVfb`RR`{cIl;n|7TXnnt{vDrAL{D6|oXl&MFx*xb!aWG8i-ljYeOn z(KPda$!y>s&fNIO;}1OW%>DfGM;?(LJ=HJWoq3wqWPX_W0dL^pQ=fP6mdtlhtA=$g z{7D*-?nZ59R>w*ovYD%O#geAE-q6w-Yc`vVMT*-Oj~UIe<^(S)G9`Fxyv3)uwOt>) z=9&-EwPj*zAe4EttR%^``VEtPAwGKdi4%9+~8>Q2q^H%TJg;GYIK)}f4^ zp-e2^qY+r>B(1*{cseDM5owpn<(~S`baP*qHR5#?O;lep6 z6(oj5S~EtCDi-Rv$x)EVOOXz6PAS%vYO~cjnv-5%ve{8*YfJf3o8v8;Q@$+|D_3sV zuyW7Z9kbhGs~bC0sm{*9!Oo}k zwE>IS@6hWVezPS|t0&&018magnUlr9d%sh^$a}(CtJ7$e)a@f$xjbq2lW8 z+tl2=sn1(o=xH7F?XuRGnv6A$rcHgm*W~t))f#G-<+h;J8f=sKBTbuneJBu%M#=}L z54O3Lx>fEXA8NS68fuf}1i>c&AF`5Ml;UTX^l@n4Qs7ovEHTIhj~NudORFSe8eX{j zt+`m{`?0zE-?&2h_^H{WM_=Mw&@IqkBPct7J~Tk88qhB;*=VR@q`zE3E9ASwr8k&j zIjR)>lJp3#XdP{~dfd%Tj>Nh|=A~`la)fGiy4q0fQ;*nuH5C>3c|K%8{E-aBk%7A{{m;>UsWL0Vjj0NrVO)mY&Hok4!w#=u{?=N!)Oj83e=gwV_<+sV7iI665EykOd

Ln0t( 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 + pack://application:,,,/Resources/Fonts/#Atkinson Hyperlegible + @@ -38,11 +40,11 @@ #525252 #ffc400 - #e83a40 - #52b545 + #db2955 + #5fad56 #967400 - #BB86FC + #D9BBF9 #00BB86FC #3700B3 #270080 @@ -234,21 +236,21 @@ @@ -1620,7 +1622,7 @@ diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index c926c24a3..18fe20eb4 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -51,6 +51,12 @@ + + + + + + @@ -101,6 +107,7 @@ + @@ -110,6 +117,18 @@ + + Never + + + Never + + + Never + + + Never + From 1222280643d463051506fa6787fac3c80121b55d Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 26 Nov 2023 20:15:53 +0100 Subject: [PATCH 002/294] Rework main menu UI --- Wabbajack.App.Wpf/Consts.cs | 1 + .../Converters/WidthHeightRectConverter.cs | 25 +++ .../Fonts/AtkinsonHyperlegible-Bold.ttf | Bin 43756 -> 0 bytes .../Fonts/AtkinsonHyperlegible-BoldItalic.ttf | Bin 44664 -> 0 bytes .../Fonts/AtkinsonHyperlegible-Italic.ttf | Bin 43540 -> 0 bytes .../Fonts/AtkinsonHyperlegible-Regular.ttf | Bin 42596 -> 0 bytes ...rito-VariableFont_wght-BF651cdf1f55e6c.ttf | Bin 0 -> 157256 bytes Wabbajack.App.Wpf/Themes/Styles.xaml | 53 ++--- Wabbajack.App.Wpf/View Models/MainWindowVM.cs | 25 ++- .../View Models/ModeSelectionVM.cs | 43 +++- Wabbajack.App.Wpf/Views/BrowserWindow.xaml | 2 +- .../Views/Common/DetailImageView.xaml | 12 +- .../Views/Common/TopProgressView.xaml | 4 +- .../Views/Common/UnderMaintenanceOverlay.xaml | 8 +- .../Compilers/CompilationCompleteView.xaml | 2 +- .../Installers/InstallationCompleteView.xaml | 2 +- .../InstallationConfigurationView.xaml | 2 +- .../Views/Installers/InstallationView.xaml | 2 +- .../ConfirmationInterventionView.xaml | 2 +- Wabbajack.App.Wpf/Views/LinksView.xaml | 7 - Wabbajack.App.Wpf/Views/MainWindow.xaml | 141 ++++++++----- Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 9 + Wabbajack.App.Wpf/Views/ModListTileView.xaml | 4 +- .../Views/ModeSelectionView.xaml | 190 ++++++++++++++++-- .../Views/ModeSelectionView.xaml.cs | 9 + .../Views/Settings/AuthorFilesView.xaml | 2 +- .../Views/Settings/LoginSettingsView.xaml | 2 +- .../Views/Settings/MiscSettingsView.xaml | 2 +- .../Settings/PerformanceSettingsView.xaml | 2 +- .../Views/Settings/SettingsView.xaml | 2 +- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 21 +- 31 files changed, 423 insertions(+), 151 deletions(-) create mode 100644 Wabbajack.App.Wpf/Converters/WidthHeightRectConverter.cs delete mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Bold.ttf delete mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-BoldItalic.ttf delete mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Italic.ttf delete mode 100644 Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Regular.ttf create mode 100644 Wabbajack.App.Wpf/Resources/Fonts/Gabarito-VariableFont_wght-BF651cdf1f55e6c.ttf diff --git a/Wabbajack.App.Wpf/Consts.cs b/Wabbajack.App.Wpf/Consts.cs index 8f1ada392..7e47b8e62 100644 --- a/Wabbajack.App.Wpf/Consts.cs +++ b/Wabbajack.App.Wpf/Consts.cs @@ -9,6 +9,7 @@ public static class Consts public static RelativePath MO2IniName = "ModOrganizer.ini".ToRelativePath(); public static string AppName = "Wabbajack"; public static Uri WabbajackBuildServerUri => new("https://build.wabbajack.org"); + public static Uri WabbajackModlistWizardUri => new("https://wizard.wabbajack.org"); public static Version CurrentMinimumWabbajackVersion { get; set; } = Version.Parse("2.3.0.0"); public static bool UseNetworkWorkaroundMode { get; set; } = false; public static AbsolutePath CefCacheLocation { get; } = KnownFolders.WabbajackAppLocal.Combine("Cef"); diff --git a/Wabbajack.App.Wpf/Converters/WidthHeightRectConverter.cs b/Wabbajack.App.Wpf/Converters/WidthHeightRectConverter.cs new file mode 100644 index 000000000..4c8655966 --- /dev/null +++ b/Wabbajack.App.Wpf/Converters/WidthHeightRectConverter.cs @@ -0,0 +1,25 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace Wabbajack +{ + public class WidthHeightRectConverter : IMultiValueConverter + { + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + { + double rectWidth = 0; + double rectHeight = 0; + if (values[0] is not null && double.TryParse(values[0].ToString(), out var width)) + rectWidth = width; + else return null; + if (values[1] is not null && double.TryParse(values[1].ToString(), out var height)) + rectHeight = height; + else return null; + return new Rect(0, 0, rectWidth, rectHeight); + } + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + => throw new NotImplementedException(); + } +} diff --git a/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Bold.ttf b/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Bold.ttf deleted file mode 100644 index 14b719618a199672eab4aacda3b9bee5ec5529d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43756 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 C)jy2|0F%#U0q#W-*0{I`c{P_ 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 VLP|*Mg8Q|Sy941QuKhEm{|^Ahhob-h diff --git a/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Italic.ttf b/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Italic.ttf deleted file mode 100644 index 89e5ce4bc785e9a44f929509591f69f3f4ff3caa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43540 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 diff --git a/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Regular.ttf b/Wabbajack.App.Wpf/Resources/Fonts/AtkinsonHyperlegible-Regular.ttf deleted file mode 100644 index c4fa6fbe19063e315ba204adf1db3cf10ee0d0b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42596 zcmb@v31HjBl|Mf7m2LTyE$g%-%U|iM+md|9vV6yud?c|G+liCdNeFgq=YU+~;4ZY3 zc3BFv4JBMD+qC8Z@!Xj=V00X{|;Y$ z=R4mwGw;25^WK{`GhY~Ij8)^OfXV&qR}J9_51-qLd+|{Jz#yyS^^9Hr3Z9KaW25VT zYB_W_p5JE7`kSHk8LX;OP2>=B5`9Zewi6rGTHF-8*yO+rRnU^LT!a zG0oB0ix11@Tgt9u>@pAD@7Zx+=U&~ef2d~cf<27s%685iI>5Bdj{1Lw_vJhHT(;x$ z_W1&!6lQGe4ZG%N=FD5ahx(_F<9+KcWN3#9H=+IsJbQNSJ$&gi`tEwO;vJ|AJM^r-{;4;?;lF#RH9 z*G@84^!@_}=MVfb`RR`{cIl;n|7TXnnt{vDrAL{D6|oXl&MFx*xb!aWG8i-ljYeOn z(KPda$!y>s&fNIO;}1OW%>DfGM;?(LJ=HJWoq3wqWPX_W0dL^pQ=fP6mdtlhtA=$g z{7D*-?nZ59R>w*ovYD%O#geAE-q6w-Yc`vVMT*-Oj~UIe<^(S)G9`Fxyv3)uwOt>) z=9&-EwPj*zAe4EttR%^``VEtPAwGKdi4%9+~8>Q2q^H%TJg;GYIK)}f4^ zp-e2^qY+r>B(1*{cseDM5owpn<(~S`baP*qHR5#?O;lep6 z6(oj5S~EtCDi-Rv$x)EVOOXz6PAS%vYO~cjnv-5%ve{8*YfJf3o8v8;Q@$+|D_3sV zuyW7Z9kbhGs~bC0sm{*9!Oo}k zwE>IS@6hWVezPS|t0&&018magnUlr9d%sh^$a}(CtJ7$e)a@f$xjbq2lW8 z+tl2=sn1(o=xH7F?XuRGnv6A$rcHgm*W~t))f#G-<+h;J8f=sKBTbuneJBu%M#=}L z54O3Lx>fEXA8NS68fuf}1i>c&AF`5Ml;UTX^l@n4Qs7ovEHTIhj~NudORFSe8eX{j zt+`m{`?0zE-?&2h_^H{WM_=Mw&@IqkBPct7J~Tk88qhB;*=VR@q`zE3E9ASwr8k&j zIjR)>lJp3#XdP{~dfd%Tj>Nh|=A~`la)fGiy4q0fQ;*nuH5C>3c|K%8{E-aBk%7A{{m;>UsWL0Vjj0NrVO)mY&Hok4!w#=u{?=N!)Oj83e=gwV_<+sV7iI665EykOd

Ln0t( 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 {+ZUTW#!=G$ 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 - pack://application:,,,/Resources/Fonts/#Atkinson Hyperlegible + pack://application:,,,/Resources/Fonts/#Gabarito @@ -21,13 +21,14 @@ + - #121212 - #222222 - #272727 + #222531 + #222531 + #2A2B41 #424242 - #323232 + #222531 #424242 #323232 #666666 @@ -46,7 +47,7 @@ #D9BBF9 #00BB86FC - #3700B3 + #8866ad #270080 #1b0059 #03DAC6 @@ -236,21 +237,21 @@ @@ -1176,13 +1177,13 @@ - - + + - - + + @@ -1241,13 +1242,13 @@ - - + + - - + + @@ -1288,8 +1289,8 @@ - - + + @@ -1319,7 +1320,7 @@ - + @@ -1341,12 +1342,12 @@ - - + + - + @@ -1622,7 +1623,7 @@ diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index 18fe20eb4..aab59dc90 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -53,10 +53,11 @@ - - - - + + + + + @@ -85,6 +86,7 @@ NU1701 + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -117,16 +119,7 @@ - - Never - - - Never - - - Never - - + Never From f7482b3c56df6fdf5e76b0880a681e4b4d4aac14 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 26 Nov 2023 20:21:26 +0100 Subject: [PATCH 003/294] MainWindow icon fixes --- Wabbajack.App.Wpf/Views/MainWindow.xaml | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 4e31ebe04..068196a7b 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -104,34 +104,22 @@ From 61b2ce648a015d910a064b71c5254aff362ae11e Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 28 Nov 2023 23:19:03 +0100 Subject: [PATCH 004/294] Adjust LinksView & hovering colors --- Wabbajack.App.Wpf/Consts.cs | 3 + Wabbajack.App.Wpf/Themes/Styles.xaml | 35 ++---- Wabbajack.App.Wpf/Views/LinksView.xaml | 104 +++++++++++++----- Wabbajack.App.Wpf/Views/LinksView.xaml.cs | 12 +- Wabbajack.App.Wpf/Views/MainWindow.xaml | 16 +-- .../Views/ModeSelectionView.xaml | 10 +- .../Views/ModeSelectionView.xaml.cs | 2 + 7 files changed, 105 insertions(+), 77 deletions(-) diff --git a/Wabbajack.App.Wpf/Consts.cs b/Wabbajack.App.Wpf/Consts.cs index 7e47b8e62..f664e793f 100644 --- a/Wabbajack.App.Wpf/Consts.cs +++ b/Wabbajack.App.Wpf/Consts.cs @@ -10,6 +10,9 @@ public static class Consts public static string AppName = "Wabbajack"; public static Uri WabbajackBuildServerUri => new("https://build.wabbajack.org"); public static Uri WabbajackModlistWizardUri => new("https://wizard.wabbajack.org"); + public static Uri WabbajackGithubUri => new("https://github.com/wabbajack-tools/wabbajack"); + public static Uri WabbajackDiscordUri => new("https://discord.gg/wabbajack"); + public static Uri WabbajackPatreonUri => new("https://www.patreon.com/user?u=11907933"); public static Version CurrentMinimumWabbajackVersion { get; set; } = Version.Parse("2.3.0.0"); public static bool UseNetworkWorkaroundMode { get; set; } = false; public static AbsolutePath CefCacheLocation { get; } = KnownFolders.WabbajackAppLocal.Combine("Cef"); diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index e947c272b..2ab55a1b5 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -25,8 +25,8 @@ #222531 - #222531 - #2A2B41 + #3c3652 + #4e4571 #424242 #222531 #424242 @@ -50,15 +50,15 @@ #8866ad #270080 #1b0059 - #03DAC6 + #3C3652 #0e8f83 #095952 #042421 #cef0ed #8cede5 #00ffe7 - #C7FC86 - #8eb55e + #4e4571 + #3C3652 #4b6130 #abf74d #868CFC @@ -1165,7 +1165,7 @@ Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" - CornerRadius="3"> + CornerRadius="16"> - - - - - - - - + CornerRadius="20" + Padding="13"> - + diff --git a/Wabbajack.App.Wpf/Views/LinksView.xaml b/Wabbajack.App.Wpf/Views/LinksView.xaml index ca346083c..fe945a401 100644 --- a/Wabbajack.App.Wpf/Views/LinksView.xaml +++ b/Wabbajack.App.Wpf/Views/LinksView.xaml @@ -6,44 +6,90 @@ xmlns:icon="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:local="clr-namespace:Wabbajack" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:ic="clr-namespace:FluentIcons.WPF;assembly=FluentIcons.WPF" mc:Ignorable="d"> - + - - - + diff --git a/Wabbajack.App.Wpf/Views/LinksView.xaml.cs b/Wabbajack.App.Wpf/Views/LinksView.xaml.cs index cd86e41d5..2c0435429 100644 --- a/Wabbajack.App.Wpf/Views/LinksView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/LinksView.xaml.cs @@ -17,18 +17,12 @@ public LinksView() } private void GitHub_Click(object sender, RoutedEventArgs e) - { - UIUtils.OpenWebsite(new Uri("https://github.com/wabbajack-tools/wabbajack")); - } + => UIUtils.OpenWebsite(Consts.WabbajackGithubUri); private void Discord_Click(object sender, RoutedEventArgs e) - { - UIUtils.OpenWebsite(new Uri("https://discord.gg/wabbajack")); - } + => UIUtils.OpenWebsite(Consts.WabbajackDiscordUri); private void Patreon_Click(object sender, RoutedEventArgs e) - { - UIUtils.OpenWebsite(new Uri("https://www.patreon.com/user?u=11907933")); - } + => UIUtils.OpenWebsite(Consts.WabbajackPatreonUri); } } diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 068196a7b..656734f0b 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -46,16 +46,16 @@ - - - - @@ -102,22 +102,22 @@ diff --git a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml index 5b5bba549..1e50fc77a 100644 --- a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml +++ b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml @@ -15,8 +15,8 @@ + - @@ -184,6 +184,7 @@ + + + diff --git a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs index 05a838fab..d669bd1fe 100644 --- a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs @@ -29,6 +29,7 @@ public ModeSelectionView() InitializeComponent(); this.WhenActivated(dispose => { + /* this.WhenAny(x => x.ViewModel.BrowseCommand) .BindToStrict(this, x => x.BrowseButton.Command) .DisposeWith(dispose); @@ -38,6 +39,7 @@ public ModeSelectionView() this.WhenAny(x => x.ViewModel.CompileCommand) .BindToStrict(this, x => x.CompileButton.Command) .DisposeWith(dispose); + */ this.WhenAnyValue(x => x.ViewModel.Modlists) .Select(x => x?.Length.ToString() ?? "0") .BindToStrict(this, x => x.ModlistAmountTextBlock.Text) From 8af7cda817edbe85f9f88326bc8b162528fb9a94 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 28 Nov 2023 23:27:14 +0100 Subject: [PATCH 005/294] Fix wiki link on LinksView --- Wabbajack.App.Wpf/Consts.cs | 1 + Wabbajack.App.Wpf/Views/LinksView.xaml | 2 +- Wabbajack.App.Wpf/Views/LinksView.xaml.cs | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/Consts.cs b/Wabbajack.App.Wpf/Consts.cs index f664e793f..17de7ce9b 100644 --- a/Wabbajack.App.Wpf/Consts.cs +++ b/Wabbajack.App.Wpf/Consts.cs @@ -13,6 +13,7 @@ public static class Consts public static Uri WabbajackGithubUri => new("https://github.com/wabbajack-tools/wabbajack"); public static Uri WabbajackDiscordUri => new("https://discord.gg/wabbajack"); public static Uri WabbajackPatreonUri => new("https://www.patreon.com/user?u=11907933"); + public static Uri WabbajackWikiUri => new("https://wiki.wabbajack.org"); public static Version CurrentMinimumWabbajackVersion { get; set; } = Version.Parse("2.3.0.0"); public static bool UseNetworkWorkaroundMode { get; set; } = false; public static AbsolutePath CefCacheLocation { get; } = KnownFolders.WabbajackAppLocal.Combine("Cef"); diff --git a/Wabbajack.App.Wpf/Views/LinksView.xaml b/Wabbajack.App.Wpf/Views/LinksView.xaml index fe945a401..da2fbed7b 100644 --- a/Wabbajack.App.Wpf/Views/LinksView.xaml +++ b/Wabbajack.App.Wpf/Views/LinksView.xaml @@ -72,7 +72,7 @@ - - - + + + + + + + + + + + + + + + If your install completed successfully and you're done with the documentation as well, + you're now ready to launch the modlist and play! + + + + + + + + + + + - --> - - + From c7364d6358d59d9ab01d18c2616bc290f92abd43 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 16 Dec 2023 18:07:32 +0100 Subject: [PATCH 009/294] First attempts at creating navigation bar, buttons not binding properly yet --- Wabbajack.App.Wpf/App.xaml.cs | 1 + Wabbajack.App.Wpf/Themes/Styles.xaml | 6 +-- Wabbajack.App.Wpf/View Models/MainWindowVM.cs | 4 +- Wabbajack.App.Wpf/View Models/NavigationVM.cs | 42 ++++++++++++++++ Wabbajack.App.Wpf/Views/MainWindow.xaml | 3 +- .../Views/ModeSelectionView.xaml.cs | 11 ---- Wabbajack.App.Wpf/Views/NavigationView.xaml | 50 +++++++++++++++++++ .../Views/NavigationView.xaml.cs | 36 +++++++++++++ 8 files changed, 137 insertions(+), 16 deletions(-) create mode 100644 Wabbajack.App.Wpf/View Models/NavigationVM.cs create mode 100644 Wabbajack.App.Wpf/Views/NavigationView.xaml create mode 100644 Wabbajack.App.Wpf/Views/NavigationView.xaml.cs diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index dc9d2cd09..a65be7b00 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -160,6 +160,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddSingleton(); services.AddSingleton(); diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 37cd97e3f..4e50f5461 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -1202,9 +1202,9 @@ - - - + + + diff --git a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs index 2ad7ff9d2..ddba72409 100644 --- a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs @@ -47,6 +47,7 @@ public class MainWindowVM : ViewModel public readonly ModListGalleryVM Gallery; public readonly ModeSelectionVM ModeSelectionVM; public readonly WebBrowserVM WebBrowserVM; + public readonly NavigationVM NavigationVM; public readonly Lazy ModListContentsVM; public readonly UserInterventionHandlers UserInterventionHandlers; private readonly Client _wjClient; @@ -76,7 +77,7 @@ public class MainWindowVM : ViewModel public MainWindowVM(ILogger logger, Client wjClient, IServiceProvider serviceProvider, ModeSelectionVM modeSelectionVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, - InstallerVM installer, CompilerVM compilerVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM) + InstallerVM installer, CompilerVM compilerVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM) { _logger = logger; _wjClient = wjClient; @@ -89,6 +90,7 @@ public MainWindowVM(ILogger logger, Client wjClient, Gallery = modListGalleryVM; ModeSelectionVM = modeSelectionVM; WebBrowserVM = webBrowserVM; + NavigationVM = navigationVM; ModListContentsVM = new Lazy(() => new ModListContentsVM(serviceProvider.GetRequiredService>(), this)); UserInterventionHandlers = new UserInterventionHandlers(serviceProvider.GetRequiredService>(), this); diff --git a/Wabbajack.App.Wpf/View Models/NavigationVM.cs b/Wabbajack.App.Wpf/View Models/NavigationVM.cs new file mode 100644 index 000000000..d5bad808b --- /dev/null +++ b/Wabbajack.App.Wpf/View Models/NavigationVM.cs @@ -0,0 +1,42 @@ +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using System; +using System.IO; +using System.Linq; +using System.Reactive; +using System.Reactive.Linq; +using System.Windows.Input; +using Wabbajack.Common; +using Wabbajack; +using Wabbajack.Messages; +using Wabbajack.Paths.IO; +using Wabbajack.Networking.WabbajackClientApi; +using System.Threading.Tasks; +using Wabbajack.DTOs; +using Microsoft.Extensions.Logging; +using System.Reactive.Disposables; +using System.Diagnostics; + +namespace Wabbajack +{ + public class NavigationVM : ViewModel + { + private readonly ILogger _logger; + + public NavigationVM(ILogger logger) + { + _logger = logger; + InstallCommand = ReactiveCommand.Create(() => + { + LoadLastLoadedModlist.Send(); + NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Installer); + }); + CompileCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Compiler)); + BrowseCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModListGallery)); + } + public ICommand BrowseCommand { get; set; } + public ICommand InstallCommand { get; set; } + public ICommand CompileCommand { get; set; } + public ReactiveCommand UpdateCommand { get; } + } +} diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index f22b532c1..c1a7bea4d 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -63,7 +63,8 @@ - + + diff --git a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs index d669bd1fe..78c2cd844 100644 --- a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs @@ -29,17 +29,6 @@ public ModeSelectionView() InitializeComponent(); this.WhenActivated(dispose => { - /* - this.WhenAny(x => x.ViewModel.BrowseCommand) - .BindToStrict(this, x => x.BrowseButton.Command) - .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.InstallCommand) - .BindToStrict(this, x => x.InstallButton.Command) - .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.CompileCommand) - .BindToStrict(this, x => x.CompileButton.Command) - .DisposeWith(dispose); - */ this.WhenAnyValue(x => x.ViewModel.Modlists) .Select(x => x?.Length.ToString() ?? "0") .BindToStrict(this, x => x.ModlistAmountTextBlock.Text) diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml b/Wabbajack.App.Wpf/Views/NavigationView.xaml new file mode 100644 index 000000000..8b7cb270c --- /dev/null +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs new file mode 100644 index 000000000..050924af1 --- /dev/null +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs @@ -0,0 +1,36 @@ +using ReactiveUI; +using System; +using System.Diagnostics; +using System.Reactive.Disposables; +using System.Windows; +using System.Windows.Controls; +using Wabbajack.Common; + +namespace Wabbajack +{ + ///

+ /// Interaction logic for NavigationView.xaml + /// + public partial class NavigationView : ReactiveUserControl + { + public NavigationView() + { + InitializeComponent(); + this.WhenActivated(dispose => + { + this.WhenAny(x => x.ViewModel.BrowseCommand) + .BindTo(this, x => x.BrowseButton.Command) + .DisposeWith(dispose); + + /* + this.WhenAny(x => x.ViewModel.InstallCommand) + .BindToStrict(this, x => x.InstallButton.Command) + .DisposeWith(dispose); + this.WhenAny(x => x.ViewModel.CompileCommand) + .BindToStrict(this, x => x.CompileButton.Command) + .DisposeWith(dispose); + */ + }); + } + } +} From 62edef87686abcd3f4eac38b5203d1a8d9f10822 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 16 Dec 2023 23:45:00 +0100 Subject: [PATCH 010/294] Experimenting to try and get the commands to bind correctly --- Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs | 10 ---------- Wabbajack.App.Wpf/View Models/NavigationVM.cs | 9 ++++----- Wabbajack.App.Wpf/Views/NavigationView.xaml.cs | 3 ++- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs b/Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs index ac9b16fd0..b17eb9054 100644 --- a/Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs +++ b/Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs @@ -27,13 +27,6 @@ public class ModeSelectionVM : ViewModel public ModeSelectionVM(Client wjClient) { _wjClient = wjClient; - InstallCommand = ReactiveCommand.Create(() => - { - LoadLastLoadedModlist.Send(); - NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Installer); - }); - CompileCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Compiler)); - BrowseCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModListGallery)); VisitModlistWizardCommand = ReactiveCommand.Create(() => { ProcessStartInfo processStartInfo = new(Consts.WabbajackModlistWizardUri.ToString()) @@ -54,9 +47,6 @@ public ModeSelectionVM(Client wjClient) } }); } - public ICommand BrowseCommand { get; } - public ICommand InstallCommand { get; } - public ICommand CompileCommand { get; } public ICommand VisitModlistWizardCommand { get; } public ReactiveCommand UpdateCommand { get; } diff --git a/Wabbajack.App.Wpf/View Models/NavigationVM.cs b/Wabbajack.App.Wpf/View Models/NavigationVM.cs index d5bad808b..ec8766347 100644 --- a/Wabbajack.App.Wpf/View Models/NavigationVM.cs +++ b/Wabbajack.App.Wpf/View Models/NavigationVM.cs @@ -22,7 +22,10 @@ namespace Wabbajack public class NavigationVM : ViewModel { private readonly ILogger _logger; - + public ICommand BrowseCommand { get; } + public ICommand InstallCommand { get; } + public ICommand CompileCommand { get; } + public ReactiveCommand UpdateCommand { get; } public NavigationVM(ILogger logger) { _logger = logger; @@ -34,9 +37,5 @@ public NavigationVM(ILogger logger) CompileCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Compiler)); BrowseCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModListGallery)); } - public ICommand BrowseCommand { get; set; } - public ICommand InstallCommand { get; set; } - public ICommand CompileCommand { get; set; } - public ReactiveCommand UpdateCommand { get; } } } diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs index 050924af1..1c5e4a7e8 100644 --- a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs @@ -5,6 +5,7 @@ using System.Windows; using System.Windows.Controls; using Wabbajack.Common; +using Wabbajack.Messages; namespace Wabbajack { @@ -19,7 +20,7 @@ public NavigationView() this.WhenActivated(dispose => { this.WhenAny(x => x.ViewModel.BrowseCommand) - .BindTo(this, x => x.BrowseButton.Command) + .BindToStrict(this, x => x.BrowseButton.Command) .DisposeWith(dispose); /* From e42336131ee9456fa7246e3cca642de41b6bb504 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 17 Dec 2023 13:21:08 +0100 Subject: [PATCH 011/294] Fix up NavigationVM not binding to NavigationView, fill icons on hover --- Wabbajack.App.Wpf/Themes/Styles.xaml | 27 +++++++++++++++++++ Wabbajack.App.Wpf/View Models/MainWindowVM.cs | 4 ++- Wabbajack.App.Wpf/View Models/NavigationVM.cs | 12 +++++---- Wabbajack.App.Wpf/Views/MainWindow.xaml | 2 +- .../Views/ModeSelectionView.xaml.cs | 1 + .../Views/NavigationView.xaml.cs | 6 ++--- 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 4e50f5461..36207decc 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -1194,6 +1194,15 @@ + + + + @@ -1329,6 +1347,15 @@ + + + diff --git a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs index ddba72409..6499263c9 100644 --- a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs @@ -39,6 +39,9 @@ public class MainWindowVM : ViewModel [Reactive] public ViewModel ActivePane { get; private set; } + [Reactive] + public NavigationVM NavigationVM { get; private set; } + public ObservableCollectionExtended Log { get; } = new ObservableCollectionExtended(); public readonly CompilerVM Compiler; @@ -47,7 +50,6 @@ public class MainWindowVM : ViewModel public readonly ModListGalleryVM Gallery; public readonly ModeSelectionVM ModeSelectionVM; public readonly WebBrowserVM WebBrowserVM; - public readonly NavigationVM NavigationVM; public readonly Lazy ModListContentsVM; public readonly UserInterventionHandlers UserInterventionHandlers; private readonly Client _wjClient; diff --git a/Wabbajack.App.Wpf/View Models/NavigationVM.cs b/Wabbajack.App.Wpf/View Models/NavigationVM.cs index ec8766347..0a2628d65 100644 --- a/Wabbajack.App.Wpf/View Models/NavigationVM.cs +++ b/Wabbajack.App.Wpf/View Models/NavigationVM.cs @@ -22,20 +22,22 @@ namespace Wabbajack public class NavigationVM : ViewModel { private readonly ILogger _logger; - public ICommand BrowseCommand { get; } - public ICommand InstallCommand { get; } - public ICommand CompileCommand { get; } - public ReactiveCommand UpdateCommand { get; } public NavigationVM(ILogger logger) { _logger = logger; + HomeCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModeSelectionView)); + BrowseCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModListGallery)); InstallCommand = ReactiveCommand.Create(() => { LoadLastLoadedModlist.Send(); NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Installer); }); CompileCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Compiler)); - BrowseCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModListGallery)); } + public ICommand HomeCommand { get; } + public ICommand BrowseCommand { get; } + public ICommand InstallCommand { get; } + public ICommand CompileCommand { get; } + public ReactiveCommand UpdateCommand { get; } } } diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index c1a7bea4d..e05a06a71 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -63,7 +63,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs index 78c2cd844..9444b3445 100644 --- a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs @@ -27,6 +27,7 @@ public partial class ModeSelectionView : ReactiveUserControl public ModeSelectionView() { InitializeComponent(); + var vm = ViewModel; this.WhenActivated(dispose => { this.WhenAnyValue(x => x.ViewModel.Modlists) diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs index 1c5e4a7e8..e07f3d81b 100644 --- a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs @@ -19,10 +19,10 @@ public NavigationView() InitializeComponent(); this.WhenActivated(dispose => { - this.WhenAny(x => x.ViewModel.BrowseCommand) - .BindToStrict(this, x => x.BrowseButton.Command) + this.BindCommand(ViewModel, vm => vm.BrowseCommand, v => v.BrowseButton) + .DisposeWith(dispose); + this.BindCommand(ViewModel, vm => vm.HomeCommand, v => v.HomeButton) .DisposeWith(dispose); - /* this.WhenAny(x => x.ViewModel.InstallCommand) .BindToStrict(this, x => x.InstallButton.Command) From 240e643567816f00716f62207d548f75cd2832cb Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 17 Dec 2023 15:04:38 +0100 Subject: [PATCH 012/294] Finish NavigationView --- Wabbajack.App.Wpf/View Models/MainWindowVM.cs | 10 ++----- Wabbajack.App.Wpf/View Models/NavigationVM.cs | 15 +++++++++- Wabbajack.App.Wpf/Views/MainWindow.xaml | 10 ++----- Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 7 ++--- Wabbajack.App.Wpf/Views/NavigationView.xaml | 30 +++++++++++++++++-- .../Views/NavigationView.xaml.cs | 10 +++++++ 6 files changed, 60 insertions(+), 22 deletions(-) diff --git a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs index 6499263c9..661a52bdb 100644 --- a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs @@ -61,7 +61,6 @@ public class MainWindowVM : ViewModel public ICommand CopyVersionCommand { get; } public ICommand ShowLoginManagerVM { get; } - public ICommand OpenSettingsCommand { get; } public ICommand MinimizeCommand { get; } public ICommand MaximizeCommand { get; } public ICommand CloseCommand { get; } @@ -72,7 +71,7 @@ public class MainWindowVM : ViewModel public string ResourceStatus { get; set; } [Reactive] - public string AppName { get; set; } + public string WindowTitle { get; set; } [Reactive] public bool UpdateAvailable { get; private set; } @@ -141,8 +140,7 @@ public MainWindowVM(ILogger logger, Client wjClient, var fvi = FileVersionInfo.GetVersionInfo(string.IsNullOrWhiteSpace(assemblyLocation) ? processLocation : assemblyLocation); Consts.CurrentMinimumWabbajackVersion = Version.Parse(fvi.FileVersion); - VersionDisplay = $"v{fvi.FileVersion}"; - AppName = $"{Consts.AppName} {VersionDisplay}"; + WindowTitle = $"{Consts.AppName}"; _logger.LogInformation("Wabbajack Version: {FileVersion}", fvi.FileVersion); Task.Run(() => _wjClient.SendMetric("started_wabbajack", fvi.FileVersion)).FireAndForget(); @@ -171,10 +169,6 @@ public MainWindowVM(ILogger logger, Client wjClient, { Clipboard.SetText($"Wabbajack {VersionDisplay}\n{ThisAssembly.Git.Sha}"); }); - OpenSettingsCommand = ReactiveCommand.Create( - canExecute: this.WhenAny(x => x.ActivePane) - .Select(active => !object.ReferenceEquals(active, SettingsPane)), - execute: () => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Settings)); MinimizeCommand = ReactiveCommand.Create(Minimize); MaximizeCommand = ReactiveCommand.Create(Maximize); CloseCommand = ReactiveCommand.Create(Close); diff --git a/Wabbajack.App.Wpf/View Models/NavigationVM.cs b/Wabbajack.App.Wpf/View Models/NavigationVM.cs index 0a2628d65..0736675ed 100644 --- a/Wabbajack.App.Wpf/View Models/NavigationVM.cs +++ b/Wabbajack.App.Wpf/View Models/NavigationVM.cs @@ -16,6 +16,7 @@ using Microsoft.Extensions.Logging; using System.Reactive.Disposables; using System.Diagnostics; +using System.Reflection; namespace Wabbajack { @@ -33,11 +34,23 @@ public NavigationVM(ILogger logger) NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Installer); }); CompileCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Compiler)); + SettingsCommand = ReactiveCommand.Create( + /* + canExecute: this.WhenAny(x => x.ActivePane) + .Select(active => !object.ReferenceEquals(active, SettingsPane)), + */ + execute: () => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Settings)); + var processLocation = Process.GetCurrentProcess().MainModule?.FileName ?? throw new Exception("Process location is unavailable!"); + var assembly = Assembly.GetExecutingAssembly(); + var assemblyLocation = assembly.Location; + var fvi = FileVersionInfo.GetVersionInfo(string.IsNullOrWhiteSpace(assemblyLocation) ? processLocation : assemblyLocation); + Version = $"{fvi.FileVersion}"; } public ICommand HomeCommand { get; } public ICommand BrowseCommand { get; } public ICommand InstallCommand { get; } public ICommand CompileCommand { get; } - public ReactiveCommand UpdateCommand { get; } + public ICommand SettingsCommand { get; } + public string Version { get; } } } diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index e05a06a71..2e07706b3 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -41,20 +41,16 @@ - - - - - diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index f4e66938b..943511260 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -116,9 +116,6 @@ public MainWindow(ILogger logger, SystemParametersConstructor system this.Topmost = false; }; - ((MainWindowVM) DataContext).WhenAnyValue(vm => vm.OpenSettingsCommand) - .BindTo(this, view => view.SettingsButton.Command); - ((MainWindowVM) DataContext).WhenAnyValue(vm => vm.MinimizeCommand) .BindTo(this, view => view.MinimizeButton.Command); @@ -128,10 +125,12 @@ public MainWindow(ILogger logger, SystemParametersConstructor system ((MainWindowVM) DataContext).WhenAnyValue(vm => vm.CloseCommand) .BindTo(this, view => view.CloseButton.Command); + /* ((MainWindowVM)DataContext).WhenAnyValue(vm => vm.Installer.InstallState) .ObserveOn(RxApp.MainThreadScheduler) .Select(v => v == InstallState.Installing ? Visibility.Collapsed : Visibility.Visible) .BindTo(this, view => view.SettingsButton.Visibility); + */ } catch (Exception ex) @@ -142,7 +141,7 @@ public MainWindow(ILogger logger, SystemParametersConstructor system vm.WhenAnyValue(vm => vm.ResourceStatus) .BindToStrict(this, view => view.ResourceUsage.Text); - vm.WhenAnyValue(vm => vm.AppName) + vm.WhenAnyValue(vm => vm.WindowTitle) .BindToStrict(this, view => view.AppName.Text); } diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml b/Wabbajack.App.Wpf/Views/NavigationView.xaml index 8b7cb270c..dcc91a9e0 100644 --- a/Wabbajack.App.Wpf/Views/NavigationView.xaml +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml @@ -20,6 +20,7 @@ + + + + diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs index e07f3d81b..9b3626817 100644 --- a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics; using System.Reactive.Disposables; +using System.Reactive.Linq; using System.Windows; using System.Windows.Controls; using Wabbajack.Common; @@ -23,6 +24,15 @@ public NavigationView() .DisposeWith(dispose); this.BindCommand(ViewModel, vm => vm.HomeCommand, v => v.HomeButton) .DisposeWith(dispose); + this.BindCommand(ViewModel, vm => vm.CompileCommand, v => v.CompileButton) + .DisposeWith(dispose); + this.BindCommand(ViewModel, vm => vm.SettingsCommand, v => v.SettingsButton) + .DisposeWith(dispose); + + this.WhenAny(x => x.ViewModel.Version) + .Select(version => $"v{version}") + .BindToStrict(this, v => v.VersionTextBlock.Text) + .DisposeWith(dispose); /* this.WhenAny(x => x.ViewModel.InstallCommand) .BindToStrict(this, x => x.InstallButton.Command) From e3301407fdfaf988effafbcb6d5b0a4ffe1d9b71 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 23 Dec 2023 11:36:22 +0100 Subject: [PATCH 013/294] Rename View_Models to ViewModels, busy restructuring NavigationItems --- ; | 12 ++ Wabbajack.App.Wpf/App.xaml.cs | 2 +- .../Messages/NavigateToGlobal.cs | 2 +- .../Models/NavigationItems/ANavigationItem.cs | 18 +++ .../Models/NavigationItems/INavigationItem.cs | 11 ++ .../Models/NavigationItems/NavigationItems.cs | 24 +++ Wabbajack.App.Wpf/Themes/Styles.xaml | 137 +++++++++++++++++- .../BackNavigatingVM.cs | 0 .../BrowserWindowViewModel.cs | 0 .../CPUDisplayVM.cs | 0 .../Compilers/CompilerVM.cs | 2 +- .../Compilers/MO2CompilerVM.cs | 0 .../Controls/RemovableItemView.xaml | 6 +- .../Controls/RemovableItemView.xaml.cs | 2 +- .../Controls/RemovableItemViewModel.cs | 2 +- .../Gallery/ModListGalleryVM.cs | 2 +- .../Gallery/ModListMetadataVM.cs | 0 .../{View Models => ViewModels}/GameVM.cs | 0 .../HomeVM.cs} | 8 +- .../Installers/ISubInstallerVM.cs | 0 .../Installers/InstallerVM.cs | 2 +- .../Installers/MO2InstallerVM.cs | 0 .../Interfaces/ICpuStatusVM.cs | 0 .../Interfaces/INeedsLoginCredentials.cs | 0 .../MainWindowVM.cs | 15 +- .../ModListContentsVM.cs | 2 +- .../{View Models => ViewModels}/ModListVM.cs | 0 .../{View Models => ViewModels}/ModVM.cs | 0 .../NavigationVM.cs | 18 ++- .../Settings/AuthorFilesVM.cs | 2 +- .../Settings/LoginManagerVM.cs | 0 .../Settings/SettingsVM.cs | 2 +- .../ConfirmUpdateOfExistingInstallVM.cs | 0 .../UserInterventionHandlers.cs | 0 .../WebBrowserVM.cs | 0 Wabbajack.App.Wpf/Views/BrowserWindow.xaml | 2 +- .../Views/Compilers/CompilerView.xaml | 2 +- .../Views/Compilers/CompilerView.xaml.cs | 2 +- .../{ModeSelectionView.xaml => HomeView.xaml} | 4 +- ...SelectionView.xaml.cs => HomeView.xaml.cs} | 4 +- Wabbajack.App.Wpf/Views/MainWindow.xaml | 20 ++- .../Views/MainWindowContent.xaml | 2 +- .../Views/ModListContentsView.xaml | 2 +- Wabbajack.App.Wpf/Views/NavigationView.xaml | 4 +- .../Views/Settings/AuthorFilesView.xaml | 2 +- .../Views/Settings/AuthorFilesView.xaml.cs | 2 +- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 4 +- 47 files changed, 270 insertions(+), 49 deletions(-) create mode 100644 ; create mode 100644 Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs create mode 100644 Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs create mode 100644 Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs rename Wabbajack.App.Wpf/{View Models => ViewModels}/BackNavigatingVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/BrowserWindowViewModel.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/CPUDisplayVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Compilers/CompilerVM.cs (99%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Compilers/MO2CompilerVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Controls/RemovableItemView.xaml (90%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Controls/RemovableItemView.xaml.cs (92%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Controls/RemovableItemViewModel.cs (87%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Gallery/ModListGalleryVM.cs (99%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Gallery/ModListMetadataVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/GameVM.cs (100%) rename Wabbajack.App.Wpf/{View Models/ModeSelectionVM.cs => ViewModels/HomeVM.cs} (83%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Installers/ISubInstallerVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Installers/InstallerVM.cs (99%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Installers/MO2InstallerVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Interfaces/ICpuStatusVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Interfaces/INeedsLoginCredentials.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/MainWindowVM.cs (96%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/ModListContentsVM.cs (98%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/ModListVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/ModVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/NavigationVM.cs (79%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Settings/AuthorFilesVM.cs (98%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Settings/LoginManagerVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/Settings/SettingsVM.cs (98%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/UserIntervention/ConfirmUpdateOfExistingInstallVM.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/UserInterventionHandlers.cs (100%) rename Wabbajack.App.Wpf/{View Models => ViewModels}/WebBrowserVM.cs (100%) rename Wabbajack.App.Wpf/Views/{ModeSelectionView.xaml => HomeView.xaml} (99%) rename Wabbajack.App.Wpf/Views/{ModeSelectionView.xaml.cs => HomeView.xaml.cs} (91%) diff --git a/; b/; new file mode 100644 index 000000000..e9cb9ddea --- /dev/null +++ b/; @@ -0,0 +1,12 @@ +using System.Windows.Input; +using Wabbajack.Messages; + +namespace Wabbajack.App.Wpf.Models.NavigationItems +{ + public interface INavigationItem + { + public ICommand GoToCommand { get; } + public NavigateToGlobal.ScreenType Screen { get; } + public bool MainMenuItem { get; } + } +} diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index a65be7b00..46ef304f1 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -168,7 +168,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs index ca0bafe6f..5bc71ab47 100644 --- a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs +++ b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs @@ -6,7 +6,7 @@ public class NavigateToGlobal { public enum ScreenType { - ModeSelectionView, + Home, ModListGallery, Installer, Settings, diff --git a/Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs b/Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs new file mode 100644 index 000000000..0fc291d8a --- /dev/null +++ b/Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs @@ -0,0 +1,18 @@ +using ReactiveUI; +using System.Windows.Input; +using Wabbajack.Messages; + +namespace Wabbajack.Models; + +public abstract class ANavigationItem : INavigationItem +{ + public ICommand GoToCommand { get; } + public virtual NavigateToGlobal.ScreenType Screen { get; } + + public virtual bool MainMenuItem { get; } + + public ANavigationItem() + { + GoToCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(Screen)); + } +} diff --git a/Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs b/Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs new file mode 100644 index 000000000..993ae8f30 --- /dev/null +++ b/Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs @@ -0,0 +1,11 @@ +using System.Windows.Input; +using Wabbajack.Messages; + +namespace Wabbajack.Models; + +public interface INavigationItem +{ + public ICommand GoToCommand { get; } + public NavigateToGlobal.ScreenType Screen { get; } + public bool MainMenuItem { get; } +} diff --git a/Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs b/Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs new file mode 100644 index 000000000..044608bdf --- /dev/null +++ b/Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs @@ -0,0 +1,24 @@ +using Wabbajack.Messages; + +namespace Wabbajack.Models; + +public class HomeNI : ANavigationItem +{ + public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.Home; + public override bool MainMenuItem => true; +} +public class ModlistGalleryNI : ANavigationItem +{ + public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.ModListGallery; + public override bool MainMenuItem => true; +} +public class CompileNI : ANavigationItem +{ + public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.Compiler; + public override bool MainMenuItem => true; +} +public class SettingsNI : ANavigationItem +{ + public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.Settings; + public override bool MainMenuItem => true; +} diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 36207decc..e22788ee9 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -235,7 +235,6 @@ M-0,6 L-0,8 8,8 8,-0 6,-0 6,6 z M5,-0 L9,5 1,5 z - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/View Models/BackNavigatingVM.cs b/Wabbajack.App.Wpf/ViewModels/BackNavigatingVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/BackNavigatingVM.cs rename to Wabbajack.App.Wpf/ViewModels/BackNavigatingVM.cs diff --git a/Wabbajack.App.Wpf/View Models/BrowserWindowViewModel.cs b/Wabbajack.App.Wpf/ViewModels/BrowserWindowViewModel.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/BrowserWindowViewModel.cs rename to Wabbajack.App.Wpf/ViewModels/BrowserWindowViewModel.cs diff --git a/Wabbajack.App.Wpf/View Models/CPUDisplayVM.cs b/Wabbajack.App.Wpf/ViewModels/CPUDisplayVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/CPUDisplayVM.cs rename to Wabbajack.App.Wpf/ViewModels/CPUDisplayVM.cs diff --git a/Wabbajack.App.Wpf/View Models/Compilers/CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs similarity index 99% rename from Wabbajack.App.Wpf/View Models/Compilers/CompilerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs index 7eb0ecb95..f1fe6bff0 100644 --- a/Wabbajack.App.Wpf/View Models/Compilers/CompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs @@ -124,7 +124,7 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage ReactiveCommand.CreateFromTask(async () => { await SaveSettingsFile(); - NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModeSelectionView); + NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Home); }); SubCompilerVM = new MO2CompilerVM(this); diff --git a/Wabbajack.App.Wpf/View Models/Compilers/MO2CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/MO2CompilerVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/Compilers/MO2CompilerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Compilers/MO2CompilerVM.cs diff --git a/Wabbajack.App.Wpf/View Models/Controls/RemovableItemView.xaml b/Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemView.xaml similarity index 90% rename from Wabbajack.App.Wpf/View Models/Controls/RemovableItemView.xaml rename to Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemView.xaml index 54c7ffd2f..77e4784f1 100644 --- a/Wabbajack.App.Wpf/View Models/Controls/RemovableItemView.xaml +++ b/Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemView.xaml @@ -1,13 +1,13 @@ - diff --git a/Wabbajack.App.Wpf/View Models/Controls/RemovableItemView.xaml.cs b/Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemView.xaml.cs similarity index 92% rename from Wabbajack.App.Wpf/View Models/Controls/RemovableItemView.xaml.cs rename to Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemView.xaml.cs index 9dcb281c5..721875bea 100644 --- a/Wabbajack.App.Wpf/View Models/Controls/RemovableItemView.xaml.cs +++ b/Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemView.xaml.cs @@ -2,7 +2,7 @@ using System.Windows.Controls; using ReactiveUI; -namespace Wabbajack.View_Models.Controls; +namespace Wabbajack.ViewModels.Controls; public partial class RemovableItemView : ReactiveUserControl { diff --git a/Wabbajack.App.Wpf/View Models/Controls/RemovableItemViewModel.cs b/Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemViewModel.cs similarity index 87% rename from Wabbajack.App.Wpf/View Models/Controls/RemovableItemViewModel.cs rename to Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemViewModel.cs index b7ba65813..c34530aab 100644 --- a/Wabbajack.App.Wpf/View Models/Controls/RemovableItemViewModel.cs +++ b/Wabbajack.App.Wpf/ViewModels/Controls/RemovableItemViewModel.cs @@ -1,7 +1,7 @@ using System; using ReactiveUI.Fody.Helpers; -namespace Wabbajack.View_Models.Controls; +namespace Wabbajack.ViewModels.Controls; public class RemovableItemViewModel : ViewModel { diff --git a/Wabbajack.App.Wpf/View Models/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs similarity index 99% rename from Wabbajack.App.Wpf/View Models/Gallery/ModListGalleryVM.cs rename to Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index c87dfde56..2f5e3ccdf 100644 --- a/Wabbajack.App.Wpf/View Models/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -106,7 +106,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL BackCommand = ReactiveCommand.Create( () => { - NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModeSelectionView); + NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Home); }); diff --git a/Wabbajack.App.Wpf/View Models/Gallery/ModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListMetadataVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/Gallery/ModListMetadataVM.cs rename to Wabbajack.App.Wpf/ViewModels/Gallery/ModListMetadataVM.cs diff --git a/Wabbajack.App.Wpf/View Models/GameVM.cs b/Wabbajack.App.Wpf/ViewModels/GameVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/GameVM.cs rename to Wabbajack.App.Wpf/ViewModels/GameVM.cs diff --git a/Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs b/Wabbajack.App.Wpf/ViewModels/HomeVM.cs similarity index 83% rename from Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs rename to Wabbajack.App.Wpf/ViewModels/HomeVM.cs index b17eb9054..312e0f7cf 100644 --- a/Wabbajack.App.Wpf/View Models/ModeSelectionVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/HomeVM.cs @@ -19,14 +19,15 @@ namespace Wabbajack { - public class ModeSelectionVM : ViewModel + public class HomeVM : ViewModel { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly Client _wjClient; - public ModeSelectionVM(Client wjClient) + public HomeVM(Client wjClient) { _wjClient = wjClient; + BrowseCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModListGallery)); VisitModlistWizardCommand = ReactiveCommand.Create(() => { ProcessStartInfo processStartInfo = new(Consts.WabbajackModlistWizardUri.ToString()) @@ -48,6 +49,7 @@ public ModeSelectionVM(Client wjClient) }); } public ICommand VisitModlistWizardCommand { get; } + public ICommand BrowseCommand { get; } public ReactiveCommand UpdateCommand { get; } [Reactive] diff --git a/Wabbajack.App.Wpf/View Models/Installers/ISubInstallerVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/ISubInstallerVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/Installers/ISubInstallerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Installers/ISubInstallerVM.cs diff --git a/Wabbajack.App.Wpf/View Models/Installers/InstallerVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallerVM.cs similarity index 99% rename from Wabbajack.App.Wpf/View Models/Installers/InstallerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Installers/InstallerVM.cs index e5c16540b..0ad2022e7 100644 --- a/Wabbajack.App.Wpf/View Models/Installers/InstallerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallerVM.cs @@ -172,7 +172,7 @@ public InstallerVM(ILogger logger, DTOSerializer dtos, SettingsMana Installer = new MO2InstallerVM(this); - BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModeSelectionView)); + BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Home)); BeginCommand = ReactiveCommand.Create(() => BeginInstall().FireAndForget()); diff --git a/Wabbajack.App.Wpf/View Models/Installers/MO2InstallerVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/MO2InstallerVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/Installers/MO2InstallerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Installers/MO2InstallerVM.cs diff --git a/Wabbajack.App.Wpf/View Models/Interfaces/ICpuStatusVM.cs b/Wabbajack.App.Wpf/ViewModels/Interfaces/ICpuStatusVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/Interfaces/ICpuStatusVM.cs rename to Wabbajack.App.Wpf/ViewModels/Interfaces/ICpuStatusVM.cs diff --git a/Wabbajack.App.Wpf/View Models/Interfaces/INeedsLoginCredentials.cs b/Wabbajack.App.Wpf/ViewModels/Interfaces/INeedsLoginCredentials.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/Interfaces/INeedsLoginCredentials.cs rename to Wabbajack.App.Wpf/ViewModels/Interfaces/INeedsLoginCredentials.cs diff --git a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs similarity index 96% rename from Wabbajack.App.Wpf/View Models/MainWindowVM.cs rename to Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index 661a52bdb..c0f3156b1 100644 --- a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -24,7 +24,7 @@ using Wabbajack.Paths; using Wabbajack.Paths.IO; using Wabbajack.UserIntervention; -using Wabbajack.View_Models; +using Wabbajack.ViewModels; namespace Wabbajack { @@ -48,7 +48,7 @@ public class MainWindowVM : ViewModel public readonly InstallerVM Installer; public readonly SettingsVM SettingsPane; public readonly ModListGalleryVM Gallery; - public readonly ModeSelectionVM ModeSelectionVM; + public readonly HomeVM HomeVM; public readonly WebBrowserVM WebBrowserVM; public readonly Lazy ModListContentsVM; public readonly UserInterventionHandlers UserInterventionHandlers; @@ -77,7 +77,7 @@ public class MainWindowVM : ViewModel public bool UpdateAvailable { get; private set; } public MainWindowVM(ILogger logger, Client wjClient, - IServiceProvider serviceProvider, ModeSelectionVM modeSelectionVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, + IServiceProvider serviceProvider, HomeVM homeVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, InstallerVM installer, CompilerVM compilerVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM) { _logger = logger; @@ -89,7 +89,7 @@ public MainWindowVM(ILogger logger, Client wjClient, Compiler = compilerVM; SettingsPane = settingsVM; Gallery = modListGalleryVM; - ModeSelectionVM = modeSelectionVM; + HomeVM = homeVM; WebBrowserVM = webBrowserVM; NavigationVM = navigationVM; ModListContentsVM = new Lazy(() => new ModListContentsVM(serviceProvider.GetRequiredService>(), this)); @@ -126,7 +126,7 @@ public MainWindowVM(ILogger logger, Client wjClient, else { // Start on mode selection - NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModeSelectionView); + NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Home); } try @@ -140,7 +140,7 @@ public MainWindowVM(ILogger logger, Client wjClient, var fvi = FileVersionInfo.GetVersionInfo(string.IsNullOrWhiteSpace(assemblyLocation) ? processLocation : assemblyLocation); Consts.CurrentMinimumWabbajackVersion = Version.Parse(fvi.FileVersion); - WindowTitle = $"{Consts.AppName}"; + WindowTitle = Consts.AppName; _logger.LogInformation("Wabbajack Version: {FileVersion}", fvi.FileVersion); Task.Run(() => _wjClient.SendMetric("started_wabbajack", fvi.FileVersion)).FireAndForget(); @@ -193,7 +193,6 @@ private void Close() private void HandleNavigateTo(ViewModel objViewModel) { - ActivePane = objViewModel; } @@ -231,7 +230,7 @@ private void HandleNavigateTo(NavigateToGlobal.ScreenType s) ActivePane = s switch { - NavigateToGlobal.ScreenType.ModeSelectionView => ModeSelectionVM, + NavigateToGlobal.ScreenType.Home => HomeVM, NavigateToGlobal.ScreenType.ModListGallery => Gallery, NavigateToGlobal.ScreenType.Installer => Installer, NavigateToGlobal.ScreenType.Compiler => Compiler, diff --git a/Wabbajack.App.Wpf/View Models/ModListContentsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListContentsVM.cs similarity index 98% rename from Wabbajack.App.Wpf/View Models/ModListContentsVM.cs rename to Wabbajack.App.Wpf/ViewModels/ModListContentsVM.cs index 558f67772..ffdbf9268 100644 --- a/Wabbajack.App.Wpf/View Models/ModListContentsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListContentsVM.cs @@ -11,7 +11,7 @@ using Wabbajack.DTOs; using Wabbajack.DTOs.ServerResponses; -namespace Wabbajack.View_Models +namespace Wabbajack.ViewModels { public class ModListContentsVM : BackNavigatingVM { diff --git a/Wabbajack.App.Wpf/View Models/ModListVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/ModListVM.cs rename to Wabbajack.App.Wpf/ViewModels/ModListVM.cs diff --git a/Wabbajack.App.Wpf/View Models/ModVM.cs b/Wabbajack.App.Wpf/ViewModels/ModVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/ModVM.cs rename to Wabbajack.App.Wpf/ViewModels/ModVM.cs diff --git a/Wabbajack.App.Wpf/View Models/NavigationVM.cs b/Wabbajack.App.Wpf/ViewModels/NavigationVM.cs similarity index 79% rename from Wabbajack.App.Wpf/View Models/NavigationVM.cs rename to Wabbajack.App.Wpf/ViewModels/NavigationVM.cs index 0736675ed..77caa1ee2 100644 --- a/Wabbajack.App.Wpf/View Models/NavigationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/NavigationVM.cs @@ -17,16 +17,22 @@ using System.Reactive.Disposables; using System.Diagnostics; using System.Reflection; +using System.Collections.Generic; +using Wabbajack.Models; namespace Wabbajack { public class NavigationVM : ViewModel { private readonly ILogger _logger; + [Reactive] + public NavigateToGlobal.ScreenType ActiveScreen { get; set; } + [Reactive] + public List NavigationItems { get; set; } public NavigationVM(ILogger logger) { _logger = logger; - HomeCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModeSelectionView)); + HomeCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Home)); BrowseCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModListGallery)); InstallCommand = ReactiveCommand.Create(() => { @@ -40,6 +46,16 @@ public NavigationVM(ILogger logger) .Select(active => !object.ReferenceEquals(active, SettingsPane)), */ execute: () => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.Settings)); + MessageBus.Current.Listen() + .Subscribe(x => ActiveScreen = x.Screen); + /* + this.WhenActivated(dispose => + { + this.WhenAny(x => x.ActiveScreen) + . + }) + */ + var processLocation = Process.GetCurrentProcess().MainModule?.FileName ?? throw new Exception("Process location is unavailable!"); var assembly = Assembly.GetExecutingAssembly(); var assemblyLocation = assembly.Location; diff --git a/Wabbajack.App.Wpf/View Models/Settings/AuthorFilesVM.cs b/Wabbajack.App.Wpf/ViewModels/Settings/AuthorFilesVM.cs similarity index 98% rename from Wabbajack.App.Wpf/View Models/Settings/AuthorFilesVM.cs rename to Wabbajack.App.Wpf/ViewModels/Settings/AuthorFilesVM.cs index 4b909dce8..ec1ae422f 100644 --- a/Wabbajack.App.Wpf/View Models/Settings/AuthorFilesVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Settings/AuthorFilesVM.cs @@ -11,7 +11,7 @@ using Wabbajack.Networking.WabbajackClientApi; using Wabbajack.Services.OSIntegrated.TokenProviders; -namespace Wabbajack.View_Models.Settings +namespace Wabbajack.ViewModels.Settings { public class AuthorFilesVM : BackNavigatingVM { diff --git a/Wabbajack.App.Wpf/View Models/Settings/LoginManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/Settings/LoginManagerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs diff --git a/Wabbajack.App.Wpf/View Models/Settings/SettingsVM.cs b/Wabbajack.App.Wpf/ViewModels/Settings/SettingsVM.cs similarity index 98% rename from Wabbajack.App.Wpf/View Models/Settings/SettingsVM.cs rename to Wabbajack.App.Wpf/ViewModels/Settings/SettingsVM.cs index a32855cec..8eb07f8a3 100644 --- a/Wabbajack.App.Wpf/View Models/Settings/SettingsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Settings/SettingsVM.cs @@ -17,7 +17,7 @@ using Wabbajack.Services.OSIntegrated; using Wabbajack.Services.OSIntegrated.TokenProviders; using Wabbajack.Util; -using Wabbajack.View_Models.Settings; +using Wabbajack.ViewModels.Settings; namespace Wabbajack { diff --git a/Wabbajack.App.Wpf/View Models/UserIntervention/ConfirmUpdateOfExistingInstallVM.cs b/Wabbajack.App.Wpf/ViewModels/UserIntervention/ConfirmUpdateOfExistingInstallVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/UserIntervention/ConfirmUpdateOfExistingInstallVM.cs rename to Wabbajack.App.Wpf/ViewModels/UserIntervention/ConfirmUpdateOfExistingInstallVM.cs diff --git a/Wabbajack.App.Wpf/View Models/UserInterventionHandlers.cs b/Wabbajack.App.Wpf/ViewModels/UserInterventionHandlers.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/UserInterventionHandlers.cs rename to Wabbajack.App.Wpf/ViewModels/UserInterventionHandlers.cs diff --git a/Wabbajack.App.Wpf/View Models/WebBrowserVM.cs b/Wabbajack.App.Wpf/ViewModels/WebBrowserVM.cs similarity index 100% rename from Wabbajack.App.Wpf/View Models/WebBrowserVM.cs rename to Wabbajack.App.Wpf/ViewModels/WebBrowserVM.cs diff --git a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml index e962b4fb1..d0c910e4d 100644 --- a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml +++ b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:Wabbajack" xmlns:mahapps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:viewModels="clr-namespace:Wabbajack.View_Models" + xmlns:viewModels="clr-namespace:Wabbajack.ViewModels" xmlns:wpf="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf" ShowTitleBar="False" Title="Browser Window" diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml index b88638c32..a519bb8a0 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml @@ -10,7 +10,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:rxui="http://reactiveui.net" xmlns:wabbacommon="clr-namespace:Wabbajack.Common;assembly=Wabbajack.Common" - xmlns:controls1="clr-namespace:Wabbajack.View_Models.Controls" + xmlns:controls1="clr-namespace:Wabbajack.ViewModels.Controls" d:DataContext="{d:DesignInstance local:CompilerVM}" d:DesignHeight="450" d:DesignWidth="800" diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs index b5abf0f2f..63b5b0e05 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs @@ -13,7 +13,7 @@ using Wabbajack.Common; using Wabbajack.Paths; using Wabbajack.Paths.IO; -using Wabbajack.View_Models.Controls; +using Wabbajack.ViewModels.Controls; namespace Wabbajack { diff --git a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml b/Wabbajack.App.Wpf/Views/HomeView.xaml similarity index 99% rename from Wabbajack.App.Wpf/Views/ModeSelectionView.xaml rename to Wabbajack.App.Wpf/Views/HomeView.xaml index 4a0fb06fe..879b633d8 100644 --- a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml +++ b/Wabbajack.App.Wpf/Views/HomeView.xaml @@ -1,5 +1,5 @@  diff --git a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs b/Wabbajack.App.Wpf/Views/HomeView.xaml.cs similarity index 91% rename from Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs rename to Wabbajack.App.Wpf/Views/HomeView.xaml.cs index 9444b3445..cd1bf29cc 100644 --- a/Wabbajack.App.Wpf/Views/ModeSelectionView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/HomeView.xaml.cs @@ -22,9 +22,9 @@ namespace Wabbajack /// /// Interaction logic for ModeSelectionView.xaml /// - public partial class ModeSelectionView : ReactiveUserControl + public partial class HomeView : ReactiveUserControl { - public ModeSelectionView() + public HomeView() { InitializeComponent(); var vm = ViewModel; diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 2e07706b3..b1f7bd43f 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -7,7 +7,7 @@ xmlns:local="clr-namespace:Wabbajack" xmlns:mahapps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:viewModels="clr-namespace:Wabbajack.View_Models" + xmlns:viewModels="clr-namespace:Wabbajack.ViewModels" xmlns:views="clr-namespace:Wabbajack.Views" xmlns:ic="clr-namespace:FluentIcons.WPF;assembly=FluentIcons.WPF" ShowTitleBar="False" @@ -36,21 +36,25 @@ + - - - - - @@ -69,8 +73,8 @@ - - + + diff --git a/Wabbajack.App.Wpf/Views/MainWindowContent.xaml b/Wabbajack.App.Wpf/Views/MainWindowContent.xaml index ddb206544..83c15ed2c 100644 --- a/Wabbajack.App.Wpf/Views/MainWindowContent.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindowContent.xaml @@ -5,7 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Wabbajack" xmlns:icon="http://metro.mahapps.com/winfx/xaml/iconpacks" - xmlns:viewModels="clr-namespace:Wabbajack.View_Models" + xmlns:viewModels="clr-namespace:Wabbajack.ViewModels" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> diff --git a/Wabbajack.App.Wpf/Views/ModListContentsView.xaml b/Wabbajack.App.Wpf/Views/ModListContentsView.xaml index 6d20a6d70..bea4c38c4 100644 --- a/Wabbajack.App.Wpf/Views/ModListContentsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListContentsView.xaml @@ -7,7 +7,7 @@ xmlns:local="clr-namespace:Wabbajack" xmlns:rxui="http://reactiveui.net" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" - xmlns:viewModels="clr-namespace:Wabbajack.View_Models" + xmlns:viewModels="clr-namespace:Wabbajack.ViewModels" x:TypeArguments="viewModels:ModListContentsVM" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml b/Wabbajack.App.Wpf/Views/NavigationView.xaml index dcc91a9e0..20726ce2a 100644 --- a/Wabbajack.App.Wpf/Views/NavigationView.xaml +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml @@ -58,7 +58,7 @@ - - + diff --git a/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml b/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml index 18e42f8a0..ddd04b88b 100644 --- a/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml +++ b/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:Wabbajack" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:rxui="http://reactiveui.net" - xmlns:settings="clr-namespace:Wabbajack.View_Models.Settings" + xmlns:settings="clr-namespace:Wabbajack.ViewModels.Settings" d:DesignHeight="450" d:DesignWidth="800" x:TypeArguments="settings:AuthorFilesVM" diff --git a/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml.cs b/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml.cs index e9a0f67a8..4f290f68d 100644 --- a/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Settings/AuthorFilesView.xaml.cs @@ -1,6 +1,6 @@ using System.Windows.Controls; using ReactiveUI; -using Wabbajack.View_Models.Settings; +using Wabbajack.ViewModels.Settings; namespace Wabbajack { diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index aab59dc90..cbac7eda3 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -67,8 +67,8 @@ - - + + TextTemplatingFileGenerator VerbRegistration.cs From f77b29ec08514166b67b63b76fa33869fc7014ed Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 23 Dec 2023 15:44:54 +0100 Subject: [PATCH 014/294] Add active navigation bar color --- .../Messages/NavigateToGlobal.cs | 21 +++++----- .../Models/NavigationItems/ANavigationItem.cs | 18 --------- .../Models/NavigationItems/INavigationItem.cs | 11 ------ .../Models/NavigationItems/NavigationItems.cs | 24 ------------ Wabbajack.App.Wpf/Themes/Styles.xaml | 30 ++++++++++++-- .../ViewModels/Compilers/CompilerVM.cs | 2 +- .../ViewModels/Gallery/ModListGalleryVM.cs | 2 +- .../ViewModels/Gallery/ModListMetadataVM.cs | 2 +- Wabbajack.App.Wpf/ViewModels/HomeVM.cs | 2 +- .../ViewModels/Installers/InstallerVM.cs | 2 +- Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 32 +++++---------- Wabbajack.App.Wpf/ViewModels/NavigationVM.cs | 25 +++++------- .../Views/NavigationView.xaml.cs | 39 +++++++++++++++++++ 13 files changed, 100 insertions(+), 110 deletions(-) delete mode 100644 Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs delete mode 100644 Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs delete mode 100644 Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs diff --git a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs index 5bc71ab47..ca1345f29 100644 --- a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs +++ b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs @@ -2,18 +2,19 @@ namespace Wabbajack.Messages; +public enum ScreenType +{ + Home, + ModListGallery, + Installer, + Settings, + Compiler, + ModListContents, + WebBrowser +} + public class NavigateToGlobal { - public enum ScreenType - { - Home, - ModListGallery, - Installer, - Settings, - Compiler, - ModListContents, - WebBrowser - } public ScreenType Screen { get; } diff --git a/Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs b/Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs deleted file mode 100644 index 0fc291d8a..000000000 --- a/Wabbajack.App.Wpf/Models/NavigationItems/ANavigationItem.cs +++ /dev/null @@ -1,18 +0,0 @@ -using ReactiveUI; -using System.Windows.Input; -using Wabbajack.Messages; - -namespace Wabbajack.Models; - -public abstract class ANavigationItem : INavigationItem -{ - public ICommand GoToCommand { get; } - public virtual NavigateToGlobal.ScreenType Screen { get; } - - public virtual bool MainMenuItem { get; } - - public ANavigationItem() - { - GoToCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(Screen)); - } -} diff --git a/Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs b/Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs deleted file mode 100644 index 993ae8f30..000000000 --- a/Wabbajack.App.Wpf/Models/NavigationItems/INavigationItem.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Windows.Input; -using Wabbajack.Messages; - -namespace Wabbajack.Models; - -public interface INavigationItem -{ - public ICommand GoToCommand { get; } - public NavigateToGlobal.ScreenType Screen { get; } - public bool MainMenuItem { get; } -} diff --git a/Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs b/Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs deleted file mode 100644 index 044608bdf..000000000 --- a/Wabbajack.App.Wpf/Models/NavigationItems/NavigationItems.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Wabbajack.Messages; - -namespace Wabbajack.Models; - -public class HomeNI : ANavigationItem -{ - public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.Home; - public override bool MainMenuItem => true; -} -public class ModlistGalleryNI : ANavigationItem -{ - public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.ModListGallery; - public override bool MainMenuItem => true; -} -public class CompileNI : ANavigationItem -{ - public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.Compiler; - public override bool MainMenuItem => true; -} -public class SettingsNI : ANavigationItem -{ - public override NavigateToGlobal.ScreenType Screen => NavigateToGlobal.ScreenType.Settings; - public override bool MainMenuItem => true; -} diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index e22788ee9..ba3392390 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -26,6 +26,7 @@ #222531 + #2A2B41 #3c3652 #4e4571 #424242 @@ -118,6 +119,7 @@ + @@ -1196,8 +1198,8 @@ @@ -1260,7 +1262,29 @@ - + + + + + + + + + - - From 9c7d0d87381590602a42377c09aa759831b4539f Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:21:52 +0100 Subject: [PATCH 022/294] Fix being able to type through the search icon --- Wabbajack.App.Wpf/Views/ModListGalleryView.xaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 35f91fb33..72d0f508e 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -101,7 +101,9 @@ - + + + Date: Wed, 27 Dec 2023 18:30:01 +0100 Subject: [PATCH 023/294] Improve search responsiveness with a throttle --- Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs index 04a910982..187edc738 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs @@ -1,4 +1,5 @@ -using System.Reactive.Disposables; +using System; +using System.Reactive.Disposables; using System.Reactive.Linq; using System.Windows; using ReactiveUI; @@ -44,7 +45,10 @@ public ModListGalleryView() .DisposeWith(dispose); - this.BindStrict(ViewModel, vm => vm.Search, x => x.SearchBox.Text) + this.WhenAny(x => x.SearchBox.Text) + .Throttle(TimeSpan.FromSeconds(0.2), RxApp.TaskpoolScheduler) + .Select(x => x?.Trim()) + .BindToStrict(this, x => x.ViewModel.Search) .DisposeWith(dispose); this.BindStrict(ViewModel, vm => vm.OnlyInstalled, x => x.OnlyInstalledCheckbox.IsChecked) From 96367293f7631bd293b86624d8f81dcd0c48fe2a Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 27 Dec 2023 20:19:01 +0100 Subject: [PATCH 024/294] Change Skyrim VR icon, fix up checkmarks and more filter styling --- Wabbajack.App.Wpf/Themes/Styles.xaml | 4 +- .../Views/ModListGalleryView.xaml | 95 ++++++++++++++----- Wabbajack.DTOs/Game/GameRegistry.cs | 2 +- 3 files changed, 72 insertions(+), 29 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 55cfd1089..03dc6f79c 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -29,7 +29,7 @@ #2A2B41 #3c3652 #4e4571 - #424242 + #4e4571 #222531 #424242 #4e4571 @@ -164,7 +164,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 72d0f508e..9bc699f72 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -17,7 +17,7 @@ - + --> - - + VerticalAlignment="Stretch" + MinWidth="256" + MaxWidth="480" + Height="Auto"> + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - + + + + - + + + + - + - + - - + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs index 1b7adb875..215bcd1bb 100644 --- a/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs @@ -2,6 +2,8 @@ using System.Reactive.Disposables; using System.Reactive.Linq; using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Imaging; using System.Windows.Media.Media3D; using MahApps.Metro.IconPacks; using ReactiveUI; @@ -19,14 +21,39 @@ public ModListTileView() this.WhenActivated(disposables => { ViewModel.WhenAnyValue(vm => vm.Image) - .BindToStrict(this, view => view.ModListImage.Source) + .BindToStrict(this, v => v.ModlistImage.ImageSource) + .DisposeWith(disposables); + /* + this.WhenAny(x => x.ViewModel.Metadata.Links.ImageUri) + .Select(x => new BitmapImage() { UriSource = new Uri(x) }) + .BindToStrict(this, v => v.ModlistImage.ImageSource) .DisposeWith(disposables); + */ + /* + ViewModel.WhenAnyValue(x => x.Metadata.Links.ImageUri) + .Select(x => { + var img = new BitmapImage(); + img.BeginInit(); + img.CacheOption = BitmapCacheOption.OnDemand; + img.DecodePixelWidth = 327; + var uri = new Uri(x, UriKind.Absolute); + img.UriSource = uri; + img.EndInit(); + + return img; + }) + .BindToStrict(this, v => v.ModlistImage.ImageSource) + .DisposeWith(disposables); + */ + var textXformed = ViewModel.WhenAnyValue(vm => vm.Metadata.Title) .CombineLatest(ViewModel.WhenAnyValue(vm => vm.Metadata.ImageContainsTitle), ViewModel.WhenAnyValue(vm => vm.IsBroken)) .Select(x => x.Second && !x.Third ? "" : x.First); + + /* textXformed .BindToStrict(this, view => view.ModListTitle.Text) .DisposeWith(disposables); @@ -42,6 +69,7 @@ public ModListTileView() ViewModel.WhenAnyValue(x => x.ModListTagList) .BindToStrict(this, x => x.TagsList.ItemsSource) .DisposeWith(disposables); + */ ViewModel.WhenAnyValue(x => x.LoadingImageLock.IsLoading) .Select(x => x ? Visibility.Visible : Visibility.Collapsed) @@ -53,6 +81,7 @@ public ModListTileView() .BindToStrict(this, view => view.Overlay.Visibility) .DisposeWith(disposables); + /* ViewModel.WhenAnyValue(x => x.OpenWebsiteCommand) .BindToStrict(this, x => x.OpenWebsiteButton.Command) .DisposeWith(disposables); @@ -64,14 +93,18 @@ public ModListTileView() ViewModel.WhenAnyValue(x => x.ExecuteCommand) .BindToStrict(this, x => x.ExecuteButton.Command) .DisposeWith(disposables); + */ + /* ViewModel.WhenAnyValue(x => x.ProgressPercent) - .ObserveOnDispatcher() + .ObserveOn(RxApp.MainThreadScheduler) .Select(p => p.Value) .BindTo(this, x => x.DownloadProgressBar.Value) .DisposeWith(disposables); + */ + /* ViewModel.WhenAnyValue(x => x.Status) .ObserveOnGuiThread() .Subscribe(x => @@ -91,6 +124,7 @@ public ModListTileView() }); }) .DisposeWith(disposables); + */ /* this.MarkAsNeeded(this.ViewModel, x => x.IsBroken); diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index cbac7eda3..49ea479e7 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -96,6 +96,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + From fb47b2aa06c5c198b66a16199c0f3a37035916fc Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Thu, 28 Dec 2023 17:28:12 +0100 Subject: [PATCH 028/294] Fix not including libwebp binaries into resources --- Wabbajack.App.Wpf/Resources/libwebp_x64.dll | Bin 0 -> 597504 bytes Wabbajack.App.Wpf/Resources/libwebp_x86.dll | Bin 0 -> 520704 bytes Wabbajack.App.Wpf/Util/WebPWrapper.cs | 96 ++++++++++---------- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 6 ++ 4 files changed, 54 insertions(+), 48 deletions(-) create mode 100644 Wabbajack.App.Wpf/Resources/libwebp_x64.dll create mode 100644 Wabbajack.App.Wpf/Resources/libwebp_x86.dll diff --git a/Wabbajack.App.Wpf/Resources/libwebp_x64.dll b/Wabbajack.App.Wpf/Resources/libwebp_x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..0b2bd2c139dcd11b6ccea81a04b7c9266bced101 GIT binary patch literal 597504 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 ~NZE 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

qV-v$8|zl?A(Zyj69j(c72bJoT|L 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%0AvHQLcYPPFZS0IS&3|c?15~BtU|U%4nnp? zRwKJ1Ymftw(~%W;!fvXy*;*+A^CHL?=f z4cP-Z0ND>&;UR7i!jP?yqmiwV6Xp2G>2iE85kEtYkGw{XkDM*XN6wYwdyDw_a(v`l za(v{ca`=`ae1#ky+0p~|AK3+2p%US}k*$#Z`iSQY+ z9eIsx?=0-uvK={Bwg(A&zHCRnC36>He=2jB;0l?03%2yc{Z|WiK{lN#*c;gm*$-Ka z>Jk{`WTUnO#%70emFL64aHKH~#~|4#G27U8k=Vw*jwF%KC4l{*pOTcm^ zW4gnkCfJsQ@z~eM*p`U#+4r>AmW1JxFun2cl`pnUz;x3ve=Vjn67ykS#bO&9*=Ac3 zAH8Sa1(fSW*pty8-m1WGDLhB^JunuMeY;E47&k+z?3-i#`1c8!4{IkrB!tM%L9D&_ zkgk>E(X5^LkWeB&m$3HY1Ec=(a}aAcjJt~Df!Nozx>wG#vUcMGvjOsR6>C3?BQZQ{ zM?PT1W)Jl@0XPgs#Kp$i6|?uNWcIbP9xxvwHrB3uU^YUIKNj|gvHTpy+L;fG~JSv&;3t+Nlqe7Eg1? zouwC5nI3DmtbB5Mto^e6!)^jf!}9BIbi7!7g^)qG|EyiJ{N(y&-}+<6PtKpUa~~+3 z{M^afJ7c;2Si5KW$@|CJzYm0#pKIB9!1fQP&mi<<&V%7^Z=f`6f9(7)Za3^a@qt+K zez9;q(29bw-08ets(3PwU&ZYFG7itqGuE!;{SsgQ>sEQ(*m=kHLoRnR-_P*M{bXNr zGj12+dw1cL^~laswmv{^=j?oCET0$byk#us&(2?VTt2S{c0L=opIE-%Rpnymxp6t! z`EJbYysysU{E+vH^#jKCWPbds(r5jHv3>k!>9PKT9Tz#hIKH3Vp+$*}^&`f|k@erK zX5<`1zrtFaXn~@CVJV6hHV*cO)l3K;8S(YOs^gl>k5iw@dKUdr57HO&7yU_S<@qA! z$EwQ5u174lXbdmE81Dr`7hd8NM(H+w;SVla=mqhva?OpOV`TwC$8UNmFJVFr{KzRi+T#K z?6*WcRrTYdo%NANf8)q#taw|EzZUSDqKb9`ady^=J0JmF+{M zFZY__zMHi+`MNFaVMgtM<=4mPy3bf$x&Kx7`{GK^+6CL>abvl^m&fT_ie^A`t;KVP zxZ8&Lc%0`zGs#5zE%eAjzJr{Dybn1KISaV}c`33U`4?mZ@^8pQCCYORS&6&@*#r3q zvI_YOauD)8WHqupPoP1*gmx|RNn{;zzHG;F|7OUUX#W;D8#xJCh2cGs^UxlL?2YxS zKrTSLeE+9M{tE2||!_dA7!$%`8Lrz4N`{Q)v18C1c-i55faew(faShrRqFsaeTOennU7n{&M7t&0 zbJ4yTIUo5l@-5`u$WM_kAXgwSN49J$>h~zJ3-VcHZ{&l>e#keF!;lM*qmkwNk9-LE7V=NXPm!-9S0HaewrnTrV-KXPT zMb5_bl*ry_m!G#Yu{=I#_d~n5T35|`w?TUt+S8Hc zd1!y+Xtd8n&Z#BJ=ZNfq$6G>9#PIWx(~+ZN3EFiSz6EkV+LMuQA>Ck6mlZ+YUDhO?~I&|_QlAzYK!zcAZMU` z8gf3yuZg?{?E{bt&|V8U8|?#;bCK5|=OZsdzJ?qC z#r}xV1XvZ1$E!2iUC=%U*&BH~vLEt9M6*(I1F>?IcBL9ZSiD-{UPDeh0 zoPm5Ac@1(7ayD`;HlL6z!*wiJvI{aby?dZOAI* zZ{+Z}zjcwr(7qNq8u<(4JPh9sIT7uXk>zzNLCEQ7Ux54+kv)*7AZsvuQ)EB1k3tSZPC<@Fu7RA0{0KQ6ITJYpc_Z=~TAa|(<;81uN#>}-_O*v>{djaeS$mh+!vw7+b$Q;Y`28I1!9 zAMtk#*yR-1e3TEAUQS=kzsR$7Y(9pKJFwrk5t|r~iiH%|ugz4YBj#z?sDRkSJWX6> zJ+rd-KrPGlB<5}6VJuf{Vw_C8qr!XySG|`ZnEf>l&wjP2I?LBVc^o(yXPd-4&`2D0 zkjHn1!|1Ts#Q05YWqAe5vz2oAxXSVid)5939#vUB!J{jWv*59xrLV1Qm%=X3zRCHq z_ezY*SJlo%_{o*+P>jd0)-Q)=<1g&jaf~?*j#+j7++ICC`%N6<@Z#MX<|Fc}I^Kdu zLc1~!pIF&$ggqI4tH;`}tPqshe-5{2N9A0j>g4w9JarzS~+qJMy zG)j++vnLoaoA+R$#3tsUMpf3Qm^YMXo!PuIo2Qd!S;agwt8ck|it*K|_9L_04+&;} z<^0(A>zK;+DD27nT_zSn%!5>wPt4O)otI+Xvg*AhG5=(2XX&%^R%~KiTb|Ws^Tcfb z<=Jz_?0g+w*?z@5pgfx`=GR%jAlH|e=cqbg1SPI{>1!PQe{6b<`w1HbT+Tf<{jl(b~bO#=I5%;M=?Jr&!#gw zn|G3PW6b(N_E&6TUdz}n&bKN%{tCP?lvWR}l(ndLK5%u~y&B*Z!i z@heth|HM3BRe8ibPSyD%xN3g{v%hkDHp?fkwh-$j7|Z=V8^34QAUOq@$mfp_oRe%VgRqGCjelMbh5vY{_kRm7{Ee@lVm?pK zo$W7cuX1S_v-#d6qxxZGU?D^gDCTLa>RbH6o-wm|e|eP(TgSonzN-C*bpY(I*u=cC zy!u6~U-5x9BKIF+oq)FT`Yl?I_-kB0#{S0pE9UhlLMg;1=HIKzBjyWOeL0 zZoFFTAkr2Sn9~TfBz}!8c@lmKIi>$u%`Xu5@t>!vX(-+|*P?!IC;tzX=O6i?hc4jX z%bAGfOGnkA>dXH<{C}0c3mDkDkZWL}s|NP1qO&Cl0>3)&z^4bNgn@#qFqrWUoYfja znu2QuPIZZpcHsQMg@KCzmvA4hYv9I#n*nYlEY$xWlIv zRzBYMTkM+ipUx4;Gkz3$76? zB=-f^2NsZz0v7-a$9sc27->e{gIh7zjO+pT44hwv8R`Dmj68X2Mxq*+lbztgLd{7y zxYgkP?ru(!!pw;d+)Z#kz064{IOjg*#5}^B_<^fA#GEt*w`r(3xd5)~FmnD(dWLH0Me%T?kp#@Il&es8eYBxeCaWv)9CwF=@$cyomKf*{q&~ z|K!P&<71&};MdD7Mct&P#d-Az=J`CW<~Nw<17B0F3Ku29RaEm6;Yg4rQ9?J}DqWOE zdBBn^vI0&JyzZDKsR{Yw@oEeIBst*6>sTDacFZpy{EUvPFZ1(0X-Q5%JHogfm>(&y zBze~0Cz2<5cOWela4dcwL1{%S`vYq+fYyqXLbPF#U4nV7>a2(cxK---)Hp8{AIjE% zUmmY3?#IgrLH^^Wa4;th@fO6v7qqR7R?*0sH1dTn$c`9g_RkxnrWsr)zna%K$$&ZLBCt6C2=ZL66@;@#O#bc(ZXP*Ck#lcpk6)M5db>@ zI{`cShaK+ijKV9dO^LOyC9#e)*D9>dh_%5|Z(d-UXQGBQYeGMeW<{*yEs2@01<8Vg zq6fE*=L6@c5i7cxlWwqIJgv6oT2C_*Visji^l-MFgQIW@<5Xv;z|X=c-~}jW$jiB{ zgGeLZoMieFvICq)Fxx+f^AA5bSB=6bW>}LMrB-Arl-thNn%K3q(pzZF;miDHq}C%x zgM;2K&xX}y6HC(Mx(#tlvn7u4c2Hh>qHhVmY1)dAsXQ;(Un5q)%U^cI<_1%}iPqE0 zns`Cn24`%E8^pDPxMsc%B&!KrKfoQs_{Qv7$COxJGu776n5Yti&3T)0g%_}F70!em zVdkfW7UbE$mNY0;lDcPHNu5GR;(XnSSVp-JQ{Oryt05sbz$rsmUBEFgVuhm>ahz#q zu+du;Smaf;8SWqZFaA!@j(qKiQ(Jq3t=_u8GS6J?S=*GJFvo)bk6{ZSedJ2@)Riu>x>Rsg-XHDX+n~|Ys>_}9+Es>(EiCLj3(e)&x z9Nbf$KAfQ7M<5)5a0J2;2v=r@ScQu6Kaqy!_+r>q4B1Z4K6XORa?l+H@~l(yP#hgr2b`G~SB%LfTes%?vfPCh$WF*2EQ# zrE8Q8arK3NN7gbp>m3Vty)6fOEh|#%6h9vdZ1SwMmKqDSIXf?$%!yMPoI7wnvvXJ( zM~E9ZZ#;*MS=0eP$Jnt}d$QwR2>TD`o&m0Atp`E(+eOr?F)J(-#9}7o#r7%9j@ZKS zwuEw;LOHbq2$=`YvMa=MG$)Rw=EMe$o#`1%?!OjnN@gR_Ucg4c#==+mLmy|925*xr zFCSatQ))^Y7MhWI*P(AaV*&dJZ5{H=8c4`VaA_=E)+fULn?ZS)Uoh;)RGyy+1hD+f zPsFPV1ML>_Adm-vJP72$+w$jmuyfZaPlcN`^g~wAmq7m>WkKA0&52vv+Irz{2ma8{ zKzZCC9k*2Q=hqQiXx}!(A=L)^TR2}};^ic`ux_HxjhXiYkN%|}s0r8GNTtDEZ(CrU z$J>=k^xqCd{RJVb!L7jbj9F3Bn$+}FejZmX{Ow82w$;*9i!vLXlkoDaJsdmM#tL9U zs~FsS%*U8{xi|ewxxcU`UlhV|gmzyu3ibi68;~bl$5?*=*CP2k1n0Oq3fcs?`0k=! zj9IbKmTbIkL%uAvCE;)$*|fFL%e^N*hhQIFQ^mRCkY}g0)!4v3LVj?pYQnLq3CD`( zYXj{x)xsdh^@NvuouGVX*WsRa3?X;H-DCM%nh?t~O3sbo0s1ADiP??WI1X>aA<(b! zI=B1xx`jG$fc=L13JpJgX>hL%6R%cF;C=Zpw%@G%e&)xo({O(@9ojjZBfPI-^;Zgg z^cgGecXl>hUwM2HMrK8QYf|6Wmegf=zK8~LU4$$81p}j-9hxFZ+Lwo1-Z3Feq+8iA3NTq1= zg_b1iG~8c+^XnmwZFPoy{wz$jb{GlwV3F1&ve24@LputCI<$s!ir)|QQIbAT4_%>u z4Z3bi0^qvTHqD7Nk9Q;uqm;z_8uX#|Cd9t2waOD->~@S7ZP{=N_7BQaz{ zij@<~$n3^!97oXr?knJ#uU47`sReDfRutT~u%0`Q5K*_0P`B`8{{atq?s>6gh=E6DAQ`DO=i(^}d)W25!*oxx-#{iC7O*n4s zI4EjaLOE@qoYtfk9GhB^j(T~&b>9$j2;6nd!yfa?c1+g?yUc3mm8f$NF`_d5apF3ca=5(`tstpA18N01i3kASoY#37%j z$L^Dj!~DYz2^;0Fu&6;SLfBOmt|RW2#2xzhI?!gEpv|yryqFpL>3W7eYe3%xb!i4|C^HA{bHSO0i(_oet}Zo*)g$O-p&YDD zC&HoP{bMY&{RVJPrf?yx{hBnj| zuDn_sjlvy{FY7b)yq;AyYAi#d713WIB=8qP-1}e|N^5ey3Vtf)2OoBDyIu>fEA_DNZO8m!-#=%TPGvlH9zgm8(jyR`K>TWXL40FYzy~fI6io>{!>B#szS}je39Q1ATN zz=RkI3HbOp-G-n#6Ys~ySgQALK5BbA5rUAm*K7wN}m&2HALLZ+d!s-4X zWGOf~oG~k!S(0YygxDo2h-F(b+9CQ`xaLDYYYqJtyN>3(fM-T%mD5$YeC;)mu3caY)bUc2>Bb_5R7lk3ey^-a-48^TBe-bn|BPAD*P8T&x}s254$!VEpKh=%~tb|Nq%@2}1}l2_Y8}V8S(WGh$Fg)Ib110Rx1Kf^~od5)EVwL4#6_ zh#D=`NKvC=4Tv@>?TLyOE49%^n<8qo(WZzRH7Y8#QyVQ+kNtn1z4wGY1D?~f&N=I> z|60GS_09Kr-g$5Pz3q3u*UUodR<2hv!vi|fT2q=Vcl=KKd0hOHwSP#NNs8_rS#A<> z3$*hP8i}zt>A#tItiHe7QL-P%uK0c=ZZ<_OMofKoP-_$FP|E4x3^ppwo5k}S+ zl2zrB)Dp_tCeq-PUUEtU-_~`81ZrF|po+Gk#3P=a{8pGOh5U97zfIz|vHUiI-_kq# z(hd?Q@-UseN#EK(Y!oF+5#_6(-H@|eTry#=TShkUty{;pZVlzJs)zI`p>NArld)^C z>^kh0ns$$rw0Pyhy>W6*Ll2o$=aUIFJ!Mo?JmJs>Eegos!oe~)caRL`AcnB z$l9ZZlpJ=+CGBpR*5Z+K_Il;?hBz5r*F#3s_+(HOZF@<)^ealY#w~caCD67SwOLYo z)GI$c94Bkqd&rU&pA_t+@7)kD`E|YI%$fu_wW_y_Dd|HTMiPe+#9=sb7!)0ct5fCb zqb|9SXDQ%WrtmD|d6uy}OE%Av!Ly|BEPZ*FUc_Jf3&u5Ba?Q~mvhuJ`mbUkl1ugM% z{$9pU8WQB}y54d|O&>X>s;`VH@e}rF!X8D~ClU6L=&yz0HJ!M*5yiBg? zCAn1zJbQ1#=a~zK5&lrZ&x{VgI9ZC@nGb0(hCn988j}UjnOuNc2f29yD(QX+KO2HI5)gMYVSAXMPR-c z)F0Yf)jt9Wi}8m;x_a^s_VON6vwro|6*b5ISUt)ezn{qOyq_5|6`1eAH0lQL$$s`b zQq5lm8*Tq%^(eP?Tx%aRWGgWJ(|(xkmzs@u$dCiJU$MH=o%w#Je3wx4RxsXN_T zWAmg{Qe+XALO=+trQcd1p^kzY(+DwmJTVrO-^~`7PCN_SWZci9;1k_z*rF)ca)&mz8 zHX3q0i1aU`blXmt-`!6gvlFHFXRL$1qS;@i4ur6GJ&43NO1J$h_$7G*B4Ijpv%J!m zG1ELHPEsiM@pj+Y-$*`yh&!il<`>VLMw`dDlwA&}M~_h+!LFrN8bs+DpF+mg`28h^ zohaS56MUR92qOMCbtBa$satiFJ~GnC_l3Ia;v4N(hMfEi^?#WizEijJxb^3Td;lV8 z7NwivGgk2^^=Ef_zDgdw~u^#)61{QF=@{YsB7fK_tzhbbSuWQ0;rP zy&zIvoVq;^Wt9_cZ$B_(5NNyD&L^jCrVH;*%${}FiP8trccNWLspPvwzgu&CQq8;j z9?;!BIQ22~7wA)tEOE;a+J#iwg+8aq338Thj5{vx5H13ZJYX zZKjeo@uWw51@m?(UiyVDNyNEpdFG#1-)V*7+)DJM+0Ar-3%xo!_Aw32~A@n~{K9vtOm-g0%DAPPa6D zYRHPu=>G(*=X2^tFUG5iK%s~62g1~G7~JT$cn5AWj9l9H$*Kui_;9 zr6Irn%8=RlR(MX`80DppNO_E;R}SyQ8sbVnG2wMFD6;N%58Ks-?N|tB34Ed1s>#*%O{WY{6&F|mQFO(EaEb!-K{lz1H=_0S_ zD+kB8WCsYVJI#kSkE#E99Qj7M)q1ACJM}0x4!>G^Ql42e;`B@Pu?c*m*nY+8PB(Tu z!`<=x%p;#^nIfKne;85@>eL@Qo~l=TV@QMTcdQ=eChU=Lkv2Cr-MZnP?51j3iv%xOg-zZ(v zgnHI=hD+W75j#=3Z6|yt{gKJX>_q9doyLhSc?CrLiPCL5^{f?q4n*uY_4KifV;IY+ zZ;q89jH>FGYBfbGE5DEAx11!C_KuQM8b-^ox-on!kCmjVapEgES#qv)$xk-8xLbxa z{7>w5%yUV8p=H+!cjXDgt?dqX6yc60+%beZmT<=r?#YD9x;^^GU$1h>q3&?M-)`+p zmwa}f)9!!pJm>H{Q~tH*39oU<8_|R@scwzt7F}xB=a6oci~jw#Zf?X4=yv1Ozt7EP+<C{wrCcE2Ys zq3x{O1(CQ!>EGw(Ufh6gHxAwG1626J%vS}?{>N~}Zrc2k)XdsGox5ysNjC5^KBMmg zr*8PY;&+*Afm+SJhlf5-vq;_pE?Ep_s~fYg+mn8zwT4g4uK>$z|6=thw{}}o`ylTr zV2(u)g(zL^6uBh$giFeR+1FDuzOz)n5wzN2#p=hoq0J3G>XNm% z6M1<6IOC-HC*Y{yl)3L*0zhbuDL6D&uA;^1^p6c@u25?L~zZ zNBi_() zJL53ljeLhr<~#H>zC&~P4jsjJ=&%~rEb<-d<2$sTXL<>2i#(T8H^WaS{nO<6uX%@o zL$yb#ZDFNlN}r8~mADeRKl!0feFdOLNa zhf8`;FS3>-%M$YVJo5NV^7s_;cred(}>)Ib@3{tRd9k#!X%3d#r?Zfpt6uzj4V$AhVq38p^(yy&`c9hH16~ z^K3Pz9;lseUEAKmJ~HMxmn;QEww+kr>9^67H73RYYtH@hWV!sPTP`{5ky-6tIj1E~ z&e+>SPHpf}9(qbv4RelFtj8%ykep{+vH&#LVK{Xw-P7%Kr%oNFPPMbIr-gQ9FYQ)C z59aHbx36Kn19L|{=8nSq`R;znCEwcqIdvmDUa}c)PiA}~nYq>ET*md2n8VezN-owa z1taqbe1E;_lD~tZ5b2}q`#N==*lU`tYh|oe&GmgtyY6j{6E%AbY*us9Ggeo>y4~@6 zl>f=ZqY8gY3>J{PWH?B(*L6B|%-U`vON@;vw25(Y1@=SOFTwsw>`%e|MC|8aKO6g55&LF4n@PP+v+DJ{WSMu= zCFhgw(@FPpNcS^H_ftvtv84Mj(mlgY_kt|9Tn)-Dx1K*rH|tpj^?HDe7~z(2V2^Dt zN;m6;K|b@1M7_?XUXP<*XH&0-P_Hwc^*X~X_k!+v?bIFhdQ!kGQ^BwbD_&80X|j}3 zpO;dfXH%c2QlBSNpHHJckF1NMoHE~2WwqPkc()|wIQ_NZobn-Tkph z9j&B~pY4_$;NzQ7>zq?hAIJKHn*NenmBLz)RLXQNW!f8ztbxm;s+sd|oor7UAe%V}xBP5Pn}M`TEk~dHn%fXvfI)mvw09}g$9zh znda|@u=A}QN44+NoqnXBqI2b^Fjt<#T=_WW%Cn>9%DdO|nSF4^a?hdufXG_#DBZTx znn&3K5j#=3Z6`Rz%|4-HcAUE5W3SJ6YYn2gkE)9~Mdl54t!PueTiyhR*IW4mLicZ68^6G)D<{p=~az%7r0$b3YUuFt}IBh2q{ z1(cbY8Ydk$jy0o=ci1uC)kTgq_PNYy%yr8%pydkdxtzK+Hk5zDu^|o4`hCF(f3N0u zgZYfY&Wy;q=2qvr=5)rV(~UzOQoDQYVABYmU&nfz-}m^6-tz>P(VkrFmclEEo1e8@ zT?akB&bK^jHUX5WIpsB0ce*q8Z#{l&UFl5hXN`-Oapdg?))@|L>qmIHS1VEc7r7+} z_L=@tS+FDg7Hv))ci1!6gz_#=;=Pa*@|F<4j{)1XyN5xA9-vb$Z4`eVVp7DjXW>@P6L!GRHWj=wmvz}I$xz?*zpKo%4 zOzujij`o+6no}eT_xMGN8ZVf2{6wYv{hDt$oA2J9@Q7c1D@)7kOBHg9M>^*K)R?sdzRAX4X@y4BB4F!#$DXZYj{>TX}ghx!(pdq+aX zqBvQ^`#F`hV*ViMtNX#a*yGsNm-WSd$=TwTTfr`kkGbZs4`n{dG%NZseIYd`ebvq} zol1;*r(1KLoiJD}r%zmv#pQPWS=;8TB#cdNxeX*-jbB<{*>j=Kt7h+jOf@HrSl#K) zYEw=6kO+)D?nt7%c-Yd5-*puoyJ-=UB`8Xn4@(~)*jAU^(P}v zGAd6ejuT0TbENThx7@Lnbg<*-)Q#y0GM#>XHuY>^IHM!IHMOaKC^^_KC#k?%qnIR_ zv>%zdtW(^2Y{i|m@28(6Z;f8pXobxhOrAm45LZ7+*#zBlt`6PkWk|10#CM8crZ8u9 zN~cRkwYg<*GkX~-bqy5dfHL68{v1T?EVEsJeEP5mv*+HAk{cc<=jV+>4?fhCNk)4z+||CpY|+DK!O%SGMLHmjcE zZ$1A~SHHrGT)x~3UBTDfayyv(Lo41+J$*diYPr|CvWzQ^dtXXF{JJ7dt~h#%vF7l2 zqp1BzBkPi3E2ho+wOEPl$e`7Go`Ql;)mq%C{VE!Dqcj`|wwS)95#Zakin z*ktWm$kKj8C*wk6WXuZXs;KW$Tg#tQq7xAzqla*o8aZkYqdTx+F`Q#X=zj{y4* z**})d`dI2r_u7mw-@bi&dAj>3QM#5_(!QQ~_(NdxG|O+NZmjmm>PpVZ7|-6XVZCKo z(I6RCI8cV=X38+ekB-%8@>9Q47$fo<9{HooBL_6DT(GI%eY%c8&FZtM&Q4t6B#V27{{b|C9u(^&`G-xwlh&WF4?9vo|U3_I9+VMdAn zPx${9>xrw`=QcWCMiYlY#6j0FNA_hKgV-m?J7o~{dQf3s_6_!tL0her;D*joY&G8k z=I$bM&VuoY-p$NekpJPMeB=GYEy>qe`Qg-!^ZjyuoygQ0L(Zsj$@mh+i>L?v$wzZf zT18^mY=?5=CHSFRe*Lkw^_D+QJ$;auefW9eZMDWt^cjQNwrd`CohjiXZaMYOZmCnZ zmnF+(H3MWtRfb$tk}30>&yw?U&ylnDrjmYXl3tfC{?5s~3(hv(?8IH89j5x>)SdpC z`=V+*68E@0?#{PzUZ-1DfXq!+oSnMS*DHOWXO6c?ci9tH^F68isQXK6*e!$p>XzB+ zPS;wH7k%i1dfR%L<`emCneC_AbLvjF#x*_V8rEJ6p=@`bP7w*KGuaHQ@o#RK#r%Gw z`e%;)=-9N+H2WpyEp|9+$EiEr8LVIExz*d6Rn|w!y5eLW`F}3?KZ5+vwCl2m^6cjs zCxEo;t@Lo}=J^#<%@#3e?v>H{%pSiy+N+DeGIeA2Wf)H+9lZ3R)O6JdTdpd4ePyhA_khYolr?OV2i@a=OUvYB}(|q74j||h_sFP~%n9jE@ z{s{g^tUuUw`fKfTW8|`>R>$F`lb_^fm z96LQ>SBP?JuFd5ALc8FlUGUS!P6ECg^qKS-_;%tqiTzFMChf^jvHLTSW7_AN%HiIi zt?#wf+>@P?rE;fVJfwx6`fvsanQr(v!d%lR%3RA2W6rl@?;fx%;=j{vOx(l#HlXyx zagX}Vj{7y(y$Kw#{dU?h7^92d85j0w8kuDxp7mmV>7VtHKoMinV9brjr%}{zb~q1W z_c2gt+Lvhej&uodA?_>?n=Vo2cDn4q-Xmal#80Q&nE3ivk>21$@s0Y;j_)1V-2pr| zS>@Vk$J~RqlRBeq#uv1e1K3+s*@v}?d^^zgg)SvM!EALq*e8Q&_xkaDZuX6udz-(- zUq)J(erwrGh%u8WKg_c#R*(nTe#vHjCyVxYU>j@hn5*nhUm$`0mamX?iS(Ppmr$1Y z*xqBuJ4)C2`CR=Q^W5_%&W=p^rHK#tu z>P~mo_e0Wg-w#&3XAeTjB-?IT3>crMfS z+-yBttge1V+!&W6$R(XVxrlegLcS4GwkCzm?{3a%NFT%gv#OE2|FRi7DvY#a1(9*n zpvHFy`=l!8)0QmY+u9@hLC6l*sT-+oNnO#eRrld%Wib{(Sr|xJNXLHvBHHUh#c2fZSp|yHhvL=_BWq zco~Ob{;n{YJnAP|k00xGrVnFZu`$+q&Q|mL%*>ZOZL5>?+hR0jb&LeA_Q;W1l$4;8D`hD6bGE&*s#TadBVTPpg9g)iXil6doB-2Mj?yY54zcIQJ z*;_-IBd&cIbJFvRnrt! zYA~j4M1T2P{^YPNz(`~NJ?pg73hg}$-McxpjWnd^PQuDyKU_28MwPl3nzO3tmoz=( zkw1aZ7Sd^iwTC%_ewVI$_R`nV-xmDLBUSo4?MtlgbZ^|=TW)V-j|%8v(xe zSQ}2Ssg<#kf~+*2v$LNhP;PvbEl+L=13@0S3grISimOvkr_PM4J70#^%w}EW{n71K zWL+fH&1|>!&XTN#^O%2~L%TIs!gtZHxSO>dw!cn2eVCrJaZ994={}=P+rd2iOJABM z=e5j{se9+jq=pM*d|iQzs+lLltL8IDxj+UQ4~sp*s6F_geqE{C7TlV9%fHaMGxk7s zB}fL}G^uTU7+>xyeJlI3{yUj|Op;W;?U6e{_N_d(en&B9?qj~(LmQ#yPlFu&&0J%_ zI4t@d@6Z=kGx9W6k8;EBPXEm@hxulnh8VfXG3SxntTX7E4tnI*Z_(zdzgjmaU#kBN z9I(TR)tzq4Z+6;I9mk62-Dd73j^`aPKdzP2=t5bnY1OlvvgywbWPd|qp?!YFs~#x_ zV{WsaC(og$r!k*Bo>3NN!Zlr~a#q~BXro{E$aGMq?sWW$@~Y=fsM#7&ZTlCiN4e9! zDSqiWWrADhZ`Rz{B-+ODC!8CrrX983ql=@e>2N}ys2M{S&R7$a-1IJhA^G}+vh)a zk6YD$?U5%z_Et>~zTF(Uc}`44&#-x3LMMHZHu@sXI>*jBiBCQ9Lr|#hbiWC8Cvwi3 znm-7Z*?z|AQEv5|O4f#?@qXxs-|@^*nftpw^TUPKPQT}ULiwV=JCqJW}Y(H@w(DvG|d!!kk z;GB~9CVNke&W+GMc-t5Q9K)Kbv0iDn_edYZv09&2z)l~Eu{8$O+o(<;4Or8X zyv=$pr*59HVvIA)(>p_2YAyG9^bgE&<*w0&zj=(|D;#SC$9d&Fu*CF7>(=NPGxE`4 zC!I58lZ_!d@6p66`{NUZ__#2)St$z)sD0N?$n)b ztZxzC^RLH@OLI2y`Fv;DXSxN=eH)vO-?w4bX=7+~n`pn^eHzzz-Y1>b9DK(FuS`45 zYt6xHeeH@j^^KTqyu(Ug{r#9uCgWDmZj5qE`Elyj*n0YLW9#YWIX6Qh{c>&3qtekB z63-ahNsk>sT%{C_s*R_ zUuKL%=ZN-U7;oX5obi_q>mAD(tJIO;d0yEBj;Mb+pIPH#jh~w}etg&R9k0LL1&*5G z@s8zp;dkNp=-()(4!_L3~N9qhIJbL#1X$Sc+sNBVe8>Q2+A zYk+uI*AQ6fmFeK9y488>=1lr|1I5Gqf|_3g66&mY#_CSD)*K?|o6!HtB&{>&A8T=~ z-}Ky<6P%l(bt8$frVdw=`5tK##x~f?M|$f1+`tv=0R(j#2Q&S8n0oD%UfE^Fi-rm} zf*WhRu}8EU?JGroFO2<-{EacQ#!wlnW^82;-*kg=*%ND@GiW5Ur@x3csgQM#xwMDo z>8O;q6wdo#9y6tgb(yyL()dPCD`Xrsmw8^kk*qNh=7+{d_kN6# zoSjl)oyTJYdrR;rX96EKWHM{&#Va*ml!L@eRg0@_wu%?_&gn z_gOG9U(zJxx6W@@4&r-du+-PkkGPAHmsi>j&R2ee3gt4*}#EI|U9Kszm)L}#Bw!35|d6rL}olTxiU>)R0)jEX93&pwVo$R_wf#7d}Q92?DYhPY&%i9 z?)TxD<9TK;&s-n&%6<^p=N+YIavl=>P3M_j^&j%S1(ErFr*582nZ)@4IjoKC;`}N0 zYYbq{K*ub5Qx|lfMHBwL0?M}A`Qgy5`By#L5jV5}-Se-^rQjx$$y zbIfnhHu8%!%&4TE)0fuqy1YMlWfs_@VfE27ZAn|6U(Fr^`|LQx>P~kC`*ag3eAZcV z_&)&udohmU!TV7N!v3isndpte-d)CiK{2@H2Zq5}9q1@>AT!|HK>l=I@y~%UfVMOVA zR%aFUv4r|aJqaB2N->D+i;vPZ&V{_!4w1$na-K(&Zrf?%_qQB&qIBC%_1j*#7exGt z(rr6=?@)I@#7>kRiO;*l2Sn_MQ;)<4v$q^}nw)whJ{`mdMEt3C>XG=oM|?oUPM%Y@ z?F9bll`}!aPLyuj>EQQo9Co5~+fIGESDpb8f1-5TPVi4&xf(?5ICbL;H*xkUO68`&QFQbHH=CPL!T#3Uc%l7V2>S!Q#Xe9;oZ#o z1>V`o%*`CPeogZYKdQZPvJFJmD@N(I9e*5qWI$wnu~RqqD~@*skEJu~!?61pSn`0C zPEopO18Iy~gqwLg;G|q7{hFRZ)A?y5NbIzzOi@B#E^cRLoC^=4U z0hJogbII}?`;7J+?jiTK`{XkA8BJ$>@kG`ak7f<>VAc}%V@;v3&*!vBHye<^zRFGO{&{Gd(V8QSF(SaH7hSNpPu%Rl?G1T z>Z8S+y**OALo)l;Auh4!&w3)R=+1y_cw9vZCgou?GJ}?X*0kU4MWYlv`o8AvzIX6W{0hIoVwGUkw#zbed{cU zz6JC>%=$tboD(PafKJlJ$+uHmcap(lA2d!K_}+HRYX<7UvV+InB)0U+|b>KTsTd+M5yT<#Izu8ibRzo7c7 z&oU1?r=Lq6;E%Eyhxx7o!)J(ZD$k|!r7K`FPOPV`;Jhdw>v<}yeIJIlIk}vtFg~uJ zr>4OW`p>rCm(7WjFTntR50lL^9m#)lU4QPcSVy^6;?VU^&9Ou{e?9DjMrepE=@zOZi4#pD?W&7-Ub4=Ov%Mq@b zkNVvDEGOWeI&V1Ml@oc!dsk3*Kns2=n`@MK7ntAUx^|myy@8C`3@l`w8+kf#ytUTN zJYR^tm43dtdl(r}?$QUdAD%JDxDIxnG+AYq*B0w-*x%Z918XvFWbEc9@fX%mFK!n9 zP267xk{`9|g;O_luO#1dDO>v%#KwL4kEy>vXlvhv6Sc2JJ=S};BG1Op zJ`nutH~-k|zqv;J#LwAetuL_rw9d%qe0;{+(sCJtvd_pj*Ws@q8Yc*U!yR#QJ&1&F zmND`r62CX=c-I5X#|Wp7Bdv>?N$=k>4*RT_r?gVew4I~NZmpBrN*UL+H5IOc6NNkc z{y3QcBH^CM&V&5^%zt9%&-^~H{y+Ao7(446{utUmGHz(FAGH_#Z*yEt&tfm3EqI^! z>$-H(JDqZsPPs~_TCId7VsN)0YXQGiPS@d98j; zYh;97-Ap9^5@X(RlyAm9 z-e&iM}{hazTeMT@R;%5);f})HkChFLIq9j(ByRMpaO@yWi z$tzi}#>u;2rR`>3Yn+sVh<>8y-b5I6AX28SF&6I$%m4fMb^dE{vf1`OQP&AG)}Qpa zb>?v-Z>q7A{d%0-AF-EAJ5+S+E|iG9Gyg~#2m2!S%=d|PZ&<|6nz!QQTJWZA$Iy55 zR!@$({)#c=WX4j>o9lwd=0#hzJecSIQCG+_eH)wm0Cw8%di~uD%R1{YeQfUugDaES z_t#HS`Tpv6YM;luS5DdG7qZ{+iL{4)>HB)G5bhR6xm$3&yCv$*eEws1AX)tZ?tvjq z`cqH23nm4j4RfL%>+t$^ zx7!6r&jqnZH94+ z%PIkO`X=)`XSTD~(lt1Dn~S}cuI~O;(6Xa*bFqCIZLgpGhC5EbrQhp}V3Q8tdWc4 zRnHTY_1=AYunxb6=zXrrnjVoqy(?MeTb^S72+UQSCMG_?y`X!1((xqc4|9)|zttys zcQRl9JoA3P7jvDTt_#e0fW5Z6SSOqBHuqNRJuCh<8FvIBP!C#x{1G=G2x>tS2&>$V z`CPBmj_^n;@Q?IJ0jLG7z@Lo{a;7ovoq@k_L7kZB_!Ise#ILFB)jAJ(HerGKIs85s z85CTAIcTJ!`R5Vd0+B!_@p((6db(R`@jG}D;VD*lB(TzBuFbFBfXq5gU4vRXmbLYm z>)LKzi>>RSb)CDeSJyS;VSe{t!#ZIQF0~Nc#P`gl9`>u^AK_^HTj5sX+PKRtcaq)> z;3@DNXagPKFChMx^sT@oFbgaOE5PMoGuR4tfIZ+v&;~vLUjg4<*0h3ba4MJr3cxDx zL+}&u2-pjL2U@}V;46^uG-v07Nni%J7?gr4Py@Ds2f<_DIq)+06Zi;x0TO=2+G8*Q zOb1Ir2;2yEfhWNW;0^E@_y(jr`vSdxV^NhOs#ZPR6dWJsnA6mD6N03(Y- zWT*_2;W9!-O17LNqhz#<;r8`$!r6>+ij0?2C08cMX>vOKh%;o8oGFv#EIFG?B=cm7 zOqG0@CevkxoGUYBmYgT&%WRor-a}p>^JKm(;5PEI(iK-0uLzARDl3yk1rzg2idSB? zpmg=x<(2Cziq+)Y;>!Gjg|pVKDz~+WIQw|Jv$1UcytsHp!PK(iwMA3PLM6*Z)%>#J z}y!{xH3l}bO1d7)E`}DQl4`hjv=yq#XV3rz5u4qdR(-T>aL_gY#?#Hl< zqb+s+IHRK2N^KQL{Hg0#ttzfCpGAvKd0BZy!Sb@=%1X-?W>yYWEGn*8S6aR{V$%vF z)^tX(SrFHe8pjHTvy>q(F0Z((xWcrtYWYelm|0UoA&Q^r`78p&S|t9qN)lU1p?ajm z*m6;K(Zqnb+kVb1zS54n5ns=R$5t7 zTv2Q#UF6s9@NI+q^3VpSr}-7-A*VjAbX{e6MP(#=ZCBkz#nxvoUw5oISQ+KvtTiFr zM+&iRzuVAC+E~*i&KOvBBiR#W6~hyFfN8V`vCUD$k9CVmi?4JBHNSY>N=mrXXhF&H ziqMHudcm6I6_qFcDb{1nq{4EwYx%8hTujO?SiY(_|5))*wL6tnaTJ{eC$1@rmY3;e z>cv*Ms>0vY%vgz~*r_PqcZ4%}Z>))aH#gZ?X9vo1e1zfXxSO4%_^#&A#7S;iuU=%;t$U z&$Rg>n~Q7?*}T!_TWzkl`6-(Z*!+>rVy91%%|mR?v3aV^b8TK`bD7Q6HgBH&`$}1L>u3cSLe8GxKi8(PS_fjVdOXvm_6;za#^H>|?4bS|_vi#*CZL0CC zvbd^J4yoDf^76~phi0r_Yd$myQL%w5CiIs@r4^OymzOPEdu1taJZbVSTw7u$Skd&V zmBk^A{*2Nx5>Dh=4e@(_4!C$t=C7~N&RIc4`AT|S@>6eNamAWa`h&$0BiZ7fMR&~n zy}ZJHLz~^RwUsj8GjDxy#fF07idE$mYnHEF$y2P?T$8NheVRg-DJ)%6JY^jZP^^-aJ91~iY+f@nNji)v3~XH;)+O24w`;c(%P;MX{U6t zT&E^;%8S;Q*(GW*E7_*cpF4f_spHKKu)MG7X(c52vyQNcIq%-fii>8HtzTDShA5Y+ zKeLywtDIg@QBJB((NuNlmpS4XQ@WLHL<8>nY-LuP=7umm0uj2ViJoA^At}E^? z2_j!gJ|(WQ*h+0|7}Kjt?PAEmEzS^#t@F3)*z_|)SZ%tG6pkMrv!i)7clnxPVlmH6 zHifK5U1-YY)LklV^s2SM1#+X4FHtW1>Hsu+m73(V1Co`-&OtZOE3N>0R zTgi9x1(r__u3-74XDD(_d*`~vga0nth=t|dzsnR2XZqSJN-N6OuA$~w53`P^dBRM~ z6aDn8y0Mc?Q-;MuYOUSyuPaKpZ^@c z^WCv`j}}?aIGFzFGci0UCkObae@88fjO|&PNUW}IoPX@t67AW<+H>0ZpOO9F`)Bzd z_};(&nehLweObO@Wl`~})g`5uURJhdZF%T&n%nhPTv@f@Dl2AFrshwZKI7b(v(7tz z_MEvF6wI5ypm5=$#Y--{=>IzA|GVLTZ?W)O;eKzi2>kEH>;K62|DP8V!{xC)lv{2M#_Euzo)7|8?J4MtL@KwB5gC ze~NAYDeS+xvvcPF`EcjqolC#p|7&)bF4&?Z^A7&tU_dT8c^Z%fKUwKh>*{Hy z^M9AGwg0x*{%*7V{jc&ko-Z5WtRd@?`dXAuH#AJY?llKp}D-JohZi zZ2|nv+4zMy)2Q+ba3J4j@~L@zr6Vi<5*$TV-Vc(eF@FtD;sr1aIS;-Ylwe2s5m1G! z+yS;AE035)x+5#^293y#@bc-5;~|IOU)ypMTsTW)GX4kQ%UNeofUN5cz5<6yXXP2J zJLp1Io&(bGM|mljjI3)Crp?7KWL=jqmo*7yd4OL5TX3s*hRuv_wjk?ThB<}gF@6@nA)sgGD?g+3S{MXK`XNI2cQF4 z`BUJVL4AQwz7RX4v+_pJfvkKtIEq{kH`8U?g4_y!0rWgb<+5dzRi07#8ZZpG8vYHK zi5=xZ7c+u`teg+ZkPG0uz&2#%SAW2jZ^+8;gMG+h_{mF16XYg%bda|aT}LRKCCG~boifL+*EUJII#LvZ3M@`*SH;JZqAe%#i>>7|q_cAZt8gYbty z+odqv_ip@UkAm{$pcz^DTF{AH4L=Fm&SQ-V{C98|S$Wt!lq=*M`273Okqh7kpmnDa zF8e8Yhj|G8F&H!3XR>=2`G~BX27<`SnV=F`d7N#oyaLo?9)frNg1kU(gl}rJ%2F-- zCh*MR9RX)NPP!l~p9*r3^Wf`&?!{4lA9(Ob`JW&YS)QPNfduR*KMT^3m3KZ#dLk<~ zg92n_|1XI@vT`PauYn{ zIr5sgDgXR=>N~RXi=YcR3>&|tO`t3(=YV!CSMU!&7+JX%c<@vCc94u*54Quo13|g> z3*;TL@(>V2R-Ot%$OZ6U!DeK6k#zbUbq(1MpZ$B@8OV9Cu7fk%aQMRgy!$W@!aoIC zHtONFmq@z{c<;a$9iW`d<*Y<_|I6elvT_^fMDBp!c!lRx89wV((i&O$HIRd>{7kF9 zOME6Te4ToPtb8#DAuF!~)yT^4{eg5rR_+3g$huB%GuTF%QSJh}k(FECAfCv|ouCa_ z`LEzGvU0+kw8O}{)^8HfeQ3Jouhf=x?cY7NtZM-G+p?|&{D&>;n!uBQy4AITi)~rg z2;O4Lx>oRMTh=v$AK7wb?O+hMx`yzbKk=?d)-{1k4qERcT^slnn1;Eo_xl0RdgC)ozcoR^6l>Y?kkd-?@BXSr{c%S@2R`z~C z{vj)m1RcoL@NGctD1QjT$jYAr-#q+*k8~0iZD|<(4s7RHl;8Z2dWx+4N3ajM0}g{6 zWaX(J(a%9v&Ie178{rp#w!O+DKPDY8R~`qpAm_k;0m<|62Of5qx=MVM+dd&q$jWa3 z4|Y1>zkp?!D?jiVej+RH0$Y$9;jcg%vU2+o+GJ#9&z~s+$bR@dupL?1{W;HwtUL&` zAXoo|u_>VCQ`r-yjuQvv!5|ko@K@>)n1-x;(ig-HS-A*QA~VlG!LZvC_*cMuH>v!k zB{#vJer3tEU-O>&hP+d^@ISw`%B}o6&j*?@@A!_sjA2M{0d*N(<~3v+auD{#8`6U8 zhc_l#av;f&qu>B;*_0=50hK#ocPe+?t9|(50ftOdf8gl@4GCkX04@s{l8t%o5JMgr zZb&`mjd11&!|XG+!s%lS*^GGr{sGWu48lJJ+OMvM8^#&38#{hBF}^z9FyG^?@ExZc zQicEZaMxr*8j)NC$EgylV!sh6}HrWte3(1kXFqGB22i{Uz+BT8Mr4^Ggh= zMh?Sgt|mTtZ zE&M3hhphZQXhBx4e!!4J$jY@KtoGqAfm}%Yu#0p8W*i2U+=-U^}w%r(id77#_A8bDm3i2H3caZ$|h|P>ZbmDAKR4wIQ0Lx>vGswyrK+k$meh} zvg{~d299E`yapr?hY)-{(6mxM@0YZ9m@8iZCL$NWMJi)QxeLt1T=^@o3|aP)&Y%pr z5uW|DB^SWof-cH~{K}A%pP^3iyvmpDqfQ|!Uj=3&SHr&s`aV*A;n%cv#94Xhvy?65 z9JmN*8B@Ly>_%3812iEke+t@=l~aFXNGEb_6M6AGaYI&?-;(dh%8g(PvhpiH#|o5x z{vz=tT;=yb5po#L_#JtNedV|o;)bkT^n20@S-A|%Mpk|fEJM!O&pk;mS?#$WZU^T3 z4sJPMy?2^k#-CTLbgO;UU@sc_CB*GDLw*a=kd>c&gY-mJei0NRSGOB-570DJ9)6Ix z{lI7PY~*Rk1@LO1eM05Z8HF;`COApMa8@K~UBl&=HJFjsB>mB@|oZ-LeYjgLqQjOPg4cgyaQ;8$@UTy<=gool0R1j#f>(S-8V1>K1HTM1 zk(CdET;vWo;|S#hS$P{ML{@$clp!m>4XTkj^g~Vp+Xz=V?sL)#S-CH0M)t#}fi`62 z7SMsL{3`esxfSjm#y);3r-F85<(1$FvhvQqk`Bvx2f_QmFl6OXUl4y}3dSHS|A9TIlaV{%*Cr7Ed}R3X(_CgpUIYe zf0RF8!yVw*55sdp zmVMN|1BvU2-1qT}EFH9=3z@L{=USa*=c3Ge86Om1{vGvU1f<$|16H4LFRf z+yssyD<1+?$jUhnP#%z#CxJTTJa{pf&2uSV0hS>v|6~_=fvmg(Y(ZAu{Gdy=BiF(^ zfPRZ9Pk)GVi@EZ-pb5DEPXC!z_XF@3wk!?Q3E;<$@*^OCto#(1jNAkt0Qw$R{sbH? z^_jfs5y}AZSKbN&$jXZzkRV(JH2%srf>xeOIq6BtDzfqra1>ej z9pJ;C4*0gcmOr)dcA)+!KLv`gqdfap|juS$PqtLk_|lf!+zP{LG8A z&&bLtza#Ik6M!cJwWEB?e&Ua;{1IqI4#O!g(e7bi`Gc1^XC}nE6+Q|kBg-q)7oc-e z$|t`{+G4I82Hzqp{~hQV^~&p7Dci`(kAcm|%6Gp;x*;n+0QMj&KLMJNl{-KivhwMF zAbpVY;Ep!hN$RZfqJ!8$4#MBQWtp?gTQV^0nX)vhodGlq+QAJAsFA>*1Gx#zFb{ zuX#pf<^A9gvU2k`xJ6ce19*r-2mB9}@l!eDTjGzb{OG@v4#>*SfMv+aFMLNjAS=HK zHY0by?tfZ!LHQRhw^XfTejk1nG$Oac?chiS>Zgq1cLi>hF9yqyl{?3} zC4{W(8OIq5$jbdsc1t~SK$)|<4?qfPTx8{aU>b490;4tRO4}-uJlz;d!Fd4ZCeiNu2<@9O916er>__31*U&)yhvyo+n zTMo`5yeml`_^tEFJC))4=2C{SQx87_^o&pC4?!EUa=!}*3poIn1AX=o{3y_GbL9^} z8FrLE0oBN1IIh4dOUk1`E#}J8!7gOwi@;vwAgp)U7giA#9J%9OdH+Jn3FgY5f_CIE zT(y|=MXrV?EV1%553anBvrjQs{v6~WD;pP4PLTa@5bPrzl;2p&`5ef~r!6Brk(C#K z1ndXl0T&ZD%#|mAGGyh-OK3xom7f6Hk(FNtyOEvu+b68xe65xEvw?AbxNANBAS(~O zg1dZ?l`jW%$j&?N_hXh*MVv8LUIbc^gYeTp=eU)}Y#_ggv+_b9Y6rd?=p4H8Jy%gq zFju}8WFyzZxz(i40?H4(9dux>Jn%Zo39|AOkZ=|4101=#T{&x$Tee)yxG_8w>_T?l z3-7!$Uhk5B^9I7hj`C+uUo>%I272-kVPz20+QcN@=zx$?h( z!^p~SfuqPB@Na4;FJuXn>IHsB}mQBDDSkOT0#hw&4+8g@T|ooS>Yoc$hX^*;G$f603dx5_O*aI5?V@FRD?5B!SwTtgZ@ zLz?{>`lIS+mV=sKkiIC8hT^7GI0-p5bnKY&W)4!EV6 zvWwgbA9&H0;mDot%12vBE9@wz{GRkdcHV)mccBk>m3XQ-9Jy;<`7_XrxpLuayq}Pr z_ub!)*;B8RwmhTqtDp?oc}Kn8UH?%#al>3W;ZOL3?7Y)k@Af{clV_+V9pK1))XHyw z>`k;+@WKyyFCaVb)zs7#!gAhK?YzfY@3X$)Z-k2-<-0&Fvhr?FkL3@LAvCr=}r%0BD_Rg*naN><@6O zm3#qaW5;>-yYpW7dap-n;yf&@;d>VD*#o!8%6TAL{fFm(iO2=;IX;gxX&Hu}@5x@lxf~6dGMv&$E>pRE@r)>xf6VQ6W|cq{82-4kzQ{u++l z)vcV&d2b=il?Q>%$N@NVPq*?8unlwN$erBE-+*S!mE%@{|qx%3H1wenQ)o)$j{I>rpG5!dZVRJMW#=`>5w!LH^>u^0i>Mh6VqEJ1Yv28{w-q zkk{%bJb-fpb>D~cUT3}Ux%UrAbL=Sh=B&VN$a-er(oH-gvYr_@bhFjYJMT7Lg<1Ly zJnxTaV`05h`4F=6Ze_i5`H`E659Z2yK?vD-ceC?eXT9Hf&aI>oc9eezh9N6o19Fj_ z_b}`I%pZd-m@9t)b|E|O`qevthi@aVf6TiEJ{1%p=fR(Im+ui|=N-O!w{O9{yk9U^ zz8UO8u7$67z#~Vu5C?e2F7C0#yb*r(A)XQQCOC3`vh!|ay)(JEfi@F6${WC5WaVo> zi~0$F_b~MlSswAo&w!2(R6oicVU46O=FWSd^?vA&9wV(VS1x>7N>yBpbg&#vCToAf&6mT;9b!7}6k9JyoHd5^B%ueB${lT_ zKeF;C-~e(Me)b@30kZSXVCQ|pde87fhj@lt*>3{B1CAmq4}P2Sj9cej#?E_=op&JX z-N?qfyf1L8JQ8d{R(`UBa)PY*UEEu%Ybl-g*Xq5tZ-5-^D1Qg0A?JKUe7~d4BFjIy4;W~_f)&P+U~tF64Bjbl z}+F>30?=jMOMBQB-}wASGMoWRQ>?WzLT*d*yHm`5wh}!oVQ$w z?7VMP?_qtbk5_W>Q~BS)Ol0ZHU2rMH4g2-*+uQ|ll(3w4X6jvYb=>fNj`OzWa2qG$1QK1ok2; zw}Dpm2Y!J&d^?bxckMdw;dS28t9SRh&fyt&7UfJ3LROv*s*#m12DQk_MW7y8dA)63 z4fmb#|Fw7i;ck_M9Y3&pZ-W+}xOICXs~VnlJV7f)tSpbB1bUIcN(oSClqxB$65&!Z zta@=p0xOz_RSB~|#1>9|-JJXmD&1wYCB>?70}V(uLY0WcU7(J*Rmf%w`+Re9@u2g+ zZU5+fo^Li&1@^a^#Zb_@Zv^f z;hWHPp`E+r%nwzr=ms*EAES*& z203$0`j3yp)K^(YDuzmBGvXYsfn&_3Ro)2IBtAEARLugl<%k&)q; z!ui}jaeJ3*CgtK?XbIk#)2IBt5B-qmGRnmdqY&Pi)2IBtH$KihP%gd+P2ru{i^^nN z`vli1`Y8_3PP{XFQJIXp&_k4qyHOAC%wAL`<8@>%_9+)XgT@%6GkZ~)jPE6LaS`R> z`;ZUs%wAL`;}H~~Tzm|X7SGKMP)J`L2b&#m(YH^_bHx(knWwFnXSrly%n{#ah|~Y4)9!qcjm(? zCwA-8tO3f!+t4<=Gjn#BMf)?>Ead_CZnOsP%y?Dy>jQJ#$51Z*2Xb?M8qbjX-RHhY zZNm8+T(S8J>QFAa{+;!ScV_J>gIBq_7S|$iK5ti?LkB4rk066>oq2}JIaFrhwk)4d zfb&^~V&g^DHRa;dsE2oECOWehmC2}l#Q=4jIg83)%>E~RqFnq(vxd>uolD`YU9P9qAuQDEb=Snd#@u`%@0!ZDSKgmpbCzsE-%- zAfrGZ;I-pq;)LlNoX>$2e~8>U{=XqyFfm~)!8>yweUx2+mQgO=i9&d1)}t~Yk6JKc zL@5_fM$`BpoX>p}Gbl;9_$V^*&U{DZKHljfmxOY04|)ji%yv}f<4STI_fsx@0v*C9 z;C$Aj_yQVZ9>h13-RQx4;e6JkxE1**7k8mk@y={VWj-!@?S!#{a`8hbsygtlg%idm zj=Mpg?O~*Q8)tT+G8I4VW-N`i&369Z2^i&dfsP84ix8 zKkQ5V++R!>3498E-N)SFof(6}ticmG--^6OfOn%scxQ&7vIQ@E3v)`jxE6)*ao9z= zN9w^pc`I|WoaZcfGt&FvDfqgjb{#jILc_l=z%6eh?}&C<@J%P#*z&kSwoq2}J zH9X-I@}+4<^rO9aaT$6HAA}Dg-II6Vdjqu3{dN#4Q*eqp&TK(t4nBDr>yG`3uQ{E0 z!HY}LHoU038I_ASAszQ5{HZ+G2jdLp5H+deg?pBB{lWL(Nt5&k?}rJbZN=Nqq)(Km z;o|pm+)KQcgy){c{_tV=d8Ff;f_ssUop^hQbxWNztRS^ng`u;#22w8Gi!A&sJn*y97kJ{xfxN_vf@b-~U!)K7@_8>fWt-aqUG*OB^H{s(bjqkyU%Xm!Vf~%2* zkHFoiiEqK<*V%0@fj1zX&zoUnJ#%t4_2Fem<4VEzT)}z9wx_~nS8|=f2jL?(FsJw) zeC_ARAFZ%oIG?#F-f}bRmU6L%!uTd!^!N7pDV~os#u$8di(P&YF8Ms?EA_>v(G>m= zY<_{~FSP^z3u$f-!_~LgeluKtE9;XwlQ4r+ClBB9MYgAWDNG~nSG;R0&nc9f@F%E; zKLB4sng@fd#p96tVz_GL*T6f_!Yb{+`t8gEbJ&E>qA|*ScaRx}v~3thM_$~H)He&x zjl8%#ZP$;$sgV~qjl6iz$bSv)9eMEp^0QxY`IqeWC*hq)eb@&7>Q4K(hvCC0O#Q=f z^)|+akHXh&XMWD%n8K5g{ub$npF(P<1z&fUJ%?`SM=BS?BQJgfX^d?+ez*NR=z?dV z&Fm`#Z$f>15}|a;hEzwak9-rp zF!BRe4YgEM;eQ`xMH^{o`=-WFuVaRs z`YTzJj@hVWi_L#z$V9sIza{cf(~3<{U3>LfTgves|=JCifxtP>(v( z@aV5n2R{any_a#R9eBqMw#TR8%zYdid=u{ZC!P!Od*M^}lZl8w0PotxnyIrk;Tv~z z-$P{J7*S^{yx>9lfL{d{ejVY(DWrK5lOr#l{!P|C`bK#&|2$!|s6Pw${tL$vFTRXSyzvm@Ksvrd z;&l$R;NemE*uxXN2W8LmG8jXL*jB8eNQ1G%AEQNh<2#(U9gY`%FZ}Q$j0GQs!ACjP zcyT-0gg4=F-?R6-7+#KaOylsD$Lv0*;B!djWBVqI8^1p~KjAK<@)rEX$RC2o{lK1w z#qeg-VP9$ZO{9Ld;fqLfwWZ5>^0+;ROW|cm>v{`Z_JmzW%%TC?=HW5>?Ri@W??<}c z?u5txh_N?$zJNbQn$I3w@FdSADu*v3&G`V{-s4(Fxd~$jIDhbQIQBGS#EZB7jP-!u z3QNy0hxjTy<5|vI{3N^tX)J5tZ6lwCfBc-iuSM`ar1NAaTzHTInU8Z z?`gE)yZ+5?GXVFZMfY$_;YH80Jw5^_4{<+(7vKL&UMt~4aP14WUk@L9k?koL9~jUk zz6Eo?V$AqFyy!5`J@^Prqv5)SFCvX=0GA)J*WDz%4(b1rC*TV&(VwqS2Oe!K7=B)N z491a;qu53|7Gme91;!HUFFtyKu^j2MPm}Qc@dd^*%2&Y~k@mY8W{~=mhu(<=MuZIUmvcz3qWlrEV@@2~5 z?Z}Ncp>oO>a$hYf!(3ie4!OLj-0&1$RCf14yr``0jkF^w%U1P=nYLu3$}7)WS;6w6 z@>S(UW$em}%F2}&m2)dED$7=0R9>yTs9aikQQ4mIqB2(HMP-@Fi^?387nLb0FJ3qD z%KkJ*o*U|38!; z!$&tlJQhtHW9;O=U;gIL&ZC!6bTJ8^m-6qK!>rG zy=Y%*$mVH!kRLw%H!QV(v;SR8HNG9h*l1j1e9YKjTuy5rGp3A>(DDZ3qsG-#<0}=Y z<0qfgPco@^nZ`jz>9LeAr_NP8cdVuUwe)5!zkOub_*p!1H7%;OrG|Id;=18Cbn_HL zdMe*kG}_lBH9l^v8}=biUp~fm8-{I6;V&~j#p9Q;53eyv>gfs|S!!^f_saGc^Y}Hi z@ayf~!G2Cg@1SmAxG#-o8tl~lChpgr`YZsGF|z`3AVX>xP?X`_LT?XRYP zpJ1*wI!3_TG{YGR4`=x*TDzRzy~EzE$E~BMI`=eZuWsWvXU;iqlWfB`D$&|Cuk`fS zX9eG>$N9uJ5A&#w{l^*4+E*RBW5)P^+wa4Vm*-5z8O_GB@$7Uqku|ecwwY~bJK1iQ z2mA|kJuq6CcBYf*X3T(P3=o~WnlX1!T&)jRcGyy#LaAr@%FO)tdVo)yg7d^m<#8k zxp*#-OXbX5GuO&>a=lzXH(PF%+hzLETEMx?cVQO11%Dw>2o^$xa3NBN7Gj0zLZXl? zqzdVRJzMQUw=h@e7X}4m#x;{DCX1S?q_AcWdR9uYM$7n;0G{z{CjL>3qZALa% z9aLS6$X5&0LbXUOR-3LRYw4O*o2|8L-P&AjP;=EibzePD57i^}Sbe<f%W%eYW1N zck6TYLEY8xG<=OfBh-jAVvXrWvXO3BjoC)K(QV8%1`Wf_>pjhw=`np~zzmrYGiFYk zNi%I)=B(K^yXKrZFkKl>#+M0XLYYV=mYL2ZGwF<#nPqi$GjkdKvYPc|ec3=Zl#Q^W zr?bgyn)N)(dhU|vGRV4eo}4ci$c1u|Tr4-8OXku!D>s{K=eoJM+#u)5d-A?~ARo#{ z^0EAMKABJFt^91ho$u!7@`Jpq;3*hhUMp~1|F71Vk$304d4E2b59g!#cs`L&<;{FE z-^zFLy?j4!6zo+OWW_}baaLQ3mDVh@3Y|iab!N=CXS_51ncz%#COQ+JNz9~X%$ep) zYo;^Po9WLOMR(C#^cRE0a4}kp7Za>UleO4l9rjp*2J6pj`K_Q8wxU+tN?0k&w3=4S z>R3IiZy61SPrS(9=Ta%U6VU_j&*RQsQ zpZ7F5_ojze74Iuo4E~TjyiYJp7gt>m*Igf1-T>F$5Le#_*WVad;AyVGNv^_auEQ2r z;`q$$OqUh!VYSDYTV3sRh3m75jgpJG^Duip<}bi%4zr%4tmrsvI#JR!;}1XopEK~^ DmbNG( literal 0 HcmV?d00001 diff --git a/Wabbajack.App.Wpf/Resources/libwebp_x86.dll b/Wabbajack.App.Wpf/Resources/libwebp_x86.dll new file mode 100644 index 0000000000000000000000000000000000000000..62094675e628f2d479bf8529982b9134023a16be GIT binary patch literal 520704 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 z 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 literal 0 HcmV?d00001 diff --git a/Wabbajack.App.Wpf/Util/WebPWrapper.cs b/Wabbajack.App.Wpf/Util/WebPWrapper.cs index e0acad2b7..df556d415 100644 --- a/Wabbajack.App.Wpf/Util/WebPWrapper.cs +++ b/Wabbajack.App.Wpf/Util/WebPWrapper.cs @@ -918,9 +918,9 @@ internal static int WebPConfigInit(ref WebPConfig config, WebPPreset preset, flo throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigInitInternal")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigInitInternal")] private static extern int WebPConfigInitInternal_x86(ref WebPConfig config, WebPPreset preset, float quality, int WEBP_DECODER_ABI_VERSION); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigInitInternal")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigInitInternal")] private static extern int WebPConfigInitInternal_x64(ref WebPConfig config, WebPPreset preset, float quality, int WEBP_DECODER_ABI_VERSION); ///

Get info of WepP image @@ -940,9 +940,9 @@ internal static VP8StatusCode WebPGetFeatures(IntPtr rawWebP, int data_size, ref throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetFeaturesInternal")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetFeaturesInternal")] private static extern VP8StatusCode WebPGetFeaturesInternal_x86([InAttribute()] IntPtr rawWebP, UIntPtr data_size, ref WebPBitstreamFeatures features, int WEBP_DECODER_ABI_VERSION); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetFeaturesInternal")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetFeaturesInternal")] private static extern VP8StatusCode WebPGetFeaturesInternal_x64([InAttribute()] IntPtr rawWebP, UIntPtr data_size, ref WebPBitstreamFeatures features, int WEBP_DECODER_ABI_VERSION); /// Activate the lossless compression mode with the desired efficiency @@ -961,9 +961,9 @@ internal static int WebPConfigLosslessPreset(ref WebPConfig config, int level) throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigLosslessPreset")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigLosslessPreset")] private static extern int WebPConfigLosslessPreset_x86(ref WebPConfig config, int level); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigLosslessPreset")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigLosslessPreset")] private static extern int WebPConfigLosslessPreset_x64(ref WebPConfig config, int level); /// Check that configuration is non-NULL and all configuration parameters are within their valid ranges @@ -981,9 +981,9 @@ internal static int WebPValidateConfig(ref WebPConfig config) throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPValidateConfig")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPValidateConfig")] private static extern int WebPValidateConfig_x86(ref WebPConfig config); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPValidateConfig")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPValidateConfig")] private static extern int WebPValidateConfig_x64(ref WebPConfig config); /// Initialize the WebPPicture structure checking the DLL version @@ -1001,9 +1001,9 @@ internal static int WebPPictureInitInternal(ref WebPPicture wpic) throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureInitInternal")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureInitInternal")] private static extern int WebPPictureInitInternal_x86(ref WebPPicture wpic, int WEBP_DECODER_ABI_VERSION); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureInitInternal")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureInitInternal")] private static extern int WebPPictureInitInternal_x64(ref WebPPicture wpic, int WEBP_DECODER_ABI_VERSION); /// Colorspace conversion function to import RGB samples @@ -1023,9 +1023,9 @@ internal static int WebPPictureImportBGR(ref WebPPicture wpic, IntPtr bgr, int s throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGR")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGR")] private static extern int WebPPictureImportBGR_x86(ref WebPPicture wpic, IntPtr bgr, int stride); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGR")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGR")] private static extern int WebPPictureImportBGR_x64(ref WebPPicture wpic, IntPtr bgr, int stride); /// Color-space conversion function to import RGB samples @@ -1045,9 +1045,9 @@ internal static int WebPPictureImportBGRA(ref WebPPicture wpic, IntPtr bgra, int throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRA")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRA")] private static extern int WebPPictureImportBGRA_x86(ref WebPPicture wpic, IntPtr bgra, int stride); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRA")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRA")] private static extern int WebPPictureImportBGRA_x64(ref WebPPicture wpic, IntPtr bgra, int stride); /// Color-space conversion function to import RGB samples @@ -1067,9 +1067,9 @@ internal static int WebPPictureImportBGRX(ref WebPPicture wpic, IntPtr bgr, int throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRX")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRX")] private static extern int WebPPictureImportBGRX_x86(ref WebPPicture wpic, IntPtr bgr, int stride); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRX")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRX")] private static extern int WebPPictureImportBGRX_x64(ref WebPPicture wpic, IntPtr bgr, int stride); /// The writer type for output compress data @@ -1097,9 +1097,9 @@ internal static int WebPEncode(ref WebPConfig config, ref WebPPicture picture) throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncode")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncode")] private static extern int WebPEncode_x86(ref WebPConfig config, ref WebPPicture picture); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncode")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncode")] private static extern int WebPEncode_x64(ref WebPConfig config, ref WebPPicture picture); /// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*() @@ -1120,9 +1120,9 @@ internal static void WebPPictureFree(ref WebPPicture picture) throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureFree")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureFree")] private static extern void WebPPictureFree_x86(ref WebPPicture wpic); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureFree")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureFree")] private static extern void WebPPictureFree_x64(ref WebPPicture wpic); /// Validate the WebP image header and retrieve the image height and width. Pointers *width and *height can be passed NULL if deemed irrelevant @@ -1143,9 +1143,9 @@ internal static int WebPGetInfo(IntPtr data, int data_size, out int width, out i throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] private static extern int WebPGetInfo_x86([InAttribute()] IntPtr data, UIntPtr data_size, out int width, out int height); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] private static extern int WebPGetInfo_x64([InAttribute()] IntPtr data, UIntPtr data_size, out int width, out int height); /// Decode WEBP image pointed to by *data and returns BGR samples into a preallocated buffer @@ -1170,9 +1170,9 @@ internal static void WebPDecodeBGRInto(IntPtr data, int data_size, IntPtr output throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRInto")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRInto")] private static extern IntPtr WebPDecodeBGRInto_x86([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRInto")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRInto")] private static extern IntPtr WebPDecodeBGRInto_x64([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); /// Decode WEBP image pointed to by *data and returns BGRA samples into a preallocated buffer @@ -1197,9 +1197,9 @@ internal static void WebPDecodeBGRAInto(IntPtr data, int data_size, IntPtr outpu throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] private static extern IntPtr WebPDecodeBGRAInto_x86([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] private static extern IntPtr WebPDecodeBGRAInto_x64([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); /// Decode WEBP image pointed to by *data and returns ARGB samples into a preallocated buffer @@ -1224,9 +1224,9 @@ internal static void WebPDecodeARGBInto(IntPtr data, int data_size, IntPtr outpu throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeARGBInto")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeARGBInto")] private static extern IntPtr WebPDecodeARGBInto_x86([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeARGBInto")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeARGBInto")] private static extern IntPtr WebPDecodeARGBInto_x64([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); /// Initialize the configuration as empty. This function must always be called first, unless WebPGetFeatures() is to be called @@ -1244,9 +1244,9 @@ internal static int WebPInitDecoderConfig(ref WebPDecoderConfig webPDecoderConfi throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPInitDecoderConfigInternal")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPInitDecoderConfigInternal")] private static extern int WebPInitDecoderConfigInternal_x86(ref WebPDecoderConfig webPDecoderConfig, int WEBP_DECODER_ABI_VERSION); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPInitDecoderConfigInternal")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPInitDecoderConfigInternal")] private static extern int WebPInitDecoderConfigInternal_x64(ref WebPDecoderConfig webPDecoderConfig, int WEBP_DECODER_ABI_VERSION); /// Decodes the full data at once, taking configuration into account @@ -1266,9 +1266,9 @@ internal static VP8StatusCode WebPDecode(IntPtr data, int data_size, ref WebPDec throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecode")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecode")] private static extern VP8StatusCode WebPDecode_x86(IntPtr data, UIntPtr data_size, ref WebPDecoderConfig config); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecode")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecode")] private static extern VP8StatusCode WebPDecode_x64(IntPtr data, UIntPtr data_size, ref WebPDecoderConfig config); /// Free any memory associated with the buffer. Must always be called last. Doesn't free the 'buffer' structure itself @@ -1287,9 +1287,9 @@ internal static void WebPFreeDecBuffer(ref WebPDecBuffer buffer) throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFreeDecBuffer")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFreeDecBuffer")] private static extern void WebPFreeDecBuffer_x86(ref WebPDecBuffer buffer); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFreeDecBuffer")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFreeDecBuffer")] private static extern void WebPFreeDecBuffer_x64(ref WebPDecBuffer buffer); /// Lossy encoding images @@ -1312,9 +1312,9 @@ internal static int WebPEncodeBGR(IntPtr bgr, int width, int height, int stride, throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGR")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGR")] private static extern int WebPEncodeBGR_x86([InAttribute()] IntPtr bgr, int width, int height, int stride, float quality_factor, out IntPtr output); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGR")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGR")] private static extern int WebPEncodeBGR_x64([InAttribute()] IntPtr bgr, int width, int height, int stride, float quality_factor, out IntPtr output); /// Lossy encoding images @@ -1337,9 +1337,9 @@ internal static int WebPEncodeBGRA(IntPtr bgra, int width, int height, int strid throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] private static extern int WebPEncodeBGRA_x86([InAttribute()] IntPtr bgra, int width, int height, int stride, float quality_factor, out IntPtr output); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] private static extern int WebPEncodeBGRA_x64([InAttribute()] IntPtr bgra, int width, int height, int stride, float quality_factor, out IntPtr output); /// Lossless encoding images pointed to by *data in WebP format @@ -1361,9 +1361,9 @@ internal static int WebPEncodeLosslessBGR(IntPtr bgr, int width, int height, int throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGR")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGR")] private static extern int WebPEncodeLosslessBGR_x86([InAttribute()] IntPtr bgr, int width, int height, int stride, out IntPtr output); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGR")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGR")] private static extern int WebPEncodeLosslessBGR_x64([InAttribute()] IntPtr bgr, int width, int height, int stride, out IntPtr output); /// Lossless encoding images pointed to by *data in WebP format @@ -1385,9 +1385,9 @@ internal static int WebPEncodeLosslessBGRA(IntPtr bgra, int width, int height, i throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGRA")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGRA")] private static extern int WebPEncodeLosslessBGRA_x86([InAttribute()] IntPtr bgra, int width, int height, int stride, out IntPtr output); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGRA")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGRA")] private static extern int WebPEncodeLosslessBGRA_x64([InAttribute()] IntPtr bgra, int width, int height, int stride, out IntPtr output); /// Releases memory returned by the WebPEncode @@ -1406,9 +1406,9 @@ internal static void WebPFree(IntPtr p) throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] private static extern void WebPFree_x86(IntPtr p); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] private static extern void WebPFree_x64(IntPtr p); /// Get the WebP version library @@ -1425,9 +1425,9 @@ internal static int WebPGetDecoderVersion() throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetDecoderVersion")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetDecoderVersion")] private static extern int WebPGetDecoderVersion_x86(); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetDecoderVersion")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetDecoderVersion")] private static extern int WebPGetDecoderVersion_x64(); /// Compute PSNR, SSIM or LSIM distortion metric between two pictures @@ -1448,9 +1448,9 @@ internal static int WebPPictureDistortion(ref WebPPicture srcPicture, ref WebPPi throw new InvalidOperationException("Invalid platform. Can not find proper function"); } } - [DllImport("libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureDistortion")] + [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureDistortion")] private static extern int WebPPictureDistortion_x86(ref WebPPicture srcPicture, ref WebPPicture refPicture, int metric_type, IntPtr pResult); - [DllImport("libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureDistortion")] + [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureDistortion")] private static extern int WebPPictureDistortion_x64(ref WebPPicture srcPicture, ref WebPPicture refPicture, int metric_type, IntPtr pResult); } #endregion diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index 49ea479e7..3602270a4 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -69,6 +69,12 @@ + + Always + + + Always + TextTemplatingFileGenerator VerbRegistration.cs From 8275c71e43073b209cf10666ad2362209ee86b18 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Fri, 29 Dec 2023 00:19:08 +0100 Subject: [PATCH 029/294] Get normal version of image instead of thumbnails for WebP --- CHANGELOG.md | 4 ++++ Wabbajack.App.Wpf/Util/UIUtils.cs | 2 +- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 1 - 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 623fa999a..534f89c65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ### Changelog +### Version - 4.0.0.0 +* The entire user interface has been reworked. + * Modlists with WebP images now load correctly on Windows installations without the WebP image extensions + * The search functionality has been improved to better show relevant searches on list titles #### Version - 3.3.1.0 - TBA * Fixed `--outputPath` not being used for the CLI `compile` (thanks to @majcosta for fixing that) * Improved Log message for cases where low storage on the drive Wabbajack is installed on causes compiles to fail diff --git a/Wabbajack.App.Wpf/Util/UIUtils.cs b/Wabbajack.App.Wpf/Util/UIUtils.cs index df8aba191..ed3bf0550 100644 --- a/Wabbajack.App.Wpf/Util/UIUtils.cs +++ b/Wabbajack.App.Wpf/Util/UIUtils.cs @@ -150,7 +150,7 @@ public static IObservable DownloadBitmapImage(this IObservableall runtime; build; native; contentfiles; analyzers; buildtransitive - From b9656896d7b08c6cf7a7797d60a168a41468c792 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Fri, 29 Dec 2023 01:21:08 +0100 Subject: [PATCH 030/294] Show 3 tiles next to each other by default, styling tweakings --- Wabbajack.App.Wpf/Themes/Styles.xaml | 26 +++++++++---------- .../ViewModels/Gallery/ModListGalleryVM.cs | 1 - Wabbajack.App.Wpf/Views/MainWindow.xaml | 2 +- .../Views/ModListGalleryView.xaml | 16 +++++------- Wabbajack.App.Wpf/Views/ModListTileView.xaml | 6 ++--- 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 03dc6f79c..8052de5cd 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -152,7 +152,7 @@ - + @@ -453,22 +453,22 @@ + x:Name="Bg" + Background="{TemplateBinding Background}" + SnapsToDevicePixels="true"> + Command="{x:Static ScrollBar.LineUpCommand}" + IsEnabled="{TemplateBinding IsMouseOver}" + Style="{StaticResource RepeatButtonUpStyle}" /> + x:Name="PART_Track" + IsDirectionReversed="true" + IsEnabled="{TemplateBinding IsMouseOver}"> @@ -480,9 +480,9 @@ + Command="{x:Static ScrollBar.LineDownCommand}" + IsEnabled="{TemplateBinding IsMouseOver}" + Style="{DynamicResource RepeatButtonDownStyle}" /> diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index a93369748..bd4821fbc 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -184,7 +184,6 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL .Filter(showNSFWFilter) .Filter(gameFilter) .Sort(searchSorter) - .Sort(SortExpressionComparer.Descending(modlist => !modlist.IsBroken)) .TreatMovesAsRemoveAdd() .Bind(out _filteredModLists) .Subscribe((_) => diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index b1f7bd43f..26b27b92b 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -64,7 +64,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 8a90c7a6e..f1546e02f 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -22,7 +22,7 @@ - + @@ -149,10 +147,10 @@ Foreground="{StaticResource ForegroundBrush}" ToolTip="Show modlists from external repositories"> - + - + @@ -167,10 +165,10 @@ Foreground="{StaticResource ForegroundBrush}" ToolTip="Only show Not Safe For Work (NSFW) modlists"> - + - + @@ -184,10 +182,10 @@ Foreground="{StaticResource ForegroundBrush}" ToolTip="Show only modlists for games you have installed on your PC"> - + - + public partial class UnderMaintenanceOverlay : UserControl { - public bool ShowHelp - { - get => (bool)GetValue(ShowHelpProperty); - set => SetValue(ShowHelpProperty, value); - } - public static readonly DependencyProperty ShowHelpProperty = DependencyProperty.Register(nameof(ShowHelp), typeof(bool), typeof(UnderMaintenanceOverlay), - new FrameworkPropertyMetadata(default(bool))); - public UnderMaintenanceOverlay() { InitializeComponent(); } - - private void Help_Click(object sender, RoutedEventArgs e) - { - ShowHelp = !ShowHelp; - } } } diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 26b27b92b..5ba72d95a 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -109,11 +109,6 @@ - - - - - view.BeginButton.Command) .DisposeWith(disposables); + /* ViewModel.WhenAnyValue(vm => vm.BackCommand) .BindToStrict(this, view => view.BackButton.Command) .DisposeWith(disposables); + */ ViewModel.WhenAnyValue(vm => vm.ReInferSettingsCommand) .BindToStrict(this, view => view.ReInferSettings.Command) @@ -178,6 +180,7 @@ public CompilerView() .DisposeWith(disposables); + /* ViewModel.WhenAnyValue(vm => vm.StatusText) .BindToStrict(this, view => view.TopProgressBar.Title) .DisposeWith(disposables); @@ -186,6 +189,7 @@ public CompilerView() .Select(d => d.Value) .BindToStrict(this, view => view.TopProgressBar.ProgressPercent) .DisposeWith(disposables); + */ ViewModel.WhenAnyValue(vm => vm.AlwaysEnabled) .WhereNotNull() diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 66d1ae3cb..297265e32 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -93,22 +93,7 @@ - - - - - + mahapps:TextBoxHelper.Watermark="Search for a modlist..." /> @@ -117,8 +102,6 @@ Grid.Row="1" Margin="0, 10, 0, 0" VerticalAlignment="Center" - FontSize="14" - Foreground="{StaticResource ForegroundBrush}" ItemsSource="{Binding GameTypeEntries, Mode=TwoWay}" SelectedItem="{Binding SelectedGameTypeEntry, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" From 1dd4a642ef167ad5809858a63f962120427fdeea Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 27 Apr 2024 11:15:42 +0200 Subject: [PATCH 048/294] Compiler screen order changes --- Wabbajack.App.Wpf/Themes/Styles.xaml | 20 +++----- .../Views/Compilers/CompilerView.xaml | 47 +++++++------------ .../Views/Compilers/CompilerView.xaml.cs | 2 + Wabbajack.App.Wpf/Views/HomeView.xaml | 16 +++---- 4 files changed, 33 insertions(+), 52 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index d2afb1389..55d386b2b 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -105,6 +105,10 @@ x:Key="MahApps.Brushes.Accent4" options:Freeze="True" Color="{StaticResource MahApps.Colors.Accent4}" /> + @@ -245,6 +249,7 @@ - --> - - - - - - - - + - + - - - - + + + + + ToolTip="Link to the Readme." + mahapps:TextBoxHelper.Watermark="https://www.wabbajack.org"/> - - - diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs index ea0b812a3..78631f0b3 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs @@ -80,9 +80,11 @@ public CompilerView() .DisposeWith(disposables); */ + /* ViewModel.WhenAnyValue(vm => vm.ReInferSettingsCommand) .BindToStrict(this, view => view.ReInferSettings.Command) .DisposeWith(disposables); + */ ViewModel.WhenAnyValue(vm => vm.State) .Select(v => v == CompilerState.Configuration ? Visibility.Visible : Visibility.Collapsed) diff --git a/Wabbajack.App.Wpf/Views/HomeView.xaml b/Wabbajack.App.Wpf/Views/HomeView.xaml index 879b633d8..5987bedf8 100644 --- a/Wabbajack.App.Wpf/Views/HomeView.xaml +++ b/Wabbajack.App.Wpf/Views/HomeView.xaml @@ -22,19 +22,19 @@ - + + + + + + diff --git a/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs b/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs new file mode 100644 index 000000000..14bb0fef0 --- /dev/null +++ b/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs @@ -0,0 +1,18 @@ +using ReactiveUI; +using Wabbajack.Compiler; + +namespace Wabbajack.Messages; + +public class LoadModlistForCompiling +{ + public CompilerSettings CompilerSettings { get; set; } + public LoadModlistForCompiling(CompilerSettings cs) + { + CompilerSettings = cs; + } + + public static void Send(CompilerSettings cs) + { + MessageBus.Current.SendMessage(new LoadModlistForCompiling(cs)); + } +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs index 63ac5bcd5..b9c0ba34f 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs @@ -114,6 +114,10 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage _inferencer = inferencer; _wjClient = wjClient; + MessageBus.Current.Listen() + .Subscribe(msg => LoadCompilerSettings(msg.CompilerSettings)) + .DisposeWith(CompositeDisposable); + StatusText = "Compiler Settings"; StatusProgress = Percent.Zero; @@ -186,7 +190,7 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage .BindToStrict(this, vm => vm.ErrorState) .DisposeWith(disposables); - LoadLastSavedSettings().FireAndForget(); + //LoadLastSavedSettings().FireAndForget(); }); } @@ -240,6 +244,16 @@ private async Task InferModListFromLocation(AbsolutePath path) return; } + LoadCompilerSettings(settings); + + if (path.FileName == "modlist.txt".ToRelativePath()) + { + await LoadLastSavedSettings(); + } + } + + private void LoadCompilerSettings(CompilerSettings settings) + { BaseGame = settings.Game; ModListName = settings.ModListName; Version = settings.Version?.ToString() ?? ""; @@ -249,7 +263,7 @@ private async Task InferModListFromLocation(AbsolutePath path) Website = settings.ModListWebsite?.ToString() ?? ""; Readme = settings.ModListReadme?.ToString() ?? ""; IsNSFW = settings.ModlistIsNSFW; - + Source = settings.Source; DownloadLocation.TargetPath = settings.Downloads; if (settings.OutputFile.Extension == Ext.Wabbajack) @@ -263,13 +277,8 @@ private async Task InferModListFromLocation(AbsolutePath path) NoMatchInclude = settings.NoMatchInclude; Include = settings.Include; Ignore = settings.Ignore; - if (path.FileName == "modlist.txt".ToRelativePath()) - { - await LoadLastSavedSettings(); - } } - private async Task StartCompilation() { var tsk = Task.Run(async () => @@ -399,7 +408,6 @@ private async Task LoadLastSavedSettings() ModlistLocation.TargetPath = lastPath; } - private CompilerSettings GetSettings() { diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CreatedModlistVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CreatedModlistVM.cs index 47d987b9c..c229060d8 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/CreatedModlistVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CreatedModlistVM.cs @@ -1,17 +1,18 @@ -using System.Linq; -using System.Threading; +using System.Windows.Input; using Microsoft.Extensions.Logging; +using ReactiveUI; using ReactiveUI.Fody.Helpers; using Wabbajack.Compiler; -using Wabbajack.DTOs; -using Wabbajack.Networking.WabbajackClientApi; -using Wabbajack.Services.OSIntegrated.Services; +using Wabbajack.Messages; +using Wabbajack.Models; namespace Wabbajack { public class CreatedModlistVM { private ILogger _logger; + public LoadingLock LoadingImageLock { get; } = new(); + public ICommand CompileModListCommand { get; set; } [Reactive] public CompilerSettings CompilerSettings { get; set; } @@ -19,6 +20,14 @@ public CreatedModlistVM(ILogger logger, CompilerSettings compilerSettings) { _logger = logger; CompilerSettings = compilerSettings; + CompileModListCommand = ReactiveCommand.Create(CompileModList); + } + + private void CompileModList() + { + _logger.LogInformation($"Selected modlist {CompilerSettings.ModListName} for compilation, located in '{CompilerSettings.Source}'"); + NavigateToGlobal.Send(ScreenType.Compiler); + LoadModlistForCompiling.Send(CompilerSettings); } } } diff --git a/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml b/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml index 7ecb0cec0..18d9c7b71 100644 --- a/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml +++ b/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml @@ -24,7 +24,7 @@ - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + - + - - - + + + - diff --git a/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml.cs b/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml.cs index 462c559f7..66565f45a 100644 --- a/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml.cs @@ -2,6 +2,8 @@ using System.Reactive.Linq; using System.Windows; using ReactiveUI; +using ReactiveMarbles.ObservableEvents; +using System.Reactive; namespace Wabbajack { @@ -13,20 +15,24 @@ public partial class CreatedModListTileView : ReactiveUserControl + this.WhenActivated(dispose => { ViewModel.WhenAnyValue(vm => vm.CompilerSettings.ModListImage) .Select(imagePath => { UIUtils.TryGetBitmapImageFromFile(imagePath, out var bitmapImage); return bitmapImage; }) .BindToStrict(this, v => v.ModlistImage.ImageSource) - .DisposeWith(disposables); + .DisposeWith(dispose); + + CompiledModListTile + .Events().MouseDown + .Select(args => Unit.Default) + .InvokeCommand(this, x => x.ViewModel.CompileModListCommand) + .DisposeWith(dispose); - /* ViewModel.WhenAnyValue(x => x.LoadingImageLock.IsLoading) .Select(x => x ? Visibility.Visible : Visibility.Collapsed) .BindToStrict(this, x => x.LoadingProgress.Visibility) - .DisposeWith(disposables); - */ + .DisposeWith(dispose); }); } } From 836f102ec6efbd9a18f5c35c7178551d5e2aba83 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 4 May 2024 23:57:54 +0200 Subject: [PATCH 052/294] Rework how compiler settings are saved & loaded --- .../Compilers/CompilerSettingsVM.cs | 143 ++++++++++ .../ViewModels/Compilers/CompilerVM.cs | 244 ++++++------------ .../ViewModels/CreateModListVM.cs | 5 +- .../Views/Compilers/CompilerView.xaml | 2 +- .../Views/Compilers/CompilerView.xaml.cs | 117 ++++----- .../Views/Compilers/CreateModListView.xaml | 4 +- 6 files changed, 289 insertions(+), 226 deletions(-) create mode 100644 Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs new file mode 100644 index 000000000..5c514d102 --- /dev/null +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs @@ -0,0 +1,143 @@ +using Microsoft.Web.WebView2.Core; +using ReactiveUI.Fody.Helpers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using Wabbajack.Common; +using Wabbajack.Compiler; +using Wabbajack.DTOs; +using Wabbajack.Paths; + +namespace Wabbajack; + +public class CompilerSettingsVM : ViewModel +{ + public CompilerSettingsVM() { } + public CompilerSettingsVM(CompilerSettings cs) + { + ModlistIsNSFW = cs.ModlistIsNSFW; + Source = cs.Source; + Downloads = cs.Downloads; + Game = cs.Game; + OutputFile = cs.OutputFile; + ModListImage = cs.ModListImage; + UseGamePaths = cs.UseGamePaths; + UseTextureRecompression = cs.UseTextureRecompression; + OtherGames = cs.OtherGames; + MaxVerificationTime = cs.MaxVerificationTime; + ModListName = cs.ModListName; + ModListAuthor = cs.ModListAuthor; + ModListDescription = cs.ModListDescription; + ModListReadme = cs.ModListReadme; + ModListWebsite = cs.ModListWebsite; + ModlistVersion = cs.ModlistVersion; + PublishUpdate = cs.PublishUpdate; + MachineUrl = cs.MachineUrl; + Profile = cs.Profile; + AdditionalProfiles = cs.AdditionalProfiles; + NoMatchInclude = cs.NoMatchInclude; + Include = cs.Include; + Ignore = cs.Ignore; + AlwaysEnabled = cs.AlwaysEnabled; + Version = cs.Version; + Description = cs.Description; + } + + [Reactive] public bool ModlistIsNSFW { get; set; } + [Reactive] public AbsolutePath Source { get; set; } + [Reactive] public AbsolutePath Downloads { get; set; } + [Reactive] public Game Game { get; set; } + [Reactive] public AbsolutePath OutputFile { get; set; } + + [Reactive] public AbsolutePath ModListImage { get; set; } + [Reactive] public bool UseGamePaths { get; set; } + + [Reactive] public bool UseTextureRecompression { get; set; } = false; + [Reactive] public Game[] OtherGames { get; set; } = Array.Empty(); + + [Reactive] public TimeSpan MaxVerificationTime { get; set; } = TimeSpan.FromMinutes(1); + [Reactive] public string ModListName { get; set; } = ""; + [Reactive] public string ModListAuthor { get; set; } = ""; + [Reactive] public string ModListDescription { get; set; } = ""; + [Reactive] public string ModListReadme { get; set; } = ""; + [Reactive] public Uri? ModListWebsite { get; set; } + [Reactive] public Version ModlistVersion { get; set; } = Version.Parse("0.0.1.0"); + [Reactive] public bool PublishUpdate { get; set; } = false; + [Reactive] public string MachineUrl { get; set; } = ""; + + /// + /// The main (default) profile + /// + [Reactive] public string Profile { get; set; } = ""; + + /// + /// Secondary profiles to include in the modlist + /// + [Reactive] public string[] AdditionalProfiles { get; set; } = Array.Empty(); + + + /// + /// All profiles to be added to the compiled modlist + /// + public IEnumerable AllProfiles => AdditionalProfiles.Append(Profile); + + public bool IsMO2Modlist => AllProfiles.Any(p => !string.IsNullOrWhiteSpace(p)); + + + + /// + /// This file, or files in these folders, are automatically included if they don't match + /// any other step + /// + [Reactive] public RelativePath[] NoMatchInclude { get; set; } = Array.Empty(); + + /// + /// These files are inlined into the modlist + /// + [Reactive] public RelativePath[] Include { get; set; } = Array.Empty(); + + /// + /// These files are ignored when compiling the modlist + /// + [Reactive] public RelativePath[] Ignore { get; set; } = Array.Empty(); + + [Reactive] public RelativePath[] AlwaysEnabled { get; set; } = Array.Empty(); + [Reactive] public Version Version { get; set; } + [Reactive] public string Description { get; set; } + + public CompilerSettings ToCompilerSettings() + { + return new CompilerSettings() + { + ModlistIsNSFW = ModlistIsNSFW, + Source = Source, + Downloads = Downloads, + Game = Game, + OutputFile = OutputFile, + ModListImage = ModListImage, + UseGamePaths = UseGamePaths, + UseTextureRecompression = UseTextureRecompression, + OtherGames = OtherGames, + MaxVerificationTime = MaxVerificationTime, + ModListName = ModListName, + ModListAuthor = ModListAuthor, + ModListDescription = ModListDescription, + ModListReadme = ModListReadme, + ModListWebsite = ModListWebsite, + ModlistVersion = ModlistVersion, + PublishUpdate = PublishUpdate, + MachineUrl = MachineUrl, + Profile = Profile, + AdditionalProfiles = AdditionalProfiles, + NoMatchInclude = NoMatchInclude, + Include = Include, + Ignore = Ignore, + AlwaysEnabled = AlwaysEnabled, + Version = Version, + Description = Description + }; + } + public AbsolutePath CompilerSettingsPath => Source.Combine(ModListName).WithExtension(Ext.CompilerSettings); + public AbsolutePath ProfilePath => Source.Combine("profiles").Combine(Profile).Combine("modlist").WithExtension(Ext.Txt); +} diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs index b9c0ba34f..1ca754dfb 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs @@ -61,36 +61,10 @@ public class CompilerVM : BackNavigatingVM, ICpuStatusVM public FilePickerVM ModlistLocation { get; } public FilePickerVM DownloadLocation { get; } public FilePickerVM OutputLocation { get; } - - // Modlist Settings - - [Reactive] public string ModListName { get; set; } - [Reactive] public string Version { get; set; } - [Reactive] public string Author { get; set; } - [Reactive] public string Description { get; set; } - public FilePickerVM ModListImagePath { get; } = new(); - [Reactive] public ImageSource ModListImage { get; set; } - [Reactive] public string Website { get; set; } - [Reactive] public string Readme { get; set; } - [Reactive] public bool IsNSFW { get; set; } - [Reactive] public bool PublishUpdate { get; set; } - [Reactive] public string MachineUrl { get; set; } - [Reactive] public Game BaseGame { get; set; } - [Reactive] public string SelectedProfile { get; set; } - [Reactive] public AbsolutePath GamePath { get; set; } - [Reactive] public bool IsMO2Compilation { get; set; } - - [Reactive] public RelativePath[] AlwaysEnabled { get; set; } = Array.Empty(); - [Reactive] public RelativePath[] NoMatchInclude { get; set; } = Array.Empty(); - [Reactive] public RelativePath[] Include { get; set; } = Array.Empty(); - [Reactive] public RelativePath[] Ignore { get; set; } = Array.Empty(); - - [Reactive] public string[] OtherProfiles { get; set; } = Array.Empty(); - - [Reactive] public AbsolutePath Source { get; set; } - - public AbsolutePath SettingsOutputLocation => Source.Combine(ModListName).WithExtension(Ext.CompilerSettings); - + + [Reactive] public CompilerSettingsVM Settings { get; set; } = new(); + + public FilePickerVM ModListImageLocation { get; } = new(); public ReactiveCommand ExecuteCommand { get; } public ReactiveCommand ReInferSettingsCommand { get; set; } @@ -115,27 +89,33 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage _wjClient = wjClient; MessageBus.Current.Listen() - .Subscribe(msg => LoadCompilerSettings(msg.CompilerSettings)) + .Subscribe(msg => { + var csVm = new CompilerSettingsVM(msg.CompilerSettings); + ModlistLocation.TargetPath = csVm.ProfilePath; + ModListImageLocation.TargetPath = csVm.ModListImage; + DownloadLocation.TargetPath = csVm.Downloads; + OutputLocation.TargetPath = csVm.OutputFile; + Settings = csVm; + }) .DisposeWith(CompositeDisposable); StatusText = "Compiler Settings"; StatusProgress = Percent.Zero; - BackCommand = - ReactiveCommand.CreateFromTask(async () => - { - await SaveSettingsFile(); - NavigateToGlobal.Send(ScreenType.Home); - }); - + BackCommand = ReactiveCommand.CreateFromTask(async () => + { + await SaveSettingsFile(); + NavigateToGlobal.Send(ScreenType.Home); + }); + SubCompilerVM = new MO2CompilerVM(this); ExecuteCommand = ReactiveCommand.CreateFromTask(async () => await StartCompilation()); ReInferSettingsCommand = ReactiveCommand.CreateFromTask(async () => await ReInferSettings(), - this.WhenAnyValue(vm => vm.Source) + this.WhenAnyValue(vm => vm.Settings.Source) .ObserveOnGuiThread() .Select(v => v != default) - .CombineLatest(this.WhenAnyValue(vm => vm.ModListName) + .CombineLatest(this.WhenAnyValue(vm => vm.Settings.ModListName) .ObserveOnGuiThread() .Select(p => !string.IsNullOrWhiteSpace(p))) .Select(v => v.First && v.Second)); @@ -174,23 +154,37 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage Disposable.Empty.DisposeWith(disposables); ModlistLocation.WhenAnyValue(vm => vm.TargetPath) - .Subscribe(p => InferModListFromLocation(p).FireAndForget()) + .Subscribe(async p => { + if (string.IsNullOrEmpty(Settings.ModListName)) + { + Settings = new CompilerSettingsVM(await InferModListFromLocation(p)); + } + else await ReInferSettings(); + }) .DisposeWith(disposables); - this.WhenAnyValue(x => x.DownloadLocation.TargetPath) .CombineLatest(this.WhenAnyValue(x => x.ModlistLocation.TargetPath), this.WhenAnyValue(x => x.OutputLocation.TargetPath), this.WhenAnyValue(x => x.DownloadLocation.ErrorState), this.WhenAnyValue(x => x.ModlistLocation.ErrorState), - this.WhenAnyValue(x => x.OutputLocation.ErrorState), - this.WhenAnyValue(x => x.ModListName), - this.WhenAnyValue(x => x.Version)) + this.WhenAnyValue(x => x.OutputLocation.ErrorState)) .Select(_ => Validate()) .BindToStrict(this, vm => vm.ErrorState) .DisposeWith(disposables); - - //LoadLastSavedSettings().FireAndForget(); + + this.WhenAnyValue(x => x.Settings) + .Throttle(TimeSpan.FromSeconds(2)) + .Subscribe(_ => SaveSettingsFile().FireAndForget()) + .DisposeWith(disposables); + + this.WhenAnyValue(x => x.ModListImageLocation.TargetPath) + .BindToStrict(this, vm => vm.Settings.ModListImage) + .DisposeWith(disposables); + + this.WhenAnyValue(x => x.DownloadLocation.TargetPath) + .BindToStrict(this, vm => vm.Settings.Downloads) + .DisposeWith(disposables); }); } @@ -199,7 +193,7 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage private async Task ReInferSettings() { var newSettings = await _inferencer.InferModListFromLocation( - Source.Combine("profiles", SelectedProfile, "modlist.txt")); + Settings.Source.Combine("profiles", Settings.Profile, "modlist.txt")); if (newSettings == null) { @@ -207,28 +201,30 @@ private async Task ReInferSettings() return; } - Include = newSettings.Include; - Ignore = newSettings.Ignore; - AlwaysEnabled = newSettings.AlwaysEnabled; - NoMatchInclude = newSettings.NoMatchInclude; - OtherProfiles = newSettings.AdditionalProfiles; + Settings.Include = newSettings.Include; + Settings.Ignore = newSettings.Ignore; + Settings.AlwaysEnabled = newSettings.AlwaysEnabled; + Settings.NoMatchInclude = newSettings.NoMatchInclude; + Settings.AdditionalProfiles = newSettings.AdditionalProfiles; } private ErrorResponse Validate() { - var errors = new List(); - errors.Add(DownloadLocation.ErrorState); - errors.Add(ModlistLocation.ErrorState); - errors.Add(OutputLocation.ErrorState); + var errors = new List + { + DownloadLocation.ErrorState, + ModlistLocation.ErrorState, + OutputLocation.ErrorState + }; return ErrorResponse.Combine(errors); } - private async Task InferModListFromLocation(AbsolutePath path) + private async Task InferModListFromLocation(AbsolutePath path) { using var _ = LoadingLock.WithLoading(); CompilerSettings settings; - if (path == default) return; + if (path == default) return new(); if (path.FileName.Extension == Ext.CompilerSettings) { await using var fs = path.Open(FileMode.Open, FileAccess.Read, FileShare.Read); @@ -237,46 +233,14 @@ private async Task InferModListFromLocation(AbsolutePath path) else if (path.FileName == "modlist.txt".ToRelativePath()) { settings = await _inferencer.InferModListFromLocation(path); - if (settings == null) return; + if (settings == null) return new(); } else { - return; + return new(); } - LoadCompilerSettings(settings); - - if (path.FileName == "modlist.txt".ToRelativePath()) - { - await LoadLastSavedSettings(); - } - } - - private void LoadCompilerSettings(CompilerSettings settings) - { - BaseGame = settings.Game; - ModListName = settings.ModListName; - Version = settings.Version?.ToString() ?? ""; - Author = settings.ModListAuthor; - Description = settings.Description; - ModListImagePath.TargetPath = settings.ModListImage; - Website = settings.ModListWebsite?.ToString() ?? ""; - Readme = settings.ModListReadme?.ToString() ?? ""; - IsNSFW = settings.ModlistIsNSFW; - - Source = settings.Source; - DownloadLocation.TargetPath = settings.Downloads; - if (settings.OutputFile.Extension == Ext.Wabbajack) - settings.OutputFile = settings.OutputFile.Parent; - OutputLocation.TargetPath = settings.OutputFile; - SelectedProfile = settings.Profile; - PublishUpdate = settings.PublishUpdate; - MachineUrl = settings.MachineUrl; - OtherProfiles = settings.AdditionalProfiles; - AlwaysEnabled = settings.AlwaysEnabled; - NoMatchInclude = settings.NoMatchInclude; - Include = settings.Include; - Ignore = settings.Ignore; + return settings; } private async Task StartCompilation() @@ -285,24 +249,22 @@ private async Task StartCompilation() { try { - await SaveSettingsFile(); var token = CancellationToken.None; State = CompilerState.Compiling; - var mo2Settings = GetSettings(); - mo2Settings.UseGamePaths = true; - if (mo2Settings.OutputFile.DirectoryExists()) - mo2Settings.OutputFile = mo2Settings.OutputFile.Combine(mo2Settings.ModListName.ToRelativePath() + Settings.UseGamePaths = true; + if (Settings.OutputFile.DirectoryExists()) + Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath() .WithExtension(Ext.Wabbajack)); - if (PublishUpdate && !await RunPreflightChecks(token)) + if (Settings.PublishUpdate && !await RunPreflightChecks(token)) { State = CompilerState.Errored; return; } - var compiler = MO2Compiler.Create(_serviceProvider, mo2Settings); + var compiler = MO2Compiler.Create(_serviceProvider, Settings.ToCompilerSettings()); var events = Observable.FromEventPattern(h => compiler.OnStatusUpdate += h, h => compiler.OnStatusUpdate -= h) @@ -327,12 +289,12 @@ private async Task StartCompilation() events.Dispose(); } - if (PublishUpdate) + if (Settings.PublishUpdate) { _logger.LogInformation("Publishing List"); var downloadMetadata = _dtos.Deserialize( - await mo2Settings.OutputFile.WithExtension(Ext.Meta).WithExtension(Ext.Json).ReadAllTextAsync())!; - await _wjClient.PublishModlist(MachineUrl, System.Version.Parse(Version), mo2Settings.OutputFile, downloadMetadata); + await Settings.OutputFile.WithExtension(Ext.Meta).WithExtension(Ext.Json).ReadAllTextAsync())!; + await _wjClient.PublishModlist(Settings.MachineUrl, Settings.Version, Settings.OutputFile, downloadMetadata); } _logger.LogInformation("Compiler Finished"); @@ -366,15 +328,9 @@ private async Task StartCompilation() private async Task RunPreflightChecks(CancellationToken token) { var lists = await _wjClient.GetMyModlists(token); - if (!lists.Any(x => x.Equals(MachineUrl, StringComparison.InvariantCultureIgnoreCase))) - { - _logger.LogError("Preflight Check failed, list {MachineUrl} not found in any repository", MachineUrl); - return false; - } - - if (!System.Version.TryParse(Version, out var v)) + if (!lists.Any(x => x.Equals(Settings.MachineUrl, StringComparison.InvariantCultureIgnoreCase))) { - _logger.LogError("Bad Version Number {Version}", Version); + _logger.LogError("Preflight Check failed, list {MachineUrl} not found in any repository", Settings.MachineUrl); return false; } @@ -383,16 +339,14 @@ private async Task RunPreflightChecks(CancellationToken token) private async Task SaveSettingsFile() { - if (Source == default) return; + if (Settings.Source == default) return; - var settings = GetSettings(); - - await using var st = SettingsOutputLocation.Open(FileMode.Create, FileAccess.Write, FileShare.None); - await JsonSerializer.SerializeAsync(st, settings, _dtos.Options); + await using var st = Settings.CompilerSettingsPath.Open(FileMode.Create, FileAccess.Write, FileShare.None); + await JsonSerializer.SerializeAsync(st, Settings.ToCompilerSettings(), _dtos.Options); var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); - allSavedCompilerSettings.Remove(SettingsOutputLocation); - allSavedCompilerSettings.Insert(0, SettingsOutputLocation); + allSavedCompilerSettings.Remove(Settings.CompilerSettingsPath); + allSavedCompilerSettings.Insert(0, Settings.CompilerSettingsPath); await _settingsManager.Save(Consts.AllSavedCompilerSettingsPaths, allSavedCompilerSettings); } @@ -408,89 +362,57 @@ private async Task LoadLastSavedSettings() ModlistLocation.TargetPath = lastPath; } - private CompilerSettings GetSettings() - { - - System.Version.TryParse(Version, out var pversion); - Uri.TryCreate(Website, UriKind.Absolute, out var websiteUri); - - return new CompilerSettings - { - ModListName = ModListName, - ModListAuthor = Author, - Version = pversion ?? new Version(), - Description = Description, - ModListReadme = Readme, - ModListImage = ModListImagePath.TargetPath, - ModlistIsNSFW = IsNSFW, - ModListWebsite = websiteUri ?? new Uri("http://www.wabbajack.org"), - Downloads = DownloadLocation.TargetPath, - Source = Source, - Game = BaseGame, - PublishUpdate = PublishUpdate, - MachineUrl = MachineUrl, - Profile = SelectedProfile, - UseGamePaths = true, - OutputFile = OutputLocation.TargetPath, - AlwaysEnabled = AlwaysEnabled, - AdditionalProfiles = OtherProfiles, - NoMatchInclude = NoMatchInclude, - Include = Include, - Ignore = Ignore - }; - } - #region ListOps public void AddOtherProfile(string profile) { - OtherProfiles = (OtherProfiles ?? Array.Empty()).Append(profile).Distinct().ToArray(); + Settings.AdditionalProfiles = (Settings.AdditionalProfiles ?? Array.Empty()).Append(profile).Distinct().ToArray(); } public void RemoveProfile(string profile) { - OtherProfiles = OtherProfiles.Where(p => p != profile).ToArray(); + Settings.AdditionalProfiles = Settings.AdditionalProfiles.Where(p => p != profile).ToArray(); } public void AddAlwaysEnabled(RelativePath path) { - AlwaysEnabled = (AlwaysEnabled ?? Array.Empty()).Append(path).Distinct().ToArray(); + Settings.AlwaysEnabled = (Settings.AlwaysEnabled ?? Array.Empty()).Append(path).Distinct().ToArray(); } public void RemoveAlwaysEnabled(RelativePath path) { - AlwaysEnabled = AlwaysEnabled.Where(p => p != path).ToArray(); + Settings.AlwaysEnabled = Settings.AlwaysEnabled.Where(p => p != path).ToArray(); } public void AddNoMatchInclude(RelativePath path) { - NoMatchInclude = (NoMatchInclude ?? Array.Empty()).Append(path).Distinct().ToArray(); + Settings.NoMatchInclude = (Settings.NoMatchInclude ?? Array.Empty()).Append(path).Distinct().ToArray(); } public void RemoveNoMatchInclude(RelativePath path) { - NoMatchInclude = NoMatchInclude.Where(p => p != path).ToArray(); + Settings.NoMatchInclude = Settings.NoMatchInclude.Where(p => p != path).ToArray(); } public void AddInclude(RelativePath path) { - Include = (Include ?? Array.Empty()).Append(path).Distinct().ToArray(); + Settings.Include = (Settings.Include ?? Array.Empty()).Append(path).Distinct().ToArray(); } public void RemoveInclude(RelativePath path) { - Include = Include.Where(p => p != path).ToArray(); + Settings.Include = Settings.Include.Where(p => p != path).ToArray(); } public void AddIgnore(RelativePath path) { - Ignore = (Ignore ?? Array.Empty()).Append(path).Distinct().ToArray(); + Settings.Ignore = (Settings.Ignore ?? Array.Empty()).Append(path).Distinct().ToArray(); } public void RemoveIgnore(RelativePath path) { - Ignore = Ignore.Where(p => p != path).ToArray(); + Settings.Ignore = Settings.Ignore.Where(p => p != path).ToArray(); } #endregion diff --git a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs b/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs index 5a8b189b8..5ca18d428 100644 --- a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs @@ -49,7 +49,10 @@ public CreateModListVM(ILogger logger, SettingsManager settings _serviceProvider = serviceProvider; _dtos = dtos; CompileModListCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.Compiler)); - LoadAllCompilerSettings().FireAndForget(); + this.WhenActivated(disposables => + { + LoadAllCompilerSettings().DisposeWith(disposables); + }); } private async Task LoadAllCompilerSettings() diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml index 346744bdd..4ce3f79d6 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml @@ -28,7 +28,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs index 65ac72418..b4e56de81 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs @@ -40,20 +40,20 @@ public CompilerView() .BindToStrict(this, x => x.CompilationComplete.TitleText.Text) .DisposeWith(disposables); - ViewModel.WhenAny(vm => vm.ModListImagePath.TargetPath) + ViewModel.WhenAny(vm => vm.ModListImageLocation.TargetPath) .Where(i => i.FileExists()) .Select(i => (UIUtils.TryGetBitmapImageFromFile(i, out var img), img)) .Where(i => i.Item1) .Select(i => i.img) .BindToStrict(this, view => view.DetailImage.Image); - ViewModel.WhenAny(vm => vm.ModListName) + ViewModel.WhenAny(vm => vm.Settings.ModListName) .BindToStrict(this, view => view.DetailImage.Title); - ViewModel.WhenAny(vm => vm.Author) + ViewModel.WhenAny(vm => vm.Settings.ModListAuthor) .BindToStrict(this, view => view.DetailImage.Author); - ViewModel.WhenAny(vm => vm.Description) + ViewModel.WhenAny(vm => vm.Settings.ModListDescription) .BindToStrict(this, view => view.DetailImage.Description); CompilationComplete.GoToModlistButton.Command = ReactiveCommand.Create(() => @@ -75,18 +75,6 @@ public CompilerView() .BindToStrict(this, view => view.BeginButton.Command) .DisposeWith(disposables); - /* - ViewModel.WhenAnyValue(vm => vm.BackCommand) - .BindToStrict(this, view => view.BackButton.Command) - .DisposeWith(disposables); - */ - - /* - ViewModel.WhenAnyValue(vm => vm.ReInferSettingsCommand) - .BindToStrict(this, view => view.ReInferSettings.Command) - .DisposeWith(disposables); - */ - ViewModel.WhenAnyValue(vm => vm.State) .Select(v => v == CompilerState.Configuration ? Visibility.Visible : Visibility.Collapsed) .BindToStrict(this, view => view.BottomCompilerSettingsGrid.Visibility) @@ -148,38 +136,45 @@ public CompilerView() // Settings - this.Bind(ViewModel, vm => vm.ModListName, view => view.ModListNameSetting.Text) + this.Bind(ViewModel, vm => vm.Settings.ModListName, view => view.ModListNameSetting.Text) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedProfile, view => view.SelectedProfile.Text) + this.Bind(ViewModel, vm => vm.Settings.Profile, view => view.SelectedProfile.Text) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.Author, view => view.AuthorNameSetting.Text) + this.Bind(ViewModel, vm => vm.Settings.ModListAuthor, view => view.AuthorNameSetting.Text) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.Version, view => view.VersionSetting.Text) + this.Bind(ViewModel, + vm => vm.Settings.Version, + view => view.VersionSetting.Text, + vmVersion => vmVersion?.ToString() ?? "", + viewVersion => { + Version.TryParse(viewVersion, out var version); + return version ?? Version.Parse("1.0.0"); + }) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.Description, view => view.DescriptionSetting.Text) + this.Bind(ViewModel, vm => vm.Settings.ModListDescription, view => view.DescriptionSetting.Text) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.ModListImagePath, view => view.ImageFilePicker.PickerVM) + this.Bind(ViewModel, vm => vm.ModListImageLocation, view => view.ImageFilePicker.PickerVM) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.Website, view => view.WebsiteSetting.Text) + this.Bind(ViewModel, vm => vm.Settings.ModListWebsite, view => view.WebsiteSetting.Text) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.Readme, view => view.ReadmeSetting.Text) + this.Bind(ViewModel, vm => vm.Settings.ModListReadme, view => view.ReadmeSetting.Text) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.IsNSFW, view => view.NSFWSetting.IsChecked) + this.Bind(ViewModel, vm => vm.Settings.ModlistIsNSFW, view => view.NSFWSetting.IsChecked) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.PublishUpdate, view => view.PublishUpdate.IsChecked) + this.Bind(ViewModel, vm => vm.Settings.PublishUpdate, view => view.PublishUpdate.IsChecked) .DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.MachineUrl, view => view.MachineUrl.Text) + this.Bind(ViewModel, vm => vm.Settings.MachineUrl, view => view.MachineUrl.Text) .DisposeWith(disposables); @@ -194,7 +189,7 @@ public CompilerView() .DisposeWith(disposables); */ - ViewModel.WhenAnyValue(vm => vm.AlwaysEnabled) + ViewModel.WhenAnyValue(vm => vm.Settings.AlwaysEnabled) .WhereNotNull() .Select(itms => itms.Select(itm => new RemovableItemViewModel(itm.ToString(), () => ViewModel.RemoveAlwaysEnabled(itm))).ToArray()) .BindToStrict(this, view => view.AlwaysEnabled.ItemsSource) @@ -203,7 +198,7 @@ public CompilerView() AddAlwaysEnabled.Command = ReactiveCommand.CreateFromTask(async () => await AddAlwaysEnabledCommand()); - ViewModel.WhenAnyValue(vm => vm.OtherProfiles) + ViewModel.WhenAnyValue(vm => vm.Settings.AdditionalProfiles) .WhereNotNull() .Select(itms => itms.Select(itm => new RemovableItemViewModel(itm.ToString(), () => ViewModel.RemoveProfile(itm))).ToArray()) .BindToStrict(this, view => view.OtherProfiles.ItemsSource) @@ -211,7 +206,7 @@ public CompilerView() AddOtherProfile.Command = ReactiveCommand.CreateFromTask(async () => await AddOtherProfileCommand()); - ViewModel.WhenAnyValue(vm => vm.NoMatchInclude) + ViewModel.WhenAnyValue(vm => vm.Settings.NoMatchInclude) .WhereNotNull() .Select(itms => itms.Select(itm => new RemovableItemViewModel(itm.ToString(), () => ViewModel.RemoveNoMatchInclude(itm))).ToArray()) .BindToStrict(this, view => view.NoMatchInclude.ItemsSource) @@ -219,7 +214,7 @@ public CompilerView() AddNoMatchInclude.Command = ReactiveCommand.CreateFromTask(async () => await AddNoMatchIncludeCommand()); - ViewModel.WhenAnyValue(vm => vm.Include) + ViewModel.WhenAnyValue(vm => vm.Settings.Include) .WhereNotNull() .Select(itms => itms.Select(itm => new RemovableItemViewModel(itm.ToString(), () => ViewModel.RemoveInclude(itm))).ToArray()) .BindToStrict(this, view => view.Include.ItemsSource) @@ -228,7 +223,7 @@ public CompilerView() AddInclude.Command = ReactiveCommand.CreateFromTask(async () => await AddIncludeCommand()); AddIncludeFiles.Command = ReactiveCommand.CreateFromTask(async () => await AddIncludeFilesCommand()); - ViewModel.WhenAnyValue(vm => vm.Ignore) + ViewModel.WhenAnyValue(vm => vm.Settings.Ignore) .WhereNotNull() .Select(itms => itms.Select(itm => new RemovableItemViewModel(itm.ToString(), () => ViewModel.RemoveIgnore(itm))).ToArray()) .BindToStrict(this, view => view.Ignore.ItemsSource) @@ -246,13 +241,13 @@ public async Task AddAlwaysEnabledCommand() { AbsolutePath dirPath; - if (ViewModel!.Source != default && ViewModel.Source.Combine("mods").DirectoryExists()) + if (ViewModel!.Settings.Source != default && ViewModel.Settings.Source.Combine("mods").DirectoryExists()) { - dirPath = ViewModel.Source.Combine("mods"); + dirPath = ViewModel.Settings.Source.Combine("mods"); } else { - dirPath = ViewModel.Source; + dirPath = ViewModel.Settings.Source; } var dlg = new CommonOpenFileDialog @@ -276,9 +271,9 @@ public async Task AddAlwaysEnabledCommand() { var selectedPath = fileName.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) continue; + if (!selectedPath.InFolder(ViewModel.Settings.Source)) continue; - ViewModel.AddAlwaysEnabled(selectedPath.RelativeTo(ViewModel.Source)); + ViewModel.AddAlwaysEnabled(selectedPath.RelativeTo(ViewModel.Settings.Source)); } } @@ -286,13 +281,13 @@ public async Task AddOtherProfileCommand() { AbsolutePath dirPath; - if (ViewModel!.Source != default && ViewModel.Source.Combine("mods").DirectoryExists()) + if (ViewModel!.Settings.Source != default && ViewModel.Settings.Source.Combine("mods").DirectoryExists()) { - dirPath = ViewModel.Source.Combine("mods"); + dirPath = ViewModel.Settings.Source.Combine("mods"); } else { - dirPath = ViewModel.Source; + dirPath = ViewModel.Settings.Source; } var dlg = new CommonOpenFileDialog @@ -316,7 +311,7 @@ public async Task AddOtherProfileCommand() { var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source.Combine("profiles"))) continue; + if (!selectedPath.InFolder(ViewModel.Settings.Source.Combine("profiles"))) continue; ViewModel.AddOtherProfile(selectedPath.FileName.ToString()); } @@ -328,10 +323,10 @@ public Task AddNoMatchIncludeCommand() { Title = "Please select a folder", IsFolderPicker = true, - InitialDirectory = ViewModel!.Source.ToString(), + InitialDirectory = ViewModel!.Settings.Source.ToString(), AddToMostRecentlyUsedList = false, AllowNonFileSystemItems = false, - DefaultDirectory = ViewModel!.Source.ToString(), + DefaultDirectory = ViewModel!.Settings.Source.ToString(), EnsureFileExists = true, EnsurePathExists = true, EnsureReadOnly = false, @@ -345,9 +340,9 @@ public Task AddNoMatchIncludeCommand() { var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) continue; + if (!selectedPath.InFolder(ViewModel.Settings.Source)) continue; - ViewModel.AddNoMatchInclude(selectedPath.RelativeTo(ViewModel!.Source)); + ViewModel.AddNoMatchInclude(selectedPath.RelativeTo(ViewModel!.Settings.Source)); } return Task.CompletedTask; @@ -359,10 +354,10 @@ public async Task AddIncludeCommand() { Title = "Please select folders to include", IsFolderPicker = true, - InitialDirectory = ViewModel!.Source.ToString(), + InitialDirectory = ViewModel!.Settings.Source.ToString(), AddToMostRecentlyUsedList = false, AllowNonFileSystemItems = false, - DefaultDirectory = ViewModel!.Source.ToString(), + DefaultDirectory = ViewModel!.Settings.Source.ToString(), EnsureFileExists = true, EnsurePathExists = true, EnsureReadOnly = false, @@ -376,9 +371,9 @@ public async Task AddIncludeCommand() { var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) continue; + if (!selectedPath.InFolder(ViewModel.Settings.Source)) continue; - ViewModel.AddInclude(selectedPath.RelativeTo(ViewModel!.Source)); + ViewModel.AddInclude(selectedPath.RelativeTo(ViewModel!.Settings.Source)); } } @@ -388,10 +383,10 @@ public async Task AddIncludeFilesCommand() { Title = "Please select files to include", IsFolderPicker = false, - InitialDirectory = ViewModel!.Source.ToString(), + InitialDirectory = ViewModel!.Settings.Source.ToString(), AddToMostRecentlyUsedList = false, AllowNonFileSystemItems = false, - DefaultDirectory = ViewModel!.Source.ToString(), + DefaultDirectory = ViewModel!.Settings.Source.ToString(), EnsureFileExists = true, EnsurePathExists = true, EnsureReadOnly = false, @@ -405,9 +400,9 @@ public async Task AddIncludeFilesCommand() { var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) continue; + if (!selectedPath.InFolder(ViewModel.Settings.Source)) continue; - ViewModel.AddInclude(selectedPath.RelativeTo(ViewModel!.Source)); + ViewModel.AddInclude(selectedPath.RelativeTo(ViewModel!.Settings.Source)); } } @@ -417,10 +412,10 @@ public async Task AddIgnoreCommand() { Title = "Please select folders to ignore", IsFolderPicker = true, - InitialDirectory = ViewModel!.Source.ToString(), + InitialDirectory = ViewModel!.Settings.Source.ToString(), AddToMostRecentlyUsedList = false, AllowNonFileSystemItems = false, - DefaultDirectory = ViewModel!.Source.ToString(), + DefaultDirectory = ViewModel!.Settings.Source.ToString(), EnsureFileExists = true, EnsurePathExists = true, EnsureReadOnly = false, @@ -434,9 +429,9 @@ public async Task AddIgnoreCommand() { var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) continue; + if (!selectedPath.InFolder(ViewModel.Settings.Source)) continue; - ViewModel.AddIgnore(selectedPath.RelativeTo(ViewModel!.Source)); + ViewModel.AddIgnore(selectedPath.RelativeTo(ViewModel!.Settings.Source)); } } @@ -446,10 +441,10 @@ public async Task AddIgnoreFilesCommand() { Title = "Please select files to ignore", IsFolderPicker = false, - InitialDirectory = ViewModel!.Source.ToString(), + InitialDirectory = ViewModel!.Settings.Source.ToString(), AddToMostRecentlyUsedList = false, AllowNonFileSystemItems = false, - DefaultDirectory = ViewModel!.Source.ToString(), + DefaultDirectory = ViewModel!.Settings.Source.ToString(), EnsureFileExists = true, EnsurePathExists = true, EnsureReadOnly = false, @@ -463,9 +458,9 @@ public async Task AddIgnoreFilesCommand() { var selectedPath = filename.ToAbsolutePath(); - if (!selectedPath.InFolder(ViewModel.Source)) continue; + if (!selectedPath.InFolder(ViewModel.Settings.Source)) continue; - ViewModel.AddIgnore(selectedPath.RelativeTo(ViewModel!.Source)); + ViewModel.AddIgnore(selectedPath.RelativeTo(ViewModel!.Settings.Source)); } } } diff --git a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml index fd695ed25..cde9c4581 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml @@ -50,7 +50,7 @@ Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" - Symbol="AppsAddIn" + Symbol="Add" IsFilled="True" FontSize="28" /> @@ -81,7 +81,7 @@ Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" - Symbol="AppsAddIn" + Symbol="ArrowImport" IsFilled="True" FontSize="28" /> From ce72a6e80c843da4b3eb4f3ad1349a5d56c90beb Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 5 May 2024 11:40:21 +0200 Subject: [PATCH 053/294] Miscellaneous fixes for not saving and loading modlists correctly --- .../Compilers/CompilerSettingsVM.cs | 30 +++++++--- .../ViewModels/Compilers/CompilerVM.cs | 55 ++++++++++++++----- .../ViewModels/CreateModListVM.cs | 7 ++- .../Views/Compilers/CompilerView.xaml.cs | 20 ++++--- .../Views/Compilers/CreateModListView.xaml | 2 +- .../Views/Compilers/CreateModListView.xaml.cs | 4 +- .../CompilerSettingsInferencer.cs | 2 - 7 files changed, 82 insertions(+), 38 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs index 5c514d102..995d17602 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerSettingsVM.cs @@ -31,7 +31,7 @@ public CompilerSettingsVM(CompilerSettings cs) ModListDescription = cs.ModListDescription; ModListReadme = cs.ModListReadme; ModListWebsite = cs.ModListWebsite; - ModlistVersion = cs.ModlistVersion; + ModlistVersion = cs.ModlistVersion?.ToString() ?? ""; PublishUpdate = cs.PublishUpdate; MachineUrl = cs.MachineUrl; Profile = cs.Profile; @@ -40,7 +40,7 @@ public CompilerSettingsVM(CompilerSettings cs) Include = cs.Include; Ignore = cs.Ignore; AlwaysEnabled = cs.AlwaysEnabled; - Version = cs.Version; + Version = cs.Version?.ToString() ?? ""; Description = cs.Description; } @@ -62,7 +62,7 @@ public CompilerSettingsVM(CompilerSettings cs) [Reactive] public string ModListDescription { get; set; } = ""; [Reactive] public string ModListReadme { get; set; } = ""; [Reactive] public Uri? ModListWebsite { get; set; } - [Reactive] public Version ModlistVersion { get; set; } = Version.Parse("0.0.1.0"); + [Reactive] public string ModlistVersion { get; set; } = ""; [Reactive] public bool PublishUpdate { get; set; } = false; [Reactive] public string MachineUrl { get; set; } = ""; @@ -103,7 +103,7 @@ public CompilerSettingsVM(CompilerSettings cs) [Reactive] public RelativePath[] Ignore { get; set; } = Array.Empty(); [Reactive] public RelativePath[] AlwaysEnabled { get; set; } = Array.Empty(); - [Reactive] public Version Version { get; set; } + [Reactive] public string Version { get; set; } [Reactive] public string Description { get; set; } public CompilerSettings ToCompilerSettings() @@ -125,7 +125,7 @@ public CompilerSettings ToCompilerSettings() ModListDescription = ModListDescription, ModListReadme = ModListReadme, ModListWebsite = ModListWebsite, - ModlistVersion = ModlistVersion, + ModlistVersion = System.Version.Parse(ModlistVersion), PublishUpdate = PublishUpdate, MachineUrl = MachineUrl, Profile = Profile, @@ -134,10 +134,24 @@ public CompilerSettings ToCompilerSettings() Include = Include, Ignore = Ignore, AlwaysEnabled = AlwaysEnabled, - Version = Version, + Version = System.Version.Parse(Version), Description = Description }; } - public AbsolutePath CompilerSettingsPath => Source.Combine(ModListName).WithExtension(Ext.CompilerSettings); - public AbsolutePath ProfilePath => Source.Combine("profiles").Combine(Profile).Combine("modlist").WithExtension(Ext.Txt); + public AbsolutePath CompilerSettingsPath + { + get + { + if (Source == default || string.IsNullOrEmpty(Profile)) return default; + return Source.Combine(ModListName).WithExtension(Ext.CompilerSettings); + } + } + public AbsolutePath ProfilePath + { + get + { + if (Source == default || string.IsNullOrEmpty(Profile)) return default; + return Source.Combine("profiles").Combine(Profile).Combine("modlist").WithExtension(Ext.Txt); + } + } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs index 1ca754dfb..d23c3bc8a 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs @@ -111,7 +111,8 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage SubCompilerVM = new MO2CompilerVM(this); ExecuteCommand = ReactiveCommand.CreateFromTask(async () => await StartCompilation()); - ReInferSettingsCommand = ReactiveCommand.CreateFromTask(async () => await ReInferSettings(), + /*ReInferSettingsCommand = ReactiveCommand.CreateFromTask(async () => await ReInferSettings(), + this.WhenAnyValue(vm => vm.Settings.Source) .ObserveOnGuiThread() .Select(v => v != default) @@ -119,6 +120,7 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage .ObserveOnGuiThread() .Select(p => !string.IsNullOrWhiteSpace(p))) .Select(v => v.First && v.Second)); + */ ModlistLocation = new FilePickerVM { @@ -159,7 +161,7 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage { Settings = new CompilerSettingsVM(await InferModListFromLocation(p)); } - else await ReInferSettings(); + else if(p.FileName == "modlist.txt".ToRelativePath()) await ReInferSettings(p); }) .DisposeWith(disposables); @@ -177,30 +179,45 @@ public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManage .Throttle(TimeSpan.FromSeconds(2)) .Subscribe(_ => SaveSettingsFile().FireAndForget()) .DisposeWith(disposables); + /* - this.WhenAnyValue(x => x.ModListImageLocation.TargetPath) - .BindToStrict(this, vm => vm.Settings.ModListImage) - .DisposeWith(disposables); + ModListImageLocation.WhenAnyValue(x => x.TargetPath) + .BindToStrict(this, vm => vm.Settings.ModListImage) + .DisposeWith(disposables); + + DownloadLocation.WhenAnyValue(x => x.TargetPath) + .BindToStrict(this, vm => vm.Settings.Downloads) + .DisposeWith(disposables); + + Settings.WhenAnyValue(x => x.Downloads) + .BindToStrict(this, vm => vm.DownloadLocation.TargetPath) + .DisposeWith(disposables); + */ - this.WhenAnyValue(x => x.DownloadLocation.TargetPath) - .BindToStrict(this, vm => vm.Settings.Downloads) - .DisposeWith(disposables); }); } - private async Task ReInferSettings() + private async Task ReInferSettings(AbsolutePath filePath) { - var newSettings = await _inferencer.InferModListFromLocation( - Settings.Source.Combine("profiles", Settings.Profile, "modlist.txt")); + var newSettings = await _inferencer.InferModListFromLocation(filePath); if (newSettings == null) { _logger.LogError("Cannot infer settings"); return; } - + + Settings.Source = newSettings.Source; + Settings.Downloads = newSettings.Downloads; + + if (string.IsNullOrEmpty(Settings.ModListName)) + Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.Profile).WithExtension(Ext.Wabbajack); + else + Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.ModListName).WithExtension(Ext.Wabbajack); + + Settings.Game = newSettings.Game; Settings.Include = newSettings.Include; Settings.Ignore = newSettings.Ignore; Settings.AlwaysEnabled = newSettings.AlwaysEnabled; @@ -294,7 +311,7 @@ private async Task StartCompilation() _logger.LogInformation("Publishing List"); var downloadMetadata = _dtos.Deserialize( await Settings.OutputFile.WithExtension(Ext.Meta).WithExtension(Ext.Json).ReadAllTextAsync())!; - await _wjClient.PublishModlist(Settings.MachineUrl, Settings.Version, Settings.OutputFile, downloadMetadata); + await _wjClient.PublishModlist(Settings.MachineUrl, Version.Parse(Settings.Version), Settings.OutputFile, downloadMetadata); } _logger.LogInformation("Compiler Finished"); @@ -334,18 +351,26 @@ private async Task RunPreflightChecks(CancellationToken token) return false; } + if(!Version.TryParse(Settings.Version, out var version)) + { + _logger.LogError("Preflight Check failed, version {Version} was not valid", Settings.Version); + return false; + } + return true; } private async Task SaveSettingsFile() { - if (Settings.Source == default) return; + if (Settings.Source == default || Settings.CompilerSettingsPath == default) return; await using var st = Settings.CompilerSettingsPath.Open(FileMode.Create, FileAccess.Write, FileShare.None); await JsonSerializer.SerializeAsync(st, Settings.ToCompilerSettings(), _dtos.Options); var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); - allSavedCompilerSettings.Remove(Settings.CompilerSettingsPath); + + // Don't simply remove Settings.CompilerSettingsPath here, because WJ sometimes likes to make default compiler settings files + allSavedCompilerSettings.RemoveAll(path => path.Parent == Settings.Source); allSavedCompilerSettings.Insert(0, Settings.CompilerSettingsPath); await _settingsManager.Save(Consts.AllSavedCompilerSettingsPaths, allSavedCompilerSettings); diff --git a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs b/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs index 5ca18d428..5a3927b99 100644 --- a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs @@ -36,7 +36,7 @@ public class CreateModListVM : ViewModel private readonly CancellationToken _cancellationToken; private readonly DTOSerializer _dtos; - public ICommand CompileModListCommand { get; set; } + public ICommand NewModListCommand { get; set; } [Reactive] public ObservableCollection CreatedModlists { get; set; } @@ -48,7 +48,10 @@ public CreateModListVM(ILogger logger, SettingsManager settings _settingsManager = settingsManager; _serviceProvider = serviceProvider; _dtos = dtos; - CompileModListCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.Compiler)); + NewModListCommand = ReactiveCommand.Create(() => { + NavigateToGlobal.Send(ScreenType.Compiler); + LoadModlistForCompiling.Send(new()); + }); this.WhenActivated(disposables => { LoadAllCompilerSettings().DisposeWith(disposables); diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs index b4e56de81..215d55aa5 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs @@ -102,10 +102,18 @@ public CompilerView() ViewModel.WhenAnyValue(vm => vm.DownloadLocation) .BindToStrict(this, view => view.CompilerConfigView.DownloadsLocation.PickerVM) .DisposeWith(disposables); + + ViewModel.WhenAnyValue(vm => vm.Settings.Downloads) + .BindToStrict(this, view => view.CompilerConfigView.DownloadsLocation.PickerVM.TargetPath) + .DisposeWith(disposables); ViewModel.WhenAnyValue(vm => vm.OutputLocation) .BindToStrict(this, view => view.CompilerConfigView.OutputLocation.PickerVM) .DisposeWith(disposables); + + ViewModel.WhenAnyValue(vm => vm.Settings.OutputFile) + .BindToStrict(this, view => view.CompilerConfigView.OutputLocation.PickerVM.TargetPath) + .DisposeWith(disposables); UserInterventionsControl.Visibility = Visibility.Collapsed; @@ -145,14 +153,7 @@ public CompilerView() this.Bind(ViewModel, vm => vm.Settings.ModListAuthor, view => view.AuthorNameSetting.Text) .DisposeWith(disposables); - this.Bind(ViewModel, - vm => vm.Settings.Version, - view => view.VersionSetting.Text, - vmVersion => vmVersion?.ToString() ?? "", - viewVersion => { - Version.TryParse(viewVersion, out var version); - return version ?? Version.Parse("1.0.0"); - }) + this.Bind(ViewModel, vm => vm.Settings.Version, view => view.VersionSetting.Text) .DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Settings.ModListDescription, view => view.DescriptionSetting.Text) @@ -161,6 +162,9 @@ public CompilerView() this.Bind(ViewModel, vm => vm.ModListImageLocation, view => view.ImageFilePicker.PickerVM) .DisposeWith(disposables); + + this.Bind(ViewModel, vm => vm.Settings.ModListImage, view => view.ImageFilePicker.PickerVM.TargetPath) + .DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Settings.ModListWebsite, view => view.WebsiteSetting.Text) .DisposeWith(disposables); diff --git a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml index cde9c4581..ffb294136 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml @@ -29,7 +29,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs index a2607484b..d9da5f8b7 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs @@ -34,10 +34,10 @@ public CreateModListView() .BindToStrict(this, x => x.CreatedModListsControl.ItemsSource) .DisposeWith(dispose); - CompileNewModListBorder + NewModListBorder .Events().MouseDown .Select(args => Unit.Default) - .InvokeCommand(this, x => x.ViewModel.CompileModListCommand) + .InvokeCommand(this, x => x.ViewModel.NewModListCommand) .DisposeWith(dispose); }); } diff --git a/Wabbajack.Compiler/CompilerSettingsInferencer.cs b/Wabbajack.Compiler/CompilerSettingsInferencer.cs index b56dc000d..a6de3a6f3 100644 --- a/Wabbajack.Compiler/CompilerSettingsInferencer.cs +++ b/Wabbajack.Compiler/CompilerSettingsInferencer.cs @@ -139,8 +139,6 @@ public CompilerSettingsInferencer(ILogger logger) { cs.AdditionalProfiles = await otherProfilesFile.ReadAllLinesAsync().ToArray(); } - - cs.OutputFile = cs.Source.Parent.Combine(cs.Profile).WithExtension(Ext.Wabbajack); } return cs; From 7d206315af7682605ee3c46b4f9ba7ad561231cf Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Thu, 9 May 2024 17:20:11 +0200 Subject: [PATCH 054/294] Fix up the load modlist button --- .../Messages/LoadModlistForCompiling.cs | 4 +++ .../ViewModels/CreateModListVM.cs | 27 +++++++++++++++++++ .../Views/Compilers/CompilerView.xaml.cs | 3 --- .../Views/Compilers/CreateModListView.xaml | 2 +- .../Views/Compilers/CreateModListView.xaml.cs | 6 +++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs b/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs index 14bb0fef0..e6374ef7d 100644 --- a/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs +++ b/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs @@ -1,5 +1,8 @@ using ReactiveUI; +using System.IO; using Wabbajack.Compiler; +using Wabbajack.DTOs.JsonConverters; +using Wabbajack.Paths; namespace Wabbajack.Messages; @@ -11,6 +14,7 @@ public LoadModlistForCompiling(CompilerSettings cs) CompilerSettings = cs; } + public static void Send(CompilerSettings cs) { MessageBus.Current.SendMessage(new LoadModlistForCompiling(cs)); diff --git a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs b/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs index 5a3927b99..e19d523c9 100644 --- a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs @@ -12,6 +12,7 @@ using DynamicData; using DynamicData.Binding; using Microsoft.Extensions.Logging; +using Microsoft.WindowsAPICodePack.Dialogs; using ReactiveUI; using ReactiveUI.Fody.Helpers; using SteamKit2.GC.Dota.Internal; @@ -37,10 +38,13 @@ public class CreateModListVM : ViewModel private readonly DTOSerializer _dtos; public ICommand NewModListCommand { get; set; } + public ICommand LoadSettingsCommand { get; set; } [Reactive] public ObservableCollection CreatedModlists { get; set; } + public FilePickerVM CompilerSettingsPicker { get; private set; } + public CreateModListVM(ILogger logger, SettingsManager settingsManager, IServiceProvider serviceProvider, DTOSerializer dtos) { @@ -48,10 +52,33 @@ public CreateModListVM(ILogger logger, SettingsManager settings _settingsManager = settingsManager; _serviceProvider = serviceProvider; _dtos = dtos; + + CompilerSettingsPicker = new FilePickerVM + { + ExistCheckOption = FilePickerVM.CheckOptions.On, + PathType = FilePickerVM.PathTypeOptions.File, + PromptTitle = "Select a compiler settings file" + }; + CompilerSettingsPicker.Filters.AddRange([ + new CommonFileDialogFilter("Compiler Settings File", "*" + Ext.CompilerSettings) + ]); + NewModListCommand = ReactiveCommand.Create(() => { NavigateToGlobal.Send(ScreenType.Compiler); LoadModlistForCompiling.Send(new()); }); + + LoadSettingsCommand = ReactiveCommand.Create(() => + { + CompilerSettingsPicker.SetTargetPathCommand.Execute(null); + if(CompilerSettingsPicker.TargetPath != default) + { + NavigateToGlobal.Send(ScreenType.Compiler); + var compilerSettings = _dtos.Deserialize(File.ReadAllText(CompilerSettingsPicker.TargetPath.ToString())); + LoadModlistForCompiling.Send(compilerSettings); + } + }); + this.WhenActivated(disposables => { LoadAllCompilerSettings().DisposeWith(disposables); diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs index 215d55aa5..2caf31aa9 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs @@ -139,9 +139,6 @@ public CompilerView() .DisposeWith(disposables); - - - // Settings this.Bind(ViewModel, vm => vm.Settings.ModListName, view => view.ModListNameSetting.Text) diff --git a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml index ffb294136..abc9e7a23 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml @@ -60,7 +60,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs index d9da5f8b7..ff59c9d66 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs @@ -39,6 +39,12 @@ public CreateModListView() .Select(args => Unit.Default) .InvokeCommand(this, x => x.ViewModel.NewModListCommand) .DisposeWith(dispose); + + LoadSettingsBorder + .Events().MouseDown + .Select(args => Unit.Default) + .InvokeCommand(this, x => x.ViewModel.LoadSettingsCommand) + .DisposeWith(dispose); }); } } From 2c2ce89698532f743c47105598acd888ff17db58 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 19 May 2024 18:14:47 +0200 Subject: [PATCH 055/294] Refactor some names to (hopefully) make more sense --- Wabbajack.App.Wpf/App.xaml.cs | 4 ++-- Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs | 4 ++-- ...edModlistVM.cs => CompiledModListTileVM.cs} | 6 +++--- .../{CompilerVM.cs => CompilerDetailsVM.cs} | 6 +++--- .../CompilerHomeVM.cs} | 16 ++++++++-------- .../ViewModels/Compilers/MO2CompilerVM.cs | 4 ++-- Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 14 +++++++------- Wabbajack.App.Wpf/ViewModels/NavigationVM.cs | 4 ++-- .../Compilers/CompilationCompleteView.xaml | 2 +- .../CompiledModListTileView.xaml} | 4 ++-- .../CompiledModListTileView.xaml.cs} | 4 ++-- ...pilerView.xaml => CompilerDetailsView.xaml} | 6 +++--- ...iew.xaml.cs => CompilerDetailsView.xaml.cs} | 6 +++--- ...eModListView.xaml => CompilerHomeView.xaml} | 10 +++++----- ...stView.xaml.cs => CompilerHomeView.xaml.cs} | 8 ++++---- Wabbajack.App.Wpf/Views/MainWindow.xaml | 18 +++++++++--------- Wabbajack.App.Wpf/Views/NavigationView.xaml.cs | 4 ++-- 17 files changed, 60 insertions(+), 60 deletions(-) rename Wabbajack.App.Wpf/ViewModels/Compilers/{CreatedModlistVM.cs => CompiledModListTileVM.cs} (82%) rename Wabbajack.App.Wpf/ViewModels/Compilers/{CompilerVM.cs => CompilerDetailsVM.cs} (98%) rename Wabbajack.App.Wpf/ViewModels/{CreateModListVM.cs => Compilers/CompilerHomeVM.cs} (85%) rename Wabbajack.App.Wpf/Views/{CreateModListTileView.xaml => Compilers/CompiledModListTileView.xaml} (99%) rename Wabbajack.App.Wpf/Views/{CreateModListTileView.xaml.cs => Compilers/CompiledModListTileView.xaml.cs} (90%) rename Wabbajack.App.Wpf/Views/Compilers/{CompilerView.xaml => CompilerDetailsView.xaml} (98%) rename Wabbajack.App.Wpf/Views/Compilers/{CompilerView.xaml.cs => CompilerDetailsView.xaml.cs} (99%) rename Wabbajack.App.Wpf/Views/Compilers/{CreateModListView.xaml => CompilerHomeView.xaml} (95%) rename Wabbajack.App.Wpf/Views/Compilers/{CreateModListView.xaml.cs => CompilerHomeView.xaml.cs} (82%) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index e12daec6e..34dc1e434 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -168,8 +168,8 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs index 7ec4ff695..83c224d21 100644 --- a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs +++ b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs @@ -8,8 +8,8 @@ public enum ScreenType ModListGallery, Installer, Settings, - Compiler, - CreateModList, + CompilerDetails, + CompilerHome, ModListContents, WebBrowser } diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CreatedModlistVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompiledModListTileVM.cs similarity index 82% rename from Wabbajack.App.Wpf/ViewModels/Compilers/CreatedModlistVM.cs rename to Wabbajack.App.Wpf/ViewModels/Compilers/CompiledModListTileVM.cs index c229060d8..502d43fbc 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/CreatedModlistVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompiledModListTileVM.cs @@ -8,7 +8,7 @@ namespace Wabbajack { - public class CreatedModlistVM + public class CompiledModListTileVM { private ILogger _logger; public LoadingLock LoadingImageLock { get; } = new(); @@ -16,7 +16,7 @@ public class CreatedModlistVM [Reactive] public CompilerSettings CompilerSettings { get; set; } - public CreatedModlistVM(ILogger logger, CompilerSettings compilerSettings) + public CompiledModListTileVM(ILogger logger, CompilerSettings compilerSettings) { _logger = logger; CompilerSettings = compilerSettings; @@ -26,7 +26,7 @@ public CreatedModlistVM(ILogger logger, CompilerSettings compilerSettings) private void CompileModList() { _logger.LogInformation($"Selected modlist {CompilerSettings.ModListName} for compilation, located in '{CompilerSettings.Source}'"); - NavigateToGlobal.Send(ScreenType.Compiler); + NavigateToGlobal.Send(ScreenType.CompilerDetails); LoadModlistForCompiling.Send(CompilerSettings); } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerDetailsVM.cs similarity index 98% rename from Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Compilers/CompilerDetailsVM.cs index d23c3bc8a..a9c7d41ef 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerDetailsVM.cs @@ -38,12 +38,12 @@ public enum CompilerState Completed, Errored } - public class CompilerVM : BackNavigatingVM, ICpuStatusVM + public class CompilerDetailsVM : BackNavigatingVM, ICpuStatusVM { private readonly DTOSerializer _dtos; private readonly SettingsManager _settingsManager; private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly ResourceMonitor _resourceMonitor; private readonly CompilerSettingsInferencer _inferencer; private readonly Client _wjClient; @@ -75,7 +75,7 @@ public class CompilerVM : BackNavigatingVM, ICpuStatusVM [Reactive] public ErrorResponse ErrorState { get; private set; } - public CompilerVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, + public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, CompilerSettingsInferencer inferencer, Client wjClient) : base(logger) { diff --git a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerHomeVM.cs similarity index 85% rename from Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs rename to Wabbajack.App.Wpf/ViewModels/Compilers/CompilerHomeVM.cs index e19d523c9..c08d5b1a7 100644 --- a/Wabbajack.App.Wpf/ViewModels/CreateModListVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/CompilerHomeVM.cs @@ -29,11 +29,11 @@ namespace Wabbajack { - public class CreateModListVM : ViewModel + public class CompilerHomeVM : ViewModel { private readonly SettingsManager _settingsManager; private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly CancellationToken _cancellationToken; private readonly DTOSerializer _dtos; @@ -41,11 +41,11 @@ public class CreateModListVM : ViewModel public ICommand LoadSettingsCommand { get; set; } [Reactive] - public ObservableCollection CreatedModlists { get; set; } + public ObservableCollection CompiledModLists { get; set; } public FilePickerVM CompilerSettingsPicker { get; private set; } - public CreateModListVM(ILogger logger, SettingsManager settingsManager, + public CompilerHomeVM(ILogger logger, SettingsManager settingsManager, IServiceProvider serviceProvider, DTOSerializer dtos) { _logger = logger; @@ -64,7 +64,7 @@ public CreateModListVM(ILogger logger, SettingsManager settings ]); NewModListCommand = ReactiveCommand.Create(() => { - NavigateToGlobal.Send(ScreenType.Compiler); + NavigateToGlobal.Send(ScreenType.CompilerDetails); LoadModlistForCompiling.Send(new()); }); @@ -73,7 +73,7 @@ public CreateModListVM(ILogger logger, SettingsManager settings CompilerSettingsPicker.SetTargetPathCommand.Execute(null); if(CompilerSettingsPicker.TargetPath != default) { - NavigateToGlobal.Send(ScreenType.Compiler); + NavigateToGlobal.Send(ScreenType.CompilerDetails); var compilerSettings = _dtos.Deserialize(File.ReadAllText(CompilerSettingsPicker.TargetPath.ToString())); LoadModlistForCompiling.Send(compilerSettings); } @@ -87,13 +87,13 @@ public CreateModListVM(ILogger logger, SettingsManager settings private async Task LoadAllCompilerSettings() { - CreatedModlists = new(); + CompiledModLists = new(); var savedCompilerSettingsPaths = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); foreach(var settingsPath in savedCompilerSettingsPaths) { await using var fs = settingsPath.Open(FileMode.Open, FileAccess.Read, FileShare.Read); var settings = (await _dtos.DeserializeAsync(fs))!; - CreatedModlists.Add(new CreatedModlistVM(_logger, settings)); + CompiledModLists.Add(new CompiledModListTileVM(_logger, settings)); } } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compilers/MO2CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compilers/MO2CompilerVM.cs index b9f708ae0..06a197dea 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compilers/MO2CompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compilers/MO2CompilerVM.cs @@ -18,7 +18,7 @@ namespace Wabbajack { public class MO2CompilerVM : ViewModel { - public CompilerVM Parent { get; } + public CompilerDetailsVM Parent { get; } public FilePickerVM DownloadLocation { get; } @@ -41,7 +41,7 @@ public Task> Compile() throw new NotImplementedException(); } - public MO2CompilerVM(CompilerVM parent) + public MO2CompilerVM(CompilerDetailsVM parent) { } } diff --git a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index 767c1b50e..7bf810b1a 100644 --- a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -44,8 +44,8 @@ public class MainWindowVM : ViewModel public ObservableCollectionExtended Log { get; } = new ObservableCollectionExtended(); - public readonly CompilerVM CompilerVM; - public readonly CreateModListVM CreateModListVM; + public readonly CompilerDetailsVM CompilerDetailsVM; + public readonly CompilerHomeVM CompilerHomeVM; public readonly InstallerVM InstallerVM; public readonly SettingsVM SettingsPaneVM; public readonly ModListGalleryVM GalleryVM; @@ -79,7 +79,7 @@ public class MainWindowVM : ViewModel public MainWindowVM(ILogger logger, Client wjClient, IServiceProvider serviceProvider, HomeVM homeVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, - InstallerVM installerVM, CompilerVM compilerVM, CreateModListVM createModListVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM) + InstallerVM installerVM, CompilerDetailsVM compilerVM, CompilerHomeVM compilerHomeVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM) { _logger = logger; _wjClient = wjClient; @@ -87,8 +87,8 @@ public MainWindowVM(ILogger logger, Client wjClient, _serviceProvider = serviceProvider; ConverterRegistration.Register(); InstallerVM = installerVM; - CompilerVM = compilerVM; - CreateModListVM = createModListVM; + CompilerDetailsVM = compilerVM; + CompilerHomeVM = compilerHomeVM; SettingsPaneVM = settingsVM; GalleryVM = modListGalleryVM; HomeVM = homeVM; @@ -235,8 +235,8 @@ private void HandleNavigateTo(ScreenType s) ScreenType.Home => HomeVM, ScreenType.ModListGallery => GalleryVM, ScreenType.Installer => InstallerVM, - ScreenType.Compiler => CompilerVM, - ScreenType.CreateModList => CreateModListVM, + ScreenType.CompilerDetails => CompilerDetailsVM, + ScreenType.CompilerHome => CompilerHomeVM, ScreenType.Settings => SettingsPaneVM, _ => ActivePane }; diff --git a/Wabbajack.App.Wpf/ViewModels/NavigationVM.cs b/Wabbajack.App.Wpf/ViewModels/NavigationVM.cs index 5212f7339..75335e5c9 100644 --- a/Wabbajack.App.Wpf/ViewModels/NavigationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/NavigationVM.cs @@ -37,7 +37,7 @@ public NavigationVM(ILogger logger) LoadLastLoadedModlist.Send(); NavigateToGlobal.Send(ScreenType.Installer); }); - CreateModListCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.CreateModList)); + CompileModListCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.CompilerHome)); SettingsCommand = ReactiveCommand.Create( /* canExecute: this.WhenAny(x => x.ActivePane) @@ -58,7 +58,7 @@ public NavigationVM(ILogger logger) public ICommand HomeCommand { get; } public ICommand BrowseCommand { get; } public ICommand InstallCommand { get; } - public ICommand CreateModListCommand { get; } + public ICommand CompileModListCommand { get; } public ICommand SettingsCommand { get; } public string Version { get; } } diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilationCompleteView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CompilationCompleteView.xaml index 158f2e5f4..170d370ef 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilationCompleteView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilationCompleteView.xaml @@ -9,7 +9,7 @@ xmlns:rxui="http://reactiveui.net" d:DesignHeight="450" d:DesignWidth="800" - x:TypeArguments="local:CompilerVM" + x:TypeArguments="local:CompilerDetailsVM" mc:Ignorable="d"> diff --git a/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CompiledModListTileView.xaml similarity index 99% rename from Wabbajack.App.Wpf/Views/CreateModListTileView.xaml rename to Wabbajack.App.Wpf/Views/Compilers/CompiledModListTileView.xaml index e138d719a..feaa3baf8 100644 --- a/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CompiledModListTileView.xaml @@ -1,5 +1,5 @@ diff --git a/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompiledModListTileView.xaml.cs similarity index 90% rename from Wabbajack.App.Wpf/Views/CreateModListTileView.xaml.cs rename to Wabbajack.App.Wpf/Views/Compilers/CompiledModListTileView.xaml.cs index 66565f45a..1174c1999 100644 --- a/Wabbajack.App.Wpf/Views/CreateModListTileView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompiledModListTileView.xaml.cs @@ -10,9 +10,9 @@ namespace Wabbajack /// /// Interaction logic for CreateModListTileView.xaml /// - public partial class CreatedModListTileView : ReactiveUserControl + public partial class CompiledModListTileView : ReactiveUserControl { - public CreatedModListTileView() + public CompiledModListTileView() { InitializeComponent(); this.WhenActivated(dispose => diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CompilerDetailsView.xaml similarity index 98% rename from Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml rename to Wabbajack.App.Wpf/Views/Compilers/CompilerDetailsView.xaml index 4ce3f79d6..0382426a4 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerDetailsView.xaml @@ -1,5 +1,5 @@  diff --git a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerDetailsView.xaml.cs similarity index 99% rename from Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs rename to Wabbajack.App.Wpf/Views/Compilers/CompilerDetailsView.xaml.cs index 2caf31aa9..3865789b9 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CompilerView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerDetailsView.xaml.cs @@ -19,11 +19,11 @@ namespace Wabbajack { /// - /// Interaction logic for CompilerView.xaml + /// Interaction logic for CompilerDetailsView.xaml /// - public partial class CompilerView : ReactiveUserControl + public partial class CompilerDetailsView : ReactiveUserControl { - public CompilerView() + public CompilerDetailsView() { InitializeComponent(); diff --git a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml b/Wabbajack.App.Wpf/Views/Compilers/CompilerHomeView.xaml similarity index 95% rename from Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml rename to Wabbajack.App.Wpf/Views/Compilers/CompilerHomeView.xaml index abc9e7a23..48cc4e50f 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerHomeView.xaml @@ -1,5 +1,5 @@  @@ -111,7 +111,7 @@ @@ -121,7 +121,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs b/Wabbajack.App.Wpf/Views/Compilers/CompilerHomeView.xaml.cs similarity index 82% rename from Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs rename to Wabbajack.App.Wpf/Views/Compilers/CompilerHomeView.xaml.cs index ff59c9d66..42c9bc37f 100644 --- a/Wabbajack.App.Wpf/Views/Compilers/CreateModListView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compilers/CompilerHomeView.xaml.cs @@ -22,16 +22,16 @@ namespace Wabbajack /// /// Interaction logic for CreateModList.xaml /// - public partial class CreateModListView : ReactiveUserControl + public partial class CompilerHomeView : ReactiveUserControl { - public CreateModListView() + public CompilerHomeView() { InitializeComponent(); this.WhenActivated(dispose => { - this.WhenAny(x => x.ViewModel.CreatedModlists) - .BindToStrict(this, x => x.CreatedModListsControl.ItemsSource) + this.WhenAny(x => x.ViewModel.CompiledModLists) + .BindToStrict(this, x => x.CompiledModListsControl.ItemsSource) .DisposeWith(dispose); NewModListBorder diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 35ed56708..3745a834c 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -67,21 +67,21 @@ - - - - - - - - - + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs index ce25be7f0..7fd1b6745 100644 --- a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs @@ -23,7 +23,7 @@ public NavigationView() ScreenButtonDictionary = new() { { ScreenType.Home, HomeButton }, { ScreenType.ModListGallery, BrowseButton }, - { ScreenType.CreateModList, CompileButton }, + { ScreenType.CompilerHome, CompileButton }, { ScreenType.Settings, SettingsButton }, }; this.WhenActivated(dispose => @@ -32,7 +32,7 @@ public NavigationView() .DisposeWith(dispose); this.BindCommand(ViewModel, vm => vm.HomeCommand, v => v.HomeButton) .DisposeWith(dispose); - this.BindCommand(ViewModel, vm => vm.CreateModListCommand, v => v.CompileButton) + this.BindCommand(ViewModel, vm => vm.CompileModListCommand, v => v.CompileButton) .DisposeWith(dispose); this.BindCommand(ViewModel, vm => vm.SettingsCommand, v => v.SettingsButton) .DisposeWith(dispose); From 9af6e8a4c8286f21d7aeed33997a27a5fc583487 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 21 May 2024 23:10:37 +0200 Subject: [PATCH 056/294] Add boilerplate for starting on compiler file manager --- Wabbajack.App.Wpf/App.xaml.cs | 3 +- ...orCompiling.cs => LoadCompilerSettings.cs} | 7 +- .../Messages/NavigateToGlobal.cs | 3 +- Wabbajack.App.Wpf/Themes/Styles.xaml | 91 ++++++++++---- .../CompiledModListTileVM.cs | 2 +- .../CompilerDetailsVM.cs | 14 ++- .../Compiler/CompilerFileManagerVM.cs | 99 +++++++++++++++ .../{Compilers => Compiler}/CompilerHomeVM.cs | 4 +- .../CompilerSettingsVM.cs | 0 .../{Compilers => Compiler}/MO2CompilerVM.cs | 0 Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 11 +- .../Views/Common/DetailImageView.xaml | 33 +---- .../Views/Common/DetailImageView.xaml.cs | 2 + .../Views/Common/FilePicker.xaml | 2 +- .../CompilationCompleteView.xaml | 0 .../CompilationCompleteView.xaml.cs | 0 .../CompiledModListTileView.xaml | 0 .../CompiledModListTileView.xaml.cs | 0 .../CompilerDetailsView.xaml | 114 ++++++------------ .../CompilerDetailsView.xaml.cs | 96 +-------------- .../Views/Compiler/CompilerFileManager.xaml | 22 ++++ .../Compiler/CompilerFileManager.xaml.cs | 39 ++++++ .../CompilerHomeView.xaml | 0 .../CompilerHomeView.xaml.cs | 0 .../MO2CompilerConfigView.xaml | 13 -- .../MO2CompilerConfigView.xaml.cs | 0 Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 2 +- 27 files changed, 297 insertions(+), 260 deletions(-) rename Wabbajack.App.Wpf/Messages/{LoadModlistForCompiling.cs => LoadCompilerSettings.cs} (65%) rename Wabbajack.App.Wpf/ViewModels/{Compilers => Compiler}/CompiledModListTileVM.cs (94%) rename Wabbajack.App.Wpf/ViewModels/{Compilers => Compiler}/CompilerDetailsVM.cs (96%) create mode 100644 Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs rename Wabbajack.App.Wpf/ViewModels/{Compilers => Compiler}/CompilerHomeVM.cs (96%) rename Wabbajack.App.Wpf/ViewModels/{Compilers => Compiler}/CompilerSettingsVM.cs (100%) rename Wabbajack.App.Wpf/ViewModels/{Compilers => Compiler}/MO2CompilerVM.cs (100%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompilationCompleteView.xaml (100%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompilationCompleteView.xaml.cs (100%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompiledModListTileView.xaml (100%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompiledModListTileView.xaml.cs (100%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompilerDetailsView.xaml (70%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompilerDetailsView.xaml.cs (75%) create mode 100644 Wabbajack.App.Wpf/Views/Compiler/CompilerFileManager.xaml create mode 100644 Wabbajack.App.Wpf/Views/Compiler/CompilerFileManager.xaml.cs rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompilerHomeView.xaml (100%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/CompilerHomeView.xaml.cs (100%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/MO2CompilerConfigView.xaml (78%) rename Wabbajack.App.Wpf/Views/{Compilers => Compiler}/MO2CompilerConfigView.xaml.cs (100%) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 34dc1e434..70f921941 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -168,8 +168,9 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); - services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs b/Wabbajack.App.Wpf/Messages/LoadCompilerSettings.cs similarity index 65% rename from Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs rename to Wabbajack.App.Wpf/Messages/LoadCompilerSettings.cs index e6374ef7d..dce948d81 100644 --- a/Wabbajack.App.Wpf/Messages/LoadModlistForCompiling.cs +++ b/Wabbajack.App.Wpf/Messages/LoadCompilerSettings.cs @@ -6,17 +6,16 @@ namespace Wabbajack.Messages; -public class LoadModlistForCompiling +public class LoadCompilerSettings { public CompilerSettings CompilerSettings { get; set; } - public LoadModlistForCompiling(CompilerSettings cs) + public LoadCompilerSettings(CompilerSettings cs) { CompilerSettings = cs; } - public static void Send(CompilerSettings cs) { - MessageBus.Current.SendMessage(new LoadModlistForCompiling(cs)); + MessageBus.Current.SendMessage(new LoadCompilerSettings(cs)); } } \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs index 83c224d21..a25563ba5 100644 --- a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs +++ b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs @@ -8,8 +8,9 @@ public enum ScreenType ModListGallery, Installer, Settings, - CompilerDetails, CompilerHome, + CompilerDetails, + CompilerFileManager, ModListContents, WebBrowser } diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 55d386b2b..f5542a6cd 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -1141,7 +1141,7 @@ - + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs index a939f1819..9f76564a9 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs @@ -51,12 +51,22 @@ public enum CompilerFileState } public class FileTreeViewItemVM : TreeViewItem { - public int Depth { get; set; } + private CompilerFileState _compilerFileState = CompilerFileState.AutoMatch; public FileSystemInfo Info { get; set; } public bool IsDirectory { get; set; } public Symbol Symbol { get; set; } - public CompilerFileState CompilerFileState { get; set; } + public CompilerFileState CompilerFileState + { + get => _compilerFileState; + set + { + _compilerFileState = value; + SpecialFileState = _compilerFileState != CompilerFileState.AutoMatch; + } + } + public RelativePath PathRelativeToRoot { get; set; } + [Reactive] public bool SpecialFileState { get; set; } public FileTreeViewItemVM(DirectoryInfo info) { Info = info; @@ -84,6 +94,7 @@ public FileTreeViewItemVM(FileInfo info) ".esp" or ".esl" or ".esm" or ".archive" => Symbol.DocumentTable, _ => Symbol.Document }; + SpecialFileState = CompilerFileState != CompilerFileState.AutoMatch; } public override string ToString() => Info.FullName; } @@ -158,7 +169,15 @@ private IEnumerable LoadDirectoryContents(DirectoryInfo parent) else if(Settings.Include.Contains(item.PathRelativeToRoot)) { item.CompilerFileState = CompilerFileState.Include; } else if(Settings.Ignore.Contains(item.PathRelativeToRoot)) { item.CompilerFileState = CompilerFileState.Ignore; } else if(Settings.AlwaysEnabled.Contains(item.PathRelativeToRoot)) { item.CompilerFileState = CompilerFileState.AlwaysEnabled; } - + item.SpecialFileState = item.CompilerFileState != CompilerFileState.AutoMatch; + while(!item.SpecialFileState) + { + item.SpecialFileState = Settings.NoMatchInclude.Any(p => item.PathRelativeToRoot.InFolder(p)); + item.SpecialFileState = Settings.Include.Any(p => item.PathRelativeToRoot.InFolder(p)); + item.SpecialFileState = Settings.Ignore.Any(p => item.PathRelativeToRoot.InFolder(p)); + item.SpecialFileState = Settings.AlwaysEnabled.Any(p => item.PathRelativeToRoot.InFolder(p)); + break; + } return item; }) .Concat(parent.EnumerateFiles() From 2556c54e9941319e8b9eca37ec408b1365cf63b4 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 9 Jun 2024 10:17:16 +0200 Subject: [PATCH 065/294] Refactor FileTreeViewItem to actually be reactive --- Wabbajack.App.Wpf/Themes/Styles.xaml | 19 ++--- .../Compiler/CompilerFileManagerVM.cs | 82 +++++++++++-------- 2 files changed, 55 insertions(+), 46 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 28f771d9b..f3bd352f3 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -2188,12 +2188,12 @@ - - - - + + From 30ab06a304d8ae58af13454835cb706f35d90068 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 24 Jun 2024 19:50:46 +0200 Subject: [PATCH 067/294] Save CompilerFileState changes in file manager to disk, create base compiler class --- .../ViewModels/Compiler/BaseCompilerVM.cs | 53 +++++++++++++ .../ViewModels/Compiler/CompilerDetailsVM.cs | 49 ++---------- .../Compiler/CompilerFileManagerVM.cs | 78 +++++++------------ 3 files changed, 88 insertions(+), 92 deletions(-) create mode 100644 Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs new file mode 100644 index 000000000..86ab61d48 --- /dev/null +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reactive.Disposables; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using Wabbajack.DTOs; +using Wabbajack.DTOs.JsonConverters; +using Wabbajack.Paths; +using Wabbajack.Services.OSIntegrated; +using Wabbajack.Paths.IO; +using System.Linq; +using Wabbajack.Networking.WabbajackClientApi; + +namespace Wabbajack +{ + public abstract class BaseCompilerVM : BackNavigatingVM + { + protected readonly DTOSerializer _dtos; + protected readonly SettingsManager _settingsManager; + protected readonly ILogger _logger; + protected readonly Client _wjClient; + + [Reactive] public CompilerSettingsVM Settings { get; set; } = new(); + + public BaseCompilerVM(DTOSerializer dtos, SettingsManager settingsManager, ILogger logger, Client wjClient) : base(logger) + { + _dtos = dtos; + _settingsManager = settingsManager; + _logger = logger; + _wjClient = wjClient; + } + + protected async Task SaveSettings() + { + if (Settings.Source == default || Settings.CompilerSettingsPath == default) return; + + await using var st = Settings.CompilerSettingsPath.Open(FileMode.Create, FileAccess.Write, FileShare.None); + await JsonSerializer.SerializeAsync(st, Settings.ToCompilerSettings(), _dtos.Options); + + var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); + + // Don't simply remove Settings.CompilerSettingsPath here, because WJ sometimes likes to make default compiler settings files + allSavedCompilerSettings.RemoveAll(path => path.Parent == Settings.Source); + allSavedCompilerSettings.Insert(0, Settings.CompilerSettingsPath); + + await _settingsManager.Save(Consts.AllSavedCompilerSettingsPaths, allSavedCompilerSettings); + } + } +} diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs index 30eeb3eec..4372e7c8b 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs @@ -38,15 +38,11 @@ public enum CompilerState Completed, Errored } - public class CompilerDetailsVM : BackNavigatingVM, ICpuStatusVM + public class CompilerDetailsVM : BaseCompilerVM, ICpuStatusVM { - private readonly DTOSerializer _dtos; - private readonly SettingsManager _settingsManager; private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; private readonly ResourceMonitor _resourceMonitor; private readonly CompilerSettingsInferencer _inferencer; - private readonly Client _wjClient; [Reactive] public string StatusText { get; set; } [Reactive] public Percent StatusProgress { get; set; } @@ -62,8 +58,6 @@ public class CompilerDetailsVM : BackNavigatingVM, ICpuStatusVM public FilePickerVM DownloadLocation { get; } public FilePickerVM OutputLocation { get; } - [Reactive] public CompilerSettingsVM Settings { get; set; } = new(); - public FilePickerVM ModListImageLocation { get; } = new(); /* public ReactiveCommand ExecuteCommand { get; } */ @@ -78,16 +72,12 @@ public class CompilerDetailsVM : BackNavigatingVM, ICpuStatusVM public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, - CompilerSettingsInferencer inferencer, Client wjClient) : base(logger) + CompilerSettingsInferencer inferencer, Client wjClient) : base(dtos, settingsManager, logger, wjClient) { - _logger = logger; - _dtos = dtos; - _settingsManager = settingsManager; _serviceProvider = serviceProvider; LoggerProvider = loggerProvider; _resourceMonitor = resourceMonitor; _inferencer = inferencer; - _wjClient = wjClient; MessageBus.Current.Listen() .Subscribe(msg => { @@ -105,7 +95,7 @@ public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, BackCommand = ReactiveCommand.CreateFromTask(async () => { - await SaveSettingsFile(); + await SaveSettings(); NavigateToGlobal.Send(ScreenType.Home); }); @@ -179,7 +169,7 @@ public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, this.WhenAnyValue(x => x.Settings) .Throttle(TimeSpan.FromSeconds(2)) - .Subscribe(_ => SaveSettingsFile().FireAndForget()) + .Subscribe(_ => SaveSettings().FireAndForget()) .DisposeWith(disposables); /* @@ -264,7 +254,7 @@ private async Task InferModListFromLocation(AbsolutePath path) private async Task NextPage() { - await SaveSettingsFile(); + await SaveSettings(); NavigateToGlobal.Send(ScreenType.CompilerFileManager); LoadCompilerSettings.Send(Settings.ToCompilerSettings()); } @@ -275,7 +265,7 @@ private async Task StartCompilation() { try { - await SaveSettingsFile(); + await SaveSettings(); var token = CancellationToken.None; State = CompilerState.Compiling; @@ -369,33 +359,6 @@ private async Task RunPreflightChecks(CancellationToken token) return true; } - private async Task SaveSettingsFile() - { - if (Settings.Source == default || Settings.CompilerSettingsPath == default) return; - - await using var st = Settings.CompilerSettingsPath.Open(FileMode.Create, FileAccess.Write, FileShare.None); - await JsonSerializer.SerializeAsync(st, Settings.ToCompilerSettings(), _dtos.Options); - - var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); - - // Don't simply remove Settings.CompilerSettingsPath here, because WJ sometimes likes to make default compiler settings files - allSavedCompilerSettings.RemoveAll(path => path.Parent == Settings.Source); - allSavedCompilerSettings.Insert(0, Settings.CompilerSettingsPath); - - await _settingsManager.Save(Consts.AllSavedCompilerSettingsPaths, allSavedCompilerSettings); - } - - private async Task LoadLastSavedSettings() - { - AbsolutePath lastPath = default; - var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); - if (allSavedCompilerSettings.Any()) - lastPath = allSavedCompilerSettings[0]; - - if (lastPath == default || !lastPath.FileExists() || lastPath.FileName.Extension != Ext.CompilerSettings) return; - ModlistLocation.TargetPath = lastPath; - } - #region ListOps public void AddOtherProfile(string profile) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs index 5741665f3..c4a706b1b 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs @@ -3,32 +3,22 @@ using System.Collections.ObjectModel; using System.IO; using System.Linq; -using System.Reactive; using Microsoft.Extensions.Logging; using Wabbajack.Messages; using ReactiveUI; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Text.Json; -using System.Threading; using System.Threading.Tasks; -using System.Windows.Media; -using DynamicData; -using Microsoft.WindowsAPICodePack.Dialogs; using ReactiveUI.Fody.Helpers; using Wabbajack.Common; using Wabbajack.Compiler; -using Wabbajack.DTOs; using Wabbajack.DTOs.JsonConverters; -using Wabbajack.Extensions; -using Wabbajack.Installer; using Wabbajack.Models; using Wabbajack.Networking.WabbajackClientApi; using Wabbajack.Paths; using Wabbajack.Paths.IO; -using Wabbajack.RateLimiter; using Wabbajack.Services.OSIntegrated; -using NexusMods.Paths.FileTree; using System.Windows.Controls; using FluentIcons.Common; using System.Windows.Input; @@ -114,31 +104,22 @@ public void Dispose() _disposable.Dispose(); } } - public class CompilerFileManagerVM : BackNavigatingVM + public class CompilerFileManagerVM : BaseCompilerVM { - private readonly DTOSerializer _dtos; - private readonly SettingsManager _settingsManager; private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; private readonly ResourceMonitor _resourceMonitor; private readonly CompilerSettingsInferencer _inferencer; - private readonly Client _wjClient; - [Reactive] public CompilerSettingsVM Settings { get; set; } = new(); public ObservableCollection Files { get; set; } public ICommand PrevCommand { get; set; } public CompilerFileManagerVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, - CompilerSettingsInferencer inferencer, Client wjClient) : base(logger) + CompilerSettingsInferencer inferencer, Client wjClient) : base(dtos, settingsManager, logger, wjClient) { - _logger = logger; - _dtos = dtos; - _settingsManager = settingsManager; _serviceProvider = serviceProvider; _resourceMonitor = resourceMonitor; _inferencer = inferencer; - _wjClient = wjClient; MessageBus.Current.Listen() .Subscribe(msg => { @@ -152,6 +133,7 @@ public CompilerFileManagerVM(ILogger logger, DTOSerialize { var fileTree = GetDirectoryContents(new DirectoryInfo(Settings.Source.ToString())); Files = LoadFiles(new DirectoryInfo(Settings.Source.ToString())); + Disposable.Create(() => { }).DisposeWith(disposables); }); } @@ -202,11 +184,11 @@ private IEnumerable LoadDirectoryContents(DirectoryInfo parent) .Select(file => new FileTreeViewItem(file))); } - private void Header_PropertyChanged(object sender, PropertyChangedEventArgs e) + private async void Header_PropertyChanged(object sender, PropertyChangedEventArgs e) { + var updatedItem = (FileTreeItemVM)sender; if(e.PropertyName == nameof(FileTreeItemVM.SpecialFileState)) { - var updatedItem = (FileTreeItemVM)sender; IEnumerable currentEnumerable = null; for (int i = 0; i < updatedItem.PathRelativeToRoot.Depth - 1; i++) { @@ -218,6 +200,30 @@ private void Header_PropertyChanged(object sender, PropertyChangedEventArgs e) currentEnumerable = (IEnumerable)currentItem.ItemsSource; } } + else if(e.PropertyName == nameof(FileTreeItemVM.CompilerFileState)) + { + Settings.NoMatchInclude.Remove(updatedItem.PathRelativeToRoot); + Settings.Include.Remove(updatedItem.PathRelativeToRoot); + Settings.Ignore.Remove(updatedItem.PathRelativeToRoot); + Settings.AlwaysEnabled.Remove(updatedItem.PathRelativeToRoot); + + switch(updatedItem.CompilerFileState) + { + case CompilerFileState.NoMatchInclude: + Settings.NoMatchInclude.Add(updatedItem.PathRelativeToRoot); + break; + case CompilerFileState.Include: + Settings.Include.Add(updatedItem.PathRelativeToRoot); + break; + case CompilerFileState.Ignore: + Settings.Ignore.Add(updatedItem.PathRelativeToRoot); + break; + case CompilerFileState.AlwaysEnabled: + Settings.AlwaysEnabled.Add(updatedItem.PathRelativeToRoot); + break; + }; + await SaveSettings(); + } } private void LoadingItem_Expanded(object sender, System.Windows.RoutedEventArgs e) @@ -246,31 +252,5 @@ private async Task NextPage() NavigateToGlobal.Send(ScreenType.CompilerFileManager); LoadCompilerSettings.Send(Settings.ToCompilerSettings()); } - - private async Task SaveSettingsFile() - { - if (Settings.Source == default || Settings.CompilerSettingsPath == default) return; - - await using var st = Settings.CompilerSettingsPath.Open(FileMode.Create, FileAccess.Write, FileShare.None); - await JsonSerializer.SerializeAsync(st, Settings.ToCompilerSettings(), _dtos.Options); - - var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); - - // Don't simply remove Settings.CompilerSettingsPath here, because WJ sometimes likes to make default compiler settings files - allSavedCompilerSettings.RemoveAll(path => path.Parent == Settings.Source); - allSavedCompilerSettings.Insert(0, Settings.CompilerSettingsPath); - - await _settingsManager.Save(Consts.AllSavedCompilerSettingsPaths, allSavedCompilerSettings); - } - - private async Task LoadLastSavedSettings() - { - AbsolutePath lastPath = default; - var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); - if (allSavedCompilerSettings.Any()) - lastPath = allSavedCompilerSettings[0]; - - if (lastPath == default || !lastPath.FileExists() || lastPath.FileName.Extension != Ext.CompilerSettings) return; - } } } From da08c86813a37483a5e8a80137cadf1eb83f32f3 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 11 Sep 2024 23:59:32 +0200 Subject: [PATCH 068/294] Test if file browser works without these changes --- .../PublishProfiles/FolderProfile.pubxml | 18 ++++ .../ViewModels/Compiler/BaseCompilerVM.cs | 29 ++++++- .../ViewModels/Compiler/CompilerDetailsVM.cs | 17 +--- .../Compiler/CompilerFileManagerVM.cs | 14 ++- .../ViewModels/Compiler/CompilerHomeVM.cs | 13 ++- .../Views/Compiler/CompilerDetailsView.xaml | 86 +------------------ .../Compiler/CompilerDetailsView.xaml.cs | 49 +---------- .../Compiler/CompilerFileManagerView.xaml.cs | 5 ++ Wabbajack.CLI/Properties/launchSettings.json | 8 ++ 9 files changed, 83 insertions(+), 156 deletions(-) create mode 100644 Wabbajack.App.Wpf/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 Wabbajack.CLI/Properties/launchSettings.json diff --git a/Wabbajack.App.Wpf/Properties/PublishProfiles/FolderProfile.pubxml b/Wabbajack.App.Wpf/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 000000000..acb3e3351 --- /dev/null +++ b/Wabbajack.App.Wpf/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + Release + Any CPU + bin\Release\Publish + FileSystem + <_TargetId>Folder + net8.0-windows + win-x64 + true + false + false + + \ No newline at end of file diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs index 86ab61d48..59a7d25c8 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/BaseCompilerVM.cs @@ -14,6 +14,8 @@ using Wabbajack.Paths.IO; using System.Linq; using Wabbajack.Networking.WabbajackClientApi; +using System.Threading; +using Wabbajack.Messages; namespace Wabbajack { @@ -32,14 +34,28 @@ public BaseCompilerVM(DTOSerializer dtos, SettingsManager settingsManager, ILogg _settingsManager = settingsManager; _logger = logger; _wjClient = wjClient; + + MessageBus.Current.Listen() + .Subscribe(msg => { + var csVm = new CompilerSettingsVM(msg.CompilerSettings); + Settings = csVm; + }) + .DisposeWith(CompositeDisposable); } protected async Task SaveSettings() { if (Settings.Source == default || Settings.CompilerSettingsPath == default) return; - await using var st = Settings.CompilerSettingsPath.Open(FileMode.Create, FileAccess.Write, FileShare.None); - await JsonSerializer.SerializeAsync(st, Settings.ToCompilerSettings(), _dtos.Options); + try + { + await using var st = Settings.CompilerSettingsPath.Open(FileMode.Create, FileAccess.Write, FileShare.None); + await JsonSerializer.SerializeAsync(st, Settings.ToCompilerSettings(), new JsonSerializerOptions(_dtos.Options) { WriteIndented = true }); + } + catch(Exception ex) + { + _logger.LogError("Failed to save compiler settings to {0}! {1}", Settings.CompilerSettingsPath, ex.ToString()); + } var allSavedCompilerSettings = await _settingsManager.Load>(Consts.AllSavedCompilerSettingsPaths); @@ -47,7 +63,14 @@ protected async Task SaveSettings() allSavedCompilerSettings.RemoveAll(path => path.Parent == Settings.Source); allSavedCompilerSettings.Insert(0, Settings.CompilerSettingsPath); - await _settingsManager.Save(Consts.AllSavedCompilerSettingsPaths, allSavedCompilerSettings); + try + { + await _settingsManager.Save(Consts.AllSavedCompilerSettingsPaths, allSavedCompilerSettings); + } + catch(Exception ex) + { + _logger.LogError("Failed to save all saved compiler settings! {0}", ex.ToString()); + } } } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs index 4372e7c8b..752f7bb23 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs @@ -79,17 +79,6 @@ public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, _resourceMonitor = resourceMonitor; _inferencer = inferencer; - MessageBus.Current.Listen() - .Subscribe(msg => { - var csVm = new CompilerSettingsVM(msg.CompilerSettings); - ModlistLocation.TargetPath = csVm.ProfilePath; - ModListImageLocation.TargetPath = csVm.ModListImage; - DownloadLocation.TargetPath = csVm.Downloads; - OutputLocation.TargetPath = csVm.OutputFile; - Settings = csVm; - }) - .DisposeWith(CompositeDisposable); - StatusText = "Compiler Settings"; StatusProgress = Percent.Zero; @@ -167,9 +156,9 @@ public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, .BindToStrict(this, vm => vm.ErrorState) .DisposeWith(disposables); - this.WhenAnyValue(x => x.Settings) - .Throttle(TimeSpan.FromSeconds(2)) - .Subscribe(_ => SaveSettings().FireAndForget()) + this.WhenAnyValue(x => x.ModlistLocation.TargetPath) + .Select(x => x != default ? x.Parent.Parent : default) + .BindToStrict(this, vm => vm.Settings.Source) .DisposeWith(disposables); /* diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs index c4a706b1b..02362abc5 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs @@ -121,18 +121,14 @@ public CompilerFileManagerVM(ILogger logger, DTOSerialize _resourceMonitor = resourceMonitor; _inferencer = inferencer; - MessageBus.Current.Listen() - .Subscribe(msg => { - var csVm = new CompilerSettingsVM(msg.CompilerSettings); - Settings = csVm; - }) - .DisposeWith(CompositeDisposable); - PrevCommand = ReactiveCommand.Create(PrevPage); this.WhenActivated(disposables => { - var fileTree = GetDirectoryContents(new DirectoryInfo(Settings.Source.ToString())); - Files = LoadFiles(new DirectoryInfo(Settings.Source.ToString())); + if (Settings.Source != default) + { + var fileTree = GetDirectoryContents(new DirectoryInfo(Settings.Source.ToString())); + Files = LoadFiles(new DirectoryInfo(Settings.Source.ToString())); + } Disposable.Create(() => { }).DisposeWith(disposables); }); diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs index 5b9efc75c..b01ae3cba 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs @@ -73,9 +73,16 @@ public CompilerHomeVM(ILogger logger, SettingsManager settingsMa CompilerSettingsPicker.SetTargetPathCommand.Execute(null); if(CompilerSettingsPicker.TargetPath != default) { - NavigateToGlobal.Send(ScreenType.CompilerDetails); - var compilerSettings = _dtos.Deserialize(File.ReadAllText(CompilerSettingsPicker.TargetPath.ToString())); - LoadCompilerSettings.Send(compilerSettings); + try + { + var compilerSettings = _dtos.Deserialize(File.ReadAllText(CompilerSettingsPicker.TargetPath.ToString())); + NavigateToGlobal.Send(ScreenType.CompilerDetails); + LoadCompilerSettings.Send(compilerSettings); + } + catch (Exception ex) + { + _logger.LogError("Failed to load compiler settings from {0}! {1}", CompilerSettingsPicker.TargetPath, ex.ToString()); + } } }); diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml index eba04e700..2fe79d5f3 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml @@ -96,84 +96,6 @@ Text="MachineUrl" ToolTip="If this box has a value the modlist will be published to this MachineUrl after compilation" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -193,17 +115,17 @@ Margin="16, 0, 0, 8" VerticalAlignment="Center" FontSize="14" - Text="Output Location" + Text="Modlist Location" TextAlignment="Center" - ToolTip="The folder to place the resulting modlist.wabbajack file" /> + ToolTip="The folder in which the modlist is located" /> + ToolTip="The folder in which the modlist is located (containing the 'mods' folder)" /> public partial class NavigationView : ReactiveUserControl { - public Dictionary ScreenButtonDictionary { get; set; } + public Dictionary, Button> ScreenButtonDictionary { get; set; } public NavigationView() { InitializeComponent(); ScreenButtonDictionary = new() { - { ScreenType.Home, HomeButton }, - { ScreenType.ModListGallery, BrowseButton }, - { ScreenType.CompilerHome, CompileButton }, - { ScreenType.Settings, SettingsButton }, + { [ScreenType.Home], HomeButton }, + { [ScreenType.ModListGallery], BrowseButton }, + { [ ScreenType.CompilerHome, ScreenType.CompilerDetails, ScreenType.CompilerFileManager ], CompileButton }, + { [ScreenType.Settings], SettingsButton }, }; this.WhenActivated(dispose => { @@ -61,9 +62,9 @@ private void SetButtonActive(ScreenType activeScreen) { var activeButtonStyle = (Style)Application.Current.Resources["ActiveNavButtonStyle"]; var mainButtonStyle = (Style)Application.Current.Resources["MainNavButtonStyle"]; - foreach(var (screen, button) in ScreenButtonDictionary) + foreach(var (screens, button) in ScreenButtonDictionary) { - if (screen == activeScreen) + if (screens.Contains(activeScreen)) button.Style = activeButtonStyle; else button.Style = mainButtonStyle; From 5db276327ee10e7dfadceb9289c4e933d6454b8b Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:34:49 +0200 Subject: [PATCH 081/294] Add final compiler screen template --- Wabbajack.App.Wpf/App.xaml.cs | 1 + .../Messages/NavigateToGlobal.cs | 1 + .../ViewModels/Compiler/CompilerDetailsVM.cs | 111 --------- .../Compiler/CompilerFileManagerVM.cs | 6 +- .../ViewModels/Compiler/CompilerMainVM.cs | 234 ++++++++++++++++++ .../ViewModels/Compiler/MO2CompilerVM.cs | 4 +- Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 7 +- .../Compiler/CompilerFileManagerView.xaml | 2 +- .../Views/Compiler/CompilerMainView.xaml | 23 ++ .../Views/Compiler/CompilerMainView.xaml.cs | 29 +++ Wabbajack.App.Wpf/Views/MainWindow.xaml | 73 +++--- .../Views/NavigationView.xaml.cs | 10 +- 12 files changed, 339 insertions(+), 162 deletions(-) create mode 100644 Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs create mode 100644 Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml create mode 100644 Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index e1a5d3c88..a62ea801c 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -173,6 +173,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs index c03e3e75d..9bf781f35 100644 --- a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs +++ b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs @@ -11,6 +11,7 @@ public enum ScreenType CompilerHome, CompilerDetails, CompilerFileManager, + CompilerMain, ModListContents, WebBrowser, Info diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs index 0a98b1a2e..cd3a90f50 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs @@ -88,17 +88,6 @@ public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, SubCompilerVM = new MO2CompilerVM(this); - //ExecuteCommand = ReactiveCommand.CreateFromTask(async () => await StartCompilation()); - /*ReInferSettingsCommand = ReactiveCommand.CreateFromTask(async () => await ReInferSettings(), - - this.WhenAnyValue(vm => vm.Settings.Source) - .ObserveOnGuiThread() - .Select(v => v != default) - .CombineLatest(this.WhenAnyValue(vm => vm.Settings.ModListName) - .ObserveOnGuiThread() - .Select(p => !string.IsNullOrWhiteSpace(p))) - .Select(v => v.First && v.Second)); - */ NextCommand = ReactiveCommand.CreateFromTask(NextPage); @@ -239,106 +228,6 @@ private async Task NextPage() LoadCompilerSettings.Send(Settings.ToCompilerSettings()); } - private async Task StartCompilation() - { - var tsk = Task.Run(async () => - { - try - { - await SaveSettings(); - var token = CancellationToken.None; - State = CompilerState.Compiling; - - Settings.UseGamePaths = true; - if (Settings.OutputFile.DirectoryExists()) - Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath() - .WithExtension(Ext.Wabbajack)); - - if (Settings.PublishUpdate && !await RunPreflightChecks(token)) - { - State = CompilerState.Errored; - return; - } - - var compiler = MO2Compiler.Create(_serviceProvider, Settings.ToCompilerSettings()); - - var events = Observable.FromEventPattern(h => compiler.OnStatusUpdate += h, - h => compiler.OnStatusUpdate -= h) - .ObserveOnGuiThread() - .Debounce(TimeSpan.FromSeconds(0.5)) - .Subscribe(update => - { - var s = update.EventArgs; - StatusText = $"[Step {s.CurrentStep}] {s.StatusText}"; - StatusProgress = s.StepProgress; - }); - - - try - { - var result = await compiler.Begin(token); - if (!result) - throw new Exception("Compilation Failed"); - } - finally - { - events.Dispose(); - } - - if (Settings.PublishUpdate) - { - _logger.LogInformation("Publishing List"); - var downloadMetadata = _dtos.Deserialize( - await Settings.OutputFile.WithExtension(Ext.Meta).WithExtension(Ext.Json).ReadAllTextAsync())!; - await _wjClient.PublishModlist(Settings.MachineUrl, Version.Parse(Settings.Version), Settings.OutputFile, downloadMetadata); - } - _logger.LogInformation("Compiler Finished"); - - RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => - { - StatusText = "Compilation Completed"; - StatusProgress = Percent.Zero; - State = CompilerState.Completed; - return Disposable.Empty; - }); - - - } - catch (Exception ex) - { - RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => - { - StatusText = "Compilation Failed"; - StatusProgress = Percent.Zero; - - State = CompilerState.Errored; - _logger.LogInformation(ex, "Failed Compilation : {Message}", ex.Message); - return Disposable.Empty; - }); - } - }); - - await tsk; - } - - private async Task RunPreflightChecks(CancellationToken token) - { - var lists = await _wjClient.GetMyModlists(token); - if (!lists.Any(x => x.Equals(Settings.MachineUrl, StringComparison.InvariantCultureIgnoreCase))) - { - _logger.LogError("Preflight Check failed, list {MachineUrl} not found in any repository", Settings.MachineUrl); - return false; - } - - if(!Version.TryParse(Settings.Version, out var version)) - { - _logger.LogError("Preflight Check failed, version {Version} was not valid", Settings.Version); - return false; - } - - return true; - } - #region ListOps public void AddOtherProfile(string profile) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs index 20fdd2a12..cfbedafb0 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs @@ -29,7 +29,8 @@ public class CompilerFileManagerVM : BaseCompilerVM, IHasInfoVM private readonly CompilerSettingsInferencer _inferencer; public ObservableCollection Files { get; set; } - public ICommand PrevCommand { get; set; } + public ICommand PrevCommand { get; } + public ICommand NextCommand { get; } public ICommand InfoCommand { get; } public CompilerFileManagerVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, @@ -41,6 +42,7 @@ public CompilerFileManagerVM(ILogger logger, DTOSerialize _inferencer = inferencer; PrevCommand = ReactiveCommand.Create(PrevPage); + NextCommand = ReactiveCommand.Create(NextPage); InfoCommand = ReactiveCommand.Create(Info); this.WhenActivated(disposables => { @@ -203,7 +205,7 @@ private IEnumerable GetDirectoryContents(DirectoryInfo dir) private async Task NextPage() { - NavigateToGlobal.Send(ScreenType.CompilerFileManager); + NavigateToGlobal.Send(ScreenType.CompilerMain); LoadCompilerSettings.Send(Settings.ToCompilerSettings()); } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs new file mode 100644 index 000000000..34d74cf9e --- /dev/null +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -0,0 +1,234 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reactive; +using Microsoft.Extensions.Logging; +using Wabbajack.Messages; +using ReactiveUI; +using System.Reactive.Disposables; +using System.Reactive.Linq; +using System.Threading; +using System.Threading.Tasks; +using ReactiveUI.Fody.Helpers; +using Wabbajack.Common; +using Wabbajack.Compiler; +using Wabbajack.DTOs; +using Wabbajack.DTOs.JsonConverters; +using Wabbajack.Extensions; +using Wabbajack.Installer; +using Wabbajack.Models; +using Wabbajack.Networking.WabbajackClientApi; +using Wabbajack.Paths; +using Wabbajack.Paths.IO; +using Wabbajack.RateLimiter; +using Wabbajack.Services.OSIntegrated; + +namespace Wabbajack +{ + public class CompilerMainVM : BaseCompilerVM, ICpuStatusVM + { + private readonly IServiceProvider _serviceProvider; + private readonly ResourceMonitor _resourceMonitor; + private readonly CompilerSettingsInferencer _inferencer; + + [Reactive] public string StatusText { get; set; } + [Reactive] public Percent StatusProgress { get; set; } + + [Reactive] + public CompilerState State { get; set; } + + [Reactive] + public MO2CompilerVM SubCompilerVM { get; set; } + + public FilePickerVM OutputLocation { get; private set; } + + public ReactiveCommand NextCommand { get; } + + public LogStream LoggerProvider { get; } + public ReadOnlyObservableCollection StatusList => _resourceMonitor.Tasks; + + [Reactive] + public ErrorResponse ErrorState { get; private set; } + + public CompilerMainVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, + IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, + CompilerSettingsInferencer inferencer, Client wjClient) : base(dtos, settingsManager, logger, wjClient) + { + _serviceProvider = serviceProvider; + LoggerProvider = loggerProvider; + _resourceMonitor = resourceMonitor; + _inferencer = inferencer; + + StatusProgress = Percent.Zero; + + BackCommand = ReactiveCommand.CreateFromTask(async () => + { + await SaveSettings(); + NavigateToGlobal.Send(ScreenType.Home); + }); + + SubCompilerVM = new MO2CompilerVM(this); + + NextCommand = ReactiveCommand.CreateFromTask(NextPage); + + + this.WhenActivated(disposables => + { + State = CompilerState.Configuration; + + OutputLocation = new FilePickerVM + { + ExistCheckOption = FilePickerVM.CheckOptions.Off, + PathType = FilePickerVM.PathTypeOptions.Folder, + PromptTitle = "Location where the compiled modlist will be saved to" + }; + + Disposable.Empty.DisposeWith(disposables); + }); + } + + private async Task ReInferSettings(AbsolutePath filePath) + { + var newSettings = await _inferencer.InferModListFromLocation(filePath); + + if (newSettings == null) + { + _logger.LogError("Cannot infer settings from {0}", filePath); + return; + } + + Settings.Source = newSettings.Source; + Settings.Downloads = newSettings.Downloads; + + if (string.IsNullOrEmpty(Settings.ModListName)) + Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.Profile).WithExtension(Ext.Wabbajack); + else + Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.ModListName).WithExtension(Ext.Wabbajack); + + Settings.Game = newSettings.Game; + Settings.Include = newSettings.Include.ToHashSet(); + Settings.Ignore = newSettings.Ignore.ToHashSet(); + Settings.AlwaysEnabled = newSettings.AlwaysEnabled.ToHashSet(); + Settings.NoMatchInclude = newSettings.NoMatchInclude.ToHashSet(); + Settings.AdditionalProfiles = newSettings.AdditionalProfiles; + } + + private ErrorResponse Validate() + { + var errors = new List + { + OutputLocation.ErrorState + }; + return ErrorResponse.Combine(errors); + } + + private async Task NextPage() + { + await SaveSettings(); + //NavigateToGlobal.Send(ScreenType.CompilerFileManager); + //LoadCompilerSettings.Send(Settings.ToCompilerSettings()); + await StartCompilation(); + } + + private async Task StartCompilation() + { + var tsk = Task.Run(async () => + { + try + { + await SaveSettings(); + var token = CancellationToken.None; + State = CompilerState.Compiling; + + Settings.UseGamePaths = true; + if (Settings.OutputFile.DirectoryExists()) + Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath() + .WithExtension(Ext.Wabbajack)); + + if (Settings.PublishUpdate && !await RunPreflightChecks(token)) + { + State = CompilerState.Errored; + return; + } + + var compiler = MO2Compiler.Create(_serviceProvider, Settings.ToCompilerSettings()); + + var events = Observable.FromEventPattern(h => compiler.OnStatusUpdate += h, + h => compiler.OnStatusUpdate -= h) + .ObserveOnGuiThread() + .Debounce(TimeSpan.FromSeconds(0.5)) + .Subscribe(update => + { + var s = update.EventArgs; + StatusText = $"[Step {s.CurrentStep}] {s.StatusText}"; + StatusProgress = s.StepProgress; + }); + + + try + { + var result = await compiler.Begin(token); + if (!result) + throw new Exception("Compilation Failed"); + } + finally + { + events.Dispose(); + } + + if (Settings.PublishUpdate) + { + _logger.LogInformation("Publishing List"); + var downloadMetadata = _dtos.Deserialize( + await Settings.OutputFile.WithExtension(Ext.Meta).WithExtension(Ext.Json).ReadAllTextAsync())!; + await _wjClient.PublishModlist(Settings.MachineUrl, Version.Parse(Settings.Version), Settings.OutputFile, downloadMetadata); + } + _logger.LogInformation("Compiler Finished"); + + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => + { + StatusText = "Compilation Completed"; + StatusProgress = Percent.Zero; + State = CompilerState.Completed; + return Disposable.Empty; + }); + + + } + catch (Exception ex) + { + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => + { + StatusText = "Compilation Failed"; + StatusProgress = Percent.Zero; + + State = CompilerState.Errored; + _logger.LogInformation(ex, "Failed Compilation : {Message}", ex.Message); + return Disposable.Empty; + }); + } + }); + + await tsk; + } + + private async Task RunPreflightChecks(CancellationToken token) + { + var lists = await _wjClient.GetMyModlists(token); + if (!lists.Any(x => x.Equals(Settings.MachineUrl, StringComparison.InvariantCultureIgnoreCase))) + { + _logger.LogError("Preflight Check failed, list {MachineUrl} not found in any repository", Settings.MachineUrl); + return false; + } + + if(!Version.TryParse(Settings.Version, out var version)) + { + _logger.LogError("Preflight Check failed, version {Version} was not valid", Settings.Version); + return false; + } + + return true; + } + } +} diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/MO2CompilerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/MO2CompilerVM.cs index a66ee179c..185bf8ca6 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/MO2CompilerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/MO2CompilerVM.cs @@ -8,7 +8,7 @@ namespace Wabbajack { public class MO2CompilerVM : ViewModel { - public CompilerDetailsVM Parent { get; } + public BaseCompilerVM Parent { get; } public FilePickerVM DownloadLocation { get; } @@ -31,7 +31,7 @@ public Task> Compile() throw new NotImplementedException(); } - public MO2CompilerVM(CompilerDetailsVM parent) + public MO2CompilerVM(BaseCompilerVM parent) { } } diff --git a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index 9daac1e1c..579fae946 100644 --- a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -47,6 +47,7 @@ public class MainWindowVM : ViewModel public readonly CompilerHomeVM CompilerHomeVM; public readonly CompilerDetailsVM CompilerDetailsVM; public readonly CompilerFileManagerVM CompilerFileManagerVM; + public readonly CompilerMainVM CompilerMainVM; public readonly InstallerVM InstallerVM; public readonly SettingsVM SettingsPaneVM; public readonly ModListGalleryVM GalleryVM; @@ -82,7 +83,7 @@ public class MainWindowVM : ViewModel public MainWindowVM(ILogger logger, Client wjClient, IServiceProvider serviceProvider, HomeVM homeVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, - InstallerVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM) + InstallerVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilerMainVM compilerMainVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM) { _logger = logger; _wjClient = wjClient; @@ -93,6 +94,7 @@ public MainWindowVM(ILogger logger, Client wjClient, CompilerHomeVM = compilerHomeVM; CompilerDetailsVM = compilerDetailsVM; CompilerFileManagerVM = compilerFileManagerVM; + CompilerMainVM = compilerMainVM; SettingsPaneVM = settingsVM; GalleryVM = modListGalleryVM; HomeVM = homeVM; @@ -121,7 +123,7 @@ public MainWindowVM(ILogger logger, Client wjClient, _resourceMonitor.Updates .Select(r => string.Join(", ", r.Where(r => r.Throughput > 0) - .Select(s => $"{s.Name} - {s.Throughput.ToFileSizeString()}/s"))) + .Select(s => $"{s.Name} - {s.Throughput.ToFileSizeString()}/s"))) .BindToStrict(this, view => view.ResourceStatus); @@ -249,6 +251,7 @@ private void HandleNavigateTo(ScreenType s) ScreenType.CompilerHome => CompilerHomeVM, ScreenType.CompilerDetails => CompilerDetailsVM, ScreenType.CompilerFileManager => CompilerFileManagerVM, + ScreenType.CompilerMain => CompilerMainVM, ScreenType.Settings => SettingsPaneVM, ScreenType.Info => InfoVM, _ => ActivePane diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml index 7aeca98da..e46cb0619 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml @@ -38,7 +38,7 @@ - - - + + - - - - + + + - - - - - + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Common/LogView.xaml b/Wabbajack.App.Wpf/Views/Common/LogView.xaml index 8191fcf85..a41c71344 100644 --- a/Wabbajack.App.Wpf/Views/Common/LogView.xaml +++ b/Wabbajack.App.Wpf/Views/Common/LogView.xaml @@ -47,7 +47,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml index 7dad2586f..a5f101961 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml @@ -23,8 +23,8 @@ - + - + @@ -114,8 +114,8 @@ @@ -123,19 +123,18 @@ Grid.Row="1" x:Name="ModlistLocation" Margin="16, 0, 0, 0" - VerticalAlignment="Center" - FontSize="14" + VerticalAlignment="Bottom" ToolTip="The modlist.txt of your Mod Organizer profile" /> diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml index e46cb0619..03772ab39 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerFileManagerView.xaml @@ -19,28 +19,21 @@ mc:Ignorable="d"> - + - - - - - - - - - diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml index 98e6c4a44..e26d63e1c 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml @@ -23,47 +23,50 @@ - - + + - + - - - - - - - - - - + - - - - (Symbol)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(Symbol), typeof(FilePicker), + new PropertyMetadata(default(Symbol))); + public FilePicker() { InitializeComponent(); diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml index 457acfe76..38e51e518 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml @@ -45,13 +45,13 @@ TargetType="TextBox"> - + @@ -70,49 +70,64 @@ - - - + + + + + - + - + - + - + - + - - + + + + + - - + + + + + - - + + + + + - + ToolTip="Unique text string for this modlist prefixed with its GitHub repository name." /> + - + + + + + - + diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs index 90bd34329..746d4bbea 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs @@ -65,8 +65,10 @@ public CompilerDetailsView() this.Bind(ViewModel, vm => vm.Settings.ModlistIsNSFW, view => view.NSFWSetting.IsChecked) .DisposeWith(disposables); + /* this.Bind(ViewModel, vm => vm.Settings.PublishUpdate, view => view.PublishUpdate.IsChecked) .DisposeWith(disposables); + */ this.Bind(ViewModel, vm => vm.Settings.MachineUrl, view => view.MachineUrl.Text) .DisposeWith(disposables); From 566fcb53dfe47ba8b814378cd31592868633bcad Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 24 Sep 2024 14:37:28 +0200 Subject: [PATCH 098/294] Add watermarks to the file pickers --- .../Views/Common/FilePicker.xaml | 2 ++ .../Views/Common/FilePicker.xaml.cs | 7 +++++++ .../Views/Compiler/CompilerDetailsView.xaml | 20 +++++++++---------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/Common/FilePicker.xaml b/Wabbajack.App.Wpf/Views/Common/FilePicker.xaml index 5611771cc..9b62a9745 100644 --- a/Wabbajack.App.Wpf/Views/Common/FilePicker.xaml +++ b/Wabbajack.App.Wpf/Views/Common/FilePicker.xaml @@ -6,6 +6,7 @@ xmlns:local="clr-namespace:Wabbajack" xmlns:ic="clr-namespace:FluentIcons.WPF;assembly=FluentIcons.WPF" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mahapps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" d:DesignHeight="35" d:DesignWidth="400" mc:Ignorable="d"> @@ -54,6 +55,7 @@ VerticalContentAlignment="Center" Background="{StaticResource DarkBackgroundBrush}" Text="{Binding PickerVM.TargetPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Converter={StaticResource AbsolutePathToStringConverter}}" + mahapps:TextBoxHelper.Watermark="{Binding Watermark, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> (string)GetValue(WatermarkProperty); + set => SetValue(WatermarkProperty, value); + } + public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register(nameof(Watermark), typeof(string), typeof(FilePicker), + new PropertyMetadata(default(string))); public FilePicker() { diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml index 38e51e518..af7df9025 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml @@ -78,7 +78,7 @@ - + @@ -93,21 +93,21 @@ - + - + - + @@ -116,16 +116,16 @@ - - + + + + + - + Date: Tue, 24 Sep 2024 15:00:00 +0200 Subject: [PATCH 099/294] Only show compiler file state listbox on non-default values and on hover --- Wabbajack.App.Wpf/Themes/Styles.xaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 3f21c6dba..c8525b68e 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -2604,6 +2604,16 @@ + + + + + + + + + + From 28f535ab45da59581c1e58897b1ed159a982ab48 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 25 Sep 2024 11:39:07 +0200 Subject: [PATCH 100/294] Create CompilerMainView to merge all the compiler views into one --- Wabbajack.App.Wpf/App.xaml.cs | 1 + .../Messages/NavigateToGlobal.cs | 2 - .../Compiler/CompiledModListTileVM.cs | 2 +- .../ViewModels/Compiler/CompilerDetailsVM.cs | 8 +- .../Compiler/CompilerFileManagerVM.cs | 25 +- .../ViewModels/Compiler/CompilerHomeVM.cs | 5 +- .../ViewModels/Compiler/CompilerMainVM.cs | 268 ++---------------- .../ViewModels/Compiler/CompilingVM.cs | 248 ++++++++++++++++ Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 6 +- .../Views/Compiler/CompilerDetailsView.xaml | 224 +++++++-------- .../Views/Compiler/CompilerMainView.xaml | 20 +- .../Views/Compiler/CompilerMainView.xaml.cs | 4 +- .../Views/Compiler/CompilingView.xaml | 41 +++ .../Views/Compiler/CompilingView.xaml.cs | 60 ++++ Wabbajack.App.Wpf/Views/MainWindow.xaml | 3 + .../Views/NavigationView.xaml.cs | 2 +- 16 files changed, 510 insertions(+), 409 deletions(-) create mode 100644 Wabbajack.App.Wpf/ViewModels/Compiler/CompilingVM.cs create mode 100644 Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml create mode 100644 Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml.cs diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index a62ea801c..7ee9b5287 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -173,6 +173,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs index 9bf781f35..6b4bbb81e 100644 --- a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs +++ b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs @@ -9,8 +9,6 @@ public enum ScreenType Installer, Settings, CompilerHome, - CompilerDetails, - CompilerFileManager, CompilerMain, ModListContents, WebBrowser, diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompiledModListTileVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompiledModListTileVM.cs index 3012517b4..81b97b6c8 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompiledModListTileVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompiledModListTileVM.cs @@ -26,7 +26,7 @@ public CompiledModListTileVM(ILogger logger, CompilerSettings compilerSettings) private void CompileModList() { _logger.LogInformation($"Selected modlist {CompilerSettings.ModListName} for compilation, located in '{CompilerSettings.Source}'"); - NavigateToGlobal.Send(ScreenType.CompilerDetails); + NavigateToGlobal.Send(ScreenType.CompilerMain); LoadCompilerSettings.Send(CompilerSettings); } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs index 21d3bdab3..54c569e29 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs @@ -61,7 +61,7 @@ public class CompilerDetailsVM : BaseCompilerVM, ICpuStatusVM /* public ReactiveCommand ExecuteCommand { get; } */ public ReactiveCommand ReInferSettingsCommand { get; set; } - public ReactiveCommand NextCommand { get; } + public ReactiveCommand StartCommand { get; } public LogStream LoggerProvider { get; } public ReadOnlyObservableCollection StatusList => _resourceMonitor.Tasks; @@ -90,7 +90,7 @@ public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, SubCompilerVM = new MO2CompilerVM(this); - NextCommand = ReactiveCommand.CreateFromTask(NextPage); + StartCommand = ReactiveCommand.CreateFromTask(StartCompilation); this.WhenActivated(disposables => @@ -223,10 +223,10 @@ private async Task InferModListFromLocation(AbsolutePath path) return settings; } - private async Task NextPage() + private async Task StartCompilation() { await SaveSettings(); - NavigateToGlobal.Send(ScreenType.CompilerFileManager); + NavigateToGlobal.Send(ScreenType.CompilerMain); LoadCompilerSettings.Send(Settings.ToCompilerSettings()); } diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs index cfbedafb0..063f0f28e 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs @@ -34,15 +34,12 @@ public class CompilerFileManagerVM : BaseCompilerVM, IHasInfoVM public ICommand InfoCommand { get; } public CompilerFileManagerVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, - IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, + IServiceProvider serviceProvider, ResourceMonitor resourceMonitor, CompilerSettingsInferencer inferencer, Client wjClient) : base(dtos, settingsManager, logger, wjClient) { _serviceProvider = serviceProvider; _resourceMonitor = resourceMonitor; _inferencer = inferencer; - - PrevCommand = ReactiveCommand.Create(PrevPage); - NextCommand = ReactiveCommand.Create(NextPage); InfoCommand = ReactiveCommand.Create(Info); this.WhenActivated(disposables => { @@ -56,11 +53,6 @@ public CompilerFileManagerVM(ILogger logger, DTOSerialize }); } - private void PrevPage() - { - NavigateToGlobal.Send(ScreenType.CompilerDetails); - LoadCompilerSettings.Send(Settings.ToCompilerSettings()); - } private void Info() { LoadInfoScreen.Send(Consts.FileManagerInfo, this); @@ -121,21 +113,6 @@ private void SetContainedStates(FileTreeItemVM header) private async void Header_PropertyChanged(object sender, PropertyChangedEventArgs e) { var updatedItem = (FileTreeItemVM)sender; - /* - if(e.PropertyName == nameof(FileTreeItemVM.SpecialFileState)) - { - IEnumerable currentEnumerable = null; - for (int i = 0; i < updatedItem.PathRelativeToRoot.Depth - 1; i++) - { - if (currentEnumerable == null) - currentEnumerable = Files.ElementAt(0).ItemsSource.Cast(); - - var currentItem = currentEnumerable.First(x => x.Header.IsDirectory && updatedItem.PathRelativeToRoot.Parts[i] == x.Header.Info.Name); - currentItem.Header.SpecialFileState = updatedItem.CompilerFileState != CompilerFileState.AutoMatch; - currentEnumerable = currentItem.ItemsSource.Cast(); - } - } - */ if(e.PropertyName == nameof(FileTreeItemVM.CompilerFileState)) { Settings.NoMatchInclude.Remove(updatedItem.PathRelativeToRoot); diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs index 99655ee9e..c24fa3f45 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs @@ -40,7 +40,6 @@ public class CompilerHomeVM : ViewModel public FilePickerVM CompilerSettingsPicker { get; private set; } public FilePickerVM NewModlistPicker { get; private set; } - public CompilerHomeVM(ILogger logger, SettingsManager settingsManager, IServiceProvider serviceProvider, DTOSerializer dtos, CompilerSettingsInferencer inferencer) { @@ -77,7 +76,7 @@ public CompilerHomeVM(ILogger logger, SettingsManager settingsMa try { var compilerSettings = await _inferencer.InferModListFromLocation(NewModlistPicker.TargetPath); - NavigateToGlobal.Send(ScreenType.CompilerDetails); + NavigateToGlobal.Send(ScreenType.CompilerMain); LoadCompilerSettings.Send(compilerSettings); } catch (Exception ex) @@ -95,7 +94,7 @@ public CompilerHomeVM(ILogger logger, SettingsManager settingsMa try { var compilerSettings = _dtos.Deserialize(File.ReadAllText(CompilerSettingsPicker.TargetPath.ToString())); - NavigateToGlobal.Send(ScreenType.CompilerDetails); + NavigateToGlobal.Send(ScreenType.CompilerMain); LoadCompilerSettings.Send(compilerSettings); } catch (Exception ex) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index 0e780d00e..1d9b8146e 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -1,257 +1,47 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reactive; -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Wabbajack.Messages; using ReactiveUI; using System.Reactive.Disposables; -using System.Reactive.Linq; -using System.Threading; -using System.Threading.Tasks; using ReactiveUI.Fody.Helpers; -using Wabbajack.Common; -using Wabbajack.Compiler; -using Wabbajack.DTOs; using Wabbajack.DTOs.JsonConverters; -using Wabbajack.Extensions; -using Wabbajack.Installer; using Wabbajack.Models; using Wabbajack.Networking.WabbajackClientApi; -using Wabbajack.Paths; -using Wabbajack.Paths.IO; -using Wabbajack.RateLimiter; using Wabbajack.Services.OSIntegrated; -using System.Windows.Input; -namespace Wabbajack +namespace Wabbajack; + +public class CompilerMainVM : BaseCompilerVM { - public class CompilerMainVM : BaseCompilerVM, ICpuStatusVM + public CompilerDetailsVM CompilerDetailsVM { get; set; } + public CompilerFileManagerVM CompilerFileManagerVM { get; set; } + public CompilingVM CompilingVM { get; set; } + + [Reactive] + public CompilerState State { get; set; } + public LogStream LoggerProvider { get; } + public CompilerMainVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, + LogStream loggerProvider, Client wjClient, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilingVM compilingVM) : base(dtos, settingsManager, logger, wjClient) { - private readonly IServiceProvider _serviceProvider; - private readonly ResourceMonitor _resourceMonitor; - private readonly CompilerSettingsInferencer _inferencer; - - [Reactive] public string StatusText { get; set; } - [Reactive] public Percent StatusProgress { get; set; } - - [Reactive] - public CompilerState State { get; set; } - - [Reactive] - public MO2CompilerVM SubCompilerVM { get; set; } - - public FilePickerVM OutputLocation { get; private set; } - - public LogStream LoggerProvider { get; } - public ReadOnlyObservableCollection StatusList => _resourceMonitor.Tasks; - - public bool Cancelling { get; private set; } - [Reactive] - public ErrorResponse ErrorState { get; private set; } - - public ICommand PrevCommand { get; } - public ICommand StartCommand { get; } - public ICommand CancelCommand { get; } - public CancellationTokenSource CancellationTokenSource { get; private set; } - - public CompilerMainVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, - IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, - CompilerSettingsInferencer inferencer, Client wjClient) : base(dtos, settingsManager, logger, wjClient) - { - _serviceProvider = serviceProvider; - LoggerProvider = loggerProvider; - _resourceMonitor = resourceMonitor; - _inferencer = inferencer; - - CancellationTokenSource = new CancellationTokenSource(); - PrevCommand = ReactiveCommand.Create(PrevPage); - StartCommand = ReactiveCommand.Create(StartCompilation); - - StatusProgress = Percent.Zero; - - BackCommand = ReactiveCommand.CreateFromTask(async () => - { - await SaveSettings(); - NavigateToGlobal.Send(ScreenType.Home); - }); - - CancelCommand = ReactiveCommand.CreateFromTask(CancelCompilation); - - SubCompilerVM = new MO2CompilerVM(this); - - - this.WhenActivated(disposables => - { - State = CompilerState.Configuration; - - StartCommand.Execute(null); - - Disposable.Empty.DisposeWith(disposables); - }); - } - - private async Task CancelCompilation() - { - if (State != CompilerState.Compiling) return; - Cancelling = true; - _logger.LogInformation("Cancel pressed, cancelling compilation..."); - await CancellationTokenSource.CancelAsync(); - CancellationTokenSource = new CancellationTokenSource(); - } - - private void PrevPage() - { - NavigateToGlobal.Send(ScreenType.CompilerFileManager); - LoadCompilerSettings.Send(Settings.ToCompilerSettings()); - } + LoggerProvider = loggerProvider; + CompilerDetailsVM = compilerDetailsVM; + CompilerFileManagerVM = compilerFileManagerVM; + CompilingVM = compilingVM; - private async Task ReInferSettings(AbsolutePath filePath) + BackCommand = ReactiveCommand.CreateFromTask(async () => { - var newSettings = await _inferencer.InferModListFromLocation(filePath); - - if (newSettings == null) - { - _logger.LogError("Cannot infer settings from {0}", filePath); - return; - } - - Settings.Source = newSettings.Source; - Settings.Downloads = newSettings.Downloads; - - if (string.IsNullOrEmpty(Settings.ModListName)) - Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.Profile).WithExtension(Ext.Wabbajack); - else - Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.ModListName).WithExtension(Ext.Wabbajack); - - Settings.Game = newSettings.Game; - Settings.Include = newSettings.Include.ToHashSet(); - Settings.Ignore = newSettings.Ignore.ToHashSet(); - Settings.AlwaysEnabled = newSettings.AlwaysEnabled.ToHashSet(); - Settings.NoMatchInclude = newSettings.NoMatchInclude.ToHashSet(); - Settings.AdditionalProfiles = newSettings.AdditionalProfiles; - } - - private ErrorResponse Validate() - { - var errors = new List - { - OutputLocation.ErrorState - }; - return ErrorResponse.Combine(errors); - } - - private async Task StartCompilation() - { - var tsk = Task.Run(async () => - { - try - { - await SaveSettings(); - var token = CancellationTokenSource.Token; - State = CompilerState.Compiling; - - Settings.UseGamePaths = true; - if (Settings.OutputFile.DirectoryExists()) - Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath() - .WithExtension(Ext.Wabbajack)); - - if (Settings.PublishUpdate && !await RunPreflightChecks(token)) - { - State = CompilerState.Errored; - return; - } - - var compiler = MO2Compiler.Create(_serviceProvider, Settings.ToCompilerSettings()); - - var events = Observable.FromEventPattern(h => compiler.OnStatusUpdate += h, - h => compiler.OnStatusUpdate -= h) - .ObserveOnGuiThread() - .Debounce(TimeSpan.FromSeconds(0.5)) - .Subscribe(update => - { - var s = update.EventArgs; - StatusText = $"[Step {s.CurrentStep}] {s.StatusText}"; - StatusProgress = s.StepProgress; - }); - - - try - { - var result = await compiler.Begin(token); - if (!result) - throw new Exception("Compilation Failed"); - } - finally - { - events.Dispose(); - } - - if (Settings.PublishUpdate) - { - _logger.LogInformation("Publishing List"); - var downloadMetadata = _dtos.Deserialize( - await Settings.OutputFile.WithExtension(Ext.Meta).WithExtension(Ext.Json).ReadAllTextAsync())!; - await _wjClient.PublishModlist(Settings.MachineUrl, Version.Parse(Settings.Version), Settings.OutputFile, downloadMetadata); - } - _logger.LogInformation("Compiler Finished"); - - RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => - { - StatusText = "Compilation Completed"; - StatusProgress = Percent.Zero; - State = CompilerState.Completed; - return Disposable.Empty; - }); - - - } - catch (Exception ex) - { - RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => - { - if (Cancelling) - { - StatusText = "Compilation Cancelled"; - StatusProgress = Percent.Zero; - State = CompilerState.Configuration; - _logger.LogInformation(ex, "Cancelled Compilation : {Message}", ex.Message); - Cancelling = false; - return Disposable.Empty; - } - else - { - StatusText = "Compilation Failed"; - StatusProgress = Percent.Zero; - - State = CompilerState.Errored; - _logger.LogInformation(ex, "Failed Compilation : {Message}", ex.Message); - return Disposable.Empty; - } - }); - } - }); - - await tsk; - } - - private async Task RunPreflightChecks(CancellationToken token) + await SaveSettings(); + NavigateToGlobal.Send(ScreenType.Home); + }); + + this.WhenActivated(disposables => { - var lists = await _wjClient.GetMyModlists(token); - if (!lists.Any(x => x.Equals(Settings.MachineUrl, StringComparison.InvariantCultureIgnoreCase))) - { - _logger.LogError("Preflight Check failed, list {MachineUrl} not found in any repository", Settings.MachineUrl); - return false; - } + State = CompilerState.Configuration; - if(!Version.TryParse(Settings.Version, out var version)) - { - _logger.LogError("Preflight Check failed, version {Version} was not valid", Settings.Version); - return false; - } + this.WhenAnyValue(x => x.State) + .BindToStrict(CompilingVM, cvm => cvm.State) + .DisposeWith(disposables); - return true; - } + Disposable.Empty.DisposeWith(disposables); + }); } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilingVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilingVM.cs new file mode 100644 index 000000000..f7a5c19ad --- /dev/null +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilingVM.cs @@ -0,0 +1,248 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reactive; +using Microsoft.Extensions.Logging; +using Wabbajack.Messages; +using ReactiveUI; +using System.Reactive.Disposables; +using System.Reactive.Linq; +using System.Threading; +using System.Threading.Tasks; +using ReactiveUI.Fody.Helpers; +using Wabbajack.Common; +using Wabbajack.Compiler; +using Wabbajack.DTOs; +using Wabbajack.DTOs.JsonConverters; +using Wabbajack.Extensions; +using Wabbajack.Installer; +using Wabbajack.Models; +using Wabbajack.Networking.WabbajackClientApi; +using Wabbajack.Paths; +using Wabbajack.Paths.IO; +using Wabbajack.RateLimiter; +using Wabbajack.Services.OSIntegrated; +using System.Windows.Input; + +namespace Wabbajack; + +public class CompilingVM : BaseCompilerVM, ICpuStatusVM +{ + private readonly IServiceProvider _serviceProvider; + private readonly ResourceMonitor _resourceMonitor; + private readonly CompilerSettingsInferencer _inferencer; + + [Reactive] public string StatusText { get; set; } + [Reactive] public Percent StatusProgress { get; set; } + + [Reactive] + public CompilerState State { get; set; } + + [Reactive] + public MO2CompilerVM SubCompilerVM { get; set; } + + public FilePickerVM OutputLocation { get; private set; } + + public LogStream LoggerProvider { get; } + public ReadOnlyObservableCollection StatusList => _resourceMonitor.Tasks; + + public bool Cancelling { get; private set; } + [Reactive] + public ErrorResponse ErrorState { get; private set; } + + public ICommand StartCommand { get; } + public ICommand CancelCommand { get; } + public CancellationTokenSource CancellationTokenSource { get; private set; } + + public CompilingVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, + IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, + CompilerSettingsInferencer inferencer, Client wjClient) : base(dtos, settingsManager, logger, wjClient) + { + _serviceProvider = serviceProvider; + LoggerProvider = loggerProvider; + _resourceMonitor = resourceMonitor; + _inferencer = inferencer; + + CancellationTokenSource = new CancellationTokenSource(); + StartCommand = ReactiveCommand.Create(StartCompilation); + + StatusProgress = Percent.Zero; + + BackCommand = ReactiveCommand.CreateFromTask(async () => + { + await SaveSettings(); + NavigateToGlobal.Send(ScreenType.Home); + }); + + CancelCommand = ReactiveCommand.CreateFromTask(CancelCompilation); + + SubCompilerVM = new MO2CompilerVM(this); + + + this.WhenActivated(disposables => + { + State = CompilerState.Configuration; + + StartCommand.Execute(null); + + Disposable.Empty.DisposeWith(disposables); + }); + } + + private async Task CancelCompilation() + { + if (State != CompilerState.Compiling) return; + Cancelling = true; + _logger.LogInformation("Cancel pressed, cancelling compilation..."); + await CancellationTokenSource.CancelAsync(); + CancellationTokenSource = new CancellationTokenSource(); + } + + private async Task ReInferSettings(AbsolutePath filePath) + { + var newSettings = await _inferencer.InferModListFromLocation(filePath); + + if (newSettings == null) + { + _logger.LogError("Cannot infer settings from {0}", filePath); + return; + } + + Settings.Source = newSettings.Source; + Settings.Downloads = newSettings.Downloads; + + if (string.IsNullOrEmpty(Settings.ModListName)) + Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.Profile).WithExtension(Ext.Wabbajack); + else + Settings.OutputFile = newSettings.OutputFile.Combine(newSettings.ModListName).WithExtension(Ext.Wabbajack); + + Settings.Game = newSettings.Game; + Settings.Include = newSettings.Include.ToHashSet(); + Settings.Ignore = newSettings.Ignore.ToHashSet(); + Settings.AlwaysEnabled = newSettings.AlwaysEnabled.ToHashSet(); + Settings.NoMatchInclude = newSettings.NoMatchInclude.ToHashSet(); + Settings.AdditionalProfiles = newSettings.AdditionalProfiles; + } + + private ErrorResponse Validate() + { + var errors = new List + { + OutputLocation.ErrorState + }; + return ErrorResponse.Combine(errors); + } + + private async Task StartCompilation() + { + var tsk = Task.Run(async () => + { + try + { + await SaveSettings(); + var token = CancellationTokenSource.Token; + State = CompilerState.Compiling; + + Settings.UseGamePaths = true; + if (Settings.OutputFile.DirectoryExists()) + Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath() + .WithExtension(Ext.Wabbajack)); + + if (Settings.PublishUpdate && !await RunPreflightChecks(token)) + { + State = CompilerState.Errored; + return; + } + + var compiler = MO2Compiler.Create(_serviceProvider, Settings.ToCompilerSettings()); + + var events = Observable.FromEventPattern(h => compiler.OnStatusUpdate += h, + h => compiler.OnStatusUpdate -= h) + .ObserveOnGuiThread() + .Debounce(TimeSpan.FromSeconds(0.5)) + .Subscribe(update => + { + var s = update.EventArgs; + StatusText = $"[Step {s.CurrentStep}] {s.StatusText}"; + StatusProgress = s.StepProgress; + }); + + + try + { + var result = await compiler.Begin(token); + if (!result) + throw new Exception("Compilation Failed"); + } + finally + { + events.Dispose(); + } + + if (Settings.PublishUpdate) + { + _logger.LogInformation("Publishing List"); + var downloadMetadata = _dtos.Deserialize( + await Settings.OutputFile.WithExtension(Ext.Meta).WithExtension(Ext.Json).ReadAllTextAsync())!; + await _wjClient.PublishModlist(Settings.MachineUrl, Version.Parse(Settings.Version), Settings.OutputFile, downloadMetadata); + } + _logger.LogInformation("Compiler Finished"); + + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => + { + StatusText = "Compilation Completed"; + StatusProgress = Percent.Zero; + State = CompilerState.Completed; + return Disposable.Empty; + }); + + + } + catch (Exception ex) + { + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => + { + if (Cancelling) + { + StatusText = "Compilation Cancelled"; + StatusProgress = Percent.Zero; + State = CompilerState.Configuration; + _logger.LogInformation(ex, "Cancelled Compilation : {Message}", ex.Message); + Cancelling = false; + return Disposable.Empty; + } + else + { + StatusText = "Compilation Failed"; + StatusProgress = Percent.Zero; + + State = CompilerState.Errored; + _logger.LogInformation(ex, "Failed Compilation : {Message}", ex.Message); + return Disposable.Empty; + } + }); + } + }); + + await tsk; + } + + private async Task RunPreflightChecks(CancellationToken token) + { + var lists = await _wjClient.GetMyModlists(token); + if (!lists.Any(x => x.Equals(Settings.MachineUrl, StringComparison.InvariantCultureIgnoreCase))) + { + _logger.LogError("Preflight Check failed, list {MachineUrl} not found in any repository", Settings.MachineUrl); + return false; + } + + if(!Version.TryParse(Settings.Version, out var version)) + { + _logger.LogError("Preflight Check failed, version {Version} was not valid", Settings.Version); + return false; + } + + return true; + } +} diff --git a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index 579fae946..302e8af1b 100644 --- a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -47,6 +47,7 @@ public class MainWindowVM : ViewModel public readonly CompilerHomeVM CompilerHomeVM; public readonly CompilerDetailsVM CompilerDetailsVM; public readonly CompilerFileManagerVM CompilerFileManagerVM; + public readonly CompilingVM CompilingVM; public readonly CompilerMainVM CompilerMainVM; public readonly InstallerVM InstallerVM; public readonly SettingsVM SettingsPaneVM; @@ -83,7 +84,7 @@ public class MainWindowVM : ViewModel public MainWindowVM(ILogger logger, Client wjClient, IServiceProvider serviceProvider, HomeVM homeVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, - InstallerVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilerMainVM compilerMainVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM) + InstallerVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilingVM compilingVM, CompilerMainVM compilerMainVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM) { _logger = logger; _wjClient = wjClient; @@ -94,6 +95,7 @@ public MainWindowVM(ILogger logger, Client wjClient, CompilerHomeVM = compilerHomeVM; CompilerDetailsVM = compilerDetailsVM; CompilerFileManagerVM = compilerFileManagerVM; + CompilingVM = compilingVM; CompilerMainVM = compilerMainVM; SettingsPaneVM = settingsVM; GalleryVM = modListGalleryVM; @@ -249,8 +251,6 @@ private void HandleNavigateTo(ScreenType s) ScreenType.ModListGallery => GalleryVM, ScreenType.Installer => InstallerVM, ScreenType.CompilerHome => CompilerHomeVM, - ScreenType.CompilerDetails => CompilerDetailsVM, - ScreenType.CompilerFileManager => CompilerFileManagerVM, ScreenType.CompilerMain => CompilerMainVM, ScreenType.Settings => SettingsPaneVM, ScreenType.Info => InfoVM, diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml index af7df9025..4d5131f4e 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml @@ -18,124 +18,124 @@ x:TypeArguments="local:CompilerDetailsVM" mc:Ignorable="d"> - - - - - - - - + + + + + + + + - - + + - - + - - - - - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + - - - - - - - - - + - - - diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml index 0d72c2b6b..8c077e64c 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml @@ -18,24 +18,6 @@ x:TypeArguments="local:CompilerMainVM" mc:Ignorable="d"> - - - - - - - - - - - - - - - - - - - + diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs index 11aabbfff..39d8239a3 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs @@ -9,7 +9,7 @@ namespace Wabbajack; /// -/// Interaction logic for CompilerMainView.xaml +/// Interaction logic for CompilingView.xaml /// public partial class CompilerMainView : ReactiveUserControl { @@ -17,6 +17,7 @@ public CompilerMainView() { InitializeComponent(); + /* this.WhenActivated(disposables => { ViewModel.WhenAny(vm => vm.Settings.ModListImage) @@ -55,6 +56,7 @@ public CompilerMainView() .Select(s => s == CompilerState.Completed ? Visibility.Visible : Visibility.Hidden) .BindToStrict(this, view => view.OpenFolderButton.Visibility); }); + */ } } diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml new file mode 100644 index 000000000..b1a4d635c --- /dev/null +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml.cs new file mode 100644 index 000000000..0db814d27 --- /dev/null +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml.cs @@ -0,0 +1,60 @@ +using System.Linq; +using System.Reactive.Linq; +using ReactiveUI; +using Wabbajack.Common; +using Wabbajack.Paths.IO; +using System.Windows; +using System.Reactive.Disposables; + +namespace Wabbajack; + +/// +/// Interaction logic for CompilingView.xaml +/// +public partial class CompilingView : ReactiveUserControl +{ + public CompilingView() + { + InitializeComponent(); + + this.WhenActivated(disposables => + { + ViewModel.WhenAny(vm => vm.Settings.ModListImage) + .Where(i => i.FileExists()) + .Select(i => (UIUtils.TryGetBitmapImageFromFile(i, out var img), img)) + .Where(i => i.Item1) + .Select(i => i.img) + .BindToStrict(this, view => view.DetailImage.Image) + .DisposeWith(disposables); + + ViewModel.WhenAny(vm => vm.Settings.ModListName) + .BindToStrict(this, view => view.DetailImage.Title) + .DisposeWith(disposables); + + ViewModel.WhenAny(vm => vm.Settings.ModListAuthor) + .BindToStrict(this, view => view.DetailImage.Author) + .DisposeWith(disposables); + + ViewModel.WhenAny(vm => vm.State) + .Select(s => s == CompilerState.Configuration ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, view => view.StartButton.Visibility); + + ViewModel.WhenAny(vm => vm.State) + .Select(s => s == CompilerState.Configuration ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, view => view.PrevButton.Visibility); + + ViewModel.WhenAny(vm => vm.State) + .Select(s => s == CompilerState.Compiling ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, view => view.CancelButton.Visibility); + + ViewModel.WhenAny(vm => vm.State) + .Select(s => s == CompilerState.Completed ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, view => view.PublishButton.Visibility); + + ViewModel.WhenAny(vm => vm.State) + .Select(s => s == CompilerState.Completed ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, view => view.OpenFolderButton.Visibility); + }); + + } +} diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 000b487c3..81b91f323 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -89,6 +89,9 @@ + + + diff --git a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs index e9d9615ca..57e5c65f1 100644 --- a/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/NavigationView.xaml.cs @@ -23,7 +23,7 @@ public NavigationView() ButtonScreensDictionary = new() { { HomeButton, [ScreenType.Home] }, { BrowseButton, [ScreenType.ModListGallery] }, - { CompileButton, [ScreenType.CompilerHome, ScreenType.CompilerDetails, ScreenType.CompilerFileManager, ScreenType.CompilerMain] }, + { CompileButton, [ScreenType.CompilerHome, ScreenType.CompilerMain] }, { SettingsButton, [ScreenType.Settings] }, }; this.WhenActivated(dispose => From a8cefcdd9a5c3f5e0b8c5aa493f43b28edbccba0 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:48:35 +0200 Subject: [PATCH 101/294] Overhaul help button, tweak color names to make more sense --- Wabbajack.App.Wpf/Themes/Styles.xaml | 79 +++- .../ViewModels/Compiler/BaseCompilerVM.cs | 87 ++-- .../Compiler/CompiledModListTileVM.cs | 39 +- .../ViewModels/Compiler/CompilerDetailsVM.cs | 427 +++++++++--------- .../Compiler/CompilerFileManagerVM.cs | 252 +++++------ .../ViewModels/Compiler/CompilerHomeVM.cs | 163 ++++--- .../ViewModels/Compiler/CompilerMainVM.cs | 15 +- .../ViewModels/Compiler/MO2CompilerVM.cs | 45 +- Wabbajack.App.Wpf/ViewModels/HomeVM.cs | 5 +- .../Views/Common/CpuLineView.xaml | 2 +- Wabbajack.App.Wpf/Views/Common/CpuView.xaml | 2 +- .../Views/Common/DetailImageView.xaml | 2 +- Wabbajack.App.Wpf/Views/Common/LogView.xaml | 2 +- .../Views/Compiler/CompilerDetailsView.xaml | 21 +- .../Views/Compiler/CompilerMainView.xaml | 16 + Wabbajack.App.Wpf/Views/MainWindow.xaml | 15 +- .../Views/ModListGalleryView.xaml | 2 +- 17 files changed, 608 insertions(+), 566 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index c8525b68e..26d61e94e 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -51,9 +51,12 @@ #D8BAF8 - - #383750 - #45425D + + #303141 + + #383750 + #45425D + #8866ad #514c6b @@ -135,8 +138,9 @@ - - + + + @@ -175,16 +179,16 @@ - - + + - - + + @@ -192,7 +196,7 @@ - + @@ -200,12 +204,12 @@ - + - + @@ -215,12 +219,12 @@ - + - + - + @@ -1456,6 +1460,45 @@ + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs index 746d4bbea..14d2c8dbe 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml.cs @@ -22,21 +22,6 @@ public CompilerDetailsView() this.WhenActivated(disposables => { - ViewModel.WhenAny(vm => vm.ModListImageLocation.TargetPath) - .Where(i => i.FileExists()) - .Select(i => (UIUtils.TryGetBitmapImageFromFile(i, out var img), img)) - .Where(i => i.Item1) - .Select(i => i.img) - .BindToStrict(this, view => view.DetailImage.Image); - - ViewModel.WhenAny(vm => vm.Settings.ModListName) - .BindToStrict(this, view => view.DetailImage.Title); - - ViewModel.WhenAny(vm => vm.Settings.ModListAuthor) - .BindToStrict(this, view => view.DetailImage.Author); - - // Settings - this.Bind(ViewModel, vm => vm.Settings.ModListName, view => view.ModListNameSetting.Text) .DisposeWith(disposables); diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml index 732dc51ce..695d2a72f 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml @@ -18,22 +18,32 @@ x:TypeArguments="local:CompilerMainVM" mc:Ignorable="d"> - - - - - - - - - + - + + - - - + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs index 39d8239a3..f96dc8b69 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerMainView.xaml.cs @@ -17,7 +17,6 @@ public CompilerMainView() { InitializeComponent(); - /* this.WhenActivated(disposables => { ViewModel.WhenAny(vm => vm.Settings.ModListImage) @@ -36,27 +35,30 @@ public CompilerMainView() .BindToStrict(this, view => view.DetailImage.Author) .DisposeWith(disposables); - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Configuration ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.StartButton.Visibility); + ViewModel.WhenAny(x => x.State) + .Select(s => s == CompilerState.Configuration ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, x => x.ConfigurationView.Visibility) + .DisposeWith(disposables); ViewModel.WhenAny(vm => vm.State) .Select(s => s == CompilerState.Configuration ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.PrevButton.Visibility); + .BindToStrict(this, view => view.ConfigurationButtons.Visibility) + .DisposeWith(disposables); - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Compiling ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.CancelButton.Visibility); + ViewModel.WhenAny(x => x.State) + .Select(s => s == CompilerState.Compiling || s == CompilerState.Errored ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, x => x.LogView.Visibility) + .DisposeWith(disposables); - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Completed ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.PublishButton.Visibility); + ViewModel.WhenAny(x => x.State) + .Select(s => s == CompilerState.Compiling ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, x => x.CpuView.Visibility) + .DisposeWith(disposables); ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Completed ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.OpenFolderButton.Visibility); + .Select(s => s == CompilerState.Compiling ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, view => view.CompilationButtons.Visibility) + .DisposeWith(disposables); }); - */ - } } diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml deleted file mode 100644 index b1a4d635c..000000000 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml.cs deleted file mode 100644 index 0db814d27..000000000 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilingView.xaml.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Linq; -using System.Reactive.Linq; -using ReactiveUI; -using Wabbajack.Common; -using Wabbajack.Paths.IO; -using System.Windows; -using System.Reactive.Disposables; - -namespace Wabbajack; - -/// -/// Interaction logic for CompilingView.xaml -/// -public partial class CompilingView : ReactiveUserControl -{ - public CompilingView() - { - InitializeComponent(); - - this.WhenActivated(disposables => - { - ViewModel.WhenAny(vm => vm.Settings.ModListImage) - .Where(i => i.FileExists()) - .Select(i => (UIUtils.TryGetBitmapImageFromFile(i, out var img), img)) - .Where(i => i.Item1) - .Select(i => i.img) - .BindToStrict(this, view => view.DetailImage.Image) - .DisposeWith(disposables); - - ViewModel.WhenAny(vm => vm.Settings.ModListName) - .BindToStrict(this, view => view.DetailImage.Title) - .DisposeWith(disposables); - - ViewModel.WhenAny(vm => vm.Settings.ModListAuthor) - .BindToStrict(this, view => view.DetailImage.Author) - .DisposeWith(disposables); - - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Configuration ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.StartButton.Visibility); - - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Configuration ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.PrevButton.Visibility); - - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Compiling ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.CancelButton.Visibility); - - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Completed ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.PublishButton.Visibility); - - ViewModel.WhenAny(vm => vm.State) - .Select(s => s == CompilerState.Completed ? Visibility.Visible : Visibility.Hidden) - .BindToStrict(this, view => view.OpenFolderButton.Visibility); - }); - - } -} diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 3cabc2b7b..98fcbfb7f 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -70,7 +70,7 @@ - + @@ -92,9 +92,6 @@ - - - diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index 0d9c56ad1..dce15aafe 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -25,8 +25,6 @@ public partial class MainWindow : MetroWindow private readonly ILogger _logger; private readonly SystemParametersConstructor _systemParams; - private ObservableCollection TabVMs = new ObservableCollectionExtended(); - public MainWindow(ILogger logger, SystemParametersConstructor systemParams, LauncherUpdater updater, MainWindowVM vm) { InitializeComponent(); From 46d2949a970602a77d78c9fc4df83ad347af69d4 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:08:19 +0200 Subject: [PATCH 103/294] Make the compiling state screen work again --- Wabbajack.App.Wpf/Consts.cs | 2 +- .../ViewModels/Compiler/CompilerMainVM.cs | 26 ++++++---- .../Views/Common/WizardButton.xaml | 4 +- .../Views/Compiler/CompilerMainView.xaml | 51 ++++++++++--------- .../Views/Compiler/CompilerMainView.xaml.cs | 23 +++++++-- .../Client.cs | 12 ++++- 6 files changed, 76 insertions(+), 42 deletions(-) diff --git a/Wabbajack.App.Wpf/Consts.cs b/Wabbajack.App.Wpf/Consts.cs index 1c9ee2609..e8b55d4c0 100644 --- a/Wabbajack.App.Wpf/Consts.cs +++ b/Wabbajack.App.Wpf/Consts.cs @@ -23,7 +23,7 @@ public static class Consts public static byte SettingsVersion = 0; public static RelativePath NativeSettingsJson = "native_settings.json".ToRelativePath(); - public const string AllSavedCompilerSettingsPaths = "all-compiler-settings-paths"; + public const string AllSavedCompilerSettingsPaths = "compiler_settings_paths"; // Info - TODO, make rich document? public const string FileManagerInfo = @" diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index 0936d9d47..839a75b62 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -42,6 +42,8 @@ public class CompilerMainVM : BaseCompilerVM, IHasInfoVM, ICpuStatusVM public ICommand InfoCommand { get; } public ICommand StartCommand { get; } public ICommand CancelCommand { get; } + public ICommand OpenFolderCommand { get; } + public ICommand PublishCommand { get; } [Reactive] public CompilerState State { get; set; } public bool Cancelling { get; private set; } @@ -66,22 +68,21 @@ public CompilerMainVM(ILogger logger, DTOSerializer dtos, Settin InfoCommand = ReactiveCommand.Create(Info); StartCommand = ReactiveCommand.Create(StartCompilation); CancelCommand = ReactiveCommand.Create(CancelCompilation); + OpenFolderCommand = ReactiveCommand.Create(OpenFolder); + PublishCommand = ReactiveCommand.Create(Publish); StatusProgress = Percent.Zero; - - this.WhenActivated(disposables => - { - State = CompilerState.Configuration; - - Disposable.Empty.DisposeWith(disposables); - }); } - private void Info() + private void Publish() { - Process.Start(new ProcessStartInfo("https://wiki.wabbajack.org/modlist_author_documentation/Compilation.html") { UseShellExecute = true }); + throw new NotImplementedException(); } + private void OpenFolder() => Process.Start(new ProcessStartInfo(Settings.OutputFile.Parent.ToString())); + + private void Info() => Process.Start(new ProcessStartInfo("https://wiki.wabbajack.org/modlist_author_documentation/Compilation.html") { UseShellExecute = true }); + private async Task StartCompilation() { var tsk = Task.Run(async () => @@ -90,7 +91,12 @@ private async Task StartCompilation() { await SaveSettings(); var token = CancellationTokenSource.Token; - State = CompilerState.Compiling; + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => + { + StatusText = "Compiling"; + State = CompilerState.Compiling; + return Disposable.Empty; + }); Settings.UseGamePaths = true; if (Settings.OutputFile.DirectoryExists()) diff --git a/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml b/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml index c1df88284..0a374896d 100644 --- a/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml +++ b/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml @@ -10,8 +10,10 @@ ClipToBounds="True" d:DesignHeight="48" d:DesignWidth="200" + Width="200" + Height="48" mc:Ignorable="d"> - diff --git a/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs b/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs index 210afd2d2..b60138165 100644 --- a/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs @@ -76,9 +76,8 @@ public BigButton() .BindToStrict(this, x => x.ButtonSymbolIcon.Symbol) .DisposeWith(dispose); - Button.Events().MouseDown - .Select(args => Unit.Default) - .InvokeCommand(this, x => x.Command) + this.WhenAny(x => x.Command) + .BindToStrict(this, x => x.Button.Command) .DisposeWith(dispose); this.WhenAny(x => x.ButtonStyle) diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml index dda5b2cce..35e071aac 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml @@ -21,59 +21,17 @@ - + - - - - - - - - + + - + @@ -87,7 +45,7 @@ - + Recently Compiled Modlists diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml.cs index e5c8cabd7..d3906a787 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml.cs @@ -25,15 +25,15 @@ public CompilerHomeView() this.WhenActivated(dispose => { - this.WhenAny(x => x.ViewModel.CompiledModLists) + this.WhenAnyValue(x => x.ViewModel.CompiledModLists) .BindToStrict(this, x => x.CompiledModListsControl.ItemsSource) .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.NewModlistCommand) + this.WhenAnyValue(x => x.ViewModel.NewModlistCommand) .BindToStrict(this, x => x.NewModlistButton.Command) .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.LoadSettingsCommand) + this.WhenAnyValue(x => x.ViewModel.LoadSettingsCommand) .BindToStrict(this, x => x.LoadSettingsButton.Command) .DisposeWith(dispose); }); diff --git a/Wabbajack.App.Wpf/Views/HomeView.xaml b/Wabbajack.App.Wpf/Views/HomeView.xaml index b724b2b07..f3ae9f238 100644 --- a/Wabbajack.App.Wpf/Views/HomeView.xaml +++ b/Wabbajack.App.Wpf/Views/HomeView.xaml @@ -8,6 +8,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:rxui="http://reactiveui.net" xmlns:ic="clr-namespace:FluentIcons.WPF;assembly=FluentIcons.WPF" + d:DataContext="{d:DesignInstance local:HomeVM}" d:DesignHeight="700" d:DesignWidth="1000" x:TypeArguments="local:HomeVM" @@ -132,22 +133,6 @@ - - - - - - - - - - - - - - Browse the gallery and find yourself a modlist to play - - - + diff --git a/Wabbajack.App.Wpf/Views/HomeView.xaml.cs b/Wabbajack.App.Wpf/Views/HomeView.xaml.cs index ef6e38338..d002bfa48 100644 --- a/Wabbajack.App.Wpf/Views/HomeView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/HomeView.xaml.cs @@ -3,7 +3,6 @@ using System.Reactive; using System.Reactive.Disposables; using System.Reactive.Linq; -using ReactiveMarbles.ObservableEvents; using ReactiveUI; namespace Wabbajack; @@ -27,12 +26,6 @@ public HomeView() .Select(x => x?.GroupBy(y => y.Game).Count().ToString() ?? "0") .BindToStrict(this, x => x.GameAmountTextBlock.Text) .DisposeWith(dispose); - - GetStartedButton.Events() - .MouseDown - .Select(args => Unit.Default) - .InvokeCommand(this, x => x.ViewModel.BrowseCommand) - .DisposeWith(dispose); }); } } From e5945d2cb0780dcc589c615ef89acb2c1738b76a Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 19 Oct 2024 17:44:35 +0200 Subject: [PATCH 124/294] Add the Wabbajack back into Wabbajack --- Wabbajack.App.Wpf/Themes/Styles.xaml | 13 +++ .../Views/Common/BigButton.xaml.cs | 1 - Wabbajack.App.Wpf/Views/MainWindow.xaml | 92 +++++++++++-------- Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 5 + 4 files changed, 70 insertions(+), 41 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index cae3dd0f2..037642a89 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -56,6 +56,7 @@ #383750 #46425F + #2d2e45 #8866ad @@ -140,6 +141,7 @@ + @@ -4318,6 +4320,17 @@ + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs b/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs index b60138165..ebbcc034e 100644 --- a/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs @@ -5,7 +5,6 @@ using System.Windows; using System; using System.Windows.Input; -using ReactiveMarbles.ObservableEvents; using System.Reactive; namespace Wabbajack; diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 75739f6df..da143e1ce 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -32,7 +32,7 @@ - + @@ -95,45 +95,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index d19ad7b9a..158cc7b26 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -15,6 +15,8 @@ using Wabbajack.Messages; using Wabbajack.Paths.IO; using Wabbajack.Util; +using ReactiveMarbles.ObservableEvents; +using System.Reactive; namespace Wabbajack; @@ -178,6 +180,9 @@ public MainWindow(ILogger logger, SystemParametersConstructor system vm.WhenAnyValue(vm => vm.NavigationVisible) .Subscribe(v => NavigationColumn.Width = v ? new GridLength(115, GridUnitType.Pixel) : new GridLength(0, GridUnitType.Pixel)); + TitleBar.Events().MouseDown + .Subscribe(x => UIElement_OnMouseDown(this, x)); + /* ((MainWindowVM)DataContext).WhenAnyValue(vm => vm.Installer.InstallState) .ObserveOn(RxApp.MainThreadScheduler) From 5e8660e00d3dea2898cb6e4d8f44e16208f7bc7c Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:10:45 +0200 Subject: [PATCH 125/294] Optimize some bits of the gallery, tweak skipping slide message --- Wabbajack.App.Wpf/Util/UIUtils.cs | 15 +++-------- .../Gallery/BaseModListMetadataVM.cs | 8 +++--- .../ViewModels/Gallery/ModListGalleryVM.cs | 26 ++++++++++++------- Wabbajack.App.Wpf/ViewModels/ModVM.cs | 2 +- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/Wabbajack.App.Wpf/Util/UIUtils.cs b/Wabbajack.App.Wpf/Util/UIUtils.cs index 7f05156b4..d74708303 100644 --- a/Wabbajack.App.Wpf/Util/UIUtils.cs +++ b/Wabbajack.App.Wpf/Util/UIUtils.cs @@ -150,17 +150,10 @@ public static IObservable DownloadBitmapImage(this IObservable logger, Client wjClient, GameL SelectedGameTypeEntry = GameTypeEntries.FirstOrDefault(); }); - BackCommand = ReactiveCommand.Create( - () => - { - NavigateToGlobal.Send(ScreenType.Home); - }); - - this.WhenActivated(disposables => { LoadModLists().FireAndForget(); @@ -214,7 +207,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL { var previousGameType = GameType; SelectedGameTypeEntry = null; - GameTypeEntries = new(GetGameTypeEntries()); + GameTypeEntries = GetGameTypeEntries(); var nextEntry = GameTypeEntries.FirstOrDefault(gte => previousGameType == gte.GameIdentifier); SelectedGameTypeEntry = nextEntry != default ? nextEntry : GameTypeEntries.FirstOrDefault(gte => GameType == ALL_GAME_IDENTIFIER); } @@ -269,8 +262,21 @@ private async Task LoadModLists() e.AddOrUpdate(modLists.Select(m => new GalleryModListMetadataVM(_logger, this, m, _maintainer, _wjClient, _cancellationToken))); }); - SmallestSizedModlist = _modLists.Items.Any() ? _modLists.Items.MinBy(ml => ml.Metadata.DownloadMetadata.TotalSize) : null; - LargestSizedModlist = _modLists.Items.Any() ? _modLists.Items.MaxBy(ml => ml.Metadata.DownloadMetadata.TotalSize) : null; + SmallestSizedModlist = null; + LargestSizedModlist = null; + foreach(var item in _modLists.Items) + { + if (SmallestSizedModlist == null) SmallestSizedModlist = item; + if (LargestSizedModlist == null) LargestSizedModlist = item; + + var itemTotalSize = item.Metadata.DownloadMetadata.TotalSize; + var smallestSize = SmallestSizedModlist.Metadata.DownloadMetadata.TotalSize; + var largestSize = LargestSizedModlist.Metadata.DownloadMetadata.TotalSize; + + if (itemTotalSize < smallestSize) SmallestSizedModlist = item; + + if (itemTotalSize > largestSize) LargestSizedModlist = item; + } MinModlistSize = SmallestSizedModlist.Metadata.DownloadMetadata.TotalSize; MaxModlistSize = LargestSizedModlist.Metadata.DownloadMetadata.TotalSize; } diff --git a/Wabbajack.App.Wpf/ViewModels/ModVM.cs b/Wabbajack.App.Wpf/ViewModels/ModVM.cs index a25a7e5fb..07e1ff2b9 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModVM.cs @@ -24,7 +24,7 @@ public ModVM(ILogger logger, IMetaState state) ImageObservable = Observable.Return(State.ImageURL?.ToString()) .ObserveOn(RxApp.TaskpoolScheduler) - .DownloadBitmapImage(ex => _logger.LogError(ex, "Skipping slide for mod {Name}", State.Name), LoadingLock) + .DownloadBitmapImage(ex => _logger.LogWarning(ex, "Skipping slide for mod {Name}", State.Name), LoadingLock) .Replay(1) .RefCount(TimeSpan.FromMilliseconds(5000)); } From f348014af23673c079573ee71100550a7e6b7000 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 20 Oct 2024 13:02:45 +0200 Subject: [PATCH 126/294] Tweak the gallery view a bit --- Wabbajack.App.Wpf/Themes/Styles.xaml | 21 ++++++--- .../Views/ModListGalleryView.xaml | 43 ++++++++----------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 037642a89..adaf57557 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -38,8 +38,8 @@ #4e4571 #514c6b - #EFEFEF - #CCCCCC + #E5E5E8 + #3b3c50 #D9BBF9 #525252 @@ -56,7 +56,9 @@ #383750 #46425F - #2d2e45 + #81739d + #2d2e45 + #5f6071 #8866ad @@ -118,6 +120,9 @@ options:Freeze="True" Color="{StaticResource MahApps.Colors.Accent4}"/> + 16 + 12 + @@ -139,9 +144,11 @@ + - + + @@ -4236,7 +4243,7 @@ Width="{DynamicResource MahApps.Sizes.Slider.HorizontalThumb.Width}" Height="{DynamicResource MahApps.Sizes.Slider.HorizontalThumb.Height}" Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(mahapps:SliderHelper.ThumbFillBrush)}" - BorderThickness="1 0" + BorderThickness="4 0 0 0" Cursor="Arrow" Style="{DynamicResource MahApps.Styles.Thumb.Slider}" /> @@ -4326,7 +4333,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index c015b498f..0978a0bc6 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -16,7 +16,7 @@ mc:Ignorable="d"> - + --> + VerticalAlignment="Stretch"> @@ -94,13 +93,13 @@ - - + + @@ -132,7 +131,7 @@ - + @@ -160,28 +159,24 @@ - - - - + + + + - + Icon="FilterDismiss" + Text="Reset filters" + Width="Auto" + > + From 045d83449bd39769d6680c145ddf9bfee724caf5 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 21 Oct 2024 00:07:25 +0200 Subject: [PATCH 127/294] Add gallery details view --- Wabbajack.App.Wpf/App.xaml.cs | 1 + .../Messages/LoadModlistForDetails.cs | 19 + .../Messages/NavigateToGlobal.cs | 2 +- .../Gallery/BaseModListMetadataVM.cs | 65 +-- .../Gallery/GalleryModListMetadataVM.cs | 35 ++ Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 7 +- ...dListContentsVM.cs => ModListDetailsVM.cs} | 20 +- .../Views/Common/DetailImageView.xaml.cs | 4 - Wabbajack.App.Wpf/Views/MainWindow.xaml | 4 +- .../Views/ModListContentsView.xaml | 60 --- .../Views/ModListContentsView.xaml.cs | 27 -- .../Views/ModListDetailsView.xaml | 105 +++++ .../Views/ModListDetailsView.xaml.cs | 28 ++ .../Views/ModListGalleryView.xaml | 111 +++-- Wabbajack.App.Wpf/Views/ModListTileView.xaml | 432 +++++++++--------- .../Views/ModListTileView.xaml.cs | 3 + 16 files changed, 501 insertions(+), 422 deletions(-) create mode 100644 Wabbajack.App.Wpf/Messages/LoadModlistForDetails.cs rename Wabbajack.App.Wpf/ViewModels/{ModListContentsVM.cs => ModListDetailsVM.cs} (80%) delete mode 100644 Wabbajack.App.Wpf/Views/ModListContentsView.xaml delete mode 100644 Wabbajack.App.Wpf/Views/ModListContentsView.xaml.cs create mode 100644 Wabbajack.App.Wpf/Views/ModListDetailsView.xaml create mode 100644 Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index a62ea801c..af4487849 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -178,6 +178,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); // Login Handlers services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Messages/LoadModlistForDetails.cs b/Wabbajack.App.Wpf/Messages/LoadModlistForDetails.cs new file mode 100644 index 000000000..7b20340ee --- /dev/null +++ b/Wabbajack.App.Wpf/Messages/LoadModlistForDetails.cs @@ -0,0 +1,19 @@ +using ReactiveUI; +using Wabbajack.DTOs; + +namespace Wabbajack.Messages; + +public class LoadModlistForDetails +{ + public BaseModListMetadataVM MetadataVM { get; } + + public LoadModlistForDetails(BaseModListMetadataVM metadata) + { + MetadataVM = metadata; + } + + public static void Send(BaseModListMetadataVM metadataVM) + { + MessageBus.Current.SendMessage(new LoadModlistForDetails(metadataVM)); + } +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs index 6b4bbb81e..636b71464 100644 --- a/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs +++ b/Wabbajack.App.Wpf/Messages/NavigateToGlobal.cs @@ -10,7 +10,7 @@ public enum ScreenType Settings, CompilerHome, CompilerMain, - ModListContents, + ModListDetails, WebBrowser, Info } diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs index 11748a7a5..15c98846d 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs @@ -36,66 +36,61 @@ public class BaseModListMetadataVM : ViewModel { public ModlistMetadata Metadata { get; } - public ICommand OpenWebsiteCommand { get; } - public ICommand ExecuteCommand { get; } - - public ICommand ModListContentsCommend { get; } - public AbsolutePath Location { get; } public LoadingLock LoadingImageLock { get; } = new(); [Reactive] - public List ModListTagList { get; private set; } + public List ModListTagList { get; protected set; } [Reactive] - public Percent ProgressPercent { get; private set; } + public Percent ProgressPercent { get; protected set; } [Reactive] - public bool IsBroken { get; private set; } + public bool IsBroken { get; protected set; } [Reactive] public ModListStatus Status { get; set; } [Reactive] - public bool IsDownloading { get; private set; } + public bool IsDownloading { get; protected set; } [Reactive] - public string DownloadSizeText { get; private set; } + public string DownloadSizeText { get; protected set; } [Reactive] - public string InstallSizeText { get; private set; } + public string InstallSizeText { get; protected set; } [Reactive] - public string TotalSizeRequirementText { get; private set; } + public string TotalSizeRequirementText { get; protected set; } [Reactive] - public string VersionText { get; private set; } + public string VersionText { get; protected set; } [Reactive] - public bool ImageContainsTitle { get; private set; } + public bool ImageContainsTitle { get; protected set; } [Reactive] - public GameMetaData GameMetaData { get; private set; } + public GameMetaData GameMetaData { get; protected set; } [Reactive] - public bool DisplayVersionOnlyInInstallerView { get; private set; } + public bool DisplayVersionOnlyInInstallerView { get; protected set; } [Reactive] - public IErrorResponse Error { get; private set; } + public IErrorResponse Error { get; protected set; } - private readonly ObservableAsPropertyHelper _Image; + protected readonly ObservableAsPropertyHelper _Image; public BitmapImage Image => _Image.Value; - private readonly ObservableAsPropertyHelper _LoadingImage; + protected readonly ObservableAsPropertyHelper _LoadingImage; public bool LoadingImage => _LoadingImage.Value; - private Subject IsLoadingIdle; - private readonly ILogger _logger; - private readonly ModListDownloadMaintainer _maintainer; - private readonly Client _wjClient; - private readonly CancellationToken _cancellationToken; + protected Subject IsLoadingIdle; + protected readonly ILogger _logger; + protected readonly ModListDownloadMaintainer _maintainer; + protected readonly Client _wjClient; + protected readonly CancellationToken _cancellationToken; public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken) @@ -125,31 +120,9 @@ public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, ImageContainsTitle = Metadata.ImageContainsTitle; DisplayVersionOnlyInInstallerView = Metadata.DisplayVersionOnlyInInstallerView; IsBroken = metadata.ValidationSummary.HasFailures || metadata.ForceDown; - // https://www.wabbajack.org/modlist/wj-featured/aldrnari - OpenWebsiteCommand = ReactiveCommand.Create(() => UIUtils.OpenWebsite(new Uri($"https://www.wabbajack.org/modlist/{Metadata.NamespacedName}"))); IsLoadingIdle = new Subject(); - ModListContentsCommend = ReactiveCommand.Create(async () => - { - UIUtils.OpenWebsite(new Uri($"https://www.wabbajack.org/search/{Metadata.NamespacedName}")); - }, IsLoadingIdle.StartWith(true)); - - ExecuteCommand = ReactiveCommand.CreateFromTask(async () => - { - if (await _maintainer.HaveModList(Metadata)) - { - LoadModlistForInstalling.Send(_maintainer.ModListPath(Metadata), Metadata); - NavigateToGlobal.Send(ScreenType.Installer); - } - else - { - await Download(); - } - }, LoadingLock.WhenAnyValue(ll => ll.IsLoading) - .CombineLatest(this.WhenAnyValue(vm => vm.IsBroken)) - .Select(v => !v.First && !v.Second)); - var modlistImageSource = Metadata.ValidationSummary?.SmallImage?.ToString() ?? Metadata.Links.ImageUri; var imageObs = Observable.Return(modlistImageSource) .DownloadBitmapImage((ex) => _logger.LogError("Error downloading modlist image {Title} from {ImageUri}: {Exception}", Metadata.Title, modlistImageSource, ex.Message), LoadingImageLock); diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs index d3907ba96..1fc6bc6b7 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs @@ -2,10 +2,12 @@ using System.Reactive; using System.Reactive.Linq; using System.Threading; +using System.Windows.Input; using Microsoft.Extensions.Logging; using ReactiveUI; using Wabbajack.DTOs; using Wabbajack.Extensions; +using Wabbajack.Messages; using Wabbajack.Networking.WabbajackClientApi; using Wabbajack.Services.OSIntegrated.Services; @@ -18,6 +20,11 @@ public class GalleryModListMetadataVM : BaseModListMetadataVM private readonly ObservableAsPropertyHelper _Exists; public bool Exists => _Exists.Value; + public ICommand DetailsCommand { get; set; } + public ICommand OpenWebsiteCommand { get; } + public ICommand InstallCommand { get; } + public ICommand ModListContentsCommend { get; } + public GalleryModListMetadataVM(ILogger logger, ModListGalleryVM parent, ModlistMetadata metadata, ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken) : base(logger, metadata, maintainer, wjClient, cancellationToken) { @@ -38,5 +45,33 @@ public GalleryModListMetadataVM(ILogger logger, ModListGalleryVM parent, Modlist } }) .ToGuiProperty(this, nameof(Exists)); + + // https://www.wabbajack.org/modlist/wj-featured/aldrnari + DetailsCommand = ReactiveCommand.Create(() => { + LoadModlistForDetails.Send(this); + NavigateToGlobal.Send(ScreenType.ModListDetails); + }); + OpenWebsiteCommand = ReactiveCommand.Create(() => UIUtils.OpenWebsite(new Uri($"https://www.wabbajack.org/modlist/{Metadata.NamespacedName}"))); + + ModListContentsCommend = ReactiveCommand.Create(async () => + { + UIUtils.OpenWebsite(new Uri($"https://www.wabbajack.org/search/{Metadata.NamespacedName}")); + }, IsLoadingIdle.StartWith(true)); + + InstallCommand = ReactiveCommand.CreateFromTask(async () => + { + if (await _maintainer.HaveModList(Metadata)) + { + LoadModlistForInstalling.Send(_maintainer.ModListPath(Metadata), Metadata); + NavigateToGlobal.Send(ScreenType.Installer); + } + else + { + await Download(); + } + }, LoadingLock.WhenAnyValue(ll => ll.IsLoading) + .CombineLatest(this.WhenAnyValue(vm => vm.IsBroken)) + .Select(v => !v.First && !v.Second)); + } } diff --git a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index 996f058ff..8b65ffb37 100644 --- a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -53,7 +53,7 @@ public class MainWindowVM : ViewModel public readonly ModListGalleryVM GalleryVM; public readonly HomeVM HomeVM; public readonly WebBrowserVM WebBrowserVM; - public readonly Lazy ModListContentsVM; + public readonly ModListDetailsVM ModListDetailsVM; public readonly InfoVM InfoVM; public readonly UserInterventionHandlers UserInterventionHandlers; private readonly Client _wjClient; @@ -86,7 +86,7 @@ public class MainWindowVM : ViewModel public MainWindowVM(ILogger logger, Client wjClient, IServiceProvider serviceProvider, HomeVM homeVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, - InstallerVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilerMainVM compilerMainVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM) + InstallerVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilerMainVM compilerMainVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM, ModListDetailsVM modlistDetailsVM) { _logger = logger; _wjClient = wjClient; @@ -103,7 +103,7 @@ public MainWindowVM(ILogger logger, Client wjClient, HomeVM = homeVM; WebBrowserVM = webBrowserVM; NavigationVM = navigationVM; - ModListContentsVM = new Lazy(() => new ModListContentsVM(serviceProvider.GetRequiredService>(), this)); + ModListDetailsVM = modlistDetailsVM; InfoVM = infoVM; UserInterventionHandlers = new UserInterventionHandlers(serviceProvider.GetRequiredService>(), this); @@ -263,6 +263,7 @@ private void HandleNavigateTo(ScreenType s) ScreenType.Installer => InstallerVM, ScreenType.CompilerHome => CompilerHomeVM, ScreenType.CompilerMain => CompilerMainVM, + ScreenType.ModListDetails => ModListDetailsVM, ScreenType.Settings => SettingsPaneVM, ScreenType.Info => InfoVM, _ => ActivePane diff --git a/Wabbajack.App.Wpf/ViewModels/ModListContentsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs similarity index 80% rename from Wabbajack.App.Wpf/ViewModels/ModListContentsVM.cs rename to Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs index 61b0d5bcf..831208fae 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModListContentsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs @@ -6,18 +6,19 @@ using DynamicData; using DynamicData.Binding; using Microsoft.Extensions.Logging; +using ReactiveUI; using ReactiveUI.Fody.Helpers; using Wabbajack.Common; using Wabbajack.DTOs; using Wabbajack.DTOs.ServerResponses; +using Wabbajack.Messages; -namespace Wabbajack.ViewModels; +namespace Wabbajack; -public class ModListContentsVM : BackNavigatingVM +public class ModListDetailsVM : BackNavigatingVM { - private MainWindowVM _mwvm; [Reactive] - public string Name { get; set; } + public BaseModListMetadataVM MetadataVM { get; set; } [Reactive] public ObservableCollection Status { get; set; } @@ -29,13 +30,18 @@ public class ModListContentsVM : BackNavigatingVM public ReadOnlyObservableCollection Archives => _archives; private static readonly Regex NameMatcher = new(@"(?<=\.)[^\.]+(?=\+State)", RegexOptions.Compiled); - private readonly ILogger _logger; + private readonly ILogger _logger; - public ModListContentsVM(ILogger logger, MainWindowVM mwvm) : base(logger) + public ModListDetailsVM(ILogger logger) : base(logger) { _logger = logger; - _mwvm = mwvm; Status = new ObservableCollectionExtended(); + + MessageBus.Current.Listen() + .Subscribe(msg => MetadataVM = msg.MetadataVM) + .DisposeWith(CompositeDisposable); + + BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.ModListGallery)); string TransformClassName(Archive a) { diff --git a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs index 04c090792..3d91504e8 100644 --- a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs @@ -57,7 +57,6 @@ public DetailImageView() this.WhenActivated(dispose => { // Update textboxes - /* var authorVisible = this.WhenAny(x => x.Author) .Select(x => string.IsNullOrWhiteSpace(x) ? Visibility.Collapsed : Visibility.Visible) .Replay(1) @@ -65,12 +64,10 @@ public DetailImageView() authorVisible .BindToStrict(this, x => x.AuthorTextBlock.Visibility) .DisposeWith(dispose); - */ this.WhenAny(x => x.Author) .BindToStrict(this, x => x.AuthorTextRun.Text) .DisposeWith(dispose); - /* var titleVisible = this.WhenAny(x => x.Title) .Select(x => string.IsNullOrWhiteSpace(x) ? Visibility.Collapsed : Visibility.Visible) .Replay(1) @@ -78,7 +75,6 @@ public DetailImageView() titleVisible .BindToStrict(this, x => x.TitleTextBlock.Visibility) .DisposeWith(dispose); - */ this.WhenAny(x => x.Title) .BindToStrict(this, x => x.TitleTextBlock.Text) .DisposeWith(dispose); diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index da143e1ce..3137aaba2 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -137,8 +137,8 @@ - - + + diff --git a/Wabbajack.App.Wpf/Views/ModListContentsView.xaml b/Wabbajack.App.Wpf/Views/ModListContentsView.xaml deleted file mode 100644 index 4d3e7f814..000000000 --- a/Wabbajack.App.Wpf/Views/ModListContentsView.xaml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Views/ModListContentsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListContentsView.xaml.cs deleted file mode 100644 index 1a8cca9ee..000000000 --- a/Wabbajack.App.Wpf/Views/ModListContentsView.xaml.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Reactive.Disposables; -using ReactiveUI; - -namespace Wabbajack; - -public partial class ModListContentsView -{ - - public ModListContentsView() - { - InitializeComponent(); - this.WhenActivated(disposable => - { - this.ArchiveGrid.ItemsSource = this.ViewModel.Archives; - - this.WhenAny(x => x.ViewModel.Name) - .BindToStrict(this, x => x.ModListTitle.Title) - .DisposeWith(disposable); - this.BindStrict(ViewModel, x => x.SearchString, x => x.SearchBox.Text) - .DisposeWith(disposable); - this.WhenAny(x => x.ViewModel.BackCommand) - .BindToStrict(this, x => x.BackButton.Command) - .DisposeWith(disposable); - }); - } -} - diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml new file mode 100644 index 000000000..00ff96e92 --- /dev/null +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs new file mode 100644 index 000000000..d42c27ace --- /dev/null +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs @@ -0,0 +1,28 @@ +using System.Reactive.Disposables; +using ReactiveUI; + +namespace Wabbajack; + +public partial class ModListDetailsView +{ + + public ModListDetailsView() + { + InitializeComponent(); + this.WhenActivated(disposables => + { + this.ArchiveGrid.ItemsSource = this.ViewModel.Archives; + + this.BindStrict(ViewModel, x => x.SearchString, x => x.SearchBox.Text) + .DisposeWith(disposables); + + this.BindCommand(ViewModel, x => x.BackCommand, x => x.BackButton) + .DisposeWith(disposables); + + ViewModel.WhenAnyValue(vm => vm.MetadataVM.Image) + .BindToStrict(this, v => v.DetailImage.Image) + .DisposeWith(disposables); + }); + } +} + diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 0978a0bc6..da7478e95 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -19,63 +19,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -178,5 +121,59 @@ > + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/ModListTileView.xaml b/Wabbajack.App.Wpf/Views/ModListTileView.xaml index 9149f4d6e..29ab6331b 100644 --- a/Wabbajack.App.Wpf/Views/ModListTileView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListTileView.xaml @@ -46,312 +46,313 @@ - + - - + - - - - - - - + + + + + + - - - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - + + + + - - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - + - - + + diff --git a/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs index ceafa63f4..4a24cd1a2 100644 --- a/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs @@ -33,6 +33,9 @@ public ModListTileView() .Select(x => x ? Visibility.Visible : Visibility.Collapsed) .BindToStrict(this, view => view.Overlay.Visibility) .DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.DetailsCommand, v => v.ModlistButton) + .DisposeWith(disposables); }); } } From 3fb0ea908a3a07e0c7d2871d8913adc17593c69d Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:38:36 +0200 Subject: [PATCH 128/294] Fix image scaling on ModlistDetailsView --- Wabbajack.App.Wpf/Views/ModListDetailsView.xaml | 10 +++++++--- Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs | 4 ---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml index 00ff96e92..ef8424535 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -14,18 +14,22 @@ d:DesignHeight="300" d:DesignWidth="300"> - + - + - + + + + + diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs index d42c27ace..74bc4075d 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs @@ -18,10 +18,6 @@ public ModListDetailsView() this.BindCommand(ViewModel, x => x.BackCommand, x => x.BackButton) .DisposeWith(disposables); - - ViewModel.WhenAnyValue(vm => vm.MetadataVM.Image) - .BindToStrict(this, v => v.DetailImage.Image) - .DisposeWith(disposables); }); } } From a2e8cfca33b618e848474920f785c4fca75d32c8 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 21 Oct 2024 23:02:20 +0200 Subject: [PATCH 129/294] Add basic in-app archive search --- ; | 41 ++++--- .../Converters/NexusArchiveStateConverter.cs | 27 +++++ Wabbajack.App.Wpf/Themes/Styles.xaml | 25 ++-- .../ViewModels/ModListDetailsVM.cs | 111 +++++++++++------- Wabbajack.App.Wpf/Views/MainWindow.xaml | 4 +- .../Views/ModListDetailsView.xaml | 33 ++++-- .../Views/ModListDetailsView.xaml.cs | 16 ++- .../Client.cs | 4 +- 8 files changed, 171 insertions(+), 90 deletions(-) create mode 100644 Wabbajack.App.Wpf/Converters/NexusArchiveStateConverter.cs diff --git a/; b/; index 645fc307e..b5886c494 100644 --- a/; +++ b/; @@ -1,21 +1,28 @@ -namespace Wabbajack; +using System; +using System.Globalization; +using System.Windows.Data; +using Wabbajack.Common; +using Wabbajack.DTOs.DownloadStates; -public enum Step +namespace Wabbajack { - Configuration, - Progress -} -public enum ProgressColor -{ - Normal, - Success, - Error, -} + public class NexusArchiveStateConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var strParameter = parameter.ToString(); + if(value is Nexus nexus) + { + var nexusType = value.GetType(); + var nexusProperty =nexusType.GetProperty(parameter); + return nexus; + } + return new Nexus(); + } -public interface IHasConfigurationProgressVM -{ - public Step CurrentStep { get; set; } - public string ConfigurationText { get; set; } - public string ProgressText { get; set; } - public double ProgressValue { get; set; } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } } diff --git a/Wabbajack.App.Wpf/Converters/NexusArchiveStateConverter.cs b/Wabbajack.App.Wpf/Converters/NexusArchiveStateConverter.cs new file mode 100644 index 000000000..f25acf9e6 --- /dev/null +++ b/Wabbajack.App.Wpf/Converters/NexusArchiveStateConverter.cs @@ -0,0 +1,27 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using Wabbajack.Common; +using Wabbajack.DTOs.DownloadStates; + +namespace Wabbajack +{ + public class NexusArchiveStateConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if(value is Nexus nexus) + { + var nexusType = value.GetType(); + var nexusProperty = nexusType.GetProperty(parameter.ToString()); + return nexusProperty.GetValue(nexus); + } + return ""; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index adaf57557..4b1dd7dae 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -26,6 +26,7 @@ + #222531 @@ -247,12 +248,12 @@ - - + + - + @@ -3773,13 +3774,14 @@ + - - - - - + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs index 74bc4075d..e349b2997 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs @@ -1,5 +1,9 @@ using System.Reactive.Disposables; using ReactiveUI; +using ReactiveMarbles.ObservableEvents; +using System.Windows; +using System.Windows.Controls.Primitives; +using System; namespace Wabbajack; @@ -11,14 +15,20 @@ public ModListDetailsView() InitializeComponent(); this.WhenActivated(disposables => { - this.ArchiveGrid.ItemsSource = this.ViewModel.Archives; - - this.BindStrict(ViewModel, x => x.SearchString, x => x.SearchBox.Text) + this.BindStrict(ViewModel, x => x.Archives, x => x.ArchiveGrid.ItemsSource) + .DisposeWith(disposables); + + this.BindStrict(ViewModel, x => x.Search, x => x.SearchBox.Text) .DisposeWith(disposables); this.BindCommand(ViewModel, x => x.BackCommand, x => x.BackButton) .DisposeWith(disposables); }); } + + private void ColumnHeaderClicked(object sender, RoutedEventArgs e) + { + int i = 0; + } } diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index d32d7d9f1..fbb5a5dff 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -161,10 +161,10 @@ public async Task GetListStatuses() _dtos.Options) ?? Array.Empty(); } - public async Task GetDetailedStatus(string machineURL) + public async Task GetDetailedStatus(string repository, string machineURL) { return (await _client.GetFromJsonAsync( - $"https://raw.githubusercontent.com/wabbajack-tools/mod-lists/master/reports/{machineURL}/status.json", + $"https://raw.githubusercontent.com/wabbajack-tools/mod-lists/master/reports/{repository}/{machineURL}/status.json", _dtos.Options))!; } From c4484f62280e9d6fb441b1a08823cace7c912e16 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:28:46 +0200 Subject: [PATCH 130/294] Make Nexus archive rows clickable --- .../Converters/IsNexusArchiveConverter.cs | 23 ++++++ Wabbajack.App.Wpf/Themes/Styles.xaml | 16 ++-- .../Views/ModListDetailsView.xaml | 81 +++++++++++++++++-- .../Views/ModListDetailsView.xaml.cs | 21 ++++- 4 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 Wabbajack.App.Wpf/Converters/IsNexusArchiveConverter.cs diff --git a/Wabbajack.App.Wpf/Converters/IsNexusArchiveConverter.cs b/Wabbajack.App.Wpf/Converters/IsNexusArchiveConverter.cs new file mode 100644 index 000000000..948f9dfa5 --- /dev/null +++ b/Wabbajack.App.Wpf/Converters/IsNexusArchiveConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using Wabbajack.DTOs; +using Wabbajack.DTOs.DownloadStates; + +namespace Wabbajack +{ + public class IsNexusArchiveConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) return false; + return value is Archive a && a.State.GetType() == typeof(Nexus); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 4b1dd7dae..2f8241098 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -27,6 +27,7 @@ + #222531 @@ -56,6 +57,7 @@ #303141 #383750 + #3f3c57 #46425F #81739d #2d2e45 @@ -147,6 +149,7 @@ + @@ -250,8 +253,8 @@ - - + + @@ -3917,12 +3920,13 @@ - - + + + + + + - + + + + + + + + - + - + - + diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs index e349b2997..c94a6324f 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs @@ -4,6 +4,10 @@ using System.Windows; using System.Windows.Controls.Primitives; using System; +using System.Windows.Input; +using System.Diagnostics; +using Wabbajack.DTOs; +using Wabbajack.DTOs.DownloadStates; namespace Wabbajack; @@ -26,9 +30,22 @@ public ModListDetailsView() }); } - private void ColumnHeaderClicked(object sender, RoutedEventArgs e) + private void DataGridRow_GotFocus(object sender, RoutedEventArgs e) { - int i = 0; + var presenter = ((DataGridCellsPresenter)e.Source); + var archive = (Archive)presenter.Item; + if(archive.State is Nexus nexusState) + { + Process.Start(new ProcessStartInfo(nexusState.LinkUrl.ToString()) { UseShellExecute = true }); + } + RxApp.MainThreadScheduler.Schedule(0, (_, _) => + { + FocusManager.SetFocusedElement(FocusManager.GetFocusScope(presenter), null); + Keyboard.ClearFocus(); + ArchiveGrid.SelectedItem = null; + ArchiveGrid.CurrentItem = null; + return Disposable.Empty; + }); } } From 3d0ed7f6ce7e5dc223f7399f6ac290bfd9553c45 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:09:36 +0200 Subject: [PATCH 131/294] Add hand cursor when hovering over buttons --- Wabbajack.App.Wpf/Themes/Styles.xaml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 2f8241098..79632d17a 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -587,6 +587,7 @@ + @@ -651,6 +652,7 @@ + @@ -1432,6 +1434,13 @@ + + + + + + + @@ -4245,11 +4254,11 @@ Height="{DynamicResource MahApps.Sizes.Slider.HorizontalThumb.Height}" Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(mahapps:SliderHelper.ThumbFillBrush)}" BorderThickness="4 0 0 0" - Cursor="Arrow" + Cursor="Hand" Style="{DynamicResource MahApps.Styles.Thumb.Slider}" /> + From 3007cc1db96e62981521ebc812e54c22570d8884 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:26:22 +0200 Subject: [PATCH 132/294] Only show featured checkmark on featured modlists, add tooltip explaining very briefly what featured means --- Wabbajack.App.Wpf/Views/ModListDetailsView.xaml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml index 8e45acb45..1e4c76ee8 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -15,7 +15,7 @@ d:DesignHeight="300" d:DesignWidth="300"> - + @@ -34,7 +34,7 @@ - + @@ -148,9 +148,6 @@ - - From 248a6986c2840e00ca2a995d9189954a5dda5ec0 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:34:12 +0200 Subject: [PATCH 133/294] Adjust wording on featured modlist tooltip --- Wabbajack.App.Wpf/Views/ModListDetailsView.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml index 1e4c76ee8..c98c5a085 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -34,7 +34,7 @@ - + From 7947fe09f94b06a7a162857dd775ca7e886b4808 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Thu, 24 Oct 2024 00:15:35 +0200 Subject: [PATCH 134/294] Add websiteURL support --- Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs | 10 +++++++++- Wabbajack.App.Wpf/Views/ModListDetailsView.xaml | 15 ++++++--------- Wabbajack.DTOs/ModList/Links.cs | 1 + 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs index ae6db715c..0a796eb7c 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs @@ -1,10 +1,12 @@ using System; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Windows.Input; using DynamicData; using DynamicData.Binding; using Microsoft.Extensions.Logging; @@ -42,6 +44,9 @@ public class ModListDetailsVM : BackNavigatingVM private readonly ILogger _logger; + public ICommand OpenWebsiteCommand { get; set; } + public ICommand OpenDiscordCommand { get; set; } + public ModListDetailsVM(ILogger logger, Client wjClient) : base(logger) { _logger = logger; @@ -51,10 +56,13 @@ public ModListDetailsVM(ILogger logger, Client wjClient) : bas .Subscribe(msg => MetadataVM = msg.MetadataVM) .DisposeWith(CompositeDisposable); - BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.ModListGallery)); + OpenWebsiteCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.WebsiteURL) { UseShellExecute = true })); + OpenDiscordCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.DiscordURL) { UseShellExecute = true })); + BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.ModListGallery)); this.WhenActivated(disposables => { + LoadArchives(MetadataVM.Metadata.RepositoryName, MetadataVM.Metadata.Links.MachineURL).FireAndForget(); var searchThrottle = TimeSpan.FromSeconds(0.5); diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml index c98c5a085..4ca143d46 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -15,7 +15,7 @@ d:DesignHeight="300" d:DesignWidth="300"> - + @@ -56,8 +56,6 @@ - - @@ -65,9 +63,8 @@ - - - + + @@ -166,21 +163,21 @@ - + - + - + diff --git a/Wabbajack.DTOs/ModList/Links.cs b/Wabbajack.DTOs/ModList/Links.cs index 1b933b74c..2652b5886 100644 --- a/Wabbajack.DTOs/ModList/Links.cs +++ b/Wabbajack.DTOs/ModList/Links.cs @@ -15,4 +15,5 @@ public class LinksObject [JsonPropertyName("machineURL")] public string MachineURL { get; set; } = string.Empty; [JsonPropertyName("discordURL")] public string DiscordURL { get; set; } = string.Empty; + [JsonPropertyName("websiteURL")] public string WebsiteURL { get; set; } = string.Empty; } \ No newline at end of file From c3fb40c3b89fa16197d321ad8649d2ee8fddc4ec Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Thu, 24 Oct 2024 19:56:41 +0200 Subject: [PATCH 135/294] Disable link buttons when they're empty --- Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs index 0a796eb7c..0976e0fe0 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs @@ -56,8 +56,8 @@ public ModListDetailsVM(ILogger logger, Client wjClient) : bas .Subscribe(msg => MetadataVM = msg.MetadataVM) .DisposeWith(CompositeDisposable); - OpenWebsiteCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.WebsiteURL) { UseShellExecute = true })); - OpenDiscordCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.DiscordURL) { UseShellExecute = true })); + OpenWebsiteCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.WebsiteURL) { UseShellExecute = true }), this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.WebsiteURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); + OpenDiscordCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.DiscordURL) { UseShellExecute = true }), this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.DiscordURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.ModListGallery)); this.WhenActivated(disposables => From 3aafdfd7d73752f089776ec7313c1cbfc66332be Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 26 Oct 2024 15:04:48 +0200 Subject: [PATCH 136/294] Various improvements to gallery speed & memory usage --- Wabbajack.App.Wpf/Util/UIUtils.cs | 309 ++- Wabbajack.App.Wpf/Util/WebPWrapper.cs | 1976 ----------------- .../Gallery/BaseModListMetadataVM.cs | 42 +- .../Gallery/GalleryModListMetadataVM.cs | 3 +- .../ViewModels/Gallery/ModListGalleryVM.cs | 28 +- .../ViewModels/ModListDetailsVM.cs | 2 +- Wabbajack.App.Wpf/ViewModels/ModVM.cs | 10 +- .../Views/ModListGalleryView.xaml | 150 +- .../Views/ModListGalleryView.xaml.cs | 22 +- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 1 + .../ByteArrayExtensions.cs | 3 +- .../StringExtensions.cs | 2 +- .../Client.cs | 6 +- 13 files changed, 303 insertions(+), 2251 deletions(-) delete mode 100644 Wabbajack.App.Wpf/Util/WebPWrapper.cs diff --git a/Wabbajack.App.Wpf/Util/UIUtils.cs b/Wabbajack.App.Wpf/Util/UIUtils.cs index d74708303..a93b339e7 100644 --- a/Wabbajack.App.Wpf/Util/UIUtils.cs +++ b/Wabbajack.App.Wpf/Util/UIUtils.cs @@ -8,209 +8,190 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Media.Imaging; -using Wabbajack.Common; using Wabbajack.Hashing.xxHash64; using Wabbajack.Extensions; using Wabbajack.Models; using Wabbajack.Paths; using Wabbajack.Paths.IO; -using System.Drawing; -using System.Drawing.Imaging; -using System.Linq; -using System.Data; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats.Png; +using Wabbajack.DTOs; +using SharpImage = SixLabors.ImageSharp.Image; -namespace Wabbajack -{ - public static class UIUtils - { - public static BitmapImage BitmapImageFromResource(string name) => BitmapImageFromStream(System.Windows.Application.GetResourceStream(new Uri("pack://application:,,,/Wabbajack;component/" + name)).Stream); - - public static BitmapImage BitmapImageFromStream(Stream stream) - { - var img = new BitmapImage(); - img.BeginInit(); - img.CacheOption = BitmapCacheOption.OnLoad; - img.StreamSource = stream; - img.EndInit(); - img.Freeze(); - return img; - } +namespace Wabbajack; - public static BitmapImage BitmapImageFromWebp(MemoryStream stream, bool getThumbnail = false) - { - byte[] bytes = stream.ToArray(); - using(WebP webp = new()) - { - Bitmap bitmap; - if (getThumbnail) - bitmap = webp.GetThumbnailFast(bytes, 640, 360); - else - bitmap = webp.Decode(bytes); +public static class UIUtils +{ + public static BitmapImage BitmapImageFromResource(string name) => BitmapImageFromStream(System.Windows.Application.GetResourceStream(new Uri("pack://application:,,,/Wabbajack;component/" + name)).Stream); - using(var ms = new MemoryStream()) - { - bitmap.Save(ms, ImageFormat.Png); - ms.Position = 0; - - var img = new BitmapImage(); - img.BeginInit(); - img.CacheOption = BitmapCacheOption.OnLoad; - img.StreamSource = ms; - img.EndInit(); - img.Freeze(); - return img; - } - } - } + public static BitmapImage BitmapImageFromStream(Stream stream) + { + var img = new BitmapImage(); + img.BeginInit(); + img.CacheOption = BitmapCacheOption.OnLoad; + img.StreamSource = stream; + img.EndInit(); + img.Freeze(); + return img; + } - public static bool TryGetBitmapImageFromFile(AbsolutePath path, out BitmapImage bitmapImage) + public static bool TryGetBitmapImageFromFile(AbsolutePath path, out BitmapImage bitmapImage) + { + try { - try - { - if (!path.FileExists()) - { - bitmapImage = default; - return false; - } - bitmapImage = new BitmapImage(new Uri(path.ToString(), UriKind.RelativeOrAbsolute)); - return true; - } - catch (Exception) + if (!path.FileExists()) { bitmapImage = default; return false; } + bitmapImage = new BitmapImage(new Uri(path.ToString(), UriKind.RelativeOrAbsolute)); + return true; + } + catch (Exception) + { + bitmapImage = default; + return false; } + } - public static void OpenWebsite(Uri url) + public static void OpenWebsite(Uri url) + { + Process.Start(new ProcessStartInfo("cmd.exe", $"/c start {url}") { - Process.Start(new ProcessStartInfo("cmd.exe", $"/c start {url}") - { - CreateNoWindow = true, - }); - } + CreateNoWindow = true, + }); + } - public static void OpenFolder(AbsolutePath path) + public static void OpenFolder(AbsolutePath path) + { + Process.Start(new ProcessStartInfo(KnownFolders.Windows.Combine("explorer.exe").ToString(), path.ToString()) { - Process.Start(new ProcessStartInfo(KnownFolders.Windows.Combine("explorer.exe").ToString(), path.ToString()) - { - CreateNoWindow = true, - }); - } + CreateNoWindow = true, + }); + } - public static AbsolutePath OpenFileDialog(string filter, string initialDirectory = null) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = filter; - ofd.InitialDirectory = initialDirectory; - if (ofd.ShowDialog() == DialogResult.OK) - return (AbsolutePath)ofd.FileName; - return default; - } + public static AbsolutePath OpenFileDialog(string filter, string initialDirectory = null) + { + OpenFileDialog ofd = new OpenFileDialog(); + ofd.Filter = filter; + ofd.InitialDirectory = initialDirectory; + if (ofd.ShowDialog() == DialogResult.OK) + return (AbsolutePath)ofd.FileName; + return default; + } - public static IObservable DownloadBitmapImage(this IObservable obs, Action exceptionHandler, - LoadingLock loadingLock) - { - return obs - .ObserveOn(RxApp.TaskpoolScheduler) - .SelectTask(async url => + public static IObservable DownloadBitmapImage(this IObservable obs, Action exceptionHandler, + LoadingLock loadingLock, HttpClient client) + { + return obs + .ObserveOn(RxApp.TaskpoolScheduler) + .SelectTask(async url => + { + var ll = loadingLock.WithLoading(); + try { - var ll = loadingLock.WithLoading(); - try - { - var (found, mstream) = await FindCachedImage(url); - if (found) return (ll, mstream, url); - - var ret = new MemoryStream(); - using (var client = new HttpClient()) - await using (var stream = await client.GetStreamAsync(url)) - { - await stream.CopyToAsync(ret); - } + var (found, mStream) = await FindCachedImage(url); + if (found) return (ll, mStream); - ret.Seek(0, SeekOrigin.Begin); + await using var stream = await client.GetStreamAsync(url); - await WriteCachedImage(url, ret.ToArray()); - return (ll, ret, url); - } - catch (Exception ex) + var pngStream = new MemoryStream(); + using (SharpImage img = await SharpImage.LoadAsync(stream)) { - exceptionHandler(ex); - return (ll, default, url); + await img.SaveAsPngAsync(pngStream); } - }) - .Select(x => + + await WriteCachedImage(url, pngStream); + + return (ll, pngStream); + } + catch (Exception ex) { - var (ll, memStream, url) = x; - if (memStream == null) return default; - try - { - // System.Windows.Media.Imaging does not include WebP support by default, it falls back onto Windows Imaging Components (WIC) if it's a format that's not supported. - // Only the latest Windows versions seem to include a new version of WIC that has WebP support, so fallback on libwebp to support all Windows installations - // Also the Nexus image CDN has files ending with PNG/JPEG but they're actually encoded as WebP, so use this method for Nexus aswell - bool isWebp = url.EndsWith("webp", StringComparison.InvariantCultureIgnoreCase) || url.StartsWith("https://staticdelivery.nexusmods.com"); - if (isWebp) return BitmapImageFromWebp(memStream); + exceptionHandler(ex); + return (ll, default); + } + }) + .Select(x => + { + var (ll, memStream) = x; + if (memStream == null) return default; + try + { + return BitmapImageFromStream(memStream); + } + catch (Exception ex) + { + exceptionHandler(ex); + return default; + } + finally + { + ll.Dispose(); + memStream.Dispose(); + } + }) + .ObserveOnGuiThread(); + } - return BitmapImageFromStream(memStream); - } - catch (Exception ex) - { - exceptionHandler(ex); - return default; - } - finally - { - ll.Dispose(); - memStream.Dispose(); - } - }) - .ObserveOnGuiThread(); - } + private static async Task WriteCachedImage(string url, MemoryStream ms) + { + var folder = KnownFolders.WabbajackAppLocal.Combine("ModListImages"); + if (!folder.DirectoryExists()) folder.CreateDirectory(); - private static async Task WriteCachedImage(string url, byte[] data) - { - var folder = KnownFolders.WabbajackAppLocal.Combine("ModListImages"); - if (!folder.DirectoryExists()) folder.CreateDirectory(); + var path = folder.Combine((await Encoding.UTF8.GetBytes(url).Hash()).ToHex()); - var path = folder.Combine((await Encoding.UTF8.GetBytes(url).Hash()).ToHex()); - await path.WriteAllBytesAsync(data); + await using (var fs = new FileStream(path.ToString(), FileMode.Create, FileAccess.Write)) { + ms.WriteTo(fs); } + } - private static async Task<(bool Found, MemoryStream data)> FindCachedImage(string uri) + private static async Task<(bool, MemoryStream)> FindCachedImage(string uri) + { + var folder = KnownFolders.WabbajackAppLocal.Combine("ModListImages"); + if (!folder.DirectoryExists()) folder.CreateDirectory(); + + var path = folder.Combine((await Encoding.UTF8.GetBytes(uri).Hash()).ToHex()); + if(!path.FileExists()) return (false, default); + + var ms = new MemoryStream(); + await using (FileStream fs = new FileStream(path.ToString(), FileMode.Open, FileAccess.Read)) { - var folder = KnownFolders.WabbajackAppLocal.Combine("ModListImages"); - if (!folder.DirectoryExists()) folder.CreateDirectory(); - - var path = folder.Combine((await Encoding.UTF8.GetBytes(uri).Hash()).ToHex()); - return path.FileExists() ? (true, new MemoryStream(await path.ReadAllBytesAsync())) : (false, default); + await fs.CopyToAsync(ms); } + return (true, ms); + } - /// - /// Format bytes to a greater unit - /// - /// number of bytes - /// - public static string FormatBytes(long bytes) + /// + /// Format bytes to a greater unit + /// + /// number of bytes + /// + public static string FormatBytes(long bytes) + { + string[] Suffix = { "B", "KB", "MB", "GB", "TB" }; + int i; + double dblSByte = bytes; + for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024) { - string[] Suffix = { "B", "KB", "MB", "GB", "TB" }; - int i; - double dblSByte = bytes; - for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024) - { - dblSByte = bytes / 1024.0; - } - - return String.Format("{0:0.##} {1}", dblSByte, Suffix[i]); + dblSByte = bytes / 1024.0; } - public static void OpenFile(AbsolutePath file) + return String.Format("{0:0.##} {1}", dblSByte, Suffix[i]); + } + + public static void OpenFile(AbsolutePath file) + { + Process.Start(new ProcessStartInfo("cmd.exe", $"/c start \"\" \"{file}\"") { - Process.Start(new ProcessStartInfo("cmd.exe", $"/c start \"\" \"{file}\"") - { - CreateNoWindow = true, - }); - } + CreateNoWindow = true, + }); + } + + public static string GetSmallImageUri(ModlistMetadata metadata) + { + var fileName = metadata.Links.MachineURL + "_small.webp"; + return $"https://raw.githubusercontent.com/wabbajack-tools/mod-lists/refs/heads/master/reports/{metadata.RepositoryName}/{fileName}"; } -} +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Util/WebPWrapper.cs b/Wabbajack.App.Wpf/Util/WebPWrapper.cs deleted file mode 100644 index de07bff88..000000000 --- a/Wabbajack.App.Wpf/Util/WebPWrapper.cs +++ /dev/null @@ -1,1976 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -/// Wrapper for WebP format in C#. (MIT) Jose M. Piñeiro -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -/// Decode Functions: -/// Bitmap Load(string pathFileName) - Load a WebP file in bitmap. -/// Bitmap Decode(byte[] rawWebP) - Decode WebP data (rawWebP) to bitmap. -/// Bitmap Decode(byte[] rawWebP, WebPDecoderOptions options) - Decode WebP data (rawWebP) to bitmap using 'options'. -/// Bitmap GetThumbnailFast(byte[] rawWebP, int width, int height) - Get a thumbnail from WebP data (rawWebP) with dimensions 'width x height'. Fast mode. -/// Bitmap GetThumbnailQuality(byte[] rawWebP, int width, int height) - Fast get a thumbnail from WebP data (rawWebP) with dimensions 'width x height'. Quality mode. -/// -/// Encode Functions: -/// Save(Bitmap bmp, string pathFileName, int quality) - Save bitmap with quality lost to WebP file. Opcionally select 'quality'. -/// byte[] EncodeLossy(Bitmap bmp, int quality) - Encode bitmap with quality lost to WebP byte array. Opcionally select 'quality'. -/// byte[] EncodeLossy(Bitmap bmp, int quality, int speed, bool info) - Encode bitmap with quality lost to WebP byte array. Select 'quality', 'speed' and optionally select 'info'. -/// byte[] EncodeLossless(Bitmap bmp) - Encode bitmap without quality lost to WebP byte array. -/// byte[] EncodeLossless(Bitmap bmp, int speed, bool info = false) - Encode bitmap without quality lost to WebP byte array. Select 'speed'. -/// byte[] EncodeNearLossless(Bitmap bmp, int quality, int speed = 9, bool info = false) - Encode bitmap with a near lossless method to WebP byte array. Select 'quality', 'speed' and optionally select 'info'. -/// -/// Another functions: -/// string GetVersion() - Get the library version -/// GetInfo(byte[] rawWebP, out int width, out int height, out bool has_alpha, out bool has_animation, out string format) - Get information of WEBP data -/// float[] PictureDistortion(Bitmap source, Bitmap reference, int metric_type) - Get PSNR, SSIM or LSIM distortion metric between two pictures -///////////////////////////////////////////////////////////////////////////////////////////////////////////// - -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Runtime.InteropServices; -using System.Security; -using System.Windows.Forms; - -namespace Wabbajack; - -public sealed class WebP : IDisposable -{ - private const int WEBP_MAX_DIMENSION = 16383; - #region | Public Decode Functions | - /// Read a WebP file - /// WebP file to load - /// Bitmap with the WebP image - public Bitmap Load(string pathFileName) - { - try - { - byte[] rawWebP = File.ReadAllBytes(pathFileName); - - return Decode(rawWebP); - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.Load"); } - } - - /// Decode a WebP image - /// The data to uncompress - /// Bitmap with the WebP image - public Bitmap Decode(byte[] rawWebP) - { - Bitmap bmp = null; - BitmapData bmpData = null; - GCHandle pinnedWebP = GCHandle.Alloc(rawWebP, GCHandleType.Pinned); - - try - { - //Get image width and height - GetInfo(rawWebP, out int imgWidth, out int imgHeight, out bool hasAlpha, out bool hasAnimation, out string format); - - //Create a BitmapData and Lock all pixels to be written - if (hasAlpha) - bmp = new Bitmap(imgWidth, imgHeight, PixelFormat.Format32bppArgb); - else - bmp = new Bitmap(imgWidth, imgHeight, PixelFormat.Format24bppRgb); - bmpData = bmp.LockBits(new Rectangle(0, 0, imgWidth, imgHeight), ImageLockMode.WriteOnly, bmp.PixelFormat); - - //Uncompress the image - int outputSize = bmpData.Stride * imgHeight; - IntPtr ptrData = pinnedWebP.AddrOfPinnedObject(); - if (bmp.PixelFormat == PixelFormat.Format24bppRgb) - UnsafeNativeMethods.WebPDecodeBGRInto(ptrData, rawWebP.Length, bmpData.Scan0, outputSize, bmpData.Stride); - else - UnsafeNativeMethods.WebPDecodeBGRAInto(ptrData, rawWebP.Length, bmpData.Scan0, outputSize, bmpData.Stride); - - return bmp; - } - catch (Exception) { throw; } - finally - { - //Unlock the pixels - if (bmpData != null) - bmp.UnlockBits(bmpData); - - //Free memory - if (pinnedWebP.IsAllocated) - pinnedWebP.Free(); - } - } - - /// Decode a WebP image - /// the data to uncompress - /// Options for advanced decode - /// Bitmap with the WebP image - public Bitmap Decode(byte[] rawWebP, WebPDecoderOptions options, PixelFormat pixelFormat = PixelFormat.DontCare) - { - GCHandle pinnedWebP = GCHandle.Alloc(rawWebP, GCHandleType.Pinned); - Bitmap bmp = null; - BitmapData bmpData = null; - VP8StatusCode result; - try - { - WebPDecoderConfig config = new WebPDecoderConfig(); - if (UnsafeNativeMethods.WebPInitDecoderConfig(ref config) == 0) - { - throw new Exception("WebPInitDecoderConfig failed. Wrong version?"); - } - // Read the .webp input file information - IntPtr ptrRawWebP = pinnedWebP.AddrOfPinnedObject(); - int height; - int width; - if (options.use_scaling == 0) - { - result = UnsafeNativeMethods.WebPGetFeatures(ptrRawWebP, rawWebP.Length, ref config.input); - if (result != VP8StatusCode.VP8_STATUS_OK) - throw new Exception("Failed WebPGetFeatures with error " + result); - - //Test cropping values - if (options.use_cropping == 1) - { - if (options.crop_left + options.crop_width > config.input.Width || options.crop_top + options.crop_height > config.input.Height) - throw new Exception("Crop options exceeded WebP image dimensions"); - width = options.crop_width; - height = options.crop_height; - } - } - else - { - width = options.scaled_width; - height = options.scaled_height; - } - - config.options.bypass_filtering = options.bypass_filtering; - config.options.no_fancy_upsampling = options.no_fancy_upsampling; - config.options.use_cropping = options.use_cropping; - config.options.crop_left = options.crop_left; - config.options.crop_top = options.crop_top; - config.options.crop_width = options.crop_width; - config.options.crop_height = options.crop_height; - config.options.use_scaling = options.use_scaling; - config.options.scaled_width = options.scaled_width; - config.options.scaled_height = options.scaled_height; - config.options.use_threads = options.use_threads; - config.options.dithering_strength = options.dithering_strength; - config.options.flip = options.flip; - config.options.alpha_dithering_strength = options.alpha_dithering_strength; - - //Create a BitmapData and Lock all pixels to be written - if (config.input.Has_alpha == 1) - { - config.output.colorspace = WEBP_CSP_MODE.MODE_bgrA; - bmp = new Bitmap(config.input.Width, config.input.Height, PixelFormat.Format32bppArgb); - } - else - { - config.output.colorspace = WEBP_CSP_MODE.MODE_BGR; - bmp = new Bitmap(config.input.Width, config.input.Height, PixelFormat.Format24bppRgb); - } - bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat); - - // Specify the output format - config.output.u.RGBA.rgba = bmpData.Scan0; - config.output.u.RGBA.stride = bmpData.Stride; - config.output.u.RGBA.size = (UIntPtr)(bmp.Height * bmpData.Stride); - config.output.height = bmp.Height; - config.output.width = bmp.Width; - config.output.is_external_memory = 1; - - // Decode - result = UnsafeNativeMethods.WebPDecode(ptrRawWebP, rawWebP.Length, ref config); - if (result != VP8StatusCode.VP8_STATUS_OK) - { - throw new Exception("Failed WebPDecode with error " + result); - } - UnsafeNativeMethods.WebPFreeDecBuffer(ref config.output); - - return bmp; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.Decode"); } - finally - { - //Unlock the pixels - if (bmpData != null) - bmp.UnlockBits(bmpData); - - //Free memory - if (pinnedWebP.IsAllocated) - pinnedWebP.Free(); - } - } - - /// Get Thumbnail from webP in mode faster/low quality - /// The data to uncompress - /// Wanted width of thumbnail - /// Wanted height of thumbnail - /// Bitmap with the WebP thumbnail in 24bpp - public Bitmap GetThumbnailFast(byte[] rawWebP, int width, int height) - { - GCHandle pinnedWebP = GCHandle.Alloc(rawWebP, GCHandleType.Pinned); - Bitmap bmp = null; - BitmapData bmpData = null; - - try - { - WebPDecoderConfig config = new WebPDecoderConfig(); - if (UnsafeNativeMethods.WebPInitDecoderConfig(ref config) == 0) - throw new Exception("WebPInitDecoderConfig failed. Wrong version?"); - - // Set up decode options - config.options.bypass_filtering = 1; - config.options.no_fancy_upsampling = 1; - config.options.use_threads = 1; - config.options.use_scaling = 1; - config.options.scaled_width = width; - config.options.scaled_height = height; - - // Create a BitmapData and Lock all pixels to be written - bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); - bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, bmp.PixelFormat); - - // Specify the output format - config.output.colorspace = WEBP_CSP_MODE.MODE_BGR; - config.output.u.RGBA.rgba = bmpData.Scan0; - config.output.u.RGBA.stride = bmpData.Stride; - config.output.u.RGBA.size = (UIntPtr)(height * bmpData.Stride); - config.output.height = height; - config.output.width = width; - config.output.is_external_memory = 1; - - // Decode - IntPtr ptrRawWebP = pinnedWebP.AddrOfPinnedObject(); - VP8StatusCode result = UnsafeNativeMethods.WebPDecode(ptrRawWebP, rawWebP.Length, ref config); - if (result != VP8StatusCode.VP8_STATUS_OK) - throw new Exception("Failed WebPDecode with error " + result); - - UnsafeNativeMethods.WebPFreeDecBuffer(ref config.output); - - return bmp; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.Thumbnail"); } - finally - { - //Unlock the pixels - if (bmpData != null) - bmp.UnlockBits(bmpData); - - //Free memory - if (pinnedWebP.IsAllocated) - pinnedWebP.Free(); - } - } - - /// Thumbnail from webP in mode slow/high quality - /// The data to uncompress - /// Wanted width of thumbnail - /// Wanted height of thumbnail - /// Bitmap with the WebP thumbnail - public Bitmap GetThumbnailQuality(byte[] rawWebP, int width, int height) - { - GCHandle pinnedWebP = GCHandle.Alloc(rawWebP, GCHandleType.Pinned); - Bitmap bmp = null; - BitmapData bmpData = null; - - try - { - WebPDecoderConfig config = new WebPDecoderConfig(); - if (UnsafeNativeMethods.WebPInitDecoderConfig(ref config) == 0) - throw new Exception("WebPInitDecoderConfig failed. Wrong version?"); - - IntPtr ptrRawWebP = pinnedWebP.AddrOfPinnedObject(); - VP8StatusCode result = UnsafeNativeMethods.WebPGetFeatures(ptrRawWebP, rawWebP.Length, ref config.input); - if (result != VP8StatusCode.VP8_STATUS_OK) - throw new Exception("Failed WebPGetFeatures with error " + result); - - // Set up decode options - config.options.bypass_filtering = 0; - config.options.no_fancy_upsampling = 0; - config.options.use_threads = 1; - config.options.use_scaling = 1; - config.options.scaled_width = width; - config.options.scaled_height = height; - - //Create a BitmapData and Lock all pixels to be written - if (config.input.Has_alpha == 1) - { - config.output.colorspace = WEBP_CSP_MODE.MODE_bgrA; - bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb); - } - else - { - config.output.colorspace = WEBP_CSP_MODE.MODE_BGR; - bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); - } - bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, bmp.PixelFormat); - - // Specify the output format - config.output.u.RGBA.rgba = bmpData.Scan0; - config.output.u.RGBA.stride = bmpData.Stride; - config.output.u.RGBA.size = (UIntPtr)(height * bmpData.Stride); - config.output.height = height; - config.output.width = width; - config.output.is_external_memory = 1; - - // Decode - result = UnsafeNativeMethods.WebPDecode(ptrRawWebP, rawWebP.Length, ref config); - if (result != VP8StatusCode.VP8_STATUS_OK) - throw new Exception("Failed WebPDecode with error " + result); - - UnsafeNativeMethods.WebPFreeDecBuffer(ref config.output); - - return bmp; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.Thumbnail"); } - finally - { - //Unlock the pixels - if (bmpData != null) - bmp.UnlockBits(bmpData); - - //Free memory - if (pinnedWebP.IsAllocated) - pinnedWebP.Free(); - } - } - #endregion - - #region | Public Encode Functions | - /// Save bitmap to file in WebP format - /// Bitmap with the WebP image - /// The file to write - /// Between 0 (lower quality, lowest file size) and 100 (highest quality, higher file size) - public void Save(Bitmap bmp, string pathFileName, int quality = 75) - { - byte[] rawWebP; - - try - { - //Encode in webP format - rawWebP = EncodeLossy(bmp, quality); - - //Write webP file - File.WriteAllBytes(pathFileName, rawWebP); - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.Save"); } - } - - /// Lossy encoding bitmap to WebP (Simple encoding API) - /// Bitmap with the image - /// Between 0 (lower quality, lowest file size) and 100 (highest quality, higher file size) - /// Compressed data - public byte[] EncodeLossy(Bitmap bmp, int quality = 75) - { - //test bmp - if (bmp.Width == 0 || bmp.Height == 0) - throw new ArgumentException("Bitmap contains no data.", "bmp"); - if (bmp.Width > WEBP_MAX_DIMENSION || bmp.Height > WEBP_MAX_DIMENSION) - throw new NotSupportedException("Bitmap's dimension is too large. Max is " + WEBP_MAX_DIMENSION + "x" + WEBP_MAX_DIMENSION + " pixels."); - if (bmp.PixelFormat != PixelFormat.Format24bppRgb && bmp.PixelFormat != PixelFormat.Format32bppArgb) - throw new NotSupportedException("Only support Format24bppRgb and Format32bppArgb pixelFormat."); - - BitmapData bmpData = null; - IntPtr unmanagedData = IntPtr.Zero; - - try - { - int size; - - //Get bmp data - bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); - - //Compress the bmp data - if (bmp.PixelFormat == PixelFormat.Format24bppRgb) - size = UnsafeNativeMethods.WebPEncodeBGR(bmpData.Scan0, bmp.Width, bmp.Height, bmpData.Stride, quality, out unmanagedData); - else - size = UnsafeNativeMethods.WebPEncodeBGRA(bmpData.Scan0, bmp.Width, bmp.Height, bmpData.Stride, quality, out unmanagedData); - if (size == 0) - throw new Exception("Can´t encode WebP"); - - //Copy image compress data to output array - byte[] rawWebP = new byte[size]; - Marshal.Copy(unmanagedData, rawWebP, 0, size); - - return rawWebP; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.EncodeLossly"); } - finally - { - //Unlock the pixels - if (bmpData != null) - bmp.UnlockBits(bmpData); - - //Free memory - if (unmanagedData != IntPtr.Zero) - UnsafeNativeMethods.WebPFree(unmanagedData); - } - } - - /// Lossy encoding bitmap to WebP (Advanced encoding API) - /// Bitmap with the image - /// Between 0 (lower quality, lowest file size) and 100 (highest quality, higher file size) - /// Between 0 (fastest, lowest compression) and 9 (slower, best compression) - /// Compressed data - public byte[] EncodeLossy(Bitmap bmp, int quality, int speed, bool info = false) - { - //Initialize configuration structure - WebPConfig config = new WebPConfig(); - - //Set compression parameters - if (UnsafeNativeMethods.WebPConfigInit(ref config, WebPPreset.WEBP_PRESET_DEFAULT, 75) == 0) - throw new Exception("Can´t configure preset"); - - // Add additional tuning: - config.method = speed; - if (config.method > 6) - config.method = 6; - config.quality = quality; - config.autofilter = 1; - config.pass = speed + 1; - config.segments = 4; - config.partitions = 3; - config.thread_level = 1; - config.alpha_quality = quality; - config.alpha_filtering = 2; - config.use_sharp_yuv = 1; - - if (UnsafeNativeMethods.WebPGetDecoderVersion() > 1082) //Old version does not support preprocessing 4 - { - config.preprocessing = 4; - config.use_sharp_yuv = 1; - } - else - config.preprocessing = 3; - - return AdvancedEncode(bmp, config, info); - } - - /// Lossless encoding bitmap to WebP (Simple encoding API) - /// Bitmap with the image - /// Compressed data - public byte[] EncodeLossless(Bitmap bmp) - { - //test bmp - if (bmp.Width == 0 || bmp.Height == 0) - throw new ArgumentException("Bitmap contains no data.", "bmp"); - if (bmp.Width > WEBP_MAX_DIMENSION || bmp.Height > WEBP_MAX_DIMENSION) - throw new NotSupportedException("Bitmap's dimension is too large. Max is " + WEBP_MAX_DIMENSION + "x" + WEBP_MAX_DIMENSION + " pixels."); - if (bmp.PixelFormat != PixelFormat.Format24bppRgb && bmp.PixelFormat != PixelFormat.Format32bppArgb) - throw new NotSupportedException("Only support Format24bppRgb and Format32bppArgb pixelFormat."); - - BitmapData bmpData = null; - IntPtr unmanagedData = IntPtr.Zero; - try - { - //Get bmp data - bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); - - //Compress the bmp data - int size; - if (bmp.PixelFormat == PixelFormat.Format24bppRgb) - size = UnsafeNativeMethods.WebPEncodeLosslessBGR(bmpData.Scan0, bmp.Width, bmp.Height, bmpData.Stride, out unmanagedData); - else - size = UnsafeNativeMethods.WebPEncodeLosslessBGRA(bmpData.Scan0, bmp.Width, bmp.Height, bmpData.Stride, out unmanagedData); - - //Copy image compress data to output array - byte[] rawWebP = new byte[size]; - Marshal.Copy(unmanagedData, rawWebP, 0, size); - - return rawWebP; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.EncodeLossless (Simple)"); } - finally - { - //Unlock the pixels - if (bmpData != null) - bmp.UnlockBits(bmpData); - - //Free memory - if (unmanagedData != IntPtr.Zero) - UnsafeNativeMethods.WebPFree(unmanagedData); - } - } - - /// Lossless encoding image in bitmap (Advanced encoding API) - /// Bitmap with the image - /// Between 0 (fastest, lowest compression) and 9 (slower, best compression) - /// Compressed data - public byte[] EncodeLossless(Bitmap bmp, int speed) - { - //Initialize configuration structure - WebPConfig config = new WebPConfig(); - - //Set compression parameters - if (UnsafeNativeMethods.WebPConfigInit(ref config, WebPPreset.WEBP_PRESET_DEFAULT, (speed + 1) * 10) == 0) - throw new Exception("Can´t config preset"); - - //Old version of DLL does not support info and WebPConfigLosslessPreset - if (UnsafeNativeMethods.WebPGetDecoderVersion() > 1082) - { - if (UnsafeNativeMethods.WebPConfigLosslessPreset(ref config, speed) == 0) - throw new Exception("Can´t configure lossless preset"); - } - else - { - config.lossless = 1; - config.method = speed; - if (config.method > 6) - config.method = 6; - config.quality = (speed + 1) * 10; - } - config.pass = speed + 1; - config.thread_level = 1; - config.alpha_filtering = 2; - config.use_sharp_yuv = 1; - config.exact = 0; - - return AdvancedEncode(bmp, config, false); - } - - /// Near lossless encoding image in bitmap - /// Bitmap with the image - /// Between 0 (lower quality, lowest file size) and 100 (highest quality, higher file size) - /// Between 0 (fastest, lowest compression) and 9 (slower, best compression) - /// Compress data - public byte[] EncodeNearLossless(Bitmap bmp, int quality, int speed = 9) - { - //test DLL version - if (UnsafeNativeMethods.WebPGetDecoderVersion() <= 1082) - throw new Exception("This DLL version not support EncodeNearLossless"); - - //Inicialize config struct - WebPConfig config = new WebPConfig(); - - //Set compression parameters - if (UnsafeNativeMethods.WebPConfigInit(ref config, WebPPreset.WEBP_PRESET_DEFAULT, (speed + 1) * 10) == 0) - throw new Exception("Can´t configure preset"); - if (UnsafeNativeMethods.WebPConfigLosslessPreset(ref config, speed) == 0) - throw new Exception("Can´t configure lossless preset"); - config.pass = speed + 1; - config.near_lossless = quality; - config.thread_level = 1; - config.alpha_filtering = 2; - config.use_sharp_yuv = 1; - config.exact = 0; - - return AdvancedEncode(bmp, config, false); - } - #endregion - - #region | Another Public Functions | - /// Get the libwebp version - /// Version of library - public string GetVersion() - { - try - { - uint v = (uint)UnsafeNativeMethods.WebPGetDecoderVersion(); - var revision = v % 256; - var minor = (v >> 8) % 256; - var major = (v >> 16) % 256; - return major + "." + minor + "." + revision; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.GetVersion"); } - } - - /// Get info of WEBP data - /// The data of WebP - /// width of image - /// height of image - /// Image has alpha channel - /// Image is a animation - /// Format of image: 0 = undefined (/mixed), 1 = lossy, 2 = lossless - public void GetInfo(byte[] rawWebP, out int width, out int height, out bool has_alpha, out bool has_animation, out string format) - { - VP8StatusCode result; - GCHandle pinnedWebP = GCHandle.Alloc(rawWebP, GCHandleType.Pinned); - - try - { - IntPtr ptrRawWebP = pinnedWebP.AddrOfPinnedObject(); - - WebPBitstreamFeatures features = new WebPBitstreamFeatures(); - result = UnsafeNativeMethods.WebPGetFeatures(ptrRawWebP, rawWebP.Length, ref features); - - if (result != 0) - throw new Exception(result.ToString()); - - width = features.Width; - height = features.Height; - if (features.Has_alpha == 1) has_alpha = true; else has_alpha = false; - if (features.Has_animation == 1) has_animation = true; else has_animation = false; - switch (features.Format) - { - case 1: - format = "lossy"; - break; - case 2: - format = "lossless"; - break; - default: - format = "undefined"; - break; - } - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.GetInfo"); } - finally - { - //Free memory - if (pinnedWebP.IsAllocated) - pinnedWebP.Free(); - } - } - - /// Compute PSNR, SSIM or LSIM distortion metric between two pictures. Warning: this function is rather CPU-intensive - /// Picture to measure - /// Reference picture - /// 0 = PSNR, 1 = SSIM, 2 = LSIM - /// dB in the Y/U/V/Alpha/All order - public float[] GetPictureDistortion(Bitmap source, Bitmap reference, int metric_type) - { - WebPPicture wpicSource = new WebPPicture(); - WebPPicture wpicReference = new WebPPicture(); - BitmapData sourceBmpData = null; - BitmapData referenceBmpData = null; - float[] result = new float[5]; - GCHandle pinnedResult = GCHandle.Alloc(result, GCHandleType.Pinned); - - try - { - if (source == null) - throw new Exception("Source picture is void"); - if (reference == null) - throw new Exception("Reference picture is void"); - if (metric_type > 2) - throw new Exception("Bad metric_type. Use 0 = PSNR, 1 = SSIM, 2 = LSIM"); - if (source.Width != reference.Width || source.Height != reference.Height) - throw new Exception("Source and Reference pictures have different dimensions"); - - // Setup the source picture data, allocating the bitmap, width and height - sourceBmpData = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, source.PixelFormat); - wpicSource = new WebPPicture(); - if (UnsafeNativeMethods.WebPPictureInitInternal(ref wpicSource) != 1) - throw new Exception("Can´t initialize WebPPictureInit"); - wpicSource.width = (int)source.Width; - wpicSource.height = (int)source.Height; - - //Put the source bitmap componets in wpic - if (sourceBmpData.PixelFormat == PixelFormat.Format32bppArgb) - { - wpicSource.use_argb = 1; - if (UnsafeNativeMethods.WebPPictureImportBGRA(ref wpicSource, sourceBmpData.Scan0, sourceBmpData.Stride) != 1) - throw new Exception("Can´t allocate memory in WebPPictureImportBGR"); - } - else - { - wpicSource.use_argb = 0; - if (UnsafeNativeMethods.WebPPictureImportBGR(ref wpicSource, sourceBmpData.Scan0, sourceBmpData.Stride) != 1) - throw new Exception("Can´t allocate memory in WebPPictureImportBGR"); - } - - // Setup the reference picture data, allocating the bitmap, width and height - referenceBmpData = reference.LockBits(new Rectangle(0, 0, reference.Width, reference.Height), ImageLockMode.ReadOnly, reference.PixelFormat); - wpicReference = new WebPPicture(); - if (UnsafeNativeMethods.WebPPictureInitInternal(ref wpicReference) != 1) - throw new Exception("Can´t initialize WebPPictureInit"); - wpicReference.width = (int)reference.Width; - wpicReference.height = (int)reference.Height; - wpicReference.use_argb = 1; - - //Put the source bitmap contents in WebPPicture instance - if (sourceBmpData.PixelFormat == PixelFormat.Format32bppArgb) - { - wpicSource.use_argb = 1; - if (UnsafeNativeMethods.WebPPictureImportBGRA(ref wpicReference, referenceBmpData.Scan0, referenceBmpData.Stride) != 1) - throw new Exception("Can´t allocate memory in WebPPictureImportBGR"); - } - else - { - wpicSource.use_argb = 0; - if (UnsafeNativeMethods.WebPPictureImportBGR(ref wpicReference, referenceBmpData.Scan0, referenceBmpData.Stride) != 1) - throw new Exception("Can´t allocate memory in WebPPictureImportBGR"); - } - - //Measure - IntPtr ptrResult = pinnedResult.AddrOfPinnedObject(); - if (UnsafeNativeMethods.WebPPictureDistortion(ref wpicSource, ref wpicReference, metric_type, ptrResult) != 1) - throw new Exception("Can´t measure."); - return result; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.GetPictureDistortion"); } - finally - { - //Unlock the pixels - if (sourceBmpData != null) - source.UnlockBits(sourceBmpData); - if (referenceBmpData != null) - reference.UnlockBits(referenceBmpData); - - //Free memory - if (wpicSource.argb != IntPtr.Zero) - UnsafeNativeMethods.WebPPictureFree(ref wpicSource); - if (wpicReference.argb != IntPtr.Zero) - UnsafeNativeMethods.WebPPictureFree(ref wpicReference); - //Free memory - if (pinnedResult.IsAllocated) - pinnedResult.Free(); - } - } - #endregion - - #region | Private Methods | - /// Encoding image using Advanced encoding API - /// Bitmap with the image - /// Configuration for encode - /// True if need encode info. - /// Compressed data - private byte[] AdvancedEncode(Bitmap bmp, WebPConfig config, bool info) - { - byte[] rawWebP = null; - byte[] dataWebp = null; - WebPPicture wpic = new WebPPicture(); - BitmapData bmpData = null; - WebPAuxStats stats = new WebPAuxStats(); - IntPtr ptrStats = IntPtr.Zero; - GCHandle pinnedArrayHandle = new GCHandle(); - int dataWebpSize; - try - { - //Validate the configuration - if (UnsafeNativeMethods.WebPValidateConfig(ref config) != 1) - throw new Exception("Bad configuration parameters"); - - //test bmp - if (bmp.Width == 0 || bmp.Height == 0) - throw new ArgumentException("Bitmap contains no data.", "bmp"); - if (bmp.Width > WEBP_MAX_DIMENSION || bmp.Height > WEBP_MAX_DIMENSION) - throw new NotSupportedException("Bitmap's dimension is too large. Max is " + WEBP_MAX_DIMENSION + "x" + WEBP_MAX_DIMENSION + " pixels."); - if (bmp.PixelFormat != PixelFormat.Format24bppRgb && bmp.PixelFormat != PixelFormat.Format32bppArgb) - throw new NotSupportedException("Only support Format24bppRgb and Format32bppArgb pixelFormat."); - - // Setup the input data, allocating a the bitmap, width and height - bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); - if (UnsafeNativeMethods.WebPPictureInitInternal(ref wpic) != 1) - throw new Exception("Can´t initialize WebPPictureInit"); - wpic.width = (int)bmp.Width; - wpic.height = (int)bmp.Height; - wpic.use_argb = 1; - - if (bmp.PixelFormat == PixelFormat.Format32bppArgb) - { - //Put the bitmap componets in wpic - int result = UnsafeNativeMethods.WebPPictureImportBGRA(ref wpic, bmpData.Scan0, bmpData.Stride); - if (result != 1) - throw new Exception("Can´t allocate memory in WebPPictureImportBGRA"); - wpic.colorspace = (uint)WEBP_CSP_MODE.MODE_bgrA; - dataWebpSize = bmp.Width * bmp.Height * 32; - dataWebp = new byte[bmp.Width * bmp.Height * 32]; //Memory for WebP output - } - else - { - //Put the bitmap contents in WebPPicture instance - int result = UnsafeNativeMethods.WebPPictureImportBGR(ref wpic, bmpData.Scan0, bmpData.Stride); - if (result != 1) - throw new Exception("Can´t allocate memory in WebPPictureImportBGR"); - dataWebpSize = bmp.Width * bmp.Height * 24; - - } - - //Set up statistics of compression - if (info) - { - stats = new WebPAuxStats(); - ptrStats = Marshal.AllocHGlobal(Marshal.SizeOf(stats)); - Marshal.StructureToPtr(stats, ptrStats, false); - wpic.stats = ptrStats; - } - - //Memory for WebP output - if (dataWebpSize > 2147483591) - dataWebpSize = 2147483591; - dataWebp = new byte[bmp.Width * bmp.Height * 32]; - pinnedArrayHandle = GCHandle.Alloc(dataWebp, GCHandleType.Pinned); - IntPtr initPtr = pinnedArrayHandle.AddrOfPinnedObject(); - wpic.custom_ptr = initPtr; - - //Set up a byte-writing method (write-to-memory, in this case) - UnsafeNativeMethods.OnCallback = new UnsafeNativeMethods.WebPMemoryWrite(MyWriter); - wpic.writer = Marshal.GetFunctionPointerForDelegate(UnsafeNativeMethods.OnCallback); - - //compress the input samples - if (UnsafeNativeMethods.WebPEncode(ref config, ref wpic) != 1) - throw new Exception("Encoding error: " + ((WebPEncodingError)wpic.error_code).ToString()); - - //Remove OnCallback - UnsafeNativeMethods.OnCallback = null; - - //Unlock the pixels - bmp.UnlockBits(bmpData); - bmpData = null; - - //Copy webpData to rawWebP - int size = (int)((long)wpic.custom_ptr - (long)initPtr); - rawWebP = new byte[size]; - Array.Copy(dataWebp, rawWebP, size); - - //Remove compression data - pinnedArrayHandle.Free(); - dataWebp = null; - - //Show statistics - if (info) - { - stats = (WebPAuxStats)Marshal.PtrToStructure(ptrStats, typeof(WebPAuxStats)); - MessageBox.Show("Dimension: " + wpic.width + " x " + wpic.height + " pixels\n" + - "Output: " + stats.coded_size + " bytes\n" + - "PSNR Y: " + stats.PSNRY + " db\n" + - "PSNR u: " + stats.PSNRU + " db\n" + - "PSNR v: " + stats.PSNRV + " db\n" + - "PSNR ALL: " + stats.PSNRALL + " db\n" + - "Block intra4: " + stats.block_count_intra4 + "\n" + - "Block intra16: " + stats.block_count_intra16 + "\n" + - "Block skipped: " + stats.block_count_skipped + "\n" + - "Header size: " + stats.header_bytes + " bytes\n" + - "Mode-partition: " + stats.mode_partition_0 + " bytes\n" + - "Macro-blocks 0: " + stats.segment_size_segments0 + " residuals bytes\n" + - "Macro-blocks 1: " + stats.segment_size_segments1 + " residuals bytes\n" + - "Macro-blocks 2: " + stats.segment_size_segments2 + " residuals bytes\n" + - "Macro-blocks 3: " + stats.segment_size_segments3 + " residuals bytes\n" + - "Quantizer 0: " + stats.segment_quant_segments0 + " residuals bytes\n" + - "Quantizer 1: " + stats.segment_quant_segments1 + " residuals bytes\n" + - "Quantizer 2: " + stats.segment_quant_segments2 + " residuals bytes\n" + - "Quantizer 3: " + stats.segment_quant_segments3 + " residuals bytes\n" + - "Filter level 0: " + stats.segment_level_segments0 + " residuals bytes\n" + - "Filter level 1: " + stats.segment_level_segments1 + " residuals bytes\n" + - "Filter level 2: " + stats.segment_level_segments2 + " residuals bytes\n" + - "Filter level 3: " + stats.segment_level_segments3 + " residuals bytes\n", "Compression statistics"); - } - - return rawWebP; - } - catch (Exception ex) { throw new Exception(ex.Message + "\r\nIn WebP.AdvancedEncode"); } - finally - { - //Free temporal compress memory - if (pinnedArrayHandle.IsAllocated) - { - pinnedArrayHandle.Free(); - } - - //Free statistics memory - if (ptrStats != IntPtr.Zero) - { - Marshal.FreeHGlobal(ptrStats); - } - - //Unlock the pixels - if (bmpData != null) - { - bmp.UnlockBits(bmpData); - } - - //Free memory - if (wpic.argb != IntPtr.Zero) - { - UnsafeNativeMethods.WebPPictureFree(ref wpic); - } - } - } - - private int MyWriter([InAttribute()] IntPtr data, UIntPtr data_size, ref WebPPicture picture) - { - UnsafeNativeMethods.CopyMemory(picture.custom_ptr, data, (uint)data_size); - //picture.custom_ptr = IntPtr.Add(picture.custom_ptr, (int)data_size); //Only in .NET > 4.0 - picture.custom_ptr = new IntPtr(picture.custom_ptr.ToInt64() + (int)data_size); - return 1; - } - - private delegate int MyWriterDelegate([InAttribute()] IntPtr data, UIntPtr data_size, ref WebPPicture picture); - #endregion - - #region | Destruction | - /// Free memory - public void Dispose() - { - GC.SuppressFinalize(this); - } - #endregion -} - -#region | Import libwebp functions | -[SuppressUnmanagedCodeSecurityAttribute] -internal sealed partial class UnsafeNativeMethods -{ - - [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] - internal static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); - - private static readonly int WEBP_DECODER_ABI_VERSION = 0x0208; - - /// This function will initialize the configuration according to a predefined set of parameters (referred to by 'preset') and a given quality factor - /// The WebPConfig structure - /// Type of image - /// Quality of compression - /// 0 if error - internal static int WebPConfigInit(ref WebPConfig config, WebPPreset preset, float quality) - { - switch (IntPtr.Size) - { - case 4: - return WebPConfigInitInternal_x86(ref config, preset, quality, WEBP_DECODER_ABI_VERSION); - case 8: - return WebPConfigInitInternal_x64(ref config, preset, quality, WEBP_DECODER_ABI_VERSION); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigInitInternal")] - private static extern int WebPConfigInitInternal_x86(ref WebPConfig config, WebPPreset preset, float quality, int WEBP_DECODER_ABI_VERSION); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigInitInternal")] - private static extern int WebPConfigInitInternal_x64(ref WebPConfig config, WebPPreset preset, float quality, int WEBP_DECODER_ABI_VERSION); - - /// Get info of WepP image - /// Bytes[] of WebP image - /// Size of rawWebP - /// Features of WebP image - /// VP8StatusCode - internal static VP8StatusCode WebPGetFeatures(IntPtr rawWebP, int data_size, ref WebPBitstreamFeatures features) - { - switch (IntPtr.Size) - { - case 4: - return WebPGetFeaturesInternal_x86(rawWebP, (UIntPtr)data_size, ref features, WEBP_DECODER_ABI_VERSION); - case 8: - return WebPGetFeaturesInternal_x64(rawWebP, (UIntPtr)data_size, ref features, WEBP_DECODER_ABI_VERSION); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetFeaturesInternal")] - private static extern VP8StatusCode WebPGetFeaturesInternal_x86([InAttribute()] IntPtr rawWebP, UIntPtr data_size, ref WebPBitstreamFeatures features, int WEBP_DECODER_ABI_VERSION); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetFeaturesInternal")] - private static extern VP8StatusCode WebPGetFeaturesInternal_x64([InAttribute()] IntPtr rawWebP, UIntPtr data_size, ref WebPBitstreamFeatures features, int WEBP_DECODER_ABI_VERSION); - - /// Activate the lossless compression mode with the desired efficiency - /// The WebPConfig struct - /// between 0 (fastest, lowest compression) and 9 (slower, best compression) - /// 0 in case of parameter error - internal static int WebPConfigLosslessPreset(ref WebPConfig config, int level) - { - switch (IntPtr.Size) - { - case 4: - return WebPConfigLosslessPreset_x86(ref config, level); - case 8: - return WebPConfigLosslessPreset_x64(ref config, level); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigLosslessPreset")] - private static extern int WebPConfigLosslessPreset_x86(ref WebPConfig config, int level); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPConfigLosslessPreset")] - private static extern int WebPConfigLosslessPreset_x64(ref WebPConfig config, int level); - - /// Check that configuration is non-NULL and all configuration parameters are within their valid ranges - /// The WebPConfig structure - /// 1 if configuration is OK - internal static int WebPValidateConfig(ref WebPConfig config) - { - switch (IntPtr.Size) - { - case 4: - return WebPValidateConfig_x86(ref config); - case 8: - return WebPValidateConfig_x64(ref config); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPValidateConfig")] - private static extern int WebPValidateConfig_x86(ref WebPConfig config); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPValidateConfig")] - private static extern int WebPValidateConfig_x64(ref WebPConfig config); - - /// Initialize the WebPPicture structure checking the DLL version - /// The WebPPicture structure - /// 1 if not error - internal static int WebPPictureInitInternal(ref WebPPicture wpic) - { - switch (IntPtr.Size) - { - case 4: - return WebPPictureInitInternal_x86(ref wpic, WEBP_DECODER_ABI_VERSION); - case 8: - return WebPPictureInitInternal_x64(ref wpic, WEBP_DECODER_ABI_VERSION); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureInitInternal")] - private static extern int WebPPictureInitInternal_x86(ref WebPPicture wpic, int WEBP_DECODER_ABI_VERSION); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureInitInternal")] - private static extern int WebPPictureInitInternal_x64(ref WebPPicture wpic, int WEBP_DECODER_ABI_VERSION); - - /// Colorspace conversion function to import RGB samples - /// The WebPPicture structure - /// Point to BGR data - /// stride of BGR data - /// Returns 0 in case of memory error. - internal static int WebPPictureImportBGR(ref WebPPicture wpic, IntPtr bgr, int stride) - { - switch (IntPtr.Size) - { - case 4: - return WebPPictureImportBGR_x86(ref wpic, bgr, stride); - case 8: - return WebPPictureImportBGR_x64(ref wpic, bgr, stride); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGR")] - private static extern int WebPPictureImportBGR_x86(ref WebPPicture wpic, IntPtr bgr, int stride); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGR")] - private static extern int WebPPictureImportBGR_x64(ref WebPPicture wpic, IntPtr bgr, int stride); - - /// Color-space conversion function to import RGB samples - /// The WebPPicture structure - /// Point to BGRA data - /// stride of BGRA data - /// Returns 0 in case of memory error. - internal static int WebPPictureImportBGRA(ref WebPPicture wpic, IntPtr bgra, int stride) - { - switch (IntPtr.Size) - { - case 4: - return WebPPictureImportBGRA_x86(ref wpic, bgra, stride); - case 8: - return WebPPictureImportBGRA_x64(ref wpic, bgra, stride); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRA")] - private static extern int WebPPictureImportBGRA_x86(ref WebPPicture wpic, IntPtr bgra, int stride); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRA")] - private static extern int WebPPictureImportBGRA_x64(ref WebPPicture wpic, IntPtr bgra, int stride); - - /// Color-space conversion function to import RGB samples - /// The WebPPicture structure - /// Point to BGR data - /// stride of BGR data - /// Returns 0 in case of memory error. - internal static int WebPPictureImportBGRX(ref WebPPicture wpic, IntPtr bgr, int stride) - { - switch (IntPtr.Size) - { - case 4: - return WebPPictureImportBGRX_x86(ref wpic, bgr, stride); - case 8: - return WebPPictureImportBGRX_x64(ref wpic, bgr, stride); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRX")] - private static extern int WebPPictureImportBGRX_x86(ref WebPPicture wpic, IntPtr bgr, int stride); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureImportBGRX")] - private static extern int WebPPictureImportBGRX_x64(ref WebPPicture wpic, IntPtr bgr, int stride); - - /// The writer type for output compress data - /// Data returned - /// Size of data returned - /// Picture structure - /// - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - internal delegate int WebPMemoryWrite([In()] IntPtr data, UIntPtr data_size, ref WebPPicture wpic); - internal static WebPMemoryWrite OnCallback; - - /// Compress to WebP format - /// The configuration structure for compression parameters - /// 'picture' hold the source samples in both YUV(A) or ARGB input - /// Returns 0 in case of error, 1 otherwise. In case of error, picture->error_code is updated accordingly. - internal static int WebPEncode(ref WebPConfig config, ref WebPPicture picture) - { - switch (IntPtr.Size) - { - case 4: - return WebPEncode_x86(ref config, ref picture); - case 8: - return WebPEncode_x64(ref config, ref picture); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncode")] - private static extern int WebPEncode_x86(ref WebPConfig config, ref WebPPicture picture); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncode")] - private static extern int WebPEncode_x64(ref WebPConfig config, ref WebPPicture picture); - - /// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*() - /// Note that this function does _not_ free the memory used by the 'picture' object itself. - /// Besides memory (which is reclaimed) all other fields of 'picture' are preserved - /// Picture structure - internal static void WebPPictureFree(ref WebPPicture picture) - { - switch (IntPtr.Size) - { - case 4: - WebPPictureFree_x86(ref picture); - break; - case 8: - WebPPictureFree_x64(ref picture); - break; - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureFree")] - private static extern void WebPPictureFree_x86(ref WebPPicture wpic); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureFree")] - private static extern void WebPPictureFree_x64(ref WebPPicture wpic); - - /// Validate the WebP image header and retrieve the image height and width. Pointers *width and *height can be passed NULL if deemed irrelevant - /// Pointer to WebP image data - /// This is the size of the memory block pointed to by data containing the image data - /// The range is limited currently from 1 to 16383 - /// The range is limited currently from 1 to 16383 - /// 1 if success, otherwise error code returned in the case of (a) formatting error(s). - internal static int WebPGetInfo(IntPtr data, int data_size, out int width, out int height) - { - switch (IntPtr.Size) - { - case 4: - return WebPGetInfo_x86(data, (UIntPtr)data_size, out width, out height); - case 8: - return WebPGetInfo_x64(data, (UIntPtr)data_size, out width, out height); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] - private static extern int WebPGetInfo_x86([InAttribute()] IntPtr data, UIntPtr data_size, out int width, out int height); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetInfo")] - private static extern int WebPGetInfo_x64([InAttribute()] IntPtr data, UIntPtr data_size, out int width, out int height); - - /// Decode WEBP image pointed to by *data and returns BGR samples into a preallocated buffer - /// Pointer to WebP image data - /// This is the size of the memory block pointed to by data containing the image data - /// Pointer to decoded WebP image - /// Size of allocated buffer - /// Specifies the distance between scan lines - internal static void WebPDecodeBGRInto(IntPtr data, int data_size, IntPtr output_buffer, int output_buffer_size, int output_stride) - { - switch (IntPtr.Size) - { - case 4: - if (WebPDecodeBGRInto_x86(data, (UIntPtr)data_size, output_buffer, output_buffer_size, output_stride) == null) - throw new InvalidOperationException("Can not decode WebP"); - break; - case 8: - if (WebPDecodeBGRInto_x64(data, (UIntPtr)data_size, output_buffer, output_buffer_size, output_stride) == null) - throw new InvalidOperationException("Can not decode WebP"); - break; - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRInto")] - private static extern IntPtr WebPDecodeBGRInto_x86([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRInto")] - private static extern IntPtr WebPDecodeBGRInto_x64([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - - /// Decode WEBP image pointed to by *data and returns BGRA samples into a preallocated buffer - /// Pointer to WebP image data - /// This is the size of the memory block pointed to by data containing the image data - /// Pointer to decoded WebP image - /// Size of allocated buffer - /// Specifies the distance between scan lines - internal static void WebPDecodeBGRAInto(IntPtr data, int data_size, IntPtr output_buffer, int output_buffer_size, int output_stride) - { - switch (IntPtr.Size) - { - case 4: - if (WebPDecodeBGRAInto_x86(data, (UIntPtr)data_size, output_buffer, output_buffer_size, output_stride) == null) - throw new InvalidOperationException("Can not decode WebP"); - break; - case 8: - if (WebPDecodeBGRAInto_x64(data, (UIntPtr)data_size, output_buffer, output_buffer_size, output_stride) == null) - throw new InvalidOperationException("Can not decode WebP"); - break; - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] - private static extern IntPtr WebPDecodeBGRAInto_x86([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeBGRAInto")] - private static extern IntPtr WebPDecodeBGRAInto_x64([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - - /// Decode WEBP image pointed to by *data and returns ARGB samples into a preallocated buffer - /// Pointer to WebP image data - /// This is the size of the memory block pointed to by data containing the image data - /// Pointer to decoded WebP image - /// Size of allocated buffer - /// Specifies the distance between scan lines - internal static void WebPDecodeARGBInto(IntPtr data, int data_size, IntPtr output_buffer, int output_buffer_size, int output_stride) - { - switch (IntPtr.Size) - { - case 4: - if (WebPDecodeARGBInto_x86(data, (UIntPtr)data_size, output_buffer, output_buffer_size, output_stride) == null) - throw new InvalidOperationException("Can not decode WebP"); - break; - case 8: - if (WebPDecodeARGBInto_x64(data, (UIntPtr)data_size, output_buffer, output_buffer_size, output_stride) == null) - throw new InvalidOperationException("Can not decode WebP"); - break; - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeARGBInto")] - private static extern IntPtr WebPDecodeARGBInto_x86([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecodeARGBInto")] - private static extern IntPtr WebPDecodeARGBInto_x64([InAttribute()] IntPtr data, UIntPtr data_size, IntPtr output_buffer, int output_buffer_size, int output_stride); - - /// Initialize the configuration as empty. This function must always be called first, unless WebPGetFeatures() is to be called - /// Configuration structure - /// False in case of mismatched version. - internal static int WebPInitDecoderConfig(ref WebPDecoderConfig webPDecoderConfig) - { - switch (IntPtr.Size) - { - case 4: - return WebPInitDecoderConfigInternal_x86(ref webPDecoderConfig, WEBP_DECODER_ABI_VERSION); - case 8: - return WebPInitDecoderConfigInternal_x64(ref webPDecoderConfig, WEBP_DECODER_ABI_VERSION); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPInitDecoderConfigInternal")] - private static extern int WebPInitDecoderConfigInternal_x86(ref WebPDecoderConfig webPDecoderConfig, int WEBP_DECODER_ABI_VERSION); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPInitDecoderConfigInternal")] - private static extern int WebPInitDecoderConfigInternal_x64(ref WebPDecoderConfig webPDecoderConfig, int WEBP_DECODER_ABI_VERSION); - - /// Decodes the full data at once, taking configuration into account - /// WebP raw data to decode - /// Size of WebP data - /// Configuration structure - /// VP8_STATUS_OK if the decoding was successful - internal static VP8StatusCode WebPDecode(IntPtr data, int data_size, ref WebPDecoderConfig webPDecoderConfig) - { - switch (IntPtr.Size) - { - case 4: - return WebPDecode_x86(data, (UIntPtr)data_size, ref webPDecoderConfig); - case 8: - return WebPDecode_x64(data, (UIntPtr)data_size, ref webPDecoderConfig); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecode")] - private static extern VP8StatusCode WebPDecode_x86(IntPtr data, UIntPtr data_size, ref WebPDecoderConfig config); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPDecode")] - private static extern VP8StatusCode WebPDecode_x64(IntPtr data, UIntPtr data_size, ref WebPDecoderConfig config); - - /// Free any memory associated with the buffer. Must always be called last. Doesn't free the 'buffer' structure itself - /// WebPDecBuffer - internal static void WebPFreeDecBuffer(ref WebPDecBuffer buffer) - { - switch (IntPtr.Size) - { - case 4: - WebPFreeDecBuffer_x86(ref buffer); - break; - case 8: - WebPFreeDecBuffer_x64(ref buffer); - break; - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFreeDecBuffer")] - private static extern void WebPFreeDecBuffer_x86(ref WebPDecBuffer buffer); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFreeDecBuffer")] - private static extern void WebPFreeDecBuffer_x64(ref WebPDecBuffer buffer); - - /// Lossy encoding images - /// Pointer to BGR image data - /// The range is limited currently from 1 to 16383 - /// The range is limited currently from 1 to 16383 - /// Specifies the distance between scanlines - /// Ranges from 0 (lower quality) to 100 (highest quality). Controls the loss and quality during compression - /// output_buffer with WebP image - /// Size of WebP Image or 0 if an error occurred - internal static int WebPEncodeBGR(IntPtr bgr, int width, int height, int stride, float quality_factor, out IntPtr output) - { - switch (IntPtr.Size) - { - case 4: - return WebPEncodeBGR_x86(bgr, width, height, stride, quality_factor, out output); - case 8: - return WebPEncodeBGR_x64(bgr, width, height, stride, quality_factor, out output); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGR")] - private static extern int WebPEncodeBGR_x86([InAttribute()] IntPtr bgr, int width, int height, int stride, float quality_factor, out IntPtr output); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGR")] - private static extern int WebPEncodeBGR_x64([InAttribute()] IntPtr bgr, int width, int height, int stride, float quality_factor, out IntPtr output); - - /// Lossy encoding images - /// Pointer to BGRA image data - /// The range is limited currently from 1 to 16383 - /// The range is limited currently from 1 to 16383 - /// Specifies the distance between scan lines - /// Ranges from 0 (lower quality) to 100 (highest quality). Controls the loss and quality during compression - /// output_buffer with WebP image - /// Size of WebP Image or 0 if an error occurred - internal static int WebPEncodeBGRA(IntPtr bgra, int width, int height, int stride, float quality_factor, out IntPtr output) - { - switch (IntPtr.Size) - { - case 4: - return WebPEncodeBGRA_x86(bgra, width, height, stride, quality_factor, out output); - case 8: - return WebPEncodeBGRA_x64(bgra, width, height, stride, quality_factor, out output); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] - private static extern int WebPEncodeBGRA_x86([InAttribute()] IntPtr bgra, int width, int height, int stride, float quality_factor, out IntPtr output); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeBGRA")] - private static extern int WebPEncodeBGRA_x64([InAttribute()] IntPtr bgra, int width, int height, int stride, float quality_factor, out IntPtr output); - - /// Lossless encoding images pointed to by *data in WebP format - /// Pointer to BGR image data - /// The range is limited currently from 1 to 16383 - /// The range is limited currently from 1 to 16383 - /// Specifies the distance between scan lines - /// output_buffer with WebP image - /// Size of WebP Image or 0 if an error occurred - internal static int WebPEncodeLosslessBGR(IntPtr bgr, int width, int height, int stride, out IntPtr output) - { - switch (IntPtr.Size) - { - case 4: - return WebPEncodeLosslessBGR_x86(bgr, width, height, stride, out output); - case 8: - return WebPEncodeLosslessBGR_x64(bgr, width, height, stride, out output); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGR")] - private static extern int WebPEncodeLosslessBGR_x86([InAttribute()] IntPtr bgr, int width, int height, int stride, out IntPtr output); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGR")] - private static extern int WebPEncodeLosslessBGR_x64([InAttribute()] IntPtr bgr, int width, int height, int stride, out IntPtr output); - - /// Lossless encoding images pointed to by *data in WebP format - /// Pointer to BGRA image data - /// The range is limited currently from 1 to 16383 - /// The range is limited currently from 1 to 16383 - /// Specifies the distance between scan lines - /// output_buffer with WebP image - /// Size of WebP Image or 0 if an error occurred - internal static int WebPEncodeLosslessBGRA(IntPtr bgra, int width, int height, int stride, out IntPtr output) - { - switch (IntPtr.Size) - { - case 4: - return WebPEncodeLosslessBGRA_x86(bgra, width, height, stride, out output); - case 8: - return WebPEncodeLosslessBGRA_x64(bgra, width, height, stride, out output); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGRA")] - private static extern int WebPEncodeLosslessBGRA_x86([InAttribute()] IntPtr bgra, int width, int height, int stride, out IntPtr output); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPEncodeLosslessBGRA")] - private static extern int WebPEncodeLosslessBGRA_x64([InAttribute()] IntPtr bgra, int width, int height, int stride, out IntPtr output); - - /// Releases memory returned by the WebPEncode - /// Pointer to memory - internal static void WebPFree(IntPtr p) - { - switch (IntPtr.Size) - { - case 4: - WebPFree_x86(p); - break; - case 8: - WebPFree_x64(p); - break; - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] - private static extern void WebPFree_x86(IntPtr p); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPFree")] - private static extern void WebPFree_x64(IntPtr p); - - /// Get the WebP version library - /// 8bits for each of major/minor/revision packet in integer. E.g: v2.5.7 is 0x020507 - internal static int WebPGetDecoderVersion() - { - switch (IntPtr.Size) - { - case 4: - return WebPGetDecoderVersion_x86(); - case 8: - return WebPGetDecoderVersion_x64(); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetDecoderVersion")] - private static extern int WebPGetDecoderVersion_x86(); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPGetDecoderVersion")] - private static extern int WebPGetDecoderVersion_x64(); - - /// Compute PSNR, SSIM or LSIM distortion metric between two pictures - /// Picture to measure - /// Reference picture - /// 0 = PSNR, 1 = SSIM, 2 = LSIM - /// dB in the Y/U/V/Alpha/All order - /// False in case of error (the two pictures don't have same dimension, ...) - internal static int WebPPictureDistortion(ref WebPPicture srcPicture, ref WebPPicture refPicture, int metric_type, IntPtr pResult) - { - switch (IntPtr.Size) - { - case 4: - return WebPPictureDistortion_x86(ref srcPicture, ref refPicture, metric_type, pResult); - case 8: - return WebPPictureDistortion_x64(ref srcPicture, ref refPicture, metric_type, pResult); - default: - throw new InvalidOperationException("Invalid platform. Can not find proper function"); - } - } - [DllImport("Resources/libwebp_x86.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureDistortion")] - private static extern int WebPPictureDistortion_x86(ref WebPPicture srcPicture, ref WebPPicture refPicture, int metric_type, IntPtr pResult); - [DllImport("Resources/libwebp_x64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "WebPPictureDistortion")] - private static extern int WebPPictureDistortion_x64(ref WebPPicture srcPicture, ref WebPPicture refPicture, int metric_type, IntPtr pResult); -} -#endregion - -#region | Predefined | -/// Enumerate some predefined settings for WebPConfig, depending on the type of source picture. These presets are used when calling WebPConfigPreset() -internal enum WebPPreset -{ - /// Default preset - WEBP_PRESET_DEFAULT = 0, - /// Digital picture, like portrait, inner shot - WEBP_PRESET_PICTURE, - /// Outdoor photograph, with natural lighting - WEBP_PRESET_PHOTO, - /// Hand or line drawing, with high-contrast details - WEBP_PRESET_DRAWING, - /// Small-sized colorful images - WEBP_PRESET_ICON, - /// Text-like - WEBP_PRESET_TEXT -}; - -/// Encoding error conditions -internal enum WebPEncodingError -{ - /// No error - VP8_ENC_OK = 0, - /// Memory error allocating objects - VP8_ENC_ERROR_OUT_OF_MEMORY, - /// Memory error while flushing bits - VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY, - /// A pointer parameter is NULL - VP8_ENC_ERROR_NULL_PARAMETER, - /// Configuration is invalid - VP8_ENC_ERROR_INVALID_CONFIGURATION, - /// Picture has invalid width/height - VP8_ENC_ERROR_BAD_DIMENSION, - /// Partition is bigger than 512k - VP8_ENC_ERROR_PARTITION0_OVERFLOW, - /// Partition is bigger than 16M - VP8_ENC_ERROR_PARTITION_OVERFLOW, - /// Error while flushing bytes - VP8_ENC_ERROR_BAD_WRITE, - /// File is bigger than 4G - VP8_ENC_ERROR_FILE_TOO_BIG, - /// Abort request by user - VP8_ENC_ERROR_USER_ABORT, - /// List terminator. Always last - VP8_ENC_ERROR_LAST, -} - -/// Enumeration of the status codes -internal enum VP8StatusCode -{ - /// No error - VP8_STATUS_OK = 0, - /// Memory error allocating objects - VP8_STATUS_OUT_OF_MEMORY, - /// Configuration is invalid - VP8_STATUS_INVALID_PARAM, - VP8_STATUS_BITSTREAM_ERROR, - /// Configuration is invalid - VP8_STATUS_UNSUPPORTED_FEATURE, - VP8_STATUS_SUSPENDED, - /// Abort request by user - VP8_STATUS_USER_ABORT, - VP8_STATUS_NOT_ENOUGH_DATA, -} - -/// Image characteristics hint for the underlying encoder -internal enum WebPImageHint -{ - /// Default preset - WEBP_HINT_DEFAULT = 0, - /// Digital picture, like portrait, inner shot - WEBP_HINT_PICTURE, - /// Outdoor photograph, with natural lighting - WEBP_HINT_PHOTO, - /// Discrete tone image (graph, map-tile etc) - WEBP_HINT_GRAPH, - /// List terminator. Always last - WEBP_HINT_LAST -}; - -/// Describes the byte-ordering of packed samples in memory -internal enum WEBP_CSP_MODE -{ - /// Byte-order: R,G,B,R,G,B,.. - MODE_RGB = 0, - /// Byte-order: R,G,B,A,R,G,B,A,.. - MODE_RGBA = 1, - /// Byte-order: B,G,R,B,G,R,.. - MODE_BGR = 2, - /// Byte-order: B,G,R,A,B,G,R,A,.. - MODE_BGRA = 3, - /// Byte-order: A,R,G,B,A,R,G,B,.. - MODE_ARGB = 4, - /// Byte-order: RGB-565: [a4 a3 a2 a1 a0 r5 r4 r3], [r2 r1 r0 g4 g3 g2 g1 g0], ... - /// WEBP_SWAP_16BITS_CSP is defined, - /// Byte-order: RGB-565: [a4 a3 a2 a1 a0 b5 b4 b3], [b2 b1 b0 g4 g3 g2 g1 g0], .. - MODE_RGBA_4444 = 5, - /// Byte-order: RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ... - /// WEBP_SWAP_16BITS_CSP is defined, - /// Byte-order: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], .. - MODE_RGB_565 = 6, - /// RGB-premultiplied transparent modes (alpha value is preserved) - MODE_rgbA = 7, - /// RGB-premultiplied transparent modes (alpha value is preserved) - MODE_bgrA = 8, - /// RGB-premultiplied transparent modes (alpha value is preserved) - MODE_Argb = 9, - /// RGB-premultiplied transparent modes (alpha value is preserved) - MODE_rgbA_4444 = 10, - /// YUV 4:2:0 - MODE_YUV = 11, - /// YUV 4:2:0 - MODE_YUVA = 12, - /// MODE_LAST -> 13 - MODE_LAST = 13, -} - -/// -/// Decoding states. State normally flows as: -/// WEBP_HEADER->VP8_HEADER->VP8_PARTS0->VP8_DATA->DONE for a lossy image, and -/// WEBP_HEADER->VP8L_HEADER->VP8L_DATA->DONE for a lossless image. -/// If there is any error the decoder goes into state ERROR. -/// -internal enum DecState -{ - STATE_WEBP_HEADER, // All the data before that of the VP8/VP8L chunk. - STATE_VP8_HEADER, // The VP8 Frame header (within the VP8 chunk). - STATE_VP8_PARTS0, - STATE_VP8_DATA, - STATE_VP8L_HEADER, - STATE_VP8L_DATA, - STATE_DONE, - STATE_ERROR -}; -#endregion - -#region | libwebp structs | -/// Features gathered from the bit stream -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPBitstreamFeatures -{ - /// Width in pixels, as read from the bit stream - public int Width; - /// Height in pixels, as read from the bit stream - public int Height; - /// True if the bit stream contains an alpha channel - public int Has_alpha; - /// True if the bit stream is an animation - public int Has_animation; - /// 0 = undefined (/mixed), 1 = lossy, 2 = lossless - public int Format; - /// Padding for later use - [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 5, ArraySubType = UnmanagedType.U4)] - private readonly uint[] pad; -}; - -/// Compression parameters -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPConfig -{ - /// Lossless encoding (0=lossy(default), 1=lossless) - public int lossless; - /// Between 0 (smallest file) and 100 (biggest) - public float quality; - /// Quality/speed trade-off (0=fast, 6=slower-better) - public int method; - /// Hint for image type (lossless only for now) - public WebPImageHint image_hint; - /// If non-zero, set the desired target size in bytes. Takes precedence over the 'compression' parameter - public int target_size; - /// If non-zero, specifies the minimal distortion to try to achieve. Takes precedence over target_size - public float target_PSNR; - /// Maximum number of segments to use, in [1..4] - public int segments; - /// Spatial Noise Shaping. 0=off, 100=maximum - public int sns_strength; - /// Range: [0 = off .. 100 = strongest] - public int filter_strength; - /// Range: [0 = off .. 7 = least sharp] - public int filter_sharpness; - /// Filtering type: 0 = simple, 1 = strong (only used if filter_strength > 0 or auto-filter > 0) - public int filter_type; - /// Auto adjust filter's strength [0 = off, 1 = on] - public int autofilter; - /// Algorithm for encoding the alpha plane (0 = none, 1 = compressed with WebP lossless). Default is 1 - public int alpha_compression; - /// Predictive filtering method for alpha plane. 0: none, 1: fast, 2: best. Default if 1 - public int alpha_filtering; - /// Between 0 (smallest size) and 100 (lossless). Default is 100 - public int alpha_quality; - /// Number of entropy-analysis passes (in [1..10]) - public int pass; - /// If true, export the compressed picture back. In-loop filtering is not applied - public int show_compressed; - /// Preprocessing filter (0=none, 1=segment-smooth, 2=pseudo-random dithering) - public int preprocessing; - /// Log2(number of token partitions) in [0..3] Default is set to 0 for easier progressive decoding - public int partitions; - /// Quality degradation allowed to fit the 512k limit on prediction modes coding (0: no degradation, 100: maximum possible degradation) - public int partition_limit; - /// If true, compression parameters will be remapped to better match the expected output size from JPEG compression. Generally, the output size will be similar but the degradation will be lower - public int emulate_jpeg_size; - /// If non-zero, try and use multi-threaded encoding - public int thread_level; - /// If set, reduce memory usage (but increase CPU use) - public int low_memory; - /// Near lossless encoding [0 = max loss .. 100 = off (default)] - public int near_lossless; - /// If non-zero, preserve the exact RGB values under transparent area. Otherwise, discard this invisible RGB information for better compression. The default value is 0 - public int exact; - /// Reserved for future lossless feature - public int delta_palettization; - /// If needed, use sharp (and slow) RGB->YUV conversion - public int use_sharp_yuv; - /// Padding for later use - private readonly int pad1; - private readonly int pad2; -}; - -/// Main exchange structure (input samples, output bytes, statistics) -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPPicture -{ - /// Main flag for encoder selecting between ARGB or YUV input. Recommended to use ARGB input (*argb, argb_stride) for lossless, and YUV input (*y, *u, *v, etc.) for lossy - public int use_argb; - /// Color-space: should be YUV420 for now (=Y'CbCr). Value = 0 - public UInt32 colorspace; - /// Width of picture (less or equal to WEBP_MAX_DIMENSION) - public int width; - /// Height of picture (less or equal to WEBP_MAX_DIMENSION) - public int height; - /// Pointer to luma plane - public IntPtr y; - /// Pointer to chroma U plane - public IntPtr u; - /// Pointer to chroma V plane - public IntPtr v; - /// Luma stride - public int y_stride; - /// Chroma stride - public int uv_stride; - /// Pointer to the alpha plane - public IntPtr a; - /// stride of the alpha plane - public int a_stride; - /// Padding for later use - [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.U4)] - private readonly uint[] pad1; - /// Pointer to ARGB (32 bit) plane - public IntPtr argb; - /// This is stride in pixels units, not bytes - public int argb_stride; - /// Padding for later use - [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.U4)] - private readonly uint[] pad2; - /// Byte-emission hook, to store compressed bytes as they are ready - public IntPtr writer; - /// Can be used by the writer - public IntPtr custom_ptr; - // map for extra information (only for lossy compression mode) - /// 1: intra type, 2: segment, 3: quant, 4: intra-16 prediction mode, 5: chroma prediction mode, 6: bit cost, 7: distortion - public int extra_info_type; - /// If not NULL, points to an array of size ((width + 15) / 16) * ((height + 15) / 16) that will be filled with a macroblock map, depending on extra_info_type - public IntPtr extra_info; - /// Pointer to side statistics (updated only if not NULL) - public IntPtr stats; - /// Error code for the latest error encountered during encoding - public UInt32 error_code; - /// If not NULL, report progress during encoding - public IntPtr progress_hook; - /// This field is free to be set to any value and used during callbacks (like progress-report e.g.) - public IntPtr user_data; - /// Padding for later use - [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 13, ArraySubType = UnmanagedType.U4)] - private readonly uint[] pad3; - /// Row chunk of memory for YUVA planes - private readonly IntPtr memory_; - /// Row chunk of memory for ARGB planes - private readonly IntPtr memory_argb_; - /// Padding for later use - [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.U4)] - private readonly uint[] pad4; -}; - -/// Structure for storing auxiliary statistics (mostly for lossy encoding) -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPAuxStats -{ - /// Final size - public int coded_size; - /// Peak-signal-to-noise ratio for Y - public float PSNRY; - /// Peak-signal-to-noise ratio for U - public float PSNRU; - /// Peak-signal-to-noise ratio for V - public float PSNRV; - /// Peak-signal-to-noise ratio for All - public float PSNRALL; - /// Peak-signal-to-noise ratio for Alpha - public float PSNRAlpha; - /// Number of intra4 - public int block_count_intra4; - /// Number of intra16 - public int block_count_intra16; - /// Number of skipped macro-blocks - public int block_count_skipped; - /// Approximate number of bytes spent for header - public int header_bytes; - /// Approximate number of bytes spent for mode-partition #0 - public int mode_partition_0; - /// Approximate number of bytes spent for DC coefficients for segment 0 - public int residual_bytes_DC_segments0; - /// Approximate number of bytes spent for AC coefficients for segment 0 - public int residual_bytes_AC_segments0; - /// Approximate number of bytes spent for UV coefficients for segment 0 - public int residual_bytes_uv_segments0; - /// Approximate number of bytes spent for DC coefficients for segment 1 - public int residual_bytes_DC_segments1; - /// Approximate number of bytes spent for AC coefficients for segment 1 - public int residual_bytes_AC_segments1; - /// Approximate number of bytes spent for UV coefficients for segment 1 - public int residual_bytes_uv_segments1; - /// Approximate number of bytes spent for DC coefficients for segment 2 - public int residual_bytes_DC_segments2; - /// Approximate number of bytes spent for AC coefficients for segment 2 - public int residual_bytes_AC_segments2; - /// Approximate number of bytes spent for UV coefficients for segment 2 - public int residual_bytes_uv_segments2; - /// Approximate number of bytes spent for DC coefficients for segment 3 - public int residual_bytes_DC_segments3; - /// Approximate number of bytes spent for AC coefficients for segment 3 - public int residual_bytes_AC_segments3; - /// Approximate number of bytes spent for UV coefficients for segment 3 - public int residual_bytes_uv_segments3; - /// Number of macro-blocks in segments 0 - public int segment_size_segments0; - /// Number of macro-blocks in segments 1 - public int segment_size_segments1; - /// Number of macro-blocks in segments 2 - public int segment_size_segments2; - /// Number of macro-blocks in segments 3 - public int segment_size_segments3; - /// Quantizer values for segment 0 - public int segment_quant_segments0; - /// Quantizer values for segment 1 - public int segment_quant_segments1; - /// Quantizer values for segment 2 - public int segment_quant_segments2; - /// Quantizer values for segment 3 - public int segment_quant_segments3; - /// Filtering strength for segment 0 [0..63] - public int segment_level_segments0; - /// Filtering strength for segment 1 [0..63] - public int segment_level_segments1; - /// Filtering strength for segment 2 [0..63] - public int segment_level_segments2; - /// Filtering strength for segment 3 [0..63] - public int segment_level_segments3; - /// Size of the transparency data - public int alpha_data_size; - /// Size of the enhancement layer data - public int layer_data_size; - - // lossless encoder statistics - /// bit0:predictor bit1:cross-color transform bit2:subtract-green bit3:color indexing - public Int32 lossless_features; - /// Number of precision bits of histogram - public int histogram_bits; - /// Precision bits for transform - public int transform_bits; - /// Number of bits for color cache lookup - public int cache_bits; - /// Number of color in palette, if used - public int palette_size; - /// Final lossless size - public int lossless_size; - /// Lossless header (transform, Huffman, etc) size - public int lossless_hdr_size; - /// Lossless image data size - public int lossless_data_size; - /// Padding for later use - [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.U4)] - private readonly uint[] pad; -}; - -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPDecoderConfig -{ - /// Immutable bit stream features (optional) - public WebPBitstreamFeatures input; - /// Output buffer (can point to external memory) - public WebPDecBuffer output; - /// Decoding options - public WebPDecoderOptions options; -} - -/// Output buffer -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPDecBuffer -{ - /// Color space - public WEBP_CSP_MODE colorspace; - /// Width of image - public int width; - /// Height of image - public int height; - /// If non-zero, 'internal_memory' pointer is not used. If value is '2' or more, the external memory is considered 'slow' and multiple read/write will be avoided - public int is_external_memory; - /// Output buffer parameters - public RGBA_YUVA_Buffer u; - /// Padding for later use - private readonly UInt32 pad1; - /// Padding for later use - private readonly UInt32 pad2; - /// Padding for later use - private readonly UInt32 pad3; - /// Padding for later use - private readonly UInt32 pad4; - /// Internally allocated memory (only when is_external_memory is 0). Should not be used externally, but accessed via WebPRGBABuffer - public IntPtr private_memory; -} - -/// Union of buffer parameters -[StructLayoutAttribute(LayoutKind.Explicit)] -internal struct RGBA_YUVA_Buffer -{ - [FieldOffsetAttribute(0)] - public WebPRGBABuffer RGBA; - - [FieldOffsetAttribute(0)] - public WebPYUVABuffer YUVA; -} - -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPYUVABuffer -{ - /// Pointer to luma samples - public IntPtr y; - /// Pointer to chroma U samples - public IntPtr u; - /// Pointer to chroma V samples - public IntPtr v; - /// Pointer to alpha samples - public IntPtr a; - /// Luma stride - public int y_stride; - /// Chroma U stride - public int u_stride; - /// Chroma V stride - public int v_stride; - /// Alpha stride - public int a_stride; - /// Luma plane size - public UIntPtr y_size; - /// Chroma plane U size - public UIntPtr u_size; - /// Chroma plane V size - public UIntPtr v_size; - /// Alpha plane size - public UIntPtr a_size; -} - -/// Generic structure for describing the output sample buffer -[StructLayoutAttribute(LayoutKind.Sequential)] -internal struct WebPRGBABuffer -{ - /// Pointer to RGBA samples - public IntPtr rgba; - /// Stride in bytes from one scanline to the next - public int stride; - /// Total size of the RGBA buffer - public UIntPtr size; -} - -/// Decoding options -[StructLayout(LayoutKind.Sequential)] -public struct WebPDecoderOptions -{ - /// If true, skip the in-loop filtering - public int bypass_filtering; - /// If true, use faster point-wise up-sampler - public int no_fancy_upsampling; - /// If true, cropping is applied _first_ - public int use_cropping; - /// Left position for cropping. Will be snapped to even values - public int crop_left; - /// Top position for cropping. Will be snapped to even values - public int crop_top; - /// Width of the cropping area - public int crop_width; - /// Height of the cropping area - public int crop_height; - /// If true, scaling is applied _afterward_ - public int use_scaling; - /// Final width - public int scaled_width; - /// Final height - public int scaled_height; - /// If true, use multi-threaded decoding - public int use_threads; - /// Dithering strength (0=Off, 100=full) - public int dithering_strength; - /// Flip output vertically - public int flip; - /// Alpha dithering strength in [0..100] - public int alpha_dithering_strength; - /// Padding for later use - private readonly UInt32 pad1; - /// Padding for later use - private readonly UInt32 pad2; - /// Padding for later use - private readonly UInt32 pad3; - /// Padding for later use - private readonly UInt32 pad4; - /// Padding for later use - private readonly UInt32 pad5; -}; -#endregion diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs index 15c98846d..d9aa65f23 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs @@ -1,18 +1,18 @@ using System; using System.Collections.Generic; -using System.Linq; +using System.Net.Http; +using System.Reactive.Disposables; using System.Reactive.Linq; using System.Reactive.Subjects; using System.Threading; using System.Threading.Tasks; -using System.Windows.Input; using System.Windows.Media.Imaging; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Wabbajack.Common; using Wabbajack.DTOs; -using Wabbajack.Messages; using Wabbajack.Models; using Wabbajack.Networking.WabbajackClientApi; using Wabbajack.Paths; @@ -80,10 +80,10 @@ public class BaseModListMetadataVM : ViewModel [Reactive] public IErrorResponse Error { get; protected set; } - protected readonly ObservableAsPropertyHelper _Image; + protected ObservableAsPropertyHelper _Image { get; set; } public BitmapImage Image => _Image.Value; - protected readonly ObservableAsPropertyHelper _LoadingImage; + protected ObservableAsPropertyHelper _LoadingImage { get; set; } public bool LoadingImage => _LoadingImage.Value; protected Subject IsLoadingIdle; @@ -91,9 +91,10 @@ public class BaseModListMetadataVM : ViewModel protected readonly ModListDownloadMaintainer _maintainer; protected readonly Client _wjClient; protected readonly CancellationToken _cancellationToken; + protected readonly ServiceProvider _serviceProvider; public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, - ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken) + ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken, HttpClient client) { _logger = logger; _maintainer = maintainer; @@ -123,17 +124,24 @@ public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, IsLoadingIdle = new Subject(); - var modlistImageSource = Metadata.ValidationSummary?.SmallImage?.ToString() ?? Metadata.Links.ImageUri; - var imageObs = Observable.Return(modlistImageSource) - .DownloadBitmapImage((ex) => _logger.LogError("Error downloading modlist image {Title} from {ImageUri}: {Exception}", Metadata.Title, modlistImageSource, ex.Message), LoadingImageLock); - - _Image = imageObs - .ToGuiProperty(this, nameof(Image)); - - _LoadingImage = imageObs - .Select(x => false) - .StartWith(true) - .ToGuiProperty(this, nameof(LoadingImage)); + this.WhenActivated(disposables => + { + var modlistImageSource = UIUtils.GetSmallImageUri(metadata); + var imageObs = Observable.Return(modlistImageSource) + .DownloadBitmapImage( + (ex) => _logger.LogError("Error downloading modlist image {Title} from {ImageUri}: {Exception}", + Metadata.Title, modlistImageSource, ex.Message), LoadingImageLock, client); + + _Image = imageObs + .ToGuiProperty(this, nameof(Image)) + .DisposeWith(disposables); + + _LoadingImage = imageObs + .Select(x => false) + .StartWith(true) + .ToGuiProperty(this, nameof(LoadingImage)) + .DisposeWith(disposables); + }); } protected async Task Download() diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs index 1fc6bc6b7..4610d4936 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs @@ -1,4 +1,5 @@ using System; +using System.Net.Http; using System.Reactive; using System.Reactive.Linq; using System.Threading; @@ -26,7 +27,7 @@ public class GalleryModListMetadataVM : BaseModListMetadataVM public ICommand ModListContentsCommend { get; } public GalleryModListMetadataVM(ILogger logger, ModListGalleryVM parent, ModlistMetadata metadata, - ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken) : base(logger, metadata, maintainer, wjClient, cancellationToken) + ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken, HttpClient client) : base(logger, metadata, maintainer, wjClient, cancellationToken, client) { _parent = parent; _Exists = Observable.Interval(TimeSpan.FromSeconds(0.5)) diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index 38d677c0b..5c6b9bf80 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Net.Http; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Threading; @@ -9,13 +10,13 @@ using System.Windows.Input; using DynamicData; using DynamicData.Binding; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Wabbajack.Common; using Wabbajack.Downloaders.GameFile; using Wabbajack.DTOs; -using Wabbajack.Messages; using Wabbajack.Networking.WabbajackClientApi; using Wabbajack.Services.OSIntegrated; using Wabbajack.Services.OSIntegrated.Services; @@ -68,7 +69,7 @@ public GameTypeEntry(GameMetaData gameMetaData, int amount) public static GameTypeEntry GetAllGamesEntry(int amount) => new(null, amount); } - [Reactive] public List GameTypeEntries { get; set; } + [Reactive] public ObservableCollection GameTypeEntries { get; set; } private bool _filteringOnGame; private GameTypeEntry _selectedGameTypeEntry = null; @@ -88,11 +89,12 @@ public GameTypeEntry SelectedGameTypeEntry private readonly ModListDownloadMaintainer _maintainer; private readonly SettingsManager _settingsManager; private readonly CancellationToken _cancellationToken; + private readonly IServiceProvider _serviceProvider; public ICommand ClearFiltersCommand { get; set; } public ModListGalleryVM(ILogger logger, Client wjClient, GameLocator locator, - SettingsManager settingsManager, ModListDownloadMaintainer maintainer, CancellationToken cancellationToken) + SettingsManager settingsManager, ModListDownloadMaintainer maintainer, CancellationToken cancellationToken, IServiceProvider serviceProvider) : base(logger) { var searchThrottle = TimeSpan.FromSeconds(0.5); @@ -102,6 +104,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL _maintainer = maintainer; _settingsManager = settingsManager; _cancellationToken = cancellationToken; + _serviceProvider = serviceProvider; ClearFiltersCommand = ReactiveCommand.Create( () => @@ -201,7 +204,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL .Sort(searchSorter) .TreatMovesAsRemoveAdd() .Bind(out _filteredModLists) - .Subscribe((_) => + .Subscribe(_ => { if (!_filteringOnGame) { @@ -260,7 +263,8 @@ private async Task LoadModLists() { e.Clear(); e.AddOrUpdate(modLists.Select(m => - new GalleryModListMetadataVM(_logger, this, m, _maintainer, _wjClient, _cancellationToken))); + new GalleryModListMetadataVM(_logger, this, m, _maintainer, _wjClient, _cancellationToken, + _serviceProvider.GetService()))); }); SmallestSizedModlist = null; LargestSizedModlist = null; @@ -288,13 +292,13 @@ private async Task LoadModLists() ll.Succeed(); } - private List GetGameTypeEntries() + private ObservableCollection GetGameTypeEntries() { - return ModLists.Select(fm => fm.Metadata) - .GroupBy(m => m.Game) - .Select(g => new GameTypeEntry(g.Key.MetaData(), g.Count())) - .OrderBy(gte => gte.GameMetaData.HumanFriendlyGameName) - .Prepend(GameTypeEntry.GetAllGamesEntry(ModLists.Count)) - .ToList(); + return new(ModLists.Select(fm => fm.Metadata) + .GroupBy(m => m.Game) + .Select(g => new GameTypeEntry(g.Key.MetaData(), g.Count())) + .OrderBy(gte => gte.GameMetaData.HumanFriendlyGameName) + .Prepend(GameTypeEntry.GetAllGamesEntry(ModLists.Count)) + .ToList()); } } \ No newline at end of file diff --git a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs index 0976e0fe0..b5613ae6b 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs @@ -102,7 +102,7 @@ private async Task LoadArchives(string repo, string machineURL) try { var validatedModlist = await _wjClient.GetDetailedStatus(repo, machineURL); - var archives = validatedModlist.Archives.Select(a => a.Original); + var archives = validatedModlist.Archives.Select(a => a.Original).ToList(); _archives.Edit(a => { a.Clear(); diff --git a/Wabbajack.App.Wpf/ViewModels/ModVM.cs b/Wabbajack.App.Wpf/ViewModels/ModVM.cs index 07e1ff2b9..c5cdae235 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModVM.cs @@ -1,7 +1,9 @@ using ReactiveUI; using System; +using System.Net.Http; using System.Reactive.Linq; using System.Windows.Media.Imaging; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Wabbajack.DTOs.DownloadStates; @@ -10,6 +12,8 @@ namespace Wabbajack; public class ModVM : ViewModel { private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + private HttpClient _httpClient; public IMetaState State { get; } // Image isn't exposed as a direct property, but as an observable. @@ -17,14 +21,16 @@ public class ModVM : ViewModel // and the cached image will automatically be released when the last interested party is gone. public IObservable ImageObservable { get; } - public ModVM(ILogger logger, IMetaState state) + public ModVM(ILogger logger, IServiceProvider serviceProvider, IMetaState state) { _logger = logger; + _serviceProvider = serviceProvider; + _httpClient = _serviceProvider.GetService(); State = state; ImageObservable = Observable.Return(State.ImageURL?.ToString()) .ObserveOn(RxApp.TaskpoolScheduler) - .DownloadBitmapImage(ex => _logger.LogWarning(ex, "Skipping slide for mod {Name}", State.Name), LoadingLock) + .DownloadBitmapImage(ex => _logger.LogWarning(ex, "Skipping slide for mod {Name}", State.Name), LoadingLock, _httpClient) .Replay(1) .RefCount(TimeSpan.FromMilliseconds(5000)); } diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index da7478e95..eca22dab7 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -20,24 +20,25 @@ + HorizontalAlignment="Left" + VerticalAlignment="Stretch"> - - - - - - - - + + + + + + + - - + x:Name="SearchBox" + mahapps:TextBoxHelper.Watermark="Search for a modlist..." /> + + - + - + @@ -62,6 +64,33 @@ + + + + + + + + + + + + + + + - + - + - - + + - - - + + + - - - - + + + + + Width="Auto"> - + BorderBrush="Transparent" + BorderThickness="0"> + + x:Name="LoadingRing" + Visibility="Collapsed" /> + x:Name="NoneFound" + HorizontalAlignment="Center" + VerticalAlignment="Center" + Orientation="Vertical" + Visibility="Collapsed"> + FontSize="72" /> + x:Name="ErrorIcon" + Width="55" + Height="55" + HorizontalAlignment="Center" + VerticalAlignment="Center" + Foreground="{StaticResource ErrorBrush}" + Kind="{x:Static iconPacks:PackIconMaterialKind.AlertCircle}" + ToolTip="Error loading modlist gallery" + Visibility="Collapsed" /> diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs index ebc2f16d8..c83947288 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs @@ -2,8 +2,8 @@ using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; -using System.Windows; using ReactiveUI; +using static System.Windows.Visibility; namespace Wabbajack; @@ -32,14 +32,14 @@ public ModListGalleryView() .DisposeWith(dispose); this.WhenAny(x => x.ViewModel.LoadingLock.IsLoading) - .Select(x => x ? Visibility.Visible : Visibility.Collapsed) - .StartWith(Visibility.Collapsed) + .Select(x => x ? Visible : Collapsed) + .StartWith(Collapsed) .BindTo(this, x => x.LoadingRing.Visibility) .DisposeWith(dispose); this.WhenAny(x => x.ViewModel.LoadingLock.ErrorState) - .Select(e => (e?.Succeeded ?? true) ? Visibility.Collapsed : Visibility.Visible) - .StartWith(Visibility.Collapsed) + .Select(e => (e?.Succeeded ?? true) ? Collapsed : Visible) + .StartWith(Collapsed) .BindToStrict(this, x => x.ErrorIcon.Visibility) .DisposeWith(dispose); @@ -47,8 +47,8 @@ public ModListGalleryView() .CombineLatest(this.WhenAnyValue(x => x.ViewModel.LoadingLock.IsLoading)) .Select(x => x.First == 0 && !x.Second) .DistinctUntilChanged() - .Select(x => x ? Visibility.Visible : Visibility.Collapsed) - .StartWith(Visibility.Collapsed) + .Select(x => x ? Visible : Collapsed) + .StartWith(Collapsed) .BindToStrict(this, x => x.NoneFound.Visibility) .DisposeWith(dispose); @@ -64,15 +64,15 @@ public ModListGalleryView() this.BindStrict(ViewModel, vm => vm.MinModlistSize, view => view.SizeSliderFilter.LowerValue, - (double vmProp) => vmProp / Math.Pow(1024, 3), - (double vProp) => vProp * Math.Pow(1024, 3)) + vmProp => vmProp / Math.Pow(1024, 3), + vProp => vProp * Math.Pow(1024, 3)) .DisposeWith(dispose); this.BindStrict(ViewModel, vm => vm.MaxModlistSize, view => view.SizeSliderFilter.UpperValue, - (double vmProp) => vmProp / Math.Pow(1024, 3), - (double vProp) => vProp * Math.Pow(1024, 3)) + vmProp => vmProp / Math.Pow(1024, 3), + vProp => vProp * Math.Pow(1024, 3)) .DisposeWith(dispose); this.WhenAny(x => x.ViewModel.ClearFiltersCommand) diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index d7952cc54..562efc25a 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -116,6 +116,7 @@ + diff --git a/Wabbajack.Hashing.xxHash64/ByteArrayExtensions.cs b/Wabbajack.Hashing.xxHash64/ByteArrayExtensions.cs index d93a8e14c..f5a650ad4 100644 --- a/Wabbajack.Hashing.xxHash64/ByteArrayExtensions.cs +++ b/Wabbajack.Hashing.xxHash64/ByteArrayExtensions.cs @@ -9,6 +9,7 @@ public static class ByteArrayExtensions { public static async ValueTask Hash(this byte[] data, IJob? job = null) { - return await new MemoryStream(data).HashingCopy(Stream.Null, CancellationToken.None, job); + using var ms = new MemoryStream(data); + return await ms.HashingCopy(Stream.Null, CancellationToken.None, job); } } \ No newline at end of file diff --git a/Wabbajack.Hashing.xxHash64/StringExtensions.cs b/Wabbajack.Hashing.xxHash64/StringExtensions.cs index a09f80d52..c3c4f42c6 100644 --- a/Wabbajack.Hashing.xxHash64/StringExtensions.cs +++ b/Wabbajack.Hashing.xxHash64/StringExtensions.cs @@ -9,7 +9,7 @@ public static class StringExtensions { public static string ToHex(this byte[] bytes) { - var builder = new StringBuilder(); + var builder = new StringBuilder(bytes.Length * 2); for (var i = 0; i < bytes.Length; i++) builder.Append(bytes[i].ToString("x2")); return builder.ToString(); } diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index fbb5a5dff..a59c31ec9 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -210,7 +210,6 @@ public async Task GenerateFileDefinition(AbsolutePath path) public async Task LoadLists() { var repos = LoadRepositories(); - var featured = await LoadFeaturedLists(); return await (await repos).PMapAll(async url => { @@ -221,14 +220,13 @@ public async Task LoadLists() _dtos.Options))!.Select(meta => { meta.RepositoryName = url.Key; - meta.Official = (meta.RepositoryName == "wj-featured" || - featured.Contains(meta.NamespacedName)); + meta.Official = meta.RepositoryName == "wj-featured"; return meta; }); } catch (JsonException ex) { - _logger.LogError(ex, "While loading {List} from {Url}", url.Key, url.Value); + _logger.LogError(ex, "Failed loading json for repository {List} from {Url}", url.Key, url.Value); return Enumerable.Empty(); } }) From 3f93e891d9ebf69866fc8858a5bca8c9014dfeb4 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 26 Oct 2024 15:18:33 +0200 Subject: [PATCH 137/294] Fix accidentally breaking featured lists --- Wabbajack.Networking.WabbajackClientApi/Client.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index a59c31ec9..f8fb2d204 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -210,6 +210,7 @@ public async Task GenerateFileDefinition(AbsolutePath path) public async Task LoadLists() { var repos = LoadRepositories(); + var featured = await LoadFeaturedLists(); return await (await repos).PMapAll(async url => { @@ -220,7 +221,8 @@ public async Task LoadLists() _dtos.Options))!.Select(meta => { meta.RepositoryName = url.Key; - meta.Official = meta.RepositoryName == "wj-featured"; + meta.Official = meta.RepositoryName == "wj-featured" || + featured.Contains(meta.NamespacedName); return meta; }); } From 4f57c55427ee90619a05b783fc4224fefce1faf7 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 26 Oct 2024 20:13:51 +0200 Subject: [PATCH 138/294] =?UTF-8?q?Reuse=20created=20BitmapImages=20with?= =?UTF-8?q?=20custom=20ImageCacheManager,=20fix=20gallery=20memory=20leak?= =?UTF-8?q?=20for=20good=20=F0=9F=A4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Wabbajack.App.Wpf/App.xaml.cs | 5 +- .../Interventions/UserInterventionHandler.cs | 6 +- Wabbajack.App.Wpf/Util/ImageCacheManager.cs | 110 ++++++++++++++++++ Wabbajack.App.Wpf/Util/UIUtils.cs | 69 ++--------- .../Gallery/BaseModListMetadataVM.cs | 22 ++-- .../Gallery/GalleryModListMetadataVM.cs | 2 +- .../ViewModels/Gallery/ModListGalleryVM.cs | 2 +- .../ViewModels/ModListDetailsVM.cs | 3 +- Wabbajack.App.Wpf/ViewModels/ModVM.cs | 7 +- 9 files changed, 146 insertions(+), 80 deletions(-) create mode 100644 Wabbajack.App.Wpf/Util/ImageCacheManager.cs diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index af4487849..2c5c280f2 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -157,8 +157,9 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddSingleton(new ApplicationRegistrationService()); services.AddSingleton(); - services.AddSingleton(); - + services.AddSingleton(); + services.AddSingleton(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Interventions/UserInterventionHandler.cs b/Wabbajack.App.Wpf/Interventions/UserInterventionHandler.cs index 2daca043e..c1f2643f4 100644 --- a/Wabbajack.App.Wpf/Interventions/UserInterventionHandler.cs +++ b/Wabbajack.App.Wpf/Interventions/UserInterventionHandler.cs @@ -8,12 +8,12 @@ namespace Wabbajack.Interventions; -public class UserIntreventionHandler : IUserInterventionHandler +public class UserInterventionHandler : IUserInterventionHandler { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; - public UserIntreventionHandler(ILogger logger, IServiceProvider serviceProvider) + public UserInterventionHandler(ILogger logger, IServiceProvider serviceProvider) { _logger = logger; _serviceProvider = serviceProvider; diff --git a/Wabbajack.App.Wpf/Util/ImageCacheManager.cs b/Wabbajack.App.Wpf/Util/ImageCacheManager.cs new file mode 100644 index 000000000..85a2af5d6 --- /dev/null +++ b/Wabbajack.App.Wpf/Util/ImageCacheManager.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Threading.Tasks; +using System.Windows.Media.Imaging; +using DynamicData.Kernel; +using Microsoft.Extensions.Logging; +using ReactiveUI; +using Wabbajack.Hashing.xxHash64; +using Wabbajack.Paths; +using Wabbajack.Paths.IO; +using static System.Text.Encoding; +using Convert = System.Convert; + +namespace Wabbajack; + +public class ImageCacheManager +{ + private readonly TimeSpan _pollInterval = TimeSpan.FromMinutes(1); + private readonly Services.OSIntegrated.Configuration _configuration; + private readonly ILogger _logger; + + private AbsolutePath _imageCachePath; + private ConcurrentDictionary _cachedImages { get; } = new(); + + private async Task SaveImage(Hash hash, MemoryStream ms) + { + var path = _imageCachePath.Combine(hash.ToHex()); + await using var fs = new FileStream(path.ToString(), FileMode.Create, FileAccess.Write); + ms.WriteTo(fs); + } + private async Task<(bool, MemoryStream)> LoadImage(Hash hash) + { + MemoryStream imageStream = null; + var path = _imageCachePath.Combine(hash.ToHex()); + if (!path.FileExists()) + { + return (false, imageStream); + } + + imageStream = new MemoryStream(); + await using var fs = new FileStream(path.ToString(), FileMode.Open, FileAccess.Read); + await fs.CopyToAsync(imageStream); + return (true, imageStream); + } + + public ImageCacheManager(ILogger logger, Services.OSIntegrated.Configuration configuration) + { + _logger = logger; + _configuration = configuration; + _imageCachePath = _configuration.ImageCacheLocation; + _imageCachePath.CreateDirectory(); + + RxApp.TaskpoolScheduler.ScheduleRecurringAction(_pollInterval, () => + { + foreach (var (hash, cachedImage) in _cachedImages) + { + if (!cachedImage.IsExpired()) continue; + + try + { + _cachedImages.TryRemove(hash, out _); + File.Delete(_configuration.ImageCacheLocation.Combine(hash).ToString()); + } + catch (Exception ex) + { + _logger.LogError("Failed to delete cached image {b64}", hash); + } + } + }); + + } + + public async Task Add(string url, BitmapImage img) + { + var hash = await UTF8.GetBytes(url).Hash(); + if (!_cachedImages.TryAdd(hash, new CachedImage(img))) return false; + + await SaveImage(hash, (MemoryStream)img.StreamSource); + return true; + + } + + public async Task<(bool, BitmapImage)> Get(string url) + { + var hash = await UTF8.GetBytes(url).Hash(); + // Try to load the image from memory + if (_cachedImages.TryGetValue(hash, out var cachedImage)) return (true, cachedImage.Image); + + // Try to load the image from disk + var (success, imageStream) = await LoadImage(hash); + if (!success) return (false, null); + + var img = UIUtils.BitmapImageFromStream(imageStream); + _cachedImages.TryAdd(hash, new CachedImage(img)); + await imageStream.DisposeAsync(); + return (true, img); + + } +} + +public class CachedImage(BitmapImage image) +{ + private readonly DateTime _cachedAt = DateTime.Now; + private readonly TimeSpan _cacheDuration = TimeSpan.FromMinutes(5); + + public BitmapImage Image { get; } = image; + + public bool IsExpired() => _cachedAt - DateTime.Now > _cacheDuration; +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Util/UIUtils.cs b/Wabbajack.App.Wpf/Util/UIUtils.cs index a93b339e7..b38c45c74 100644 --- a/Wabbajack.App.Wpf/Util/UIUtils.cs +++ b/Wabbajack.App.Wpf/Util/UIUtils.cs @@ -1,6 +1,7 @@ using ReactiveUI; using System; using System.Diagnostics; +using System.Drawing.Imaging; using System.IO; using System.Net.Http; using System.Reactive.Linq; @@ -16,6 +17,7 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Png; using Wabbajack.DTOs; +using Exception = System.Exception; using SharpImage = SixLabors.ImageSharp.Image; namespace Wabbajack; @@ -83,86 +85,39 @@ public static AbsolutePath OpenFileDialog(string filter, string initialDirectory } public static IObservable DownloadBitmapImage(this IObservable obs, Action exceptionHandler, - LoadingLock loadingLock, HttpClient client) + LoadingLock loadingLock, HttpClient client, ImageCacheManager icm) { return obs .ObserveOn(RxApp.TaskpoolScheduler) .SelectTask(async url => { - var ll = loadingLock.WithLoading(); + using var ll = loadingLock.WithLoading(); try { - var (found, mStream) = await FindCachedImage(url); - if (found) return (ll, mStream); + var (cached, cachedImg) = await icm.Get(url); + if (cached) return cachedImg; await using var stream = await client.GetStreamAsync(url); - var pngStream = new MemoryStream(); - using (SharpImage img = await SharpImage.LoadAsync(stream)) + using var pngStream = new MemoryStream(); + using (var sharpImg = await SharpImage.LoadAsync(stream)) { - await img.SaveAsPngAsync(pngStream); + await sharpImg.SaveAsPngAsync(pngStream); } - await WriteCachedImage(url, pngStream); - - return (ll, pngStream); - } - catch (Exception ex) - { - exceptionHandler(ex); - return (ll, default); - } - }) - .Select(x => - { - var (ll, memStream) = x; - if (memStream == null) return default; - try - { - return BitmapImageFromStream(memStream); + var img = BitmapImageFromStream(pngStream); + await icm.Add(url, img); + return img; } catch (Exception ex) { exceptionHandler(ex); return default; } - finally - { - ll.Dispose(); - memStream.Dispose(); - } }) .ObserveOnGuiThread(); } - private static async Task WriteCachedImage(string url, MemoryStream ms) - { - var folder = KnownFolders.WabbajackAppLocal.Combine("ModListImages"); - if (!folder.DirectoryExists()) folder.CreateDirectory(); - - var path = folder.Combine((await Encoding.UTF8.GetBytes(url).Hash()).ToHex()); - - await using (var fs = new FileStream(path.ToString(), FileMode.Create, FileAccess.Write)) { - ms.WriteTo(fs); - } - } - - private static async Task<(bool, MemoryStream)> FindCachedImage(string uri) - { - var folder = KnownFolders.WabbajackAppLocal.Combine("ModListImages"); - if (!folder.DirectoryExists()) folder.CreateDirectory(); - - var path = folder.Combine((await Encoding.UTF8.GetBytes(uri).Hash()).ToHex()); - if(!path.FileExists()) return (false, default); - - var ms = new MemoryStream(); - await using (FileStream fs = new FileStream(path.ToString(), FileMode.Open, FileAccess.Read)) - { - await fs.CopyToAsync(ms); - } - return (true, ms); - } - /// /// Format bytes to a greater unit /// diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs index d9aa65f23..e8df662ad 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs @@ -92,9 +92,10 @@ public class BaseModListMetadataVM : ViewModel protected readonly Client _wjClient; protected readonly CancellationToken _cancellationToken; protected readonly ServiceProvider _serviceProvider; + protected readonly ImageCacheManager _icm; public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, - ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken, HttpClient client) + ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken, HttpClient client, ImageCacheManager icm) { _logger = logger; _maintainer = maintainer; @@ -123,25 +124,22 @@ public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, IsBroken = metadata.ValidationSummary.HasFailures || metadata.ForceDown; IsLoadingIdle = new Subject(); - - this.WhenActivated(disposables => - { - var modlistImageSource = UIUtils.GetSmallImageUri(metadata); - var imageObs = Observable.Return(modlistImageSource) - .DownloadBitmapImage( - (ex) => _logger.LogError("Error downloading modlist image {Title} from {ImageUri}: {Exception}", - Metadata.Title, modlistImageSource, ex.Message), LoadingImageLock, client); + + var smallImageUri = UIUtils.GetSmallImageUri(metadata); + var imageObs = Observable.Return(smallImageUri) + .DownloadBitmapImage( + (ex) => _logger.LogError("Error downloading modlist image {Title} from {ImageUri}: {Exception}", + Metadata.Title, smallImageUri, ex.ToString()), LoadingImageLock, client, icm); _Image = imageObs .ToGuiProperty(this, nameof(Image)) - .DisposeWith(disposables); + .DisposeWith(CompositeDisposable); _LoadingImage = imageObs .Select(x => false) .StartWith(true) .ToGuiProperty(this, nameof(LoadingImage)) - .DisposeWith(disposables); - }); + .DisposeWith(CompositeDisposable); } protected async Task Download() diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs index 4610d4936..e0b686b55 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs @@ -27,7 +27,7 @@ public class GalleryModListMetadataVM : BaseModListMetadataVM public ICommand ModListContentsCommend { get; } public GalleryModListMetadataVM(ILogger logger, ModListGalleryVM parent, ModlistMetadata metadata, - ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken, HttpClient client) : base(logger, metadata, maintainer, wjClient, cancellationToken, client) + ModListDownloadMaintainer maintainer, Client wjClient, CancellationToken cancellationToken, HttpClient client, ImageCacheManager icm) : base(logger, metadata, maintainer, wjClient, cancellationToken, client, icm) { _parent = parent; _Exists = Observable.Interval(TimeSpan.FromSeconds(0.5)) diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index 5c6b9bf80..f3eeba4a3 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -264,7 +264,7 @@ private async Task LoadModLists() e.Clear(); e.AddOrUpdate(modLists.Select(m => new GalleryModListMetadataVM(_logger, this, m, _maintainer, _wjClient, _cancellationToken, - _serviceProvider.GetService()))); + _serviceProvider.GetService(), _serviceProvider.GetService()))); }); SmallestSizedModlist = null; LargestSizedModlist = null; diff --git a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs index b5613ae6b..0ecefb931 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs @@ -74,8 +74,7 @@ public ModListDetailsVM(ILogger logger, Client wjClient) : bas .Select>(txt => { if (string.IsNullOrWhiteSpace(txt)) return _ => true; - return item => item.State is Nexus ? ((Nexus)item.State).Name.ContainsCaseInsensitive(txt) : false || - item.Name.ContainsCaseInsensitive(txt); + return item => item.State is Nexus nexus ? nexus.Name.ContainsCaseInsensitive(txt) : item.Name.ContainsCaseInsensitive(txt); }); var searchSorter = this.WhenValueChanged(vm => vm.Search) diff --git a/Wabbajack.App.Wpf/ViewModels/ModVM.cs b/Wabbajack.App.Wpf/ViewModels/ModVM.cs index c5cdae235..dd6bd5b95 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModVM.cs @@ -1,5 +1,6 @@ using ReactiveUI; using System; +using System.Drawing; using System.Net.Http; using System.Reactive.Linq; using System.Windows.Media.Imaging; @@ -14,6 +15,7 @@ public class ModVM : ViewModel private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; private HttpClient _httpClient; + private ImageCacheManager _icm; public IMetaState State { get; } // Image isn't exposed as a direct property, but as an observable. @@ -21,16 +23,17 @@ public class ModVM : ViewModel // and the cached image will automatically be released when the last interested party is gone. public IObservable ImageObservable { get; } - public ModVM(ILogger logger, IServiceProvider serviceProvider, IMetaState state) + public ModVM(ILogger logger, IServiceProvider serviceProvider, IMetaState state, ImageCacheManager icm) { _logger = logger; _serviceProvider = serviceProvider; _httpClient = _serviceProvider.GetService(); + _icm = icm; State = state; ImageObservable = Observable.Return(State.ImageURL?.ToString()) .ObserveOn(RxApp.TaskpoolScheduler) - .DownloadBitmapImage(ex => _logger.LogWarning(ex, "Skipping slide for mod {Name}", State.Name), LoadingLock, _httpClient) + .DownloadBitmapImage(ex => _logger.LogWarning(ex, "Skipping slide for mod {Name}", State.Name), LoadingLock, _httpClient, _icm) .Replay(1) .RefCount(TimeSpan.FromMilliseconds(5000)); } From 881cde6eb661ab6dfade91116c80c128a0de93db Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:24:35 +0200 Subject: [PATCH 139/294] Don't save searched string when returning to the gallery, make NSFW filter include instead of only --- Wabbajack.App.Wpf/Settings.cs | 4 +- .../ViewModels/Gallery/ModListGalleryVM.cs | 40 +++++++++++-------- .../Views/ModListGalleryView.xaml | 1 - .../Views/ModListGalleryView.xaml.cs | 4 +- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Wabbajack.App.Wpf/Settings.cs b/Wabbajack.App.Wpf/Settings.cs index 6166797e6..1094667e1 100644 --- a/Wabbajack.App.Wpf/Settings.cs +++ b/Wabbajack.App.Wpf/Settings.cs @@ -54,8 +54,8 @@ public void ResetMaximumMemoryPerDownloadThreadMb() public class GalleryFilterSettings { public string GameType { get; set; } - public bool ShowNSFW { get; set; } - public bool ShowUnofficialLists { get; set; } + public bool IncludeNSFW { get; set; } + public bool IncludeUnofficial { get; set; } public bool OnlyInstalled { get; set; } public string Search { get; set; } } diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index f3eeba4a3..8554669fe 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -27,6 +27,7 @@ public class ModListGalleryVM : BackNavigatingVM { public MainWindowVM MWVM { get; } + private bool _savingSettings = false; private readonly SourceCache _modLists = new(x => x.Metadata.NamespacedName); public ReadOnlyObservableCollection _filteredModLists; @@ -40,9 +41,9 @@ public class ModListGalleryVM : BackNavigatingVM [Reactive] public bool OnlyInstalled { get; set; } - [Reactive] public bool ShowNSFW { get; set; } + [Reactive] public bool IncludeNSFW { get; set; } - [Reactive] public bool ShowUnofficialLists { get; set; } + [Reactive] public bool IncludeUnofficial { get; set; } [Reactive] public string GameType { get; set; } [Reactive] public double MinModlistSize { get; set; } @@ -110,8 +111,8 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL () => { OnlyInstalled = false; - ShowNSFW = false; - ShowUnofficialLists = false; + IncludeNSFW = false; + IncludeUnofficial = false; Search = string.Empty; SelectedGameTypeEntry = GameTypeEntries.FirstOrDefault(); }); @@ -120,8 +121,9 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL { LoadModLists().FireAndForget(); LoadSettings().FireAndForget(); - - Disposable.Create(() => SaveSettings().FireAndForget()) + + this.WhenAnyValue(x => x.IncludeNSFW, x => x.IncludeUnofficial, x => x.OnlyInstalled, x => x.GameType) + .Subscribe(_ => SaveSettings().FireAndForget()) .DisposeWith(disposables); var searchTextPredicates = this.ObservableForProperty(vm => vm.Search) @@ -145,7 +147,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL }) .StartWith(_ => true); - var showUnofficial = this.ObservableForProperty(vm => vm.ShowUnofficialLists) + var showUnofficial = this.ObservableForProperty(vm => vm.IncludeUnofficial) .Select(v => v.Value) .StartWith(false) .Select>(unoffical => @@ -154,10 +156,14 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL return x => x.Metadata.Official; }); - var showNSFWFilter = this.ObservableForProperty(vm => vm.ShowNSFW) + var showNSFWFilter = this.ObservableForProperty(vm => vm.IncludeNSFW) .Select(v => v.Value) - .Select>(showNsfw => { return item => item.Metadata.NSFW == showNsfw; }) - .StartWith(item => item.Metadata.NSFW == false); + .StartWith(false) + .Select>(showNsfw => + { + if (showNsfw) return x => true; + return x => !x.Metadata.NSFW; + }); var gameFilter = this.ObservableForProperty(vm => vm.GameType) .Select(v => v.Value) @@ -228,14 +234,17 @@ public override void Unload() private async Task SaveSettings() { + if (_savingSettings) return; + + _savingSettings = true; await _settingsManager.Save("modlist_gallery", new GalleryFilterSettings { GameType = GameType, - ShowNSFW = ShowNSFW, - ShowUnofficialLists = ShowUnofficialLists, - Search = Search, + IncludeNSFW = IncludeNSFW, + IncludeUnofficial = IncludeUnofficial, OnlyInstalled = OnlyInstalled, }); + _savingSettings = false; } private async Task LoadSettings() @@ -245,9 +254,8 @@ private async Task LoadSettings() (_, s) => { SelectedGameTypeEntry = GameTypeEntries?.FirstOrDefault(gte => gte.GameIdentifier.Equals(s.GameType)); - ShowNSFW = s.ShowNSFW; - ShowUnofficialLists = s.ShowUnofficialLists; - Search = s.Search; + IncludeNSFW = s.IncludeNSFW; + IncludeUnofficial = s.IncludeUnofficial; OnlyInstalled = s.OnlyInstalled; return Disposable.Empty; }); diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index eca22dab7..7e640940b 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -70,7 +70,6 @@ Padding="0, 12, 0, 12"> vm.OnlyInstalled, x => x.OnlyInstalledCheckbox.IsChecked) .DisposeWith(dispose); - this.BindStrict(ViewModel, vm => vm.ShowNSFW, x => x.ShowNSFW.IsChecked) + this.BindStrict(ViewModel, vm => vm.IncludeNSFW, x => x.ShowNSFW.IsChecked) .DisposeWith(dispose); - this.BindStrict(ViewModel, vm => vm.ShowUnofficialLists, x => x.ShowUnofficialLists.IsChecked) + this.BindStrict(ViewModel, vm => vm.IncludeUnofficial, x => x.ShowUnofficialLists.IsChecked) .DisposeWith(dispose); this.BindStrict(ViewModel, From bae9b45c40cbc7c35e33d13ba2e38f1d47602bf0 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:45:25 +0100 Subject: [PATCH 140/294] Fix unofficial and NSFW toggle resetting incorrectly after re-entering gallery view --- .../ViewModels/Gallery/ModListGalleryVM.cs | 25 +++++++++------ .../Views/ModListGalleryView.xaml | 32 +++++++------------ .../Views/ModListGalleryView.xaml.cs | 4 +-- .../Client.cs | 10 ++++++ 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index 8554669fe..993b575cb 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -98,7 +98,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL SettingsManager settingsManager, ModListDownloadMaintainer maintainer, CancellationToken cancellationToken, IServiceProvider serviceProvider) : base(logger) { - var searchThrottle = TimeSpan.FromSeconds(0.5); + var searchThrottle = TimeSpan.FromSeconds(0.35); _wjClient = wjClient; _logger = logger; _locator = locator; @@ -147,18 +147,18 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL }) .StartWith(_ => true); - var showUnofficial = this.ObservableForProperty(vm => vm.IncludeUnofficial) + var includeUnofficialFilter = this.ObservableForProperty(vm => vm.IncludeUnofficial) .Select(v => v.Value) - .StartWith(false) + .StartWith(IncludeUnofficial) .Select>(unoffical => { if (unoffical) return x => true; return x => x.Metadata.Official; }); - var showNSFWFilter = this.ObservableForProperty(vm => vm.IncludeNSFW) + var includeNSFWFilter = this.ObservableForProperty(vm => vm.IncludeNSFW) .Select(v => v.Value) - .StartWith(false) + .StartWith(IncludeNSFW) .Select>(showNsfw => { if (showNsfw) return x => true; @@ -202,8 +202,8 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL .ObserveOn(RxApp.MainThreadScheduler) .Filter(searchTextPredicates) .Filter(onlyInstalledGamesFilter) - .Filter(showUnofficial) - .Filter(showNSFWFilter) + .Filter(includeUnofficialFilter) + .Filter(includeNSFWFilter) .Filter(gameFilter) .Filter(minModlistSizeFilter) .Filter(maxModlistSizeFilter) @@ -218,7 +218,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL SelectedGameTypeEntry = null; GameTypeEntries = GetGameTypeEntries(); var nextEntry = GameTypeEntries.FirstOrDefault(gte => previousGameType == gte.GameIdentifier); - SelectedGameTypeEntry = nextEntry != default ? nextEntry : GameTypeEntries.FirstOrDefault(gte => GameType == ALL_GAME_IDENTIFIER); + SelectedGameTypeEntry = nextEntry ?? GameTypeEntries.FirstOrDefault(gte => GameType == ALL_GAME_IDENTIFIER); } _filteringOnGame = false; @@ -266,13 +266,20 @@ private async Task LoadModLists() using var ll = LoadingLock.WithLoading(); try { + var allowedTags = await _wjClient.LoadAllowedTags(); var modLists = await _wjClient.LoadLists(); + foreach (var modlist in modLists) + { + modlist.Tags = modlist.Tags.Where(t => allowedTags.Contains(t)).ToList(); + } + var httpClient = _serviceProvider.GetRequiredService(); + var cacheManager = _serviceProvider.GetRequiredService(); _modLists.Edit(e => { e.Clear(); e.AddOrUpdate(modLists.Select(m => new GalleryModListMetadataVM(_logger, this, m, _maintainer, _wjClient, _cancellationToken, - _serviceProvider.GetService(), _serviceProvider.GetService()))); + httpClient, cacheManager))); }); SmallestSizedModlist = null; LargestSizedModlist = null; diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 7e640940b..b7e9b7899 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -15,6 +15,10 @@ x:TypeArguments="local:ModListGalleryVM" mc:Ignorable="d"> + + + + @@ -69,7 +73,7 @@ - - - - - @@ -123,13 +115,14 @@ - - - @@ -180,7 +173,6 @@ Orientation="Vertical" Visibility="Collapsed"> - vm.OnlyInstalled, x => x.OnlyInstalledCheckbox.IsChecked) .DisposeWith(dispose); - this.BindStrict(ViewModel, vm => vm.IncludeNSFW, x => x.ShowNSFW.IsChecked) + this.BindStrict(ViewModel, vm => vm.IncludeNSFW, x => x.IncludeNSFW.IsChecked) .DisposeWith(dispose); - this.BindStrict(ViewModel, vm => vm.IncludeUnofficial, x => x.ShowUnofficialLists.IsChecked) + this.BindStrict(ViewModel, vm => vm.IncludeUnofficial, x => x.IncludeUnofficial.IsChecked) .DisposeWith(dispose); this.BindStrict(ViewModel, diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index f8fb2d204..de3b50bc5 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using System.Web; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Octokit; using Wabbajack.Common; using Wabbajack.DTOs; @@ -253,6 +254,15 @@ public async Task> LoadRepositories() return repositories!; } + public async Task> LoadAllowedTags() + { + var data = await _client.GetFromJsonAsync(_limiter, + new HttpRequestMessage(HttpMethod.Get, + "https://raw.githubusercontent.com/wabbajack-tools/mod-lists/refs/heads/master/allowed_tags.json"), + _dtos.Options); + return data!.ToHashSet(StringComparer.CurrentCultureIgnoreCase); + } + public Uri GetPatchUrl(Hash upgradeHash, Hash archiveHash) { return new Uri($"{_configuration.PatchBaseAddress}{upgradeHash.ToHex()}_{archiveHash.ToHex()}"); From 3bffb46582f508db1fa4085b7e1f1020ec1c1618 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:39:48 +0100 Subject: [PATCH 141/294] Fix reset filters command not working anymore, fix gallery being cut in two --- .../ViewModels/Gallery/ModListGalleryVM.cs | 6 +++--- Wabbajack.App.Wpf/Views/ModListGalleryView.xaml | 15 ++++++--------- .../Views/ModListGalleryView.xaml.cs | 4 ---- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index 993b575cb..2c58d9f9c 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -92,7 +92,7 @@ public GameTypeEntry SelectedGameTypeEntry private readonly CancellationToken _cancellationToken; private readonly IServiceProvider _serviceProvider; - public ICommand ClearFiltersCommand { get; set; } + public ICommand ResetFiltersCommand { get; set; } public ModListGalleryVM(ILogger logger, Client wjClient, GameLocator locator, SettingsManager settingsManager, ModListDownloadMaintainer maintainer, CancellationToken cancellationToken, IServiceProvider serviceProvider) @@ -107,14 +107,14 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL _cancellationToken = cancellationToken; _serviceProvider = serviceProvider; - ClearFiltersCommand = ReactiveCommand.Create( + ResetFiltersCommand = ReactiveCommand.Create( () => { OnlyInstalled = false; IncludeNSFW = false; IncludeUnofficial = false; Search = string.Empty; - SelectedGameTypeEntry = GameTypeEntries.FirstOrDefault(); + SelectedGameTypeEntry = GameTypeEntries?.FirstOrDefault(); }); this.WhenActivated(disposables => diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index b7e9b7899..b41ab9ec2 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -15,15 +15,11 @@ x:TypeArguments="local:ModListGalleryVM" mc:Ignorable="d"> - - - - - @@ -35,7 +31,7 @@ - + @@ -131,7 +127,7 @@ + Width="Auto" + Command="{Binding ResetFiltersCommand}"> - diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs index 160fa5243..a861e3e6c 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs @@ -74,10 +74,6 @@ public ModListGalleryView() vmProp => vmProp / Math.Pow(1024, 3), vProp => vProp * Math.Pow(1024, 3)) .DisposeWith(dispose); - - this.WhenAny(x => x.ViewModel.ClearFiltersCommand) - .BindToStrict(this, x => x.ClearFiltersButton.Command) - .DisposeWith(dispose); }); } } From c1ca35214c00ce8d162915dd367cf95bc9f473f6 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 27 Oct 2024 13:52:29 +0100 Subject: [PATCH 142/294] Add basic 'includes tag' filtering system --- Wabbajack.App.Wpf/Themes/Styles.xaml | 17 +++++ .../ViewModels/Gallery/ModListGalleryVM.cs | 69 +++++++++++++------ .../Views/ModListGalleryView.xaml | 38 ++++++---- .../Views/ModListGalleryView.xaml.cs | 13 ++++ 4 files changed, 103 insertions(+), 34 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 79632d17a..7e0ba4f86 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -4338,6 +4338,23 @@ + + diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index 2c58d9f9c..9f5023e4b 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -12,6 +12,7 @@ using DynamicData.Binding; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using ReactiveMarbles.ObservableEvents; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Wabbajack.Common; @@ -22,9 +23,38 @@ using Wabbajack.Services.OSIntegrated.Services; namespace Wabbajack; - public class ModListGalleryVM : BackNavigatingVM { + + public class Tag + { + public Tag(string name) + { + Name = name; + } + public string Name { get; set; } + public override string ToString() => Name; + } + + public class GameTypeEntry + { + public GameTypeEntry(GameMetaData gameMetaData, int amount) + { + GameMetaData = gameMetaData; + IsAllGamesEntry = gameMetaData == null; + GameIdentifier = IsAllGamesEntry ? ALL_GAME_IDENTIFIER : gameMetaData?.HumanFriendlyGameName; + Amount = amount; + FormattedName = IsAllGamesEntry ? $"{ALL_GAME_IDENTIFIER} ({Amount})" : $"{gameMetaData.HumanFriendlyGameName} ({Amount})"; + } + + public bool IsAllGamesEntry { get; set; } + public GameMetaData GameMetaData { get; private set; } + public int Amount { get; private set; } + public string FormattedName { get; private set; } + public string GameIdentifier { get; private set; } + public static GameTypeEntry GetAllGamesEntry(int amount) => new(null, amount); + } + public MainWindowVM MWVM { get; } private bool _savingSettings = false; @@ -48,28 +78,13 @@ public class ModListGalleryVM : BackNavigatingVM [Reactive] public string GameType { get; set; } [Reactive] public double MinModlistSize { get; set; } [Reactive] public double MaxModlistSize { get; set; } + [Reactive] public ObservableCollection AllowedTags { get; set; } + [Reactive] public ObservableCollection IncludedTags { get; set; } = new(); + [Reactive] public ObservableCollection ExcludedTags { get; set; } = new(); [Reactive] public GalleryModListMetadataVM SmallestSizedModlist { get; set; } [Reactive] public GalleryModListMetadataVM LargestSizedModlist { get; set; } - public class GameTypeEntry - { - public GameTypeEntry(GameMetaData gameMetaData, int amount) - { - GameMetaData = gameMetaData; - IsAllGamesEntry = gameMetaData == null; - GameIdentifier = IsAllGamesEntry ? ALL_GAME_IDENTIFIER : gameMetaData?.HumanFriendlyGameName; - Amount = amount; - FormattedName = IsAllGamesEntry ? $"{ALL_GAME_IDENTIFIER} ({Amount})" : $"{gameMetaData.HumanFriendlyGameName} ({Amount})"; - } - public bool IsAllGamesEntry { get; set; } - public GameMetaData GameMetaData { get; private set; } - public int Amount { get; private set; } - public string FormattedName { get; private set; } - public string GameIdentifier { get; private set; } - public static GameTypeEntry GetAllGamesEntry(int amount) => new(null, amount); - } - [Reactive] public ObservableCollection GameTypeEntries { get; set; } private bool _filteringOnGame; private GameTypeEntry _selectedGameTypeEntry = null; @@ -79,7 +94,7 @@ public GameTypeEntry SelectedGameTypeEntry get => _selectedGameTypeEntry; set { - RaiseAndSetIfChanged(ref _selectedGameTypeEntry, value == null ? GameTypeEntries?.FirstOrDefault(gte => gte.IsAllGamesEntry) : value); + RaiseAndSetIfChanged(ref _selectedGameTypeEntry, value ?? GameTypeEntries?.FirstOrDefault(gte => gte.IsAllGamesEntry)); GameType = _selectedGameTypeEntry?.GameIdentifier; } } @@ -190,6 +205,18 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL { return item => item.Metadata.DownloadMetadata.TotalSize <= maxModlistSize; }); + + var includedTagsFilter = IncludedTags.Events().CollectionChanged + .Throttle(TimeSpan.FromSeconds(0.05), RxApp.MainThreadScheduler) + .Select(v => v.NewItems?.Cast()) + .Select, Func>(includedTags => + { + if(!includedTags?.Any() ?? true) return _ => true; + + var tags = includedTags.Select(x => x.Name).ToHashSet(); + return item => item.Metadata.Tags.Any(tag => tags.Contains(tag)); + }) + .StartWith(_ => true); var searchSorter = this.WhenValueChanged(vm => vm.Search) @@ -207,6 +234,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL .Filter(gameFilter) .Filter(minModlistSizeFilter) .Filter(maxModlistSizeFilter) + .Filter(includedTagsFilter) .Sort(searchSorter) .TreatMovesAsRemoveAdd() .Bind(out _filteredModLists) @@ -272,6 +300,7 @@ private async Task LoadModLists() { modlist.Tags = modlist.Tags.Where(t => allowedTags.Contains(t)).ToList(); } + AllowedTags = new(allowedTags.Select(t => new Tag(t))); var httpClient = _serviceProvider.GetRequiredService(); var cacheManager = _serviceProvider.GetRequiredService(); _modLists.Edit(e => diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index b41ab9ec2..698cdb542 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -28,6 +28,7 @@ + @@ -64,7 +65,7 @@ - + @@ -89,18 +90,7 @@ - - - - - + @@ -126,9 +116,29 @@ Foreground="{StaticResource ComplementaryWhite25Brush}" Margin="0, 4, 0, 0" /> + + + + + + + vmProp / Math.Pow(1024, 3), vProp => vProp * Math.Pow(1024, 3)) .DisposeWith(dispose); + + /* + this.IncludesTagsFilter.Events().SelectionChanged + .Subscribe(args => + { + ViewModel.IncludedTags.AddRange(args.AddedItems.Cast()); + foreach(var tag in args.RemovedItems.Cast()) + ViewModel.IncludedTags.Remove(tag); + }) + .DisposeWith(dispose); + */ }); } } From 4b4d0bc0821423ca19619b42f8356d662f66ef36 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 2 Nov 2024 14:52:56 +0100 Subject: [PATCH 143/294] Tweak multi select listbox style --- Wabbajack.App.Wpf/Themes/Styles.xaml | 442 +++++++++++++++++- .../Views/ModListGalleryView.xaml | 23 +- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 1 + 3 files changed, 454 insertions(+), 12 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 7e0ba4f86..61ab1d796 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -10,7 +10,8 @@ xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:wj="clr-namespace:Wabbajack" xmlns:ic="clr-namespace:FluentIcons.WPF;assembly=FluentIcons.WPF" - xmlns:math="http://hexinnovation.com/math" + xmlns:generic="http://schemas.sdl.com/xaml" + xmlns:math="http://hexinnovation.com/math" xmlns:controls="http://schemas.sdl.com/xaml" mc:Ignorable="d"> pack://application:,,,/Resources/Fonts/#Gabarito @@ -28,7 +29,6 @@ - #222531 #2A2B41 @@ -41,6 +41,8 @@ #514c6b #E5E5E8 + #40FFFFFF + #3b3c50 #D9BBF9 @@ -194,7 +196,7 @@ - + @@ -209,7 +211,7 @@ - + @@ -239,7 +241,7 @@ - + @@ -516,7 +518,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 698cdb542..dcfd18cc5 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -10,6 +10,7 @@ xmlns:rxui="http://reactiveui.net" xmlns:system="clr-namespace:System;assembly=mscorlib" xmlns:ic="clr-namespace:FluentIcons.WPF;assembly=FluentIcons.WPF" + xmlns:sdl="http://schemas.sdl.com/xaml" d:DesignHeight="450" d:DesignWidth="900" x:TypeArguments="local:ModListGalleryVM" @@ -117,9 +118,9 @@ @@ -127,6 +128,7 @@ VerticalAlignment="Center" /> + + + + + + + From 9399d99bf672ed24137011c9d2ae317e9e444155 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 2 Nov 2024 17:07:42 +0100 Subject: [PATCH 144/294] Make the new tag filter work --- Wabbajack.App.Wpf/Themes/Styles.xaml | 2 +- Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs | 1 + Wabbajack.App.Wpf/Views/ModListGalleryView.xaml | 6 ++---- Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs | 9 +++++++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 61ab1d796..e55e24a32 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -4621,7 +4621,7 @@ - + diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index 9f5023e4b..c0947708b 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -108,6 +108,7 @@ public GameTypeEntry SelectedGameTypeEntry private readonly IServiceProvider _serviceProvider; public ICommand ResetFiltersCommand { get; set; } + public ICommand HasTagsChangedCommand { get; set; } public ModListGalleryVM(ILogger logger, Client wjClient, GameLocator locator, SettingsManager settingsManager, ModListDownloadMaintainer maintainer, CancellationToken cancellationToken, IServiceProvider serviceProvider) diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index dcfd18cc5..2246b5b27 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -141,18 +141,16 @@ - + /> vmProp / Math.Pow(1024, 3), vProp => vProp * Math.Pow(1024, 3)) .DisposeWith(dispose); + + this.HasTagsFilter.Events().SelectedItemsChanged + .Subscribe(args => + { + ViewModel.IncludedTags.AddRange(args.Added.Cast()); + foreach(var tag in args.Removed.Cast()) + ViewModel.IncludedTags.Remove(tag); + }) + .DisposeWith(dispose); /* this.IncludesTagsFilter.Events().SelectionChanged From 2c3942537097fbee75f9542ed6a88a88758e4e39 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 2 Nov 2024 17:38:02 +0100 Subject: [PATCH 145/294] Fix tag filtering system so it works again --- .../Gallery/BaseModListMetadataVM.cs | 10 +- .../ViewModels/Gallery/ModListGalleryVM.cs | 45 +++--- .../Views/ModListGalleryView.xaml | 147 +++++++++--------- .../Views/ModListGalleryView.xaml.cs | 6 +- 4 files changed, 101 insertions(+), 107 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs index e8df662ad..f2da71ca7 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Reactive.Disposables; using System.Reactive.Linq; @@ -30,6 +31,7 @@ public ModListTag(string name) } public string Name { get; } + public override string ToString() => Name; } public class BaseModListMetadataVM : ViewModel @@ -41,7 +43,7 @@ public class BaseModListMetadataVM : ViewModel public LoadingLock LoadingImageLock { get; } = new(); [Reactive] - public List ModListTagList { get; protected set; } + public HashSet ModListTagList { get; protected set; } [Reactive] public Percent ProgressPercent { get; protected set; } @@ -105,14 +107,10 @@ public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, GameMetaData = Metadata.Game.MetaData(); Location = LauncherUpdater.CommonFolder.Value.Combine("downloaded_mod_lists", Metadata.NamespacedName).WithExtension(Ext.Wabbajack); - ModListTagList = new List(); UpdateStatus().FireAndForget(); - Metadata.Tags.ForEach(tag => - { - ModListTagList.Add(new ModListTag(tag)); - }); + ModListTagList = Metadata.Tags?.Select(tag => new ModListTag(tag)).ToHashSet(); ModListTagList.Add(new ModListTag(GameMetaData.HumanFriendlyGameName)); DownloadSizeText = "Download size: " + UIUtils.FormatBytes(Metadata.DownloadMetadata.SizeOfArchives); diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index c0947708b..ebe406c23 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Collections.Specialized; using System.Linq; using System.Net.Http; using System.Reactive.Disposables; @@ -25,17 +26,6 @@ namespace Wabbajack; public class ModListGalleryVM : BackNavigatingVM { - - public class Tag - { - public Tag(string name) - { - Name = name; - } - public string Name { get; set; } - public override string ToString() => Name; - } - public class GameTypeEntry { public GameTypeEntry(GameMetaData gameMetaData, int amount) @@ -78,9 +68,8 @@ public GameTypeEntry(GameMetaData gameMetaData, int amount) [Reactive] public string GameType { get; set; } [Reactive] public double MinModlistSize { get; set; } [Reactive] public double MaxModlistSize { get; set; } - [Reactive] public ObservableCollection AllowedTags { get; set; } - [Reactive] public ObservableCollection IncludedTags { get; set; } = new(); - [Reactive] public ObservableCollection ExcludedTags { get; set; } = new(); + [Reactive] public ObservableCollection AllTags { get; set; } + [Reactive] public ObservableCollection HasTags { get; set; } = new(); [Reactive] public GalleryModListMetadataVM SmallestSizedModlist { get; set; } [Reactive] public GalleryModListMetadataVM LargestSizedModlist { get; set; } @@ -108,7 +97,6 @@ public GameTypeEntry SelectedGameTypeEntry private readonly IServiceProvider _serviceProvider; public ICommand ResetFiltersCommand { get; set; } - public ICommand HasTagsChangedCommand { get; set; } public ModListGalleryVM(ILogger logger, Client wjClient, GameLocator locator, SettingsManager settingsManager, ModListDownloadMaintainer maintainer, CancellationToken cancellationToken, IServiceProvider serviceProvider) @@ -207,15 +195,18 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL return item => item.Metadata.DownloadMetadata.TotalSize <= maxModlistSize; }); - var includedTagsFilter = IncludedTags.Events().CollectionChanged - .Throttle(TimeSpan.FromSeconds(0.05), RxApp.MainThreadScheduler) - .Select(v => v.NewItems?.Cast()) - .Select, Func>(includedTags => + var includedTagsFilter = HasTags.Events().CollectionChanged + .Select>(args => { - if(!includedTags?.Any() ?? true) return _ => true; + var oldItems = args.OldItems?.Cast().ToList() ?? new List(); + var newItems = args.NewItems?.Cast().ToList() ?? new List(); + if (args.Action == NotifyCollectionChangedAction.Remove && oldItems.Count == 1) + return _ => true; + + var filteredTags = oldItems.Concat(newItems).Select(x => x.Name).ToHashSet(); + if(!filteredTags?.Any() ?? true) return _ => true; - var tags = includedTags.Select(x => x.Name).ToHashSet(); - return item => item.Metadata.Tags.Any(tag => tags.Contains(tag)); + return item => filteredTags.All(tag => item.Metadata.Tags.Contains(tag)); }) .StartWith(_ => true); @@ -296,14 +287,16 @@ private async Task LoadModLists() try { var allowedTags = await _wjClient.LoadAllowedTags(); + allowedTags.Add("NSFW"); + AllTags = new(allowedTags.Select(t => new ModListTag(t))); var modLists = await _wjClient.LoadLists(); + var httpClient = _serviceProvider.GetRequiredService(); + var cacheManager = _serviceProvider.GetRequiredService(); foreach (var modlist in modLists) { - modlist.Tags = modlist.Tags.Where(t => allowedTags.Contains(t)).ToList(); + modlist.Tags = modlist.Tags.Where(allowedTags.Contains).ToList(); + if (modlist.NSFW) modlist.Tags.Add("NSFW"); } - AllowedTags = new(allowedTags.Select(t => new Tag(t))); - var httpClient = _serviceProvider.GetRequiredService(); - var cacheManager = _serviceProvider.GetRequiredService(); _modLists.Edit(e => { e.Clear(); diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 2246b5b27..9f02333d9 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -20,30 +20,31 @@ - + - - - - - - - - - - - - + + + + + + + + + + + - - - - - + + - - - - + + + - - - - - - - - - + + + + + + + + + - - - + + - - + - - - + + - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - + - - - + - - - - + + - + - - - + + + diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs index c20189d50..2933857f9 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs @@ -80,9 +80,9 @@ public ModListGalleryView() this.HasTagsFilter.Events().SelectedItemsChanged .Subscribe(args => { - ViewModel.IncludedTags.AddRange(args.Added.Cast()); - foreach(var tag in args.Removed.Cast()) - ViewModel.IncludedTags.Remove(tag); + ViewModel.HasTags.AddRange(args.Added.Cast()); + foreach(var tag in args.Removed.Cast()) + ViewModel.HasTags.Remove(tag); }) .DisposeWith(dispose); From 11067948e4482d9881cc9f1083f81ce1ec68f801 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 2 Nov 2024 18:00:14 +0100 Subject: [PATCH 146/294] Fix tags filter still not working perfectly when using multiple tags --- .../ViewModels/Gallery/ModListGalleryVM.cs | 17 ++++++----------- .../Views/ModListGalleryView.xaml.cs | 4 +--- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index ebe406c23..6521a8d69 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -195,18 +195,13 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL return item => item.Metadata.DownloadMetadata.TotalSize <= maxModlistSize; }); - var includedTagsFilter = HasTags.Events().CollectionChanged - .Select>(args => + var includedTagsFilter = this.ObservableForProperty(vm => vm.HasTags) + .Select(v => v.Value) + .Select, Func>(filteredTags => { - var oldItems = args.OldItems?.Cast().ToList() ?? new List(); - var newItems = args.NewItems?.Cast().ToList() ?? new List(); - if (args.Action == NotifyCollectionChangedAction.Remove && oldItems.Count == 1) - return _ => true; - - var filteredTags = oldItems.Concat(newItems).Select(x => x.Name).ToHashSet(); if(!filteredTags?.Any() ?? true) return _ => true; - return item => filteredTags.All(tag => item.Metadata.Tags.Contains(tag)); + return item => filteredTags.All(tag => item.Metadata.Tags.Contains(tag.Name)); }) .StartWith(_ => true); @@ -287,8 +282,7 @@ private async Task LoadModLists() try { var allowedTags = await _wjClient.LoadAllowedTags(); - allowedTags.Add("NSFW"); - AllTags = new(allowedTags.Select(t => new ModListTag(t))); + AllTags = new(allowedTags.Select(t => new ModListTag(t)).OrderBy(t => t.Name).Prepend(new ModListTag("NSFW")).Prepend(new ModListTag("Featured"))); var modLists = await _wjClient.LoadLists(); var httpClient = _serviceProvider.GetRequiredService(); var cacheManager = _serviceProvider.GetRequiredService(); @@ -296,6 +290,7 @@ private async Task LoadModLists() { modlist.Tags = modlist.Tags.Where(allowedTags.Contains).ToList(); if (modlist.NSFW) modlist.Tags.Add("NSFW"); + if (modlist.Official) modlist.Tags.Add("Featured"); } _modLists.Edit(e => { diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs index 2933857f9..e862822d2 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml.cs @@ -80,9 +80,7 @@ public ModListGalleryView() this.HasTagsFilter.Events().SelectedItemsChanged .Subscribe(args => { - ViewModel.HasTags.AddRange(args.Added.Cast()); - foreach(var tag in args.Removed.Cast()) - ViewModel.HasTags.Remove(tag); + ViewModel.HasTags = new(HasTagsFilter.SelectedItems.Cast()); }) .DisposeWith(dispose); From f8294f93677edcf1107b41a5840ab10589b83d39 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 9 Nov 2024 11:54:06 +0100 Subject: [PATCH 147/294] Prepare some stuff for gallery mod search --- Wabbajack.App.Wpf/Themes/Styles.xaml | 35 ++++++++++++---- .../Gallery/BaseModListMetadataVM.cs | 2 + .../ViewModels/Gallery/ModListGalleryVM.cs | 42 +++++++++++-------- .../ViewModels/ModListDetailsVM.cs | 4 +- .../Views/ModListDetailsView.xaml | 28 +++++++++++-- .../Client.cs | 2 +- 6 files changed, 80 insertions(+), 33 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index e55e24a32..e733bf7f6 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -87,15 +87,15 @@ #FCBB86 - #FF3700B3 + #FF222531 - #CC868CFC + #CCD8BAF8 - #99868CFC + #99D8BAF8 - #66868CFC + #66D8BAF8 - #33868CFC + #33D8BAF8 - - + + + @@ -135,12 +152,12 @@ + x:Name="DGR_Border" + Background="{TemplateBinding Background}" + BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="0" + CornerRadius="{TemplateBinding Border.CornerRadius}" + SnapsToDevicePixels="True"> @@ -151,27 +168,34 @@ + ItemsPanel="{TemplateBinding ItemsPanel}" + SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" + Margin="8, 0, 8, 0" /> + SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" + Visibility="{TemplateBinding DetailsVisibility}" /> + SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" + Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> - - + + - + - + @@ -183,11 +207,13 @@ - + - + @@ -197,13 +223,15 @@ - + + \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs index c94a6324f..4d5939dc3 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs @@ -8,18 +8,22 @@ using System.Diagnostics; using Wabbajack.DTOs; using Wabbajack.DTOs.DownloadStates; +using System.Reactive.Linq; +using System.Reactive.Concurrency; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Web.WebView2.Wpf; +using System.Windows.Controls; namespace Wabbajack; public partial class ModListDetailsView { - public ModListDetailsView() { InitializeComponent(); this.WhenActivated(disposables => { - this.BindStrict(ViewModel, x => x.Archives, x => x.ArchiveGrid.ItemsSource) + this.BindStrict(ViewModel, x => x.Archives, x => x.ArchivesDataGrid.ItemsSource) .DisposeWith(disposables); this.BindStrict(ViewModel, x => x.Search, x => x.SearchBox.Text) @@ -27,6 +31,61 @@ public ModListDetailsView() this.BindCommand(ViewModel, x => x.BackCommand, x => x.BackButton) .DisposeWith(disposables); + + this.WhenAnyValue(x => x.ArchivesButton.IsChecked) + .Select(x => !x) + .BindToStrict(this, x => x.ReadmeButton.IsChecked) + .DisposeWith(disposables); + + this.WhenAnyValue(x => x.ReadmeButton.IsChecked) + .Select(x => !x) + .BindToStrict(this, x => x.ArchivesButton.IsChecked) + .DisposeWith(disposables); + + this.WhenAnyValue(x => x.ArchivesButton.IsChecked) + .Select(x => x ?? false ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, x => x.ArchivesDataGrid.Visibility) + .DisposeWith(disposables); + + this.WhenAnyValue(x => x.ReadmeButton.IsChecked) + .Select(x => x ?? false ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, x => x.ViewModel.Browser.Visibility) + .DisposeWith(disposables); + + this.WhenAnyValue(x => x.ViewModel.MetadataVM.Metadata.Links.Readme) + .Select(readme => + { + try + { + if(readme.Contains("raw.githubusercontent.com") && readme.EndsWith(".md")) + { + var urlParts = readme.Split('/'); + var user = urlParts[3]; + var repository = urlParts[4]; + var branch = urlParts[5]; + var fileName = urlParts[6]; + return new Uri($"https://github.com/{user}/{repository}/blob/{branch}/{fileName}#{repository}"); + } + return new Uri(readme); + } + catch (Exception) + { + return default; + } + }) + .BindToStrict(this, x => x.ViewModel.Browser.Source) + .DisposeWith(disposables); + + RxApp.MainThreadScheduler.Schedule(() => + { + if (ViewModel.Browser.Parent != null) + { + ((Panel)ViewModel.Browser.Parent).Children.Remove(ViewModel.Browser); + } + ArchivesGrid.Children.Add(ViewModel.Browser); + Grid.SetRow(ViewModel.Browser, 1); + }); + }); } @@ -42,8 +101,8 @@ private void DataGridRow_GotFocus(object sender, RoutedEventArgs e) { FocusManager.SetFocusedElement(FocusManager.GetFocusScope(presenter), null); Keyboard.ClearFocus(); - ArchiveGrid.SelectedItem = null; - ArchiveGrid.CurrentItem = null; + ArchivesDataGrid.SelectedItem = null; + ArchivesDataGrid.CurrentItem = null; return Disposable.Empty; }); } diff --git a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml index 7c077087c..ad63e63ac 100644 --- a/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListGalleryView.xaml @@ -22,8 +22,8 @@ + HorizontalAlignment="Left" + VerticalAlignment="Stretch"> @@ -37,32 +37,33 @@ + x:Name="SearchBox" + mahapps:TextBoxHelper.Watermark="Search for a modlist..." /> + Background="{StaticResource ComplementaryPrimary08Brush}" HorizontalAlignment="Right"> + Foreground="{StaticResource PrimaryBrush}" /> + Grid.Row="1" + Margin="0, 12, 0, 0" + VerticalAlignment="Center" + ItemsSource="{Binding GameTypeEntries, Mode=TwoWay}" + SelectedItem="{Binding SelectedGameTypeEntry, Mode=TwoWay}" + IsSynchronizedWithCurrentItem="True" + ToolTip="Filter modlists on game"> + VerticalAlignment="Center"> - + @@ -71,22 +72,22 @@ + Padding="0, 12, 0, 12"> + Margin="12, 0, 0, 12" + VerticalAlignment="Center" + Foreground="{StaticResource ForegroundBrush}" + Background="{StaticResource BackgroundBrush}" + ToolTip="Show modlists that have not been tested to provide a stable experience with official support channels. More info about featured modlists is available on the Wabbajack wiki."> + Margin="12, 0, 0, 0" + VerticalAlignment="Center" + Foreground="{StaticResource ForegroundBrush}" + Background="{StaticResource BackgroundBrush}" + ToolTip="Show modlists that include NSFW frameworks."> @@ -105,18 +106,18 @@ + x:Name="SizeSliderFilter" + MinRangeWidth="3" AutoToolTipPlacement="TopLeft" AutoToolTipPrecision="1" + mahapps:SliderHelper.TrackValueFillBrush="{StaticResource PrimaryBrush}" + mahapps:SliderHelper.ThumbFillBrush="{StaticResource PrimaryBrush}" + mahapps:SliderHelper.ThumbFillHoverBrush="{StaticResource PrimaryBrush}" + mahapps:SliderHelper.ThumbFillPressedBrush="{StaticResource PrimaryBrush}" /> + Text="{Binding ElementName=SizeSliderFilter, Path=Minimum, Converter={StaticResource MathConverter}, ConverterParameter='Round(x,1)', StringFormat={}{0} GB}" + Foreground="{StaticResource ComplementaryWhite25Brush}" Margin="0, 4, 0, 0" /> + Text="{Binding ElementName=SizeSliderFilter, Path=Maximum, Converter={StaticResource MathConverter}, ConverterParameter='Round(x,1)', StringFormat={}{0} GB}" + Foreground="{StaticResource ComplementaryWhite25Brush}" Margin="0, 4, 0, 0" /> @@ -129,7 +130,7 @@ Background="{StaticResource ComplementaryPrimary08Brush}" Style="{StaticResource TagsBox}" /> - + + Grid.Row="6" + x:Name="OnlyInstalledCheckbox" + Margin="0, 24, 0, 0" + VerticalAlignment="Center" + Foreground="{StaticResource ForegroundBrush}" + ToolTip="Show only modlists for games you have installed on your PC"> + VerticalAlignment="Center" /> + x:Name="ResetFiltersButton" + Margin="0, 24, 0, 0" + Grid.Row="7" + ToolTip="Reset filters to the default options" + VerticalAlignment="Bottom" + HorizontalAlignment="Stretch" + HorizontalContentAlignment="Center" + Icon="FilterDismiss" + Text="Reset filters" + Width="Auto" + Command="{Binding ResetFiltersCommand}"> From 6bed7d5518c26b6341adce25069dd4ec18325cde Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 16 Nov 2024 09:47:54 +0100 Subject: [PATCH 156/294] Add floating window functionality, add it to modlist details view --- .../Messages/ShowFloatingWindow.cs | 26 +++++++++++ .../Gallery/GalleryModListMetadataVM.cs | 2 +- Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 16 +++++++ .../ViewModels/ModListDetailsVM.cs | 2 +- Wabbajack.App.Wpf/Views/MainWindow.xaml | 13 +++++- Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 44 +++++++++++++------ 6 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs diff --git a/Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs b/Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs new file mode 100644 index 000000000..a49212321 --- /dev/null +++ b/Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs @@ -0,0 +1,26 @@ +using ReactiveUI; + +namespace Wabbajack.Messages; + +public enum FloatingScreenType +{ + None, + ModListDetails, +} + +public class ShowFloatingWindow +{ + + public FloatingScreenType Screen { get; } + + private ShowFloatingWindow(FloatingScreenType screen) + { + Screen = screen; + } + + public static void Send(FloatingScreenType screen) + { + MessageBus.Current.SendMessage(new ShowFloatingWindow(screen)); + } + +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs index 34bd6e29d..887b69334 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs @@ -50,7 +50,7 @@ public GalleryModListMetadataVM(ILogger logger, ModListGalleryVM parent, Modlist // https://www.wabbajack.org/modlist/wj-featured/aldrnari DetailsCommand = ReactiveCommand.Create(() => { LoadModlistForDetails.Send(this); - NavigateToGlobal.Send(ScreenType.ModListDetails); + ShowFloatingWindow.Send(FloatingScreenType.ModListDetails); }); OpenWebsiteCommand = ReactiveCommand.Create(() => UIUtils.OpenWebsite(new Uri($"https://www.wabbajack.org/modlist/{Metadata.NamespacedName}"))); diff --git a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index 8b65ffb37..c94ff68db 100644 --- a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -39,6 +39,9 @@ public class MainWindowVM : ViewModel [Reactive] public ViewModel ActivePane { get; private set; } + [Reactive] + public ViewModel? ActiveFloatingPane { get; private set; } = null; + [Reactive] public NavigationVM NavigationVM { get; private set; } @@ -134,6 +137,10 @@ public MainWindowVM(ILogger logger, Client wjClient, .Subscribe((_) => NavigationVisible = false) .DisposeWith(CompositeDisposable); + MessageBus.Current.Listen() + .Subscribe(m => HandleShowFloatingWindow(m.Screen)) + .DisposeWith(CompositeDisposable); + _resourceMonitor.Updates .Select(r => string.Join(", ", r.Where(r => r.Throughput > 0) .Select(s => $"{s.Name} - {s.Throughput.ToFileSizeString()}/s"))) @@ -269,6 +276,15 @@ private void HandleNavigateTo(ScreenType s) _ => ActivePane }; } + private void HandleShowFloatingWindow(FloatingScreenType s) + { + ActiveFloatingPane = s switch + { + FloatingScreenType.None => null, + FloatingScreenType.ModListDetails => ModListDetailsVM, + _ => ActiveFloatingPane + }; + } private static bool IsStartingFromModlist(out AbsolutePath modlistPath) diff --git a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs index 5c7899b99..973461a31 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs @@ -65,7 +65,7 @@ public ModListDetailsVM(ILogger logger, IServiceProvider servi OpenWebsiteCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.WebsiteURL) { UseShellExecute = true }), this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.WebsiteURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); OpenDiscordCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.DiscordURL) { UseShellExecute = true }), this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.DiscordURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); - BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(ScreenType.ModListGallery)); + BackCommand = ReactiveCommand.Create(() => ShowFloatingWindow.Send(FloatingScreenType.None)); this.WhenActivated(disposables => { diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index a24b01201..a49d4c75c 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -32,6 +32,18 @@ + + + + + + + + + + + + @@ -148,7 +160,6 @@ - diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index 158cc7b26..349705f0d 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -17,6 +17,7 @@ using Wabbajack.Util; using ReactiveMarbles.ObservableEvents; using System.Reactive; +using System.Diagnostics; namespace Wabbajack; @@ -28,6 +29,7 @@ public partial class MainWindow : MetroWindow private MainWindowVM _mwvm; private readonly ILogger _logger; private readonly SystemParametersConstructor _systemParams; + private readonly Stopwatch _mousePressedTimer; public MainWindow(ILogger logger, SystemParametersConstructor systemParams, LauncherUpdater updater, MainWindowVM vm) { @@ -36,6 +38,8 @@ public MainWindow(ILogger logger, SystemParametersConstructor system DataContext = vm; _logger = logger; _systemParams = systemParams; + _mousePressedTimer = new Stopwatch(); + try { // Wire any unhandled crashing exceptions to log before exiting @@ -181,14 +185,15 @@ public MainWindow(ILogger logger, SystemParametersConstructor system .Subscribe(v => NavigationColumn.Width = v ? new GridLength(115, GridUnitType.Pixel) : new GridLength(0, GridUnitType.Pixel)); TitleBar.Events().MouseDown - .Subscribe(x => UIElement_OnMouseDown(this, x)); + .Subscribe(x => TitleBar_OnMouseDown(this, x)); + + FloatingWindowBackground.Events().MouseDown + .Subscribe(x => FloatingWindowBackground_OnMouseDown(this, x)); + + vm.WhenAnyValue(vm => vm.ActiveFloatingPane) + .Select(x => x == null ? Visibility.Hidden : Visibility.Visible) + .BindTo(this, view => view.FloatingWindow.Visibility); - /* - ((MainWindowVM)DataContext).WhenAnyValue(vm => vm.Installer.InstallState) - .ObserveOn(RxApp.MainThreadScheduler) - .Select(v => v == InstallState.Installing ? Visibility.Collapsed : Visibility.Visible) - .BindTo(this, view => view.SettingsButton.Visibility); - */ } catch (Exception ex) @@ -197,10 +202,6 @@ public MainWindow(ILogger logger, SystemParametersConstructor system Environment.Exit(-1); } - /* - vm.WhenAnyValue(vm => vm.ResourceStatus) - .BindToStrict(this, view => view.ResourceUsage.Text); - */ vm.WhenAnyValue(vm => vm.WindowTitle) .BindToStrict(this, view => view.AppName.Text); @@ -211,9 +212,26 @@ private void Window_Closing(object sender, CancelEventArgs e) _mwvm.ShutdownApplication().Wait(); } - private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e) + private void TitleBar_OnMouseDown(object sender, MouseButtonEventArgs e) + { + DragMove(); + } + + private void FloatingWindowBackground_OnMouseDown(object sender, MouseButtonEventArgs x) { - this.DragMove(); + if (x.ButtonState == MouseButtonState.Pressed) + { + _mousePressedTimer.Restart(); + DragMove(); + } + if(x.ButtonState == MouseButtonState.Released) + { + if(_mousePressedTimer.Elapsed < TimeSpan.FromSeconds(0.2)) + { + ShowFloatingWindow.Send(FloatingScreenType.None); + } + _mousePressedTimer.Stop(); + } } } From fa4e9071b11cde0e6247ab0fce3428c40cfe73a9 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 16 Nov 2024 17:09:39 +0100 Subject: [PATCH 157/294] Add open in browser button when in modlist details readme tab --- Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs | 9 +++++++-- Wabbajack.App.Wpf/Views/MainWindow.xaml | 2 +- Wabbajack.App.Wpf/Views/ModListDetailsView.xaml | 15 +++++++++++++-- .../Views/ModListDetailsView.xaml.cs | 15 +++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs index 973461a31..b7421df40 100644 --- a/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/ModListDetailsVM.cs @@ -48,6 +48,7 @@ public class ModListDetailsVM : BackNavigatingVM public ICommand OpenWebsiteCommand { get; set; } public ICommand OpenDiscordCommand { get; set; } + public ICommand OpenReadmeCommand { get; set; } public WebView2 Browser { get; set; } @@ -62,8 +63,12 @@ public ModListDetailsVM(ILogger logger, IServiceProvider servi .Subscribe(msg => MetadataVM = msg.MetadataVM) .DisposeWith(CompositeDisposable); - OpenWebsiteCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.WebsiteURL) { UseShellExecute = true }), this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.WebsiteURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); - OpenDiscordCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.DiscordURL) { UseShellExecute = true }), this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.DiscordURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); + OpenWebsiteCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.WebsiteURL) { UseShellExecute = true }), + this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.WebsiteURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); + OpenDiscordCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.DiscordURL) { UseShellExecute = true }), + this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.DiscordURL, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); + OpenReadmeCommand = ReactiveCommand.Create(() => Process.Start(new ProcessStartInfo(MetadataVM.Metadata.Links.Readme) { UseShellExecute = true }), + this.WhenAnyValue(x => x.MetadataVM.Metadata.Links.Readme, x => !string.IsNullOrEmpty(x)).ObserveOnGuiThread()); BackCommand = ReactiveCommand.Create(() => ShowFloatingWindow.Send(FloatingScreenType.None)); this.WhenActivated(disposables => diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index a49d4c75c..a98aac204 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -34,7 +34,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml index 0efa8c25d..15564f9a1 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -110,7 +110,8 @@ HorizontalAlignment="Right" Margin="0, 0, 48, 16" /> - - + + + - + + + + + + + - - - - - + + + - - - + + + - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs index 0e1a664f6..7caaf8c29 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs @@ -97,8 +97,7 @@ public ModListDetailsView() { ((Panel)ViewModel.Browser.Parent).Children.Remove(ViewModel.Browser); } - ArchivesGrid.Children.Add(ViewModel.Browser); - Grid.SetRow(ViewModel.Browser, 1); + MainContentGrid.Children.Add(ViewModel.Browser); }); }); From e635a1ff80613de1f051c51599be74e93077a88a Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 17 Nov 2024 12:44:00 +0100 Subject: [PATCH 164/294] Add rounded corners to autocomplete listbox controls --- Wabbajack.App.Wpf/Themes/Styles.xaml | 72 +++++++++++++++++----------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 350a22a24..9090682cb 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -4776,35 +4776,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From cd67a511991cf1cbf7e37b5d86321d7ab9bcdc59 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 17 Nov 2024 17:48:55 +0100 Subject: [PATCH 165/294] Make ESC close floating windows, adjust button sizes --- Wabbajack.App.Wpf/Views/Common/WizardButton.xaml | 6 +++--- Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml b/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml index 0a374896d..60f4adf2a 100644 --- a/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml +++ b/Wabbajack.App.Wpf/Views/Common/WizardButton.xaml @@ -8,10 +8,10 @@ xmlns:ic="clr-namespace:FluentIcons.WPF;assembly=FluentIcons.WPF" x:TypeArguments="local:ViewModel" ClipToBounds="True" - d:DesignHeight="48" + d:DesignHeight="38" d:DesignWidth="200" Width="200" - Height="48" + Height="38" mc:Ignorable="d"> diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index 349705f0d..85bb2bcf9 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -194,6 +194,8 @@ public MainWindow(ILogger logger, SystemParametersConstructor system .Select(x => x == null ? Visibility.Hidden : Visibility.Visible) .BindTo(this, view => view.FloatingWindow.Visibility); + this.Events().KeyDown + .Subscribe(x => HandleKeyDown(this, x)); } catch (Exception ex) @@ -234,4 +236,13 @@ private void FloatingWindowBackground_OnMouseDown(object sender, MouseButtonEven } } + private void HandleKeyDown(MainWindow mainWindow, KeyEventArgs x) + { + if(x.Key == Key.Escape) + { + if (((MainWindowVM)DataContext).ActiveFloatingPane != null) + ShowFloatingWindow.Send(FloatingScreenType.None); + } + } + } From 79211430aaadd3a2fb5d6c095d1c328e02817a43 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 18 Nov 2024 20:46:42 +0100 Subject: [PATCH 166/294] Fix load compiler settings button not working, fix compiled modlist tile coloring --- .../ViewModels/Compiler/CompilerHomeVM.cs | 4 +- .../Compiler/CompiledModListTileView.xaml | 40 ++++++++++++++++--- .../Views/Compiler/CompilerHomeView.xaml | 4 +- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs index 94f14c4e5..d834a87d8 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs @@ -31,8 +31,8 @@ public class CompilerHomeVM : ViewModel private readonly DTOSerializer _dtos; private readonly CompilerSettingsInferencer _inferencer; - public ICommand NewModlistCommand { get; set; } - public ICommand LoadSettingsCommand { get; set; } + [Reactive] public ICommand NewModlistCommand { get; set; } + [Reactive] public ICommand LoadSettingsCommand { get; set; } [Reactive] public ObservableCollection CompiledModLists { get; set; } diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml index 151ef3d6a..024bd4d45 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml @@ -12,15 +12,25 @@ d:DesignWidth="800" x:TypeArguments="local:CompiledModListTileVM" mc:Ignorable="d"> - + - + + + + @@ -137,8 +147,28 @@ - - - + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml index 35e071aac..33f4ba6b3 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerHomeView.xaml @@ -29,7 +29,7 @@ - + @@ -42,7 +42,7 @@ - + From 3af4462e028d4989782267ba39b4814036359197 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:28:46 +0100 Subject: [PATCH 167/294] Fix listbox color, add icons for BG3 and Starfield --- Wabbajack.App.Wpf/Themes/Styles.xaml | 4 ++-- .../Views/Compiler/CompiledModListTileView.xaml | 2 +- Wabbajack.DTOs/Game/GameRegistry.cs | 9 ++++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 9090682cb..273b847fd 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -249,7 +249,7 @@ - + @@ -1379,7 +1379,7 @@ diff --git a/Wabbajack.DTOs/Game/GameRegistry.cs b/Wabbajack.DTOs/Game/GameRegistry.cs index 78facebde..30dbe96fe 100644 --- a/Wabbajack.DTOs/Game/GameRegistry.cs +++ b/Wabbajack.DTOs/Game/GameRegistry.cs @@ -612,7 +612,7 @@ public static class GameRegistry @"End\Binaries\Win64\ff7remake_.exe".ToRelativePath(), @"ff7remake_.exe".ToRelativePath() }, - MainExecutable = @"End\Binaries\Win64\ff7remake_.exe".ToRelativePath() + MainExecutable = @"End\Binaries\Win64\ff7remake_.exe".ToRelativePath(), } }, { @@ -630,7 +630,9 @@ public static class GameRegistry { @"bin/bg3.exe".ToRelativePath() }, - MainExecutable = @"bin/bg3.exe".ToRelativePath() + MainExecutable = @"bin/bg3.exe".ToRelativePath(), + IconSource = "https://cdn2.steamgriddb.com/icon/cdb3fcd3d3fde62fe3b549a90793467e.png" + } }, { @@ -646,7 +648,8 @@ public static class GameRegistry { @"Starfield.exe".ToRelativePath() }, - MainExecutable = @"Starfield.exe".ToRelativePath() + MainExecutable = @"Starfield.exe".ToRelativePath(), + IconSource = "https://cdn2.steamgriddb.com/icon/1a495bc86abe171f690e27192ea6c367.png" } }, { From 61722d4d4c818ee8f186ede7ec69124159c5ddd5 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:17:13 +0100 Subject: [PATCH 168/294] Manual merge work --- Wabbajack.App.Wpf/App.xaml.cs | 3 +- .../LoginManagers/NexusLoginManager.cs | 2 +- .../ViewModels/Compiler/CompilerMainVM.cs | 51 ++++++++++++++++--- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 1 + 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 2c5c280f2..c62c4e182 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -191,7 +191,8 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) //Disabled LL because it is currently not used and broken due to the way LL butchers their API //services.AddAllSingleton(); services.AddAllSingleton(); - services.AddAllSingleton(); + //Disabled VP due to frequent login issues & because the only file that really got downloaded there has a mirror + //services.AddAllSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs index 27ff83543..ca7437c5c 100644 --- a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs @@ -39,7 +39,7 @@ public NexusLoginManager(ILogger logger, ITokenProvider await RefreshTokenState()); + Task.Run(RefreshTokenState); ClearLogin = ReactiveCommand.CreateFromTask(async () => { diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index 433557b14..493103f5d 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -25,6 +25,9 @@ using Wabbajack.Paths; using Wabbajack.Paths.IO; using Wabbajack.RateLimiter; +using Wabbajack.LoginManagers; +using Wabbajack.Downloaders; +using Wabbajack.DTOs.DownloadStates; namespace Wabbajack; @@ -32,6 +35,10 @@ public class CompilerMainVM : BaseCompilerVM, IHasInfoVM, ICpuStatusVM { private readonly IServiceProvider _serviceProvider; private readonly ResourceMonitor _resourceMonitor; + private readonly IEnumerable _logins; + private readonly DownloadDispatcher _downloadDispatcher; + + private AsyncLock _waitForLoginLock = new(); public CompilerDetailsVM CompilerDetailsVM { get; set; } public CompilerFileManagerVM CompilerFileManagerVM { get; set; } @@ -53,10 +60,11 @@ public class CompilerMainVM : BaseCompilerVM, IHasInfoVM, ICpuStatusVM public CompilerMainVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, LogStream loggerProvider, Client wjClient, IServiceProvider serviceProvider, ResourceMonitor resourceMonitor, - CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM) : base(dtos, settingsManager, logger, wjClient) + CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, IEnumerable logins) : base(dtos, settingsManager, logger, wjClient) { _serviceProvider = serviceProvider; _resourceMonitor = resourceMonitor; + _logins = logins; LoggerProvider = loggerProvider; CompilerDetailsVM = compilerDetailsVM; @@ -130,22 +138,25 @@ private async Task Publish() private async Task StartCompilation() { - var tsk = Task.Run((Func)(async () => + var tsk = Task.Run(async () => { try { HideNavigation.Send(); await SaveSettings(); var token = CancellationTokenSource.Token; - RxApp.MainThreadScheduler.Schedule(_logger, (Func, IDisposable>)((_, _) => + + await EnsureLoggedIntoNexus(); + + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => { - this.ProgressText = "Compiling..."; + ProgressText = "Compiling..."; State = CompilerState.Compiling; CurrentStep = Step.Busy; ProgressText = "Compiling..."; ProgressState = ProgressState.Normal; return Disposable.Empty; - })); + }); Settings.UseGamePaths = true; if (Settings.OutputFile.DirectoryExists()) @@ -216,11 +227,39 @@ private async Task StartCompilation() } })); } - })); + }); await tsk; } + private async Task EnsureLoggedIntoNexus() + { + var nexusDownloadState = new Nexus(); + foreach (var downloader in await _downloadDispatcher.AllDownloaders([nexusDownloadState])) + { + + var manager = _logins.FirstOrDefault(l => l.LoginFor() == typeof(Nexus)); + if (manager == null) + { + _logger.LogError("Cannot compile, could not prepare Nexus for verifying"); + throw new Exception($"No way to prepare {nexusDownloadState}"); + } + + RxApp.MainThreadScheduler.Schedule(manager, (_, _) => + { + manager.TriggerLogin.Execute(null); + return Disposable.Empty; + }); + + while (true) + { + if (await downloader.Prepare()) + break; + await Task.Delay(1000); + } + } + } + private async Task CancelCompilation() { if (State != CompilerState.Compiling) return; diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index f2be74e86..3920b24c9 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -126,6 +126,7 @@ + From 1efb4bf8c1d98905f52c028942ccd63634c83cd4 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:21:53 +0100 Subject: [PATCH 169/294] Additional cleanup in CompilerMainVM --- Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index 493103f5d..69dad9770 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -189,7 +189,7 @@ private async Task StartCompilation() _logger.LogInformation("Compiler Finished"); - RxApp.MainThreadScheduler.Schedule(_logger, (Func, IDisposable>)((_, _) => + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => { ShowNavigation.Send(); ProgressText = "Compiled"; @@ -198,13 +198,13 @@ private async Task StartCompilation() CurrentStep = Step.Done; ProgressState = ProgressState.Success; return Disposable.Empty; - })); + }); } catch (Exception ex) { - RxApp.MainThreadScheduler.Schedule(_logger, (Func, IDisposable>)((_, _) => + RxApp.MainThreadScheduler.Schedule(_logger, (_, _) => { ShowNavigation.Send(); if (Cancelling) @@ -225,7 +225,7 @@ private async Task StartCompilation() _logger.LogInformation(ex, "Failed Compilation : {Message}", ex.Message); return Disposable.Empty; } - })); + }); } }); From d94073e0cd7dd9a10b1666001074eaa028969484 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:22:52 +0100 Subject: [PATCH 170/294] Remove unused login lock --- Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index 69dad9770..737146d53 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -38,8 +38,6 @@ public class CompilerMainVM : BaseCompilerVM, IHasInfoVM, ICpuStatusVM private readonly IEnumerable _logins; private readonly DownloadDispatcher _downloadDispatcher; - private AsyncLock _waitForLoginLock = new(); - public CompilerDetailsVM CompilerDetailsVM { get; set; } public CompilerFileManagerVM CompilerFileManagerVM { get; set; } From 0085eb54e6eb39eea3478ee5eb754aadfc66d91b Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 24 Nov 2024 14:09:54 +0100 Subject: [PATCH 171/294] Rename WizardButton to WJButton since it's used everywhere now --- Wabbajack.App.Wpf/Themes/Styles.xaml | 6 ++--- .../ViewModels/Compiler/BaseCompilerVM.cs | 2 +- .../{IWizardVM.cs => IProgressVM.cs} | 2 +- ...izardViewModel.cs => ProgressViewModel.cs} | 2 +- .../{WizardButton.xaml => WJButton.xaml} | 2 +- ...{WizardButton.xaml.cs => WJButton.xaml.cs} | 26 +++++++++---------- .../Views/Compiler/CompilerMainView.xaml | 14 +++++----- Wabbajack.App.Wpf/Views/InfoView.xaml | 2 +- Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 6 ++--- .../Views/ModListDetailsView.xaml | 8 +++--- .../Views/ModListGalleryView.xaml | 4 +-- 11 files changed, 37 insertions(+), 37 deletions(-) rename Wabbajack.App.Wpf/ViewModels/Interfaces/{IWizardVM.cs => IProgressVM.cs} (95%) rename Wabbajack.App.Wpf/ViewModels/{WizardViewModel.cs => ProgressViewModel.cs} (85%) rename Wabbajack.App.Wpf/Views/Common/{WizardButton.xaml => WJButton.xaml} (96%) rename Wabbajack.App.Wpf/Views/Common/{WizardButton.xaml.cs => WJButton.xaml.cs} (83%) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 273b847fd..9f60d8b06 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -1764,7 +1764,7 @@ - - - + + - - - - + + + + + + + + + + + + + + + + + + + + + + - + + - + + + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index e77cebced..c5c1ca99d 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -2,6 +2,14 @@ using System.Reactive.Linq; using ReactiveUI; using System.Windows; +using Microsoft.Toolkit.HighPerformance; +using Humanizer; +using System; +using System.IO; +using System.Linq; +using Microsoft.VisualBasic.Devices; +using System.Management; +using System.Text.RegularExpressions; namespace Wabbajack; @@ -19,6 +27,28 @@ public InstallationView() //LogView.Visibility = Visibility.Collapsed; //CpuView.Visibility = Visibility.Collapsed; + ViewModel.WhenAnyValue(vm => vm.ModlistMetadata.Title) + .Select(x => + { + // Ignore everything after a dash + x = x.Split('-')[0]; + // Remove all special characters + x = Regex.Replace(x, "[^a-zA-Z0-9_.]+", ""); + var preferredPartition = DriveHelper.GetPreferredInstallationDrive(); + string folderName; + var words = x.Split(' '); + // Abbreviate the list name if it's too long + if (words.Length >= 3) + folderName = string.Join("", Array.ConvertAll(words, word => word[0].ToString().ToUpper())); + else + folderName = x.Pascalize(); + + return $"{preferredPartition.Name}Modlists\\{folderName.Trim()}\\"; + }) + .BindToStrict(this, v => v.InstallationLocationPicker.Watermark) + .DisposeWith(disposables); + + /* ViewModel.WhenAnyValue(vm => vm.InstallState) .Select(v => v != InstallState.Configuration ? Visibility.Visible : Visibility.Collapsed) .BindToStrict(this, view => view.MidInstallDisplayGrid.Visibility) @@ -93,6 +123,7 @@ public InstallationView() ViewModel.WhenAnyValue(vm => vm.SlideShowImage) .BindToStrict(this, view => view.DetailImage.Image) .DisposeWith(disposables); + */ }); } diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index fd9ae35ac..8b5cefa23 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -101,6 +101,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + From 789737165d03869940e6af0b89d6da94bb2441a8 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 30 Nov 2024 17:31:13 +0100 Subject: [PATCH 177/294] Rename some viewmodels, don't use UI thread to determine installation path to avoid hang-ups --- Wabbajack.App.Wpf/App.xaml.cs | 2 +- .../ViewModels/Installers/ISubInstallerVM.cs | 2 +- .../{InstallerVM.cs => InstallationVM.cs} | 42 +++++++++---------- .../ViewModels/Installers/MO2InstallerVM.cs | 4 +- Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 4 +- .../Installers/InstallationCompleteView.xaml | 2 +- .../InstallationCompleteView.xaml.cs | 2 +- .../InstallationConfigurationView.xaml | 2 +- .../InstallationConfigurationView.xaml.cs | 4 +- .../Views/Installers/InstallationView.xaml | 4 +- .../Views/Installers/InstallationView.xaml.cs | 25 ++++++++++- Wabbajack.App.Wpf/Views/MainWindow.xaml | 2 +- 12 files changed, 58 insertions(+), 37 deletions(-) rename Wabbajack.App.Wpf/ViewModels/Installers/{InstallerVM.cs => InstallationVM.cs} (93%) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index c62c4e182..3775699ee 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -175,7 +175,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/ISubInstallerVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/ISubInstallerVM.cs index 24e6d425e..48a3d654a 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/ISubInstallerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/ISubInstallerVM.cs @@ -6,7 +6,7 @@ namespace Wabbajack; public interface ISubInstallerVM { - InstallerVM Parent { get; } + InstallationVM Parent { get; } IInstaller ActiveInstallation { get; } void Unload(); bool SupportsAfterInstallNavigation { get; } diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/InstallerVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs similarity index 93% rename from Wabbajack.App.Wpf/ViewModels/Installers/InstallerVM.cs rename to Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs index 226f472e8..097fefdc5 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/InstallerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs @@ -47,7 +47,7 @@ public enum InstallState Failure } -public class InstallerVM : ProgressViewModel +public class InstallationVM : ProgressViewModel { private const string LastLoadedModlist = "last-loaded-modlist"; private const string InstallSettingsPrefix = "install-settings-"; @@ -61,7 +61,7 @@ public class InstallerVM : ProgressViewModel public ModlistMetadata ModlistMetadata { get; set; } [Reactive] - public FilePickerVM ModListLocation { get; set; } + public FilePickerVM WabbajackFileLocation { get; set; } [Reactive] public MO2InstallerVM Installer { get; set; } @@ -91,7 +91,7 @@ public class InstallerVM : ProgressViewModel private readonly DTOSerializer _dtos; - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly SettingsManager _settingsManager; private readonly IServiceProvider _serviceProvider; private readonly SystemParametersConstructor _parametersConstructor; @@ -133,7 +133,7 @@ public class InstallerVM : ProgressViewModel public ReactiveCommand BeginCommand { get; } public ReactiveCommand VerifyCommand { get; } - public InstallerVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, IServiceProvider serviceProvider, + public InstallationVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, IServiceProvider serviceProvider, SystemParametersConstructor parametersConstructor, IGameLocator gameLocator, LogStream loggerProvider, ResourceMonitor resourceMonitor, Wabbajack.Services.OSIntegrated.Configuration configuration, HttpClient client, DownloadDispatcher dispatcher, IEnumerable logins, CancellationToken cancellationToken) @@ -178,13 +178,13 @@ public InstallerVM(ILogger logger, DTOSerializer dtos, SettingsMana UIUtils.OpenWebsite(ModList!.Website); }, LoadingLock.IsNotLoadingObservable); - ModListLocation = new FilePickerVM + WabbajackFileLocation = new FilePickerVM { ExistCheckOption = FilePickerVM.CheckOptions.On, PathType = FilePickerVM.PathTypeOptions.File, PromptTitle = "Select a ModList to install" }; - ModListLocation.Filters.Add(new CommonFileDialogFilter("Wabbajack Modlist", "*.wabbajack")); + WabbajackFileLocation.Filters.Add(new CommonFileDialogFilter("Wabbajack Modlist", "*.wabbajack")); OpenLogsCommand = ReactiveCommand.Create(() => { @@ -230,7 +230,7 @@ public InstallerVM(ILogger logger, DTOSerializer dtos, SettingsMana this.WhenActivated(disposables => { - ModListLocation.WhenAnyValue(l => l.TargetPath) + WabbajackFileLocation.WhenAnyValue(l => l.TargetPath) .Subscribe(p => LoadModlist(p, null).FireAndForget()) .DisposeWith(disposables); @@ -239,10 +239,10 @@ public InstallerVM(ILogger logger, DTOSerializer dtos, SettingsMana Disposable.Create(() => token.Cancel()) .DisposeWith(disposables); - this.WhenAny(vm => vm.ModListLocation.ErrorState) + this.WhenAny(vm => vm.WabbajackFileLocation.ErrorState) .CombineLatest(this.WhenAny(vm => vm.Installer.DownloadLocation.ErrorState), this.WhenAny(vm => vm.Installer.Location.ErrorState), - this.WhenAny(vm => vm.ModListLocation.TargetPath), + this.WhenAny(vm => vm.WabbajackFileLocation.TargetPath), this.WhenAny(vm => vm.Installer.Location.TargetPath), this.WhenAny(vm => vm.Installer.DownloadLocation.TargetPath)) .Select(t => @@ -282,7 +282,7 @@ public InstallerVM(ILogger logger, DTOSerializer dtos, SettingsMana private IEnumerable Validate() { - if (!ModListLocation.TargetPath.FileExists()) + if (!WabbajackFileLocation.TargetPath.FileExists()) yield return ErrorResponse.Fail("Mod list source does not exist"); var downloadPath = Installer.DownloadLocation.TargetPath; @@ -326,7 +326,7 @@ private IEnumerable Validate() yield return ErrorResponse.Fail("Installing in this folder may overwrite Wabbajack"); } - if (installPath.ToString().Length != 0 && installPath != LastInstallPath && !OverwriteFiles && + if (installPath.ToString().Length != 0 && installPath != LastInstallPath && !OverwriteFiles && installPath.DirectoryExists() && Directory.EnumerateFileSystemEntries(installPath.ToString()).Any()) { yield return ErrorResponse.Fail("There are files in the install folder, please tick 'Overwrite Installation' to confirm you want to install to this folder " + Environment.NewLine + @@ -390,13 +390,13 @@ private async Task LoadLastModlist() var lst = await _settingsManager.Load(LastLoadedModlist); if (lst.FileExists()) { - ModListLocation.TargetPath = lst; + WabbajackFileLocation.TargetPath = lst; } } private async Task LoadModlistFromGallery(AbsolutePath path, ModlistMetadata metadata) { - ModListLocation.TargetPath = path; + WabbajackFileLocation.TargetPath = path; ModlistMetadata = metadata; } @@ -404,7 +404,7 @@ private async Task LoadModlist(AbsolutePath path, ModlistMetadata? metadata) { using var ll = LoadingLock.WithLoading(); InstallState = InstallState.Configuration; - ModListLocation.TargetPath = path; + WabbajackFileLocation.TargetPath = path; try { ModList = await StandardInstaller.LoadFromFile(_dtos, path); @@ -418,7 +418,7 @@ private async Task LoadModlist(AbsolutePath path, ModlistMetadata? metadata) ProgressText = $"Installation"; TaskBarUpdate.Send($"Loaded {ModList.Name}", TaskbarItemProgressState.Normal); - var hex = (await ModListLocation.TargetPath.ToString().Hash()).ToHex(); + var hex = (await WabbajackFileLocation.TargetPath.ToString().Hash()).ToHex(); var prevSettings = await _settingsManager.Load(InstallSettingsPrefix + hex); if (path.WithExtension(Ext.MetaData).FileExists()) @@ -437,7 +437,7 @@ private async Task LoadModlist(AbsolutePath path, ModlistMetadata? metadata) if (prevSettings.ModListLocation == path) { - ModListLocation.TargetPath = prevSettings.ModListLocation; + WabbajackFileLocation.TargetPath = prevSettings.ModListLocation; LastInstallPath = prevSettings.InstallLocation; Installer.Location.TargetPath = prevSettings.InstallLocation; Installer.DownloadLocation.TargetPath = prevSettings.DownloadLoadction; @@ -476,7 +476,7 @@ await Task.Run(async () => _serviceProvider.GetRequiredService>(), _serviceProvider.GetRequiredService()); - var result = await cmd.Run(ModListLocation.TargetPath, Installer.Location.TargetPath, _cancellationToken); + var result = await cmd.Run(WabbajackFileLocation.TargetPath, Installer.Location.TargetPath, _cancellationToken); if (result != 0) { @@ -529,15 +529,15 @@ await Task.Run(async () => } - var postfix = (await ModListLocation.TargetPath.ToString().Hash()).ToHex(); + var postfix = (await WabbajackFileLocation.TargetPath.ToString().Hash()).ToHex(); await _settingsManager.Save(InstallSettingsPrefix + postfix, new SavedInstallSettings { - ModListLocation = ModListLocation.TargetPath, + ModListLocation = WabbajackFileLocation.TargetPath, InstallLocation = Installer.Location.TargetPath, DownloadLoadction = Installer.DownloadLocation.TargetPath, Metadata = ModlistMetadata }); - await _settingsManager.Save(LastLoadedModlist, ModListLocation.TargetPath); + await _settingsManager.Save(LastLoadedModlist, WabbajackFileLocation.TargetPath); try { @@ -547,7 +547,7 @@ await Task.Run(async () => Downloads = Installer.DownloadLocation.TargetPath, Install = Installer.Location.TargetPath, ModList = ModList, - ModlistArchive = ModListLocation.TargetPath, + ModlistArchive = WabbajackFileLocation.TargetPath, SystemParameters = _parametersConstructor.Create(), GameFolder = _gameLocator.GameLocation(ModList.GameType) }); diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/MO2InstallerVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/MO2InstallerVM.cs index e5b0bbeae..c97c64b4b 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/MO2InstallerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/MO2InstallerVM.cs @@ -12,7 +12,7 @@ namespace Wabbajack; public class MO2InstallerVM : ViewModel, ISubInstallerVM { - public InstallerVM Parent { get; } + public InstallationVM Parent { get; } [Reactive] public ErrorResponse CanInstall { get; set; } @@ -34,7 +34,7 @@ public class MO2InstallerVM : ViewModel, ISubInstallerVM public int ConfigVisualVerticalOffset => 25; - public MO2InstallerVM(InstallerVM installerVM) + public MO2InstallerVM(InstallationVM installerVM) { Parent = installerVM; diff --git a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index c94ff68db..7ff856afa 100644 --- a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -51,7 +51,7 @@ public class MainWindowVM : ViewModel public readonly CompilerDetailsVM CompilerDetailsVM; public readonly CompilerFileManagerVM CompilerFileManagerVM; public readonly CompilerMainVM CompilerMainVM; - public readonly InstallerVM InstallerVM; + public readonly InstallationVM InstallerVM; public readonly SettingsVM SettingsPaneVM; public readonly ModListGalleryVM GalleryVM; public readonly HomeVM HomeVM; @@ -89,7 +89,7 @@ public class MainWindowVM : ViewModel public MainWindowVM(ILogger logger, Client wjClient, IServiceProvider serviceProvider, HomeVM homeVM, ModListGalleryVM modListGalleryVM, ResourceMonitor resourceMonitor, - InstallerVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilerMainVM compilerMainVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM, ModListDetailsVM modlistDetailsVM) + InstallationVM installerVM, CompilerHomeVM compilerHomeVM, CompilerDetailsVM compilerDetailsVM, CompilerFileManagerVM compilerFileManagerVM, CompilerMainVM compilerMainVM, SettingsVM settingsVM, WebBrowserVM webBrowserVM, NavigationVM navigationVM, InfoVM infoVM, ModListDetailsVM modlistDetailsVM) { _logger = logger; _wjClient = wjClient; diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml index 0071e9c64..c9369c62a 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml @@ -9,7 +9,7 @@ xmlns:rxui="http://reactiveui.net" d:DesignHeight="450" d:DesignWidth="800" - x:TypeArguments="local:InstallerVM" + x:TypeArguments="local:InstallationVM" mc:Ignorable="d"> diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs index 944ff7dc1..5a2e3f40b 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs @@ -8,7 +8,7 @@ namespace Wabbajack; /// /// Interaction logic for InstallationCompleteView.xaml /// -public partial class InstallationCompleteView : ReactiveUserControl +public partial class InstallationCompleteView : ReactiveUserControl { public InstallationCompleteView() { diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml index 30b3881a3..9293028ea 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml @@ -9,7 +9,7 @@ xmlns:rxui="http://reactiveui.net" d:DesignHeight="450" d:DesignWidth="800" - x:TypeArguments="local:InstallerVM" + x:TypeArguments="local:InstallationVM" mc:Ignorable="d"> diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs index 6a676bf14..fe31afbfb 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs @@ -8,7 +8,7 @@ namespace Wabbajack; /// /// Interaction logic for InstallationConfigurationView.xaml /// -public partial class InstallationConfigurationView : ReactiveUserControl +public partial class InstallationConfigurationView : ReactiveUserControl { public InstallationConfigurationView() { @@ -19,7 +19,7 @@ public InstallationConfigurationView() .Select(i => (double)i) .BindToStrict(this, x => x.InstallConfigSpacer.Height) .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.ModListLocation) + this.WhenAny(x => x.ViewModel.WabbajackFileLocation) .BindToStrict(this, x => x.ModListLocationPicker.PickerVM) .DisposeWith(dispose); this.WhenAny(x => x.ViewModel.Installer) diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index 36f3bc1d0..97f74f08c 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -11,10 +11,10 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:rxui="http://reactiveui.net" xmlns:lib1="clr-namespace:Wabbajack" - d:DataContext="{d:DesignInstance local:InstallerVM}" + d:DataContext="{d:DesignInstance local:InstallationVM}" d:DesignHeight="500" d:DesignWidth="800" - x:TypeArguments="local:InstallerVM" + x:TypeArguments="local:InstallationVM" mc:Ignorable="d"> + @@ -49,11 +52,30 @@ - - - - - + + + + + + + + + The folder where the list will be installed into. + Choose an empty folder outside Windows-protected areas. + Using an SSD is highly recommended for optimal performance. + + + + + + + The folder where the downloads will be stored. + By default these are stored in a subdirectory of the installation folder, but you can also use a shared folder so previous downloads are reused. + Downloads can be deleted after installation. + + + + + + @@ -145,6 +148,7 @@ + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index 9a421d77d..d35bd1a1c 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -17,6 +17,7 @@ x:TypeArguments="local:InstallationVM" mc:Ignorable="d"> + + @@ -56,7 +61,13 @@ + + + + + + @@ -66,6 +77,7 @@ + @@ -75,6 +87,11 @@ + + + + + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index b45594736..965c0b20e 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -36,6 +36,18 @@ public InstallationView() this.Bind(ViewModel, vm => vm.Installer.DownloadLocation, view => view.DownloadLocationPicker.PickerVM) .DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.OpenReadmeCommand, v => v.DocumentationButton) + .DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.OpenWebsiteCommand, v => v.WebsiteButton) + .DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.OpenDiscordButton, v => v.DiscordButton) + .DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.OpenManifestCommand, v => v.ManifestButton) + .DisposeWith(disposables); + ViewModel.WhenAnyValue(vm => vm.SuggestedInstallFolder) .ObserveOnGuiThread() .Subscribe(x => From c22d892588460b4bbb494a805b17004b8426f493 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 1 Dec 2024 12:41:53 +0100 Subject: [PATCH 183/294] Add image to installation view --- Wabbajack.App.Wpf/Themes/Styles.xaml | 1 + .../Gallery/BaseModListMetadataVM.cs | 7 +++++ .../Gallery/GalleryModListMetadataVM.cs | 7 ----- .../ViewModels/Installers/InstallationVM.cs | 12 +++++---- .../Views/Common/DetailImageView.xaml | 6 +++-- .../Views/Common/DetailImageView.xaml.cs | 26 ++++++++++++++++++ .../Views/Installers/InstallationView.xaml | 27 +++++++++++-------- .../Views/Installers/InstallationView.xaml.cs | 23 +++++++++++----- Wabbajack.App.Wpf/Views/ModListTileView.xaml | 2 +- .../Views/ModListTileView.xaml.cs | 2 +- 10 files changed, 80 insertions(+), 33 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index fbec718fd..a0ec05e95 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -142,6 +142,7 @@ + diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs index 27aaba5ff..e472d2594 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/BaseModListMetadataVM.cs @@ -56,6 +56,8 @@ public class BaseModListMetadataVM : ViewModel [Reactive] public bool ImageContainsTitle { get; protected set; } [Reactive] public GameMetaData GameMetaData { get; protected set; } [Reactive] public bool DisplayVersionOnlyInInstallerView { get; protected set; } + + [Reactive] public ICommand DetailsCommand { get; set; } [Reactive] public ICommand InstallCommand { get; protected set; } [Reactive] public IErrorResponse Error { get; protected set; } @@ -134,6 +136,11 @@ public BaseModListMetadataVM(ILogger logger, ModlistMetadata metadata, }, LoadingLock.WhenAnyValue(ll => ll.IsLoading) .CombineLatest(this.WhenAnyValue(vm => vm.IsBroken)) .Select(v => !v.First && !v.Second)); + + DetailsCommand = ReactiveCommand.Create(() => { + LoadModlistForDetails.Send(this); + ShowFloatingWindow.Send(FloatingScreenType.ModListDetails); + }); } private void Install() diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs index f5be33754..7ce84ef0f 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/GalleryModListMetadataVM.cs @@ -20,8 +20,6 @@ public class GalleryModListMetadataVM : BaseModListMetadataVM private readonly ObservableAsPropertyHelper _Exists; public bool Exists => _Exists.Value; - - public ICommand DetailsCommand { get; set; } public ICommand OpenWebsiteCommand { get; } public ICommand ModListContentsCommend { get; } @@ -46,11 +44,6 @@ public GalleryModListMetadataVM(ILogger logger, ModListGalleryVM parent, Modlist }) .ToGuiProperty(this, nameof(Exists)); - // https://www.wabbajack.org/modlist/wj-featured/aldrnari - DetailsCommand = ReactiveCommand.Create(() => { - LoadModlistForDetails.Send(this); - ShowFloatingWindow.Send(FloatingScreenType.ModListDetails); - }); OpenWebsiteCommand = ReactiveCommand.Create(() => UIUtils.OpenWebsite(new Uri($"https://www.wabbajack.org/modlist/{Metadata.NamespacedName}"))); ModListContentsCommend = ReactiveCommand.Create(async () => diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs index a740f493a..f8e166116 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs @@ -69,7 +69,7 @@ public class InstallationVM : ProgressViewModel public MO2InstallerVM Installer { get; set; } [Reactive] - public BitmapFrame ModListImage { get; set; } + public Stream ModListImage { get; set; } [Reactive] @@ -201,7 +201,7 @@ public InstallationVM(ILogger logger, DTOSerializer dtos, Settin { // TODO: Open modlist archives in modal dialog UIUtils.OpenWebsite(new Uri("https://www.wabbajack.org/search/" + ModlistMetadata.NamespacedName)); - }, this.WhenAnyValue(vm => vm.LoadingLock.IsNotLoading)); + }, this.WhenAnyValue(x => x.LoadingLock.IsNotLoading)); CloseWhenCompleteCommand = ReactiveCommand.Create(() => { @@ -430,9 +430,9 @@ private async Task LoadModlist(AbsolutePath path, ModlistMetadata? metadata) try { ModList = await StandardInstaller.LoadFromFile(_dtos, path); - ModListImage = BitmapFrame.Create(await StandardInstaller.ModListImageStream(path)); + ModListImage = await StandardInstaller.ModListImageStream(path); - ConfigurationText = $"Setup - {ModlistMetadata.Title}"; + ConfigurationText = $"Preparing to install {ModlistMetadata.Title}"; ProgressText = $"Installation"; TaskBarUpdate.Send($"Loaded {ModList.Name}", TaskbarItemProgressState.Normal); @@ -621,6 +621,8 @@ class SavedInstallSettings private void PopulateSlideShow(ModList modList) { + return; + if (ModlistMetadata.ImageContainsTitle && ModlistMetadata.DisplayVersionOnlyInInstallerView) { SlideShowTitle = "v" + ModlistMetadata.Version.ToString(); @@ -631,7 +633,7 @@ private void PopulateSlideShow(ModList modList) } SlideShowAuthor = modList.Author; SlideShowDescription = modList.Description; - SlideShowImage = ModListImage; + //SlideShowImage = ModListImage; } diff --git a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml index eb7e15956..9be70a472 100644 --- a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml +++ b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml @@ -66,8 +66,10 @@ FontWeight="Bold" TextWrapping="WrapWithOverflow"> - - + + + + diff --git a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs index 3d91504e8..6652851f0 100644 --- a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml.cs @@ -1,4 +1,5 @@ using ReactiveUI; +using System; using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; @@ -48,6 +49,12 @@ public double AuthorFontSize set => SetValue(AuthorFontSizeProperty, value); } public static readonly DependencyProperty AuthorFontSizeProperty = DependencyProperty.Register(nameof(AuthorFontSize), typeof(double), typeof(DetailImageView), new FrameworkPropertyMetadata(default(double), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, WireNotifyPropertyChanged)); + public Version? Version + { + get => (Version?)GetValue(VersionProperty); + set => SetValue(VersionProperty, value); + } + public static readonly DependencyProperty VersionProperty = DependencyProperty.Register(nameof(Version), typeof(Version), typeof(DetailImageView), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, WireNotifyPropertyChanged)); public DetailImageView() @@ -79,6 +86,25 @@ public DetailImageView() .BindToStrict(this, x => x.TitleTextBlock.Text) .DisposeWith(dispose); + /* + var versionVisible = this.WhenAny(x => x.Version) + .Select(x => x?.ToString() ?? string.Empty) + .Select(x => string.IsNullOrWhiteSpace(x) ? Visibility.Hidden : Visibility.Visible) + .Replay(1) + .RefCount(); + versionVisible + .BindToStrict(this, x => x.VersionTextRun.Visibility) + .DisposeWith(dispose); + */ + this.WhenAny(x => x.Version) + .Select(x => x != null ? x.ToString() : string.Empty) + .BindToStrict(this, x => x.VersionTextRun.Text) + .DisposeWith(dispose); + + this.WhenAny(x => x.Version) + .Subscribe(x => VersionPrefixRun.Text = x != null ? "version" : string.Empty) + .DisposeWith(dispose); + this.WhenAny(x => x.Image) .Select(f => f) .BindToStrict(this, x => x.ModlistImage.Source) diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index d35bd1a1c..3449f1096 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -48,10 +48,6 @@ - - - - @@ -63,9 +59,6 @@ - - - @@ -88,10 +81,22 @@ - - - - + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index 965c0b20e..23c6051eb 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -13,6 +13,7 @@ using Wabbajack.Paths; using Wabbajack.Paths.IO; using System.Threading.Tasks; +using System.Windows.Media.Imaging; namespace Wabbajack; @@ -68,14 +69,24 @@ public InstallationView() }) .DisposeWith(disposables); + ViewModel.WhenAny(vm => vm.ModListImage) + .Where(x => x != null) + .ObserveOn(RxApp.TaskpoolScheduler) + .Select(x => UIUtils.BitmapImageFromStream(x)) + .BindToStrict(this, v => v.DetailImage.Image) + .DisposeWith(disposables); - /* - ViewModel.WhenAnyValue(vm => vm.Installer) - .Subscribe(x => { - x.Location.TargetPath = (AbsolutePath)InstallationLocationPicker.Watermark; - }) + ViewModel.WhenAny(vm => vm.ModlistMetadata.Author) + .BindToStrict(this, v => v.DetailImage.Author) + .DisposeWith(disposables); + + ViewModel.WhenAny(vm => vm.ModlistMetadata.Title) + .BindToStrict(this, v => v.DetailImage.Title) + .DisposeWith(disposables); + + ViewModel.WhenAnyValue(vm => vm.ModlistMetadata.Version) + .BindToStrict(this, v => v.DetailImage.Version) .DisposeWith(disposables); - */ /* ViewModel.WhenAnyValue(vm => vm.InstallState) diff --git a/Wabbajack.App.Wpf/Views/ModListTileView.xaml b/Wabbajack.App.Wpf/Views/ModListTileView.xaml index 29ab6331b..caa112f03 100644 --- a/Wabbajack.App.Wpf/Views/ModListTileView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListTileView.xaml @@ -10,7 +10,7 @@ xmlns:rxui="http://reactiveui.net" d:DesignHeight="450" d:DesignWidth="800" - x:TypeArguments="local:GalleryModListMetadataVM" + x:TypeArguments="local:BaseModListMetadataVM" mc:Ignorable="d"> #92000000 diff --git a/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs index 4a24cd1a2..2fdd09d98 100644 --- a/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListTileView.xaml.cs @@ -8,7 +8,7 @@ namespace Wabbajack; /// /// Interaction logic for ModListTileView.xaml /// -public partial class ModListTileView : ReactiveUserControl +public partial class ModListTileView : ReactiveUserControl { public ModListTileView() { From 6b8a2322d98ab442c06531ae0484fb8a4e5cb8c8 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 1 Dec 2024 15:28:12 +0100 Subject: [PATCH 184/294] Clean up DetailImageView, fix installation image sometimes not loading properly --- .../ViewModels/Installers/InstallationVM.cs | 7 ++++--- Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml | 13 ++++--------- .../Views/Installers/InstallationView.xaml | 9 +++++++-- .../Views/Installers/InstallationView.xaml.cs | 3 --- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs index f8e166116..b5c5ac5f4 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs @@ -69,7 +69,7 @@ public class InstallationVM : ProgressViewModel public MO2InstallerVM Installer { get; set; } [Reactive] - public Stream ModListImage { get; set; } + public BitmapImage ModListImage { get; set; } [Reactive] @@ -160,7 +160,7 @@ public InstallationVM(ILogger logger, DTOSerializer dtos, Settin _logins = logins; _cancellationToken = cancellationToken; - ConfigurationText = $"Setup"; + ConfigurationText = $"Loading... Please wait"; ProgressText = $"Installation"; Installer = new MO2InstallerVM(this); @@ -430,7 +430,8 @@ private async Task LoadModlist(AbsolutePath path, ModlistMetadata? metadata) try { ModList = await StandardInstaller.LoadFromFile(_dtos, path); - ModListImage = await StandardInstaller.ModListImageStream(path); + var stream = await StandardInstaller.ModListImageStream(path); + ModListImage = UIUtils.BitmapImageFromStream(stream); ConfigurationText = $"Preparing to install {ModlistMetadata.Title}"; ProgressText = $"Installation"; diff --git a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml index 9be70a472..194342ea8 100644 --- a/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml +++ b/Wabbajack.App.Wpf/Views/Common/DetailImageView.xaml @@ -14,10 +14,6 @@ - - - - @@ -27,10 +23,9 @@ - - + + --> - - + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index 3449f1096..767099403 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -91,12 +91,17 @@ - + - + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index 23c6051eb..b286128ab 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -70,9 +70,6 @@ public InstallationView() .DisposeWith(disposables); ViewModel.WhenAny(vm => vm.ModListImage) - .Where(x => x != null) - .ObserveOn(RxApp.TaskpoolScheduler) - .Select(x => UIUtils.BitmapImageFromStream(x)) .BindToStrict(this, v => v.DetailImage.Image) .DisposeWith(disposables); From 4efe3fd5173ece168c883c647f94f3a3ddb58de1 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 1 Dec 2024 16:24:48 +0100 Subject: [PATCH 185/294] Add CancelButton, hook up install button to install command again --- ';w | 249 ++++++++++++++++++ .../ViewModels/Installers/InstallationVM.cs | 64 +++-- .../InstallationCompleteView.xaml.cs | 2 +- .../InstallationConfigurationView.xaml.cs | 2 +- .../Views/Installers/InstallationView.xaml | 8 +- .../Views/Installers/InstallationView.xaml.cs | 15 ++ Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 1 + 7 files changed, 317 insertions(+), 24 deletions(-) create mode 100644 ';w diff --git a/';w b/';w new file mode 100644 index 000000000..6a2441539 --- /dev/null +++ b/';w @@ -0,0 +1,249 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.IO; +using System.Reactive.Disposables; +using System.Reactive.Linq; +using System.Windows; +using System.Windows.Input; +using DynamicData.Binding; +using MahApps.Metro.Controls; +using Microsoft.Extensions.Logging; +using ReactiveUI; +using Wabbajack.Common; +using Wabbajack.Messages; +using Wabbajack.Paths.IO; +using Wabbajack.Util; +using ReactiveMarbles.ObservableEvents; +using System.Reactive; +using System.Diagnostics; + +namespace Wabbajack; + +/// +/// Interaction logic for MainWindow.xaml +/// +public partial class MainWindow : MetroWindow +{ + private MainWindowVM _mwvm; + private readonly ILogger _logger; + private readonly SystemParametersConstructor _systemParams; + private readonly Stopwatch _mousePressedTimer; + + public MainWindow(ILogger logger, SystemParametersConstructor systemParams, LauncherUpdater updater, MainWindowVM vm) + { + InitializeComponent(); + _mwvm = vm; + DataContext = vm; + _logger = logger; + _systemParams = systemParams; + _mousePressedTimer = new Stopwatch(); + + try + { + // Wire any unhandled crashing exceptions to log before exiting + AppDomain.CurrentDomain.UnhandledException += (sender, e) => + { + // Don't do any special logging side effects + _logger.LogError((Exception)e.ExceptionObject, "Uncaught error"); + Environment.Exit(-1); + }; + + Closed += (s, e) => + { + _logger.LogInformation("Beginning shutdown..."); + _mwvm.CancelRunningTasks(TimeSpan.FromSeconds(10)); + + // Cleaning the temp folder when the app closes since it can take up multiple Gigabytes of Storage + var tempDirectory = Environment.CurrentDirectory + "\\temp"; + _logger.LogInformation("Clearing {TempDir}",tempDirectory); + var directoryInfo = new DirectoryInfo(tempDirectory); + try + { + foreach (var file in directoryInfo.EnumerateFiles()) + { + file.Delete(); + } + + foreach (var dir in directoryInfo.EnumerateDirectories()) + { + dir.Delete(true); + } + + _logger.LogInformation("Finished clearing {TempDir}", tempDirectory); + } + catch (DirectoryNotFoundException) + { + _logger.LogInformation("Unable to find {TempDir}", tempDirectory); + } + + Application.Current.Shutdown(); + }; + + MessageBus.Current.Listen() + .ObserveOnGuiThread() + .Subscribe(u => + { + TaskbarItemInfoControl.Description = u.Description; + TaskbarItemInfoControl.ProgressValue = u.ProgressValue; + TaskbarItemInfoControl.ProgressState = u.State; + }); + + + _logger.LogInformation("Wabbajack Build - {Sha}",ThisAssembly.Git.Sha); + _logger.LogInformation("Running in {EntryPoint}", KnownFolders.EntryPoint); + + var p = _systemParams.Create(); + + _logger.LogInformation("Detected Windows Version: {Version}", Environment.OSVersion.VersionString); + + _logger.LogInformation( + "System settings - ({MemorySize} RAM) ({PageSize} Page), Display: {ScreenWidth} x {ScreenHeight} ({Vram} VRAM - VideoMemorySizeMb={ENBVRam})", + p.SystemMemorySize.ToFileSizeString(), p.SystemPageSize.ToFileSizeString(), p.ScreenWidth, p.ScreenHeight, p.VideoMemorySize.ToFileSizeString(), p.EnbLEVRAMSize); + + if (p.SystemPageSize == 0) + _logger.LogInformation("Pagefile is disabled! This will cause issues such as crashing with Wabbajack and other applications!"); + + var _ = updater.Run(); + + // Bring window to the front if it isn't already + this.Initialized += (s, e) => + { + this.Activate(); + this.Topmost = true; + this.Focus(); + }; + this.ContentRendered += (s, e) => + { + this.Topmost = false; + }; + + vm.WhenAnyValue(vm => vm.ActivePane) + .Subscribe(pane => WizardSteps.Visibility = (pane is IProgressVM) ? Visibility.Visible : Visibility.Collapsed); + + vm.WhenAnyValue(vm => vm.ActivePane) + .Where(pane => pane is IProgressVM) + .Subscribe(pane => + { + var wizardVM = (ProgressViewModel)pane; + + wizardVM.WhenAnyValue(x => x.ConfigurationText) + .BindTo(this, view => view.ConfigurationText.Text) + .DisposeWith(wizardVM.CompositeDisposable); + wizardVM.WhenAnyValue(x => x.ProgressText) + .BindTo(this, view => view.ProgressText.Text) + .DisposeWith(wizardVM.CompositeDisposable); + wizardVM.WhenAnyValue(x => x.ProgressPercent.Value) + .Select(x => x.IsGreaterThan(0) && !x.IsOne() ? Visibility.Visible : Visibility.Hidden) + .BindTo(this, view => view.ProgressPercentage.Visibility) + .DisposeWith(wizardVM.CompositeDisposable); + wizardVM.WhenAnyValue(x => x.ProgressPercent.Value) + .Select(x => (int)(x * 100) + "%") + .BindTo(this, view => view.ProgressPercentage.Text) + .DisposeWith(wizardVM.CompositeDisposable); + wizardVM.WhenAnyValue(x => x.ProgressPercent.Value) + .BindTo(this, view => view.WizardProgress.Value) + .DisposeWith(wizardVM.CompositeDisposable); + wizardVM.WhenAnyValue(x => x.CurrentStep) + .ObserveOnGuiThread() + .Subscribe(step => + { + ConfigurationText.Width = double.NaN; + ConfigurationText.HorizontalAlignment = HorizontalAlignment.Center; + ProgressText.Width = double.NaN; + ProgressText.HorizontalAlignment = HorizontalAlignment.Center; + if (step == Step.Configuration) + { + ConfigurationText.Width = 500; + ConfigurationText.HorizontalAlignment = HorizontalAlignment.Left; + } + else if (step == Step.Busy) + { + ProgressText.Width = 500; + ProgressText.HorizontalAlignment = HorizontalAlignment.Left; + } + }) + .DisposeWith(wizardVM.CompositeDisposable); + + }); + + vm.WhenAnyValue(vm => vm.ActivePane) + .Subscribe(pane => InfoButton.Visibility = (pane is IHasInfoVM) ? Visibility.Visible : Visibility.Collapsed); + vm.WhenAnyValue(vm => vm.InfoCommand) + .BindTo(this, view => view.InfoButton.Command); + + vm.WhenAnyValue(vm => vm.MinimizeCommand) + .BindTo(this, view => view.MinimizeButton.Command); + + vm.WhenAnyValue(vm => vm.MaximizeCommand) + .BindTo(this, view => view.MaximizeButton.Command); + + vm.WhenAnyValue(vm => vm.CloseCommand) + .BindTo(this, view => view.CloseButton.Command); + + vm.WhenAnyValue(vm => vm.NavigationVisible) + .Subscribe(v => NavigationColumn.Width = v ? new GridLength(115, GridUnitType.Pixel) : new GridLength(0, GridUnitType.Pixel)); + + TitleBar.Events().MouseDown + .Subscribe(x => TitleBar_OnMouseDown(this, x)); + + FloatingWindowBackground.Events().MouseDown + .Subscribe(x => FloatingWindowBackground_OnMouseDown(this, x)); + + vm.WhenAnyValue(vm => vm.ActiveFloatingPane) + .Select(x => x == null ? Visibility.Hidden : Visibility.Visible) + .BindTo(this, view => view.FloatingWindow.Visibility); + + this.Events().KeyDown + .Subscribe(x => HandleKeyDown(this, x)); + + } + catch (Exception ex) + { + _logger.LogError(ex, "During Main Window Startup"); + Environment.Exit(-1); + } + + vm.WhenAnyValue(vm => vm.WindowTitle) + .BindToStrict(this, view => view.AppName.Text); + + } + + private void Window_Closing(object sender, CancelEventArgs e) + { + _mwvm.ShutdownApplication().Wait(); + } + + private void TitleBar_OnMouseDown(object sender, MouseButtonEventArgs e) + { + DragMove(); + } + + private void FloatingWindowBackground_OnMouseDown(object sender, MouseButtonEventArgs x) + { + if (x.ButtonState == MouseButtonState.Pressed) + { + _mousePressedTimer.Restart(); + DragMove(); + } + if(x.ButtonState == MouseButtonState.Released) + { + if(_mousePressedTimer.Elapsed < TimeSpan.FromSeconds(0.2)) + { + ShowFloatingWindow.Send(FloatingScreenType.None); + } + _mousePressedTimer.Stop(); + } + } + + private void HandleKeyDown(MainWindow mainWindow, KeyEventArgs x) + { + if(x.Key == Key.Escape) + { + if (((MainWindowVM)DataContext).ActiveFloatingPane != null) + ShowFloatingWindow.Send(FloatingScreenType.None); + } + } + +} diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs index b5c5ac5f4..543b86267 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs @@ -38,6 +38,7 @@ using Wabbajack.VFS; using Humanizer; using System.Text.RegularExpressions; +using System.Windows.Input; namespace Wabbajack; @@ -109,7 +110,7 @@ public class InstallationVM : ProgressViewModel private readonly HttpClient _client; private readonly DownloadDispatcher _downloadDispatcher; private readonly IEnumerable _logins; - private readonly CancellationToken _cancellationToken; + private readonly CancellationTokenSource _cancellationTokenSource; public ReadOnlyObservableCollection StatusList => _resourceMonitor.Tasks; [Reactive] @@ -129,22 +130,23 @@ public class InstallationVM : ProgressViewModel // Command properties - public ReactiveCommand OpenManifestCommand { get; } - public ReactiveCommand OpenReadmeCommand { get; } - public ReactiveCommand OpenWikiCommand { get; } - public ReactiveCommand OpenDiscordButton { get; } - public ReactiveCommand OpenWebsiteCommand { get; } + public ICommand OpenManifestCommand { get; } + public ICommand OpenReadmeCommand { get; } + public ICommand OpenWikiCommand { get; } + public ICommand OpenDiscordButton { get; } + public ICommand OpenWebsiteCommand { get; } - public ReactiveCommand CloseWhenCompleteCommand { get; } - public ReactiveCommand OpenLogsCommand { get; } - public ReactiveCommand GoToInstallCommand { get; } - public ReactiveCommand BeginCommand { get; } - public ReactiveCommand VerifyCommand { get; } + public ICommand CloseWhenCompleteCommand { get; } + public ICommand OpenLogsCommand { get; } + public ICommand OpenInstallFolderCommand { get; } + public ICommand InstallCommand { get; } + public ICommand CancelCommand { get; } + public ICommand VerifyCommand { get; } public InstallationVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, IServiceProvider serviceProvider, SystemParametersConstructor parametersConstructor, IGameLocator gameLocator, LogStream loggerProvider, ResourceMonitor resourceMonitor, Wabbajack.Services.OSIntegrated.Configuration configuration, HttpClient client, DownloadDispatcher dispatcher, IEnumerable logins, - CancellationToken cancellationToken) + CancellationTokenSource cancellationTokenSource) { _logger = logger; _configuration = configuration; @@ -158,14 +160,15 @@ public InstallationVM(ILogger logger, DTOSerializer dtos, Settin _client = client; _downloadDispatcher = dispatcher; _logins = logins; - _cancellationToken = cancellationToken; + _cancellationTokenSource = cancellationTokenSource; ConfigurationText = $"Loading... Please wait"; ProgressText = $"Installation"; Installer = new MO2InstallerVM(this); - - BeginCommand = ReactiveCommand.Create(() => BeginInstall().FireAndForget()); + + CancelCommand = ReactiveCommand.Create(CancelInstall); + InstallCommand = ReactiveCommand.Create(() => BeginInstall().FireAndForget()); OpenReadmeCommand = ReactiveCommand.Create(() => { @@ -208,7 +211,7 @@ public InstallationVM(ILogger logger, DTOSerializer dtos, Settin Environment.Exit(0); }); - GoToInstallCommand = ReactiveCommand.Create(() => + OpenInstallFolderCommand = ReactiveCommand.Create(() => { UIUtils.OpenFolder(Installer.Location.TargetPath); }); @@ -302,6 +305,25 @@ public InstallationVM(ILogger logger, DTOSerializer dtos, Settin } + private async void CancelInstall() + { + switch(InstallState) + { + case InstallState.Configuration: + NavigateToGlobal.Send(ScreenType.ModListGallery); + break; + + case InstallState.Installing: + // TODO - Cancel installation + await _cancellationTokenSource.CancelAsync(); + _cancellationTokenSource.TryReset(); + break; + + default: + break; + } + } + private IEnumerable Validate() { if (!WabbajackFileLocation.TargetPath.FileExists()) @@ -495,7 +517,7 @@ await Task.Run(async () => _serviceProvider.GetRequiredService>(), _serviceProvider.GetRequiredService()); - var result = await cmd.Run(WabbajackFileLocation.TargetPath, Installer.Location.TargetPath, _cancellationToken); + var result = await cmd.Run(WabbajackFileLocation.TargetPath, Installer.Location.TargetPath, _cancellationTokenSource.Token); if (result != 0) { @@ -581,16 +603,16 @@ await Task.Run(async () => update.StepsProgress.Value); }; - if (!await installer.Begin(_cancellationToken)) + if (!await installer.Begin(_cancellationTokenSource.Token)) { - TaskBarUpdate.Send($"Error during install of {ModList.Name}", TaskbarItemProgressState.Error); + TaskBarUpdate.Send($"Error during installation of {ModList.Name}", TaskbarItemProgressState.Error); InstallState = InstallState.Failure; - ProgressText = $"Error during install of {ModList.Name}"; + ProgressText = $"Error during installation of {ModList.Name}"; ProgressPercent = Percent.Zero; } else { - TaskBarUpdate.Send($"Finished install of {ModList.Name}", TaskbarItemProgressState.Normal); + TaskBarUpdate.Send($"Finished installing {ModList.Name}", TaskbarItemProgressState.Normal); InstallState = InstallState.Success; if (!string.IsNullOrWhiteSpace(ModList.Readme)) diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs index 5a2e3f40b..a98d13130 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs @@ -24,7 +24,7 @@ public InstallationCompleteView() .Select(failed => $"Installation {(failed ? "Failed" : "Complete")}") .BindToStrict(this, x => x.TitleText.Text) .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.GoToInstallCommand) + this.WhenAny(x => x.ViewModel.OpenInstallFolderCommand) .BindToStrict(this, x => x.GoToInstallButton.Command) .DisposeWith(dispose); this.WhenAny(x => x.ViewModel.OpenReadmeCommand) diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs index fe31afbfb..94a51f963 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationConfigurationView.xaml.cs @@ -25,7 +25,7 @@ public InstallationConfigurationView() this.WhenAny(x => x.ViewModel.Installer) .BindToStrict(this, x => x.InstallerCustomizationContent.Content) .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.BeginCommand) + this.WhenAny(x => x.ViewModel.InstallCommand) .BindToStrict(this, x => x.BeginButton.Command) .DisposeWith(dispose); this.BindStrict(ViewModel, vm => vm.OverwriteFiles, x => x.OverwriteCheckBox.IsChecked) diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index 767099403..d2f94a805 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -101,9 +101,15 @@ - + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index 746e28992..cd472c454 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -102,12 +102,50 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/BrowserView.xaml b/Wabbajack.App.Wpf/Views/BrowserView.xaml index 5d57984e0..fd4fa9203 100644 --- a/Wabbajack.App.Wpf/Views/BrowserView.xaml +++ b/Wabbajack.App.Wpf/Views/BrowserView.xaml @@ -22,10 +22,10 @@ diff --git a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml index 381939aa4..3de83e90c 100644 --- a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml +++ b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml @@ -40,10 +40,10 @@ diff --git a/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml b/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml index 18d9c7b71..c1ec2ff51 100644 --- a/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml +++ b/Wabbajack.App.Wpf/Views/Common/BeginButton.xaml @@ -38,7 +38,7 @@ HorizontalAlignment="Center" VerticalAlignment="Center" Command="{Binding Command, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"> - + --> --> - - - - - - - - - - + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs b/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs index 411919966..0c666b5e7 100644 --- a/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs @@ -8,13 +8,6 @@ namespace Wabbajack; /// public partial class LogView : UserControl { - public double ProgressPercent - { - get => (double)GetValue(ProgressPercentProperty); - set => SetValue(ProgressPercentProperty, value); - } - public static readonly DependencyProperty ProgressPercentProperty = DependencyProperty.Register(nameof(ProgressPercent), typeof(double), typeof(LogView), - new FrameworkPropertyMetadata(default(double))); public LogView() { From 627578564048e3a0c2358de0fb63ee9b3d68272c Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 8 Dec 2024 18:46:38 +0100 Subject: [PATCH 202/294] Add icons to CpuLineView --- .../Views/Common/CpuLineView.xaml | 4 +-- .../Views/Common/CpuLineView.xaml.cs | 36 ++++++++++++++++--- .../Views/Common/CpuView.xaml.cs | 1 - Wabbajack.App.Wpf/Views/Common/LogView.xaml | 16 --------- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml b/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml index 1ada661f9..79f560805 100644 --- a/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml +++ b/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml @@ -24,8 +24,8 @@ - - + + diff --git a/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml.cs b/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml.cs index 89bb6bc16..7a5ac9859 100644 --- a/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/CpuLineView.xaml.cs @@ -2,6 +2,7 @@ using System.Reactive.Disposables; using System.Reactive.Linq; using ReactiveUI; +using System.Windows; namespace Wabbajack; @@ -10,6 +11,9 @@ namespace Wabbajack; /// public partial class CpuLineView : ReactiveUserControl { + private const string _ExtractingText = "Extracting"; + private const string _DownloadingText = "Downloading"; + private const string _HashingText = "Hashing"; public CpuLineView() { InitializeComponent(); @@ -21,11 +25,33 @@ public CpuLineView() .DisposeWith(dispose); this.WhenAnyValue(x => x.ViewModel.Msg) - .BindToStrict(this, x => x.Text.Text) - .DisposeWith(dispose); - - this.WhenAnyValue(x => x.ViewModel.Msg) - .BindToStrict(this, x => x.Text.ToolTip) + .ObserveOnGuiThread() + .Subscribe(msg => + { + if (msg.StartsWith(_ExtractingText)) + { + msg = msg.Substring(_ExtractingText.Length); + Icon.Visibility = Visibility.Visible; + Icon.Symbol = FluentIcons.Common.Symbol.Dock; + } + else if (msg.StartsWith(_DownloadingText)) + { + msg = msg.Substring(_DownloadingText.Length); + Icon.Visibility = Visibility.Visible; + Icon.Symbol = FluentIcons.Common.Symbol.ArrowDownload; + } + else if (msg.StartsWith(_HashingText)) + { + msg = msg.Substring(_HashingText.Length); + Icon.Visibility = Visibility.Visible; + Icon.Symbol = FluentIcons.Common.Symbol.NumberSymbol; + } + else + { + Icon.Visibility = Visibility.Collapsed; + } + Text.Text = msg; + }) .DisposeWith(dispose); this.WhenAnyValue(x => x.ViewModel.ProgressPercent) diff --git a/Wabbajack.App.Wpf/Views/Common/CpuView.xaml.cs b/Wabbajack.App.Wpf/Views/Common/CpuView.xaml.cs index 2f2c3cc74..376e6535b 100644 --- a/Wabbajack.App.Wpf/Views/Common/CpuView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/CpuView.xaml.cs @@ -16,7 +16,6 @@ public CpuView() InitializeComponent(); this.WhenActivated(disposable => { - this.WhenAny(x => x.ViewModel.StatusList) .BindToStrict(this, x => x.CpuListControl.ItemsSource) .DisposeWith(disposable); diff --git a/Wabbajack.App.Wpf/Views/Common/LogView.xaml b/Wabbajack.App.Wpf/Views/Common/LogView.xaml index ff703a70d..a5ffbf4a9 100644 --- a/Wabbajack.App.Wpf/Views/Common/LogView.xaml +++ b/Wabbajack.App.Wpf/Views/Common/LogView.xaml @@ -22,22 +22,6 @@ ItemsSource="{Binding LoggerProvider.MessageLog}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" AlternationCount="2"> - + + + + + + + + + + + + + + + + + + + + + + + + + The folder where the list will be installed into. + Choose an empty folder outside Windows-protected areas. + Using an SSD is highly recommended for optimal performance. + + + + + + + + The folder where the downloads will be stored. + By default these are stored in a subdirectory of the installation folder, but you can also use a shared folder so previous downloads are reused. + Downloads can be deleted after installation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs index c19b5728a..b6fb82ab8 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs @@ -127,6 +127,10 @@ public class InstallationVM : ProgressViewModel, ICpuStatusVM private AbsolutePath LastInstallPath { get; set; } [Reactive] public bool OverwriteFiles { get; set; } + + [Reactive] public string HashingSpeed { get; set; } + [Reactive] public string ExtractingSpeed { get; set; } + [Reactive] public string DownloadingSpeed { get; set; } // Command properties @@ -235,6 +239,27 @@ public InstallationVM(ILogger logger, DTOSerializer dtos, Settin .Subscribe(p => LoadModlist(p, null).FireAndForget()) .DisposeWith(disposables); + _resourceMonitor.Updates + .Subscribe(updates => + { + foreach (var update in updates) + { + switch (update.Name) + { + case "Downloads": + DownloadingSpeed = $"{update.Throughput.ToFileSizeString()}/s"; + break; + case "File Hashing": + HashingSpeed = $"{update.Throughput.ToFileSizeString()}/s"; + break; + case "File Extractor": + ExtractingSpeed = $"{update.Throughput.ToFileSizeString()}/s"; + break; + } + } + }) + .DisposeWith(disposables); + var token = new CancellationTokenSource(); BeginSlideShow(token.Token).FireAndForget(); Disposable.Create(() => token.Cancel()) diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index cd472c454..d56ab97e3 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -11,6 +11,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:rxui="http://reactiveui.net" xmlns:lib1="clr-namespace:Wabbajack" + xmlns:ic="clr-namespace:FluentIcons.Wpf;assembly=FluentIcons.Wpf" d:DataContext="{d:DesignInstance local:InstallationVM}" d:DesignHeight="500" d:DesignWidth="800" @@ -45,6 +46,12 @@ + @@ -120,23 +127,56 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index 6b756f4ea..64576f9fa 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -52,6 +52,18 @@ public InstallationView() this.BindCommand(ViewModel, vm => vm.InstallCommand, v => v.InstallButton) .DisposeWith(disposables); + this.WhenAnyValue(v => v.ViewModel.HashingSpeed) + .BindToStrict(this, v => v.HashSpeedText.Text) + .DisposeWith(disposables); + + this.WhenAnyValue(v => v.ViewModel.ExtractingSpeed) + .BindToStrict(this, v => v.ExtractionSpeedText.Text) + .DisposeWith(disposables); + + this.WhenAnyValue(v => v.ViewModel.DownloadingSpeed) + .BindToStrict(this, v => v.DownloadSpeedText.Text) + .DisposeWith(disposables); + ViewModel.WhenAnyValue(vm => vm.InstallState) .ObserveOnGuiThread() .Subscribe(x => From 75d3ca43260a5609a1349c3c22432375ecd39286 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 14 Dec 2024 10:57:49 +0100 Subject: [PATCH 205/294] Add hover color to WJButton with ButtonType progress if no progress has been made yet --- Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs b/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs index 620f8d152..24078b5df 100644 --- a/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs @@ -99,8 +99,7 @@ public WJButton() if (ButtonStyle != ButtonStyle.Progress) return; if (percent == Percent.One) { - Background = new SolidColorBrush((Color)Application.Current.Resources["Primary"]); - Foreground = new SolidColorBrush((Color)Application.Current.Resources["BackgroundColor"]); + Style = (Style)Application.Current.Resources["WJColorButtonStyle"]; } else if (percent == Percent.Zero) { From 40e49a7a8525c4140d166a7ad083be0cf9e5d4a0 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 14 Dec 2024 14:54:50 +0100 Subject: [PATCH 206/294] Add readme / logviewer tabs to installation view --- Wabbajack.App.Wpf/Themes/Styles.xaml | 6 ++ Wabbajack.App.Wpf/Util/UIUtils.cs | 14 ++++ .../ViewModels/Installers/InstallationVM.cs | 4 ++ .../Views/Installers/InstallationView.xaml | 44 ++++++++++-- .../Views/Installers/InstallationView.xaml.cs | 67 ++++++++++++++++--- .../Views/ModListDetailsView.xaml | 4 +- .../Views/ModListDetailsView.xaml.cs | 17 ++--- 7 files changed, 128 insertions(+), 28 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index bcbba8cc2..4f7aaf93c 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -1857,6 +1857,12 @@ + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - The folder where the list will be installed into. - Choose an empty folder outside Windows-protected areas. - Using an SSD is highly recommended for optimal performance. - - - - - - - - The folder where the downloads will be stored. - By default these are stored in a subdirectory of the installation folder, but you can also use a shared folder so previous downloads are reused. - Downloads can be deleted after installation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From e8522c4b6e3fa122ff61d896234ef1c884786b4d Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 5 Jan 2025 00:38:52 +0100 Subject: [PATCH 241/294] Add super secret trick to force WJ to use certain WebView2 executables --- Wabbajack.App.Wpf/App.xaml.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 21ab22070..8b501a2e5 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -59,6 +59,13 @@ private void OnStartup(object sender, StartupEventArgs e) }) .Build(); + var webview2 = _host.Services.GetRequiredService(); + var currentDir = (AbsolutePath)Directory.GetCurrentDirectory(); + if(currentDir.Combine("webview2").DirectoryExists()) + { + webview2.CreationProperties = new CoreWebView2CreationProperties() { BrowserExecutableFolder = currentDir.Combine("webview2").ToString() }; + } + var args = e.Args; RxApp.MainThreadScheduler.Schedule(0, (_, _) => @@ -163,6 +170,9 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + + var currentDir = (AbsolutePath)Directory.GetCurrentDirectory(); + var webViewDir = currentDir.Combine("webview2"); services.AddSingleton(); services.AddSingleton(); From 07df2df2f0bb83d977dd9f50dc1ec5b1a9a29e9a Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 5 Jan 2025 00:48:43 +0100 Subject: [PATCH 242/294] Log when WebView2 is forced to local directory --- Wabbajack.App.Wpf/App.xaml.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 8b501a2e5..c96687dae 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using System.Reactive.Concurrency; using System.Reactive.Disposables; using System.Runtime.InteropServices; @@ -61,9 +62,12 @@ private void OnStartup(object sender, StartupEventArgs e) var webview2 = _host.Services.GetRequiredService(); var currentDir = (AbsolutePath)Directory.GetCurrentDirectory(); - if(currentDir.Combine("webview2").DirectoryExists()) + var webViewDir = currentDir.Combine("WebView2"); + if(webViewDir.DirectoryExists()) { - webview2.CreationProperties = new CoreWebView2CreationProperties() { BrowserExecutableFolder = currentDir.Combine("webview2").ToString() }; + var logger = _host.Services.GetRequiredService>(); + logger.LogInformation("Local WebView2 executable folder found. Using folder {0} instead of system binaries!", currentDir.Combine("WebView2")); + webview2.CreationProperties = new CoreWebView2CreationProperties() { BrowserExecutableFolder = currentDir.Combine("WebView2").ToString() }; } var args = e.Args; From c9b0253c055c231a34bef8d655b688e39329f926 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:50:25 +0100 Subject: [PATCH 243/294] Bump Octodiff nuget package --- Wabbajack.Installer/Wabbajack.Installer.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.Installer/Wabbajack.Installer.csproj b/Wabbajack.Installer/Wabbajack.Installer.csproj index 4f2b0dc63..a716e2f6f 100644 --- a/Wabbajack.Installer/Wabbajack.Installer.csproj +++ b/Wabbajack.Installer/Wabbajack.Installer.csproj @@ -25,7 +25,7 @@ - + From dd5f9f625c030f81ade25754f05658f849ed2aa1 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:17:54 +0100 Subject: [PATCH 244/294] Log drive information when starting Wabbajack --- Wabbajack.App.Wpf/Util/DriveHelper.cs | 33 ++++++++++++++-------- Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 18 ++++++++++++ 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/Wabbajack.App.Wpf/Util/DriveHelper.cs b/Wabbajack.App.Wpf/Util/DriveHelper.cs index aff2add7e..53160ed0d 100644 --- a/Wabbajack.App.Wpf/Util/DriveHelper.cs +++ b/Wabbajack.App.Wpf/Util/DriveHelper.cs @@ -8,8 +8,9 @@ namespace Wabbajack; public static class DriveHelper { - private static Dictionary _diskCache = new Dictionary(); - private static Dictionary _partCache = new Dictionary(); + private static Dictionary _cachedDisks = new Dictionary(); + private static Dictionary _cachedPartitions = new Dictionary(); + private static DriveInfo[]? _cachedDrives = null; /// /// All the physical disks by disk number @@ -18,9 +19,9 @@ public static Dictionary PhysicalDisks { get { - if (_diskCache.Count == 0) - _diskCache = GetPhysicalDisks(); - return _diskCache; + if (_cachedDisks.Count == 0) + _cachedDisks = GetPhysicalDisks(); + return _cachedDisks; } } @@ -31,17 +32,27 @@ public static Dictionary Partitions { get { - if (_partCache.Count == 0) - _partCache = GetPartitions(); - return _partCache; + if (_cachedPartitions.Count == 0) + _cachedPartitions = GetPartitions(); + return _cachedPartitions; + } + } + + public static DriveInfo[] Drives + { + get + { + if (_cachedDrives == null) + _cachedDrives = DriveInfo.GetDrives(); + return _cachedDrives; } } public static void ReloadPhysicalDisks() { - if (_diskCache.Count > 0) - _diskCache.Clear(); - _diskCache = GetPhysicalDisks(); + if (_cachedDisks.Count > 0) + _cachedDisks.Clear(); + _cachedDisks = GetPhysicalDisks(); } public static MediaType GetMediaTypeForPath(string path) diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index 571086d88..2cc7d658d 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -98,6 +98,24 @@ public MainWindow(ILogger logger, SystemParametersConstructor system "System settings - ({MemorySize} RAM) ({PageSize} Page), Display: {ScreenWidth} x {ScreenHeight} ({Vram} VRAM - VideoMemorySizeMb={ENBVRam})", p.SystemMemorySize.ToFileSizeString(), p.SystemPageSize.ToFileSizeString(), p.ScreenWidth, p.ScreenHeight, p.VideoMemorySize.ToFileSizeString(), p.EnbLEVRAMSize); + try + { + var drives = DriveHelper.Drives; + var partitions = DriveHelper.Partitions; + foreach (var drive in drives) + { + if (!drive.IsReady || drive.DriveType != DriveType.Fixed) continue; + var driveType = partitions[drive.RootDirectory.Name[0]].MediaType.ToString(); + var rootDir = drive.RootDirectory.ToString(); + var freeSpace = drive.AvailableFreeSpace.ToFileSizeString(); + _logger.LogInformation("Detected drive {RootDirectory} - Type: {DriveType}, Free Space: {FreeSpace}", rootDir, driveType, freeSpace); + } + } + catch(Exception ex) + { + _logger.LogError("Failed to retrieve drive information. Exception {ex}", ex.ToString()); + } + if (p.SystemPageSize == 0) _logger.LogInformation("Pagefile is disabled! This will cause issues such as crashing with Wabbajack and other applications!"); From c5ae80e267ef8dab201a954a3a12a3be86f54507 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 6 Jan 2025 21:44:12 +0100 Subject: [PATCH 245/294] Increase max length to 999 --- Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml index 5e93e1798..e2c531631 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml @@ -80,7 +80,7 @@ - + From 8aefacc9739761643872dd2cf71b6ba468f45fb5 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Wed, 8 Jan 2025 22:27:12 +0100 Subject: [PATCH 246/294] Fix the gallery erroring if the modlist summary is not up-to-date --- Wabbajack.App.Wpf/View Models/Gallery/ModListMetadataVM.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/View Models/Gallery/ModListMetadataVM.cs b/Wabbajack.App.Wpf/View Models/Gallery/ModListMetadataVM.cs index d9336e48a..7860ab8a5 100644 --- a/Wabbajack.App.Wpf/View Models/Gallery/ModListMetadataVM.cs +++ b/Wabbajack.App.Wpf/View Models/Gallery/ModListMetadataVM.cs @@ -133,7 +133,7 @@ public ModListMetadataVM(ILogger logger, ModListGalleryVM parent, ModlistMetadat ImageContainsTitle = Metadata.ImageContainsTitle; DisplayVersionOnlyInInstallerView = Metadata.DisplayVersionOnlyInInstallerView; var modListSummary = GetModListSummaryForModlist(modlistSummaries, metadata.NamespacedName); - IsBroken = modListSummary.HasFailures || metadata.ForceDown; + IsBroken = (modListSummary?.HasFailures ?? false) || metadata.ForceDown; // https://www.wabbajack.org/modlist/wj-featured/aldrnari OpenWebsiteCommand = ReactiveCommand.Create(() => UIUtils.OpenWebsite(new Uri($"https://www.wabbajack.org/modlist/{Metadata.NamespacedName}"))); From ac6ac7e9e25e441e742b4055c85fa15115577072 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 11 Jan 2025 13:22:09 +0100 Subject: [PATCH 247/294] Fix possible threading error occuring when setting settings on compilation --- Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index e148e2f6c..497bbb357 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -28,6 +28,7 @@ using Wabbajack.LoginManagers; using Wabbajack.Downloaders; using Wabbajack.DTOs.DownloadStates; +using System.Reactive.Concurrency; namespace Wabbajack; @@ -159,8 +160,7 @@ private async Task StartCompilation() Settings.UseGamePaths = true; if (Settings.OutputFile.DirectoryExists()) - Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath() - .WithExtension(Ext.Wabbajack)); + RxApp.MainThreadScheduler.Schedule(() => Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath().WithExtension(Ext.Wabbajack))); var compiler = MO2Compiler.Create(_serviceProvider, Settings.ToCompilerSettings()); From eb72e45ecdfe583f8090456bd766edb5c53ef002 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 12 Jan 2025 12:40:30 +0100 Subject: [PATCH 248/294] Fix not all changes making it into PerformanceSettingsView --- Wabbajack.App.Wpf/Settings.cs | 25 ------------------- .../Settings/PerformanceSettingsView.xaml | 24 ------------------ .../Settings/PerformanceSettingsView.xaml.cs | 9 ------- 3 files changed, 58 deletions(-) diff --git a/Wabbajack.App.Wpf/Settings.cs b/Wabbajack.App.Wpf/Settings.cs index 1094667e1..521878f48 100644 --- a/Wabbajack.App.Wpf/Settings.cs +++ b/Wabbajack.App.Wpf/Settings.cs @@ -17,39 +17,14 @@ public class Mo2ModlistInstallationSettings public class PerformanceSettings : ViewModel { private readonly Configuration.MainSettings _settings; - private readonly int _defaultMaximumMemoryPerDownloadThreadMb; public PerformanceSettings(Configuration.MainSettings settings, IResource downloadResources, SystemParametersConstructor systemParams) { var p = systemParams.Create(); _settings = settings; - // Split half of available memory among download threads - _defaultMaximumMemoryPerDownloadThreadMb = (int)(p.SystemMemorySize / downloadResources.MaxTasks / 1024 / 1024) / 2; - _maximumMemoryPerDownloadThreadMb = settings.PerformanceSettings.MaximumMemoryPerDownloadThreadMb; - - if (MaximumMemoryPerDownloadThreadMb < 0) - { - ResetMaximumMemoryPerDownloadThreadMb(); - } } - private int _maximumMemoryPerDownloadThreadMb; - - public int MaximumMemoryPerDownloadThreadMb - { - get => _maximumMemoryPerDownloadThreadMb; - set - { - RaiseAndSetIfChanged(ref _maximumMemoryPerDownloadThreadMb, value); - _settings.PerformanceSettings.MaximumMemoryPerDownloadThreadMb = value; - } - } - - public void ResetMaximumMemoryPerDownloadThreadMb() - { - MaximumMemoryPerDownloadThreadMb = _defaultMaximumMemoryPerDownloadThreadMb; - } } public class GalleryFilterSettings { diff --git a/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml b/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml index 65c55658b..5244f1a3a 100644 --- a/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml +++ b/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml @@ -47,30 +47,6 @@ - - - diff --git a/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml.cs b/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml.cs index 6951e8d77..ebe600044 100644 --- a/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Settings/PerformanceSettingsView.xaml.cs @@ -16,21 +16,12 @@ public PerformanceSettingsView() this.WhenActivated(disposable => { - this.BindStrict( - ViewModel, - x => x.MaximumMemoryPerDownloadThreadMb, - x => x.MaximumMemoryPerDownloadThreadIntegerUpDown.Value) - .DisposeWith(disposable); this.EditResourceSettings.Command = ReactiveCommand.Create(() => { UIUtils.OpenFile( KnownFolders.WabbajackAppLocal.Combine("saved_settings", "resource_settings.json")); Environment.Exit(0); }); - ResetMaximumMemoryPerDownloadThread.Command = ReactiveCommand.Create(() => - { - ViewModel.ResetMaximumMemoryPerDownloadThreadMb(); - }); }); } } From d42a57adfa1c8503cd3b62e40157baef2babbc96 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 12 Jan 2025 16:51:19 +0100 Subject: [PATCH 249/294] Potential fix for OutputFile manifest generation error --- Wabbajack.Compiler/CompilerSettingsInferencer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.Compiler/CompilerSettingsInferencer.cs b/Wabbajack.Compiler/CompilerSettingsInferencer.cs index a6de3a6f3..a3bafb634 100644 --- a/Wabbajack.Compiler/CompilerSettingsInferencer.cs +++ b/Wabbajack.Compiler/CompilerSettingsInferencer.cs @@ -54,7 +54,7 @@ public CompilerSettingsInferencer(ILogger logger) cs.ModListName = selectedProfile; cs.Profile = selectedProfile; - cs.OutputFile = cs.Source.Parent; + cs.OutputFile = cs.Source.Parent.Combine(cs.ModListName).Combine(Ext.Wabbajack); var settings = iniData["Settings"]; cs.Downloads = settings["download_directory"].FromMO2Ini().ToAbsolutePath(); From 79800456d6aaf85c36c6fdc053f1cbc7e286c3ab Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 18 Jan 2025 12:25:33 +0100 Subject: [PATCH 250/294] Properly fix 'the access to the path is denied' error, --- Wabbajack.App.Wpf/Util/FilePickerVM.cs | 7 ++++++- Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs | 3 ++- Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs | 2 -- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Wabbajack.App.Wpf/Util/FilePickerVM.cs b/Wabbajack.App.Wpf/Util/FilePickerVM.cs index 43c0c059a..e2787bb27 100644 --- a/Wabbajack.App.Wpf/Util/FilePickerVM.cs +++ b/Wabbajack.App.Wpf/Util/FilePickerVM.cs @@ -29,6 +29,9 @@ public enum CheckOptions On } + public delegate AbsolutePath TransformPath(AbsolutePath targetPath); + public TransformPath PathTransformer { get; set; } + public object Parent { get; } [Reactive] @@ -270,7 +273,9 @@ public ICommand ConstructTypicalPickerCommand(IObservable canExecute = nul dlg.Filters.Add(filter); } if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; - TargetPath = (AbsolutePath)dlg.FileName; + + var path = (AbsolutePath)dlg.FileName; + TargetPath = PathTransformer(path); }, canExecute: canExecute); } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs index 3c2c1b7a9..a0bd1ced9 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerDetailsVM.cs @@ -110,7 +110,8 @@ public CompilerDetailsVM(ILogger logger, DTOSerializer dtos, { ExistCheckOption = FilePickerVM.CheckOptions.Off, PathType = FilePickerVM.PathTypeOptions.Folder, - PromptTitle = "Location where the compiled modlist will be stored" + PromptTitle = "Location where the compiled modlist will be stored", + PathTransformer = (folder) => folder.DirectoryExists() ? folder.Combine(!string.IsNullOrWhiteSpace(Settings?.ModListName) ? Settings.ModListName : "Default").WithExtension(Ext.Wabbajack) : folder }; ModListImageLocation = new FilePickerVM diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index 497bbb357..403984528 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -159,8 +159,6 @@ private async Task StartCompilation() }); Settings.UseGamePaths = true; - if (Settings.OutputFile.DirectoryExists()) - RxApp.MainThreadScheduler.Schedule(() => Settings.OutputFile = Settings.OutputFile.Combine(Settings.ModListName.ToRelativePath().WithExtension(Ext.Wabbajack))); var compiler = MO2Compiler.Create(_serviceProvider, Settings.ToCompilerSettings()); From 6c7443834b1c9b1ff67b78ee1bd1dcb1c28f8fb5 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 18 Jan 2025 12:55:25 +0100 Subject: [PATCH 251/294] Bump Microsoft.Extensions.Configuration.Json, remove excessive HttpHandler logging --- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 3 ++- Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj | 1 + Wabbajack.CLI/Wabbajack.CLI.csproj | 1 + Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj | 1 + .../Wabbajack.Compression.BSA.Test.csproj | 1 + Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj | 1 + .../Wabbajack.Downloaders.Dispatcher.Test.csproj | 1 + .../Wabbajack.FileExtractor.Test.csproj | 1 + Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj | 1 + Wabbajack.Launcher/Wabbajack.Launcher.csproj | 1 + Wabbajack.Networking.Http/ServiceExtensions.cs | 3 +++ .../Wabbajack.Networking.NexusApi.Test.csproj | 1 + .../Wabbajack.Networking.Steam.Test.csproj | 1 + Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj | 1 + 14 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index 352dd010b..273cf2a16 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -48,7 +48,7 @@ - + @@ -106,6 +106,7 @@ + diff --git a/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj b/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj index a280d319f..72f96eb34 100644 --- a/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj +++ b/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj @@ -7,6 +7,7 @@ + diff --git a/Wabbajack.CLI/Wabbajack.CLI.csproj b/Wabbajack.CLI/Wabbajack.CLI.csproj index 8e8252f0b..0594154e1 100644 --- a/Wabbajack.CLI/Wabbajack.CLI.csproj +++ b/Wabbajack.CLI/Wabbajack.CLI.csproj @@ -18,6 +18,7 @@ + diff --git a/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj b/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj index 94a54844c..a0833e165 100644 --- a/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj +++ b/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj @@ -13,6 +13,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj b/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj index 0285184d4..3aed223e6 100644 --- a/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj +++ b/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj @@ -11,6 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj b/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj index e4e878f97..2d530eadd 100644 --- a/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj +++ b/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj @@ -11,6 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj b/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj index 99322309d..9cc9a8e74 100644 --- a/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj +++ b/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj @@ -11,6 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj b/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj index 42e75e785..97a033c34 100644 --- a/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj +++ b/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj @@ -11,6 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj b/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj index 2256e9845..7801ce0b4 100644 --- a/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj +++ b/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj @@ -11,6 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.Launcher/Wabbajack.Launcher.csproj b/Wabbajack.Launcher/Wabbajack.Launcher.csproj index d58575f80..8bda98577 100644 --- a/Wabbajack.Launcher/Wabbajack.Launcher.csproj +++ b/Wabbajack.Launcher/Wabbajack.Launcher.csproj @@ -30,6 +30,7 @@ + diff --git a/Wabbajack.Networking.Http/ServiceExtensions.cs b/Wabbajack.Networking.Http/ServiceExtensions.cs index b6c871c0f..8a1b8af76 100644 --- a/Wabbajack.Networking.Http/ServiceExtensions.cs +++ b/Wabbajack.Networking.Http/ServiceExtensions.cs @@ -1,4 +1,6 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Http; using System; using Wabbajack.Networking.Http.Interfaces; @@ -10,5 +12,6 @@ public static void AddResumableHttpDownloader(this IServiceCollection services) { services.AddHttpClient("ResumableClient").ConfigureHttpClient(c => c.Timeout = TimeSpan.FromMinutes(5)); services.AddSingleton(); + services.RemoveAll(); } } \ No newline at end of file diff --git a/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj b/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj index 0ad8a0ad6..120833436 100644 --- a/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj +++ b/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj @@ -11,6 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj b/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj index 874745d30..ffd1dd911 100644 --- a/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj +++ b/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj @@ -12,6 +12,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj b/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj index 48a56f1e5..c790ef6ff 100644 --- a/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj +++ b/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj @@ -11,6 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + From df3aade74c19a4383affbfd60cbed46dc990de77 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:13:42 +0100 Subject: [PATCH 252/294] Add extra validation before being able to compile, fix error on using any file picker but the compile output location --- Wabbajack.App.Wpf/Util/FilePickerVM.cs | 3 +- .../ViewModels/Compiler/CompilerMainVM.cs | 15 +- .../Installers/InstallationCompleteView.xaml | 178 ------------------ .../InstallationCompleteView.xaml.cs | 41 ---- .../Views/Installers/InstallationView.xaml | 8 +- .../Views/Installers/InstallationView.xaml.cs | 4 - 6 files changed, 20 insertions(+), 229 deletions(-) delete mode 100644 Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml delete mode 100644 Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs diff --git a/Wabbajack.App.Wpf/Util/FilePickerVM.cs b/Wabbajack.App.Wpf/Util/FilePickerVM.cs index e2787bb27..7de530146 100644 --- a/Wabbajack.App.Wpf/Util/FilePickerVM.cs +++ b/Wabbajack.App.Wpf/Util/FilePickerVM.cs @@ -275,7 +275,8 @@ public ICommand ConstructTypicalPickerCommand(IObservable canExecute = nul if (dlg.ShowDialog() != CommonFileDialogResult.Ok) return; var path = (AbsolutePath)dlg.FileName; - TargetPath = PathTransformer(path); + TargetPath = PathTransformer == null ? path : PathTransformer(path); + }, canExecute: canExecute); } } diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index 403984528..e0b0fd961 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -73,7 +73,20 @@ public CompilerMainVM(ILogger logger, DTOSerializer dtos, Settin CancellationTokenSource = new CancellationTokenSource(); InfoCommand = ReactiveCommand.Create(Info); - StartCommand = ReactiveCommand.Create(StartCompilation); + StartCommand = ReactiveCommand.Create(StartCompilation, + this.WhenAnyValue(vm => vm.Settings.ModListName, + vm => vm.Settings.ModListAuthor, + vm => vm.Settings.ModListDescription, + vm => vm.Settings.ModListImage, + vm => vm.Settings.OutputFile, + vm => vm.Settings.Version, (name, author, desc, img, output, version) => + !string.IsNullOrWhiteSpace(name) && + !string.IsNullOrWhiteSpace(author) && + !string.IsNullOrWhiteSpace(desc) && + img.FileExists() && + !string.IsNullOrWhiteSpace(output.ToString()) && + Version.TryParse(version, out _))); + CancelCommand = ReactiveCommand.Create(CancelCompilation); OpenLogCommand = ReactiveCommand.Create(OpenLog); OpenFolderCommand = ReactiveCommand.Create(OpenFolder); diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml deleted file mode 100644 index b7c36d6df..000000000 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs deleted file mode 100644 index a4db01604..000000000 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationCompleteView.xaml.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Linq; -using System.Reactive.Disposables; -using System.Reactive.Linq; -using ReactiveUI; - -namespace Wabbajack; - -/// -/// Interaction logic for InstallationCompleteView.xaml -/// -public partial class InstallationCompleteView : ReactiveUserControl -{ - public InstallationCompleteView() - { - InitializeComponent(); - this.WhenActivated(dispose => - { - this.WhenAny(x => x.ViewModel.InstallState) - .Select(x => x == InstallState.Failure) - .BindToStrict(this, x => x.AttentionBorder.Failure) - .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.InstallState) - .Select(x => x == InstallState.Failure) - .Select(failed => $"Installation {(failed ? "Failed" : "Complete")}") - .BindToStrict(this, x => x.TitleText.Text) - .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.OpenInstallFolderCommand) - .BindToStrict(this, x => x.GoToInstallButton.Command) - .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.OpenReadmeCommand) - .BindToStrict(this, x => x.OpenReadmeButton.Command) - .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.OpenWikiCommand) - .BindToStrict(this, x => x.OpenWikiButton.Command) - .DisposeWith(dispose); - this.WhenAny(x => x.ViewModel.OpenLogsCommand) - .BindToStrict(this, x => x.OpenLogsButton.Command) - .DisposeWith(dispose); - }); - } -} diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index a48f55d6d..c2caab996 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -139,7 +139,7 @@ - + @@ -148,12 +148,12 @@ - + - + @@ -167,7 +167,7 @@ - + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index f53bb5b91..bdf3bc26d 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -103,9 +103,6 @@ public InstallationView() StoppedButton.Text = "Open File Explorer"; break; } - if(result == InstallResult.DownloadFailed) - { - } }) .DisposeWith(disposables); @@ -133,7 +130,6 @@ public InstallationView() if (x == InstallState.Failure || x == InstallState.Success) LogToggleButton.IsChecked = true; - if (x == InstallState.Installing) HideNavigation.Send(); else From bdf64fb19d75e906805c44255d6b6a5f10bc837e Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 18 Jan 2025 20:33:20 +0100 Subject: [PATCH 253/294] Add debug lines for failing CDN mirror downloads --- Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs | 1 + Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs b/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs index 5511a58b6..1d7b85410 100644 --- a/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs +++ b/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs @@ -237,6 +237,7 @@ private async Task DownloadFromMirror(Archive archive, AbsolutePath destin { try { + _logger.LogInformation("Downloading {archiveName} from mirror, hash {archiveHash}", archive.Name, archive.Hash) var url = _wjClient.GetMirrorUrl(archive.Hash); if (url == null) return default; diff --git a/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs b/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs index 95d265c33..3441e038e 100644 --- a/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs +++ b/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs @@ -126,6 +126,7 @@ public override async Task Download(Archive archive, WabbajackCDN state, A private async Task GetDefinition(WabbajackCDN state, CancellationToken token) { + _logger.LogInformation("Getting file definition for CDN download {primaryKeyString}, {url}", state.PrimaryKeyString, state.Url); var msg = MakeMessage(new Uri(state.Url + "/definition.json.gz")); using var data = await _client.SendAsync(msg, token); if (!data.IsSuccessStatusCode) return null; From efd5018fda3c9b98d6cc381146fbeed0fa1a25c7 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 18 Jan 2025 20:39:42 +0100 Subject: [PATCH 254/294] Fix missing semicolon on new log row --- Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs b/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs index 1d7b85410..1d85da376 100644 --- a/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs +++ b/Wabbajack.Downloaders.Dispatcher/DownloadDispatcher.cs @@ -237,7 +237,7 @@ private async Task DownloadFromMirror(Archive archive, AbsolutePath destin { try { - _logger.LogInformation("Downloading {archiveName} from mirror, hash {archiveHash}", archive.Name, archive.Hash) + _logger.LogInformation("Downloading {archiveName} from mirror, hash {archiveHash}", archive.Name, archive.Hash); var url = _wjClient.GetMirrorUrl(archive.Hash); if (url == null) return default; From 27b0c1f6ccf9e69bc21a42e3dae85b563aaabc38 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:04:43 +0100 Subject: [PATCH 255/294] Remember installation location from previous installs, do not log trace & debug statements to UI log --- Wabbajack.App.Wpf/App.xaml.cs | 1 + Wabbajack.App.Wpf/Views/Common/LogView.xaml | 7 ++++++- Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs | 11 ++++++++--- .../Views/Installers/InstallationView.xaml.cs | 8 ++------ 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index c96687dae..974c2b48e 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -156,6 +156,7 @@ private void AddLogging(ILoggingBuilder loggingBuilder) config.AddRuleForAllLevels(uiTarget); loggingBuilder.ClearProviders(); + loggingBuilder.AddFilter("System.Net.Http.HttpClient", LogLevel.Warning); loggingBuilder.SetMinimumLevel(LogLevel.Information); loggingBuilder.AddNLog(config); } diff --git a/Wabbajack.App.Wpf/Views/Common/LogView.xaml b/Wabbajack.App.Wpf/Views/Common/LogView.xaml index a5ffbf4a9..8b6471753 100644 --- a/Wabbajack.App.Wpf/Views/Common/LogView.xaml +++ b/Wabbajack.App.Wpf/Views/Common/LogView.xaml @@ -8,6 +8,11 @@ d:DesignHeight="450" d:DesignWidth="800" mc:Ignorable="d"> + + + @@ -19,7 +24,7 @@ local:AutoScrollBehavior.ScrollOnNewItem="True" BorderBrush="Transparent" BorderThickness="0" - ItemsSource="{Binding LoggerProvider.MessageLog}" + ItemsSource="{Binding Source={StaticResource FilteredRows}}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" AlternationCount="2"> diff --git a/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs b/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs index 0c666b5e7..03d053fc7 100644 --- a/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/LogView.xaml.cs @@ -1,5 +1,5 @@ -using System.Windows; -using System.Windows.Controls; +using System.Windows.Controls; +using static Wabbajack.Models.LogStream; namespace Wabbajack; @@ -8,9 +8,14 @@ namespace Wabbajack; /// public partial class LogView : UserControl { - public LogView() { InitializeComponent(); } + + private void CollectionViewSource_Filter(object sender, System.Windows.Data.FilterEventArgs e) + { + var row = e.Item as ILogMessage; + e.Accepted = row.Level.Ordinal >= 2; + } } diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index bdf3bc26d..2707520be 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -88,10 +88,6 @@ public InstallationView() switch(result) { case InstallResult.DownloadFailed: - /* - this.BindCommand(ViewModel, vm => vm.OpenInstallFolderCommand, v => v.StoppedButton) - .DisposeWith(disposables); - */ StoppedButton.Command = ViewModel.OpenMissingArchivesCommand; StoppedButton.Icon = Symbol.DocumentGlobe; StoppedButton.Text = "Show Missing Archives"; @@ -142,7 +138,7 @@ public InstallationView() .Subscribe(x => { InstallationLocationPicker.Watermark = x; - if (ViewModel?.Installer?.Location != null) + if (string.IsNullOrEmpty(ViewModel?.Installer?.Location?.TargetPath.ToString())) ViewModel.Installer.Location.TargetPath = (AbsolutePath)x; }) .DisposeWith(disposables); @@ -152,7 +148,7 @@ public InstallationView() .Subscribe(x => { DownloadLocationPicker.Watermark = x; - if (ViewModel?.Installer?.Location != null) + if (string.IsNullOrEmpty(ViewModel?.Installer?.Location?.TargetPath.ToString())) ViewModel.Installer.DownloadLocation.TargetPath = (AbsolutePath)x; }) .DisposeWith(disposables); From 89b1eb62eac77e12d68b622100f1b31ef1f66600 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:06:34 +0100 Subject: [PATCH 256/294] Bump 95% of nuget packages, remove steam handler --- .../ViewModels/Compiler/CompilerHomeVM.cs | 1 - Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 6 +- .../Wabbajack.CLI.Builder.csproj | 10 +- Wabbajack.CLI/Program.cs | 5 - Wabbajack.CLI/UserInterventionHandler.cs | 27 ------ Wabbajack.CLI/VerbRegistration.cs | 6 -- Wabbajack.CLI/Verbs/SteamDownloadFile.cs | 95 ------------------- Wabbajack.CLI/Verbs/SteamDumpAppInfo.cs | 80 ---------------- Wabbajack.CLI/Verbs/SteamLogin.cs | 57 ----------- Wabbajack.CLI/Wabbajack.CLI.csproj | 18 ++-- Wabbajack.Common/Wabbajack.Common.csproj | 4 +- Wabbajack.Compiler.Test/Startup.cs | 24 ----- .../Wabbajack.Compiler.Test.csproj | 16 ++-- Wabbajack.Compiler/Wabbajack.Compiler.csproj | 7 +- .../Wabbajack.Compression.BSA.Test.csproj | 17 ++-- .../Wabbajack.Compression.BSA.csproj | 4 +- .../Wabbajack.Compression.Zip.Test.csproj | 11 ++- .../Wabbajack.DTOs.ConverterGenerators.csproj | 7 +- .../Wabbajack.DTOs.Test.csproj | 19 ++-- Wabbajack.DTOs/Wabbajack.DTOs.csproj | 3 +- .../Wabbajack.Downloaders.Bethesda.csproj | 4 +- ...bbajack.Downloaders.Dispatcher.Test.csproj | 15 +-- .../Wabbajack.Downloaders.Dispatcher.csproj | 7 +- .../Wabbajack.Downloaders.GameFile.csproj | 13 ++- .../Wabbajack.Downloaders.GoogleDrive.csproj | 6 +- .../Wabbajack.Downloaders.Http.csproj | 4 +- ...ck.Downloaders.IPS4OAuth2Downloader.csproj | 6 +- .../Wabbajack.Downloaders.Interfaces.csproj | 5 + .../Wabbajack.Downloaders.Manual.csproj | 4 +- .../Wabbajack.Downloaders.MediaFire.csproj | 7 +- .../Wabbajack.Downloaders.Mega.csproj | 8 +- .../Wabbajack.Downloaders.ModDB.csproj | 10 +- .../Wabbajack.Downloaders.Nexus.csproj | 5 + ...ajack.Downloaders.VerificationCache.csproj | 6 +- .../Wabbajack.Downloaders.WabbajackCDN.csproj | 4 +- .../Wabbajack.FileExtractor.Test.csproj | 18 ++-- .../Wabbajack.FileExtractor.csproj | 4 +- .../Wabbajack.Hashing.PHash.Test.csproj | 17 ++-- .../Wabbajack.Hashing.PHash.csproj | 3 + ...abbajack.Hashing.xxHash64.Benchmark.csproj | 3 +- .../Wabbajack.Hashing.xxHash64.Test.csproj | 11 ++- .../Wabbajack.Installer.Test.csproj | 15 +-- .../Wabbajack.Installer.csproj | 5 +- Wabbajack.Launcher/Wabbajack.Launcher.csproj | 25 ++--- .../Wabbajack.Networking.BethesdaNet.csproj | 5 + .../Wabbajack.Networking.Discord.csproj | 3 +- .../Wabbajack.Networking.GitHub.csproj | 6 +- .../Wabbajack.Networking.Http.Test.csproj | 13 ++- .../Wabbajack.Networking.Http.csproj | 7 +- .../Wabbajack.Networking.NexusApi.Test.csproj | 16 ++-- .../Wabbajack.Networking.NexusApi.csproj | 5 +- .../Wabbajack.Networking.Steam.Test.csproj | 19 ++-- .../Wabbajack.Networking.Steam.csproj | 6 +- ...ajack.Networking.WabbajackClientApi.csproj | 8 +- .../Wabbajack.Paths.IO.Test.csproj | 13 +-- .../Wabbajack.Paths.Test.csproj | 11 ++- .../Wabbajack.RateLimiter.Test.csproj | 11 ++- .../Wabbajack.Server.Lib.csproj | 7 +- .../ServiceExtensions.cs | 7 -- .../TokenProviders/SteamTokenProvider.cs | 13 --- .../Wabbajack.Services.OSIntegrated.csproj | 11 ++- .../Wabbajack.VFS.Interfaces.csproj | 5 + Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj | 21 ++-- Wabbajack.VFS/Wabbajack.VFS.csproj | 7 +- Wabbajack.sln | 14 --- 65 files changed, 314 insertions(+), 516 deletions(-) delete mode 100644 Wabbajack.CLI/UserInterventionHandler.cs delete mode 100644 Wabbajack.CLI/Verbs/SteamDownloadFile.cs delete mode 100644 Wabbajack.CLI/Verbs/SteamDumpAppInfo.cs delete mode 100644 Wabbajack.CLI/Verbs/SteamLogin.cs delete mode 100644 Wabbajack.Services.OSIntegrated/TokenProviders/SteamTokenProvider.cs diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs index d834a87d8..bbe664166 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerHomeVM.cs @@ -11,7 +11,6 @@ using Microsoft.WindowsAPICodePack.Dialogs; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using SteamKit2.GC.Dota.Internal; using Wabbajack.Common; using Wabbajack.Compiler; using Wabbajack.DTOs.JsonConverters; diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index 273cf2a16..76765b23d 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -91,7 +91,7 @@ NU1701 - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -105,9 +105,9 @@ - + - + diff --git a/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj b/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj index 72f96eb34..622b5bb78 100644 --- a/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj +++ b/Wabbajack.CLI.Builder/Wabbajack.CLI.Builder.csproj @@ -8,11 +8,11 @@ - - - - - + + + + + diff --git a/Wabbajack.CLI/Program.cs b/Wabbajack.CLI/Program.cs index cbcd99347..575fa4b32 100644 --- a/Wabbajack.CLI/Program.cs +++ b/Wabbajack.CLI/Program.cs @@ -51,11 +51,6 @@ private static async Task Main(string[] args) services.AddSingleton(); services.AddCLIVerbs(); - - - - - services.AddSingleton(); }).Build(); var service = host.Services.GetService(); diff --git a/Wabbajack.CLI/UserInterventionHandler.cs b/Wabbajack.CLI/UserInterventionHandler.cs deleted file mode 100644 index 28313f214..000000000 --- a/Wabbajack.CLI/UserInterventionHandler.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using Wabbajack.DTOs.Interventions; -using Wabbajack.Networking.Steam.UserInterventions; - -namespace Wabbajack.CLI; - -public class UserInterventionHandler : IUserInterventionHandler -{ - public void Raise(IUserIntervention intervention) - { - if (intervention is GetAuthCode gac) - { - switch (gac.Type) - { - case GetAuthCode.AuthType.EmailCode: - Console.WriteLine("Please enter the Steam code that was just emailed to you"); - break; - case GetAuthCode.AuthType.TwoFactorAuth: - Console.WriteLine("Please enter your 2FA code for Steam"); - break; - default: - throw new ArgumentOutOfRangeException(); - } - gac.Finish(Console.ReadLine()!.Trim()); - } - } -} \ No newline at end of file diff --git a/Wabbajack.CLI/VerbRegistration.cs b/Wabbajack.CLI/VerbRegistration.cs index 93ed9e134..b41cb6f1b 100644 --- a/Wabbajack.CLI/VerbRegistration.cs +++ b/Wabbajack.CLI/VerbRegistration.cs @@ -45,12 +45,6 @@ public static void AddCLIVerbs(this IServiceCollection services) { services.AddSingleton(); CommandLineBuilder.RegisterCommand(ModlistReport.Definition, c => ((ModlistReport)c).Run); services.AddSingleton(); -CommandLineBuilder.RegisterCommand(SteamDownloadFile.Definition, c => ((SteamDownloadFile)c).Run); -services.AddSingleton(); -CommandLineBuilder.RegisterCommand(SteamDumpAppInfo.Definition, c => ((SteamDumpAppInfo)c).Run); -services.AddSingleton(); -CommandLineBuilder.RegisterCommand(SteamLogin.Definition, c => ((SteamLogin)c).Run); -services.AddSingleton(); CommandLineBuilder.RegisterCommand(UploadToNexus.Definition, c => ((UploadToNexus)c).Run); services.AddSingleton(); CommandLineBuilder.RegisterCommand(ValidateLists.Definition, c => ((ValidateLists)c).Run); diff --git a/Wabbajack.CLI/Verbs/SteamDownloadFile.cs b/Wabbajack.CLI/Verbs/SteamDownloadFile.cs deleted file mode 100644 index 16f66e393..000000000 --- a/Wabbajack.CLI/Verbs/SteamDownloadFile.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System.CommandLine; -using System.CommandLine.Invocation; -using System.CommandLine.NamingConventionBinder; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using FluentFTP.Helpers; -using Microsoft.Extensions.Logging; -using SteamKit2; -using Wabbajack.CLI.Builder; -using Wabbajack.DTOs; -using Wabbajack.DTOs.JsonConverters; -using Wabbajack.Networking.Http.Interfaces; -using Wabbajack.Networking.Steam; -using Wabbajack.Paths; - -namespace Wabbajack.CLI.Verbs; - -public class SteamDownloadFile -{ - private readonly ILogger _logger; - private readonly Client _client; - private readonly ITokenProvider _token; - private readonly DepotDownloader _downloader; - private readonly DTOSerializer _dtos; - private readonly Wabbajack.Networking.WabbajackClientApi.Client _wjClient; - - public SteamDownloadFile(ILogger logger, Client steamClient, ITokenProvider token, - DepotDownloader downloader, DTOSerializer dtos, Wabbajack.Networking.WabbajackClientApi.Client wjClient) - { - _logger = logger; - _client = steamClient; - _token = token; - _downloader = downloader; - _dtos = dtos; - _wjClient = wjClient; - } - - public static VerbDefinition Definition = new("steam-download-file", - "Dumps information to the console about the given app", - new[] - { - new OptionDefinition(typeof(string), "g", "game", "Wabbajack game name"), - new OptionDefinition(typeof(string), "v", "version", "Version of the game to download for"), - new OptionDefinition(typeof(string), "f", "file", "File to download (relative path)"), - new OptionDefinition(typeof(string), "o", "output", "Output location") - }); - - internal async Task Run(string gameName, string version, string file, AbsolutePath output) - { - if (!GameRegistry.TryGetByFuzzyName(gameName, out var game)) - _logger.LogError("Can't find definition for {Game}", gameName); - - await _client.Login(); - - var definition = await _wjClient.GetGameArchives(game.Game, version); - var manifests = await _wjClient.GetSteamManifests(game.Game, version); - - _logger.LogInformation("Found {Count} manifests, looking for file", manifests.Length); - - SteamManifest? steamManifest = null; - DepotManifest? depotManifest = null; - DepotManifest.FileData? fileData = null; - - var appId = (uint) game.SteamIDs.First(); - - foreach (var manifest in manifests) - { - steamManifest = manifest; - depotManifest = await _client.GetAppManifest(appId, manifest.Depot, manifest.Manifest); - fileData = depotManifest.Files!.FirstOrDefault(f => f.FileName == file); - if (fileData != default) - { - break; - } - } - - if (fileData == default) - { - _logger.LogError("Cannot find {File} in any manifests", file); - return 1; - } - - _logger.LogInformation("File is {Size} and {ChunkCount} chunks", fileData.TotalSize.FileSizeToString(), fileData.Chunks.Count); - - await _client.Download(appId, depotManifest!.DepotID, steamManifest!.Manifest, fileData, output, CancellationToken.None); - - _logger.LogInformation("File downloaded"); - - return 0; - - - - } -} \ No newline at end of file diff --git a/Wabbajack.CLI/Verbs/SteamDumpAppInfo.cs b/Wabbajack.CLI/Verbs/SteamDumpAppInfo.cs deleted file mode 100644 index 4e61bd723..000000000 --- a/Wabbajack.CLI/Verbs/SteamDumpAppInfo.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.CommandLine; -using System.CommandLine.Invocation; -using System.CommandLine.NamingConventionBinder; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SteamKit2; -using Wabbajack.CLI.Builder; -using Wabbajack.DTOs; -using Wabbajack.DTOs.JsonConverters; -using Wabbajack.Networking.Http.Interfaces; -using Wabbajack.Networking.Steam; -using JsonSerializer = System.Text.Json.JsonSerializer; - -namespace Wabbajack.CLI.Verbs; - -public class SteamDumpAppInfo -{ - private readonly ILogger _logger; - private readonly Client _client; - private readonly ITokenProvider _token; - private readonly DepotDownloader _downloader; - private readonly DTOSerializer _dtos; - - public SteamDumpAppInfo(ILogger logger, Client steamClient, ITokenProvider token, - DepotDownloader downloader, DTOSerializer dtos) - { - _logger = logger; - _client = steamClient; - _token = token; - _downloader = downloader; - _dtos = dtos; - } - - public static VerbDefinition Definition = new("steam-app-dump-info", - "Dumps information to the console about the given app", new[] - { - new OptionDefinition(typeof(string), "g", "game", "Wabbajack game name") - }); - - public Command MakeCommand() - { - var command = new Command("steam-app-dump-info"); - command.Description = "Dumps information to the console about the given app"; - - command.Add(new Option(new[] {"-g", "-game", "-gameName"}, "Wabbajack game name")); - command.Handler = CommandHandler.Create(Run); - return command; - } - - public async Task Run(string gameName) - { - if (!GameRegistry.TryGetByFuzzyName(gameName, out var game)) - { - _logger.LogError("Can't find game {GameName} in game registry", gameName); - return 1; - } - - await _client.Login(); - var appId = (uint) game.SteamIDs.First(); - - if (!await _downloader.AccountHasAccess(appId)) - { - _logger.LogError("Your account does not have access to this Steam App"); - return 1; - } - - var appData = await _downloader.GetAppInfo((uint)game.SteamIDs.First()); - - Console.WriteLine("App Depots: "); - - Console.WriteLine(_dtos.Serialize(appData, true)); - - return 0; - } - - -} \ No newline at end of file diff --git a/Wabbajack.CLI/Verbs/SteamLogin.cs b/Wabbajack.CLI/Verbs/SteamLogin.cs deleted file mode 100644 index 4fb45e363..000000000 --- a/Wabbajack.CLI/Verbs/SteamLogin.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.CommandLine; -using System.CommandLine.Invocation; -using System.CommandLine.NamingConventionBinder; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Wabbajack.CLI.Builder; -using Wabbajack.Networking.Http.Interfaces; -using Wabbajack.Networking.Steam; -using Wabbajack.Paths; - -namespace Wabbajack.CLI.Verbs; - -public class SteamLogin -{ - private readonly ILogger _logger; - private readonly Client _client; - private readonly ITokenProvider _token; - - public SteamLogin(ILogger logger, Client steamClient, ITokenProvider token) - { - _logger = logger; - _client = steamClient; - _token = token; - } - - public static VerbDefinition Definition = new("steam-login", - "Logs into Steam via interactive prompts", new[] - { - new OptionDefinition(typeof(string), "u", "user", "Username for login") - }); - - public async Task Run(string user) - { - var token = await _token.Get(); - - if (token == null || token.User != user || string.IsNullOrWhiteSpace(token.Password)) - { - Console.WriteLine("Please enter password"); - var password = Console.ReadLine() ?? ""; - - await _token.SetToken(new SteamLoginState - { - User = user, - Password = password.Trim() - }); - } - - _logger.LogInformation("Attempting login"); - await _client.Login(); - - await Task.Delay(10000); - - return 0; - } - -} \ No newline at end of file diff --git a/Wabbajack.CLI/Wabbajack.CLI.csproj b/Wabbajack.CLI/Wabbajack.CLI.csproj index 0594154e1..d5ec7523a 100644 --- a/Wabbajack.CLI/Wabbajack.CLI.csproj +++ b/Wabbajack.CLI/Wabbajack.CLI.csproj @@ -19,15 +19,15 @@ - - - - - - - - - + + + + + + + + + diff --git a/Wabbajack.Common/Wabbajack.Common.csproj b/Wabbajack.Common/Wabbajack.Common.csproj index 4a2802b82..027264845 100644 --- a/Wabbajack.Common/Wabbajack.Common.csproj +++ b/Wabbajack.Common/Wabbajack.Common.csproj @@ -33,7 +33,9 @@ - + + + diff --git a/Wabbajack.Compiler.Test/Startup.cs b/Wabbajack.Compiler.Test/Startup.cs index 7b001891b..f526d1c2d 100644 --- a/Wabbajack.Compiler.Test/Startup.cs +++ b/Wabbajack.Compiler.Test/Startup.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Wabbajack.DTOs.Interventions; -using Wabbajack.Networking.Steam.UserInterventions; using Wabbajack.Networking.WabbajackClientApi; using Wabbajack.Services.OSIntegrated; using Xunit.DependencyInjection; @@ -22,33 +21,10 @@ public void ConfigureServices(IServiceCollection service) }); service.AddScoped(); - service.AddSingleton(); } public void Configure(ILoggerFactory loggerFactory, ITestOutputHelperAccessor accessor) { loggerFactory.AddProvider(new XunitTestOutputLoggerProvider(accessor, delegate { return true; })); } - - public class UserInterventionHandler : IUserInterventionHandler - { - public void Raise(IUserIntervention intervention) - { - if (intervention is GetAuthCode gac) - { - switch (gac.Type) - { - case GetAuthCode.AuthType.EmailCode: - Console.WriteLine("Please enter the Steam code that was just emailed to you"); - break; - case GetAuthCode.AuthType.TwoFactorAuth: - Console.WriteLine("Please enter your 2FA code for Steam"); - break; - default: - throw new ArgumentOutOfRangeException(); - } - gac.Finish(Console.ReadLine()!.Trim()); - } - } - } } \ No newline at end of file diff --git a/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj b/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj index a0833e165..11760428a 100644 --- a/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj +++ b/Wabbajack.Compiler.Test/Wabbajack.Compiler.Test.csproj @@ -9,19 +9,23 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Compiler/Wabbajack.Compiler.csproj b/Wabbajack.Compiler/Wabbajack.Compiler.csproj index ae5631f89..d1547c939 100644 --- a/Wabbajack.Compiler/Wabbajack.Compiler.csproj +++ b/Wabbajack.Compiler/Wabbajack.Compiler.csproj @@ -18,9 +18,12 @@ - + - + + + + diff --git a/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj b/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj index 3aed223e6..eac1d9983 100644 --- a/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj +++ b/Wabbajack.Compression.BSA.Test/Wabbajack.Compression.BSA.Test.csproj @@ -7,21 +7,24 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + + + + + + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Compression.BSA/Wabbajack.Compression.BSA.csproj b/Wabbajack.Compression.BSA/Wabbajack.Compression.BSA.csproj index 4565b2c92..2392ef696 100644 --- a/Wabbajack.Compression.BSA/Wabbajack.Compression.BSA.csproj +++ b/Wabbajack.Compression.BSA/Wabbajack.Compression.BSA.csproj @@ -18,7 +18,9 @@ - + + + diff --git a/Wabbajack.Compression.Zip.Test/Wabbajack.Compression.Zip.Test.csproj b/Wabbajack.Compression.Zip.Test/Wabbajack.Compression.Zip.Test.csproj index b658f0059..602f7f8a6 100644 --- a/Wabbajack.Compression.Zip.Test/Wabbajack.Compression.Zip.Test.csproj +++ b/Wabbajack.Compression.Zip.Test/Wabbajack.Compression.Zip.Test.csproj @@ -8,17 +8,18 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.DTOs.ConverterGenerators/Wabbajack.DTOs.ConverterGenerators.csproj b/Wabbajack.DTOs.ConverterGenerators/Wabbajack.DTOs.ConverterGenerators.csproj index f0a69d630..24217f6db 100644 --- a/Wabbajack.DTOs.ConverterGenerators/Wabbajack.DTOs.ConverterGenerators.csproj +++ b/Wabbajack.DTOs.ConverterGenerators/Wabbajack.DTOs.ConverterGenerators.csproj @@ -11,7 +11,12 @@ - + + + + + + diff --git a/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj b/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj index 2d530eadd..9de63fa5e 100644 --- a/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj +++ b/Wabbajack.DTOs.Test/Wabbajack.DTOs.Test.csproj @@ -7,23 +7,28 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/Wabbajack.DTOs/Wabbajack.DTOs.csproj b/Wabbajack.DTOs/Wabbajack.DTOs.csproj index 284b55ead..8e034f7e7 100644 --- a/Wabbajack.DTOs/Wabbajack.DTOs.csproj +++ b/Wabbajack.DTOs/Wabbajack.DTOs.csproj @@ -12,7 +12,8 @@ - + + diff --git a/Wabbajack.Downloaders.Bethesda/Wabbajack.Downloaders.Bethesda.csproj b/Wabbajack.Downloaders.Bethesda/Wabbajack.Downloaders.Bethesda.csproj index d012a5b6b..fb38b5387 100644 --- a/Wabbajack.Downloaders.Bethesda/Wabbajack.Downloaders.Bethesda.csproj +++ b/Wabbajack.Downloaders.Bethesda/Wabbajack.Downloaders.Bethesda.csproj @@ -13,7 +13,9 @@ - + + + diff --git a/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj b/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj index 9cc9a8e74..df3d6d56c 100644 --- a/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj +++ b/Wabbajack.Downloaders.Dispatcher.Test/Wabbajack.Downloaders.Dispatcher.Test.csproj @@ -7,20 +7,23 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Downloaders.Dispatcher/Wabbajack.Downloaders.Dispatcher.csproj b/Wabbajack.Downloaders.Dispatcher/Wabbajack.Downloaders.Dispatcher.csproj index e4131428f..01c7960ae 100644 --- a/Wabbajack.Downloaders.Dispatcher/Wabbajack.Downloaders.Dispatcher.csproj +++ b/Wabbajack.Downloaders.Dispatcher/Wabbajack.Downloaders.Dispatcher.csproj @@ -25,8 +25,11 @@ - - + + + + + diff --git a/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj b/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj index 2c4aed4f0..a4de6a07b 100644 --- a/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj +++ b/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj @@ -18,11 +18,14 @@ - - - - - + + + + + + + + diff --git a/Wabbajack.Downloaders.GoogleDrive/Wabbajack.Downloaders.GoogleDrive.csproj b/Wabbajack.Downloaders.GoogleDrive/Wabbajack.Downloaders.GoogleDrive.csproj index 552ba610c..275230da3 100644 --- a/Wabbajack.Downloaders.GoogleDrive/Wabbajack.Downloaders.GoogleDrive.csproj +++ b/Wabbajack.Downloaders.GoogleDrive/Wabbajack.Downloaders.GoogleDrive.csproj @@ -12,8 +12,10 @@ - - + + + + diff --git a/Wabbajack.Downloaders.Http/Wabbajack.Downloaders.Http.csproj b/Wabbajack.Downloaders.Http/Wabbajack.Downloaders.Http.csproj index 03862d2fb..dcb06d1a7 100644 --- a/Wabbajack.Downloaders.Http/Wabbajack.Downloaders.Http.csproj +++ b/Wabbajack.Downloaders.Http/Wabbajack.Downloaders.Http.csproj @@ -17,7 +17,9 @@ - + + + diff --git a/Wabbajack.Downloaders.IPS4OAuth2Downloader/Wabbajack.Downloaders.IPS4OAuth2Downloader.csproj b/Wabbajack.Downloaders.IPS4OAuth2Downloader/Wabbajack.Downloaders.IPS4OAuth2Downloader.csproj index 5898b6366..070ddd96e 100644 --- a/Wabbajack.Downloaders.IPS4OAuth2Downloader/Wabbajack.Downloaders.IPS4OAuth2Downloader.csproj +++ b/Wabbajack.Downloaders.IPS4OAuth2Downloader/Wabbajack.Downloaders.IPS4OAuth2Downloader.csproj @@ -17,8 +17,10 @@ - - + + + + diff --git a/Wabbajack.Downloaders.Interfaces/Wabbajack.Downloaders.Interfaces.csproj b/Wabbajack.Downloaders.Interfaces/Wabbajack.Downloaders.Interfaces.csproj index d68d5a9cd..8dc566102 100644 --- a/Wabbajack.Downloaders.Interfaces/Wabbajack.Downloaders.Interfaces.csproj +++ b/Wabbajack.Downloaders.Interfaces/Wabbajack.Downloaders.Interfaces.csproj @@ -7,6 +7,11 @@ $(VERSION) + + + + + diff --git a/Wabbajack.Downloaders.Manual/Wabbajack.Downloaders.Manual.csproj b/Wabbajack.Downloaders.Manual/Wabbajack.Downloaders.Manual.csproj index 921284497..527574e55 100644 --- a/Wabbajack.Downloaders.Manual/Wabbajack.Downloaders.Manual.csproj +++ b/Wabbajack.Downloaders.Manual/Wabbajack.Downloaders.Manual.csproj @@ -12,7 +12,9 @@ - + + + diff --git a/Wabbajack.Downloaders.MediaFire/Wabbajack.Downloaders.MediaFire.csproj b/Wabbajack.Downloaders.MediaFire/Wabbajack.Downloaders.MediaFire.csproj index 3928aa4f8..78add5a67 100644 --- a/Wabbajack.Downloaders.MediaFire/Wabbajack.Downloaders.MediaFire.csproj +++ b/Wabbajack.Downloaders.MediaFire/Wabbajack.Downloaders.MediaFire.csproj @@ -6,9 +6,10 @@ - - - + + + + diff --git a/Wabbajack.Downloaders.Mega/Wabbajack.Downloaders.Mega.csproj b/Wabbajack.Downloaders.Mega/Wabbajack.Downloaders.Mega.csproj index 6dcb15dc0..f75932b26 100644 --- a/Wabbajack.Downloaders.Mega/Wabbajack.Downloaders.Mega.csproj +++ b/Wabbajack.Downloaders.Mega/Wabbajack.Downloaders.Mega.csproj @@ -12,9 +12,11 @@ - - - + + + + + diff --git a/Wabbajack.Downloaders.ModDB/Wabbajack.Downloaders.ModDB.csproj b/Wabbajack.Downloaders.ModDB/Wabbajack.Downloaders.ModDB.csproj index 5e420baf2..6a468b8ce 100644 --- a/Wabbajack.Downloaders.ModDB/Wabbajack.Downloaders.ModDB.csproj +++ b/Wabbajack.Downloaders.ModDB/Wabbajack.Downloaders.ModDB.csproj @@ -13,10 +13,12 @@ - - - - + + + + + + diff --git a/Wabbajack.Downloaders.Nexus/Wabbajack.Downloaders.Nexus.csproj b/Wabbajack.Downloaders.Nexus/Wabbajack.Downloaders.Nexus.csproj index 15f7493b6..3288b17c7 100644 --- a/Wabbajack.Downloaders.Nexus/Wabbajack.Downloaders.Nexus.csproj +++ b/Wabbajack.Downloaders.Nexus/Wabbajack.Downloaders.Nexus.csproj @@ -7,6 +7,11 @@ $(VERSION) + + + + + diff --git a/Wabbajack.Downloaders.VerificationCache/Wabbajack.Downloaders.VerificationCache.csproj b/Wabbajack.Downloaders.VerificationCache/Wabbajack.Downloaders.VerificationCache.csproj index e155554bd..f6fd10541 100644 --- a/Wabbajack.Downloaders.VerificationCache/Wabbajack.Downloaders.VerificationCache.csproj +++ b/Wabbajack.Downloaders.VerificationCache/Wabbajack.Downloaders.VerificationCache.csproj @@ -12,8 +12,10 @@ - - + + + + diff --git a/Wabbajack.Downloaders.WabbajackCDN/Wabbajack.Downloaders.WabbajackCDN.csproj b/Wabbajack.Downloaders.WabbajackCDN/Wabbajack.Downloaders.WabbajackCDN.csproj index 61f8f5e0f..7f71c7e47 100644 --- a/Wabbajack.Downloaders.WabbajackCDN/Wabbajack.Downloaders.WabbajackCDN.csproj +++ b/Wabbajack.Downloaders.WabbajackCDN/Wabbajack.Downloaders.WabbajackCDN.csproj @@ -15,7 +15,9 @@ - + + + diff --git a/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj b/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj index 97a033c34..74c6cbdfd 100644 --- a/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj +++ b/Wabbajack.FileExtractor.Test/Wabbajack.FileExtractor.Test.csproj @@ -7,22 +7,24 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - - + + + + + + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.FileExtractor/Wabbajack.FileExtractor.csproj b/Wabbajack.FileExtractor/Wabbajack.FileExtractor.csproj index a85e27df5..c1784a3ee 100644 --- a/Wabbajack.FileExtractor/Wabbajack.FileExtractor.csproj +++ b/Wabbajack.FileExtractor/Wabbajack.FileExtractor.csproj @@ -29,7 +29,9 @@ - + + + diff --git a/Wabbajack.Hashing.PHash.Test/Wabbajack.Hashing.PHash.Test.csproj b/Wabbajack.Hashing.PHash.Test/Wabbajack.Hashing.PHash.Test.csproj index c3181a1a1..3e157d36f 100644 --- a/Wabbajack.Hashing.PHash.Test/Wabbajack.Hashing.PHash.Test.csproj +++ b/Wabbajack.Hashing.PHash.Test/Wabbajack.Hashing.PHash.Test.csproj @@ -7,20 +7,23 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - + + + + + - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Hashing.PHash/Wabbajack.Hashing.PHash.csproj b/Wabbajack.Hashing.PHash/Wabbajack.Hashing.PHash.csproj index 8cd08d916..37fddf622 100644 --- a/Wabbajack.Hashing.PHash/Wabbajack.Hashing.PHash.csproj +++ b/Wabbajack.Hashing.PHash/Wabbajack.Hashing.PHash.csproj @@ -9,7 +9,10 @@ + + + diff --git a/Wabbajack.Hashing.xxHash64.Benchmark/Wabbajack.Hashing.xxHash64.Benchmark.csproj b/Wabbajack.Hashing.xxHash64.Benchmark/Wabbajack.Hashing.xxHash64.Benchmark.csproj index 9d734ec89..f8036da12 100644 --- a/Wabbajack.Hashing.xxHash64.Benchmark/Wabbajack.Hashing.xxHash64.Benchmark.csproj +++ b/Wabbajack.Hashing.xxHash64.Benchmark/Wabbajack.Hashing.xxHash64.Benchmark.csproj @@ -8,7 +8,8 @@ - + + diff --git a/Wabbajack.Hashing.xxHash64.Test/Wabbajack.Hashing.xxHash64.Test.csproj b/Wabbajack.Hashing.xxHash64.Test/Wabbajack.Hashing.xxHash64.Test.csproj index 3e15de15d..97b2821f0 100644 --- a/Wabbajack.Hashing.xxHash64.Test/Wabbajack.Hashing.xxHash64.Test.csproj +++ b/Wabbajack.Hashing.xxHash64.Test/Wabbajack.Hashing.xxHash64.Test.csproj @@ -7,18 +7,19 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj b/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj index 7801ce0b4..0166409f1 100644 --- a/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj +++ b/Wabbajack.Installer.Test/Wabbajack.Installer.Test.csproj @@ -7,19 +7,22 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Installer/Wabbajack.Installer.csproj b/Wabbajack.Installer/Wabbajack.Installer.csproj index a716e2f6f..31eb53f53 100644 --- a/Wabbajack.Installer/Wabbajack.Installer.csproj +++ b/Wabbajack.Installer/Wabbajack.Installer.csproj @@ -24,8 +24,11 @@ - + + + + diff --git a/Wabbajack.Launcher/Wabbajack.Launcher.csproj b/Wabbajack.Launcher/Wabbajack.Launcher.csproj index 8bda98577..e4cda14ce 100644 --- a/Wabbajack.Launcher/Wabbajack.Launcher.csproj +++ b/Wabbajack.Launcher/Wabbajack.Launcher.csproj @@ -19,22 +19,25 @@ net9.0-windows - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + + + + - - + + + + - + + diff --git a/Wabbajack.Networking.BethesdaNet/Wabbajack.Networking.BethesdaNet.csproj b/Wabbajack.Networking.BethesdaNet/Wabbajack.Networking.BethesdaNet.csproj index 45fbc5bce..8dd3b7ef8 100644 --- a/Wabbajack.Networking.BethesdaNet/Wabbajack.Networking.BethesdaNet.csproj +++ b/Wabbajack.Networking.BethesdaNet/Wabbajack.Networking.BethesdaNet.csproj @@ -10,6 +10,11 @@ CS8600,CS8601,CS8618,CS8604 + + + + + ..\..\..\Program Files\dotnet\shared\Microsoft.AspNetCore.App\6.0.1\Microsoft.Extensions.Logging.Abstractions.dll diff --git a/Wabbajack.Networking.Discord/Wabbajack.Networking.Discord.csproj b/Wabbajack.Networking.Discord/Wabbajack.Networking.Discord.csproj index 26b586aca..f48cc23fe 100644 --- a/Wabbajack.Networking.Discord/Wabbajack.Networking.Discord.csproj +++ b/Wabbajack.Networking.Discord/Wabbajack.Networking.Discord.csproj @@ -16,7 +16,8 @@ - + + diff --git a/Wabbajack.Networking.GitHub/Wabbajack.Networking.GitHub.csproj b/Wabbajack.Networking.GitHub/Wabbajack.Networking.GitHub.csproj index 1c4b108a1..a0d70b15f 100644 --- a/Wabbajack.Networking.GitHub/Wabbajack.Networking.GitHub.csproj +++ b/Wabbajack.Networking.GitHub/Wabbajack.Networking.GitHub.csproj @@ -17,8 +17,10 @@ - - + + + + diff --git a/Wabbajack.Networking.Http.Test/Wabbajack.Networking.Http.Test.csproj b/Wabbajack.Networking.Http.Test/Wabbajack.Networking.Http.Test.csproj index 8d71f1be0..bea6fda81 100644 --- a/Wabbajack.Networking.Http.Test/Wabbajack.Networking.Http.Test.csproj +++ b/Wabbajack.Networking.Http.Test/Wabbajack.Networking.Http.Test.csproj @@ -8,17 +8,20 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Networking.Http/Wabbajack.Networking.Http.csproj b/Wabbajack.Networking.Http/Wabbajack.Networking.Http.csproj index 4f158d080..c577a81a5 100644 --- a/Wabbajack.Networking.Http/Wabbajack.Networking.Http.csproj +++ b/Wabbajack.Networking.Http/Wabbajack.Networking.Http.csproj @@ -8,9 +8,10 @@ - - - + + + + diff --git a/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj b/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj index 120833436..fc9697500 100644 --- a/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj +++ b/Wabbajack.Networking.NexusApi.Test/Wabbajack.Networking.NexusApi.Test.csproj @@ -7,20 +7,24 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + + + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Networking.NexusApi/Wabbajack.Networking.NexusApi.csproj b/Wabbajack.Networking.NexusApi/Wabbajack.Networking.NexusApi.csproj index dbd139db4..571cefe0a 100644 --- a/Wabbajack.Networking.NexusApi/Wabbajack.Networking.NexusApi.csproj +++ b/Wabbajack.Networking.NexusApi/Wabbajack.Networking.NexusApi.csproj @@ -12,8 +12,9 @@ - - + + + diff --git a/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj b/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj index ffd1dd911..99b921d4c 100644 --- a/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj +++ b/Wabbajack.Networking.Steam.Test/Wabbajack.Networking.Steam.Test.csproj @@ -8,21 +8,24 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - - - + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Networking.Steam/Wabbajack.Networking.Steam.csproj b/Wabbajack.Networking.Steam/Wabbajack.Networking.Steam.csproj index 8b182a385..ba1950ee0 100644 --- a/Wabbajack.Networking.Steam/Wabbajack.Networking.Steam.csproj +++ b/Wabbajack.Networking.Steam/Wabbajack.Networking.Steam.csproj @@ -11,8 +11,10 @@ - - + + + + diff --git a/Wabbajack.Networking.WabbajackClientApi/Wabbajack.Networking.WabbajackClientApi.csproj b/Wabbajack.Networking.WabbajackClientApi/Wabbajack.Networking.WabbajackClientApi.csproj index 3a8ad26a0..efa72396e 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Wabbajack.Networking.WabbajackClientApi.csproj +++ b/Wabbajack.Networking.WabbajackClientApi/Wabbajack.Networking.WabbajackClientApi.csproj @@ -12,9 +12,11 @@ - - - + + + + + diff --git a/Wabbajack.Paths.IO.Test/Wabbajack.Paths.IO.Test.csproj b/Wabbajack.Paths.IO.Test/Wabbajack.Paths.IO.Test.csproj index e976433e9..69e853dd8 100644 --- a/Wabbajack.Paths.IO.Test/Wabbajack.Paths.IO.Test.csproj +++ b/Wabbajack.Paths.IO.Test/Wabbajack.Paths.IO.Test.csproj @@ -7,18 +7,19 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Paths.Test/Wabbajack.Paths.Test.csproj b/Wabbajack.Paths.Test/Wabbajack.Paths.Test.csproj index f8562675a..ca84c6fce 100644 --- a/Wabbajack.Paths.Test/Wabbajack.Paths.Test.csproj +++ b/Wabbajack.Paths.Test/Wabbajack.Paths.Test.csproj @@ -7,17 +7,18 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.RateLimiter.Test/Wabbajack.RateLimiter.Test.csproj b/Wabbajack.RateLimiter.Test/Wabbajack.RateLimiter.Test.csproj index f9069357c..855aa1e3a 100644 --- a/Wabbajack.RateLimiter.Test/Wabbajack.RateLimiter.Test.csproj +++ b/Wabbajack.RateLimiter.Test/Wabbajack.RateLimiter.Test.csproj @@ -8,17 +8,18 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.Server.Lib/Wabbajack.Server.Lib.csproj b/Wabbajack.Server.Lib/Wabbajack.Server.Lib.csproj index 0fa9a42eb..f57a06219 100644 --- a/Wabbajack.Server.Lib/Wabbajack.Server.Lib.csproj +++ b/Wabbajack.Server.Lib/Wabbajack.Server.Lib.csproj @@ -16,9 +16,12 @@ - + + + - + + diff --git a/Wabbajack.Services.OSIntegrated/ServiceExtensions.cs b/Wabbajack.Services.OSIntegrated/ServiceExtensions.cs index 572588125..a72d50db9 100644 --- a/Wabbajack.Services.OSIntegrated/ServiceExtensions.cs +++ b/Wabbajack.Services.OSIntegrated/ServiceExtensions.cs @@ -26,7 +26,6 @@ using Wabbajack.Networking.Http; using Wabbajack.Networking.Http.Interfaces; using Wabbajack.Networking.NexusApi; -using Wabbajack.Networking.Steam; using Wabbajack.Networking.WabbajackClientApi; using Wabbajack.Paths; using Wabbajack.Paths.IO; @@ -159,8 +158,6 @@ public static IServiceCollection AddOSIntegrated(this IServiceCollection service service.AddSingleton(); service.AddResumableHttpDownloader(); - service.AddSteam(); - service.AddSingleton(); service.AddSingleton(); service.AddBethesdaNet(); @@ -177,10 +174,6 @@ public static IServiceCollection AddOSIntegrated(this IServiceCollection service .AddAllSingleton, EncryptedJsonTokenProvider, VectorPlexusTokenProvider>(); - service - .AddAllSingleton, EncryptedJsonTokenProvider, - SteamTokenProvider>(); - service.AddAllSingleton, WabbajackApiTokenProvider>(); service diff --git a/Wabbajack.Services.OSIntegrated/TokenProviders/SteamTokenProvider.cs b/Wabbajack.Services.OSIntegrated/TokenProviders/SteamTokenProvider.cs deleted file mode 100644 index 1431fee3a..000000000 --- a/Wabbajack.Services.OSIntegrated/TokenProviders/SteamTokenProvider.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.Extensions.Logging; -using Wabbajack.DTOs.JsonConverters; -using Wabbajack.Networking.Steam; - -namespace Wabbajack.Services.OSIntegrated.TokenProviders; - -public class SteamTokenProvider : EncryptedJsonTokenProvider -{ - public SteamTokenProvider(ILogger logger, DTOSerializer dtos) : base(logger, dtos, - "steam-login") - { - } -} \ No newline at end of file diff --git a/Wabbajack.Services.OSIntegrated/Wabbajack.Services.OSIntegrated.csproj b/Wabbajack.Services.OSIntegrated/Wabbajack.Services.OSIntegrated.csproj index f5483f4bc..9a2f1a885 100644 --- a/Wabbajack.Services.OSIntegrated/Wabbajack.Services.OSIntegrated.csproj +++ b/Wabbajack.Services.OSIntegrated/Wabbajack.Services.OSIntegrated.csproj @@ -12,13 +12,15 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + + @@ -27,7 +29,6 @@ - diff --git a/Wabbajack.VFS.Interfaces/Wabbajack.VFS.Interfaces.csproj b/Wabbajack.VFS.Interfaces/Wabbajack.VFS.Interfaces.csproj index 26877da82..a8bf9ba74 100644 --- a/Wabbajack.VFS.Interfaces/Wabbajack.VFS.Interfaces.csproj +++ b/Wabbajack.VFS.Interfaces/Wabbajack.VFS.Interfaces.csproj @@ -6,6 +6,11 @@ enable + + + + + diff --git a/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj b/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj index c790ef6ff..8b86d4daf 100644 --- a/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj +++ b/Wabbajack.VFS.Test/Wabbajack.VFS.Test.csproj @@ -7,26 +7,29 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + + + + + + + - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Wabbajack.VFS/Wabbajack.VFS.csproj b/Wabbajack.VFS/Wabbajack.VFS.csproj index cf70222c4..31db6e8bd 100644 --- a/Wabbajack.VFS/Wabbajack.VFS.csproj +++ b/Wabbajack.VFS/Wabbajack.VFS.csproj @@ -12,8 +12,11 @@ - - + + + + + diff --git a/Wabbajack.sln b/Wabbajack.sln index 854332563..2c2610a80 100644 --- a/Wabbajack.sln +++ b/Wabbajack.sln @@ -117,10 +117,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wabbajack.Downloaders.GameF EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wabbajack.Launcher", "Wabbajack.Launcher\Wabbajack.Launcher.csproj", "{23D49FCC-A6CB-4873-879B-F90DA1871AA3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wabbajack.Networking.Steam", "Wabbajack.Networking.Steam\Wabbajack.Networking.Steam.csproj", "{AB9A5C22-10CC-4EE0-A808-FB1DC9E24247}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wabbajack.Networking.Steam.Test", "Wabbajack.Networking.Steam.Test\Wabbajack.Networking.Steam.Test.csproj", "{D6351587-CAF6-4CB6-A2BD-5368E69F297C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{18E36813-CB53-4172-8FF3-EFE3B9B30A5F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wabbajack.Networking.Http.Test", "Wabbajack.Networking.Http.Test\Wabbajack.Networking.Http.Test.csproj", "{34FC755D-24F0-456A-B5C1-5BA7F12DC233}" @@ -345,14 +341,6 @@ Global {23D49FCC-A6CB-4873-879B-F90DA1871AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU {23D49FCC-A6CB-4873-879B-F90DA1871AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU {23D49FCC-A6CB-4873-879B-F90DA1871AA3}.Release|Any CPU.Build.0 = Release|Any CPU - {AB9A5C22-10CC-4EE0-A808-FB1DC9E24247}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB9A5C22-10CC-4EE0-A808-FB1DC9E24247}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB9A5C22-10CC-4EE0-A808-FB1DC9E24247}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB9A5C22-10CC-4EE0-A808-FB1DC9E24247}.Release|Any CPU.Build.0 = Release|Any CPU - {D6351587-CAF6-4CB6-A2BD-5368E69F297C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D6351587-CAF6-4CB6-A2BD-5368E69F297C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D6351587-CAF6-4CB6-A2BD-5368E69F297C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D6351587-CAF6-4CB6-A2BD-5368E69F297C}.Release|Any CPU.Build.0 = Release|Any CPU {34FC755D-24F0-456A-B5C1-5BA7F12DC233}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {34FC755D-24F0-456A-B5C1-5BA7F12DC233}.Debug|Any CPU.Build.0 = Debug|Any CPU {34FC755D-24F0-456A-B5C1-5BA7F12DC233}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -440,8 +428,6 @@ Global {29AC8A68-D5EC-43F5-B2CC-72A75545E418} = {98B731EE-4FC0-4482-A069-BCBA25497871} {DEB4B073-4EAA-49FD-9D43-F0F8CB930E7A} = {F01F8595-5FD7-4506-8469-F4A5522DACC1} {4F252332-CA77-41DE-95A8-9DF38A81D675} = {98B731EE-4FC0-4482-A069-BCBA25497871} - {AB9A5C22-10CC-4EE0-A808-FB1DC9E24247} = {F01F8595-5FD7-4506-8469-F4A5522DACC1} - {D6351587-CAF6-4CB6-A2BD-5368E69F297C} = {F01F8595-5FD7-4506-8469-F4A5522DACC1} {34FC755D-24F0-456A-B5C1-5BA7F12DC233} = {F01F8595-5FD7-4506-8469-F4A5522DACC1} {10165025-D30B-44B7-A764-50E15603AE56} = {F677890D-5109-43BC-97C7-C4CD47C8EE0C} {64AD7E26-5643-4969-A61C-E0A90FA25FCB} = {F677890D-5109-43BC-97C7-C4CD47C8EE0C} From 1b4510f0713662c1e5e2fcbc3b5345017351cff7 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:18:30 +0100 Subject: [PATCH 257/294] Fix downloads location no longer being set automatically --- Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index 2707520be..303283ed0 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -148,7 +148,7 @@ public InstallationView() .Subscribe(x => { DownloadLocationPicker.Watermark = x; - if (string.IsNullOrEmpty(ViewModel?.Installer?.Location?.TargetPath.ToString())) + if (string.IsNullOrEmpty(ViewModel?.Installer?.DownloadLocation?.TargetPath.ToString())) ViewModel.Installer.DownloadLocation.TargetPath = (AbsolutePath)x; }) .DisposeWith(disposables); From 8c6391498ca8fea0c6c5e5cc5105c8ffc7d55064 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:28:03 +0100 Subject: [PATCH 258/294] Add 'open log folder' button to installation view when log viewer is open --- .../ViewModels/Installers/InstallationVM.cs | 6 +++--- .../Views/Installers/InstallationView.xaml | 10 ++++++++++ .../Views/Installers/InstallationView.xaml.cs | 8 ++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs index 72d3ce648..df4282b64 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs @@ -134,7 +134,7 @@ public InstallResult? InstallResult public ICommand OpenWebsiteCommand { get; } public ICommand OpenMissingArchivesCommand { get; } public ICommand BackToGalleryCommand { get; } - public ICommand OpenLogsCommand { get; } + public ICommand OpenLogFolderCommand { get; } public ICommand OpenInstallFolderCommand { get; } public ICommand InstallCommand { get; } public ICommand CancelCommand { get; } @@ -198,9 +198,9 @@ public InstallationVM(ILogger logger, DTOSerializer dtos, Settin }; WabbajackFileLocation.Filters.Add(new CommonFileDialogFilter("Wabbajack modlist", "*.wabbajack")); - OpenLogsCommand = ReactiveCommand.Create(() => + OpenLogFolderCommand = ReactiveCommand.Create(() => { - UIUtils.OpenFolder(_configuration.LogLocation); + UIUtils.OpenFolderAndSelectFile(_configuration.LogLocation.Combine("Wabbajack.current.log")); }); OpenDiscordButton = ReactiveCommand.Create(() => diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml index c2caab996..c57ff66c7 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml @@ -264,6 +264,16 @@ MinWidth="160" Width="{Binding ActualWidth, ElementName=RightSideGrid, Converter={StaticResource MathConverter}, ConverterParameter=x/4.5}" HorizontalAlignment="Right" /> + + diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index 303283ed0..33d789c7a 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -73,12 +73,20 @@ public InstallationView() this.BindCommand(ViewModel, vm => vm.OpenReadmeCommand, v => v.OpenReadmeButton) .DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.OpenLogFolderCommand, v => v.OpenLogFolderButton) + .DisposeWith(disposables); + this.WhenAnyValue(x => x.ReadmeToggleButton.IsChecked) .Select(x => x ?? false ? Visibility.Visible : Visibility.Hidden) .BindToStrict(this, x => x.OpenReadmeButton.Visibility) .DisposeWith(disposables); + this.WhenAnyValue(x => x.LogToggleButton.IsChecked) + .Select(x => x ?? false ? Visibility.Visible : Visibility.Hidden) + .BindToStrict(this, x => x.OpenLogFolderButton.Visibility) + .DisposeWith(disposables); + ViewModel.WhenAnyValue(vm => vm.InstallResult) .ObserveOnGuiThread() .Subscribe(result => From 452b021105246de0152f25c45bf82c39c94c067c Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 21 Jan 2025 21:57:09 +0100 Subject: [PATCH 259/294] WIP tweaks to settings menu --- .../LoginManagers/NexusLoginManager.cs | 4 +- Wabbajack.App.Wpf/Themes/Styles.xaml | 60 +++++++++++++++++++ .../ViewModels/Settings/LoginManagerVM.cs | 1 - .../Views/Installers/InstallationView.xaml.cs | 1 - .../Views/Settings/LoginItemView.xaml | 31 +++------- .../Views/Settings/LoginItemView.xaml.cs | 2 + .../Views/Settings/LoginSettingsView.xaml | 24 ++------ .../Views/Settings/SettingsView.xaml | 15 ----- .../Views/Settings/SettingsView.xaml.cs | 2 - 9 files changed, 78 insertions(+), 62 deletions(-) diff --git a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs index 67f370b29..70b448e83 100644 --- a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs @@ -1,6 +1,7 @@ using System; using System.Reactive.Linq; using System.Threading.Tasks; +using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; @@ -48,8 +49,7 @@ public NexusLoginManager(ILogger logger, ITokenProvider v.HaveLogin)); - Icon = BitmapFrame.Create( - typeof(NexusLoginManager).Assembly.GetManifestResourceStream("Wabbajack.App.Wpf.LoginManagers.Icons.nexus.png")!); + Icon = (DrawingImage)Application.Current.Resources["NexusLogo"]; TriggerLogin = ReactiveCommand.CreateFromTask(async () => { diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index b1c9fa1a7..d24ca5e6f 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -5021,4 +5021,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs index e7103efd6..e4e01ef9a 100644 --- a/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs @@ -5,7 +5,6 @@ namespace Wabbajack; - public class LoginManagerVM : BackNavigatingVM { public LoginTargetVM[] Logins { get; } diff --git a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs index 33d789c7a..35580ca0d 100644 --- a/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Installers/InstallationView.xaml.cs @@ -76,7 +76,6 @@ public InstallationView() this.BindCommand(ViewModel, vm => vm.OpenLogFolderCommand, v => v.OpenLogFolderButton) .DisposeWith(disposables); - this.WhenAnyValue(x => x.ReadmeToggleButton.IsChecked) .Select(x => x ?? false ? Visibility.Visible : Visibility.Hidden) .BindToStrict(this, x => x.OpenReadmeButton.Visibility) diff --git a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml index 9c25dbe0f..2b67adc89 100644 --- a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml +++ b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml @@ -10,31 +10,18 @@ d:DesignWidth="800" x:TypeArguments="local:LoginTargetVM" mc:Ignorable="d"> - + - + - - + - - - diff --git a/Wabbajack.App.Wpf/Views/Settings/SettingsView.xaml.cs b/Wabbajack.App.Wpf/Views/Settings/SettingsView.xaml.cs index 4884917c1..ae18a6711 100644 --- a/Wabbajack.App.Wpf/Views/Settings/SettingsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Settings/SettingsView.xaml.cs @@ -13,8 +13,6 @@ public SettingsView() InitializeComponent(); this.WhenActivated(disposable => { - this.OneWayBindStrict(this.ViewModel, x => x.CloseCommand, x => x.BackButton.Command) - .DisposeWith(disposable); this.OneWayBindStrict(this.ViewModel, x => x.Login, x => x.LoginView.ViewModel) .DisposeWith(disposable); this.OneWayBindStrict(this.ViewModel, x => x.Performance, x => x.PerformanceView.ViewModel) From a0bbf871f488fba7f6f76c317dc640ec473744d0 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:52:12 +0100 Subject: [PATCH 260/294] Replace deprecated Sort() with new SortAndBind() from DynamicData --- Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs | 5 +---- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index e91a3c4ee..c3a45165f 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -231,7 +231,6 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL .ThenByDescending(m => m.Metadata.Title.Contains(s ?? "", StringComparison.InvariantCultureIgnoreCase)) .ThenByDescending(m => !m.IsBroken)); _modLists.Connect() - .ObserveOn(RxApp.MainThreadScheduler) .Filter(searchTextPredicates) .Filter(onlyInstalledGamesFilter) .Filter(includeUnofficialFilter) @@ -241,9 +240,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL .Filter(maxModlistSizeFilter) .Filter(includedTagsFilter) .Filter(includedModsFilter) - .Sort(searchSorter) - .TreatMovesAsRemoveAdd() - .Bind(out _filteredModLists) + .SortAndBind(out _filteredModLists, searchSorter) .Subscribe(_ => { if (!_filteringOnGame) diff --git a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj index 76765b23d..857ddf07b 100644 --- a/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj +++ b/Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj @@ -86,7 +86,7 @@ - + NU1701 From fa9a05def2c2f30609e82b00d0923e775cceae3d Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:58:57 +0100 Subject: [PATCH 261/294] Fix closed handler not being invoked on exiting browser window, add new login buttons --- .../LoginManagers/INeedsLogin.cs | 3 +- .../LoginManagers/LoversLabLoginManager.cs | 15 ++++-- .../LoginManagers/NexusLoginManager.cs | 28 ++++++++--- .../LoginManagers/VectorPlexusLoginManager.cs | 15 ++++-- .../ViewModels/BrowserWindowViewModel.cs | 1 + Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 2 +- .../ViewModels/Settings/LoginManagerVM.cs | 1 + Wabbajack.App.Wpf/Views/MainWindow.xaml.cs | 2 +- .../Views/Settings/LoginItemView.xaml | 3 +- .../Views/Settings/LoginItemView.xaml.cs | 50 +++++++++++++++++-- 10 files changed, 98 insertions(+), 22 deletions(-) diff --git a/Wabbajack.App.Wpf/LoginManagers/INeedsLogin.cs b/Wabbajack.App.Wpf/LoginManagers/INeedsLogin.cs index 9e6cea24a..05b2b77c4 100644 --- a/Wabbajack.App.Wpf/LoginManagers/INeedsLogin.cs +++ b/Wabbajack.App.Wpf/LoginManagers/INeedsLogin.cs @@ -10,12 +10,13 @@ public interface INeedsLogin string SiteName { get; } ICommand TriggerLogin { get; set; } ICommand ClearLogin { get; set; } + ICommand ToggleLogin { get; set; } ImageSource Icon { get; set; } Type LoginFor(); + public bool LoggedIn { get; set; } } public interface ILoginFor : INeedsLogin where T : IDownloader { - } \ No newline at end of file diff --git a/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs index 6923e25e5..4cdd8bbe9 100644 --- a/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs @@ -25,6 +25,7 @@ public class LoversLabLoginManager : ViewModel, ILoginFor public string SiteName { get; } = "Lovers Lab"; public ICommand TriggerLogin { get; set; } public ICommand ClearLogin { get; set; } + public ICommand ToggleLogin { get; set; } public ImageSource Icon { get; set; } public Type LoginFor() @@ -33,7 +34,7 @@ public Type LoginFor() } [Reactive] - public bool HaveLogin { get; set; } + public bool LoggedIn { get; set; } public LoversLabLoginManager(ILogger logger, ITokenProvider token, IServiceProvider serviceProvider) { @@ -47,7 +48,7 @@ public LoversLabLoginManager(ILogger logger, ITokenProvid _logger.LogInformation("Deleting Login information for {SiteName}", SiteName); await _token.Delete(); RefreshTokenState(); - }, this.WhenAnyValue(v => v.HaveLogin)); + }, this.WhenAnyValue(v => v.LoggedIn)); Icon = BitmapFrame.Create( typeof(LoversLabLoginManager).Assembly.GetManifestResourceStream("Wabbajack.App.Wpf.LoginManagers.Icons.lovers_lab.png")!); @@ -56,7 +57,13 @@ public LoversLabLoginManager(ILogger logger, ITokenProvid { _logger.LogInformation("Logging into {SiteName}", SiteName); StartLogin(); - }, this.WhenAnyValue(v => v.HaveLogin).Select(v => !v)); + }, this.WhenAnyValue(v => v.LoggedIn).Select(v => !v)); + + ToggleLogin = ReactiveCommand.Create(() => + { + if (LoggedIn) ClearLogin.Execute(null); + else TriggerLogin.Execute(null); + }); } private void StartLogin() @@ -68,6 +75,6 @@ private void StartLogin() private void RefreshTokenState() { - HaveLogin = _token.HaveToken(); + LoggedIn = _token.HaveToken(); } } \ No newline at end of file diff --git a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs index 70b448e83..d1209a652 100644 --- a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs @@ -26,6 +26,7 @@ public class NexusLoginManager : ViewModel, ILoginFor public string SiteName { get; } = "Nexus Mods"; public ICommand TriggerLogin { get; set; } public ICommand ClearLogin { get; set; } + public ICommand ToggleLogin { get; set; } public ImageSource Icon { get; set; } public Type LoginFor() @@ -34,7 +35,7 @@ public Type LoginFor() } [Reactive] - public bool HaveLogin { get; set; } + public bool LoggedIn { get; set; } public NexusLoginManager(ILogger logger, ITokenProvider token, IServiceProvider serviceProvider) { @@ -47,16 +48,21 @@ public NexusLoginManager(ILogger logger, ITokenProvider v.HaveLogin)); + }, this.WhenAnyValue(v => v.LoggedIn)); Icon = (DrawingImage)Application.Current.Resources["NexusLogo"]; TriggerLogin = ReactiveCommand.CreateFromTask(async () => { _logger.LogInformation("Logging into {SiteName}", SiteName); - //MessageBus.Current.SendMessage(new OpenBrowserTab(_serviceProvider.GetRequiredService())); StartLogin(); - }, this.WhenAnyValue(v => v.HaveLogin).Select(v => !v)); + }, this.WhenAnyValue(v => v.LoggedIn).Select(v => !v)); + + ToggleLogin = ReactiveCommand.Create(() => + { + if (LoggedIn) ClearLogin.Execute(null); + else TriggerLogin.Execute(null); + }); } private async Task ClearLoginToken() @@ -68,14 +74,22 @@ private async Task ClearLoginToken() private void StartLogin() { var handler = _serviceProvider.GetRequiredService(); - handler.Closed += async (sender, args) => { await RefreshTokenState(); }; + handler.Closed += async (_, _) => await RefreshTokenState(); ShowBrowserWindow.Send(handler); } private async Task RefreshTokenState() { - var token = await _token.Get(); + NexusOAuthState token = null; + try + { + token = await _token.Get(); + } + catch(Exception ex) + { + _logger.LogError("Failed to refresh Nexus token state: {ex}", ex.ToString()); + } - HaveLogin = _token.HaveToken() && !(token?.OAuth?.IsExpired ?? true); + LoggedIn = _token.HaveToken() && !(token?.OAuth?.IsExpired ?? true); } } \ No newline at end of file diff --git a/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs index e0c469bab..7f43150db 100644 --- a/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs @@ -25,6 +25,7 @@ public class VectorPlexusLoginManager : ViewModel, ILoginFor logger, ITokenProvider token, IServiceProvider serviceProvider) { @@ -47,7 +48,7 @@ public VectorPlexusLoginManager(ILogger logger, IToken _logger.LogInformation("Deleting Login information for {SiteName}", SiteName); await _token.Delete(); RefreshTokenState(); - }, this.WhenAnyValue(v => v.HaveLogin)); + }, this.WhenAnyValue(v => v.LoggedIn)); Icon = BitmapFrame.Create( typeof(VectorPlexusLoginManager).Assembly.GetManifestResourceStream("Wabbajack.App.Wpf.LoginManagers.Icons.vector_plexus.png")!); @@ -56,7 +57,13 @@ public VectorPlexusLoginManager(ILogger logger, IToken { _logger.LogInformation("Logging into {SiteName}", SiteName); StartLogin(); - }, this.WhenAnyValue(v => v.HaveLogin).Select(v => !v)); + }, this.WhenAnyValue(v => v.LoggedIn).Select(v => !v)); + + ToggleLogin = ReactiveCommand.Create(() => + { + if (LoggedIn) ClearLogin.Execute(null); + else TriggerLogin.Execute(null); + }); } @@ -70,6 +77,6 @@ private void StartLogin() private void RefreshTokenState() { - HaveLogin = _token.HaveToken(); + LoggedIn = _token.HaveToken(); } } \ No newline at end of file diff --git a/Wabbajack.App.Wpf/ViewModels/BrowserWindowViewModel.cs b/Wabbajack.App.Wpf/ViewModels/BrowserWindowViewModel.cs index 76a8f5840..ba597776e 100644 --- a/Wabbajack.App.Wpf/ViewModels/BrowserWindowViewModel.cs +++ b/Wabbajack.App.Wpf/ViewModels/BrowserWindowViewModel.cs @@ -52,6 +52,7 @@ private void Close() { foreach(var delegateMethod in Closed.GetInvocationList()) { + delegateMethod.DynamicInvoke(this, null); Closed -= delegateMethod as EventHandler; } } diff --git a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs index bf9614cb4..fff600671 100644 --- a/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs @@ -273,7 +273,7 @@ private void HandleShowBrowserWindow(ShowBrowserWindow msg) ActiveFloatingPane = browserWindow.ViewModel = msg.ViewModel; browserWindow.DataContext = ActiveFloatingPane; RxApp.MainThreadScheduler.Schedule(() => browserWindow.ViewModel.Activator.Activate()); - ((BrowserWindowViewModel)ActiveFloatingPane).Closed += (_, _) => ActiveFloatingPane.Activator.Deactivate(); + if(ActiveFloatingPane != null) ((BrowserWindowViewModel)ActiveFloatingPane).Closed += (_, _) => ActiveFloatingPane?.Activator.Deactivate(); } private void HandleNavigateTo(ScreenType s) diff --git a/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs index e4e01ef9a..e785ab7ac 100644 --- a/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Settings/LoginManagerVM.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; +using ReactiveUI.Fody.Helpers; using Wabbajack.LoginManagers; namespace Wabbajack; diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index 2cc7d658d..e9ef07407 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -53,7 +53,7 @@ public MainWindow(ILogger logger, SystemParametersConstructor system { // Don't do any special logging side effects _logger.LogError((Exception)e.ExceptionObject, "Uncaught error"); - Environment.Exit(-1); + throw (Exception)e.ExceptionObject; }; Closed += (s, e) => diff --git a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml index 2b67adc89..14abb9be5 100644 --- a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml +++ b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml @@ -20,7 +20,8 @@ - + + diff --git a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs index d440377b9..ee794069c 100644 --- a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs @@ -1,5 +1,9 @@ -using System.Reactive.Disposables; +using System; using ReactiveUI; +using System.Reactive.Disposables; +using ReactiveMarbles.ObservableEvents; +using System.Reactive; +using System.Reactive.Linq; namespace Wabbajack; @@ -18,9 +22,49 @@ public LoginItemView() .BindToStrict(this, view => view.SiteNameText.Text) .DisposeWith(disposable); - this.BindCommand(ViewModel, vm => vm.Login.TriggerLogin, view => view.LoginButton) + this.BindCommand(ViewModel, vm => vm.Login.ToggleLogin, view => view.LoginButton) .DisposeWith(disposable); - + + ViewModel.WhenAnyValue(vm => vm.Login.LoggedIn) + .ObserveOnGuiThread() + .Subscribe(loggedIn => + { + if (loggedIn) + { + LoginButton.Text = "Logged in"; + LoginButton.ButtonStyle = ButtonStyle.Color; + } + else + { + LoginButton.Text = "Log in"; + LoginButton.ButtonStyle = ButtonStyle.Mono; + } + }) + .DisposeWith(disposable); + + LoginButton.Events().MouseEnter + .ObserveOnGuiThread() + .Subscribe(_ => + { + if (ViewModel.Login.LoggedIn) + { + LoginButton.Text = "Log out"; + LoginButton.Icon = FluentIcons.Common.Symbol.SignOut; + } + }) + .DisposeWith(disposable); + + LoginButton.Events().MouseLeave + .ObserveOnGuiThread() + .Subscribe(_ => + { + if (ViewModel.Login.LoggedIn) + { + LoginButton.Text = "Logged in"; + } + }) + .DisposeWith(disposable); + /* this.BindCommand(ViewModel, vm => vm.Login.ClearLogin, view => view.LogoutButton) .DisposeWith(disposable); From 740e1e2920993024c05edc916e28bbe520ff677b Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 25 Jan 2025 11:36:08 +0100 Subject: [PATCH 262/294] Improve login button display --- .../Views/Common/WJButton.xaml.cs | 18 ++++++++++++++++++ .../Views/Settings/LoginItemView.xaml | 3 +-- .../Views/Settings/LoginItemView.xaml.cs | 9 ++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs b/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs index 7edab0f87..e3e8296da 100644 --- a/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Common/WJButton.xaml.cs @@ -52,6 +52,13 @@ public Symbol Icon } public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(Symbol), typeof(WJButton), new FrameworkPropertyMetadata(default(Symbol), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, WireNotifyPropertyChanged)); + public IconVariant? IconVariant + { + get => (IconVariant?)GetValue(IconVariantProperty); + set => SetValue(IconVariantProperty, value); + } + public static readonly DependencyProperty IconVariantProperty = DependencyProperty.Register(nameof(IconVariant), typeof(IconVariant?), typeof(WJButton), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, WireNotifyPropertyChanged)); + public double IconSize { get => (double)GetValue(IconSizeProperty); @@ -97,6 +104,17 @@ public WJButton() .BindToStrict(this, x => x.ButtonSymbolIcon.Symbol) .DisposeWith(dispose); + this.WhenAnyValue(x => x.IconVariant) + .ObserveOnGuiThread() + .Subscribe((variant) => + { + if(variant != null) + { + ButtonSymbolIcon.IconVariant = (IconVariant)variant; + } + }) + .DisposeWith(dispose); + this.WhenAnyValue(x => x.Direction) .Subscribe(x => SetDirection(x)) .DisposeWith(dispose); diff --git a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml index 14abb9be5..3ef554179 100644 --- a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml +++ b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml @@ -20,8 +20,7 @@ - - + diff --git a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs index ee794069c..9fdce51a7 100644 --- a/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Settings/LoginItemView.xaml.cs @@ -32,11 +32,15 @@ public LoginItemView() if (loggedIn) { LoginButton.Text = "Logged in"; + LoginButton.Icon = FluentIcons.Common.Symbol.PersonAvailable; + LoginButton.IconVariant = FluentIcons.Common.IconVariant.Filled; LoginButton.ButtonStyle = ButtonStyle.Color; } else { LoginButton.Text = "Log in"; + LoginButton.Icon = FluentIcons.Common.Symbol.PersonArrowRight; + LoginButton.IconVariant = FluentIcons.Common.IconVariant.Regular; LoginButton.ButtonStyle = ButtonStyle.Mono; } }) @@ -49,7 +53,8 @@ public LoginItemView() if (ViewModel.Login.LoggedIn) { LoginButton.Text = "Log out"; - LoginButton.Icon = FluentIcons.Common.Symbol.SignOut; + LoginButton.Icon = FluentIcons.Common.Symbol.PersonArrowLeft; + LoginButton.IconVariant = FluentIcons.Common.IconVariant.Regular; } }) .DisposeWith(disposable); @@ -61,6 +66,8 @@ public LoginItemView() if (ViewModel.Login.LoggedIn) { LoginButton.Text = "Logged in"; + LoginButton.Icon = FluentIcons.Common.Symbol.PersonAvailable; + LoginButton.IconVariant = FluentIcons.Common.IconVariant.Filled; } }) .DisposeWith(disposable); From 86432bbee3a88f0cf4c5bcbcf9f649043ccabbf5 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 25 Jan 2025 11:52:10 +0100 Subject: [PATCH 263/294] Fix Get Started icon not appearing correctly --- Wabbajack.App.Wpf/Themes/Styles.xaml | 12 ++++++++++++ Wabbajack.App.Wpf/ViewModels/HomeVM.cs | 8 ++++---- Wabbajack.App.Wpf/Views/Common/BigButton.xaml.cs | 12 ++++++------ Wabbajack.App.Wpf/Views/HomeView.xaml | 2 +- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index d24ca5e6f..ce7da5247 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -4422,6 +4422,18 @@ + - - + - + diff --git a/Wabbajack.App.Wpf/Views/HomeView.xaml b/Wabbajack.App.Wpf/Views/HomeView.xaml index b0abdfa1c..ed4325b4c 100644 --- a/Wabbajack.App.Wpf/Views/HomeView.xaml +++ b/Wabbajack.App.Wpf/Views/HomeView.xaml @@ -26,10 +26,10 @@
wd3V}Cz!5-|$jOj+VRv_<1-A9T)l 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
_(9NJ@h4Lb*yFQC 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 bPI^a57W5OpUnCe00{&^L>ZyECvW@y5du}ib From 8aa13d673e5debf990bf87c08b27fa82ce2ecc2d Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 10 Feb 2025 19:52:03 +0100 Subject: [PATCH 278/294] Fix gallery sometimes going down due to a singular repository causing issues --- Wabbajack.Networking.WabbajackClientApi/Client.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index 8e18c6d96..ccd0534f9 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -239,7 +239,12 @@ public async Task LoadLists() } catch (JsonException ex) { - _logger.LogError(ex, "Failed loading json for repository {List} from {Url}", url.Key, url.Value); + _logger.LogError(ex, "Failed loading JSON for repository {repo} from {url} - Exception: {ex}", url.Key, url.Value, ex.ToString()); + return Enumerable.Empty(); + } + catch(Exception ex) + { + _logger.LogError(ex, "Failed loading lists from repository {repo}: {url} - Exception: {ex}", url.Key, url.Value, ex.ToString()); return Enumerable.Empty(); } }) @@ -260,7 +265,7 @@ public async Task> LoadRepositories() { var repositories = await _client.GetFromJsonAsync>(_limiter, new HttpRequestMessage(HttpMethod.Get, - "https://raw.githubusercontent.com/wabbajack-tools/mod-lists/master/repositories.json"), _dtos.Options); + "https://raw.githubusercontent.com/tr4wzified/mod-lists/master/repositories.json"), _dtos.Options); return repositories!; } @@ -268,7 +273,7 @@ public async Task> LoadAllowedTags() { var data = await _client.GetFromJsonAsync(_limiter, new HttpRequestMessage(HttpMethod.Get, - "https://raw.githubusercontent.com/wabbajack-tools/mod-lists/refs/heads/master/allowed_tags.json"), + "https://raw.githubusercontent.com/wabbajack-tools/mod-lists/master/allowed_tags.json"), _dtos.Options); return data!.ToHashSet(StringComparer.CurrentCultureIgnoreCase); } From aa3efc85817d167460d82191f9f6f3cc2edbab10 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 10 Feb 2025 20:02:31 +0100 Subject: [PATCH 279/294] Remove replacement of repositories GitHub URL while debugging --- Wabbajack.Networking.WabbajackClientApi/Client.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index ccd0534f9..ce76791ed 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -265,7 +265,7 @@ public async Task> LoadRepositories() { var repositories = await _client.GetFromJsonAsync>(_limiter, new HttpRequestMessage(HttpMethod.Get, - "https://raw.githubusercontent.com/tr4wzified/mod-lists/master/repositories.json"), _dtos.Options); + "https://raw.githubusercontent.com/wabbajack-tools/mod-lists/master/repositories.json"), _dtos.Options); return repositories!; } From 16d215611bf5f70feebf912b7cec35cf45588fe8 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:55:27 +0100 Subject: [PATCH 280/294] Add delete button on recently compiled lists --- .../Messages/ReloadCompiledModLists.cs | 16 +++ Wabbajack.App.Wpf/Themes/Styles.xaml | 2 +- .../Compiler/CompiledModListTileVM.cs | 32 ++++- .../ViewModels/Compiler/CompilerHomeVM.cs | 11 +- .../Compiler/CompiledModListTileView.xaml | 114 +++++++++++------- .../Compiler/CompiledModListTileView.xaml.cs | 3 + 6 files changed, 125 insertions(+), 53 deletions(-) create mode 100644 Wabbajack.App.Wpf/Messages/ReloadCompiledModLists.cs diff --git a/Wabbajack.App.Wpf/Messages/ReloadCompiledModLists.cs b/Wabbajack.App.Wpf/Messages/ReloadCompiledModLists.cs new file mode 100644 index 000000000..585cd8851 --- /dev/null +++ b/Wabbajack.App.Wpf/Messages/ReloadCompiledModLists.cs @@ -0,0 +1,16 @@ +using ReactiveUI; +using Wabbajack.DTOs; + +namespace Wabbajack.Messages; + +public class ReloadCompiledModLists +{ + public ReloadCompiledModLists() + { + } + + public static void Send() + { + MessageBus.Current.SendMessage(new ReloadCompiledModLists()); + } +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 8f27b78e9..7810b7016 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -1782,7 +1782,7 @@ @@ -43,9 +49,15 @@ @@ -69,22 +81,26 @@ @@ -96,8 +112,12 @@ @@ -123,22 +143,26 @@ @@ -163,9 +187,15 @@ @@ -175,32 +205,28 @@ - - diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml.cs b/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml.cs index 9873ce388..93c02310b 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/Compiler/CompiledModListTileView.xaml.cs @@ -33,6 +33,9 @@ public CompiledModListTileView() .Select(x => x ? Visibility.Visible : Visibility.Collapsed) .BindToStrict(this, x => x.LoadingProgress.Visibility) .DisposeWith(dispose); + + this.BindCommand(ViewModel, vm => vm.DeleteModListCommand, v => v.DeleteButton) + .DisposeWith(dispose); }); } } From af815e57141b551f2efc586c19ff487659a4e00d Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 17 Feb 2025 23:51:14 +0100 Subject: [PATCH 281/294] Add tags to modlist details view, make JSON deserializing a bit less strict --- .../Compiler/CompilerFileManagerVM.cs | 14 +++- .../ViewModels/Gallery/ModListGalleryVM.cs | 31 ++++++-- .../Views/ModListDetailsView.xaml | 77 ++++++++++++++++++- .../Views/ModListDetailsView.xaml.cs | 5 ++ .../JsonConverters/DTOSerializer.cs | 2 + .../Client.cs | 10 ++- 6 files changed, 125 insertions(+), 14 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs index 50b28896b..d576a87e4 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs @@ -166,8 +166,16 @@ private void LoadingItem_Expanded(object sender, System.Windows.RoutedEventArgs private IEnumerable GetDirectoryContents(DirectoryInfo dir) { - var directories = dir.EnumerateDirectories(); - var items = dir.EnumerateFiles(); - return directories.OrderBy(x => x.Name).Concat(items.OrderBy(y => y.Name)); + try + { + var directories = dir.EnumerateDirectories(); + var items = dir.EnumerateFiles(); + return directories.OrderBy(x => x.Name).Concat(items.OrderBy(y => y.Name)); + } + catch(Exception ex) + { + _logger.LogError("While loading compiler settings path for directory {dir}: {ex}", dir.FullName, ex.ToString()); + throw; + } } } diff --git a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs index c3a45165f..1412f737e 100644 --- a/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Gallery/ModListGalleryVM.cs @@ -12,6 +12,7 @@ using System.Windows.Input; using DynamicData; using DynamicData.Binding; +using Humanizer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using ReactiveMarbles.ObservableEvents; @@ -70,6 +71,7 @@ public GameTypeEntry(GameMetaData gameMetaData, int amount) [Reactive] public double MinModlistSize { get; set; } [Reactive] public double MaxModlistSize { get; set; } + public Dictionary CommonlyWrongFormattedTags { get; set; } = new(); [Reactive] public HashSet AllTags { get; set; } = new(); [Reactive] public ObservableCollection HasTags { get; set; } = new(); @@ -247,7 +249,7 @@ public ModListGalleryVM(ILogger logger, Client wjClient, GameL { var previousGameType = GameType; SelectedGameTypeEntry = null; - GameTypeEntries = GetGameTypeEntries(); + LoadGameTypeEntries(); var nextEntry = GameTypeEntries.FirstOrDefault(gte => previousGameType == gte.GameIdentifier); SelectedGameTypeEntry = nextEntry ?? GameTypeEntries.FirstOrDefault(gte => GameType == ALL_GAME_IDENTIFIER); } @@ -298,6 +300,8 @@ private async Task LoadModLists() try { var allowedTags = await _wjClient.LoadAllowedTags(); + var tagMappings = await _wjClient.LoadTagMappings(); + AllTags = allowedTags.Select(t => new ModListTag(t)) .OrderBy(t => t.Name) .Prepend(new ModListTag("NSFW")) @@ -308,14 +312,25 @@ private async Task LoadModLists() AllMods = searchIndex.AllMods.Select(mod => new ModListMod(mod)).ToHashSet(); var modLists = await _wjClient.LoadLists(); var modlistSummaries = (await _wjClient.GetListStatuses()).ToDictionary(summary => summary.MachineURL); - var httpClient = _serviceProvider.GetRequiredService(); - var cacheManager = _serviceProvider.GetRequiredService(); foreach (var modlist in modLists) { - modlist.Tags = modlist.Tags.Where(allowedTags.Contains).ToList(); - if (modlist.NSFW) modlist.Tags.Add("NSFW"); - if (modlist.Official) modlist.Tags.Add("Featured"); + var modlistTags = new List(); + foreach(var tag in modlist.Tags) + { + string? allowedTag = null; + tagMappings.TryGetValue(tag, out allowedTag); + + if (allowedTags.TryGetValue(tag, out allowedTag)) + modlistTags.Add(allowedTag); + } + if (modlist.NSFW) modlistTags.Insert(0, "NSFW"); + if (modlist.Official) modlistTags.Insert(0, "Featured"); + + modlist.Tags = modlistTags; } + + var httpClient = _serviceProvider.GetRequiredService(); + var cacheManager = _serviceProvider.GetRequiredService(); _modLists.Edit(e => { e.Clear(); @@ -354,9 +369,9 @@ private void DetermineListSizeRange() MaxModlistSize = LargestSizedModlist.Metadata.DownloadMetadata.TotalSize; } - private ObservableCollection GetGameTypeEntries() + private void LoadGameTypeEntries() { - return new(ModLists.Select(fm => fm.Metadata) + GameTypeEntries = new(ModLists.Select(m => m.Metadata) .GroupBy(m => m.Game) .Select(g => new GameTypeEntry(g.Key.MetaData(), g.Count())) .OrderBy(gte => gte.GameMetaData.HumanFriendlyGameName) diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml index eeb4f35a9..67cf849e9 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -60,8 +60,81 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs index 758bef4dd..c653d7906 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml.cs @@ -12,6 +12,7 @@ using System.Reactive.Concurrency; using System.Windows.Controls; using ModListStatus = Wabbajack.BaseModListMetadataVM.ModListStatus; +using System.Linq; namespace Wabbajack; @@ -94,6 +95,10 @@ public ModListDetailsView() .BindToStrict(this, x => x.InstallButton.Text) .DisposeWith(disposables); + this.WhenAnyValue(x => x.ViewModel.MetadataVM.ModListTagList) + .BindToStrict(this, v => v.TagsControl.ItemsSource) + .DisposeWith(disposables); + this.BindCommand(ViewModel, x => x.OpenReadmeCommand, x => x.OpenReadmeButton) .DisposeWith(disposables); diff --git a/Wabbajack.DTOs/JsonConverters/DTOSerializer.cs b/Wabbajack.DTOs/JsonConverters/DTOSerializer.cs index 7ebc882f0..22b5b6ca7 100644 --- a/Wabbajack.DTOs/JsonConverters/DTOSerializer.cs +++ b/Wabbajack.DTOs/JsonConverters/DTOSerializer.cs @@ -15,6 +15,8 @@ public DTOSerializer(IEnumerable converters) { Options = new JsonSerializerOptions(); Options.NumberHandling = JsonNumberHandling.AllowReadingFromString; + Options.ReadCommentHandling = JsonCommentHandling.Skip; + Options.AllowTrailingCommas = true; foreach (var c in converters) Options.Converters.Add(c); } diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index ce76791ed..6a8f98f71 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -275,7 +275,15 @@ public async Task> LoadAllowedTags() new HttpRequestMessage(HttpMethod.Get, "https://raw.githubusercontent.com/wabbajack-tools/mod-lists/master/allowed_tags.json"), _dtos.Options); - return data!.ToHashSet(StringComparer.CurrentCultureIgnoreCase); + return data!.ToHashSet(StringComparer.OrdinalIgnoreCase); + } + public async Task> LoadTagMappings() + { + var data = await _client.GetFromJsonAsync>(_limiter, + new HttpRequestMessage(HttpMethod.Get, + "https://raw.githubusercontent.com/wabbajack-tools/mod-lists/master/tag_mappings.json"), + _dtos.Options); + return data!; } public async Task LoadSearchIndex() From 4ed566da48cbf0bcf2acfbb0afccbf69e5f90fbf Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Mon, 17 Feb 2025 23:53:26 +0100 Subject: [PATCH 282/294] Change tag icons to be slightly bigger --- Wabbajack.App.Wpf/Views/ModListDetailsView.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml index 67cf849e9..ade61c050 100644 --- a/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/ModListDetailsView.xaml @@ -112,7 +112,7 @@ - + From 1ccf14d8af6ad8bff7407fda83d4a432d1665910 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:45:49 +0100 Subject: [PATCH 283/294] Bump GameFinder to 4.5.0 --- .../Wabbajack.Downloaders.GameFile.csproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj b/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj index a4de6a07b..deedc5171 100644 --- a/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj +++ b/Wabbajack.Downloaders.GameFile/Wabbajack.Downloaders.GameFile.csproj @@ -18,11 +18,11 @@ - - - - - + + + + + From cd5025ca1e9d5443d211ecaac547c4e668dae0ab Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:58:07 +0100 Subject: [PATCH 284/294] Merge upstream changes into ui branch --- .../ViewModels/Compiler/CompilerMainVM.cs | 2 +- Wabbajack.DTOs/Game/GameRegistry.cs | 2 +- .../WabbajackCDNDownloader.cs | 10 ---------- Wabbajack.Networking.WabbajackClientApi/Client.cs | 1 + buildall.bat | 2 +- 5 files changed, 4 insertions(+), 13 deletions(-) diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs index e0b0fd961..a3282036f 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerMainVM.cs @@ -236,7 +236,7 @@ private async Task StartCompilation() ProgressPercent = Percent.Zero; State = CompilerState.Errored; - _logger.LogInformation(ex, "Failed compilation: {Message}", ex.Message); + _logger.LogError(ex, "Failed compilation: {Message}", ex.Message); return Disposable.Empty; } }); diff --git a/Wabbajack.DTOs/Game/GameRegistry.cs b/Wabbajack.DTOs/Game/GameRegistry.cs index a31fc3fe1..164e0d069 100644 --- a/Wabbajack.DTOs/Game/GameRegistry.cs +++ b/Wabbajack.DTOs/Game/GameRegistry.cs @@ -666,7 +666,7 @@ public static class GameRegistry @"7DaysToDie.exe".ToRelativePath(), @"7dLauncher.exe".ToRelativePath(), }, - MainExecutable = @"7dLauncher.exe".ToRelativePath() + MainExecutable = @"7DaysToDie.exe".ToRelativePath() } }, { diff --git a/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs b/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs index 3441e038e..e08d1205b 100644 --- a/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs +++ b/Wabbajack.Downloaders.WabbajackCDN/WabbajackCDNDownloader.cs @@ -92,11 +92,6 @@ public override async Task Download(Archive archive, WabbajackCDN state, A if (!response.IsSuccessStatusCode) throw new InvalidDataException($"Bad response for part request for part {part.Index}"); - var length = response.Content.Headers.ContentLength; - if (length != part.Size) - throw new InvalidDataException( - $"Bad part size, expected {part.Size} got {length} for part {part.Index}"); - await using var data = await response.Content.ReadAsStreamAsync(token); var ms = new MemoryStream(); @@ -176,11 +171,6 @@ public async Task GetPart(WabbajackCDN state, PartDefinition part, Cance if (!response.IsSuccessStatusCode) throw new InvalidDataException($"Bad response for part request for part {part.Index}"); - var length = response.Content.Headers.ContentLength; - if (length != part.Size) - throw new InvalidDataException( - $"Bad part size, expected {part.Size} got {length} for part {part.Index}"); - return await response.Content.ReadAsByteArrayAsync(token); } diff --git a/Wabbajack.Networking.WabbajackClientApi/Client.cs b/Wabbajack.Networking.WabbajackClientApi/Client.cs index 6a8f98f71..f41ea55dc 100644 --- a/Wabbajack.Networking.WabbajackClientApi/Client.cs +++ b/Wabbajack.Networking.WabbajackClientApi/Client.cs @@ -135,6 +135,7 @@ public async Task> LoadUpgradedArchives() public async Task GetGameArchives(Game game, string version) { var url = $"https://raw.githubusercontent.com/wabbajack-tools/indexed-game-files/master/{game}/{version}.json"; + _logger.LogInformation("Fetching game archives for {game} from {url}", game.ToString(), url); return await _client.GetFromJsonAsync(url, _dtos.Options) ?? Array.Empty(); } diff --git a/buildall.bat b/buildall.bat index bfa8c7db7..258e89b93 100644 --- a/buildall.bat +++ b/buildall.bat @@ -10,7 +10,7 @@ dotnet publish Wabbajack.App.Wpf\Wabbajack.App.Wpf.csproj --framework "net9.0-wi dotnet publish Wabbajack.Launcher\Wabbajack.Launcher.csproj --framework "net9.0-windows" --runtime win-x64 --configuration Release /p:Platform=x64 -o c:\tmp\publish-wj\launcher /p:PublishSingleFile=true /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true --self-contained /p:DebugType=embedded dotnet publish Wabbajack.CLI\Wabbajack.CLI.csproj --framework "net9.0" --runtime win-x64 --configuration Release /p:Platform=x64 -o c:\tmp\publish-wj\app\cli /p:IncludeNativeLibrariesForSelfExtract=true --self-contained /p:DebugType=embedded -cd C:\tmp\CodeSignTool-v1.2.0-windows\ +cd C:\tmp\CodeSignTool-v1.3.2-windows\ call CodeSignTool.bat sign -input_file_path c:\tmp\publish-wj\app\Wabbajack.exe -username=%CODE_SIGN_USER% -password=%CODE_SIGN_PASS% call CodeSignTool.bat sign -input_file_path c:\tmp\publish-wj\launcher\Wabbajack.exe -username=%CODE_SIGN_USER% -password=%CODE_SIGN_PASS% call CodeSignTool.bat sign -input_file_path c:\tmp\publish-wj\app\cli\wabbajack-cli.exe -username=%CODE_SIGN_USER% -password=%CODE_SIGN_PASS% From dcc70a8f35c38ccd0b9f8b01e153207d24c3fb50 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Thu, 20 Feb 2025 23:49:25 +0100 Subject: [PATCH 285/294] Add MEGA downloads to missing archive page --- Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs index df4282b64..bda47c0d7 100644 --- a/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Installers/InstallationVM.cs @@ -747,6 +747,12 @@ private void ShowMissingManualReport(Archive[] toArray) } break; + case Mega mega: + writer.Write($"

MEGA: {archive.Name}

"); + writer.Write($"
"); + break; + + default: writer.Write($"

{archive.Name}

"); writer.Write($"

Unknown download type

"); From a546f335c736edc624b67917cf7379d6f5b19d51 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 22 Feb 2025 11:43:23 +0100 Subject: [PATCH 286/294] Add message box with exception when application fails to start, clear deny permissions off appdata folder if needed --- Wabbajack.App.Wpf/App.xaml.cs | 54 +++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 39dec14c8..2a7a728b2 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -1,9 +1,12 @@ using System; +using System.Collections.Generic; +using System.Data.SQLite; using System.Diagnostics; using System.IO; using System.Reactive.Concurrency; using System.Reactive.Disposables; using System.Runtime.InteropServices; +using System.Security.AccessControl; using System.Security.Principal; using System.Windows; using System.Windows.Threading; @@ -96,7 +99,53 @@ private void OnStartup(object sender, StartupEventArgs e) } else { - var mainWindow = _host.Services.GetRequiredService(); + MainWindow mainWindow = null; + try + { + mainWindow = _host.Services.GetRequiredService(); + } + catch (Exception ex) + { + bool handled = false; + if(ex is SQLiteException sQLiteException) + { + if(sQLiteException.ResultCode == SQLiteErrorCode.CantOpen) + { + // Attempt to clear read-only flag off Wabbajack directory + try + { + if (KnownFolders.WabbajackAppLocal.DirectoryExists()) + { + var dir = new DirectoryInfo(KnownFolders.WabbajackAppLocal.ToString()); + var dirSecurity = dir.GetAccessControl(); + var deniedUserGroups = new List(); + AuthorizationRuleCollection rules = dirSecurity.GetAccessRules(true, true, typeof(NTAccount)); + foreach(FileSystemAccessRule rule in rules) + { + if(rule.AccessControlType == AccessControlType.Deny) + { + dirSecurity.RemoveAccessRule(rule); + deniedUserGroups.Add(rule.IdentityReference); + dirSecurity.AddAccessRule(new FileSystemAccessRule(rule.IdentityReference, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); + dir.SetAccessControl(dirSecurity); + } + } + mainWindow = _host.Services.GetRequiredService(); + if (mainWindow != null) handled = true; + } + } + catch(Exception ex2) + { + int i = 0; + } + } + } + if (!handled) + { + MessageBox.Show($"Wabbajack failed to start! Full exception: {ex}", "Failed to start Wabbajack", MessageBoxButton.OK, MessageBoxImage.Error); + throw; + } + } mainWindow!.Show(); return Disposable.Empty; } @@ -189,7 +238,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) var webViewDir = currentDir.Combine("webview2"); services.AddSingleton(); services.AddSingleton(); - + // ViewModels services.AddTransient(); services.AddTransient(); @@ -226,7 +275,6 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) // Verbs services.AddSingleton(); services.AddCLIVerbs(); - return services; } } From f7800ebf19677ab4ef07e3b57c141c994a181338 Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 22 Feb 2025 21:00:37 +0100 Subject: [PATCH 287/294] Clean up read-only fix code, disable anonymous MEGA login --- Wabbajack.App.Wpf/App.xaml.cs | 70 +++++++++++--------- Wabbajack.Downloaders.Mega/MegaDownloader.cs | 3 + 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 2a7a728b2..8f04432e1 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -106,41 +106,22 @@ private void OnStartup(object sender, StartupEventArgs e) } catch (Exception ex) { - bool handled = false; if(ex is SQLiteException sQLiteException) { + // Attempt to clear read-only flag off Wabbajack directory if(sQLiteException.ResultCode == SQLiteErrorCode.CantOpen) - { - // Attempt to clear read-only flag off Wabbajack directory - try - { - if (KnownFolders.WabbajackAppLocal.DirectoryExists()) - { - var dir = new DirectoryInfo(KnownFolders.WabbajackAppLocal.ToString()); - var dirSecurity = dir.GetAccessControl(); - var deniedUserGroups = new List(); - AuthorizationRuleCollection rules = dirSecurity.GetAccessRules(true, true, typeof(NTAccount)); - foreach(FileSystemAccessRule rule in rules) - { - if(rule.AccessControlType == AccessControlType.Deny) - { - dirSecurity.RemoveAccessRule(rule); - deniedUserGroups.Add(rule.IdentityReference); - dirSecurity.AddAccessRule(new FileSystemAccessRule(rule.IdentityReference, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); - dir.SetAccessControl(dirSecurity); - } - } - mainWindow = _host.Services.GetRequiredService(); - if (mainWindow != null) handled = true; - } - } - catch(Exception ex2) - { - int i = 0; - } - } + GrantFullControlOverDir(KnownFolders.WabbajackAppLocal); } - if (!handled) + + try + { + mainWindow = _host.Services.GetRequiredService(); + } + catch (Exception) { + mainWindow = null; + } + + if (mainWindow == null) { MessageBox.Show($"Wabbajack failed to start! Full exception: {ex}", "Failed to start Wabbajack", MessageBoxButton.OK, MessageBoxImage.Error); throw; @@ -154,6 +135,33 @@ private void OnStartup(object sender, StartupEventArgs e) }); } + private bool GrantFullControlOverDir(AbsolutePath path) + { + try + { + if (path.DirectoryExists()) + { + var dir = new DirectoryInfo(path.ToString()); + var dirSecurity = dir.GetAccessControl(); + AuthorizationRuleCollection rules = dirSecurity.GetAccessRules(true, true, typeof(NTAccount)); + foreach (FileSystemAccessRule rule in rules) + { + if (rule.AccessControlType != AccessControlType.Deny) continue; + + dirSecurity.RemoveAccessRule(rule); + dirSecurity.AddAccessRule(new FileSystemAccessRule(rule.IdentityReference, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); + dir.SetAccessControl(dirSecurity); + } + return true; + } + return false; + } + catch (Exception) + { + return false; + } + } + protected override void OnExit(ExitEventArgs e) { base.OnExit(e); diff --git a/Wabbajack.Downloaders.Mega/MegaDownloader.cs b/Wabbajack.Downloaders.Mega/MegaDownloader.cs index d0d34d40a..46f043c7d 100644 --- a/Wabbajack.Downloaders.Mega/MegaDownloader.cs +++ b/Wabbajack.Downloaders.Mega/MegaDownloader.cs @@ -84,8 +84,11 @@ private async Task LoginIfNotLoggedIn() } else { + _logger.LogWarning("This modlist requires MEGA downloads but the user is not signed in. MEGA downloads will fail!"); + /* _logger.LogInformation("Logging into Mega without credentials"); await _apiClient.LoginAsync(); + */ } } } From f8cb190b284dd3d93299d8bbaeafd1541693c00e Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sat, 22 Feb 2025 21:38:34 +0100 Subject: [PATCH 288/294] Improve handling around failing to start application because of permission issues --- Wabbajack.App.Wpf/App.xaml.cs | 45 +++++++++++++++++++------- Wabbajack.CLI/VerbRegistration.cs | 2 ++ Wabbajack.CLI/Verbs/Restart.cs | 53 +++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 Wabbajack.CLI/Verbs/Restart.cs diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 8f04432e1..174374526 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -5,9 +5,12 @@ using System.IO; using System.Reactive.Concurrency; using System.Reactive.Disposables; +using System.Reflection; using System.Runtime.InteropServices; using System.Security.AccessControl; using System.Security.Principal; +using System.Threading; +using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; using Microsoft.Extensions.DependencyInjection; @@ -106,19 +109,20 @@ private void OnStartup(object sender, StartupEventArgs e) } catch (Exception ex) { - if(ex is SQLiteException sQLiteException) + if(ex is SQLiteException sqlException) { // Attempt to clear read-only flag off Wabbajack directory - if(sQLiteException.ResultCode == SQLiteErrorCode.CantOpen) - GrantFullControlOverDir(KnownFolders.WabbajackAppLocal); - } - - try - { - mainWindow = _host.Services.GetRequiredService(); - } - catch (Exception) { - mainWindow = null; + if(sqlException.ResultCode == SQLiteErrorCode.CantOpen) + { + // First MessageBox in App.OnStartup does not trigger: https://github.com/dotnet/wpf/issues/10067 + MessageBox.Show(""); + var result = MessageBox.Show($"Wabbajack cannot read or write to settings files inside %localappdata%/Wabbajack! Let Wabbajack adjust permissions?", "Failed to start Wabbajack", MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result == MessageBoxResult.Yes) + { + GrantFullControlOverDir(KnownFolders.WabbajackAppLocal); + Restart(); + } + } } if (mainWindow == null) @@ -135,6 +139,25 @@ private void OnStartup(object sender, StartupEventArgs e) }); } + private static void Restart() + { + try + { + var currentPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location); + var cliDir = Path.Combine(currentPath, "cli"); + string workingDir = Directory.Exists(cliDir) ? cliDir : currentPath; + Process.Start(new ProcessStartInfo() + { + FileName = "wabbajack-cli.exe", + Arguments = "restart", + CreateNoWindow = true + }); + } + catch (Exception ex) + { + } + } + private bool GrantFullControlOverDir(AbsolutePath path) { try diff --git a/Wabbajack.CLI/VerbRegistration.cs b/Wabbajack.CLI/VerbRegistration.cs index dd4a437a7..acb4ea83e 100644 --- a/Wabbajack.CLI/VerbRegistration.cs +++ b/Wabbajack.CLI/VerbRegistration.cs @@ -49,6 +49,8 @@ public static void AddCLIVerbs(this IServiceCollection services) services.AddSingleton(); CommandLineBuilder.RegisterCommand(Reset.Definition, c => ((Reset)c).Run); services.AddSingleton(); + CommandLineBuilder.RegisterCommand(Restart.Definition, c => ((Restart)c).Run); + services.AddSingleton(); CommandLineBuilder.RegisterCommand(UploadToNexus.Definition, c => ((UploadToNexus)c).Run); services.AddSingleton(); CommandLineBuilder.RegisterCommand(ValidateLists.Definition, c => ((ValidateLists)c).Run); diff --git a/Wabbajack.CLI/Verbs/Restart.cs b/Wabbajack.CLI/Verbs/Restart.cs new file mode 100644 index 000000000..8f8a55165 --- /dev/null +++ b/Wabbajack.CLI/Verbs/Restart.cs @@ -0,0 +1,53 @@ +using System; +using System.CommandLine; +using System.CommandLine.Invocation; +using System.CommandLine.NamingConventionBinder; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Wabbajack.CLI.Builder; +using Wabbajack.Hashing.xxHash64; +using Wabbajack.Paths; +using Wabbajack.Paths.IO; + +namespace Wabbajack.CLI.Verbs; + +public class Restart +{ + private const string WabbajackExecutableName = "Wabbajack.exe"; + private readonly ILogger _logger; + + public Restart(ILogger logger) + { + _logger = logger; + } + + public static VerbDefinition Definition = new VerbDefinition("restart", + "Forces the main application to restart when opened", new OptionDefinition[] + { + }); + + public async Task Run() + { + Console.WriteLine("Checking if Wabbajack is running..."); + var wabbajackProcess = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(WabbajackExecutableName)).FirstOrDefault(); + string? fileName = wabbajackProcess?.MainModule?.FileName; + if(wabbajackProcess != null) + { + Console.WriteLine("Detected Wabbajack! Killing the process..."); + wabbajackProcess.Kill(); + Thread.Sleep(500); + } + + if(fileName != null) + { + Console.WriteLine("Restarting Wabbajack..."); + Process.Start(fileName); + } + Console.WriteLine("Done!"); + return 0; + } +} \ No newline at end of file From 608c080be9ea7ed3d2f678b26e1bda1ac0878f4f Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 23 Feb 2025 01:16:35 +0100 Subject: [PATCH 289/294] Add MEGA login --- Wabbajack.App.Wpf/App.xaml.cs | 2 + .../LoginManagers/Icons/mega.png | Bin 0 -> 6440 bytes .../LoginManagers/Icons/nexus.png | Bin 1030 -> 0 bytes .../LoginManagers/MegaLoginManager.cs | 102 +++++++++++++ Wabbajack.App.Wpf/Messages/LoggedIntoMega.cs | 17 +++ .../Messages/ShowFloatingWindow.cs | 3 +- Wabbajack.App.Wpf/Themes/Styles.xaml | 141 ++++++++++++++++++ .../Interfaces/INeedsLoginCredentials.cs | 6 - .../ViewModels/Interventions/MegaLoginVM.cs | 54 +++++++ Wabbajack.App.Wpf/ViewModels/MainWindowVM.cs | 5 +- .../Views/Interventions/MegaLoginView.xaml | 56 +++++++ .../Views/Interventions/MegaLoginView.xaml.cs | 32 ++++ Wabbajack.App.Wpf/Views/MainWindow.xaml | 3 + .../Views/Settings/LoginItemView.xaml | 5 +- .../Views/Settings/LoginSettingsView.xaml | 2 +- Wabbajack.App.Wpf/Wabbajack.App.Wpf.csproj | 7 +- Wabbajack.CLI/Program.cs | 2 + Wabbajack.CLI/Verbs/MegaLogin.cs | 9 +- Wabbajack.Downloaders.Mega/MegaDownloader.cs | 6 +- Wabbajack.Downloaders.Mega/MegaToken.cs | 10 +- .../TokenProviders/MegaTokenProvider.cs | 2 +- 21 files changed, 434 insertions(+), 30 deletions(-) create mode 100644 Wabbajack.App.Wpf/LoginManagers/Icons/mega.png delete mode 100644 Wabbajack.App.Wpf/LoginManagers/Icons/nexus.png create mode 100644 Wabbajack.App.Wpf/LoginManagers/MegaLoginManager.cs create mode 100644 Wabbajack.App.Wpf/Messages/LoggedIntoMega.cs delete mode 100644 Wabbajack.App.Wpf/ViewModels/Interfaces/INeedsLoginCredentials.cs create mode 100644 Wabbajack.App.Wpf/ViewModels/Interventions/MegaLoginVM.cs create mode 100644 Wabbajack.App.Wpf/Views/Interventions/MegaLoginView.xaml create mode 100644 Wabbajack.App.Wpf/Views/Interventions/MegaLoginView.xaml.cs diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index 174374526..d0d425815 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -286,6 +286,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); // Login Handlers @@ -298,6 +299,7 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) //Disabled LL because it is currently not used and broken due to the way LL butchers their API //services.AddAllSingleton(); services.AddAllSingleton(); + services.AddAllSingleton(); //Disabled VP due to frequent login issues & because the only file that really got downloaded there has a mirror //services.AddAllSingleton(); services.AddSingleton(); diff --git a/Wabbajack.App.Wpf/LoginManagers/Icons/mega.png b/Wabbajack.App.Wpf/LoginManagers/Icons/mega.png new file mode 100644 index 0000000000000000000000000000000000000000..0bade3957cadf616fa54d6c7d353b0313cafcde0 GIT binary patch literal 6440 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 +{ + private readonly ILogger _logger; + private readonly ITokenProvider _token; + private readonly IServiceProvider _serviceProvider; + + public string SiteName { get; } = "MEGA"; + public ICommand TriggerLogin { get; set; } + public ICommand ClearLogin { get; set; } + public ICommand ToggleLogin { get; set; } + + public ImageSource Icon { get; set; } + public Type LoginFor() + { + return typeof(MegaDownloader); + } + + [Reactive] + public bool LoggedIn { get; set; } + + public MegaLoginManager(ILogger logger, ITokenProvider token, IServiceProvider serviceProvider) + { + _logger = logger; + _token = token; + _serviceProvider = serviceProvider; + + ClearLogin = ReactiveCommand.CreateFromTask(async () => + { + _logger.LogInformation("Deleting Login information for {SiteName}", SiteName); + await ClearLoginToken(); + }, this.WhenAnyValue(v => v.LoggedIn)); + + Icon = BitmapFrame.Create( + typeof(LoversLabLoginManager).Assembly.GetManifestResourceStream("Wabbajack.App.Wpf.LoginManagers.Icons.mega.png")!); + + TriggerLogin = ReactiveCommand.CreateFromTask(async () => + { + _logger.LogInformation("Logging into {SiteName}", SiteName); + StartLogin(); + }, this.WhenAnyValue(v => v.LoggedIn).Select(v => !v)); + + ToggleLogin = ReactiveCommand.Create(() => + { + if (LoggedIn) ClearLogin.Execute(null); + else TriggerLogin.Execute(null); + }); + + MessageBus.Current.Listen() + .Subscribe(async (loggedIntoMega) => await UpdateToken(loggedIntoMega.Login)) + .DisposeWith(CompositeDisposable); + + LoggedIn = _token.HaveToken(); + } + + private async Task ClearLoginToken() + { + await _token.Delete(); + LoggedIn = _token.HaveToken(); + } + + private void StartLogin() + { + ShowFloatingWindow.Send(FloatingScreenType.MegaLogin); + } + + private async Task UpdateToken(AuthInfos login) + { + MegaToken token = null; + try + { + await _token.SetToken(new MegaToken() { Login = login }); + } + catch(Exception ex) + { + _logger.LogError("Failed to refresh Mega token state: {ex}", ex.ToString()); + } + + LoggedIn = _token.HaveToken(); + } +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Messages/LoggedIntoMega.cs b/Wabbajack.App.Wpf/Messages/LoggedIntoMega.cs new file mode 100644 index 000000000..cc4de1ebd --- /dev/null +++ b/Wabbajack.App.Wpf/Messages/LoggedIntoMega.cs @@ -0,0 +1,17 @@ +using ReactiveUI; +using static CG.Web.MegaApiClient.MegaApiClient; + +namespace Wabbajack.Messages; + +public class LoggedIntoMega +{ + public AuthInfos Login { get; set; } + public LoggedIntoMega(AuthInfos login) + { + Login = login; + } + public static void Send(AuthInfos login) + { + MessageBus.Current.SendMessage(new LoggedIntoMega(login)); + } +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs b/Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs index df35a39fa..080a16c76 100644 --- a/Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs +++ b/Wabbajack.App.Wpf/Messages/ShowFloatingWindow.cs @@ -6,7 +6,8 @@ public enum FloatingScreenType { None, ModListDetails, - FileUpload + FileUpload, + MegaLogin } public class ShowFloatingWindow diff --git a/Wabbajack.App.Wpf/Themes/Styles.xaml b/Wabbajack.App.Wpf/Themes/Styles.xaml index 7810b7016..b3132de57 100644 --- a/Wabbajack.App.Wpf/Themes/Styles.xaml +++ b/Wabbajack.App.Wpf/Themes/Styles.xaml @@ -1144,6 +1144,147 @@ +

Please click here to download this file, then manually place it inside the Wabbajack downloads directory.

_(9NJ@h4Lb*yFQC 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 bPI^a57W5OpUnCe00{&^L>ZyECvW@y5du}ib literal 142314 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

_afr6s_PF;Hz`{z^P8x-DPcc>r-4 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 z z%LL%D;I$-8iufNDhY8&1j{oJ{0)O~lz5UD=;+YA|PFL`S@C%X#nF;t4n#slgCg*+X zr;z`p9?$X*m;7E}lB+xUhu(hD6GL5J4^oDHh1R#8w@urj57{q~t>|(nPx23BH+uPU zuggDpm+JDbh`1ygN9qLMvDO(!c_&xo{hVLM{FirfMTbb6}b7n~20gAu8$#3%wnX5bbCo)?pL%*8xPbK@& z<)3_K4Wy?0`!RKfm7Poi*#`8F4wL8z^mlSk`>k=Q(Sx98a+H57S-mgvZ|W+NGr-gj z+0jaT_pJYDoJ@WW{|oK{e&|>BdHMqyfc;+D$5qaL;~tt2UI(6mXZlO$2N^$fEl&Cm zbTt0xKfopE2UDj1x~YSuz39JWFJ~P?%Ye(kX?pvi4{0y-pU8gYJG7sianHEZcDMR3 zHTM4Kzo?J-4?o~E2db-cFGi^SP{+XnCs)P>m<5*gy2|+s~A9Fn2jWi8192U+5d=yB^aKx)A<{^In-J{MZlC89@KR z8|pG)9cFMK_7B)(0Gs|z?r95h9#8fUlHObU7y7`?4gxxkwGS^xnb^6}HsVzgZwy|L zwqe@KI9$!fh`z6X(#d@cu9GdE9;#(&$zp{e^T_5kM>X0L98F|?cZ7@ zvx`9H!=8ogPIUPKw|>Re#|a;j4mydsW2L1{`!|K_Snp1Ap8VME`D6bkFhV1GXa88v zv<(saN9HPWJl288zokt5Dm< zZ+dJ03T)8IgZsE_o!rs3?%+Ufj4XsSk9EWT)pd>nZW&cds^nojG zmG}1VRl_69J%IeoVdx(7<7 z1Wt6a544tv&Wo|+J#?JahSi#$XI;(*4i(#HyR`Z{U;?(3u6MmmyL*@aOQ_fWFWB=~ z`8~UGt?!U|qbsn!w?0GLV5^HB!&f_JYgyhtC;30AxkkS`@e5KO@=ItwdG>T=->~w$ z);!cn-OzP+(*H?^19}pE0iFrI(Oo~l$I&Ka`^dl13qS*d8{muRA9Q8tg53FkQHSVm zsoPtcR);$^@8Kulsld6|mvZl9M@PNj0CaiCbmOUM4l$ z>8UJWL56}H37QN066B0_c2%CrlJDfD49cQRY_|Ss{;vY7enqwh9+tjfys$CC=7jcO zZ-LGg9W+1gdB-=>kd{2IHiwvHS><(legEWp@H09V<}123u{oiA;4XgLgG2a68q$)- zi3d;3_DURp|E~W(dw@6*q3YK`{gUED1m2!F5zJ?36k;i|XJdyAK4}tu{A`#1|0zpCAwv6o3I52w^BBB=woM1>(4X$ zHS?sj!r|Gn+_cZMD+~D-GC*Wy&_iMy44(wwLp$v9@s6@xdr3%&=nK7k_8WYk3M!jm z{k`>``CTEnv?;HJc9rkQYq0l$Uqyb2u0wb~Nn^cI7h^%))^EN%bIuNHGpDi*w#&yj zVwB2QZys|YL~V|z93Wf zft2k&VqVD9f%6>V{VHwGE6L z{cZ<4b}G$6qs{Yjb^CnmS%4cjIgbGuD6~KNLik-|#P9^-|BSv2T@Yn(_AX^w?aXNt zFfb0@&L!3=^WDxbwxFU#kt^2?sgx|%FmNN+r#||dwjieiUVNK?9hrx|c9G}HGckuL z6S*~YSjU37#Cq_=GcXsyGj?mWh_ZPd5ZTNKD|o9-KQbofwaBA@8+;>h&_3i;VzY`& z4!wj`UrX84L0ytpuE50EM^5X7bl~37`EK>upid~bq>WDxx{ic8%}hR-If1PN@JhY< z72Lx!_y@hKo!=F8P?y~}fLno4FH`Q>`Qa-n(^Xa~#;2bL*NnZ9Qy?)jz z^IhHndyBAGqmh~iBF_~VC5?WSZ_FEXqfc}jVzyt>P_|X?3Jlgh1Xf@sA8UcVO3ILH zD@7BqugWu5Z0d3=8lHRf37sm|HTwp5B%X)BsOOV=`Nn?CzQ$fb8KOU-Z0eBoT!8`l zM1RLUdm6CA3&Bt5-`Vp9DSAfVf58R##7Vj~%3d;;@|Wcq_`&VqeCD>Kv0ep!`kp*I z=TiO?f-aIt=&@txvP0EfOeK;H@cd}~$iraziq7vF#dn7Ef8FtcuvbzAXM zSGDGKT_`xAc1T4tFL=3m+2ppCzyXbkJ_cU|aJ$qaSLkMZmE;-QG#!4*lzoP}bUXws zUBi?6WdSpC4SrIlT-i5t-y{5Vsww$B`{t-OHz6w1m@BugT1)f-J zM4{#6JN5btKYOvS^Cw=LKO$p*--3ofp93uf9Y-H?rG2DBw;}#Y(AYZs{>~peKC7h< z>z929xd^s6>_@Bve2%cYg3e?-ps9f!9~JSzf*;WFk&Y95S-&a8pY%8WB;a)L3vfZ( z&?bC@WG=xgvIZpP2xB7s?+yM0r_222D)=*{`xh|CnnWLpeFJta*!&?kq5qjHJWI?3 z>SwJ>|Hq|Z|MG=?&}kE)ALw6!ADn~j4*aBU#|N*7JsaPp57{e#9~vYj^n)|~7MslW zihAwnH|B-t7r`%fcKFOK>~%zjLRpLr@cT`_sl7}1FrVn>(#h%PF|A#6128cT%psvg zrLURy^tU{7WgSfFsqE`Dp4uP!nX-!fMGNWWgHyfXUt+69-(ur0c3qUmJhIb!LxWa{ zxJl3Y#J?!IP3K=+{9{QU_{Xp${*gY%mIFC0@+y(L$(lf>!rsO{$J`RyLZ^jN%0JRi z;341m_b`)>MCQ=1Uq2In5>p8J6T5sFOXfc7nZ1CY*xN#9LlgPVzZbZL*QGAj0=iDC z`~*L)-ir3n`E`K}ezi?R9b?kONhZEOckY~NPmFD}q~S^%7^6S__`_JYZk9N2B@v6xPJUIVb{(_-=}&wC4;(mP`T?^)F{gkN znv``7eSr-$a|iqnzOvTkPJV^{!AX8aIjmW55%E8)D|9IG zM&{Sl?nBKz#wufz^z# z-lV_5N7y}r@7V`rob-B;DN`o;hufjQ*6U)QhSs1i#Ww~q-gdUdfxAO|k2i?k8!$Z65H}aXXJn#nNCG~U9JLG)GDoy(hm502@?sZwd zkdg6@Z;TyjQ>(9)dC-4qcl7A&~TZcVVC zgUjS+wIL!8c`3sk%y#tyH~uKdlC0m6#YR<$Oyb3$cklsb-xV36o`*8R@)z~GFTlO{ z?^wq$RK*5sQ6|P{U%9SPKI~S#EOj<%sO&~+#V3om!F$T0OuIcnhn047o|E2R_;9r> z6Kg~jDPxwy9tiIbjSAm`3;;P8Hc;#@vDISCwB*tKjwuruoaO}I>2tl^(2wXBMCJ|M z%$~&$*)uRe>mzd(+JU`|bmSqgPJ>c5W1+WC+K>ISKHlUb9)-vYNEcbUf+??op49hE z=t$^& z%A!nxm9+_e;F&Q2Z^<|2Ide^(X*cBofA1#kO&->%e&#@2-TG!)@{m``p-epv4LFLr z!IwG>&Ki?BSTaEALY3YTpXItGBg{53=bY+CJ_FxMTJn&WGNhf9E$~pM;B#Q*J-CHf zz>=oQUv?a^s{bjEdYNa;e@P=(zM(6?XN7(z58tE=?kQVzNz_Td>vEAYN}pGuP>7ii z**knc^Czab3*S%&vH@s%saLMjC)5ugP9E}7hUip@%R?QKNA@szMjtBr!SX6C?I=^Q zn9>2eY_F(;^=;RF=y1wGMu}{OJmjSe%HkVk>-t~nXC6rX^-Dw~&HGA0F8yD0v9d|u zsUJEYeGB~nEWAVJz`URw^fd7O+)G|5i*-O9QlGE&v&W$4K`ux=@Z5|A{?_myl#5;q z8Mr_7d+LAi9&%LCp&@fbeg`i>A5bTF89eB1|NAok;3Jt+#ABq78Ec6{AhKxoBKBmv z`N!P0&Oh*wFYAvsO5Y=!0_QRpMCM1I6b=mXYW-2S75_B%fPbi;c8k3w@;&xp(d!_8 z?^-+FYy9I2{;d;J!yIGk)Y~g{0~<0UaJ4P|)nc;>{w2??`%g^LI%NII{=*ul&zbWg z|AX$pK7)2MH<0I0H+jfQ`R?`~zT54;=xQmC@07z{(x=;Fri^#x%9W-rlW+XMN63d+ z2h?A?jEaZzSKXB1Y5%1RPxJ>e2i867e94j}rc4)E1hP5iJn}1ke8+~5GO61e`h&Fe znH~K_KhS^Z30Z5%Jw(2W`~zGIy~TWB9*8cHJht?gqVZ(CQLp}E9PH`O7$aKQ8P!m< zh2U9fpPrxgS5-1F_Ih9GPbtSme-}xj0pvY&Nt2rO&3>TG@}4X6k3L}z)`?Z|?zDN% zch(r~@Al{{hZJmt`kE<{j$-Sfm`TCja4v?$*=l_lyy9(#n4^=fK0XRpjy# z8x;M%l##@LsWP0#Thh9_(ih+dXce9Rgw|m%1P>(PLItyn{|qwokk?(=zI+o}5u7di zHaLtQ&-?_R3;pO#`AR(SxBelgP+|#FR*@v9Nbgxr!CWTh3NmH-oFDhRb2rbK3;08e z95=t>8JRcCCvZ7^#y8Sf=MB%u`S7VOlBa-4t5zu+Zq5Vden}O7rDj+a^BZZf1=PzB zpKtg8^k(^TD}M;ZGcb?%p`Qc}zL7?Jw}FW^0T=ZWr@DZOomHk-iDdG2_@4@;%bMRP zgS6yv^_5F^2Mq!ZZqlOVDkqa0v$m^+S24elMrd*Rl>TKcb3Op&npd^fb-M`gG4!dP zhCDJx@S&7jI8T6i)&{r&+J*HCU55=9dn~cLNJCok$oN|GBlp0j4SG=c0{Bm-{8spj zsc{FFkOx|tF$h=VXa_%SU>x-Rt6aLgiSNKk^a9`@<_`2R`#;~T^N0M_`5RL%BFV-ATnZf#SteYYzxHbY vIG9)DVa(W*kvVX0;$-#BZv6m*{A5ltwj~0K8YK!9Nm|2vlXP-TDU$j>jy>q> From ac26fc75eda5b62ee1298b0bddafbed28df3cf4f Mon Sep 17 00:00:00 2001 From: trawzified <55751269+tr4wzified@users.noreply.github.com> Date: Sun, 9 Feb 2025 22:09:03 +0100 Subject: [PATCH 277/294] Slightly increase Wabbajack logo size on icon --- .../Resources/Icons/wabbajack.ico | Bin 203449 -> 207773 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Wabbajack.App.Wpf/Resources/Icons/wabbajack.ico b/Wabbajack.App.Wpf/Resources/Icons/wabbajack.ico index 3b2eeefbbb2c6fb99b6362d4e50fbd51b55e0072..66c1c1c40a38009f4ab0a5a98336648c117ae303 100644 GIT binary patch literal 207773 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 literal 203449 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

AZFZdS30Wb5;vcEj%vg_QRTJEavN~d-HY4p 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�!-i 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