{ "bold", MT_COLOR_BOLD },
{ "underline", MT_COLOR_UNDERLINE },
{ "index", MT_COLOR_INDEX },
+ { "progress", MT_COLOR_PROGRESS },
{ "prompt", MT_COLOR_PROMPT },
#ifdef USE_SIDEBAR
{ "sidebar_divider", MT_COLOR_DIVIDER },
mutt_progress_update (progress, 0, 0);
}
+/**
+ * message_bar - Draw a colourful progress bar
+ * @percent: %age complete
+ * @fmt: printf(1)-like formatting string
+ * @...: Arguments to formatting string
+ *
+ */
+static void
+message_bar (int percent, const char *fmt, ...)
+{
+ va_list ap;
+ char buf[STRING], buf2[STRING];
+ int w = percent * COLS / 100;
+ size_t l;
+
+ va_start (ap, fmt);
+ vsnprintf (buf, sizeof (buf), fmt, ap);
+ l = mutt_strwidth (buf);
+ va_end (ap);
+
+ mutt_format_string (buf2, sizeof (buf2), 0, COLS-2, FMT_LEFT, 0, buf, sizeof (buf), 0);
+
+ move (LINES - 1, 0);
+
+ if (ColorDefs[MT_COLOR_PROGRESS] == 0) {
+ addstr (buf2);
+ } else {
+ if (l < w) {
+ /* The string fits within the colour bar */
+ SETCOLOR(MT_COLOR_PROGRESS);
+ addstr (buf2);
+ w -= l;
+ while (w--) {
+ addch (' ');
+ }
+ SETCOLOR(MT_COLOR_NORMAL);
+ } else {
+ /* The string is too long for the colour bar */
+ char ch;
+ int off = mutt_wstr_trunc (buf2, sizeof (buf2), w, NULL);
+
+ ch = buf2[off];
+ buf2[off] = 0;
+ SETCOLOR(MT_COLOR_PROGRESS);
+ addstr (buf2);
+ buf2[off] = ch;
+ SETCOLOR(MT_COLOR_NORMAL);
+ addstr (&buf2[off]);
+ }
+ }
+
+ clrtoeol();
+ mutt_refresh();
+}
+
void mutt_progress_update (progress_t* progress, long pos, int percent)
{
char posstr[SHORT_STRING];
if (progress->size > 0)
{
- mutt_message ("%s %s/%s (%d%%)", progress->msg, posstr, progress->sizestr,
- percent > 0 ? percent :
- (int) (100.0 * (double) progress->pos / progress->size));
+ message_bar ((percent > 0) ? percent : (int) (100.0 * (double) progress->pos / progress->size),
+ "%s %s/%s (%d%%)", progress->msg, posstr, progress->sizestr,
+ (percent > 0) ? percent : (int) (100.0 * (double) progress->pos / progress->size));
}
else
{
if (percent > 0)
- mutt_message ("%s %s (%d%%)", progress->msg, posstr, percent);
+ message_bar (percent, "%s %s (%d%%)", progress->msg, posstr, percent);
else
- mutt_message ("%s %s", progress->msg, posstr);
+ mutt_message ("%s %s", progress->msg, posstr);
}
}