summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2022-10-09 00:47:44 -0400
committerWilliam Wilgus <wilgus.william@gmail.com>2022-10-09 08:46:51 -0400
commitd73aaf3d9ec0f232c733f9330d38cdec55d9264d (patch)
treeb124e48be4feb16e5d5c551a63714975869eb8a3
parente57b4f909901ccc04b596ea817a98100b5f7b33b (diff)
downloadrockbox-d73aaf3d9e.tar.gz
rockbox-d73aaf3d9e.zip
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
-rw-r--r--apps/gui/splash.c112
-rw-r--r--apps/gui/splash.h9
-rw-r--r--apps/main.c10
-rw-r--r--apps/onplay.c5
-rw-r--r--apps/playlist.c7
-rw-r--r--apps/root_menu.c16
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; count<nread && !exit_loop && !useraborted; count++,p++)
{
- /* So a splash while we are loading. */
+ /* Show a splash while we are loading. */
+ splash_progress((total_read + count), control_file_size,
+ "%s (%s)", str(LANG_WAIT), str(LANG_OFF_ABORT));
if (TIME_AFTER(current_tick, last_tick + HZ/4))
{
- splashf(0, str(LANG_LOADING_PERCENT),
- (total_read+count)*100/control_file_size,
- str(LANG_OFF_ABORT));
if (action_userabort(TIMEOUT_NOBLOCK))
{
useraborted = true;
diff --git a/apps/root_menu.c b/apps/root_menu.c
index 80a84d9d49..95524e1ba3 100644
--- a/apps/root_menu.c
+++ b/apps/root_menu.c
@@ -241,15 +241,19 @@ static int browser(void* param)
{
if (lang_is_rtl())
{
- splashf(0, "[%d/%d] %s", stat->commit_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