1 | /* Spinner |
2 | * |
3 | * GtkSpinner allows to show that background activity is on-going. |
4 | */ |
5 | |
6 | #include <glib/gi18n.h> |
7 | #include <gtk/gtk.h> |
8 | |
9 | static GtkWidget *spinner_sensitive = NULL; |
10 | static GtkWidget *spinner_unsensitive = NULL; |
11 | |
12 | static void |
13 | on_play_clicked (GtkButton *button, gpointer user_data) |
14 | { |
15 | gtk_spinner_start (GTK_SPINNER (spinner_sensitive)); |
16 | gtk_spinner_start (GTK_SPINNER (spinner_unsensitive)); |
17 | } |
18 | |
19 | static void |
20 | on_stop_clicked (GtkButton *button, gpointer user_data) |
21 | { |
22 | gtk_spinner_stop (GTK_SPINNER (spinner_sensitive)); |
23 | gtk_spinner_stop (GTK_SPINNER (spinner_unsensitive)); |
24 | } |
25 | |
26 | GtkWidget * |
27 | do_spinner (GtkWidget *do_widget) |
28 | { |
29 | static GtkWidget *window = NULL; |
30 | GtkWidget *content_area; |
31 | GtkWidget *vbox; |
32 | GtkWidget *hbox; |
33 | GtkWidget *button; |
34 | GtkWidget *spinner; |
35 | |
36 | if (!window) |
37 | { |
38 | window = gtk_dialog_new_with_buttons (title: "Spinner" , |
39 | GTK_WINDOW (do_widget), |
40 | flags: 0, |
41 | _("_Close" ), |
42 | GTK_RESPONSE_NONE, |
43 | NULL); |
44 | gtk_window_set_resizable (GTK_WINDOW (window), FALSE); |
45 | |
46 | g_signal_connect (window, "response" , |
47 | G_CALLBACK (gtk_window_destroy), NULL); |
48 | g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window); |
49 | |
50 | content_area = gtk_dialog_get_content_area (GTK_DIALOG (window)); |
51 | |
52 | vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 5); |
53 | gtk_widget_set_margin_start (widget: vbox, margin: 5); |
54 | gtk_widget_set_margin_end (widget: vbox, margin: 5); |
55 | gtk_widget_set_margin_top (widget: vbox, margin: 5); |
56 | gtk_widget_set_margin_bottom (widget: vbox, margin: 5); |
57 | gtk_box_append (GTK_BOX (content_area), child: vbox); |
58 | |
59 | /* Sensitive */ |
60 | hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 5); |
61 | spinner = gtk_spinner_new (); |
62 | gtk_box_append (GTK_BOX (hbox), child: spinner); |
63 | gtk_box_append (GTK_BOX (hbox), child: gtk_entry_new ()); |
64 | gtk_box_append (GTK_BOX (vbox), child: hbox); |
65 | spinner_sensitive = spinner; |
66 | |
67 | /* Disabled */ |
68 | hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 5); |
69 | spinner = gtk_spinner_new (); |
70 | gtk_box_append (GTK_BOX (hbox), child: spinner); |
71 | gtk_box_append (GTK_BOX (hbox), child: gtk_entry_new ()); |
72 | gtk_box_append (GTK_BOX (vbox), child: hbox); |
73 | spinner_unsensitive = spinner; |
74 | gtk_widget_set_sensitive (widget: hbox, FALSE); |
75 | |
76 | button = gtk_button_new_with_label (_("Play" )); |
77 | g_signal_connect (G_OBJECT (button), "clicked" , |
78 | G_CALLBACK (on_play_clicked), spinner); |
79 | gtk_box_append (GTK_BOX (vbox), child: button); |
80 | |
81 | button = gtk_button_new_with_label (_("Stop" )); |
82 | g_signal_connect (G_OBJECT (button), "clicked" , |
83 | G_CALLBACK (on_stop_clicked), spinner); |
84 | gtk_box_append (GTK_BOX (vbox), child: button); |
85 | |
86 | /* Start by default to test for: |
87 | * https://bugzilla.gnome.org/show_bug.cgi?id=598496 */ |
88 | on_play_clicked (NULL, NULL); |
89 | } |
90 | |
91 | if (!gtk_widget_get_visible (widget: window)) |
92 | gtk_widget_show (widget: window); |
93 | else |
94 | gtk_window_destroy (GTK_WINDOW (window)); |
95 | |
96 | return window; |
97 | } |
98 | |