1 module unecht.core.components.editor.ui.console; 2 3 version(UEIncludeEditor): 4 5 import unecht.core.logger; 6 import unecht.core.component; 7 import unecht.core.components.internal.gui; 8 import unecht.core.components.editor.menus; 9 10 import derelict.imgui.imgui; 11 12 import std.experimental.logger; 13 14 /// 15 final class UEEditorConsole : UEComponent 16 { 17 mixin(UERegisterObject!()); 18 19 private static UEEditorConsole singleton; 20 21 @Serialize 22 private bool scrollToBottom=true; 23 24 private size_t oldLength; 25 26 override void onCreate() { 27 super.onCreate; 28 singleton = this; 29 } 30 31 @MenuItem("view/console") 32 static void MenuEnable() 33 { 34 singleton.enabled = !singleton.enabled; 35 } 36 37 //TODO: #127 38 void render() 39 { 40 if(!enabled) 41 return; 42 43 bool open=true; 44 igBegin("console", &open); 45 scope(exit)igEnd(); 46 47 if(!open) 48 { 49 enabled = false; 50 return; 51 } 52 53 renderItems(); 54 } 55 56 static ImVec4 LogLevelToColor(LogLevel lvl) 57 { 58 final switch(lvl) 59 { 60 case LogLevel.trace: 61 return ImVec4(0.5,0.5,0.5,1); 62 63 case LogLevel.warning: 64 return ImVec4(1,1,0,1); 65 66 case LogLevel.error: 67 return ImVec4(0.8,0,0,1); 68 case LogLevel.critical: 69 case LogLevel.fatal: 70 return ImVec4(1,0,0,1); 71 72 case LogLevel.info: 73 case LogLevel.all: 74 case LogLevel.off: 75 return ImVec4(1,1,1,1); 76 } 77 } 78 79 void renderItems() 80 { 81 igBeginChild("ScrollingRegion"); 82 scope(exit) igEndChild(); 83 84 foreach(i; 0..logHistory.history.length) 85 { 86 const entry = logHistory.history[i]; 87 88 ImVec4 col = LogLevelToColor(entry.logLevel); 89 90 igPushStyleColor(ImGuiCol_Text, col); 91 scope(exit)igPopStyleColor(); 92 93 if(UEGui.Selectable(entry.msg,false)) 94 { 95 //TODO: #133 96 } 97 } 98 99 const logChanged = logHistory.history.length != oldLength; 100 101 if (scrollToBottom && logChanged) 102 { 103 igSetScrollHere(); 104 } 105 106 oldLength = logHistory.history.length; 107 108 const scrollY = igGetScrollY(); 109 const scrollMaxY = igGetScrollMaxY(); 110 111 if(!logChanged && scrollMaxY > 0) 112 scrollToBottom = scrollY == scrollMaxY; 113 } 114 }