ui/wpf/UIcore/Application.cs

Mon, 23 Sep 2024 23:22:27 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 23 Sep 2024 23:22:27 +0200
branch
newapi
changeset 309
02c95df91de1
parent 135
b9dc9cdfa23a
permissions
-rw-r--r--

add headerbar toggle button (GTK)

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