ui/wpf/UIcore/Application.cs

Sun, 21 Jan 2024 16:30:18 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 21 Jan 2024 16:30:18 +0100
changeset 0
2483f517c562
permissions
-rw-r--r--

add existing toolkit code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace UI
{  
    public class Application
    {
        private static Application instance;

        private System.Windows.Application application;

        private Thread thread;

        public String Name;

        public IApplicationCallbacks callbacks;

        public List<Window> Windows = new List<Window>();
        public ApplicationMenu Menu = new ApplicationMenu();
        public MainToolBar ToolBar = new MainToolBar();
        
        private Application() : base()
        {
            thread = new Thread(() => RunApplication());
            thread.SetApartmentState(ApartmentState.STA);
        }

        public static Application GetInstance()
        {
            if (instance == null)
            {
                instance = new Application();
                GC.KeepAlive(instance);
            }
            return instance;
        }

        public Thread Start()
        {
            thread.Start();
            return thread;
        }

        private void RunApplication()
        {
            application = new System.Windows.Application();

            if(callbacks != null)
            {
                callbacks.OnStartup();
            }
            application.Run();
            if(callbacks != null)
            {
                callbacks.OnExit();
            }
        }

        public void AddWindow(Window window)
        {
            Windows.Add(window);
        }

        public void RemoveWindow(Window window)
        {
            Windows.Remove(window);
            if (Windows.Count == 0)
            {
                application.Shutdown();
            }
        }
    }

    public class ResultExec<T>
    {
        public T Result;
        public Func<T> Func;

        public void Exec()
        {
            Result = Func.Invoke();
        }
    }

    public class VoidExec
    {
        public Action Action;

        public void Exec()
        {
            Action.Invoke();
        }
    }

    public interface IApplicationCallbacks
    {
        void OnStartup();
        void OnOpen();
        void OnExit();
    }
}

mercurial