Commit ad410634 authored by shrabbit's avatar shrabbit
Browse files

Add configuration management and default settings

parent 4e34284d
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
using System.Collections.Generic;

namespace WatermarkClock
{
    public class AppConfig
    {
        public MarkPosition MarkPosition { get; set; } = MarkPosition.TopRight;
        public int Padding { get; set; } = 16;
        public double FontSize { get; set; } = 28;
        public string FontFamily { get; set; } = "Microsoft YaHei UI";
        public string TextColor { get; set; } = "#FFFFFF";
        public int RefreshInterval { get; set; } = 16;
        public List<TemplateConfig> Templates { get; set; } = new List<TemplateConfig>();
    }

    public class TemplateConfig
    {
        public string Text { get; set; } = "{DatetimeF}";
        public int DurationSeconds { get; set; } = 10;
    }
}
 No newline at end of file
+129 −0
Original line number Diff line number Diff line
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;

namespace WatermarkClock
{
    public static class ConfigManager
    {
        private static readonly string DefaultConfigFileName = "WatermarkClock.json";

        /// <summary>
        /// 获取默认配置文件路径(程序目录下)
        /// </summary>
        public static string GetDefaultConfigPath()
        {
            var appDir = AppDomain.CurrentDomain.BaseDirectory;
            return Path.Combine(appDir, DefaultConfigFileName);
        }

        /// <summary>
        /// 从命令行参数获取配置文件路径,若未指定则返回默认路径
        /// </summary>
        public static string GetConfigPathFromArgs()
        {
            var args = Environment.GetCommandLineArgs();
            for (int i = 0; i < args.Length - 1; i++)
            {
                if (args[i] == "--cfg" || args[i] == "-c")
                {
                    return args[i + 1];
                }
            }
            return GetDefaultConfigPath();
        }

        /// <summary>
        /// 加载配置文件,若不存在则返回默认配置并写入文件
        /// </summary>
        public static AppConfig LoadOrCreate(string path)
        {
            if (File.Exists(path))
            {
                try
                {
                    var json = File.ReadAllText(path);
                    var config = JsonConvert.DeserializeObject<AppConfig>(json);
                    if (config != null)
                        return config;
                }
                catch { }
            }

            var defaultConfig = CreateDefault();
            Save(path, defaultConfig);
            return defaultConfig;
        }

        /// <summary>
        /// 创建默认配置
        /// </summary>
        public static AppConfig CreateDefault()
        {
            return new AppConfig
            {
                MarkPosition = MarkPosition.TopRight,
                Padding = 16,
                FontSize = 28,
                FontFamily = "Microsoft YaHei UI",
                TextColor = "#FFFFFF",
                RefreshInterval = 16,
                Templates = new List<TemplateConfig>
                {
                    new TemplateConfig { Text = "{DatetimeF}", DurationSeconds = 10 }
                }
            };
        }

        /// <summary>
        /// 保存配置到文件
        /// </summary>
        public static void Save(string path, AppConfig config)
        {
            var json = JsonConvert.SerializeObject(config, Formatting.Indented);
            File.WriteAllText(path, json);
        }

        /// <summary>
        /// 从 AppConfig 转换为 Context
        /// </summary>
        public static void ApplyToContext(AppConfig config, Context ctx)
        {
            ctx.MarkPosition = config.MarkPosition;
            ctx.Padding = config.Padding;
            ctx.FontSize = config.FontSize;
            ctx.FontFamily = new System.Windows.Media.FontFamily(config.FontFamily);
            ctx.TextColor = config.TextColor;
            ctx.RefreshInterval = config.RefreshInterval;

            ctx.Templates.Clear();
            foreach (var t in config.Templates)
            {
                ctx.Templates.Add(new TemplateItem(t.Text, t.DurationSeconds));
            }
        }

        /// <summary>
        /// 从 Context 转换为 AppConfig
        /// </summary>
        public static AppConfig FromContext(Context ctx)
        {
            return new AppConfig
            {
                MarkPosition = ctx.MarkPosition,
                Padding = ctx.Padding,
                FontSize = ctx.FontSize,
                FontFamily = ctx.FontFamily.Source,
                TextColor = ctx.TextColor,
                RefreshInterval = ctx.RefreshInterval,
                Templates = ctx.Templates.Select(t => new TemplateConfig
                {
                    Text = t.Text,
                    DurationSeconds = t.DurationSeconds
                }).ToList()
            };
        }
    }
}
 No newline at end of file