контроллер цветовой темы

Программирование на Юнити.

контроллер цветовой темы

Сообщение vedmed2005 09 фев 2019, 20:32

Тема основана на предыдущей теме http://www.cyberforum.ru/unity/thread2387514.html, но уже вопрос в другом.
Спустя чуть больше полумесяца упорного(упоротого) изучения основ C# и прочей литературы, вспомнил про контроллер цветовой схемы - ссылка выше. Посмотрел и тоже как и предыдущие товарищи, принимавшие участие в критике , пришел к выводу что сделано через ж. На работе решил переписать исходя из новых знаний. Но на работе Unity не поставить , кое как получилось VS Community. Часа за 2 написал контроллер для WindowsForm и удивился полученному результату - получилось грамотно(может не очень грамотно с точки зрения профессионального программиста, но я порадовался ). Дома решил переписать имеющийся на Юнити и чето впал в ступор(или устал). То что хочу - написано после кода для WinForms

Собственно код для WinForms:
Синтаксис:
Используется csharp
using System.Windows.Forms;
 
namespace Theme
{
    public partial class MyButton : UserControl
    {
        public MyButton()
        {
            InitializeComponent();
 
            ///берем тип контрола из темы (UIThem)
            var type = UITheme.button;
            /// регистрируемся в контроллере и получаем свою тему
            UIThemeController.Registration(this, type);
        }
    }
 


класс темы:
Синтаксис:
Используется csharp
using System.Drawing;
using System.Windows.Forms;
 
namespace Theme
{
    /// <summary>
    /// для связки при добавлении в словарь по обобщенному интерфесу + применение темы
    /// </summary>
    interface ITheme
    {
        void ApplyTheme(Control control);
    }
    class UITheme
    {
        /// <summary>
        /// текущая тема, задается из UIThemeController
        /// </summary>
        public static UIThemeColor currUIThemeColor;
        public enum UIThemeColor
        {
            Black,
            White
        }
        /// <summary>
        /// для использования контролами при регистрации себя в качестве выбора типа класса темы контрола
        /// </summary>
        public static ButtonTheme button = new ButtonTheme();
        public static TextBoxTheme textbox = new TextBoxTheme();
 
        public class ButtonTheme : ITheme
        {
                Color[] backcolor = new Color[]
                {
                   Color.Black,
                   Color.White
                };
            public void ApplyTheme(Control control)
            {
                ///цвет соответсвенно теме
                control.BackColor = backcolor[(int)UITheme.currUIThemeColor];
            }
        }
        public class TextBoxTheme : ITheme
        {
            Color[] foreColor = new Color[]
            {
                   Color.Black,
                   Color.White
            };
            public void ApplyTheme(Control control)
            {
                control.ForeColor = foreColor[(int)UITheme.currUIThemeColor];
            }
        }
        /// дальше остальные классы тем контролов с реализацией : ITheme
    }
}
 


сам контроллер:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
 
namespace Theme
{
    class UIThemeController
    {
        public UIThemeController()
        {
            UITheme.currUIThemeColor = UITheme.UIThemeColor.Black;
        }
        static Dictionary<ITheme, IList> ControlsDictionary = new Dictionary<ITheme, IList>();
       
        /// <param name="control"></param> -- control itself,собственно сам конрол
        /// <param name="typeObject"></param> -- object to recognize class ,  объект только для того, что бы передать класс темы контрола
        public static void  Registration (Control control,ITheme typeObject)
        {
            /// если в словаре зарегистрирован тип класса темы контрола
            if (ControlsDictionary.ContainsKey(typeObject))
            {
                ///и если его нет в списке по ключу класса темы то добавляем
                if (!ControlsDictionary[typeObject].Contains(control))
                    ControlsDictionary[typeObject].Add(control);
            }
            else
            {
                /// если тип класса темы не зарегитрирован - создаем список, добавляем контрол, добавляем в словарь
                List<Control> myList = new List<Control> { control };
                ControlsDictionary.Add(typeObject, myList);
            }
            /// ну и применяем тему
            typeObject.ApplyTheme(control);            
        }
    }
}
 


А теперь то что хочу сделать:

1. Скрипт ,что б вешать на УИ элемент, с возможностью выбора типа элемента в инспекторе , то есть
что типа
Синтаксис:
Используется csharp
/// это брать из класса тем
public enum UIElementType
    {
        None = 0,
        FonBackColor = 1,
        MainImage = 2,
        LineImage=3,
        HalfLineImage=4,
        BtnMain=5,
        NormText=6,
        HalfText=7,
        SliderBackGround =8,
        BtnGoToBack=9,
        BtnCalendar=10,
        CanvasMain=11,
        ImgAdd=12,
        ImgDelete = 13,
        ImgComment = 14,
       
    }
/// позволяет выбрать тип в инспекторе
public UIElementType type;
//туто код регистрации в контроллере
UIThemeController.Registration(this, что - то ....);
 


2.Это хотение второго плана - Хочу получить критику на приведенный код смены темы в WinForms, только в плане реализации контроллера (в смысле , что WinForm не интересует как среда применения, только организация независимости)
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: контроллер цветовой темы

Сообщение Cr0c 11 фев 2019, 19:59

https://drive.google.com/file/d/1EGveNv ... p=drivesdk
У меня вот такая штука получилась
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4