Changeset 20d2c6c in mainline for uspace/lib/ui


Ignore:
Timestamp:
2020-10-21T20:58:52Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
172188a
Parents:
ba09d06
Message:

Window close button

Location:
uspace/lib/ui
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/private/wdecor.h

    rba09d06 r20d2c6c  
    5656        gfx_rect_t rect;
    5757        /** Caption */
    58         const char *caption;
     58        char *caption;
    5959        /** Window is active */
    6060        bool active;
     61        /** Close button */
     62        struct ui_pbutton *btn_close;
    6163};
    6264
     65extern void ui_wdecor_close(ui_wdecor_t *);
    6366extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *);
    6467
  • uspace/lib/ui/src/wdecor.c

    rba09d06 r20d2c6c  
    4343#include <str.h>
    4444#include <ui/paint.h>
     45#include <ui/pbutton.h>
    4546#include <ui/wdecor.h>
    4647#include "../private/resource.h"
    4748#include "../private/wdecor.h"
     49
     50static void ui_wdecor_btn_clicked(ui_pbutton_t *, void *);
     51
     52static ui_pbutton_cb_t ui_wdecor_btn_close_cb = {
     53        .clicked = ui_wdecor_btn_clicked
     54};
    4855
    4956/** Create new window decoration.
     
    5865{
    5966        ui_wdecor_t *wdecor;
     67        errno_t rc;
    6068
    6169        wdecor = calloc(1, sizeof(ui_wdecor_t));
     
    6977        }
    7078
     79        rc = ui_pbutton_create(resource, "X", &wdecor->btn_close);
     80        if (rc != EOK) {
     81                free(wdecor->caption);
     82                free(wdecor);
     83                return rc;
     84        }
     85
     86        ui_pbutton_set_cb(wdecor->btn_close, &ui_wdecor_btn_close_cb,
     87            (void *)wdecor);
     88
    7189        wdecor->res = resource;
    7290        wdecor->active = true;
     
    84102                return;
    85103
     104        ui_pbutton_destroy(wdecor->btn_close);
     105        free(wdecor->caption);
    86106        free(wdecor);
    87107}
     
    106126void ui_wdecor_set_rect(ui_wdecor_t *wdecor, gfx_rect_t *rect)
    107127{
     128        gfx_rect_t crect;
     129
    108130        wdecor->rect = *rect;
     131        crect.p0.x = rect->p1.x - 5 - 20;
     132        crect.p0.y = rect->p0.y + 5;
     133        crect.p1.x = rect->p1.x - 5;
     134        crect.p1.y = rect->p0.y + 5 + 20;
     135
     136        ui_pbutton_set_rect(wdecor->btn_close, &crect);
    109137}
    110138
     
    191219                return rc;
    192220
     221        rc = ui_pbutton_paint(wdecor->btn_close);
     222        if (rc != EOK)
     223                return rc;
     224
    193225        return EOK;
     226}
     227
     228/** Send decoration close event.
     229 *
     230 * @param wdecor Window decoration
     231 * @param pos Position where the title bar was pressed
     232 */
     233void ui_wdecor_close(ui_wdecor_t *wdecor)
     234{
     235        if (wdecor->cb != NULL && wdecor->cb->close != NULL)
     236                wdecor->cb->close(wdecor, wdecor->arg);
    194237}
    195238
     
    213256{
    214257        gfx_rect_t trect;
     258        gfx_rect_t cbrect;
    215259        gfx_coord2_t pos;
    216260
     
    220264        trect.p1.y = trect.p0.y + 22;
    221265
     266        cbrect.p0.x = wdecor->rect.p1.x - 5 - 20;
     267        cbrect.p0.y = wdecor->rect.p0.y + 5;
     268        cbrect.p1.x = wdecor->rect.p1.x - 5;
     269        cbrect.p1.y = wdecor->rect.p0.y + 5 + 20;
     270
    222271        pos.x = event->hpos;
    223272        pos.y = event->vpos;
    224273
     274        if (gfx_pix_inside_rect(&pos, &cbrect)) {
     275                ui_pbutton_pos_event(wdecor->btn_close, event);
     276                return;
     277        }
     278
    225279        if (event->type == POS_PRESS && gfx_pix_inside_rect(&pos, &trect))
    226280                ui_wdecor_move(wdecor, &pos);
    227281}
    228282
     283/** Window decoration close button was clicked.
     284 *
     285 * @param pbutton Close button
     286 * @param arg Argument (ui_wdecor_t)
     287 */
     288static void ui_wdecor_btn_clicked(ui_pbutton_t *pbutton, void *arg)
     289{
     290        ui_wdecor_t *wdecor = (ui_wdecor_t *) arg;
     291
     292        (void) pbutton;
     293        ui_wdecor_close(wdecor);
     294}
     295
    229296/** @}
    230297 */
  • uspace/lib/ui/test/wdecor.c

    rba09d06 r20d2c6c  
    3232#include <pcut/pcut.h>
    3333#include <stdbool.h>
     34#include <ui/pbutton.h>
    3435#include <ui/resource.h>
    3536#include <ui/wdecor.h>
     
    5758};
    5859
     60static void test_wdecor_close(ui_wdecor_t *, void *);
    5961static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *);
    6062
    6163static ui_wdecor_cb_t test_wdecor_cb = {
     64        .close = test_wdecor_close,
    6265        .move = test_wdecor_move
    6366};
     
    8487
    8588typedef struct {
     89        bool close;
    8690        bool move;
    8791        gfx_coord2_t pos;
     
    179183        rc = gfx_context_delete(gc);
    180184        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     185}
     186
     187/** Test ui_wdecor_close() */
     188PCUT_TEST(close)
     189{
     190        errno_t rc;
     191        ui_wdecor_t *wdecor;
     192        test_cb_resp_t resp;
     193
     194        rc = ui_wdecor_create(NULL, "Hello", &wdecor);
     195        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     196
     197        /* Close callback with no callbacks set */
     198        ui_wdecor_close(wdecor);
     199
     200        /* Close callback with close callback not implemented */
     201        ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
     202        ui_wdecor_close(wdecor);
     203
     204        /* Close callback with real callback set */
     205        resp.close = false;
     206        ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
     207        ui_wdecor_close(wdecor);
     208        PCUT_ASSERT_TRUE(resp.close);
     209
     210        ui_wdecor_destroy(wdecor);
    181211}
    182212
     
    211241        PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
    212242        PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
     243
     244        ui_wdecor_destroy(wdecor);
     245}
     246
     247/** Clicking the close button generates close callback */
     248PCUT_TEST(close_btn_clicked)
     249{
     250        ui_wdecor_t *wdecor;
     251        gfx_rect_t rect;
     252        test_cb_resp_t resp;
     253        errno_t rc;
     254
     255        rc = ui_wdecor_create(NULL, "Hello", &wdecor);
     256        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     257
     258        rect.p0.x = 10;
     259        rect.p0.y = 20;
     260        rect.p1.x = 100;
     261        rect.p1.y = 200;
     262
     263        ui_wdecor_set_rect(wdecor, &rect);
     264
     265        ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
     266
     267        resp.close = false;
     268
     269        ui_pbutton_clicked(wdecor->btn_close);
     270        PCUT_ASSERT_TRUE(resp.close);
    213271
    214272        ui_wdecor_destroy(wdecor);
     
    328386}
    329387
     388static void test_wdecor_close(ui_wdecor_t *wdecor, void *arg)
     389{
     390        test_cb_resp_t *resp = (test_cb_resp_t *) arg;
     391
     392        resp->close = true;
     393}
     394
    330395static void test_wdecor_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos)
    331396{
Note: See TracChangeset for help on using the changeset viewer.