Fix window resizing

This commit is contained in:
Přemysl Eric Janouch 2013-05-19 01:02:19 +02:00
parent caac68a3ed
commit 110f2523d3
1 changed files with 20 additions and 9 deletions

View File

@ -272,8 +272,7 @@ app_reload_view (Application *self)
if (self->entries->len != 0) if (self->entries->len != 0)
g_ptr_array_remove_range (self->entries, 0, self->entries->len); g_ptr_array_remove_range (self->entries, 0, self->entries->len);
self->selected = 0; gint remains = LINES - 1 + self->top_offset;
gint remains = LINES - 1;
StardictIterator *iterator = StardictIterator *iterator =
stardict_iterator_new (self->dict, self->top_position); stardict_iterator_new (self->dict, self->top_position);
while (remains > 0 && stardict_iterator_is_valid (iterator)) while (remains > 0 && stardict_iterator_is_valid (iterator))
@ -533,7 +532,7 @@ append_entry (Application *self, guint32 position)
/** Counts the number of definitions available for seeing. */ /** Counts the number of definitions available for seeing. */
static guint static guint
count_view_items (Application *self) app_count_view_items (Application *self)
{ {
guint i, n_definitions = 0; guint i, n_definitions = 0;
for (i = 0; i < self->entries->len; i++) for (i = 0; i < self->entries->len; i++)
@ -549,7 +548,7 @@ static gboolean
app_scroll_up (Application *self, guint n) app_scroll_up (Application *self, guint n)
{ {
gboolean success = TRUE; gboolean success = TRUE;
guint n_definitions = count_view_items (self); guint n_definitions = app_count_view_items (self);
while (n--) while (n--)
{ {
if (self->top_offset > 0) if (self->top_offset > 0)
@ -590,7 +589,7 @@ static gboolean
app_scroll_down (Application *self, guint n) app_scroll_down (Application *self, guint n)
{ {
gboolean success = TRUE; gboolean success = TRUE;
guint n_definitions = count_view_items (self); guint n_definitions = app_count_view_items (self);
while (n--) while (n--)
{ {
if (self->entries->len == 0) if (self->entries->len == 0)
@ -712,6 +711,7 @@ app_search_for_entry (Application *self)
self->top_position = stardict_iterator_get_offset (iterator); self->top_position = stardict_iterator_get_offset (iterator);
self->top_offset = 0; self->top_offset = 0;
self->selected = 0;
g_object_unref (iterator); g_object_unref (iterator);
app_reload_view (self); app_reload_view (self);
@ -764,11 +764,22 @@ app_process_nonchar_code (Application *self, CursesEvent *event)
switch (event->code) switch (event->code)
{ {
case KEY_RESIZE: case KEY_RESIZE:
// TODO adapt to the new window size, COLS, LINES {
// mind the position of the selection cursor
app_reload_view (self); app_reload_view (self);
guint n_visible = app_count_view_items (self) - self->top_offset;
if ((gint) n_visible > LINES - 1)
n_visible = LINES - 1;
if (self->selected >= n_visible)
{
app_scroll_down (self, self->selected - n_visible + 1);
self->selected = n_visible - 1;
}
app_redraw (self); app_redraw (self);
break; break;
}
case KEY_MOUSE: case KEY_MOUSE:
if (!(event->mouse.bstate & BUTTON1_PRESSED)) if (!(event->mouse.bstate & BUTTON1_PRESSED))
break; break;
@ -785,7 +796,7 @@ app_process_nonchar_code (Application *self, CursesEvent *event)
} }
} }
else if (event->mouse.y <= (int) else if (event->mouse.y <= (int)
(count_view_items (self) - self->top_offset)) (app_count_view_items (self) - self->top_offset))
{ {
self->selected = event->mouse.y - 1; self->selected = event->mouse.y - 1;
app_redraw_view (self); app_redraw_view (self);
@ -805,7 +816,7 @@ app_process_nonchar_code (Application *self, CursesEvent *event)
break; break;
case KEY_DOWN: case KEY_DOWN:
if ((gint) self->selected < LINES - 2 && if ((gint) self->selected < LINES - 2 &&
self->selected < count_view_items (self) - self->top_offset - 1) self->selected < app_count_view_items (self) - self->top_offset - 1)
{ {
self->selected++; self->selected++;
app_redraw_view (self); app_redraw_view (self);