[totem] main: Remove sidebar drop-down item



commit b2cd9c31c991a59d21e8d9684098d1947fa0bc86
Author: Bastien Nocera <hadess hadess net>
Date:   Thu Jun 9 18:29:54 2011 +0100

    main: Remove sidebar drop-down item
    
    And add a menu item for each sidebar element in the View menu.

 data/totem.ui                       |    3 +-
 src/Makefile.am                     |    2 -
 src/ev-sidebar.c                    |  336 -----------------------------------
 src/ev-sidebar.h                    |   76 --------
 src/plugins/publish/totem-publish.c |   10 +-
 src/totem-object.c                  |   23 ++--
 src/totem-sidebar.c                 |  174 +++++++++++++++----
 src/totem-sidebar.h                 |   16 ++-
 8 files changed, 175 insertions(+), 465 deletions(-)
---
diff --git a/data/totem.ui b/data/totem.ui
index 3f1ffaf..83c0bc6 100644
--- a/data/totem.ui
+++ b/data/totem.ui
@@ -450,7 +450,8 @@
                <placeholder name="placeholder"/>
             </menu>
             <separator/>
-            <menuitem name="sidebar" action="sidebar"/>         
+            <menuitem name="sidebar" action="sidebar"/>
+            <placeholder name="sidebars-placeholder"/>
          </menu>
          <menu name="go" action="go-menu">
             <menuitem name="dvd-root-menu" action="dvd-root-menu"/>
diff --git a/src/Makefile.am b/src/Makefile.am
index 5eb7099..e4edd6e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -85,8 +85,6 @@ libtotem_la_SOURCES = \
 	totem-menu.h			\
 	totem-uri.c			\
 	totem-uri.h			\
-	ev-sidebar.c			\
-	ev-sidebar.h			\
 	totem-subtitle-encoding.c	\
 	totem-subtitle-encoding.h	\
 	totem-profile.h			\
diff --git a/src/plugins/publish/totem-publish.c b/src/plugins/publish/totem-publish.c
index 357b249..91db545 100644
--- a/src/plugins/publish/totem-publish.c
+++ b/src/plugins/publish/totem-publish.c
@@ -45,7 +45,6 @@
 #include <libpeas/peas-activatable.h>
 #include <libpeas-gtk/peas-gtk-configurable.h>
 
-#include "ev-sidebar.h"
 #include "totem-plugin.h"
 #include "totem-private.h"
 #include "totem-dirs.h"
@@ -391,7 +390,8 @@ totem_publish_plugin_load_playlist (TotemPublishPlugin   *self,
 		if (error)
 			goto out;
 
-		ev_sidebar_set_current_page (EV_SIDEBAR (self->priv->totem->sidebar), "playlist");
+		/* FIXME
+		ev_sidebar_set_current_page (EV_SIDEBAR (self->priv->totem->sidebar), "playlist"); */
 		totem_playlist_clear (self->priv->totem->playlist);
 
 		for (i = 0; i < n_entries; ++i) {
@@ -549,8 +549,8 @@ impl_activate (PeasActivatable *plugin)
 	epc_service_monitor_set_skip_our_own (priv->monitor, TRUE);
 
 	/* Translators: computers on the local network which are publishing their playlists over the network */
-	ev_sidebar_add_page (EV_SIDEBAR (priv->totem->sidebar), "neighbours", _("Neighbors"),
-			     totem_publish_plugin_create_neigbours_page (self, builder));
+	totem_add_sidebar_page (priv->totem, "neighbours", _("Neighbors"),
+				totem_publish_plugin_create_neigbours_page (self, builder));
 	g_object_unref (builder);
 
 	priv->publisher = epc_publisher_new (service_name, "totem", NULL);
@@ -626,7 +626,7 @@ impl_deactivate (PeasActivatable *plugin)
 	priv->gsettings = NULL;
 
 	if (priv->totem) {
-		ev_sidebar_remove_page (EV_SIDEBAR (priv->totem->sidebar), "neighbours");
+		totem_remove_sidebar_page (priv->totem, "neighbours");
 
 		g_object_unref (priv->totem);
 		priv->totem = NULL;
diff --git a/src/totem-object.c b/src/totem-object.c
index 0b14197..e620233 100644
--- a/src/totem-object.c
+++ b/src/totem-object.c
@@ -58,7 +58,6 @@
 #include "totemobject-marshal.h"
 #include "totem-private.h"
 #include "totem-plugins-engine.h"
-#include "ev-sidebar.h"
 #include "totem-playlist.h"
 #include "bacon-video-widget.h"
 #include "totem-statusbar.h"
@@ -659,14 +658,15 @@ totem_object_set_current_subtitle (TotemObject *totem, const char *subtitle_uri)
  **/
 void
 totem_object_add_sidebar_page (TotemObject *totem,
-			const char *page_id,
-			const char *title,
-			GtkWidget *main_widget)
+			       const char *page_id,
+			       const char *title,
+			       GtkWidget *main_widget)
 {
-	ev_sidebar_add_page (EV_SIDEBAR (totem->sidebar),
-			     page_id,
-			     title,
-			     main_widget);
+	totem_sidebar_add_page (totem,
+				page_id,
+				title,
+				NULL,
+				main_widget);
 }
 
 /**
@@ -682,8 +682,7 @@ void
 totem_object_remove_sidebar_page (TotemObject *totem,
 			   const char *page_id)
 {
-	ev_sidebar_remove_page (EV_SIDEBAR (totem->sidebar),
-				page_id);
+	totem_sidebar_remove_page (totem, page_id);
 }
 
 /**
@@ -3823,8 +3822,8 @@ window_key_press_event_cb (GtkWidget *win, GdkEventKey *event, TotemObject *tote
 		case GDK_KEY_l:
 		case GDK_KEY_q:
 		case GDK_KEY_Q:
-		case GDK_KEY_S:
-		case GDK_KEY_s:
+//		case GDK_KEY_S:
+//		case GDK_KEY_s:
 		case GDK_KEY_Right:
 		case GDK_KEY_Left:
 		case GDK_KEY_plus:
diff --git a/src/totem-sidebar.c b/src/totem-sidebar.c
index 11c34e2..b94fc24 100644
--- a/src/totem-sidebar.c
+++ b/src/totem-sidebar.c
@@ -27,7 +27,6 @@
 #include "totem.h"
 #include "totem-sidebar.h"
 #include "totem-private.h"
-#include "ev-sidebar.h"
 
 static void
 cb_resize (Totem * totem)
@@ -47,7 +46,7 @@ cb_resize (Totem * totem)
 	gtk_widget_style_get_property (pane, "handle-size", &gvalue_size);
 	handle_size = g_value_get_int (&gvalue_size);
 	g_value_unset (&gvalue_size);
-	
+
 	gtk_widget_get_allocation (totem->sidebar, &allocation);
 	if (totem->sidebar_shown) {
 		w += allocation.width + handle_size;
@@ -81,12 +80,6 @@ totem_sidebar_toggle (Totem *totem, gboolean state)
 	cb_resize(totem);
 }
 
-static void
-toggle_sidebar_from_sidebar (GtkWidget *playlist, Totem *totem)
-{
-	totem_sidebar_toggle (totem, FALSE);
-}
-
 gboolean
 totem_sidebar_is_visible (Totem *totem)
 {
@@ -133,56 +126,175 @@ totem_sidebar_setup (Totem *totem, gboolean visible, const char *page_id)
 {
 	GtkPaned *item;
 	GtkAction *action;
+	GtkUIManager *uimanager;
+	GtkActionGroup *action_group;
 
 	item = GTK_PANED (gtk_builder_get_object (totem->xml, "tmw_main_pane"));
-	totem->sidebar = ev_sidebar_new ();
-	ev_sidebar_add_page (EV_SIDEBAR (totem->sidebar),
-			"playlist", _("Playlist"),
-			GTK_WIDGET (totem->playlist));
-	if (page_id != NULL) {
-		ev_sidebar_set_current_page (EV_SIDEBAR (totem->sidebar),
-				page_id);
-	} else {
-		ev_sidebar_set_current_page (EV_SIDEBAR (totem->sidebar),
-				"playlist");
-	}
-	gtk_paned_pack2 (item, totem->sidebar, FALSE, FALSE);
+	totem->sidebar = gtk_notebook_new ();
+	gtk_notebook_set_show_border (GTK_NOTEBOOK (totem->sidebar), FALSE);
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (totem->sidebar), FALSE);
 
-	totem->sidebar_shown = visible;
+	action_group = gtk_action_group_new ("SidebarActions");
+	uimanager = totem_get_ui_manager (totem);
+	gtk_ui_manager_insert_action_group (uimanager, action_group, -1);
+	g_object_set_data (G_OBJECT (totem->sidebar), "sidebar-action-group", action_group);
 
-	action = gtk_action_group_get_action (totem->main_action_group,
-			"sidebar");
+	totem_sidebar_add_page (totem, "playlist", _("Playlist"), NULL, GTK_WIDGET (totem->playlist));
+	gtk_paned_pack2 (item, totem->sidebar, FALSE, FALSE);
 
+	totem->sidebar_shown = visible;
+	action = gtk_action_group_get_action (totem->main_action_group, "sidebar");
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible);
 
-	/* Signals */
-	g_signal_connect (G_OBJECT (totem->sidebar), "closed",
-			G_CALLBACK (toggle_sidebar_from_sidebar), totem);
-
 	gtk_widget_show_all (totem->sidebar);
 	gtk_widget_realize (totem->sidebar);
 
+	totem_sidebar_set_current_page (totem,
+					page_id ? page_id : "playlist",
+					visible);
+
+
 	if (!visible)
 		gtk_widget_hide (totem->sidebar);
 }
 
+void
+totem_sidebar_add_page (Totem *totem,
+			const char *page_id,
+			const char *label,
+			const char *accelerator,
+			GtkWidget *main_widget)
+{
+	GtkAction *action;
+	GtkActionGroup *action_group;
+	GtkUIManager *uimanager;
+	guint merge_id;
+
+	g_return_if_fail (page_id != NULL);
+	g_return_if_fail (GTK_IS_WIDGET (main_widget));
+
+	g_object_set_data_full (G_OBJECT (main_widget), "sidebar-name",
+				g_strdup (page_id), g_free);
+
+	gtk_notebook_append_page (GTK_NOTEBOOK (totem->sidebar),
+				  main_widget,
+				  NULL);
+
+	/* The properties page already has a menu item in "Movie" */
+	if (g_str_equal (page_id, "properties"))
+		return;
+
+	action = gtk_action_new (page_id,
+				 label,
+				 NULL,
+				 NULL);
+
+	uimanager = totem_get_ui_manager (totem);
+	merge_id = gtk_ui_manager_new_merge_id (uimanager);
+
+	action_group = g_object_get_data (G_OBJECT (totem->sidebar), "sidebar-action-group");
+	gtk_action_group_add_action_with_accel (action_group, action, accelerator);
+	gtk_ui_manager_add_ui (uimanager,
+			       merge_id,
+			       "/ui/tmw-menubar/view/sidebars-placeholder",
+			       page_id,
+			       page_id,
+			       GTK_UI_MANAGER_MENUITEM,
+			       FALSE);
+	g_object_set_data (G_OBJECT (main_widget), "sidebar-menu-merge-id",
+			   GUINT_TO_POINTER (merge_id));
+}
+
+static int
+get_page_num_for_name (Totem *totem,
+		       const char *page_id)
+{
+	int num_pages, i;
+
+	if (page_id == NULL)
+		return -1;
+
+	num_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (totem->sidebar));
+	for (i = 0; i < num_pages; i++) {
+		GtkWidget *widget;
+		const char *name;
+
+		widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (totem->sidebar), i);
+
+		name = g_object_get_data (G_OBJECT (widget), "sidebar-name");
+		if (g_strcmp0 (name, page_id) == 0)
+			return i;
+	}
+
+	return -1;
+}
+
+void
+totem_sidebar_remove_page (Totem *totem,
+			   const char *page_id)
+{
+	GtkUIManager *uimanager;
+	GtkAction *action;
+	GtkActionGroup *action_group;
+	GtkWidget *main_widget;
+	int page_num;
+	guint merge_id;
+	gpointer data;
+
+	page_num = get_page_num_for_name (totem, page_id);
+
+	if (page_num == -1) {
+		g_warning ("Tried to remove sidebar page '%s' but it does not exist", page_id);
+		return;
+	}
+
+	main_widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (totem->sidebar), page_num);
+	data = g_object_get_data (G_OBJECT (main_widget), "sidebar-menu-merge-id");
+	merge_id = GPOINTER_TO_UINT (data);
+
+	gtk_notebook_remove_page (GTK_NOTEBOOK (totem->sidebar), page_num);
+
+	if (data == NULL)
+		return;
+
+	action_group = g_object_get_data (G_OBJECT (totem->sidebar), "sidebar-action-group");
+	uimanager = totem_get_ui_manager (totem);
+	gtk_ui_manager_remove_ui (uimanager, merge_id);
+	action = gtk_action_group_get_action (action_group, page_id);
+	gtk_action_group_remove_action (action_group, action);
+}
+
 char *
 totem_sidebar_get_current_page (Totem *totem)
 {
+	int current_page;
+	GtkWidget *widget;
+
 	if (totem->sidebar == NULL)
 		return NULL;
-	return ev_sidebar_get_current_page (EV_SIDEBAR (totem->sidebar));
+
+	current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (totem->sidebar));
+	widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (totem->sidebar), current_page);
+
+	return g_strdup (g_object_get_data (G_OBJECT (widget), "sidebar-name"));
 }
 
 void
 totem_sidebar_set_current_page (Totem *totem,
-				const char *name,
+				const char *page_id,
 				gboolean force_visible)
 {
-	if (name == NULL)
+	int page_num;
+
+	page_num = get_page_num_for_name (totem, page_id);
+
+	if (page_num == -1) {
+		g_warning ("Tried to set sidebar page '%s' but it does not exist", page_id);
 		return;
+	}
+
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (totem->sidebar), page_num);
 
-	ev_sidebar_set_current_page (EV_SIDEBAR (totem->sidebar), name);
 	if (force_visible != FALSE)
 		totem_sidebar_toggle (totem, TRUE);
 }
diff --git a/src/totem-sidebar.h b/src/totem-sidebar.h
index 611cc06..a89a9e6 100644
--- a/src/totem-sidebar.h
+++ b/src/totem-sidebar.h
@@ -25,17 +25,29 @@
 
 G_BEGIN_DECLS
 
-void totem_sidebar_setup (Totem *totem, gboolean visible,
+void totem_sidebar_setup (Totem *totem,
+			  gboolean visible,
 			  const char *page_id);
+
 void totem_sidebar_toggle (Totem *totem, gboolean state);
 void totem_sidebar_set_visibility (Totem *totem, gboolean visible);
 gboolean totem_sidebar_is_visible (Totem *totem);
+
 gboolean totem_sidebar_is_focused (Totem *totem, gboolean *handles_kbd);
+
 char *totem_sidebar_get_current_page (Totem *totem);
 void totem_sidebar_set_current_page (Totem *totem,
-				     const char *name,
+				     const char *page_id,
 				     gboolean force_visible);
 
+void totem_sidebar_add_page (Totem *totem,
+			     const char *page_id,
+			     const char *label,
+			     const char *accelerator,
+			     GtkWidget *main_widget);
+void totem_sidebar_remove_page (Totem *totem,
+				const char *page_id);
+
 G_END_DECLS
 
 #endif /* TOTEM_SIDEBAR_H */



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