Skip to content

Commit 2422b03

Browse files
committed
[+] PBar: Calculate ETA and speed
1 parent 7021a3c commit 2422b03

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

src/main/java/org/hydev/mcpm/client/interaction/ProgressBar.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ protected void update()
5858
{
5959
// Roll back to the first line
6060
cu.curUp(activeBars.size());
61-
activeBars.forEach(bar -> out.println(bar.fmt(theme, cols)));
61+
activeBars.forEach(bar -> out.println(bar.toString(theme, cols)));
6262
}
6363

6464
/**
@@ -90,7 +90,7 @@ public static void main(String[] args)
9090
{
9191
try (var b = new ProgressBar(ProgressBarTheme.ASCII_THEME))
9292
{
93-
//var r = b.appendBar(new ProgressRow(1000, "it"));
93+
//var r = b.appendBar(new ProgressRow(1000));
9494
//for (int i = 0; i < 1000; i++)
9595
//{
9696
// r.increase(1);
@@ -100,7 +100,8 @@ public static void main(String[] args)
100100
var all = new ArrayList<ProgressRow>();
101101
for (int i = 0; i < 1300; i++)
102102
{
103-
if (i < 1000 && i % 100 == 0) all.add(b.appendBar(new ProgressRow(300, "it")));
103+
if (i < 1000 && i % 100 == 0)
104+
all.add(b.appendBar(new ProgressRow(300).unit("MB").desc(format("File %s.tar.gz", all.size()))).descLen(40));
104105
all.forEach(a -> a.increase(1));
105106
safeSleep(3);
106107
}

src/main/java/org/hydev/mcpm/client/interaction/ProgressRow.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,30 @@ private double elapsed()
4848
* @param cols Number of columns (width) of the terminal window
4949
* @return Formatted string
5050
*/
51-
public String fmt(ProgressBarTheme theme, int cols)
51+
public String toString(ProgressBarTheme theme, int cols)
5252
{
53-
double p = 100d * completed / total;
54-
var placeholder = "PLACEHOLDER_BAR";
55-
var t = format("%s%s%s %3.0f%% %5d/%-5d%s", theme.prefix(), placeholder, theme.suffix(), p, completed, total, unit);
53+
// Calculate speed. TODO: Use a moving window to calculate speed
54+
double speed = completed / elapsed();
55+
double eta = total / speed;
56+
long eta_s = (long) (eta % 60), eta_m = (long) (eta / 60);
57+
58+
// Replace variables
59+
var p = format("%3.0f%%", 100d * completed / total);
60+
var t = fmt.replace("{prefix}", theme.prefix())
61+
.replace("{suffix}", theme.suffix())
62+
.replace("{%done}", p)
63+
.replace("{eta}", format("%02d:%02d", eta_m, eta_s))
64+
.replace("{speed}", format("%.2f%s/s", speed, unit))
65+
.replace("{desc}", descLen != 0 ? format("%-" + descLen + "s", desc) : desc + " ");
5666

5767
// Add progress bar length
58-
var len = cols - t.length() + placeholder.length();
68+
var len = cols - t.length() + "{progbar}".length();
5969

6070
// Calculate progress length
6171
int pLen = (int) (1d * completed / total * len);
6272
var bar = theme.done().repeat(pLen / theme.doneLen()) + theme.ipr().repeat((len - pLen) / theme.iprLen());
6373

64-
return t.replaceFirst(placeholder, bar);
74+
return t.replace("{progbar}", bar);
6575
}
6676

6777
public void setPb(ProgressBar pb)

0 commit comments

Comments
 (0)