Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Revision:
12:63db16fea709
Child:
13:6714534e7974
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Widgets/ContainerWidget.cpp	Sun May 08 14:42:08 2016 +0000
@@ -0,0 +1,92 @@
+#include "ContainerWidget.h"
+
+ContainerWidget::ContainerWidget(GraphicsContext *context)
+    :
+    Window(context), _layout(HORIZONTAL)
+{
+}
+
+void ContainerWidget::setLayout(Layout l)
+{
+    if(_layout != l) {
+        _layout = l;
+        damage();
+    }
+}
+
+void ContainerWidget::setSize(int width, int height)
+{
+    if(_minWidth != width || _minHeight != height) {
+        _minWidth = width;
+        _minHeight = height;
+        damage();
+    }
+    Window::setSize(width, height);
+}
+
+
+
+void ContainerWidget::_adjust()
+{
+    setSize(_minWidth, _minHeight);
+    Window::_adjust();
+
+    int wx = _inner.x;
+    int wy = _inner.y;
+    int width = 0;
+    int height = 0;
+
+    
+
+    Widget *w;
+    
+    _widgets.reset();
+
+    while((w = _widgets.next()) != NULL) {
+
+        // Position the widgets
+        w->setLocation(wx, wy);
+
+        if(_layout == HORIZONTAL) {
+            wx += w->width();
+            if(w->height() > height) {
+                height = w->height();
+            }
+        } else {
+            wy += w->height();
+            if(w->width() > width) {
+                width = w->width();
+            }
+        }
+    }
+
+    int neededWidth;
+    int neededHeight;
+
+    if(_layout == HORIZONTAL) {
+        neededWidth = _padding + _borderWidth + wx - _outer.x;
+        neededHeight = 2 * (_padding + _borderWidth) + height;
+    } else {
+        neededWidth = 2 * (_padding + _borderWidth) + width;
+        neededHeight = _padding + _borderWidth + wy - _outer.y;
+    }
+
+    if(neededWidth > _outer.width) {
+        setWidth(neededWidth);
+    }
+
+    if(neededHeight > _outer.height) {
+        setHeight(neededHeight);
+    }
+
+    if(_layout == VERTICAL_CENTER) {
+        // layout again to center the widgets
+        int center = (_outer.width/2) + _outer.x;
+        _widgets.reset();
+        while((w = _widgets.next()) != NULL) {
+            w->setLocation(center - (w->width() / 2), w->y());
+        }
+    }
+    
+    Window::_adjust();
+}