Changes in uspace/lib/ui/src/pbutton.c [b769ca0:3583ffb] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/pbutton.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/pbutton.c
rb769ca0 r3583ffb 1 1 /* 2 * Copyright (c) 202 6Jiri Svoboda2 * Copyright (c) 2020 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 32 32 /** 33 33 * @file Push button 34 *35 * Push button either uses text as decoration, or it can use a caller-provided36 * function to paint the decoration.37 34 */ 38 35 … … 54 51 enum { 55 52 ui_pb_press_dx = 1, 56 ui_pb_press_dy = 1, 57 ui_pb_pad_x = 2, 58 ui_pb_pad_x_text = 1 53 ui_pb_press_dy = 1 59 54 }; 60 55 … … 116 111 117 112 ui_control_delete(pbutton->control); 118 free(pbutton->caption);119 113 free(pbutton); 120 114 } … … 142 136 } 143 137 144 /** Set push button ops.145 *146 * These allow overriding the function for painting the button or147 * painting the button decoration.148 *149 * @param pbutton Push button150 * @param ops Push button ops151 * @param arg Decoration ops argument152 */153 void ui_pbutton_set_ops(ui_pbutton_t *pbutton, ui_pbutton_ops_t *ops, void *arg)154 {155 pbutton->ops = ops;156 pbutton->ops_arg = arg;157 }158 159 /** Set push button flag.s160 *161 * @param pbutton Push button162 * @param flags Flags163 */164 void ui_pbutton_set_flags(ui_pbutton_t *pbutton, ui_pbutton_flags_t flags)165 {166 pbutton->flags = flags;167 }168 169 138 /** Set button rectangle. 170 139 * … … 188 157 { 189 158 pbutton->isdefault = isdefault; 190 }191 192 /** Get button light status.193 *194 * @param pbutton Button195 * @return @c true iff light is on196 */197 bool ui_pbutton_get_light(ui_pbutton_t *pbutton)198 {199 return pbutton->light;200 }201 202 /** Turn button light on or off.203 *204 * @param pbutton Button205 * @param light @c true iff button should be lit206 */207 void ui_pbutton_set_light(ui_pbutton_t *pbutton, bool light)208 {209 pbutton->light = light;210 }211 212 /** Set push button caption.213 *214 * @param pbutton Button215 * @param caption New caption216 * @return EOK on success, ENOMEM if out of memory217 */218 errno_t ui_pbutton_set_caption(ui_pbutton_t *pbutton, const char *caption)219 {220 char *dcaption;221 222 dcaption = str_dup(caption);223 if (dcaption == NULL)224 return ENOMEM;225 226 free(pbutton->caption);227 pbutton->caption = dcaption;228 return EOK;229 159 } 230 160 … … 309 239 } 310 240 311 /** Paint button text shadow.241 /** Paint push button. 312 242 * 313 243 * @param pbutton Push button 314 244 * @return EOK on success or an error code 315 245 */ 316 static errno_t ui_pbutton_paint_text_shadow(ui_pbutton_t *pbutton) 317 { 318 gfx_rect_t rect; 319 errno_t rc; 320 321 rect.p0.x = pbutton->rect.p0.x + 1; 322 rect.p0.y = pbutton->rect.p0.y + 1; 323 rect.p1.x = pbutton->rect.p1.x; 324 rect.p1.y = pbutton->rect.p1.y; 325 326 rc = gfx_set_color(pbutton->res->gc, pbutton->res->btn_shadow_color); 327 if (rc != EOK) 328 goto error; 329 330 rc = gfx_fill_rect(pbutton->res->gc, &rect); 331 if (rc != EOK) 332 goto error; 333 334 return EOK; 335 error: 336 return rc; 337 } 338 339 /** Paint push button in graphic mode. 340 * 341 * @param pbutton Push button 342 * @return EOK on success or an error code 343 */ 344 static errno_t ui_pbutton_paint_gfx(ui_pbutton_t *pbutton) 246 errno_t ui_pbutton_paint(ui_pbutton_t *pbutton) 345 247 { 346 248 gfx_coord2_t pos; 347 249 gfx_text_fmt_t fmt; 348 250 gfx_rect_t rect; 349 gfx_rect_t irect;350 251 gfx_coord_t thickness; 351 gfx_color_t *color;352 252 bool depressed; 353 253 errno_t rc; … … 361 261 rect.p1.y = pbutton->rect.p1.y - thickness; 362 262 363 color = pbutton->light ? pbutton->res->btn_face_lit_color : 364 pbutton->res->btn_face_color; 365 366 rc = gfx_set_color(pbutton->res->gc, color); 263 rc = gfx_set_color(pbutton->res->gc, pbutton->res->btn_face_color); 367 264 if (rc != EOK) 368 265 goto error; 369 266 370 267 rc = gfx_fill_rect(pbutton->res->gc, &rect); 268 if (rc != EOK) 269 goto error; 270 271 rc = gfx_set_color(pbutton->res->gc, pbutton->res->btn_text_color); 371 272 if (rc != EOK) 372 273 goto error; … … 381 282 } 382 283 383 if (pbutton->ops != NULL && pbutton->ops->decor_paint != NULL) { 384 /* Custom decoration */ 385 rc = pbutton->ops->decor_paint(pbutton, pbutton->ops_arg, 386 &pos); 387 if (rc != EOK) 388 goto error; 389 } else { 390 /* Text decoration */ 391 ui_paint_get_inset_frame_inside(pbutton->res, &rect, &irect); 392 gfx_text_fmt_init(&fmt); 393 fmt.font = pbutton->res->font; 394 fmt.color = pbutton->res->btn_text_color; 395 fmt.halign = gfx_halign_center; 396 fmt.valign = gfx_valign_center; 397 fmt.abbreviate = true; 398 fmt.width = irect.p1.x - irect.p0.x - 2 * ui_pb_pad_x; 399 400 rc = gfx_puttext(&pos, &fmt, pbutton->caption); 401 if (rc != EOK) 402 goto error; 403 } 284 gfx_text_fmt_init(&fmt); 285 fmt.halign = gfx_halign_center; 286 fmt.valign = gfx_valign_center; 287 288 rc = gfx_puttext(pbutton->res->font, &pos, &fmt, pbutton->caption); 289 if (rc != EOK) 290 goto error; 404 291 405 292 rc = ui_pbutton_paint_frame(pbutton); … … 417 304 } 418 305 419 rc = gfx_update(pbutton->res->gc);420 if (rc != EOK)421 goto error;422 423 306 return EOK; 424 307 error: … … 426 309 } 427 310 428 /** Paint push button in text mode.429 *430 * @param pbutton Push button431 * @return EOK on success or an error code432 */433 static errno_t ui_pbutton_paint_text(ui_pbutton_t *pbutton)434 {435 gfx_coord2_t pos;436 gfx_text_fmt_t fmt;437 gfx_rect_t rect;438 bool depressed;439 errno_t rc;440 441 if ((pbutton->flags & ui_pbf_no_text_depress) == 0)442 depressed = pbutton->held && pbutton->inside;443 else444 depressed = false;445 446 rc = gfx_set_color(pbutton->res->gc, pbutton->res->wnd_face_color);447 if (rc != EOK)448 goto error;449 450 rc = gfx_fill_rect(pbutton->res->gc, &pbutton->rect);451 if (rc != EOK)452 goto error;453 454 rect.p0.x = pbutton->rect.p0.x + (depressed ? 1 : 0);455 rect.p0.y = pbutton->rect.p0.y;456 rect.p1.x = pbutton->rect.p1.x - 1 + (depressed ? 1 : 0);457 rect.p1.y = pbutton->rect.p0.y + 1;458 459 rc = gfx_set_color(pbutton->res->gc, pbutton->res->btn_face_color);460 if (rc != EOK)461 goto error;462 463 rc = gfx_fill_rect(pbutton->res->gc, &rect);464 if (rc != EOK)465 goto error;466 467 /* Center of button rectangle */468 pos.x = (rect.p0.x + rect.p1.x) / 2;469 pos.y = (rect.p0.y + rect.p1.y) / 2;470 471 gfx_text_fmt_init(&fmt);472 fmt.font = pbutton->res->font;473 fmt.color = pbutton->res->btn_text_color;474 fmt.halign = gfx_halign_center;475 fmt.valign = gfx_valign_center;476 fmt.abbreviate = true;477 fmt.width = rect.p1.x - rect.p0.x - 2 * ui_pb_pad_x_text;478 if (fmt.width < 1)479 fmt.width = 1;480 481 rc = gfx_puttext(&pos, &fmt, pbutton->caption);482 if (rc != EOK)483 goto error;484 485 if (!depressed) {486 rc = ui_pbutton_paint_text_shadow(pbutton);487 if (rc != EOK)488 goto error;489 }490 491 rc = gfx_update(pbutton->res->gc);492 if (rc != EOK)493 goto error;494 495 return EOK;496 error:497 return rc;498 }499 500 /** Paint push button.501 *502 * @param pbutton Push button503 * @return EOK on success or an error code504 */505 errno_t ui_pbutton_paint(ui_pbutton_t *pbutton)506 {507 if (pbutton->ops != NULL && pbutton->ops->paint != NULL) {508 /* Custom paint routine */509 return pbutton->ops->paint(pbutton, pbutton->ops_arg);510 } else if (pbutton->res->textmode) {511 return ui_pbutton_paint_text(pbutton);512 } else {513 return ui_pbutton_paint_gfx(pbutton);514 }515 }516 517 311 /** Press down button. 518 312 * … … 527 321 pbutton->held = true; 528 322 (void) ui_pbutton_paint(pbutton); 529 ui_pbutton_down(pbutton);530 323 } 531 324 … … 540 333 541 334 pbutton->held = false; 542 ui_pbutton_up(pbutton);543 335 544 336 if (pbutton->inside) { … … 576 368 } 577 369 578 /** Send button clicked event.370 /** Button was clicked. 579 371 * 580 372 * @param pbutton Push button … … 584 376 if (pbutton->cb != NULL && pbutton->cb->clicked != NULL) 585 377 pbutton->cb->clicked(pbutton, pbutton->arg); 586 }587 588 /** Send button down event.589 *590 * @param pbutton Push button591 */592 void ui_pbutton_down(ui_pbutton_t *pbutton)593 {594 if (pbutton->cb != NULL && pbutton->cb->down != NULL)595 pbutton->cb->down(pbutton, pbutton->arg);596 }597 598 /** Send button up event.599 *600 * @param pbutton Push button601 */602 void ui_pbutton_up(ui_pbutton_t *pbutton)603 {604 if (pbutton->cb != NULL && pbutton->cb->up != NULL)605 pbutton->cb->up(pbutton, pbutton->arg);606 378 } 607 379 … … 643 415 } 644 416 break; 645 case POS_DCLICK:646 break;647 417 } 648 418
Note:
See TracChangeset
for help on using the changeset viewer.
