From 1d2952df8043ae5de3d7927b13422ba9f7fc35c9 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Sun, 9 Nov 2008 10:28:04 +0000 Subject: FS#7916 - Adapt graphical EQ to smaller screens (Fixes FS#9517) This version still isnt ideal, but untill someone has time to do it properly (viewports, get rid of some hardcoded values) this will do. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19051 a1c6a512-1295-4272-9138-f99709370657 --- apps/lang/english.lang | 8 +- apps/menus/eq_menu.c | 326 +++++++++++++++++++++++-------------------------- 2 files changed, 158 insertions(+), 176 deletions(-) (limited to 'apps') diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 1531e613bd..6b8e0850a4 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -10225,11 +10225,11 @@ user: *: none - swcodec: "Edit mode: %s" + swcodec: "Edit mode: %s %s" *: none - swcodec: "Edit mode: %s" + swcodec: "Edit mode: %s %s" *: none @@ -10242,11 +10242,11 @@ user: *: none - swcodec: "Cutoff Frequency" + swcodec: "Cutoff" *: none - swcodec: "Cutoff Frequency" + swcodec: "Cutoff" *: none diff --git a/apps/menus/eq_menu.c b/apps/menus/eq_menu.c index 279f8255c2..45bf9f41dd 100644 --- a/apps/menus/eq_menu.c +++ b/apps/menus/eq_menu.c @@ -240,18 +240,19 @@ enum eq_type { HIGH_SHELF }; +/* Size of just the slider/srollbar */ +#define SCROLLBAR_SIZE 6 + /* Draw the UI for a whole EQ band */ static int draw_eq_slider(struct screen * screen, int x, int y, int width, int cutoff, int q, int gain, bool selected, - enum eq_slider_mode mode, enum eq_type type) + enum eq_slider_mode mode, int band) { char buf[26]; - const char separator[2] = " "; int steps, min_item, max_item; int abs_gain = abs(gain); - int current_x, total_height, separator_width, separator_height; + int x1, x2, y1, total_height; int w, h; - const int slider_height = 6; switch(mode) { case Q: @@ -273,159 +274,108 @@ static int draw_eq_slider(struct screen * screen, int x, int y, } /* Start two pixels in, one for border, one for margin */ - current_x = x + 2; - - /* Figure out how large our separator string is */ - screen->getstringsize(separator, &separator_width, &separator_height); - - /* Total height includes margins, text, and line selector */ - total_height = separator_height + slider_height + 2 + 3; + x1 = x + 2; + y1 = y + 2; /* Print out the band label */ - if (type == LOW_SHELF) { - screen->putsxy(current_x, y + 2, "LS:"); + if (band == 0) { + screen->putsxy(x1, y1, "LS: "); screen->getstringsize("LS:", &w, &h); - } else if (type == HIGH_SHELF) { - screen->putsxy(current_x, y + 2, "HS:"); + } else if (band == 4) { + screen->putsxy(x1, y1, "HS: "); screen->getstringsize("HS:", &w, &h); } else { - screen->putsxy(current_x, y + 2, "PK:"); - screen->getstringsize("PK:", &w, &h); - } - current_x += w; - - /* Print separator */ - screen->set_drawmode(DRMODE_SOLID); - screen->putsxy(current_x, y + 2, separator); - current_x += separator_width; -#if NB_SCREENS > 1 - if (screen->screen_type == SCREEN_REMOTE) { - if (mode == GAIN) { - screen->putsxy(current_x, y + 2, str(LANG_GAIN)); - screen->getstringsize(str(LANG_GAIN), &w, &h); - } else if (mode == CUTOFF) { - screen->putsxy(current_x, y + 2, str(LANG_EQUALIZER_BAND_CUTOFF)); - screen->getstringsize(str(LANG_EQUALIZER_BAND_CUTOFF), &w, &h); - } else { - screen->putsxy(current_x, y + 2, str(LANG_EQUALIZER_BAND_Q)); - screen->getstringsize(str(LANG_EQUALIZER_BAND_Q), &w, &h); - } - - /* Draw horizontal slider. Reuse scrollbar for this */ - gui_scrollbar_draw(screen, x + 3, y + h + 3, width - 6, slider_height, steps, - min_item, max_item, HORIZONTAL); - - /* Print out cutoff part */ - snprintf(buf, sizeof(buf), "%sGain %s%2d.%ddB",mode==GAIN?" > ":" ", gain < 0 ? "-" : " ", - abs_gain / EQ_USER_DIVISOR, abs_gain % EQ_USER_DIVISOR); + snprintf(buf, sizeof(buf), "PK%d:", band); + screen->putsxy(x1, y1, buf); screen->getstringsize(buf, &w, &h); - y = 3*h; - screen->putsxy(0, y, buf); - /* Print out cutoff part */ - snprintf(buf, sizeof(buf), "%sCutoff %5dHz",mode==CUTOFF?" > ":" ", cutoff); - y += h; - screen->putsxy(0, y, buf); - snprintf(buf, sizeof(buf), "%sQ setting %d.%d Q",mode==Q?" > ":" ", q / EQ_USER_DIVISOR, - q % EQ_USER_DIVISOR); - y += h; - screen->putsxy(0, y, buf); - return y; } -#endif - - /* Print out gain part of status line */ - snprintf(buf, sizeof(buf), "%s%2d.%ddB", gain < 0 ? "-" : " ", - abs_gain / EQ_USER_DIVISOR, abs_gain % EQ_USER_DIVISOR); + screen->getstringsize("A", &w, &h); + x1 += 5*w; /* 4 chars for label + 1 space = 5 */ + + /* Print out gain part of status line (left justify after label) */ if (mode == GAIN && selected) screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID); + else + screen->set_drawmode(DRMODE_SOLID); - screen->putsxy(current_x, y + 2, buf); + snprintf(buf, sizeof(buf), "%s%2d.%d%s", gain < 0 ? "-" : " ", + abs_gain / EQ_USER_DIVISOR, abs_gain % EQ_USER_DIVISOR, + screen->lcdwidth >= 160 ? "dB" : ""); + screen->putsxy(x1, y1, buf); screen->getstringsize(buf, &w, &h); - current_x += w; - - /* Print separator */ - screen->set_drawmode(DRMODE_SOLID); - screen->putsxy(current_x, y + 2, separator); - current_x += separator_width; + x1 += w; - /* Print out cutoff part of status line */ - snprintf(buf, sizeof(buf), "%5dHz", cutoff); - - if (mode == CUTOFF && selected) + /* Print out Q part of status line (right justify) */ + if (mode == Q && selected) screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID); + else + screen->set_drawmode(DRMODE_SOLID); - screen->putsxy(current_x, y + 2, buf); + snprintf(buf, sizeof(buf), "%d.%d%s", q / EQ_USER_DIVISOR, + q % EQ_USER_DIVISOR, screen->lcdwidth >= 160 ? " Q" : ""); screen->getstringsize(buf, &w, &h); - current_x += w; - - /* Print separator */ - screen->set_drawmode(DRMODE_SOLID); - screen->putsxy(current_x, y + 2, separator); - current_x += separator_width; - - /* Print out Q part of status line */ - snprintf(buf, sizeof(buf), "%d.%d Q", q / EQ_USER_DIVISOR, - q % EQ_USER_DIVISOR); + x2 = x + width - w - 2; + screen->putsxy(x2, y1, buf); - if (mode == Q && selected) + /* Print out cutoff part of status line (center between gain & Q) */ + if (mode == CUTOFF && selected) screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID); - - screen->putsxy(current_x, y + 2, buf); + else + screen->set_drawmode(DRMODE_SOLID); + + snprintf(buf, sizeof(buf), "%5d%s", cutoff, + screen->lcdwidth >= 160 ? "Hz" : ""); screen->getstringsize(buf, &w, &h); - current_x += w; - - screen->set_drawmode(DRMODE_SOLID); + x1 = x1 + (x2 - x1 - w)/2; + screen->putsxy(x1, y1, buf); /* Draw selection box */ + total_height = 3 + h + 1 + SCROLLBAR_SIZE + 3; + screen->set_drawmode(DRMODE_SOLID); if (selected) { screen->drawrect(x, y, width, total_height); } /* Draw horizontal slider. Reuse scrollbar for this */ - gui_scrollbar_draw(screen, x + 3, y + h + 3, width - 6, slider_height, steps, - min_item, max_item, HORIZONTAL); + gui_scrollbar_draw(screen, x + 3, y1 + h + 1, width - 6, SCROLLBAR_SIZE, + steps, min_item, max_item, HORIZONTAL); return total_height; } /* Draw's all the EQ sliders. Returns the total height of the sliders drawn */ -static int draw_eq_sliders(int current_band, enum eq_slider_mode mode) +static void draw_eq_sliders(struct screen * screen, int x, int y, + int nb_eq_sliders, int start_item, + int current_band, enum eq_slider_mode mode) { int i, gain, q, cutoff; - int height = 2; /* Two pixel margin */ - int slider_width[NB_SCREENS]; + int height = y; int *setting = &global_settings.eq_band0_cutoff; - enum eq_type type; - FOR_NB_SCREENS(i) - slider_width[i] = screens[i].getwidth() - 4; /* 2 pixel margin - each side */ + start_item = MIN(start_item, 5-nb_eq_sliders); for (i=0; i<5; i++) { cutoff = *setting++; q = *setting++; gain = *setting++; - if (i == 0) { - type = LOW_SHELF; - } else if (i == 4) { - type = HIGH_SHELF; - } else { - type = PEAK; + if (i == start_item + nb_eq_sliders) + break; + + if (i >= start_item) { + height += draw_eq_slider(screen, x, height, screen->lcdwidth - x - 1, + cutoff, q, gain, i == current_band, mode, + i); + /* add a margin */ + height++; } - height += draw_eq_slider(&(screens[SCREEN_MAIN]), 2, height, - slider_width[SCREEN_MAIN], cutoff, q, gain, - i == current_band, mode, type); -#if NB_SCREENS > 1 - if (i == current_band) - draw_eq_slider(&(screens[SCREEN_REMOTE]), 2, 0, - slider_width[SCREEN_REMOTE], cutoff, q, gain,1, mode, type); -#endif - /* add a margin */ - height += 2; } - - return height; + if (nb_eq_sliders != 5) + gui_scrollbar_draw(screen, 0, y, SCROLLBAR_SIZE - 1, + screen->lcdheight - y, 5, + start_item, start_item + nb_eq_sliders, + VERTICAL); + return; } /* Provides a graphical means of editing the EQ settings */ @@ -436,16 +386,34 @@ bool eq_menu_graphical(void) bool has_changed = false; int button; int *setting; - int current_band, y, step, fast_step, min, max, voice_unit; + int current_band, x, y, step, fast_step, min, max, voice_unit; enum eq_slider_mode mode; enum eq_type current_type; char buf[24]; - int i; + int i, w, h, height, start_item, nb_eq_sliders[NB_SCREENS]; + FOR_NB_SCREENS(i) { screens[i].setfont(FONT_SYSFIXED); screens[i].clear_display(); + + /* Figure out how many sliders can be drawn on the screen */ + screens[i].getstringsize("A", &w, &h); + + /* Total height includes margins (1), text, slider, and line selector (1) */ + height = 3 + h + 1 + SCROLLBAR_SIZE + 3; + nb_eq_sliders[i] = screens[i].lcdheight / height; + + /* Make sure the "Edit Mode" text fits too */ + height = nb_eq_sliders[i]*height + h + 2; + if (height > screens[i].lcdheight) + nb_eq_sliders[i]--; + + if (nb_eq_sliders[i] > 5) + nb_eq_sliders[i] = 5; } + + y = h + 1; /* Start off editing gain on the first band */ mode = GAIN; @@ -453,63 +421,77 @@ bool eq_menu_graphical(void) current_band = 0; while (!exit_request) { - - FOR_NB_SCREENS(i) { - /* Clear the screen. The drawing routines expect this */ - screens[i].clear_display(); - /* Draw equalizer band details */ - y = draw_eq_sliders(current_band, mode); - } - - /* Set pointer to the band data currently editable */ - if (mode == GAIN) { - /* gain */ - setting = &global_settings.eq_band0_gain; - setting += current_band * 3; - - step = EQ_GAIN_STEP; - fast_step = EQ_GAIN_FAST_STEP; - min = EQ_GAIN_MIN; - max = EQ_GAIN_MAX; - voice_unit = UNIT_DB; - - snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE), - str(LANG_SYSFONT_GAIN)); - - screens[SCREEN_MAIN].putsxy(2, y, buf); - } else if (mode == CUTOFF) { - /* cutoff */ - setting = &global_settings.eq_band0_cutoff; - setting += current_band * 3; - - step = EQ_CUTOFF_STEP; - fast_step = EQ_CUTOFF_FAST_STEP; - min = EQ_CUTOFF_MIN; - max = EQ_CUTOFF_MAX; - voice_unit = UNIT_HERTZ; - - snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE), - str(LANG_SYSFONT_EQUALIZER_BAND_CUTOFF)); - - screens[SCREEN_MAIN].putsxy(2, y, buf); - } else { - /* Q */ - setting = &global_settings.eq_band0_q; - setting += current_band * 3; - - step = EQ_Q_STEP; - fast_step = EQ_Q_FAST_STEP; - min = EQ_Q_MIN; - max = EQ_Q_MAX; - voice_unit = UNIT_INT; + FOR_NB_SCREENS(i) + { + screens[i].clear_display(); + + /* Set pointer to the band data currently editable */ + if (mode == GAIN) { + /* gain */ + setting = &global_settings.eq_band0_gain; + setting += current_band * 3; + + step = EQ_GAIN_STEP; + fast_step = EQ_GAIN_FAST_STEP; + min = EQ_GAIN_MIN; + max = EQ_GAIN_MAX; + voice_unit = UNIT_DB; - snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE), - str(LANG_EQUALIZER_BAND_Q)); - - screens[SCREEN_MAIN].putsxy(2, y, buf); - } + snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE), + str(LANG_SYSFONT_GAIN), "(dB)"); + + screens[i].putsxy(0, 0, buf); + } else if (mode == CUTOFF) { + /* cutoff */ + setting = &global_settings.eq_band0_cutoff; + setting += current_band * 3; + + step = EQ_CUTOFF_STEP; + fast_step = EQ_CUTOFF_FAST_STEP; + min = EQ_CUTOFF_MIN; + max = EQ_CUTOFF_MAX; + voice_unit = UNIT_HERTZ; + + snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE), + str(LANG_SYSFONT_EQUALIZER_BAND_CUTOFF), "(Hz)"); + + screens[i].putsxy(0, 0, buf); + } else { + /* Q */ + setting = &global_settings.eq_band0_q; + setting += current_band * 3; + + step = EQ_Q_STEP; + fast_step = EQ_Q_FAST_STEP; + min = EQ_Q_MIN; + max = EQ_Q_MAX; + voice_unit = UNIT_INT; + + snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE), + str(LANG_EQUALIZER_BAND_Q), ""); + + screens[i].putsxy(0, 0, buf); + } + + /* Draw scrollbar if needed */ + if (nb_eq_sliders[i] != 5) + { + if (current_band == 0) { + start_item = 0; + } else if (current_band == 4) { + start_item = 5 - nb_eq_sliders[i]; + } else { + start_item = current_band - 1; + } + x = SCROLLBAR_SIZE; + } else { + x = 1; + start_item = 0; + } + /* Draw equalizer band details */ + draw_eq_sliders(&screens[i], x, y, nb_eq_sliders[i], start_item, + current_band, mode); - FOR_NB_SCREENS(i) { screens[i].update(); } -- cgit v1.2.3