diff --git a/Source/LibationAvalonia/LibationAvalonia.csproj b/Source/LibationAvalonia/LibationAvalonia.csproj
index 6d726f3b..a8be561c 100644
--- a/Source/LibationAvalonia/LibationAvalonia.csproj
+++ b/Source/LibationAvalonia/LibationAvalonia.csproj
@@ -101,8 +101,6 @@
-
-
diff --git a/Source/LibationUiBase/LibationUiBase.csproj b/Source/LibationUiBase/LibationUiBase.csproj
index 5cbb0af1..6290198a 100644
--- a/Source/LibationUiBase/LibationUiBase.csproj
+++ b/Source/LibationUiBase/LibationUiBase.csproj
@@ -8,6 +8,10 @@
false
+
+
+
+
diff --git a/Source/LibationWinForms/FormSaveExtension.cs b/Source/LibationWinForms/FormSaveExtension.cs
index 3ab11630..227ee451 100644
--- a/Source/LibationWinForms/FormSaveExtension.cs
+++ b/Source/LibationWinForms/FormSaveExtension.cs
@@ -1,6 +1,7 @@
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
+using Dinah.Core.WindowsDesktop;
using LibationFileManager;
namespace LibationWinForms
diff --git a/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj b/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj
index b114d7cd..a28cc197 100644
--- a/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj
+++ b/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj
@@ -25,7 +25,7 @@
-
+
diff --git a/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj b/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj
index 9d80ef2e..1d61b115 100644
--- a/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj
+++ b/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj
@@ -25,7 +25,7 @@
-
+
diff --git a/Source/LoadByOS/WindowsConfigApp/FolderIcon.cs b/Source/LoadByOS/WindowsConfigApp/FolderIcon.cs
new file mode 100644
index 00000000..e588bd2c
--- /dev/null
+++ b/Source/LoadByOS/WindowsConfigApp/FolderIcon.cs
@@ -0,0 +1,106 @@
+using SixLabors.ImageSharp;
+using SixLabors.ImageSharp.Formats.Png;
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+
+namespace WindowsConfigApp
+{
+ internal static partial class FolderIcon
+ {
+ // https://stackoverflow.com/a/21389253
+ public static byte[] ToIcon(this Image img)
+ {
+ using var ms = new MemoryStream();
+ using var bw = new BinaryWriter(ms);
+ // Header
+ bw.Write((short)0); // 0-1 : reserved
+ bw.Write((short)1); // 2-3 : 1=ico, 2=cur
+ bw.Write((short)1); // 4-5 : number of images
+ // Image directory
+ var w = img.Width;
+ if (w >= 256) w = 0;
+ bw.Write((byte)w); // 0 : width of image
+ var h = img.Height;
+ if (h >= 256) h = 0;
+ bw.Write((byte)h); // 1 : height of image
+ bw.Write((byte)0); // 2 : number of colors in palette
+ bw.Write((byte)0); // 3 : reserved
+ bw.Write((short)0); // 4 : number of color planes
+ bw.Write((short)0); // 6 : bits per pixel
+ var sizeHere = ms.Position;
+ bw.Write((int)0); // 8 : image size
+ var start = (int)ms.Position + 4;
+ bw.Write(start); // 12: offset of image data
+ // Image data
+ img.Save(ms, new PngEncoder());
+ var imageSize = (int)ms.Position - start;
+ ms.Seek(sizeHere, SeekOrigin.Begin);
+ bw.Write(imageSize);
+ ms.Seek(0, SeekOrigin.Begin);
+
+ // And load it
+ return ms.ToArray();
+ }
+
+ public static void DeleteIcon(this DirectoryInfo directoryInfo) => DeleteIcon(directoryInfo.FullName);
+ public static void DeleteIcon(string dir)
+ {
+ string[] array = new string[3] { "desktop.ini", "Icon.ico", ".hidden" };
+ foreach (string path in array)
+ {
+ string text = Path.Combine(dir, path);
+ if (File.Exists(text))
+ {
+ File.SetAttributes(text, File.GetAttributes(text) | FileAttributes.Normal);
+ new FileInfo(text).IsReadOnly = false;
+ File.Delete(text);
+ }
+ }
+
+ refresh();
+ }
+
+ // https://github.com/dimuththarindu/FIC-Folder-Icon-Changer/blob/master/project/FIC/Classes/IconCustomizer.cs
+
+ public static void SetIcon(this DirectoryInfo directoryInfo, string icoPath, string folderType)
+ => SetIcon(directoryInfo.FullName, icoPath, folderType);
+
+ public static void SetIcon(string dir, string icoPath, string folderType)
+ {
+ var desktop_ini = Path.Combine(dir, "desktop.ini");
+ var Icon_ico = Path.Combine(dir, "Icon.ico");
+ var hidden = Path.Combine(dir, ".hidden");
+
+ //deleting existing files
+ DeleteIcon(dir);
+
+ //copying Icon file //overwriting
+ File.Copy(icoPath, Icon_ico, true);
+
+ //writing configuration file
+ string[] desktopLines = { "[.ShellClassInfo]", "IconResource=Icon.ico,0", "[ViewState]", "Mode=", "Vid=", $"FolderType={folderType}" };
+ File.WriteAllLines(desktop_ini, desktopLines);
+
+ //configure file 2
+ string[] hiddenLines = { "desktop.ini", "Icon.ico" };
+ File.WriteAllLines(hidden, hiddenLines);
+
+ //making system files
+ File.SetAttributes(desktop_ini, File.GetAttributes(desktop_ini) | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly);
+ File.SetAttributes(Icon_ico, File.GetAttributes(Icon_ico) | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly);
+ File.SetAttributes(hidden, File.GetAttributes(hidden) | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly);
+
+ // this strangely completes the process. also hides these 3 hidden system files, even if "show hidden items" is checked
+ File.SetAttributes(dir, File.GetAttributes(dir) | FileAttributes.ReadOnly);
+
+ refresh();
+ }
+
+ private static void refresh() => SHChangeNotify(0x08000000, 0x0000, IntPtr.Zero, IntPtr.Zero); //SHCNE_ASSOCCHANGED SHCNF_IDLIST
+
+
+ [DllImport("shell32.dll", SetLastError = true)]
+ private static extern void SHChangeNotify(int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2);
+ }
+}
diff --git a/Source/LoadByOS/WindowsConfigApp/WinInterop.cs b/Source/LoadByOS/WindowsConfigApp/WinInterop.cs
index 42cded34..76972c06 100644
--- a/Source/LoadByOS/WindowsConfigApp/WinInterop.cs
+++ b/Source/LoadByOS/WindowsConfigApp/WinInterop.cs
@@ -1,12 +1,8 @@
-using System;
-using System.Collections.Generic;
+using SixLabors.ImageSharp;
using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using Dinah.Core.WindowsDesktop;
-using Dinah.Core.WindowsDesktop.Drawing;
using LibationFileManager;
+using System.IO;
+using System;
namespace WindowsConfigApp
{
@@ -21,11 +17,11 @@ namespace WindowsConfigApp
try
{
- var icon = ImageReader.ToIcon(image);
+ var icon = Image.Load(File.ReadAllBytes(image)).ToIcon();
iconPath = Path.Combine(directory, $"{Guid.NewGuid()}.ico");
- icon.Save(iconPath);
+ File.WriteAllBytes(iconPath, icon);
- new DirectoryInfo(directory).SetIcon(iconPath, Directories.FolderTypes.Music);
+ new DirectoryInfo(directory)?.SetIcon(iconPath, "Music");
}
finally
{
@@ -36,6 +32,7 @@ namespace WindowsConfigApp
public void DeleteFolderIcon(string directory)
=> new DirectoryInfo(directory)?.DeleteIcon();
+
public bool CanUpdate => true;
public void InstallUpdate(string updateBundle)
{
diff --git a/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj b/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj
index d547a2d4..a34a143b 100644
--- a/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj
+++ b/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj
@@ -2,10 +2,8 @@
WinExe
- net7.0-windows
+ net7.0
true
- true
- enable
true
false
false
@@ -16,7 +14,7 @@
- ..\..\bin\Debug
+ ..\..\bin\Avalonia\Debug
embedded
@@ -26,11 +24,7 @@
-
-
-
-
-
+