source: mainline/uspace/app/uidemo/uidemo.c@ 06176e1

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

Minimizing windows

  • Property mode set to 100644
File size: 26.9 KB
Line 
1/*
2 * Copyright (c) 2022 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/promptdialog.h>
52#include <ui/resource.h>
53#include <ui/ui.h>
54#include <ui/window.h>
55#include "uidemo.h"
56
57static errno_t bitmap_moire(gfx_bitmap_t *, gfx_coord_t, gfx_coord_t);
58
59static void wnd_close(ui_window_t *, void *);
60
61static ui_window_cb_t window_cb = {
62 .close = wnd_close
63};
64
65static void pb_clicked(ui_pbutton_t *, void *);
66
67static ui_pbutton_cb_t pbutton_cb = {
68 .clicked = pb_clicked
69};
70
71static void checkbox_switched(ui_checkbox_t *, void *, bool);
72
73static ui_checkbox_cb_t checkbox_cb = {
74 .switched = checkbox_switched
75};
76
77static void rb_selected(ui_rbutton_group_t *, void *, void *);
78
79static ui_rbutton_group_cb_t rbutton_group_cb = {
80 .selected = rb_selected
81};
82
83static void slider_moved(ui_slider_t *, void *, gfx_coord_t);
84
85static ui_slider_cb_t slider_cb = {
86 .moved = slider_moved
87};
88
89static void scrollbar_up(ui_scrollbar_t *, void *);
90static void scrollbar_down(ui_scrollbar_t *, void *);
91static void scrollbar_page_up(ui_scrollbar_t *, void *);
92static void scrollbar_page_down(ui_scrollbar_t *, void *);
93static void scrollbar_moved(ui_scrollbar_t *, void *, gfx_coord_t);
94
95static ui_scrollbar_cb_t scrollbar_cb = {
96 .up = scrollbar_up,
97 .down = scrollbar_down,
98 .page_up = scrollbar_page_up,
99 .page_down = scrollbar_page_down,
100 .moved = scrollbar_moved
101};
102
103static void uidemo_file_load(ui_menu_entry_t *, void *);
104static void uidemo_file_message(ui_menu_entry_t *, void *);
105static void uidemo_file_exit(ui_menu_entry_t *, void *);
106static void uidemo_edit_modify(ui_menu_entry_t *, void *);
107
108static void file_dialog_bok(ui_file_dialog_t *, void *, const char *);
109static void file_dialog_bcancel(ui_file_dialog_t *, void *);
110static void file_dialog_close(ui_file_dialog_t *, void *);
111
112static ui_file_dialog_cb_t file_dialog_cb = {
113 .bok = file_dialog_bok,
114 .bcancel = file_dialog_bcancel,
115 .close = file_dialog_close
116};
117
118static void prompt_dialog_bok(ui_prompt_dialog_t *, void *, const char *);
119static void prompt_dialog_bcancel(ui_prompt_dialog_t *, void *);
120static void prompt_dialog_close(ui_prompt_dialog_t *, void *);
121
122static ui_prompt_dialog_cb_t prompt_dialog_cb = {
123 .bok = prompt_dialog_bok,
124 .bcancel = prompt_dialog_bcancel,
125 .close = prompt_dialog_close
126};
127
128static void msg_dialog_button(ui_msg_dialog_t *, void *, unsigned);
129static void msg_dialog_close(ui_msg_dialog_t *, void *);
130
131static ui_msg_dialog_cb_t msg_dialog_cb = {
132 .button = msg_dialog_button,
133 .close = msg_dialog_close
134};
135
136/** Horizontal alignment selected by each radio button */
137static const gfx_halign_t uidemo_halign[3] = {
138 gfx_halign_left,
139 gfx_halign_center,
140 gfx_halign_right
141};
142
143/** Window close button was clicked.
144 *
145 * @param window Window
146 * @param arg Argument (demo)
147 */
148static void wnd_close(ui_window_t *window, void *arg)
149{
150 ui_demo_t *demo = (ui_demo_t *) arg;
151
152 ui_quit(demo->ui);
153}
154
155/** Push button was clicked.
156 *
157 * @param pbutton Push button
158 * @param arg Argument (demo)
159 */
160static void pb_clicked(ui_pbutton_t *pbutton, void *arg)
161{
162 ui_demo_t *demo = (ui_demo_t *) arg;
163 errno_t rc;
164
165 if (pbutton == demo->pb1) {
166 rc = ui_entry_set_text(demo->entry, "OK pressed");
167 if (rc != EOK)
168 printf("Error changing entry text.\n");
169 } else {
170 rc = ui_entry_set_text(demo->entry, "Cancel pressed");
171 if (rc != EOK)
172 printf("Error changing entry text.\n");
173 }
174}
175
176/** Check box was switched.
177 *
178 * @param checkbox Check box
179 * @param arg Argument (demo)
180 */
181static void checkbox_switched(ui_checkbox_t *checkbox, void *arg, bool enable)
182{
183 ui_demo_t *demo = (ui_demo_t *) arg;
184
185 ui_entry_set_read_only(demo->entry, enable);
186}
187
188/** Radio button was selected.
189 *
190 * @param rbgroup Radio button group
191 * @param garg Group argument (demo)
192 * @param barg Button argument
193 */
194static void rb_selected(ui_rbutton_group_t *rbgroup, void *garg, void *barg)
195{
196 ui_demo_t *demo = (ui_demo_t *) garg;
197 gfx_halign_t halign = *(gfx_halign_t *) barg;
198
199 ui_entry_set_halign(demo->entry, halign);
200 (void) ui_entry_paint(demo->entry);
201}
202
203/** Slider was moved.
204 *
205 * @param slider Slider
206 * @param arg Argument (demo)
207 * @param pos Position
208 */
209static void slider_moved(ui_slider_t *slider, void *arg, gfx_coord_t pos)
210{
211 ui_demo_t *demo = (ui_demo_t *) arg;
212 char *str;
213 errno_t rc;
214 int rv;
215
216 rv = asprintf(&str, "Slider at %d of %d", (int) pos,
217 ui_slider_length(slider));
218 if (rv < 0) {
219 printf("Out of memory.\n");
220 return;
221 }
222
223 rc = ui_entry_set_text(demo->entry, str);
224 if (rc != EOK)
225 printf("Error changing entry text.\n");
226 (void) ui_entry_paint(demo->entry);
227
228 free(str);
229}
230
231/** Scrollbar up button pressed.
232 *
233 * @param scrollbar Scrollbar
234 * @param arg Argument (demo)
235 */
236static void scrollbar_up(ui_scrollbar_t *scrollbar, void *arg)
237{
238 gfx_coord_t pos;
239
240 pos = ui_scrollbar_get_pos(scrollbar);
241 ui_scrollbar_set_pos(scrollbar, pos - 1);
242
243 pos = ui_scrollbar_get_pos(scrollbar);
244 scrollbar_moved(scrollbar, arg, pos);
245}
246
247/** Scrollbar down button pressed.
248 *
249 * @param scrollbar Scrollbar
250 * @param arg Argument (demo)
251 */
252static void scrollbar_down(ui_scrollbar_t *scrollbar, void *arg)
253{
254 gfx_coord_t pos;
255
256 pos = ui_scrollbar_get_pos(scrollbar);
257 ui_scrollbar_set_pos(scrollbar, pos + 1);
258
259 pos = ui_scrollbar_get_pos(scrollbar);
260 scrollbar_moved(scrollbar, arg, pos);
261}
262
263/** Scrollbar page up event.
264 *
265 * @param scrollbar Scrollbar
266 * @param arg Argument (demo)
267 */
268static void scrollbar_page_up(ui_scrollbar_t *scrollbar, void *arg)
269{
270 gfx_coord_t pos;
271
272 pos = ui_scrollbar_get_pos(scrollbar);
273 ui_scrollbar_set_pos(scrollbar, pos -
274 ui_scrollbar_through_length(scrollbar) / 4);
275
276 pos = ui_scrollbar_get_pos(scrollbar);
277 scrollbar_moved(scrollbar, arg, pos);
278}
279
280/** Scrollbar page down event.
281 *
282 * @param scrollbar Scrollbar
283 * @param arg Argument (demo)
284 */
285static void scrollbar_page_down(ui_scrollbar_t *scrollbar, void *arg)
286{
287 gfx_coord_t pos;
288
289 pos = ui_scrollbar_get_pos(scrollbar);
290 ui_scrollbar_set_pos(scrollbar, pos +
291 ui_scrollbar_through_length(scrollbar) / 4);
292
293 pos = ui_scrollbar_get_pos(scrollbar);
294 scrollbar_moved(scrollbar, arg, pos);
295}
296
297/** Scrollbar was moved.
298 *
299 * @param scrollbar Scrollbar
300 * @param arg Argument (demo)
301 * @param pos Position
302 */
303static void scrollbar_moved(ui_scrollbar_t *scrollbar, void *arg,
304 gfx_coord_t pos)
305{
306 ui_demo_t *demo = (ui_demo_t *) arg;
307 char *str;
308 errno_t rc;
309 int rv;
310
311 rv = asprintf(&str, "Scrollbar: %d of %d", (int) pos,
312 ui_scrollbar_move_length(scrollbar));
313 if (rv < 0) {
314 printf("Out of memory.\n");
315 return;
316 }
317
318 rc = ui_entry_set_text(demo->entry, str);
319 if (rc != EOK)
320 printf("Error changing entry text.\n");
321 (void) ui_entry_paint(demo->entry);
322
323 free(str);
324}
325
326/** Display a message window.
327 *
328 * @param demo UI demo
329 * @param caption Window caption
330 * @param text Message text
331 */
332static void uidemo_show_message(ui_demo_t *demo, const char *caption,
333 const char *text)
334{
335 ui_msg_dialog_params_t mdparams;
336 ui_msg_dialog_t *dialog;
337 errno_t rc;
338
339 ui_msg_dialog_params_init(&mdparams);
340 mdparams.caption = caption;
341 mdparams.text = text;
342
343 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
344 if (rc != EOK) {
345 printf("Error creating message dialog.\n");
346 return;
347 }
348
349 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
350}
351
352/** File / Load menu entry selected.
353 *
354 * @param mentry Menu entry
355 * @param arg Argument (demo)
356 */
357static void uidemo_file_load(ui_menu_entry_t *mentry, void *arg)
358{
359 ui_demo_t *demo = (ui_demo_t *) arg;
360 ui_file_dialog_params_t fdparams;
361 ui_file_dialog_t *dialog;
362 errno_t rc;
363
364 ui_file_dialog_params_init(&fdparams);
365 fdparams.caption = "Load File";
366
367 rc = ui_file_dialog_create(demo->ui, &fdparams, &dialog);
368 if (rc != EOK) {
369 printf("Error creating message dialog.\n");
370 return;
371 }
372
373 ui_file_dialog_set_cb(dialog, &file_dialog_cb, demo);
374}
375
376/** File / Message menu entry selected.
377 *
378 * @param mentry Menu entry
379 * @param arg Argument (demo)
380 */
381static void uidemo_file_message(ui_menu_entry_t *mentry, void *arg)
382{
383 ui_demo_t *demo = (ui_demo_t *) arg;
384 ui_msg_dialog_params_t mdparams;
385 ui_msg_dialog_t *dialog;
386 errno_t rc;
387
388 ui_msg_dialog_params_init(&mdparams);
389 mdparams.caption = "Message For You";
390 mdparams.text = "Hello, world!";
391
392 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
393 if (rc != EOK) {
394 printf("Error creating message dialog.\n");
395 return;
396 }
397
398 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
399}
400
401/** File / Exit menu entry selected.
402 *
403 * @param mentry Menu entry
404 * @param arg Argument (demo)
405 */
406static void uidemo_file_exit(ui_menu_entry_t *mentry, void *arg)
407{
408 ui_demo_t *demo = (ui_demo_t *) arg;
409
410 ui_quit(demo->ui);
411}
412
413/** Edit / Modify menu entry selected.
414 *
415 * @param mentry Menu entry
416 * @param arg Argument (demo)
417 */
418static void uidemo_edit_modify(ui_menu_entry_t *mentry, void *arg)
419{
420 ui_demo_t *demo = (ui_demo_t *) arg;
421 ui_prompt_dialog_params_t pdparams;
422 ui_prompt_dialog_t *dialog;
423 errno_t rc;
424
425 ui_prompt_dialog_params_init(&pdparams);
426 pdparams.caption = "Modify Entry Text";
427 pdparams.prompt = "Enter New Text";
428
429 rc = ui_prompt_dialog_create(demo->ui, &pdparams, &dialog);
430 if (rc != EOK) {
431 printf("Error creating message dialog.\n");
432 return;
433 }
434
435 ui_prompt_dialog_set_cb(dialog, &prompt_dialog_cb, demo);
436}
437
438/** File dialog OK button press.
439 *
440 * @param dialog File dialog
441 * @param arg Argument (ui_demo_t *)
442 * @param fname File name
443 */
444static void file_dialog_bok(ui_file_dialog_t *dialog, void *arg,
445 const char *fname)
446{
447 ui_demo_t *demo = (ui_demo_t *) arg;
448 char buf[128];
449 char *p;
450 FILE *f;
451
452 ui_file_dialog_destroy(dialog);
453
454 f = fopen(fname, "rt");
455 if (f == NULL) {
456 uidemo_show_message(demo, "Error", "Error opening file.");
457 return;
458 }
459
460 p = fgets(buf, sizeof(buf), f);
461 if (p == NULL) {
462 uidemo_show_message(demo, "Error", "Error reading file.");
463 fclose(f);
464 return;
465 }
466
467 /* Cut string off at the first non-printable character */
468 p = buf;
469 while (*p != '\0') {
470 if (*p < ' ') {
471 *p = '\0';
472 break;
473 }
474 ++p;
475 }
476
477 ui_entry_set_text(demo->entry, buf);
478 fclose(f);
479}
480
481/** File dialog cancel button press.
482 *
483 * @param dialog File dialog
484 * @param arg Argument (ui_demo_t *)
485 */
486static void file_dialog_bcancel(ui_file_dialog_t *dialog, void *arg)
487{
488 ui_demo_t *demo = (ui_demo_t *) arg;
489
490 (void) demo;
491 ui_file_dialog_destroy(dialog);
492}
493
494/** File dialog close request.
495 *
496 * @param dialog File dialog
497 * @param arg Argument (ui_demo_t *)
498 */
499static void file_dialog_close(ui_file_dialog_t *dialog, void *arg)
500{
501 ui_demo_t *demo = (ui_demo_t *) arg;
502
503 (void) demo;
504 ui_file_dialog_destroy(dialog);
505}
506
507/** Prompt dialog OK button press.
508 *
509 * @param dialog Prompt dialog
510 * @param arg Argument (ui_demo_t *)
511 * @param text Submitted text
512 */
513static void prompt_dialog_bok(ui_prompt_dialog_t *dialog, void *arg,
514 const char *text)
515{
516 ui_demo_t *demo = (ui_demo_t *) arg;
517
518 ui_prompt_dialog_destroy(dialog);
519 ui_entry_set_text(demo->entry, text);
520}
521
522/** Prompt dialog cancel button press.
523 *
524 * @param dialog File dialog
525 * @param arg Argument (ui_demo_t *)
526 */
527static void prompt_dialog_bcancel(ui_prompt_dialog_t *dialog, void *arg)
528{
529 ui_demo_t *demo = (ui_demo_t *) arg;
530
531 (void) demo;
532 ui_prompt_dialog_destroy(dialog);
533}
534
535/** Prompt dialog close request.
536 *
537 * @param dialog File dialog
538 * @param arg Argument (ui_demo_t *)
539 */
540static void prompt_dialog_close(ui_prompt_dialog_t *dialog, void *arg)
541{
542 ui_demo_t *demo = (ui_demo_t *) arg;
543
544 (void) demo;
545 ui_prompt_dialog_destroy(dialog);
546}
547
548/** Message dialog button press.
549 *
550 * @param dialog Message dialog
551 * @param arg Argument (ui_demo_t *)
552 * @param bnum Button number
553 */
554static void msg_dialog_button(ui_msg_dialog_t *dialog, void *arg,
555 unsigned bnum)
556{
557 ui_demo_t *demo = (ui_demo_t *) arg;
558
559 (void) demo;
560 ui_msg_dialog_destroy(dialog);
561}
562
563/** Message dialog close request.
564 *
565 * @param dialog Message dialog
566 * @param arg Argument (ui_demo_t *)
567 */
568static void msg_dialog_close(ui_msg_dialog_t *dialog, void *arg)
569{
570 ui_demo_t *demo = (ui_demo_t *) arg;
571
572 (void) demo;
573 ui_msg_dialog_destroy(dialog);
574}
575
576/** Run UI demo on display server. */
577static errno_t ui_demo(const char *display_spec)
578{
579 ui_t *ui = NULL;
580 ui_wnd_params_t params;
581 ui_window_t *window = NULL;
582 ui_demo_t demo;
583 gfx_rect_t rect;
584 gfx_context_t *gc;
585 ui_resource_t *ui_res;
586 gfx_bitmap_params_t bparams;
587 gfx_bitmap_t *bitmap;
588 gfx_coord2_t off;
589 ui_menu_entry_t *mmsg;
590 ui_menu_entry_t *mload;
591 ui_menu_entry_t *mfoo;
592 ui_menu_entry_t *mbar;
593 ui_menu_entry_t *mfoobar;
594 ui_menu_entry_t *msep;
595 ui_menu_entry_t *mexit;
596 ui_menu_entry_t *mmodify;
597 ui_menu_entry_t *mabout;
598 errno_t rc;
599
600 rc = ui_create(display_spec, &ui);
601 if (rc != EOK) {
602 printf("Error creating UI on display %s.\n", display_spec);
603 return rc;
604 }
605
606 memset((void *) &demo, 0, sizeof(demo));
607 demo.ui = ui;
608
609 ui_wnd_params_init(&params);
610 params.caption = "UI Demo";
611 params.style |= ui_wds_minimize_btn | ui_wds_maximize_btn |
612 ui_wds_resizable;
613
614 /* FIXME: Auto layout */
615 if (ui_is_textmode(ui)) {
616 params.rect.p0.x = 0;
617 params.rect.p0.y = 0;
618 params.rect.p1.x = 44;
619 params.rect.p1.y = 23;
620 } else {
621 params.rect.p0.x = 0;
622 params.rect.p0.y = 0;
623 params.rect.p1.x = 250;
624 params.rect.p1.y = 370;
625 }
626
627 rc = ui_window_create(ui, &params, &window);
628 if (rc != EOK) {
629 printf("Error creating window.\n");
630 return rc;
631 }
632
633 ui_window_set_cb(window, &window_cb, (void *) &demo);
634 demo.window = window;
635
636 ui_res = ui_window_get_res(window);
637 gc = ui_window_get_gc(window);
638
639 rc = ui_fixed_create(&demo.fixed);
640 if (rc != EOK) {
641 printf("Error creating fixed layout.\n");
642 return rc;
643 }
644
645 rc = ui_menu_bar_create(ui, window, &demo.mbar);
646 if (rc != EOK) {
647 printf("Error creating menu bar.\n");
648 return rc;
649 }
650
651 rc = ui_menu_create(demo.mbar, "~F~ile", &demo.mfile);
652 if (rc != EOK) {
653 printf("Error creating menu.\n");
654 return rc;
655 }
656
657 rc = ui_menu_entry_create(demo.mfile, "~M~essage", "", &mmsg);
658 if (rc != EOK) {
659 printf("Error creating menu.\n");
660 return rc;
661 }
662
663 ui_menu_entry_set_cb(mmsg, uidemo_file_message, (void *) &demo);
664
665 rc = ui_menu_entry_create(demo.mfile, "~L~oad", "", &mload);
666 if (rc != EOK) {
667 printf("Error creating menu.\n");
668 return rc;
669 }
670
671 ui_menu_entry_set_cb(mload, uidemo_file_load, (void *) &demo);
672
673 rc = ui_menu_entry_create(demo.mfile, "~F~oo", "Ctrl-Alt-Del", &mfoo);
674 if (rc != EOK) {
675 printf("Error creating menu.\n");
676 return rc;
677 }
678
679 rc = ui_menu_entry_create(demo.mfile, "~B~ar", "", &mbar);
680 if (rc != EOK) {
681 printf("Error creating menu.\n");
682 return rc;
683 }
684
685 rc = ui_menu_entry_create(demo.mfile, "F~o~obar", "", &mfoobar);
686 if (rc != EOK) {
687 printf("Error creating menu.\n");
688 return rc;
689 }
690
691 rc = ui_menu_entry_sep_create(demo.mfile, &msep);
692 if (rc != EOK) {
693 printf("Error creating menu.\n");
694 return rc;
695 }
696
697 rc = ui_menu_entry_create(demo.mfile, "E~x~it", "Alt-F4", &mexit);
698 if (rc != EOK) {
699 printf("Error creating menu.\n");
700 return rc;
701 }
702
703 ui_menu_entry_set_cb(mexit, uidemo_file_exit, (void *) &demo);
704
705 rc = ui_menu_create(demo.mbar, "~E~dit", &demo.medit);
706 if (rc != EOK) {
707 printf("Error creating menu.\n");
708 return rc;
709 }
710
711 rc = ui_menu_entry_create(demo.medit, "~M~odify", "", &mmodify);
712 if (rc != EOK) {
713 printf("Error creating menu.\n");
714 return rc;
715 }
716
717 ui_menu_entry_set_cb(mmodify, uidemo_edit_modify, (void *) &demo);
718
719 rc = ui_menu_create(demo.mbar, "~P~references", &demo.mpreferences);
720 if (rc != EOK) {
721 printf("Error creating menu.\n");
722 return rc;
723 }
724
725 rc = ui_menu_create(demo.mbar, "~H~elp", &demo.mhelp);
726 if (rc != EOK) {
727 printf("Error creating menu.\n");
728 return rc;
729 }
730
731 rc = ui_menu_entry_create(demo.mhelp, "~A~bout", "Ctrl-H, F1", &mabout);
732 if (rc != EOK) {
733 printf("Error creating menu.\n");
734 return rc;
735 }
736
737 /* FIXME: Auto layout */
738 if (ui_is_textmode(ui)) {
739 rect.p0.x = 1;
740 rect.p0.y = 1;
741 rect.p1.x = 43;
742 rect.p1.y = 2;
743 } else {
744 rect.p0.x = 4;
745 rect.p0.y = 30;
746 rect.p1.x = 216;
747 rect.p1.y = 52;
748 }
749 ui_menu_bar_set_rect(demo.mbar, &rect);
750
751 rc = ui_fixed_add(demo.fixed, ui_menu_bar_ctl(demo.mbar));
752 if (rc != EOK) {
753 printf("Error adding control to layout.\n");
754 return rc;
755 }
756
757 rc = ui_entry_create(window, "", &demo.entry);
758 if (rc != EOK) {
759 printf("Error creating entry.\n");
760 return rc;
761 }
762
763 /* FIXME: Auto layout */
764 if (ui_is_textmode(ui)) {
765 rect.p0.x = 2;
766 rect.p0.y = 3;
767 rect.p1.x = 39;
768 rect.p1.y = 4;
769 } else {
770 rect.p0.x = 15;
771 rect.p0.y = 53;
772 rect.p1.x = 205;
773 rect.p1.y = 78;
774 }
775
776 ui_entry_set_rect(demo.entry, &rect);
777 ui_entry_set_halign(demo.entry, gfx_halign_center);
778
779 rc = ui_fixed_add(demo.fixed, ui_entry_ctl(demo.entry));
780 if (rc != EOK) {
781 printf("Error adding control to layout.\n");
782 return rc;
783 }
784
785 rc = ui_label_create(ui_res, "Text label", &demo.label);
786 if (rc != EOK) {
787 printf("Error creating label.\n");
788 return rc;
789 }
790
791 /* FIXME: Auto layout */
792 if (ui_is_textmode(ui)) {
793 rect.p0.x = 2;
794 rect.p0.y = 5;
795 rect.p1.x = 42;
796 rect.p1.y = 6;
797 } else {
798 rect.p0.x = 60;
799 rect.p0.y = 88;
800 rect.p1.x = 160;
801 rect.p1.y = 101;
802 }
803
804 ui_label_set_rect(demo.label, &rect);
805 ui_label_set_halign(demo.label, gfx_halign_center);
806
807 rc = ui_fixed_add(demo.fixed, ui_label_ctl(demo.label));
808 if (rc != EOK) {
809 printf("Error adding control to layout.\n");
810 return rc;
811 }
812
813 rc = ui_pbutton_create(ui_res, "OK", &demo.pb1);
814 if (rc != EOK) {
815 printf("Error creating button.\n");
816 return rc;
817 }
818
819 ui_pbutton_set_cb(demo.pb1, &pbutton_cb, (void *) &demo);
820
821 /* FIXME: Auto layout */
822 if (ui_is_textmode(ui)) {
823 rect.p0.x = 2;
824 rect.p0.y = 7;
825 rect.p1.x = 12;
826 rect.p1.y = 8;
827 } else {
828 rect.p0.x = 15;
829 rect.p0.y = 111;
830 rect.p1.x = 105;
831 rect.p1.y = 139;
832 }
833
834 ui_pbutton_set_rect(demo.pb1, &rect);
835
836 ui_pbutton_set_default(demo.pb1, true);
837
838 rc = ui_fixed_add(demo.fixed, ui_pbutton_ctl(demo.pb1));
839 if (rc != EOK) {
840 printf("Error adding control to layout.\n");
841 return rc;
842 }
843
844 rc = ui_pbutton_create(ui_res, "Cancel", &demo.pb2);
845 if (rc != EOK) {
846 printf("Error creating button.\n");
847 return rc;
848 }
849
850 ui_pbutton_set_cb(demo.pb2, &pbutton_cb, (void *) &demo);
851
852 if (ui_is_textmode(ui)) {
853 rect.p0.x = 29;
854 rect.p0.y = 7;
855 rect.p1.x = 39;
856 rect.p1.y = 8;
857 } else {
858 rect.p0.x = 115;
859 rect.p0.y = 111;
860 rect.p1.x = 205;
861 rect.p1.y = 139;
862 }
863
864 ui_pbutton_set_rect(demo.pb2, &rect);
865
866 rc = ui_fixed_add(demo.fixed, ui_pbutton_ctl(demo.pb2));
867 if (rc != EOK) {
868 printf("Error adding control to layout.\n");
869 return rc;
870 }
871
872 gfx_bitmap_params_init(&bparams);
873 if (ui_is_textmode(ui)) {
874 bparams.rect.p0.x = 0;
875 bparams.rect.p0.y = 0;
876 bparams.rect.p1.x = 37;
877 bparams.rect.p1.y = 2;
878 } else {
879 bparams.rect.p0.x = 0;
880 bparams.rect.p0.y = 0;
881 bparams.rect.p1.x = 188;
882 bparams.rect.p1.y = 24;
883 }
884
885 rc = gfx_bitmap_create(gc, &bparams, NULL, &bitmap);
886 if (rc != EOK)
887 return rc;
888
889 rc = bitmap_moire(bitmap, bparams.rect.p1.x, bparams.rect.p1.y);
890 if (rc != EOK)
891 return rc;
892
893 rc = ui_image_create(ui_res, bitmap, &params.rect, &demo.image);
894 if (rc != EOK) {
895 printf("Error creating label.\n");
896 return rc;
897 }
898
899 if (ui_is_textmode(ui)) {
900 off.x = 2;
901 off.y = 9;
902 } else {
903 off.x = 15;
904 off.y = 155;
905 }
906
907 gfx_rect_translate(&off, &bparams.rect, &rect);
908
909 /* Adjust for frame width (2 x 1 pixel) */
910 if (!ui_is_textmode(ui)) {
911 ui_image_set_flags(demo.image, ui_imgf_frame);
912 rect.p1.x += 2;
913 rect.p1.y += 2;
914 }
915
916 ui_image_set_rect(demo.image, &rect);
917
918 rc = ui_fixed_add(demo.fixed, ui_image_ctl(demo.image));
919 if (rc != EOK) {
920 printf("Error adding control to layout.\n");
921 return rc;
922 }
923
924 rc = ui_checkbox_create(ui_res, "Read only", &demo.checkbox);
925 if (rc != EOK) {
926 printf("Error creating check box.\n");
927 return rc;
928 }
929
930 ui_checkbox_set_cb(demo.checkbox, &checkbox_cb, (void *) &demo);
931
932 /* FIXME: Auto layout */
933 if (ui_is_textmode(ui)) {
934 rect.p0.x = 2;
935 rect.p0.y = 12;
936 rect.p1.x = 12;
937 rect.p1.y = 13;
938 } else {
939 rect.p0.x = 15;
940 rect.p0.y = 190;
941 rect.p1.x = 140;
942 rect.p1.y = 210;
943 }
944
945 ui_checkbox_set_rect(demo.checkbox, &rect);
946
947 rc = ui_fixed_add(demo.fixed, ui_checkbox_ctl(demo.checkbox));
948 if (rc != EOK) {
949 printf("Error adding control to layout.\n");
950 return rc;
951 }
952
953 rc = ui_rbutton_group_create(ui_res, &demo.rbgroup);
954 if (rc != EOK) {
955 printf("Error creating radio button group.\n");
956 return rc;
957 }
958
959 rc = ui_rbutton_create(demo.rbgroup, "Left", (void *) &uidemo_halign[0],
960 &demo.rbleft);
961 if (rc != EOK) {
962 printf("Error creating radio button.\n");
963 return rc;
964 }
965
966 ui_rbutton_group_set_cb(demo.rbgroup, &rbutton_group_cb,
967 (void *) &demo);
968
969 /* FIXME: Auto layout */
970 if (ui_is_textmode(ui)) {
971 rect.p0.x = 2;
972 rect.p0.y = 14;
973 rect.p1.x = 12;
974 rect.p1.y = 15;
975 } else {
976 rect.p0.x = 15;
977 rect.p0.y = 220;
978 rect.p1.x = 140;
979 rect.p1.y = 240;
980 }
981 ui_rbutton_set_rect(demo.rbleft, &rect);
982
983 rc = ui_fixed_add(demo.fixed, ui_rbutton_ctl(demo.rbleft));
984 if (rc != EOK) {
985 printf("Error adding control to layout.\n");
986 return rc;
987 }
988
989 rc = ui_rbutton_create(demo.rbgroup, "Center", (void *) &uidemo_halign[1],
990 &demo.rbcenter);
991 if (rc != EOK) {
992 printf("Error creating radio button.\n");
993 return rc;
994 }
995
996 /* FIXME: Auto layout */
997 if (ui_is_textmode(ui)) {
998 rect.p0.x = 2;
999 rect.p0.y = 15;
1000 rect.p1.x = 12;
1001 rect.p1.y = 16;
1002 } else {
1003 rect.p0.x = 15;
1004 rect.p0.y = 250;
1005 rect.p1.x = 140;
1006 rect.p1.y = 270;
1007 }
1008 ui_rbutton_set_rect(demo.rbcenter, &rect);
1009 ui_rbutton_select(demo.rbcenter);
1010
1011 rc = ui_fixed_add(demo.fixed, ui_rbutton_ctl(demo.rbcenter));
1012 if (rc != EOK) {
1013 printf("Error adding control to layout.\n");
1014 return rc;
1015 }
1016
1017 rc = ui_rbutton_create(demo.rbgroup, "Right", (void *) &uidemo_halign[2],
1018 &demo.rbright);
1019 if (rc != EOK) {
1020 printf("Error creating radio button.\n");
1021 return rc;
1022 }
1023
1024 /* FIXME: Auto layout */
1025 if (ui_is_textmode(ui)) {
1026 rect.p0.x = 2;
1027 rect.p0.y = 16;
1028 rect.p1.x = 12;
1029 rect.p1.y = 17;
1030 } else {
1031 rect.p0.x = 15;
1032 rect.p0.y = 280;
1033 rect.p1.x = 140;
1034 rect.p1.y = 300;
1035 }
1036 ui_rbutton_set_rect(demo.rbright, &rect);
1037
1038 rc = ui_fixed_add(demo.fixed, ui_rbutton_ctl(demo.rbright));
1039 if (rc != EOK) {
1040 printf("Error adding control to layout.\n");
1041 return rc;
1042 }
1043
1044 rc = ui_slider_create(ui_res, &demo.slider);
1045 if (rc != EOK) {
1046 printf("Error creating button.\n");
1047 return rc;
1048 }
1049
1050 ui_slider_set_cb(demo.slider, &slider_cb, (void *) &demo);
1051
1052 /* FIXME: Auto layout */
1053 if (ui_is_textmode(ui)) {
1054 rect.p0.x = 2;
1055 rect.p0.y = 18;
1056 rect.p1.x = 28;
1057 rect.p1.y = 19;
1058 } else {
1059 rect.p0.x = 15;
1060 rect.p0.y = 310;
1061 rect.p1.x = 130;
1062 rect.p1.y = 330;
1063 }
1064
1065 ui_slider_set_rect(demo.slider, &rect);
1066
1067 rc = ui_fixed_add(demo.fixed, ui_slider_ctl(demo.slider));
1068 if (rc != EOK) {
1069 printf("Error adding control to layout.\n");
1070 return rc;
1071 }
1072
1073 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &demo.hscrollbar);
1074 if (rc != EOK) {
1075 printf("Error creating scrollbar.\n");
1076 return rc;
1077 }
1078
1079 ui_scrollbar_set_cb(demo.hscrollbar, &scrollbar_cb, (void *) &demo);
1080
1081 /* FIXME: Auto layout */
1082 if (ui_is_textmode(ui)) {
1083 rect.p0.x = 2;
1084 rect.p0.y = 20;
1085 rect.p1.x = 40;
1086 rect.p1.y = 21;
1087 } else {
1088 rect.p0.x = 15;
1089 rect.p0.y = 340;
1090 rect.p1.x = 220;
1091 rect.p1.y = 363;
1092 }
1093
1094 ui_scrollbar_set_rect(demo.hscrollbar, &rect);
1095
1096 ui_scrollbar_set_thumb_length(demo.hscrollbar,
1097 ui_scrollbar_through_length(demo.hscrollbar) / 4);
1098
1099 rc = ui_fixed_add(demo.fixed, ui_scrollbar_ctl(demo.hscrollbar));
1100 if (rc != EOK) {
1101 printf("Error adding control to layout.\n");
1102 return rc;
1103 }
1104
1105 rc = ui_scrollbar_create(ui, window, ui_sbd_vert, &demo.vscrollbar);
1106 if (rc != EOK) {
1107 printf("Error creating button.\n");
1108 return rc;
1109 }
1110
1111 ui_scrollbar_set_cb(demo.vscrollbar, &scrollbar_cb, (void *) &demo);
1112
1113 /* FIXME: Auto layout */
1114 if (ui_is_textmode(ui)) {
1115 rect.p0.x = 40;
1116 rect.p0.y = 3;
1117 rect.p1.x = 41;
1118 rect.p1.y = 20;
1119 } else {
1120 rect.p0.x = 220;
1121 rect.p0.y = 53;
1122 rect.p1.x = 243;
1123 rect.p1.y = 340;
1124 }
1125
1126 ui_scrollbar_set_rect(demo.vscrollbar, &rect);
1127
1128 ui_scrollbar_set_thumb_length(demo.vscrollbar,
1129 ui_scrollbar_through_length(demo.vscrollbar) / 4);
1130
1131 rc = ui_fixed_add(demo.fixed, ui_scrollbar_ctl(demo.vscrollbar));
1132 if (rc != EOK) {
1133 printf("Error adding control to layout.\n");
1134 return rc;
1135 }
1136
1137 ui_window_add(window, ui_fixed_ctl(demo.fixed));
1138
1139 rc = ui_window_paint(window);
1140 if (rc != EOK) {
1141 printf("Error painting window.\n");
1142 return rc;
1143 }
1144
1145 ui_run(ui);
1146
1147 ui_window_destroy(window);
1148 ui_destroy(ui);
1149
1150 return EOK;
1151}
1152
1153/** Fill bitmap with moire pattern.
1154 *
1155 * @param bitmap Bitmap
1156 * @param w Bitmap width
1157 * @param h Bitmap height
1158 * @return EOK on success or an error code
1159 */
1160static errno_t bitmap_moire(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
1161{
1162 int i, j;
1163 int k;
1164 pixelmap_t pixelmap;
1165 gfx_bitmap_alloc_t alloc;
1166 errno_t rc;
1167
1168 rc = gfx_bitmap_get_alloc(bitmap, &alloc);
1169 if (rc != EOK)
1170 return rc;
1171
1172 /* In absence of anything else, use pixelmap */
1173 pixelmap.width = w;
1174 pixelmap.height = h;
1175 pixelmap.data = alloc.pixels;
1176
1177 for (i = 0; i < w; i++) {
1178 for (j = 0; j < h; j++) {
1179 k = i * i + j * j;
1180 pixelmap_put_pixel(&pixelmap, i, j,
1181 PIXEL(0, k, k, 255 - k));
1182 }
1183 }
1184
1185 return EOK;
1186}
1187
1188static void print_syntax(void)
1189{
1190 printf("Syntax: uidemo [-d <display-spec>]\n");
1191}
1192
1193int main(int argc, char *argv[])
1194{
1195 const char *display_spec = UI_ANY_DEFAULT;
1196 errno_t rc;
1197 int i;
1198
1199 i = 1;
1200 while (i < argc && argv[i][0] == '-') {
1201 if (str_cmp(argv[i], "-d") == 0) {
1202 ++i;
1203 if (i >= argc) {
1204 printf("Argument missing.\n");
1205 print_syntax();
1206 return 1;
1207 }
1208
1209 display_spec = argv[i++];
1210 } else {
1211 printf("Invalid option '%s'.\n", argv[i]);
1212 print_syntax();
1213 return 1;
1214 }
1215 }
1216
1217 if (i < argc) {
1218 print_syntax();
1219 return 1;
1220 }
1221
1222 rc = ui_demo(display_spec);
1223 if (rc != EOK)
1224 return 1;
1225
1226 return 0;
1227}
1228
1229/** @}
1230 */
Note: See TracBrowser for help on using the repository browser.