1
0
Fork 0
forked from len0rd/rockbox

Added scrollbar to tree view and menus.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2084 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Markus Braun 2002-08-30 13:49:32 +00:00
parent 4b0e8b0b56
commit 000c2db035
5 changed files with 121 additions and 41 deletions

View file

@ -26,9 +26,12 @@
#include "panic.h" #include "panic.h"
#include "settings.h" #include "settings.h"
#include "status.h" #include "status.h"
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
#include "icons.h" #include "icons.h"
#include "widgets.h"
#endif #endif
#ifdef LOADABLE_FONTS #ifdef LOADABLE_FONTS
#include "ajf.h" #include "ajf.h"
#endif #endif
@ -43,12 +46,37 @@ struct menu {
#define MAX_MENUS 4 #define MAX_MENUS 4
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
#define MARGIN_X (global_settings.scrollbar ? SCROLLBAR_WIDTH : 0) + CURSOR_WIDTH /* X pixel margin */
#define MARGIN_Y (global_settings.statusbar ? STATUSBAR_HEIGHT : 0) /* Y pixel margin */
#define LINE_X 0 /* X position the entry-list starts at */
#define LINE_Y (global_settings.statusbar ? 1 : 0) /* Y position the entry-list starts at */ #define LINE_Y (global_settings.statusbar ? 1 : 0) /* Y position the entry-list starts at */
#define LINE_HEIGTH 8 /* pixels for each text line */ #define LINE_HEIGTH 8 /* pixels for each text line */
#define MENU_LINES (LCD_HEIGHT / LINE_HEIGTH - LINE_Y) #define MENU_LINES (LCD_HEIGHT / LINE_HEIGTH - LINE_Y)
#else
#define CURSOR_X (global_settings.scrollbar ? 1 : 0)
#define CURSOR_Y 0 /* the cursor is not positioned in regard to
the margins, so this is the amount of lines
we add to the cursor Y position to position
it on a line */
#define CURSOR_WIDTH 4
#define SCROLLBAR_X 0
#define SCROLLBAR_Y lcd_getymargin()
#define SCROLLBAR_WIDTH 6
#else /* HAVE_LCD_BITMAP */
#define LINE_X 0 /* X position the entry-list starts at */
#define MENU_LINES 2 #define MENU_LINES 2
#endif
#define CURSOR_X 0
#define CURSOR_Y 0 /* not really used for players */
#endif /* HAVE_LCD_BITMAP */
#ifdef HAVE_NEW_CHARCELL_LCD #ifdef HAVE_NEW_CHARCELL_LCD
#define CURSOR_CHAR "\x7e" #define CURSOR_CHAR "\x7e"
@ -117,10 +145,7 @@ static void menu_draw(int m)
lcd_scroll_pause(); /* halt scroll first... */ lcd_scroll_pause(); /* halt scroll first... */
lcd_clear_display(); /* ...then clean the screen */ lcd_clear_display(); /* ...then clean the screen */
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
if(global_settings.statusbar) lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and icon */
lcd_setmargins(0, STATUSBAR_HEIGHT);
else
lcd_setmargins(0, 0);
lcd_setfont(0); lcd_setfont(0);
#endif #endif
/* correct cursor pos if out of screen */ /* correct cursor pos if out of screen */
@ -131,16 +156,20 @@ static void menu_draw(int m)
(i < menus[m].itemcount) && (i<menus[m].top+menu_lines); (i < menus[m].itemcount) && (i<menus[m].top+menu_lines);
i++) { i++) {
if((menus[m].cursor - menus[m].top)==(i-menus[m].top)) if((menus[m].cursor - menus[m].top)==(i-menus[m].top))
lcd_puts_scroll(1, i-menus[m].top, menus[m].items[i].desc); lcd_puts_scroll(LINE_X, i-menus[m].top, menus[m].items[i].desc);
else else
lcd_puts(1, i-menus[m].top, menus[m].items[i].desc); lcd_puts(LINE_X, i-menus[m].top, menus[m].items[i].desc);
} }
/* place the cursor */ /* place the cursor */
put_cursorxy(0, menus[m].cursor - menus[m].top, true); put_cursorxy(CURSOR_X, menus[m].cursor - menus[m].top, true);
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
status_draw(); if (global_settings.scrollbar)
scrollbar(SCROLLBAR_X, SCROLLBAR_Y, SCROLLBAR_WIDTH - 1,
LCD_HEIGHT - SCROLLBAR_Y, menus[m].itemcount, menus[m].top,
menus[m].top + menu_lines, VERTICAL);
#endif #endif
status_draw();
lcd_update(); lcd_update();
} }
@ -163,7 +192,7 @@ static void put_cursor(int m, int target)
#else #else
int menu_lines = MENU_LINES; int menu_lines = MENU_LINES;
#endif #endif
put_cursorxy(0, menus[m].cursor - menus[m].top, false); put_cursorxy(CURSOR_X, menus[m].cursor - menus[m].top, false);
menus[m].cursor = target; menus[m].cursor = target;
menu_draw(m); menu_draw(m);
@ -179,7 +208,7 @@ static void put_cursor(int m, int target)
} }
if (do_update) { if (do_update) {
put_cursorxy(0, menus[m].cursor - menus[m].top, true); put_cursorxy(CURSOR_X, menus[m].cursor - menus[m].top, true);
lcd_update(); lcd_update();
} }
@ -282,12 +311,18 @@ Menu menu_run(int m)
return result; return result;
#ifdef HAVE_RECORDER_KEYPAD #ifdef HAVE_RECORDER_KEYPAD
case BUTTON_F3: case BUTTON_F3: {
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
global_settings.statusbar = !global_settings.statusbar; unsigned char state;
settings_save(); state = global_settings.statusbar << 1 | global_settings.scrollbar;
menu_draw(m); state = (state + 1) % 4;
global_settings.statusbar = state >> 1;
global_settings.scrollbar = state & 0x1;
settings_save();
menu_draw(m);
#endif #endif
}
break; break;
#endif #endif

View file

@ -262,7 +262,8 @@ int settings_save( void )
((global_settings.sort_case & 1) << 2) | ((global_settings.sort_case & 1) << 2) |
((global_settings.discharge & 1) << 3) | ((global_settings.discharge & 1) << 3) |
((global_settings.statusbar & 1) << 4) | ((global_settings.statusbar & 1) << 4) |
((global_settings.show_hidden_files & 1) << 5)); ((global_settings.show_hidden_files & 1) << 5) |
((global_settings.scrollbar & 1) << 6));
config_block[0xf] = (unsigned char) config_block[0xf] = (unsigned char)
((global_settings.scroll_speed << 3) | ((global_settings.scroll_speed << 3) |
@ -350,6 +351,7 @@ void settings_load(void)
global_settings.discharge = (config_block[0xe] >> 3) & 1; global_settings.discharge = (config_block[0xe] >> 3) & 1;
global_settings.statusbar = (config_block[0xe] >> 4) & 1; global_settings.statusbar = (config_block[0xe] >> 4) & 1;
global_settings.show_hidden_files = (config_block[0xe] >> 5) & 1; global_settings.show_hidden_files = (config_block[0xe] >> 5) & 1;
global_settings.scrollbar = (config_block[0xe] >> 6) & 1;
} }
c = config_block[0xf] >> 3; c = config_block[0xf] >> 3;
@ -414,6 +416,7 @@ void settings_reset(void) {
global_settings.mp3filter = true; global_settings.mp3filter = true;
global_settings.sort_case = false; global_settings.sort_case = false;
global_settings.statusbar = true; global_settings.statusbar = true;
global_settings.scrollbar = true;
global_settings.loop_playlist = true; global_settings.loop_playlist = true;
global_settings.playlist_shuffle = false; global_settings.playlist_shuffle = false;
global_settings.discharge = 0; global_settings.discharge = 0;

View file

@ -72,6 +72,9 @@ struct user_settings
/* show status bar */ /* show status bar */
bool statusbar; /* 0=hide, 1=show */ bool statusbar; /* 0=hide, 1=show */
/* show scroll bar */
bool scrollbar; /* 0=hide, 1=show */
/* Hidden and dotfile settings */ /* Hidden and dotfile settings */
bool show_hidden_files; /* 1=show dotfiles/hidden, bool show_hidden_files; /* 1=show dotfiles/hidden,
0=hide dotfiles/hidden */ 0=hide dotfiles/hidden */

View file

@ -43,6 +43,7 @@
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
#include "icons.h" #include "icons.h"
#include "widgets.h"
#endif #endif
#ifdef LOADABLE_FONTS #ifdef LOADABLE_FONTS
@ -73,16 +74,25 @@ void browse_root(void)
#define TREE_MAX_ON_SCREEN ((LCD_HEIGHT-MARGIN_Y)/LINE_HEIGTH) #define TREE_MAX_ON_SCREEN ((LCD_HEIGHT-MARGIN_Y)/LINE_HEIGTH)
#define TREE_MAX_LEN_DISPLAY 16 /* max length that fits on screen */ #define TREE_MAX_LEN_DISPLAY 16 /* max length that fits on screen */
#define MARGIN_X (global_settings.scrollbar ? SCROLLBAR_WIDTH : 0) + CURSOR_WIDTH + ICON_WIDTH /* X pixel margin */
#define MARGIN_Y (global_settings.statusbar ? STATUSBAR_HEIGHT : 0) /* Y pixel margin */ #define MARGIN_Y (global_settings.statusbar ? STATUSBAR_HEIGHT : 0) /* Y pixel margin */
#define MARGIN_X 10 /* X pixel margin */
#define LINE_Y (global_settings.statusbar ? 1 : 0) /* Y position the entry-list starts at */
#define LINE_X 0 /* X position the entry-list starts at */ #define LINE_X 0 /* X position the entry-list starts at */
#define LINE_Y (global_settings.statusbar ? 1 : 0) /* Y position the entry-list starts at */
#define LINE_HEIGTH 8 /* pixels for each text line */ #define LINE_HEIGTH 8 /* pixels for each text line */
#define CURSOR_X (global_settings.scrollbar ? 1 : 0)
#define CURSOR_Y 0 /* the cursor is not positioned in regard to #define CURSOR_Y 0 /* the cursor is not positioned in regard to
the margins, so this is the amount of lines the margins, so this is the amount of lines
we add to the cursor Y position to position we add to the cursor Y position to position
it on a line */ it on a line */
#define CURSOR_WIDTH 4
#define ICON_WIDTH 6
#define SCROLLBAR_X 0
#define SCROLLBAR_Y lcd_getymargin()
#define SCROLLBAR_WIDTH 6
extern unsigned char bitmap_icons_6x8[LastIcon][6]; extern unsigned char bitmap_icons_6x8[LastIcon][6];
@ -90,9 +100,10 @@ extern unsigned char bitmap_icons_6x8[LastIcon][6];
#define TREE_MAX_ON_SCREEN 2 #define TREE_MAX_ON_SCREEN 2
#define TREE_MAX_LEN_DISPLAY 11 /* max length that fits on screen */ #define TREE_MAX_LEN_DISPLAY 11 /* max length that fits on screen */
#define LINE_Y 0 /* Y position the entry-list starts at */
#define LINE_X 1 /* X position the entry-list starts at */ #define LINE_X 1 /* X position the entry-list starts at */
#define LINE_Y 0 /* Y position the entry-list starts at */
#define CURSOR_X 0
#define CURSOR_Y 0 /* not really used for players */ #define CURSOR_Y 0 /* not really used for players */
#endif /* HAVE_LCD_BITMAP */ #endif /* HAVE_LCD_BITMAP */
@ -290,7 +301,7 @@ static int showdir(char *path, int start)
if (icon_type) if (icon_type)
lcd_bitmap(bitmap_icons_6x8[icon_type], lcd_bitmap(bitmap_icons_6x8[icon_type],
4, MARGIN_Y+(i-start)*line_height, 6, 8, true); CURSOR_X * 6 + CURSOR_WIDTH, MARGIN_Y+(i-start)*line_height, 6, 8, true);
#endif #endif
@ -307,6 +318,12 @@ static int showdir(char *path, int start)
lcd_puts(LINE_X, i-start, dircache[i].name); lcd_puts(LINE_X, i-start, dircache[i].name);
} }
#ifdef HAVE_LCD_BITMAP
if (global_settings.scrollbar)
scrollbar(SCROLLBAR_X, SCROLLBAR_Y, SCROLLBAR_WIDTH - 1,
LCD_HEIGHT - SCROLLBAR_Y, filesindir, start,
start + tree_max_on_screen, VERTICAL);
#endif
status_draw(); status_draw();
return filesindir; return filesindir;
} }
@ -445,7 +462,7 @@ bool dirbrowse(char *root)
if (numentries == -1) if (numentries == -1)
return -1; /* root is not a directory */ return -1; /* root is not a directory */
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
while(1) { while(1) {
bool restore = false; bool restore = false;
@ -568,6 +585,11 @@ bool dirbrowse(char *root)
start = 0; start = 0;
global_settings.resume_index = -1; global_settings.resume_index = -1;
} }
#ifdef LOADABLE_FONTS
tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
#else
tree_max_on_screen = TREE_MAX_ON_SCREEN;
#endif
} }
restore = true; restore = true;
break; break;
@ -577,29 +599,29 @@ bool dirbrowse(char *root)
case BUTTON_VOL_UP: case BUTTON_VOL_UP:
if(filesindir) { if(filesindir) {
if(dircursor) { if(dircursor) {
put_cursorxy(0, CURSOR_Y + dircursor, false); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, false);
dircursor--; dircursor--;
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
} }
else { else {
if (start) { if (start) {
start--; start--;
numentries = showdir(currdir, start); numentries = showdir(currdir, start);
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
} }
else { else {
if (numentries < tree_max_on_screen) { if (numentries < tree_max_on_screen) {
put_cursorxy(0, CURSOR_Y + dircursor, put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
false); false);
dircursor = numentries - 1; dircursor = numentries - 1;
put_cursorxy(0, CURSOR_Y + dircursor, put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
true); true);
} }
else { else {
start = numentries - tree_max_on_screen; start = numentries - tree_max_on_screen;
dircursor = tree_max_on_screen - 1; dircursor = tree_max_on_screen - 1;
numentries = showdir(currdir, start); numentries = showdir(currdir, start);
put_cursorxy(0, CURSOR_Y + put_cursorxy(CURSOR_X, CURSOR_Y +
tree_max_on_screen - 1, true); tree_max_on_screen - 1, true);
} }
} }
@ -615,28 +637,28 @@ bool dirbrowse(char *root)
{ {
if (dircursor + start + 1 < numentries ) { if (dircursor + start + 1 < numentries ) {
if(dircursor+1 < tree_max_on_screen) { if(dircursor+1 < tree_max_on_screen) {
put_cursorxy(0, CURSOR_Y + dircursor, put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
false); false);
dircursor++; dircursor++;
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
} }
else { else {
start++; start++;
numentries = showdir(currdir, start); numentries = showdir(currdir, start);
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
} }
} }
else { else {
if(numentries < tree_max_on_screen) { if(numentries < tree_max_on_screen) {
put_cursorxy(0, CURSOR_Y + dircursor, put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
false); false);
start = dircursor = 0; start = dircursor = 0;
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
} }
else { else {
start = dircursor = 0; start = dircursor = 0;
numentries = showdir(currdir, start); numentries = showdir(currdir, start);
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
} }
} }
lcd_update(); lcd_update();
@ -675,22 +697,32 @@ bool dirbrowse(char *root)
dircursor = 0; dircursor = 0;
start = 0; start = 0;
} }
#ifdef LOADABLE_FONTS
tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
#else
tree_max_on_screen = TREE_MAX_ON_SCREEN;
#endif
restore = true; restore = true;
} }
break; break;
#ifdef HAVE_RECORDER_KEYPAD #ifdef HAVE_RECORDER_KEYPAD
case BUTTON_F3: case BUTTON_F3: {
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
global_settings.statusbar = !global_settings.statusbar; unsigned char state;
settings_save(); state = global_settings.statusbar << 1 | global_settings.scrollbar;
state = (state + 1) % 4;
global_settings.statusbar = state >> 1;
global_settings.scrollbar = state & 0x1;
settings_save();
#ifdef LOADABLE_FONTS #ifdef LOADABLE_FONTS
tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh; tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
#else #else
tree_max_on_screen = TREE_MAX_ON_SCREEN; tree_max_on_screen = TREE_MAX_ON_SCREEN;
#endif #endif
restore = true; restore = true;
#endif #endif
}
break; break;
#endif #endif
@ -733,7 +765,7 @@ bool dirbrowse(char *root)
dircursor--; dircursor--;
} }
numentries = showdir(currdir, start); numentries = showdir(currdir, start);
put_cursorxy(0, CURSOR_Y + dircursor, true); put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
} }
if ( numentries ) { if ( numentries ) {

View file

@ -752,6 +752,13 @@ int wps_show(void)
#endif #endif
if (menu()) if (menu())
return SYS_USB_CONNECTED; return SYS_USB_CONNECTED;
#ifdef HAVE_LCD_BITMAP
if(global_settings.statusbar)
lcd_setmargins(0, STATUSBAR_HEIGHT);
else
lcd_setmargins(0, 0);
#endif
restore = true;
break; break;
/* toggle status bar */ /* toggle status bar */