summaryrefslogtreecommitdiff
path: root/gtk/gtktreeview.c
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2001-05-01 23:09:50 +0000
committerJonathan Blandford <jrb@src.gnome.org>2001-05-01 23:09:50 +0000
commit5ce6ee5f8ab3b72341bac908018cc727acccbb26 (patch)
treed4663944d92fb8cc6e6d9ea1d6d265d26e396caf /gtk/gtktreeview.c
parentc626cd4233c03dc5a1ec81a2b272e59bed285c85 (diff)
downloadgtk+-5ce6ee5f8ab3b72341bac908018cc727acccbb26.tar.gz
Add autoscroll support. It mostly works, but could use some fine tuning.
Tue May 1 19:09:21 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (gtk_tree_view_horizontal_autoscroll): Add autoscroll support. It mostly works, but could use some fine tuning. * gtk/gtktreeview.c (gtk_tree_view_button_release_drag_column): Actually move the column.
Diffstat (limited to 'gtk/gtktreeview.c')
-rw-r--r--gtk/gtktreeview.c222
1 files changed, 127 insertions, 95 deletions
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 5a9ea21fad..284d2a063f 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -247,6 +247,8 @@ static void gtk_tree_view_get_arrow_xrange (GtkTreeView *tree_view,
static gint gtk_tree_view_new_column_width (GtkTreeView *tree_view,
gint i,
gint *x);
+static void gtk_tree_view_ensure_scroll_timeout(GtkTreeView *tree_view,
+ GFunc func);
static void gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
GtkTreeView *tree_view);
static gint gtk_tree_view_insert_iter_height (GtkTreeView *tree_view,
@@ -1322,6 +1324,9 @@ gtk_tree_view_button_release_drag_column (GtkWidget *widget,
gtk_widget_set_parent_window (tree_view->priv->drag_column->button, tree_view->priv->header_window);
gtk_widget_size_allocate (tree_view->priv->drag_column->button, &allocation);
+ if (tree_view->priv->cur_reorder->left_column != tree_view->priv->drag_column)
+ gtk_tree_view_move_column_after (tree_view, tree_view->priv->drag_column,
+ tree_view->priv->cur_reorder->left_column);
tree_view->priv->drag_column = NULL;
gdk_window_hide (tree_view->priv->drag_window);
@@ -1465,6 +1470,10 @@ gtk_tree_view_button_release (GtkWidget *widget,
return TRUE;
}
+
+/* GtkWidget::motion_event function set.
+ */
+
static gboolean
coords_are_over_arrow (GtkTreeView *tree_view,
GtkRBTree *tree,
@@ -1552,28 +1561,6 @@ ensure_unprelighted (GtkTreeView *tree_view)
do_unprelight (tree_view, -1000, -1000); /* coords not possibly over an arrow */
}
-/* GtkWidget::motion_event helper */
-static gboolean
-gtk_tree_view_motion_resize_column (GtkWidget *widget,
- GdkEventMotion *event)
-{
- gint x;
- gint new_width;
-
- if (event->is_hint || event->window != widget->window)
- gtk_widget_get_pointer (widget, &x, NULL);
- else
- x = event->x;
-
- new_width = gtk_tree_view_new_column_width (GTK_TREE_VIEW (widget),
- GTK_TREE_VIEW (widget)->priv->drag_pos, &x);
- if (x != GTK_TREE_VIEW (widget)->priv->x_drag)
- gtk_tree_view_column_set_width (gtk_tree_view_get_column (GTK_TREE_VIEW (widget), GTK_TREE_VIEW (widget)->priv->drag_pos), new_width);
-
- /* FIXME: Do we need to scroll */
- _gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
- return FALSE;
-}
/* Our motion arrow is either a box (in the case of the original spot)
@@ -1619,6 +1606,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
GdkColor col;
gdk_window_get_origin (tree_view->priv->header_window, &x, &y);
+
x += tree_view->priv->drag_column_x;
width = tree_view->priv->drag_column->button->allocation.width;
height = tree_view->priv->drag_column->button->allocation.height;
@@ -1666,6 +1654,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
gdk_gc_set_foreground (gc, &col);
gdk_draw_rectangle (mask, gc, TRUE, 0, 0, width, height);
+ /* Draw the 2 arrows as per above */
col.pixel = 0;
gdk_gc_set_foreground(gc, &col);
for (i = 0; i < width; i ++)
@@ -1698,54 +1687,81 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
gdk_window_raise (tree_view->priv->drag_highlight_window);
}
-static gint
-drag_column_scroll_timeout (gpointer data)
+static gboolean
+gtk_tree_view_motion_resize_column (GtkWidget *widget,
+ GdkEventMotion *event)
{
- GtkTreeView *tree_view;
- gint x, y;
- GdkModifierType state;
- GtkTreePath *path = NULL;
- GtkTreeViewColumn *column = NULL;
- GdkRectangle visible_rect;
+ gint x;
+ gint new_width;
- tree_view = GTK_TREE_VIEW (data);
+ if (event->is_hint || event->window != widget->window)
+ gtk_widget_get_pointer (widget, &x, NULL);
+ else
+ x = event->x;
- gdk_window_get_pointer (tree_view->priv->bin_window,
- &x, &y, &state);
+ new_width = gtk_tree_view_new_column_width (GTK_TREE_VIEW (widget),
+ GTK_TREE_VIEW (widget)->priv->drag_pos, &x);
+ if (x != GTK_TREE_VIEW (widget)->priv->x_drag)
+ gtk_tree_view_column_set_width (gtk_tree_view_get_column (GTK_TREE_VIEW (widget), GTK_TREE_VIEW (widget)->priv->drag_pos), new_width);
- gtk_tree_view_get_visible_rect (tree_view, &visible_rect);
+ /* FIXME: Do we need to scroll */
+ _gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
+ return FALSE;
+}
- /* See if we are near the edge. */
- if ((x - visible_rect.x) < SCROLL_EDGE_SIZE ||
- (visible_rect.x + visible_rect.width - x) < SCROLL_EDGE_SIZE)
- {
- gtk_tree_view_get_path_at_pos (tree_view,
- tree_view->priv->bin_window,
- x, y,
- &path,
- &column,
- NULL,
- NULL);
- if (path != NULL)
- {
- gtk_tree_view_scroll_to_cell (tree_view,
- path,
- column,
- 0.5, 0.5);
+static void
+gtk_tree_view_update_current_reorder (GtkTreeView *tree_view)
+{
+ GtkTreeViewColumnReorder *reorder = NULL;
+ GList *list;
+ gint mouse_x;
- gtk_tree_path_free (path);
- }
+ gdk_window_get_pointer (tree_view->priv->bin_window, &mouse_x, NULL, NULL);
+
+ for (list = tree_view->priv->column_drag_info; list; list = list->next)
+ {
+ reorder = (GtkTreeViewColumnReorder *) list->data;
+ if (mouse_x >= reorder->left_align && mouse_x < reorder->right_align)
+ break;
+ reorder = NULL;
}
- return TRUE;
+ /* if (reorder && reorder == tree_view->priv->cur_reorder)
+ return;*/
+
+ tree_view->priv->cur_reorder = reorder;
+ gtk_tree_view_motion_draw_column_motion_arrow (tree_view);
}
-static void
-ensure_drag_column_scroll_timeout (GtkTreeView *tree_view)
+static gboolean
+gtk_tree_view_horizontal_autoscroll (GtkTreeView *tree_view)
{
- if (tree_view->priv->scroll_timeout == 0)
- tree_view->priv->scroll_timeout = gtk_timeout_add (50, drag_column_scroll_timeout, tree_view);
+ GdkRectangle visible_rect;
+ gint x;
+ gint offset;
+ gfloat value;
+
+ gdk_window_get_pointer (tree_view->priv->bin_window, &x, NULL, NULL);
+
+ gtk_tree_view_get_visible_rect (tree_view, &visible_rect);
+
+ /* See if we are near the edge. */
+ offset = x - (visible_rect.x + SCROLL_EDGE_SIZE);
+ if (offset > 0)
+ {
+ offset = x - (visible_rect.x + visible_rect.width - SCROLL_EDGE_SIZE);
+ if (offset < 0)
+ return TRUE;
+ }
+ offset = offset/3;
+
+ value = CLAMP (tree_view->priv->hadjustment->value + offset,
+ 0.0, tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size);
+ gtk_adjustment_set_value (tree_view->priv->hadjustment, value);
+
+ return TRUE;
+
}
static gboolean
@@ -1754,40 +1770,23 @@ gtk_tree_view_motion_drag_column (GtkWidget *widget,
{
GtkTreeView *tree_view = (GtkTreeView *) widget;
GtkTreeViewColumn *column = tree_view->priv->drag_column;
- GtkTreeViewColumnReorder *reorder = NULL;
- GList *list;
gint x, y;
- if (column == NULL)
+ /* Sanity Check */
+ if ((column == NULL) ||
+ (event->window != tree_view->priv->drag_window))
return FALSE;
- if (event->window != tree_view->priv->drag_window)
- return FALSE;
-
- ensure_drag_column_scroll_timeout (tree_view);
-
+ /* Handle moving the header */
gdk_window_get_position (tree_view->priv->drag_window, &x, &y);
x = CLAMP (x + (gint)event->x - column->drag_x, 0,
MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width) - column->button->allocation.width);
-
gdk_window_move (tree_view->priv->drag_window, x, y);
- gdk_window_get_position (tree_view->priv->drag_window, &x, NULL);
- x += (gint)event->x;
- for (list = tree_view->priv->column_drag_info; list; list = list->next)
- {
- reorder = (GtkTreeViewColumnReorder *) list->data;
- if (x >= reorder->left_align && x < reorder->right_align)
- break;
- reorder = NULL;
- }
-
- if (reorder && reorder == tree_view->priv->cur_reorder)
- return TRUE;
-
- tree_view->priv->cur_reorder = reorder;
-
- gtk_tree_view_motion_draw_column_motion_arrow (tree_view);
+ /* autoscroll, if needed */
+ gtk_tree_view_horizontal_autoscroll (tree_view);
+ /* Update the current reorder position and arrow; */
+ gtk_tree_view_update_current_reorder (tree_view);
return TRUE;
}
@@ -1859,6 +1858,7 @@ gtk_tree_view_motion (GtkWidget *widget,
tree_view = (GtkTreeView *) widget;
+ /* Resizing a column */
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE))
return gtk_tree_view_motion_resize_column (widget, event);
@@ -1869,6 +1869,7 @@ gtk_tree_view_motion (GtkWidget *widget,
/* Sanity check it */
if (event->window == tree_view->priv->bin_window)
return gtk_tree_view_motion_bin_window (widget, event);
+
return FALSE;
}
@@ -2655,13 +2656,6 @@ drag_scan_timeout (gpointer data)
static void
-ensure_scroll_timeout (GtkTreeView *tree_view)
-{
- if (tree_view->priv->scroll_timeout == 0)
- tree_view->priv->scroll_timeout = gtk_timeout_add (50, drag_scan_timeout, tree_view);
-}
-
-static void
remove_scroll_timeout (GtkTreeView *tree_view)
{
if (tree_view->priv->scroll_timeout != 0)
@@ -3099,7 +3093,7 @@ gtk_tree_view_drag_motion (GtkWidget *widget,
if (!set_destination_row (tree_view, context, x, y, &suggested_action, &target))
return FALSE;
- ensure_scroll_timeout (tree_view);
+ // gtk_tree_view_ensure_scroll_timeout (tree_view);
gtk_tree_view_get_drag_dest_row (tree_view, &path, &pos);
@@ -5331,6 +5325,14 @@ gtk_tree_view_new_column_width (GtkTreeView *tree_view,
return width;
}
+
+static void
+gtk_tree_view_ensure_scroll_timeout (GtkTreeView *tree_view, GFunc func)
+{
+ if (tree_view->priv->scroll_timeout == 0)
+ tree_view->priv->scroll_timeout = gtk_timeout_add (50, func, tree_view);
+}
+
/* Callbacks */
static void
gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
@@ -5959,7 +5961,6 @@ gtk_tree_view_get_column (GtkTreeView *tree_view,
gint n)
{
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
- g_return_val_if_fail (tree_view->priv->model != NULL, NULL);
if (n < 0 || n >= tree_view->priv->n_columns)
return NULL;
@@ -5983,7 +5984,6 @@ GList *
gtk_tree_view_get_columns (GtkTreeView *tree_view)
{
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
- g_return_val_if_fail (tree_view->priv->model != NULL, NULL);
return g_list_copy (tree_view->priv->columns);
}
@@ -6002,8 +6002,40 @@ gtk_tree_view_move_column_after (GtkTreeView *tree_view,
GtkTreeViewColumn *column,
GtkTreeViewColumn *base_column)
{
- /* FIXME: right this function. */
- g_warning ("FIXME: needs implementing\n");
+ GList *column_list_el, *base_el = NULL;
+
+ g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
+
+ column_list_el = g_list_find (tree_view->priv->columns, column);
+ g_return_if_fail (column_list_el != NULL);
+
+ if (base_column)
+ {
+ base_el = g_list_find (tree_view->priv->columns, base_column);
+ g_return_if_fail (base_el != NULL);
+ }
+
+ if (column_list_el->prev == base_el)
+ return;
+
+ tree_view->priv->columns = g_list_remove_link (tree_view->priv->columns, column_list_el);
+ if (base_el == NULL)
+ {
+ column_list_el->prev = NULL;
+ column_list_el->next = tree_view->priv->columns;
+ column_list_el->next->prev = column_list_el;
+ tree_view->priv->columns = column_list_el;
+ }
+ else
+ {
+ column_list_el->prev = base_el;
+ column_list_el->next = base_el->next;
+ column_list_el->next->prev = column_list_el;
+ base_el->next = column_list_el;
+ }
+
+ if (GTK_WIDGET_REALIZED (tree_view))
+ _gtk_tree_view_update_size (GTK_TREE_VIEW (tree_view));
}
/**