source: mainline/uspace/app/uidemo/uidemo.c@ 112f70a

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 112f70a was 112f70a, checked in by Jiri Svoboda <jiri@…>, 22 months ago

Allow menu entries to be disabled

  • Property mode set to 100644
File size: 32.5 KB
RevLine 
[f80690a]1/*
[1eaead4]2 * Copyright (c) 2023 Jiri Svoboda
[f80690a]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
[d8ddf7a]35#include <gfx/bitmap.h>
[c9a7adc]36#include <gfx/coord.h>
[d8ddf7a]37#include <io/pixelmap.h>
[f80690a]38#include <stdio.h>
[ef734b7]39#include <stdlib.h>
[f80690a]40#include <str.h>
[d8ddf7a]41#include <ui/entry.h>
[5e109e1]42#include <ui/filedialog.h>
[8009dc27]43#include <ui/fixed.h>
[d8ddf7a]44#include <ui/image.h>
[ba09d06]45#include <ui/label.h>
[7cf5ddb]46#include <ui/list.h>
[46bd63c9]47#include <ui/menu.h>
[214aefb]48#include <ui/menubar.h>
[46bd63c9]49#include <ui/menudd.h>
[214aefb]50#include <ui/menuentry.h>
[252d03c]51#include <ui/msgdialog.h>
[f80690a]52#include <ui/pbutton.h>
[80d4aea]53#include <ui/promptdialog.h>
[47728678]54#include <ui/resource.h>
[c0757e1f]55#include <ui/selectdialog.h>
[1eaead4]56#include <ui/tab.h>
57#include <ui/tabset.h>
[d284ce9]58#include <ui/ui.h>
59#include <ui/window.h>
[f6df5a3]60#include "uidemo.h"
[47728678]61
[d8ddf7a]62static errno_t bitmap_moire(gfx_bitmap_t *, gfx_coord_t, gfx_coord_t);
63
[d284ce9]64static void wnd_close(ui_window_t *, void *);
65
66static ui_window_cb_t window_cb = {
[b71c0fc]67 .close = wnd_close
[47728678]68};
69
[8ef48ece]70static void pb_clicked(ui_pbutton_t *, void *);
71
72static ui_pbutton_cb_t pbutton_cb = {
73 .clicked = pb_clicked
74};
75
[d70dc1c4]76static void checkbox_switched(ui_checkbox_t *, void *, bool);
77
78static ui_checkbox_cb_t checkbox_cb = {
79 .switched = checkbox_switched
80};
81
[7020d1f]82static void rb_selected(ui_rbutton_group_t *, void *, void *);
83
84static ui_rbutton_group_cb_t rbutton_group_cb = {
85 .selected = rb_selected
86};
87
[ef734b7]88static void slider_moved(ui_slider_t *, void *, gfx_coord_t);
89
90static ui_slider_cb_t slider_cb = {
91 .moved = slider_moved
92};
93
[bd16113]94static void scrollbar_up(ui_scrollbar_t *, void *);
95static void scrollbar_down(ui_scrollbar_t *, void *);
[1026cc4]96static void scrollbar_page_up(ui_scrollbar_t *, void *);
97static void scrollbar_page_down(ui_scrollbar_t *, void *);
[bd16113]98static void scrollbar_moved(ui_scrollbar_t *, void *, gfx_coord_t);
99
100static ui_scrollbar_cb_t scrollbar_cb = {
101 .up = scrollbar_up,
102 .down = scrollbar_down,
[1026cc4]103 .page_up = scrollbar_page_up,
104 .page_down = scrollbar_page_down,
[bd16113]105 .moved = scrollbar_moved
106};
107
[5e109e1]108static void uidemo_file_load(ui_menu_entry_t *, void *);
[252d03c]109static void uidemo_file_message(ui_menu_entry_t *, void *);
[214aefb]110static void uidemo_file_exit(ui_menu_entry_t *, void *);
[80d4aea]111static void uidemo_edit_modify(ui_menu_entry_t *, void *);
[c0757e1f]112static void uidemo_edit_insert_character(ui_menu_entry_t *, void *);
[214aefb]113
[5e109e1]114static void file_dialog_bok(ui_file_dialog_t *, void *, const char *);
115static void file_dialog_bcancel(ui_file_dialog_t *, void *);
116static void file_dialog_close(ui_file_dialog_t *, void *);
117
118static ui_file_dialog_cb_t file_dialog_cb = {
119 .bok = file_dialog_bok,
120 .bcancel = file_dialog_bcancel,
121 .close = file_dialog_close
122};
123
[80d4aea]124static void prompt_dialog_bok(ui_prompt_dialog_t *, void *, const char *);
125static void prompt_dialog_bcancel(ui_prompt_dialog_t *, void *);
126static void prompt_dialog_close(ui_prompt_dialog_t *, void *);
127
128static ui_prompt_dialog_cb_t prompt_dialog_cb = {
129 .bok = prompt_dialog_bok,
130 .bcancel = prompt_dialog_bcancel,
131 .close = prompt_dialog_close
132};
133
[c0757e1f]134static void select_dialog_bok(ui_select_dialog_t *, void *, void *);
135static void select_dialog_bcancel(ui_select_dialog_t *, void *);
136static void select_dialog_close(ui_select_dialog_t *, void *);
137
138static ui_select_dialog_cb_t select_dialog_cb = {
139 .bok = select_dialog_bok,
140 .bcancel = select_dialog_bcancel,
141 .close = select_dialog_close
142};
143
[252d03c]144static void msg_dialog_button(ui_msg_dialog_t *, void *, unsigned);
145static void msg_dialog_close(ui_msg_dialog_t *, void *);
146
147static ui_msg_dialog_cb_t msg_dialog_cb = {
148 .button = msg_dialog_button,
149 .close = msg_dialog_close
150};
151
[5de71df]152/** Horizontal alignment selected by each radio button */
153static const gfx_halign_t uidemo_halign[3] = {
154 gfx_halign_left,
155 gfx_halign_center,
156 gfx_halign_right
157};
158
[d284ce9]159/** Window close button was clicked.
160 *
161 * @param window Window
162 * @param arg Argument (demo)
163 */
164static void wnd_close(ui_window_t *window, void *arg)
[47728678]165{
[20d2c6c]166 ui_demo_t *demo = (ui_demo_t *) arg;
167
[d284ce9]168 ui_quit(demo->ui);
[47728678]169}
170
[8ef48ece]171/** Push button was clicked.
172 *
173 * @param pbutton Push button
174 * @param arg Argument (demo)
175 */
176static void pb_clicked(ui_pbutton_t *pbutton, void *arg)
177{
178 ui_demo_t *demo = (ui_demo_t *) arg;
[ba09d06]179 errno_t rc;
[8ef48ece]180
181 if (pbutton == demo->pb1) {
[d8ddf7a]182 rc = ui_entry_set_text(demo->entry, "OK pressed");
[ba09d06]183 if (rc != EOK)
[d8ddf7a]184 printf("Error changing entry text.\n");
[8ef48ece]185 } else {
[d8ddf7a]186 rc = ui_entry_set_text(demo->entry, "Cancel pressed");
[ba09d06]187 if (rc != EOK)
[d8ddf7a]188 printf("Error changing entry text.\n");
[8ef48ece]189 }
190}
191
[d70dc1c4]192/** Check box was switched.
193 *
194 * @param checkbox Check box
195 * @param arg Argument (demo)
196 */
197static void checkbox_switched(ui_checkbox_t *checkbox, void *arg, bool enable)
198{
199 ui_demo_t *demo = (ui_demo_t *) arg;
200
[5de71df]201 ui_entry_set_read_only(demo->entry, enable);
[d70dc1c4]202}
203
[7020d1f]204/** Radio button was selected.
205 *
206 * @param rbgroup Radio button group
207 * @param garg Group argument (demo)
208 * @param barg Button argument
209 */
210static void rb_selected(ui_rbutton_group_t *rbgroup, void *garg, void *barg)
211{
212 ui_demo_t *demo = (ui_demo_t *) garg;
[5de71df]213 gfx_halign_t halign = *(gfx_halign_t *) barg;
[7020d1f]214
[5de71df]215 ui_entry_set_halign(demo->entry, halign);
[7020d1f]216 (void) ui_entry_paint(demo->entry);
217}
218
[ef734b7]219/** Slider was moved.
220 *
221 * @param slider Slider
222 * @param arg Argument (demo)
223 * @param pos Position
224 */
225static void slider_moved(ui_slider_t *slider, void *arg, gfx_coord_t pos)
226{
227 ui_demo_t *demo = (ui_demo_t *) arg;
228 char *str;
229 errno_t rc;
230 int rv;
231
232 rv = asprintf(&str, "Slider at %d of %d", (int) pos,
233 ui_slider_length(slider));
234 if (rv < 0) {
235 printf("Out of memory.\n");
236 return;
237 }
238
239 rc = ui_entry_set_text(demo->entry, str);
240 if (rc != EOK)
241 printf("Error changing entry text.\n");
242 (void) ui_entry_paint(demo->entry);
243
244 free(str);
245}
246
[bd16113]247/** Scrollbar up button pressed.
248 *
249 * @param scrollbar Scrollbar
250 * @param arg Argument (demo)
251 */
252static void scrollbar_up(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);
[1026cc4]260 scrollbar_moved(scrollbar, arg, pos);
[bd16113]261}
262
263/** Scrollbar down button pressed.
264 *
265 * @param scrollbar Scrollbar
266 * @param arg Argument (demo)
267 */
268static void scrollbar_down(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 + 1);
274
275 pos = ui_scrollbar_get_pos(scrollbar);
[1026cc4]276 scrollbar_moved(scrollbar, arg, pos);
277}
[bd16113]278
[1026cc4]279/** Scrollbar page up event.
280 *
281 * @param scrollbar Scrollbar
282 * @param arg Argument (demo)
283 */
284static void scrollbar_page_up(ui_scrollbar_t *scrollbar, void *arg)
285{
286 gfx_coord_t pos;
[bd16113]287
[1026cc4]288 pos = ui_scrollbar_get_pos(scrollbar);
289 ui_scrollbar_set_pos(scrollbar, pos -
290 ui_scrollbar_through_length(scrollbar) / 4);
[bd16113]291
[1026cc4]292 pos = ui_scrollbar_get_pos(scrollbar);
293 scrollbar_moved(scrollbar, arg, pos);
294}
295
296/** Scrollbar page down event.
297 *
298 * @param scrollbar Scrollbar
299 * @param arg Argument (demo)
300 */
301static void scrollbar_page_down(ui_scrollbar_t *scrollbar, void *arg)
302{
303 gfx_coord_t pos;
304
305 pos = ui_scrollbar_get_pos(scrollbar);
306 ui_scrollbar_set_pos(scrollbar, pos +
307 ui_scrollbar_through_length(scrollbar) / 4);
308
309 pos = ui_scrollbar_get_pos(scrollbar);
310 scrollbar_moved(scrollbar, arg, pos);
[bd16113]311}
312
313/** Scrollbar was moved.
314 *
315 * @param scrollbar Scrollbar
316 * @param arg Argument (demo)
317 * @param pos Position
318 */
319static void scrollbar_moved(ui_scrollbar_t *scrollbar, void *arg,
320 gfx_coord_t pos)
321{
322 ui_demo_t *demo = (ui_demo_t *) arg;
323 char *str;
324 errno_t rc;
325 int rv;
326
327 rv = asprintf(&str, "Scrollbar: %d of %d", (int) pos,
328 ui_scrollbar_move_length(scrollbar));
329 if (rv < 0) {
330 printf("Out of memory.\n");
331 return;
332 }
333
334 rc = ui_entry_set_text(demo->entry, str);
335 if (rc != EOK)
336 printf("Error changing entry text.\n");
337 (void) ui_entry_paint(demo->entry);
338
339 free(str);
340}
341
[5e109e1]342/** Display a message window.
343 *
344 * @param demo UI demo
345 * @param caption Window caption
346 * @param text Message text
347 */
348static void uidemo_show_message(ui_demo_t *demo, const char *caption,
349 const char *text)
350{
351 ui_msg_dialog_params_t mdparams;
352 ui_msg_dialog_t *dialog;
353 errno_t rc;
354
355 ui_msg_dialog_params_init(&mdparams);
356 mdparams.caption = caption;
357 mdparams.text = text;
358
359 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
360 if (rc != EOK) {
361 printf("Error creating message dialog.\n");
362 return;
363 }
364
365 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
366}
367
[80d4aea]368/** File / Load menu entry selected.
[5e109e1]369 *
370 * @param mentry Menu entry
371 * @param arg Argument (demo)
372 */
373static void uidemo_file_load(ui_menu_entry_t *mentry, void *arg)
374{
375 ui_demo_t *demo = (ui_demo_t *) arg;
376 ui_file_dialog_params_t fdparams;
377 ui_file_dialog_t *dialog;
378 errno_t rc;
379
380 ui_file_dialog_params_init(&fdparams);
381 fdparams.caption = "Load File";
382
383 rc = ui_file_dialog_create(demo->ui, &fdparams, &dialog);
384 if (rc != EOK) {
385 printf("Error creating message dialog.\n");
386 return;
387 }
388
389 ui_file_dialog_set_cb(dialog, &file_dialog_cb, demo);
390}
391
[80d4aea]392/** File / Message menu entry selected.
[252d03c]393 *
394 * @param mentry Menu entry
395 * @param arg Argument (demo)
396 */
397static void uidemo_file_message(ui_menu_entry_t *mentry, void *arg)
398{
399 ui_demo_t *demo = (ui_demo_t *) arg;
400 ui_msg_dialog_params_t mdparams;
401 ui_msg_dialog_t *dialog;
402 errno_t rc;
403
404 ui_msg_dialog_params_init(&mdparams);
405 mdparams.caption = "Message For You";
406 mdparams.text = "Hello, world!";
407
408 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
409 if (rc != EOK) {
410 printf("Error creating message dialog.\n");
411 return;
412 }
413
414 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
415}
416
[80d4aea]417/** File / Exit menu entry selected.
[214aefb]418 *
419 * @param mentry Menu entry
420 * @param arg Argument (demo)
421 */
422static void uidemo_file_exit(ui_menu_entry_t *mentry, void *arg)
423{
424 ui_demo_t *demo = (ui_demo_t *) arg;
425
426 ui_quit(demo->ui);
427}
428
[80d4aea]429/** Edit / Modify menu entry selected.
430 *
431 * @param mentry Menu entry
432 * @param arg Argument (demo)
433 */
434static void uidemo_edit_modify(ui_menu_entry_t *mentry, void *arg)
435{
436 ui_demo_t *demo = (ui_demo_t *) arg;
437 ui_prompt_dialog_params_t pdparams;
438 ui_prompt_dialog_t *dialog;
439 errno_t rc;
440
441 ui_prompt_dialog_params_init(&pdparams);
442 pdparams.caption = "Modify Entry Text";
443 pdparams.prompt = "Enter New Text";
444
445 rc = ui_prompt_dialog_create(demo->ui, &pdparams, &dialog);
446 if (rc != EOK) {
[c0757e1f]447 printf("Error creating prompt dialog.\n");
[80d4aea]448 return;
449 }
450
451 ui_prompt_dialog_set_cb(dialog, &prompt_dialog_cb, demo);
452}
453
[c0757e1f]454/** Edit / Insert Character menu entry selected.
455 *
456 * @param mentry Menu entry
457 * @param arg Argument (demo)
458 */
459static void uidemo_edit_insert_character(ui_menu_entry_t *mentry, void *arg)
460{
461 ui_demo_t *demo = (ui_demo_t *) arg;
462 ui_select_dialog_params_t sdparams;
463 ui_select_dialog_t *dialog;
464 ui_list_entry_attr_t attr;
465 errno_t rc;
466
467 ui_select_dialog_params_init(&sdparams);
468 sdparams.caption = "Insert Character";
469 sdparams.prompt = "Select character to insert";
470
471 rc = ui_select_dialog_create(demo->ui, &sdparams, &dialog);
472 if (rc != EOK) {
473 printf("Error creating select dialog.\n");
474 return;
475 }
476
477 ui_list_entry_attr_init(&attr);
478 attr.caption = "Dollar sign ($)";
479 attr.arg = (void *)'$';
480 rc = ui_select_dialog_append(dialog, &attr);
481 if (rc != EOK) {
482 printf("Error appending entry to list.\n");
483 return;
484 }
485
486 ui_list_entry_attr_init(&attr);
487 attr.caption = "Hash sign (#)";
488 attr.arg = (void *)'#';
489 rc = ui_select_dialog_append(dialog, &attr);
490 if (rc != EOK) {
491 printf("Error appending entry to list.\n");
492 return;
493 }
494
495 ui_list_entry_attr_init(&attr);
496 attr.caption = "Question mark (?)";
497 attr.arg = (void *)'?';
498 rc = ui_select_dialog_append(dialog, &attr);
499 if (rc != EOK) {
500 printf("Error appending entry to list.\n");
501 return;
502 }
503
504 ui_select_dialog_set_cb(dialog, &select_dialog_cb, demo);
505
506 (void) ui_select_dialog_paint(dialog);
507}
508
[5e109e1]509/** File dialog OK button press.
510 *
511 * @param dialog File dialog
512 * @param arg Argument (ui_demo_t *)
513 * @param fname File name
514 */
515static void file_dialog_bok(ui_file_dialog_t *dialog, void *arg,
516 const char *fname)
517{
518 ui_demo_t *demo = (ui_demo_t *) arg;
519 char buf[128];
520 char *p;
521 FILE *f;
522
523 ui_file_dialog_destroy(dialog);
524
525 f = fopen(fname, "rt");
526 if (f == NULL) {
527 uidemo_show_message(demo, "Error", "Error opening file.");
528 return;
529 }
530
531 p = fgets(buf, sizeof(buf), f);
532 if (p == NULL) {
533 uidemo_show_message(demo, "Error", "Error reading file.");
534 fclose(f);
535 return;
536 }
537
538 /* Cut string off at the first non-printable character */
539 p = buf;
540 while (*p != '\0') {
541 if (*p < ' ') {
542 *p = '\0';
543 break;
544 }
545 ++p;
546 }
547
548 ui_entry_set_text(demo->entry, buf);
549 fclose(f);
550}
551
552/** File dialog cancel button press.
553 *
554 * @param dialog File dialog
555 * @param arg Argument (ui_demo_t *)
556 */
557static void file_dialog_bcancel(ui_file_dialog_t *dialog, void *arg)
558{
559 ui_demo_t *demo = (ui_demo_t *) arg;
560
561 (void) demo;
562 ui_file_dialog_destroy(dialog);
563}
564
[80d4aea]565/** File dialog close request.
[5e109e1]566 *
567 * @param dialog File dialog
568 * @param arg Argument (ui_demo_t *)
569 */
570static void file_dialog_close(ui_file_dialog_t *dialog, void *arg)
571{
572 ui_demo_t *demo = (ui_demo_t *) arg;
573
574 (void) demo;
575 ui_file_dialog_destroy(dialog);
576}
577
[80d4aea]578/** Prompt dialog OK button press.
579 *
580 * @param dialog Prompt dialog
581 * @param arg Argument (ui_demo_t *)
582 * @param text Submitted text
583 */
584static void prompt_dialog_bok(ui_prompt_dialog_t *dialog, void *arg,
585 const char *text)
586{
587 ui_demo_t *demo = (ui_demo_t *) arg;
588
589 ui_prompt_dialog_destroy(dialog);
590 ui_entry_set_text(demo->entry, text);
591}
592
593/** Prompt dialog cancel button press.
594 *
[c0757e1f]595 * @param dialog Prompt dialog
[80d4aea]596 * @param arg Argument (ui_demo_t *)
597 */
598static void prompt_dialog_bcancel(ui_prompt_dialog_t *dialog, void *arg)
599{
600 ui_demo_t *demo = (ui_demo_t *) arg;
601
602 (void) demo;
603 ui_prompt_dialog_destroy(dialog);
604}
605
606/** Prompt dialog close request.
607 *
[c0757e1f]608 * @param dialog Prompt dialog
[80d4aea]609 * @param arg Argument (ui_demo_t *)
610 */
611static void prompt_dialog_close(ui_prompt_dialog_t *dialog, void *arg)
612{
613 ui_demo_t *demo = (ui_demo_t *) arg;
614
615 (void) demo;
616 ui_prompt_dialog_destroy(dialog);
617}
618
[c0757e1f]619/** Select dialog OK button press.
620 *
621 * @param dialog Select dialog
622 * @param arg Argument (ui_demo_t *)
623 * @param text Submitted text
624 */
625static void select_dialog_bok(ui_select_dialog_t *dialog, void *arg,
626 void *earg)
627{
628 ui_demo_t *demo = (ui_demo_t *) arg;
629 char str[2];
630
631 ui_select_dialog_destroy(dialog);
632 str[0] = (char)(intptr_t)earg;
633 str[1] = '\0';
634 (void) ui_entry_insert_str(demo->entry, str);
635}
636
637/** Select dialog cancel button press.
638 *
639 * @param dialog Select dialog
640 * @param arg Argument (ui_demo_t *)
641 */
642static void select_dialog_bcancel(ui_select_dialog_t *dialog, void *arg)
643{
644 ui_demo_t *demo = (ui_demo_t *) arg;
645
646 (void) demo;
647 ui_select_dialog_destroy(dialog);
648}
649
650/** Select dialog close request.
651 *
652 * @param dialog Select dialog
653 * @param arg Argument (ui_demo_t *)
654 */
655static void select_dialog_close(ui_select_dialog_t *dialog, void *arg)
656{
657 ui_demo_t *demo = (ui_demo_t *) arg;
658
659 (void) demo;
660 ui_select_dialog_destroy(dialog);
661}
662
[252d03c]663/** Message dialog button press.
664 *
665 * @param dialog Message dialog
666 * @param arg Argument (ui_demo_t *)
667 * @param bnum Button number
668 */
669static void msg_dialog_button(ui_msg_dialog_t *dialog, void *arg,
670 unsigned bnum)
671{
672 ui_demo_t *demo = (ui_demo_t *) arg;
673
674 (void) demo;
675 ui_msg_dialog_destroy(dialog);
676}
677
678/** Message dialog close request.
679 *
680 * @param dialog Message dialog
681 * @param arg Argument (ui_demo_t *)
682 */
683static void msg_dialog_close(ui_msg_dialog_t *dialog, void *arg)
684{
685 ui_demo_t *demo = (ui_demo_t *) arg;
686
687 (void) demo;
688 ui_msg_dialog_destroy(dialog);
689}
690
[47728678]691/** Run UI demo on display server. */
[d284ce9]692static errno_t ui_demo(const char *display_spec)
[47728678]693{
[d284ce9]694 ui_t *ui = NULL;
695 ui_wnd_params_t params;
696 ui_window_t *window = NULL;
[f6df5a3]697 ui_demo_t demo;
[47728678]698 gfx_rect_t rect;
[d8ddf7a]699 gfx_context_t *gc;
[3583ffb]700 ui_resource_t *ui_res;
[d8ddf7a]701 gfx_bitmap_params_t bparams;
702 gfx_bitmap_t *bitmap;
703 gfx_coord2_t off;
[252d03c]704 ui_menu_entry_t *mmsg;
[5e109e1]705 ui_menu_entry_t *mload;
[214aefb]706 ui_menu_entry_t *mfoo;
707 ui_menu_entry_t *mbar;
708 ui_menu_entry_t *mfoobar;
[80d4aea]709 ui_menu_entry_t *msep;
[214aefb]710 ui_menu_entry_t *mexit;
[80d4aea]711 ui_menu_entry_t *mmodify;
[c0757e1f]712 ui_menu_entry_t *minsert_char;
[214aefb]713 ui_menu_entry_t *mabout;
[7cf5ddb]714 ui_list_entry_attr_t eattr;
[47728678]715 errno_t rc;
716
[d284ce9]717 rc = ui_create(display_spec, &ui);
[47728678]718 if (rc != EOK) {
[d284ce9]719 printf("Error creating UI on display %s.\n", display_spec);
[47728678]720 return rc;
721 }
722
[252d03c]723 memset((void *) &demo, 0, sizeof(demo));
724 demo.ui = ui;
725
[d284ce9]726 ui_wnd_params_init(&params);
727 params.caption = "UI Demo";
[570a3f3]728 params.style |= ui_wds_maximize_btn | ui_wds_resizable;
[47728678]729
[252d03c]730 /* FIXME: Auto layout */
731 if (ui_is_textmode(ui)) {
732 params.rect.p0.x = 0;
733 params.rect.p0.y = 0;
[1eaead4]734 params.rect.p1.x = 46;
735 params.rect.p1.y = 25;
[252d03c]736 } else {
737 params.rect.p0.x = 0;
738 params.rect.p0.y = 0;
[1eaead4]739 params.rect.p1.x = 255;
740 params.rect.p1.y = 410;
[252d03c]741 }
[1769693]742
[d284ce9]743 rc = ui_window_create(ui, &params, &window);
[47728678]744 if (rc != EOK) {
745 printf("Error creating window.\n");
746 return rc;
747 }
748
[d284ce9]749 ui_window_set_cb(window, &window_cb, (void *) &demo);
750 demo.window = window;
[47728678]751
[3583ffb]752 ui_res = ui_window_get_res(window);
[d8ddf7a]753 gc = ui_window_get_gc(window);
[3583ffb]754
[8009dc27]755 rc = ui_fixed_create(&demo.fixed);
756 if (rc != EOK) {
757 printf("Error creating fixed layout.\n");
758 return rc;
759 }
760
[c68c18b9]761 rc = ui_menu_bar_create(ui, window, &demo.mbar);
[214aefb]762 if (rc != EOK) {
763 printf("Error creating menu bar.\n");
764 return rc;
765 }
766
[46bd63c9]767 rc = ui_menu_dd_create(demo.mbar, "~F~ile", NULL, &demo.mfile);
[214aefb]768 if (rc != EOK) {
769 printf("Error creating menu.\n");
770 return rc;
771 }
772
[c88d7f99]773 rc = ui_menu_entry_create(demo.mfile, "~M~essage", "", &mmsg);
[252d03c]774 if (rc != EOK) {
775 printf("Error creating menu.\n");
776 return rc;
777 }
778
779 ui_menu_entry_set_cb(mmsg, uidemo_file_message, (void *) &demo);
780
[c88d7f99]781 rc = ui_menu_entry_create(demo.mfile, "~L~oad", "", &mload);
[5e109e1]782 if (rc != EOK) {
783 printf("Error creating menu.\n");
784 return rc;
785 }
786
787 ui_menu_entry_set_cb(mload, uidemo_file_load, (void *) &demo);
788
[c88d7f99]789 rc = ui_menu_entry_create(demo.mfile, "~F~oo", "Ctrl-Alt-Del", &mfoo);
[214aefb]790 if (rc != EOK) {
791 printf("Error creating menu.\n");
792 return rc;
793 }
794
[c88d7f99]795 rc = ui_menu_entry_create(demo.mfile, "~B~ar", "", &mbar);
[214aefb]796 if (rc != EOK) {
797 printf("Error creating menu.\n");
798 return rc;
799 }
800
[c88d7f99]801 rc = ui_menu_entry_create(demo.mfile, "F~o~obar", "", &mfoobar);
[214aefb]802 if (rc != EOK) {
803 printf("Error creating menu.\n");
804 return rc;
805 }
806
[112f70a]807 ui_menu_entry_set_disabled(mfoobar, true);
808
[80d4aea]809 rc = ui_menu_entry_sep_create(demo.mfile, &msep);
[6186f9f]810 if (rc != EOK) {
811 printf("Error creating menu.\n");
812 return rc;
813 }
814
[c88d7f99]815 rc = ui_menu_entry_create(demo.mfile, "E~x~it", "Alt-F4", &mexit);
[214aefb]816 if (rc != EOK) {
817 printf("Error creating menu.\n");
818 return rc;
819 }
820
821 ui_menu_entry_set_cb(mexit, uidemo_file_exit, (void *) &demo);
822
[46bd63c9]823 rc = ui_menu_dd_create(demo.mbar, "~E~dit", NULL, &demo.medit);
[214aefb]824 if (rc != EOK) {
825 printf("Error creating menu.\n");
826 return rc;
827 }
828
[c88d7f99]829 rc = ui_menu_entry_create(demo.medit, "~M~odify", "", &mmodify);
[80d4aea]830 if (rc != EOK) {
831 printf("Error creating menu.\n");
832 return rc;
833 }
834
835 ui_menu_entry_set_cb(mmodify, uidemo_edit_modify, (void *) &demo);
836
[c0757e1f]837 rc = ui_menu_entry_create(demo.medit, "~I~nsert Character",
838 "", &minsert_char);
839 if (rc != EOK) {
840 printf("Error creating menu.\n");
841 return rc;
842 }
843
844 ui_menu_entry_set_cb(minsert_char, uidemo_edit_insert_character,
845 (void *) &demo);
846
[46bd63c9]847 rc = ui_menu_dd_create(demo.mbar, "~P~references", NULL,
848 &demo.mpreferences);
[214aefb]849 if (rc != EOK) {
850 printf("Error creating menu.\n");
851 return rc;
852 }
853
[46bd63c9]854 rc = ui_menu_dd_create(demo.mbar, "~H~elp", NULL, &demo.mhelp);
[214aefb]855 if (rc != EOK) {
856 printf("Error creating menu.\n");
857 return rc;
858 }
859
[c88d7f99]860 rc = ui_menu_entry_create(demo.mhelp, "~A~bout", "Ctrl-H, F1", &mabout);
[214aefb]861 if (rc != EOK) {
862 printf("Error creating menu.\n");
863 return rc;
864 }
865
[252d03c]866 /* FIXME: Auto layout */
867 if (ui_is_textmode(ui)) {
868 rect.p0.x = 1;
[45004f3]869 rect.p0.y = 1;
[ab3bfc1]870 rect.p1.x = 43;
[45004f3]871 rect.p1.y = 2;
[252d03c]872 } else {
873 rect.p0.x = 4;
874 rect.p0.y = 30;
[1eaead4]875 rect.p1.x = 251;
[252d03c]876 rect.p1.y = 52;
877 }
[1eaead4]878
[214aefb]879 ui_menu_bar_set_rect(demo.mbar, &rect);
880
881 rc = ui_fixed_add(demo.fixed, ui_menu_bar_ctl(demo.mbar));
882 if (rc != EOK) {
883 printf("Error adding control to layout.\n");
884 return rc;
885 }
886
[1eaead4]887 rc = ui_tab_set_create(ui_res, &demo.tabset);
888 if (rc != EOK) {
889 printf("Error creating tab set.\n");
890 return rc;
891 }
892
893 /* FIXME: Auto layout */
894 if (ui_is_textmode(ui)) {
895 rect.p0.x = 2;
896 rect.p0.y = 2;
897 rect.p1.x = 44;
898 rect.p1.y = 24;
899 } else {
900 rect.p0.x = 8;
901 rect.p0.y = 53;
902 rect.p1.x = 250;
903 rect.p1.y = 405;
904 }
905
906 ui_tab_set_set_rect(demo.tabset, &rect);
907
908 rc = ui_tab_create(demo.tabset, "Basic", &demo.tbasic);
909 if (rc != EOK) {
910 printf("Error creating tab.\n");
911 return rc;
912 }
913
914 rc = ui_tab_create(demo.tabset, "Lists", &demo.tlists);
915 if (rc != EOK) {
916 printf("Error creating tab.\n");
917 return rc;
918 }
919
920 rc = ui_fixed_add(demo.fixed, ui_tab_set_ctl(demo.tabset));
921 if (rc != EOK) {
922 printf("Error adding control to layout.\n");
923 return rc;
924 }
925
926 rc = ui_fixed_create(&demo.bfixed);
927 if (rc != EOK) {
928 printf("Error creating fixed layout.\n");
929 return rc;
930 }
931
[db3895d]932 rc = ui_entry_create(window, "", &demo.entry);
[214aefb]933 if (rc != EOK) {
934 printf("Error creating entry.\n");
935 return rc;
936 }
937
[a977e37]938 /* FIXME: Auto layout */
939 if (ui_is_textmode(ui)) {
[1eaead4]940 rect.p0.x = 4;
941 rect.p0.y = 5;
942 rect.p1.x = 41;
943 rect.p1.y = 6;
[a977e37]944 } else {
945 rect.p0.x = 15;
[1eaead4]946 rect.p0.y = 88;
[a977e37]947 rect.p1.x = 205;
[1eaead4]948 rect.p1.y = 113;
[a977e37]949 }
950
[214aefb]951 ui_entry_set_rect(demo.entry, &rect);
952 ui_entry_set_halign(demo.entry, gfx_halign_center);
953
[1eaead4]954 rc = ui_fixed_add(demo.bfixed, ui_entry_ctl(demo.entry));
[214aefb]955 if (rc != EOK) {
956 printf("Error adding control to layout.\n");
957 return rc;
958 }
959
[d8ddf7a]960 rc = ui_label_create(ui_res, "Text label", &demo.label);
[ba09d06]961 if (rc != EOK) {
962 printf("Error creating label.\n");
963 return rc;
964 }
965
[a977e37]966 /* FIXME: Auto layout */
967 if (ui_is_textmode(ui)) {
[1eaead4]968 rect.p0.x = 4;
969 rect.p0.y = 7;
970 rect.p1.x = 41;
971 rect.p1.y = 8;
[a977e37]972 } else {
973 rect.p0.x = 60;
[1eaead4]974 rect.p0.y = 123;
[a977e37]975 rect.p1.x = 160;
[1eaead4]976 rect.p1.y = 136;
[a977e37]977 }
978
[ba09d06]979 ui_label_set_rect(demo.label, &rect);
[58a67050]980 ui_label_set_halign(demo.label, gfx_halign_center);
[ba09d06]981
[1eaead4]982 rc = ui_fixed_add(demo.bfixed, ui_label_ctl(demo.label));
[8009dc27]983 if (rc != EOK) {
984 printf("Error adding control to layout.\n");
985 return rc;
986 }
987
[d8ddf7a]988 rc = ui_pbutton_create(ui_res, "OK", &demo.pb1);
[47728678]989 if (rc != EOK) {
990 printf("Error creating button.\n");
[f6df5a3]991 return rc;
[47728678]992 }
993
[8ef48ece]994 ui_pbutton_set_cb(demo.pb1, &pbutton_cb, (void *) &demo);
995
[a977e37]996 /* FIXME: Auto layout */
997 if (ui_is_textmode(ui)) {
[1eaead4]998 rect.p0.x = 4;
999 rect.p0.y = 9;
1000 rect.p1.x = 15;
1001 rect.p1.y = 10;
[a977e37]1002 } else {
1003 rect.p0.x = 15;
[1eaead4]1004 rect.p0.y = 146;
[a977e37]1005 rect.p1.x = 105;
[1eaead4]1006 rect.p1.y = 174;
[a977e37]1007 }
1008
[f6df5a3]1009 ui_pbutton_set_rect(demo.pb1, &rect);
[47728678]1010
[c9a7adc]1011 ui_pbutton_set_default(demo.pb1, true);
1012
[1eaead4]1013 rc = ui_fixed_add(demo.bfixed, ui_pbutton_ctl(demo.pb1));
[8009dc27]1014 if (rc != EOK) {
1015 printf("Error adding control to layout.\n");
1016 return rc;
1017 }
1018
[3583ffb]1019 rc = ui_pbutton_create(ui_res, "Cancel", &demo.pb2);
[47728678]1020 if (rc != EOK) {
1021 printf("Error creating button.\n");
[f6df5a3]1022 return rc;
[47728678]1023 }
1024
[8ef48ece]1025 ui_pbutton_set_cb(demo.pb2, &pbutton_cb, (void *) &demo);
1026
[a977e37]1027 if (ui_is_textmode(ui)) {
[1eaead4]1028 rect.p0.x = 30;
1029 rect.p0.y = 9;
1030 rect.p1.x = 41;
1031 rect.p1.y = 10;
[a977e37]1032 } else {
1033 rect.p0.x = 115;
[1eaead4]1034 rect.p0.y = 146;
[a977e37]1035 rect.p1.x = 205;
[1eaead4]1036 rect.p1.y = 174;
[a977e37]1037 }
1038
[f6df5a3]1039 ui_pbutton_set_rect(demo.pb2, &rect);
[47728678]1040
[1eaead4]1041 rc = ui_fixed_add(demo.bfixed, ui_pbutton_ctl(demo.pb2));
[8009dc27]1042 if (rc != EOK) {
1043 printf("Error adding control to layout.\n");
1044 return rc;
1045 }
1046
[d8ddf7a]1047 gfx_bitmap_params_init(&bparams);
[de0c55a]1048 if (ui_is_textmode(ui)) {
1049 bparams.rect.p0.x = 0;
1050 bparams.rect.p0.y = 0;
[7ca7215]1051 bparams.rect.p1.x = 37;
[de0c55a]1052 bparams.rect.p1.y = 2;
1053 } else {
1054 bparams.rect.p0.x = 0;
1055 bparams.rect.p0.y = 0;
1056 bparams.rect.p1.x = 188;
1057 bparams.rect.p1.y = 24;
1058 }
[d8ddf7a]1059
1060 rc = gfx_bitmap_create(gc, &bparams, NULL, &bitmap);
1061 if (rc != EOK)
1062 return rc;
1063
1064 rc = bitmap_moire(bitmap, bparams.rect.p1.x, bparams.rect.p1.y);
1065 if (rc != EOK)
1066 return rc;
1067
1068 rc = ui_image_create(ui_res, bitmap, &params.rect, &demo.image);
1069 if (rc != EOK) {
1070 printf("Error creating label.\n");
1071 return rc;
1072 }
1073
[de0c55a]1074 if (ui_is_textmode(ui)) {
[1eaead4]1075 off.x = 4;
1076 off.y = 11;
[de0c55a]1077 } else {
1078 off.x = 15;
[1eaead4]1079 off.y = 190;
[de0c55a]1080 }
1081
[d8ddf7a]1082 gfx_rect_translate(&off, &bparams.rect, &rect);
1083
1084 /* Adjust for frame width (2 x 1 pixel) */
[de0c55a]1085 if (!ui_is_textmode(ui)) {
1086 ui_image_set_flags(demo.image, ui_imgf_frame);
1087 rect.p1.x += 2;
1088 rect.p1.y += 2;
1089 }
1090
[d8ddf7a]1091 ui_image_set_rect(demo.image, &rect);
1092
[1eaead4]1093 rc = ui_fixed_add(demo.bfixed, ui_image_ctl(demo.image));
[d8ddf7a]1094 if (rc != EOK) {
1095 printf("Error adding control to layout.\n");
1096 return rc;
1097 }
1098
[5de71df]1099 rc = ui_checkbox_create(ui_res, "Read only", &demo.checkbox);
[d70dc1c4]1100 if (rc != EOK) {
1101 printf("Error creating check box.\n");
1102 return rc;
1103 }
1104
1105 ui_checkbox_set_cb(demo.checkbox, &checkbox_cb, (void *) &demo);
1106
[307d4d2]1107 /* FIXME: Auto layout */
1108 if (ui_is_textmode(ui)) {
[1eaead4]1109 rect.p0.x = 4;
1110 rect.p0.y = 14;
1111 rect.p1.x = 14;
1112 rect.p1.y = 15;
[307d4d2]1113 } else {
1114 rect.p0.x = 15;
[1eaead4]1115 rect.p0.y = 225;
[307d4d2]1116 rect.p1.x = 140;
[1eaead4]1117 rect.p1.y = 245;
[307d4d2]1118 }
[de0c55a]1119
[d70dc1c4]1120 ui_checkbox_set_rect(demo.checkbox, &rect);
1121
[1eaead4]1122 rc = ui_fixed_add(demo.bfixed, ui_checkbox_ctl(demo.checkbox));
[d70dc1c4]1123 if (rc != EOK) {
1124 printf("Error adding control to layout.\n");
1125 return rc;
1126 }
1127
[7020d1f]1128 rc = ui_rbutton_group_create(ui_res, &demo.rbgroup);
1129 if (rc != EOK) {
1130 printf("Error creating radio button group.\n");
1131 return rc;
1132 }
1133
[5de71df]1134 rc = ui_rbutton_create(demo.rbgroup, "Left", (void *) &uidemo_halign[0],
1135 &demo.rbleft);
[7020d1f]1136 if (rc != EOK) {
1137 printf("Error creating radio button.\n");
1138 return rc;
1139 }
1140
1141 ui_rbutton_group_set_cb(demo.rbgroup, &rbutton_group_cb,
1142 (void *) &demo);
1143
[297b1b3]1144 /* FIXME: Auto layout */
1145 if (ui_is_textmode(ui)) {
[1eaead4]1146 rect.p0.x = 4;
1147 rect.p0.y = 16;
1148 rect.p1.x = 14;
1149 rect.p1.y = 17;
[297b1b3]1150 } else {
1151 rect.p0.x = 15;
[1eaead4]1152 rect.p0.y = 255;
[297b1b3]1153 rect.p1.x = 140;
[1eaead4]1154 rect.p1.y = 275;
[297b1b3]1155 }
[5de71df]1156 ui_rbutton_set_rect(demo.rbleft, &rect);
[7020d1f]1157
[1eaead4]1158 rc = ui_fixed_add(demo.bfixed, ui_rbutton_ctl(demo.rbleft));
[7020d1f]1159 if (rc != EOK) {
1160 printf("Error adding control to layout.\n");
1161 return rc;
1162 }
1163
[5de71df]1164 rc = ui_rbutton_create(demo.rbgroup, "Center", (void *) &uidemo_halign[1],
1165 &demo.rbcenter);
[7020d1f]1166 if (rc != EOK) {
1167 printf("Error creating radio button.\n");
1168 return rc;
1169 }
1170
[297b1b3]1171 /* FIXME: Auto layout */
1172 if (ui_is_textmode(ui)) {
[1eaead4]1173 rect.p0.x = 4;
1174 rect.p0.y = 17;
1175 rect.p1.x = 14;
1176 rect.p1.y = 18;
[297b1b3]1177 } else {
1178 rect.p0.x = 15;
[1eaead4]1179 rect.p0.y = 285;
[297b1b3]1180 rect.p1.x = 140;
[1eaead4]1181 rect.p1.y = 305;
[297b1b3]1182 }
[5de71df]1183 ui_rbutton_set_rect(demo.rbcenter, &rect);
1184 ui_rbutton_select(demo.rbcenter);
[7020d1f]1185
[1eaead4]1186 rc = ui_fixed_add(demo.bfixed, ui_rbutton_ctl(demo.rbcenter));
[7020d1f]1187 if (rc != EOK) {
1188 printf("Error adding control to layout.\n");
1189 return rc;
1190 }
1191
[5de71df]1192 rc = ui_rbutton_create(demo.rbgroup, "Right", (void *) &uidemo_halign[2],
1193 &demo.rbright);
[7020d1f]1194 if (rc != EOK) {
1195 printf("Error creating radio button.\n");
1196 return rc;
1197 }
1198
[297b1b3]1199 /* FIXME: Auto layout */
1200 if (ui_is_textmode(ui)) {
[1eaead4]1201 rect.p0.x = 4;
1202 rect.p0.y = 18;
1203 rect.p1.x = 14;
1204 rect.p1.y = 19;
[297b1b3]1205 } else {
1206 rect.p0.x = 15;
[1eaead4]1207 rect.p0.y = 315;
[297b1b3]1208 rect.p1.x = 140;
[1eaead4]1209 rect.p1.y = 335;
[297b1b3]1210 }
[5de71df]1211 ui_rbutton_set_rect(demo.rbright, &rect);
[7020d1f]1212
[1eaead4]1213 rc = ui_fixed_add(demo.bfixed, ui_rbutton_ctl(demo.rbright));
[7020d1f]1214 if (rc != EOK) {
1215 printf("Error adding control to layout.\n");
1216 return rc;
1217 }
1218
[0eca788]1219 rc = ui_slider_create(ui_res, &demo.slider);
[ef734b7]1220 if (rc != EOK) {
1221 printf("Error creating button.\n");
1222 return rc;
1223 }
1224
1225 ui_slider_set_cb(demo.slider, &slider_cb, (void *) &demo);
1226
[943f032]1227 /* FIXME: Auto layout */
1228 if (ui_is_textmode(ui)) {
[1eaead4]1229 rect.p0.x = 4;
1230 rect.p0.y = 20;
1231 rect.p1.x = 32;
1232 rect.p1.y = 21;
[943f032]1233 } else {
1234 rect.p0.x = 15;
[1eaead4]1235 rect.p0.y = 345;
[943f032]1236 rect.p1.x = 130;
[1eaead4]1237 rect.p1.y = 365;
[943f032]1238 }
1239
[ef734b7]1240 ui_slider_set_rect(demo.slider, &rect);
1241
[1eaead4]1242 rc = ui_fixed_add(demo.bfixed, ui_slider_ctl(demo.slider));
[ef734b7]1243 if (rc != EOK) {
1244 printf("Error adding control to layout.\n");
1245 return rc;
1246 }
1247
[7ca7215]1248 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &demo.hscrollbar);
[bd16113]1249 if (rc != EOK) {
[453f9645]1250 printf("Error creating scrollbar.\n");
[bd16113]1251 return rc;
1252 }
1253
[7ca7215]1254 ui_scrollbar_set_cb(demo.hscrollbar, &scrollbar_cb, (void *) &demo);
[bd16113]1255
1256 /* FIXME: Auto layout */
1257 if (ui_is_textmode(ui)) {
[1eaead4]1258 rect.p0.x = 4;
1259 rect.p0.y = 22;
1260 rect.p1.x = 42;
1261 rect.p1.y = 23;
[bd16113]1262 } else {
1263 rect.p0.x = 15;
[1eaead4]1264 rect.p0.y = 375;
[7ca7215]1265 rect.p1.x = 220;
[1eaead4]1266 rect.p1.y = 398;
[bd16113]1267 }
1268
[7ca7215]1269 ui_scrollbar_set_rect(demo.hscrollbar, &rect);
1270
1271 ui_scrollbar_set_thumb_length(demo.hscrollbar,
1272 ui_scrollbar_through_length(demo.hscrollbar) / 4);
1273
[1eaead4]1274 rc = ui_fixed_add(demo.bfixed, ui_scrollbar_ctl(demo.hscrollbar));
[7ca7215]1275 if (rc != EOK) {
1276 printf("Error adding control to layout.\n");
1277 return rc;
1278 }
1279
1280 rc = ui_scrollbar_create(ui, window, ui_sbd_vert, &demo.vscrollbar);
1281 if (rc != EOK) {
1282 printf("Error creating button.\n");
1283 return rc;
1284 }
1285
1286 ui_scrollbar_set_cb(demo.vscrollbar, &scrollbar_cb, (void *) &demo);
1287
1288 /* FIXME: Auto layout */
1289 if (ui_is_textmode(ui)) {
[1eaead4]1290 rect.p0.x = 42;
1291 rect.p0.y = 5;
1292 rect.p1.x = 43;
1293 rect.p1.y = 22;
[7ca7215]1294 } else {
1295 rect.p0.x = 220;
[1eaead4]1296 rect.p0.y = 88;
[d68239a1]1297 rect.p1.x = 243;
[1eaead4]1298 rect.p1.y = 375;
[7ca7215]1299 }
1300
1301 ui_scrollbar_set_rect(demo.vscrollbar, &rect);
[bd16113]1302
[7ca7215]1303 ui_scrollbar_set_thumb_length(demo.vscrollbar,
1304 ui_scrollbar_through_length(demo.vscrollbar) / 4);
[bd16113]1305
[1eaead4]1306 rc = ui_fixed_add(demo.bfixed, ui_scrollbar_ctl(demo.vscrollbar));
[bd16113]1307 if (rc != EOK) {
1308 printf("Error adding control to layout.\n");
1309 return rc;
1310 }
1311
[1eaead4]1312 ui_tab_add(demo.tbasic, ui_fixed_ctl(demo.bfixed));
1313
[7cf5ddb]1314 rc = ui_fixed_create(&demo.lfixed);
1315 if (rc != EOK) {
1316 printf("Error creating fixed layout.\n");
1317 return rc;
1318 }
1319
1320 rc = ui_list_create(window, false, &demo.list);
1321 if (rc != EOK) {
1322 printf("Error creating list.\n");
1323 return rc;
1324 }
1325
1326 ui_list_entry_attr_init(&eattr);
1327
1328 eattr.caption = "One";
1329 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1330 if (rc != EOK) {
1331 printf("Error adding list entry.\n");
1332 return rc;
1333 }
1334
1335 eattr.caption = "Two";
1336 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1337 if (rc != EOK) {
1338 printf("Error adding list entry.\n");
1339 return rc;
1340 }
1341
1342 eattr.caption = "Three";
1343 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1344 if (rc != EOK) {
1345 printf("Error adding list entry.\n");
1346 return rc;
1347 }
1348
1349 eattr.caption = "Four";
1350 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1351 if (rc != EOK) {
1352 printf("Error adding list entry.\n");
1353 return rc;
1354 }
1355
1356 eattr.caption = "Five";
1357 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1358 if (rc != EOK) {
1359 printf("Error adding list entry.\n");
1360 return rc;
1361 }
1362
1363 eattr.caption = "Six";
1364 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1365 if (rc != EOK) {
1366 printf("Error adding list entry.\n");
1367 return rc;
1368 }
1369
1370 /* FIXME: Auto layout */
1371 if (ui_is_textmode(ui)) {
1372 rect.p0.x = 4;
1373 rect.p0.y = 5;
1374 rect.p1.x = 41;
1375 rect.p1.y = 10;
1376 } else {
1377 rect.p0.x = 15;
1378 rect.p0.y = 88;
1379 rect.p1.x = 245;
1380 rect.p1.y = 173;
1381 }
1382
1383 ui_list_set_rect(demo.list, &rect);
1384
1385 rc = ui_fixed_add(demo.lfixed, ui_list_ctl(demo.list));
1386 if (rc != EOK) {
1387 printf("Error adding control to layout.\n");
1388 return rc;
1389 }
1390
1391 ui_tab_add(demo.tlists, ui_fixed_ctl(demo.lfixed));
1392
[b71c0fc]1393 ui_window_add(window, ui_fixed_ctl(demo.fixed));
1394
[fa01c05]1395 rc = ui_window_paint(window);
[ba09d06]1396 if (rc != EOK) {
[fa01c05]1397 printf("Error painting window.\n");
[f6df5a3]1398 return rc;
[47728678]1399 }
1400
[d284ce9]1401 ui_run(ui);
[47728678]1402
[d284ce9]1403 ui_window_destroy(window);
1404 ui_destroy(ui);
[47728678]1405
1406 return EOK;
1407}
1408
[d8ddf7a]1409/** Fill bitmap with moire pattern.
1410 *
1411 * @param bitmap Bitmap
1412 * @param w Bitmap width
1413 * @param h Bitmap height
1414 * @return EOK on success or an error code
1415 */
1416static errno_t bitmap_moire(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
1417{
1418 int i, j;
1419 int k;
1420 pixelmap_t pixelmap;
1421 gfx_bitmap_alloc_t alloc;
1422 errno_t rc;
1423
1424 rc = gfx_bitmap_get_alloc(bitmap, &alloc);
1425 if (rc != EOK)
1426 return rc;
1427
1428 /* In absence of anything else, use pixelmap */
1429 pixelmap.width = w;
1430 pixelmap.height = h;
1431 pixelmap.data = alloc.pixels;
1432
1433 for (i = 0; i < w; i++) {
1434 for (j = 0; j < h; j++) {
1435 k = i * i + j * j;
1436 pixelmap_put_pixel(&pixelmap, i, j,
[de0c55a]1437 PIXEL(0, k, k, 255 - k));
[d8ddf7a]1438 }
1439 }
1440
1441 return EOK;
1442}
1443
[d284ce9]1444static void print_syntax(void)
1445{
1446 printf("Syntax: uidemo [-d <display-spec>]\n");
1447}
1448
[f80690a]1449int main(int argc, char *argv[])
1450{
[552b69f]1451 const char *display_spec = UI_ANY_DEFAULT;
[f80690a]1452 errno_t rc;
1453 int i;
1454
1455 i = 1;
1456 while (i < argc && argv[i][0] == '-') {
1457 if (str_cmp(argv[i], "-d") == 0) {
1458 ++i;
1459 if (i >= argc) {
1460 printf("Argument missing.\n");
1461 print_syntax();
1462 return 1;
1463 }
1464
[d284ce9]1465 display_spec = argv[i++];
[f80690a]1466 } else {
1467 printf("Invalid option '%s'.\n", argv[i]);
1468 print_syntax();
1469 return 1;
1470 }
1471 }
1472
1473 if (i < argc) {
1474 print_syntax();
1475 return 1;
1476 }
1477
[d284ce9]1478 rc = ui_demo(display_spec);
[47728678]1479 if (rc != EOK)
[f80690a]1480 return 1;
1481
1482 return 0;
1483}
1484
1485/** @}
1486 */
Note: See TracBrowser for help on using the repository browser.