Lab4

Dependencies:   SeeedStudioTFTv2 TFT_fonts mbed

Fork of Seeed_TFT_Touch_Shield by Shields

Revision:
4:ebcf8d366b91
Child:
6:ebffa73d4f95
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Panel.cpp	Fri Sep 26 12:40:19 2014 +0000
@@ -0,0 +1,122 @@
+#include "Panel.h"
+
+Panel::Panel(int x_0, int y_0, int x_1, int y_1, int p_color, int bd_color, int r = 1, int c = 1)
+{
+    x0 = x_0;
+    y0 = y_0;
+    x1 = x_1;
+    y1 = y_1 ;
+    init(p_color, bd_color, r, c);
+        //calculate pixels per row/col
+    pp_row = TFT.height() / (rows+0.0) ;
+    pp_col = TFT.width() / (cols+0.0) ;
+    redraw();
+}
+
+Panel::Panel(int p_color, int bd_color, int w, int h, int r, int c)
+{
+    x0 = -1;
+    y0 = -1;
+    x1 = -1;
+    y1 = -1 ;
+    init(p_color, bd_color, r, c);
+
+    //space on parent
+    width = w ;
+    height = h ;
+    //don't redraw we want to programatically do the drawing and change state
+//    redraw();
+}
+
+void Panel::init(int p_color, int bd_color, int r, int c)
+{
+    back_color = p_color;
+    border_color = bd_color;
+    rows = r ;
+    cols = c ;
+
+    curr_row = 0;
+    curr_col = 0;
+
+    //state info
+    state_changed = true ;
+    push_children = true ;
+}
+
+void Panel::paint()
+{
+    TFT.rect(x0,y0,x1,y1,border_color);
+    //paint fill
+    TFT.fillrect(x0+2,y0+2,x1-2,y1-2,back_color);
+}
+
+bool Panel::addWidget(AbstractWidget *p)
+{
+    //include as a child
+    if(push_children){
+        children.push_back(p);
+    }
+    
+    //adjust pixels per row/col values for panel 'p'
+    //this is [number of pixels taken by p] / [row or col divisions] 
+    p->pp_row = (pp_row*p->height)/p->rows;
+    p->pp_col = (pp_col*p->width)/p->cols;
+    //re-adjust absolute cordinates of Panel 'p'
+    //get parents x,y locations and curr row, col numbers to calculate new location
+    //also update next available row/col
+
+    while(curr_row < rows && curr_col < cols) {
+        int rows_to_bottom = rows - curr_row  ;
+        int cols_to_right = cols - curr_col ;
+
+        if(cols_to_right >= p->width) {
+            //we are good to fit widget to the right
+            //now check if rows would fit widget
+            if(rows_to_bottom >= p->height) {
+                //ok all is good
+                //update x,y for this widget
+                p->x0 = x0 + pp_col*curr_col ;
+                p->y0 = y0 + pp_row*curr_row ;
+                p->x1 = p->x0 + pp_col*p->width;
+                if(p->x1 + pp_col*1 > x1){
+                    //lookahead if the panel that is added now is in the last coloumn adjust it x corner to boundary
+                    p->x1 = x1;    
+                }
+                p->y1 = p->y0 + pp_row*p->height;
+                if(p->y1 + pp_row*1 > y1){
+                    //if the panel that is added is in the last row then adjust its x corner to boundary
+                    p->y1 = y1;    
+                }
+                //keep previous row,col for updates to this widget
+                prev_col = curr_col;
+                prev_row = curr_row;
+                //set next col
+                if ((curr_col + p->width) >= cols) {
+                    curr_col = 0 ;
+                } else {
+                    curr_col = (curr_col + p->width);
+                } ;
+                if(curr_col == 0) {
+                    curr_row = curr_row + p->height ;
+                } else {
+                    curr_row = curr_row + p->height - 1 ;
+                }
+                //printf("next row: %d next col: %d \n", curr_row, curr_col);
+                break;
+            } else {
+                //not going to fit with a sweep algorithm
+                return false;
+            }
+        } else {
+            //go to the next row and col 0 and start again
+            curr_row += 1 ;
+            curr_col = 0 ;
+        }
+    }
+    
+    pc.printf("c_row: %d c_col: %d --- child x0,y0 : %d,%d  x1,y1 : %d,%d --- pp_row, pp_col : %f,%f \r\n", curr_row, curr_col,
+                                p->x0,p->y0,p->x1,p->y1,p->pp_row ,p->pp_col);
+
+    return true;
+
+}