Ignore:
File:
1 edited

Legend:

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

    re0cf963 rb979ffb  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2026 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <ui/label.h>
    4242#include <ui/filedialog.h>
     43#include <ui/filelist.h>
    4344#include <ui/pbutton.h>
    4445#include <ui/resource.h>
     
    4748#include "../private/filedialog.h"
    4849
     50static void ui_file_dialog_wnd_resize(ui_window_t *, void *);
    4951static void ui_file_dialog_wnd_close(ui_window_t *, void *);
    5052static void ui_file_dialog_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
    5153
    5254ui_window_cb_t ui_file_dialog_wnd_cb = {
     55        .resize = ui_file_dialog_wnd_resize,
    5356        .close = ui_file_dialog_wnd_close,
    5457        .kbd = ui_file_dialog_wnd_kbd
    5558};
    5659
     60static void ui_file_dialog_flist_activate_req(ui_file_list_t *, void *);
     61static void ui_file_dialog_flist_selected(ui_file_list_t *, void *,
     62    const char *);
     63
     64ui_file_list_cb_t ui_file_dialog_flist_cb = {
     65        .activate_req = ui_file_dialog_flist_activate_req,
     66        .selected = ui_file_dialog_flist_selected
     67};
     68
    5769static void ui_file_dialog_bok_clicked(ui_pbutton_t *, void *);
    5870static void ui_file_dialog_bcancel_clicked(ui_pbutton_t *, void *);
     
    7789        memset(params, 0, sizeof(ui_file_dialog_params_t));
    7890        params->ifname = "";
     91}
     92
     93/** Compute file dialog geometry.
     94 *
     95 * @param ui User interface
     96 * @param wrect Window interior rectangle
     97 * @param geom Place to store geometry
     98 */
     99static void ui_file_dialog_get_geom(ui_t *ui, gfx_rect_t *wrect,
     100    ui_file_dialog_geom_t *geom)
     101{
     102        gfx_coord_t cx;
     103
     104        /* FIXME: Auto layout */
     105        if (ui_is_textmode(ui)) {
     106                geom->fname_label_rect.p0.x = 3;
     107                geom->fname_label_rect.p0.y = 2;
     108                geom->fname_label_rect.p1.x = 17;
     109                geom->fname_label_rect.p1.y = 3;
     110        } else {
     111                geom->fname_label_rect.p0.x = 10;
     112                geom->fname_label_rect.p0.y = 35;
     113                geom->fname_label_rect.p1.x = 190;
     114                geom->fname_label_rect.p1.y = 50;
     115        }
     116
     117        /* FIXME: Auto layout */
     118        if (ui_is_textmode(ui)) {
     119                geom->entry_rect.p0.x = 3;
     120                geom->entry_rect.p0.y = 3;
     121                geom->entry_rect.p1.x = wrect->p1.x - 3;
     122                geom->entry_rect.p1.y = 4;
     123        } else {
     124                geom->entry_rect.p0.x = 10;
     125                geom->entry_rect.p0.y = 55;
     126                geom->entry_rect.p1.x = wrect->p1.x - 10;
     127                geom->entry_rect.p1.y = 80;
     128        }
     129
     130        /* FIXME: Auto layout */
     131        if (ui_is_textmode(ui)) {
     132                geom->files_label_rect.p0.x = 3;
     133                geom->files_label_rect.p0.y = 5;
     134                geom->files_label_rect.p1.x = 17;
     135                geom->files_label_rect.p1.y = 6;
     136        } else {
     137                geom->files_label_rect.p0.x = 10;
     138                geom->files_label_rect.p0.y = 90;
     139                geom->files_label_rect.p1.x = 190;
     140                geom->files_label_rect.p1.y = 105;
     141        }
     142
     143        /* FIXME: Auto layout */
     144        if (ui_is_textmode(ui)) {
     145                geom->flist_rect.p0.x = 3;
     146                geom->flist_rect.p0.y = 6;
     147                geom->flist_rect.p1.x = wrect->p1.x - 3;
     148                geom->flist_rect.p1.y = wrect->p1.y - 4;
     149        } else {
     150                geom->flist_rect.p0.x = 10;
     151                geom->flist_rect.p0.y = 110;
     152                geom->flist_rect.p1.x = wrect->p1.x - 10;
     153                geom->flist_rect.p1.y = wrect->p1.y - 55;
     154        }
     155
     156        cx = (wrect->p0.x + wrect->p1.x) / 2;
     157
     158        /* FIXME: Auto layout */
     159        if (ui_is_textmode(ui)) {
     160                geom->bok_rect.p0.x = cx - 10;
     161                geom->bok_rect.p0.y = wrect->p1.y - 3;
     162                geom->bok_rect.p1.x = cx;
     163                geom->bok_rect.p1.y = wrect->p1.y - 2;
     164        } else {
     165                geom->bok_rect.p0.x = cx - 95;
     166                geom->bok_rect.p0.y = wrect->p1.y - 45;
     167                geom->bok_rect.p1.x = cx - 5;
     168                geom->bok_rect.p1.y = wrect->p1.y - 17;
     169        }
     170
     171        /* FIXME: Auto layout */
     172        if (ui_is_textmode(ui)) {
     173                geom->bcancel_rect.p0.x = cx + 2;
     174                geom->bcancel_rect.p0.y = wrect->p1.y - 3;
     175                geom->bcancel_rect.p1.x = cx + 12;
     176                geom->bcancel_rect.p1.y = wrect->p1.y - 2;
     177        } else {
     178                geom->bcancel_rect.p0.x = cx + 5;
     179                geom->bcancel_rect.p0.y = wrect->p1.y - 45;
     180                geom->bcancel_rect.p1.x = cx + 95;
     181                geom->bcancel_rect.p1.y = wrect->p1.y - 17;
     182        }
    79183}
    80184
     
    96200        ui_label_t *label = NULL;
    97201        ui_entry_t *entry = NULL;
     202        ui_file_list_t *flist = NULL;
    98203        ui_pbutton_t *bok = NULL;
    99204        ui_pbutton_t *bcancel = NULL;
    100         gfx_rect_t rect;
     205        ui_file_dialog_geom_t geom;
     206        gfx_rect_t arect;
    101207        ui_resource_t *ui_res;
    102208
     
    109215        ui_wnd_params_init(&wparams);
    110216        wparams.caption = params->caption;
     217        wparams.style |= ui_wds_maximize_btn | ui_wds_resizable;
    111218
    112219        /* FIXME: Auto layout */
     
    115222                wparams.rect.p0.y = 0;
    116223                wparams.rect.p1.x = 40;
    117                 wparams.rect.p1.y = 9;
     224                wparams.rect.p1.y = 20;
     225
     226                wparams.min_size.x = 30;
     227                wparams.min_size.y = 10;
    118228        } else {
    119229                wparams.rect.p0.x = 0;
    120230                wparams.rect.p0.y = 0;
    121231                wparams.rect.p1.x = 300;
    122                 wparams.rect.p1.y = 135;
     232                wparams.rect.p1.y = 335;
     233
     234                wparams.min_size.x = 240;
     235                wparams.min_size.y = 260;
    123236        }
    124237
     
    129242        ui_window_set_cb(window, &ui_file_dialog_wnd_cb, dialog);
    130243
     244        ui_window_get_app_rect(window, &arect);
    131245        ui_res = ui_window_get_res(window);
    132246
     247        /* Compute geometry. */
     248        ui_file_dialog_get_geom(ui, &arect, &geom);
     249
    133250        rc = ui_fixed_create(&fixed);
    134251        if (rc != EOK)
     
    139256                goto error;
    140257
    141         /* FIXME: Auto layout */
    142         if (ui_is_textmode(ui)) {
    143                 rect.p0.x = 3;
    144                 rect.p0.y = 2;
    145                 rect.p1.x = 17;
    146                 rect.p1.y = 3;
    147         } else {
    148                 rect.p0.x = 10;
    149                 rect.p0.y = 35;
    150                 rect.p1.x = 190;
    151                 rect.p1.y = 50;
    152         }
    153 
    154         ui_label_set_rect(label, &rect);
     258        ui_label_set_rect(label, &geom.fname_label_rect);
    155259
    156260        rc = ui_fixed_add(fixed, ui_label_ctl(label));
     
    164268                goto error;
    165269
    166         /* FIXME: Auto layout */
    167         if (ui_is_textmode(ui)) {
    168                 rect.p0.x = 3;
    169                 rect.p0.y = 4;
    170                 rect.p1.x = 37;
    171                 rect.p1.y = 5;
    172         } else {
    173                 rect.p0.x = 10;
    174                 rect.p0.y = 55;
    175                 rect.p1.x = 290;
    176                 rect.p1.y = 80;
    177         }
    178 
    179         ui_entry_set_rect(entry, &rect);
     270        ui_entry_set_rect(entry, &geom.entry_rect);
    180271
    181272        rc = ui_fixed_add(fixed, ui_entry_ctl(entry));
     
    192283        entry = NULL;
    193284
     285        /* Files label */
     286        rc = ui_label_create(ui_res, "Files:", &label);
     287        if (rc != EOK)
     288                goto error;
     289
     290        ui_label_set_rect(label, &geom.files_label_rect);
     291
     292        rc = ui_fixed_add(fixed, ui_label_ctl(label));
     293        if (rc != EOK)
     294                goto error;
     295
     296        label = NULL;
     297
     298        /* File list */
     299
     300        rc = ui_file_list_create(window, false, &flist);
     301        if (rc != EOK)
     302                goto error;
     303
     304        ui_file_list_set_rect(flist, &geom.flist_rect);
     305        ui_file_list_set_cb(flist, &ui_file_dialog_flist_cb, dialog);
     306
     307        rc = ui_fixed_add(fixed, ui_file_list_ctl(flist));
     308        if (rc != EOK)
     309                goto error;
     310
     311        dialog->flist = flist;
     312        flist = NULL;
     313
     314        rc = ui_file_list_read_dir(dialog->flist, ".");
     315        if (rc != EOK)
     316                goto error;
     317
     318        /* OK button */
     319
    194320        rc = ui_pbutton_create(ui_res, "OK", &bok);
    195321        if (rc != EOK)
     
    197323
    198324        ui_pbutton_set_cb(bok, &ui_file_dialog_bok_cb, dialog);
    199 
    200         /* FIXME: Auto layout */
    201         if (ui_is_textmode(ui)) {
    202                 rect.p0.x = 10;
    203                 rect.p0.y = 6;
    204                 rect.p1.x = 20;
    205                 rect.p1.y = 7;
    206         } else {
    207                 rect.p0.x = 55;
    208                 rect.p0.y = 90;
    209                 rect.p1.x = 145;
    210                 rect.p1.y = 118;
    211         }
    212 
    213         ui_pbutton_set_rect(bok, &rect);
    214 
     325        ui_pbutton_set_rect(bok, &geom.bok_rect);
    215326        ui_pbutton_set_default(bok, true);
    216327
     
    222333        bok = NULL;
    223334
     335        /* Cancel button */
     336
    224337        rc = ui_pbutton_create(ui_res, "Cancel", &bcancel);
    225338        if (rc != EOK)
     
    227340
    228341        ui_pbutton_set_cb(bcancel, &ui_file_dialog_bcancel_cb, dialog);
    229 
    230         /* FIXME: Auto layout */
    231         if (ui_is_textmode(ui)) {
    232                 rect.p0.x = 22;
    233                 rect.p0.y = 6;
    234                 rect.p1.x = 32;
    235                 rect.p1.y = 7;
    236         } else {
    237                 rect.p0.x = 155;
    238                 rect.p0.y = 90;
    239                 rect.p1.x = 245;
    240                 rect.p1.y = 118;
    241         }
    242 
    243         ui_pbutton_set_rect(bcancel, &rect);
     342        ui_pbutton_set_rect(bcancel, &geom.bcancel_rect);
    244343
    245344        rc = ui_fixed_add(fixed, ui_pbutton_ctl(bcancel));
     
    263362        if (entry != NULL)
    264363                ui_entry_destroy(entry);
     364        if (flist != NULL)
     365                ui_file_list_destroy(flist);
    265366        if (bok != NULL)
    266367                ui_pbutton_destroy(bok);
     
    304405}
    305406
    306 /** File dialog window close handler.
     407/** File dialog window resize handler.
    307408 *
    308409 * @param window Window
    309410 * @param arg Argument (ui_file_dialog_t *)
    310411 */
     412static void ui_file_dialog_wnd_resize(ui_window_t *window, void *arg)
     413{
     414        ui_file_dialog_t *dialog = (ui_file_dialog_t *) arg;
     415        gfx_rect_t arect;
     416        ui_file_dialog_geom_t geom;
     417
     418        /* Get new window application rectangle. */
     419        ui_window_get_app_rect(window, &arect);
     420
     421        /* Compute geometry. */
     422        ui_file_dialog_get_geom(ui_window_get_ui(window), &arect, &geom);
     423
     424        ui_entry_set_rect(dialog->ename, &geom.entry_rect);
     425        ui_file_list_set_rect(dialog->flist, &geom.flist_rect);
     426        ui_pbutton_set_rect(dialog->bok, &geom.bok_rect);
     427        ui_pbutton_set_rect(dialog->bcancel, &geom.bcancel_rect);
     428
     429        (void)ui_window_paint(window);
     430}
     431
     432/** File dialog window close handler.
     433 *
     434 * @param window Window
     435 * @param arg Argument (ui_file_dialog_t *)
     436 */
    311437static void ui_file_dialog_wnd_close(ui_window_t *window, void *arg)
    312438{
     
    320446 *
    321447 * @param window Window
    322  * @param arg Argument (ui_prompt_dialog_t *)
     448 * @param arg Argument (ui_file_dialog_t *)
    323449 * @param event Keyboard event
    324450 */
     
    328454        ui_file_dialog_t *dialog = (ui_file_dialog_t *) arg;
    329455        const char *fname;
     456        ui_evclaim_t claim;
     457
     458        claim = ui_window_def_kbd(window, event);
     459        if (claim == ui_claimed)
     460                return;
    330461
    331462        if (event->type == KEY_PRESS &&
     
    346477                }
    347478        }
    348 
    349         ui_window_def_kbd(window, event);
     479}
     480
     481static void ui_file_dialog_flist_activate_req(ui_file_list_t *flist, void *arg)
     482{
     483        ui_file_dialog_t *dialog = (ui_file_dialog_t *) arg;
     484
     485        ui_file_list_activate(dialog->flist);
     486        ui_entry_deactivate(dialog->ename);
     487}
     488
     489static void ui_file_dialog_flist_selected(ui_file_list_t *flist, void *arg,
     490    const char *fname)
     491{
     492        ui_file_dialog_t *dialog = (ui_file_dialog_t *) arg;
     493
     494        dialog->cb->bok(dialog, dialog->arg, fname);
    350495}
    351496
Note: See TracChangeset for help on using the changeset viewer.