------------------------------------------------------------------------ --# MultiTasking; -- Shows how to use the GtkSpinner to indicate progress while loading -- a large file, or some other lengthy process... -- If you do not multi-task, the spinner will stop while Euphoria -- is working, which is exactly what you do NOT want to happen! ------------------------------------------------------------------------ -- Spinner seems to be broken in Gtk3.6.4, but works fine in Gtk3.4.1 and -- Gtk3.8.4, and later versions. include GtkEngine.e include GtkEvents.e include std/filesys.e atom t1 t1 = task_create(routine_id("task1"),{}) task_schedule(t1,{0.002,1}) boolean t1_running = TRUE constant msg1 = "Reading GtkEnums.e line: %d" constant msg2 = "Done" integer lc = 0 -- count lines read; integer fn = open(locate_file("GtkEnums.e"),"r") -- file to read; constant docs = `Spinner & Tasks This uses Euphoria's multi-tasking functions. If you run this from an x-term, you will see the lines as they are read. Click the OK button to begin.` constant win = create(GtkWindow,"border_width=10,position=1,$destroy=Quit") constant panel = create(GtkBox,1) add(win,panel) constant lbl1 = create(GtkLabel) set(lbl1,"markup",docs) constant lbl2 = create(GtkLabel) constant lbl3 = create(GtkLabel) constant spin = create(GtkSpinner) set(spin,"size request",30,30) add(panel,{lbl1,lbl2,spin,lbl3}) constant btn1 = create(GtkButton,"gtk-quit","Quit"), btn2 = create(GtkButton,"gtk-ok","StartTask"), box = create(GtkButtonBox) add(box,{btn1,btn2}) set(box,"margin top",15) pack(panel,-box) show_all(win) main() -------------------------------------------------------- procedure task1() -- this reads and displays the file; -------------------------------------------------------- object line = {} while not atom(line) do lc += 1 -- increment line count line = gets(fn) -- read the line puts(1,line) -- display the line on terminal task_yield() end while t1_running = FALSE end procedure ----------------------------------------------------------------- global function StartTask() -- starts spin and yields to task1; ----------------------------------------------------------------- set(spin,"start") while t1_running do main_iteration_do(1) -- vital! (give GTK a chance to tick the clock) set(lbl2,"markup",sprintf(msg1,lc)) -- update # of lines read task_yield() end while set(spin,"stop") set(btn2,"sensitive",FALSE) set(lbl2,"markup",msg2) -- done! return 0 end function