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

Changeset 61bf9dd9 in mainline for uspace/lib/ui/src/entry.c


Ignore:
Timestamp:
2021-06-30T16:48:54Z (5 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
d63623f
Parents:
5d1ff11
Message:

Seeking in entry text (using keyboard)

Seek using Home, End, Left Arrow and Right Arrow keys, delete character
after cursor using Delete key.

File:
1 edited

Legend:

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

    r5d1ff11 r61bf9dd9  
    180180        free(entry->text);
    181181        entry->text = tcopy;
     182        entry->pos = str_size(text);
    182183
    183184        return EOK;
     
    223224error:
    224225        return rc;
     226}
     227
     228/** Return width of text before cursor.
     229 *
     230 * @param entry Text entry
     231 * @return Widht of text before cursor
     232 */
     233static gfx_coord_t ui_entry_lwidth(ui_entry_t *entry)
     234{
     235        ui_resource_t *res;
     236        uint8_t tmp;
     237        gfx_coord_t width;
     238
     239        res = ui_window_get_res(entry->window);
     240
     241        tmp = entry->text[entry->pos];
     242
     243        entry->text[entry->pos] = '\0';
     244        width = gfx_text_width(res->font, entry->text);
     245        entry->text[entry->pos] = tmp;
     246
     247        return width;
    225248}
    226249
     
    304327        if (entry->active) {
    305328                /* Cursor */
    306                 pos.x += width;
     329                pos.x += ui_entry_lwidth(entry);
    307330
    308331                rc = ui_entry_paint_cursor(entry, &pos);
     
    357380errno_t ui_entry_insert_str(ui_entry_t *entry, const char *str)
    358381{
     382        uint8_t tmp;
     383        char *ltext = NULL;
    359384        char *newtext;
    360385        char *oldtext;
    361386        int rc;
    362387
    363         rc = asprintf(&newtext, "%s%s", entry->text, str);
    364         if (rc < 0)
     388        tmp = entry->text[entry->pos];
     389        entry->text[entry->pos] = '\0';
     390        ltext = str_dup(entry->text);
     391        if (ltext == NULL)
    365392                return ENOMEM;
     393
     394        entry->text[entry->pos] = tmp;
     395
     396        rc = asprintf(&newtext, "%s%s%s", ltext, str, entry->text + entry->pos);
     397        if (rc < 0) {
     398                free(ltext);
     399                return ENOMEM;
     400        }
    366401
    367402        oldtext = entry->text;
    368403        entry->text = newtext;
     404        entry->pos += str_size(str);
    369405        free(oldtext);
     406        free(ltext);
     407
    370408        ui_entry_paint(entry);
    371409
     
    381419        size_t off;
    382420
    383         off = str_size(entry->text);
     421        if (entry->pos == 0)
     422                return;
     423
     424        /* Find offset where character before cursor starts */
     425        off = entry->pos;
    384426        (void) str_decode_reverse(entry->text, &off,
    385427            str_size(entry->text));
    386         entry->text[off] = '\0';
     428
     429        memmove(entry->text + off, entry->text + entry->pos,
     430            str_size(entry->text + entry->pos) + 1);
     431        entry->pos = off;
     432
     433        ui_entry_paint(entry);
     434}
     435
     436/** Delete character after cursor.
     437 *
     438 * @param entry Text entry
     439 */
     440void ui_entry_delete(ui_entry_t *entry)
     441{
     442        size_t off;
     443
     444        /* Find offset where character after cursor end */
     445        off = entry->pos;
     446        (void) str_decode(entry->text, &off,
     447            str_size(entry->text));
     448
     449        memmove(entry->text + entry->pos, entry->text + off,
     450            str_size(entry->text + off) + 1);
     451
    387452        ui_entry_paint(entry);
    388453}
     
    398463        assert(event->type == KEY_PRESS);
    399464
    400         if (event->key == KC_BACKSPACE)
     465        switch (event->key) {
     466        case KC_BACKSPACE:
    401467                ui_entry_backspace(entry);
    402 
    403         if (event->key == KC_ESCAPE)
     468                break;
     469
     470        case KC_DELETE:
     471                ui_entry_delete(entry);
     472                break;
     473
     474        case KC_ESCAPE:
    404475                ui_entry_deactivate(entry);
     476                break;
     477
     478        case KC_HOME:
     479                ui_entry_seek_start(entry);
     480                break;
     481
     482        case KC_END:
     483                ui_entry_seek_end(entry);
     484                break;
     485
     486        case KC_LEFT:
     487                ui_entry_seek_prev_char(entry);
     488                break;
     489
     490        case KC_RIGHT:
     491                ui_entry_seek_next_char(entry);
     492                break;
     493
     494        default:
     495                break;
     496        }
    405497
    406498        return ui_claimed;
     
    526618
    527619        entry->active = true;
     620        entry->pos = str_size(entry->text);
    528621        (void) ui_entry_paint(entry);
    529622
     
    532625}
    533626
     627/** Move text cursor to the beginning of text.
     628 *
     629 * @param entry Text entry
     630 */
     631void ui_entry_seek_start(ui_entry_t *entry)
     632{
     633        entry->pos = 0;
     634        (void) ui_entry_paint(entry);
     635}
     636
     637/** Move text cursor to the end of text.
     638 *
     639 * @param entry Text entry
     640 */
     641void ui_entry_seek_end(ui_entry_t *entry)
     642{
     643        entry->pos = str_size(entry->text);
     644        (void) ui_entry_paint(entry);
     645}
     646
     647/** Move text cursor one character backward.
     648 *
     649 * @param entry Text entry
     650 */
     651void ui_entry_seek_prev_char(ui_entry_t *entry)
     652{
     653        size_t off;
     654
     655        off = entry->pos;
     656        (void) str_decode_reverse(entry->text, &off,
     657            str_size(entry->text));
     658        entry->pos = off;
     659        (void) ui_entry_paint(entry);
     660}
     661
     662/** Move text cursor one character forward.
     663 *
     664 * @param entry Text entry
     665 */
     666void ui_entry_seek_next_char(ui_entry_t *entry)
     667{
     668        size_t off;
     669
     670        off = entry->pos;
     671        (void) str_decode(entry->text, &off,
     672            str_size(entry->text));
     673        entry->pos = off;
     674        (void) ui_entry_paint(entry);
     675}
     676
    534677/** Deactivate text entry.
    535678 *
Note: See TracChangeset for help on using the changeset viewer.