Names Default To Here(1);
//Modified from https://community.jmp.com/t5/Uncharted/Progress-Bar-with-Cancel-Button/ba-p/433560
Define Class(
/************************************************************************************************
Class: ProgressBar
---Prototype---
ProgressBar(int max_iteration = 1, int ith_iter_to_print = 5)
---------------
Creates brogress bar with cancel button. Pressing cancel will return 1 from
update(current_iteration) method this can be used to break out of loop.
Prototype:
> pb = New Object(ProgressBar(<max_iteration = 1>, <ith_iter_to_print = 5>)
> pb << update(current_iteration)
> pb << close()
Parameters:
max_iteration - Maximum iterations for the progress
ith_iter_to_print - ith values to print. Modulo(current_iteration, ith_iter_to_print)
Examples:
----------JSL-----------
pb = New Object(ProgressBar(10, 1));
For(i = 1, i <= 10, i++,
cancel_pressed = pb << update(i);
If(cancel_pressed == 1,
break();
);
wait(1);
);
pb << Close;
pb << Delete Class;
------------------------
************************************************************************************************/
"ProgressBar",
progressBarWidth = 500;
cancel = 0;
_init_ = Method({max_iteration = 1, ith_iter_to_print = 5},
this:cancel = 0;
this:max_iteration = max_iteration;
this:window_ref = this:create();
this:i_to_print = ith_iter_to_print;
this:start_time = HP Time();
);
create = Method({},
aa_nw = Associative Array();
nw = New Window("Gage Progress", //
V List Box(
Align("center"),
// cats = Text Box(""), // output from the work function
t = Text Box("", <<setwrap(500)), // status of the progressbar
H List Box( // Duct tape has a light side and a dark side. So does the progressbar.
left = Spacer Box(size(0, 10), color("light green")), //
right = Spacer Box(size(progressBarWidth, 10), color("dark green")), //
<<padding(5, 5, 5, 5), // gray wrapper
<<backgroundcolor("dark gray") //
), //
cancelButton = Button Box("Cancel", <<Style("Toggle")) // sets the cancel flag
)
);
aa_nw["nw"] = nw;
aa_nw["t"] = t;
aa_nw["left"] = left;
aa_nw["right"] = right;
aa_nw["cancelButton"] = cancelButton;
Return(aa_nw);
);
get_cancel_status = Method({},
Return(this:window_ref["cancelButton"] << get)
);
update = Method({current_iteration},
If(Modulo(current_iteration, this:i_to_print) == 0 | current_iteration == 1,
Try(
leftsize = Round(progressBarWidth * (current_iteration / this:max_iteration));
rightsize = progressBarWidth - leftsize;
this:window_ref["left"] << width(leftsize);
this:window_ref["right"] << width(rightsize);
cur_time = Round((HP Time() - this:start_time) / 10^6, 3); //could use formatting to keep same length
this:window_ref["t"] << settext(Eval Insert("Iteration ^current_iteration^ of ^this:max_iteration^. Total runtime: ^cur_time^s"));
// this:window_ref["t"] << settext(Eval Insert("^current_iteration^ iterations in ^char(runSeconds,6,3)^ seconds -> ^workCalls/runSeconds^ ips"));
this:window_ref["t"] << updatewindow; // this works without the wait
cancel_status = this:get_cancel_status();
, //lazy handling with catch
cancel_status = 1;
show(exception_msg);
);
);
/* If(cancel_status == 1,
this:window_ref["left"] << color("dark red");
this:window_ref["right"] << color("red");
);
*/
Return(cancel_status);
);
close = Method({},
Try(
this:window_ref["nw"] << Close Window
)
);
);
pb = New Object(ProgressBar(10, 1));
For(i = 1, i <= 10, i++,
cancel_pressed = pb << update(i);
If(cancel_pressed == 1,
break();
);
wait(1);
);
pb << Close;
pb << Delete Class;
Write();