/*
* Originally adapted from withoutaface/MonoGameImGuiNETexamples which is a port of the C++ Dear IMGUI sample code for the C++ version of Dear ImGui
*/
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System.Collections.Generic;
using System;
using MonoGame.ImGuiNet;
using ImGuiNET;
using Vec2 = System.Numerics.Vector2;
using Vec3 = System.Numerics.Vector3;
using Vec4 = System.Numerics.Vector4;
namespace Monogame.ImGuiNetSamples
{
///
/// This is the main type for your game.
///
public class Game1 : Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
ImGuiRenderer GuiRenderer;
bool WasResized = false;
private Model suzanne;
private Matrix world = Matrix.CreateScale(1.5f, 1.5f, 1.5f) * Matrix.CreateRotationX(-1.5f);
private Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 10), new Vector3(0, 0, 0), Vector3.UnitY);
private Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), 800f / 480f, 0.1f, 100.0f);
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
graphics.PreferredBackBufferWidth = 1024;
graphics.PreferredBackBufferHeight = 768;
Window.AllowUserResizing = true; // true;
Window.ClientSizeChanged += delegate { WasResized = true; };
}
///
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
///
protected override void Initialize()
{
// TODO: Add your initialization logic here
this.Window.Title = "MonoGame & ImGui.NET";
GuiRenderer = new ImGuiRenderer(this);
GuiRenderer.RebuildFontAtlas();
base.Initialize();
}
///
/// LoadContent will be called once per game and is the place to load
/// all of your content.
///
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
suzanne = Content.Load("suzanne");
}
///
/// UnloadContent will be called once per game and is the place to unload
/// game-specific content.
///
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
///
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
///
/// Provides a snapshot of timing values.
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
Exit();
//update logic
if (WasResized)
{
string new_resolution = resolution[select_res];
int res_width = int.Parse(new_resolution.Split('x')[0]);
int res_height = int.Parse(new_resolution.Split('x')[1]);
graphics.PreferredBackBufferWidth = Window.ClientBounds.Width; //1920;
graphics.PreferredBackBufferHeight = Window.ClientBounds.Height; //1080;
graphics.ApplyChanges();
WasResized = false;
current_res = select_res;
debug_log.Add("(" + DateTime.Now.ToShortTimeString() + ") [MonoGame] Changed Resolution to " + resolution[current_res]);
}
base.Update(gameTime);
}
private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection)
{
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.TextureEnabled = false;
effect.EnableDefaultLighting();
effect.World = world;
effect.View = view;
effect.Projection = projection;
}
mesh.Draw();
}
}
///
/// This is called when the game should draw itself.
///
/// Provides a snapshot of timing values.
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
//Framerate
float frameRate = 1 / (float)gameTime.ElapsedGameTime.TotalSeconds;
//Depth Buffer
DepthStencilState dss = new DepthStencilState();
dss.DepthBufferEnable = true;
GraphicsDevice.DepthStencilState = dss;
GraphicsDevice.BlendState = BlendState.Opaque;
//Draw 3D model
if (render_model == 1)
{
DrawModel(suzanne, world, view, projection);
}
base.Draw(gameTime);
//ImGui Begin
GuiRenderer.BeginLayout(gameTime);
#region ImGui
//Native Demos
if (show_native_examples)
{
DrawImGuiNativeDemos();
}
//Style Editor
if (show_app_style_editor)
{
ImGui.Begin("Dear ImGui Style Editor");
ImGui.ShowStyleEditor();
ImGui.End();
}
//Metrics window
if (show_app_metrics)
{
ImGui.ShowMetricsWindow();
}
//About window
if (show_app_about)
{
ImGui.ShowAboutWindow();
}
//Overlay
if (show_app_simple_overlay)
{
DrawImGuiOverlay(frameRate);
}
//Menu bar
if (show_app_main_menu_bar)
{
DrawImGuiMenuBar();
}
//Console
if (show_app_console)
{
DrawImGuiExampleAppConsole();
}
//Log
if (show_app_log)
{
DrawImGuiDebugLog();
}
//MonoGame
if (show_monogame_settings)
{
DrawMonoGameWindow();
}
//Main Demo window
if (show_main_window)
{
DrawDemoWindow();
}
#endregion
//ImGui End
GuiRenderer.EndLayout();
}
#region Demos
private void DrawImGuiNativeDemos()
{
ImGui.ShowDemoWindow();
}
#endregion
#region Overlay
//OverlayVariables
float distanceX = 10.0f;
float distanceY = 10.0f;
int corner = 0;
private void DrawImGuiOverlay(float frameRate)
{
ImGuiIOPtr io = ImGui.GetIO();
ImGuiWindowFlags windowFlags = ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoMove;
if (corner >= 0 && corner < 4)
{
//offset X
if (corner == 1 || corner == 3)
{
distanceX = (float)graphics.PreferredBackBufferWidth - 250.0f;
}
else
{
distanceX = 10.0f;
}
//offset Y
if (corner == 2 || corner == 3)
{
distanceY = (float)graphics.PreferredBackBufferHeight - 100.0f;
}
else
{
distanceY = 10.0f;
}
//offset menubar
if ((corner == 0 || corner == 1) && show_app_main_menu_bar)
{
distanceY += 20.0f;
}
Vec2 windowPosition = new Vec2(distanceX, distanceY);
ImGui.SetNextWindowPos(windowPosition);
}
ImGui.SetNextWindowBgAlpha(0.35f);
if (ImGui.Begin("Example: Simple overlay", windowFlags))
{
ImGui.Text("Simple overlay\nin the corner of the screen\n(right-click to change position)");
ImGui.Separator();
if (ImGui.IsMousePosValid())
{
ImGui.Text(string.Format("Mouse Position: ({0},{1})", io.MousePos.X, io.MousePos.Y));
}
else
{
ImGui.Text("Mouse Position: ");
}
ImGui.Text(string.Format("Frames per second: {0}", frameRate.ToString()));
if (ImGui.BeginPopupContextWindow())
{
//if (ImGui.MenuItem("Custom", null, corner == -1)) { corner = -1; }
if (ImGui.MenuItem("Top-left", null, corner == 0)) { corner = 0; }
if (ImGui.MenuItem("Top-right", null, corner == 1)) { corner = 1; }
if (ImGui.MenuItem("Bottom-left", null, corner == 2)) { corner = 2; }
if (ImGui.MenuItem("Bottom-right", null, corner == 3)) { corner = 3; }
ImGui.EndPopup();
}
}
ImGui.End();
}
#endregion
#region MenuBar
private void DrawImGuiMenuBar()
{
if (ImGui.BeginMainMenuBar())
{
if (ImGui.BeginMenu("File"))
{
ShowExampleMenuFile();
ImGui.EndMenu();
}
if (ImGui.BeginMenu("Edit"))
{
if (ImGui.MenuItem("Undo", "CTRL+Z")) { }
if (ImGui.MenuItem("Redo", "CTRL+Y", false, false)) { }
ImGui.Separator();
if (ImGui.MenuItem("Cut", "CTRL+X")) { }
if (ImGui.MenuItem("Copy", "CTRL+C")) { }
if (ImGui.MenuItem("Paste", "CTRL+V")) { }
ImGui.EndMenu();
}
ImGui.EndMainMenuBar();
}
}
private void ShowExampleMenuFile()
{
ImGui.MenuItem("(demo menu)", null, false, false);
if (ImGui.MenuItem("New")) { }
if (ImGui.MenuItem("Open", "Ctrl+O")) { }
if (ImGui.MenuItem("Open Recent"))
{
ImGui.MenuItem("fish_hat.c");
ImGui.MenuItem("fish_hat.inl");
ImGui.MenuItem("fish_hat.h");
if (ImGui.MenuItem("More.."))
{
ImGui.MenuItem("Hello");
ImGui.MenuItem("Sailor");
if (ImGui.BeginMenu("Recurse.."))
{
ShowExampleMenuFile();
ImGui.EndMenu();
}
ImGui.EndMenu();
}
ImGui.EndMenu();
}
if (ImGui.MenuItem("Save", "Ctrl+S")) { }
if (ImGui.MenuItem("Save As ..")) { }
ImGui.Separator();
if (ImGui.BeginMenu("Options"))
{
bool enabled = true;
ImGui.MenuItem("Enabled", "", enabled);
ImGui.BeginChild("child", new Vec2(0, 60), ImGuiChildFlags.Border);
for (int i = 0; i < 10; i++)
{
ImGui.Text(string.Format("Scrolling Text {0}", i));
}
ImGui.EndChild();
float f = 0.5f;
int n = 0;
ImGui.SliderFloat("Value", ref f, 0.0f, 1.0f);
ImGui.InputFloat("Input", ref f, 0.1f);
ImGui.Combo("Combo", ref n, "Yes\0No\0Maybe\0\0");
ImGui.EndMenu();
}
if (ImGui.BeginMenu("Colors"))
{
float sz = ImGui.GetTextLineHeight();
//ImGui.Text(((int)ImGuiCol.COUNT).ToString()); //Test
for (int i = 0; i < (int)ImGuiCol.COUNT; i++)
{
string name = ImGui.GetStyleColorName((ImGuiCol)i);
Vec2 p = ImGui.GetCursorScreenPos();
ImGui.GetWindowDrawList().AddRectFilled(p, new Vec2(p.X + sz, p.Y + sz), ImGui.GetColorU32((ImGuiCol)i));
ImGui.Dummy(new Vec2(sz, sz));
ImGui.SameLine();
ImGui.MenuItem(name);
}
ImGui.EndMenu();
}
if (ImGui.BeginMenu("Options")) //Append!
{
bool b = true;
ImGui.Checkbox("SomeOption", ref b);
ImGui.EndMenu();
}
if (ImGui.BeginMenu("Disabled", false)) { } //Disabled
if (ImGui.MenuItem("Checked", null, true)) { }
if (ImGui.MenuItem("Quit", "Alt+F4")) { }
}
#endregion
#region DebugLog
static List debug_log = new List();
static bool AutoScroll = true;
unsafe private struct ImGuiDebugLog
{
//ImGuiTextBufferPtr Buf;
ImGuiTextFilterPtr Filter;
//ImVector LineOffsets;
//bool AutoScroll;
public void DebugLog()
{
//AutoScroll = true;
//Buf = ImGuiNative.ImGuiTextBuffer_ImGuiTextBuffer();
var FilterPointer = ImGuiNative.ImGuiTextFilter_ImGuiTextFilter(null);
Filter = new ImGuiTextFilterPtr(FilterPointer);
}
public void Clear()
{
debug_log.Clear();
}
public void AddLog(string text)
{
//int old_size = this.Buf.Buf.Size;
debug_log.Add(text);
}
public void Destroy()
{
ImGuiNative.ImGuiTextFilter_destroy(Filter.NativePtr);
}
public void Draw(string title)
{
if (!ImGui.Begin(title))
{
ImGui.End();
return;
}
//Options menu
if (ImGui.BeginPopup("Options"))
{
ImGui.Checkbox("Auto-scroll", ref AutoScroll);
ImGui.EndPopup();
}
//Main window
if (ImGui.Button("Options"))
{
ImGui.OpenPopup("Options");
}
ImGui.SameLine();
bool clear = ImGui.Button("Clear");
ImGui.SameLine();
bool copy = ImGui.Button("Copy");
ImGui.SameLine();
Filter.Draw("Filter", -100.0f);
ImGui.Separator();
ImGui.BeginChild("scrolling", new Vec2(0, 0), ImGuiChildFlags.None, ImGuiWindowFlags.HorizontalScrollbar);
if (clear)
{
Clear();
}
if (copy)
{
ImGui.LogToClipboard();
}
ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, new Vec2(0, 0));
if (Filter.IsActive())
{
foreach (string str in debug_log)
{
if (Filter.PassFilter(str))
{
//ImGui.TextUnformatted(str);
ImGui.BulletText(str);
}
}
}
else
{
foreach (string str in debug_log)
{
ImGui.TextUnformatted(str);
}
}
ImGui.PopStyleVar();
if (AutoScroll && ImGui.GetScrollY() >= ImGui.GetScrollMaxY())
{
ImGui.SetScrollHereY(1.0f);
}
ImGui.EndChild();
ImGui.End();
}
}
private void DrawImGuiDebugLog()
{
ImGuiDebugLog log = new ImGuiDebugLog();
ImGui.SetNextWindowSize(new Vec2(500, 400), ImGuiCond.FirstUseEver);
ImGui.Begin("Example: Log");
if (ImGui.SmallButton("[Debug] Add 5 entries"))
{
string[] words = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate" };
foreach (string str in words)
{
log.AddLog("Frame " + ImGui.GetFrameCount() + " [info] Hello, current time is " + ImGui.GetTime() + " here's a word: " + str);
}
}
ImGui.End();
log.DebugLog();
log.Draw("Example: Log");
log.Destroy();
}
#endregion
#region AppConsole
static List console_log = new List();
static List console_history = new List();
static bool AutoScroll_Console = true;
unsafe private struct ImGuiExampleAppConsole
{
ImGuiTextFilterPtr Filter;
public void ExampleAppConsole()
{
var FilterPointer = ImGuiNative.ImGuiTextFilter_ImGuiTextFilter(null);
Filter = new ImGuiTextFilterPtr(FilterPointer);
}
public void ClearLog()
{
console_log.Clear();
}
public void AddLog(string text)
{
console_log.Add(text);
}
public void Destroy()
{
ImGuiNative.ImGuiTextFilter_destroy(Filter.NativePtr);
}
public void Draw(string title)
{
ImGui.SetNextWindowSize(new Vec2(520, 600), ImGuiCond.FirstUseEver);
if (!ImGui.Begin(title))
{
ImGui.End();
return;
}
if (ImGui.BeginPopupContextItem())
{
if (ImGui.MenuItem("Close Console"))
{
show_app_console = false;
}
ImGui.EndPopup();
}
ImGui.TextWrapped(
"This example implements a console with basic coloring" + //, completion "+//(TAB key) and history (Up/Down keys)
". A more elaborate " +
"implementation may want to store entries along with extra data such as timestamp, emitter, etc.");
ImGui.TextWrapped("Enter 'HELP' for help.");
if (ImGui.SmallButton("Add Debug Text"))
{
AddLog(console_log.Count + " some text");
AddLog("some more text");
AddLog("display very important message here!");
}
ImGui.SameLine();
if (ImGui.SmallButton("Add Debug Error"))
{
AddLog("[error] something went wrong");
}
ImGui.SameLine();
if (ImGui.SmallButton("Clear"))
{
ClearLog();
}
ImGui.SameLine();
bool copy_to_clipboard = ImGui.SmallButton("Copy");
ImGui.Separator();
//Options menu
if (ImGui.BeginPopup("Options"))
{
ImGui.Checkbox("Auto-scroll", ref AutoScroll_Console);
ImGui.EndPopup();
}
//Filter
if (ImGui.Button("Options"))
{
ImGui.OpenPopup("Options");
}
ImGui.SameLine();
Filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180.0f);
ImGui.Separator();
float footer_height_to_reserve = ImGui.GetStyle().ItemSpacing.Y + ImGui.GetFrameHeightWithSpacing();
ImGui.BeginChild("ScrollingRegion", new Vec2(0, -footer_height_to_reserve), ImGuiChildFlags.None, ImGuiWindowFlags.HorizontalScrollbar);
if (ImGui.BeginPopupContextWindow())
{
if (ImGui.Selectable("Clear"))
{
ClearLog();
}
ImGui.EndPopup();
}
if (copy_to_clipboard)
{
ImGui.LogToClipboard();
}
ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, new Vec2(4, 1));
if (Filter.IsActive())
{
foreach (string str in console_log)
{
if (Filter.PassFilter(str))
{
Vec4 color;
bool has_color = false;
if (str.IndexOf("[error]") != -1)
{
color = new Vec4(1.0f, 0.4f, 0.4f, 1.0f);
ImGui.PushStyleColor(ImGuiCol.Text, color);
has_color = true;
}
if (str.IndexOf("# ") == 0)
{
color = new Vec4(1.0f, 0.8f, 0.6f, 1.0f);
ImGui.PushStyleColor(ImGuiCol.Text, color);
has_color = true;
}
ImGui.TextUnformatted(str);
if (has_color)
{
ImGui.PopStyleColor();
}
}
}
}
else
{
foreach (string str in console_log)
{
Vec4 color;
bool has_color = false;
if (str.IndexOf("[error]") != -1)
{
color = new Vec4(1.0f, 0.4f, 0.4f, 1.0f);
ImGui.PushStyleColor(ImGuiCol.Text, color);
has_color = true;
}
if (str.IndexOf("# ") == 0)
{
color = new Vec4(1.0f, 0.8f, 0.6f, 1.0f);
ImGui.PushStyleColor(ImGuiCol.Text, color);
has_color = true;
}
ImGui.TextUnformatted(str);
if (has_color)
{
ImGui.PopStyleColor();
}
}
}
ImGui.PopStyleVar();
if (AutoScroll_Console && ImGui.GetScrollY() >= ImGui.GetScrollMaxY())
{
ImGui.SetScrollHereY(1.0f);
}
ImGui.EndChild();
ImGui.Separator();
string input_buf = "";
bool reclaim_focus = false;
ImGuiInputTextFlags input_text_flags = ImGuiInputTextFlags.EnterReturnsTrue; //| ImGuiInputTextFlags.CallbackCompletion | ImGuiInputTextFlags.CallbackHistory;
if (ImGui.InputText("Input", ref input_buf, 250, input_text_flags))
{
ExecCommand(input_buf);
reclaim_focus = true;
}
ImGui.SetItemDefaultFocus();
if (reclaim_focus)
{
ImGui.SetKeyboardFocusHere(-1);
}
ImGui.End();
}
void ExecCommand(string command)
{
//History
if (console_history.Count == 10)
{
console_history.RemoveAt(0);
}
console_history.Add(command);
//Show Input
AddLog("# " + command);
//Commands
if (command == "CLEAR")
{
ClearLog();
}
else if (command == "HELP")
{
AddLog("Commands:");
AddLog("- CLEAR");
AddLog("- HELP");
AddLog("- HISTORY");
}
else if (command == "HISTORY")
{
int history_pos = 0;
foreach (string item in console_history)
{
AddLog(" " + history_pos.ToString() + ": " + item);
history_pos++;
}
}
else
{
AddLog("Unknown command: '" + command + "'");
}
}
}
private void DrawImGuiExampleAppConsole()
{
string console_window_name = "Example: Console";
ImGuiExampleAppConsole console = new ImGuiExampleAppConsole();
//ImGui.Begin(console_window_name);
//if (ImGui.SmallButton("[Debug] Add 5 entries"))
//{
// string[] words = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate" };
// foreach (string str in words)
// {
// console.AddLog("Frame " + ImGui.GetFrameCount() + " [info] Hello, current time is " + ImGui.GetTime() + " here's a word: " + str);
// }
//}
//ImGui.End();
console.ExampleAppConsole();
console.Draw(console_window_name);
console.Destroy();
}
#endregion
#region DrawDemoWindowVariables
// Window options
bool no_titlebar = false;
bool no_scrollbar = false;
bool no_menu = false;
bool no_move = false;
bool no_resize = false;
bool no_collapse = false;
//bool no_close = false;
bool no_nav = false;
bool no_background = false;
bool no_bring_to_front = false;
// Examples
bool show_app_main_menu_bar = false;
bool show_app_log = false;
bool show_app_simple_overlay = false;
bool show_native_examples = false;
static bool show_app_console = false;
bool show_monogame_settings = true;
// Tools
bool show_app_style_editor = false;
bool show_app_metrics = false;
bool show_app_about = false;
#endregion
private void DrawDemoWindow()
{
ImGuiWindowFlags windowFlags = 0;
if (no_titlebar) { windowFlags |= ImGuiWindowFlags.NoTitleBar; }
if (no_scrollbar) { windowFlags |= ImGuiWindowFlags.NoScrollbar; }
if (!no_menu) { windowFlags |= ImGuiWindowFlags.MenuBar; }
if (no_move) { windowFlags |= ImGuiWindowFlags.NoMove; }
if (no_resize) { windowFlags |= ImGuiWindowFlags.NoResize; }
if (no_collapse) { windowFlags |= ImGuiWindowFlags.NoCollapse; }
if (no_nav) { windowFlags |= ImGuiWindowFlags.NoNav; }
if (no_background) { windowFlags |= ImGuiWindowFlags.NoBackground; }
if (no_bring_to_front) { windowFlags |= ImGuiWindowFlags.NoBringToFrontOnFocus; }
//if (no_close) { } // p_open = null;
//bool p_open = true;
ImGui.SetNextWindowPos(new Vec2(450, 20), ImGuiCond.FirstUseEver);
ImGui.SetNextWindowSize(new Vec2(550, 680), ImGuiCond.FirstUseEver);
//Main body
if (!ImGui.Begin("Dear ImGui Demo / Monogame & ImGui.Net", windowFlags)) //ref p_open, windowFlags)) Close button is not changing bool!?
{
ImGui.End();
return;
}
ImGui.PushItemWidth(ImGui.GetFontSize() * -12);
//Menu bar
if (ImGui.BeginMenuBar())
{
if (ImGui.BeginMenu("Menu"))
{
ShowExampleMenuFile();
ImGui.EndMenu();
}
if (ImGui.BeginMenu("Examples"))
{
ImGui.MenuItem("Main menu bar", null, ref show_app_main_menu_bar);
ImGui.MenuItem("Console", null, ref show_app_console);
ImGui.MenuItem("Log", null, ref show_app_log);
//ImGui.MenuItem("Simple Layout", null, true);
//ImGui.MenuItem("Property editor", null, true);
//ImGui.MenuItem("Long text display", null, true);
//ImGui.MenuItem("Auto-resizing window", null, true);
//ImGui.MenuItem("Constrained-resizing window", null, true);
ImGui.MenuItem("Simple overlay", null, ref show_app_simple_overlay);
//ImGui.MenuItem("Fullscreen window", null, true);
//ImGui.MenuItem("Manipulating window titles", null, true);
//ImGui.MenuItem("Custom rendering", null, true);
//ImGui.MenuItem("Documents", null, true);
ImGui.MenuItem("Native ImGui Demos", null, ref show_native_examples);
ImGui.MenuItem("MonoGame Settings", null, ref show_monogame_settings);
ImGui.EndMenu();
}
if (ImGui.BeginMenu("Tools"))
{
ImGui.MenuItem("Metrics/Debugger", null, ref show_app_metrics);
ImGui.MenuItem("Style Editor", null, ref show_app_style_editor);
ImGui.MenuItem("About Dear ImGui", null, ref show_app_about);
ImGui.EndMenu();
}
ImGui.EndMenuBar();
}
ImGui.Text("dear imgui says hello. (" + ImGui.GetVersion() + ")");
ImGui.Spacing();
if (ImGui.CollapsingHeader("Help"))
{
ImGui.Text("ABOUT THIS DEMO:");
ImGui.BulletText("Sections below are demonstrating many aspects of the library.");
ImGui.BulletText("The \"Examples\" menu above leads to more demo contents.");
ImGui.BulletText("The \"Tools\" menu above gives access to: About Box, Style Editor,\nand Metrics/Debugger (general purpose Dear ImGui debugging tool).");
ImGui.Separator();
ImGui.Text("PROGRAMMER GUIDE:");
ImGui.BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!");
ImGui.BulletText("See comments in imgui.cpp.");
ImGui.BulletText("See example applications in the examples/ folder.");
ImGui.BulletText("Read the FAQ at http://www.dearimgui.org/faq/");
ImGui.BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls.");
ImGui.BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls.");
ImGui.Separator();
ImGui.Text("USER GUIDE:");
ImGui.ShowUserGuide();
}
if (ImGui.CollapsingHeader("Configuration"))
{
if (ImGui.TreeNode("Style"))
{
HelpMarker("The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function.");
ImGui.ShowStyleEditor();
ImGui.TreePop();
ImGui.Separator();
}
if (ImGui.TreeNode("Capture/Logging"))
{
HelpMarker("The logging API redirects all text output so you can easily capture the content of a window or a block. Tree nodes can be automatically expanded.\nTry opening any of the contents below in this window and then click one of the \"Log To\" button.");
ImGui.LogButtons();
HelpMarker("You can also call ImGui.LogText() to output directly to the log without a visual output.");
if (ImGui.Button("Copy \"Hello, world!\" to clipboard"))
{
ImGui.LogToClipboard();
ImGui.LogText("Hello, world!");
ImGui.LogFinish();
}
ImGui.TreePop();
}
}
if (ImGui.CollapsingHeader("Window options"))
{
//if(ImGui.BeginTable // feature of imgui 1.75?
ImGui.Checkbox("No titlebar", ref no_titlebar);
ImGui.Checkbox("No scrollbar", ref no_scrollbar);
ImGui.Checkbox("No menu", ref no_menu);
ImGui.Checkbox("No move", ref no_move);
ImGui.Checkbox("No resize", ref no_resize);
ImGui.Checkbox("No collapse", ref no_collapse);
//ImGui.Checkbox("No close", ref no_close);
ImGui.Checkbox("No nav", ref no_nav);
ImGui.Checkbox("No background", ref no_background);
ImGui.Checkbox("No bring to front", ref no_bring_to_front);
}
DemoWindowWidgets();
DemoWindowLayout();
DemoWindowPopups();
//ShowDemoWindowTables();
DemoWindowMisc();
ImGui.PopItemWidth();
ImGui.End();
}
private void HelpMarker(string desc)
{
ImGui.TextDisabled("(?)");
if (ImGui.IsItemHovered())
{
ImGui.BeginTooltip();
ImGui.PushTextWrapPos(ImGui.GetFontSize() * 35.0f);
ImGui.TextUnformatted(desc);
ImGui.PopTextWrapPos();
ImGui.EndTooltip();
}
}
#region DemoWindowWidgetsVariables
//Basic Input
int clicked = 0;
bool check = true;
int e = 0;
int counter = 0;
int item_current = 0;
string str0 = "Hello, world!";
string str1 = "";
int i0 = 123;
float f0 = 0.001f;
double d0 = 999999.00000001;
float f1 = 1.42f;
Vec3 vec3 = new Vec3(0.10f, 0.20f, 0.30f);
//Basic Drag & Slider
int i1 = 50, i2 = 42;
float f2 = 1.00f, f3 = 0.0067f;
int i3 = 0;
float f4 = 0.123f;
float angle = 0.0f;
Vec3 col1 = new Vec3(1.0f, 0.0f, 0.2f);
Vec4 col2 = new Vec4(0.4f, 0.7f, 0.0f, 0.5f);
int current_fruit = 1;
//Trees
bool base_flags_first_run = true;
uint base_flags = 0;
bool align_label_with_current_x_position = false;
int index_selected = 0;
//bool test_drag_and_drop = false;
//Collapsing headers
bool closable_group = true;
//Word wrapping
float wrap_width = 200.0f;
//Images
int pressed_count = 0;
//Combo
uint flags = 0; //ImGuiComboFlags
int item_current_idx = 0;
int item_current_2 = 0;
int item_current_3 = -1;
//List boxes
int item_current_idx_lb = 0;
//Selectables
bool[] selection = { false, true, false, false, false };
int selected = -1;
bool[] selection_ms = { false, false, false, false, false };
bool[] selected_rend = { false, false, false };
bool[] selected_align = { true, false, true, false, true, false, true, false, true };
//Text input
bool flags_ti_first_run = true;
uint flags_ti = 0;
string buf1 = "";
string buf2 = "";
string buf3 = "";
string buf4 = "";
string buf5 = "";
string password = "password123";
//Tabs
bool flags_tabs_first_run = true;
uint tab_bar_flags = 0;
bool[] opened = { true, true, true, true };
//Plots Widgets
bool animate = true;
float[] values = new float[90];
int values_offset = 0;
double refresh_time = 0.0;
float phase = 0.0f;
float progress = 0.0f, progress_dir = 1.0f;
//Color Widgets
Vec3 color_vec3 = new Vec3(114.0f / 255.0f, 144.0f / 255.0f, 154 / 255.0f);
Vec4 color_vec4 = new Vec4(114.0f / 255.0f, 144.0f / 255.0f, 154 / 255.0f, 200.0f / 255.0f);
bool alpha_preview = true;
bool alpha_half_preview = false;
bool drag_and_drop = true;
bool options_menu = true;
bool hdr = false;
bool alpha = true;
bool alpha_bar = true;
bool side_preview = true;
bool ref_color = false;
Vec4 ref_color_v = new Vec4(1.0f, 0.0f, 1.0f, 0.5f);
int display_mode = 0;
int picker_mode = 0;
Vec4 color_hsv = new Vec4(0.23f, 1.0f, 1.0f, 1.0f);
//Range Widgets
float begin = 10, end = 90;
int begin_i = 100, end_i = 1000;
//Multi component Widgets
Vec2 vec2f = new Vec2(0.10f, 0.20f);
Vec3 vec3f = new Vec3(0.10f, 0.20f, 0.30f);
Vec4 vec4f = new Vec4(0.10f, 0.20f, 0.30f, 0.44f);
int[] vec4i = { 1, 5, 100, 255 };
//Vertical Sliders
float spacing = 4;
int int_value = 0;
float[] values_vert = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f };
float col_red = 1.0f;
float col_green = 1.0f;
float col_blue = 1.0f;
float[] values2 = { 0.20f, 0.80f, 0.40f, 0.25f };
#endregion
private void DemoWindowWidgets()
{
if (!ImGui.CollapsingHeader("Widgets"))
{
return;
}
//Basic
#region Basic
if (ImGui.TreeNode("Basic"))
{
if (ImGui.Button("Button"))
{
clicked++;
if (clicked == 2)
{
clicked = 0;
}
}
if (clicked == 1)
{
ImGui.SameLine();
ImGui.Text("Thanks for clicking me!");
}
ImGui.Checkbox("checkbox", ref check);
ImGui.RadioButton("radio a", ref e, 0);
ImGui.SameLine();
ImGui.RadioButton("radio b", ref e, 1);
ImGui.SameLine();
ImGui.RadioButton("radio c", ref e, 2);
for (int i = 0; i < 7; i++)
{
if (i > 0)
{
ImGui.SameLine();
}
ImGui.PushID(i);
//ImColorPtr color = new ImColorPtr();
//ImGuiNative.ImColor_HSV ?
ImGui.PushStyleColor(ImGuiCol.Button, new Vec4(i / 7.0f, 0.6f, 0.6f, 0.6f));
ImGui.PushStyleColor(ImGuiCol.ButtonHovered, new Vec4(i / 7.0f, 0.7f, 0.7f, 0.7f));
ImGui.PushStyleColor(ImGuiCol.ButtonActive, new Vec4(i / 7.0f, 0.8f, 0.8f, 0.8f));
ImGui.Button("Click");
ImGui.PopStyleColor(3);
ImGui.PopID();
}
ImGui.AlignTextToFramePadding();
ImGui.Text("Hold to repeat:");
ImGui.SameLine();
float spacing = ImGui.GetStyle().ItemInnerSpacing.X;
ImGui.PushButtonRepeat(true);
if (ImGui.ArrowButton("##left", ImGuiDir.Left)) { counter--; }
ImGui.SameLine(0.0f, spacing);
if (ImGui.ArrowButton("##right", ImGuiDir.Right)) { counter++; }
ImGui.PopButtonRepeat();
ImGui.SameLine();
ImGui.Text(counter.ToString());
ImGui.Text("Hover over me");
if (ImGui.IsItemHovered())
{
ImGui.SetTooltip("I am a tooltip");
}
ImGui.SameLine();
ImGui.Text("- or me");
if (ImGui.IsItemHovered())
{
ImGui.BeginTooltip();
ImGui.Text("I am a fancy tooltip");
float[] arr = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
ImGui.PlotLines("Curve", ref arr[0], arr.Length);
ImGui.EndTooltip();
}
ImGui.Separator();
ImGui.LabelText("label", "Value");
//combo box
string items = "AAAA\0BBBB\0CCCC\0DDDD\0EEEE\0FFFF\0GGGG\0HHHH\0IIIIIII\0JJJJ\0KKKKKKK";
ImGui.Combo("combo", ref item_current, items, 11);
//input
ImGui.InputText("input text", ref str0, 128);
ImGui.SameLine();
HelpMarker("USER:\n" +
"Hold SHIFT or use mouse to select text.\n" +
"CTRL+Left/Right to word jump.\n" +
"CTRL+A or double-click to select all.\n" +
"CTRL+X,CTRL+C,CTRL+V clipboard.\n" +
"CTRL+Z,CTRL+Y undo/redo.\n" +
"ESCAPE to revert.\n\n" +
"PROGRAMMER:\n" +
"You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() " +
"to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated " +
"in imgui_demo.cpp).");
ImGui.InputTextWithHint("input text (w/ hint", "enter text here", ref str1, 10);
ImGui.InputInt("input int", ref i0);
ImGui.SameLine();
HelpMarker("You can apply arithmetic operators +,*,/ on numerical values.\n" +
" e.g. [ 100 ], input \'*2\', result becomes [ 200 ]\n" +
"Use +- to subtract.");
ImGui.InputFloat("input float", ref f0, 0.01f, 1.0f, "%.3f");
ImGui.InputDouble("input double", ref d0, 0.01f, 1.0f, "%.8f");
ImGui.InputFloat("input scientific", ref f1, 0.0f, 0.0f, "%e");
ImGui.SameLine();
HelpMarker("You can input value using the scientific notation,\n" +
" e.g. \"1e+8\" becomes \"100000000\".");
ImGui.InputFloat3("input float 3", ref vec3);
//drag
ImGui.DragInt("drag int", ref i1, 1);
ImGui.SameLine();
HelpMarker("Click and drag to edit value.\n" +
"Hold SHIFT/ALT for faster/slower edit.\n" +
"Double-click or CTRL+click to input value.");
ImGui.DragInt("drag int 0..100", ref i2, 1, 0, 100, "%d%%");
ImGui.DragFloat("drag float", ref f2, 0.005f);
ImGui.DragFloat("drag small float", ref f3, 0.0001f, 0.0f, 0.0f, "%.06f ns");
ImGui.SliderInt("slider int", ref i3, -1, 3);
ImGui.SameLine();
HelpMarker("CTRL+click to input value.");
ImGui.SliderFloat("slider float", ref f4, 0.0f, 1.0f, "ratio = %.3f");
ImGui.SliderAngle("slider angle", ref angle);
//color
ImGui.ColorEdit3("color 1", ref col1);
ImGui.SameLine();
HelpMarker("Click on the color square to open a color picker.\n" +
"Click and hold to use drag and drop.\n" +
"Right-click on the color square to show options.\n" +
"CTRL+click on individual component to input value.\n");
ImGui.ColorEdit4("color 2", ref col2);
string[] fruits = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" };
ImGui.ListBox("listbox", ref current_fruit, fruits, fruits.Length);
ImGui.SameLine();
HelpMarker("Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API.");
ImGui.TreePop();
}
#endregion
//Trees
#region Trees
if (ImGui.TreeNode("Trees"))
{
if (ImGui.TreeNode("Basic trees"))
{
for (int i = 0; i < 5; i++)
{
if (i == 0)
{
ImGui.SetNextItemOpen(true, ImGuiCond.Once);
}
if (ImGui.TreeNode(i.ToString(), "Child " + i.ToString()))
{
ImGui.Text("blah blah");
ImGui.SameLine();
if (ImGui.SmallButton("button")) { }
ImGui.TreePop();
}
}
ImGui.TreePop();
}
if (ImGui.TreeNode("Advanced, with Selectable nodes"))
{
HelpMarker(
"This is a more typical looking tree with selectable nodes.\n" +
"Click to select, CTRL+Click to toggle, click on arrows or double-click to open.");
if (base_flags_first_run)
{
ImGuiTreeNodeFlags _base_flags = ImGuiTreeNodeFlags.OpenOnArrow | ImGuiTreeNodeFlags.OpenOnDoubleClick;
base_flags = (uint)_base_flags;
base_flags_first_run = false;
}
ImGui.CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", ref base_flags, (uint)ImGuiTreeNodeFlags.OpenOnArrow);
ImGui.CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", ref base_flags, (uint)ImGuiTreeNodeFlags.OpenOnDoubleClick);
ImGui.Checkbox("Align label with current X position", ref align_label_with_current_x_position);
//ImGui.Checkbox("Test tree node as drag source", ref test_drag_and_drop);
ImGui.Text("Hello!");
if (align_label_with_current_x_position)
{
ImGui.Unindent(ImGui.GetTreeNodeToLabelSpacing());
}
for (int i = 0; i < 6; i++)
{
ImGuiTreeNodeFlags node_flags = (ImGuiTreeNodeFlags)base_flags;
if (i == index_selected)
{
node_flags |= ImGuiTreeNodeFlags.Selected;
}
if (i < 3)
{
if (ImGui.TreeNodeEx(i.ToString(), node_flags, "Selectable Node " + i.ToString()))
{
ImGui.BulletText("Blah blah\nBlah Blah");
ImGui.TreePop();
}
}
else
{
node_flags |= ImGuiTreeNodeFlags.Leaf | ImGuiTreeNodeFlags.NoTreePushOnOpen;
ImGui.TreeNodeEx(i.ToString(), node_flags, "Selectable Leaf " + i.ToString());
}
if (ImGui.IsItemClicked())
{
index_selected = i;
}
}
ImGui.TreePop();
}
ImGui.TreePop();
}
#endregion
//Collapsing Headers
#region Collapsing Headers & Bullets
if (ImGui.TreeNode("Collapsing Headers"))
{
ImGui.Checkbox("Show 2nd header", ref closable_group);
if (ImGui.CollapsingHeader("Header", ImGuiTreeNodeFlags.None))
{
ImGui.Text("IsItemHovered: " + ImGui.IsItemHovered());
for (int i = 0; i < 5; i++)
{
ImGui.Text("Some content " + i);
}
}
if (ImGui.CollapsingHeader("Header with a close button", ref closable_group))
{
ImGui.Text("IsItemHovered: " + ImGui.IsItemHovered());
for (int i = 0; i < 5; i++)
{
ImGui.Text("More content " + i);
}
}
ImGui.TreePop();
}
//Bullets
if (ImGui.TreeNode("Bullets"))
{
ImGui.BulletText("Bullet point 1");
ImGui.BulletText("Bullet point 2\nOn multiple lines");
if (ImGui.TreeNode("Tree node"))
{
ImGui.BulletText("Another bullet point");
ImGui.TreePop();
}
ImGui.Bullet();
ImGui.Text("Bullet point 3 (two calls)");
ImGui.Bullet();
ImGui.SmallButton("Button");
ImGui.TreePop();
}
#endregion
//Text
#region Text
if (ImGui.TreeNode("Text"))
{
if (ImGui.TreeNode("Colorful Text"))
{
ImGui.TextColored(new Vec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink");
ImGui.TextColored(new Vec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow");
ImGui.TextDisabled("Disabled");
ImGui.SameLine();
HelpMarker("The TextDisabled color is stored in ImGuiStyle.");
ImGui.TreePop();
}
if (ImGui.TreeNode("Word Wrapping"))
{
ImGui.TextWrapped("This text should automatically wrap on the edge of the window. The current implementation " +
"for text wrapping follows simple rules suitable for English and possibly other languages.");
ImGui.Spacing();
ImGui.SliderFloat("Wrap width", ref wrap_width, -20, 600, "%.0f");
ImDrawListPtr draw_list = ImGui.GetWindowDrawList();
for (int n = 0; n < 2; n++)
{
ImGui.Text("Test paragraph " + n);
Vec2 pos = ImGui.GetCursorPos();
Vec2 marker_min = new Vec2(pos.X + wrap_width, pos.Y);
Vec2 marker_max = new Vec2(pos.X + wrap_width + 10, pos.Y + ImGui.GetTextLineHeight());
ImGui.PushTextWrapPos(ImGui.GetCursorPos().X + wrap_width);
if (n == 0)
{
ImGui.Text(string.Format("The lazy dog is a good dog. This paragraph should fit within {0} pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width));
}
else
{
ImGui.Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh");
}
Vec4 colf = new Vec4(255.0f, 255.0f, 0.0f, 255.0f);
uint col = ImGui.ColorConvertFloat4ToU32(colf); //ImGuiNative.igColorConvertFloat4ToU32(colf);
draw_list.AddRect(ImGui.GetItemRectMin(), ImGui.GetItemRectMax(), col);
Vec4 colf2 = new Vec4(255.0f, 0.0f, 255.0f, 255.0f);
uint col2 = ImGui.ColorConvertFloat4ToU32(colf2); //ImGuiNative.igColorConvertFloat4ToU32(colf2);
draw_list.AddRectFilled(marker_min, marker_max, col2);
ImGui.PopTextWrapPos();
}
ImGui.TreePop();
}
ImGui.TreePop();
}
#endregion
//Images
#region Images
if (ImGui.TreeNode("Images"))
{
ImGuiIOPtr io = ImGui.GetIO();
ImGui.TextWrapped("Below we are displaying the font texture (which is the only texture we have access to in this demo). " +
"Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. " +
"Hover the texture for a zoomed view!");
System.IntPtr my_tex_id = io.Fonts.TexID;
float my_tex_w = (float)io.Fonts.TexWidth;
float my_tex_h = (float)io.Fonts.TexHeight;
ImGui.Text(my_tex_w + "x" + my_tex_h);
Vec2 pos = ImGui.GetCursorScreenPos();
Vec2 uv_min = new Vec2(0.0f, 0.0f); // top left
Vec2 uv_max = new Vec2(1.0f, 1.0f); // lower right
Vec4 tint_col = new Vec4(1.0f, 1.0f, 1.0f, 1.0f); // no tint
Vec4 border_col = new Vec4(1.0f, 1.0f, 1.0f, 0.5f); // 50% opaque white
ImGui.Image(my_tex_id, new Vec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col);
if (ImGui.IsItemHovered())
{
ImGui.BeginTooltip();
float region_sz = 32.0f;
float region_x = io.MousePos.X - pos.X - region_sz * 0.5f;
float region_y = io.MousePos.Y - pos.Y - region_sz * 0.5f;
float zoom = 4.0f;
if (region_x < 0.0f) { region_x = 0.0f; }
else if (region_x > my_tex_w - region_sz) { region_x = my_tex_w - region_sz; }
if (region_y < 0.0f) { region_y = 0.0f; }
else if (region_y > my_tex_h - region_sz) { region_y = my_tex_h - region_sz; }
ImGui.Text(string.Format("Min: ({0},{1})", region_x, region_y));
ImGui.Text(string.Format("Max: ({0},{1})", region_x + region_sz, region_y + region_sz));
Vec2 uv0 = new Vec2((region_x) / my_tex_w, (region_y) / my_tex_h);
Vec2 uv1 = new Vec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h);
ImGui.Image(my_tex_id, new Vec2(region_sz * zoom, region_sz * zoom), uv0, uv1, tint_col, border_col);
ImGui.EndTooltip();
}
ImGui.TextWrapped("And now some textured buttons..");
for (int i = 0; i < 8; i++)
{
ImGui.PushID(i);
int frame_padding = -1 + i;
Vec2 size = new Vec2(32.0f, 32.0f);
Vec2 uv0 = new Vec2(0.0f, 0.0f);
Vec2 uv1 = new Vec2(32.0f / my_tex_w, 32.0f / my_tex_h);
Vec4 bg_col = new Vec4(0.0f, 0.0f, 0.0f, 1.0f); // black background
Vec4 tint_col2 = new Vec4(1.0f, 1.0f, 1.0f, 1.0f); // no tint
if (ImGui.ImageButton($"textured_button_id_{i}",my_tex_id, size, uv0, uv1, bg_col, tint_col2))
{
pressed_count += 1;
}
ImGui.PopID();
ImGui.SameLine();
}
ImGui.NewLine();
ImGui.Text(string.Format("Pressed {0} times.", pressed_count));
ImGui.TreePop();
}
#endregion
//Combo
#region Combo & List boxes
if (ImGui.TreeNode("Combo"))
{
ImGui.CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", ref flags, (uint)ImGuiComboFlags.PopupAlignLeft);
ImGui.SameLine();
HelpMarker("Only makes a difference if the popup is larger than the combo");
if (ImGui.CheckboxFlags("ImGuiComboFlags_NoArrowButton", ref flags, (uint)ImGuiComboFlags.NoArrowButton))
{
flags &= ~(uint)ImGuiComboFlags.NoPreview; // clear the other flag
}
if (ImGui.CheckboxFlags("ImGuiComboFlags_NoPreview", ref flags, (uint)ImGuiComboFlags.NoPreview))
{
flags &= ~(uint)ImGuiComboFlags.NoArrowButton; // clear the other flag
}
string[] items = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" };
string combo_label = items[item_current_idx];
ImGuiComboFlags flags_cf = (ImGuiComboFlags)flags;
if (ImGui.BeginCombo("combo 1", combo_label, flags_cf))
{
for (int n = 0; n < items.Length; n++)
{
bool is_selected = (item_current_idx == n);
if (ImGui.Selectable(items[n], is_selected))
{
item_current_idx = n;
}
if (is_selected)
{
ImGui.SetItemDefaultFocus();
}
}
ImGui.EndCombo();
}
ImGui.Combo("combo 2 (one-liner)", ref item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
ImGui.Combo("combo 3 (array)", ref item_current_3, items, items.Length);
ImGui.TreePop();
}
//List boxes
if (ImGui.TreeNode("List boxes"))
{
string[] items = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" };
if (ImGui.ListBox("listbox 1", ref item_current_idx_lb, items, items.Length)) { }
ImGui.TreePop();
}
#endregion
//Selectables
#region Selectables
if (ImGui.TreeNode("Selectables"))
{
if (ImGui.TreeNode("Basic"))
{
ImGui.Selectable("1. I am selectable", ref selection[0]);
ImGui.Selectable("2. I am selectable", ref selection[1]);
ImGui.Text("3. I am not selectable");
ImGui.Selectable("4. I am selectable", ref selection[3]);
if (ImGui.Selectable("5. I am double clickable", ref selection[4], ImGuiSelectableFlags.AllowDoubleClick))
{
if (ImGui.IsMouseDoubleClicked(0))
{
selection[4] = !selection[4];
}
}
ImGui.TreePop();
}
if (ImGui.TreeNode("Selection State: Single Selection"))
{
for (int n = 0; n < 5; n++)
{
string buf = string.Format("Object {0}", n);
if (ImGui.Selectable(buf, selected == n))
{
selected = n;
}
}
ImGui.TreePop();
}
if (ImGui.TreeNode("Selection State: Multiple Selection"))
{
HelpMarker("Hold CTRL and click to select multiple items.");
for (int n = 0; n < 5; n++)
{
string buf = string.Format("Object {0}", n);
if (ImGui.Selectable(buf, selection_ms[n]))
{
if (!ImGui.GetIO().KeyCtrl)
{
for (int r = 0; r < selection_ms.Length; r++)
{
selection_ms[r] = false;
}
}
selection_ms[n] ^= true;
}
}
ImGui.TreePop();
}
if (ImGui.TreeNode("Rendering more text into the same line"))
{
ImGui.Selectable("main.c", ref selected_rend[0]); ImGui.SameLine(300); ImGui.Text(" 2,345 bytes");
ImGui.Selectable("Hello.cpp", ref selected_rend[1]); ImGui.SameLine(300); ImGui.Text("12,345 bytes");
ImGui.Selectable("Hello.h", ref selected_rend[2]); ImGui.SameLine(300); ImGui.Text(" 2,345 bytes");
ImGui.TreePop();
}
if (ImGui.TreeNode("Alignment"))
{
HelpMarker("By default, Selectables uses style.SelectableTextAlign but it can be overridden on a per-item " +
"basis using PushStyleVar(). You'll probably want to always keep your default situation to " +
"left-align otherwise it becomes difficult to layout multiple items on a same line");
for (int y = 0; y < 3; y++)
{
for (int x = 0; x < 3; x++)
{
Vec2 alignment = new Vec2((float)x / 2.0f, (float)y / 2.0f);
string name = string.Format("({0},{1})", alignment.X, alignment.Y);
if (x > 0) { ImGui.SameLine(); }
ImGui.PushStyleVar(ImGuiStyleVar.SelectableTextAlign, alignment);
ImGui.Selectable(name, ref selected_align[3 * y + x], ImGuiSelectableFlags.None, new Vec2(80, 80));
ImGui.PopStyleVar();
}
}
ImGui.TreePop();
}
ImGui.TreePop();
}
#endregion
//Text Input
#region Text Input
if (ImGui.TreeNode("Text Input"))
{
if (ImGui.TreeNode("Multi-line Text Input"))
{
string text = "/*\n" +
" The Pentium F00F bug, shorthand for F0 0F C7 C8,\n" +
" the hexadecimal encoding of one offending instruction,\n" +
" more formally, the invalid operand with locked CMPXCHG8B\n" +
" instruction bug, is a design flaw in the majority of\n" +
" Intel Pentium, Pentium MMX, and Pentium OverDrive\n" +
" processors (all in the P5 microarchitecture).\n" +
"*/\n\n" +
"label:\n" +
"\tlock cmpxchg8b eax\n";
if (flags_ti_first_run)
{
ImGuiInputTextFlags _flags = ImGuiInputTextFlags.AllowTabInput;
flags_ti = (uint)_flags;
flags_ti_first_run = false;
}
HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include in here)");
ImGui.CheckboxFlags("ImGuiInputTextFlags_ReadOnly", ref flags_ti, (uint)ImGuiInputTextFlags.ReadOnly);
ImGui.CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", ref flags_ti, (uint)ImGuiInputTextFlags.AllowTabInput);
ImGui.CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", ref flags_ti, (uint)ImGuiInputTextFlags.CtrlEnterForNewLine);
ImGuiInputTextFlags flags_ml = (ImGuiInputTextFlags)flags_ti;
ImGui.InputTextMultiline("##source", ref text, (uint)text.Length, new Vec2(0, ImGui.GetTextLineHeight() * 16), flags_ml);
ImGui.TreePop();
}
if (ImGui.TreeNode("Filtered Text Input"))
{
ImGui.InputText("default", ref buf1, (uint)64);
ImGui.InputText("decimal", ref buf2, (uint)64, ImGuiInputTextFlags.CharsDecimal);
ImGui.InputText("hexadecimal", ref buf3, (uint)64, ImGuiInputTextFlags.CharsHexadecimal);
ImGui.InputText("uppercase", ref buf4, (uint)64, ImGuiInputTextFlags.CharsUppercase);
ImGui.InputText("no blank", ref buf5, (uint)64, ImGuiInputTextFlags.CharsNoBlank);
ImGui.TreePop();
}
if (ImGui.TreeNode("Password Input"))
{
ImGui.InputText("password", ref password, (uint)64, ImGuiInputTextFlags.Password);
ImGui.SameLine();
HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
ImGui.InputTextWithHint("password (w/ hint)", "", ref password, (uint)64, ImGuiInputTextFlags.Password);
ImGui.InputText("password (clear)", ref password, (uint)64);
ImGui.TreePop();
}
ImGui.TreePop();
}
#endregion
//Tabs
#region Tabs
if (ImGui.TreeNode("Tabs"))
{
if (ImGui.TreeNode("Basic"))
{
ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags.None;
if (ImGui.BeginTabBar("MyTabBar", tab_bar_flags))
{
if (ImGui.BeginTabItem("Avocado"))
{
ImGui.Text("This is the Avocado tab!\nblah blah blah blah blah");
ImGui.EndTabItem();
}
if (ImGui.BeginTabItem("Broccoli"))
{
ImGui.Text("This is the Broccoli tab!\nblah blah blah blah blah");
ImGui.EndTabItem();
}
if (ImGui.BeginTabItem("Cucumber"))
{
ImGui.Text("This is the Cucumber tab!\nblah blah blah blah blah");
ImGui.EndTabItem();
}
ImGui.EndTabBar();
}
ImGui.Separator();
ImGui.TreePop();
}
if (ImGui.TreeNode("Advanced & Close Button"))
{
if (flags_tabs_first_run)
{
ImGuiTabBarFlags _tab_bar_flags = ImGuiTabBarFlags.Reorderable;
tab_bar_flags = (uint)_tab_bar_flags;
flags_tabs_first_run = false;
}
ImGui.CheckboxFlags("ImGuiTabBarFlags_Reorderable", ref tab_bar_flags, (uint)ImGuiTabBarFlags.Reorderable);
ImGui.CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", ref tab_bar_flags, (uint)ImGuiTabBarFlags.AutoSelectNewTabs);
ImGui.CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", ref tab_bar_flags, (uint)ImGuiTabBarFlags.TabListPopupButton);
ImGui.CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", ref tab_bar_flags, (uint)ImGuiTabBarFlags.NoCloseWithMiddleMouseButton);
if ((tab_bar_flags & (uint)ImGuiTabBarFlags.FittingPolicyMask) == 0)
{
tab_bar_flags |= (uint)ImGuiTabBarFlags.FittingPolicyDefault;
}
if (ImGui.CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", ref tab_bar_flags, (uint)ImGuiTabBarFlags.FittingPolicyResizeDown))
{
tab_bar_flags &= ~((uint)ImGuiTabBarFlags.FittingPolicyMask ^ (uint)ImGuiTabBarFlags.FittingPolicyResizeDown);
}
if (ImGui.CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", ref tab_bar_flags, (uint)ImGuiTabBarFlags.FittingPolicyScroll))
{
tab_bar_flags &= ~((uint)ImGuiTabBarFlags.FittingPolicyMask ^ (uint)ImGuiTabBarFlags.FittingPolicyScroll);
}
string[] names = { "Artichoke", "Beetroot", "Celery", "Daikon" };
for (int n = 0; n < opened.Length; n++)
{
if (n > 0) { ImGui.SameLine(); }
ImGui.Checkbox(names[n], ref opened[n]);
}
ImGuiTabBarFlags tab_bar_flags_tb = (ImGuiTabBarFlags)tab_bar_flags;
if (ImGui.BeginTabBar("MyTabBar", tab_bar_flags_tb))
{
for (int n = 0; n < opened.Length; n++)
{
if (opened[n] && ImGui.BeginTabItem(names[n], ref opened[n], ImGuiTabItemFlags.None))
{
ImGui.Text(string.Format("This is the {0} tab!", names[n]));
if (n == 1 || n == 3)
{
ImGui.Text("I am an odd tab.");
}
ImGui.EndTabItem();
}
}
ImGui.EndTabBar();
}
ImGui.Separator();
ImGui.TreePop();
}
ImGui.TreePop();
}
#endregion
//Plots Widgets
#region Plot Widgets
if (ImGui.TreeNode("Plots Widgets"))
{
ImGui.Checkbox("Animate", ref animate);
float[] arr = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
ImGui.PlotLines("Frame Times", ref arr[0], arr.Length);
if (!animate || refresh_time == 0.0)
{
refresh_time = ImGui.GetTime();
}
while (refresh_time < ImGui.GetTime())
{
values[values_offset] = (float)Math.Cos(phase);
values_offset = (values_offset + 1) % values.Length;
phase += 0.10f * values_offset;
refresh_time += 1.0f / 60.0f;
}
float average = 0.0f;
for (int n = 0; n < values.Length; n++)
{
average += values[n];
}
average /= (float)values.Length;
string overlay = string.Format("avg {0}", average);
ImGui.PlotLines("Lines", ref values[0], values.Length, values_offset, overlay, -1.0f, 1.0f, new Vec2(0, 80.0f));
ImGui.PlotHistogram("Histogram", ref arr[0], arr.Length, 0, null, 0.0f, 1.0f, new Vec2(0, 80.0f));
ImGui.Separator();
if (animate)
{
progress += progress_dir * 0.4f * ImGui.GetIO().DeltaTime;
if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }
if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
}
ImGui.ProgressBar(progress, new Vec2(0.0f, 0.0f));
ImGui.SameLine(0.0f, ImGui.GetStyle().ItemInnerSpacing.X);
ImGui.Text("Progress Bar");
float progress_saturated = progress; //IM_CLAMP(progress, 0.0f, 1.0f) ?
string buf = string.Format("{0}/{1}", (int)(progress_saturated * 1753), 1753);
ImGui.ProgressBar(progress, new Vec2(0.0f, 0.0f), buf);
ImGui.TreePop();
}
#endregion
//Color Widgets
#region Color Widgets
if (ImGui.TreeNode("Color/Picker Widgets"))
{
ImGui.Checkbox("With Alpha Preview", ref alpha_preview);
ImGui.Checkbox("With Half Alpha Preview", ref alpha_half_preview);
ImGui.Checkbox("With Drag and Drop", ref drag_and_drop);
ImGui.Checkbox("With Options Menu", ref options_menu); ImGui.SameLine(); HelpMarker("Right-click on the individual color widget to show options.");
ImGui.Checkbox("With HDR", ref hdr); ImGui.SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets.");
ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags.HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags.NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags.AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags.AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags.NoOptions);
ImGui.Text("Color widget:");
ImGui.SameLine(); HelpMarker(
"Click on the color square to open a color picker.\n" +
"CTRL+click on individual component to input value.\n");
ImGui.ColorEdit3("MyColor##1", ref color_vec3, misc_flags);
ImGui.Text("Color widget HSV with Alpha:");
ImGui.ColorEdit4("MyColor##2", ref color_vec4, ImGuiColorEditFlags.DisplayHSV | misc_flags);
ImGui.Text("Color widget with Float Display:");
ImGui.ColorEdit4("MyColor##2f", ref color_vec4, ImGuiColorEditFlags.Float | misc_flags);
ImGui.Text("Color button with Picker:");
ImGui.SameLine();
HelpMarker("With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n" +
"With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only " +
"be used for the tooltip and picker popup.");
ImGui.ColorEdit4("MyColor##3", ref color_vec4, ImGuiColorEditFlags.NoInputs | ImGuiColorEditFlags.NoLabel | misc_flags);
ImGui.Text("Color button only:");
ImGui.ColorButton("MyColor##3c", color_vec4, misc_flags, new Vec2(80, 80));
ImGui.Text("Color picker:");
ImGui.Checkbox("With Alpha", ref alpha);
ImGui.Checkbox("With Alpha Bar", ref alpha_bar);
ImGui.Checkbox("With Side Preview", ref side_preview);
if (side_preview)
{
ImGui.SameLine();
ImGui.Checkbox("With Ref Color", ref ref_color);
if (ref_color)
{
ImGui.SameLine();
ImGui.ColorEdit4("##RefColor", ref ref_color_v, ImGuiColorEditFlags.NoInputs | misc_flags);
}
}
ImGui.Combo("Display Mode", ref display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0");
ImGui.SameLine();
HelpMarker(
"ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, " +
"but the user can change it with a right-click.\n\nColorPicker defaults to displaying RGB+HSV+Hex " +
"if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions().");
ImGui.Combo("Picker Mode", ref picker_mode, "Auto/Current\0Hue bar + SV rect\0Hue wheel + SV triangle\0");
ImGui.SameLine(); HelpMarker("User can right-click the picker to change mode.");
ImGuiColorEditFlags flags = misc_flags;
if (!alpha) { flags |= ImGuiColorEditFlags.NoAlpha; }
if (alpha_bar) { flags |= ImGuiColorEditFlags.AlphaBar; }
if (!side_preview) { flags |= ImGuiColorEditFlags.NoSidePreview; }
if (picker_mode == 1) { flags |= ImGuiColorEditFlags.PickerHueBar; }
if (picker_mode == 2) { flags |= ImGuiColorEditFlags.PickerHueWheel; }
if (display_mode == 1) { flags |= ImGuiColorEditFlags.NoInputs; }
if (display_mode == 2) { flags |= ImGuiColorEditFlags.DisplayRGB; }
if (display_mode == 3) { flags |= ImGuiColorEditFlags.DisplayHSV; }
if (display_mode == 4) { flags |= ImGuiColorEditFlags.DisplayHex; }
ImGui.ColorPicker4("MyColor##4", ref color_vec4, flags, ref ref_color_v.X); // ref_color ? ref_color_v.X : null);
ImGui.Text("Set defaults in code:");
ImGui.SameLine(); HelpMarker("SetColorEditOptions() is designed to allow you to set boot-time default.\n" +
"We don't have Push/Pop functions because you can force options on a per-widget basis if needed," +
"and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid" +
"encouraging you to persistently save values that aren't forward-compatible.");
if (ImGui.Button("Default: Uint8 + HSV + Hue Bar"))
{
ImGui.SetColorEditOptions(ImGuiColorEditFlags.Uint8 | ImGuiColorEditFlags.DisplayHSV | ImGuiColorEditFlags.PickerHueBar);
}
if (ImGui.Button("Default: Float + HDR + Hue Wheel"))
{
ImGui.SetColorEditOptions(ImGuiColorEditFlags.Float | ImGuiColorEditFlags.HDR | ImGuiColorEditFlags.PickerHueWheel);
}
// HSV
ImGui.Spacing();
ImGui.Text("HSV encoded colors");
ImGui.SameLine(); HelpMarker("By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV" +
"allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the" +
"added benefit that you can manipulate hue values with the picker even when saturation or value are zero.");
ImGui.Text("Color widget with InputHSV:");
ImGui.ColorEdit4("HSV shown as RGB##1", ref color_hsv, ImGuiColorEditFlags.DisplayRGB | ImGuiColorEditFlags.InputHSV | ImGuiColorEditFlags.Float);
ImGui.ColorEdit4("HSV shown as HSV##1", ref color_hsv, ImGuiColorEditFlags.DisplayHSV | ImGuiColorEditFlags.InputHSV | ImGuiColorEditFlags.Float);
ImGui.DragFloat4("Raw HSV values", ref color_hsv, 0.01f, 0.0f, 1.0f);
ImGui.TreePop();
}
#endregion
//Range & Multi Widgets
# region Range & Multi Widgets
if (ImGui.TreeNode("Range Widgets"))
{
ImGui.DragFloatRange2("range float", ref begin, ref end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%");
ImGui.DragIntRange2("range int", ref begin_i, ref end_i, 5, 0, 1000, "Min: %d units", "Max: %d units");
ImGui.DragIntRange2("range int (no bounds)", ref begin_i, ref end_i, 5, 0, 0, "Min: %d units", "Max: %d units");
ImGui.TreePop();
}
if (ImGui.TreeNode("Multi-component Widgets"))
{
ImGui.InputFloat2("input float2", ref vec2f);
ImGui.DragFloat2("drag float2", ref vec2f, 0.01f, 0.0f, 1.0f);
ImGui.SliderFloat2("slider float2", ref vec2f, 0.0f, 1.0f);
ImGui.InputInt2("input int2", ref vec4i[0]);
ImGui.DragInt2("drag int2", ref vec4i[0], 1, 0, 255);
ImGui.SliderInt2("slider int2", ref vec4i[0], 0, 255);
ImGui.Spacing();
ImGui.InputFloat3("input float3", ref vec3f);
ImGui.DragFloat3("drag float3", ref vec3f, 0.01f, 0.0f, 1.0f);
ImGui.SliderFloat3("slider float3", ref vec3f, 0.0f, 1.0f);
ImGui.InputInt3("input int3", ref vec4i[0]);
ImGui.DragInt3("drag int3", ref vec4i[0], 1, 0, 255);
ImGui.SliderInt3("slider int3", ref vec4i[0], 0, 255);
ImGui.Spacing();
ImGui.InputFloat4("input float4", ref vec4f);
ImGui.DragFloat4("drag float4", ref vec4f);
ImGui.SliderFloat4("slider float4", ref vec4f, 0.0f, 1.0f);
ImGui.InputInt4("input int4", ref vec4i[0]);
ImGui.DragInt4("drag int4", ref vec4i[0], 1, 0, 255);
ImGui.SliderInt4("slider int4", ref vec4i[0], 0, 255);
ImGui.TreePop();
}
#endregion
//Vertical Sliders
#region Vertical Sliders
if (ImGui.TreeNode("Vertical Sliders"))
{
ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, new Vec2(spacing, spacing));
ImGui.VSliderInt("##int", new Vec2(18, 160), ref int_value, 0, 5);
ImGui.SameLine();
ImGui.PushID("set1");
for (int i = 0; i < 7; i++)
{
if (i > 0)
{
ImGui.SameLine();
}
ImGui.PushID(i);
ImGui.ColorConvertHSVtoRGB(i / 7.0f, 0.5f, 0.5f, out col_red, out col_green, out col_blue);
Vec4 col_slider = new Vec4(col_red, col_green, col_blue, 1.0f);
ImGui.ColorConvertHSVtoRGB(i / 7.0f, 0.6f, 0.5f, out col_red, out col_green, out col_blue);
Vec4 col_slider_hov = new Vec4(col_red, col_green, col_blue, 1.0f);
ImGui.ColorConvertHSVtoRGB(i / 7.0f, 0.7f, 0.5f, out col_red, out col_green, out col_blue);
Vec4 col_slider_act = new Vec4(col_red, col_green, col_blue, 1.0f);
ImGui.ColorConvertHSVtoRGB(i / 7.0f, 0.9f, 0.9f, out col_red, out col_green, out col_blue);
Vec4 col_slider_grab = new Vec4(col_red, col_green, col_blue, 1.0f);
ImGui.PushStyleColor(ImGuiCol.FrameBg, col_slider);
ImGui.PushStyleColor(ImGuiCol.FrameBgHovered, col_slider_hov);
ImGui.PushStyleColor(ImGuiCol.FrameBgActive, col_slider_act);
ImGui.PushStyleColor(ImGuiCol.SliderGrab, col_slider_grab);
ImGui.VSliderFloat("##v", new Vec2(18, 160), ref values_vert[i], 0.0f, 1.0f, "");
if (ImGui.IsAnyItemActive() || ImGui.IsItemHovered())
{
ImGui.SetTooltip(values_vert[i].ToString());
}
ImGui.PopStyleColor(4);
ImGui.PopID();
}
ImGui.PopID();
ImGui.SameLine();
ImGui.PushID("set2");
int rows = 3;
Vec2 small_slider_size = new Vec2(18, 50);//(float)(int)((160.0f - (rows - 1) * spacing / rows)));
for (int nx = 0; nx < 4; nx++)
{
if (nx > 0) { ImGui.SameLine(); }
ImGui.BeginGroup();
for (int ny = 0; ny < rows; ny++)
{
ImGui.PushID(nx * rows + ny);
ImGui.VSliderFloat("##v", small_slider_size, ref values2[nx], 0.0f, 1.0f, "");
if (ImGui.IsItemActive() || ImGui.IsItemHovered())
{
ImGui.SetTooltip(values2[nx].ToString());
}
ImGui.PopID();
}
ImGui.EndGroup();
}
ImGui.PopID();
ImGui.SameLine();
ImGui.PushID("set3");
for (int i = 0; i < 4; i++)
{
if (i > 0)
{
ImGui.SameLine();
}
ImGui.PushID(i);
ImGui.PushStyleVar(ImGuiStyleVar.GrabMinSize, 40);
ImGui.VSliderFloat("##v", new Vec2(40, 160), ref values_vert[i], 0.0f, 1.0f, "%.2f\nsec");
ImGui.PopStyleVar();
ImGui.PopID();
}
ImGui.PopID();
ImGui.PopStyleVar();
ImGui.TreePop();
}
#endregion
}
#region DemoWindowLayoutVariables
//Child windows
bool disable_mouse_wheel = false;
bool disable_menu = false;
int offset_x = 0;
//Widgets Width
float f = 0.0f;
bool show_indented_items = true;
//Basic Horizontal Layout
bool c1 = false;
bool c2 = false;
bool c3 = false;
bool c4 = false;
float bf0 = 1.0f;
float bf1 = 2.0f;
float bf2 = 3.0f;
string[] items = { "AAAA", "BBBB", "CCCC", "DDDD" };
int item = -1;
int[] bselection = { 0, 1, 2, 3 };
//Scrolling
int track_item = 50;
bool enable_track = true;
bool enable_extra_decorations = false;
float scroll_to_off_px = 0.0f;
float scroll_to_pos_px = 200.0f;
#endregion
private void DemoWindowLayout()
{
if (!ImGui.CollapsingHeader("Layout & Scrolling"))
{
return;
}
//Child windows
#region Child windows
if (ImGui.TreeNode("Child windows"))
{
HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window.");
ImGui.Checkbox("Disable Mouse Wheel", ref disable_mouse_wheel);
ImGui.Checkbox("Disable Menu", ref disable_menu);
//child 1
ImGuiWindowFlags window_flags = ImGuiWindowFlags.HorizontalScrollbar;
if (disable_mouse_wheel)
{
window_flags |= ImGuiWindowFlags.NoScrollWithMouse;
}
Vec2 content_region_max;
ImGui.BeginChild("ChildL", new Vec2(ImGui.GetWindowContentRegionMax().X * 0.5f, 260), ImGuiChildFlags.Border, window_flags);
for (int i = 0; i < 100; i++)
{
ImGui.Text(string.Format("{0}: scrollable region", i.ToString("D4")));
}
ImGui.EndChild();
ImGui.SameLine();
//child 2
ImGuiWindowFlags window_flags_child2 = ImGuiWindowFlags.None;
if (disable_mouse_wheel)
{
window_flags_child2 |= ImGuiWindowFlags.NoScrollWithMouse;
}
if (!disable_menu)
{
window_flags_child2 |= ImGuiWindowFlags.MenuBar;
}
ImGui.PushStyleVar(ImGuiStyleVar.ChildRounding, 5.0f);
ImGui.BeginChild("ChildR", new Vec2(0, 260), ImGuiChildFlags.Border, window_flags_child2);
if (!disable_menu && ImGui.BeginMenuBar())
{
if (ImGui.BeginMenu("Menu"))
{
ShowExampleMenuFile();
ImGui.EndMenu();
}
ImGui.EndMenuBar();
}
for (int i = 0; i < 100; i++)
{
ImGui.Button(i.ToString("D3"));
if ((i % 2) == 0)
{
ImGui.SameLine();
}
}
ImGui.EndChild();
ImGui.PopStyleVar();
ImGui.Separator();
ImGui.SetNextItemWidth(100);
ImGui.DragInt("Offset X", ref offset_x, 1.0f, -1000, 1000);
ImGui.SetCursorPosX(ImGui.GetCursorPosX() + (float)offset_x);
Vec4 colv4 = new Vec4(255.0f, 0.0f, 0.0f, 100.0f);
ImGui.PushStyleColor(ImGuiCol.ChildBg, ImGui.ColorConvertFloat4ToU32(colv4));
ImGui.BeginChild("Red", new Vec2(200, 100), ImGuiChildFlags.Border, ImGuiWindowFlags.None);
for (int n = 0; n < 50; n++)
{
ImGui.Text("Some test " + n.ToString());
}
ImGui.EndChild();
bool child_is_hovered = ImGui.IsItemHovered();
Vec2 child_rect_min = ImGui.GetItemRectMin();
Vec2 child_rect_max = ImGui.GetItemRectMax();
ImGui.PopStyleColor();
ImGui.Text("Hovered: " + child_is_hovered.ToString());
ImGui.Text(string.Format("Rect of child window is: ({0},{1}) ({2},{3})", child_rect_min.X, child_rect_min.Y, child_rect_max.X, child_rect_max.Y));
ImGui.TreePop();
}
#endregion
//Widgets Width
#region Widgets Width
if (ImGui.TreeNode("Widgets Width"))
{
ImGui.Checkbox("Show intended items", ref show_indented_items);
ImGui.Text("SetNextItemWidth/PushItemWidth(100)");
ImGui.SameLine(); HelpMarker("Fixed width.");
ImGui.PushItemWidth(100);
ImGui.DragFloat("float##1b", ref f);
if (show_indented_items)
{
ImGui.Indent();
ImGui.DragFloat("float (intended)##1b", ref f);
ImGui.Unindent();
}
ImGui.PopItemWidth();
ImGui.Text("SetNextItemWidth/PushItemWidth(-100)");
ImGui.SameLine(); HelpMarker("Align to right edge minus 100");
ImGui.PushItemWidth(-100);
ImGui.DragFloat("float##2a", ref f);
if (show_indented_items)
{
ImGui.Indent();
ImGui.DragFloat("float (indented)##2b", ref f);
ImGui.Unindent();
}
ImGui.PopItemWidth();
ImGui.Text("SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)");
ImGui.SameLine(); HelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)");
ImGui.PushItemWidth(ImGui.GetContentRegionAvail().X * 0.5f);
ImGui.DragFloat("float##3a", ref f);
if (show_indented_items)
{
ImGui.Indent();
ImGui.DragFloat("float (indented)##3b", ref f);
ImGui.Unindent();
}
ImGui.PopItemWidth();
ImGui.Text("SetNextItemWidth/PushItemWidth(-GetContentRegionAvail().x * 0.5f)");
ImGui.SameLine(); HelpMarker("Align to right edge minus half");
ImGui.PushItemWidth(-ImGui.GetContentRegionAvail().X * 0.5f);
ImGui.DragFloat("float##4a", ref f);
if (show_indented_items)
{
ImGui.Indent();
ImGui.DragFloat("float (indented)##4b", ref f);
ImGui.Unindent();
}
ImGui.PopItemWidth();
ImGui.TreePop();
}
#endregion
//Basic Horizontal Layout
#region Basic Horizontal Layout
if (ImGui.TreeNode("Basic Horizontal Layout"))
{
ImGui.TextWrapped("(Use ImGui.SameLine() to keep adding items to the right of the preceding item)");
// Text
ImGui.Text("Two items: Hello"); ImGui.SameLine();
ImGui.TextColored(new Vec4(1, 1, 0, 1), "Sailor");
// Adjust spacing
ImGui.Text("More spacing: Hello"); ImGui.SameLine(0, 20);
ImGui.TextColored(new Vec4(1, 1, 0, 1), "Sailor");
// Button
ImGui.AlignTextToFramePadding();
ImGui.Text("Normal buttons"); ImGui.SameLine();
ImGui.Button("Banana"); ImGui.SameLine();
ImGui.Button("Apple"); ImGui.SameLine();
ImGui.Button("Corniflower");
// Button
ImGui.Text("Small buttons"); ImGui.SameLine();
ImGui.SmallButton("Like this one"); ImGui.SameLine();
ImGui.Text("can fit within a text block.");
// Aligned to arbitrary position. Easy/cheap column.
ImGui.Text("Aligned");
ImGui.SameLine(150); ImGui.Text("x=150");
ImGui.SameLine(300); ImGui.Text("x=300");
ImGui.Text("Aligned");
ImGui.SameLine(150); ImGui.SmallButton("x=150");
ImGui.SameLine(300); ImGui.SmallButton("x=300");
// Checkbox
ImGui.Checkbox("My", ref c1); ImGui.SameLine();
ImGui.Checkbox("Tailor", ref c2); ImGui.SameLine();
ImGui.Checkbox("Is", ref c3); ImGui.SameLine();
ImGui.Checkbox("Rich", ref c4);
// Various
ImGui.PushItemWidth(80);
ImGui.Combo("Combo", ref item, items, items.Length); ImGui.SameLine();
ImGui.SliderFloat("X", ref bf0, 0.0f, 5.0f); ImGui.SameLine();
ImGui.SliderFloat("Y", ref bf1, 0.0f, 5.0f); ImGui.SameLine();
ImGui.SliderFloat("Z", ref bf2, 0.0f, 5.0f);
ImGui.PopItemWidth();
ImGui.PushItemWidth(80);
ImGui.Text("Lists:");
for (int i = 0; i < 4; i++)
{
if (i > 0) ImGui.SameLine();
ImGui.PushID(i);
ImGui.ListBox("", ref bselection[i], items, items.Length);
ImGui.PopID();
}
ImGui.PopItemWidth();
// Dummy
Vec2 button_sz = new Vec2(40, 40);
ImGui.Button("A", button_sz); ImGui.SameLine();
ImGui.Dummy(button_sz); ImGui.SameLine();
ImGui.Button("B", button_sz);
// Manually wrapping
// (we should eventually provide this as an automatic layout feature, but for now you can do it manually)
ImGui.Text("Manually wrapping:");
int buttons_count = 20;
float window_visible_x2 = ImGui.GetWindowPos().X + ImGui.GetWindowContentRegionMax().X;
for (int n = 0; n < buttons_count; n++)
{
ImGui.PushID(n);
ImGui.Button("Box", button_sz);
float last_button_x2 = ImGui.GetItemRectMax().X;
float next_button_x2 = last_button_x2 + 1.0f + button_sz.X; // Expected position if next button was on same line
if (n + 1 < buttons_count && next_button_x2 < window_visible_x2)
{
ImGui.SameLine();
}
ImGui.PopID();
}
ImGui.TreePop();
}
#endregion
//Groups
#region Groups
if (ImGui.TreeNode("Groups"))
{
HelpMarker("BeginGroup() basically locks the horizontal position for new line. " +
"EndGroup() bundles the whole group so that you can use \"item\" functions such as " +
"IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group.");
ImGui.BeginGroup();
{
ImGui.BeginGroup();
ImGui.Button("AAA");
ImGui.SameLine();
ImGui.Button("BBB");
ImGui.SameLine();
ImGui.BeginGroup();
ImGui.Button("CCC");
ImGui.Button("DDD");
ImGui.EndGroup();
ImGui.SameLine();
ImGui.Button("EEE");
ImGui.EndGroup();
if (ImGui.IsItemHovered())
{
ImGui.SetTooltip("First group hovered");
}
}
// Capture the group size and create widgets using the same size
Vec2 size = ImGui.GetItemRectSize();
float[] values = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f };
ImGui.PlotHistogram("##values", ref values[0], values.Length, 0, null, 0.0f, 1.0f, size);
ImGui.Button("ACTION", new Vec2((size.X - ImGui.GetStyle().ItemSpacing.X) * 0.5f, size.Y));
ImGui.SameLine();
ImGui.Button("REACTION", new Vec2((size.X - ImGui.GetStyle().ItemSpacing.X) * 0.5f, size.Y));
ImGui.EndGroup();
// This breaks tree node
//ImGui.SameLine();
//ImGui.Button("LEVERAGE\nBUZZWORD", size);
//ImGui.SameLine();
ImGui.TreePop();
}
#endregion
//Text Baseline Alignment
#region Text Baseline Alignment
if (ImGui.TreeNode("Text Baseline Alignment"))
{
ImGui.BulletText("Text baseline:");
ImGui.SameLine();
HelpMarker("This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. " +
"Lines only composed of text or \"small\" widgets use less vertical space than lines with framed widgets.");
ImGui.Indent();
ImGui.Text("KO Blahblah"); ImGui.SameLine();
ImGui.Button("Some framed item"); ImGui.SameLine();
HelpMarker("Baseline of button will look misaligned with text..");
ImGui.AlignTextToFramePadding();
ImGui.Text("OK Blahblah"); ImGui.SameLine();
ImGui.Button("Some framed item"); ImGui.SameLine();
HelpMarker("We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y");
// SmallButton() uses the same vertical padding as Text
ImGui.Button("TEST##1"); ImGui.SameLine();
ImGui.Text("TEST"); ImGui.SameLine();
ImGui.SmallButton("TEST##2");
// If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets.
ImGui.AlignTextToFramePadding();
ImGui.Text("Text aligned to framed item"); ImGui.SameLine();
ImGui.Button("Item##1"); ImGui.SameLine();
ImGui.Text("Item"); ImGui.SameLine();
ImGui.SmallButton("Item##2"); ImGui.SameLine();
ImGui.Button("Item##3");
ImGui.Unindent();
ImGui.Spacing();
ImGui.BulletText("Multi-line text:");
ImGui.Indent();
ImGui.Text("One\nTwo\nThree"); ImGui.SameLine();
ImGui.Text("Hello\nWorld"); ImGui.SameLine();
ImGui.Text("Banana");
ImGui.Text("Banana"); ImGui.SameLine();
ImGui.Text("Hello\nWorld"); ImGui.SameLine();
ImGui.Text("One\nTwo\nThree");
ImGui.Button("HOP##1"); ImGui.SameLine();
ImGui.Text("Banana"); ImGui.SameLine();
ImGui.Text("Hello\nWorld"); ImGui.SameLine();
ImGui.Text("Banana");
ImGui.Button("HOP##2"); ImGui.SameLine();
ImGui.Text("Hello\nWorld"); ImGui.SameLine();
ImGui.Text("Banana");
ImGui.Unindent();
ImGui.Spacing();
ImGui.BulletText("Misc items:");
ImGui.Indent();
// SmallButton() sets FramePadding to zero. Text baseline is aligned to match baseline of previous Button.
ImGui.Button("80x80", new Vec2(80, 80));
ImGui.SameLine();
ImGui.Button("50x50", new Vec2(50, 50));
ImGui.SameLine();
ImGui.Button("Button()");
ImGui.SameLine();
ImGui.SmallButton("SmallButton()");
// Tree
float spacing = ImGui.GetStyle().ItemInnerSpacing.X;
ImGui.Button("Button##1");
ImGui.SameLine(0.0f, spacing);
if (ImGui.TreeNode("Node##1"))
{
// Placeholder tree data
for (int i = 0; i < 6; i++)
ImGui.BulletText(string.Format("Item {0}..", i));
ImGui.TreePop();
}
// Vertically align text node a bit lower so it'll be vertically centered with upcoming widget.
// Otherwise you can use SmallButton() (smaller fit).
ImGui.AlignTextToFramePadding();
// Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add
// other contents below the node.
bool node_open = ImGui.TreeNode("Node##2");
ImGui.SameLine(0.0f, spacing); ImGui.Button("Button##2");
if (node_open)
{
// Placeholder tree data
for (int i = 0; i < 6; i++)
ImGui.BulletText(string.Format("Item {0}..", i));
ImGui.TreePop();
}
// Bullet
ImGui.Button("Button##3");
ImGui.SameLine(0.0f, spacing);
ImGui.BulletText("Bullet text");
ImGui.AlignTextToFramePadding();
ImGui.BulletText("Node");
ImGui.SameLine(0.0f, spacing); ImGui.Button("Button##4");
ImGui.Unindent();
ImGui.TreePop();
}
#endregion
//Scrolling
#region Scrolling
if (ImGui.TreeNode("Scrolling"))
{
//vertical
HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position.");
ImGui.Checkbox("Decoration", ref enable_extra_decorations);
ImGui.Checkbox("Track", ref enable_track);
ImGui.PushItemWidth(100);
ImGui.SameLine(140); enable_track |= ImGui.DragInt("##item", ref track_item, 0.25f, 0, 99, "Item = %d");
bool scroll_to_off = ImGui.Button("Scroll Offset");
ImGui.SameLine(140); scroll_to_off |= ImGui.DragFloat("##off", ref scroll_to_off_px, 1.00f, 0, 100.0f, "+%.0f px");
bool scroll_to_pos = ImGui.Button("Scroll To Pos");
ImGui.SameLine(140); scroll_to_pos |= ImGui.DragFloat("##pos", ref scroll_to_pos_px, 1.00f, -10, 100.0f, "X/Y = %.0f px");
ImGui.PopItemWidth();
if (scroll_to_off || scroll_to_pos)
{
enable_track = false;
}
float child_w = (ImGui.GetContentRegionAvail().X - 4 * 1.0f) / 5;
if (child_w < 1.0f)
{
child_w = 1.0f;
}
ImGui.PushID("##VerticalScrolling");
for (int i = 0; i < 5; i++)
{
if (i > 0) { ImGui.SameLine(); }
ImGui.BeginGroup();
string[] names = { "Top", "25%", "Center", "75%", "Bottom" };
ImGui.TextUnformatted(names[i]);
ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags.MenuBar : 0;
string child_id = names[i];
bool child_is_visible = ImGui.BeginChild(child_id, new Vec2(child_w, 200.0f), ImGuiChildFlags.Border, child_flags);
if (ImGui.BeginMenuBar())
{
ImGui.TextUnformatted("abc");
ImGui.EndMenuBar();
}
if (scroll_to_off)
{
ImGui.SetScrollY(scroll_to_off_px);
}
if (scroll_to_pos)
{
ImGui.SetScrollFromPosY(ImGui.GetCursorStartPos().Y + scroll_to_pos_px, i * 0.25f);
}
if (child_is_visible)
{
for (int item = 0; item < 100; item++)
{
if (enable_track && item == track_item)
{
ImGui.TextColored(new Vec4(1, 1, 0, 1), "Item " + item);
ImGui.SetScrollHereY(i * 0.25f);
}
else
{
ImGui.Text("Item " + item);
}
}
}
float scroll_y = ImGui.GetScrollY();
float scroll_max_y = ImGui.GetScrollMaxY();
ImGui.EndChild();
ImGui.Text(scroll_y + "/" + scroll_max_y);
ImGui.EndGroup();
}
ImGui.PopID();
//horizontal
ImGui.Spacing();
HelpMarker("Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\n" +
"Because the clipping rectangle of most window hides half worth of WindowPadding on the " +
"left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the " +
"equivalent SetScrollFromPosY(+1) wouldn't.");
ImGui.PushID("##HorizontalScrolling");
for (int i = 0; i < 5; i++)
{
float child_height = ImGui.GetTextLineHeight() + 30.0f;
ImGuiWindowFlags child_flags = ImGuiWindowFlags.HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags.AlwaysVerticalScrollbar : 0);
string[] names = { "Left", "25%", "Center", "75%", "Right" };
string child_id = names[i];
bool child_is_visible = ImGui.BeginChild(child_id, new Vec2(-100, child_height), ImGuiChildFlags.Border, child_flags);
if (scroll_to_off)
{
ImGui.SetScrollX(scroll_to_off_px);
}
if (scroll_to_pos)
{
ImGui.SetScrollFromPosX(ImGui.GetCursorStartPos().X + scroll_to_pos_px, i * 0.25f);
}
if (child_is_visible)
{
for (int item = 0; item < 100; item++)
{
if (enable_track && item == track_item)
{
ImGui.TextColored(new Vec4(1, 1, 0, 1), "Item " + item);
ImGui.SetScrollHereX(i * 0.25f);
}
else
{
ImGui.Text("Item " + item);
}
ImGui.SameLine();
}
}
float scroll_x = ImGui.GetScrollX();
float scroll_max_x = ImGui.GetScrollMaxX();
ImGui.EndChild();
ImGui.SameLine();
ImGui.Text(string.Format("{0}\n{1}/{2}", names[i], scroll_x, scroll_max_x));
ImGui.Spacing();
}
ImGui.TreePop();
}
#endregion
}
#region DemoWindowPopupsVariables
//Popups
int selected_fish = -1;
bool[] toggles = { true, false, false, false, false };
//Context menus
float value = 0.5f;
string name = "Label1";
//Modals
bool show = false;
bool show_stacked = false;
bool dont_ask_me_next_time = false;
int item_mod = 1;
Vec4 color = new Vec4(0.4f, 0.7f, 0.0f, 0.5f);
#endregion
private void DemoWindowPopups()
{
if (!ImGui.CollapsingHeader("Popups & Modal windows"))
{
return;
}
//Popups
#region Popups
if (ImGui.TreeNode("Popups"))
{
ImGui.TextWrapped("When a popup is active, it inhibits interacting with windows that are behind the popup. " +
"Clicking outside the popup closes it.");
string[] names = { "Bream", "Haddock", "Mackerel", "Pollock", "Tilefish" };
if (ImGui.Button("Select.."))
{
ImGui.OpenPopup("my_select_popup");
}
ImGui.SameLine();
ImGui.TextUnformatted(selected_fish == -1 ? "" : names[selected_fish]);
if (ImGui.BeginPopup("my_select_popup"))
{
ImGui.Text("Aquarium");
ImGui.Separator();
for (int i = 0; i < names.Length; i++)
{
if (ImGui.Selectable(names[i]))
{
selected_fish = i;
}
}
ImGui.EndPopup();
}
//menu with toggles
if (ImGui.Button("Toggle.."))
{
ImGui.OpenPopup("my_toggle_popup");
}
if (ImGui.BeginPopup("my_toggle_popup"))
{
for (int i = 0; i < names.Length; i++)
{
ImGui.MenuItem(names[i], "", ref toggles[i]);
}
if (ImGui.BeginMenu("Sub-menu"))
{
ImGui.MenuItem("Click me");
ImGui.EndMenu();
}
ImGui.Separator();
ImGui.Text("Tooltip here");
if (ImGui.IsItemHovered())
{
ImGui.SetTooltip("I am a tooltip over a popup");
}
if (ImGui.Button("Stacked Popup"))
{
ImGui.OpenPopup("another popup");
}
if (ImGui.BeginPopup("another popup"))
{
for (int i = 0; i < names.Length; i++)
{
ImGui.MenuItem(names[i], "", ref toggles[i]);
}
if (ImGui.BeginMenu("Sub-menu"))
{
ImGui.MenuItem("Click me");
if (ImGui.Button("Stacked Popup"))
{
ImGui.OpenPopup("another popup");
}
if (ImGui.BeginPopup("another popup"))
{
ImGui.Text("I am the last one here.");
ImGui.EndPopup();
}
ImGui.EndMenu();
}
ImGui.EndPopup();
}
ImGui.EndPopup();
}
if (ImGui.Button("File Menu.."))
{
ImGui.OpenPopup("my_file_popup");
}
if (ImGui.BeginPopup("my_file_popup"))
{
ShowExampleMenuFile();
ImGui.EndPopup();
}
ImGui.TreePop();
}
#endregion
//Context menus
#region Context menus
if (ImGui.TreeNode("Context menus"))
{
ImGui.Text(string.Format("Value = {0} (<-- right-click here)", value));
if (ImGui.BeginPopupContextItem("item context menu"))
{
if (ImGui.Selectable("Set to zero")) { value = 0.0f; }
if (ImGui.Selectable("Set to PI")) { value = 3.1415f; }
ImGui.SetNextItemWidth(-1.0f);
ImGui.DragFloat("##Value", ref value, 0.1f, 0.0f, 0.0f);
ImGui.EndPopup();
}
ImGui.Text("(You can also right-click me to open the same popup as above.)");
ImGui.OpenPopupOnItemClick("item context menu", ImGuiPopupFlags.MouseButtonRight);
ImGui.Button(string.Format("Button: {0}###Button", name));
if (ImGui.BeginPopupContextItem())
{
ImGui.Text("Edit name:");
ImGui.InputText("##edit", ref name, 100);
if (ImGui.Button("Close"))
{
ImGui.CloseCurrentPopup();
}
ImGui.EndPopup();
}
ImGui.SameLine(); ImGui.Text("(<-- right-click here)");
ImGui.TreePop();
}
#endregion
//Modals
#region Modals
if (ImGui.TreeNode("Modals"))
{
ImGui.TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside.");
if (ImGui.Button("Delete.."))
{
ImGui.OpenPopup("Delete?");
show = true;
}
Vec2 center = new Vec2(400, 400);
ImGui.SetNextWindowPos(center, ImGuiCond.Appearing, new Vec2(0.5f, 0.5f));
if (ImGui.BeginPopupModal("Delete?", ref show, ImGuiWindowFlags.AlwaysAutoResize))
{
ImGui.Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n");
ImGui.Separator();
ImGui.PushStyleVar(ImGuiStyleVar.FramePadding, new Vec2(0, 0));
ImGui.Checkbox("Don't ask me next time", ref dont_ask_me_next_time);
ImGui.PopStyleVar();
if (ImGui.Button("OK", new Vec2(120, 0))) { ImGui.CloseCurrentPopup(); }
ImGui.SetItemDefaultFocus();
ImGui.SameLine();
if (ImGui.Button("Cancel", new Vec2(120, 0))) { ImGui.CloseCurrentPopup(); }
ImGui.EndPopup();
}
if (ImGui.Button("Stacked modals.."))
{
ImGui.OpenPopup("Stacked 1");
show_stacked = true;
}
if (ImGui.BeginPopupModal("Stacked 1", ref show_stacked, ImGuiWindowFlags.MenuBar))
{
if (ImGui.BeginMenuBar())
{
if (ImGui.BeginMenu("File"))
{
if (ImGui.MenuItem("Some menu item")) { }
ImGui.EndMenu();
}
ImGui.EndMenuBar();
}
ImGui.Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it.");
ImGui.Combo("Combo", ref item_mod, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
ImGui.ColorEdit4("color", ref color);
if (ImGui.Button("Add another modal.."))
{
ImGui.OpenPopup("Stacked 2");
}
bool unused_open = true;
if (ImGui.BeginPopupModal("Stacked 2", ref unused_open))
{
ImGui.Text("Hello from Stacked The Second!");
if (ImGui.Button("Close"))
{
ImGui.CloseCurrentPopup();
}
ImGui.EndPopup();
}
if (ImGui.Button("Close"))
{
ImGui.CloseCurrentPopup();
}
ImGui.EndPopup();
}
ImGui.TreePop();
}
#endregion
}
#region DemoWindowMiscVariables
string buf = "hello";
#endregion
private void DemoWindowMisc()
{
if (ImGui.CollapsingHeader("Inputs, Navigation & Focus"))
{
ImGuiIOPtr io = ImGui.GetIO();
ImGui.Text(string.Format("WantCaptureMouse: {0}", io.WantCaptureMouse));
ImGui.Text(string.Format("WantCaptureKeyboard: {0}", io.WantCaptureKeyboard));
ImGui.Text(string.Format("WantTextInput: {0}", io.WantTextInput));
ImGui.Text(string.Format("WantSetMousePos: {0}", io.WantSetMousePos));
ImGui.Text(string.Format("NavActive: {0}, NavVisible: {1}", io.NavActive, io.NavVisible));
//keyboard mouse state
if (ImGui.TreeNode("Keyboard, Mouse & Navigation State"))
{
if (ImGui.IsMousePosValid())
{
ImGui.Text(string.Format("Mouse pos: ({0}, {1})", io.MousePos.X, io.MousePos.Y));
}
else
{
ImGui.Text("Mouse pos: ");
}
ImGui.Text(string.Format("Mouse delta: ({0}, {1})", io.MouseDelta.X, io.MouseDelta.Y));
ImGui.Text("Mouse down:"); for (int i = 0; i < io.MouseDown.Count; i++) if (io.MouseDownDuration[i] >= 0.0f) { ImGui.SameLine(); ImGui.Text(string.Format("{0} ({1} secs)", i, io.MouseDownDuration[i])); }
ImGui.Text("Mouse clicked:"); for (int i = 0; i < io.MouseDown.Count; i++) if (ImGui.IsMouseClicked((ImGuiNET.ImGuiMouseButton)i)) { ImGui.SameLine(); ImGui.Text(i.ToString()); }
ImGui.Text("Mouse dblclick:"); for (int i = 0; i < io.MouseDown.Count; i++) if (ImGui.IsMouseDoubleClicked((ImGuiNET.ImGuiMouseButton)i)) { ImGui.SameLine(); ImGui.Text(i.ToString()); }
ImGui.Text("Mouse released:"); for (int i = 0; i < io.MouseDown.Count; i++) if (ImGui.IsMouseReleased((ImGuiNET.ImGuiMouseButton)i)) { ImGui.SameLine(); ImGui.Text(i.ToString()); }
ImGui.Text(string.Format("Mouse wheel: {0}", io.MouseWheel));
// TODO: Not Supported
/*
ImGui.Text("Keys down:"); for (int i = 0; i < io.KeysDown.Count; i++) if (io.KeysDownDuration[i] >= 0.0f) { ImGui.SameLine(); ImGui.Text(string.Format("{0} ({1}) ({2} secs)", i, i, io.KeysDownDuration[i])); }
ImGui.Text("Keys pressed:"); for (int i = 0; i < io.KeysDown.Count; i++) if (ImGui.IsKeyPressed((ImGuiNET.ImGuiKey)i)) { ImGui.SameLine(); ImGui.Text(string.Format("{0} ({1})", i, i)); }
ImGui.Text("Keys release:"); for (int i = 0; i < io.KeysDown.Count; i++) if (ImGui.IsKeyReleased((ImGuiNET.ImGuiKey)i)) { ImGui.SameLine(); ImGui.Text(string.Format("{0} ({1})", i, i)); }
ImGui.Text(string.Format("Keys mods: {0}{1}{2}{3}", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""));
ImGui.Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ushort c = io.InputQueueCharacters[i]; ImGui.SameLine(); ImGui.Text(string.Format("{0} {1}", (c > ' ' && c <= 255) ? (char)c : '?', c)); } // FIXME: Does not show chars as in example
ImGui.Text("NavInputs down:"); for (int i = 0; i < io.NavInputs.Count; i++) if (io.NavInputs[i] > 0.0f) { ImGui.SameLine(); ImGui.Text(string.Format("[{0}] {1}", i, io.NavInputs[i])); }
ImGui.Text("NavInputs pressed:"); for (int i = 0; i < io.NavInputs.Count; i++) if (io.NavInputsDownDuration[i] == 0.0f) { ImGui.SameLine(); ImGui.Text(string.Format("[{0}]", i)); }
ImGui.Text("NavInputs duration:"); for (int i = 0; i < io.NavInputs.Count; i++) if (io.NavInputsDownDuration[i] >= 0.0f) { ImGui.SameLine(); ImGui.Text(string.Format("[{0}] {1}", i, io.NavInputsDownDuration[i])); }
*/
ImGui.Button("Hovering me sets the\nkeyboard capture flag");
if (ImGui.IsItemHovered())
{
// TODO: Not Supported
}
ImGui.SameLine();
ImGui.Button("Holding me clears the\nthe keyboard capture flag");
if (ImGui.IsItemActive())
{ }
// TODO: Not Supported
// ImGui.CaptureKeyboardFromApp(true);
}
ImGui.SameLine();
ImGui.Button("Holding me clears the\nthe keyboard capture flag");
if (ImGui.IsItemActive())
{
// ImGui.CaptureKeyboardFromApp(false);
}
ImGui.TreePop();
}
if (ImGui.TreeNode("Tabbing"))
{
ImGui.Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields.");
ImGui.InputText("1", ref buf, 100);
ImGui.InputText("2", ref buf, 100);
ImGui.InputText("3", ref buf, 100);
// TODO: Not Supported
// ImGui.PushAllowKeyboardFocus(false);
ImGui.InputText("4 (tab skip)", ref buf, 100);
// TODO: Not Supported
// ImGui.PopAllowKeyboardFocus();
ImGui.InputText("5", ref buf, 100);
ImGui.TreePop();
}
}
#region DrawMonoGameWindowVariables
bool show_main_window = true;
bool exit_app = false;
int current_res = 0;
int select_res = 0;
int render_model = 1;
string[] resolution = { "1024x768", "1280x720", "1280x960", "1366x768", "1440x1080", "1680x1050", "1600x1200", "1920x1080" };
Vec4 monogame_color = new Vec4(231.0f / 255.0f, 60.0f / 255.0f, 0.0f / 255.0f, 200.0f / 255.0f);
Vec4 monogame_framebg = new Vec4(227.0f / 255.0f, 227.0f / 255.0f, 227.0f / 255.0f, 255.0f / 255.0f);
Vec4 color_black = new Vec4(0.0f / 255.0f, 0.0f / 0.0f, 0.0f / 255.0f, 200.0f / 255.0f);
Vec4 color_white = new Vec4(255.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f, 242.0f / 255.0f);
#endregion
private void DrawMonoGameWindow()
{
ImGui.SetNextWindowSize(new Vec2(300, 220), ImGuiCond.FirstUseEver);
ImGui.SetNextWindowPos(new Vec2(10, 140), ImGuiCond.FirstUseEver);
ImGui.PushStyleColor(ImGuiCol.WindowBg, color_white);
ImGui.PushStyleColor(ImGuiCol.FrameBg, monogame_framebg);
ImGui.PushStyleColor(ImGuiCol.PopupBg, monogame_framebg);
ImGui.PushStyleColor(ImGuiCol.MenuBarBg, monogame_framebg);
ImGui.PushStyleColor(ImGuiCol.TitleBg, monogame_color);
ImGui.PushStyleColor(ImGuiCol.TitleBgActive, monogame_color);
ImGui.PushStyleColor(ImGuiCol.Button, monogame_color);
if (!ImGui.Begin("MonoGame Settings", ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.MenuBar))
{
ImGui.End();
return;
}
ImGui.PushStyleColor(ImGuiCol.Text, color_black);
if (ImGui.BeginMenuBar())
{
if (ImGui.BeginMenu("Options"))
{
ImGui.MenuItem("Exit App", null, ref exit_app);
ImGui.EndMenu();
}
if (ImGui.BeginMenu("ImGui"))
{
ImGui.MenuItem("Show Demo Window", null, ref show_main_window);
ImGui.EndMenu();
}
ImGui.EndMenuBar();
}
if (ImGui.SmallButton("Close"))
{
show_monogame_settings = false;
if (show_main_window == false)
{
show_main_window = true;
}
}
ImGui.Separator();
//ImGui.ColorEdit4("MG", ref monogame_color, ImGuiColorEditFlags.DisplayHSV);
//ImGui.Text(monogame_color.ToString());
ImGui.Combo("Window Size", ref select_res, resolution, resolution.Length);
if (current_res != select_res && WasResized == false)
{
WasResized = true;
}
ImGui.PushStyleColor(ImGuiCol.CheckMark, monogame_color);
ImGui.RadioButton("No render", ref render_model, 0);
ImGui.SameLine();
ImGui.RadioButton("Render model", ref render_model, 1);
ImGui.Separator();
ImGui.Text("Camera");
ImGui.PushButtonRepeat(true);
ImGui.Indent();
if (ImGui.ArrowButton("up", ImGuiDir.Up)) //ImGui.Button("Up"))
{
world = world * Matrix.CreateRotationX(0.1f);
}
ImGui.Unindent();
if (ImGui.ArrowButton("left", ImGuiDir.Left)) //ImGui.Button("Left"))
{
world = world * Matrix.CreateRotationY(-0.1f);
}
ImGui.SameLine();
ImGui.Text(" ");
ImGui.SameLine();
if (ImGui.ArrowButton("right", ImGuiDir.Right)) //ImGui.Button("Right"))
{
world = world * Matrix.CreateRotationY(0.1f);
}
ImGui.Indent();
if (ImGui.ArrowButton("down", ImGuiDir.Down)) //ImGui.Button("Down"))
{
world = world * Matrix.CreateRotationX(-0.1f);
}
ImGui.Unindent();
ImGui.PopButtonRepeat();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.PopStyleColor();
ImGui.End();
if (exit_app)
{
this.Exit();
}
}
}
}