Foundation classes for a basic GUI implementing simple widgets and events. (Fork for custom changes.)

Fork of SimpleGUI by Duncan McIntyre

Revision:
12:63db16fea709
Child:
15:e69fd74d42e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Widgets/Window.cpp	Sun May 08 14:42:08 2016 +0000
@@ -0,0 +1,81 @@
+#include "Window.h"
+
+Window::Window(GraphicsContext* context) : Widget(context) 
+{
+}
+
+void Window::attach(Widget *widget)
+{
+    _widgets.append(widget);
+    widget->setParent(this);
+    dirtyAll();
+    damage();
+}
+
+
+void Window::detach(Widget *widget)
+{
+    _widgets.remove(widget);
+    widget->setParent(NULL);
+    dirty();
+}
+
+void Window::dirtyAll() {
+    if(!_dirtying) {
+        
+        _dirtying = true;
+        
+        _dirty();
+        
+        Widget *w;
+        _widgets.reset();
+        
+        while((w = _widgets.next()) != NULL) {
+            w->dirtyAll();
+        }
+        
+        _dirtying = false;
+    }
+}
+
+void Window::_draw()
+{
+    Widget::_draw();
+    
+    Widget* w;
+
+    // Draw only the damaged widgets first
+    LinkedList<Widget> _damaged;
+    
+    _widgets.reset();
+    while((w = _widgets.next()) != NULL) {
+        if(w->isDamaged()) {
+            _damaged.appendOnce(w);
+            w->adjust();
+            w->draw();
+        }
+    }
+    
+    _damaged.reset();
+    while((w = _damaged.next()) != NULL) {
+            _dirtyIntersected(w);
+    }
+    _damaged.clear();
+    
+    _widgets.reset();
+    while((w = _widgets.next()) != NULL) {
+        w->draw();
+    }
+}
+
+void Window::_dirtyIntersected(Widget *w)
+{
+    Widget *o;
+    _widgets.reset();
+    while((o = _widgets.next()) != NULL) {
+        if((o != w) && o->intersects(w)) {
+            o->dirtyAll();
+        }
+    }
+}
+