Ignore:
File:
1 edited

Legend:

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

    r252d03c rd0dfbba  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2026 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3434 */
    3535
     36#include <assert.h>
    3637#include <errno.h>
    3738#include <mem.h>
     
    4748
    4849static void ui_msg_dialog_wnd_close(ui_window_t *, void *);
     50static void ui_msg_dialog_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
    4951
    5052ui_window_cb_t ui_msg_dialog_wnd_cb = {
    51         .close = ui_msg_dialog_wnd_close
     53        .close = ui_msg_dialog_wnd_close,
     54        .kbd = ui_msg_dialog_wnd_kbd
    5255};
    5356
     
    5659ui_pbutton_cb_t ui_msg_dialog_btn_cb = {
    5760        .clicked = ui_msg_dialog_btn_clicked
     61};
     62
     63static const char *ui_msg_dialog_captions[][ui_msg_dialog_maxbtn + 1] = {
     64        [umdc_ok] = { "OK", NULL },
     65        [umdc_ok_cancel] = { "OK", "Cancel", NULL }
    5866};
    5967
     
    8694        ui_fixed_t *fixed = NULL;
    8795        ui_label_t *label = NULL;
    88         ui_pbutton_t *bok = NULL;
     96        ui_pbutton_t *btn[ui_msg_dialog_maxbtn];
     97        const char **cp;
     98        unsigned i, nb;
    8999        gfx_rect_t rect;
     100        gfx_coord_t bw, bpad, btnsw, bp0x;
    90101        ui_resource_t *ui_res;
     102
     103        for (i = 0; i < ui_msg_dialog_maxbtn; i++)
     104                btn[i] = NULL;
    91105
    92106        dialog = calloc(1, sizeof(ui_msg_dialog_t));
     
    98112        ui_wnd_params_init(&wparams);
    99113        wparams.caption = params->caption;
     114        if ((params->flags & umdf_topmost) != 0)
     115                wparams.flags |= wndf_topmost;
     116        if ((params->flags & umdf_center) != 0)
     117                wparams.placement = ui_wnd_place_center;
    100118
    101119        /* FIXME: Auto layout */
     
    103121                wparams.rect.p0.x = 0;
    104122                wparams.rect.p0.y = 0;
    105                 wparams.rect.p1.x = 20;
     123                wparams.rect.p1.x = 60;
    106124                wparams.rect.p1.y = 7;
    107125        } else {
    108126                wparams.rect.p0.x = 0;
    109127                wparams.rect.p0.y = 0;
    110                 wparams.rect.p1.x = 200;
     128                wparams.rect.p1.x = 440;
    111129                wparams.rect.p1.y = 110;
    112130        }
     
    132150                rect.p0.x = 3;
    133151                rect.p0.y = 2;
    134                 rect.p1.x = 17;
     152                rect.p1.x = 57;
    135153                rect.p1.y = 3;
    136154        } else {
    137155                rect.p0.x = 10;
    138156                rect.p0.y = 35;
    139                 rect.p1.x = 190;
     157                rect.p1.x = 430;
    140158                rect.p1.y = 50;
    141159        }
     
    150168        label = NULL;
    151169
    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 */
     170        i = 0;
     171        assert(params->choice == umdc_ok || params->choice == umdc_ok_cancel);
     172        cp = ui_msg_dialog_captions[params->choice];
     173
     174        while (*cp != NULL) {
     175                rc = ui_pbutton_create(ui_res, *cp, &btn[i]);
     176                if (rc != EOK)
     177                        goto error;
     178
     179                ui_pbutton_set_cb(btn[i], &ui_msg_dialog_btn_cb, dialog);
     180                ++cp;
     181                ++i;
     182        }
     183
     184        nb = i;
     185
    159186        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;
     187                bw = 12;
     188                bpad = 2;
    164189        } 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         bok = NULL;
     190                bw = 90;
     191                bpad = 10;
     192        }
     193
     194        btnsw = (nb - 1) * (bw + bpad) + bw;
     195        bp0x = (wparams.rect.p0.x + wparams.rect.p1.x - btnsw) / 2;
     196
     197        for (i = 0; i < nb; i++) {
     198                /* FIXME: Auto layout */
     199                if (ui_is_textmode(ui)) {
     200                        rect.p0.x = bp0x + i * (bw + bpad);
     201                        rect.p0.y = 4;
     202                        rect.p1.x = bp0x + bw + i * (bw + bpad);
     203                        rect.p1.y = 5;
     204                } else {
     205                        rect.p0.x = bp0x + i * (bw + bpad);
     206                        rect.p0.y = 60;
     207                        rect.p1.x = bp0x + bw + i * (bw + bpad);
     208                        rect.p1.y = 88;
     209                }
     210
     211                ui_pbutton_set_rect(btn[i], &rect);
     212
     213                rc = ui_fixed_add(fixed, ui_pbutton_ctl(btn[i]));
     214                if (rc != EOK)
     215                        goto error;
     216        }
     217
     218        ui_pbutton_set_default(btn[0], true);
     219
     220        for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
     221                dialog->btn[i] = btn[i];
     222                btn[i] = NULL;
     223        }
    180224
    181225        ui_window_add(window, ui_fixed_ctl(fixed));
     
    187231
    188232        dialog->window = window;
    189         dialog->bok = bok;
    190233        *rdialog = dialog;
    191234        return EOK;
    192235error:
     236        for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
     237                if (btn[i] != NULL)
     238                        ui_pbutton_destroy(btn[i]);
     239        }
    193240        if (label != NULL)
    194241                ui_label_destroy(label);
     
    239286        if (dialog->cb != NULL && dialog->cb->close != NULL)
    240287                dialog->cb->close(dialog, dialog->arg);
     288        else
     289                ui_msg_dialog_destroy(dialog);
     290}
     291
     292/** Message dialog window keyboard event handler.
     293 *
     294 * @param window Window
     295 * @param arg Argument (ui_msg_dialog_t *)
     296 * @param event Keyboard event
     297 */
     298static void ui_msg_dialog_wnd_kbd(ui_window_t *window, void *arg,
     299    kbd_event_t *event)
     300{
     301        ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
     302        ui_evclaim_t claim;
     303
     304        claim = ui_window_def_kbd(window, event);
     305        if (claim == ui_claimed)
     306                return;
     307
     308        if (event->type == KEY_PRESS &&
     309            (event->mods & (KM_CTRL | KM_SHIFT | KM_ALT)) == 0) {
     310                if (event->key == KC_ENTER) {
     311                        /* OK / default button */
     312                        if (dialog->cb != NULL && dialog->cb->button != NULL) {
     313                                dialog->cb->button(dialog, dialog->arg, 0);
     314                                return;
     315                        } else {
     316                                ui_msg_dialog_destroy(dialog);
     317                        }
     318                } else if (event->key == KC_ESCAPE) {
     319                        /* Cancel */
     320                        if (dialog->cb != NULL && dialog->cb->close != NULL) {
     321                                dialog->cb->close(dialog, dialog->arg);
     322                                return;
     323                        } else {
     324                                ui_msg_dialog_destroy(dialog);
     325                        }
     326                }
     327        }
     328
    241329}
    242330
     
    249337{
    250338        ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
    251 
    252         if (dialog->cb != NULL && dialog->cb->button != NULL)
    253                 dialog->cb->button(dialog, dialog->arg, 0);
     339        unsigned i;
     340
     341        if (dialog->cb != NULL && dialog->cb->button != NULL) {
     342                for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
     343                        if (dialog->btn[i] == pbutton)
     344                                dialog->cb->button(dialog, dialog->arg, i);
     345                }
     346        } else {
     347                ui_msg_dialog_destroy(dialog);
     348        }
    254349}
    255350
Note: See TracChangeset for help on using the changeset viewer.