[gnome-software] Unbreak animated row removal



commit 842337d3e45c56bbaaaf7f1aa5a42d82a7580b14
Author: Kalev Lember <kalevlember gmail com>
Date:   Thu May 22 13:17:58 2014 +0200

    Unbreak animated row removal
    
    Animated row removal broke with the GsAppRow refactoring. This restores
    the funcationality and moves the GtkRevealer handling to GsAppRow so
    that callers don't have to poke at its internals.

 src/gs-app-row.c         |   42 ++++++++++++++++++++++++++++++++++++++++++
 src/gs-app-row.h         |    2 ++
 src/gs-shell-installed.c |   39 +++++++--------------------------------
 3 files changed, 51 insertions(+), 32 deletions(-)
---
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
index ac2ef5f..3abfd5a 100644
--- a/src/gs-app-row.c
+++ b/src/gs-app-row.c
@@ -60,6 +60,7 @@ enum {
 
 enum {
        SIGNAL_BUTTON_CLICKED,
+       SIGNAL_UNREVEALED,
        SIGNAL_LAST
 };
 
@@ -250,6 +251,40 @@ gs_app_row_refresh (GsAppRow *app_row)
        }
 }
 
+static void
+child_unrevealed (GObject *revealer, GParamSpec *pspec, gpointer user_data)
+{
+       GsAppRow *app_row = user_data;
+
+       g_signal_emit (app_row, signals[SIGNAL_UNREVEALED], 0);
+}
+
+void
+gs_app_row_unreveal (GsAppRow *app_row)
+{
+       GtkWidget *child;
+       GtkWidget *revealer;
+
+       g_return_if_fail (GS_IS_APP_ROW (app_row));
+
+       child = gtk_bin_get_child (GTK_BIN (app_row));
+       gtk_widget_set_sensitive (child, FALSE);
+
+       revealer = gtk_revealer_new ();
+       gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE);
+       gtk_widget_show (revealer);
+
+       g_object_ref (child);
+       gtk_container_remove (GTK_CONTAINER (app_row), child);
+       gtk_container_add (GTK_CONTAINER (revealer), child);
+       g_object_unref (child);
+
+       gtk_container_add (GTK_CONTAINER (app_row), revealer);
+       g_signal_connect (revealer, "notify::child-revealed",
+                         G_CALLBACK (child_unrevealed), app_row);
+       gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), FALSE);
+}
+
 /**
  * gs_app_row_get_app:
  **/
@@ -356,6 +391,13 @@ gs_app_row_class_init (GsAppRowClass *klass)
                              NULL, NULL, g_cclosure_marshal_VOID__VOID,
                              G_TYPE_NONE, 0);
 
+       signals [SIGNAL_UNREVEALED] =
+               g_signal_new ("unrevealed",
+                             G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
+                             G_STRUCT_OFFSET (GsAppRowClass, unrevealed),
+                             NULL, NULL, g_cclosure_marshal_VOID__VOID,
+                             G_TYPE_NONE, 0);
+
        gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/software/gs-app-row.ui");
 
        gtk_widget_class_bind_template_child_private (widget_class, GsAppRow, image);
diff --git a/src/gs-app-row.h b/src/gs-app-row.h
index d3f4ca4..41cf825 100644
--- a/src/gs-app-row.h
+++ b/src/gs-app-row.h
@@ -51,11 +51,13 @@ struct _GsAppRowClass
 {
        GtkListBoxRowClass       parent_class;
        void                    (*button_clicked)       (GsAppRow       *app_row);
+       void                    (*unrevealed)           (GsAppRow       *app_row);
 };
 
 GType           gs_app_row_get_type                    (void);
 GtkWidget      *gs_app_row_new                         (void);
 void            gs_app_row_refresh                     (GsAppRow       *app_row);
+void            gs_app_row_unreveal                    (GsAppRow       *app_row);
 void            gs_app_row_set_colorful                (GsAppRow       *app_row,
                                                         gboolean        colorful);
 void            gs_app_row_set_show_update             (GsAppRow       *app_row,
diff --git a/src/gs-shell-installed.c b/src/gs-shell-installed.c
index 881c2e2..84bdea4 100644
--- a/src/gs-shell-installed.c
+++ b/src/gs-shell-installed.c
@@ -37,8 +37,6 @@
 #define INSTALL_DATE_INSTALLING (G_MAXUINT - 2)
 
 static void    gs_shell_installed_finalize     (GObject        *object);
-static void    gs_shell_installed_remove_row   (GtkListBox     *list_box,
-                                                GtkWidget      *child);
 
 struct GsShellInstalledPrivate
 {
@@ -99,36 +97,12 @@ typedef struct {
 } GsShellInstalledHelper;
 
 static void
-row_unrevealed (GObject *revealer, GParamSpec *pspec, gpointer data)
+row_unrevealed (GObject *row, GParamSpec *pspec, gpointer data)
 {
-       GtkWidget *row, *list;
+       GtkWidget *list;
 
-       row = gtk_widget_get_parent (GTK_WIDGET (revealer));
-       list = gtk_widget_get_parent (row);
-
-       gtk_container_remove (GTK_CONTAINER (list), row);
-}
-
-static void
-gs_shell_installed_remove_row (GtkListBox *list_box, GtkWidget *child)
-{
-       GtkWidget *row, *revealer;
-
-       gtk_widget_set_sensitive (child, FALSE);
-       row = gtk_widget_get_parent (child);
-       revealer = gtk_revealer_new ();
-       gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE);
-       gtk_widget_show (revealer);
-
-       g_object_ref (child);
-       gtk_container_remove (GTK_CONTAINER (row), child);
-       gtk_container_add (GTK_CONTAINER (revealer), child);
-       g_object_unref (child);
-
-       gtk_container_add (GTK_CONTAINER (row), revealer);
-       g_signal_connect (revealer, "notify::child-revealed",
-                         G_CALLBACK (row_unrevealed), NULL);
-       gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), FALSE);
+       list = gtk_widget_get_parent (GTK_WIDGET (row));
+       gtk_container_remove (GTK_CONTAINER (list), GTK_WIDGET (row));
 }
 
 /**
@@ -163,8 +137,9 @@ gs_shell_installed_app_removed_cb (GObject *source,
                /* remove from the list */
                app = gs_app_row_get_app (helper->app_row);
                g_debug ("removed %s", gs_app_get_id (app));
-               gs_shell_installed_remove_row (GTK_LIST_BOX (priv->list_box_install),
-                                              GTK_WIDGET (helper->app_row));
+               gs_app_row_unreveal (helper->app_row);
+               g_signal_connect (helper->app_row, "unrevealed",
+                                 G_CALLBACK (row_unrevealed), NULL);
        }
 
        g_object_unref (helper->app_row);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]