diff options
Diffstat (limited to 'apps/gui/quickscreen.c')
-rw-r--r-- | apps/gui/quickscreen.c | 130 |
1 files changed, 76 insertions, 54 deletions
diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c index d6d662b1f1..ab13e67a81 100644 --- a/apps/gui/quickscreen.c +++ b/apps/gui/quickscreen.c | |||
@@ -38,17 +38,18 @@ | |||
38 | #include "talk.h" | 38 | #include "talk.h" |
39 | #include "list.h" | 39 | #include "list.h" |
40 | #include "option_select.h" | 40 | #include "option_select.h" |
41 | #include "debug.h" | ||
41 | 42 | ||
42 | static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; | 43 | static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; |
43 | static struct viewport vp_icons[NB_SCREENS]; | 44 | static struct viewport vp_icons[NB_SCREENS]; |
44 | /* vp_icons will be used like this: | 45 | /* 1 top, 1 bottom, 2 on either side, 1 for the icons |
45 | the side icons will be aligned to the top of this vp and to their sides | 46 | * if enough space, top and bottom have 2 lines */ |
46 | the bottom icon will be aligned center and at the bottom of this vp */ | 47 | #define MIN_LINES 5 |
47 | 48 | #define MAX_NEEDED_LINES 10 | |
48 | #define MIN_LINES 4 | 49 | /* pixels between the 2 center items minimum or between text and icons, |
49 | #define MAX_NEEDED_LINES 8 | 50 | * and between text and parent boundaries */ |
50 | #define CENTER_MARGIN 10 /* pixels between the 2 center items minimum */ | 51 | #define MARGIN 10 |
51 | #define CENTER_ICONAREA_WIDTH (CENTER_MARGIN+8*2) | 52 | #define CENTER_ICONAREA_SIZE (MARGIN+8*2) |
52 | 53 | ||
53 | static void quickscreen_fix_viewports(struct gui_quickscreen *qs, | 54 | static void quickscreen_fix_viewports(struct gui_quickscreen *qs, |
54 | struct screen *display, | 55 | struct screen *display, |
@@ -59,9 +60,8 @@ static void quickscreen_fix_viewports(struct gui_quickscreen *qs, | |||
59 | #else | 60 | #else |
60 | const int screen = 0; | 61 | const int screen = 0; |
61 | #endif | 62 | #endif |
62 | 63 | int char_height, width, pad = 0; | |
63 | int char_height, i, width, pad = 0; | 64 | int left_width, right_width, vert_lines; |
64 | int left_width, right_width, bottom_lines = 2; | ||
65 | unsigned char *s; | 65 | unsigned char *s; |
66 | int nb_lines = viewport_get_nb_lines(parent); | 66 | int nb_lines = viewport_get_nb_lines(parent); |
67 | 67 | ||
@@ -75,43 +75,57 @@ static void quickscreen_fix_viewports(struct gui_quickscreen *qs, | |||
75 | 75 | ||
76 | /* center the icons VP first */ | 76 | /* center the icons VP first */ |
77 | vp_icons[screen] = *parent; | 77 | vp_icons[screen] = *parent; |
78 | vp_icons[screen].width = CENTER_ICONAREA_WIDTH; /* absolute smallest allowed */ | 78 | vp_icons[screen].width = CENTER_ICONAREA_SIZE; /* abosulte smallest allowed */ |
79 | vp_icons[screen].x = parent->x + (parent->width / 2 - CENTER_ICONAREA_WIDTH / 2); | 79 | vp_icons[screen].x = parent->x; |
80 | vp_icons[screen].x += (parent->width-CENTER_ICONAREA_SIZE)/2; | ||
81 | |||
80 | 82 | ||
81 | vps[screen][QUICKSCREEN_BOTTOM] = *parent; | 83 | vps[screen][QUICKSCREEN_BOTTOM] = *parent; |
82 | if (nb_lines <= MIN_LINES) /* make the bottom item use 1 line */ | 84 | vps[screen][QUICKSCREEN_TOP] = *parent; |
83 | bottom_lines = 1; | 85 | /* depending on the space the top/buttom items use 1 or 2 lines */ |
86 | if (nb_lines < MIN_LINES) | ||
87 | vert_lines = 1; | ||
84 | else | 88 | else |
85 | bottom_lines = 2; | 89 | vert_lines = 2; |
86 | vps[screen][QUICKSCREEN_BOTTOM].height = bottom_lines*char_height; | 90 | vps[screen][QUICKSCREEN_TOP].y = parent->y; |
87 | vps[screen][QUICKSCREEN_BOTTOM].y = | 91 | vps[screen][QUICKSCREEN_TOP].height = vps[screen][QUICKSCREEN_BOTTOM].height |
88 | parent->y + parent->height - bottom_lines*char_height; | 92 | = vert_lines*char_height; |
93 | vps[screen][QUICKSCREEN_BOTTOM].y | ||
94 | = parent->y + parent->height - vps[screen][QUICKSCREEN_BOTTOM].height; | ||
95 | |||
96 | /* enough space vertically, so put a nice margin */ | ||
89 | if (nb_lines >= MAX_NEEDED_LINES) | 97 | if (nb_lines >= MAX_NEEDED_LINES) |
90 | { | 98 | { |
91 | vps[screen][QUICKSCREEN_BOTTOM].y -= char_height; | 99 | vps[screen][QUICKSCREEN_TOP].y += MARGIN; |
100 | vps[screen][QUICKSCREEN_BOTTOM].y -= MARGIN; | ||
92 | } | 101 | } |
93 | 102 | ||
103 | vp_icons[screen].y = vps[screen][QUICKSCREEN_TOP].y | ||
104 | + vps[screen][QUICKSCREEN_TOP].height; | ||
105 | vp_icons[screen].height = parent->height - vp_icons[screen].y; | ||
106 | vp_icons[screen].height -= parent->height - vps[screen][QUICKSCREEN_BOTTOM].y; | ||
107 | |||
94 | /* adjust the left/right items widths to fit the screen nicely */ | 108 | /* adjust the left/right items widths to fit the screen nicely */ |
95 | s = P2STR(ID2P(qs->items[QUICKSCREEN_LEFT]->lang_id)); | 109 | s = P2STR(ID2P(qs->items[QUICKSCREEN_LEFT]->lang_id)); |
96 | left_width = display->getstringsize(s, NULL, NULL); | 110 | left_width = display->getstringsize(s, NULL, NULL); |
97 | s = P2STR(ID2P(qs->items[QUICKSCREEN_RIGHT]->lang_id)); | 111 | s = P2STR(ID2P(qs->items[QUICKSCREEN_RIGHT]->lang_id)); |
98 | right_width = display->getstringsize(s, NULL, NULL); | 112 | right_width = display->getstringsize(s, NULL, NULL); |
99 | nb_lines -= bottom_lines; | 113 | |
100 | |||
101 | width = MAX(left_width, right_width); | 114 | width = MAX(left_width, right_width); |
102 | if (width*2 + vp_icons[screen].width > display->lcdwidth) | 115 | if (width*2 + vp_icons[screen].width > display->lcdwidth) |
103 | width = (display->lcdwidth - vp_icons[screen].width)/2; | 116 | width = (display->lcdwidth - vp_icons[screen].width)/2; |
104 | else /* add more gap in icons vp */ | 117 | else /* add more gap in icons vp */ |
105 | { | 118 | { |
106 | int excess = display->lcdwidth - vp_icons[screen].width - width*2; | 119 | int excess = display->lcdwidth - vp_icons[screen].width - width*2; |
107 | if (excess > CENTER_MARGIN*4) | 120 | if (excess > MARGIN*4) |
108 | { | 121 | { |
109 | pad = CENTER_MARGIN; | 122 | pad = MARGIN; |
110 | excess -= CENTER_MARGIN*2; | 123 | excess -= MARGIN*2; |
111 | } | 124 | } |
112 | vp_icons[screen].x -= excess/2; | 125 | vp_icons[screen].x -= excess/2; |
113 | vp_icons[screen].width += excess; | 126 | vp_icons[screen].width += excess; |
114 | } | 127 | } |
128 | |||
115 | vps[screen][QUICKSCREEN_LEFT] = *parent; | 129 | vps[screen][QUICKSCREEN_LEFT] = *parent; |
116 | vps[screen][QUICKSCREEN_LEFT].x = parent->x + pad; | 130 | vps[screen][QUICKSCREEN_LEFT].x = parent->x + pad; |
117 | vps[screen][QUICKSCREEN_LEFT].width = width; | 131 | vps[screen][QUICKSCREEN_LEFT].width = width; |
@@ -119,32 +133,25 @@ static void quickscreen_fix_viewports(struct gui_quickscreen *qs, | |||
119 | vps[screen][QUICKSCREEN_RIGHT] = *parent; | 133 | vps[screen][QUICKSCREEN_RIGHT] = *parent; |
120 | vps[screen][QUICKSCREEN_RIGHT].x = parent->x + parent->width - width - pad; | 134 | vps[screen][QUICKSCREEN_RIGHT].x = parent->x + parent->width - width - pad; |
121 | vps[screen][QUICKSCREEN_RIGHT].width = width; | 135 | vps[screen][QUICKSCREEN_RIGHT].width = width; |
122 | 136 | ||
137 | vps[screen][QUICKSCREEN_LEFT].height = vps[screen][QUICKSCREEN_RIGHT].height | ||
138 | = 2*char_height; | ||
139 | |||
140 | vps[screen][QUICKSCREEN_LEFT].y = vps[screen][QUICKSCREEN_RIGHT].y | ||
141 | = parent->y + (parent->height/2) - char_height; | ||
142 | |||
123 | /* shrink the icons vp by a few pixels if there is room so the arrows | 143 | /* shrink the icons vp by a few pixels if there is room so the arrows |
124 | aren't drawn right next to the text */ | 144 | aren't drawn right next to the text */ |
125 | if (vp_icons[screen].width > CENTER_ICONAREA_WIDTH+8) | 145 | if (vp_icons[screen].width > CENTER_ICONAREA_SIZE*2) |
126 | { | 146 | { |
127 | vp_icons[screen].width -= 8; | 147 | vp_icons[screen].width -= CENTER_ICONAREA_SIZE*2/3; |
128 | vp_icons[screen].x += 4; | 148 | vp_icons[screen].x += CENTER_ICONAREA_SIZE*2/6; |
149 | } | ||
150 | if (vp_icons[screen].height > CENTER_ICONAREA_SIZE*2) | ||
151 | { | ||
152 | vp_icons[screen].height -= CENTER_ICONAREA_SIZE*2/3; | ||
153 | vp_icons[screen].y += CENTER_ICONAREA_SIZE*2/6; | ||
129 | } | 154 | } |
130 | |||
131 | |||
132 | if (nb_lines <= MIN_LINES) | ||
133 | i = 0; | ||
134 | else | ||
135 | i = nb_lines/2; | ||
136 | vps[screen][QUICKSCREEN_LEFT].y = parent->y + (i*char_height); | ||
137 | vps[screen][QUICKSCREEN_RIGHT].y = parent->y + (i*char_height); | ||
138 | if (nb_lines >= 3) | ||
139 | i = 3*char_height; | ||
140 | else | ||
141 | i = nb_lines*char_height; | ||
142 | |||
143 | vps[screen][QUICKSCREEN_LEFT].height = i; | ||
144 | vps[screen][QUICKSCREEN_RIGHT].height = i; | ||
145 | vp_icons[screen].y = vps[screen][QUICKSCREEN_LEFT].y + (char_height/2); | ||
146 | vp_icons[screen].height = | ||
147 | vps[screen][QUICKSCREEN_BOTTOM].y - vp_icons[screen].y; | ||
148 | } | 155 | } |
149 | 156 | ||
150 | static void quickscreen_draw_text(const char *s, int item, bool title, | 157 | static void quickscreen_draw_text(const char *s, int item, bool title, |
@@ -158,6 +165,7 @@ static void quickscreen_draw_text(const char *s, int item, bool title, | |||
158 | line = 1; | 165 | line = 1; |
159 | switch (item) | 166 | switch (item) |
160 | { | 167 | { |
168 | case QUICKSCREEN_TOP: | ||
161 | case QUICKSCREEN_BOTTOM: | 169 | case QUICKSCREEN_BOTTOM: |
162 | x = (vp->width - w)/2; | 170 | x = (vp->width - w)/2; |
163 | break; | 171 | break; |
@@ -219,13 +227,18 @@ static void gui_quickscreen_draw(struct gui_quickscreen *qs, | |||
219 | } | 227 | } |
220 | /* draw the icons */ | 228 | /* draw the icons */ |
221 | display->set_viewport(&vp_icons[screen]); | 229 | display->set_viewport(&vp_icons[screen]); |
230 | |||
231 | display->mono_bitmap(bitmap_icons_7x8[Icon_UpArrow], | ||
232 | (vp_icons[screen].width/2) - 4, 0, 7, 8); | ||
222 | display->mono_bitmap(bitmap_icons_7x8[Icon_FastForward], | 233 | display->mono_bitmap(bitmap_icons_7x8[Icon_FastForward], |
223 | vp_icons[screen].width - 8, 0, 7, 8); | 234 | vp_icons[screen].width - 8, |
224 | display->mono_bitmap(bitmap_icons_7x8[Icon_FastBackward], 0, 0, 7, 8); | 235 | (vp_icons[screen].height/2) - 4, 7, 8); |
236 | display->mono_bitmap(bitmap_icons_7x8[Icon_FastBackward], 0, | ||
237 | (vp_icons[screen].height/2) - 4, 7, 8); | ||
238 | |||
225 | display->mono_bitmap(bitmap_icons_7x8[Icon_DownArrow], | 239 | display->mono_bitmap(bitmap_icons_7x8[Icon_DownArrow], |
226 | (vp_icons[screen].width/2) - 4, | 240 | (vp_icons[screen].width/2) - 4, |
227 | vp_icons[screen].height - 7, 7, 8); | 241 | vp_icons[screen].height - 8, 7, 8); |
228 | display->update_viewport(); | ||
229 | 242 | ||
230 | display->set_viewport(parent); | 243 | display->set_viewport(parent); |
231 | display->update_viewport(); | 244 | display->update_viewport(); |
@@ -254,12 +267,15 @@ static bool gui_quickscreen_do_button(struct gui_quickscreen * qs, int button) | |||
254 | bool invert = false; | 267 | bool invert = false; |
255 | switch(button) | 268 | switch(button) |
256 | { | 269 | { |
270 | case ACTION_QS_TOP: | ||
271 | invert = true; | ||
272 | item = QUICKSCREEN_TOP; | ||
273 | break; | ||
257 | case ACTION_QS_LEFT: | 274 | case ACTION_QS_LEFT: |
275 | invert = true; | ||
258 | item = QUICKSCREEN_LEFT; | 276 | item = QUICKSCREEN_LEFT; |
259 | break; | 277 | break; |
260 | 278 | ||
261 | case ACTION_QS_DOWNINV: | ||
262 | invert = true; /* fallthrough */ | ||
263 | case ACTION_QS_DOWN: | 279 | case ACTION_QS_DOWN: |
264 | item = QUICKSCREEN_BOTTOM; | 280 | item = QUICKSCREEN_BOTTOM; |
265 | break; | 281 | break; |
@@ -367,6 +383,9 @@ bool quick_screen_quick(int button_enter) | |||
367 | bool oldshuffle = global_settings.playlist_shuffle; | 383 | bool oldshuffle = global_settings.playlist_shuffle; |
368 | int oldrepeat = global_settings.repeat_mode; | 384 | int oldrepeat = global_settings.repeat_mode; |
369 | 385 | ||
386 | qs.items[QUICKSCREEN_TOP] = | ||
387 | get_setting(global_settings.qs_item_top, | ||
388 | find_setting(&global_settings.party_mode, NULL)); | ||
370 | qs.items[QUICKSCREEN_LEFT] = | 389 | qs.items[QUICKSCREEN_LEFT] = |
371 | get_setting(global_settings.qs_item_left, | 390 | get_setting(global_settings.qs_item_left, |
372 | find_setting(&global_settings.playlist_shuffle, NULL)); | 391 | find_setting(&global_settings.playlist_shuffle, NULL)); |
@@ -452,6 +471,9 @@ void set_as_qs_item(const struct settings_list *setting, | |||
452 | } | 471 | } |
453 | switch (item) | 472 | switch (item) |
454 | { | 473 | { |
474 | case QUICKSCREEN_TOP: | ||
475 | global_settings.qs_item_top = i; | ||
476 | break; | ||
455 | case QUICKSCREEN_LEFT: | 477 | case QUICKSCREEN_LEFT: |
456 | global_settings.qs_item_left = i; | 478 | global_settings.qs_item_left = i; |
457 | break; | 479 | break; |
@@ -461,7 +483,7 @@ void set_as_qs_item(const struct settings_list *setting, | |||
461 | case QUICKSCREEN_BOTTOM: | 483 | case QUICKSCREEN_BOTTOM: |
462 | global_settings.qs_item_bottom = i; | 484 | global_settings.qs_item_bottom = i; |
463 | break; | 485 | break; |
464 | default: /* shut the copiler up */ | 486 | default: /* shut the compiler up */ |
465 | break; | 487 | break; |
466 | } | 488 | } |
467 | } | 489 | } |