Ignore:
File:
1 edited

Legend:

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

    rb979ffb re0cf963  
    11/*
    2  * Copyright (c) 2026 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <ui/label.h>
    4242#include <ui/filedialog.h>
    43 #include <ui/filelist.h>
    4443#include <ui/pbutton.h>
    4544#include <ui/resource.h>
     
    4847#include "../private/filedialog.h"
    4948
    50 static void ui_file_dialog_wnd_resize(ui_window_t *, void *);
    5149static void ui_file_dialog_wnd_close(ui_window_t *, void *);
    5250static void ui_file_dialog_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
    5351
    5452ui_window_cb_t ui_file_dialog_wnd_cb = {
    55         .resize = ui_file_dialog_wnd_resize,
    5653        .close = ui_file_dialog_wnd_close,
    5754        .kbd = ui_file_dialog_wnd_kbd
    5855};
    5956
    60 static void ui_file_dialog_flist_activate_req(ui_file_list_t *, void *);
    61 static void ui_file_dialog_flist_selected(ui_file_list_t *, void *,
    62     const char *);
    63 
    64 ui_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 
    6957static void ui_file_dialog_bok_clicked(ui_pbutton_t *, void *);
    7058static void ui_file_dialog_bcancel_clicked(ui_pbutton_t *, void *);
     
    8977        memset(params, 0, sizeof(ui_file_dialog_params_t));
    9078        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  */
    99 static 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         }
    18379}
    18480
     
    20096        ui_label_t *label = NULL;
    20197        ui_entry_t *entry = NULL;
    202         ui_file_list_t *flist = NULL;
    20398        ui_pbutton_t *bok = NULL;
    20499        ui_pbutton_t *bcancel = NULL;
    205         ui_file_dialog_geom_t geom;
    206         gfx_rect_t arect;
     100        gfx_rect_t rect;
    207101        ui_resource_t *ui_res;
    208102
     
    215109        ui_wnd_params_init(&wparams);
    216110        wparams.caption = params->caption;
    217         wparams.style |= ui_wds_maximize_btn | ui_wds_resizable;
    218111
    219112        /* FIXME: Auto layout */
     
    222115                wparams.rect.p0.y = 0;
    223116                wparams.rect.p1.x = 40;
    224                 wparams.rect.p1.y = 20;
    225 
    226                 wparams.min_size.x = 30;
    227                 wparams.min_size.y = 10;
     117                wparams.rect.p1.y = 9;
    228118        } else {
    229119                wparams.rect.p0.x = 0;
    230120                wparams.rect.p0.y = 0;
    231121                wparams.rect.p1.x = 300;
    232                 wparams.rect.p1.y = 335;
    233 
    234                 wparams.min_size.x = 240;
    235                 wparams.min_size.y = 260;
     122                wparams.rect.p1.y = 135;
    236123        }
    237124
     
    242129        ui_window_set_cb(window, &ui_file_dialog_wnd_cb, dialog);
    243130
    244         ui_window_get_app_rect(window, &arect);
    245131        ui_res = ui_window_get_res(window);
    246132
    247         /* Compute geometry. */
    248         ui_file_dialog_get_geom(ui, &arect, &geom);
    249 
    250133        rc = ui_fixed_create(&fixed);
    251134        if (rc != EOK)
     
    256139                goto error;
    257140
    258         ui_label_set_rect(label, &geom.fname_label_rect);
     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);
    259155
    260156        rc = ui_fixed_add(fixed, ui_label_ctl(label));
     
    268164                goto error;
    269165
    270         ui_entry_set_rect(entry, &geom.entry_rect);
     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);
    271180
    272181        rc = ui_fixed_add(fixed, ui_entry_ctl(entry));
     
    283192        entry = NULL;
    284193
    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 
    320194        rc = ui_pbutton_create(ui_res, "OK", &bok);
    321195        if (rc != EOK)
     
    323197
    324198        ui_pbutton_set_cb(bok, &ui_file_dialog_bok_cb, dialog);
    325         ui_pbutton_set_rect(bok, &geom.bok_rect);
     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
    326215        ui_pbutton_set_default(bok, true);
    327216
     
    333222        bok = NULL;
    334223
    335         /* Cancel button */
    336 
    337224        rc = ui_pbutton_create(ui_res, "Cancel", &bcancel);
    338225        if (rc != EOK)
     
    340227
    341228        ui_pbutton_set_cb(bcancel, &ui_file_dialog_bcancel_cb, dialog);
    342         ui_pbutton_set_rect(bcancel, &geom.bcancel_rect);
     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);
    343244
    344245        rc = ui_fixed_add(fixed, ui_pbutton_ctl(bcancel));
     
    362263        if (entry != NULL)
    363264                ui_entry_destroy(entry);
    364         if (flist != NULL)
    365                 ui_file_list_destroy(flist);
    366265        if (bok != NULL)
    367266                ui_pbutton_destroy(bok);
     
    405304}
    406305
    407 /** File dialog window resize handler.
     306/** File dialog window close handler.
    408307 *
    409308 * @param window Window
    410309 * @param arg Argument (ui_file_dialog_t *)
    411310 */
    412 static 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  */
    437311static void ui_file_dialog_wnd_close(ui_window_t *window, void *arg)
    438312{
     
    446320 *
    447321 * @param window Window
    448  * @param arg Argument (ui_file_dialog_t *)
     322 * @param arg Argument (ui_prompt_dialog_t *)
    449323 * @param event Keyboard event
    450324 */
     
    454328        ui_file_dialog_t *dialog = (ui_file_dialog_t *) arg;
    455329        const char *fname;
    456         ui_evclaim_t claim;
    457 
    458         claim = ui_window_def_kbd(window, event);
    459         if (claim == ui_claimed)
    460                 return;
    461330
    462331        if (event->type == KEY_PRESS &&
     
    477346                }
    478347        }
    479 }
    480 
    481 static 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 
    489 static 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);
     348
     349        ui_window_def_kbd(window, event);
    495350}
    496351
Note: See TracChangeset for help on using the changeset viewer.