| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 | {  This is the pascal translation of the progressbar sample from the  GTK-1.2 library.  Converted from C to Pascal by Stefan Hille  <[email protected]>}(* example-start progressbar progressbar.c *)program progressbar;uses glib, gtk, strings;type    ProgressData = record        window : PGtkWidget;        pbar   : PGtkWidget;        timer  : integer;    end;    PProgressData = ^ProgressData;(* Update the value of the progress bar so that we get * some movement *)function progress_timeout( data : gpointer ) : gint; cdecl;var    new_val : gfloat;    adj     : PGtkAdjustment;begin    (* Calculate the value of the progress bar using the     * value range set in the adjustment object *)    new_val := gtk_progress_get_value( GTK_PROGRESS(data) ) + 1;    adj := GTK_PROGRESS (data)^.adjustment;    if (new_val > adj^.upper) then      new_val := adj^.lower;    (* Set the new value *)    gtk_progress_set_value (GTK_PROGRESS (data), new_val);    (* As this is a timeout function, return TRUE so that it     * continues to get called *)    progress_timeout := 1;end;(* Callback that toggles the text display within the progress * bar trough *)procedure toggle_show_text( widget : PGtkWidget;pdata : PProgressData);cdecl;begin    gtk_progress_set_show_text (GTK_PROGRESS (pdata^.pbar),                                active(PGtkToggleButton(widget)^));end;(* Callback that toggles the activity mode of the progress * bar *)procedure toggle_activity_mode( widget : PGtkWidget;                       pdata : PProgressData); cdecl;begin    gtk_progress_set_activity_mode (GTK_PROGRESS (pdata^.pbar),                                active(PGtkToggleButton(widget)^));end;(* Callback that toggles the continuous mode of the progress * bar *)procedure set_continuous_mode( widget : PGtkWidget;                       pdata : PProgressData); cdecl;begin    gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata^.pbar),                                    GTK_PROGRESS_CONTINUOUS);end;(* Callback that toggles the discrete mode of the progress * bar *)procedure set_discrete_mode( widget : PGtkWidget;                       pdata : PProgressData); cdecl;begin    gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata^.pbar),                                    GTK_PROGRESS_DISCRETE);end;(* Clean up allocated memory and remove the timer *)procedure destroy_progress( widget : PGtkWidget;                       pdata : PProgressData); cdecl;begin    gtk_timeout_remove (pdata^.timer);    pdata^.timer := 0;    pdata^.window := NULL;    g_free(pdata);    gtk_main_quit();end;var    pdata : PProgressData;    align : PGtkWidget;    separator : PGtkWidget;    table : PGtkWidget;    adj   : PGtkAdjustment;    button: PGtkWidget;    check : PGtkWidget;    vbox  : PGtkWidget;begin    gtk_init (@argc, @argv);    (* Allocate memory for the data that is passwd to the callbacks *)    pdata := g_malloc( sizeof(ProgressData) );    pdata^.window := gtk_window_new (GTK_WINDOW_TOPLEVEL);    gtk_window_set_policy (GTK_WINDOW (pdata^.window), 0{FALSE}, 1{TRUE}, 1{TRUE});    gtk_signal_connect (GTK_OBJECT (pdata^.window), 'destroy',                        GTK_SIGNAL_FUNC (@destroy_progress),                        pdata);    gtk_window_set_title (GTK_WINDOW (pdata^.window),'GtkProgressBar' );    gtk_container_set_border_width (GTK_CONTAINER (pdata^.window), 0);    vbox := gtk_vbox_new (FALSE, 5);    gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);    gtk_container_add (GTK_CONTAINER (pdata^.window), vbox);    (* Create a centering alignment object *)    align := gtk_alignment_new (0.5, 0.5, 0, 0);    gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 5);    (* Create a GtkAdjusment object to hold the range of the     * progress bar *)    adj := PGtkAdjustment( gtk_adjustment_new (0, 1, 150, 0, 0, 0));    (* Create the GtkProgressBar using the adjustment *)    pdata^.pbar := gtk_progress_bar_new_with_adjustment (adj);    (* Set the format of the string that can be displayed in the     * trough of the progress bar:     * %p - percentage     * %v - value     * %l - lower range value     * %u - upper range value *)    gtk_progress_set_format_string (GTK_PROGRESS (pdata^.pbar),                                     '%v from [%l-%u] (=%p%%)');    gtk_container_add (GTK_CONTAINER (align), pdata^.pbar);    (* Add a timer callback to update the value of the progress bar *)    pdata^.timer := gtk_timeout_add (100, TGtkFunction(@progress_timeout), pdata^.pbar);    separator := gtk_hseparator_new ();    gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);    (* rows, columns, homogeneous *)    table := gtk_table_new (2, 3, FALSE);    gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);    (* Add a check button to select displaying of the trough text *)    check := gtk_check_button_new_with_label ('Show text');    gtk_table_attach (GTK_TABLE (table), check, 0, 1, 0, 1,                      GTK_EXPAND or GTK_FILL, GTK_EXPAND or GTK_FILL,                      5, 5);    gtk_signal_connect (GTK_OBJECT (check), 'clicked',                        GTK_SIGNAL_FUNC (@toggle_show_text),                        pdata);    (* Add a check button to toggle activity mode *)    check := gtk_check_button_new_with_label ( 'Activity mode');    gtk_table_attach (GTK_TABLE (table), check, 0, 1, 1, 2,                      GTK_EXPAND or GTK_FILL, GTK_EXPAND or GTK_FILL,                      5, 5);    gtk_signal_connect (GTK_OBJECT (check), 'clicked',                        GTK_SIGNAL_FUNC (@toggle_activity_mode),                        pdata);    separator := gtk_vseparator_new ();    gtk_table_attach (GTK_TABLE (table), separator, 1, 2, 0, 2,                      GTK_EXPAND or GTK_FILL, GTK_EXPAND or GTK_FILL,                      5, 5);    (* Add a radio button to select continuous display mode *)    button := gtk_radio_button_new_with_label (NULL,  'Continuous');    gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,                      GTK_EXPAND or GTK_FILL, GTK_EXPAND or GTK_FILL,                      5, 5);    gtk_signal_connect (GTK_OBJECT (button), 'clicked',                        GTK_SIGNAL_FUNC (@set_continuous_mode),                        pdata);    (* Add a radio button to select discrete display mode *)    button := gtk_radio_button_new_with_label(               gtk_radio_button_group (GTK_RADIO_BUTTON (button)),               'Discrete');    gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,                      GTK_EXPAND or GTK_FILL, GTK_EXPAND or GTK_FILL,                      5, 5);    gtk_signal_connect (GTK_OBJECT (button), 'clicked',                        GTK_SIGNAL_FUNC (@set_discrete_mode),                        pdata);    separator := gtk_hseparator_new ();    gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);    (* Add a button to exit the program *)    button := gtk_button_new_with_label ('close');    gtk_signal_connect_object (GTK_OBJECT (button), 'clicked',                               Gtk_Signal_Func (@gtk_widget_destroy),                               GTK_OBJECT (pdata^.window));    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);    (* This makes it so the button is the default. *)    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);    (* This grabs this button to be the default button. Simply hitting     * the 'Enter' key will cause this button to activate. *)    gtk_widget_grab_default (button);    gtk_widget_show_all (pdata^.window);    gtk_main ();end.
 |