Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/msgdialog.c

    r45004f3 r2e08f2b6  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4747
    4848static void ui_msg_dialog_wnd_close(ui_window_t *, void *);
     49static void ui_msg_dialog_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
    4950
    5051ui_window_cb_t ui_msg_dialog_wnd_cb = {
    51         .close = ui_msg_dialog_wnd_close
     52        .close = ui_msg_dialog_wnd_close,
     53        .kbd = ui_msg_dialog_wnd_kbd
    5254};
    5355
     
    5658ui_pbutton_cb_t ui_msg_dialog_btn_cb = {
    5759        .clicked = ui_msg_dialog_btn_clicked
     60};
     61
     62static const char *ui_msg_dialog_captions[][ui_msg_dialog_maxbtn + 1] = {
     63        [umdc_ok] = { "OK", NULL },
     64        [umdc_ok_cancel] = { "OK", "Cancel", NULL }
    5865};
    5966
     
    8693        ui_fixed_t *fixed = NULL;
    8794        ui_label_t *label = NULL;
    88         ui_pbutton_t *bok = NULL;
     95        ui_pbutton_t *btn[ui_msg_dialog_maxbtn];
     96        const char **cp;
     97        unsigned i, nb;
    8998        gfx_rect_t rect;
     99        gfx_coord_t bw, bpad, btnsw, bp0x;
    90100        ui_resource_t *ui_res;
     101
     102        for (i = 0; i < ui_msg_dialog_maxbtn; i++)
     103                btn[i] = NULL;
    91104
    92105        dialog = calloc(1, sizeof(ui_msg_dialog_t));
     
    98111        ui_wnd_params_init(&wparams);
    99112        wparams.caption = params->caption;
     113        if ((params->flags & umdf_topmost) != 0)
     114                wparams.flags |= wndf_topmost;
     115        if ((params->flags & umdf_center) != 0)
     116                wparams.placement = ui_wnd_place_center;
    100117
    101118        /* FIXME: Auto layout */
     
    103120                wparams.rect.p0.x = 0;
    104121                wparams.rect.p0.y = 0;
    105                 wparams.rect.p1.x = 40;
     122                wparams.rect.p1.x = 60;
    106123                wparams.rect.p1.y = 7;
    107124        } else {
    108125                wparams.rect.p0.x = 0;
    109126                wparams.rect.p0.y = 0;
    110                 wparams.rect.p1.x = 200;
     127                wparams.rect.p1.x = 400;
    111128                wparams.rect.p1.y = 110;
    112129        }
     
    132149                rect.p0.x = 3;
    133150                rect.p0.y = 2;
    134                 rect.p1.x = 17;
     151                rect.p1.x = 57;
    135152                rect.p1.y = 3;
    136153        } else {
    137154                rect.p0.x = 10;
    138155                rect.p0.y = 35;
    139                 rect.p1.x = 190;
     156                rect.p1.x = 390;
    140157                rect.p1.y = 50;
    141158        }
     
    150167        label = NULL;
    151168
    152         rc = ui_pbutton_create(ui_res, "OK", &bok);
    153         if (rc != EOK)
    154                 goto error;
    155 
    156         ui_pbutton_set_cb(bok, &ui_msg_dialog_btn_cb, dialog);
    157 
    158         /* FIXME: Auto layout */
     169        i = 0;
     170        assert(params->choice == umdc_ok || params->choice == umdc_ok_cancel);
     171        cp = ui_msg_dialog_captions[params->choice];
     172
     173        while (*cp != NULL) {
     174                rc = ui_pbutton_create(ui_res, *cp, &btn[i]);
     175                if (rc != EOK)
     176                        goto error;
     177
     178                ui_pbutton_set_cb(btn[i], &ui_msg_dialog_btn_cb, dialog);
     179                ++cp;
     180                ++i;
     181        }
     182
     183        nb = i;
     184
    159185        if (ui_is_textmode(ui)) {
    160                 rect.p0.x = 8;
    161                 rect.p0.y = 4;
    162                 rect.p1.x = 12;
    163                 rect.p1.y = 5;
     186                bw = 12;
     187                bpad = 2;
    164188        } else {
    165                 rect.p0.x = 55;
    166                 rect.p0.y = 60;
    167                 rect.p1.x = 145;
    168                 rect.p1.y = 88;
    169         }
    170 
    171         ui_pbutton_set_rect(bok, &rect);
    172 
    173         ui_pbutton_set_default(bok, true);
    174 
    175         rc = ui_fixed_add(fixed, ui_pbutton_ctl(bok));
    176         if (rc != EOK)
    177                 goto error;
    178 
    179         dialog->bok = bok;
    180         bok = NULL;
     189                bw = 90;
     190                bpad = 10;
     191        }
     192
     193        btnsw = (nb - 1) * (bw + bpad) + bw;
     194        bp0x = (wparams.rect.p0.x + wparams.rect.p1.x - btnsw) / 2;
     195
     196        for (i = 0; i < nb; i++) {
     197                /* FIXME: Auto layout */
     198                if (ui_is_textmode(ui)) {
     199                        rect.p0.x = bp0x + i * (bw + bpad);
     200                        rect.p0.y = 4;
     201                        rect.p1.x = bp0x + bw + i * (bw + bpad);
     202                        rect.p1.y = 5;
     203                } else {
     204                        rect.p0.x = bp0x + i * (bw + bpad);
     205                        rect.p0.y = 60;
     206                        rect.p1.x = bp0x + bw + i * (bw + bpad);
     207                        rect.p1.y = 88;
     208                }
     209
     210                ui_pbutton_set_rect(btn[i], &rect);
     211
     212                rc = ui_fixed_add(fixed, ui_pbutton_ctl(btn[i]));
     213                if (rc != EOK)
     214                        goto error;
     215        }
     216
     217        ui_pbutton_set_default(btn[0], true);
     218
     219        for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
     220                dialog->btn[i] = btn[i];
     221                btn[i] = NULL;
     222        }
    181223
    182224        ui_window_add(window, ui_fixed_ctl(fixed));
     
    191233        return EOK;
    192234error:
    193         if (bok != NULL)
    194                 ui_pbutton_destroy(bok);
     235        for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
     236                if (btn[i] != NULL)
     237                        ui_pbutton_destroy(btn[i]);
     238        }
    195239        if (label != NULL)
    196240                ui_label_destroy(label);
     
    243287}
    244288
     289/** Message dialog window keyboard event handler.
     290 *
     291 * @param window Window
     292 * @param arg Argument (ui_msg_dialog_t *)
     293 * @param event Keyboard event
     294 */
     295static void ui_msg_dialog_wnd_kbd(ui_window_t *window, void *arg,
     296    kbd_event_t *event)
     297{
     298        ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
     299        ui_evclaim_t claim;
     300
     301        claim = ui_window_def_kbd(window, event);
     302        if (claim == ui_claimed)
     303                return;
     304
     305        if (event->type == KEY_PRESS &&
     306            (event->mods & (KM_CTRL | KM_SHIFT | KM_ALT)) == 0) {
     307                if (event->key == KC_ENTER) {
     308                        /* OK / default button */
     309                        if (dialog->cb != NULL && dialog->cb->button != NULL) {
     310                                dialog->cb->button(dialog, dialog->arg, 0);
     311                                return;
     312                        }
     313                } else if (event->key == KC_ESCAPE) {
     314                        /* Cancel */
     315                        if (dialog->cb != NULL && dialog->cb->close != NULL) {
     316                                dialog->cb->close(dialog, dialog->arg);
     317                                return;
     318                        }
     319                }
     320        }
     321
     322}
     323
    245324/** Message dialog button click handler.
    246325 *
     
    251330{
    252331        ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
    253 
    254         if (dialog->cb != NULL && dialog->cb->button != NULL)
    255                 dialog->cb->button(dialog, dialog->arg, 0);
     332        unsigned i;
     333
     334        if (dialog->cb != NULL && dialog->cb->button != NULL) {
     335                for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
     336                        if (dialog->btn[i] == pbutton)
     337                                dialog->cb->button(dialog, dialog->arg, i);
     338                }
     339        }
    256340}
    257341
Note: See TracChangeset for help on using the changeset viewer.