diff --git a/ChangeLog b/ChangeLog index 568009ee42..729529f3f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +Sat Aug 7 18:19:03 2004 Matthias Clasen + + * gtk/gtkfilechooserdefault.c (save_folder_combo_create): + (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc + instead of GtkCellRendererSepText. (#147864) + + * gtk/gtkcellrendererseptext.[hc]: Removed. + + * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc] + +Sat Aug 7 18:15:15 2004 Matthias Clasen + + * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): + (gtk_combo_box_menu_row_inserted): + (gtk_combo_box_menu_row_changed): Correctly handle + insertion and deletion of separators in menu mode. + 2004-08-07 Tor Lillqvist * gdk/win32/gdkevents-win32.c (handle_configure_event, diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 568009ee42..729529f3f9 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,20 @@ +Sat Aug 7 18:19:03 2004 Matthias Clasen + + * gtk/gtkfilechooserdefault.c (save_folder_combo_create): + (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc + instead of GtkCellRendererSepText. (#147864) + + * gtk/gtkcellrendererseptext.[hc]: Removed. + + * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc] + +Sat Aug 7 18:15:15 2004 Matthias Clasen + + * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): + (gtk_combo_box_menu_row_inserted): + (gtk_combo_box_menu_row_changed): Correctly handle + insertion and deletion of separators in menu mode. + 2004-08-07 Tor Lillqvist * gdk/win32/gdkevents-win32.c (handle_configure_event, diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 568009ee42..729529f3f9 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,20 @@ +Sat Aug 7 18:19:03 2004 Matthias Clasen + + * gtk/gtkfilechooserdefault.c (save_folder_combo_create): + (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc + instead of GtkCellRendererSepText. (#147864) + + * gtk/gtkcellrendererseptext.[hc]: Removed. + + * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc] + +Sat Aug 7 18:15:15 2004 Matthias Clasen + + * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): + (gtk_combo_box_menu_row_inserted): + (gtk_combo_box_menu_row_changed): Correctly handle + insertion and deletion of separators in menu mode. + 2004-08-07 Tor Lillqvist * gdk/win32/gdkevents-win32.c (handle_configure_event, diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 568009ee42..729529f3f9 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,20 @@ +Sat Aug 7 18:19:03 2004 Matthias Clasen + + * gtk/gtkfilechooserdefault.c (save_folder_combo_create): + (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc + instead of GtkCellRendererSepText. (#147864) + + * gtk/gtkcellrendererseptext.[hc]: Removed. + + * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc] + +Sat Aug 7 18:15:15 2004 Matthias Clasen + + * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): + (gtk_combo_box_menu_row_inserted): + (gtk_combo_box_menu_row_changed): Correctly handle + insertion and deletion of separators in menu mode. + 2004-08-07 Tor Lillqvist * gdk/win32/gdkevents-win32.c (handle_configure_event, diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 914356076a..599bb52766 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -276,7 +276,6 @@ gtk_semi_private_h_sources = \ # GTK+ header files that don't get installed gtk_private_h_sources = \ - gtkcellrendererseptext.h\ gtkentryprivate.h \ gtkfilechooserembed.h \ gtkfilechooserentry.h \ @@ -327,7 +326,6 @@ gtk_c_sources = \ gtkcellrenderercombo.c \ gtkcellrendererpixbuf.c \ gtkcellrendererprogress.c \ - gtkcellrendererseptext.c\ gtkcellrenderertext.c \ gtkcellrenderertoggle.c \ gtkcellview.c \ diff --git a/gtk/gtkcellrendererseptext.c b/gtk/gtkcellrendererseptext.c deleted file mode 100644 index f76a15b13d..0000000000 --- a/gtk/gtkcellrendererseptext.c +++ /dev/null @@ -1,152 +0,0 @@ -/* GTK - The GIMP Toolkit - * gtkcellrendererseptext.h: Cell renderer for text or a separator - * Copyright (C) 2003, Ximian, Inc. - * - * Author: Federico Mena-Quintero - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include "gtkcellrendererseptext.h" - -static void gtk_cell_renderer_sep_get_size (GtkCellRenderer *cell, - GtkWidget *widget, - GdkRectangle *cell_area, - gint *x_offset, - gint *y_offset, - gint *width, - gint *height); - -static void gtk_cell_renderer_sep_text_render (GtkCellRenderer *cell, - GdkWindow *window, - GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, - GdkRectangle *expose_area, - GtkCellRendererState flags); - -static GtkCellRendererTextClass *parent_class; - -static void -gtk_cell_renderer_sep_text_class_init (GtkCellRendererSepTextClass *class) -{ - GtkCellRendererClass *cell_renderer_class; - - cell_renderer_class = GTK_CELL_RENDERER_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - cell_renderer_class->get_size = gtk_cell_renderer_sep_get_size; - cell_renderer_class->render = gtk_cell_renderer_sep_text_render; -} - -GType -_gtk_cell_renderer_sep_text_get_type (void) -{ - static GType cell_type = 0; - - if (!cell_type) - { - static const GTypeInfo cell_info = - { - sizeof (GtkCellRendererSepTextClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_cell_renderer_sep_text_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkCellRendererSepText), - 0, /* n_preallocs */ - NULL, /* instance_init */ - NULL, /* value_table */ - }; - - cell_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TEXT, "GtkCellRendererSepText", - &cell_info, 0); - } - - return cell_type; -} - -static void -gtk_cell_renderer_sep_get_size (GtkCellRenderer *cell, - GtkWidget *widget, - GdkRectangle *cell_area, - gint *x_offset, - gint *y_offset, - gint *width, - gint *height) -{ - GtkCellRendererSepText *st; - const char *text; - - st = GTK_CELL_RENDERER_SEP_TEXT (cell); - - text = st->renderer_text.text; - - if (!text) - { - if (width) - *width = cell->xpad * 2 + 1; - - if (height) - *height = cell->ypad * 2 + 1; - - if (x_offset) *x_offset = 0; - if (y_offset) *y_offset = 0; - } - else - { - GTK_CELL_RENDERER_CLASS (parent_class)->get_size (cell, widget, cell_area, x_offset, y_offset, width, height); - } -} - -static void -gtk_cell_renderer_sep_text_render (GtkCellRenderer *cell, - GdkWindow *window, - GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, - GdkRectangle *expose_area, - GtkCellRendererState flags) -{ - GtkCellRendererSepText *st; - const char *text; - - st = GTK_CELL_RENDERER_SEP_TEXT (cell); - - text = st->renderer_text.text; - - if (!text) - gtk_paint_hline (gtk_widget_get_style (widget), - window, - GTK_WIDGET_STATE (widget), - expose_area, - widget, - NULL, - cell_area->x, - cell_area->x + cell_area->width, - cell_area->y + cell_area->height / 2); - else - GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, window, widget, background_area, cell_area, expose_area, flags); -} - -GtkCellRenderer * -_gtk_cell_renderer_sep_text_new (void) -{ - return g_object_new (GTK_TYPE_CELL_RENDERER_SEP_TEXT, NULL); -} diff --git a/gtk/gtkcellrendererseptext.h b/gtk/gtkcellrendererseptext.h deleted file mode 100644 index b5939688f8..0000000000 --- a/gtk/gtkcellrendererseptext.h +++ /dev/null @@ -1,56 +0,0 @@ -/* GTK - The GIMP Toolkit - * gtkcellrendererseptext.h: Cell renderer for text or a separator - * Copyright (C) 2003, Ximian, Inc. - * - * Author: Federico Mena-Quintero - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_CELL_RENDERER_SEP_TEXT_H__ -#define __GTK_CELL_RENDERER_SEP_TEXT_H__ - -#include - -G_BEGIN_DECLS - -#define GTK_TYPE_CELL_RENDERER_SEP_TEXT (_gtk_cell_renderer_sep_text_get_type ()) -#define GTK_CELL_RENDERER_SEP_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CELL_RENDERER_SEP_TEXT, GtkCellRendererSepText)) -#define GTK_CELL_RENDERER_SEP_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CELL_RENDERER_SEP_TEXT, GtkCellRendererSepTextClass)) -#define GTK_IS_CELL_RENDERER_SEP_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CELL_RENDERER_SEP_TEXT)) -#define GTK_IS_CELL_RENDERER_SEP_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CELL_RENDERER_SEP_TEXT)) -#define GTK_CELL_RENDERER_SEP_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CELL_RENDERER_SEP_TEXT, GtkCellRendererSepTextClass)) - -typedef struct _GtkCellRendererSepText GtkCellRendererSepText; -typedef struct _GtkCellRendererSepTextClass GtkCellRendererSepTextClass; - -struct _GtkCellRendererSepText -{ - GtkCellRendererText renderer_text; -}; - -struct _GtkCellRendererSepTextClass -{ - GtkCellRendererTextClass parent_class; -}; - -GType _gtk_cell_renderer_sep_text_get_type (void) G_GNUC_CONST; - -GtkCellRenderer *_gtk_cell_renderer_sep_text_new (void); - -G_END_DECLS - -#endif diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 01d79e86b5..351f72eb6d 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -2361,7 +2361,13 @@ gtk_combo_box_menu_fill_level (GtkComboBox *combo_box, is_separator = FALSE; if (is_separator) - item = gtk_separator_menu_item_new (); + { + item = gtk_separator_menu_item_new (); + g_object_set_data_full (G_OBJECT (item), + "gtk-combo-box-item-path", + gtk_tree_model_get_path (model, &iter), + (GDestroyNotify)gtk_tree_path_free); + } else { item = gtk_cell_view_menu_item_new (combo_box, model, &iter); @@ -2523,8 +2529,7 @@ static void gtk_combo_box_relayout (GtkComboBox *combo_box) { GList *list, *j; - GtkWidget *menu, *item; - gint row, col, width; + GtkWidget *menu; menu = combo_box->priv->popup_widget; @@ -2726,7 +2731,11 @@ find_menu_by_path (GtkWidget *menu, item = NULL; for (i = list; i; i = i->next) { - if (GTK_IS_CELL_VIEW (GTK_BIN (i->data)->child)) + if (GTK_IS_SEPARATOR_MENU_ITEM (i->data)) + { + mpath = gtk_tree_path_copy (g_object_get_data (G_OBJECT (i->data), "gtk-combo-box-item-path")); + } + else if (GTK_IS_CELL_VIEW (GTK_BIN (i->data)->child)) { if (skip) { @@ -2735,32 +2744,35 @@ find_menu_by_path (GtkWidget *menu, } mpath = gtk_cell_view_get_displayed_row (GTK_CELL_VIEW (GTK_BIN (i->data)->child)); - /* this case is necessary, since the row reference of - * the cell view may already be updated after a deletion - */ - if (!mpath) - { - item = i->data; - break; - } - if (gtk_tree_path_compare (mpath, path) == 0) + } + else + continue; + + /* this case is necessary, since the row reference of + * the cell view may already be updated after a deletion + */ + if (!mpath) + { + item = i->data; + break; + } + if (gtk_tree_path_compare (mpath, path) == 0) + { + gtk_tree_path_free (mpath); + item = i->data; + break; + } + if (gtk_tree_path_is_ancestor (mpath, path)) + { + submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (i->data)); + if (submenu != NULL) { gtk_tree_path_free (mpath); - item = i->data; + item = find_menu_by_path (submenu, path, TRUE); break; } - if (gtk_tree_path_is_ancestor (mpath, path)) - { - submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (i->data)); - if (submenu != NULL) - { - gtk_tree_path_free (mpath); - item = find_menu_by_path (submenu, path, TRUE); - break; - } - } - gtk_tree_path_free (mpath); } + gtk_tree_path_free (mpath); } g_list_free (list); @@ -2808,6 +2820,7 @@ gtk_combo_box_menu_row_inserted (GtkTreeModel *model, GtkTreePath *ppath; GtkTreeIter piter; gint depth, pos; + gboolean is_separator; if (!combo_box->priv->popup_widget) return; @@ -2854,13 +2867,30 @@ gtk_combo_box_menu_row_inserted (GtkTreeModel *model, pos += 1; } - item = gtk_cell_view_menu_item_new (combo_box, model, iter); + if (combo_box->priv->row_separator_func) + is_separator = (*combo_box->priv->row_separator_func) (model, iter, + combo_box->priv->row_separator_data); + else + is_separator = FALSE; + + if (is_separator) + { + item = gtk_separator_menu_item_new (); + g_object_set_data_full (G_OBJECT (item), + "gtk-combo-box-item-path", + gtk_tree_path_copy (path), + (GDestroyNotify)gtk_tree_path_free); + } + else + { + item = gtk_cell_view_menu_item_new (combo_box, model, iter); + + g_signal_connect (item, "activate", + G_CALLBACK (gtk_combo_box_menu_item_activate), + combo_box); + } + gtk_widget_show (item); - - g_signal_connect (item, "activate", - G_CALLBACK (gtk_combo_box_menu_item_activate), - combo_box); - gtk_menu_shell_insert (GTK_MENU_SHELL (menu), item, pos); } @@ -2902,16 +2932,28 @@ gtk_combo_box_menu_row_changed (GtkTreeModel *model, GtkComboBox *combo_box = GTK_COMBO_BOX (user_data); GtkWidget *item; gint width; + gboolean is_separator; if (!combo_box->priv->popup_widget) return; - if (combo_box->priv->wrap_width) + item = find_menu_by_path (combo_box->priv->popup_widget, path, FALSE); + + if (combo_box->priv->row_separator_func) + is_separator = (*combo_box->priv->row_separator_func) (model, iter, + combo_box->priv->row_separator_data); + else + is_separator = FALSE; + + if (is_separator != GTK_IS_SEPARATOR_MENU_ITEM (item)) { - item = find_menu_by_path (combo_box->priv->popup_widget, path, FALSE); - gtk_combo_box_relayout_item (combo_box, item, iter, NULL); + gtk_combo_box_menu_row_deleted (model, path, combo_box); + gtk_combo_box_menu_row_inserted (model, path, iter, combo_box); } + if (combo_box->priv->wrap_width) + gtk_combo_box_relayout_item (combo_box, item, iter, NULL); + width = gtk_combo_box_calc_requested_width (combo_box, path); if (width > combo_box->priv->width) diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index 7564d28784..f17362f3f9 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -25,7 +25,7 @@ #include "gtkbutton.h" #include "gtkcelllayout.h" #include "gtkcellrendererpixbuf.h" -#include "gtkcellrendererseptext.h" +#include "gtkcellrenderertext.h" #include "gtkcellrenderertext.h" #include "gtkcheckmenuitem.h" #include "gtkcombobox.h" @@ -2546,6 +2546,24 @@ shortcuts_selection_changed_cb (GtkTreeSelection *selection, bookmarks_check_remove_sensitivity (impl); } +static gboolean +shortcuts_row_separator_func (GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + gint column = GPOINTER_TO_INT (data); + gchar *text; + + gtk_tree_model_get (model, iter, column, &text, -1); + + if (!text) + return TRUE; + + g_free (text); + + return FALSE; +} + /* Creates the widgets for the shortcuts and bookmarks tree */ static GtkWidget * shortcuts_list_create (GtkFileChooserDefault *impl) @@ -2630,12 +2648,17 @@ shortcuts_list_create (GtkFileChooserDefault *impl) "visible", SHORTCUTS_COL_PIXBUF_VISIBLE, NULL); - renderer = _gtk_cell_renderer_sep_text_new (); + renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_attributes (column, renderer, "text", SHORTCUTS_COL_NAME, NULL); + gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view), + shortcuts_row_separator_func, + GINT_TO_POINTER (SHORTCUTS_COL_NAME), + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view), column); return swin; @@ -3094,13 +3117,18 @@ save_folder_combo_create (GtkFileChooserDefault *impl) "sensitive", SHORTCUTS_COL_PIXBUF_VISIBLE, NULL); - cell = _gtk_cell_renderer_sep_text_new (); + cell = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell, "text", SHORTCUTS_COL_NAME, "sensitive", SHORTCUTS_COL_PIXBUF_VISIBLE, NULL); + gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combo), + shortcuts_row_separator_func, + GINT_TO_POINTER (SHORTCUTS_COL_NAME), + NULL); + g_signal_connect (combo, "changed", G_CALLBACK (save_folder_combo_changed_cb), impl);