Changeset bfb055b in mainline


Ignore:
Timestamp:
2021-03-27T22:52:09Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Children:
cd62879
Parents:
dbf1be5
Message:

UI menu (WIP)

Location:
uspace
Files:
12 added
12 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/uidemo/uidemo.c

    rdbf1be5 rbfb055b  
    4343#include <ui/image.h>
    4444#include <ui/label.h>
     45#include <ui/menubar.h>
     46#include <ui/menuentry.h>
     47#include <ui/menu.h>
    4548#include <ui/pbutton.h>
    4649#include <ui/resource.h>
     
    8083        .moved = slider_moved
    8184};
     85
     86static void uidemo_file_exit(ui_menu_entry_t *, void *);
    8287
    8388/** Window close button was clicked.
     
    185190}
    186191
     192/** File/exit menu entry selected.
     193 *
     194 * @param mentry Menu entry
     195 * @param arg Argument (demo)
     196 */
     197static void uidemo_file_exit(ui_menu_entry_t *mentry, void *arg)
     198{
     199        ui_demo_t *demo = (ui_demo_t *) arg;
     200
     201        ui_quit(demo->ui);
     202}
     203
    187204/** Run UI demo on display server. */
    188205static errno_t ui_demo(const char *display_spec)
     
    198215        gfx_bitmap_t *bitmap;
    199216        gfx_coord2_t off;
     217        ui_menu_entry_t *mfoo;
     218        ui_menu_entry_t *mbar;
     219        ui_menu_entry_t *mfoobar;
     220        ui_menu_entry_t *mexit;
     221        ui_menu_entry_t *mabout;
    200222        errno_t rc;
    201223
     
    212234        params.rect.p0.y = 0;
    213235        params.rect.p1.x = 220;
    214         params.rect.p1.y = 340;
     236        params.rect.p1.y = 350;
    215237
    216238        memset((void *) &demo, 0, sizeof(demo));
     
    235257        }
    236258
     259        rc = ui_menu_bar_create(ui_res, &demo.mbar);
     260        if (rc != EOK) {
     261                printf("Error creating menu bar.\n");
     262                return rc;
     263        }
     264
     265        rc = ui_menu_create(demo.mbar, "File", &demo.mfile);
     266        if (rc != EOK) {
     267                printf("Error creating menu.\n");
     268                return rc;
     269        }
     270
     271        rc = ui_menu_entry_create(demo.mfile, "Foo", &mfoo);
     272        if (rc != EOK) {
     273                printf("Error creating menu.\n");
     274                return rc;
     275        }
     276
     277        rc = ui_menu_entry_create(demo.mfile, "Bar", &mbar);
     278        if (rc != EOK) {
     279                printf("Error creating menu.\n");
     280                return rc;
     281        }
     282
     283        rc = ui_menu_entry_create(demo.mfile, "Foobar", &mfoobar);
     284        if (rc != EOK) {
     285                printf("Error creating menu.\n");
     286                return rc;
     287        }
     288
     289        rc = ui_menu_entry_create(demo.mfile, "Exit", &mexit);
     290        if (rc != EOK) {
     291                printf("Error creating menu.\n");
     292                return rc;
     293        }
     294
     295        ui_menu_entry_set_cb(mexit, uidemo_file_exit, (void *) &demo);
     296
     297        rc = ui_menu_create(demo.mbar, "Edit", &demo.medit);
     298        if (rc != EOK) {
     299                printf("Error creating menu.\n");
     300                return rc;
     301        }
     302
     303        rc = ui_menu_create(demo.mbar, "Preferences", &demo.mpreferences);
     304        if (rc != EOK) {
     305                printf("Error creating menu.\n");
     306                return rc;
     307        }
     308
     309        rc = ui_menu_create(demo.mbar, "Help", &demo.mhelp);
     310        if (rc != EOK) {
     311                printf("Error creating menu.\n");
     312                return rc;
     313        }
     314
     315        rc = ui_menu_entry_create(demo.mhelp, "About", &mabout);
     316        if (rc != EOK) {
     317                printf("Error creating menu.\n");
     318                return rc;
     319        }
     320
     321        rect.p0.x = 4;
     322        rect.p0.y = 30;
     323        rect.p1.x = 216;
     324        rect.p1.y = 52;
     325        ui_menu_bar_set_rect(demo.mbar, &rect);
     326
     327        rc = ui_fixed_add(demo.fixed, ui_menu_bar_ctl(demo.mbar));
     328        if (rc != EOK) {
     329                printf("Error adding control to layout.\n");
     330                return rc;
     331        }
     332
     333        rc = ui_entry_create(ui_res, "", &demo.entry);
     334        if (rc != EOK) {
     335                printf("Error creating entry.\n");
     336                return rc;
     337        }
     338
     339        rect.p0.x = 15;
     340        rect.p0.y = 53;
     341        rect.p1.x = 205;
     342        rect.p1.y = 78;
     343        ui_entry_set_rect(demo.entry, &rect);
     344        ui_entry_set_halign(demo.entry, gfx_halign_center);
     345
     346        rc = ui_fixed_add(demo.fixed, ui_entry_ctl(demo.entry));
     347        if (rc != EOK) {
     348                printf("Error adding control to layout.\n");
     349                return rc;
     350        }
     351
    237352        rc = ui_label_create(ui_res, "Text label", &demo.label);
    238353        if (rc != EOK) {
     
    242357
    243358        rect.p0.x = 60;
    244         rect.p0.y = 37;
     359        rect.p0.y = 88;
    245360        rect.p1.x = 160;
    246         rect.p1.y = 50;
     361        rect.p1.y = 101;
    247362        ui_label_set_rect(demo.label, &rect);
    248363        ui_label_set_halign(demo.label, gfx_halign_center);
     
    263378
    264379        rect.p0.x = 15;
    265         rect.p0.y = 70;
     380        rect.p0.y = 111;
    266381        rect.p1.x = 105;
    267         rect.p1.y = 98;
     382        rect.p1.y = 139;
    268383        ui_pbutton_set_rect(demo.pb1, &rect);
    269384
     
    285400
    286401        rect.p0.x = 115;
    287         rect.p0.y = 70;
     402        rect.p0.y = 111;
    288403        rect.p1.x = 205;
    289         rect.p1.y = 98;
     404        rect.p1.y = 139;
    290405        ui_pbutton_set_rect(demo.pb2, &rect);
    291406
    292407        rc = ui_fixed_add(demo.fixed, ui_pbutton_ctl(demo.pb2));
    293         if (rc != EOK) {
    294                 printf("Error adding control to layout.\n");
    295                 return rc;
    296         }
    297 
    298         rc = ui_entry_create(ui_res, "", &demo.entry);
    299         if (rc != EOK) {
    300                 printf("Error creating entry.\n");
    301                 return rc;
    302         }
    303 
    304         rect.p0.x = 15;
    305         rect.p0.y = 110;
    306         rect.p1.x = 205;
    307         rect.p1.y = 135;
    308         ui_entry_set_rect(demo.entry, &rect);
    309         ui_entry_set_halign(demo.entry, gfx_halign_center);
    310 
    311         rc = ui_fixed_add(demo.fixed, ui_entry_ctl(demo.entry));
    312408        if (rc != EOK) {
    313409                printf("Error adding control to layout.\n");
     
    336432
    337433        off.x = 15;
    338         off.y = 145;
     434        off.y = 155;
    339435        gfx_rect_translate(&off, &bparams.rect, &rect);
    340436
     
    360456
    361457        rect.p0.x = 15;
    362         rect.p0.y = 180;
     458        rect.p0.y = 190;
    363459        rect.p1.x = 140;
    364         rect.p1.y = 200;
     460        rect.p1.y = 210;
    365461        ui_checkbox_set_rect(demo.checkbox, &rect);
    366462
     
    388484
    389485        rect.p0.x = 15;
    390         rect.p0.y = 210;
     486        rect.p0.y = 220;
    391487        rect.p1.x = 140;
    392         rect.p1.y = 230;
     488        rect.p1.y = 240;
    393489        ui_rbutton_set_rect(demo.rb1, &rect);
    394490
     
    407503
    408504        rect.p0.x = 15;
    409         rect.p0.y = 240;
     505        rect.p0.y = 250;
    410506        rect.p1.x = 140;
    411         rect.p1.y = 260;
     507        rect.p1.y = 270;
    412508        ui_rbutton_set_rect(demo.rb2, &rect);
    413509
     
    426522
    427523        rect.p0.x = 15;
    428         rect.p0.y = 270;
     524        rect.p0.y = 280;
    429525        rect.p1.x = 140;
    430         rect.p1.y = 290;
     526        rect.p1.y = 300;
    431527        ui_rbutton_set_rect(demo.rb3, &rect);
    432528
     
    446542
    447543        rect.p0.x = 15;
    448         rect.p0.y = 300;
     544        rect.p0.y = 310;
    449545        rect.p1.x = 130;
    450         rect.p1.y = 320;
     546        rect.p1.y = 330;
    451547        ui_slider_set_rect(demo.slider, &rect);
    452548
  • uspace/app/uidemo/uidemo.h

    rdbf1be5 rbfb055b  
    4242#include <ui/fixed.h>
    4343#include <ui/label.h>
     44#include <ui/menu.h>
     45#include <ui/menubar.h>
    4446#include <ui/pbutton.h>
    4547#include <ui/rbutton.h>
     
    5355        ui_window_t *window;
    5456        ui_fixed_t *fixed;
     57        ui_menu_bar_t *mbar;
     58        ui_menu_t *mfile;
     59        ui_menu_t *medit;
     60        ui_menu_t *mpreferences;
     61        ui_menu_t *mhelp;
    5562        ui_entry_t *entry;
    5663        ui_image_t *image;
  • uspace/lib/ui/include/types/ui/rbutton.h

    rdbf1be5 rbfb055b  
    3737#define _UI_TYPES_RBUTTON_H
    3838
    39 #include <stdbool.h>
    40 
    4139struct ui_rbutton_group;
    4240typedef struct ui_rbutton_group ui_rbutton_group_t;
  • uspace/lib/ui/include/types/ui/resource.h

    rdbf1be5 rbfb055b  
    4040typedef struct ui_resource ui_resource_t;
    4141
     42typedef void (*ui_expose_cb_t)(void *);
     43
    4244#endif
    4345
  • uspace/lib/ui/include/ui/paint.h

    rdbf1be5 rbfb055b  
    4747extern errno_t ui_paint_inset_frame(ui_resource_t *, gfx_rect_t *,
    4848    gfx_rect_t *);
     49extern errno_t ui_paint_outset_frame(ui_resource_t *, gfx_rect_t *,
     50    gfx_rect_t *);
    4951extern errno_t ui_paint_filled_circle(gfx_context_t *, gfx_coord2_t *,
    5052    gfx_coord_t, ui_fcircle_part_t);
  • uspace/lib/ui/include/ui/resource.h

    rdbf1be5 rbfb055b  
    4444extern errno_t ui_resource_create(gfx_context_t *, bool, ui_resource_t **);
    4545extern void ui_resource_destroy(ui_resource_t *);
     46extern void ui_resource_set_expose_cb(ui_resource_t *, ui_expose_cb_t,
     47    void *);
     48extern void ui_resource_expose(ui_resource_t *);
    4649
    4750#endif
  • uspace/lib/ui/meson.build

    rdbf1be5 rbfb055b  
    3636        'src/image.c',
    3737        'src/label.c',
     38        'src/menu.c',
     39        'src/menubar.c',
     40        'src/menuentry.c',
    3841        'src/paint.c',
    3942        'src/pbutton.c',
  • uspace/lib/ui/private/resource.h

    rdbf1be5 rbfb055b  
    4343#include <gfx/typeface.h>
    4444#include <stdbool.h>
     45#include <types/ui/resource.h>
    4546
    4647/** Actual structure of UI resources.
     
    7374        /** Window text color */
    7475        gfx_color_t *wnd_text_color;
     76        /** Window selected text color */
     77        gfx_color_t *wnd_sel_text_color;
     78        /** Window selected text background color */
     79        gfx_color_t *wnd_sel_text_bg_color;
    7580        /** Window frame hightlight color */
    7681        gfx_color_t *wnd_frame_hi_color;
     
    97102        /** Entry (text entry, checkbox, raido button) active background color */
    98103        gfx_color_t *entry_act_bg_color;
     104
     105        /** Expose callback or @c NULL */
     106        ui_expose_cb_t expose_cb;
     107        /** Expose callback argument */
     108        void *expose_arg;
    99109};
    100110
  • uspace/lib/ui/src/paint.c

    rdbf1be5 rbfb055b  
    149149}
    150150
     151/** Paint outset frame.
     152 *
     153 * @param resource UI resource
     154 * @param rect Rectangle to paint onto
     155 * @param inside Place to store inside rectangle or @c NULL
     156 * @return EOK on success or an error code
     157 */
     158errno_t ui_paint_outset_frame(ui_resource_t *resource, gfx_rect_t *rect,
     159    gfx_rect_t *inside)
     160{
     161        gfx_rect_t frame;
     162        errno_t rc;
     163
     164        rc = ui_paint_bevel(resource->gc, rect,
     165            resource->wnd_frame_hi_color, resource->wnd_frame_sh_color,
     166            1, &frame);
     167        if (rc != EOK)
     168                goto error;
     169
     170        rc = ui_paint_bevel(resource->gc, &frame,
     171            resource->wnd_highlight_color, resource->wnd_shadow_color,
     172            1, inside);
     173        if (rc != EOK)
     174                goto error;
     175
     176        return EOK;
     177error:
     178        return rc;
     179}
     180
    151181/** Paint filled circle vertical scanline.
    152182 *
  • uspace/lib/ui/src/resource.c

    rdbf1be5 rbfb055b  
    6868        gfx_color_t *wnd_face_color = NULL;
    6969        gfx_color_t *wnd_text_color = NULL;
     70        gfx_color_t *wnd_sel_text_color = NULL;
     71        gfx_color_t *wnd_sel_text_bg_color = NULL;
    7072        gfx_color_t *wnd_frame_hi_color = NULL;
    7173        gfx_color_t *wnd_frame_sh_color = NULL;
     
    139141                goto error;
    140142
     143        rc = gfx_color_new_rgb_i16(0xffff, 0xffff, 0xffff, &wnd_sel_text_color);
     144        if (rc != EOK)
     145                goto error;
     146
     147        rc = gfx_color_new_rgb_i16(0x5858, 0x6a6a, 0xc4c4,
     148            &wnd_sel_text_bg_color);
     149        if (rc != EOK)
     150                goto error;
     151
    141152        rc = gfx_color_new_rgb_i16(0x8888, 0x8888, 0x8888, &wnd_frame_hi_color);
    142153        if (rc != EOK)
     
    200211        resource->wnd_face_color = wnd_face_color;
    201212        resource->wnd_text_color = wnd_text_color;
     213        resource->wnd_sel_text_color = wnd_sel_text_color;
     214        resource->wnd_sel_text_bg_color = wnd_sel_text_bg_color;
    202215        resource->wnd_frame_hi_color = wnd_frame_hi_color;
    203216        resource->wnd_frame_sh_color = wnd_frame_sh_color;
     
    232245        if (wnd_text_color != NULL)
    233246                gfx_color_delete(wnd_text_color);
     247        if (wnd_sel_text_color != NULL)
     248                gfx_color_delete(wnd_sel_text_color);
     249        if (wnd_sel_text_bg_color != NULL)
     250                gfx_color_delete(wnd_sel_text_bg_color);
    234251        if (wnd_frame_hi_color != NULL)
    235252                gfx_color_delete(wnd_frame_hi_color);
     
    280297        gfx_color_delete(resource->wnd_face_color);
    281298        gfx_color_delete(resource->wnd_text_color);
     299        gfx_color_delete(resource->wnd_sel_text_color);
     300        gfx_color_delete(resource->wnd_sel_text_bg_color);
    282301        gfx_color_delete(resource->wnd_frame_hi_color);
    283302        gfx_color_delete(resource->wnd_frame_sh_color);
     
    299318}
    300319
     320/** Set UI resource expose callback.
     321 *
     322 * @param resource Resource
     323 * @param cb Callback
     324 * @param arg Callback argument
     325 */
     326void ui_resource_set_expose_cb(ui_resource_t *resource,
     327    ui_expose_cb_t cb, void *arg)
     328{
     329        resource->expose_cb = cb;
     330        resource->expose_arg = arg;
     331}
     332
     333/** Force UI repaint after an area has been exposed.
     334 *
     335 * This is called when a popup disappears, which could have exposed some
     336 * other UI elements. It causes complete repaint of the UI.
     337 *
     338 * NOTE Ideally we could specify the exposed rectangle and then limit
     339 * the repaint to just that. That would, however, require means of
     340 * actually clipping the repaint operation.
     341 */
     342void ui_resource_expose(ui_resource_t *resource)
     343{
     344        if (resource->expose_cb != NULL)
     345                resource->expose_cb(resource->expose_arg);
     346}
     347
    301348/** @}
    302349 */
  • uspace/lib/ui/src/wdecor.c

    rdbf1be5 rbfb055b  
    178178
    179179        if ((wdecor->style & ui_wds_frame) != 0) {
    180                 rc = ui_paint_bevel(wdecor->res->gc, &rect,
    181                     wdecor->res->wnd_frame_hi_color,
    182                     wdecor->res->wnd_frame_sh_color, 1, &rect);
    183                 if (rc != EOK)
    184                         return rc;
    185 
    186                 if (wdecor->res->textmode == false) {
     180
     181                if (wdecor->res->textmode != false) {
    187182                        rc = ui_paint_bevel(wdecor->res->gc, &rect,
    188                             wdecor->res->wnd_highlight_color,
    189                             wdecor->res->wnd_shadow_color, 1, &rect);
     183                            wdecor->res->wnd_frame_hi_color,
     184                            wdecor->res->wnd_frame_sh_color, 1, &rect);
     185                        if (rc != EOK)
     186                                return rc;
     187                } else {
     188                        rc = ui_paint_outset_frame(wdecor->res, &rect,
     189                            &rect);
    190190                        if (rc != EOK)
    191191                                return rc;
  • uspace/lib/ui/src/window.c

    rdbf1be5 rbfb055b  
    9090static void ui_window_app_invalidate(void *, gfx_rect_t *);
    9191static void ui_window_app_update(void *);
     92static void ui_window_expose_cb(void *);
    9293
    9394/** Initialize window parameters structure.
     
    270271        ui_wdecor_paint(wdecor);
    271272
     273        ui_resource_set_expose_cb(res, ui_window_expose_cb, (void *) window);
     274
    272275        window->ui = ui;
    273276        window->dwindow = dwindow;
     
    922925}
    923926
     927/** Window expose callback. */
     928static void ui_window_expose_cb(void *arg)
     929{
     930        ui_window_t *window = (ui_window_t *) arg;
     931
     932        ui_window_paint(window);
     933}
     934
    924935/** @}
    925936 */
Note: See TracChangeset for help on using the changeset viewer.