Changes in uspace/lib/ui/src/msgdialog.c [45004f3:2e08f2b6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/msgdialog.c
r45004f3 r2e08f2b6 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2024 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 *); 49 50 50 51 ui_window_cb_t ui_msg_dialog_wnd_cb = { 51 .close = ui_msg_dialog_wnd_close 52 .close = ui_msg_dialog_wnd_close, 53 .kbd = ui_msg_dialog_wnd_kbd 52 54 }; 53 55 … … 56 58 ui_pbutton_cb_t ui_msg_dialog_btn_cb = { 57 59 .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 } 58 65 }; 59 66 … … 86 93 ui_fixed_t *fixed = NULL; 87 94 ui_label_t *label = NULL; 88 ui_pbutton_t *bok = NULL; 95 ui_pbutton_t *btn[ui_msg_dialog_maxbtn]; 96 const char **cp; 97 unsigned i, nb; 89 98 gfx_rect_t rect; 99 gfx_coord_t bw, bpad, btnsw, bp0x; 90 100 ui_resource_t *ui_res; 101 102 for (i = 0; i < ui_msg_dialog_maxbtn; i++) 103 btn[i] = NULL; 91 104 92 105 dialog = calloc(1, sizeof(ui_msg_dialog_t)); … … 98 111 ui_wnd_params_init(&wparams); 99 112 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; 100 117 101 118 /* FIXME: Auto layout */ … … 103 120 wparams.rect.p0.x = 0; 104 121 wparams.rect.p0.y = 0; 105 wparams.rect.p1.x = 40;122 wparams.rect.p1.x = 60; 106 123 wparams.rect.p1.y = 7; 107 124 } else { 108 125 wparams.rect.p0.x = 0; 109 126 wparams.rect.p0.y = 0; 110 wparams.rect.p1.x = 200;127 wparams.rect.p1.x = 400; 111 128 wparams.rect.p1.y = 110; 112 129 } … … 132 149 rect.p0.x = 3; 133 150 rect.p0.y = 2; 134 rect.p1.x = 17;151 rect.p1.x = 57; 135 152 rect.p1.y = 3; 136 153 } else { 137 154 rect.p0.x = 10; 138 155 rect.p0.y = 35; 139 rect.p1.x = 190;156 rect.p1.x = 390; 140 157 rect.p1.y = 50; 141 158 } … … 150 167 label = NULL; 151 168 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 */ 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 159 185 if (ui_is_textmode(ui)) { 160 rect.p0.x = 8; 161 rect.p0.y = 4; 162 rect.p1.x = 12; 163 rect.p1.y = 5; 186 bw = 12; 187 bpad = 2; 164 188 } else { 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; 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 } 181 223 182 224 ui_window_add(window, ui_fixed_ctl(fixed)); … … 191 233 return EOK; 192 234 error: 193 if (bok != NULL) 194 ui_pbutton_destroy(bok); 235 for (i = 0; i < ui_msg_dialog_maxbtn; i++) { 236 if (btn[i] != NULL) 237 ui_pbutton_destroy(btn[i]); 238 } 195 239 if (label != NULL) 196 240 ui_label_destroy(label); … … 243 287 } 244 288 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 245 324 /** Message dialog button click handler. 246 325 * … … 251 330 { 252 331 ui_msg_dialog_t *dialog = (ui_msg_dialog_t *) arg; 253 254 if (dialog->cb != NULL && dialog->cb->button != NULL) 255 dialog->cb->button(dialog, dialog->arg, 0); 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 } 256 340 } 257 341
Note:
See TracChangeset
for help on using the changeset viewer.