[gnome-software] Don't allow review actions when offline



commit 6f013a41c9cb3a6da18fcf059982d0353529ed84
Author: Richard Hughes <richard hughsie com>
Date:   Sun Nov 27 21:27:16 2016 +0000

    Don't allow review actions when offline

 src/gs-review-row.c    |   30 ++++++++++++++++++++++--------
 src/gs-review-row.h    |    2 ++
 src/gs-shell-details.c |   17 +++++++++++++++++
 3 files changed, 41 insertions(+), 8 deletions(-)
---
diff --git a/src/gs-review-row.c b/src/gs-review-row.c
index 006a1d7..a648b57 100644
--- a/src/gs-review-row.c
+++ b/src/gs-review-row.c
@@ -32,6 +32,7 @@ typedef struct
        GtkListBoxRow    parent_instance;
 
        AsReview        *review;
+       gboolean         network_available;
        guint64          actions;
        GtkWidget       *stars;
        GtkWidget       *summary_label;
@@ -60,6 +61,7 @@ gs_review_row_refresh (GsReviewRow *row)
 {
        GsReviewRowPrivate *priv = gs_review_row_get_instance_private (row);
        const gchar *reviewer;
+       guint64 actions = 0;
        GDateTime *date;
        g_autofree gchar *text = NULL;
 
@@ -87,23 +89,33 @@ gs_review_row_refresh (GsReviewRow *row)
                priv->actions = 0;
 
        /* set actions up */
-       if ((priv->actions & (1 << GS_PLUGIN_ACTION_REVIEW_UPVOTE |
-                             1 << GS_PLUGIN_ACTION_REVIEW_DOWNVOTE |
-                             1 << GS_PLUGIN_ACTION_REVIEW_DISMISS)) == 0) {
+       if (priv->network_available)
+               actions = priv->actions;
+       if ((actions & (1 << GS_PLUGIN_ACTION_REVIEW_UPVOTE |
+                       1 << GS_PLUGIN_ACTION_REVIEW_DOWNVOTE |
+                       1 << GS_PLUGIN_ACTION_REVIEW_DISMISS)) == 0) {
                gtk_widget_set_visible (priv->box_voting, FALSE);
        } else {
                gtk_widget_set_visible (priv->box_voting, TRUE);
                gtk_widget_set_visible (priv->button_yes,
-                                       priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_UPVOTE);
+                                       actions & 1 << GS_PLUGIN_ACTION_REVIEW_UPVOTE);
                gtk_widget_set_visible (priv->button_no,
-                                       priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_DOWNVOTE);
+                                       actions & 1 << GS_PLUGIN_ACTION_REVIEW_DOWNVOTE);
                gtk_widget_set_visible (priv->button_dismiss,
-                                       priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_DISMISS);
+                                       actions & 1 << GS_PLUGIN_ACTION_REVIEW_DISMISS);
        }
        gtk_widget_set_visible (priv->button_remove,
-                               priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_REMOVE);
+                               actions & 1 << GS_PLUGIN_ACTION_REVIEW_REMOVE);
        gtk_widget_set_visible (priv->button_report,
-                               priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_REPORT);
+                               actions & 1 << GS_PLUGIN_ACTION_REVIEW_REPORT);
+}
+
+void
+gs_review_row_set_network_available (GsReviewRow *review_row, gboolean network_available)
+{
+       GsReviewRowPrivate *priv = gs_review_row_get_instance_private (review_row);
+       priv->network_available = network_available;
+       gs_review_row_refresh (review_row);
 }
 
 static gboolean
@@ -128,6 +140,8 @@ gs_review_row_notify_props_changed_cb (GsApp *app,
 static void
 gs_review_row_init (GsReviewRow *row)
 {
+       GsReviewRowPrivate *priv = gs_review_row_get_instance_private (row);
+       priv->network_available = TRUE;
        gtk_widget_set_has_window (GTK_WIDGET (row), FALSE);
        gtk_widget_init_template (GTK_WIDGET (row));
 }
diff --git a/src/gs-review-row.h b/src/gs-review-row.h
index 0306b7f..6c1e40f 100644
--- a/src/gs-review-row.h
+++ b/src/gs-review-row.h
@@ -43,6 +43,8 @@ GtkWidget     *gs_review_row_new              (AsReview       *review);
 AsReview       *gs_review_row_get_review       (GsReviewRow    *review_row);
 void            gs_review_row_set_actions      (GsReviewRow    *review_row,
                                                 guint64         actions);
+void            gs_review_row_set_network_available    (GsReviewRow    *review_row,
+                                                        gboolean        network_available);
 
 G_END_DECLS
 
diff --git a/src/gs-shell-details.c b/src/gs-shell-details.c
index 858df36..31aeeca 100644
--- a/src/gs-shell-details.c
+++ b/src/gs-shell-details.c
@@ -1275,6 +1275,8 @@ gs_shell_details_refresh_reviews (GsShellDetails *self)
                gs_review_row_set_actions (GS_REVIEW_ROW (row), actions);
                gtk_container_add (GTK_CONTAINER (self->list_box_reviews), row);
                gtk_widget_set_visible (row, i < SHOW_NR_REVIEWS_INITIAL);
+               gs_review_row_set_network_available (GS_REVIEW_ROW (row),
+                                                    gs_plugin_loader_get_network_available 
(self->plugin_loader));
        }
 
        /* only show the button if there are more to show */
@@ -1283,6 +1285,8 @@ gs_shell_details_refresh_reviews (GsShellDetails *self)
 
        /* show the button only if the user never reviewed */
        gtk_widget_set_visible (self->button_review, show_review_button);
+       gtk_widget_set_sensitive (self->button_review,
+                                 gs_plugin_loader_get_network_available (self->plugin_loader));
 }
 
 static void
@@ -1984,6 +1988,14 @@ gs_shell_details_license_unknown_cb (GtkWidget *widget, GsShellDetails *self)
        gtk_widget_show (self->popover_license_unknown);
 }
 
+static void
+gs_shell_details_network_available_notify_cb (GsPluginLoader *plugin_loader,
+                                             GParamSpec *pspec,
+                                             GsShellDetails *self)
+{
+       gs_shell_details_refresh_reviews (self);
+}
+
 void
 gs_shell_details_setup (GsShellDetails *self,
                        GsShell *shell,
@@ -2009,6 +2021,11 @@ gs_shell_details_setup (GsShellDetails *self,
                          G_CALLBACK (gs_shell_details_write_review_cb),
                          self);
 
+       /* hide some UI when offline */
+       g_signal_connect_object (self->plugin_loader, "notify::network-available",
+                                G_CALLBACK (gs_shell_details_network_available_notify_cb),
+                                self, 0);
+
        /* setup details */
        g_signal_connect (self->button_install, "clicked",
                          G_CALLBACK (gs_shell_details_app_install_button_cb),


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