99 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Revealer
 | |
|  *
 | |
|  * GtkRevealer is a container that animates showing and hiding
 | |
|  * of its sole child with nice transitions.
 | |
|  */
 | |
| 
 | |
| #include <gtk/gtk.h>
 | |
| 
 | |
| static GtkBuilder *builder;
 | |
| static gint count = 0;
 | |
| 
 | |
| static void
 | |
| change_direction (GtkRevealer *revealer)
 | |
| {
 | |
|   gboolean revealed;
 | |
| 
 | |
|   revealed = gtk_revealer_get_child_revealed (revealer);
 | |
|   gtk_revealer_set_reveal_child (revealer, !revealed);
 | |
| }
 | |
| 
 | |
| static guint timeout = 0;
 | |
| 
 | |
| static gboolean
 | |
| reveal_one (gpointer data)
 | |
| {
 | |
|   gchar *name;
 | |
|   GtkRevealer *revealer;
 | |
| 
 | |
|   name = g_strdup_printf ("revealer%d", count);
 | |
|   revealer = (GtkRevealer *)gtk_builder_get_object (builder, name);
 | |
| 
 | |
|   gtk_revealer_set_reveal_child (revealer, TRUE);
 | |
| 
 | |
|   g_signal_connect (revealer, "notify::child-revealed",
 | |
|                     G_CALLBACK (change_direction), NULL);
 | |
|   count++;
 | |
| 
 | |
|   if (count >= 9)
 | |
|     {
 | |
|       timeout = 0;
 | |
|       return FALSE;
 | |
|     }
 | |
|   else
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| response_cb (GtkWidget *dialog,
 | |
|              gint       response_id,
 | |
|              gpointer   data)
 | |
| {
 | |
|   if (timeout != 0)
 | |
|     {
 | |
|       g_source_remove (timeout);
 | |
|       timeout = 0;
 | |
|     }
 | |
|   gtk_widget_destroy (dialog);
 | |
| }
 | |
| 
 | |
| GtkWidget *
 | |
| do_revealer (GtkWidget *do_widget)
 | |
| {
 | |
|   static GtkWidget *window = NULL;
 | |
|   GError *err = NULL;
 | |
| 
 | |
|   if (!window)
 | |
|     {
 | |
|       builder = gtk_builder_new ();
 | |
|       gtk_builder_add_from_resource (builder, "/revealer/revealer.ui", &err);
 | |
|       if (err)
 | |
|         {
 | |
|           g_error ("ERROR: %s\n", err->message);
 | |
|           return NULL;
 | |
|         }
 | |
|       gtk_builder_connect_signals (builder, NULL);
 | |
|       window = GTK_WIDGET (gtk_builder_get_object (builder, "dialog1"));
 | |
|       gtk_window_set_screen (GTK_WINDOW (window),
 | |
|                              gtk_widget_get_screen (do_widget));
 | |
|       g_signal_connect (window, "destroy",
 | |
|                         G_CALLBACK (gtk_widget_destroyed), &window);
 | |
|       g_signal_connect (window, "response", G_CALLBACK (response_cb), NULL);
 | |
|     }
 | |
| 
 | |
|   if (!gtk_widget_get_visible (window))
 | |
|     {
 | |
|       count = 0;
 | |
|       timeout = g_timeout_add (690, reveal_one, NULL);
 | |
|       gtk_widget_show_all (window);
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       gtk_widget_destroy (window);
 | |
|       window = NULL;
 | |
|     }
 | |
| 
 | |
| 
 | |
|   return window;
 | |
| }
 | 
