function make_adj (low, up, step, pg_inc, pg_size) { adj = new(GtkAdjustment); adj.lower = low; adj.upper = up; adj.step_increment = step; adj.page_increment = pg_inc; adj.page_size = pg_size; adj; } function update_value(adj, lbl) { if(adj.value < 300) adj.set_value(adj.value +1); else adj.set_value(0); lbl.set_text(string("Label updated by user: ", int(adj.value / 300 * 100), "%")); } function make_option_menu(wgt1, wgt2, purpose, hist, titles...) { local item, optionmenu, count = 0; local menu = new(GtkMenu); with tl in titles do { item = gtk_menu_item_new_with_label (tl); if(purpose == "orientation") item.signal("activate", `pbar_orient(@wgt1, @tl)); else if(purpose == "bar_style") item.signal("activate", `pbar_style(@wgt1, @wgt2, @tl)); menu.insert(item, count); count++; } optionmenu = new(GtkOptionMenu); optionmenu.set_menu(menu); optionmenu.set_history(hist); optionmenu.show(); optionmenu; } function pbar_orient(bar, orient) { switch(orient) { case "Left-Right": bar.set_orientation (GTK_PROGRESS_LEFT_TO_RIGHT); case "Right-Left": bar.set_orientation (GTK_PROGRESS_RIGHT_TO_LEFT); case "Bottom-Top": bar.set_orientation (GTK_PROGRESS_BOTTOM_TO_TOP); case "Top-Bottom": bar.set_orientation (GTK_PROGRESS_TOP_TO_BOTTOM); } } function pbar_style(bar, counter, style) { switch(style) { case "Continuous": { bar.set_bar_style (GTK_PROGRESS_CONTINUOUS); counter.set_sensitive(FALSE); } case "Discrete": { bar.set_bar_style (GTK_PROGRESS_DISCRETE); counter.set_sensitive(TRUE); } } } function toggle_show_text(button, bar, entry, xalspin, yalspin) { bar.set_show_text(button.get_active()); entry.set_sensitive(button.get_active()); xalspin.set_sensitive(button.get_active()); yalspin.set_sensitive(button.get_active()); } function toggle_activity_mode(button, bar, spin1, spin2) { bar.set_activity_mode(button.get_active()); spin1.set_sensitive(button.get_active()); spin2.set_sensitive(button.get_active()); } function create_progress_bar () { local button, vbox, vbox2, hbox, check, frame, tab, label, align, adj, pdata = nil; win_progress_bar = new (GtkDialog); win_progress_bar.signal ("destroy", #win_progress_bar = nil); win_progress_bar.title = "GtkProgressBar"; win_progress_bar.set_policy(FALSE, FALSE, TRUE); win_progress_bar.border_width = 0; /**** Access the necessary pieces of the dialog box. ****/ dvbox = car(win_progress_bar.children()); separator = car(dvbox.children()); action_area = cadr(dvbox.children()); vbox = new(GtkVBox); vbox.spacing = 5; vbox.border_width = 10; dvbox.pack_start(vbox, FALSE, TRUE, 0); /**** Progress Frame, Progress Bar and User Label. ****/ frame = new(GtkFrame); frame.label = "Progress"; vbox.pack_start(frame, FALSE, TRUE, 0); vbox2 = new(GtkVBox); vbox2.border_width = 15; frame.add(vbox2); adj = make_adj(1, 300, 0, 0, 0); pbar = new(GtkProgressBar); pbar.adjustment = adj; pbar.set_format_string("%v from [%l,%u] (=%p%%)"); pbar.set_color (1, 2, 0xffaaaa); vbox2.pack_start(pbar, TRUE, TRUE, 5); hbox = new(GtkHBox); hbox.spacing = 5; usrlabel = new(GtkLabel); hbox.pack_start(usrlabel, FALSE, TRUE, 0); vbox2.pack_start(hbox, TRUE, TRUE, 5); timer = every(.1, `update_value(@adj, @usrlabel)); win_progress_bar.signal ("destroy", #cancel(timer)); /**** Options Frame ****/ frame = new(GtkFrame); frame.label = ("Options"); vbox.pack_start(frame, FALSE, TRUE, 0); vbox2 = new(GtkVBox); vbox2.spacing = 2; frame.add(vbox2); tab = new(GtkTable); tab.n_rows = 7; tab.n_columns = 2; tab.homogeneous = FALSE; vbox2.pack_start(tab, FALSE, TRUE, 0); /**** Orientation ****/ label = new(GtkLabel); label.set_text("Orientation :"); tab.attach(label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 5, 5); label.set_alignment(0, 0.5); options = make_option_menu(pbar, nil, "orientation", 0, "Left-Right", "Right-Left", "Bottom-Top", "Top-Bottom"); tab.attach(options, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 5, 0); /**** Text ****/ check = new(GtkCheckButton); check.label = "Show text"; tab.attach(check, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 5, 5); hbox = new(GtkHBox); tab.attach(hbox, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 5, 5); label = new(GtkLabel); label.set_text("Format : "); hbox.pack_start(label, FALSE, TRUE, 0); entry = new(GtkEntry); hbox.pack_start(entry, TRUE, TRUE, 0); entry.set_text("%v from [%l,%u] (=%p%%)"); entry.set_usize(100, -1); entry.set_sensitive(FALSE); label = new(GtkLabel); label.set_text("Text align :"); tab.attach(label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 5, 5); label.set_alignment(0, 0.5); hbox = new(GtkHBox); tab.attach(hbox, 1, 2, 2, 3, GTK_FILL, GTK_FILL, 5, 5); label = new(GtkLabel); label.set_text("x :"); hbox.pack_start(label, FALSE, TRUE, 5); adj = make_adj(0, 1, 0.1, 0.1, 0); adj.set_value(0.5); x_align = new(GtkSpinButton); x_align.configure(adj, 0, 1); hbox.pack_start(x_align, FALSE, TRUE, 0); x_align.set_sensitive(FALSE); label = new(GtkLabel); label.set_text("y :"); hbox.pack_start(label, FALSE, TRUE, 5); adj = make_adj(0, 1, 0.1, 0.1, 0); adj.set_value(0.5); y_align = new(GtkSpinButton); y_align.configure(adj, 0, 1); hbox.pack_start(y_align, FALSE, TRUE, 0); y_align.set_sensitive(FALSE); check.signal("clicked", `toggle_show_text(@check, @pbar, @entry, @x_align, @y_align)); entry.signal("changed", `(@pbar).set_format_string((@entry).get_text())); x_align.signal("changed", `(@pbar).set_text_alignment((@x_align).get_value_as_float(), (@y_align).get_value_as_float())); y_align.signal("changed", `(@pbar).set_text_alignment((@x_align).get_value_as_float(), (@y_align).get_value_as_float())); /**** Bar Style ****/ label = new(GtkLabel); label.set_text("Bar Style :"); tab.attach(label, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 5, 5); label.set_alignment(0, 0.5); label = new(GtkLabel); label.set_text("Block count :"); tab.attach(label, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 5, 5); label.set_alignment(0, 0.5); hbox = new(GtkHBox); tab.attach(hbox, 1, 2, 4, 5, GTK_FILL, GTK_FILL, 5, 5); adj = make_adj(2, 20, 1, 5, 0); adj.set_value(10); block_spin = new(GtkSpinButton); block_spin.configure(adj, 0, 0); block_spin.signal("changed", `(@pbar).set_discrete_blocks((@block_spin).get_value_as_int())); hbox.pack_start(block_spin, FALSE, TRUE, 0); block_spin.set_sensitive(FALSE); options = make_option_menu(pbar, block_spin, "bar_style", 0, "Continuous", "Discrete"); tab.attach(options, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 5, 0); /**** Activity Mode ****/ check = new(GtkCheckButton); check.label = "Activity mode"; tab.attach(check, 0, 1, 5, 6, GTK_FILL, GTK_FILL, 5, 5); hbox = new(GtkHBox); tab.attach(hbox, 1, 2, 5, 6, GTK_FILL, GTK_FILL, 5, 5); label = new(GtkLabel); label.set_text("Step size : "); hbox.pack_start(label, FALSE, TRUE, 0); adj = make_adj(1, 20, 1, 5, 0); adj.set_value(3); step_spin = new(GtkSpinButton); step_spin.configure(adj, 0, 0); step_spin.signal("changed", `(@pbar).set_activity_step((@step_spin).get_value_as_int())); hbox.pack_start(step_spin, FALSE, TRUE, 0); step_spin.set_sensitive(FALSE); hbox = new(GtkHBox); tab.attach(hbox, 1, 2, 6, 7, GTK_FILL, GTK_FILL, 5, 5); label = new(GtkLabel); label.set_text("Blocks : "); hbox.pack_start(label, FALSE, TRUE, 0); adj = make_adj(2, 10, 1, 5, 0); adj.set_value(5); blocks_spin = new(GtkSpinButton); blocks_spin.configure(adj, 0, 0); blocks_spin.signal("changed", `(@pbar).set_activity_blocks((@blocks_spin).get_value_as_int())); hbox.pack_start(blocks_spin, FALSE, TRUE, 0); blocks_spin.set_sensitive(FALSE); check.signal("clicked", `toggle_activity_mode(@check, @pbar, @step_spin, @blocks_spin)); button = new (GtkButton); button.label = "close"; button.signal ("clicked", `(@win_progress_bar).destroy()); action_area.pack_start (button, TRUE, TRUE, 0); button.can_default = TRUE; button.grab_default(); win_progress_bar.show_all(); win_progress_bar; } function main () { local window, win_progress_bar; TRUE=1; FALSE=0; window = create_progress_bar (); window.signal ("destroy", #exit_program(0)); init_ipc("prog_bar", "prog_barq"); gtk_main (); }
Copyright İ 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.