source: mainline/uspace/app/uidemo/uidemo.c@ c0757e1f

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

UI display configuration utility

In addition to the command-line utility 'disp', we introduce its UI
equivalent 'display-cfg'. Currently this allows the user to configure
seats in a very comfortable way.

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