From 57a743f42f0cecdc5794b424720500d0532cfc4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Wed, 14 Jun 2017 15:09:36 +0200 Subject: view: add functions to get/set all selections --- view.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'view.c') diff --git a/view.c b/view.c index 22607e4..206cb42 100644 --- a/view.c +++ b/view.c @@ -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(); -- cgit v1.2.3