internal static bool SwitchThemeReplacement(object osObject, string customThemePath) { var os = (OS)osObject; lock (cacheLock) { if (CachedThemes.TryGetCached(customThemePath, out var cached)) { if (!cached.Loaded) { cached.Load(true); } cached.ApplyTo(os); TargetTheme = null; } else if (!Settings.IsInExtensionMode) { var theme = new CachedCustomTheme(customThemePath); theme.Load(true); theme.ApplyTo(os); CachedThemes.Register(customThemePath, theme); } else if (!ThemeTasks.Contains(customThemePath)) { TargetTheme = customThemePath; var path = customThemePath; var task = new Task(() => { var result = new CachedCustomTheme(path); result.Load(false); lock (cacheLock) { CachedThemes.Register(path, result); ThemeTasks.Remove(path); } }); ThemeTasks.Add(path); task.Start(); } else { TargetTheme = customThemePath; } } return(false); }
internal static void QueueUpCustomThemes(OS __instance) { TargetTheme = null; ThemeTasks = new List <string>(); if (!Settings.IsInExtensionMode) { CachedThemes = new FixedSizeCacheDict <string, CachedCustomTheme>(3); return; } CachedThemes = new FixedSizeCacheDict <string, CachedCustomTheme>(PathfinderOptions.PreloadAllThemes.Value ? 0 : 16); if (PathfinderOptions.PreloadAllThemes.Value) { var themesDir = Path.Combine(ExtensionLoader.ActiveExtensionInfo.FolderPath, "Themes"); if (!Directory.Exists(themesDir)) { return; } lock (cacheLock) { foreach (var theme in Directory.GetFiles(themesDir, "*.xml", SearchOption.AllDirectories)) { var path = theme.Substring(ExtensionLoader.ActiveExtensionInfo.FolderPath.Length + 1).Replace('\\', '/'); var task = new Task(() => { var result = new CachedCustomTheme(path); result.Load(false); lock (cacheLock) { CachedThemes.Register(path, result); ThemeTasks.Remove(path); } }); ThemeTasks.Add(path); task.Start(); } } } }
internal static void LoadStartingCustomThemeWithReplacement(ILContext il) { ILCursor c = new ILCursor(il); c.GotoNext(x => x.MatchCall(AccessTools.Method(typeof(CustomTheme), nameof(CustomTheme.Deserialize)))); c.Remove(); c.EmitDelegate <Func <string, CustomTheme> >(theme => { lock (cacheLock) { if (!CachedThemes.TryGetCached(theme, out _)) { var cacheTheme = new CachedCustomTheme(theme); CachedThemes.Register(theme, cacheTheme); } } return(null); }); }