123 lines
3.6 KiB
Elixir
123 lines
3.6 KiB
Elixir
|
|
||
|
---------------------------------------------------------------------
|
||
|
--# Progress bar
|
||
|
--
|
||
|
-- Normally the progress percentage would be set by some code
|
||
|
-- during a long process, such as reading a file, processing data, etc.
|
||
|
-- perhaps being called as a separate 'watchdog' task using Eu tasks.
|
||
|
|
||
|
-- For demo purposes we take the easy way out and provide up and down
|
||
|
-- buttons, just so you can see how it works.
|
||
|
---------------------------------------------------------------------
|
||
|
|
||
|
include GtkEngine.e
|
||
|
include std/math.e -- for ensure_in_range
|
||
|
|
||
|
enum STEP=0, PULSE
|
||
|
boolean mode = STEP
|
||
|
|
||
|
constant win = create(GtkWindow,"title=`Progress Bar`,border=10,position=1,$destroy=Quit")
|
||
|
|
||
|
constant panel = add(win,create(GtkBox,"orientation=VERTICAL,spacing=10"))
|
||
|
|
||
|
constant pb = pack(panel,create(GtkProgressBar,"show_text=TRUE"))
|
||
|
|
||
|
constant bot = add(panel,create(GtkBox,"orientation=HORIZONTAL,spacing=10"))
|
||
|
|
||
|
constant leftbtnbox = create(GtkButtonBox,"orientation=VERTICAL,layout=3")
|
||
|
|
||
|
constant rightbtnbox = create(GtkButtonBox,"orientation=VERTICAL")
|
||
|
|
||
|
constant dnbtn = create(GtkButton,"back#_Back",_("Update"))
|
||
|
set(dnbtn,"tooltip text= Click to subtract 10%,sensitive=FALSE")
|
||
|
|
||
|
constant upbtn = create(GtkButton,"forward#_Forward",_("Update"))
|
||
|
set(upbtn,"tooltip text=Click to add 10%,sensitive=TRUE")
|
||
|
add(leftbtnbox,{dnbtn,upbtn})
|
||
|
|
||
|
constant perbtn = create(GtkRadioButton,0,"_Percentage",_("SelectMode"),0)
|
||
|
set(perbtn,"tooltip text=Select this button to show % of progress")
|
||
|
|
||
|
constant actbtn = create(GtkRadioButton,perbtn,"_Activity",_("SelectMode"),1)
|
||
|
set(actbtn,"tooltip text=Select this button to show activity mode")
|
||
|
|
||
|
constant showtxt = create(GtkCheckButton,"Show _Txt",_("ShowText"))
|
||
|
set(showtxt,"active",TRUE)
|
||
|
add(rightbtnbox,{actbtn,perbtn,showtxt})
|
||
|
pack(bot,{leftbtnbox,rightbtnbox})
|
||
|
|
||
|
-- Important: you must always call timeout with a call_back address
|
||
|
constant tick = create(GTimeout,100,_("Pulse"))
|
||
|
|
||
|
show_all(win)
|
||
|
main()
|
||
|
|
||
|
-------------------------------------------------------------
|
||
|
function Update(atom ctl)
|
||
|
-------------------------------------------------------------
|
||
|
-- get current setting;
|
||
|
atom percentage = get(pb,"fraction")
|
||
|
|
||
|
switch ctl do -- respond to buttons by adjusting percentage
|
||
|
case upbtn then percentage += .1
|
||
|
case dnbtn then percentage -= .1
|
||
|
end switch
|
||
|
|
||
|
-- limit percentage to range of 0..100%;
|
||
|
percentage = ensure_in_range(percentage,{0,1})
|
||
|
|
||
|
-- enable/disable buttons as needed;
|
||
|
if percentage < .01 then -- can't go down any lower, so
|
||
|
set(dnbtn,"sensitive",FALSE) -- disable down button
|
||
|
set(upbtn,"sensitive",TRUE) -- enable up button
|
||
|
|
||
|
elsif percentage > .99 then -- can't go up any higher
|
||
|
set(upbtn,"sensitive",FALSE)
|
||
|
set(dnbtn,"sensitive",TRUE)
|
||
|
|
||
|
else -- somewhere in middle of range, can go either way
|
||
|
set(upbtn,"sensitive",TRUE)
|
||
|
set(dnbtn,"sensitive",TRUE)
|
||
|
|
||
|
end if
|
||
|
|
||
|
-- update displayed values. progress text can be anything, not just %
|
||
|
set(pb,"text",sprintf("%2.0f%%",percentage*100))
|
||
|
set(pb,"fraction",percentage)
|
||
|
|
||
|
return 1
|
||
|
end function
|
||
|
|
||
|
--------------------------------------------------
|
||
|
function SelectMode(atom ctl, boolean x)
|
||
|
--------------------------------------------------
|
||
|
if get(ctl,"active") then
|
||
|
mode = x
|
||
|
if mode = PULSE then
|
||
|
set(upbtn,"sensitive",FALSE)
|
||
|
set(dnbtn,"sensitive",FALSE)
|
||
|
end if
|
||
|
end if
|
||
|
return 1
|
||
|
end function
|
||
|
|
||
|
-------------------------
|
||
|
function Pulse()
|
||
|
-------------------------
|
||
|
if mode = 1 then
|
||
|
set(pb,"pulse")
|
||
|
set(pb,"text","Working...")
|
||
|
else
|
||
|
Update(pb)
|
||
|
end if
|
||
|
return 1
|
||
|
end function
|
||
|
|
||
|
------------------------------------
|
||
|
function ShowText(atom ctl)
|
||
|
------------------------------------
|
||
|
set(pb,"show text",get(ctl,"active"))
|
||
|
return 1
|
||
|
end function
|
||
|
|