diff options
| -rw-r--r-- | nncmpp.c | 32 | 
1 files changed, 26 insertions, 6 deletions
| @@ -31,6 +31,7 @@  	XX( TAB_BAR,    "tab_bar",    -1, -1, A_REVERSE   ) \  	XX( TAB_ACTIVE, "tab_active", -1, -1, A_UNDERLINE ) \  	/* Listview                                      */ \ +	XX( HEADER,     "header",     -1, -1, A_UNDERLINE ) \  	XX( EVEN,       "even",       -1, -1, 0           ) \  	XX( ODD,        "odd",        -1, -1, 0           ) \  	XX( DIRECTORY,  "directory",  -1, -1, 0           ) \ @@ -544,6 +545,8 @@ struct tab  	char *name;                         ///< Visible identifier  	size_t name_width;                  ///< Visible width of the name +	char *header;                       ///< The header, should there be any +  	// Implementation:  	// TODO: free() callback? @@ -617,6 +620,7 @@ static struct app_context  	int header_height;                  ///< Height of the header +	int tabs_offset;                    ///< Offset to tabs or -1  	int controls_offset;                ///< Offset to player controls or -1  	int gauge_offset;                   ///< Offset to the gauge or -1  	int gauge_width;                    ///< Width of the gauge, if present @@ -1111,6 +1115,7 @@ 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;  	g.controls_offset = -1;  	g.gauge_offset = -1;  	g.gauge_width = 0; @@ -1138,9 +1143,18 @@ app_draw_header (void)  	row_buffer_append (&buf, APP_TITLE, attrs[g.active_tab == g.help_tab]);  	row_buffer_append (&buf, " ", attrs[false]); +	g.tabs_offset = g.header_height;  	LIST_FOR_EACH (struct tab, iter, g.tabs)  		row_buffer_append (&buf, iter->name, attrs[iter == g.active_tab]);  	app_flush_header (&buf, attrs[false]); + +	const char *header = g.active_tab->header; +	if (header) +	{ +		row_buffer_init (&buf); +		row_buffer_append (&buf, header, APP_ATTR (HEADER)); +		app_flush_header (&buf, APP_ATTR (HEADER)); +	}  }  static int @@ -1652,12 +1666,12 @@ app_process_action (enum action action)  		break;  	case ACTION_GOTO_PAGE_PREVIOUS: -		app_scroll (-app_fitting_items ()); -		app_move_selection (-app_fitting_items ()); +		app_scroll (-app_visible_items ()); +		app_move_selection (-app_visible_items ());  		break;  	case ACTION_GOTO_PAGE_NEXT: -		app_scroll (app_fitting_items ()); -		app_move_selection (app_fitting_items ()); +		app_scroll (app_visible_items ()); +		app_move_selection (app_visible_items ());  		break;  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1701,7 +1715,7 @@ app_process_left_mouse_click (int line, int column, bool double_click)  			free (where);  		}  	} -	else if (line == g.header_height - 1) +	else if (line == g.tabs_offset)  	{  		struct tab *winner = NULL;  		int indent = strlen (APP_TITLE); @@ -1720,7 +1734,7 @@ app_process_left_mouse_click (int line, int column, bool double_click)  		app_switch_tab (winner);  	} -	else +	else if (line >= g.header_height)  	{  		struct tab *tab = g.active_tab;  		int row_index = line - g.header_height; @@ -2099,6 +2113,12 @@ library_tab_change_level (const char *new_path)  	str_reset (path);  	str_append (path, new_path); + +	free (g_library_tab.super.header); +	g_library_tab.super.header = NULL; + +	if (path->len) +		g_library_tab.super.header = xstrdup_printf ("/%s", path->str);  }  static void | 
