Changes in uspace/lib/ui/src/msgdialog.c [d0dfbba:45004f3] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/msgdialog.c (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/msgdialog.c
rd0dfbba r45004f3 1 1 /* 2 * Copyright (c) 202 6Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 34 34 */ 35 35 36 #include <assert.h>37 36 #include <errno.h> 38 37 #include <mem.h> … … 48 47 49 48 static 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 *);51 49 52 50 ui_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 55 52 }; 56 53 … … 59 56 ui_pbutton_cb_t ui_msg_dialog_btn_cb = { 60 57 .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 }66 58 }; 67 59 … … 94 86 ui_fixed_t *fixed = NULL; 95 87 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; 99 89 gfx_rect_t rect; 100 gfx_coord_t bw, bpad, btnsw, bp0x;101 90 ui_resource_t *ui_res; 102 103 for (i = 0; i < ui_msg_dialog_maxbtn; i++)104 btn[i] = NULL;105 91 106 92 dialog = calloc(1, sizeof(ui_msg_dialog_t)); … … 112 98 ui_wnd_params_init(&wparams); 113 99 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;118 100 119 101 /* FIXME: Auto layout */ … … 121 103 wparams.rect.p0.x = 0; 122 104 wparams.rect.p0.y = 0; 123 wparams.rect.p1.x = 60;105 wparams.rect.p1.x = 40; 124 106 wparams.rect.p1.y = 7; 125 107 } else { 126 108 wparams.rect.p0.x = 0; 127 109 wparams.rect.p0.y = 0; 128 wparams.rect.p1.x = 440;110 wparams.rect.p1.x = 200; 129 111 wparams.rect.p1.y = 110; 130 112 } … … 150 132 rect.p0.x = 3; 151 133 rect.p0.y = 2; 152 rect.p1.x = 57;134 rect.p1.x = 17; 153 135 rect.p1.y = 3; 154 136 } else { 155 137 rect.p0.x = 10; 156 138 rect.p0.y = 35; 157 rect.p1.x = 430;139 rect.p1.x = 190; 158 140 rect.p1.y = 50; 159 141 } … … 168 150 label = NULL; 169 151 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 */ 186 159 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; 189 164 } 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; 224 181 225 182 ui_window_add(window, ui_fixed_ctl(fixed)); … … 234 191 return EOK; 235 192 error: 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); 240 195 if (label != NULL) 241 196 ui_label_destroy(label); … … 286 241 if (dialog->cb != NULL && dialog->cb->close != NULL) 287 242 dialog->cb->close(dialog, dialog->arg); 288 else289 ui_msg_dialog_destroy(dialog);290 }291 292 /** Message dialog window keyboard event handler.293 *294 * @param window Window295 * @param arg Argument (ui_msg_dialog_t *)296 * @param event Keyboard event297 */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 329 243 } 330 244 … … 337 251 { 338 252 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); 349 256 } 350 257
Note:
See TracChangeset
for help on using the changeset viewer.
