source: mainline/uspace/app/uidemo/uidemo.c@ 5e109e1

serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5e109e1 was 5e109e1, checked in by Jiri Svoboda <jiri@…>, 4 years ago

File dialog prototype

This only contains a text entry for entering the file path and
OK / Cancel buttons.

  • Property mode set to 100644
File size: 19.8 KB
Line 
1/*
2 * Copyright (c) 2021 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup uidemo
30 * @{
31 */
32/** @file User interface demo
33 */
34
35#include <gfx/bitmap.h>
36#include <gfx/coord.h>
37#include <io/pixelmap.h>
38#include <stdio.h>
39#include <stdlib.h>
40#include <str.h>
41#include <ui/entry.h>
42#include <ui/filedialog.h>
43#include <ui/fixed.h>
44#include <ui/image.h>
45#include <ui/label.h>
46#include <ui/menubar.h>
47#include <ui/menuentry.h>
48#include <ui/menu.h>
49#include <ui/msgdialog.h>
50#include <ui/pbutton.h>
51#include <ui/resource.h>
52#include <ui/ui.h>
53#include <ui/window.h>
54#include "uidemo.h"
55
56static errno_t bitmap_moire(gfx_bitmap_t *, gfx_coord_t, gfx_coord_t);
57
58static void wnd_close(ui_window_t *, void *);
59
60static ui_window_cb_t window_cb = {
61 .close = wnd_close
62};
63
64static void pb_clicked(ui_pbutton_t *, void *);
65
66static ui_pbutton_cb_t pbutton_cb = {
67 .clicked = pb_clicked
68};
69
70static void checkbox_switched(ui_checkbox_t *, void *, bool);
71
72static ui_checkbox_cb_t checkbox_cb = {
73 .switched = checkbox_switched
74};
75
76static void rb_selected(ui_rbutton_group_t *, void *, void *);
77
78static ui_rbutton_group_cb_t rbutton_group_cb = {
79 .selected = rb_selected
80};
81
82static void slider_moved(ui_slider_t *, void *, gfx_coord_t);
83
84static ui_slider_cb_t slider_cb = {
85 .moved = slider_moved
86};
87
88static void uidemo_file_load(ui_menu_entry_t *, void *);
89static void uidemo_file_message(ui_menu_entry_t *, void *);
90static void uidemo_file_exit(ui_menu_entry_t *, void *);
91
92static void file_dialog_bok(ui_file_dialog_t *, void *, const char *);
93static void file_dialog_bcancel(ui_file_dialog_t *, void *);
94static void file_dialog_close(ui_file_dialog_t *, void *);
95
96static ui_file_dialog_cb_t file_dialog_cb = {
97 .bok = file_dialog_bok,
98 .bcancel = file_dialog_bcancel,
99 .close = file_dialog_close
100};
101
102static void msg_dialog_button(ui_msg_dialog_t *, void *, unsigned);
103static void msg_dialog_close(ui_msg_dialog_t *, void *);
104
105static ui_msg_dialog_cb_t msg_dialog_cb = {
106 .button = msg_dialog_button,
107 .close = msg_dialog_close
108};
109
110/** Horizontal alignment selected by each radio button */
111static const gfx_halign_t uidemo_halign[3] = {
112 gfx_halign_left,
113 gfx_halign_center,
114 gfx_halign_right
115};
116
117/** Window close button was clicked.
118 *
119 * @param window Window
120 * @param arg Argument (demo)
121 */
122static void wnd_close(ui_window_t *window, void *arg)
123{
124 ui_demo_t *demo = (ui_demo_t *) arg;
125
126 ui_quit(demo->ui);
127}
128
129/** Push button was clicked.
130 *
131 * @param pbutton Push button
132 * @param arg Argument (demo)
133 */
134static void pb_clicked(ui_pbutton_t *pbutton, void *arg)
135{
136 ui_demo_t *demo = (ui_demo_t *) arg;
137 errno_t rc;
138
139 if (pbutton == demo->pb1) {
140 rc = ui_entry_set_text(demo->entry, "OK pressed");
141 if (rc != EOK)
142 printf("Error changing entry text.\n");
143 } else {
144 rc = ui_entry_set_text(demo->entry, "Cancel pressed");
145 if (rc != EOK)
146 printf("Error changing entry text.\n");
147 }
148}
149
150/** Check box was switched.
151 *
152 * @param checkbox Check box
153 * @param arg Argument (demo)
154 */
155static void checkbox_switched(ui_checkbox_t *checkbox, void *arg, bool enable)
156{
157 ui_demo_t *demo = (ui_demo_t *) arg;
158
159 ui_entry_set_read_only(demo->entry, enable);
160}
161
162/** Radio button was selected.
163 *
164 * @param rbgroup Radio button group
165 * @param garg Group argument (demo)
166 * @param barg Button argument
167 */
168static void rb_selected(ui_rbutton_group_t *rbgroup, void *garg, void *barg)
169{
170 ui_demo_t *demo = (ui_demo_t *) garg;
171 gfx_halign_t halign = *(gfx_halign_t *) barg;
172
173 ui_entry_set_halign(demo->entry, halign);
174 (void) ui_entry_paint(demo->entry);
175}
176
177/** Slider was moved.
178 *
179 * @param slider Slider
180 * @param arg Argument (demo)
181 * @param pos Position
182 */
183static void slider_moved(ui_slider_t *slider, void *arg, gfx_coord_t pos)
184{
185 ui_demo_t *demo = (ui_demo_t *) arg;
186 char *str;
187 errno_t rc;
188 int rv;
189
190 rv = asprintf(&str, "Slider at %d of %d", (int) pos,
191 ui_slider_length(slider));
192 if (rv < 0) {
193 printf("Out of memory.\n");
194 return;
195 }
196
197 rc = ui_entry_set_text(demo->entry, str);
198 if (rc != EOK)
199 printf("Error changing entry text.\n");
200 (void) ui_entry_paint(demo->entry);
201
202 free(str);
203}
204
205/** Display a message window.
206 *
207 * @param demo UI demo
208 * @param caption Window caption
209 * @param text Message text
210 */
211static void uidemo_show_message(ui_demo_t *demo, const char *caption,
212 const char *text)
213{
214 ui_msg_dialog_params_t mdparams;
215 ui_msg_dialog_t *dialog;
216 errno_t rc;
217
218 ui_msg_dialog_params_init(&mdparams);
219 mdparams.caption = caption;
220 mdparams.text = text;
221
222 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
223 if (rc != EOK) {
224 printf("Error creating message dialog.\n");
225 return;
226 }
227
228 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
229}
230
231
232/** File/load menu entry selected.
233 *
234 * @param mentry Menu entry
235 * @param arg Argument (demo)
236 */
237static void uidemo_file_load(ui_menu_entry_t *mentry, void *arg)
238{
239 ui_demo_t *demo = (ui_demo_t *) arg;
240 ui_file_dialog_params_t fdparams;
241 ui_file_dialog_t *dialog;
242 errno_t rc;
243
244 ui_file_dialog_params_init(&fdparams);
245 fdparams.caption = "Load File";
246
247 rc = ui_file_dialog_create(demo->ui, &fdparams, &dialog);
248 if (rc != EOK) {
249 printf("Error creating message dialog.\n");
250 return;
251 }
252
253 ui_file_dialog_set_cb(dialog, &file_dialog_cb, demo);
254}
255
256/** File/message menu entry selected.
257 *
258 * @param mentry Menu entry
259 * @param arg Argument (demo)
260 */
261static void uidemo_file_message(ui_menu_entry_t *mentry, void *arg)
262{
263 ui_demo_t *demo = (ui_demo_t *) arg;
264 ui_msg_dialog_params_t mdparams;
265 ui_msg_dialog_t *dialog;
266 errno_t rc;
267
268 ui_msg_dialog_params_init(&mdparams);
269 mdparams.caption = "Message For You";
270 mdparams.text = "Hello, world!";
271
272 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
273 if (rc != EOK) {
274 printf("Error creating message dialog.\n");
275 return;
276 }
277
278 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
279}
280
281/** File/exit menu entry selected.
282 *
283 * @param mentry Menu entry
284 * @param arg Argument (demo)
285 */
286static void uidemo_file_exit(ui_menu_entry_t *mentry, void *arg)
287{
288 ui_demo_t *demo = (ui_demo_t *) arg;
289
290 ui_quit(demo->ui);
291}
292
293/** File dialog OK button press.
294 *
295 * @param dialog File dialog
296 * @param arg Argument (ui_demo_t *)
297 * @param fname File name
298 */
299static void file_dialog_bok(ui_file_dialog_t *dialog, void *arg,
300 const char *fname)
301{
302 ui_demo_t *demo = (ui_demo_t *) arg;
303 char buf[128];
304 char *p;
305 FILE *f;
306
307 ui_file_dialog_destroy(dialog);
308
309 f = fopen(fname, "rt");
310 if (f == NULL) {
311 uidemo_show_message(demo, "Error", "Error opening file.");
312 return;
313 }
314
315 p = fgets(buf, sizeof(buf), f);
316 if (p == NULL) {
317 uidemo_show_message(demo, "Error", "Error reading file.");
318 fclose(f);
319 return;
320 }
321
322 /* Cut string off at the first non-printable character */
323 p = buf;
324 while (*p != '\0') {
325 if (*p < ' ') {
326 *p = '\0';
327 break;
328 }
329 ++p;
330 }
331
332 ui_entry_set_text(demo->entry, buf);
333 fclose(f);
334}
335
336/** File dialog cancel button press.
337 *
338 * @param dialog File dialog
339 * @param arg Argument (ui_demo_t *)
340 */
341static void file_dialog_bcancel(ui_file_dialog_t *dialog, void *arg)
342{
343 ui_demo_t *demo = (ui_demo_t *) arg;
344
345 (void) demo;
346 ui_file_dialog_destroy(dialog);
347}
348
349/** Message dialog close request.
350 *
351 * @param dialog File dialog
352 * @param arg Argument (ui_demo_t *)
353 */
354static void file_dialog_close(ui_file_dialog_t *dialog, void *arg)
355{
356 ui_demo_t *demo = (ui_demo_t *) arg;
357
358 (void) demo;
359 ui_file_dialog_destroy(dialog);
360}
361
362/** Message dialog button press.
363 *
364 * @param dialog Message dialog
365 * @param arg Argument (ui_demo_t *)
366 * @param bnum Button number
367 */
368static void msg_dialog_button(ui_msg_dialog_t *dialog, void *arg,
369 unsigned bnum)
370{
371 ui_demo_t *demo = (ui_demo_t *) arg;
372
373 (void) demo;
374 ui_msg_dialog_destroy(dialog);
375}
376
377/** Message dialog close request.
378 *
379 * @param dialog Message dialog
380 * @param arg Argument (ui_demo_t *)
381 */
382static void msg_dialog_close(ui_msg_dialog_t *dialog, void *arg)
383{
384 ui_demo_t *demo = (ui_demo_t *) arg;
385
386 (void) demo;
387 ui_msg_dialog_destroy(dialog);
388}
389
390/** Run UI demo on display server. */
391static errno_t ui_demo(const char *display_spec)
392{
393 ui_t *ui = NULL;
394 ui_wnd_params_t params;
395 ui_window_t *window = NULL;
396 ui_demo_t demo;
397 gfx_rect_t rect;
398 gfx_context_t *gc;
399 ui_resource_t *ui_res;
400 gfx_bitmap_params_t bparams;
401 gfx_bitmap_t *bitmap;
402 gfx_coord2_t off;
403 ui_menu_entry_t *mmsg;
404 ui_menu_entry_t *mload;
405 ui_menu_entry_t *mfoo;
406 ui_menu_entry_t *mbar;
407 ui_menu_entry_t *mfoobar;
408 ui_menu_entry_t *mexit;
409 ui_menu_entry_t *mabout;
410 errno_t rc;
411
412 rc = ui_create(display_spec, &ui);
413 if (rc != EOK) {
414 printf("Error creating UI on display %s.\n", display_spec);
415 return rc;
416 }
417
418 memset((void *) &demo, 0, sizeof(demo));
419 demo.ui = ui;
420
421 ui_wnd_params_init(&params);
422 params.caption = "UI Demo";
423 params.style |= ui_wds_resizable;
424
425 /* FIXME: Auto layout */
426 if (ui_is_textmode(ui)) {
427 params.rect.p0.x = 0;
428 params.rect.p0.y = 0;
429 params.rect.p1.x = 80;
430 params.rect.p1.y = 25;
431 } else {
432 params.rect.p0.x = 0;
433 params.rect.p0.y = 0;
434 params.rect.p1.x = 220;
435 params.rect.p1.y = 350;
436 }
437
438 rc = ui_window_create(ui, &params, &window);
439 if (rc != EOK) {
440 printf("Error creating window.\n");
441 return rc;
442 }
443
444 ui_window_set_cb(window, &window_cb, (void *) &demo);
445 demo.window = window;
446
447 ui_res = ui_window_get_res(window);
448 gc = ui_window_get_gc(window);
449
450 rc = ui_fixed_create(&demo.fixed);
451 if (rc != EOK) {
452 printf("Error creating fixed layout.\n");
453 return rc;
454 }
455
456 rc = ui_menu_bar_create(ui, window, &demo.mbar);
457 if (rc != EOK) {
458 printf("Error creating menu bar.\n");
459 return rc;
460 }
461
462 rc = ui_menu_create(demo.mbar, "File", &demo.mfile);
463 if (rc != EOK) {
464 printf("Error creating menu.\n");
465 return rc;
466 }
467
468 rc = ui_menu_entry_create(demo.mfile, "Message", "", &mmsg);
469 if (rc != EOK) {
470 printf("Error creating menu.\n");
471 return rc;
472 }
473
474 ui_menu_entry_set_cb(mmsg, uidemo_file_message, (void *) &demo);
475
476 rc = ui_menu_entry_create(demo.mfile, "Load", "", &mload);
477 if (rc != EOK) {
478 printf("Error creating menu.\n");
479 return rc;
480 }
481
482 ui_menu_entry_set_cb(mload, uidemo_file_load, (void *) &demo);
483
484 rc = ui_menu_entry_create(demo.mfile, "Foo", "Ctrl-Alt-Del", &mfoo);
485 if (rc != EOK) {
486 printf("Error creating menu.\n");
487 return rc;
488 }
489
490 rc = ui_menu_entry_create(demo.mfile, "Bar", "", &mbar);
491 if (rc != EOK) {
492 printf("Error creating menu.\n");
493 return rc;
494 }
495
496 rc = ui_menu_entry_create(demo.mfile, "Foobar", "", &mfoobar);
497 if (rc != EOK) {
498 printf("Error creating menu.\n");
499 return rc;
500 }
501
502 rc = ui_menu_entry_sep_create(demo.mfile, &mexit);
503 if (rc != EOK) {
504 printf("Error creating menu.\n");
505 return rc;
506 }
507
508 rc = ui_menu_entry_create(demo.mfile, "Exit", "Alt-F4", &mexit);
509 if (rc != EOK) {
510 printf("Error creating menu.\n");
511 return rc;
512 }
513
514 ui_menu_entry_set_cb(mexit, uidemo_file_exit, (void *) &demo);
515
516 rc = ui_menu_create(demo.mbar, "Edit", &demo.medit);
517 if (rc != EOK) {
518 printf("Error creating menu.\n");
519 return rc;
520 }
521
522 rc = ui_menu_create(demo.mbar, "Preferences", &demo.mpreferences);
523 if (rc != EOK) {
524 printf("Error creating menu.\n");
525 return rc;
526 }
527
528 rc = ui_menu_create(demo.mbar, "Help", &demo.mhelp);
529 if (rc != EOK) {
530 printf("Error creating menu.\n");
531 return rc;
532 }
533
534 rc = ui_menu_entry_create(demo.mhelp, "About", "Ctrl-H, F1", &mabout);
535 if (rc != EOK) {
536 printf("Error creating menu.\n");
537 return rc;
538 }
539
540 /* FIXME: Auto layout */
541 if (ui_is_textmode(ui)) {
542 rect.p0.x = 1;
543 rect.p0.y = 2;
544 rect.p1.x = 79;
545 rect.p1.y = 3;
546 } else {
547 rect.p0.x = 4;
548 rect.p0.y = 30;
549 rect.p1.x = 216;
550 rect.p1.y = 52;
551 }
552 ui_menu_bar_set_rect(demo.mbar, &rect);
553
554 rc = ui_fixed_add(demo.fixed, ui_menu_bar_ctl(demo.mbar));
555 if (rc != EOK) {
556 printf("Error adding control to layout.\n");
557 return rc;
558 }
559
560 rc = ui_entry_create(window, "", &demo.entry);
561 if (rc != EOK) {
562 printf("Error creating entry.\n");
563 return rc;
564 }
565
566 /* FIXME: Auto layout */
567 if (ui_is_textmode(ui)) {
568 rect.p0.x = 20;
569 rect.p0.y = 4;
570 rect.p1.x = 60;
571 rect.p1.y = 5;
572 } else {
573 rect.p0.x = 15;
574 rect.p0.y = 53;
575 rect.p1.x = 205;
576 rect.p1.y = 78;
577 }
578
579 ui_entry_set_rect(demo.entry, &rect);
580 ui_entry_set_halign(demo.entry, gfx_halign_center);
581
582 rc = ui_fixed_add(demo.fixed, ui_entry_ctl(demo.entry));
583 if (rc != EOK) {
584 printf("Error adding control to layout.\n");
585 return rc;
586 }
587
588 rc = ui_label_create(ui_res, "Text label", &demo.label);
589 if (rc != EOK) {
590 printf("Error creating label.\n");
591 return rc;
592 }
593
594 /* FIXME: Auto layout */
595 if (ui_is_textmode(ui)) {
596 rect.p0.x = 20;
597 rect.p0.y = 6;
598 rect.p1.x = 60;
599 rect.p1.y = 7;
600 } else {
601 rect.p0.x = 60;
602 rect.p0.y = 88;
603 rect.p1.x = 160;
604 rect.p1.y = 101;
605 }
606
607 ui_label_set_rect(demo.label, &rect);
608 ui_label_set_halign(demo.label, gfx_halign_center);
609
610 rc = ui_fixed_add(demo.fixed, ui_label_ctl(demo.label));
611 if (rc != EOK) {
612 printf("Error adding control to layout.\n");
613 return rc;
614 }
615
616 rc = ui_pbutton_create(ui_res, "OK", &demo.pb1);
617 if (rc != EOK) {
618 printf("Error creating button.\n");
619 return rc;
620 }
621
622 ui_pbutton_set_cb(demo.pb1, &pbutton_cb, (void *) &demo);
623
624 /* FIXME: Auto layout */
625 if (ui_is_textmode(ui)) {
626 rect.p0.x = 20;
627 rect.p0.y = 8;
628 rect.p1.x = 30;
629 rect.p1.y = 9;
630 } else {
631 rect.p0.x = 15;
632 rect.p0.y = 111;
633 rect.p1.x = 105;
634 rect.p1.y = 139;
635 }
636
637 ui_pbutton_set_rect(demo.pb1, &rect);
638
639 ui_pbutton_set_default(demo.pb1, true);
640
641 rc = ui_fixed_add(demo.fixed, ui_pbutton_ctl(demo.pb1));
642 if (rc != EOK) {
643 printf("Error adding control to layout.\n");
644 return rc;
645 }
646
647 rc = ui_pbutton_create(ui_res, "Cancel", &demo.pb2);
648 if (rc != EOK) {
649 printf("Error creating button.\n");
650 return rc;
651 }
652
653 ui_pbutton_set_cb(demo.pb2, &pbutton_cb, (void *) &demo);
654
655 if (ui_is_textmode(ui)) {
656 rect.p0.x = 50;
657 rect.p0.y = 8;
658 rect.p1.x = 60;
659 rect.p1.y = 9;
660 } else {
661 rect.p0.x = 115;
662 rect.p0.y = 111;
663 rect.p1.x = 205;
664 rect.p1.y = 139;
665 }
666
667 ui_pbutton_set_rect(demo.pb2, &rect);
668
669 rc = ui_fixed_add(demo.fixed, ui_pbutton_ctl(demo.pb2));
670 if (rc != EOK) {
671 printf("Error adding control to layout.\n");
672 return rc;
673 }
674
675 gfx_bitmap_params_init(&bparams);
676 bparams.rect.p0.x = 0;
677 bparams.rect.p0.y = 0;
678 bparams.rect.p1.x = 188;
679 bparams.rect.p1.y = 24;
680
681 rc = gfx_bitmap_create(gc, &bparams, NULL, &bitmap);
682 if (rc != EOK)
683 return rc;
684
685 rc = bitmap_moire(bitmap, bparams.rect.p1.x, bparams.rect.p1.y);
686 if (rc != EOK)
687 return rc;
688
689 rc = ui_image_create(ui_res, bitmap, &params.rect, &demo.image);
690 if (rc != EOK) {
691 printf("Error creating label.\n");
692 return rc;
693 }
694
695 off.x = 15;
696 off.y = 155;
697 gfx_rect_translate(&off, &bparams.rect, &rect);
698
699 /* Adjust for frame width (2 x 1 pixel) */
700 rect.p1.x += 2;
701 rect.p1.y += 2;
702 ui_image_set_rect(demo.image, &rect);
703 ui_image_set_flags(demo.image, ui_imgf_frame);
704
705 rc = ui_fixed_add(demo.fixed, ui_image_ctl(demo.image));
706 if (rc != EOK) {
707 printf("Error adding control to layout.\n");
708 return rc;
709 }
710
711 rc = ui_checkbox_create(ui_res, "Read only", &demo.checkbox);
712 if (rc != EOK) {
713 printf("Error creating check box.\n");
714 return rc;
715 }
716
717 ui_checkbox_set_cb(demo.checkbox, &checkbox_cb, (void *) &demo);
718
719 rect.p0.x = 15;
720 rect.p0.y = 190;
721 rect.p1.x = 140;
722 rect.p1.y = 210;
723 ui_checkbox_set_rect(demo.checkbox, &rect);
724
725 rc = ui_fixed_add(demo.fixed, ui_checkbox_ctl(demo.checkbox));
726 if (rc != EOK) {
727 printf("Error adding control to layout.\n");
728 return rc;
729 }
730
731 rc = ui_rbutton_group_create(ui_res, &demo.rbgroup);
732 if (rc != EOK) {
733 printf("Error creating radio button group.\n");
734 return rc;
735 }
736
737 rc = ui_rbutton_create(demo.rbgroup, "Left", (void *) &uidemo_halign[0],
738 &demo.rbleft);
739 if (rc != EOK) {
740 printf("Error creating radio button.\n");
741 return rc;
742 }
743
744 ui_rbutton_group_set_cb(demo.rbgroup, &rbutton_group_cb,
745 (void *) &demo);
746
747 rect.p0.x = 15;
748 rect.p0.y = 220;
749 rect.p1.x = 140;
750 rect.p1.y = 240;
751 ui_rbutton_set_rect(demo.rbleft, &rect);
752
753 rc = ui_fixed_add(demo.fixed, ui_rbutton_ctl(demo.rbleft));
754 if (rc != EOK) {
755 printf("Error adding control to layout.\n");
756 return rc;
757 }
758
759 rc = ui_rbutton_create(demo.rbgroup, "Center", (void *) &uidemo_halign[1],
760 &demo.rbcenter);
761 if (rc != EOK) {
762 printf("Error creating radio button.\n");
763 return rc;
764 }
765
766 rect.p0.x = 15;
767 rect.p0.y = 250;
768 rect.p1.x = 140;
769 rect.p1.y = 270;
770 ui_rbutton_set_rect(demo.rbcenter, &rect);
771 ui_rbutton_select(demo.rbcenter);
772
773 rc = ui_fixed_add(demo.fixed, ui_rbutton_ctl(demo.rbcenter));
774 if (rc != EOK) {
775 printf("Error adding control to layout.\n");
776 return rc;
777 }
778
779 rc = ui_rbutton_create(demo.rbgroup, "Right", (void *) &uidemo_halign[2],
780 &demo.rbright);
781 if (rc != EOK) {
782 printf("Error creating radio button.\n");
783 return rc;
784 }
785
786 rect.p0.x = 15;
787 rect.p0.y = 280;
788 rect.p1.x = 140;
789 rect.p1.y = 300;
790 ui_rbutton_set_rect(demo.rbright, &rect);
791
792 rc = ui_fixed_add(demo.fixed, ui_rbutton_ctl(demo.rbright));
793 if (rc != EOK) {
794 printf("Error adding control to layout.\n");
795 return rc;
796 }
797
798 rc = ui_slider_create(ui_res, "Slide!", &demo.slider);
799 if (rc != EOK) {
800 printf("Error creating button.\n");
801 return rc;
802 }
803
804 ui_slider_set_cb(demo.slider, &slider_cb, (void *) &demo);
805
806 rect.p0.x = 15;
807 rect.p0.y = 310;
808 rect.p1.x = 130;
809 rect.p1.y = 330;
810 ui_slider_set_rect(demo.slider, &rect);
811
812 rc = ui_fixed_add(demo.fixed, ui_slider_ctl(demo.slider));
813 if (rc != EOK) {
814 printf("Error adding control to layout.\n");
815 return rc;
816 }
817
818 ui_window_add(window, ui_fixed_ctl(demo.fixed));
819
820 rc = ui_window_paint(window);
821 if (rc != EOK) {
822 printf("Error painting window.\n");
823 return rc;
824 }
825
826 ui_run(ui);
827
828 ui_window_destroy(window);
829 ui_destroy(ui);
830
831 return EOK;
832}
833
834/** Fill bitmap with moire pattern.
835 *
836 * @param bitmap Bitmap
837 * @param w Bitmap width
838 * @param h Bitmap height
839 * @return EOK on success or an error code
840 */
841static errno_t bitmap_moire(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
842{
843 int i, j;
844 int k;
845 pixelmap_t pixelmap;
846 gfx_bitmap_alloc_t alloc;
847 errno_t rc;
848
849 rc = gfx_bitmap_get_alloc(bitmap, &alloc);
850 if (rc != EOK)
851 return rc;
852
853 /* In absence of anything else, use pixelmap */
854 pixelmap.width = w;
855 pixelmap.height = h;
856 pixelmap.data = alloc.pixels;
857
858 for (i = 0; i < w; i++) {
859 for (j = 0; j < h; j++) {
860 k = i * i + j * j;
861 pixelmap_put_pixel(&pixelmap, i, j,
862 PIXEL(255, k, k, 255 - k));
863 }
864 }
865
866 return EOK;
867}
868
869static void print_syntax(void)
870{
871 printf("Syntax: uidemo [-d <display-spec>]\n");
872}
873
874int main(int argc, char *argv[])
875{
876 const char *display_spec = UI_DISPLAY_DEFAULT;
877 errno_t rc;
878 int i;
879
880 i = 1;
881 while (i < argc && argv[i][0] == '-') {
882 if (str_cmp(argv[i], "-d") == 0) {
883 ++i;
884 if (i >= argc) {
885 printf("Argument missing.\n");
886 print_syntax();
887 return 1;
888 }
889
890 display_spec = argv[i++];
891 } else {
892 printf("Invalid option '%s'.\n", argv[i]);
893 print_syntax();
894 return 1;
895 }
896 }
897
898 if (i < argc) {
899 print_syntax();
900 return 1;
901 }
902
903 rc = ui_demo(display_spec);
904 if (rc != EOK)
905 return 1;
906
907 return 0;
908}
909
910/** @}
911 */
Note: See TracBrowser for help on using the repository browser.