Настройки собственных приложений под nanoCAD в условиях Linux

Понадобилось мне тут в собственных аддонах под наник собственные же настройки хранить (ну там - какая галочка должна быть нажата, какая опция выбрана и теде. Казалось бы - в параметрах приложения выставить название параметра, его тип и храни что душе угодно. AddonName.Properties.Settings.Default.ParameterName в зубы и вперед.

Угу, ага, губозакатывательную машинку не забудьте завернуть.

Не, под виндой все работает штатно, а вот под Astra - уже фигушки. Ну не работает там такая конструкция, хоть тресни. Пришлось делать собственный вариант хранения настроек. Поскольку наник (по крайней мере 23 и 23.1 все равно работают с реестром, даже в винде), для хранения данных использовал именно его.

Все настройки скидывать в одну ветку мне показалось ну так себе затеей, так что в первом приближении получается примерно следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using Microsoft.Win32;
using System.IO;

namespace AddonName
{
    internal static class AppSettings
    {
        private static void SetValue(string Key, string SubKey, string Value)
        {
            string path = Path.Combine(_regHive, Key);
            RegistryKey hive = Registry.CurrentUser.OpenSubKey(path, true);

            if (hive == null)
            {
                hive = Registry.CurrentUser.CreateSubKey(path, true);
            }
            hive.SetValue(SubKey, Value);
            hive.Close();
        }

        private static string GetValue(string Key, string SubKey, string DefaultValue = null)
        {
            string path = Path.Combine(_regHive, Key);
            RegistryKey hive = Registry.CurrentUser.OpenSubKey(path);
            if (hive == null)
            {
                hive = Registry.CurrentUser.CreateSubKey(path);
            }
            string res = hive.GetValue(SubKey)?.ToString() ?? string.Empty;
            hive.Close();
            return res;
        }

        private static readonly string _regHive = @"SOFTWARE\kpblc\nanoCAD";
        private static readonly string _startupDialogSubKey = "StartupDialog";
    }
}

Можно, конечно, обойтись без статического класса. Или использовать хранение в файле. Но мне и так "зашло". Теперь представим себе, что в стартовом диалоге есть пара настроек: "Проверять обновления" (CheckForUpdates) и "Показывать при старте" (ShowOnStartup). Как оно будет обрабатываться в основном приложении - фиолетово в данный момент, но хранение я сделаю ;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using Microsoft.Win32;
using System.IO;

namespace AddonName
{
    internal static class AppSettings
    {
        /// <summary> Проверять обновления при старте </summary>
        public static bool CheckForUpdates
        {
            get
            {
                string value = GetValue(_startupDialogSubKey, nameof(CheckForUpdates));
                if (bool.TryParse(value, out bool result))
                {
                    return result;
                }
                return true;
            }
            set
            {
                SetValue(_startupDialogSubKey, nameof(CheckForUpdates), value.ToString());
            }
        }

        /// <summary> Показ стартового диалога при начале работы </summary>
        public static bool ShowOnStartup
        {
            get
            {
                string value = GetValue(_startupDialogSubKey, nameof(ShowOnStartup));
                if (bool.TryParse(value, out bool result))
                {
                    return result;
                }
                return true;
            }
            set
            {
                SetValue(_startupDialogSubKey, nameof(ShowOnStartup), value.ToString());
            }
        }

        private static void SetValue(string Key, string SubKey, string Value)
        {
            string path = Path.Combine(_regHive, Key);
            RegistryKey hive = Registry.CurrentUser.OpenSubKey(path, true);

            if (hive == null)
            {
                hive = Registry.CurrentUser.CreateSubKey(path, true);
            }
            hive.SetValue(SubKey, Value);
            hive.Close();
        }

        private static string GetValue(string Key, string SubKey, string DefaultValue = null)
        {
            string path = Path.Combine(_regHive, Key);
            RegistryKey hive = Registry.CurrentUser.OpenSubKey(path);
            if (hive == null)
            {
                hive = Registry.CurrentUser.CreateSubKey(path);
            }
            string res = hive.GetValue(SubKey)?.ToString() ?? string.Empty;
            hive.Close();
            return res;
        }

        private static readonly string _regHive = @"SOFTWARE\kpblc\nanoCAD";
        private static readonly string _startupDialogSubKey = "StartupDialog";
        private static readonly string _deepPurgeSubKey = "Purge";
    }
}

Ну и использование уже мало чем будет отличаться от стандартного механизма:

1
2
3
4
5
6
7
8
9
public class SomeClass
{
    public SomeClass()
    {
        // Предварительные танцы с бубнами
        bool show = AppSettings.ShowOnStartup;
        // Дальнейшая логика
    }
}

На всякий случай напоминаю - сайт в 99.(9)% тупо шпаргалка для себя. Возможно, через сколько-то времени я буду на все это смотреть и думать: "Че ж я курил, что такое нарисовал?!" ;)

Размещено в .NET, nanoCAD · Метки: , ,



Поделитесь своим мнением


Я не робот.