Use GtkTreeViewRowSeparatorFunc instead of GtkCellRendererSepText.

Sat Aug  7 18:19:03 2004  Matthias Clasen  <maclas@gmx.de>

	* 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  <maclas@gmx.de>

	* 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.
This commit is contained in:
Matthias Clasen 2004-08-07 22:21:25 +00:00 committed by Matthias Clasen
parent 5f7fbb27c2
commit f82ca65b81
9 changed files with 175 additions and 247 deletions

View File

@ -1,3 +1,20 @@
Sat Aug 7 18:19:03 2004 Matthias Clasen <maclas@gmx.de>
* 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 <maclas@gmx.de>
* 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 <tml@iki.fi>
* gdk/win32/gdkevents-win32.c (handle_configure_event,

View File

@ -1,3 +1,20 @@
Sat Aug 7 18:19:03 2004 Matthias Clasen <maclas@gmx.de>
* 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 <maclas@gmx.de>
* 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 <tml@iki.fi>
* gdk/win32/gdkevents-win32.c (handle_configure_event,

View File

@ -1,3 +1,20 @@
Sat Aug 7 18:19:03 2004 Matthias Clasen <maclas@gmx.de>
* 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 <maclas@gmx.de>
* 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 <tml@iki.fi>
* gdk/win32/gdkevents-win32.c (handle_configure_event,

View File

@ -1,3 +1,20 @@
Sat Aug 7 18:19:03 2004 Matthias Clasen <maclas@gmx.de>
* 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 <maclas@gmx.de>
* 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 <tml@iki.fi>
* gdk/win32/gdkevents-win32.c (handle_configure_event,

View File

@ -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 \

View File

@ -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 <federico@ximian.com>
*
* 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 <config.h>
#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);
}

View File

@ -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 <federico@ximian.com>
*
* 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 <gtk/gtkcellrenderertext.h>
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

View File

@ -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)

View File

@ -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);