Skip to content

Commit 337d441

Browse files
committed
svnbrowse: Implement scrolling so selected item always stays in the view on
long lists. * subversion/svnbrowse/svnbrowse.h (svn_browse__state_t): Add scroller_offset to the struct. (svn_browse__model_scroll_in_view): Declare func. * subversion/svnbrowse/model.c (min, max): New macros. (svn_browse__model_scroll_in_view): Implement func. * subversion/svnbrowse/svnbrowse.c (view_on_event): Call svn_browse__model_scroll_in_view() to rearrange scroller on every update. (view_draw_item): Factor-out a function for convenience. (view_draw): Smarter logic to handle scrollers and avoid rendering items out of view. Use the new func. git-svn-id: https://svn.apache.org/repos/asf/subversion/trunk@1932915 13f79535-47bb-0310-9956-ffa450edef68
1 parent 052bddc commit 337d441

3 files changed

Lines changed: 52 additions & 17 deletions

File tree

subversion/svnbrowse/model.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,24 @@ svn_browse__model_move_selection(svn_browse__model_t *model, int delta)
129129
return SVN_NO_ERROR;
130130
}
131131

132+
#define min(a, b) ((a) < (b)) ? (a) : (b)
133+
#define max(a, b) ((a) > (b)) ? (a) : (b)
134+
135+
svn_error_t *
136+
svn_browse__model_scroll_in_view(svn_browse__model_t *model,
137+
int scroller_height)
138+
{
139+
svn_browse__state_t *state = model->current;
140+
141+
state->scroller_offset = max(state->scroller_offset,
142+
state->selection - scroller_height + 1);
143+
144+
state->scroller_offset = min(state->scroller_offset,
145+
state->selection);
146+
147+
return SVN_NO_ERROR;
148+
}
149+
132150
svn_error_t *
133151
svn_browse__model_create(svn_browse__model_t **model_p,
134152
svn_client_ctx_t *ctx,

subversion/svnbrowse/svnbrowse.c

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,34 @@ view_on_event(svn_browse__view_t *view, int ch, apr_pool_t *scratch_pool)
159159
return svn_error_create(SVN_ERR_CANCELLED, NULL, NULL);
160160
}
161161

162+
/* scrollable height is row one less than the whole view */
163+
SVN_ERR(svn_browse__model_scroll_in_view(view->model, getmaxy(stdscr) - 1));
164+
162165
return SVN_NO_ERROR;
163166
}
164167

168+
static void
169+
view_draw_item(const svn_browse__item_t *item, int y, svn_boolean_t selected)
170+
{
171+
if (selected)
172+
standout();
173+
174+
if (item->dirent->kind == svn_node_dir)
175+
mvprintw(y, 0, "%s/", item->name);
176+
else if (item->dirent->kind == svn_node_file)
177+
mvprintw(y, 0, "%s", item->name);
178+
else
179+
abort();
180+
181+
mvprintw(y, COLS - 40, "%8ld KiB r%-8ld %s",
182+
item->dirent->size / 1024,
183+
item->dirent->created_rev,
184+
item->dirent->last_author);
185+
186+
if (selected)
187+
standend();
188+
}
189+
165190
static void
166191
view_draw(svn_browse__view_t *view, apr_pool_t *pool)
167192
{
@@ -175,24 +200,11 @@ view_draw(svn_browse__view_t *view, apr_pool_t *pool)
175200
{
176201
svn_browse__item_t *item = APR_ARRAY_IDX(view->model->current->list, i,
177202
svn_browse__item_t *);
203+
svn_boolean_t selected = (i == view->model->current->selection);
204+
int y = i - view->model->current->scroller_offset;
178205

179-
if (i == view->model->current->selection)
180-
standout();
181-
182-
if (item->dirent->kind == svn_node_dir)
183-
mvprintw(i + 1, 0, "%s/", item->name);
184-
else if (item->dirent->kind == svn_node_file)
185-
mvprintw(i + 1, 0, "%s", item->name);
186-
else
187-
abort();
188-
189-
mvprintw(i + 1, COLS - 40, "%8ld KiB r%-8ld %s",
190-
item->dirent->size / 1024,
191-
item->dirent->created_rev,
192-
item->dirent->last_author);
193-
194-
if (i == view->model->current->selection)
195-
standend();
206+
if (0 <= y && y < LINES)
207+
view_draw_item(item, y + 1, selected);
196208
}
197209
}
198210

subversion/svnbrowse/svnbrowse.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ typedef struct svn_browse__state_t {
7979

8080
/* the index of hovered item */
8181
int selection;
82+
int scroller_offset;
8283

8384
/* a pool where the structure is allocated */
8485
apr_pool_t *pool;
@@ -123,6 +124,10 @@ svn_error_t *
123124
svn_browse__model_move_selection(svn_browse__model_t *model,
124125
int delta);
125126

127+
svn_error_t *
128+
svn_browse__model_scroll_in_view(svn_browse__model_t *model,
129+
int scroller_height);
130+
126131
svn_error_t *
127132
svn_browse__model_create(svn_browse__model_t **model_p,
128133
svn_client_ctx_t *ctx,

0 commit comments

Comments
 (0)