ecere/ecere.epj: Added StaticGLES configuration
[sdk] / extras / gui / GuiConfigData.ec
1 import "ecere"
2
3 // source file line number printf (sflnprintf)
4
5 #undef _DEBUG
6
7 #ifdef _DEBUG
8 #define sflnprintf(format,...) printf("%s:% 5d: " format, __FILE__, __LINE__, ##__VA_ARGS__)
9 #define sflnPrintLn(...) PrintLn(__FILE__, ":", __LINE__, ": ", ##__VA_ARGS__)
10 #else
11 void DoNothing() {}
12 #define sflnprintf(format,...) DoNothing()
13 #define sflnPrintLn(...) DoNothing()
14 #endif
15
16 class GuiConfigData
17 {
18    virtual bool onSave();
19    virtual void onModified()
20    {
21       modified = true;
22    }
23
24 public:
25
26    Map<String, GuiDataWindow> windows;
27    Map<String, GuiDataPaneSplitter> paneSplitters;
28
29    void saveWindowInit(const char * configId, Window window)
30    {
31       sflnprintf("GuiConfigData::saveWindowInit\n");
32       applyWindowConfig(configId, window);
33       {
34          bool isNew = false;
35          GuiDataWindow guiData = insertWindowConfig(configId, true, &isNew);
36          if(guiData && isNew)
37          {
38             if(window.state != minimized)
39                guiData.state = window.state;
40             if(!(window.normalAnchor.left.distance == 0 && window.normalAnchor.top.distance == 0 &&
41                   window.normalSizeAnchor.size.w == 0 && window.normalSizeAnchor.size.h == 0))
42             {
43                recordWindowPosition(guiData, window);
44                recordWindowSize(guiData, window);
45             }
46             onModified();
47             onSave();
48          }
49       }
50    }
51
52    void saveWindowState(const char * configId, Window window, WindowState state)
53    {
54       sflnprintf("GuiConfigData::saveWindowState\n");
55       GuiDataWindow guiData = insertWindowConfig(configId, false, null);
56       if(guiData)
57       {
58          if(state != minimized)
59             guiData.state = state;
60          if(state == normal)
61             applyWindowSize(window, guiData);
62          onModified();
63       }
64    }
65
66    void saveWindowPosition(const char * configId, Window window, Point position, Size size)
67    {
68       sflnprintf("GuiConfigData::saveWindowPosition\n");
69       GuiDataWindow guiData = insertWindowConfig(configId, false, null);
70       if(guiData && window.state == normal)
71       {
72          if(!(window.normalAnchor.left.distance == 0 && window.normalAnchor.top.distance == 0 &&
73                window.normalSizeAnchor.size.w == 0 && window.normalSizeAnchor.size.h == 0))
74          {
75             recordWindowPosition(guiData, window);
76             recordWindowSize(guiData, window);
77          }
78          onModified();
79       }
80    }
81
82    void saveWindowSize(const char * configId, Window window, Size size)
83    {
84       sflnprintf("GuiConfigData::saveWindowSize\n");
85       GuiDataWindow guiData = insertWindowConfig(configId, false, null);
86       if(guiData && window.state == normal)
87       {
88          recordWindowSize(guiData, window);
89          onModified();
90       }
91    }
92
93    void saveWindowClose(const char * configId)
94    {
95       sflnprintf("GuiConfigData::saveWindowClose\n");
96       GuiDataWindow guiData = getWindowConfig(configId);
97       if(guiData)
98          guiData.saving = false;
99       if(modified)
100          onSave();
101    }
102
103    void savePaneSplitterSize(const char * configId, double scaleSplit)
104    {
105       sflnprintf("GuiConfigData::savePaneSplitterSize\n");
106       GuiDataPaneSplitter guiData = null;
107       if(!paneSplitters)
108          paneSplitters = { };
109       if(!(guiData = paneSplitters[configId]))
110          paneSplitters[configId] = guiData = { };
111       if(!guiData.loading)
112       {
113          guiData.scaleSplit = scaleSplit;
114          onModified();
115       }
116    }
117
118 private:
119    bool modified;
120
121    ~GuiConfigData()
122    {
123       timer.Stop();
124
125       if(windows)
126       {
127          windows.Free();
128          delete windows;
129       }
130       if(paneSplitters)
131       {
132          paneSplitters.Free();
133          delete paneSplitters;
134       }
135    }
136
137    Timer timer
138    {
139       userData = this, delay = 2.5;
140       bool DelayExpired()
141       {
142          if(modified)
143          {
144             if(onSave())
145                modified = false;
146          }
147          return true;
148       }
149    };
150
151    GuiDataWindow getWindowConfig(const char * configId)
152    {
153       //sflnprintf("GuiConfigData::getWindowConfig\n");
154       GuiDataWindow guiData = null;
155       if(windows)
156          guiData = windows[configId];
157       return guiData;
158    }
159
160    GuiDataWindow insertWindowConfig(const char * configId, bool startSaving, bool *isNew)
161    {
162       //sflnprintf("GuiConfigData::insertWindowConfig\n");
163       GuiDataWindow guiData = null;
164       if(startSaving)
165       {
166          if(!windows)
167             windows = { };
168          if(!(guiData = windows[configId]))
169          {
170             windows[configId] = guiData = { };
171             if(isNew)
172                *isNew = true;
173          }
174          guiData.saving = true;
175       }
176       else
177          guiData = getWindowConfig(configId);
178       if(/*!startSaving && */guiData && (!guiData.saving || guiData.loading))
179          guiData = null;
180       return guiData;
181    }
182
183    void recordWindowPosition(GuiDataWindow guiData, Window window)
184    {
185       sflnprintf("GuiConfigData::recordWindowPosition\n");
186       guiData.position = { window.normalAnchor.left.distance, window.normalAnchor.top.distance };
187       sflnPrintLn("recordWindowPosition(guiData.position == ", guiData.position, ", created == ", window.created, ")");
188    }
189
190    void recordWindowSize(GuiDataWindow guiData, Window window)
191    {
192       sflnprintf("GuiConfigData::recordWindowSize\n");
193       //Size s;
194       //sflnPrintLn(guiData.size);
195       //s = window.normalSizeAnchor.size;
196       //sflnPrintLn(s);
197       guiData.size = window.normalSizeAnchor.size;
198       //sflnPrintLn(guiData.size);
199       //sflnPrintLn(window.size);
200       //sflnPrintLn("recordWindowSize(guiData.size == ", guiData.size, ", created == ", window.created, ")");
201    }
202
203    void applyWindowConfig(const char * configId, Window window)
204    {
205       sflnprintf("GuiConfigData::applyWindowConfig\n");
206       GuiDataWindow guiData = getWindowConfig(configId);
207       if(guiData)
208       {
209          guiData.loading = true;
210          window.state = normal;
211          applyWindowPosition(window, guiData);
212          applyWindowSize(window, guiData);
213          window.Move(guiData.position.x, guiData.position.y, guiData.size.w, guiData.size.h);
214          sflnPrintLn("applyWindowConfig(window.size == ", window.size, ", created == ", window.created, ")");
215          window.state = guiData.state;
216          guiData.loading = false;
217       }
218    }
219
220    void applyWindowPosition(Window window, GuiDataWindow guiData)
221    {
222       sflnprintf("GuiConfigData::applyWindowPosition\n");
223       window.position = guiData.position;
224       sflnPrintLn("applyWindowPosition(window.position == ", window.position, ", created == ", window.created, ")");
225    }
226
227    void applyWindowSize(Window window, GuiDataWindow guiData)
228    {
229       sflnprintf("GuiConfigData::applyWindowSize\n");
230       if(guiData.size.w && guiData.size.h)
231       {
232          window.size = guiData.size;
233          sflnPrintLn("applyWindowSize(window.size == ", window.size, ", created == ", window.created, ")");
234       }
235    }
236
237    void applyPaneSplitterConfig(const char * configId, PaneSplitter paneSplitter)
238    {
239       //sflnprintf("GuiConfigData::applyPaneSplitterConfig\n");
240       GuiDataPaneSplitter guiData = paneSplitters[configId];
241       if(guiData)
242       {
243          guiData.loading = true;
244          paneSplitter.scaleSplit = guiData.scaleSplit;
245          guiData.loading = false;
246       }
247    }
248 }
249
250 class SavedConfigWindow : Window
251 {
252    virtual GuiConfigData getGuiConfigData() { return null; }
253    virtual const char * getGuiConfigInstanceId() { return _class.name; }
254
255    bool OnCreate()
256    {
257       sflnprintf("SavedConfigWindow::OnCreate\n");
258       bool result = Window::OnCreate();
259       if(result)
260       {
261          GuiConfigData data = getGuiConfigData();
262          if(data) data.saveWindowInit(getGuiConfigInstanceId(), this);
263       }
264       return result;
265    }
266
267    bool OnPostCreate()
268    {
269       sflnprintf("SavedConfigWindow::OnPostCreate\n");
270       bool result = Window::OnPostCreate();
271       if(result)
272       {
273          GuiConfigData data = getGuiConfigData();
274          if(data)
275             data.timer.Start();
276       }
277       return result;
278    }
279
280    /*bool OnPostCreate()
281    {
282       //sflnprintf("SavedConfigWindow::OnPostCreate\n");
283       GuiConfigData data = getGuiConfigData();
284       if(data) data.saveWindowInit(getGuiConfigInstanceId(), this);
285       return true;
286    }*/
287
288    bool OnStateChange(WindowState state, Modifiers mods)
289    {
290       sflnprintf("SavedConfigWindow::OnStateChange\n");
291       GuiConfigData data = getGuiConfigData();
292       if(data) data.saveWindowState(getGuiConfigInstanceId(), this, state);
293       return true;
294    }
295
296    void OnPosition(int x, int y, int width, int height)
297    {
298       sflnprintf("SavedConfigWindow::OnPosition(%i, %i, %i, %i)\n", x, y, width, height);
299       GuiConfigData data = getGuiConfigData();
300       if(data) data.saveWindowPosition(getGuiConfigInstanceId(), this, { x, y }, clientSize);
301    }
302
303    void OnResize(int width, int height)
304    {
305       sflnprintf("SavedConfigWindow::OnResize(%i, %i) -- (%i, %i)\n", width, height, this.normalSizeAnchor.size.w, this.normalSizeAnchor.size.h);
306       GuiConfigData data = getGuiConfigData();
307       if(data) data.saveWindowSize(getGuiConfigInstanceId(), this, clientSize);
308    }
309
310    bool OnClose(bool parentClosing)
311    {
312       sflnprintf("SavedConfigWindow::OnClose\n");
313       GuiConfigData data = getGuiConfigData();
314       if(data) data.saveWindowClose(getGuiConfigInstanceId());
315       return true;
316    }
317 }
318
319 class GuiDataWindow : struct
320 {
321 public:
322    WindowState state;
323    Point position;
324    Size size;
325 private:
326    bool saving;
327    bool loading;
328 }
329
330 class SavedConfigPaneSplitter : PaneSplitter
331 {
332    virtual GuiConfigData getGuiConfigData() { return null; }
333    virtual const char * getGuiConfigInstanceId() { return _class.name; }
334
335    bool OnPostCreate()
336    {
337       //sflnprintf("SavedConfigPaneSplitter::OnPostCreate\n");
338       GuiConfigData data = getGuiConfigData();
339       if(data) data.applyPaneSplitterConfig(getGuiConfigInstanceId(), this);
340       return true;
341    }
342
343    bool NotifyResized(SavedConfigPaneSplitter splitter)
344    {
345       //sflnprintf("SavedConfigPaneSplitter::NotifyResized\n");
346       GuiConfigData data = splitter.getGuiConfigData();
347       if(data) data.savePaneSplitterSize(splitter.getGuiConfigInstanceId(), splitter.scaleSplit);
348       return true;
349    }
350 }
351
352 class GuiDataPaneSplitter : struct
353 {
354 public:
355    double scaleSplit;
356 private:
357    bool loading;
358 }