[gnome-photos] dlna: Stay in remote-display mode after a DMR has been selected



commit 684c9094b17881cfe33c0bd885ab0b9b74465d6b
Author: Emanuele Aina <emanuele aina collabora com>
Date:   Fri Jun 21 22:17:31 2013 +0200

    dlna: Stay in remote-display mode after a DMR has been selected
    
    Once an item has been sent to a remote display, add a big button with
    the name of the current renderer in the main toolbar and, until the user
    does not click it, treat all subsequent item selections as requests to
    push to the selected item to the remote display.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=701775

 src/photos-main-toolbar.c   |  106 +++++++++++++++++++++++++++++++++++++++++++
 src/photos-view-container.c |   16 ++++++-
 2 files changed, 121 insertions(+), 1 deletions(-)
---
diff --git a/src/photos-main-toolbar.c b/src/photos-main-toolbar.c
index 75cbd14..95066c1 100644
--- a/src/photos-main-toolbar.c
+++ b/src/photos-main-toolbar.c
@@ -36,6 +36,7 @@
 #include "photos-item-manager.h"
 #include "photos-main-toolbar.h"
 #include "photos-mode-controller.h"
+#include "photos-remote-display-manager.h"
 #include "photos-selection-controller.h"
 #include "photos-source-manager.h"
 
@@ -44,12 +45,14 @@ struct _PhotosMainToolbarPrivate
 {
   GSimpleAction *gear_menu;
   GtkWidget *coll_back_button;
+  GtkWidget *remote_display_button;
   GtkWidget *selection_menu;
   GtkWidget *toolbar;
   PhotosBaseManager *col_mngr;
   PhotosBaseManager *item_mngr;
   PhotosBaseManager *src_mngr;
   PhotosModeController *mode_cntrlr;
+  PhotosRemoteDisplayManager *remote_mngr;
   PhotosSelectionController *sel_cntrlr;
   PhotosWindowMode old_mode;
   gulong collection_id;
@@ -207,6 +210,48 @@ photos_main_toolbar_select_button_clicked (GtkButton *button, gpointer user_data
 
 
 static void
+photos_main_toolbar_remote_display_button_clicked (GtkButton *button,
+                                                   gpointer user_data)
+{
+  PhotosMainToolbar *self = PHOTOS_MAIN_TOOLBAR (user_data);
+  PhotosMainToolbarPrivate *priv = self->priv;
+
+  photos_remote_display_manager_stop (priv->remote_mngr);
+}
+
+
+static void
+photos_main_toolbar_add_remote_display_button (PhotosMainToolbar *self)
+{
+  PhotosMainToolbarPrivate *priv = self->priv;
+  PhotosDlnaRenderer *renderer;
+  GtkLabel *label;
+  gchar *text;
+  const gchar *name;
+
+  if (priv->remote_display_button != NULL)
+    gtk_widget_destroy (priv->remote_display_button);
+
+  renderer = photos_remote_display_manager_get_renderer (priv->remote_mngr);
+  name = photos_dlna_renderer_get_friendly_name (renderer);
+  text = g_markup_printf_escaped ("Displaying on <b>%s</b>", name);
+
+  priv->remote_display_button = gd_header_simple_button_new ();
+  gd_header_button_set_label (GD_HEADER_BUTTON (priv->remote_display_button), text);
+  gd_header_button_set_use_markup (GD_HEADER_BUTTON (priv->remote_display_button), TRUE);
+  label = GTK_LABEL (gtk_bin_get_child (GTK_BIN (priv->remote_display_button)));
+  gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_MIDDLE);
+  gtk_widget_set_margin_right (priv->remote_display_button, 12);
+  gd_header_bar_pack_start (GD_HEADER_BAR (priv->toolbar), priv->remote_display_button);
+  gtk_widget_show_all (priv->remote_display_button);
+
+  g_signal_connect (priv->remote_display_button, "clicked",
+                    G_CALLBACK (photos_main_toolbar_remote_display_button_clicked), self);
+  g_free (text);
+}
+
+
+static void
 photos_main_toolbar_add_selection_button (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
@@ -247,6 +292,12 @@ photos_main_toolbar_clear_state_data (PhotosMainToolbar *self)
       priv->coll_back_button = NULL;
     }
 
+  if (priv->remote_display_button != NULL)
+    {
+      gtk_widget_destroy (priv->remote_display_button);
+      priv->remote_display_button = NULL;
+    }
+
   if (priv->collection_id != 0)
     {
       g_signal_handler_disconnect (priv->col_mngr, priv->collection_id);
@@ -331,6 +382,24 @@ photos_main_toolbar_populate_for_collections (PhotosMainToolbar *self)
 
 
 static void
+photos_main_toolbar_update_remote_display_button (PhotosMainToolbar *self)
+{
+  PhotosMainToolbarPrivate *priv = self->priv;
+  PhotosWindowMode window_mode;
+  gboolean selection_mode, active;
+
+  selection_mode = photos_selection_controller_get_selection_mode (priv->sel_cntrlr);
+  window_mode = photos_mode_controller_get_window_mode (priv->mode_cntrlr);
+  active = photos_remote_display_manager_is_active (priv->remote_mngr);
+
+  if (active && !selection_mode && window_mode != PHOTOS_WINDOW_MODE_PREVIEW)
+    photos_main_toolbar_add_remote_display_button (self);
+  else
+    g_clear_pointer (&priv->remote_display_button, gtk_widget_destroy);
+}
+
+
+static void
 photos_main_toolbar_populate_for_favorites (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
@@ -437,6 +506,8 @@ photos_main_toolbar_reset_toolbar_mode (PhotosMainToolbar *self)
   else if (window_mode == PHOTOS_WINDOW_MODE_PREVIEW)
     photos_main_toolbar_populate_for_preview (self);
 
+  photos_main_toolbar_update_remote_display_button (self);
+
   photos_main_toolbar_set_toolbar_title (self);
   gtk_widget_show_all (priv->toolbar);
 }
@@ -480,6 +551,7 @@ photos_main_toolbar_dispose (GObject *object)
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->src_mngr);
   g_clear_object (&priv->mode_cntrlr);
+  g_clear_object (&priv->remote_mngr);
   g_clear_object (&priv->sel_cntrlr);
 
   G_OBJECT_CLASS (photos_main_toolbar_parent_class)->dispose (object);
@@ -487,6 +559,29 @@ photos_main_toolbar_dispose (GObject *object)
 
 
 static void
+photos_main_toolbar_share_changed_cb (PhotosMainToolbar          *self,
+                                      PhotosDlnaRenderer         *renderer,
+                                      PhotosBaseItem             *item,
+                                      PhotosRemoteDisplayManager *remote_mngr)
+{
+  photos_main_toolbar_update_remote_display_button (self);
+}
+
+
+static void
+photos_main_toolbar_share_error_cb (PhotosMainToolbar          *self,
+                                    PhotosDlnaRenderer         *renderer,
+                                    PhotosBaseItem             *item,
+                                    GError                     *error,
+                                    PhotosRemoteDisplayManager *remote_mngr)
+{
+  photos_main_toolbar_update_remote_display_button (self);
+
+  g_warning ("Error sharing item with remote display: %s", error->message);
+}
+
+
+static void
 photos_main_toolbar_init (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv;
@@ -542,6 +637,17 @@ photos_main_toolbar_init (PhotosMainToolbar *self)
                                                       G_CALLBACK (photos_main_toolbar_reset_toolbar_mode),
                                                       self);
 
+  priv->remote_mngr = photos_remote_display_manager_dup_singleton ();
+  g_signal_connect_object (priv->remote_mngr, "share-began",
+                           G_CALLBACK (photos_main_toolbar_share_changed_cb),
+                           self, G_CONNECT_SWAPPED);
+  g_signal_connect_object (priv->remote_mngr, "share-ended",
+                           G_CALLBACK (photos_main_toolbar_share_changed_cb),
+                           self, G_CONNECT_SWAPPED);
+  g_signal_connect_object (priv->remote_mngr, "share-error",
+                           G_CALLBACK (photos_main_toolbar_share_error_cb),
+                           self, G_CONNECT_SWAPPED);
+
   photos_main_toolbar_reset_toolbar_mode (self);
 }
 
diff --git a/src/photos-view-container.c b/src/photos-view-container.c
index 6628043..8969346 100644
--- a/src/photos-view-container.c
+++ b/src/photos-view-container.c
@@ -30,6 +30,7 @@
 #include "photos-enums.h"
 #include "photos-item-manager.h"
 #include "photos-load-more-button.h"
+#include "photos-remote-display-manager.h"
 #include "photos-selection-controller.h"
 #include "photos-tracker-collections-controller.h"
 #include "photos-tracker-favorites-controller.h"
@@ -46,6 +47,7 @@ struct _PhotosViewContainerPrivate
   GtkWidget *load_more;
   PhotosBaseManager *item_mngr;
   PhotosModeController *mode_cntrlr;
+  PhotosRemoteDisplayManager *remote_mngr;
   PhotosSelectionController *sel_cntrlr;
   PhotosTrackerController *trk_cntrlr;
   PhotosWindowMode mode;
@@ -163,7 +165,16 @@ photos_view_container_item_activated (GdMainView *main_view,
                                       gpointer user_data)
 {
   PhotosViewContainer *self = PHOTOS_VIEW_CONTAINER (user_data);
-  photos_base_manager_set_active_object_by_id (self->priv->item_mngr, id);
+  PhotosViewContainerPrivate *priv = self->priv;
+  GObject *object;
+
+  object = photos_base_manager_get_object_by_id (priv->item_mngr, id);
+
+  if (!photos_base_item_is_collection (PHOTOS_BASE_ITEM (object)) &&
+      photos_remote_display_manager_is_active (priv->remote_mngr))
+    photos_remote_display_manager_render (priv->remote_mngr, PHOTOS_BASE_ITEM (object));
+  else
+    photos_base_manager_set_active_object (priv->item_mngr, object);
 }
 
 
@@ -291,6 +302,8 @@ photos_view_container_constructed (GObject *object)
                     G_CALLBACK (photos_view_container_window_mode_changed),
                     self);
 
+  priv->remote_mngr = photos_remote_display_manager_dup_singleton ();
+
   switch (priv->mode)
     {
     case PHOTOS_WINDOW_MODE_COLLECTIONS:
@@ -346,6 +359,7 @@ photos_view_container_dispose (GObject *object)
   g_clear_object (&priv->model);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->mode_cntrlr);
+  g_clear_object (&priv->remote_mngr);
   g_clear_object (&priv->sel_cntrlr);
   g_clear_object (&priv->trk_cntrlr);
 


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