[rhythmbox] new location for plugin UI elements: right side pane (bug #584182)



commit 48e0d44c14ece84f214c2335e3362ff5409041e4
Author: John Iacona <plate0salad gmail com>
Date:   Mon Jun 8 00:19:49 2009 +1000

    new location for plugin UI elements: right side pane (bug #584182)
    
    This is slightly more complicated than the existing UI locations as it
    has a user-controllable width (via GtkPaned) and needs to be hidden when
    empty.
---
 bindings/python/rb.defs |    1 +
 data/rhythmbox.schemas  |   11 +++++++++++
 lib/rb-preferences.h    |    1 +
 shell/rb-shell.c        |   45 ++++++++++++++++++++++++++++++++++++++++++---
 shell/rb-shell.h        |    1 +
 5 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/bindings/python/rb.defs b/bindings/python/rb.defs
index ef006cb..d55e475 100644
--- a/bindings/python/rb.defs
+++ b/bindings/python/rb.defs
@@ -278,6 +278,7 @@
   (gtype-id "RB_TYPE_SHELL_UI_LOCATION")
   (values
     '("sidebar" "RB_SHELL_UI_LOCATION_SIDEBAR")
+    '("right-sidebar" "RB_SHELL_UI_LOCATION_RIGHT_SIDEBAR")
     '("main-top" "RB_SHELL_UI_LOCATION_MAIN_TOP")
     '("main-bottom" "RB_SHELL_UI_LOCATION_MAIN_BOTTOM")
     '("main-notebook" "RB_SHELL_UI_LOCATION_MAIN_NOTEBOOK")
diff --git a/data/rhythmbox.schemas b/data/rhythmbox.schemas
index dc240f7..52eb5fb 100644
--- a/data/rhythmbox.schemas
+++ b/data/rhythmbox.schemas
@@ -135,6 +135,17 @@
         </locale>
       </schema>
       <schema>
+	<key>/schemas/apps/rhythmbox/state/right_paned_position</key>
+	<applyto>/apps/rhythmbox/state/right_paned_position</applyto>
+	<owner>rhythmbox</owner>
+	<type>int</type>
+	<default>400</default>
+	<locale name="C">
+	  <short>Position of the right pane</short>
+	  <long>Position of the right pane</long>
+	</locale>
+      </schema>
+      <schema>
         <key>/schemas/apps/rhythmbox/state/window_width</key>
         <applyto>/apps/rhythmbox/state/window_width</applyto>
         <owner>rhythmbox</owner>
diff --git a/lib/rb-preferences.h b/lib/rb-preferences.h
index 94b8ed9..6a7dfcb 100644
--- a/lib/rb-preferences.h
+++ b/lib/rb-preferences.h
@@ -43,6 +43,7 @@ G_BEGIN_DECLS
 #define CONF_UI_TOOLBAR_STYLE	CONF_PREFIX "/ui/toolbar_style"
 #define CONF_UI_SONG_POSITION_SLIDER_HIDDEN  CONF_PREFIX "/ui/song_position_slider_hidden"
 #define CONF_UI_SIDEPANE_HIDDEN CONF_PREFIX "/ui/sourcelist_hidden"
+#define CONF_UI_RSIDEPANE_HIDDEN CONF_PREFIX "/ui/rsidebar_hidden"
 #define CONF_UI_QUEUE_AS_SIDEBAR  CONF_PREFIX "/ui/queue_as_sidebar"
 #define CONF_UI_SMALL_DISPLAY     CONF_PREFIX "/ui/small_display"
 #define CONF_UI_FULLSCREEN     CONF_PREFIX "/ui/fullscreen"
diff --git a/shell/rb-shell.c b/shell/rb-shell.c
index 2d2c23c..6d0c9ad 100644
--- a/shell/rb-shell.c
+++ b/shell/rb-shell.c
@@ -269,8 +269,9 @@ enum
 #define CONF_STATE_WINDOW_HEIGHT    CONF_PREFIX "/state/window_height"
 #define CONF_STATE_SMALL_WIDTH      CONF_PREFIX "/state/small_width"
 #define CONF_STATE_WINDOW_MAXIMIZED CONF_PREFIX "/state/window_maximized"
-#define CONF_STATE_PANED_POSITION   CONF_PREFIX "/state/paned_position"
 #define CONF_STATE_ADD_DIR          CONF_PREFIX "/state/add_dir"
+#define CONF_STATE_PANED_POSITION   CONF_PREFIX "/state/paned_position"
+#define CONF_STATE_RIGHT_PANED_POSITION   CONF_PREFIX "/state/right_paned_position"
 #define CONF_STATE_WINDOW_X_POSITION CONF_PREFIX "/state/window_x_position"
 #define CONF_STATE_WINDOW_Y_POSITION CONF_PREFIX "/state/window_y_position"
 #define CONF_STATE_SOURCELIST_HEIGHT CONF_PREFIX "/state/sourcelist_height"
@@ -301,14 +302,17 @@ struct RBShellPrivate
 
 	GtkWidget *main_vbox;
 	GtkWidget *paned;
+	GtkWidget *right_paned;
 	GtkWidget *sourcelist;
 	GtkWidget *notebook;
 	GtkWidget *queue_paned;
 	GtkWidget *queue_sidebar;
 
 	GtkBox *sidebar_container;
+	GtkBox *right_sidebar_container;
 	GtkBox *top_container;
 	GtkBox *bottom_container;
+	guint right_sidebar_widget_count;
 
 	GList *sources;
 	GHashTable *sources_hash;
@@ -377,6 +381,7 @@ struct RBShellPrivate
 	gint window_x;
 	gint window_y;
 	gint paned_position;
+	gint right_paned_position;
 	gint sourcelist_height;
 };
 
@@ -1115,9 +1120,17 @@ construct_widgets (RBShell *shell)
 	shell->priv->top_container = GTK_BOX (gtk_vbox_new (FALSE, 0));
 	shell->priv->bottom_container = GTK_BOX (gtk_vbox_new (FALSE, 0));
 	shell->priv->sidebar_container = GTK_BOX (gtk_vbox_new (FALSE, 0));
+	shell->priv->right_sidebar_container = GTK_BOX (gtk_vbox_new (FALSE, 0));
 
 	/* set up sidebars */
 	shell->priv->paned = gtk_hpaned_new ();
+	shell->priv->right_paned = gtk_hpaned_new ();
+	gtk_widget_show_all (shell->priv->right_paned);
+	g_signal_connect_object (G_OBJECT (shell->priv->right_paned),
+				 "size-allocate",
+				 G_CALLBACK (paned_size_allocate_cb),
+				 shell, 0);
+	gtk_widget_set_no_show_all (shell->priv->right_paned, TRUE);
 	{
 		GtkWidget *vbox2 = gtk_vbox_new (FALSE, 0);
 
@@ -1143,13 +1156,21 @@ construct_widgets (RBShell *shell)
 				    GTK_WIDGET (shell->priv->bottom_container),
 				    FALSE, FALSE, 0);
 
-		gtk_box_pack_start (shell->priv->sidebar_container, shell->priv->queue_paned,
+		gtk_paned_pack1 (GTK_PANED (shell->priv->right_paned),
+				 vbox2, TRUE, TRUE);
+		gtk_paned_pack2 (GTK_PANED (shell->priv->right_paned),
+				 GTK_WIDGET (shell->priv->right_sidebar_container),
+				 FALSE, TRUE);
+		gtk_widget_hide (GTK_WIDGET(shell->priv->right_sidebar_container));
+
+		gtk_box_pack_start (shell->priv->sidebar_container,
+				    shell->priv->queue_paned,
 				    TRUE, TRUE, 0);
 		gtk_paned_pack1 (GTK_PANED (shell->priv->paned),
 				 GTK_WIDGET (shell->priv->sidebar_container),
 				 FALSE, TRUE);
 		gtk_paned_pack2 (GTK_PANED (shell->priv->paned),
-				 vbox2,
+				 shell->priv->right_paned,
 				 TRUE, TRUE);
 		gtk_widget_show (vbox2);
 	}
@@ -1367,6 +1388,7 @@ rb_shell_constructor (GType type,
 	shell->priv->window_x = eel_gconf_get_integer (CONF_STATE_WINDOW_X_POSITION);
 	shell->priv->window_y = eel_gconf_get_integer (CONF_STATE_WINDOW_Y_POSITION);
 	shell->priv->paned_position = eel_gconf_get_integer (CONF_STATE_PANED_POSITION);
+	shell->priv->right_paned_position = eel_gconf_get_integer (CONF_STATE_RIGHT_PANED_POSITION);
 	shell->priv->sourcelist_height = eel_gconf_get_integer (CONF_STATE_SOURCELIST_HEIGHT);
 	shell->priv->statusbar_hidden = eel_gconf_get_boolean (CONF_UI_STATUSBAR_HIDDEN);
 
@@ -2635,6 +2657,8 @@ smalldisplay_changed_cb (GConfClient *client,
 static void
 rb_shell_sync_paned (RBShell *shell)
 {
+	gtk_paned_set_position (GTK_PANED (shell->priv->right_paned),
+				shell->priv->right_paned_position);
 	gtk_paned_set_position (GTK_PANED (shell->priv->paned),
 				shell->priv->paned_position);
 	gtk_paned_set_position (GTK_PANED (shell->priv->queue_paned),
@@ -2647,8 +2671,11 @@ paned_size_allocate_cb (GtkWidget *widget,
 		        RBShell *shell)
 {
 	shell->priv->paned_position = gtk_paned_get_position (GTK_PANED (shell->priv->paned));
+	shell->priv->right_paned_position = gtk_paned_get_position (GTK_PANED (shell->priv->right_paned));
 	rb_debug ("paned position %d", shell->priv->paned_position);
+	rb_debug ("right_paned position %d", shell->priv->right_paned_position);
 	eel_gconf_set_integer (CONF_STATE_PANED_POSITION, shell->priv->paned_position);
+	eel_gconf_set_integer (CONF_STATE_RIGHT_PANED_POSITION, shell->priv->right_paned_position);
 }
 
 static void
@@ -3220,6 +3247,9 @@ rb_shell_get_box_for_ui_location (RBShell *shell, RBShellUILocation location)
 	case RB_SHELL_UI_LOCATION_SIDEBAR:
 		box = shell->priv->sidebar_container;
 		break;
+	case RB_SHELL_UI_LOCATION_RIGHT_SIDEBAR:
+		box = shell->priv->right_sidebar_container;
+		break;
 	case RB_SHELL_UI_LOCATION_MAIN_TOP:
 		box = shell->priv->top_container;
 		break;
@@ -3244,6 +3274,10 @@ rb_shell_add_widget (RBShell *shell, GtkWidget *widget, RBShellUILocation locati
 					  widget,
 					  gtk_label_new (""));
 		break;
+	case RB_SHELL_UI_LOCATION_RIGHT_SIDEBAR:
+		if (!shell->priv->right_sidebar_widget_count)
+			gtk_widget_show (GTK_WIDGET (shell->priv->right_sidebar_container));
+		shell->priv->right_sidebar_widget_count++;
 	default:
 		box = rb_shell_get_box_for_ui_location (shell, location);
 		g_return_if_fail (box != NULL);
@@ -3267,6 +3301,10 @@ rb_shell_remove_widget (RBShell *shell, GtkWidget *widget, RBShellUILocation loc
 		gtk_notebook_remove_page (GTK_NOTEBOOK (shell->priv->notebook),
 					  page_num);
 		break;
+	case RB_SHELL_UI_LOCATION_RIGHT_SIDEBAR:
+		shell->priv->right_sidebar_widget_count--;
+		if (!shell->priv->right_sidebar_widget_count)
+			gtk_widget_hide (GTK_WIDGET (shell->priv->right_sidebar_container));
 	default:
 		box = rb_shell_get_box_for_ui_location (shell, location);
 		g_return_if_fail (box != NULL);
@@ -3310,6 +3348,7 @@ rb_shell_ui_location_get_type (void)
 	if (etype == 0)	{
 		static const GEnumValue values[] = {
 			ENUM_ENTRY (RB_SHELL_UI_LOCATION_SIDEBAR, "Sidebar"),
+			ENUM_ENTRY (RB_SHELL_UI_LOCATION_RIGHT_SIDEBAR, "Right Sidebar"),
 			ENUM_ENTRY (RB_SHELL_UI_LOCATION_MAIN_TOP, "Main Top"),
 			ENUM_ENTRY (RB_SHELL_UI_LOCATION_MAIN_BOTTOM, "Main Bottom"),
 			ENUM_ENTRY (RB_SHELL_UI_LOCATION_MAIN_NOTEBOOK, "Main Notebook"),
diff --git a/shell/rb-shell.h b/shell/rb-shell.h
index fca025c..b637927 100644
--- a/shell/rb-shell.h
+++ b/shell/rb-shell.h
@@ -60,6 +60,7 @@ GQuark rb_shell_error_quark (void);
 typedef enum
 {
 	RB_SHELL_UI_LOCATION_SIDEBAR,
+	RB_SHELL_UI_LOCATION_RIGHT_SIDEBAR,
 	RB_SHELL_UI_LOCATION_MAIN_TOP,
 	RB_SHELL_UI_LOCATION_MAIN_BOTTOM,
 	RB_SHELL_UI_LOCATION_MAIN_NOTEBOOK



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