Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Revision:
13:6714534e7974
Parent:
12:63db16fea709
--- a/Widgets/ContainerWidget.cpp	Sun May 08 14:42:08 2016 +0000
+++ b/Widgets/ContainerWidget.cpp	Sat May 21 14:40:09 2016 +0000
@@ -24,7 +24,14 @@
     Window::setSize(width, height);
 }
 
-
+void ContainerWidget::attach(Widget *child)
+{
+    Window::attach(child);
+    if(_layout == FIXED) {
+        // Re-interpret child's location referenced to the container
+        child->setOffset(x(), y());
+    }
+}
 
 void ContainerWidget::_adjust()
 {
@@ -36,57 +43,65 @@
     int width = 0;
     int height = 0;
 
-    
+
 
     Widget *w;
-    
+
     _widgets.reset();
 
     while((w = _widgets.next()) != NULL) {
 
-        // Position the widgets
-        w->setLocation(wx, wy);
+        if(_layout == FIXED) {
+            w->setOffset(wx, wy);
+        } else {
+
+            // 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();
+            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 != FIXED) {
+
+        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(_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(neededWidth > _outer.width) {
-        setWidth(neededWidth);
+        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());
+            }
+        }
     }
 
-    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();
 }