From 7b41ae16582f4c108d4fa55279b371ae2351e81c Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Mon, 5 Jun 2017 19:39:06 +0200
Subject: Simplify view code
Now we beep if selection movement is impossible.
It still looks a bit more obfuscated than it needs to be.
---
nncmpp.c | 67 ++++++++++++++++++++++++++--------------------------------------
1 file changed, 27 insertions(+), 40 deletions(-)
diff --git a/nncmpp.c b/nncmpp.c
index 16bd1de..e973d3f 100644
--- a/nncmpp.c
+++ b/nncmpp.c
@@ -1120,7 +1120,6 @@ app_draw_status (void)
static void
app_draw_header (void)
{
- // TODO: call app_fix_view_range() if it changes from the previous value
g.header_height = 0;
g.tabs_offset = -1;
@@ -1372,22 +1371,9 @@ app_draw_statusbar (void)
app_flush_buffer (&buf, COLS, APP_ATTR (NORMAL));
}
-static void
-app_on_refresh (void *user_data)
-{
- (void) user_data;
- poller_idle_reset (&g.refresh_event);
-
- app_draw_header ();
- app_draw_view ();
- app_draw_statusbar ();
-
- refresh ();
-}
-
-// --- Actions -----------------------------------------------------------------
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-/// Checks what items are visible and returns if fixes were needed
+/// Checks what items are visible and returns if the range was alright
static bool
app_fix_view_range (void)
{
@@ -1395,7 +1381,6 @@ app_fix_view_range (void)
if (tab->item_top < 0)
{
tab->item_top = 0;
- app_invalidate ();
return false;
}
@@ -1407,12 +1392,27 @@ app_fix_view_range (void)
if (tab->item_top > max_item_top)
{
tab->item_top = max_item_top;
- app_invalidate ();
return false;
}
return true;
}
+static void
+app_on_refresh (void *user_data)
+{
+ (void) user_data;
+ poller_idle_reset (&g.refresh_event);
+
+ app_draw_header ();
+ app_fix_view_range();
+ app_draw_view ();
+ app_draw_statusbar ();
+
+ refresh ();
+}
+
+// --- Actions -----------------------------------------------------------------
+
/// Scroll down (positive) or up (negative) @a n items
static bool
app_scroll (int n)
@@ -1443,11 +1443,11 @@ static bool
app_move_selection (int diff)
{
struct tab *tab = g.active_tab;
- int fixed = tab->item_selected += diff;
+ int fixed = tab->item_selected + diff;
fixed = MIN (fixed, (int) tab->item_count - 1);
fixed = MAX (fixed, 0);
- bool result = tab->item_selected != fixed;
+ bool result = !diff || tab->item_selected != fixed;
tab->item_selected = fixed;
app_invalidate ();
@@ -1696,33 +1696,26 @@ app_process_action (enum action action)
break;
case ACTION_GOTO_ITEM_PREVIOUS:
- app_move_selection (-1);
- break;
+ return app_move_selection (-1);
case ACTION_GOTO_ITEM_NEXT:
- app_move_selection (1);
- break;
+ return app_move_selection (1);
case ACTION_GOTO_PAGE_PREVIOUS:
app_scroll (-app_visible_items ());
- app_move_selection (-app_visible_items ());
- break;
+ return app_move_selection (-app_visible_items ());
case ACTION_GOTO_PAGE_NEXT:
app_scroll (app_visible_items ());
- app_move_selection (app_visible_items ());
- break;
+ return app_move_selection (app_visible_items ());
case ACTION_GOTO_VIEW_TOP:
g.active_tab->item_selected = g.active_tab->item_top;
- app_move_selection (0);
- break;
+ return app_move_selection (0);
case ACTION_GOTO_VIEW_CENTER:
g.active_tab->item_selected = g.active_tab->item_top;
- app_move_selection (MAX (0, app_visible_items () / 2 - 1));
- break;
+ return app_move_selection (MAX (0, app_visible_items () / 2 - 1));
case ACTION_GOTO_VIEW_BOTTOM:
g.active_tab->item_selected = g.active_tab->item_top;
- app_move_selection (MAX (0, app_visible_items () - 1));
- break;
+ return app_move_selection (MAX (0, app_visible_items () - 1));
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -1795,11 +1788,8 @@ app_process_left_mouse_click (int line, int column, bool double_click)
// TODO: handle the scrollbar a bit better than this
int visible_items = app_visible_items ();
if ((int) tab->item_count > visible_items && column == COLS - 1)
- {
tab->item_top = (float) row_index / visible_items
* (int) tab->item_count - visible_items / 2;
- app_fix_view_range ();
- }
else
tab->item_selected = row_index + tab->item_top;
app_invalidate ();
@@ -1986,7 +1976,6 @@ static void
current_tab_update (void)
{
g_current_tab.item_count = g.playlist.len;
- app_fix_view_range ();
app_invalidate ();
}
@@ -2221,7 +2210,6 @@ library_tab_on_data (const struct mpd_response *response,
(int (*) (const void *, const void *)) library_tab_compare);
g_library_tab.super.item_count = items->len;
- app_fix_view_range ();
app_move_selection (0);
app_invalidate ();
}
@@ -3203,7 +3191,6 @@ app_on_signal_pipe_readable (const struct pollfd *fd, void *user_data)
{
g_winch_received = false;
update_curses_terminal_size ();
- app_fix_view_range ();
app_invalidate ();
}
}
--
cgit v1.2.3-70-g09d2