Changeset d63623f in mainline for uspace/lib/ui/src


Ignore:
Timestamp:
2021-07-16T17:45:12Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4afb6c9
Parents:
61bf9dd9
Message:

Seeking in entry text using mouse

Location:
uspace/lib/ui/src
Files:
2 edited

Legend:

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

    r61bf9dd9 rd63623f  
    256256{
    257257        ui_resource_t *res;
     258        ui_entry_geom_t geom;
    258259        gfx_text_fmt_t fmt;
    259260        gfx_coord2_t pos;
    260         gfx_coord_t hpad;
    261         gfx_coord_t vpad;
    262         gfx_coord_t width;
    263261        gfx_rect_t inside;
    264262        errno_t rc;
     
    266264        res = ui_window_get_res(entry->window);
    267265
    268         if (res->textmode) {
    269                 hpad = ui_entry_hpad_text;
    270                 vpad = ui_entry_vpad_text;
    271         } else {
    272                 hpad = ui_entry_hpad;
    273                 vpad = ui_entry_vpad;
    274         }
     266        ui_entry_get_geom(entry, &geom);
    275267
    276268        if (res->textmode == false) {
     
    293285                goto error;
    294286
    295         width = gfx_text_width(res->font, entry->text);
    296 
    297         switch (entry->halign) {
    298         case gfx_halign_left:
    299         case gfx_halign_justify:
    300                 pos.x = inside.p0.x + hpad;
    301                 break;
    302         case gfx_halign_center:
    303                 pos.x = (inside.p0.x + inside.p1.x) / 2 - width / 2;
    304                 break;
    305         case gfx_halign_right:
    306                 pos.x = inside.p1.x - hpad - 1 - width;
    307                 break;
    308         }
    309 
    310         pos.y = inside.p0.y + vpad;
     287        pos = geom.text_pos;
    311288
    312289        gfx_text_fmt_init(&fmt);
     
    347324error:
    348325        return rc;
     326}
     327
     328/** Find position in text entry.
     329 *
     330 * @param entry Text entry
     331 * @param fpos Position for which we need to find text offset
     332 * @return Corresponding byte offset in entry text
     333 */
     334size_t ui_entry_find_pos(ui_entry_t *entry, gfx_coord2_t *fpos)
     335{
     336        ui_resource_t *res;
     337        ui_entry_geom_t geom;
     338        gfx_text_fmt_t fmt;
     339
     340        res = ui_window_get_res(entry->window);
     341
     342        ui_entry_get_geom(entry, &geom);
     343
     344        gfx_text_fmt_init(&fmt);
     345        fmt.halign = gfx_halign_left;
     346        fmt.valign = gfx_valign_top;
     347
     348        return gfx_text_find_pos(res->font, &geom.text_pos, &fmt,
     349            entry->text, fpos);
    349350}
    350351
     
    567568
    568569                if (gfx_pix_inside_rect(&pos, &entry->rect)) {
    569                         ui_entry_activate(entry);
     570                        entry->pos = ui_entry_find_pos(entry, &pos);
     571                        if (entry->active)
     572                                ui_entry_paint(entry);
     573                        else
     574                                ui_entry_activate(entry);
    570575
    571576                        return ui_claimed;
     
    604609}
    605610
     611/** Get text entry geometry.
     612 *
     613 * @param entry Text entry
     614 * @param geom Structure to fill in with computed geometry
     615 */
     616void ui_entry_get_geom(ui_entry_t *entry, ui_entry_geom_t *geom)
     617{
     618        gfx_coord_t hpad;
     619        gfx_coord_t vpad;
     620        gfx_coord_t width;
     621        ui_resource_t *res;
     622
     623        res = ui_window_get_res(entry->window);
     624
     625        if (res->textmode) {
     626                hpad = ui_entry_hpad_text;
     627                vpad = ui_entry_vpad_text;
     628        } else {
     629                hpad = ui_entry_hpad;
     630                vpad = ui_entry_vpad;
     631        }
     632
     633        if (res->textmode == false) {
     634                ui_paint_get_inset_frame_inside(res, &entry->rect,
     635                    &geom->interior_rect);
     636        } else {
     637                geom->interior_rect = entry->rect;
     638        }
     639
     640        width = gfx_text_width(res->font, entry->text);
     641
     642        switch (entry->halign) {
     643        case gfx_halign_left:
     644        case gfx_halign_justify:
     645                geom->text_pos.x = geom->interior_rect.p0.x + hpad;
     646                break;
     647        case gfx_halign_center:
     648                geom->text_pos.x = (geom->interior_rect.p0.x +
     649                    geom->interior_rect.p1.x) / 2 - width / 2;
     650                break;
     651        case gfx_halign_right:
     652                geom->text_pos.x = geom->interior_rect.p1.x - hpad - 1 - width;
     653                break;
     654        }
     655
     656        geom->text_pos.y = geom->interior_rect.p0.y + vpad;
     657}
     658
    606659/** Activate text entry.
    607660 *
     
    618671
    619672        entry->active = true;
    620         entry->pos = str_size(entry->text);
    621673        (void) ui_entry_paint(entry);
    622674
  • uspace/lib/ui/src/paint.c

    r61bf9dd9 rd63623f  
    4949 * @param thickness Bevel thickness in pixels
    5050 * @param inside Place to store rectangle of the interior or @c NULL
    51  * @reutrn EOK on success or an error code
     51 * @return EOK on success or an error code
    5252 */
    5353errno_t ui_paint_bevel(gfx_context_t *gc, gfx_rect_t *rect,
     
    107107        }
    108108
    109         if (inside != NULL) {
    110                 inside->p0.x = rect->p0.x + thickness;
    111                 inside->p0.y = rect->p0.y + thickness;
    112                 inside->p1.x = rect->p1.x - thickness;
    113                 inside->p1.y = rect->p1.y - thickness;
    114         }
     109        if (inside != NULL)
     110                ui_paint_get_bevel_inside(gc, rect, thickness, inside);
    115111
    116112        return EOK;
    117113error:
    118114        return rc;
     115}
     116
     117/** Get bevel interior rectangle.
     118 *
     119 * Get the bevel interior rectangle without painting it.
     120 *
     121 * @param gc Graphic context
     122 * @param rect Rectangle to paint into
     123 * @param thickness Bevel thickness in pixels
     124 * @param inside Place to store rectangle of the interior
     125 */
     126void ui_paint_get_bevel_inside(gfx_context_t *gc, gfx_rect_t *rect,
     127    gfx_coord_t thickness, gfx_rect_t *inside)
     128{
     129        inside->p0.x = rect->p0.x + thickness;
     130        inside->p0.y = rect->p0.y + thickness;
     131        inside->p1.x = rect->p1.x - thickness;
     132        inside->p1.y = rect->p1.y - thickness;
    119133}
    120134
     
    147161error:
    148162        return rc;
     163}
     164
     165/** Get inset frame interior rectangle.
     166 *
     167 * This allows one to get the interior rectangle without actually painting
     168 * the inset frame.
     169 *
     170 * @param resource UI resource
     171 * @param rect Rectangle to paint onto
     172 * @param inside Place to store inside rectangle or @c NULL
     173 */
     174void ui_paint_get_inset_frame_inside(ui_resource_t *resource, gfx_rect_t *rect,
     175    gfx_rect_t *inside)
     176{
     177        ui_paint_get_bevel_inside(resource->gc, rect, 2, inside);
    149178}
    150179
Note: See TracChangeset for help on using the changeset viewer.