using System.Reflection; using ImGuiNET; namespace Shoko; static class MainUI { static string txtURL = ""; public static List tabs = new List(); public static ImFontPtr Font; public static List HeadingFonts = new List(); public static ImFontPtr MonospaceFont; public static void NewTab(string url) { tabs.Add(new Tab(url)); } public static unsafe void AddFontFromResource(string resource, Action f) { var io = ImGui.GetIO(); using(var m = new MemoryStream()) { Assembly.GetExecutingAssembly().GetManifestResourceStream(resource).CopyTo(m); var fontBuffer = m.ToArray(); fixed(byte* buffer = fontBuffer) { f(new IntPtr(buffer), fontBuffer.Length); } } } public static unsafe bool Load() { var io = ImGui.GetIO(); ImGui.StyleColorsDark(); io.ConfigFlags |= ImGuiConfigFlags.DockingEnable; AddFontFromResource("RobotoFlex.ttf", (buf, len)=>{ Font = io.Fonts.AddFontFromMemoryTTF(buf, len, 16f); HeadingFonts.Add(io.Fonts.AddFontFromMemoryTTF(buf, len, 32f)); HeadingFonts.Add(io.Fonts.AddFontFromMemoryTTF(buf, len, 24f)); HeadingFonts.Add(io.Fonts.AddFontFromMemoryTTF(buf, len, 20f)); }); AddFontFromResource("RobotoMono.ttf", (buf, len)=>{ MonospaceFont = io.Fonts.AddFontFromMemoryTTF(buf, len, 16f); }); return true; } public static bool Render() { bool quit = true; ImGui.PushFont(Font); ImGui.DockSpaceOverViewport(); Gui.MainMenuBar(()=> { Gui.Menu("File", ()=> { Gui.MenuItem("Quit", null, ()=> quit = false); }); Gui.Menu("Help", ()=> { Gui.MenuItem("About", null, ()=> NewTab("about:")); }); ImGui.InputText("##url", ref txtURL, 1024); Gui.Button("Go", ()=>{ NewTab(txtURL); txtURL = ""; }); }); tabs = tabs.Where(x=>x.IsOpen).ToList(); foreach (var tab in tabs) { tab.Render(); } ImGui.PopFont(); return quit; } }