)8r&*L3PA
zGNYd+_^;nNKmTI~dY_~zXvYtC&`V1XP`{HN)&XeWGrj5UlH
zZee!1VNvH+5`n^X)VT_uHU@y|7KTyy(Z?5qDg$KFEcW)=_8v;X0rL`a)!hGn@n}0a
z!pymqFnJDNAMzAKwQ-_dH6PqoTW*@0bIGbgg_4V*9x0{sQ*CWmB{
zCeF05wqYfu%aUy;K=dliZ4bLVR6F%cgcF4tU#>fXa5Jho-GFog`9%anGa*?tt#`gv51zbJFbZpG+=eKbo&brl>piU(=FUrL*v%^1KT3SwBH<`1;$<}htc5GWLgY8n5X8dRx6S|dRbF$(&MAHwb{23GZb^tG;PV4|Q)OA)CH&$x5x
z^6A@po{orr<=f}~?N`B}df>Ti>g_7WArV5DI`Trc&QEbgq*`4VnY)=@(#yaHX^V!r
zbo+-j2rVb$%#S2pGbKPbZ)8D`hqBPEdT+)>YFSB!-rhmAHjS!yyDInZtEXnXt^9c&
zU)dIgeaii;y+7{#f=8PD`~G#$CK0;|*4f0gy~S5`iK?oCG{r%CriEw#NZIGH=7QR8
zwmXwIhA$ili;#J>xLoOKaP)Xx0ZSNmFV68J@XqI6eE>l8x?q>`Q1BaA`9;IOAqO)Y
z`-g#*1AQlkop833=9a0X_WK<)qZ$4u4Kb|@w!~L`Kl_u!og!QcNMFlRtpK%V#zEKd
z9`F?8_RCfii3E^sbSIuY$PbLg3^0qTd6?^*Bz<#w{WGw(NzIxBoM71GHc$F_CCDK|
zD#O*CdpRM40kPB2W;pi&D?_|p-{Y}rB&9furJCJ_BzE`$JErD%1mj7dvytXv}NCML!)g&Fjnqns32!WA~{ZIEY3HLstQ&@55lm4W9r
zQF(g9g`z+N>UVvVsPLmnVA?8(2_dO
z@L(I;NA&Ec9)Nbkw?FG>EBUA2@XihhLMM6rL>=%s8qRV|uI%V6lvM?QfYjKZNS|Ne
z@78l?1G?&t4{^)ENK2xK9-^CxwB?9mAkdc%%1EHnd8G1N0Rx7HNbkuA0ba0V=rQ|
zVt>}Ta!mPuQ*+dDGRjJrDviGR48=Gk`%;Ca(=GQWony#EsRSr4;h~H`q$FGGaq`mN
z0DwZyyop0a|BGgrb+rK1qj#R9I2IGM%G8Jw<__NI>4HDVRC~a2h=Fb1ySb^RuQnM?
zJ4NxA<&_KVpg$Q>{)&?0%8FaV9hs%j;5pnz`j@|
zF+1rzyYz;z)9R%&42Qrj!I$v5PVFLfoL_LiQNw592kSC){6wLA+e`Y)Kxg84j{{>^
z@Z>0DC{e%GEP30%6e1XUbqvGae@NgNFM#IANo)k9cIRnP-}2$Yx*)!`Vk9l^-8)cP
zbY|#7f5HzI1};cY`6te0UR6Bp21_DRC34xzXpi|
zd63C~WVSvzthcq09*E%CyU6+|`bK3=%OTX>jFE2Cv4prn?R7&_dm--vM@dpBJi_mq
zff)M+PtK_~`vdAUqM7?cEAYVSESgJG*9K!B(QuN(-rmuxDofgKzfwBSp#PE|i(
zB;r7|D`RL7DZAc1t6Ur|vjKR`Jfw?^hWMopf~-gQb_x5M1Bd`AN?j}mkil!@f6Cn4
zo^(kIJJT5f8>jS-@>C~RTUjq%Edd5k=8o24R>e6rvl}U*Gj1E}%(c#9YC)K2;)Trs
zq1nhdW{%?n(#N^m<~mF`kvf}pW`$g*_-vMub%IZmE_Zz`Z~LzAp|PFSF46Q0+L?eU
zR9$s;^ePI#%Eh~$YwrMF2%E8g_lj`$RA*aOdZ6y51jvXoae&
z&i=gm4N$PP190>KO=ySBI<3uU@~?j8aF6-P@(kdyNFtz0JJ
zQ@%~Rl~vh9BsPFaVx^8aBBs&?T1d$$O78P%*=>GKEscN{@TSS`R^UVF%CXENN5$-)
ztYD0$Pz_a8b&dZ5YZd5+V28!WW!rA%fHsPh1k_cXku)*^;*L@u-|&T!^q3D{4?EHe
zK`Q&3!#AC|mIlEvzH}U8#w_p{EireN{skqK?Z3u}3^X8oCBHD&YyjY6pz}z`5pH38
z`fCpsLtbJ}KJQ(l_yt&!v^NYa&BvR5M7Iuzzhwf7T7=3*5kb
zYI}2TTe$^U(|^zAgOd$Qz*lFSpXRFHRhyk~u1me9r}ovMMw}xFwJIB1r0*WvO&A`}
zlHG08^aKdiACDQy$Ay}7Wi^YD^o>GJ5t>qLbrr|i?!K1$pVTQGzy4q+1TaO$(ovhX
zR8#g&(wwt{iDdO;u5r~Cj@DMeADcP(r=~LxypIWCH|VxDptC+>)vkwnk6*{CpZt;0
z>r>E773uH3AwL-RMhguH@ss@v=!CraOe|&YSELx2p1#dk!*`?kM9}#ADJp8)Nczyk
zo(~iWwwo=&)!^Z6(ZmY0I_r3P3o@MB1R7AEOT$*{j?0&=1^AhK7%)(@!weecbiwV0
z9;_g7!s+uKnhsNoXWW$nJOOZie~j}
zpDKFj?*H11EuU9S5M7kLFt`JxBTCtip}2mW%?=k_?(|to{=WMcTyTFwcpzi
zJ-Kqr`U#W%OgLK0)o;83=hbeGs9^Tdp~>1{!aOp^N5O+YQmyR3bY7N3bVtM0PXol)wjH7(C45kZYIsHj3}AV89^$9?~Ifmv%UpAd}6EvRuc@8pyq
zOpUe-bn@WX#DNrWFv6`pYgl{5C!dEw>`l`c#OC0pctZzPs8sN^vu7>n%E@{IxCX(>
zT*4$DiDgPB(Qe$DsJlf5?x0Y@eDL83eoHvn6-pp+?GzwIK+4XMnd*D
zq~MsiUX(y%+nC=i8p3g#RJAwQUK#S>>Wn+e=r}(li)P~i!*njngB8oys<#G9yj{xx
zU`wzWHOydZ>`Y)%A0o4m1$K%_Az$=B{O~txVgyUdM^*tZz+KfeXe9L1A$VU=5U5IK_-l
zR#^ENCit=Le$l?XGlXLyF!`@f_hq)x
+
+ OpenKh.Tools.ModManager
+ WinExe
+ net8.0
+ enable
+ app.manifest
+
+
+
+
+
+
+
+
+
+
+
+
+ None
+ All
+
+
+
+
+
+
+ MainView.axaml
+
+
+
diff --git a/OpenKh.Tools.ModManager/Program.cs b/OpenKh.Tools.ModManager/Program.cs
new file mode 100644
index 000000000..b0baf373c
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Program.cs
@@ -0,0 +1,24 @@
+using Avalonia;
+using System;
+
+namespace OpenKh.Tools.ModManager;
+
+sealed class Program
+{
+ // Initialization code. Don't use any Avalonia, third-party APIs or any
+ // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
+ // yet and stuff might break.
+ [STAThread]
+ public static void Main(string[] args) => BuildAvaloniaApp()
+ .StartWithClassicDesktopLifetime(args);
+
+ // Avalonia configuration, don't remove; also used by visual designer.
+ public static AppBuilder BuildAvaloniaApp()
+ => AppBuilder.Configure()
+ .UsePlatformDetect()
+#if DEBUG
+ .WithDeveloperTools()
+#endif
+ .WithInterFont()
+ .LogToTrace();
+}
diff --git a/OpenKh.Tools.ModManager/ViewLocator.cs b/OpenKh.Tools.ModManager/ViewLocator.cs
new file mode 100644
index 000000000..2d82e8a36
--- /dev/null
+++ b/OpenKh.Tools.ModManager/ViewLocator.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using Avalonia.Controls;
+using Avalonia.Controls.Templates;
+using OpenKh.Tools.ModManager.ViewModels;
+
+namespace OpenKh.Tools.ModManager;
+
+///
+/// Given a view model, returns the corresponding view if possible.
+///
+[RequiresUnreferencedCode(
+ "Default implementation of ViewLocator involves reflection which may be trimmed away.",
+ Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")]
+public class ViewLocator : IDataTemplate
+{
+ public Control? Build(object? param)
+ {
+ if (param is null)
+ return null;
+
+ var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
+ var type = Type.GetType(name);
+
+ if (type != null)
+ {
+ return (Control)Activator.CreateInstance(type)!;
+ }
+
+ return new TextBlock { Text = "Not Found: " + name };
+ }
+
+ public bool Match(object? data)
+ {
+ return data is ViewModelBase;
+ }
+}
diff --git a/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs b/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
new file mode 100644
index 000000000..a28369e1d
--- /dev/null
+++ b/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
@@ -0,0 +1,10 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+using OpenKh.Tools.ModManager.Models;
+
+namespace OpenKh.Tools.ModManager.ViewModels;
+
+public partial class MainViewModel : ViewModelBase
+{
+ [ObservableProperty]
+ private ModModel? _currentMod = null;
+}
diff --git a/OpenKh.Tools.ModManager/ViewModels/ViewModelBase.cs b/OpenKh.Tools.ModManager/ViewModels/ViewModelBase.cs
new file mode 100644
index 000000000..2b8d8d2c1
--- /dev/null
+++ b/OpenKh.Tools.ModManager/ViewModels/ViewModelBase.cs
@@ -0,0 +1,7 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace OpenKh.Tools.ModManager.ViewModels;
+
+public abstract class ViewModelBase : ObservableObject
+{
+}
diff --git a/OpenKh.Tools.ModManager/Views/MainView.axaml b/OpenKh.Tools.ModManager/Views/MainView.axaml
new file mode 100644
index 000000000..82ee68cb1
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/MainView.axaml
@@ -0,0 +1,85 @@
+
+
+
+ M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H11.1904C12.3112 20.8321 13 19.2465 13 17.5C13 13.9101 10.0899 11 6.5 11C5.6141 11 4.76959 11.1772 4 11.4982V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5ZM12 17.5C12 14.4624 9.53757 12 6.5 12C3.46243 12 1 14.4624 1 17.5C1 20.5376 3.46243 23 6.5 23C9.53757 23 12 20.5376 12 17.5ZM7.00065 18L7.00111 20.5035C7.00111 20.7797 6.77725 21.0035 6.50111 21.0035C6.22497 21.0035 6.00111 20.7797 6.00111 20.5035L6.00065 18H3.4956C3.21973 18 2.99609 17.7762 2.99609 17.5C2.99609 17.2239 3.21973 17 3.4956 17H6.00046L6 14.4993C6 14.2231 6.22386 13.9993 6.5 13.9993C6.77614 13.9993 7 14.2231 7 14.4993L7.00046 17H9.49659C9.77246 17 9.99609 17.2239 9.99609 17.5C9.99609 17.7762 9.77246 18 9.49659 18H7.00065Z
+ M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H11.1904C12.3112 20.8321 13 19.2465 13 17.5C13 13.9101 10.0899 11 6.5 11C5.6141 11 4.76959 11.1772 4 11.4982V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5ZM6.5 12C3.46243 12 1 14.4624 1 17.5C1 20.5376 3.46243 23 6.5 23C9.53757 23 12 20.5376 12 17.5C12 14.4624 9.53757 12 6.5 12ZM8.97823 15.7313L7.20843 17.5001L8.97806 19.2697C9.17332 19.465 9.17332 19.7816 8.97806 19.9768C8.78279 20.1721 8.46621 20.1721 8.27095 19.9768L6.50112 18.207L4.73246 19.9746C4.5372 20.1699 4.22061 20.1699 4.02535 19.9746C3.83009 19.7794 3.83009 19.4628 4.02535 19.2675L5.79401 17.4999L4.02535 15.7312C3.83009 15.536 3.83009 15.2194 4.02535 15.0241C4.22061 14.8289 4.5372 14.8289 4.73246 15.0241L6.50133 16.793L8.27113 15.0242C8.46639 14.829 8.78297 14.829 8.97823 15.0242C9.1735 15.2195 9.1735 15.5361 8.97823 15.7313Z
+ M1.99902 12C1.99902 17.5228 6.47617 22 11.999 22C17.5219 22 21.999 17.5228 21.999 12C21.999 6.47715 17.5219 2 11.999 2C6.47618 2 1.99902 6.47715 1.99902 12ZM16.5297 11.7199C16.796 11.9862 16.8202 12.4028 16.6023 12.6964L16.5297 12.7805L12.5289 16.7814C12.2626 17.0477 11.8459 17.0718 11.5523 16.8539L11.4681 16.7813L7.46814 12.7797C7.1753 12.4868 7.17539 12.0119 7.46834 11.7191C7.73466 11.4529 8.15132 11.4287 8.44489 11.6466L8.529 11.7193L11.2497 14.4412L11.2494 7.74951C11.2494 7.36982 11.5315 7.05602 11.8976 7.00636L11.9994 6.99951C12.3791 6.99951 12.6929 7.28167 12.7425 7.64774L12.7494 7.74951L12.7497 14.4392L15.4691 11.7199C15.7353 11.4536 16.152 11.4294 16.4456 11.6473L16.5297 11.7199Z
+ M22.001 12C22.001 6.47715 17.5238 2 12.001 2C6.47813 2 2.00098 6.47715 2.00098 12C2.00098 17.5228 6.47813 22 12.001 22C17.5238 22 22.001 17.5228 22.001 12ZM7.47028 12.2801C7.20401 12.0138 7.17981 11.5972 7.39766 11.3036L7.47028 11.2195L11.4711 7.21863C11.7374 6.95233 12.1541 6.92816 12.4477 7.14609L12.5319 7.21873L16.5319 11.2203C16.8247 11.5132 16.8246 11.9881 16.5317 12.2809C16.2653 12.5471 15.8487 12.5713 15.5551 12.3534L15.471 12.2807L12.7503 9.55878L12.7506 16.2505C12.7506 16.6302 12.4685 16.944 12.1024 16.9936L12.0006 17.0005C11.6209 17.0005 11.3071 16.7183 11.2575 16.3523L11.2506 16.2505L11.2503 9.56078L8.53094 12.2801C8.26467 12.5464 7.84801 12.5706 7.5544 12.3527L7.47028 12.2801Z
+ M16.0883 6.41228C16.016 6.31886 15.9377 6.2298 15.8539 6.14569C15.5417 5.83255 15.1606 5.59666 14.741 5.45683L13.3632 5.00939C13.257 4.97196 13.165 4.90253 13.1 4.81068C13.0349 4.71883 13 4.60908 13 4.49656C13 4.38404 13.0349 4.27429 13.1 4.18244C13.165 4.09058 13.257 4.02116 13.3632 3.98372L14.741 3.53628C15.1547 3.39352 15.5299 3.15705 15.837 2.84537C16.1357 2.54224 16.3623 2.17595 16.5 1.77372L16.5114 1.73963L16.9592 0.362894C16.9967 0.256782 17.0662 0.164895 17.1581 0.0998993C17.25 0.0349035 17.3598 0 17.4724 0C17.5851 0 17.6949 0.0349035 17.7868 0.0998993C17.8787 0.164895 17.9482 0.256782 17.9857 0.362894L18.4335 1.73963C18.5727 2.15819 18.8077 2.53853 19.1198 2.85041C19.432 3.1623 19.8126 3.39715 20.2315 3.53628L21.6093 3.98372L21.6368 3.99061C21.743 4.02804 21.835 4.09747 21.9 4.18932C21.9651 4.28117 22 4.39092 22 4.50344C22 4.61596 21.9651 4.72571 21.9 4.81756C21.835 4.90942 21.743 4.97884 21.6368 5.01628L20.259 5.46372C19.8402 5.60285 19.4595 5.8377 19.1474 6.14959C18.8353 6.46147 18.6003 6.84181 18.461 7.26037L18.0132 8.63711C18.0092 8.64855 18.0048 8.65983 18 8.67093C17.9605 8.76273 17.8964 8.84212 17.8144 8.9001C17.7224 8.9651 17.6126 9 17.5 9C17.3874 9 17.2776 8.9651 17.1856 8.9001C17.0937 8.8351 17.0242 8.74322 16.9868 8.63711L16.539 7.26037C16.4378 6.95331 16.2851 6.66664 16.0883 6.41228ZM23.7829 10.2132L23.0175 9.9646C22.7848 9.8873 22.5733 9.75683 22.3999 9.58356C22.2265 9.41029 22.0959 9.199 22.0186 8.96646L21.7698 8.20161C21.749 8.14266 21.7104 8.09161 21.6593 8.0555C21.6083 8.01939 21.5473 8 21.4847 8C21.4221 8 21.3611 8.01939 21.31 8.0555C21.259 8.09161 21.2204 8.14266 21.1996 8.20161L20.9508 8.96646C20.875 9.19736 20.7467 9.40761 20.5761 9.58076C20.4055 9.75392 20.1971 9.88529 19.9672 9.9646L19.2018 10.2132C19.1428 10.234 19.0917 10.2725 19.0555 10.3236C19.0194 10.3746 19 10.4356 19 10.4981C19 10.5606 19.0194 10.6216 19.0555 10.6726C19.0917 10.7236 19.1428 10.7622 19.2018 10.783L19.9672 11.0316C20.2003 11.1093 20.412 11.2403 20.5855 11.4143C20.7589 11.5882 20.8893 11.8003 20.9661 12.0335L21.2149 12.7984C21.2357 12.8573 21.2743 12.9084 21.3254 12.9445C21.3764 12.9806 21.4374 13 21.5 13C21.5626 13 21.6236 12.9806 21.6746 12.9445C21.7257 12.9084 21.7643 12.8573 21.7851 12.7984L22.0339 12.0335C22.1113 11.801 22.2418 11.5897 22.4152 11.4164C22.5886 11.2432 22.8001 11.1127 23.0328 11.0354L23.7982 10.7868C23.8572 10.766 23.9083 10.7275 23.9445 10.6764C23.9806 10.6254 24 10.5644 24 10.5019C24 10.4394 23.9806 10.3784 23.9445 10.3274C23.9083 10.2764 23.8572 10.2378 23.7982 10.217L23.7829 10.2132ZM12 2.00073C12.957 2.00073 13.8827 2.13518 14.7591 2.38621C14.6432 2.4573 14.5193 2.51563 14.39 2.55903L13.05 2.99903C12.4247 3.22211 12.0018 3.80273 12 4.46903C12.002 5.10403 12.4159 5.74618 13 5.99903L14.4 6.45903C14.9164 6.63419 15.4143 7.02503 15.59 7.54903L16 8.99903C16.2128 9.62184 16.8014 10.047 17.46 10.049C17.6963 10.0519 17.9298 9.99699 18.14 9.88903C18.0212 10.0886 17.959 10.3168 17.96 10.549C17.9556 11.0886 18.322 11.5971 18.83 11.779C18.9034 11.8023 18.9865 11.8233 19.0738 11.8454C19.4335 11.9365 19.8642 12.0456 19.98 12.399L19.9943 12.4444C20.2303 13.1929 20.5003 14.0495 21.46 14.0495C21.5839 14.0495 21.6961 14.0353 21.7983 14.009C20.8685 18.5694 16.835 22.0007 12 22.0007C6.47715 22.0007 2 17.5236 2 12.0007C2 6.47788 6.47715 2.00073 12 2.00073ZM7.4693 12.2808L7.55342 12.3535C7.84703 12.5713 8.2637 12.5471 8.52996 12.2808L11.2493 9.56152L11.2496 16.2512L11.2565 16.353C11.3061 16.7191 11.6199 17.0012 11.9996 17.0012L12.1014 16.9944C12.4675 16.9447 12.7496 16.6309 12.7496 16.2512L12.7493 9.55952L15.47 12.2814L15.5541 12.3541C15.8477 12.572 16.2644 12.5479 16.5307 12.2817C16.8236 11.9888 16.8237 11.5139 16.5309 11.221L12.5309 7.21947L12.4468 7.14682C12.1532 6.92889 11.7364 6.95306 11.4701 7.21936L7.4693 11.2202L7.39669 11.3043C7.17883 11.5979 7.20304 12.0146 7.4693 12.2808Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenKh.Tools.ModManager/Views/MainView.axaml.cs b/OpenKh.Tools.ModManager/Views/MainView.axaml.cs
new file mode 100644
index 000000000..6674dcc91
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/MainView.axaml.cs
@@ -0,0 +1,13 @@
+using System;
+using Avalonia.Controls;
+using OpenKh.Tools.ModManager.Models;
+
+namespace OpenKh.Tools.ModManager.Views;
+
+public partial class MainWindow : Window
+{
+ public MainWindow()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml b/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml
new file mode 100644
index 000000000..9826ef22d
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml.cs b/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml.cs
new file mode 100644
index 000000000..5f113c9af
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml.cs
@@ -0,0 +1,14 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace OpenKh.Tools.ModManager.Views
+{
+ public partial class ModDetailsView : ContentPage
+ {
+ public ModDetailsView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/OpenKh.Tools.ModManager/Views/ModListView.axaml b/OpenKh.Tools.ModManager/Views/ModListView.axaml
new file mode 100644
index 000000000..5c3a181d7
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/ModListView.axaml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenKh.Tools.ModManager/Views/ModListView.axaml.cs b/OpenKh.Tools.ModManager/Views/ModListView.axaml.cs
new file mode 100644
index 000000000..dcac9151b
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/ModListView.axaml.cs
@@ -0,0 +1,22 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using OpenKh.Tools.ModManager.Models;
+using System;
+
+namespace OpenKh.Tools.ModManager.Views
+{
+ public partial class ModListView : ContentPage
+ {
+ public ModListView()
+ {
+ InitializeComponent();
+
+ ModList.ItemsSource = new ModModel[]
+ {
+ new ModModel{ ModTitle = "Kingdom Hearts II - Re:Fined", ModAuthor = "The Re:Fined Team", ModDescription = "Kingdom Hearts - Re:Fined for Kingdom Hearts II | r190826-0855-FC", ModSource = new Uri("https://codeberg.org/KH-ReFined/KH-ReFined"), ModIssues = new Uri("https://codeberg.org/KH-ReFined/KH-ReFined/issues"), ModActive = true },
+ new ModModel{ ModTitle = "GOA ROM Edition", ModAuthor = "1234567890num", ModActive = false }
+ };
+ }
+ }
+}
diff --git a/OpenKh.Tools.ModManager/app.manifest b/OpenKh.Tools.ModManager/app.manifest
new file mode 100644
index 000000000..8c970c5fd
--- /dev/null
+++ b/OpenKh.Tools.ModManager/app.manifest
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenKh.sln b/OpenKh.sln
index 65f4f3209..e7b042f03 100644
--- a/OpenKh.sln
+++ b/OpenKh.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.1.32203.90
+# Visual Studio Version 18
+VisualStudioVersion = 18.8.12021.73
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenKh.Kh2", "OpenKh.Kh2\OpenKh.Kh2.csproj", "{D5B36CD1-5B5D-4CE9-A673-209AD386D68A}"
EndProject
@@ -234,6 +234,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Openkh.Tools.Kh2LocalSetEdi
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenKh.Recom", "OpenKh.Recom\OpenKh.Recom.csproj", "{E9CAA582-1823-4B42-8218-F4B7B2C788D3}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenKh.Tools.ModManager", "OpenKh.Tools.ModManager\OpenKh.Tools.ModManager.csproj", "{02106CAB-5C1D-4651-B133-743E4CD6F302}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
.NET Debug|Any CPU = .NET Debug|Any CPU
@@ -952,6 +954,14 @@ Global
{E9CAA582-1823-4B42-8218-F4B7B2C788D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E9CAA582-1823-4B42-8218-F4B7B2C788D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E9CAA582-1823-4B42-8218-F4B7B2C788D3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}..NET Debug|Any CPU.ActiveCfg = Release|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}..NET Debug|Any CPU.Build.0 = Release|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}..NET Release|Any CPU.ActiveCfg = Release|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}..NET Release|Any CPU.Build.0 = Release|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {02106CAB-5C1D-4651-B133-743E4CD6F302}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1050,6 +1060,7 @@ Global
{A8DAC079-E416-4574-9B54-19EED185D368} = {9C52D787-9819-4B89-989B-EEA6FEB20731}
{D58EEC5B-962C-4888-953B-4A443015E45D} = {402B2669-D594-4DFA-965B-02A92626ADC6}
{E9CAA582-1823-4B42-8218-F4B7B2C788D3} = {0FB7CD6A-EE31-467D-A590-267DCD028618}
+ {02106CAB-5C1D-4651-B133-743E4CD6F302} = {402B2669-D594-4DFA-965B-02A92626ADC6}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {1DF3960B-4FE5-4E56-92D4-2FC0A912E823}
From 636959219dd55d87828d20732033a209342b58f2 Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 06:53:21 +0200
Subject: [PATCH 002/175] [Mod Manager] - Status bar implementation.
---
.../Converters/XamlConverters.cs | 18 +++
.../ViewModels/MainViewModel.cs | 3 +
OpenKh.Tools.ModManager/Views/MainView.axaml | 120 ++++++++++--------
.../Views/ModStatusView.axaml | 27 ++++
.../Views/ModStatusView.axaml.cs | 17 +++
5 files changed, 129 insertions(+), 56 deletions(-)
create mode 100644 OpenKh.Tools.ModManager/Converters/XamlConverters.cs
create mode 100644 OpenKh.Tools.ModManager/Views/ModStatusView.axaml
create mode 100644 OpenKh.Tools.ModManager/Views/ModStatusView.axaml.cs
diff --git a/OpenKh.Tools.ModManager/Converters/XamlConverters.cs b/OpenKh.Tools.ModManager/Converters/XamlConverters.cs
new file mode 100644
index 000000000..e3260c9ba
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Converters/XamlConverters.cs
@@ -0,0 +1,18 @@
+using Avalonia.Data.Converters;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OpenKh.Tools.ModManager.Converters
+{
+ public class BooleanValueMapper : IValueConverter
+ {
+ public object? IfTrue { get; set; }
+ public object? IfFalse { get; set; }
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => value is bool b && b ? IfTrue : IfFalse;
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException();
+ }
+}
diff --git a/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs b/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
index a28369e1d..df5c1bc9f 100644
--- a/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
+++ b/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
@@ -7,4 +7,7 @@ public partial class MainViewModel : ViewModelBase
{
[ObservableProperty]
private ModModel? _currentMod = null;
+
+ [ObservableProperty]
+ private bool _configurationValid = true;
}
diff --git a/OpenKh.Tools.ModManager/Views/MainView.axaml b/OpenKh.Tools.ModManager/Views/MainView.axaml
index 82ee68cb1..688326f71 100644
--- a/OpenKh.Tools.ModManager/Views/MainView.axaml
+++ b/OpenKh.Tools.ModManager/Views/MainView.axaml
@@ -5,7 +5,6 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:model="using:OpenKh.Tools.ModManager.Models"
xmlns:view="clr-namespace:OpenKh.Tools.ModManager.Views"
- xmlns:svg="clr-namespace:Avalonia.Svg;assembly=Avalonia.Svg"
mc:Ignorable="d" d:DesignWidth="750" d:DesignHeight="850"
Width="750" Height="850"
MinWidth="750" MinHeight="850"
@@ -15,71 +14,80 @@
Title="OpenKh.Tools.ModManager">
- M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H11.1904C12.3112 20.8321 13 19.2465 13 17.5C13 13.9101 10.0899 11 6.5 11C5.6141 11 4.76959 11.1772 4 11.4982V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5ZM12 17.5C12 14.4624 9.53757 12 6.5 12C3.46243 12 1 14.4624 1 17.5C1 20.5376 3.46243 23 6.5 23C9.53757 23 12 20.5376 12 17.5ZM7.00065 18L7.00111 20.5035C7.00111 20.7797 6.77725 21.0035 6.50111 21.0035C6.22497 21.0035 6.00111 20.7797 6.00111 20.5035L6.00065 18H3.4956C3.21973 18 2.99609 17.7762 2.99609 17.5C2.99609 17.2239 3.21973 17 3.4956 17H6.00046L6 14.4993C6 14.2231 6.22386 13.9993 6.5 13.9993C6.77614 13.9993 7 14.2231 7 14.4993L7.00046 17H9.49659C9.77246 17 9.99609 17.2239 9.99609 17.5C9.99609 17.7762 9.77246 18 9.49659 18H7.00065Z
- M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H11.1904C12.3112 20.8321 13 19.2465 13 17.5C13 13.9101 10.0899 11 6.5 11C5.6141 11 4.76959 11.1772 4 11.4982V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5ZM6.5 12C3.46243 12 1 14.4624 1 17.5C1 20.5376 3.46243 23 6.5 23C9.53757 23 12 20.5376 12 17.5C12 14.4624 9.53757 12 6.5 12ZM8.97823 15.7313L7.20843 17.5001L8.97806 19.2697C9.17332 19.465 9.17332 19.7816 8.97806 19.9768C8.78279 20.1721 8.46621 20.1721 8.27095 19.9768L6.50112 18.207L4.73246 19.9746C4.5372 20.1699 4.22061 20.1699 4.02535 19.9746C3.83009 19.7794 3.83009 19.4628 4.02535 19.2675L5.79401 17.4999L4.02535 15.7312C3.83009 15.536 3.83009 15.2194 4.02535 15.0241C4.22061 14.8289 4.5372 14.8289 4.73246 15.0241L6.50133 16.793L8.27113 15.0242C8.46639 14.829 8.78297 14.829 8.97823 15.0242C9.1735 15.2195 9.1735 15.5361 8.97823 15.7313Z
- M1.99902 12C1.99902 17.5228 6.47617 22 11.999 22C17.5219 22 21.999 17.5228 21.999 12C21.999 6.47715 17.5219 2 11.999 2C6.47618 2 1.99902 6.47715 1.99902 12ZM16.5297 11.7199C16.796 11.9862 16.8202 12.4028 16.6023 12.6964L16.5297 12.7805L12.5289 16.7814C12.2626 17.0477 11.8459 17.0718 11.5523 16.8539L11.4681 16.7813L7.46814 12.7797C7.1753 12.4868 7.17539 12.0119 7.46834 11.7191C7.73466 11.4529 8.15132 11.4287 8.44489 11.6466L8.529 11.7193L11.2497 14.4412L11.2494 7.74951C11.2494 7.36982 11.5315 7.05602 11.8976 7.00636L11.9994 6.99951C12.3791 6.99951 12.6929 7.28167 12.7425 7.64774L12.7494 7.74951L12.7497 14.4392L15.4691 11.7199C15.7353 11.4536 16.152 11.4294 16.4456 11.6473L16.5297 11.7199Z
- M22.001 12C22.001 6.47715 17.5238 2 12.001 2C6.47813 2 2.00098 6.47715 2.00098 12C2.00098 17.5228 6.47813 22 12.001 22C17.5238 22 22.001 17.5228 22.001 12ZM7.47028 12.2801C7.20401 12.0138 7.17981 11.5972 7.39766 11.3036L7.47028 11.2195L11.4711 7.21863C11.7374 6.95233 12.1541 6.92816 12.4477 7.14609L12.5319 7.21873L16.5319 11.2203C16.8247 11.5132 16.8246 11.9881 16.5317 12.2809C16.2653 12.5471 15.8487 12.5713 15.5551 12.3534L15.471 12.2807L12.7503 9.55878L12.7506 16.2505C12.7506 16.6302 12.4685 16.944 12.1024 16.9936L12.0006 17.0005C11.6209 17.0005 11.3071 16.7183 11.2575 16.3523L11.2506 16.2505L11.2503 9.56078L8.53094 12.2801C8.26467 12.5464 7.84801 12.5706 7.5544 12.3527L7.47028 12.2801Z
- M16.0883 6.41228C16.016 6.31886 15.9377 6.2298 15.8539 6.14569C15.5417 5.83255 15.1606 5.59666 14.741 5.45683L13.3632 5.00939C13.257 4.97196 13.165 4.90253 13.1 4.81068C13.0349 4.71883 13 4.60908 13 4.49656C13 4.38404 13.0349 4.27429 13.1 4.18244C13.165 4.09058 13.257 4.02116 13.3632 3.98372L14.741 3.53628C15.1547 3.39352 15.5299 3.15705 15.837 2.84537C16.1357 2.54224 16.3623 2.17595 16.5 1.77372L16.5114 1.73963L16.9592 0.362894C16.9967 0.256782 17.0662 0.164895 17.1581 0.0998993C17.25 0.0349035 17.3598 0 17.4724 0C17.5851 0 17.6949 0.0349035 17.7868 0.0998993C17.8787 0.164895 17.9482 0.256782 17.9857 0.362894L18.4335 1.73963C18.5727 2.15819 18.8077 2.53853 19.1198 2.85041C19.432 3.1623 19.8126 3.39715 20.2315 3.53628L21.6093 3.98372L21.6368 3.99061C21.743 4.02804 21.835 4.09747 21.9 4.18932C21.9651 4.28117 22 4.39092 22 4.50344C22 4.61596 21.9651 4.72571 21.9 4.81756C21.835 4.90942 21.743 4.97884 21.6368 5.01628L20.259 5.46372C19.8402 5.60285 19.4595 5.8377 19.1474 6.14959C18.8353 6.46147 18.6003 6.84181 18.461 7.26037L18.0132 8.63711C18.0092 8.64855 18.0048 8.65983 18 8.67093C17.9605 8.76273 17.8964 8.84212 17.8144 8.9001C17.7224 8.9651 17.6126 9 17.5 9C17.3874 9 17.2776 8.9651 17.1856 8.9001C17.0937 8.8351 17.0242 8.74322 16.9868 8.63711L16.539 7.26037C16.4378 6.95331 16.2851 6.66664 16.0883 6.41228ZM23.7829 10.2132L23.0175 9.9646C22.7848 9.8873 22.5733 9.75683 22.3999 9.58356C22.2265 9.41029 22.0959 9.199 22.0186 8.96646L21.7698 8.20161C21.749 8.14266 21.7104 8.09161 21.6593 8.0555C21.6083 8.01939 21.5473 8 21.4847 8C21.4221 8 21.3611 8.01939 21.31 8.0555C21.259 8.09161 21.2204 8.14266 21.1996 8.20161L20.9508 8.96646C20.875 9.19736 20.7467 9.40761 20.5761 9.58076C20.4055 9.75392 20.1971 9.88529 19.9672 9.9646L19.2018 10.2132C19.1428 10.234 19.0917 10.2725 19.0555 10.3236C19.0194 10.3746 19 10.4356 19 10.4981C19 10.5606 19.0194 10.6216 19.0555 10.6726C19.0917 10.7236 19.1428 10.7622 19.2018 10.783L19.9672 11.0316C20.2003 11.1093 20.412 11.2403 20.5855 11.4143C20.7589 11.5882 20.8893 11.8003 20.9661 12.0335L21.2149 12.7984C21.2357 12.8573 21.2743 12.9084 21.3254 12.9445C21.3764 12.9806 21.4374 13 21.5 13C21.5626 13 21.6236 12.9806 21.6746 12.9445C21.7257 12.9084 21.7643 12.8573 21.7851 12.7984L22.0339 12.0335C22.1113 11.801 22.2418 11.5897 22.4152 11.4164C22.5886 11.2432 22.8001 11.1127 23.0328 11.0354L23.7982 10.7868C23.8572 10.766 23.9083 10.7275 23.9445 10.6764C23.9806 10.6254 24 10.5644 24 10.5019C24 10.4394 23.9806 10.3784 23.9445 10.3274C23.9083 10.2764 23.8572 10.2378 23.7982 10.217L23.7829 10.2132ZM12 2.00073C12.957 2.00073 13.8827 2.13518 14.7591 2.38621C14.6432 2.4573 14.5193 2.51563 14.39 2.55903L13.05 2.99903C12.4247 3.22211 12.0018 3.80273 12 4.46903C12.002 5.10403 12.4159 5.74618 13 5.99903L14.4 6.45903C14.9164 6.63419 15.4143 7.02503 15.59 7.54903L16 8.99903C16.2128 9.62184 16.8014 10.047 17.46 10.049C17.6963 10.0519 17.9298 9.99699 18.14 9.88903C18.0212 10.0886 17.959 10.3168 17.96 10.549C17.9556 11.0886 18.322 11.5971 18.83 11.779C18.9034 11.8023 18.9865 11.8233 19.0738 11.8454C19.4335 11.9365 19.8642 12.0456 19.98 12.399L19.9943 12.4444C20.2303 13.1929 20.5003 14.0495 21.46 14.0495C21.5839 14.0495 21.6961 14.0353 21.7983 14.009C20.8685 18.5694 16.835 22.0007 12 22.0007C6.47715 22.0007 2 17.5236 2 12.0007C2 6.47788 6.47715 2.00073 12 2.00073ZM7.4693 12.2808L7.55342 12.3535C7.84703 12.5713 8.2637 12.5471 8.52996 12.2808L11.2493 9.56152L11.2496 16.2512L11.2565 16.353C11.3061 16.7191 11.6199 17.0012 11.9996 17.0012L12.1014 16.9944C12.4675 16.9447 12.7496 16.6309 12.7496 16.2512L12.7493 9.55952L15.47 12.2814L15.5541 12.3541C15.8477 12.572 16.2644 12.5479 16.5307 12.2817C16.8236 11.9888 16.8237 11.5139 16.5309 11.221L12.5309 7.21947L12.4468 7.14682C12.1532 6.92889 11.7364 6.95306 11.4701 7.21936L7.4693 11.2202L7.39669 11.3043C7.17883 11.5979 7.20304 12.0146 7.4693 12.2808Z
+ M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H11.1904C12.3112 20.8321 13 19.2465 13 17.5C13 13.9101 10.0899 11 6.5 11C5.6141 11 4.76959 11.1772 4 11.4982V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5ZM12 17.5C12 14.4624 9.53757 12 6.5 12C3.46243 12 1 14.4624 1 17.5C1 20.5376 3.46243 23 6.5 23C9.53757 23 12 20.5376 12 17.5ZM7.00065 18L7.00111 20.5035C7.00111 20.7797 6.77725 21.0035 6.50111 21.0035C6.22497 21.0035 6.00111 20.7797 6.00111 20.5035L6.00065 18H3.4956C3.21973 18 2.99609 17.7762 2.99609 17.5C2.99609 17.2239 3.21973 17 3.4956 17H6.00046L6 14.4993C6 14.2231 6.22386 13.9993 6.5 13.9993C6.77614 13.9993 7 14.2231 7 14.4993L7.00046 17H9.49659C9.77246 17 9.99609 17.2239 9.99609 17.5C9.99609 17.7762 9.77246 18 9.49659 18H7.00065Z
+ M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H11.1904C12.3112 20.8321 13 19.2465 13 17.5C13 13.9101 10.0899 11 6.5 11C5.6141 11 4.76959 11.1772 4 11.4982V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5ZM6.5 12C3.46243 12 1 14.4624 1 17.5C1 20.5376 3.46243 23 6.5 23C9.53757 23 12 20.5376 12 17.5C12 14.4624 9.53757 12 6.5 12ZM8.97823 15.7313L7.20843 17.5001L8.97806 19.2697C9.17332 19.465 9.17332 19.7816 8.97806 19.9768C8.78279 20.1721 8.46621 20.1721 8.27095 19.9768L6.50112 18.207L4.73246 19.9746C4.5372 20.1699 4.22061 20.1699 4.02535 19.9746C3.83009 19.7794 3.83009 19.4628 4.02535 19.2675L5.79401 17.4999L4.02535 15.7312C3.83009 15.536 3.83009 15.2194 4.02535 15.0241C4.22061 14.8289 4.5372 14.8289 4.73246 15.0241L6.50133 16.793L8.27113 15.0242C8.46639 14.829 8.78297 14.829 8.97823 15.0242C9.1735 15.2195 9.1735 15.5361 8.97823 15.7313Z
+ M1.99902 12C1.99902 17.5228 6.47617 22 11.999 22C17.5219 22 21.999 17.5228 21.999 12C21.999 6.47715 17.5219 2 11.999 2C6.47618 2 1.99902 6.47715 1.99902 12ZM16.5297 11.7199C16.796 11.9862 16.8202 12.4028 16.6023 12.6964L16.5297 12.7805L12.5289 16.7814C12.2626 17.0477 11.8459 17.0718 11.5523 16.8539L11.4681 16.7813L7.46814 12.7797C7.1753 12.4868 7.17539 12.0119 7.46834 11.7191C7.73466 11.4529 8.15132 11.4287 8.44489 11.6466L8.529 11.7193L11.2497 14.4412L11.2494 7.74951C11.2494 7.36982 11.5315 7.05602 11.8976 7.00636L11.9994 6.99951C12.3791 6.99951 12.6929 7.28167 12.7425 7.64774L12.7494 7.74951L12.7497 14.4392L15.4691 11.7199C15.7353 11.4536 16.152 11.4294 16.4456 11.6473L16.5297 11.7199Z
+ M22.001 12C22.001 6.47715 17.5238 2 12.001 2C6.47813 2 2.00098 6.47715 2.00098 12C2.00098 17.5228 6.47813 22 12.001 22C17.5238 22 22.001 17.5228 22.001 12ZM7.47028 12.2801C7.20401 12.0138 7.17981 11.5972 7.39766 11.3036L7.47028 11.2195L11.4711 7.21863C11.7374 6.95233 12.1541 6.92816 12.4477 7.14609L12.5319 7.21873L16.5319 11.2203C16.8247 11.5132 16.8246 11.9881 16.5317 12.2809C16.2653 12.5471 15.8487 12.5713 15.5551 12.3534L15.471 12.2807L12.7503 9.55878L12.7506 16.2505C12.7506 16.6302 12.4685 16.944 12.1024 16.9936L12.0006 17.0005C11.6209 17.0005 11.3071 16.7183 11.2575 16.3523L11.2506 16.2505L11.2503 9.56078L8.53094 12.2801C8.26467 12.5464 7.84801 12.5706 7.5544 12.3527L7.47028 12.2801Z
+ M16.0883 6.41228C16.016 6.31886 15.9377 6.2298 15.8539 6.14569C15.5417 5.83255 15.1606 5.59666 14.741 5.45683L13.3632 5.00939C13.257 4.97196 13.165 4.90253 13.1 4.81068C13.0349 4.71883 13 4.60908 13 4.49656C13 4.38404 13.0349 4.27429 13.1 4.18244C13.165 4.09058 13.257 4.02116 13.3632 3.98372L14.741 3.53628C15.1547 3.39352 15.5299 3.15705 15.837 2.84537C16.1357 2.54224 16.3623 2.17595 16.5 1.77372L16.5114 1.73963L16.9592 0.362894C16.9967 0.256782 17.0662 0.164895 17.1581 0.0998993C17.25 0.0349035 17.3598 0 17.4724 0C17.5851 0 17.6949 0.0349035 17.7868 0.0998993C17.8787 0.164895 17.9482 0.256782 17.9857 0.362894L18.4335 1.73963C18.5727 2.15819 18.8077 2.53853 19.1198 2.85041C19.432 3.1623 19.8126 3.39715 20.2315 3.53628L21.6093 3.98372L21.6368 3.99061C21.743 4.02804 21.835 4.09747 21.9 4.18932C21.9651 4.28117 22 4.39092 22 4.50344C22 4.61596 21.9651 4.72571 21.9 4.81756C21.835 4.90942 21.743 4.97884 21.6368 5.01628L20.259 5.46372C19.8402 5.60285 19.4595 5.8377 19.1474 6.14959C18.8353 6.46147 18.6003 6.84181 18.461 7.26037L18.0132 8.63711C18.0092 8.64855 18.0048 8.65983 18 8.67093C17.9605 8.76273 17.8964 8.84212 17.8144 8.9001C17.7224 8.9651 17.6126 9 17.5 9C17.3874 9 17.2776 8.9651 17.1856 8.9001C17.0937 8.8351 17.0242 8.74322 16.9868 8.63711L16.539 7.26037C16.4378 6.95331 16.2851 6.66664 16.0883 6.41228ZM23.7829 10.2132L23.0175 9.9646C22.7848 9.8873 22.5733 9.75683 22.3999 9.58356C22.2265 9.41029 22.0959 9.199 22.0186 8.96646L21.7698 8.20161C21.749 8.14266 21.7104 8.09161 21.6593 8.0555C21.6083 8.01939 21.5473 8 21.4847 8C21.4221 8 21.3611 8.01939 21.31 8.0555C21.259 8.09161 21.2204 8.14266 21.1996 8.20161L20.9508 8.96646C20.875 9.19736 20.7467 9.40761 20.5761 9.58076C20.4055 9.75392 20.1971 9.88529 19.9672 9.9646L19.2018 10.2132C19.1428 10.234 19.0917 10.2725 19.0555 10.3236C19.0194 10.3746 19 10.4356 19 10.4981C19 10.5606 19.0194 10.6216 19.0555 10.6726C19.0917 10.7236 19.1428 10.7622 19.2018 10.783L19.9672 11.0316C20.2003 11.1093 20.412 11.2403 20.5855 11.4143C20.7589 11.5882 20.8893 11.8003 20.9661 12.0335L21.2149 12.7984C21.2357 12.8573 21.2743 12.9084 21.3254 12.9445C21.3764 12.9806 21.4374 13 21.5 13C21.5626 13 21.6236 12.9806 21.6746 12.9445C21.7257 12.9084 21.7643 12.8573 21.7851 12.7984L22.0339 12.0335C22.1113 11.801 22.2418 11.5897 22.4152 11.4164C22.5886 11.2432 22.8001 11.1127 23.0328 11.0354L23.7982 10.7868C23.8572 10.766 23.9083 10.7275 23.9445 10.6764C23.9806 10.6254 24 10.5644 24 10.5019C24 10.4394 23.9806 10.3784 23.9445 10.3274C23.9083 10.2764 23.8572 10.2378 23.7982 10.217L23.7829 10.2132ZM12 2.00073C12.957 2.00073 13.8827 2.13518 14.7591 2.38621C14.6432 2.4573 14.5193 2.51563 14.39 2.55903L13.05 2.99903C12.4247 3.22211 12.0018 3.80273 12 4.46903C12.002 5.10403 12.4159 5.74618 13 5.99903L14.4 6.45903C14.9164 6.63419 15.4143 7.02503 15.59 7.54903L16 8.99903C16.2128 9.62184 16.8014 10.047 17.46 10.049C17.6963 10.0519 17.9298 9.99699 18.14 9.88903C18.0212 10.0886 17.959 10.3168 17.96 10.549C17.9556 11.0886 18.322 11.5971 18.83 11.779C18.9034 11.8023 18.9865 11.8233 19.0738 11.8454C19.4335 11.9365 19.8642 12.0456 19.98 12.399L19.9943 12.4444C20.2303 13.1929 20.5003 14.0495 21.46 14.0495C21.5839 14.0495 21.6961 14.0353 21.7983 14.009C20.8685 18.5694 16.835 22.0007 12 22.0007C6.47715 22.0007 2 17.5236 2 12.0007C2 6.47788 6.47715 2.00073 12 2.00073ZM7.4693 12.2808L7.55342 12.3535C7.84703 12.5713 8.2637 12.5471 8.52996 12.2808L11.2493 9.56152L11.2496 16.2512L11.2565 16.353C11.3061 16.7191 11.6199 17.0012 11.9996 17.0012L12.1014 16.9944C12.4675 16.9447 12.7496 16.6309 12.7496 16.2512L12.7493 9.55952L15.47 12.2814L15.5541 12.3541C15.8477 12.572 16.2644 12.5479 16.5307 12.2817C16.8236 11.9888 16.8237 11.5139 16.5309 11.221L12.5309 7.21947L12.4468 7.14682C12.1532 6.92889 11.7364 6.95306 11.4701 7.21936L7.4693 11.2202L7.39669 11.3043C7.17883 11.5979 7.20304 12.0146 7.4693 12.2808Z
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
+
+
+
diff --git a/OpenKh.Tools.ModManager/Views/ModStatusView.axaml b/OpenKh.Tools.ModManager/Views/ModStatusView.axaml
new file mode 100644
index 000000000..ae79c08e5
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/ModStatusView.axaml
@@ -0,0 +1,27 @@
+
+
+
+ M18 13C18.1678 13 18.3344 13.0083 18.498 13.0244C18.7956 13.0538 19.0252 13.2867 19.0878 13.5791L19.3544 14.8223C19.4237 15.146 19.7582 15.339 20.0732 15.2373L21.2822 14.8457C21.5662 14.754 21.882 14.837 22.0566 15.0791C22.2496 15.3471 22.417 15.6353 22.5546 15.9395C22.6778 16.2119 22.591 16.5271 22.3691 16.7275L21.4257 17.5801C21.1801 17.802 21.1801 18.1883 21.4257 18.4102L22.373 19.2646C22.5948 19.4648 22.6812 19.7804 22.5585 20.0527C22.4217 20.3565 22.2555 20.6443 22.0634 20.9121C21.889 21.1551 21.5717 21.2386 21.2871 21.1465L20.0732 20.7529C19.7582 20.6512 19.4237 20.8442 19.3544 21.168L19.0859 22.4199C19.0233 22.7124 18.7937 22.9457 18.496 22.9756C18.3331 22.9919 18.1672 23 18 23C17.8341 23 17.6695 22.9915 17.5078 22.9756C17.2099 22.946 16.9786 22.7136 16.916 22.4209L16.6494 21.168C16.5801 20.8442 16.2457 20.6511 15.9306 20.7529L14.7119 21.1465C14.4274 21.2382 14.1107 21.155 13.9365 20.9121C13.745 20.6451 13.5789 20.3584 13.4423 20.0557C13.3196 19.7834 13.4062 19.4678 13.6279 19.2676L14.5781 18.4102C14.8238 18.1883 14.8238 17.802 14.5781 17.5801L13.6308 16.7246C13.4088 16.5241 13.3218 16.208 13.4453 15.9355C13.5828 15.6321 13.7505 15.3445 13.9433 15.0771C14.1179 14.8353 14.4339 14.753 14.7177 14.8447L15.9306 15.2373C16.2457 15.3392 16.5801 15.1461 16.6494 14.8223L16.914 13.5791C16.9765 13.2865 17.2072 13.0541 17.5048 13.0244C17.6674 13.0084 17.8333 13 18 13ZM18 16.5C17.1719 16.5004 16.5 17.1718 16.5 18C16.5 18.8282 17.1719 19.4996 18 19.5C18.8284 19.5 19.5 18.8284 19.5 18C19.5 17.1716 18.8284 16.5 18 16.5ZM9.00776 1.49805C9.34737 1.49806 9.68098 1.52151 10.0068 1.56543L10.33 1.61621L10.4394 1.64453C10.6888 1.72927 10.8786 1.94064 10.9326 2.2041L11.2978 3.98633L11.3173 4.06055C11.4334 4.42205 11.8259 4.62709 12.1953 4.50391L13.9228 3.92773L14.0322 3.89941C14.2913 3.8546 14.5589 3.94943 14.7324 4.1543C15.3037 4.82893 15.7593 5.60646 16.0654 6.45605C16.1691 6.74458 16.0867 7.06796 15.8574 7.27148L14.4921 8.48242C14.1819 8.75784 14.1809 9.24216 14.4912 9.51758L15.8554 10.7266C16.0851 10.9302 16.1676 11.2542 16.0634 11.543C15.7567 12.3932 15.3011 13.1705 14.7294 13.8447C14.5313 14.0783 14.2105 14.168 13.9199 14.0713L12.1953 13.4961C11.8259 13.3729 11.4334 13.5779 11.3173 13.9395L11.2978 14.0137L10.9335 15.791C10.8719 16.0918 10.6332 16.3248 10.331 16.3789C9.90421 16.4549 9.46182 16.498 9.00776 16.498C8.54901 16.498 8.10153 16.455 7.6689 16.377C7.36709 16.3225 7.12887 16.0895 7.06733 15.7891L6.70503 14.0137C6.62183 13.6069 6.20142 13.3649 5.80757 13.4961L4.09175 14.0674C3.80095 14.1642 3.48023 14.0737 3.28218 13.8398C2.7102 13.1641 2.25332 12.3856 1.94722 11.5332C1.84354 11.2444 1.92649 10.9212 2.1562 10.7178L3.51167 9.51758C3.8217 9.24218 3.8217 8.75782 3.51167 8.48242L2.15522 7.28027C1.92584 7.07698 1.84288 6.75435 1.94624 6.46582C2.25177 5.61404 2.70754 4.83434 3.27925 4.1582L3.35835 4.07715C3.55642 3.90439 3.83422 3.8458 4.08882 3.93066L5.80757 4.50391C6.20142 4.63511 6.62183 4.39309 6.70503 3.98633L7.06831 2.20605L7.09858 2.09668C7.18953 1.85006 7.4057 1.66578 7.66987 1.61816C8.10313 1.5401 8.55035 1.49805 9.00776 1.49805ZM8.99995 6.75C7.75731 6.75 6.74995 7.75736 6.74995 9C6.74995 10.2426 7.75731 11.25 8.99995 11.25C10.2425 11.2499 11.25 10.2426 11.25 9C11.25 7.75739 10.2425 6.75005 8.99995 6.75Z
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenKh.Tools.ModManager/Views/ModStatusView.axaml.cs b/OpenKh.Tools.ModManager/Views/ModStatusView.axaml.cs
new file mode 100644
index 000000000..7d1167294
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Views/ModStatusView.axaml.cs
@@ -0,0 +1,17 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Data.Converters;
+using Avalonia.Markup.Xaml;
+using System;
+using System.Globalization;
+
+namespace OpenKh.Tools.ModManager.Views
+{
+ public partial class ModStatusView : ContentPage
+ {
+ public ModStatusView()
+ {
+ InitializeComponent();
+ }
+ }
+}
From e51fcb5a2d25ec9f2533d4447f19c4df2978bf3d Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 10:00:46 +0200
Subject: [PATCH 003/175] [Mod Manager] - Some View fixes.
---
OpenKh.Tools.ModManager/Models/ModModel.cs | 5 +++--
OpenKh.Tools.ModManager/Views/MainView.axaml | 10 +++++-----
OpenKh.Tools.ModManager/Views/ModListView.axaml | 6 ++++--
OpenKh.Tools.ModManager/Views/ModListView.axaml.cs | 7 +------
4 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/OpenKh.Tools.ModManager/Models/ModModel.cs b/OpenKh.Tools.ModManager/Models/ModModel.cs
index 5b79bb653..32444b967 100644
--- a/OpenKh.Tools.ModManager/Models/ModModel.cs
+++ b/OpenKh.Tools.ModManager/Models/ModModel.cs
@@ -1,3 +1,4 @@
+using Avalonia.Media.Imaging;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -12,8 +13,8 @@ public class ModModel
public string? ModAuthor { get; set; }
public string? ModDescription { get; set; }
public string? ModFilesList { get; set; }
- public string? ModIconSource { get; set; }
- public string? ModYamlPath { get; set; }
+ public Bitmap? ModIcon { get; set; }
+ public string? ModPath { get; set; }
public bool? ModActive { get; set; }
public Uri? ModSource { get; set; }
diff --git a/OpenKh.Tools.ModManager/Views/MainView.axaml b/OpenKh.Tools.ModManager/Views/MainView.axaml
index 688326f71..eedc9ece4 100644
--- a/OpenKh.Tools.ModManager/Views/MainView.axaml
+++ b/OpenKh.Tools.ModManager/Views/MainView.axaml
@@ -8,7 +8,7 @@
mc:Ignorable="d" d:DesignWidth="750" d:DesignHeight="850"
Width="750" Height="850"
MinWidth="750" MinHeight="850"
- x:Class="OpenKh.Tools.ModManager.Views.MainWindow"
+ x:Class="OpenKh.Tools.ModManager.Views.MainView"
x:DataType="vm:MainViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="OpenKh.Tools.ModManager">
@@ -30,7 +30,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -81,11 +81,11 @@
-
+
-
+
diff --git a/OpenKh.Tools.ModManager/Views/ModListView.axaml b/OpenKh.Tools.ModManager/Views/ModListView.axaml
index 5c3a181d7..f555ed896 100644
--- a/OpenKh.Tools.ModManager/Views/ModListView.axaml
+++ b/OpenKh.Tools.ModManager/Views/ModListView.axaml
@@ -8,12 +8,14 @@
xmlns:view="clr-namespace:OpenKh.Tools.ModManager.Views"
x:Class="OpenKh.Tools.ModManager.Views.ModListView">
-
+
-
+
+
+
diff --git a/OpenKh.Tools.ModManager/Views/ModListView.axaml.cs b/OpenKh.Tools.ModManager/Views/ModListView.axaml.cs
index dcac9151b..104ff77a5 100644
--- a/OpenKh.Tools.ModManager/Views/ModListView.axaml.cs
+++ b/OpenKh.Tools.ModManager/Views/ModListView.axaml.cs
@@ -2,6 +2,7 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using OpenKh.Tools.ModManager.Models;
+using OpenKh.Tools.ModManager.ViewModels;
using System;
namespace OpenKh.Tools.ModManager.Views
@@ -11,12 +12,6 @@ public partial class ModListView : ContentPage
public ModListView()
{
InitializeComponent();
-
- ModList.ItemsSource = new ModModel[]
- {
- new ModModel{ ModTitle = "Kingdom Hearts II - Re:Fined", ModAuthor = "The Re:Fined Team", ModDescription = "Kingdom Hearts - Re:Fined for Kingdom Hearts II | r190826-0855-FC", ModSource = new Uri("https://codeberg.org/KH-ReFined/KH-ReFined"), ModIssues = new Uri("https://codeberg.org/KH-ReFined/KH-ReFined/issues"), ModActive = true },
- new ModModel{ ModTitle = "GOA ROM Edition", ModAuthor = "1234567890num", ModActive = false }
- };
}
}
}
From 6922737655d892a73b9a642c7c1f957c4603b1bd Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 10:01:00 +0200
Subject: [PATCH 004/175] [Mod Manager] - Configuration.
---
.../Services/Configuration.cs | 63 +++++++++++++++++++
1 file changed, 63 insertions(+)
create mode 100644 OpenKh.Tools.ModManager/Services/Configuration.cs
diff --git a/OpenKh.Tools.ModManager/Services/Configuration.cs b/OpenKh.Tools.ModManager/Services/Configuration.cs
new file mode 100644
index 000000000..73a94a6cc
--- /dev/null
+++ b/OpenKh.Tools.ModManager/Services/Configuration.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using SharpYaml;
+using SharpYaml.Model;
+using SharpYaml.Serialization;
+
+namespace OpenKh.Tools.ModManager.Services
+{
+ public enum Platform
+ {
+ PCSX2,
+ STEAM,
+ EPIC_GAMES_STORE
+ };
+
+ public enum BuildType
+ {
+ PATCH,
+ PANACEA
+ };
+
+ public enum Game
+ {
+ KINGDOM_HEARTS,
+ KINGDOM_HEARTS_II,
+ CHAIN_OF_MEMORIES,
+ BIRTH_BY_SLEEP,
+ DREAM_DROP_DISTANCE
+ };
+
+ public class Configuration
+ {
+ public static Dictionary GameExecutable = new Dictionary()
+ {
+ { Game.KINGDOM_HEARTS, "KINGDOM HEARTS FINAL MIX.exe" },
+ { Game.KINGDOM_HEARTS_II, "KINGDOM HEARTS II FINAL MIX.exe" },
+ { Game.CHAIN_OF_MEMORIES, "KINGDOM HEARTS Re_Chain of Memories.exe" },
+ { Game.BIRTH_BY_SLEEP, "KINGDOM HEARTS Birth by Sleep FINAL MIX.exe" },
+ { Game.DREAM_DROP_DISTANCE, "KINGDOM HEARTS Dream Drop Distance.exe" },
+ };
+
+ // Frontend Configuration
+ public Platform TargetPlatform { get; set; }
+ public Game TargetGame { get; set; }
+ public BuildType ModBuildType { get; set; }
+ public bool UpdateMods { get; set; }
+ public string? DataPath { get; set; }
+ public string? GamePath { get; set; }
+
+ // Panacea Configuration
+ public bool IsConsole { get; set; }
+ public bool IsDebug { get; set; }
+ public bool IsSoundDebug { get; set; }
+ public bool IsCacheActive { get; set; }
+
+ // PCSX2 Configuration
+ public string? EmuPath { get; set; }
+ public string[]? RomPath { get; set; }
+ }
+}
From 11186e4f7036edb04d572a014d1606805bb6b938 Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 10:01:18 +0200
Subject: [PATCH 005/175] [Mod Manager] - Preliminary initialization and mod
traversal
---
.../ViewModels/MainViewModel.cs | 78 +++++++++++++++++++
.../Views/MainView.axaml.cs | 33 +++++++-
2 files changed, 108 insertions(+), 3 deletions(-)
diff --git a/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs b/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
index df5c1bc9f..091edc903 100644
--- a/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
+++ b/OpenKh.Tools.ModManager/ViewModels/MainViewModel.cs
@@ -1,5 +1,17 @@
+using Avalonia;
+using Avalonia.Controls;
using CommunityToolkit.Mvvm.ComponentModel;
using OpenKh.Tools.ModManager.Models;
+using OpenKh.Tools.ModManager.Services;
+using OpenKh.Tools.ModManager.Views;
+using SharpYaml;
+using SharpYaml.Serialization;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using OpenKh.Patcher;
+using System.Linq;
+using Avalonia.Media.Imaging;
namespace OpenKh.Tools.ModManager.ViewModels;
@@ -8,6 +20,72 @@ public partial class MainViewModel : ViewModelBase
[ObservableProperty]
private ModModel? _currentMod = null;
+ [ObservableProperty]
+ private List? _installedMods = null;
+
[ObservableProperty]
private bool _configurationValid = true;
+
+ [ObservableProperty]
+ private Configuration? _currentConfig = null;
+
+ public MainViewModel()
+ {
+ // === Configuration Parsing and Verification === //
+
+ // If the config is null, parse it.
+ // TODO: If it does not exist, pop-up the setup wizard.
+
+ if (CurrentConfig == null)
+ {
+ var _fetchConfigFile = File.ReadAllText("config.yml");
+ CurrentConfig = YamlSerializer.Deserialize(_fetchConfigFile);
+ }
+
+ // Handle these if the platform is NOT set to PCSX2.
+
+ if (CurrentConfig.TargetPlatform != Platform.PCSX2)
+ {
+ // Construct the paths for the game executable and Panacea.
+ var _gameExecutablePath = Path.Combine(CurrentConfig.GamePath, Configuration.GameExecutable[CurrentConfig.TargetGame]);
+ var _panaceaPath = Path.Combine(CurrentConfig.GamePath, OperatingSystem.IsWindows() ? "DBGHELP.dll" : "version.dll");
+
+ // Verify the game executable and directory exists as configured. If the build type is PANACEA, also verify Panacea's existence.
+ var _isGameConfigValid = Directory.Exists(CurrentConfig.GamePath) && File.Exists(_gameExecutablePath);
+ var _isPanaceaConfigValid = (CurrentConfig.ModBuildType == BuildType.PANACEA && File.Exists(_panaceaPath)) || CurrentConfig.ModBuildType == BuildType.PATCH;
+
+ // If either are not valid, mark the config as faulty.
+ if (!_isGameConfigValid || !_isPanaceaConfigValid)
+ ConfigurationValid = false;
+ }
+
+ InstalledMods = new List();
+ var _fetchModsPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "mods", CurrentConfig.TargetGame.ToString().ToLower());
+
+ foreach (var _fetchDirectory in Directory.EnumerateDirectories(_fetchModsPath))
+ {
+ var _fetchPathYaml = Path.Combine(_fetchDirectory, "mod.yml");
+ var _fetchPathIcon = Path.Combine(_fetchDirectory, "icon.png");
+
+ if (!File.Exists(_fetchPathYaml))
+ continue;
+
+ using (var _fileStream = new FileStream(_fetchPathYaml, FileMode.Open))
+ {
+ var _metadata = Metadata.Read(_fileStream);
+ var _modModel = new ModModel
+ {
+ ModTitle = _metadata.Title,
+ ModAuthor = _metadata.OriginalAuthor,
+ ModDescription = _metadata.Description,
+ ModPath = _fetchDirectory,
+ ModFilesList = string.Join("\n", _metadata.Assets.Select(x => x.Name)),
+ ModIcon = new Bitmap(_fetchPathIcon),
+ ModActive = true
+ };
+
+ InstalledMods.Add(_modModel);
+ }
+ }
+ }
}
diff --git a/OpenKh.Tools.ModManager/Views/MainView.axaml.cs b/OpenKh.Tools.ModManager/Views/MainView.axaml.cs
index 6674dcc91..492dba060 100644
--- a/OpenKh.Tools.ModManager/Views/MainView.axaml.cs
+++ b/OpenKh.Tools.ModManager/Views/MainView.axaml.cs
@@ -1,13 +1,40 @@
-using System;
using Avalonia.Controls;
+using Avalonia.Interactivity;
using OpenKh.Tools.ModManager.Models;
+using OpenKh.Tools.ModManager.Services;
+using OpenKh.Tools.ModManager.ViewModels;
+using SharpYaml;
+using System;
+using System.IO;
namespace OpenKh.Tools.ModManager.Views;
-public partial class MainWindow : Window
+public partial class MainView : Window
{
- public MainWindow()
+ public MainView()
{
InitializeComponent();
+ Loaded += OnViewLoaded;
+ }
+
+ private void OnViewLoaded(object? sender, RoutedEventArgs e)
+ {
+ // Yea so Avalonian lists do not automatically highlight shit if they ain't empty so we gotta do it here.
+ // If this ever breaks that means something is wrong.
+
+ if (ModList.MainList.Items.Count > 0)
+ (DataContext as MainViewModel).CurrentMod = ModList.MainList.Items[0] as ModModel;
+ }
+
+ protected override void OnClosing(WindowClosingEventArgs e)
+ {
+ // Fetch the main ViewModel and serialize the config it has.
+ var _fetchViewModel = DataContext as MainViewModel;
+ var _fetchSerialize = YamlSerializer.Serialize(_fetchViewModel.CurrentConfig);
+
+ // Overwrite the config file.
+ File.WriteAllText("config.yml", _fetchSerialize);
+
+ base.OnClosing(e);
}
}
From 77e173686125be0a28de7d86d1d7c9dc59785a3f Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 10:01:26 +0200
Subject: [PATCH 006/175] [Mod Manager] - Libraries.
---
OpenKh.Tools.ModManager/App.axaml.cs | 9 ++++++---
OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj | 6 ++++++
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/OpenKh.Tools.ModManager/App.axaml.cs b/OpenKh.Tools.ModManager/App.axaml.cs
index d47ba7812..55d7222da 100644
--- a/OpenKh.Tools.ModManager/App.axaml.cs
+++ b/OpenKh.Tools.ModManager/App.axaml.cs
@@ -1,8 +1,11 @@
-using Avalonia;
+using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
+using OpenKh.Tools.ModManager.Services;
using OpenKh.Tools.ModManager.ViewModels;
using OpenKh.Tools.ModManager.Views;
+using SharpYaml;
+using System.IO;
namespace OpenKh.Tools.ModManager;
@@ -17,7 +20,7 @@ public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
- desktop.MainWindow = new MainWindow
+ desktop.MainWindow = new MainView
{
DataContext = new MainViewModel(),
};
@@ -25,4 +28,4 @@ public override void OnFrameworkInitializationCompleted()
base.OnFrameworkInitializationCompleted();
}
-}
\ No newline at end of file
+}
diff --git a/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj b/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj
index 175b3cb01..62f48657b 100644
--- a/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj
+++ b/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj
@@ -21,6 +21,12 @@
All
+
+
+
+
+
+
From 4e3cd05278a34f591be786dd77e397d617814d06 Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 12:48:19 +0200
Subject: [PATCH 007/175] [Mod Manager] - Optimization for BIG ASS mod lists.
---
OpenKh.Tools.ModManager/Views/ModDetailsView.axaml | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml b/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml
index 9826ef22d..15329cecc 100644
--- a/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml
+++ b/OpenKh.Tools.ModManager/Views/ModDetailsView.axaml
@@ -13,14 +13,20 @@
-
+
-
-
+
+
-
+
+
+
+
+
+
+
From c8b971b84520b3eda13a7aaea9102a57e131446d Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 12:48:54 +0200
Subject: [PATCH 008/175] [Mod Manager] - Move METADATA stuffs to SharpYaml.
---
OpenKh.Command.IdxImg/EpicGamesAssets.cs | 2 +-
OpenKh.Patcher/Metadata.cs | 94 +++++++++++-------------
OpenKh.Patcher/OpenKh.Patcher.csproj | 1 +
OpenKh.Patcher/PatcherProcessor.cs | 2 +-
OpenKh.Tests/Patcher/MetadataTests.cs | 4 +-
5 files changed, 46 insertions(+), 57 deletions(-)
diff --git a/OpenKh.Command.IdxImg/EpicGamesAssets.cs b/OpenKh.Command.IdxImg/EpicGamesAssets.cs
index 642fbb8ff..2f2ef6302 100644
--- a/OpenKh.Command.IdxImg/EpicGamesAssets.cs
+++ b/OpenKh.Command.IdxImg/EpicGamesAssets.cs
@@ -141,7 +141,7 @@ protected int OnExecute(CommandLineApplication app)
foreach (var mod_name in enabled.AsEnumerable().Reverse())
{
var mod_folder = Path.Combine(ModsFolder, mod_name);
- var metadata = File.OpenRead(Path.Combine(mod_folder, "mod.yml")).Using(Metadata.Read);
+ var metadata = Metadata.Read(Path.Combine(mod_folder, "mod.yml"));
Console.WriteLine($"Patching {mod_name}");
patcher.Patch(DataFolder, OutputFolder, metadata, mod_folder, platform: 2, packageMap: map, LaunchGame: GameId);
}
diff --git a/OpenKh.Patcher/Metadata.cs b/OpenKh.Patcher/Metadata.cs
index d084ae7dd..ac21a69d7 100644
--- a/OpenKh.Patcher/Metadata.cs
+++ b/OpenKh.Patcher/Metadata.cs
@@ -1,14 +1,18 @@
using OpenKh.Kh2;
+using SharpYaml;
+using SharpYaml.Serialization;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Runtime.CompilerServices;
+using System.Text.Json;
+using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
-using YamlDotNet.Serialization;
-using YamlDotNet.Serialization.NamingConventions;
namespace OpenKh.Patcher
{
+ [YamlSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, DefaultIgnoreCondition = YamlIgnoreCondition.WhenWritingDefault)]
public class Metadata
{
public class Dependency
@@ -19,59 +23,45 @@ public class Dependency
public string Title { get; set; }
public string OriginalAuthor { get; set; }
public string Description { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Game { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public int Specifications { get; set; }
- public List Dependencies { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public bool IsCollection { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public List CollectionGames { get; set; }
+ public string Game { get; set; }
+ public int Specifications { get; set; }
+ public List? Dependencies { get; set; }
+ public bool IsCollection { get; set; }
+ public List CollectionGames { get; set; }
public List Assets { get; set; }
- private static readonly IDeserializer deserializer =
- new DeserializerBuilder()
- .IgnoreFields()
- .IgnoreUnmatchedProperties()
- .WithNamingConvention(CamelCaseNamingConvention.Instance)
- .Build();
- private static readonly ISerializer serializer =
- new SerializerBuilder()
- .IgnoreFields()
- .WithNamingConvention(CamelCaseNamingConvention.Instance)
- .Build();
+ [YamlIgnore]
+ public bool IsValid = true;
-
- public static Metadata Read(Stream stream)
+ public static Metadata Read(string fileName)
{
+ var _fetchYamlRaw = File.ReadAllText(fileName);
+
try
{
- return deserializer.Deserialize(new StreamReader(stream)); //Simplifed way of doing this. Cuts out the "deserializer" redundancies and variable for StreamReader(stream))
+ return YamlSerializer.Deserialize(_fetchYamlRaw, new YamlSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
}
- catch (YamlDotNet.Core.YamlException ex)
+ catch (SharpYaml.YamlException ex)
{
// Handle YAML parsing errors
Debug.WriteLine($"Error deserializing YAML: {ex.Message}");
- string originalTitle = string.Empty;
+ var _fetchTitle = string.Empty;
+ var _fetchMatch = Regex.Match(_fetchYamlRaw, @"(?<=title:).*");
- // Extract title using regex
- stream.Position = 0; // Reset stream position
- using (var reader = new StreamReader(stream))
- {
- string yamlContent = reader.ReadToEnd();
- var match = Regex.Match(yamlContent, @"(?<=title:).*");
- if (match.Success)
- {
- originalTitle = match.Value.Trim();
- }
- }
+ if (_fetchMatch.Success)
+ _fetchTitle = _fetchMatch.Value.Trim();
var metadata = new Metadata
{
- Title = $"{originalTitle}* \nMOD YML ERROR DETECTED: CHECK FORMATTING"
+ Title = _fetchTitle,
+ IsValid = false
};
return metadata; // Return modified metadata indicating failure
}
+
catch (Exception ex)
{
// Handle other unexpected errors
@@ -83,17 +73,15 @@ public static Metadata Read(Stream stream)
public void Write(Stream stream)
{
using (var writer = new StreamWriter(stream))
- {
- serializer.Serialize(writer, this);
- }
+ YamlSerializer.Serialize(writer, this);
}
public override string ToString() =>
- serializer.Serialize(this);
+ YamlSerializer.Serialize(this);
}
public class AssetFile
{
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Name { get; set; }
+ public string Name { get; set; }
///
/// "areadatascript"
@@ -108,7 +96,7 @@ public class AssetFile
/// "spawnpoint"
/// "synthpatch"
///
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Method { get; set; }
+ public string Method { get; set; }
///
/// null
@@ -117,7 +105,7 @@ public class AssetFile
/// "pc"
/// "ps2"
///
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Platform { get; set; }
+ public string Platform { get; set; }
///
/// (null)
@@ -143,11 +131,11 @@ public class AssetFile
/// Recom
/// Theater
///
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Package { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public List Multi { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public List Source { get; set; }
+ public string Package { get; set; }
+ public List Multi { get; set; }
+ public List Source { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public bool Required { get; set; }
+ public bool Required { get; set; }
///
/// "areadatascript"
@@ -184,13 +172,13 @@ public class AssetFile
/// "trsr"
/// "vtbl"
///
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Type { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public Bar.MotionsetType MotionsetType { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Language { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public bool IsSwizzled { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public int Index { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public string Game { get; set; }
- [YamlMember(DefaultValuesHandling = DefaultValuesHandling.OmitDefaults)] public bool CollectionOptional { get; set; }
+ public string Type { get; set; }
+ public Bar.MotionsetType MotionsetType { get; set; }
+ public string Language { get; set; }
+ public bool IsSwizzled { get; set; }
+ public int Index { get; set; }
+ public string Game { get; set; }
+ public bool CollectionOptional { get; set; }
}
public class Multi
diff --git a/OpenKh.Patcher/OpenKh.Patcher.csproj b/OpenKh.Patcher/OpenKh.Patcher.csproj
index 0c265a56b..483687d2c 100644
--- a/OpenKh.Patcher/OpenKh.Patcher.csproj
+++ b/OpenKh.Patcher/OpenKh.Patcher.csproj
@@ -5,6 +5,7 @@
25.02.10.025.02.10.025.02.10.0-local25.02.10.0-localOpenKH contributorsOpenKHCopyright (C) OpenKH https://github.com/OpenKH/OpenKh
+
diff --git a/OpenKh.Patcher/PatcherProcessor.cs b/OpenKh.Patcher/PatcherProcessor.cs
index 60b80305b..1b817b0ac 100644
--- a/OpenKh.Patcher/PatcherProcessor.cs
+++ b/OpenKh.Patcher/PatcherProcessor.cs
@@ -66,7 +66,7 @@ public void CopyOriginalFile(string fileName, string dstFile)
public void Patch(string originalAssets, string outputDir, string modFilePath)
{
- var metadata = File.OpenRead(modFilePath).Using(Metadata.Read);
+ var metadata = Metadata.Read(modFilePath);
var modBasePath = Path.GetDirectoryName(modFilePath);
Patch(originalAssets, outputDir, metadata, modBasePath);
}
diff --git a/OpenKh.Tests/Patcher/MetadataTests.cs b/OpenKh.Tests/Patcher/MetadataTests.cs
index 0094a09ac..16cfe42fa 100644
--- a/OpenKh.Tests/Patcher/MetadataTests.cs
+++ b/OpenKh.Tests/Patcher/MetadataTests.cs
@@ -10,7 +10,7 @@ public class MetadataTests
[Fact]
public void ReadModMetadataTest()
{
- var metadata = File.OpenRead("Patcher/res/sample-simple-mod.yml").Using(Metadata.Read);
+ var metadata = Metadata.Read("Patcher/res/sample-simple-mod.yml");
Assert.Equal("My awesome untitled mod", metadata.Title);
Assert.Equal(1, metadata.Specifications);
@@ -26,7 +26,7 @@ public void ReadModMetadataTest()
[Fact]
public void ReadModMetadataTestCollectionOptional()
{
- var metadata = File.OpenRead("Patcher/res/sample-simple-collection-mod.yml").Using(Metadata.Read);
+ var metadata = Metadata.Read("Patcher/res/sample-simple-collection-mod.yml");
Assert.Equal("My awesome untitled mod - part 2", metadata.Title);
Assert.Equal(1, metadata.Specifications);
From e00e37afe78c89acf25ed60001329be6ea24dc27 Mon Sep 17 00:00:00 2001
From: TopazTK <250328010.b@uni-prizren.com>
Date: Sat, 29 Aug 2026 12:49:34 +0200
Subject: [PATCH 009/175] [Mod Manager] - Ordering the M O D S
---
.../OpenKh.Tools.ModManager.csproj | 2 +
OpenKh.Tools.ModManager/Views/MainView.axaml | 8 +--
.../Views/MainView.axaml.cs | 53 +++++++++++++++++--
3 files changed, 56 insertions(+), 7 deletions(-)
diff --git a/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj b/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj
index 62f48657b..92ccdc773 100644
--- a/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj
+++ b/OpenKh.Tools.ModManager/OpenKh.Tools.ModManager.csproj
@@ -13,6 +13,7 @@
+
@@ -23,6 +24,7 @@
+
diff --git a/OpenKh.Tools.ModManager/Views/MainView.axaml b/OpenKh.Tools.ModManager/Views/MainView.axaml
index eedc9ece4..5ad5e05ae 100644
--- a/OpenKh.Tools.ModManager/Views/MainView.axaml
+++ b/OpenKh.Tools.ModManager/Views/MainView.axaml
@@ -30,7 +30,7 @@
-
+
@@ -68,13 +68,13 @@
-