Commit abc8455d authored by Soeren Sandmann's avatar Soeren Sandmann Committed by Søren Sandmann Pedersen

Opaque resizing + prelighting for paned widget. move reszing logic to

Mon Feb 11 22:03:15 2002  Soeren Sandmann  <sandmann@daimi.au.dk>

	* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
	* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
parent d456e05b
Mon Feb 11 22:03:15 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
Mon Feb 11 21:42:17 2002 Kristian Rietveld <kris@gtk.org>
Implements DnD scrolling and fixes #71139
......@@ -29,6 +34,7 @@ Mon Feb 11 16:40:44 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeview.c (gtk_tree_view_set_model): install presize
handler, so the validate_rows_handler will always be run (#70997)
>>>>>>> 1.2993
Sun Feb 10 22:20:46 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkliststore.c (gtk_list_store_sort_iter_changed): increase
......
Mon Feb 11 22:03:15 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
Mon Feb 11 21:42:17 2002 Kristian Rietveld <kris@gtk.org>
Implements DnD scrolling and fixes #71139
......@@ -29,6 +34,7 @@ Mon Feb 11 16:40:44 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeview.c (gtk_tree_view_set_model): install presize
handler, so the validate_rows_handler will always be run (#70997)
>>>>>>> 1.2993
Sun Feb 10 22:20:46 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkliststore.c (gtk_list_store_sort_iter_changed): increase
......
Mon Feb 11 22:03:15 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
Mon Feb 11 21:42:17 2002 Kristian Rietveld <kris@gtk.org>
Implements DnD scrolling and fixes #71139
......@@ -29,6 +34,7 @@ Mon Feb 11 16:40:44 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeview.c (gtk_tree_view_set_model): install presize
handler, so the validate_rows_handler will always be run (#70997)
>>>>>>> 1.2993
Sun Feb 10 22:20:46 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkliststore.c (gtk_list_store_sort_iter_changed): increase
......
Mon Feb 11 22:03:15 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
Mon Feb 11 21:42:17 2002 Kristian Rietveld <kris@gtk.org>
Implements DnD scrolling and fixes #71139
......@@ -29,6 +34,7 @@ Mon Feb 11 16:40:44 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeview.c (gtk_tree_view_set_model): install presize
handler, so the validate_rows_handler will always be run (#70997)
>>>>>>> 1.2993
Sun Feb 10 22:20:46 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkliststore.c (gtk_list_store_sort_iter_changed): increase
......
Mon Feb 11 22:03:15 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
Mon Feb 11 21:42:17 2002 Kristian Rietveld <kris@gtk.org>
Implements DnD scrolling and fixes #71139
......@@ -29,6 +34,7 @@ Mon Feb 11 16:40:44 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeview.c (gtk_tree_view_set_model): install presize
handler, so the validate_rows_handler will always be run (#70997)
>>>>>>> 1.2993
Sun Feb 10 22:20:46 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkliststore.c (gtk_list_store_sort_iter_changed): increase
......
Mon Feb 11 22:03:15 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
Mon Feb 11 21:42:17 2002 Kristian Rietveld <kris@gtk.org>
Implements DnD scrolling and fixes #71139
......@@ -29,6 +34,7 @@ Mon Feb 11 16:40:44 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeview.c (gtk_tree_view_set_model): install presize
handler, so the validate_rows_handler will always be run (#70997)
>>>>>>> 1.2993
Sun Feb 10 22:20:46 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkliststore.c (gtk_list_store_sort_iter_changed): increase
......
Mon Feb 11 22:03:15 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkpaned.[ch]: Opaque resizing + prelighting for paned widget.
* gtk/gtkvpaned.c, gtk/gtkvpaned.h: move reszing logic to gtkpaned.c
Mon Feb 11 21:42:17 2002 Kristian Rietveld <kris@gtk.org>
Implements DnD scrolling and fixes #71139
......@@ -29,6 +34,7 @@ Mon Feb 11 16:40:44 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeview.c (gtk_tree_view_set_model): install presize
handler, so the validate_rows_handler will always be run (#70997)
>>>>>>> 1.2993
Sun Feb 10 22:20:46 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkliststore.c (gtk_list_store_sort_iter_changed): increase
......
......@@ -32,13 +32,6 @@ static void gtk_hpaned_size_request (GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_hpaned_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static void gtk_hpaned_xor_line (GtkPaned *paned);
static gboolean gtk_hpaned_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_hpaned_button_release (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_hpaned_motion (GtkWidget *widget,
GdkEventMotion *event);
static gpointer parent_class;
......@@ -78,9 +71,6 @@ gtk_hpaned_class_init (GtkHPanedClass *class)
widget_class->size_request = gtk_hpaned_size_request;
widget_class->size_allocate = gtk_hpaned_size_allocate;
widget_class->button_press_event = gtk_hpaned_button_press;
widget_class->button_release_event = gtk_hpaned_button_release;
widget_class->motion_notify_event = gtk_hpaned_motion;
}
static void
......@@ -231,119 +221,3 @@ gtk_hpaned_size_allocate (GtkWidget *widget,
gtk_widget_size_allocate (paned->child2, &child_allocation);
}
}
static void
gtk_hpaned_xor_line (GtkPaned *paned)
{
GtkWidget *widget;
GdkGCValues values;
guint16 xpos;
gint handle_size;
widget = GTK_WIDGET (paned);
gtk_widget_style_get (widget, "handle_size", &handle_size, NULL);
if (!paned->xor_gc)
{
values.function = GDK_INVERT;
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
paned->xor_gc = gdk_gc_new_with_values (widget->window,
&values,
GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
}
gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID,
GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL);
xpos = widget->allocation.x + paned->child1_size
+ GTK_CONTAINER (paned)->border_width + handle_size / 2;
gdk_draw_line (widget->window, paned->xor_gc,
xpos,
widget->allocation.y,
xpos,
widget->allocation.y + widget->allocation.height - 1);
}
static gboolean
gtk_hpaned_button_press (GtkWidget *widget,
GdkEventButton *event)
{
GtkPaned *paned = GTK_PANED (widget);
gint handle_size;
gtk_widget_style_get (widget, "handle_size", &handle_size, NULL);
if (!paned->in_drag &&
event->window == paned->handle && event->button == 1)
{
paned->in_drag = TRUE;
/* We need a server grab here, not gtk_grab_add(), since
* we don't want to pass events on to the widget's children */
gdk_pointer_grab(paned->handle, FALSE,
GDK_POINTER_MOTION_HINT_MASK
| GDK_BUTTON1_MOTION_MASK
| GDK_BUTTON_RELEASE_MASK,
NULL, NULL, event->time);
paned->child1_size += event->x - handle_size / 2;
paned->child1_size = CLAMP (paned->child1_size, 0,
widget->allocation.width
- handle_size
- 2 * GTK_CONTAINER (paned)->border_width);
gtk_hpaned_xor_line (paned);
return TRUE;
}
return FALSE;
}
static gboolean
gtk_hpaned_button_release (GtkWidget *widget,
GdkEventButton *event)
{
GtkPaned *paned = GTK_PANED (widget);
GObject *object = G_OBJECT (widget);
if (paned->in_drag && (event->button == 1))
{
gtk_hpaned_xor_line (paned);
paned->in_drag = FALSE;
paned->position_set = TRUE;
gdk_pointer_ungrab (event->time);
gtk_widget_queue_resize (GTK_WIDGET (paned));
g_object_freeze_notify (object);
g_object_notify (object, "position");
g_object_notify (object, "position_set");
g_object_thaw_notify (object);
return TRUE;
}
return FALSE;
}
static gboolean
gtk_hpaned_motion (GtkWidget *widget,
GdkEventMotion *event)
{
GtkPaned *paned = GTK_PANED (widget);
gint x;
gint handle_size;
gtk_widget_style_get (widget, "handle_size", &handle_size, NULL);
gtk_widget_get_pointer (widget, &x, NULL);
if (paned->in_drag)
{
gint size = x - GTK_CONTAINER (paned)->border_width - handle_size / 2;
gtk_hpaned_xor_line (paned);
paned->child1_size = CLAMP (size, paned->min_position, paned->max_position);
gtk_hpaned_xor_line (paned);
}
return TRUE;
}
......@@ -63,8 +63,18 @@ static void gtk_paned_realize (GtkWidget *widget);
static void gtk_paned_unrealize (GtkWidget *widget);
static void gtk_paned_map (GtkWidget *widget);
static void gtk_paned_unmap (GtkWidget *widget);
static gint gtk_paned_expose (GtkWidget *widget,
static gboolean gtk_paned_expose (GtkWidget *widget,
GdkEventExpose *event);
static gboolean gtk_paned_enter (GtkWidget *widget,
GdkEventCrossing *event);
static gboolean gtk_paned_leave (GtkWidget *widget,
GdkEventCrossing *event);
static gboolean gtk_paned_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_paned_button_release (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_paned_motion (GtkWidget *widget,
GdkEventMotion *event);
static gboolean gtk_paned_focus (GtkWidget *widget,
GtkDirectionType direction);
static void gtk_paned_add (GtkContainer *container,
......@@ -176,6 +186,11 @@ gtk_paned_class_init (GtkPanedClass *class)
widget_class->unmap = gtk_paned_unmap;
widget_class->expose_event = gtk_paned_expose;
widget_class->focus = gtk_paned_focus;
widget_class->enter_notify_event = gtk_paned_enter;
widget_class->leave_notify_event = gtk_paned_leave;
widget_class->button_press_event = gtk_paned_button_press;
widget_class->button_release_event = gtk_paned_button_release;
widget_class->motion_notify_event = gtk_paned_motion;
container_class->add = gtk_paned_add;
container_class->remove = gtk_paned_remove;
......@@ -374,10 +389,13 @@ gtk_paned_init (GtkPaned *paned)
paned->last_child1_focus = NULL;
paned->last_child2_focus = NULL;
paned->in_recursion = FALSE;
paned->handle_prelit = FALSE;
paned->original_position = -1;
paned->handle_pos.x = -1;
paned->handle_pos.y = -1;
paned->drag_pos = -1;
}
static void
......@@ -445,8 +463,11 @@ gtk_paned_realize (GtkWidget *widget)
attributes.width = paned->handle_pos.width;
attributes.height = paned->handle_pos.height;
attributes.cursor = gdk_cursor_new (paned->cursor_type);
attributes.event_mask = gtk_widget_get_events (widget);
attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_ENTER_NOTIFY_MASK |
GDK_LEAVE_NOTIFY_MASK |
GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK);
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_CURSOR;
......@@ -509,7 +530,7 @@ gtk_paned_unmap (GtkWidget *widget)
GTK_WIDGET_CLASS (parent_class)->unmap (widget);
}
static gint
static gboolean
gtk_paned_expose (GtkWidget *widget,
GdkEventExpose *event)
{
......@@ -531,9 +552,12 @@ gtk_paned_expose (GtkWidget *widget,
gdk_region_get_clipbox (region, &clip);
state = GTK_WIDGET_STATE (widget);
if (gtk_widget_is_focus (widget))
state = GTK_STATE_SELECTED;
else if (paned->handle_prelit)
state = GTK_STATE_PRELIGHT;
else
state = GTK_WIDGET_STATE (widget);
gtk_paint_handle (widget->style, widget->window,
state, GTK_SHADOW_NONE,
......@@ -545,13 +569,68 @@ gtk_paned_expose (GtkWidget *widget,
gdk_region_destroy (region);
}
/* Chain up to draw children */
GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event);
return FALSE;
}
static void
update_drag (GtkPaned *paned)
{
gint pos;
gint handle_size;
gint size;
if (paned->orientation == GTK_ORIENTATION_HORIZONTAL)
gtk_widget_get_pointer (GTK_WIDGET (paned), NULL, &pos);
else
gtk_widget_get_pointer (GTK_WIDGET (paned), &pos, NULL);
gtk_widget_style_get (GTK_WIDGET (paned), "handle_size", &handle_size, NULL);
size = pos - GTK_CONTAINER (paned)->border_width - paned->drag_pos;
size = CLAMP (size, paned->min_position, paned->max_position);
if (size != paned->child1_size)
gtk_paned_set_position (paned, size);
}
static gboolean
gtk_paned_enter (GtkWidget *widget,
GdkEventCrossing *event)
{
GtkPaned *paned = GTK_PANED (widget);
if (paned->in_drag)
update_drag (paned);
else
{
paned->handle_prelit = TRUE;
gtk_widget_queue_draw (widget);
}
return TRUE;
}
static gboolean
gtk_paned_leave (GtkWidget *widget,
GdkEventCrossing *event)
{
GtkPaned *paned = GTK_PANED (widget);
if (paned->in_drag)
update_drag (paned);
else
{
paned->handle_prelit = FALSE;
gtk_widget_queue_draw (widget);
}
return TRUE;
}
static gboolean
gtk_paned_focus (GtkWidget *widget,
GtkDirectionType direction)
......@@ -570,6 +649,73 @@ gtk_paned_focus (GtkWidget *widget,
return retval;
}
static gboolean
gtk_paned_button_press (GtkWidget *widget,
GdkEventButton *event)
{
GtkPaned *paned = GTK_PANED (widget);
if (!paned->in_drag &&
(event->window == paned->handle) && (event->button == 1))
{
paned->in_drag = TRUE;
/* We need a server grab here, not gtk_grab_add(), since
* we don't want to pass events on to the widget's children */
gdk_pointer_grab (paned->handle, FALSE,
GDK_POINTER_MOTION_HINT_MASK
| GDK_BUTTON1_MOTION_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK,
NULL, NULL,
event->time);
if (paned->orientation == GTK_ORIENTATION_HORIZONTAL)
paned->drag_pos = event->y;
else
paned->drag_pos = event->x;
return TRUE;
}
return FALSE;
}
static gboolean
gtk_paned_button_release (GtkWidget *widget,
GdkEventButton *event)
{
GtkPaned *paned = GTK_PANED (widget);
if (paned->in_drag && (event->button == 1))
{
paned->in_drag = FALSE;
paned->drag_pos = -1;
paned->position_set = TRUE;
gdk_pointer_ungrab (event->time);
return TRUE;
}
return FALSE;
}
static gboolean
gtk_paned_motion (GtkWidget *widget,
GdkEventMotion *event)
{
GtkPaned *paned = GTK_PANED (widget);
if (paned->in_drag)
{
update_drag (paned);
return TRUE;
}
return FALSE;
}
void
gtk_paned_add1 (GtkPaned *paned,
GtkWidget *widget)
......
......@@ -73,11 +73,13 @@ struct _GtkPaned
guint child2_resize : 1;
guint orientation : 1;
guint in_recursion : 1;
guint handle_prelit : 1;
GtkWidget *last_child1_focus;
GtkWidget *last_child2_focus;
GtkWidget *saved_focus;
gint drag_pos;
gint original_position;
};
......
......@@ -32,13 +32,6 @@ static void gtk_vpaned_size_request (GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_vpaned_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static void gtk_vpaned_xor_line (GtkPaned *paned);
static gboolean gtk_vpaned_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_vpaned_button_release (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_vpaned_motion (GtkWidget *widget,
GdkEventMotion *event);
static gpointer parent_class;
......@@ -78,9 +71,6 @@ gtk_vpaned_class_init (GtkVPanedClass *class)
widget_class->size_request = gtk_vpaned_size_request;
widget_class->size_allocate = gtk_vpaned_size_allocate;
widget_class->button_press_event = gtk_vpaned_button_press;
widget_class->button_release_event = gtk_vpaned_button_release;
widget_class->motion_notify_event = gtk_vpaned_motion;
}
static void
......@@ -231,119 +221,3 @@ gtk_vpaned_size_allocate (GtkWidget *widget,
gtk_widget_size_allocate (paned->child2, &child_allocation);
}
}
static void
gtk_vpaned_xor_line (GtkPaned *paned)
{
GtkWidget *widget;
GdkGCValues values;
guint16 ypos;
gint handle_size;
widget = GTK_WIDGET (paned);
gtk_widget_style_get (widget, "handle_size", &handle_size, NULL);
if (!paned->xor_gc)
{
values.function = GDK_INVERT;
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
paned->xor_gc = gdk_gc_new_with_values (widget->window,
&values,
GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
}
gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID,
GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL);
ypos = widget->allocation.y + paned->child1_size
+ GTK_CONTAINER (paned)->border_width + handle_size / 2;
gdk_draw_line (widget->window, paned->xor_gc,
widget->allocation.x,
ypos,
widget->allocation.x + widget->allocation.width - 1,
ypos);
}
static gboolean
gtk_vpaned_button_press (GtkWidget *widget,
GdkEventButton *event)
{
GtkPaned *paned = GTK_PANED (widget);
gint handle_size;
gtk_widget_style_get (widget, "handle_size", &handle_size, NULL);
if (!paned->in_drag &&
(event->window == paned->handle) && (event->button == 1))
{
paned->in_drag = TRUE;
/* We need a server grab here, not gtk_grab_add(), since
* we don't want to pass events on to the widget's children */
gdk_pointer_grab (paned->handle, FALSE,
GDK_POINTER_MOTION_HINT_MASK
| GDK_BUTTON1_MOTION_MASK
| GDK_BUTTON_RELEASE_MASK, NULL, NULL,
event->time);
paned->child1_size += event->y - handle_size / 2;
paned->child1_size = CLAMP (paned->child1_size, 0,
widget->allocation.height -
handle_size -
2 * GTK_CONTAINER (paned)->border_width);
gtk_vpaned_xor_line(paned);
return TRUE;
}
return FALSE;
}
static gboolean
gtk_vpaned_button_release (GtkWidget *widget,
GdkEventButton *event)
{
GtkPaned *paned = GTK_PANED (widget);
GObject *object = G_OBJECT (widget);
if (paned->in_drag && (event->button == 1))
{
gtk_vpaned_xor_line (paned);
paned->in_drag = FALSE;
paned->position_set = TRUE;
gdk_pointer_ungrab (event->time);
gtk_widget_queue_resize (GTK_WIDGET (paned));
g_object_freeze_notify (object);
g_object_notify (object, "position");
g_object_notify (object, "position_set");
g_object_thaw_notify (object);
return TRUE;
}
return FALSE;
}
static gboolean
gtk_vpaned_motion (GtkWidget *widget,
GdkEventMotion *event)
{
GtkPaned *paned = GTK_PANED (widget);
gint y;
gint handle_size;
gtk_widget_style_get (widget, "handle_size", &handle_size, NULL);
gtk_widget_get_pointer (widget, NULL, &y);
if (paned->in_drag)
{
gint size = y - GTK_CONTAINER (paned)->border_width - handle_size / 2;
gtk_vpaned_xor_line (paned);
paned->child1_size = CLAMP (size, paned->min_position, paned->max_position);
gtk_vpaned_xor_line (paned);
}
return TRUE;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment