Как мне структурировать классы, чтобы они соответствовали этому типу графической системы? - PullRequest
0 голосов
/ 14 мая 2019

В настоящее время я пытаюсь закодировать библиотеку графического интерфейса в love2dcs, однако мне было интересно, как бы я мог структурировать классы таким образом, чтобы я мог объявить элементы графического интерфейса следующим образом ..

public static class Editor
{
  Window MainWindow
  public static void Init()
  {
    MainWindow = new Window("Window0", "", 0, 0, 256, 240) //List of Widgets
    {
        new Window("Window1", "", 0, 0, 256, 240), //List of Widgets
        new Window("Window2", "", 0, 0, 256,  16)  //List of Widgets
        {
            //String
            new TextEdit("TextEdit1", "Hello", 0, 0,256, 16) = "HelloWorld0" 
        }
    };

    //1st way to check for window2 press
    GetWidget("Window2").Pressed += OnWindow2Pressed()
  } 

  public static void Update()
  {
    MainWindow.Update();

    //2nd way to check for window2 press
    if (MainWindow.IsPressed("Window2"))
    {
      GetWidget("TextEdit1").Value = "HelloWorld1!";
    }
  }

  public static void Render()
  {
    MainWindow.Render();
  }

  private static void OnWindow2Pressed()
  {
    Window window2 = GetWidget("Window2");
    GetWidget("Window2").Add
    (
       new TextEdit("TextEdit1", "Hello", 0, 0+(window2.Value.Count*16), 256, 16) = "HelloWorld3"
    );
  }
}

если кто-нибудь знает, как это сделать, и может опубликовать некоторый код о том, как настроить класс виджета для приема параметров типа, чтобы это работало, я был бы очень благодарен

РЕДАКТИРОВАТЬ : это большевопрос о структуре классов, а как мне сделать это вопрос

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

EDIT2 : поэтому есть попытка сделать это, но мне не нравится, что я пытаюсь неявно привести к окну из WidgetList.

    public class WidgetList : List<Widget>
    {
        public Widget Widget { get; set; }

        public WidgetList(Widget widget)
        {
            widget = Widget;
        }
        public static implicit operator Widget(WidgetList widgetList)
        {
            return widgetList.Widget;
        }
    }

    public class Widget
    {
        //Child Widgets
        public Widget Parent { get; private set; } = null;
        public WidgetList Children { get; private set; } = null;

        //Callers
        private                Widget(string name, string text, int x, int y, int w, int h)
        {
            Children = new WidgetList(this);

            Name = name;
            Text = text;
            X = x;
            Y = y;
            W = w;
            H = h;
            OnCreate();
        }
        public  static WidgetList New(string name, string text, int x, int y, int w, int h)
        {
            return new WidgetList(new Widget(name, text, x, y, w, h));
        }
    }

    public class Test
    {
        public static Window Window;
        public static void Do()
        {
            Window = Window.New("Window0", "", 0, 0, 256, 240) //List of Widgets
            {
                Window.New("Window1", "", 0, 0, 256, 240), //List of Widgets
                Window.New("Window1", "", 0, 0, 256, 240)  //List of Widgets
            };
        }
    }

1 Ответ

1 голос
/ 18 мая 2019

Я попытался улучшить то, что вы пытаетесь сделать.
Я мог бы помочь больше, если бы знал, как выглядит библиотека, я просто создал библиотеку Mock, чтобы сделать остальную часть дизайна.
Может быть, кто-то может взять на себя здесь и дать лучшее предложение.

НЕ ДЕЛАЙТЕ ЭТОГО: - public class WidgetList : List<Widget> если вы действительно не хотите улучшить что-то, что существует в c # List class

Если вы сделаете так, чтобы виджеты принимали параметр типа, у вас возникнут проблемы, связанные с несовпадением и противоречивостью, поскольку вы не сможете добавлять дочерние виджеты в список родительских виджетов.

    public interface ILibraryWidget
    {
        void OnInit();
        void Update();
        void Render();
    }

    public abstract class BaseWidget : ILibraryWidget
    {
        public void OnInit()
        {
            throw new NotImplementedException();
        }

        public void Render()
        {
            throw new NotImplementedException();
        }

        public void Update()
        {
            throw new NotImplementedException();
        }
    }

    public class Window : ILibraryWidget
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int W { get; set; }
        public int H { get; set; }

        public string Name { get; set; }
        public string Text { get; set; }

        public Window()
        {

        }
        public void OnInit()
        {
            Console.WriteLine("Im init");
        }
        public void Update()
        {
            Console.WriteLine("Im update");
        }

        public void Render()
        {
            Console.WriteLine("Im render");
        }
    }

    public class TextEdit : Window
    {
        public TextEdit()
        {

        }
        public new void OnInit()
        {
            Console.WriteLine("Im init text");
        }
        public new void Update()
        {
            Console.WriteLine("Im update text");
        }

        public new void Render()
        {
            Console.WriteLine("Im render text");
        }
    }

    public class Widget
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int W { get; set; }
        public int H { get; set; }

        public string Name { get; set; }
        public string Text { get; set; }

        private Window Package { get; set; }

        public delegate void Pressed();

        //Child Widgets
        public Widget Parent { get; private set; }
        public List<Widget> Children { get; private set; }


        //Callers
        public Widget()
        {
            Children = new List<Widget>();
        }

        public void OnInit()
        {
            (Package as Window).OnInit();
        }
        public void Update()
        {
            (Package as Window).Update();
        }

        public void Render()
        {
            (Package as Window).Render();
        }

        public static List<Widget> New(string name, string text, int x, int y, int w, int h)
        {
            return new List<Widget> {
                new Widget { Name = name, Text = text, X = x, Y = y, W = w, H = h }
            };
        }

        public static void Main(string[] args)
        {
            Widget testWidget = new Widget
            {
                Name = "Window0",
                Text = "",
                X = 0,
                Y = 0,
                W = 256,
                H = 240,

                //List of Widgets
                Children = new List<Widget>
                {
                    new Widget{ Name = "Window0_0", Text = "", X = 0, Y = 0, W = 256, H = 240, },
                    new Widget{ Name = "Window0_1", Text = "", X = 0, Y = 0, W = 256, H = 240, }
                }

            };

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...