Changes in uspace/lib/ui/src/msgdialog.c [2e08f2b6:45004f3] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/msgdialog.c
r2e08f2b6 r45004f3 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 47 47 48 48 static 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 *);50 49 51 50 ui_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 54 52 }; 55 53 … … 58 56 ui_pbutton_cb_t ui_msg_dialog_btn_cb = { 59 57 .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 }65 58 }; 66 59 … … 93 86 ui_fixed_t *fixed = NULL; 94 87 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; 98 89 gfx_rect_t rect; 99 gfx_coord_t bw, bpad, btnsw, bp0x;100 90 ui_resource_t *ui_res; 101 102 for (i = 0; i < ui_msg_dialog_maxbtn; i++)103 btn[i] = NULL;104 91 105 92 dialog = calloc(1, sizeof(ui_msg_dialog_t)); … … 111 98 ui_wnd_params_init(&wparams); 112 99 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;117 100 118 101 /* FIXME: Auto layout */ … … 120 103 wparams.rect.p0.x = 0; 121 104 wparams.rect.p0.y = 0; 122 wparams.rect.p1.x = 60;105 wparams.rect.p1.x = 40; 123 106 wparams.rect.p1.y = 7; 124 107 } else { 125 108 wparams.rect.p0.x = 0; 126 109 wparams.rect.p0.y = 0; 127 wparams.rect.p1.x = 400;110 wparams.rect.p1.x = 200; 128 111 wparams.rect.p1.y = 110; 129 112 } … … 149 132 rect.p0.x = 3; 150 133 rect.p0.y = 2; 151 rect.p1.x = 57;134 rect.p1.x = 17; 152 135 rect.p1.y = 3; 153 136 } else { 154 137 rect.p0.x = 10; 155 138 rect.p0.y = 35; 156 rect.p1.x = 390;139 rect.p1.x = 190; 157 140 rect.p1.y = 50; 158 141 } … … 167 150 label = NULL; 168 151 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 */ 185 159 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; 188 164 } 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; 223 181 224 182 ui_window_add(window, ui_fixed_ctl(fixed)); … … 233 191 return EOK; 234 192 error: 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); 239 195 if (label != NULL) 240 196 ui_label_destroy(label); … … 287 243 } 288 244 289 /** Message dialog window keyboard event handler.290 *291 * @param window Window292 * @param arg Argument (ui_msg_dialog_t *)293 * @param event Keyboard event294 */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 324 245 /** Message dialog button click handler. 325 246 * … … 330 251 { 331 252 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); 340 256 } 341 257
Note:
See TracChangeset
for help on using the changeset viewer.