Changeset 344f8b9 in mainline for uspace/lib/ui/src


Ignore:
Timestamp:
2021-05-20T15:34:03Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Children:
f2416ec3
Parents:
da15002
Message:

Open menu in separate popup window (WIP)

Location:
uspace/lib/ui/src
Files:
1 added
4 edited

Legend:

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

    rda15002 r344f8b9  
    4545#include <ui/control.h>
    4646#include <ui/paint.h>
     47#include <ui/popup.h>
    4748#include <ui/menu.h>
    4849#include <ui/menuentry.h>
     
    5960};
    6061
     62static void ui_menu_popup_pos(ui_popup_t *, void *, pos_event_t *);
     63
     64static ui_popup_cb_t ui_menu_popup_cb = {
     65        .pos = ui_menu_popup_pos
     66};
     67
    6168/** Create new menu.
    6269 *
     
    203210}
    204211
     212/** Get UI resource from menu.
     213 *
     214 * @param menu Menu
     215 * @return UI resource
     216 */
     217ui_resource_t *ui_menu_get_res(ui_menu_t *menu)
     218{
     219        return ui_popup_get_res(menu->popup);
     220}
     221
     222/** Open menu.
     223 *
     224 * @param menu Menu
     225 * @param prect Parent rectangle around which the menu should be placed
     226 */
     227errno_t ui_menu_open(ui_menu_t *menu, gfx_rect_t *prect)
     228{
     229        ui_popup_t *popup = NULL;
     230        ui_popup_params_t params;
     231        ui_menu_geom_t geom;
     232        gfx_coord2_t mpos;
     233        errno_t rc;
     234
     235        /* Determine menu dimensions */
     236
     237        mpos.x = 0;
     238        mpos.y = 0;
     239        ui_menu_get_geom(menu, &mpos, &geom);
     240
     241        ui_popup_params_init(&params);
     242        params.rect = geom.outer_rect;
     243
     244        rc = ui_popup_create(menu->mbar->ui, &params, &popup);
     245        if (rc != EOK)
     246                return rc;
     247
     248        menu->popup = popup;
     249        ui_popup_set_cb(popup, &ui_menu_popup_cb, menu);
     250
     251        return ui_menu_paint(menu, &mpos);
     252}
     253
     254/** Close menu.
     255 *
     256 * @param menu Menu
     257 */
     258void ui_menu_close(ui_menu_t *menu)
     259{
     260        ui_popup_destroy(menu->popup);
     261        menu->popup = NULL;
     262}
     263
    205264/** Paint menu.
    206265 *
     
    218277        errno_t rc;
    219278
    220         res = menu->mbar->res;
     279        res = ui_menu_get_res(menu);
    221280        ui_menu_get_geom(menu, spos, &geom);
    222281
     
    261320error:
    262321        return rc;
    263 }
    264 
    265 /** Unpaint menu.
    266  *
    267  * @param menu Menu
    268  * @return EOK on success or an error code
    269  */
    270 errno_t ui_menu_unpaint(ui_menu_t *menu)
    271 {
    272         ui_resource_expose(menu->mbar->res);
    273         return EOK;
    274322}
    275323
     
    312360        } else {
    313361                /* Press outside menu - close it */
    314                 if (event->type == POS_PRESS)
    315                         ui_menu_bar_select(menu->mbar, NULL, NULL);
     362//              if (event->type == POS_PRESS)
     363//                      ui_menu_bar_select(menu->mbar, NULL, NULL);
    316364        }
    317365
     
    319367}
    320368
     369/** Handle position event in menu popup window.
     370 *
     371 * @param popup Menu popup window
     372 * @param arg Argument (ui_menu_t *)
     373 * @param event Position event
     374 */
     375static void ui_menu_popup_pos(ui_popup_t *popup, void *arg, pos_event_t *event)
     376{
     377        ui_menu_t *menu = (ui_menu_t *)arg;
     378        gfx_coord2_t spos;
     379
     380        spos.x = 0;
     381        spos.y = 0;
     382        ui_menu_pos_event(menu, &spos, event);
     383}
     384
    321385/** @}
    322386 */
  • uspace/lib/ui/src/menubar.c

    rda15002 r344f8b9  
    7272/** Create new menu bar.
    7373 *
     74 * @param ui UI
    7475 * @param res UI resource
    7576 * @param rmbar Place to store pointer to new menu bar
    7677 * @return EOK on success, ENOMEM if out of memory
    7778 */
    78 errno_t ui_menu_bar_create(ui_resource_t *res, ui_menu_bar_t **rmbar)
     79errno_t ui_menu_bar_create(ui_t *ui, ui_resource_t *res,
     80    ui_menu_bar_t **rmbar)
    7981{
    8082        ui_menu_bar_t *mbar;
     
    9193        }
    9294
     95        mbar->ui = ui;
    9396        mbar->res = res;
    9497        list_initialize(&mbar->menus);
     
    232235 *
    233236 * @param mbar Menu bar
    234  * @param pos Position (top-left corner) of menu bar entry
     237 * @param rect Menu bar entry rectangle
    235238 * @param menu Menu to select (or deselect if selected) or @c NULL
    236239 */
    237 void ui_menu_bar_select(ui_menu_bar_t *mbar, gfx_coord2_t *pos,
     240void ui_menu_bar_select(ui_menu_bar_t *mbar, gfx_rect_t *rect,
    238241    ui_menu_t *menu)
    239242{
    240         gfx_coord2_t spos;
    241243        ui_menu_t *old_menu;
    242244
     
    248250                mbar->selected = NULL;
    249251
    250         /* Need to clear the menu has just been closed */
     252        /* Close previously open menu */
    251253        if (old_menu != NULL)
    252                 (void) ui_menu_unpaint(old_menu);
     254                (void) ui_menu_close(old_menu);
    253255
    254256        (void) ui_menu_bar_paint(mbar);
    255257
    256258        if (mbar->selected != NULL) {
    257                 /* Cache position of selected entry */
    258                 mbar->sel_pos = *pos;
    259 
    260                 /* Position menu under selected menu bar entry */
    261                 spos.x = pos->x;
    262                 spos.y = mbar->rect.p1.y;
    263 
    264                 (void) ui_menu_paint(mbar->selected, &spos);
     259                (void) ui_menu_open(mbar->selected, rect);
    265260        }
    266261}
     
    275270{
    276271        gfx_coord2_t pos;
    277         gfx_coord2_t spos;
    278272        gfx_rect_t rect;
    279273        ui_menu_t *menu;
     
    282276        gfx_coord_t hpad;
    283277        gfx_coord2_t ppos;
    284         ui_evclaim_t claimed;
    285278
    286279        ppos.x = event->hpos;
     
    307300                if (event->type == POS_PRESS &&
    308301                    gfx_pix_inside_rect(&ppos, &rect)) {
    309                         ui_menu_bar_select(mbar, &pos, menu);
     302                        ui_menu_bar_select(mbar, &rect, menu);
    310303                        return ui_claimed;
    311304                }
    312305
    313                 if (menu == mbar->selected) {
    314                         /* Open menu is positioned below menu bar entry */
    315                         spos.x = pos.x;
    316                         spos.y = mbar->rect.p1.y;
    317 
    318                         ui_menu_get_rect(menu, &spos, &rect);
    319 
    320                         claimed = ui_menu_pos_event(menu, &spos, event);
    321                         if (claimed == ui_claimed)
    322                                 return ui_claimed;
    323                 }
    324 
    325306                pos.x += width;
    326307                menu = ui_menu_next(menu);
     
    336317void ui_menu_bar_unfocus(ui_menu_bar_t *mbar)
    337318{
    338         ui_menu_bar_select(mbar, NULL, NULL);
     319//      ui_menu_bar_select(mbar, NULL, NULL);
    339320}
    340321
  • uspace/lib/ui/src/menuentry.c

    rda15002 r344f8b9  
    203203        ui_resource_t *res;
    204204
     205        /*
     206         * This needs to work even if the menu is not open, so we cannot
     207         * use the menu's resource, which is only created after the menu
     208         * is open (and its window is created). Use the menu bar's
     209         * resource instead.
     210         */
    205211        res = mentry->menu->mbar->res;
    206212
     
    223229        gfx_coord_t width;
    224230
     231        /*
     232         * This needs to work even if the menu is not open, so we cannot
     233         * use the menu's resource, which is only created after the menu
     234         * is open (and its window is created). Use the menu bar's
     235         * resource instead.
     236         */
    225237        res = menu->mbar->res;
    226238
     
    256268        gfx_coord_t vpad;
    257269
     270        /*
     271         * This needs to work even if the menu is not open, so we cannot
     272         * use the menu's resource, which is only created after the menu
     273         * is open (and its window is created). Use the menu bar's
     274         * resource instead.
     275         */
    258276        res = mentry->menu->mbar->res;
    259277
     
    294312        errno_t rc;
    295313
    296         res = mentry->menu->mbar->res;
     314        res = ui_menu_get_res(mentry->menu);
    297315
    298316        ui_menu_entry_get_geom(mentry, pos, &geom);
     
    379397        if (mentry->inside) {
    380398                /* Close menu */
    381                 ui_menu_bar_select(mentry->menu->mbar,
    382                     &mentry->menu->mbar->sel_pos, NULL);
     399                ui_menu_bar_select(mentry->menu->mbar, NULL, NULL);
    383400
    384401                /* Call back */
     
    487504        gfx_coord_t width;
    488505
    489         res = mentry->menu->mbar->res;
     506        res = ui_menu_get_res(mentry->menu);
    490507
    491508        if (res->textmode) {
  • uspace/lib/ui/src/window.c

    rda15002 r344f8b9  
    336336 * is added, the results are undefined.
    337337 *
    338  * @param fixed Fixed layout
     338 * @param window Window
    339339 * @param control Control
    340340 * @return EOK on success, ENOMEM if out of memory
     
    509509 *
    510510 * @param window Window
    511  * @param cb Window decoration callbacks
     511 * @param cb Window callbacks
    512512 * @param arg Callback argument
    513513 */
Note: See TracChangeset for help on using the changeset viewer.