Ignore:
File:
1 edited

Legend:

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

    r2e08f2b6 r45004f3  
    11/*
    2  * Copyright (c) 2024 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 = 400;
     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 = 390;
     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);
     
    287243}
    288244
    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  */
    295 static 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 
    324245/** Message dialog button click handler.
    325246 *
     
    330251{
    331252        ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
    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         }
     253
     254        if (dialog->cb != NULL && dialog->cb->button != NULL)
     255                dialog->cb->button(dialog, dialog->arg, 0);
    340256}
    341257
Note: See TracChangeset for help on using the changeset viewer.