Changeset 08d5f8b in mainline


Ignore:
Timestamp:
2021-10-19T20:54:17Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Children:
2651dc5
Parents:
bdb2a72f
Message:

Add File / Open, properly deliver menu events to Navigator

Location:
uspace
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/nav/menu.c

    rbdb2a72f r08d5f8b  
    4343#include "nav.h"
    4444
    45 static void nav_file_exit(ui_menu_entry_t *, void *);
    46 
    4745/** Create navigator menu.
    4846 *
     
    5553        nav_menu_t *menu;
    5654        ui_menu_t *mfile;
     55        ui_menu_entry_t *mopen;
     56        ui_menu_entry_t *mfsep;
    5757        ui_menu_entry_t *mexit;
    5858        gfx_rect_t arect;
     
    7676                goto error;
    7777
     78        rc = ui_menu_entry_create(mfile, "Open", "Enter", &mopen);
     79        if (rc != EOK)
     80                goto error;
     81
     82        ui_menu_entry_set_cb(mopen, nav_menu_file_open, (void *) menu);
     83
     84        rc = ui_menu_entry_sep_create(mfile, &mfsep);
     85        if (rc != EOK)
     86                goto error;
     87
    7888        rc = ui_menu_entry_create(mfile, "Exit", "Ctrl-Q", &mexit);
    7989        if (rc != EOK)
    8090                goto error;
    8191
    82         ui_menu_entry_set_cb(mexit, nav_file_exit, (void *) menu);
     92        ui_menu_entry_set_cb(mexit, nav_menu_file_exit, (void *) menu);
    8393
    8494        ui_window_get_app_rect(menu->window, &arect);
     
    94104        nav_menu_destroy(menu);
    95105        return rc;
     106}
     107
     108/** Set navigator menu callbacks.
     109 *
     110 * @param menu Menu
     111 * @param cb Callbacks
     112 * @param arg Argument to callback functions
     113 */
     114void nav_menu_set_cb(nav_menu_t *menu, nav_menu_cb_t *cb, void *arg)
     115{
     116        menu->cb = cb;
     117        menu->cb_arg = arg;
    96118}
    97119
     
    118140}
    119141
     142/** File / Open menu entry selected.
     143 *
     144 * @param mentry Menu entry
     145 * @param arg Argument (navigator_t *)
     146 */
     147void nav_menu_file_open(ui_menu_entry_t *mentry, void *arg)
     148{
     149        nav_menu_t *menu = (nav_menu_t *)arg;
     150
     151        if (menu->cb != NULL && menu->cb->file_open != NULL)
     152                menu->cb->file_open(menu->cb_arg);
     153}
     154
    120155/** File / Exit menu entry selected.
    121156 *
     
    123158 * @param arg Argument (navigator_t *)
    124159 */
    125 static void nav_file_exit(ui_menu_entry_t *mentry, void *arg)
     160void nav_menu_file_exit(ui_menu_entry_t *mentry, void *arg)
    126161{
    127         navigator_t *navigator = (navigator_t *) arg;
     162        nav_menu_t *menu = (nav_menu_t *)arg;
    128163
    129         ui_quit(navigator->ui);
     164        if (menu->cb != NULL && menu->cb->file_exit != NULL)
     165                menu->cb->file_exit(menu->cb_arg);
    130166}
    131167
  • uspace/app/nav/menu.h

    rbdb2a72f r08d5f8b  
    3838
    3939#include <errno.h>
     40#include <ui/menuentry.h>
    4041#include <ui/window.h>
    4142#include "types/menu.h"
    4243
    4344extern errno_t nav_menu_create(ui_window_t *, nav_menu_t **);
     45extern void nav_menu_set_cb(nav_menu_t *, nav_menu_cb_t *, void *);
    4446extern void nav_menu_destroy(nav_menu_t *);
    4547extern ui_control_t *nav_menu_ctl(nav_menu_t *);
     48extern void nav_menu_file_open(ui_menu_entry_t *, void *);
     49extern void nav_menu_file_exit(ui_menu_entry_t *, void *);
    4650
    4751#endif
  • uspace/app/nav/nav.c

    rbdb2a72f r08d5f8b  
    5555};
    5656
     57static void navigator_file_open(void *);
     58static void navigator_file_exit(void *);
     59
     60static nav_menu_cb_t navigator_menu_cb = {
     61        .file_open = navigator_file_open,
     62        .file_exit = navigator_file_exit
     63};
     64
    5765/** Window close button was clicked.
    5866 *
     
    154162                goto error;
    155163
     164        nav_menu_set_cb(navigator->menu, &navigator_menu_cb,
     165            (void *)navigator);
     166
    156167        rc = ui_fixed_add(navigator->fixed, nav_menu_ctl(navigator->menu));
    157168        if (rc != EOK) {
     
    278289}
    279290
     291/** File / Open menu entry selected */
     292static void navigator_file_open(void *arg)
     293{
     294        navigator_t *navigator = (navigator_t *)arg;
     295        panel_t *panel;
     296
     297        panel = navigator_get_active_panel(navigator);
     298        panel_open(panel, panel->cursor);
     299}
     300
     301/** File / Exit menu entry selected */
     302static void navigator_file_exit(void *arg)
     303{
     304        navigator_t *navigator = (navigator_t *)arg;
     305
     306        ui_quit(navigator->ui);
     307}
     308
    280309/** @}
    281310 */
  • uspace/app/nav/test/menu.c

    rbdb2a72f r08d5f8b  
    2929#include <errno.h>
    3030#include <pcut/pcut.h>
     31#include <stdbool.h>
    3132#include "../menu.h"
    3233
     
    3435
    3536PCUT_TEST_SUITE(menu);
     37
     38static void test_menu_file_open(void *);
     39static void test_menu_file_exit(void *);
     40
     41static nav_menu_cb_t dummy_cb;
     42static nav_menu_cb_t test_cb = {
     43        .file_open = test_menu_file_open,
     44        .file_exit = test_menu_file_exit
     45};
     46
     47/** Test response */
     48typedef struct {
     49        bool file_open;
     50        bool file_exit;
     51} test_resp_t;
    3652
    3753/** Create and destroy menu. */
     
    6177}
    6278
     79/** nav_menu_set_cb() */
     80PCUT_TEST(set_cb)
     81{
     82        ui_t *ui;
     83        ui_window_t *window;
     84        ui_wnd_params_t params;
     85        nav_menu_t *menu;
     86        int foo;
     87        errno_t rc;
     88
     89        rc = ui_create_disp(NULL, &ui);
     90        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     91
     92        ui_wnd_params_init(&params);
     93        params.caption = "Test";
     94
     95        rc = ui_window_create(ui, &params, &window);
     96        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     97
     98        rc = nav_menu_create(window, &menu);
     99        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     100
     101        nav_menu_set_cb(menu, &test_cb, &foo);
     102        PCUT_ASSERT_EQUALS(&test_cb, menu->cb);
     103        PCUT_ASSERT_EQUALS(&foo, menu->cb_arg);
     104
     105        nav_menu_destroy(menu);
     106        ui_window_destroy(window);
     107        ui_destroy(ui);
     108}
     109
     110/** File / Open callback */
     111PCUT_TEST(file_open)
     112{
     113        ui_t *ui;
     114        ui_window_t *window;
     115        ui_wnd_params_t params;
     116        nav_menu_t *menu;
     117        test_resp_t resp;
     118        errno_t rc;
     119
     120        rc = ui_create_disp(NULL, &ui);
     121        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     122
     123        ui_wnd_params_init(&params);
     124        params.caption = "Test";
     125
     126        rc = ui_window_create(ui, &params, &window);
     127        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     128
     129        rc = nav_menu_create(window, &menu);
     130        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     131
     132        /* Call back with no callbacks set */
     133        nav_menu_file_open(NULL, menu);
     134
     135        /* Call back with dummy callbacks set */
     136        nav_menu_set_cb(menu, &dummy_cb, &resp);
     137        nav_menu_file_open(NULL, menu);
     138
     139        /* Call back with test callbacks set */
     140        resp.file_open = false;
     141        nav_menu_set_cb(menu, &test_cb, &resp);
     142        nav_menu_file_open(NULL, menu);
     143        PCUT_ASSERT_TRUE(resp.file_open);
     144
     145        nav_menu_destroy(menu);
     146        ui_window_destroy(window);
     147        ui_destroy(ui);
     148}
     149
     150/** Testing File / Open callback */
     151static void test_menu_file_open(void *arg)
     152{
     153        test_resp_t *resp = (test_resp_t *)arg;
     154
     155        resp->file_open = true;
     156}
     157
     158/** Testing File / Exit callback */
     159static void test_menu_file_exit(void *arg)
     160{
     161        test_resp_t *resp = (test_resp_t *)arg;
     162
     163        resp->file_exit = true;
     164}
     165
    63166PCUT_EXPORT(menu);
  • uspace/app/nav/types/menu.h

    rbdb2a72f r08d5f8b  
    4141#include <ui/window.h>
    4242
     43/** Navigator menu callbacks */
     44typedef struct nav_menu_cb {
     45        /** File / Open */
     46        void (*file_open)(void *);
     47        /** File / Exit */
     48        void (*file_exit)(void *);
     49} nav_menu_cb_t;
     50
    4351/** Navigator menu */
    4452typedef struct nav_menu {
     53        /** UI */
    4554        ui_t *ui;
     55        /** Containing window */
    4656        ui_window_t *window;
     57        /** Menu bar */
    4758        ui_menu_bar_t *menubar;
     59        /** Callbacks */
     60        nav_menu_cb_t *cb;
     61        /** Callback argument */
     62        void *cb_arg;
    4863} nav_menu_t;
    4964
  • uspace/lib/ui/include/ui/menuentry.h

    rbdb2a72f r08d5f8b  
    3939#include <errno.h>
    4040#include <gfx/coord.h>
     41#include <io/pos_event.h>
    4142#include <types/ui/menu.h>
    4243#include <types/ui/menuentry.h>
Note: See TracChangeset for help on using the changeset viewer.