From d73aaf3d9ec0f232c733f9330d38cdec55d9264d Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Sun, 9 Oct 2022 00:47:44 -0400 Subject: add splash_progress the loading track splash flashes and is ugly add a function to display a progressbar along with the splash message spruce up database commit message as well Change-Id: I2749b958c1ee5dad2631a5f999a4b00ddca7f225 --- apps/gui/splash.c | 112 +++++++++++++++++++++++++++++++++++++++--------------- apps/gui/splash.h | 9 +++++ apps/main.c | 10 +++-- apps/onplay.c | 5 ++- apps/playlist.c | 7 ++-- apps/root_menu.c | 16 +++++--- 6 files changed, 113 insertions(+), 46 deletions(-) diff --git a/apps/gui/splash.c b/apps/gui/splash.c index b85e4693aa..bf9647cff1 100644 --- a/apps/gui/splash.c +++ b/apps/gui/splash.c @@ -30,17 +30,18 @@ #include "splash.h" #include "viewport.h" #include "strtok_r.h" +#include "scrollbar.h" #define MAXLINES (LCD_HEIGHT/6) #define MAXBUFFER 512 #define RECT_SPACING 2 #define SPLASH_MEMORY_INTERVAL (HZ) -static void splash_internal(struct screen * screen, const char *fmt, va_list ap) +static bool splash_internal(struct screen * screen, const char *fmt, va_list ap, + struct viewport *vp, int addl_lines) { char splash_buf[MAXBUFFER]; char *lines[MAXLINES]; - char *next; char *lastbreak = NULL; char *store = NULL; @@ -48,15 +49,12 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) int x = 0; int y, i; int space_w, w, h; - struct viewport vp; + int width, height; int maxw = 0; - viewport_set_defaults(&vp, screen->screen_type); - struct viewport *last_vp = screen->set_viewport(&vp); - screen->getstringsize(" ", &space_w, &h); - y = h; + y = h + (addl_lines * h); vsnprintf(splash_buf, sizeof(splash_buf), fmt, ap); va_end(ap); @@ -65,7 +63,7 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) next = strtok_r(splash_buf, " ", &store); if (!next) - goto end; /* nothing to display */ + return false; /* nothing to display */ lines[0] = next; while (true) @@ -73,12 +71,13 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) screen->getstringsize(next, &w, NULL); if (lastbreak) { - if (x + (next - lastbreak) * space_w + w - > vp.width - RECT_SPACING*2) + int next_w = (next - lastbreak) * space_w; + + if (x + next_w + w > vp->width - RECT_SPACING*2) { /* too wide, wrap */ if (x > maxw) maxw = x; - if ((y + h > vp.height) || (line >= (MAXLINES-1))) + if ((y + h > vp->height) || (line >= (MAXLINES-1))) break; /* screen full or out of lines */ x = 0; y += h; @@ -88,7 +87,7 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) { /* restore & calculate spacing */ *lastbreak = ' '; - x += (next - lastbreak) * space_w; + x += next_w; } } x += w; @@ -111,39 +110,39 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) width = maxw + 2*RECT_SPACING; height = y + 2*RECT_SPACING; - if (width > vp.width) - width = vp.width; - if (height > vp.height) - height = vp.height; + if (width > vp->width) + width = vp->width; + if (height > vp->height) + height = vp->height; - vp.x += (vp.width - width) / 2; - vp.y += (vp.height - height) / 2; - vp.width = width; - vp.height = height; + vp->x += (vp->width - width) / 2; + vp->y += (vp->height - height) / 2; + vp->width = width; + vp->height = height; - vp.flags |= VP_FLAG_ALIGN_CENTER; + vp->flags |= VP_FLAG_ALIGN_CENTER; #if LCD_DEPTH > 1 if (screen->depth > 1) { - vp.drawmode = DRMODE_FG; - /* can't do vp.fg_pattern here, since set_foreground does a bit more on + vp->drawmode = DRMODE_FG; + /* can't do vp->fg_pattern here, since set_foreground does a bit more on * greyscale */ screen->set_foreground(SCREEN_COLOR_TO_NATIVE(screen, LCD_LIGHTGRAY)); } else #endif - vp.drawmode = (DRMODE_SOLID|DRMODE_INVERSEVID); + vp->drawmode = (DRMODE_SOLID|DRMODE_INVERSEVID); screen->fill_viewport(); #if LCD_DEPTH > 1 if (screen->depth > 1) - /* can't do vp.fg_pattern here, since set_foreground does a bit more on + /* can't do vp->fg_pattern here, since set_foreground does a bit more on * greyscale */ screen->set_foreground(SCREEN_COLOR_TO_NATIVE(screen, LCD_BLACK)); else #endif - vp.drawmode = DRMODE_SOLID; + vp->drawmode = DRMODE_SOLID; screen->draw_border_viewport(); @@ -155,9 +154,7 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) { screen->putsxy(0, y, lines[i]); } - screen->update_viewport(); -end: - screen->set_viewport(last_vp); + return true; /* needs update */ } void splashf(int ticks, const char *fmt, ...) @@ -169,9 +166,17 @@ void splashf(int ticks, const char *fmt, ...) fmt = P2STR((unsigned char *)fmt); FOR_NB_SCREENS(i) { + struct screen * screen = &(screens[i]); + struct viewport vp; + viewport_set_defaults(&vp, screen->screen_type); + struct viewport *last_vp = screen->set_viewport(&vp); + va_start(ap, fmt); - splash_internal(&(screens[i]), fmt, ap); + if (splash_internal(screen, fmt, ap, &vp, 0)) + screen->update_viewport(); va_end(ap); + + screen->set_viewport(last_vp); } if (ticks) sleep(ticks); @@ -189,3 +194,50 @@ void splash(int ticks, const char *str) #endif splashf(ticks, "%s", P2STR((const unsigned char*)str)); } + +/* splash a progress meter */ +void splash_progress(int current, int total, const char *fmt, ...) +{ + int vp_flag = VP_FLAG_VP_DIRTY; + /* progress update tick */ + static long next_tick = 0; + long now = current_tick; + + if (current < total) + { + if(TIME_BEFORE(now, next_tick)) + return; + /* limit to 20fps */ + next_tick = now + HZ/20; + vp_flag = 0; /* don't mark vp dirty to prevent flashing */ + } + + va_list ap; + + /* If fmt is a lang ID then get the corresponding string (which + still might contain % place holders). */ + fmt = P2STR((unsigned char *)fmt); + FOR_NB_SCREENS(i) + { + struct screen * screen = &(screens[i]); + struct viewport vp; + viewport_set_defaults(&vp, screen->screen_type); + struct viewport *last_vp = screen->set_viewport_ex(&vp, vp_flag); + + va_start(ap, fmt); + if (splash_internal(screen, fmt, ap, &vp, 1)) + { + int size = screen->getcharheight(); + int y = vp.height - size - RECT_SPACING; + int w = vp.width - RECT_SPACING * 2; + + gui_scrollbar_draw(screen, RECT_SPACING, y, w, size, + total, 0, current, HORIZONTAL | FOREGROUND); + + screen->update_viewport(); + } + va_end(ap); + + screen->set_viewport(last_vp); + } +} diff --git a/apps/gui/splash.h b/apps/gui/splash.h index 76b4c16d0c..4002af5296 100644 --- a/apps/gui/splash.h +++ b/apps/gui/splash.h @@ -39,4 +39,13 @@ extern void splashf(int ticks, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3); * it will be voiced */ extern void splash(int ticks, const char *str); + +/* + * Puts a splash message centered on all the screens with a progressbar + * - current : current progress increment + * - total : total increments + * - fmt : what to say *printf style + * updates limited internally to 20 fps - call repeatedly to update progress + */ +extern void splash_progress(int current, int total, const char *fmt, ...) ATTRIBUTE_PRINTF(3, 4); #endif /* _GUI_ICON_H_ */ diff --git a/apps/main.c b/apps/main.c index 59932d6185..6360267243 100644 --- a/apps/main.c +++ b/apps/main.c @@ -288,13 +288,15 @@ static void init_tagcache(void) #endif if (lang_is_rtl()) { - splashf(0, "[%d/%d] %s", ret, tagcache_get_max_commit_step(), - str(LANG_TAGCACHE_INIT)); + splash_progress(ret, tagcache_get_max_commit_step(), + "[%d/%d] %s", ret, tagcache_get_max_commit_step(), + str(LANG_TAGCACHE_INIT)); } else { - splashf(0, "%s [%d/%d]", str(LANG_TAGCACHE_INIT), ret, - tagcache_get_max_commit_step()); + splash_progress(ret, tagcache_get_max_commit_step(), + "%s [%d/%d]", str(LANG_TAGCACHE_INIT), ret, + tagcache_get_max_commit_step()); } clear = true; } diff --git a/apps/onplay.c b/apps/onplay.c index e4e2a7b3b8..bb93d204e0 100644 --- a/apps/onplay.c +++ b/apps/onplay.c @@ -382,8 +382,9 @@ static bool playing_time(void) although playback continues forward. */ for (i = 0; i < pti.nb_tracks; i++) { /* Show a splash while we are loading. */ - splashf(0, str(LANG_LOADING_PERCENT), - i*100/pti.nb_tracks, str(LANG_OFF_ABORT)); + splash_progress(i, pti.nb_tracks, + "%s (%s)", str(LANG_WAIT), str(LANG_OFF_ABORT)); + /* Voice equivalent */ if (TIME_AFTER(current_tick, talked_tick+5*HZ)) { talked_tick = current_tick; diff --git a/apps/playlist.c b/apps/playlist.c index 70a1a0823e..837e9d7f44 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -2201,12 +2201,11 @@ int playlist_resume(void) for(count=0; countcommit_step, - tagcache_get_max_commit_step(), - str(LANG_TAGCACHE_INIT)); + splash_progress(stat->commit_step, + tagcache_get_max_commit_step(), + "[%d/%d] %s", stat->commit_step, + tagcache_get_max_commit_step(), + str(LANG_TAGCACHE_INIT)); } else { - splashf(0, "%s [%d/%d]", str(LANG_TAGCACHE_INIT), - stat->commit_step, - tagcache_get_max_commit_step()); + splash_progress(stat->commit_step, + tagcache_get_max_commit_step(), + "%s [%d/%d]", str(LANG_TAGCACHE_INIT), + stat->commit_step, + tagcache_get_max_commit_step()); } } else -- cgit v1.2.3