Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 0262f16c in mainline for uspace/lib/ui/src/menuentry.c


Ignore:
Timestamp:
2021-04-09T22:41:22Z (8 months ago)
Author:
jxsvoboda <5887334+jxsvoboda@…>
Branches:
master
Children:
62223ec
Parents:
214aefb
git-author:
Jiri Svoboda <jiri@…> (2021-04-01 16:23:35)
git-committer:
jxsvoboda <5887334+jxsvoboda@…> (2021-04-09 22:41:22)
Message:

Activate menu entry by clicking (instead of simple press)

This allows for visual feedback and also serves as the confirmation
of correctness/intent (same as with push button).

File:
1 edited

Legend:

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

    r214aefb r0262f16c  
    217217        caption = mentry->caption;
    218218
    219         if (mentry == mentry->menu->selected) {
     219        if ((mentry->held && mentry->inside) ||
     220            mentry == mentry->menu->selected) {
    220221                fmt.color = res->wnd_sel_text_color;
    221222                bg_color = res->wnd_sel_text_bg_color;
     
    249250 *
    250251 * @param mentry Menu entry
    251  * @param pos Position (top-left corner)
    252  * @param ppos Press position
    253  */
    254 void ui_menu_entry_press(ui_menu_entry_t *mentry, gfx_coord2_t *pos,
    255     gfx_coord2_t *ppos)
    256 {
    257         ui_menu_entry_geom_t geom;
    258 
    259         ui_menu_entry_get_geom(mentry, pos, &geom);
    260 
    261         if (gfx_pix_inside_rect(ppos, &geom.outer_rect)) {
    262                 /* Press inside menu entry */
    263 
     252 * @param pos Menu entry position
     253 */
     254void ui_menu_entry_press(ui_menu_entry_t *mentry, gfx_coord2_t *pos)
     255{
     256        if (mentry->held)
     257                return;
     258
     259        mentry->inside = true;
     260        mentry->held = true;
     261        ui_menu_entry_paint(mentry, pos);
     262}
     263
     264/** Handle button release in menu entry.
     265 *
     266 * @param mentry Menu entry
     267 */
     268void ui_menu_entry_release(ui_menu_entry_t *mentry)
     269{
     270        if (!mentry->held)
     271                return;
     272
     273        mentry->held = false;
     274
     275        if (mentry->inside) {
    264276                /* Close menu */
    265277                ui_menu_bar_select(mentry->menu->mbar,
     
    270282                        mentry->cb(mentry, mentry->arg);
    271283        }
     284}
     285
     286/** Pointer entered menu entry.
     287 *
     288 * @param mentry Menu entry
     289 * @param pos Menu entry position
     290 */
     291void ui_menu_entry_enter(ui_menu_entry_t *mentry, gfx_coord2_t *pos)
     292{
     293        if (mentry->inside)
     294                return;
     295
     296        mentry->inside = true;
     297        if (mentry->held)
     298                (void) ui_menu_entry_paint(mentry, pos);
     299}
     300
     301/** Pointer left menu entry.
     302 *
     303 * @param mentry Menu entry
     304 * @param pos Menu entry position
     305 */
     306void ui_menu_entry_leave(ui_menu_entry_t *mentry, gfx_coord2_t *pos)
     307{
     308        if (!mentry->inside)
     309                return;
     310
     311        mentry->inside = false;
     312        if (mentry->held)
     313                (void) ui_menu_entry_paint(mentry, pos);
     314}
     315
     316/** Handle menu entry position event.
     317 *
     318 * @param mentry Menu entry
     319 * @param pos Menu entry position (top-left corner)
     320 * @param pos_event Position event
     321 * @return @c ui_claimed iff the event is claimed
     322 */
     323ui_evclaim_t ui_menu_entry_pos_event(ui_menu_entry_t *mentry,
     324    gfx_coord2_t *pos, pos_event_t *event)
     325{
     326        ui_menu_entry_geom_t geom;
     327        gfx_coord2_t ppos;
     328        bool inside;
     329
     330        ppos.x = event->hpos;
     331        ppos.y = event->vpos;
     332
     333        ui_menu_entry_get_geom(mentry, pos, &geom);
     334        inside = gfx_pix_inside_rect(&ppos, &geom.outer_rect);
     335
     336        switch (event->type) {
     337        case POS_PRESS:
     338                if (inside) {
     339                        ui_menu_entry_press(mentry, pos);
     340                        return ui_claimed;
     341                }
     342                break;
     343        case POS_RELEASE:
     344                if (mentry->held) {
     345                        ui_menu_entry_release(mentry);
     346                        return ui_claimed;
     347                }
     348                break;
     349        case POS_UPDATE:
     350                if (inside && !mentry->inside) {
     351                        ui_menu_entry_enter(mentry, pos);
     352                        return ui_claimed;
     353                } else if (!inside && mentry->inside) {
     354                        ui_menu_entry_leave(mentry, pos);
     355                }
     356                break;
     357        }
     358
     359        return ui_unclaimed;
    272360}
    273361
Note: See TracChangeset for help on using the changeset viewer.