[gnome-software] Fix spacing in star ratings widget when in non-interactive mode
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Fix spacing in star ratings widget when in non-interactive mode
- Date: Thu, 14 Jul 2016 15:52:17 +0000 (UTC)
commit 2f064dda248c5b9b9c334e98a8ff5adbed3ec1de
Author: Richard Hughes <richard hughsie com>
Date: Thu Jul 14 15:23:53 2016 +0100
Fix spacing in star ratings widget when in non-interactive mode
Create the stars at runtime when required, packing the interactive widget with
GtkButtons, and just using a plain GtkImage in non-interactive mode.
src/gs-star-widget.c | 154 ++++++++++++++++++-------------------------------
src/gs-star-widget.ui | 121 +--------------------------------------
2 files changed, 59 insertions(+), 216 deletions(-)
---
diff --git a/src/gs-star-widget.c b/src/gs-star-widget.c
index 03183f4..cde9e60 100644
--- a/src/gs-star-widget.c
+++ b/src/gs-star-widget.c
@@ -24,22 +24,15 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include "gs-common.h"
#include "gs-star-widget.h"
typedef struct
{
gboolean interactive;
gint rating;
- GtkWidget *button1;
- GtkWidget *button2;
- GtkWidget *button3;
- GtkWidget *button4;
- GtkWidget *button5;
- GtkWidget *image1;
- GtkWidget *image2;
- GtkWidget *image3;
- GtkWidget *image4;
- GtkWidget *image5;
+ guint icon_size;
+ GtkWidget *box1;
} GsStarWidgetPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (GsStarWidget, gs_star_widget, GTK_TYPE_BIN)
@@ -53,6 +46,8 @@ static guint signals [SIGNAL_LAST] = { 0 };
static const gint rate_to_star[] = {20, 40, 60, 80, 100, -1};
+static void gs_star_widget_refresh (GsStarWidget *star);
+
gint
gs_star_widget_get_rating (GsStarWidget *star)
{
@@ -68,44 +63,66 @@ gs_star_widget_set_icon_size (GsStarWidget *star, guint pixel_size)
GsStarWidgetPrivate *priv;
g_return_if_fail (GS_IS_STAR_WIDGET (star));
priv = gs_star_widget_get_instance_private (star);
- gtk_image_set_pixel_size (GTK_IMAGE (priv->image1), pixel_size);
- gtk_image_set_pixel_size (GTK_IMAGE (priv->image2), pixel_size);
- gtk_image_set_pixel_size (GTK_IMAGE (priv->image3), pixel_size);
- gtk_image_set_pixel_size (GTK_IMAGE (priv->image4), pixel_size);
- gtk_image_set_pixel_size (GTK_IMAGE (priv->image5), pixel_size);
+ priv->icon_size = pixel_size;
+ gs_star_widget_refresh (star);
}
static void
-gs_star_widget_style_class_enable (GtkWidget *widget, gboolean val)
+gs_star_widget_button_clicked_cb (GtkButton *button, GsStarWidget *star)
{
- GtkStyleContext *context;
- context = gtk_widget_get_style_context (widget);
- if (val) {
- gtk_style_context_add_class (context, "star-enabled");
- gtk_style_context_remove_class (context, "star-disabled");
- } else {
- gtk_style_context_add_class (context, "star-disabled");
- gtk_style_context_remove_class (context, "star-enabled");
- }
+ GsStarWidgetPrivate *priv;
+ gint rating;
+
+ priv = gs_star_widget_get_instance_private (star);
+ if (!priv->interactive)
+ return;
+
+ rating = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button),
+ "GsStarWidget::value"));
+ priv->rating = rating;
+ g_signal_emit (star, signals[RATING_CHANGED], 0, priv->rating);
+ gs_star_widget_refresh (star);
}
static void
gs_star_widget_refresh (GsStarWidget *star)
{
- GsStarWidgetPrivate *priv;
- priv = gs_star_widget_get_instance_private (star);
-
- gtk_widget_set_sensitive (priv->button1, priv->interactive);
- gtk_widget_set_sensitive (priv->button2, priv->interactive);
- gtk_widget_set_sensitive (priv->button3, priv->interactive);
- gtk_widget_set_sensitive (priv->button4, priv->interactive);
- gtk_widget_set_sensitive (priv->button5, priv->interactive);
-
- gs_star_widget_style_class_enable (priv->image1, priv->rating > 0);
- gs_star_widget_style_class_enable (priv->image2, priv->rating > 20);
- gs_star_widget_style_class_enable (priv->image3, priv->rating > 40);
- gs_star_widget_style_class_enable (priv->image4, priv->rating > 60);
- gs_star_widget_style_class_enable (priv->image5, priv->rating > 80);
+ GsStarWidgetPrivate *priv = gs_star_widget_get_instance_private (star);
+ guint i;
+
+ /* remove all existing widgets */
+ gs_container_remove_all (GTK_CONTAINER (priv->box1));
+
+ for (i = 0; i < 5; i++) {
+ GtkWidget *w;
+ GtkWidget *im;
+
+ /* create image */
+ im = gtk_image_new_from_icon_name ("starred-symbolic",
+ GTK_ICON_SIZE_DIALOG);
+ gtk_image_set_pixel_size (GTK_IMAGE (im), priv->icon_size);
+
+ /* create button */
+ if (priv->interactive) {
+ w = gtk_button_new ();
+ g_signal_connect (w, "clicked",
+ G_CALLBACK (gs_star_widget_button_clicked_cb), star);
+ g_object_set_data (G_OBJECT (w),
+ "GsStarWidget::value",
+ GINT_TO_POINTER (rate_to_star[i]));
+ gtk_container_add (GTK_CONTAINER (w), im);
+ gtk_widget_set_visible (im, TRUE);
+ } else {
+ w = im;
+ }
+ gtk_widget_set_sensitive (w, priv->interactive);
+ gtk_style_context_add_class (gtk_widget_get_style_context (w), "star");
+ gtk_style_context_add_class (gtk_widget_get_style_context (im),
+ priv->rating >= rate_to_star[i] ?
+ "star-enabled" : "star-disabled");
+ gtk_widget_set_visible (w, TRUE);
+ gtk_container_add (GTK_CONTAINER (priv->box1), w);
+ }
}
void
@@ -136,57 +153,10 @@ gs_star_widget_destroy (GtkWidget *widget)
}
static void
-gs_star_widget_button_clicked_cb (GtkButton *button, GsStarWidget *star)
-{
- GsStarWidgetPrivate *priv;
- gint rating;
-
- priv = gs_star_widget_get_instance_private (star);
- if (!priv->interactive)
- return;
-
- rating = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button),
- "GsStarWidget::value"));
- priv->rating = rating;
- g_signal_emit (star, signals[RATING_CHANGED], 0, priv->rating);
- gs_star_widget_refresh (star);
-}
-
-static void
gs_star_widget_init (GsStarWidget *star)
{
- GsStarWidgetPrivate *priv;
-
gtk_widget_set_has_window (GTK_WIDGET (star), FALSE);
gtk_widget_init_template (GTK_WIDGET (star));
- priv = gs_star_widget_get_instance_private (star);
- g_signal_connect (priv->button1, "clicked",
- G_CALLBACK (gs_star_widget_button_clicked_cb), star);
- g_signal_connect (priv->button2, "clicked",
- G_CALLBACK (gs_star_widget_button_clicked_cb), star);
- g_signal_connect (priv->button3, "clicked",
- G_CALLBACK (gs_star_widget_button_clicked_cb), star);
- g_signal_connect (priv->button4, "clicked",
- G_CALLBACK (gs_star_widget_button_clicked_cb), star);
- g_signal_connect (priv->button5, "clicked",
- G_CALLBACK (gs_star_widget_button_clicked_cb), star);
-
- /* assign the values */
- g_object_set_data (G_OBJECT (priv->button1),
- "GsStarWidget::value",
- GINT_TO_POINTER (rate_to_star[0]));
- g_object_set_data (G_OBJECT (priv->button2),
- "GsStarWidget::value",
- GINT_TO_POINTER (rate_to_star[1]));
- g_object_set_data (G_OBJECT (priv->button3),
- "GsStarWidget::value",
- GINT_TO_POINTER (rate_to_star[2]));
- g_object_set_data (G_OBJECT (priv->button4),
- "GsStarWidget::value",
- GINT_TO_POINTER (rate_to_star[3]));
- g_object_set_data (G_OBJECT (priv->button5),
- "GsStarWidget::value",
- GINT_TO_POINTER (rate_to_star[4]));
}
static void
@@ -205,17 +175,7 @@ gs_star_widget_class_init (GsStarWidgetClass *klass)
G_TYPE_NONE, 1, G_TYPE_UINT);
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-star-widget.ui");
-
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, button1);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, button2);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, button3);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, button4);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, button5);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, image1);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, image2);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, image3);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, image4);
- gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, image5);
+ gtk_widget_class_bind_template_child_private (widget_class, GsStarWidget, box1);
}
GtkWidget *
diff --git a/src/gs-star-widget.ui b/src/gs-star-widget.ui
index c3e0fa7..aa4c2a5 100644
--- a/src/gs-star-widget.ui
+++ b/src/gs-star-widget.ui
@@ -9,129 +9,12 @@
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
- <property name="spacing">1</property>
+ <property name="spacing">2</property>
<style>
<class name="star"/>
</style>
<child>
- <object class="GtkButton" id="button1">
- <property name="visible">True</property>
- <style>
- <class name="star"/>
- </style>
- <child internal-child="accessible">
- <object class="AtkObject" id="button1-accessible">
- <property name="accessible-name" translatable="yes">One Star</property>
- </object>
- </child>
- <child>
- <object class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="icon_name">starred-symbolic</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="button2">
- <property name="visible">True</property>
- <style>
- <class name="star"/>
- </style>
- <child internal-child="accessible">
- <object class="AtkObject" id="button2-accessible">
- <property name="accessible-name" translatable="yes">Two Stars</property>
- </object>
- </child>
- <child>
- <object class="GtkImage" id="image2">
- <property name="visible">True</property>
- <property name="icon_name">starred-symbolic</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="button3">
- <property name="visible">True</property>
- <style>
- <class name="star"/>
- </style>
- <child internal-child="accessible">
- <object class="AtkObject" id="button3-accessible">
- <property name="accessible-name" translatable="yes">Three Stars</property>
- </object>
- </child>
- <child>
- <object class="GtkImage" id="image3">
- <property name="visible">True</property>
- <property name="icon_name">starred-symbolic</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="button4">
- <property name="visible">True</property>
- <style>
- <class name="star"/>
- </style>
- <child internal-child="accessible">
- <object class="AtkObject" id="button4-accessible">
- <property name="accessible-name" translatable="yes">Four Stars</property>
- </object>
- </child>
- <child>
- <object class="GtkImage" id="image4">
- <property name="visible">True</property>
- <property name="icon_name">starred-symbolic</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="button5">
- <property name="visible">True</property>
- <style>
- <class name="star"/>
- </style>
- <child internal-child="accessible">
- <object class="AtkObject" id="button5-accessible">
- <property name="accessible-name" translatable="yes">Five Stars</property>
- </object>
- </child>
- <child>
- <object class="GtkImage" id="image5">
- <property name="visible">True</property>
- <property name="icon_name">starred-symbolic</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">4</property>
- </packing>
+ <placeholder/>
</child>
</object>
</child>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]