summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--data/playlist.glade2
-rw-r--r--src/ev-sidebar.c402
3 files changed, 124 insertions, 290 deletions
diff --git a/ChangeLog b/ChangeLog
index f7337988b..466bbb799 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-06-29 Jan Arne Petersen <jpetersen@jpetersen.org>
+
+ * data/playlist.glade:
+ * src/ev-sidebar.c: (ev_sidebar_destroy),
+ (ev_sidebar_combobox_changed_cb), (ev_sidebar_init),
+ (ev_sidebar_get_current_page), (ev_sidebar_get_iter_for_page_id),
+ (ev_sidebar_set_current_page), (ev_sidebar_add_page),
+ (ev_sidebar_remove_page): Use a default GtkComboBox instead of the
+ custom button menu combination (Closes #397776)
+
2007-06-28 Christian Persch <chpe@gnome.org>
* src/totem.c:
diff --git a/data/playlist.glade b/data/playlist.glade
index 57bce232b..6ec6a3754 100644
--- a/data/playlist.glade
+++ b/data/playlist.glade
@@ -56,7 +56,7 @@
<child>
<widget class="GtkVBox" id="vbox4">
- <property name="border_width">5</property>
+ <property name="border_width">0</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">6</property>
diff --git a/src/ev-sidebar.c b/src/ev-sidebar.c
index 57ba6327e..eed906cd2 100644
--- a/src/ev-sidebar.c
+++ b/src/ev-sidebar.c
@@ -1,9 +1,11 @@
/* this file is part of evince, a gnome document viewer
*
* Copyright (C) 2004 Red Hat, Inc.
+ * (C) 2007 Jan Arne Petersen
*
- * Author:
+ * Authors:
* Jonathan Blandford <jrb@alum.mit.edu>
+ * Jan Arne Petersen <jpetersen@jpetersen.org>
*
* Evince is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
@@ -34,31 +36,16 @@
#include "ev-sidebar.h"
-typedef struct
-{
- char *id;
- char *title;
- GtkWidget *main_widget;
-} EvSidebarPage;
-
enum
{
PAGE_COLUMN_ID,
PAGE_COLUMN_TITLE,
- PAGE_COLUMN_MENU_ITEM,
- PAGE_COLUMN_MAIN_WIDGET,
- PAGE_COLUMN_NOTEBOOK_INDEX,
PAGE_COLUMN_NUM_COLS
};
struct _EvSidebarPrivate {
+ GtkWidget *combobox;
GtkWidget *notebook;
- GtkWidget *menu;
- GtkWidget *hbox;
- GtkWidget *label;
-
- GtkTreeModel *page_model;
- char *current;
};
enum {
@@ -76,16 +63,6 @@ G_DEFINE_TYPE (EvSidebar, ev_sidebar, GTK_TYPE_VBOX)
static void
ev_sidebar_destroy (GtkObject *object)
{
- EvSidebar *ev_sidebar = EV_SIDEBAR (object);
-
- g_free (ev_sidebar->priv->current);
- ev_sidebar->priv->current = NULL;
-
- if (ev_sidebar->priv->menu) {
- gtk_menu_detach (GTK_MENU (ev_sidebar->priv->menu));
- ev_sidebar->priv->menu = NULL;
- }
-
(* GTK_OBJECT_CLASS (ev_sidebar_parent_class)->destroy) (object);
}
@@ -116,78 +93,6 @@ ev_sidebar_class_init (EvSidebarClass *ev_sidebar_class)
}
static void
-ev_sidebar_menu_position_under (GtkMenu *menu,
- int *x,
- int *y,
- gboolean *push_in,
- gpointer user_data)
-{
- GtkWidget *widget;
-
- g_return_if_fail (GTK_IS_BUTTON (user_data));
- g_return_if_fail (GTK_WIDGET_NO_WINDOW (user_data));
-
- widget = GTK_WIDGET (user_data);
-
- gdk_window_get_origin (widget->window, x, y);
-
- *x += widget->allocation.x;
- *y += widget->allocation.y + widget->allocation.height;
-
- *push_in = FALSE;
-}
-
-static gboolean
-ev_sidebar_select_button_press_cb (GtkWidget *widget,
- GdkEventButton *event,
- gpointer user_data)
-{
- EvSidebar *ev_sidebar = EV_SIDEBAR (user_data);
-
- if (event->button == 1) {
- GtkRequisition requisition;
- gint width;
-
- width = widget->allocation.width;
- gtk_widget_set_size_request (ev_sidebar->priv->menu, -1, -1);
- gtk_widget_size_request (ev_sidebar->priv->menu, &requisition);
- gtk_widget_set_size_request (ev_sidebar->priv->menu,
- MAX (width, requisition.width), -1);
- gtk_widget_grab_focus (widget);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
- gtk_menu_popup (GTK_MENU (ev_sidebar->priv->menu),
- NULL, NULL, ev_sidebar_menu_position_under, widget,
- event->button, event->time);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-ev_sidebar_select_button_key_press_cb (GtkWidget *widget,
- GdkEventKey *event,
- gpointer user_data)
-{
- EvSidebar *ev_sidebar = EV_SIDEBAR (user_data);
-
- if (event->keyval == GDK_space ||
- event->keyval == GDK_KP_Space ||
- event->keyval == GDK_Return ||
- event->keyval == GDK_KP_Enter) {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
- gtk_menu_popup (GTK_MENU (ev_sidebar->priv->menu),
- NULL, NULL, ev_sidebar_menu_position_under, widget,
- 1, event->time);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
ev_sidebar_close_clicked_cb (GtkWidget *widget,
gpointer user_data)
{
@@ -199,117 +104,75 @@ ev_sidebar_close_clicked_cb (GtkWidget *widget,
}
static void
-ev_sidebar_menu_deactivate_cb (GtkWidget *widget,
- gpointer user_data)
-{
- GtkWidget *menu_button;
-
- menu_button = GTK_WIDGET (user_data);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (menu_button), FALSE);
-}
-
-static void
-ev_sidebar_menu_detach_cb (GtkWidget *widget,
- GtkMenu *menu)
-{
- EvSidebar *ev_sidebar = EV_SIDEBAR (widget);
-
- ev_sidebar->priv->menu = NULL;
-}
-
-static void
-ev_sidebar_menu_item_activate_cb (GtkWidget *widget,
- gpointer user_data)
+ev_sidebar_combobox_changed_cb (GtkComboBox *combo_box,
+ gpointer user_data)
{
EvSidebar *ev_sidebar = EV_SIDEBAR (user_data);
+ GtkTreeModel *model;
GtkTreeIter iter;
- GtkWidget *menu_item, *item;
- gchar *title, *page_id;
- gboolean valid;
- gint index;
- menu_item = gtk_menu_get_active (GTK_MENU (ev_sidebar->priv->menu));
- valid = gtk_tree_model_get_iter_first (ev_sidebar->priv->page_model, &iter);
+ model = gtk_combo_box_get_model (combo_box);
- while (valid) {
- gtk_tree_model_get (ev_sidebar->priv->page_model,
- &iter,
- PAGE_COLUMN_ID, &page_id,
- PAGE_COLUMN_TITLE, &title,
- PAGE_COLUMN_MENU_ITEM, &item,
- PAGE_COLUMN_NOTEBOOK_INDEX, &index,
- -1);
-
- if (item == menu_item) {
- gtk_notebook_set_current_page
- (GTK_NOTEBOOK (ev_sidebar->priv->notebook), index);
- gtk_label_set_text (GTK_LABEL (ev_sidebar->priv->label), title);
- g_free (ev_sidebar->priv->current);
- ev_sidebar->priv->current = page_id;
- valid = FALSE;
- } else {
- valid = gtk_tree_model_iter_next (ev_sidebar->priv->page_model, &iter);
- g_free (page_id);
+ if (gtk_combo_box_get_active_iter (combo_box, &iter)) {
+ GtkTreePath *path;
+ gint *indices;
+
+ path = gtk_tree_model_get_path (model, &iter);
+ indices = gtk_tree_path_get_indices (path);
+
+ if (indices != NULL) {
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook), indices[0]);
}
- g_object_unref (item);
- g_free (title);
+
+ gtk_tree_path_free (path);
}
}
static void
ev_sidebar_init (EvSidebar *ev_sidebar)
{
- GtkWidget *hbox;
+ GtkTreeModel *page_model;
+ GtkWidget *vbox, *hbox;
GtkWidget *close_button;
- GtkWidget *select_button;
- GtkWidget *select_hbox;
- GtkWidget *arrow;
+ GtkCellRenderer *renderer;
GtkWidget *image;
ev_sidebar->priv = EV_SIDEBAR_GET_PRIVATE (ev_sidebar);
/* data model */
- ev_sidebar->priv->page_model = (GtkTreeModel *)
+ page_model = (GtkTreeModel *)
gtk_list_store_new (PAGE_COLUMN_NUM_COLS,
G_TYPE_STRING,
G_TYPE_STRING,
GTK_TYPE_WIDGET,
- GTK_TYPE_WIDGET,
G_TYPE_INT);
+ /* create a 6 6 6 0 border with GtkBoxes */
+ hbox = gtk_hbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (ev_sidebar), hbox, TRUE, TRUE, 6);
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), gtk_vbox_new (FALSE, 0), FALSE, FALSE, 0);
+
/* top option menu */
- hbox = gtk_hbox_new (FALSE, 0);
- ev_sidebar->priv->hbox = hbox;
- gtk_box_pack_start (GTK_BOX (ev_sidebar), hbox, FALSE, FALSE, 0);
+ hbox = gtk_hbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
- select_button = gtk_toggle_button_new ();
- gtk_button_set_relief (GTK_BUTTON (select_button), GTK_RELIEF_NONE);
- g_signal_connect (select_button, "button_press_event",
- G_CALLBACK (ev_sidebar_select_button_press_cb),
- ev_sidebar);
- g_signal_connect (select_button, "key_press_event",
- G_CALLBACK (ev_sidebar_select_button_key_press_cb),
+ ev_sidebar->priv->combobox = gtk_combo_box_new_with_model (page_model);
+ g_signal_connect (ev_sidebar->priv->combobox, "changed",
+ G_CALLBACK (ev_sidebar_combobox_changed_cb),
ev_sidebar);
- select_hbox = gtk_hbox_new (FALSE, 0);
-
- ev_sidebar->priv->label = gtk_label_new ("");
- gtk_box_pack_start (GTK_BOX (select_hbox),
- ev_sidebar->priv->label,
- FALSE, FALSE, 0);
- gtk_widget_show (ev_sidebar->priv->label);
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (ev_sidebar->priv->combobox), renderer, TRUE);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (ev_sidebar->priv->combobox), renderer, "text", PAGE_COLUMN_TITLE);
- arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_box_pack_end (GTK_BOX (select_hbox), arrow, FALSE, FALSE, 0);
- gtk_widget_show (arrow);
+ gtk_box_pack_start (GTK_BOX (hbox), ev_sidebar->priv->combobox, TRUE, TRUE, 0);
+ gtk_widget_show (ev_sidebar->priv->combobox);
- gtk_container_add (GTK_CONTAINER (select_button), select_hbox);
- gtk_widget_show (select_hbox);
-
- gtk_box_pack_start (GTK_BOX (hbox), select_button, TRUE, TRUE, 0);
- gtk_widget_show (select_button);
+ g_object_unref (G_OBJECT (page_model));
close_button = gtk_button_new ();
gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
@@ -325,19 +188,10 @@ ev_sidebar_init (EvSidebar *ev_sidebar)
gtk_box_pack_end (GTK_BOX (hbox), close_button, FALSE, FALSE, 0);
gtk_widget_show (close_button);
- ev_sidebar->priv->menu = gtk_menu_new ();
- g_signal_connect (ev_sidebar->priv->menu, "deactivate",
- G_CALLBACK (ev_sidebar_menu_deactivate_cb),
- select_button);
- gtk_menu_attach_to_widget (GTK_MENU (ev_sidebar->priv->menu),
- GTK_WIDGET (ev_sidebar),
- ev_sidebar_menu_detach_cb);
- gtk_widget_show (ev_sidebar->priv->menu);
-
ev_sidebar->priv->notebook = gtk_notebook_new ();
gtk_notebook_set_show_border (GTK_NOTEBOOK (ev_sidebar->priv->notebook), FALSE);
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (ev_sidebar->priv->notebook), FALSE);
- gtk_box_pack_start (GTK_BOX (ev_sidebar), ev_sidebar->priv->notebook,
+ gtk_box_pack_start (GTK_BOX (vbox), ev_sidebar->priv->notebook,
TRUE, TRUE, 0);
gtk_widget_show (ev_sidebar->priv->notebook);
}
@@ -357,64 +211,67 @@ ev_sidebar_new (void)
const char *
ev_sidebar_get_current_page (EvSidebar *ev_sidebar)
{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *id;
+
g_return_val_if_fail (EV_IS_SIDEBAR (ev_sidebar), NULL);
g_return_val_if_fail (ev_sidebar->priv != NULL, NULL);
- return ev_sidebar->priv->current;
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
+
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter)) {
+ gtk_tree_model_get (model, &iter, PAGE_COLUMN_ID, &id, -1);
+
+ return id;
+ }
+
+ return NULL;
}
-static gint
-ev_sidebar_get_index_for_page_id (EvSidebar *ev_sidebar,
- const char *new_page_id,
- GtkWidget **menu_item_ret)
+static gboolean
+ev_sidebar_get_iter_for_page_id (EvSidebar *ev_sidebar,
+ const char *new_page_id,
+ GtkTreeIter *iter)
{
- GtkWidget *menu_item;
+ GtkTreeModel *model;
gboolean valid;
- GtkTreeIter iter;
gchar *page_id;
- gint index;
- valid = gtk_tree_model_get_iter_first (ev_sidebar->priv->page_model, &iter);
+ g_return_val_if_fail (EV_IS_SIDEBAR (ev_sidebar), FALSE);
+ g_return_val_if_fail (ev_sidebar->priv != NULL, FALSE);
+ g_return_val_if_fail (iter != NULL, FALSE);
+
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
+
+ valid = gtk_tree_model_get_iter_first (model, iter);
while (valid) {
- gtk_tree_model_get (ev_sidebar->priv->page_model,
- &iter,
- PAGE_COLUMN_ID, &page_id,
- PAGE_COLUMN_MENU_ITEM, &menu_item,
- PAGE_COLUMN_NOTEBOOK_INDEX, &index,
- -1);
+ gtk_tree_model_get (model, iter, PAGE_COLUMN_ID, &page_id, -1);
if (page_id != NULL && strcmp (new_page_id, page_id) == 0) {
- if (menu_item_ret != NULL)
- *menu_item_ret = menu_item;
g_free (page_id);
- return index;
- } else {
- valid = gtk_tree_model_iter_next (ev_sidebar->priv->page_model, &iter);
+ return TRUE;
}
- g_object_unref (menu_item);
g_free (page_id);
+
+ valid = gtk_tree_model_iter_next (model, iter);
}
- return -1;
+ return FALSE;
}
void
ev_sidebar_set_current_page (EvSidebar *ev_sidebar, const char *new_page_id)
{
- GtkWidget *menu_item;
- gint index;
+ GtkTreeIter iter;
g_return_if_fail (EV_IS_SIDEBAR (ev_sidebar));
g_return_if_fail (new_page_id != NULL);
- if (strcmp (new_page_id, ev_sidebar->priv->current) == 0)
- return;
- index = ev_sidebar_get_index_for_page_id (ev_sidebar, new_page_id, &menu_item);
- if (index >= 0) {
- gtk_menu_set_active (GTK_MENU (ev_sidebar->priv->menu), index);
- gtk_menu_item_activate (GTK_MENU_ITEM (menu_item));
+ if (ev_sidebar_get_iter_for_page_id (ev_sidebar, new_page_id, &iter)) {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter);
}
}
@@ -424,55 +281,29 @@ ev_sidebar_add_page (EvSidebar *ev_sidebar,
const gchar *title,
GtkWidget *main_widget)
{
- GtkTreeIter iter;
- GtkWidget *menu_item;
- gchar *label_title, *new_page_id;
- int index;
+ GtkTreeIter iter, iter2;
+ GtkTreeModel *model;
g_return_if_fail (EV_IS_SIDEBAR (ev_sidebar));
g_return_if_fail (page_id != NULL);
g_return_if_fail (title != NULL);
g_return_if_fail (GTK_IS_WIDGET (main_widget));
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
+
gtk_widget_set_sensitive (GTK_WIDGET (ev_sidebar), TRUE);
-
- index = gtk_notebook_append_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook),
- main_widget, NULL);
-
- menu_item = gtk_image_menu_item_new_with_label (title);
- g_signal_connect (menu_item, "activate",
- G_CALLBACK (ev_sidebar_menu_item_activate_cb),
- ev_sidebar);
- gtk_widget_show (menu_item);
- gtk_menu_shell_append (GTK_MENU_SHELL (ev_sidebar->priv->menu),
- menu_item);
+ gtk_widget_show (main_widget);
+ gtk_notebook_append_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook), main_widget, NULL);
- gtk_list_store_append (GTK_LIST_STORE (ev_sidebar->priv->page_model), &iter);
- gtk_list_store_set (GTK_LIST_STORE (ev_sidebar->priv->page_model), &iter,
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
PAGE_COLUMN_ID, page_id,
PAGE_COLUMN_TITLE, title,
- PAGE_COLUMN_MENU_ITEM, menu_item,
- PAGE_COLUMN_MAIN_WIDGET, main_widget,
- PAGE_COLUMN_NOTEBOOK_INDEX, index,
-1);
- if (ev_sidebar->priv->current == NULL) {
- /* Set the first item added as active */
- gtk_tree_model_get_iter_first (ev_sidebar->priv->page_model, &iter);
- gtk_tree_model_get (ev_sidebar->priv->page_model,
- &iter,
- PAGE_COLUMN_ID, &new_page_id,
- PAGE_COLUMN_TITLE, &label_title,
- PAGE_COLUMN_NOTEBOOK_INDEX, &index,
- -1);
-
- gtk_menu_set_active (GTK_MENU (ev_sidebar->priv->menu), index);
- gtk_label_set_text (GTK_LABEL (ev_sidebar->priv->label), label_title);
- gtk_notebook_set_current_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook),
- index);
- ev_sidebar->priv->current = new_page_id;
- g_free (label_title);
+ if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter2)) {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter);
}
}
@@ -481,43 +312,36 @@ ev_sidebar_remove_page (EvSidebar *ev_sidebar,
const gchar *page_id)
{
GtkTreeIter iter;
- int page_num;
- char *tree_path, *new_page_id;
- GtkWidget *menu_item;
-
- page_num = ev_sidebar_get_index_for_page_id (ev_sidebar, page_id, &menu_item);
- g_return_if_fail (page_num >= 0);
-
- gtk_notebook_remove_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook),
- page_num);
- gtk_widget_destroy (menu_item);
-
- tree_path = g_strdup_printf ("%d", page_num);
- if (gtk_tree_model_get_iter_from_string (ev_sidebar->priv->page_model,
- &iter, tree_path) == FALSE) {
- g_free (tree_path);
- return;
- }
- g_free (tree_path);
+ GtkTreeModel *model;
+
+ g_return_if_fail (EV_IS_SIDEBAR (ev_sidebar));
+ g_return_if_fail (page_id != NULL);
- gtk_list_store_remove (GTK_LIST_STORE (ev_sidebar->priv->page_model), &iter);
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
- if (gtk_tree_model_iter_n_children (ev_sidebar->priv->page_model, NULL) == 0) {
- gtk_widget_set_sensitive (GTK_WIDGET (ev_sidebar), FALSE);
- g_free (ev_sidebar->priv->current);
- ev_sidebar->priv->current = NULL;
- return;
- }
+ if (ev_sidebar_get_iter_for_page_id (ev_sidebar, page_id, &iter)) {
+ GtkTreePath *path;
+ gint *indices;
- tree_path = g_strdup_printf ("%d", page_num - 1);
- gtk_tree_model_get_iter_from_string (ev_sidebar->priv->page_model, &iter, tree_path);
- g_free (tree_path);
+ path = gtk_tree_model_get_path (model, &iter);
+ indices = gtk_tree_path_get_indices (path);
- gtk_tree_model_get (ev_sidebar->priv->page_model,
- &iter,
- PAGE_COLUMN_ID, &new_page_id,
- -1);
- ev_sidebar_set_current_page (ev_sidebar, new_page_id);
- g_free (new_page_id);
+ g_assert (indices != NULL);
+ gtk_notebook_remove_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook), indices[0]);
+
+ gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+
+ if (gtk_tree_model_iter_n_children (model, NULL) != 0) {
+ gtk_tree_path_prev (path);
+
+ if (gtk_tree_model_get_iter (model, &iter, path)) {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter);
+ }
+ } else {
+ gtk_widget_set_sensitive (GTK_WIDGET (ev_sidebar), FALSE);
+ }
+
+ gtk_tree_path_free (path);
+ }
}