Ignore:
File:
1 edited

Legend:

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

    rf9c4c433 r45004f3  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4747
    4848static void ui_msg_dialog_wnd_close(ui_window_t *, void *);
    49 static void ui_msg_dialog_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
    5049
    5150ui_window_cb_t ui_msg_dialog_wnd_cb = {
    52         .close = ui_msg_dialog_wnd_close,
    53         .kbd = ui_msg_dialog_wnd_kbd
     51        .close = ui_msg_dialog_wnd_close
    5452};
    5553
     
    5856ui_pbutton_cb_t ui_msg_dialog_btn_cb = {
    5957        .clicked = ui_msg_dialog_btn_clicked
    60 };
    61 
    62 static const char *ui_msg_dialog_captions[][ui_msg_dialog_maxbtn + 1] = {
    63         [umdc_ok] = { "OK", NULL },
    64         [umdc_ok_cancel] = { "OK", "Cancel", NULL }
    6558};
    6659
     
    9386        ui_fixed_t *fixed = NULL;
    9487        ui_label_t *label = NULL;
    95         ui_pbutton_t *btn[ui_msg_dialog_maxbtn];
    96         const char **cp;
    97         unsigned i, nb;
     88        ui_pbutton_t *bok = NULL;
    9889        gfx_rect_t rect;
    99         gfx_coord_t bw, bpad, btnsw, bp0x;
    10090        ui_resource_t *ui_res;
    101 
    102         for (i = 0; i < ui_msg_dialog_maxbtn; i++)
    103                 btn[i] = NULL;
    10491
    10592        dialog = calloc(1, sizeof(ui_msg_dialog_t));
     
    11198        ui_wnd_params_init(&wparams);
    11299        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;
    117100
    118101        /* FIXME: Auto layout */
     
    120103                wparams.rect.p0.x = 0;
    121104                wparams.rect.p0.y = 0;
    122                 wparams.rect.p1.x = 60;
     105                wparams.rect.p1.x = 40;
    123106                wparams.rect.p1.y = 7;
    124107        } else {
    125108                wparams.rect.p0.x = 0;
    126109                wparams.rect.p0.y = 0;
    127                 wparams.rect.p1.x = 440;
     110                wparams.rect.p1.x = 200;
    128111                wparams.rect.p1.y = 110;
    129112        }
     
    149132                rect.p0.x = 3;
    150133                rect.p0.y = 2;
    151                 rect.p1.x = 57;
     134                rect.p1.x = 17;
    152135                rect.p1.y = 3;
    153136        } else {
    154137                rect.p0.x = 10;
    155138                rect.p0.y = 35;
    156                 rect.p1.x = 430;
     139                rect.p1.x = 190;
    157140                rect.p1.y = 50;
    158141        }
     
    167150        label = NULL;
    168151
    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 
     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 */
    185159        if (ui_is_textmode(ui)) {
    186                 bw = 12;
    187                 bpad = 2;
     160                rect.p0.x = 8;
     161                rect.p0.y = 4;
     162                rect.p1.x = 12;
     163                rect.p1.y = 5;
    188164        } else {
    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         }
     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;
    223181
    224182        ui_window_add(window, ui_fixed_ctl(fixed));
     
    233191        return EOK;
    234192error:
    235         for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
    236                 if (btn[i] != NULL)
    237                         ui_pbutton_destroy(btn[i]);
    238         }
     193        if (bok != NULL)
     194                ui_pbutton_destroy(bok);
    239195        if (label != NULL)
    240196                ui_label_destroy(label);
     
    285241        if (dialog->cb != NULL && dialog->cb->close != NULL)
    286242                dialog->cb->close(dialog, dialog->arg);
    287         else
    288                 ui_msg_dialog_destroy(dialog);
    289 }
    290 
    291 /** Message dialog window keyboard event handler.
    292  *
    293  * @param window Window
    294  * @param arg Argument (ui_msg_dialog_t *)
    295  * @param event Keyboard event
    296  */
    297 static void ui_msg_dialog_wnd_kbd(ui_window_t *window, void *arg,
    298     kbd_event_t *event)
    299 {
    300         ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
    301         ui_evclaim_t claim;
    302 
    303         claim = ui_window_def_kbd(window, event);
    304         if (claim == ui_claimed)
    305                 return;
    306 
    307         if (event->type == KEY_PRESS &&
    308             (event->mods & (KM_CTRL | KM_SHIFT | KM_ALT)) == 0) {
    309                 if (event->key == KC_ENTER) {
    310                         /* OK / default button */
    311                         if (dialog->cb != NULL && dialog->cb->button != NULL) {
    312                                 dialog->cb->button(dialog, dialog->arg, 0);
    313                                 return;
    314                         } else {
    315                                 ui_msg_dialog_destroy(dialog);
    316                         }
    317                 } else if (event->key == KC_ESCAPE) {
    318                         /* Cancel */
    319                         if (dialog->cb != NULL && dialog->cb->close != NULL) {
    320                                 dialog->cb->close(dialog, dialog->arg);
    321                                 return;
    322                         } else {
    323                                 ui_msg_dialog_destroy(dialog);
    324                         }
    325                 }
    326         }
    327 
    328243}
    329244
     
    336251{
    337252        ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
    338         unsigned i;
    339 
    340         if (dialog->cb != NULL && dialog->cb->button != NULL) {
    341                 for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
    342                         if (dialog->btn[i] == pbutton)
    343                                 dialog->cb->button(dialog, dialog->arg, i);
    344                 }
    345         } else {
    346                 ui_msg_dialog_destroy(dialog);
    347         }
     253
     254        if (dialog->cb != NULL && dialog->cb->button != NULL)
     255                dialog->cb->button(dialog, dialog->arg, 0);
    348256}
    349257
Note: See TracChangeset for help on using the changeset viewer.