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 }