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

Changeset 0262f16c in mainline


Ignore:
Timestamp:
2021-04-09T22:41:22Z (6 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).

Location:
uspace/lib/ui
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/include/ui/menu.h

    r214aefb r0262f16c  
    5252extern errno_t ui_menu_paint(ui_menu_t *, gfx_coord2_t *);
    5353extern errno_t ui_menu_unpaint(ui_menu_t *);
    54 extern void ui_menu_press(ui_menu_t *, gfx_coord2_t *, gfx_coord2_t *);
     54extern ui_evclaim_t ui_menu_pos_event(ui_menu_t *, gfx_coord2_t *,
     55    pos_event_t *);
    5556
    5657#endif
  • uspace/lib/ui/include/ui/menuentry.h

    r214aefb r0262f16c  
    5353extern gfx_coord_t ui_menu_entry_height(ui_menu_entry_t *);
    5454extern errno_t ui_menu_entry_paint(ui_menu_entry_t *, gfx_coord2_t *);
    55 extern void ui_menu_entry_press(ui_menu_entry_t *, gfx_coord2_t *,
    56     gfx_coord2_t *);
     55extern void ui_menu_entry_press(ui_menu_entry_t *, gfx_coord2_t *);
     56extern void ui_menu_entry_release(ui_menu_entry_t *);
     57extern void ui_menu_entry_enter(ui_menu_entry_t *, gfx_coord2_t *);
     58extern void ui_menu_entry_leave(ui_menu_entry_t *, gfx_coord2_t *);
     59extern ui_evclaim_t ui_menu_entry_pos_event(ui_menu_entry_t *, gfx_coord2_t *,
     60    pos_event_t *);
    5761
    5862#endif
  • uspace/lib/ui/private/menuentry.h

    r214aefb r0262f16c  
    5353        /** Callbacks */
    5454        ui_menu_entry_cb_t cb;
     55        /** Menu entry is currently held down */
     56        bool held;
     57        /** Pointer is currently inside */
     58        bool inside;
    5559        /** Callback argument */
    5660        void *arg;
  • uspace/lib/ui/src/menu.c

    r214aefb r0262f16c  
    292292 * @param menu Menu
    293293 * @param spos Starting position (top-left corner)
    294  * @param ppos Press position
    295  */
    296 void ui_menu_press(ui_menu_t *menu, gfx_coord2_t *spos, gfx_coord2_t *ppos)
     294 * @param event Position event
     295 * @return ui_claimed iff the event was claimed
     296 */
     297ui_evclaim_t ui_menu_pos_event(ui_menu_t *menu, gfx_coord2_t *spos,
     298    pos_event_t *event)
    297299{
    298300        ui_menu_geom_t geom;
    299301        ui_menu_entry_t *mentry;
    300302        gfx_coord2_t pos;
     303        gfx_coord2_t epos;
     304        ui_evclaim_t claimed;
    301305
    302306        ui_menu_get_geom(menu, spos, &geom);
     307        epos.x = event->hpos;
     308        epos.y = event->vpos;
    303309
    304310        pos = geom.entries_rect.p0;
     
    306312        mentry = ui_menu_entry_first(menu);
    307313        while (mentry != NULL) {
    308                 ui_menu_entry_press(mentry, &pos, ppos);
     314                claimed = ui_menu_entry_pos_event(mentry, &pos, event);
     315                if (claimed == ui_claimed)
     316                        return ui_claimed;
    309317
    310318                pos.y += ui_menu_entry_height(mentry);
    311319                mentry = ui_menu_entry_next(mentry);
    312320        }
     321
     322        if (gfx_pix_inside_rect(&epos, &geom.outer_rect))
     323                return ui_claimed;
     324
     325        return ui_unclaimed;
    313326}
    314327
  • uspace/lib/ui/src/menubar.c

    r214aefb r0262f16c  
    267267 *
    268268 * @param mbar Menu bar
    269  * @param ppos Press position
     269 * @param pos_event Position event
    270270 * @return @c ui_claimed iff the event is claimed
    271271 */
    272 static ui_evclaim_t ui_menu_bar_press(ui_menu_bar_t *mbar, gfx_coord2_t *ppos)
     272ui_evclaim_t ui_menu_bar_pos_event(ui_menu_bar_t *mbar, pos_event_t *event)
    273273{
    274274        gfx_coord2_t pos;
     
    279279        gfx_coord_t width;
    280280        gfx_coord_t hpad;
     281        gfx_coord2_t ppos;
     282        ui_evclaim_t claimed;
     283
     284        ppos.x = event->hpos;
     285        ppos.y = event->vpos;
    281286
    282287        if (mbar->res->textmode) {
     
    298303
    299304                /* Check if press is inside menu bar entry */
    300                 if (gfx_pix_inside_rect(ppos, &rect)) {
     305                if (event->type == POS_PRESS &&
     306                    gfx_pix_inside_rect(&ppos, &rect)) {
    301307                        ui_menu_bar_select(mbar, &pos, menu);
    302308                        return ui_claimed;
     
    310316                        ui_menu_get_rect(menu, &spos, &rect);
    311317
    312                         /* Check if press is inside open menu */
    313                         if (gfx_pix_inside_rect(ppos, &rect)) {
    314                                 ui_menu_press(menu, &spos, ppos);
     318                        claimed = ui_menu_pos_event(menu, &spos, event);
     319                        if (claimed == ui_claimed)
    315320                                return ui_claimed;
    316                         }
    317321                }
    318322
    319323                pos.x += width;
    320324                menu = ui_menu_next(menu);
    321         }
    322 
    323         return ui_unclaimed;
    324 }
    325 
    326 /** Handle menu bar position event.
    327  *
    328  * @param mbar Menu bar
    329  * @param pos_event Position event
    330  * @return @c ui_claimed iff the event is claimed
    331  */
    332 ui_evclaim_t ui_menu_bar_pos_event(ui_menu_bar_t *mbar, pos_event_t *event)
    333 {
    334         gfx_coord2_t pos;
    335 
    336         pos.x = event->hpos;
    337         pos.y = event->vpos;
    338 
    339         switch (event->type) {
    340         case POS_PRESS:
    341                 return ui_menu_bar_press(mbar, &pos);
    342         default:
    343                 break;
    344325        }
    345326
  • 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.