[gnome-software/wip/rancell/reviews] Pull review information from GsApp object



commit 1db58333570868fb80688595f4943ada678fbefd
Author: Robert Ancell <robert ancell canonical com>
Date:   Wed Dec 16 15:46:07 2015 +1300

    Pull review information from GsApp object

 po/POTFILES.in                                    |    4 +-
 src/Makefile.am                                   |    8 +-
 src/gnome-software.gresource.xml                  |    2 +-
 src/gs-app-review-row.c                           |  154 +++++++++++++++
 src/{gs-app-reviews.h => gs-app-review-row.h}     |   15 +-
 src/{gs-review-widget.ui => gs-app-review-row.ui} |    2 +-
 src/gs-app-review.c                               |   36 ++--
 src/gs-app-review.h                               |    6 +-
 src/gs-app-reviews.c                              |   63 ------
 src/gs-app.c                                      |   15 +-
 src/gs-app.h                                      |    8 +-
 src/gs-review-widget.c                            |  211 ---------------------
 src/gs-review-widget.h                            |   56 ------
 src/gs-shell-details.c                            |   28 +++
 src/gs-shell-details.ui                           |   35 ++++-
 15 files changed, 265 insertions(+), 378 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 795ac25..736f564 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -7,6 +7,8 @@ src/gnome-software-local-file.desktop.in
 src/gs-app-folder-dialog.c
 src/gs-application.c
 src/gs-app-addon-row.c
+src/gs-app-review-row.c
+[type: gettext/glade]src/gs-app-review-row.ui
 src/gs-app.c
 src/gs-app-row.c
 src/gs-app-tile.c
@@ -22,8 +24,6 @@ src/gs-offline-updates.c
 src/gs-page.c
 src/gs-plugin-loader.c
 src/gs-popular-tile.c
-src/gs-review-widget.c
-[type: gettext/glade]src/gs-review-widget.ui
 src/gs-screenshot-image.c
 src/gs-shell.c
 src/gs-shell-extras.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 91220da..27639c9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -35,9 +35,9 @@ UI_FILES =                                            \
        gnome-software.ui                               \
        gs-app-addon-row.sui                            \
        gs-app-row.ui                                   \
+       gs-app-review-row.ui                            \
        gs-first-run-dialog.ui                          \
        gs-history-dialog.ui                            \
-       gs-review-widget.ui                             \
        gs-shell-category.ui                            \
        gs-shell-extras.ui                              \
        gs-shell-details.ui                             \
@@ -122,8 +122,8 @@ gnome_software_SOURCES =                            \
        gs-category-tile.h                              \
        gs-app-review.c                                 \
        gs-app-review.h                                 \
-       gs-app-reviews.c                                \
-       gs-app-reviews.h                                \
+       gs-app-review-row.c                             \
+       gs-app-review-row.h                             \
        gs-app-tile.c                                   \
        gs-app-tile.h                                   \
        gs-app-folder-dialog.c                          \
@@ -144,8 +144,6 @@ gnome_software_SOURCES =                            \
        gs-plugin.h                                     \
        gs-progress-button.c                            \
        gs-progress-button.h                            \
-       gs-review-widget.c                              \
-       gs-review-widget.h                              \
        gs-screenshot-image.c                           \
        gs-screenshot-image.h                           \
        gs-shell.c                                      \
diff --git a/src/gnome-software.gresource.xml b/src/gnome-software.gresource.xml
index 8eb1ab1..a15cf51 100644
--- a/src/gnome-software.gresource.xml
+++ b/src/gnome-software.gresource.xml
@@ -10,10 +10,10 @@
   <file preprocess="xml-stripblanks">app-folder-dialog.ui</file>
   <file preprocess="xml-stripblanks">screenshot-image.ui</file>
   <file preprocess="xml-stripblanks">gs-app-addon-row.ui</file>
+  <file preprocess="xml-stripblanks">gs-app-review-row.ui</file>
   <file preprocess="xml-stripblanks">gs-app-row.ui</file>
   <file preprocess="xml-stripblanks">gs-first-run-dialog.ui</file>
   <file preprocess="xml-stripblanks">gs-history-dialog.ui</file>
-  <file preprocess="xml-stripblanks">gs-review-widget.ui</file>
   <file preprocess="xml-stripblanks">gs-shell-category.ui</file>
   <file preprocess="xml-stripblanks">gs-shell-extras.ui</file>
   <file preprocess="xml-stripblanks">gs-shell-details.ui</file>
diff --git a/src/gs-app-review-row.c b/src/gs-app-review-row.c
new file mode 100644
index 0000000..6fca7a5
--- /dev/null
+++ b/src/gs-app-review-row.c
@@ -0,0 +1,154 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2015 Canonical Ltd.
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include "gs-app-review-row.h"
+#include "gs-star-widget.h"
+
+struct _GsAppReviewRow
+{
+       GtkListBoxRow    parent_instance;
+
+       GsAppReview     *review;
+       GtkWidget       *stars;
+       GtkWidget       *summary_label;
+       GtkWidget       *author_label;
+       GtkWidget       *text_label;
+};
+
+G_DEFINE_TYPE (GsAppReviewRow, gs_app_review_row, GTK_TYPE_LIST_BOX_ROW)
+
+static void
+gs_app_review_row_refresh (GsAppReviewRow *row)
+{
+       const gchar *reviewer;
+       GDateTime *date;
+       gchar *text;
+
+       gs_star_widget_set_rating (GS_STAR_WIDGET (row->stars), GS_APP_RATING_KIND_SYSTEM, 
gs_app_review_get_rating (row->review));
+       reviewer = gs_app_review_get_reviewer (row->review);
+       date = gs_app_review_get_date (row->review);
+       if (reviewer && date) {
+               gchar *date_text = g_date_time_format (date, "%e %B %Y");
+               text = g_strdup_printf ("%s, %s", reviewer, date_text);
+               g_free (date_text);
+       }
+       else if (reviewer)
+               text = g_strdup (reviewer);
+       else if (date)
+               text = g_date_time_format (date, "%e %B %Y");
+       else
+               text = g_strdup ("");
+       gtk_label_set_text (GTK_LABEL (row->author_label), text);
+       g_free (text);
+       gtk_label_set_text (GTK_LABEL (row->summary_label), gs_app_review_get_summary (row->review));
+       gtk_label_set_text (GTK_LABEL (row->text_label), gs_app_review_get_text (row->review));
+}
+
+static gboolean
+gs_app_review_row_refresh_idle (gpointer user_data)
+{
+       GsAppReviewRow *row = GS_APP_REVIEW_ROW (user_data);
+
+       gs_app_review_row_refresh (row);
+
+       g_object_unref (row);
+       return G_SOURCE_REMOVE;
+}
+
+static void
+gs_app_review_row_notify_props_changed_cb (GsApp *app,
+                                          GParamSpec *pspec,
+                                          GsAppReviewRow *row)
+{
+       g_idle_add (gs_app_review_row_refresh_idle, g_object_ref (row));
+}
+
+static void
+gs_app_review_row_set_review (GsAppReviewRow *row, GsAppReview *review)
+{
+       row->review = g_object_ref (review);
+
+       g_signal_connect_object (row->review, "notify::state",
+                                G_CALLBACK (gs_app_review_row_notify_props_changed_cb),
+                                row, 0);
+       gs_app_review_row_refresh (row);
+}
+
+static void
+gs_app_review_row_init (GsAppReviewRow *row)
+{
+       gtk_widget_set_has_window (GTK_WIDGET (row), FALSE);
+       gtk_widget_init_template (GTK_WIDGET (row));
+}
+
+static void
+gs_app_review_row_dispose (GObject *object)
+{
+       GsAppReviewRow *row = GS_APP_REVIEW_ROW (object);
+
+       g_clear_object (&row->review);
+
+       G_OBJECT_CLASS (gs_app_review_row_parent_class)->dispose (object);
+}
+
+static void
+gs_app_review_row_class_init (GsAppReviewRowClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+       object_class->dispose = gs_app_review_row_dispose;
+
+       gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/Software/gs-app-review-row.ui");
+
+       gtk_widget_class_bind_template_child (widget_class, GsAppReviewRow, stars);
+       gtk_widget_class_bind_template_child (widget_class, GsAppReviewRow, summary_label);
+       gtk_widget_class_bind_template_child (widget_class, GsAppReviewRow, author_label);
+       gtk_widget_class_bind_template_child (widget_class, GsAppReviewRow, text_label);
+}
+
+/**
+ * gs_app_review_row_new:
+ * @review: The review to show
+ *
+ * Create a widget suitable for showing an application review.
+ *
+ * Return value: A new @GsAppReviewRow.
+ **/
+GtkWidget *
+gs_app_review_row_new (GsAppReview *review)
+{
+       GtkWidget *row;
+
+       g_return_val_if_fail (GS_IS_APP_REVIEW (review), NULL);
+
+       row = g_object_new (GS_TYPE_APP_REVIEW_ROW, NULL);
+       gs_app_review_row_set_review (GS_APP_REVIEW_ROW (row), review);
+
+       return row;
+}
+
+/* vim: set noexpandtab: */
diff --git a/src/gs-app-reviews.h b/src/gs-app-review-row.h
similarity index 75%
rename from src/gs-app-reviews.h
rename to src/gs-app-review-row.h
index b0d0dfd..abff670 100644
--- a/src/gs-app-reviews.h
+++ b/src/gs-app-review-row.h
@@ -19,22 +19,23 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __GS_APP_REVIEWS_H
-#define __GS_APP_REVIEWS_H
+#ifndef GS_APP_REVIEW_ROW_H
+#define GS_APP_REVIEW_ROW_H
+
+#include <gtk/gtk.h>
 
-#include <glib-object.h>
 #include "gs-app-review.h"
 
 G_BEGIN_DECLS
 
-#define GS_TYPE_APP_REVIEWS (gs_app_reviews_get_type ())
+#define GS_TYPE_APP_REVIEW_ROW (gs_app_review_row_get_type ())
 
-G_DECLARE_FINAL_TYPE (GsAppReviews, gs_app_reviews, GS, APP_REVIEWS, GObject)
+G_DECLARE_FINAL_TYPE (GsAppReviewRow, gs_app_review_row, GS, APP_REVIEW_ROW, GtkListBoxRow)
 
-GsAppReviews   *gs_app_reviews_new                     (void);
+GtkWidget      *gs_app_review_row_new                  (GsAppReview *review);
 
 G_END_DECLS
 
-#endif /* __GS_APP_REVIEWS_H */
+#endif /* GS_APP_REVIEW_ROW_H */
 
 /* vim: set noexpandtab: */
diff --git a/src/gs-review-widget.ui b/src/gs-app-review-row.ui
similarity index 97%
rename from src/gs-review-widget.ui
rename to src/gs-app-review-row.ui
index 3043825..179d2fa 100644
--- a/src/gs-review-widget.ui
+++ b/src/gs-app-review-row.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.10 -->
-  <template class="GsReviewWidget" parent="GtkBin">
+  <template class="GsReviewWidget" parent="GtkListBoxRow">
     <property name="visible">True</property>
     <child>
       <object class="GtkGrid" id="grid">
diff --git a/src/gs-app-review.c b/src/gs-app-review.c
index 197012f..6e52a6d 100644
--- a/src/gs-app-review.c
+++ b/src/gs-app-review.c
@@ -32,7 +32,7 @@ struct _GsAppReview
        gint                     rating;
        gchar                   *version;
        gchar                   *reviewer;
-       guint64                  date;
+       GDateTime               *date;  
 };
 
 enum {
@@ -155,7 +155,7 @@ gs_app_review_set_reviewer (GsAppReview *review, const gchar *reviewer)
 /**
  * gs_app_review_get_date:
  **/
-guint64
+GDateTime *
 gs_app_review_get_date (GsAppReview *review)
 {
        g_return_val_if_fail (GS_IS_APP_REVIEW (review), 0);
@@ -166,10 +166,11 @@ gs_app_review_get_date (GsAppReview *review)
  * gs_app_review_set_date:
  */
 void
-gs_app_review_set_date (GsAppReview *review, guint64 date)
+gs_app_review_set_date (GsAppReview *review, GDateTime *date)
 {
        g_return_if_fail (GS_IS_APP_REVIEW (review));
-       review->date = date;
+       g_clear_pointer (&review->date, g_date_time_unref);
+       review->date = g_date_time_ref (date);
 }
 
 /**
@@ -197,7 +198,7 @@ gs_app_review_get_property (GObject *object, guint prop_id, GValue *value, GPara
                g_value_set_string (value, review->reviewer);
                break;
        case PROP_DATE:
-               g_value_set_uint64 (value, review->rating);
+               g_value_set_object (value, review->date);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -230,7 +231,7 @@ gs_app_review_set_property (GObject *object, guint prop_id, const GValue *value,
                gs_app_review_set_reviewer (review, g_value_get_string (value));
                break;
        case PROP_DATE:
-               gs_app_review_set_date (review, g_value_get_uint64 (value));
+               gs_app_review_set_date (review, g_value_get_object (value));
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -238,10 +239,16 @@ gs_app_review_set_property (GObject *object, guint prop_id, const GValue *value,
        }
 }
 
-/**
- * gs_app_review_finalize:
- * @object: The object to finalize
- **/
+static void
+gs_app_review_dispose (GObject *object)
+{
+       GsAppReview *review = GS_APP_REVIEW (object);
+
+       g_clear_pointer (&review->date, g_date_time_unref);
+
+       G_OBJECT_CLASS (gs_app_review_parent_class)->dispose (object);
+}
+
 static void
 gs_app_review_finalize (GObject *object)
 {
@@ -254,15 +261,12 @@ gs_app_review_finalize (GObject *object)
        G_OBJECT_CLASS (gs_app_review_parent_class)->finalize (object);
 }
 
-/**
- * gs_app_review_class_init:
- * @klass: The GsAppReviewClass
- **/
 static void
 gs_app_review_class_init (GsAppReviewClass *klass)
 {
        GParamSpec *pspec;
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       object_class->dispose = gs_app_review_dispose;
        object_class->finalize = gs_app_review_finalize;
        object_class->get_property = gs_app_review_get_property;
        object_class->set_property = gs_app_review_set_property;
@@ -311,8 +315,8 @@ gs_app_review_class_init (GsAppReviewClass *klass)
        /**
         * GsApp:date:
         */
-       pspec = g_param_spec_uint64 ("date", NULL, NULL,
-                                    0, G_MAXUINT64, 0,
+       pspec = g_param_spec_object ("date", NULL, NULL,
+                                    GS_TYPE_APP_REVIEW,
                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
        g_object_class_install_property (object_class, PROP_DATE, pspec);
 }
diff --git a/src/gs-app-review.h b/src/gs-app-review.h
index e9e2566..2b1f1bd 100644
--- a/src/gs-app-review.h
+++ b/src/gs-app-review.h
@@ -41,7 +41,7 @@ const gchar   *gs_app_review_get_text                 (GsAppReview    *review);
 void            gs_app_review_set_text                 (GsAppReview    *review,
                                                 const gchar    *text);
 
-gint    gs_app_review_get_rating                       (GsAppReview    *review);
+gint            gs_app_review_get_rating                       (GsAppReview    *review);
 void            gs_app_review_set_rating                       (GsAppReview    *review,
                                                 gint   rating);
 
@@ -53,9 +53,9 @@ const gchar   *gs_app_review_get_reviewer                     (GsAppReview    *review);
 void            gs_app_review_set_reviewer                     (GsAppReview    *review,
                                                 const gchar    *reviewer);
 
-guint64                 gs_app_review_get_date                 (GsAppReview    *review);
+GDateTime      *gs_app_review_get_date                 (GsAppReview    *review);
 void            gs_app_review_set_date                 (GsAppReview    *review,
-                                                guint64        date);
+                                                GDateTime      *date);
 
 void            gs_app_review_set_is_useful                    (GsAppReview    *review,
                                                 gboolean       is_useful);
diff --git a/src/gs-app.c b/src/gs-app.c
index 7110b05..bf91ff2 100644
--- a/src/gs-app.c
+++ b/src/gs-app.c
@@ -83,7 +83,7 @@ struct _GsApp
        gint                     rating;
        gint                     rating_confidence;
        GsAppRatingKind          rating_kind;
-       GsAppReviews            *reviews;
+       GPtrArray               *reviews; /* on GsAppReview */
        guint64                  size;
        GsAppKind                kind;
        AsIdKind                 id_kind;
@@ -299,8 +299,6 @@ gs_app_to_string (GsApp *app)
                g_string_append_printf (str, "\trating-kind:\t%s\n",
                                        app->rating_kind == GS_APP_RATING_KIND_USER ?
                                                "user" : "system");
-       if (app->reviews != NULL)
-               g_string_append_printf (str, "\treviews:\t%p\n", app->reviews);
        if (app->pixbuf != NULL)
                g_string_append_printf (str, "\tpixbuf:\t%p\n", app->pixbuf);
        if (app->featured_pixbuf != NULL)
@@ -1636,7 +1634,7 @@ gs_app_set_rating_kind (GsApp *app, GsAppRatingKind rating_kind)
 /**
  * gs_app_get_reviews:
  */
-GsAppReviews *
+GPtrArray *
 gs_app_get_reviews (GsApp *app)
 {
        g_return_val_if_fail (GS_IS_APP (app), NULL);
@@ -1644,14 +1642,13 @@ gs_app_get_reviews (GsApp *app)
 }
 
 /**
- * gs_app_set_reviews:
+ * gs_app_add_review:
  */
 void
-gs_app_set_reviews (GsApp *app, GsAppReviews *reviews)
+gs_app_add_review (GsApp *app, GsAppReview *review)
 {
        g_return_if_fail (GS_IS_APP (app));
-       g_clear_object (&app->reviews);
-       app->reviews = g_object_ref (reviews);
+       g_ptr_array_add (app->reviews, g_object_ref (review));
 }
 
 /**
@@ -2234,6 +2231,7 @@ gs_app_dispose (GObject *object)
        g_clear_pointer (&app->history, g_ptr_array_unref);
        g_clear_pointer (&app->related, g_ptr_array_unref);
        g_clear_pointer (&app->screenshots, g_ptr_array_unref);
+       g_clear_pointer (&app->reviews, g_ptr_array_unref);
 
        G_OBJECT_CLASS (gs_app_parent_class)->dispose (object);
 }
@@ -2386,6 +2384,7 @@ gs_app_init (GsApp *app)
        app->related = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
        app->history = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
        app->screenshots = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+       app->reviews = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
        app->metadata = g_hash_table_new_full (g_str_hash,
                                                g_str_equal,
                                                g_free,
diff --git a/src/gs-app.h b/src/gs-app.h
index acb3102..4b4481b 100644
--- a/src/gs-app.h
+++ b/src/gs-app.h
@@ -26,7 +26,7 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <appstream-glib.h>
 
-#include "gs-app-reviews.h"
+#include "gs-app-review.h"
 
 G_BEGIN_DECLS
 
@@ -218,9 +218,9 @@ void                 gs_app_set_rating_confidence   (GsApp          *app,
 GsAppRatingKind         gs_app_get_rating_kind         (GsApp          *app);
 void            gs_app_set_rating_kind         (GsApp          *app,
                                                 GsAppRatingKind rating_kind);
-GsAppReviews   *gs_app_get_reviews             (GsApp          *app);
-void            gs_app_set_reviews             (GsApp          *app,
-                                                GsAppReviews   *reviews);
+GPtrArray      *gs_app_get_reviews             (GsApp          *app);
+void            gs_app_add_review              (GsApp          *app,
+                                                GsAppReview    *review);
 guint64                 gs_app_get_size                (GsApp          *app);
 void            gs_app_set_size                (GsApp          *app,
                                                 guint64         size);
diff --git a/src/gs-shell-details.c b/src/gs-shell-details.c
index 2cd822d..a75e984 100644
--- a/src/gs-shell-details.c
+++ b/src/gs-shell-details.c
@@ -35,6 +35,7 @@
 #include "gs-screenshot-image.h"
 #include "gs-progress-button.h"
 #include "gs-star-widget.h"
+#include "gs-app-review-row.h"
 
 typedef enum {
        GS_SHELL_DETAILS_STATE_LOADING,
@@ -87,6 +88,7 @@ struct _GsShellDetails
        GtkWidget               *label_failed;
        GtkWidget               *label_pending;
        GtkWidget               *list_box_addons;
+       GtkWidget               *list_box_reviews;
        GtkWidget               *scrolledwindow_details;
        GtkWidget               *spinner_details;
        GtkWidget               *spinner_install_remove;
@@ -876,6 +878,29 @@ gs_shell_details_refresh_addons (GsShellDetails *self)
                                  G_CALLBACK (gs_shell_details_addon_selected_cb),
                                  self);
        }
+
+}
+
+static void
+gs_shell_details_refresh_reviews (GsShellDetails *self)
+{
+       GPtrArray *reviews;
+       guint i;
+
+       gs_container_remove_all (GTK_CONTAINER (self->list_box_reviews));
+
+       reviews = gs_app_get_reviews (self->app);
+       for (i = 0; i < reviews->len; i++) {
+               GsAppReview *review;
+               GtkWidget *row;
+
+               review = g_ptr_array_index (reviews, i);
+
+               row = gs_app_review_row_new (review);
+
+               gtk_container_add (GTK_CONTAINER (self->list_box_reviews), row);
+               gtk_widget_show (row);
+       }
 }
 
 /**
@@ -917,6 +942,7 @@ gs_shell_details_app_refine_cb (GObject *source,
 
        gs_shell_details_refresh_screenshots (self);
        gs_shell_details_refresh_addons (self);
+       gs_shell_details_refresh_reviews (self);
        gs_shell_details_refresh_all (self);
        gs_shell_details_set_state (self, GS_SHELL_DETAILS_STATE_READY);
 }
@@ -987,6 +1013,7 @@ gs_shell_details_filename_to_app_cb (GObject *source,
        gs_shell_details_switch_to (self);
        gs_shell_details_refresh_screenshots (self);
        gs_shell_details_refresh_addons (self);
+       gs_shell_details_refresh_reviews (self);
        gs_shell_details_refresh_all (self);
        gs_shell_details_set_state (self, GS_SHELL_DETAILS_STATE_READY);
 }
@@ -1373,6 +1400,7 @@ gs_shell_details_class_init (GsShellDetailsClass *klass)
        gtk_widget_class_bind_template_child (widget_class, GsShellDetails, label_failed);
        gtk_widget_class_bind_template_child (widget_class, GsShellDetails, label_pending);
        gtk_widget_class_bind_template_child (widget_class, GsShellDetails, list_box_addons);
+       gtk_widget_class_bind_template_child (widget_class, GsShellDetails, list_box_reviews);
        gtk_widget_class_bind_template_child (widget_class, GsShellDetails, scrolledwindow_details);
        gtk_widget_class_bind_template_child (widget_class, GsShellDetails, spinner_details);
        gtk_widget_class_bind_template_child (widget_class, GsShellDetails, spinner_install_remove);
diff --git a/src/gs-shell-details.ui b/src/gs-shell-details.ui
index 4a832ad..f83dfdf 100644
--- a/src/gs-shell-details.ui
+++ b/src/gs-shell-details.ui
@@ -977,7 +977,40 @@
                         <property name="position">11</property>
                       </packing>
                     </child>
-
+                    <child>
+                      <object class="GtkBox" id="box_reviews">
+                        <property name="visible">True</property>
+                        <property name="orientation">vertical</property>
+                        <property name="margin_top">28</property>
+                        <child>
+                          <object class="GtkLabel" id="application_details_reviews_title">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="margin_bottom">12</property>
+                            <property name="halign">start</property>
+                            <property name="valign">start</property>
+                            <property name="hexpand">True</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Reviews</property>
+                            <style>
+                              <class name="application-reviews-title"/>
+                            </style>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkListBox" id="list_box_reviews">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="selection_mode">none</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">12</property>
+                      </packing>
+                    </child>
                   </object>
                 </child>
               </object>


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