[gnome-software] Drop 'Read More' links
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Drop 'Read More' links
- Date: Fri, 23 Aug 2013 01:09:25 +0000 (UTC)
commit d9a8f4ae460ff0502acb2cce958463095a6de1c1
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Aug 22 21:06:27 2013 -0400
Drop 'Read More' links
These are not wanted anymore. Instead, we now make activating the
row bring up the details dialog. Without the 'Read More' link,
we can considerably simplify the 'ellipsize to 3 lines'
implementation, and just use a new GTK+ api for this purpose.
src/gs-app-widget.c | 257 +++++++++++----------------------------------
src/gs-shell-installed.c | 14 ++-
src/gs-shell-updates.c | 2 -
3 files changed, 71 insertions(+), 202 deletions(-)
---
diff --git a/src/gs-app-widget.c b/src/gs-app-widget.c
index 419a41a..d5288c9 100644
--- a/src/gs-app-widget.c
+++ b/src/gs-app-widget.c
@@ -32,10 +32,7 @@ struct _GsAppWidgetPrivate
ChMarkdown *markdown;
GsApp *app;
GtkWidget *widget_button;
- GtkWidget *widget_description1;
- GtkWidget *widget_description2;
- GtkWidget *widget_description3;
- GtkWidget *widget_read_more;
+ GtkWidget *widget_description;
GtkWidget *widget_image;
GtkWidget *widget_name;
GtkWidget *widget_spinner;
@@ -49,12 +46,48 @@ G_DEFINE_TYPE (GsAppWidget, gs_app_widget, GTK_TYPE_BOX)
enum {
SIGNAL_BUTTON_CLICKED,
- SIGNAL_READ_MORE_CLICKED,
SIGNAL_LAST
};
static guint signals [SIGNAL_LAST] = { 0 };
+static guint
+_g_string_replace (GString *string, const gchar *search, const gchar *replace)
+{
+ gchar *tmp;
+ guint cnt = 0;
+ guint replace_len;
+ guint search_len;
+
+ search_len = strlen (search);
+ replace_len = strlen (replace);
+
+ do {
+ tmp = g_strstr_len (string->str, -1, search);
+ if (tmp == NULL)
+ goto out;
+
+ /* reallocate the string if required */
+ if (search_len > replace_len) {
+ g_string_erase (string,
+ tmp - string->str,
+- search_len - replace_len);
+ }
+ if (search_len < replace_len) {
+ g_string_insert_len (string,
+ tmp - string->str,
+ search,
+ replace_len - search_len);
+ }
+
+ /* just memcmp in the new string */
+ memcpy (tmp, replace, replace_len);
+ cnt++;
+ } while (TRUE);
+out:
+ return cnt;
+}
+
/**
* gs_app_widget_refresh:
**/
@@ -64,10 +97,24 @@ gs_app_widget_refresh (GsAppWidget *app_widget)
GsAppWidgetPrivate *priv = app_widget->priv;
GtkStyleContext *context;
GtkWidget *box;
+ const gchar *tmp;
+ GString *s = NULL;
if (app_widget->priv->app == NULL)
return;
+ tmp = (gchar *)gs_app_get_description (app_widget->priv->app);
+ if (tmp == NULL) {
+ tmp = _("The author of this software has not included a long description.");
+ }
+ else {
+ s = g_string_new (tmp);
+ _g_string_replace (s, "\n", " ");
+ tmp = s->str;
+ }
+ gtk_label_set_label (GTK_LABEL (priv->widget_description), tmp);
+ if (s)
+ g_string_free (s, TRUE);
gtk_label_set_label (GTK_LABEL (priv->widget_name),
gs_app_get_name (priv->app));
gtk_label_set_label (GTK_LABEL (priv->widget_version),
@@ -128,43 +175,6 @@ gs_app_widget_refresh (GsAppWidget *app_widget)
gtk_widget_get_visible (priv->widget_button));
}
-static guint
-_g_string_replace (GString *string, const gchar *search, const gchar *replace)
-{
- gchar *tmp;
- guint cnt = 0;
- guint replace_len;
- guint search_len;
-
- search_len = strlen (search);
- replace_len = strlen (replace);
-
- do {
- tmp = g_strstr_len (string->str, -1, search);
- if (tmp == NULL)
- goto out;
-
- /* reallocate the string if required */
- if (search_len > replace_len) {
- g_string_erase (string,
- tmp - string->str,
-- search_len - replace_len);
- }
- if (search_len < replace_len) {
- g_string_insert_len (string,
- tmp - string->str,
- search,
- replace_len - search_len);
- }
-
- /* just memcmp in the new string */
- memcpy (tmp, replace, replace_len);
- cnt++;
- } while (TRUE);
-out:
- return cnt;
-}
-
/**
* gs_app_widget_get_app:
**/
@@ -230,12 +240,6 @@ gs_app_widget_class_init (GsAppWidgetClass *klass)
G_STRUCT_OFFSET (GsAppWidgetClass, button_clicked),
NULL, NULL, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
- signals [SIGNAL_READ_MORE_CLICKED] =
- g_signal_new ("read-more-clicked",
- G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GsAppWidgetClass, read_more_clicked),
- NULL, NULL, g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
g_type_class_add_private (klass, sizeof (GsAppWidgetPrivate));
}
@@ -249,118 +253,6 @@ gs_app_widget_button_clicked_cb (GtkWidget *widget, GsAppWidget *app_widget)
g_signal_emit (app_widget, signals[SIGNAL_BUTTON_CLICKED], 0);
}
-static void
-break_lines (PangoContext *context,
- const gchar *text, const gchar *end,
- gint width,
- gchar **line1, gchar **line2, gchar **line3)
-{
- PangoLayout *layout;
- PangoLayoutIter *iter;
- gchar *tmp;
- gchar *p, *p2, *r;
- gint i2 = 0, i3 = 0, i4 = 0;
- gint lines;
-
- layout = pango_layout_new (context);
- pango_layout_set_width (layout, width * PANGO_SCALE);
- pango_layout_set_wrap (layout, PANGO_WRAP_WORD);
-
- tmp = g_strconcat (text, end, NULL);
- pango_layout_set_text (layout, tmp, -1);
- g_free (tmp);
-
- lines = pango_layout_get_line_count (layout);
-
- iter = pango_layout_get_iter (layout);
- if (pango_layout_iter_next_line (iter))
- i2 = pango_layout_iter_get_index (iter);
- else
- goto out;
- if (pango_layout_iter_next_line (iter))
- i3 = pango_layout_iter_get_index (iter);
- else
- goto out;
- if (pango_layout_iter_next_line (iter))
- i4 = pango_layout_iter_get_index (iter);
- else
- goto out;
- pango_layout_iter_free (iter);
-
- p = (gchar *)text + i4;
- while (text <= p && pango_layout_get_line_count (layout) > 3) {
- p = g_utf8_prev_char (p);
- r = g_strndup (text, p - text);
- p2 = g_strconcat (r, "...", end, NULL);
- pango_layout_set_text (layout, p2, -1);
- g_free (p2);
- g_free (r);
- }
-
-out:
- g_object_unref (layout);
-
- if (lines == 1) {
- *line1 = g_strdup (text);
- *line2 = NULL;
- *line3 = NULL;
- }
- else if (lines == 2) {
- i2 = MIN (i2, (gint)strlen (text));
- *line1 = g_strndup (text, i2);
- *line2 = g_strdup (text + i2);
- *line3 = NULL;
- }
- else {
- i2 = MIN (i2, (gint)strlen (text));
- i3 = MIN (i3, (gint)strlen (text));
- *line1 = g_strndup (text, i2);
- *line2 = g_strndup (text + i2, i3 - i2);
- *line3 = g_strdup (text + i3);
- }
-}
-
-static void
-size_allocate_cb (GtkWidget *box,
- GtkAllocation *allocation,
- GsAppWidget *app_widget)
-{
- gchar *tmp;
- gchar *line1, *line2, *line3;
- GString *s = NULL;
-
- tmp = (gchar *)gs_app_get_description (app_widget->priv->app);
- if (tmp == NULL) {
- tmp = _("The author of this software has not included a long description.");
- }
- else {
- s = g_string_new (tmp);
- _g_string_replace (s, "\n", " ");
- tmp = s->str;
- }
-
- break_lines (gtk_widget_get_pango_context (box),
- tmp, _("Read More"), allocation->width,
- &line1, &line2, &line3);
-
- gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description1), line1);
- gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description2), line2);
- gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description3), line3);
-
- if (s)
- g_string_free (s, TRUE);
-}
-
-static gboolean
-read_more_cb (GtkLabel *widget,
- const gchar *uri,
- GsAppWidget *app_widget)
-{
- g_signal_emit (app_widget, signals[SIGNAL_READ_MORE_CLICKED], 0);
-
- return TRUE;
-}
-
/**
* gs_app_widget_init:
**/
@@ -368,8 +260,7 @@ static void
gs_app_widget_init (GsAppWidget *app_widget)
{
GsAppWidgetPrivate *priv;
- GtkWidget *box, *box2;
- gchar *tmp;
+ GtkWidget *box;
PangoAttrList *attr_list;
g_return_if_fail (GS_IS_APP_WIDGET (app_widget));
@@ -414,38 +305,16 @@ gs_app_widget_init (GsAppWidget *app_widget)
gtk_box_pack_start (GTK_BOX (app_widget), box, FALSE, TRUE, 0);
/* description */
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_hexpand (box, TRUE);
- gtk_widget_set_halign (box, GTK_ALIGN_FILL);
- priv->widget_description1 = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (priv->widget_description1), 0.0, 0.5);
- gtk_label_set_ellipsize (GTK_LABEL (priv->widget_description1), PANGO_ELLIPSIZE_END);
- gtk_container_add (GTK_CONTAINER (box), priv->widget_description1);
- priv->widget_description2 = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (priv->widget_description2), 0.0, 0.5);
- gtk_label_set_ellipsize (GTK_LABEL (priv->widget_description2), PANGO_ELLIPSIZE_END);
- gtk_container_add (GTK_CONTAINER (box), priv->widget_description2);
- box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
- gtk_box_pack_start (GTK_BOX (box), box2, TRUE, TRUE, 0);
- priv->widget_description3 = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (priv->widget_description3), 0.0, 0.5);
- gtk_label_set_ellipsize (GTK_LABEL (priv->widget_description3), PANGO_ELLIPSIZE_END);
- gtk_widget_set_size_request (priv->widget_description3, 100, -1);
- gtk_container_add (GTK_CONTAINER (box2), priv->widget_description3);
- priv->widget_read_more = gtk_label_new (NULL);
- g_signal_connect (priv->widget_read_more, "activate-link",
- G_CALLBACK (read_more_cb), app_widget);
- tmp = g_markup_printf_escaped ("<a href=''>%s</a>", _("Read More"));
- gtk_label_set_markup (GTK_LABEL (priv->widget_read_more), tmp);
- g_free (tmp);
- gtk_misc_set_alignment (GTK_MISC (priv->widget_read_more), 1, 0.5);
- gtk_widget_set_halign (priv->widget_read_more, GTK_ALIGN_END);
- gtk_box_pack_start (GTK_BOX (box2), priv->widget_read_more, TRUE, TRUE, 0);
-
- gtk_box_pack_start (GTK_BOX (app_widget), box, TRUE, TRUE, 0);
- g_signal_connect (box, "size-allocate", G_CALLBACK (size_allocate_cb), app_widget);
- gtk_widget_show_all (box);
-
+ priv->widget_description = gtk_label_new (NULL);
+ gtk_widget_show (priv->widget_description);
+ gtk_label_set_line_wrap (GTK_LABEL (priv->widget_description), TRUE);
+ gtk_label_set_lines (GTK_LABEL (priv->widget_description), 3);
+ gtk_widget_set_hexpand (priv->widget_description, TRUE);
+ gtk_widget_set_halign (priv->widget_description, GTK_ALIGN_FILL);
+ gtk_misc_set_alignment (GTK_MISC (priv->widget_description), 0.0, 0.5);
+ gtk_label_set_ellipsize (GTK_LABEL (priv->widget_description), PANGO_ELLIPSIZE_END);
+
+ gtk_box_pack_start (GTK_BOX (app_widget), priv->widget_description, TRUE, TRUE, 0);
/* button */
priv->widget_button = gtk_button_new_with_label ("button");
diff --git a/src/gs-shell-installed.c b/src/gs-shell-installed.c
index f190566..113ac16 100644
--- a/src/gs-shell-installed.c
+++ b/src/gs-shell-installed.c
@@ -75,19 +75,22 @@ _gtk_container_remove_all (GtkContainer *container)
}
static void
-gs_shell_installed_app_widget_read_more_clicked_cb (GsAppWidget *app_widget,
- GsShellInstalled *shell_installed)
+gs_shell_installed_app_widget_activated_cb (GtkListBox *list_box,
+ GtkListBoxRow *row,
+ GsShellInstalled *shell_installed)
{
const gchar *tmp;
GsApp *app;
GtkWidget *details, *button, *grid;
GtkWidget *image, *label;
PangoAttrList *attr_list;
+ GsAppWidget *app_widget;
+ app_widget = GS_APP_WIDGET (gtk_bin_get_child (GTK_BIN (row)));
app = gs_app_widget_get_app (app_widget);
details = gtk_dialog_new_with_buttons (_("Details"),
- GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (app_widget))),
+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (list_box))),
GTK_DIALOG_MODAL,
_("_Done"), GTK_RESPONSE_CLOSE,
NULL);
@@ -261,9 +264,6 @@ gs_shell_installed_get_installed_cb (GObject *source_object,
g_signal_connect (widget, "button-clicked",
G_CALLBACK (gs_shell_installed_app_remove_cb),
shell_installed);
- g_signal_connect (widget, "read-more-clicked",
- G_CALLBACK (gs_shell_installed_app_widget_read_more_clicked_cb),
- shell_installed);
gs_app_widget_set_app (GS_APP_WIDGET (widget), app);
gtk_container_add (GTK_CONTAINER (priv->list_box_installed), widget);
gs_app_widget_set_size_groups (GS_APP_WIDGET (widget),
@@ -472,6 +472,8 @@ gs_shell_installed_setup (GsShellInstalled *shell_installed,
/* setup installed */
priv->list_box_installed = GTK_LIST_BOX (gtk_list_box_new ());
+ g_signal_connect (priv->list_box_installed, "row-activated",
+ G_CALLBACK (gs_shell_installed_app_widget_activated_cb), shell_installed);
gtk_list_box_set_header_func (priv->list_box_installed,
gs_shell_installed_list_header_func,
shell_installed,
diff --git a/src/gs-shell-updates.c b/src/gs-shell-updates.c
index e05f8fc..2c8e6c1 100644
--- a/src/gs-shell-updates.c
+++ b/src/gs-shell-updates.c
@@ -126,8 +126,6 @@ gs_shell_updates_get_updates_cb (GsPluginLoader *plugin_loader,
app = GS_APP (l->data);
g_debug ("adding update %s, kind %d state %d", gs_app_get_id (app), gs_app_get_kind (app),
gs_app_get_state (app));
widget = gs_app_widget_new ();
- g_signal_connect (widget, "read-more-clicked",
- G_CALLBACK (show_update_details), shell_updates);
gs_app_widget_set_app (GS_APP_WIDGET (widget), app);
gtk_container_add (GTK_CONTAINER (priv->list_box_updates), widget);
gtk_widget_show (widget);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]