Added scrollbar to tree view and menus.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2084 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/menu.c b/apps/menu.c
index 67a1620..f0c793a 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -26,9 +26,12 @@
 #include "panic.h"
 #include "settings.h"
 #include "status.h"
+
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
+#include "widgets.h"
 #endif
+
 #ifdef LOADABLE_FONTS
 #include "ajf.h"
 #endif
@@ -43,12 +46,37 @@
 #define MAX_MENUS 4
 
 #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_HEIGTH 8 /* pixels for each text line */
+
 #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
-#endif
+
+#define CURSOR_X    0
+#define CURSOR_Y    0 /* not really used for players */
+
+#endif /* HAVE_LCD_BITMAP */
 
 #ifdef HAVE_NEW_CHARCELL_LCD
 #define CURSOR_CHAR "\x7e"
@@ -117,10 +145,7 @@
     lcd_scroll_pause();  /* halt scroll first... */
     lcd_clear_display(); /* ...then clean the screen */
 #ifdef HAVE_LCD_BITMAP
-    if(global_settings.statusbar)
-        lcd_setmargins(0, STATUSBAR_HEIGHT);
-    else
-        lcd_setmargins(0, 0);
+    lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and icon */
     lcd_setfont(0);
 #endif
     /* correct cursor pos if out of screen */
@@ -131,16 +156,20 @@
          (i < menus[m].itemcount) && (i<menus[m].top+menu_lines);
          i++) {
         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
-            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 */
-    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
-    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
+    status_draw();
     lcd_update();
 }
 
@@ -163,7 +192,7 @@
 #else
     int menu_lines = MENU_LINES;
 #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;
     menu_draw(m);
 
@@ -179,7 +208,7 @@
     }
 
     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();
     }
 
@@ -282,12 +311,18 @@
                 return result;
 
 #ifdef HAVE_RECORDER_KEYPAD
-            case BUTTON_F3:
+            case BUTTON_F3: {
 #ifdef HAVE_LCD_BITMAP
-                global_settings.statusbar = !global_settings.statusbar;
-                settings_save();
-                menu_draw(m);
+                  unsigned char state;
+                  state = global_settings.statusbar << 1 | global_settings.scrollbar;
+                  state = (state + 1) % 4;
+                  global_settings.statusbar = state >> 1;
+                  global_settings.scrollbar = state & 0x1;
+                  settings_save();
+
+                  menu_draw(m);
 #endif
+                }
                 break;
 #endif