diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-06-14 15:09:36 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-06-15 15:51:43 +0200 |
| commit | 57a743f42f0cecdc5794b424720500d0532cfc4b (patch) | |
| tree | cd2cfe704793e847f17764801f12790f07dbda2c | |
| parent | 11d7a0e6a505a3cc9c1a8fedf9e8101059d96701 (diff) | |
| download | vis-57a743f42f0cecdc5794b424720500d0532cfc4b.tar.gz vis-57a743f42f0cecdc5794b424720500d0532cfc4b.tar.xz | |
view: add functions to get/set all selections
| -rw-r--r-- | view.c | 39 | ||||
| -rw-r--r-- | view.h | 13 |
2 files changed, 47 insertions, 5 deletions
@@ -38,11 +38,6 @@ enum { * the necessary offset for the last character. */ -typedef struct { - Mark anchor; - Mark cursor; -} SelectionRegion; - struct Selection { Mark cursor; /* other selection endpoint where it changes */ Mark anchor; /* position where the selection was created */ @@ -1247,6 +1242,40 @@ bool view_selections_restore(Selection *s) { return true; } +void view_selections_set_all(View *view, Array *arr) { + Selection *s; + Filerange *r; + size_t i = 0; + for (s = view->selections; s; s = s->next) { + if (!(r = array_get(arr, i++)) || !view_selections_set(s, r)) { + for (Selection *next; s; s = next) { + next = view_selections_next(s); + view_selections_dispose(s); + } + break; + } + } + while ((r = array_get(arr, i++))) { + s = view_selections_new_force(view, r->start); + if (!s || !view_selections_set(s, r)) + break; + } + view_selections_primary_set(view->selections); +} + +Array view_selections_get_all(View *view) { + Array arr; + array_init_sized(&arr, sizeof(Filerange)); + if (!array_reserve(&arr, view_selections_count(view))) + return arr; + for (Selection *s = view->selections; s; s = s->next) { + Filerange r = view_selections_get(s); + if (text_range_valid(&r)) + array_add(&arr, &r); + } + return arr; +} + void view_selections_normalize(View *view) { Selection *prev = NULL; Filerange range_prev = text_range_empty(); @@ -9,6 +9,12 @@ typedef struct Selection Selection; #include "text.h" #include "ui.h" +#include "array.h" + +typedef struct { + Mark anchor; + Mark cursor; +} SelectionRegion; typedef struct { char data[16]; /* utf8 encoded character displayed in this cell (might be more than @@ -140,6 +146,13 @@ void view_selections_dispose_all(View*); /** Dispose all invalid and merge all overlapping selections. */ void view_selections_normalize(View*); /** + * Replace currently active selections. + * @param The array of ``Filerange``s. + */ +void view_selections_set_all(View*, Array*); +/** Get array containing a ``Fileranges`` for each selection. */ +Array view_selections_get_all(View*); +/** * @} * @defgroup view_navigate * @{ |
