Ignore:
File:
1 edited

Legend:

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

    rd0dfbba r45004f3  
    11/*
    2  * Copyright (c) 2026 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3434 */
    3535
    36 #include <assert.h>
    3736#include <errno.h>
    3837#include <mem.h>
     
    4847
    4948static void ui_msg_dialog_wnd_close(ui_window_t *, void *);
    50 static void ui_msg_dialog_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
    5149
    5250ui_window_cb_t ui_msg_dialog_wnd_cb = {
    53         .close = ui_msg_dialog_wnd_close,
    54         .kbd = ui_msg_dialog_wnd_kbd
     51        .close = ui_msg_dialog_wnd_close
    5552};
    5653
     
    5956ui_pbutton_cb_t ui_msg_dialog_btn_cb = {
    6057        .clicked = ui_msg_dialog_btn_clicked
    61 };
    62 
    63 static const char *ui_msg_dialog_captions[][ui_msg_dialog_maxbtn + 1] = {
    64         [umdc_ok] = { "OK", NULL },
    65         [umdc_ok_cancel] = { "OK", "Cancel", NULL }
    6658};
    6759
     
    9486        ui_fixed_t *fixed = NULL;
    9587        ui_label_t *label = NULL;
    96         ui_pbutton_t *btn[ui_msg_dialog_maxbtn];
    97         const char **cp;
    98         unsigned i, nb;
     88        ui_pbutton_t *bok = NULL;
    9989        gfx_rect_t rect;
    100         gfx_coord_t bw, bpad, btnsw, bp0x;
    10190        ui_resource_t *ui_res;
    102 
    103         for (i = 0; i < ui_msg_dialog_maxbtn; i++)
    104                 btn[i] = NULL;
    10591
    10692        dialog = calloc(1, sizeof(ui_msg_dialog_t));
     
    11298        ui_wnd_params_init(&wparams);
    11399        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;
    118100
    119101        /* FIXME: Auto layout */
     
    121103                wparams.rect.p0.x = 0;
    122104                wparams.rect.p0.y = 0;
    123                 wparams.rect.p1.x = 60;
     105                wparams.rect.p1.x = 40;
    124106                wparams.rect.p1.y = 7;
    125107        } else {
    126108                wparams.rect.p0.x = 0;
    127109                wparams.rect.p0.y = 0;
    128                 wparams.rect.p1.x = 440;
     110                wparams.rect.p1.x = 200;
    129111                wparams.rect.p1.y = 110;
    130112        }
     
    150132                rect.p0.x = 3;
    151133                rect.p0.y = 2;
    152                 rect.p1.x = 57;
     134                rect.p1.x = 17;
    153135                rect.p1.y = 3;
    154136        } else {
    155137                rect.p0.x = 10;
    156138                rect.p0.y = 35;
    157                 rect.p1.x = 430;
     139                rect.p1.x = 190;
    158140                rect.p1.y = 50;
    159141        }
     
    168150        label = NULL;
    169151
    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 
     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 */
    186159        if (ui_is_textmode(ui)) {
    187                 bw = 12;
    188                 bpad = 2;
     160                rect.p0.x = 8;
     161                rect.p0.y = 4;
     162                rect.p1.x = 12;
     163                rect.p1.y = 5;
    189164        } else {
    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         }
     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;
    224181
    225182        ui_window_add(window, ui_fixed_ctl(fixed));
     
    234191        return EOK;
    235192error:
    236         for (i = 0; i < ui_msg_dialog_maxbtn; i++) {
    237                 if (btn[i] != NULL)
    238                         ui_pbutton_destroy(btn[i]);
    239         }
     193        if (bok != NULL)
     194                ui_pbutton_destroy(bok);
    240195        if (label != NULL)
    241196                ui_label_destroy(label);
     
    286241        if (dialog->cb != NULL && dialog->cb->close != NULL)
    287242                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  */
    298 static 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 
    329243}
    330244
     
    337251{
    338252        ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg;
    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         }
     253
     254        if (dialog->cb != NULL && dialog->cb->button != NULL)
     255                dialog->cb->button(dialog, dialog->arg, 0);
    349256}
    350257
Note: See TracChangeset for help on using the changeset viewer.