Changeset a35b458 in mainline for uspace/lib/gui/grid.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/gui/grid.c
r3061bc1 ra35b458 51 51 { 52 52 grid_t *grid = (grid_t *) widget; 53 53 54 54 surface_t *surface = window_claim(grid->widget.window); 55 55 if (!surface) { … … 57 57 return; 58 58 } 59 59 60 60 // FIXME: Replace with (accelerated) rectangle fill 61 61 for (sysarg_t y = widget->vpos; y < widget->vpos + widget->height; y++) { … … 63 63 surface_put_pixel(surface, x, y, grid->background); 64 64 } 65 65 66 66 window_yield(grid->widget.window); 67 67 } … … 71 71 if ((col < grid->cols) && (row < grid->rows)) 72 72 return grid->layout + (row * grid->cols + col); 73 73 74 74 return NULL; 75 75 } … … 82 82 if (cell) { 83 83 widget_t *widget = cell->widget; 84 84 85 85 if ((widget) && (hpos >= widget->hpos) && 86 86 (vpos >= widget->vpos) && … … 91 91 } 92 92 } 93 93 94 94 return NULL; 95 95 } … … 104 104 { 105 105 grid_t *grid = (grid_t *) widget; 106 106 107 107 deinit_grid(grid); 108 108 free(grid); … … 118 118 { 119 119 assert(run > 0); 120 120 121 121 sysarg_t dim_min_part = dim_min / run; 122 122 sysarg_t dim_min_rem = dim_min % run; 123 123 124 124 sysarg_t dim_max_part = dim_max / run; 125 125 sysarg_t dim_max_rem = dim_max % run; 126 126 127 127 for (size_t i = 0; i < run; i++) { 128 128 sysarg_t dim_min_cur = dim_min_part; 129 129 sysarg_t dim_max_cur = dim_max_part; 130 130 131 131 if (i == run - 1) { 132 132 dim_min_cur += dim_min_rem; 133 133 dim_max_cur += dim_max_rem; 134 134 } 135 135 136 136 /* 137 137 * We want the strongest constraint … … 140 140 if (cons[i].min < dim_min_cur) 141 141 cons[i].min = dim_min_cur; 142 142 143 143 /* 144 144 * The comparison is correct, we want … … 155 155 /* Initial solution */ 156 156 sysarg_t cur_sum = 0; 157 157 158 158 for (size_t i = 0; i < run; i++) { 159 159 cons[i].val = cons[i].min; 160 160 cur_sum += cons[i].val; 161 161 } 162 162 163 163 /* Iterative improvement */ 164 164 while (cur_sum < sum) { … … 166 166 if (delta == 0) 167 167 break; 168 168 169 169 cur_sum = 0; 170 170 171 171 for (size_t i = 0; i < run; i++) { 172 172 if (cons[i].val + delta < cons[i].max) 173 173 cons[i].val += delta; 174 174 175 175 cur_sum += cons[i].val; 176 176 } … … 182 182 { 183 183 grid_t *grid = (grid_t *) widget; 184 184 185 185 widget_modify(widget, hpos, vpos, width, height); 186 186 paint_internal(widget); 187 187 188 188 /* Compute column widths */ 189 189 constraints_t *widths = … … 193 193 for (size_t c = 0; c < grid->cols; c++) { 194 194 widths[c].min = 0; 195 195 196 196 for (size_t r = 0; r < grid->rows; r++) { 197 197 grid_cell_t *cell = grid_cell_at(grid, c, r); 198 198 if (!cell) 199 199 continue; 200 200 201 201 widget_t *widget = cell->widget; 202 202 if (widget) … … 205 205 } 206 206 } 207 207 208 208 solve_constraints(widths, grid->cols, width); 209 209 } 210 210 211 211 /* Compute row heights */ 212 212 constraints_t *heights = … … 216 216 for (size_t r = 0; r < grid->rows; r++) { 217 217 heights[r].min = 0; 218 218 219 219 for (size_t c = 0; c < grid->cols; c++) { 220 220 grid_cell_t *cell = grid_cell_at(grid, c, r); 221 221 if (!cell) 222 222 continue; 223 223 224 224 widget_t *widget = cell->widget; 225 225 if (widget) { … … 229 229 } 230 230 } 231 231 232 232 solve_constraints(heights, grid->rows, height); 233 233 } 234 234 235 235 /* Rearrange widgets */ 236 236 if ((widths) && (heights)) { 237 237 sysarg_t cur_vpos = vpos; 238 238 239 239 for (size_t r = 0; r < grid->rows; r++) { 240 240 sysarg_t cur_hpos = hpos; 241 241 242 242 for (size_t c = 0; c < grid->cols; c++) { 243 243 grid_cell_t *cell = grid_cell_at(grid, c, r); 244 244 if (!cell) 245 245 continue; 246 246 247 247 widget_t *widget = cell->widget; 248 248 if (widget) { 249 249 sysarg_t cur_width = 0; 250 250 sysarg_t cur_height = 0; 251 251 252 252 for (size_t cd = 0; cd < cell->cols; cd++) 253 253 cur_width += widths[c + cd].val; 254 254 255 255 for (size_t rd = 0; rd < cell->rows; rd++) 256 256 cur_height += heights[r + rd].val; 257 257 258 258 if ((cur_width > 0) && (cur_height > 0)) { 259 259 sysarg_t wwidth = cur_width; 260 260 sysarg_t wheight = cur_height; 261 261 262 262 /* 263 263 * Make sure the widget is respects its 264 264 * maximal constrains. 265 265 */ 266 266 267 267 if ((widget->width_max > 0) && 268 268 (wwidth > widget->width_max)) 269 269 wwidth = widget->width_max; 270 270 271 271 if ((widget->height_max > 0) && 272 272 (wheight > widget->height_max)) 273 273 wheight = widget->height_max; 274 274 275 275 widget->rearrange(widget, cur_hpos, cur_vpos, 276 276 wwidth, wheight); 277 277 } 278 279 278 279 280 280 } 281 281 282 282 cur_hpos += widths[c].val; 283 283 } 284 284 285 285 cur_vpos += heights[r].val; 286 286 } 287 287 } 288 288 289 289 if (widths) 290 290 free(widths); 291 291 292 292 if (heights) 293 293 free(heights); … … 297 297 { 298 298 paint_internal(widget); 299 299 300 300 list_foreach(widget->children, link, widget_t, child) { 301 301 child->repaint(child); 302 302 } 303 303 304 304 window_damage(widget->window); 305 305 } … … 313 313 { 314 314 grid_t *grid = (grid_t *) widget; 315 315 316 316 grid_cell_t *cell = grid_coords_at(grid, event.hpos, event.vpos); 317 317 if ((cell) && (cell->widget)) … … 325 325 (row + rows > grid->rows)) 326 326 return false; 327 327 328 328 grid_cell_t *cell = grid_cell_at(grid, col, row); 329 329 if (!cell) 330 330 return false; 331 331 332 332 /* 333 333 * Check whether the cell is not occupied by an … … 336 336 if ((!cell->widget) && (cell->cols > 0) && (cell->rows > 0)) 337 337 return false; 338 338 339 339 widget->parent = (widget_t *) grid; 340 340 341 341 list_append(&widget->link, &grid->widget.children); 342 342 widget->window = grid->widget.window; 343 343 344 344 /* Mark cells in layout */ 345 345 for (size_t r = row; r < row + rows; r++) { … … 359 359 } 360 360 } 361 361 362 362 return true; 363 363 } … … 368 368 if ((cols == 0) || (rows == 0)) 369 369 return false; 370 370 371 371 grid->layout = 372 372 (grid_cell_t *) calloc(cols * rows, sizeof(grid_cell_t)); 373 373 if (!grid->layout) 374 374 return false; 375 375 376 376 memset(grid->layout, 0, cols * rows * sizeof(grid_cell_t)); 377 377 378 378 widget_init(&grid->widget, parent, data); 379 379 380 380 grid->widget.destroy = grid_destroy; 381 381 grid->widget.reconfigure = grid_reconfigure; … … 384 384 grid->widget.handle_keyboard_event = grid_handle_keyboard_event; 385 385 grid->widget.handle_position_event = grid_handle_position_event; 386 386 387 387 grid->add = grid_add; 388 388 grid->background = background; 389 389 grid->cols = cols; 390 390 grid->rows = rows; 391 391 392 392 return true; 393 393 } … … 399 399 if (!grid) 400 400 return NULL; 401 401 402 402 if (init_grid(grid, parent, data, cols, rows, background)) 403 403 return grid; 404 404 405 405 free(grid); 406 406 return NULL;
Note:
See TracChangeset
for help on using the changeset viewer.