Lab4
Dependencies: SeeedStudioTFTv2 TFT_fonts mbed
Fork of Seeed_TFT_Touch_Shield by
Panel.cpp@6:ebffa73d4f95, 2014-09-26 (annotated)
- Committer:
- uswickra
- Date:
- Fri Sep 26 15:33:34 2014 +0000
- Revision:
- 6:ebffa73d4f95
- Parent:
- 4:ebcf8d366b91
fix report
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uswickra | 4:ebcf8d366b91 | 1 | #include "Panel.h" |
uswickra | 6:ebffa73d4f95 | 2 | #include "Arial12x12.h" |
uswickra | 4:ebcf8d366b91 | 3 | |
uswickra | 4:ebcf8d366b91 | 4 | 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) |
uswickra | 4:ebcf8d366b91 | 5 | { |
uswickra | 4:ebcf8d366b91 | 6 | x0 = x_0; |
uswickra | 4:ebcf8d366b91 | 7 | y0 = y_0; |
uswickra | 4:ebcf8d366b91 | 8 | x1 = x_1; |
uswickra | 4:ebcf8d366b91 | 9 | y1 = y_1 ; |
uswickra | 4:ebcf8d366b91 | 10 | init(p_color, bd_color, r, c); |
uswickra | 6:ebffa73d4f95 | 11 | //calculate pixels per row/col |
uswickra | 4:ebcf8d366b91 | 12 | pp_row = TFT.height() / (rows+0.0) ; |
uswickra | 4:ebcf8d366b91 | 13 | pp_col = TFT.width() / (cols+0.0) ; |
uswickra | 4:ebcf8d366b91 | 14 | redraw(); |
uswickra | 4:ebcf8d366b91 | 15 | } |
uswickra | 4:ebcf8d366b91 | 16 | |
uswickra | 4:ebcf8d366b91 | 17 | Panel::Panel(int p_color, int bd_color, int w, int h, int r, int c) |
uswickra | 4:ebcf8d366b91 | 18 | { |
uswickra | 4:ebcf8d366b91 | 19 | x0 = -1; |
uswickra | 4:ebcf8d366b91 | 20 | y0 = -1; |
uswickra | 4:ebcf8d366b91 | 21 | x1 = -1; |
uswickra | 4:ebcf8d366b91 | 22 | y1 = -1 ; |
uswickra | 4:ebcf8d366b91 | 23 | init(p_color, bd_color, r, c); |
uswickra | 4:ebcf8d366b91 | 24 | |
uswickra | 4:ebcf8d366b91 | 25 | //space on parent |
uswickra | 4:ebcf8d366b91 | 26 | width = w ; |
uswickra | 4:ebcf8d366b91 | 27 | height = h ; |
uswickra | 4:ebcf8d366b91 | 28 | //don't redraw we want to programatically do the drawing and change state |
uswickra | 4:ebcf8d366b91 | 29 | // redraw(); |
uswickra | 4:ebcf8d366b91 | 30 | } |
uswickra | 4:ebcf8d366b91 | 31 | |
uswickra | 4:ebcf8d366b91 | 32 | void Panel::init(int p_color, int bd_color, int r, int c) |
uswickra | 4:ebcf8d366b91 | 33 | { |
uswickra | 4:ebcf8d366b91 | 34 | back_color = p_color; |
uswickra | 4:ebcf8d366b91 | 35 | border_color = bd_color; |
uswickra | 4:ebcf8d366b91 | 36 | rows = r ; |
uswickra | 4:ebcf8d366b91 | 37 | cols = c ; |
uswickra | 4:ebcf8d366b91 | 38 | |
uswickra | 4:ebcf8d366b91 | 39 | curr_row = 0; |
uswickra | 4:ebcf8d366b91 | 40 | curr_col = 0; |
uswickra | 4:ebcf8d366b91 | 41 | |
uswickra | 4:ebcf8d366b91 | 42 | //state info |
uswickra | 4:ebcf8d366b91 | 43 | state_changed = true ; |
uswickra | 4:ebcf8d366b91 | 44 | push_children = true ; |
uswickra | 6:ebffa73d4f95 | 45 | draw_text = false; |
uswickra | 6:ebffa73d4f95 | 46 | cursor_x0 = x0; |
uswickra | 6:ebffa73d4f95 | 47 | cursor_y0 = y0 ; |
uswickra | 6:ebffa73d4f95 | 48 | next_cursor_x0 = cursor_x0 ; |
uswickra | 6:ebffa73d4f95 | 49 | next_cursor_y0 = cursor_y0; |
uswickra | 4:ebcf8d366b91 | 50 | } |
uswickra | 4:ebcf8d366b91 | 51 | |
uswickra | 4:ebcf8d366b91 | 52 | void Panel::paint() |
uswickra | 4:ebcf8d366b91 | 53 | { |
uswickra | 4:ebcf8d366b91 | 54 | TFT.rect(x0,y0,x1,y1,border_color); |
uswickra | 4:ebcf8d366b91 | 55 | //paint fill |
uswickra | 4:ebcf8d366b91 | 56 | TFT.fillrect(x0+2,y0+2,x1-2,y1-2,back_color); |
uswickra | 6:ebffa73d4f95 | 57 | if(draw_text) { |
uswickra | 6:ebffa73d4f95 | 58 | TFT.set_font((unsigned char*) Arial12x12); |
uswickra | 6:ebffa73d4f95 | 59 | TFT.locate(cursor_x0 ,cursor_y0); |
uswickra | 6:ebffa73d4f95 | 60 | TFT.printf(input_string); |
uswickra | 6:ebffa73d4f95 | 61 | draw_text = false; |
uswickra | 6:ebffa73d4f95 | 62 | } |
uswickra | 4:ebcf8d366b91 | 63 | } |
uswickra | 4:ebcf8d366b91 | 64 | |
uswickra | 4:ebcf8d366b91 | 65 | bool Panel::addWidget(AbstractWidget *p) |
uswickra | 4:ebcf8d366b91 | 66 | { |
uswickra | 4:ebcf8d366b91 | 67 | //include as a child |
uswickra | 6:ebffa73d4f95 | 68 | if(push_children) { |
uswickra | 4:ebcf8d366b91 | 69 | children.push_back(p); |
uswickra | 4:ebcf8d366b91 | 70 | } |
uswickra | 6:ebffa73d4f95 | 71 | |
uswickra | 4:ebcf8d366b91 | 72 | //adjust pixels per row/col values for panel 'p' |
uswickra | 6:ebffa73d4f95 | 73 | //this is [number of pixels taken by p] / [row or col divisions] |
uswickra | 4:ebcf8d366b91 | 74 | p->pp_row = (pp_row*p->height)/p->rows; |
uswickra | 4:ebcf8d366b91 | 75 | p->pp_col = (pp_col*p->width)/p->cols; |
uswickra | 4:ebcf8d366b91 | 76 | //re-adjust absolute cordinates of Panel 'p' |
uswickra | 4:ebcf8d366b91 | 77 | //get parents x,y locations and curr row, col numbers to calculate new location |
uswickra | 4:ebcf8d366b91 | 78 | //also update next available row/col |
uswickra | 4:ebcf8d366b91 | 79 | |
uswickra | 4:ebcf8d366b91 | 80 | while(curr_row < rows && curr_col < cols) { |
uswickra | 4:ebcf8d366b91 | 81 | int rows_to_bottom = rows - curr_row ; |
uswickra | 4:ebcf8d366b91 | 82 | int cols_to_right = cols - curr_col ; |
uswickra | 4:ebcf8d366b91 | 83 | |
uswickra | 4:ebcf8d366b91 | 84 | if(cols_to_right >= p->width) { |
uswickra | 4:ebcf8d366b91 | 85 | //we are good to fit widget to the right |
uswickra | 4:ebcf8d366b91 | 86 | //now check if rows would fit widget |
uswickra | 4:ebcf8d366b91 | 87 | if(rows_to_bottom >= p->height) { |
uswickra | 4:ebcf8d366b91 | 88 | //ok all is good |
uswickra | 4:ebcf8d366b91 | 89 | //update x,y for this widget |
uswickra | 4:ebcf8d366b91 | 90 | p->x0 = x0 + pp_col*curr_col ; |
uswickra | 4:ebcf8d366b91 | 91 | p->y0 = y0 + pp_row*curr_row ; |
uswickra | 4:ebcf8d366b91 | 92 | p->x1 = p->x0 + pp_col*p->width; |
uswickra | 6:ebffa73d4f95 | 93 | if(p->x1 + pp_col*1 > x1) { |
uswickra | 4:ebcf8d366b91 | 94 | //lookahead if the panel that is added now is in the last coloumn adjust it x corner to boundary |
uswickra | 6:ebffa73d4f95 | 95 | p->x1 = x1; |
uswickra | 4:ebcf8d366b91 | 96 | } |
uswickra | 4:ebcf8d366b91 | 97 | p->y1 = p->y0 + pp_row*p->height; |
uswickra | 6:ebffa73d4f95 | 98 | if(p->y1 + pp_row*1 > y1) { |
uswickra | 4:ebcf8d366b91 | 99 | //if the panel that is added is in the last row then adjust its x corner to boundary |
uswickra | 6:ebffa73d4f95 | 100 | p->y1 = y1; |
uswickra | 4:ebcf8d366b91 | 101 | } |
uswickra | 4:ebcf8d366b91 | 102 | //keep previous row,col for updates to this widget |
uswickra | 4:ebcf8d366b91 | 103 | prev_col = curr_col; |
uswickra | 4:ebcf8d366b91 | 104 | prev_row = curr_row; |
uswickra | 4:ebcf8d366b91 | 105 | //set next col |
uswickra | 4:ebcf8d366b91 | 106 | if ((curr_col + p->width) >= cols) { |
uswickra | 4:ebcf8d366b91 | 107 | curr_col = 0 ; |
uswickra | 4:ebcf8d366b91 | 108 | } else { |
uswickra | 4:ebcf8d366b91 | 109 | curr_col = (curr_col + p->width); |
uswickra | 4:ebcf8d366b91 | 110 | } ; |
uswickra | 4:ebcf8d366b91 | 111 | if(curr_col == 0) { |
uswickra | 4:ebcf8d366b91 | 112 | curr_row = curr_row + p->height ; |
uswickra | 4:ebcf8d366b91 | 113 | } else { |
uswickra | 4:ebcf8d366b91 | 114 | curr_row = curr_row + p->height - 1 ; |
uswickra | 4:ebcf8d366b91 | 115 | } |
uswickra | 4:ebcf8d366b91 | 116 | //printf("next row: %d next col: %d \n", curr_row, curr_col); |
uswickra | 4:ebcf8d366b91 | 117 | break; |
uswickra | 4:ebcf8d366b91 | 118 | } else { |
uswickra | 4:ebcf8d366b91 | 119 | //not going to fit with a sweep algorithm |
uswickra | 4:ebcf8d366b91 | 120 | return false; |
uswickra | 4:ebcf8d366b91 | 121 | } |
uswickra | 4:ebcf8d366b91 | 122 | } else { |
uswickra | 4:ebcf8d366b91 | 123 | //go to the next row and col 0 and start again |
uswickra | 4:ebcf8d366b91 | 124 | curr_row += 1 ; |
uswickra | 4:ebcf8d366b91 | 125 | curr_col = 0 ; |
uswickra | 4:ebcf8d366b91 | 126 | } |
uswickra | 4:ebcf8d366b91 | 127 | } |
uswickra | 6:ebffa73d4f95 | 128 | |
uswickra | 4:ebcf8d366b91 | 129 | 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, |
uswickra | 6:ebffa73d4f95 | 130 | p->x0,p->y0,p->x1,p->y1,p->pp_row ,p->pp_col); |
uswickra | 4:ebcf8d366b91 | 131 | |
uswickra | 4:ebcf8d366b91 | 132 | return true; |
uswickra | 4:ebcf8d366b91 | 133 | |
uswickra | 4:ebcf8d366b91 | 134 | } |
uswickra | 6:ebffa73d4f95 | 135 | |
uswickra | 6:ebffa73d4f95 | 136 | void Panel::trigger_action(ActionType type, ActionEvent evnt, void* target) |
uswickra | 6:ebffa73d4f95 | 137 | { |
uswickra | 6:ebffa73d4f95 | 138 | //do something |
uswickra | 6:ebffa73d4f95 | 139 | if(type == CORD_STR) { |
uswickra | 6:ebffa73d4f95 | 140 | char* input_str = evnt.str; |
uswickra | 6:ebffa73d4f95 | 141 | int len = strlen(input_str); |
uswickra | 6:ebffa73d4f95 | 142 | |
uswickra | 6:ebffa73d4f95 | 143 | int x_pixels = len*12; |
uswickra | 6:ebffa73d4f95 | 144 | cursor_x0 = next_cursor_x0 ; |
uswickra | 6:ebffa73d4f95 | 145 | cursor_y0 = next_cursor_y0 ; |
uswickra | 6:ebffa73d4f95 | 146 | |
uswickra | 6:ebffa73d4f95 | 147 | if(cursor_x0 < 240 && cursor_y0 < 320 ) { |
uswickra | 6:ebffa73d4f95 | 148 | if(cursor_x0 + x_pixels >= 240) { |
uswickra | 6:ebffa73d4f95 | 149 | next_cursor_y0 = cursor_y0 + 14; |
uswickra | 6:ebffa73d4f95 | 150 | next_cursor_x0 = x0 ; |
uswickra | 6:ebffa73d4f95 | 151 | } else { |
uswickra | 6:ebffa73d4f95 | 152 | next_cursor_x0 = (cursor_x0 + x_pixels); |
uswickra | 6:ebffa73d4f95 | 153 | } |
uswickra | 6:ebffa73d4f95 | 154 | input_string = input_str; |
uswickra | 6:ebffa73d4f95 | 155 | draw_text = true; |
uswickra | 6:ebffa73d4f95 | 156 | state_changed = true; |
uswickra | 6:ebffa73d4f95 | 157 | } |
uswickra | 6:ebffa73d4f95 | 158 | |
uswickra | 6:ebffa73d4f95 | 159 | } |
uswickra | 6:ebffa73d4f95 | 160 | } |