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 @@ - - - - - +