summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gdk-pixbuf-loader.c166
-rw-r--r--gtk/gdk-pixbuf-loader.h21
-rw-r--r--gtk/gtktreeprivate.h7
-rw-r--r--gtk/gtktreeselection.h2
-rw-r--r--gtk/gtktreeview.c464
-rw-r--r--gtk/gtktreeviewcolumn.c14
-rw-r--r--gtk/gtktreeviewcolumn.h1
7 files changed, 381 insertions, 294 deletions
diff --git a/gtk/gdk-pixbuf-loader.c b/gtk/gdk-pixbuf-loader.c
index 06f2e1df39..34cb3899a1 100644
--- a/gtk/gdk-pixbuf-loader.c
+++ b/gtk/gdk-pixbuf-loader.c
@@ -1,4 +1,4 @@
-/* GdkPixbuf library - Main header file
+/* GdkPixbuf library - Progressive loader object
*
* Copyright (C) 1999 The Free Software Foundation
*
@@ -43,7 +43,6 @@ enum {
static void gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass);
static void gdk_pixbuf_loader_init (GdkPixbufLoader *loader);
-static void gdk_pixbuf_loader_destroy (GtkObject *loader);
static void gdk_pixbuf_loader_finalize (GObject *loader);
static gpointer parent_class = NULL;
@@ -75,25 +74,29 @@ typedef struct
*
* Return value: The type ID of the #GdkPixbufLoader class.
**/
-GtkType
+GType
gdk_pixbuf_loader_get_type (void)
{
- static GtkType loader_type = 0;
+ static GType loader_type = 0;
if (!loader_type)
{
- static const GtkTypeInfo loader_info = {
- "GdkPixbufLoader",
- sizeof (GdkPixbufLoader),
- sizeof (GdkPixbufLoaderClass),
- (GtkClassInitFunc) gdk_pixbuf_loader_class_init,
- (GtkObjectInitFunc) gdk_pixbuf_loader_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
+ static const GTypeInfo loader_info = {
+ sizeof (GdkPixbufLoaderClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gdk_pixbuf_loader_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GdkPixbufLoader),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gdk_pixbuf_loader_init
};
- loader_type = gtk_type_unique (GTK_TYPE_OBJECT, &loader_info);
+ loader_type = g_type_register_static (G_TYPE_OBJECT,
+ "GdkPixbufLoader",
+ &loader_info,
+ 0);
}
return loader_type;
@@ -102,61 +105,63 @@ gdk_pixbuf_loader_get_type (void)
static void
gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *class)
{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
+ GObjectClass *object_class;
- object_class = (GtkObjectClass *) class;
- gobject_class = (GObjectClass *) class;
+ object_class = (GObjectClass *) class;
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
+ parent_class = g_type_class_peek_parent (class);
- object_class->destroy = gdk_pixbuf_loader_destroy;
- gobject_class->finalize = gdk_pixbuf_loader_finalize;
+ object_class->finalize = gdk_pixbuf_loader_finalize;
pixbuf_loader_signals[AREA_PREPARED] =
- gtk_signal_new ("area_prepared",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, area_prepared),
- gtk_marshal_VOID__VOID,
- GTK_TYPE_NONE, 0);
+ g_signal_newc ("area_prepared",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, area_prepared),
+ NULL,
+ gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
pixbuf_loader_signals[AREA_UPDATED] =
- gtk_signal_new ("area_updated",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, area_updated),
- gtk_marshal_VOID__INT_INT_INT_INT,
- GTK_TYPE_NONE, 4,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_INT);
+ g_signal_newc ("area_updated",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, area_updated),
+ NULL,
+ gtk_marshal_VOID__INT_INT_INT_INT,
+ G_TYPE_NONE, 4,
+ G_TYPE_INT,
+ G_TYPE_INT,
+ G_TYPE_INT,
+ G_TYPE_INT);
pixbuf_loader_signals[FRAME_DONE] =
- gtk_signal_new ("frame_done",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, frame_done),
- gtk_marshal_VOID__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ g_signal_newc ("frame_done",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, frame_done),
+ NULL,
+ gtk_marshal_VOID__POINTER,
+ G_TYPE_NONE, 1,
+ GDK_TYPE_PIXBUF_FRAME);
pixbuf_loader_signals[ANIMATION_DONE] =
- gtk_signal_new ("animation_done",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, animation_done),
- gtk_marshal_VOID__VOID,
- GTK_TYPE_NONE, 0);
+ g_signal_newc ("animation_done",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, animation_done),
+ NULL,
+ gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
pixbuf_loader_signals[CLOSED] =
- gtk_signal_new ("closed",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, closed),
- gtk_marshal_VOID__VOID,
- GTK_TYPE_NONE, 0);
+ g_signal_newc ("closed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, closed),
+ NULL,
+ gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
static void
@@ -169,38 +174,23 @@ gdk_pixbuf_loader_init (GdkPixbufLoader *loader)
}
static void
-gdk_pixbuf_loader_destroy (GtkObject *object)
+gdk_pixbuf_loader_finalize (GObject *object)
{
GdkPixbufLoader *loader;
GdkPixbufLoaderPrivate *priv = NULL;
- g_return_if_fail (object != NULL);
- g_return_if_fail (GDK_IS_PIXBUF_LOADER (object));
-
loader = GDK_PIXBUF_LOADER (object);
priv = loader->private;
-
+
if (!priv->closed)
gdk_pixbuf_loader_close (loader);
if (priv->animation)
gdk_pixbuf_animation_unref (priv->animation);
+
if (priv->pixbuf)
gdk_pixbuf_unref (priv->pixbuf);
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-gdk_pixbuf_loader_finalize (GObject *object)
-{
- GdkPixbufLoader *loader;
- GdkPixbufLoaderPrivate *priv = NULL;
-
- loader = GDK_PIXBUF_LOADER (object);
- priv = loader->private;
-
g_free (priv);
if (G_OBJECT_CLASS (parent_class)->finalize)
@@ -219,7 +209,7 @@ gdk_pixbuf_loader_prepare (GdkPixbuf *pixbuf,
g_assert (priv->pixbuf == NULL);
priv->pixbuf = pixbuf;
- gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[AREA_PREPARED]);
+ g_signal_emit (G_OBJECT (loader), pixbuf_loader_signals[AREA_PREPARED], 0);
}
static void
@@ -234,12 +224,13 @@ gdk_pixbuf_loader_update (GdkPixbuf *pixbuf,
priv = GDK_PIXBUF_LOADER (loader)->private;
- gtk_signal_emit (GTK_OBJECT (loader),
- pixbuf_loader_signals[AREA_UPDATED],
- x, y,
- /* sanity check in here. Defend against an errant loader */
- MIN (width, gdk_pixbuf_get_width (priv->pixbuf)),
- MIN (height, gdk_pixbuf_get_height (priv->pixbuf)));
+ g_signal_emit (G_OBJECT (loader),
+ pixbuf_loader_signals[AREA_UPDATED],
+ 0,
+ x, y,
+ /* sanity check in here. Defend against an errant loader */
+ MIN (width, gdk_pixbuf_get_width (priv->pixbuf)),
+ MIN (height, gdk_pixbuf_get_height (priv->pixbuf)));
}
static void
@@ -278,9 +269,10 @@ gdk_pixbuf_loader_frame_done (GdkPixbufFrame *frame,
priv->animation->frames = g_list_append (priv->animation->frames, frame);
priv->animation->n_frames++;
- gtk_signal_emit (GTK_OBJECT (loader),
- pixbuf_loader_signals[FRAME_DONE],
- frame);
+ g_signal_emit (GTK_OBJECT (loader),
+ pixbuf_loader_signals[FRAME_DONE],
+ 0,
+ frame);
}
static void
@@ -312,7 +304,7 @@ gdk_pixbuf_loader_animation_done (GdkPixbuf *pixbuf,
current = current->next;
}
- gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[ANIMATION_DONE]);
+ g_signal_emit (G_OBJECT (loader), pixbuf_loader_signals[ANIMATION_DONE], 0);
}
static gint
@@ -605,7 +597,7 @@ gdk_pixbuf_loader_get_animation (GdkPixbufLoader *loader)
* gdk_pixbuf_loader_close:
* @loader: A pixbuf loader.
*
- * Informs a pixbuf loader that no further writes with gdk_pixbuf_load_write()
+ * Informs a pixbuf loader that no further writes with gdk_pixbuf_loader_write()
* will occur, so that it can free its internal loading structures.
**/
void
@@ -630,5 +622,5 @@ gdk_pixbuf_loader_close (GdkPixbufLoader *loader)
priv->closed = TRUE;
- gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[CLOSED]);
+ g_signal_emit (G_OBJECT (loader), pixbuf_loader_signals[CLOSED], 0);
}
diff --git a/gtk/gdk-pixbuf-loader.h b/gtk/gdk-pixbuf-loader.h
index 402b697256..01532ad782 100644
--- a/gtk/gdk-pixbuf-loader.h
+++ b/gtk/gdk-pixbuf-loader.h
@@ -1,4 +1,4 @@
-/* GdkPixbuf library - Main header file
+/* GdkPixbuf library - Progressive loader object
*
* Copyright (C) 1999 The Free Software Foundation
*
@@ -26,27 +26,24 @@
#ifndef GDK_PIXBUF_LOADER_H
#define GDK_PIXBUF_LOADER_H
-#include <gtk/gtkobject.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#ifdef __cplusplus
extern "C" {
#endif
-
-
#define GDK_TYPE_PIXBUF_LOADER (gdk_pixbuf_loader_get_type ())
-#define GDK_PIXBUF_LOADER(obj) (GTK_CHECK_CAST ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoader))
-#define GDK_PIXBUF_LOADER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
-#define GDK_IS_PIXBUF_LOADER(obj) (GTK_CHECK_TYPE ((obj), GDK_TYPE_PIXBUF_LOADER))
-#define GDK_IS_PIXBUF_LOADER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GDK_TYPE_PIXBUF_LOADER))
-#define GDK_PIXBUF_LOADER_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
+#define GDK_PIXBUF_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoader))
+#define GDK_PIXBUF_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
+#define GDK_IS_PIXBUF_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GDK_TYPE_PIXBUF_LOADER))
+#define GDK_IS_PIXBUF_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_PIXBUF_LOADER))
+#define GDK_PIXBUF_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
typedef struct _GdkPixbufLoader GdkPixbufLoader;
struct _GdkPixbufLoader
{
- GtkObject object;
+ GObject parent_instance;
/*< private >*/
gpointer private;
@@ -55,7 +52,7 @@ struct _GdkPixbufLoader
typedef struct _GdkPixbufLoaderClass GdkPixbufLoaderClass;
struct _GdkPixbufLoaderClass
{
- GtkObjectClass parent_class;
+ GObjectClass parent_class;
void (*area_prepared) (GdkPixbufLoader *loader);
void (*area_updated) (GdkPixbufLoader *loader,
@@ -70,7 +67,7 @@ struct _GdkPixbufLoaderClass
};
-GtkType gdk_pixbuf_loader_get_type (void) G_GNUC_CONST;
+GType gdk_pixbuf_loader_get_type (void) G_GNUC_CONST;
GdkPixbufLoader * gdk_pixbuf_loader_new (void);
GdkPixbufLoader * gdk_pixbuf_loader_new_with_type (const char *image_type,
GError **error);
diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
index 0274f32893..a7b932bebc 100644
--- a/gtk/gtktreeprivate.h
+++ b/gtk/gtktreeprivate.h
@@ -29,7 +29,8 @@ extern "C" {
#include <gtk/gtktreeselection.h>
#include <gtk/gtkrbtree.h>
-typedef enum {
+typedef enum
+{
GTK_TREE_VIEW_IS_LIST = 1 << 0,
GTK_TREE_VIEW_SHOW_EXPANDERS = 1 << 1,
GTK_TREE_VIEW_IN_COLUMN_RESIZE = 1 << 2,
@@ -87,8 +88,8 @@ struct _GtkTreeViewPrivate
GtkTreeSelection *selection;
/* Header information */
- gint columns;
- GList *column;
+ gint n_columns;
+ GList *columns;
gint header_height;
};
diff --git a/gtk/gtktreeselection.h b/gtk/gtktreeselection.h
index 3f7201ec3f..e6cc4aa430 100644
--- a/gtk/gtktreeselection.h
+++ b/gtk/gtktreeselection.h
@@ -67,6 +67,7 @@ struct _GtkTreeSelectionClass
GtkType gtk_tree_selection_get_type (void);
+/* FIXME return a GtkTreeSelection */
GtkObject *gtk_tree_selection_new (void);
void gtk_tree_selection_set_type (GtkTreeSelection *selection,
GtkTreeSelectionType type);
@@ -102,6 +103,7 @@ void gtk_tree_selection_select_range (GtkTreeSelection
/*< private >*/
+/* FIXME underscores, return GtkTreeSelection, rename from_tree_view */
GtkObject *gtk_tree_selection_new_with_tree_view (GtkTreeView *tree_view);
void gtk_tree_selection_set_tree_view (GtkTreeSelection *selection,
GtkTreeView *tree_view);
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 01371b801d..b837654575 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -35,8 +35,8 @@
#define TREE_VIEW_DRAG_WIDTH 6
#define TREE_VIEW_EXPANDER_WIDTH 14
#define TREE_VIEW_EXPANDER_HEIGHT 14
-#define TREE_VIEW_VERTICAL_SEPERATOR 2
-#define TREE_VIEW_HORIZONTAL_SEPERATOR 0
+#define TREE_VIEW_VERTICAL_SEPARATOR 2
+#define TREE_VIEW_HORIZONTAL_SEPARATOR 0
typedef struct _GtkTreeViewChild GtkTreeViewChild;
@@ -53,7 +53,7 @@ static void gtk_tree_view_init (GtkTreeView *tree_view)
static void gtk_tree_view_class_init (GtkTreeViewClass *klass);
/* widget signals */
-static void gtk_tree_view_set_model_realized (GtkTreeView *tree_view);
+static void gtk_tree_view_setup_model (GtkTreeView *tree_view);
static void gtk_tree_view_realize (GtkWidget *widget);
static void gtk_tree_view_unrealize (GtkWidget *widget);
static void gtk_tree_view_map (GtkWidget *widget);
@@ -224,7 +224,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
GTK_SIGNAL_OFFSET (GtkTreeViewClass, set_scroll_adjustments),
gtk_marshal_VOID__POINTER_POINTER,
GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER, GTK_TYPE_POINTER);
+ GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
}
static void
@@ -232,13 +232,12 @@ gtk_tree_view_init (GtkTreeView *tree_view)
{
tree_view->priv = g_new0 (GtkTreeViewPrivate, 1);
- GTK_WIDGET_UNSET_FLAGS (tree_view, GTK_NO_WINDOW);
GTK_WIDGET_SET_FLAGS (tree_view, GTK_CAN_FOCUS);
tree_view->priv->flags = GTK_TREE_VIEW_IS_LIST | GTK_TREE_VIEW_SHOW_EXPANDERS | GTK_TREE_VIEW_DRAW_KEYFOCUS | GTK_TREE_VIEW_HEADERS_VISIBLE;
tree_view->priv->tab_offset = TREE_VIEW_EXPANDER_WIDTH;
- tree_view->priv->columns = 0;
- tree_view->priv->column = NULL;
+ tree_view->priv->n_columns = 0;
+ tree_view->priv->columns = NULL;
tree_view->priv->button_pressed_node = NULL;
tree_view->priv->button_pressed_tree = NULL;
tree_view->priv->prelight_node = NULL;
@@ -264,9 +263,9 @@ gtk_tree_view_realize_buttons (GtkTreeView *tree_view)
GdkWindowAttr attr;
guint attributes_mask;
- if (!GTK_WIDGET_REALIZED (tree_view) || tree_view->priv->header_window == NULL)
- return;
-
+ g_return_if_fail (GTK_WIDGET_REALIZED (tree_view));
+ g_return_if_fail (tree_view->priv->header_window != NULL);
+
attr.window_type = GDK_WINDOW_CHILD;
attr.wclass = GDK_INPUT_ONLY;
attr.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
@@ -285,7 +284,7 @@ gtk_tree_view_realize_buttons (GtkTreeView *tree_view)
attr.width = TREE_VIEW_DRAG_WIDTH;
attr.height = tree_view->priv->header_height;
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
if (column->button)
@@ -294,10 +293,11 @@ gtk_tree_view_realize_buttons (GtkTreeView *tree_view)
continue;
gtk_widget_set_parent_window (column->button,
tree_view->priv->header_window);
- gtk_widget_show (column->button);
attr.x = (column->button->allocation.x + column->button->allocation.width) - 3;
+ g_return_if_fail (column->window == NULL);
+
column->window = gdk_window_new (tree_view->priv->header_window,
&attr, attributes_mask);
gdk_window_set_user_data (column->window, tree_view);
@@ -321,7 +321,7 @@ gtk_tree_view_realize (GtkWidget *widget)
if (!GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_MODEL_SETUP) &&
tree_view->priv->model)
- gtk_tree_view_set_model_realized (tree_view);
+ gtk_tree_view_setup_model (tree_view);
gtk_tree_view_check_dirty (GTK_TREE_VIEW (widget));
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
@@ -416,6 +416,8 @@ gtk_tree_view_unrealize (GtkWidget *widget)
tree_view = GTK_TREE_VIEW (widget);
+ /* FIXME where do we clear column->window for each column? */
+
gdk_window_set_user_data (tree_view->priv->bin_window, NULL);
gdk_window_destroy (tree_view->priv->bin_window);
tree_view->priv->bin_window = NULL;
@@ -425,17 +427,53 @@ gtk_tree_view_unrealize (GtkWidget *widget)
tree_view->priv->header_window = NULL;
gdk_gc_destroy (tree_view->priv->xor_gc);
+
+ /* GtkWidget::unrealize destroys children and widget->window */
+
if (GTK_WIDGET_CLASS (parent_class)->unrealize)
(* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
}
static void
+gtk_tree_view_map_buttons (GtkTreeView *tree_view)
+{
+ GList *list;
+
+ g_return_if_fail (GTK_WIDGET_MAPPED (tree_view));
+
+ if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
+ {
+ GtkTreeViewColumn *column;
+
+ for (list = tree_view->priv->columns; list; list = list->next)
+ {
+ column = list->data;
+ if (GTK_WIDGET_VISIBLE (column->button) &&
+ !GTK_WIDGET_MAPPED (column->button))
+ gtk_widget_map (column->button);
+ }
+ for (list = tree_view->priv->columns; list; list = list->next)
+ {
+ column = list->data;
+ if (column->visible == FALSE)
+ continue;
+ if (column->column_type == GTK_TREE_VIEW_COLUMN_RESIZEABLE)
+ {
+ gdk_window_raise (column->window);
+ gdk_window_show (column->window);
+ }
+ else
+ gdk_window_hide (column->window);
+ }
+ gdk_window_show (tree_view->priv->header_window);
+ }
+}
+
+static void
gtk_tree_view_map (GtkWidget *widget)
{
GList *tmp_list;
GtkTreeView *tree_view;
- GList *list;
- GtkTreeViewColumn *column;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
@@ -457,29 +495,34 @@ gtk_tree_view_map (GtkWidget *widget)
}
}
gdk_window_show (tree_view->priv->bin_window);
- if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
+
+ gtk_tree_view_map_buttons (tree_view);
+
+ gdk_window_show (widget->window);
+}
+
+static void
+gtk_tree_view_size_request_buttons (GtkTreeView *tree_view)
+{
+ GList *list;
+
+ tree_view->priv->header_height = 1;
+
+ if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_MODEL_SETUP))
{
- for (list = tree_view->priv->column; list; list = list->next)
- {
- column = list->data;
- gtk_widget_map (column->button);
- }
- for (list = tree_view->priv->column; list; list = list->next)
- {
- column = list->data;
- if (column->visible == FALSE)
- continue;
- if (column->column_type == GTK_TREE_VIEW_COLUMN_RESIZEABLE)
- {
- gdk_window_raise (column->window);
- gdk_window_show (column->window);
- }
- else
- gdk_window_hide (column->window);
- }
- gdk_window_show (tree_view->priv->header_window);
+ for (list = tree_view->priv->columns; list; list = list->next)
+ {
+ GtkRequisition requisition;
+ GtkTreeViewColumn *column;
+
+ column = list->data;
+
+ gtk_widget_size_request (column->button, &requisition);
+
+ column->size = MAX (column->size, requisition.width);
+ tree_view->priv->header_height = MAX (tree_view->priv->header_height, requisition.height);
+ }
}
- gdk_window_show (widget->window);
}
static void
@@ -506,8 +549,11 @@ gtk_tree_view_size_request (GtkWidget *widget,
tmp_list = tmp_list->next;
- gtk_widget_size_request (child->widget, &child_requisition);
+ if (GTK_WIDGET_VISIBLE (child->widget))
+ gtk_widget_size_request (child->widget, &child_requisition);
}
+
+ gtk_tree_view_size_request_buttons (tree_view);
}
static void
@@ -525,7 +571,7 @@ gtk_tree_view_size_allocate_buttons (GtkWidget *widget)
allocation.y = 0;
allocation.height = tree_view->priv->header_height;
- for (last_column = g_list_last (tree_view->priv->column);
+ for (last_column = g_list_last (tree_view->priv->columns);
last_column && !(GTK_TREE_VIEW_COLUMN (last_column->data)->visible);
last_column = last_column->prev)
;
@@ -533,7 +579,7 @@ gtk_tree_view_size_allocate_buttons (GtkWidget *widget)
if (last_column == NULL)
return;
- for (list = tree_view->priv->column; list != last_column; list = list->next)
+ for (list = tree_view->priv->columns; list != last_column; list = list->next)
{
column = list->data;
@@ -546,16 +592,19 @@ gtk_tree_view_size_allocate_buttons (GtkWidget *widget)
gtk_widget_size_allocate (column->button, &allocation);
if (column->window)
- gdk_window_move (column->window, width - TREE_VIEW_DRAG_WIDTH/2, 0);
+ gdk_window_move_resize (column->window,
+ width - TREE_VIEW_DRAG_WIDTH/2, allocation.y,
+ TREE_VIEW_DRAG_WIDTH, allocation.height);
}
column = list->data;
allocation.x = width;
allocation.width = MAX (widget->allocation.width, tree_view->priv->width) - width;
gtk_widget_size_allocate (column->button, &allocation);
if (column->window)
- gdk_window_move (column->window,
- allocation.x +allocation.width - TREE_VIEW_DRAG_WIDTH/2,
- 0);
+ gdk_window_move_resize (column->window,
+ allocation.x + allocation.width - TREE_VIEW_DRAG_WIDTH/2,
+ 0,
+ TREE_VIEW_DRAG_WIDTH, allocation.height);
}
static void
@@ -602,6 +651,13 @@ gtk_tree_view_size_allocate (GtkWidget *widget,
tree_view->priv->header_height);
}
+ /* FIXME I don't think the invariant that the model must be setup
+ * before touching the buttons is maintained in most of the
+ * rest of the code, e.g. in realize, so something is wrong
+ */
+ if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_MODEL_SETUP))
+ gtk_tree_view_size_allocate_buttons (widget);
+
tree_view->priv->hadjustment->page_size = allocation->width;
tree_view->priv->hadjustment->page_increment = allocation->width / 2;
tree_view->priv->hadjustment->lower = 0;
@@ -618,9 +674,6 @@ gtk_tree_view_size_allocate (GtkWidget *widget,
gtk_adjustment_set_value (tree_view->priv->vadjustment,
(gfloat) MAX (tree_view->priv->height - allocation->height, 0));
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->vadjustment), "changed");
-
- if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_MODEL_SETUP))
- gtk_tree_view_size_allocate_buttons (widget);
}
/* Warning: Very scary function.
@@ -703,8 +756,8 @@ gtk_tree_view_bin_expose (GtkWidget *widget,
x_offset = -event->area.x;
cell_offset = 0;
- background_area.y = y_offset + event->area.y + TREE_VIEW_VERTICAL_SEPERATOR;
- background_area.height = max_height - TREE_VIEW_VERTICAL_SEPERATOR;
+ background_area.y = y_offset + event->area.y + TREE_VIEW_VERTICAL_SEPARATOR;
+ background_area.height = max_height - TREE_VIEW_VERTICAL_SEPARATOR;
flags = 0;
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PRELIT))
@@ -719,9 +772,9 @@ gtk_tree_view_bin_expose (GtkWidget *widget,
GTK_WIDGET (tree_view)->style->bg_gc [GTK_STATE_SELECTED],
TRUE,
event->area.x,
- background_area.y - (last_selected?TREE_VIEW_VERTICAL_SEPERATOR:0),
+ background_area.y - (last_selected?TREE_VIEW_VERTICAL_SEPARATOR:0),
event->area.width,
- background_area.height + (last_selected?TREE_VIEW_VERTICAL_SEPERATOR:0));
+ background_area.height + (last_selected?TREE_VIEW_VERTICAL_SEPARATOR:0));
last_selected = TRUE;
}
else
@@ -729,7 +782,7 @@ gtk_tree_view_bin_expose (GtkWidget *widget,
last_selected = FALSE;
}
- for (i = 0, list = tree_view->priv->column; i < tree_view->priv->columns; i++, list = list->next)
+ for (i = 0, list = tree_view->priv->columns; i < tree_view->priv->n_columns; i++, list = list->next)
{
GtkTreeViewColumn *column = list->data;
@@ -876,7 +929,7 @@ gtk_tree_view_motion (GtkWidget *widget,
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
tree_view = GTK_TREE_VIEW (widget);
-
+
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE))
{
gint x;
@@ -903,7 +956,7 @@ gtk_tree_view_motion (GtkWidget *widget,
return FALSE;
if (tree_view->priv->tree == NULL)
return FALSE;
-
+
if (tree_view->priv->prelight_node != NULL)
{
if ((((gint) event->y - TREE_VIEW_HEADER_HEIGHT (tree_view) < tree_view->priv->prelight_offset) ||
@@ -958,13 +1011,14 @@ gtk_tree_view_motion (GtkWidget *widget,
tree_view->priv->prelight_offset = event->y+y_offset;
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PRELIT);
+ /* FIXME */
gtk_widget_queue_draw (widget);
return TRUE;
}
-/* Is this function necessary? Can I get an enter_notify event w/o either
- * an expose event or a mouse motion event?
+/* FIXME Is this function necessary? Can I get an enter_notify event
+ * w/o either an expose event or a mouse motion event?
*/
static gboolean
gtk_tree_view_enter_notify (GtkWidget *widget,
@@ -1016,6 +1070,7 @@ gtk_tree_view_enter_notify (GtkWidget *widget,
tree_view->priv->prelight_offset = event->y+y_offset;
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PRELIT);
+ /* FIXME */
gtk_widget_queue_draw (widget);
return TRUE;
@@ -1039,6 +1094,7 @@ gtk_tree_view_leave_notify (GtkWidget *widget,
tree_view->priv->prelight_tree = NULL;
tree_view->priv->prelight_offset = 0;
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_ARROW_PRELIT);
+ /* FIXME */
gtk_widget_queue_draw (widget);
}
return TRUE;
@@ -1105,12 +1161,12 @@ gtk_tree_view_button_press (GtkWidget *widget,
/* Get the path and the node */
path = _gtk_tree_view_find_path (tree_view, tree, node);
depth = gtk_tree_path_get_depth (path);
- background_area.y = y_offset + event->y + TREE_VIEW_VERTICAL_SEPERATOR;
- background_area.height = GTK_RBNODE_GET_HEIGHT (node) - TREE_VIEW_VERTICAL_SEPERATOR;
+ background_area.y = y_offset + event->y + TREE_VIEW_VERTICAL_SEPARATOR;
+ background_area.height = GTK_RBNODE_GET_HEIGHT (node) - TREE_VIEW_VERTICAL_SEPARATOR;
background_area.x = 0;
/* Let the cell have a chance at selecting it. */
- for (i = 0, list = tree_view->priv->column; i < tree_view->priv->columns; i++, list = list->next)
+ for (i = 0, list = tree_view->priv->columns; i < tree_view->priv->n_columns; i++, list = list->next)
{
GtkTreeViewColumn *column = list->data;
GtkCellRenderer *cell;
@@ -1182,7 +1238,7 @@ gtk_tree_view_button_press (GtkWidget *widget,
return TRUE;
}
- for (i = 0, list = tree_view->priv->column; list; list = list->next, i++)
+ for (i = 0, list = tree_view->priv->columns; list; list = list->next, i++)
{
column = list->data;
if (event->window == column->window &&
@@ -1302,7 +1358,6 @@ gtk_tree_view_button_release (GtkWidget *widget,
gtk_tree_path_free (path);
_gtk_tree_view_set_size (GTK_TREE_VIEW (widget), -1, -1);
- gtk_widget_queue_resize (widget);
}
tree_view->priv->button_pressed_node = NULL;
@@ -1333,6 +1388,7 @@ gtk_tree_view_draw_focus (GtkWidget *widget)
if (cursor == NULL)
return;
+ /* FIXME need a style function appropriate for this */
gdk_draw_rectangle (tree_view->priv->bin_window,
widget->style->fg_gc[GTK_STATE_NORMAL],
FALSE,
@@ -1357,7 +1413,8 @@ gtk_tree_view_focus_in (GtkWidget *widget,
GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
- gtk_widget_draw_focus (widget);
+ /* FIXME don't redraw so much */
+ gtk_widget_queue_draw (widget);
return FALSE;
}
@@ -1373,6 +1430,7 @@ gtk_tree_view_focus_out (GtkWidget *widget,
GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
+ /* FIXME don't redraw so much */
gtk_widget_queue_draw (widget);
return FALSE;
@@ -1400,14 +1458,14 @@ gtk_tree_view_header_focus (GtkTreeView *tree_view,
focus_child = GTK_CONTAINER (tree_view)->focus_child;
container = GTK_CONTAINER (tree_view);
- for (last_column = g_list_last (tree_view->priv->column);
+ for (last_column = g_list_last (tree_view->priv->columns);
last_column &&
!(GTK_TREE_VIEW_COLUMN (last_column->data)->visible) &&
GTK_WIDGET_CAN_FOCUS (GTK_TREE_VIEW_COLUMN (last_column->data)->button);
last_column = last_column->prev)
;
- for (first_column = tree_view->priv->column;
+ for (first_column = tree_view->priv->columns;
first_column &&
!(GTK_TREE_VIEW_COLUMN (first_column->data)->visible) &&
GTK_WIDGET_CAN_FOCUS (GTK_TREE_VIEW_COLUMN (first_column->data)->button);
@@ -1508,7 +1566,7 @@ gtk_tree_view_header_focus (GtkTreeView *tree_view,
/* We need to move the focus to the next button. */
if (focus_child)
{
- for (tmp_list = tree_view->priv->column; tmp_list; tmp_list = tmp_list->next)
+ for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
if (GTK_TREE_VIEW_COLUMN (tmp_list->data)->button == focus_child)
{
if (gtk_container_focus (GTK_CONTAINER (GTK_TREE_VIEW_COLUMN (tmp_list->data)->button), dir))
@@ -1627,6 +1685,7 @@ gtk_tree_view_focus (GtkContainer *container,
if (tree_view->priv->cursor)
gtk_tree_selection_select_path (tree_view->priv->selection,
tree_view->priv->cursor);
+ /* FIXME make this more efficient */
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
return TRUE;
}
@@ -1656,6 +1715,7 @@ gtk_tree_view_focus (GtkContainer *container,
if (tree_view->priv->cursor)
gtk_tree_selection_select_path (tree_view->priv->selection,
tree_view->priv->cursor);
+ /* FIXME make this more efficient */
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
return TRUE;
}
@@ -1674,6 +1734,7 @@ gtk_tree_view_focus (GtkContainer *container,
tree_view->priv->cursor);
gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment),
0.0);
+ /* FIXME make this more efficient */
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
return TRUE;
}
@@ -1728,11 +1789,9 @@ gtk_tree_view_focus (GtkContainer *container,
{
GdkModifierType state = 0;
- event = gdk_event_peek ();
- if (event && event->type == GDK_KEY_PRESS)
- /* FIXME: This doesn't seem to work. )-:
- * I fear the event may already have been gotten */
- state = ((GdkEventKey *)event)->state;
+ event = gtk_get_current_event ();
+ if (event)
+ gdk_event_get_state (event, &state);
if (event)
gdk_event_free (event);
@@ -1749,6 +1808,7 @@ gtk_tree_view_focus (GtkContainer *container,
state);
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
+ /* FIXME make this more efficient */
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
return TRUE;
}
@@ -1827,7 +1887,7 @@ gtk_tree_view_forall (GtkContainer *container,
if (include_internals == FALSE)
return;
- for (tmp_list = tree_view->priv->column; tmp_list; tmp_list = tmp_list->next)
+ for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
{
column = tmp_list->data;
if (column->button)
@@ -1835,7 +1895,7 @@ gtk_tree_view_forall (GtkContainer *container,
}
}
-/* TreeModel Methods
+/* TreeModel Callbacks
*/
static void
@@ -1869,9 +1929,9 @@ gtk_tree_view_changed (GtkTreeModel *model,
gtk_tree_path_get_depth (path),
&height);
- if (GTK_RBNODE_GET_HEIGHT (node) != height + TREE_VIEW_VERTICAL_SEPERATOR)
+ if (GTK_RBNODE_GET_HEIGHT (node) != height + TREE_VIEW_VERTICAL_SEPARATOR)
{
- _gtk_rbtree_node_set_height (tree, node, height + TREE_VIEW_VERTICAL_SEPERATOR);
+ _gtk_rbtree_node_set_height (tree, node, height + TREE_VIEW_VERTICAL_SEPARATOR);
gtk_widget_queue_resize (GTK_WIDGET (data));
return;
}
@@ -1928,6 +1988,7 @@ gtk_tree_view_inserted (GtkTreeModel *model,
}
else if (!GTK_RBNODE_FLAG_SET (tmpnode, GTK_RBNODE_IS_PARENT))
{
+ /* FIXME enforce correct behavior on model, probably */
/* In theory, the model should have emitted child_toggled here. We
* try to catch it anyway, just to be safe, in case the model hasn't.
*/
@@ -2036,7 +2097,7 @@ gtk_tree_view_child_toggled (GtkTreeModel *model,
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_SHOW_EXPANDERS))
{
GList *list;
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
if (GTK_TREE_VIEW_COLUMN (list->data)->visible)
{
GTK_TREE_VIEW_COLUMN (list->data)->dirty = TRUE;
@@ -2103,7 +2164,7 @@ gtk_tree_view_deleted (GtkTreeModel *model,
}
}
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
if (((GtkTreeViewColumn *)list->data)->visible &&
((GtkTreeViewColumn *)list->data)->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
((GtkTreeViewColumn *)list->data)->dirty = TRUE;
@@ -2114,7 +2175,6 @@ gtk_tree_view_deleted (GtkTreeModel *model,
_gtk_rbtree_remove_node (tree, node);
_gtk_tree_view_set_size (GTK_TREE_VIEW (data), -1, -1);
- gtk_widget_queue_resize (data);
}
/* Internal tree functions */
@@ -2131,7 +2191,7 @@ gtk_tree_view_insert_iter_height (GtkTreeView *tree_view,
gint max_height = 0;
/* do stuff with node */
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
gint height = 0, width = 0;
column = list->data;
@@ -2148,7 +2208,7 @@ gtk_tree_view_insert_iter_height (GtkTreeView *tree_view,
gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, iter);
gtk_cell_renderer_get_size (cell, GTK_WIDGET (tree_view), &width, &height);
- max_height = MAX (max_height, TREE_VIEW_VERTICAL_SEPERATOR + height);
+ max_height = MAX (max_height, TREE_VIEW_VERTICAL_SEPARATOR + height);
if (first == TRUE && TREE_VIEW_DRAW_EXPANDERS (tree_view))
column->size = MAX (column->size, depth * tree_view->priv->tab_offset + width);
@@ -2187,7 +2247,7 @@ gtk_tree_view_build_tree (GtkTreeView *tree_view,
{
GtkTreeIter child;
- if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter));
+ if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter))
{
temp->children = _gtk_rbtree_new ();
temp->children->parent_tree = tree;
@@ -2228,7 +2288,7 @@ gtk_tree_view_calc_size (GtkTreeView *tree_view,
{
max_height = 0;
/* Do stuff with node */
- for (list = tree_view->priv->column, i = 0; i < tree_view->priv->columns; list = list->next, i++)
+ for (list = tree_view->priv->columns, i = 0; i < tree_view->priv->n_columns; list = list->next, i++)
{
gint height = 0, width = 0;
column = list->data;
@@ -2239,7 +2299,7 @@ gtk_tree_view_calc_size (GtkTreeView *tree_view,
gtk_tree_view_column_set_cell_data (column, tree_view->priv->model, iter);
cell = column->cell;
gtk_cell_renderer_get_size (cell, GTK_WIDGET (tree_view), &width, &height);
- max_height = MAX (max_height, TREE_VIEW_VERTICAL_SEPERATOR + height);
+ max_height = MAX (max_height, TREE_VIEW_VERTICAL_SEPARATOR + height);
/* FIXME: I'm getting the width of all nodes here. )-: */
if (column->dirty == FALSE || column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
@@ -2275,7 +2335,7 @@ gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
if (height)
*height = 0;
- for (i = 0, list = tree_view->priv->column; list; list = list->next, i++)
+ for (i = 0, list = tree_view->priv->columns; list; list = list->next, i++)
{
gint width;
column = list->data;
@@ -2337,7 +2397,7 @@ gtk_tree_view_discover_dirty (GtkTreeView *tree_view,
do
{
is_all_dirty = TRUE;
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
if (column->dirty == FALSE)
@@ -2371,7 +2431,7 @@ gtk_tree_view_check_dirty (GtkTreeView *tree_view)
GList *list;
GtkTreeViewColumn *column;
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
if (column->dirty)
@@ -2397,7 +2457,7 @@ gtk_tree_view_check_dirty (GtkTreeView *tree_view)
_gtk_tree_view_set_size (tree_view, -1, -1);
}
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
column->dirty = FALSE;
@@ -2411,7 +2471,7 @@ gtk_tree_view_create_button (GtkTreeView *tree_view,
GtkWidget *button;
GtkTreeViewColumn *column;
- column = g_list_nth (tree_view->priv->column, i)->data;
+ column = g_list_nth (tree_view->priv->columns, i)->data;
gtk_widget_push_composite_child ();
button = column->button = gtk_button_new ();
gtk_widget_pop_composite_child ();
@@ -2421,6 +2481,8 @@ gtk_tree_view_create_button (GtkTreeView *tree_view,
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) gtk_tree_view_button_clicked,
(gpointer) tree_view);
+
+ gtk_widget_show (button);
}
static void
@@ -2433,7 +2495,7 @@ gtk_tree_view_create_buttons (GtkTreeView *tree_view)
GtkTreeViewColumn *column;
gint i;
- for (list = tree_view->priv->column, i = 0; list; list = list->next, i++)
+ for (list = tree_view->priv->columns, i = 0; list; list = list->next, i++)
{
column = list->data;
@@ -2461,40 +2523,15 @@ gtk_tree_view_create_buttons (GtkTreeView *tree_view)
gtk_widget_show (label);
gtk_widget_show (alignment);
- gtk_widget_size_request (column->button, &requisition);
-
- column->size = MAX (column->size, requisition.width);
- tree_view->priv->header_height = MAX (tree_view->priv->header_height, requisition.height);
}
+
+ gtk_tree_view_size_request_buttons (tree_view);
+
if (GTK_WIDGET_REALIZED (tree_view))
- {
- gtk_tree_view_realize_buttons (tree_view);
- if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
- {
- /* We need to do this twice, as we need to map
- * all the buttons before we map the columns */
- for (list = tree_view->priv->column; list; list = list->next)
- {
- column = list->data;
- if (column->visible == FALSE)
- continue;
- gtk_widget_map (column->button);
- }
- for (list = tree_view->priv->column; list; list = list->next)
- {
- column = list->data;
- if (column->visible == FALSE)
- continue;
- if (column->column_type == GTK_TREE_VIEW_COLUMN_RESIZEABLE)
- {
- gdk_window_raise (column->window);
- gdk_window_show (column->window);
- }
- else
- gdk_window_hide (column->window);
- }
- }
- }
+ gtk_tree_view_realize_buttons (tree_view);
+
+ if (GTK_WIDGET_MAPPED (tree_view))
+ gtk_tree_view_map_buttons (tree_view);
}
static void
@@ -2509,13 +2546,13 @@ gtk_tree_view_button_clicked (GtkWidget *widget,
tree_view = GTK_TREE_VIEW (data);
- /* find the column who's button was pressed */
- for (list = tree_view->priv->column; list; list = list->next)
+ /* find the column whose button was pressed */
+ for (list = tree_view->priv->columns; list; list = list->next)
if (GTK_TREE_VIEW_COLUMN (list->data)->button == widget)
break;
- /* FIXME:
- * gtk_signal_emit (GTK_OBJECT (clist), clist_signals[CLICK_COLUMN], i); */
+ if (list)
+ gtk_tree_view_column_clicked (GTK_TREE_VIEW_COLUMN (list->data));
}
/* Make sure the node is visible vertically */
@@ -2544,7 +2581,8 @@ gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view,
/* This function could be more efficient.
* I'll optimize it if profiling seems to imply that
- * it's important */
+ * it's important
+ */
GtkTreePath *
_gtk_tree_view_find_path (GtkTreeView *tree_view,
GtkRBTree *tree,
@@ -2640,9 +2678,9 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
return;
area.x = 0;
- area.y = offset + TREE_VIEW_VERTICAL_SEPERATOR;
+ area.y = offset + TREE_VIEW_VERTICAL_SEPARATOR;
area.width = tree_view->priv->tab_offset - 2;
- area.height = GTK_RBNODE_GET_HEIGHT (node) - TREE_VIEW_VERTICAL_SEPERATOR;
+ area.height = GTK_RBNODE_GET_HEIGHT (node) - TREE_VIEW_VERTICAL_SEPARATOR;
if (node == tree_view->priv->button_pressed_node)
{
@@ -2683,14 +2721,15 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
points[2].y = points[0].y + TREE_VIEW_EXPANDER_HEIGHT/2;
}
+ /* FIXME this should be in the theme engine */
+
gdk_draw_polygon (tree_view->priv->bin_window,
GTK_WIDGET (tree_view)->style->base_gc[state],
TRUE, points, 3);
gdk_draw_polygon (tree_view->priv->bin_window,
GTK_WIDGET (tree_view)->style->fg_gc[state],
FALSE, points, 3);
-
-
+
/* gtk_paint_arrow (GTK_WIDGET (tree_view)->style, */
/* tree_view->priv->bin_window, */
/* state, */
@@ -2706,13 +2745,17 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
void
_gtk_tree_view_set_size (GtkTreeView *tree_view,
- gint width,
- gint height)
+ gint width,
+ gint height)
{
GList *list;
GtkTreeViewColumn *column;
gint i;
+ if (width == tree_view->priv->width &&
+ height == tree_view->priv->height)
+ return;
+
if (tree_view->priv->model == NULL)
{
tree_view->priv->width = 1;
@@ -2722,7 +2765,7 @@ _gtk_tree_view_set_size (GtkTreeView *tree_view,
if (width == -1)
{
width = 0;
- for (list = tree_view->priv->column, i = 0; list; list = list->next, i++)
+ for (list = tree_view->priv->columns, i = 0; list; list = list->next, i++)
{
column = list->data;
if (!column->visible)
@@ -2731,7 +2774,7 @@ _gtk_tree_view_set_size (GtkTreeView *tree_view,
}
}
if (height == -1)
- height = tree_view->priv->tree->root->offset + TREE_VIEW_VERTICAL_SEPERATOR;
+ height = tree_view->priv->tree->root->offset + TREE_VIEW_VERTICAL_SEPARATOR;
tree_view->priv->width = width;
tree_view->priv->height = height;
@@ -2758,7 +2801,8 @@ _gtk_tree_view_set_size (GtkTreeView *tree_view,
/* this function returns the new width of the column being resized given
* the column and x position of the cursor; the x cursor position is passed
- * in as a pointer and automagicly corrected if it's beyond min/max limits */
+ * in as a pointer and automagicly corrected if it's beyond min/max limits
+ */
static gint
gtk_tree_view_new_column_width (GtkTreeView *tree_view,
gint i,
@@ -2768,9 +2812,10 @@ gtk_tree_view_new_column_width (GtkTreeView *tree_view,
gint width;
/* first translate the x position from widget->window
- * to clist->clist_window */
+ * to clist->clist_window
+ */
- column = g_list_nth (tree_view->priv->column, i)->data;
+ column = g_list_nth (tree_view->priv->columns, i)->data;
width = *x - column->button->allocation.x;
/* Clamp down the value */
@@ -2866,7 +2911,7 @@ gtk_tree_view_get_model (GtkTreeView *tree_view)
}
static void
-gtk_tree_view_set_model_realized (GtkTreeView *tree_view)
+gtk_tree_view_setup_model (GtkTreeView *tree_view)
{
GtkTreePath *path;
GtkTreeIter iter;
@@ -2890,7 +2935,7 @@ gtk_tree_view_set_model_realized (GtkTreeView *tree_view)
gtk_tree_view_deleted,
tree_view);
- if (tree_view->priv->column == NULL)
+ if (tree_view->priv->columns == NULL)
return;
path = gtk_tree_path_new_root ();
@@ -2926,7 +2971,7 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
if (tree_view->priv->model != NULL)
{
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
if (column->button)
@@ -2953,8 +2998,8 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
_gtk_rbtree_free (tree_view->priv->tree);
}
- g_list_free (tree_view->priv->column);
- tree_view->priv->column = NULL;
+ g_list_free (tree_view->priv->columns);
+ tree_view->priv->columns = NULL;
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_MODEL_SETUP);
}
@@ -2962,16 +3007,15 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
if (model == NULL)
{
tree_view->priv->tree = NULL;
- tree_view->priv->columns = 0;
- tree_view->priv->column = NULL;
+ tree_view->priv->n_columns = 0;
+ tree_view->priv->columns = NULL;
if (GTK_WIDGET_REALIZED (tree_view))
_gtk_tree_view_set_size (tree_view, 0, 0);
return;
}
-
- if (GTK_WIDGET_REALIZED (tree_view))
+ else if (GTK_WIDGET_REALIZED (tree_view))
{
- gtk_tree_view_set_model_realized (tree_view);
+ gtk_tree_view_setup_model (tree_view);
_gtk_tree_view_set_size (tree_view, -1, -1);
}
}
@@ -3011,6 +3055,9 @@ gtk_tree_view_get_hadjustment (GtkTreeView *tree_view)
g_return_val_if_fail (tree_view != NULL, NULL);
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
+ if (tree_view->priv->hadjustment == NULL)
+ gtk_tree_view_set_hadjustment (tree_view, NULL);
+
return tree_view->priv->hadjustment;
}
@@ -3048,6 +3095,9 @@ gtk_tree_view_get_vadjustment (GtkTreeView *tree_view)
g_return_val_if_fail (tree_view != NULL, NULL);
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
+ if (tree_view->priv->vadjustment == NULL)
+ gtk_tree_view_set_vadjustment (tree_view, NULL);
+
return tree_view->priv->vadjustment;
}
@@ -3175,6 +3225,8 @@ gtk_tree_view_set_headers_visible (GtkTreeView *tree_view,
g_return_if_fail (tree_view != NULL);
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
+ headers_visible = !! headers_visible;
+
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE) == headers_visible)
return;
@@ -3189,31 +3241,15 @@ gtk_tree_view_set_headers_visible (GtkTreeView *tree_view,
if (headers_visible)
{
gdk_window_move_resize (tree_view->priv->bin_window, x, y, tree_view->priv->width, tree_view->priv->height + TREE_VIEW_HEADER_HEIGHT (tree_view));
- for (list = tree_view->priv->column; list; list = list->next)
- {
- column = list->data;
- gtk_widget_map (column->button);
- }
-
- for (list = tree_view->priv->column; list; list = list->next)
- {
- column = list->data;
- if (column->visible == FALSE)
- continue;
- if (column->column_type == GTK_TREE_VIEW_COLUMN_RESIZEABLE)
- {
- gdk_window_raise (column->window);
- gdk_window_show (column->window);
- }
- else
- gdk_window_hide (column->window);
- }
- gdk_window_show (tree_view->priv->header_window);
+
+ if (GTK_WIDGET_MAPPED (tree_view))
+ gtk_tree_view_map_buttons (tree_view);
}
else
{
gdk_window_move_resize (tree_view->priv->bin_window, x, y, tree_view->priv->width, tree_view->priv->height);
- for (list = tree_view->priv->column; list; list = list->next)
+
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
gtk_widget_unmap (column->button);
@@ -3248,7 +3284,7 @@ gtk_tree_view_columns_autosize (GtkTreeView *tree_view)
g_return_if_fail (tree_view != NULL);
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
if (column->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
@@ -3261,6 +3297,9 @@ gtk_tree_view_columns_autosize (GtkTreeView *tree_view)
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
}
+/* FIXME let's rename this to be "interactive" or something,
+ * "active" is confusing since it also is a widget state
+ */
/**
* gtk_tree_view_set_headers_active:
* @tree_view: A #GtkTreeView.
@@ -3278,7 +3317,7 @@ gtk_tree_view_set_headers_active (GtkTreeView *tree_view,
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
g_return_if_fail (tree_view->priv->model != NULL);
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
gtk_tree_view_column_set_header_active (GTK_TREE_VIEW_COLUMN (list->data), active);
}
@@ -3289,7 +3328,7 @@ gtk_tree_view_set_headers_active (GtkTreeView *tree_view,
*
* Appends @column to the list of columns.
*
- * Return value: The number of columns in @tree_view.
+ * Return value: The number of columns in @tree_view after appending.
**/
gint
gtk_tree_view_append_column (GtkTreeView *tree_view,
@@ -3302,10 +3341,15 @@ gtk_tree_view_append_column (GtkTreeView *tree_view,
g_return_val_if_fail (column->tree_view == NULL, -1);
g_object_ref (G_OBJECT (column));
- tree_view->priv->column = g_list_append (tree_view->priv->column,
- column);
+ tree_view->priv->columns = g_list_append (tree_view->priv->columns,
+ column);
column->tree_view = GTK_WIDGET (tree_view);
- return tree_view->priv->columns++;
+
+ tree_view->priv->n_columns++;
+
+ /* FIXME create header for the new column! */
+
+ return tree_view->priv->n_columns;
}
@@ -3316,7 +3360,7 @@ gtk_tree_view_append_column (GtkTreeView *tree_view,
*
* Removes @column from @tree_view.
*
- * Return value: The number of columns in @tree_view.
+ * Return value: The number of columns in @tree_view after removing.
**/
gint
gtk_tree_view_remove_column (GtkTreeView *tree_view,
@@ -3328,14 +3372,17 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view,
g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (column), -1);
g_return_val_if_fail (column->tree_view == GTK_WIDGET (tree_view), -1);
- tree_view->priv->column = g_list_remove (tree_view->priv->column,
+ tree_view->priv->columns = g_list_remove (tree_view->priv->columns,
column);
column->tree_view = NULL;
g_object_unref (G_OBJECT (column));
- return tree_view->priv->columns--;
-}
+ tree_view->priv->n_columns--;
+ /* FIXME destroy header for the column! */
+
+ return tree_view->priv->n_columns;
+}
/**
* gtk_tree_view_insert_column:
@@ -3345,7 +3392,7 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view,
*
* This inserts the @column into the @tree_view at @position.
*
- * Return value: The number of columns in @tree_view.
+ * Return value: The number of columns in @tree_view after insertion.
**/
gint
gtk_tree_view_insert_column (GtkTreeView *tree_view,
@@ -3359,10 +3406,15 @@ gtk_tree_view_insert_column (GtkTreeView *tree_view,
g_return_val_if_fail (column->tree_view == NULL, -1);
g_object_ref (G_OBJECT (column));
- tree_view->priv->column = g_list_insert (tree_view->priv->column,
+ tree_view->priv->columns = g_list_insert (tree_view->priv->columns,
column, position);
column->tree_view = GTK_WIDGET (tree_view);
- return tree_view->priv->columns++;
+
+ tree_view->priv->n_columns++;
+
+ /* FIXME create header for the column! */
+
+ return tree_view->priv->n_columns;
}
/**
@@ -3382,12 +3434,14 @@ gtk_tree_view_get_column (GtkTreeView *tree_view,
g_return_val_if_fail (tree_view != NULL, NULL);
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
g_return_val_if_fail (tree_view->priv->model != NULL, NULL);
- g_return_val_if_fail (n >= 0 || n < tree_view->priv->columns, NULL);
- if (tree_view->priv->column == NULL)
+ if (n < 0 || n >= tree_view->priv->n_columns)
+ return NULL;
+
+ if (tree_view->priv->columns == NULL)
return NULL;
- return GTK_TREE_VIEW_COLUMN (g_list_nth (tree_view->priv->column, n)->data);
+ return GTK_TREE_VIEW_COLUMN (g_list_nth (tree_view->priv->columns, n)->data);
}
/**
@@ -3398,12 +3452,14 @@ gtk_tree_view_get_column (GtkTreeView *tree_view,
* @row_align: The vertical alignment of the row specified by @path.
* @col_align: The horizontal alignment of the column specified by @column.
*
- * Moves the alignments of @tree_view to the position specified by @column and
- * @path. If @column is NULL, then the first visible column is assumed, and the
- * @tree_view is left justified. Likewise, if @path is NULL the first row is
- * assumed, and the @tree_view is top justified. @row_align determines where
- * the @row is placed, and @col_align determines where @column is placed. Both
- * are expected to be between 0.0 and 1.0.
+ * Moves the alignments of @tree_view to the position specified by
+ * @column and @path. If @column is NULL, then the first visible
+ * column is assumed, and the @tree_view is left justified. Likewise,
+ * if @path is NULL the first row is assumed, and the @tree_view is
+ * top justified. @row_align determines where the row is placed, and
+ * @col_align determines where @column is placed. Both are expected
+ * to be between 0.0 and 1.0. 0.0 means left/top alignment, 1.0 means
+ * right/bottom alignment, 0.5 means center.
**/
void
gtk_tree_view_move_to (GtkTreeView *tree_view,
@@ -3490,7 +3546,7 @@ gtk_tree_view_get_path_at_pos (GtkTreeView *tree_view,
GtkTreeViewColumn *last_column = NULL;
GList *list;
- for (list = tree_view->priv->column; list; list = list->next)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
tmp_column = list->data;
@@ -3636,10 +3692,25 @@ gtk_tree_view_collapse_all (GtkTreeView *tree_view)
gtk_tree_view_collapse_all_helper,
tree_view);
- if (GTK_WIDGET_REALIZED (tree_view))
+ if (GTK_WIDGET_MAPPED (tree_view))
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
}
+/* FIXME the bool return values for expand_row and collapse_row are
+ * not analagous; they should be TRUE if the row had children and
+ * was not already in the requested state.
+ */
+
+/**
+ * gtk_tree_view_expand_row:
+ * @tree_view: a #GtkTreeView
+ * @path: path to a row
+ * @open_all: whether to recursively expand, or just expand immediate children
+ *
+ * Opens the row so its children are visible
+ *
+ * Return value: %TRUE if the row existed and had children
+ **/
gboolean
gtk_tree_view_expand_row (GtkTreeView *tree_view,
GtkTreePath *path,
@@ -3677,12 +3748,21 @@ gtk_tree_view_expand_row (GtkTreeView *tree_view,
open_all,
GTK_WIDGET_REALIZED (tree_view));
- if (GTK_WIDGET_REALIZED (tree_view))
+ if (GTK_WIDGET_MAPPED (tree_view))
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
return TRUE;
}
+/**
+ * gtk_tree_view_collapse_row:
+ * @tree_view: a #GtkTreeView
+ * @path: path to a row in the @tree_view
+ *
+ * Collapses a row (hides its child rows).
+ *
+ * Return value: %TRUE if the row was expanded
+ **/
gboolean
gtk_tree_view_collapse_row (GtkTreeView *tree_view,
GtkTreePath *path)
@@ -3712,7 +3792,7 @@ gtk_tree_view_collapse_row (GtkTreeView *tree_view,
gtk_tree_path_get_depth (path));
_gtk_rbtree_remove (node->children);
- if (GTK_WIDGET_REALIZED (tree_view))
+ if (GTK_WIDGET_MAPPED (tree_view))
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
return TRUE;
diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c
index be5b213745..11cd719395 100644
--- a/gtk/gtktreeviewcolumn.c
+++ b/gtk/gtktreeviewcolumn.c
@@ -607,6 +607,20 @@ gtk_tree_view_column_get_max_width (GtkTreeViewColumn *tree_column)
}
/**
+ * gtk_tree_view_column_clicked:
+ * @tree_column: a #GtkTreeViewColumn
+ *
+ * Emits the "clicked" signal on the column.
+ **/
+void
+gtk_tree_view_column_clicked (GtkTreeViewColumn *tree_column)
+{
+ g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
+
+ gtk_signal_emit (GTK_OBJECT (tree_column), tree_column_signals[CLICKED]);
+}
+
+/**
* gtk_tree_view_column_set_title:
* @tree_column: A #GtkTreeViewColumn.
* @title: The title of the @tree_column.
diff --git a/gtk/gtktreeviewcolumn.h b/gtk/gtktreeviewcolumn.h
index 148c488ac8..8a66a91792 100644
--- a/gtk/gtktreeviewcolumn.h
+++ b/gtk/gtktreeviewcolumn.h
@@ -114,6 +114,7 @@ void gtk_tree_view_column_set_max_width (GtkTreeViewColumn
gint gtk_tree_view_column_get_max_width (GtkTreeViewColumn *tree_column);
+void gtk_tree_view_column_clicked (GtkTreeViewColumn *tree_column);
/* Options for manipulating the column headers
*/