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 ++++++++++++++++++++++++++++++++++----- view.h | 13 +++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) 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(); diff --git a/view.h b/view.h index dd5f879..39f8ec6 100644 --- a/view.h +++ b/view.h @@ -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 @@ -139,6 +145,13 @@ Selection *view_selection_disposed(View*); 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 -- cgit v1.2.3