indicate the viewport by shading the outside region using Cairo.

2008-08-22  Sven Neumann  <sven@gimp.org>

	* app/widgets/gimpnavigationview.c: indicate the viewport by
	shading the outside region using Cairo.


svn path=/trunk/; revision=26716
This commit is contained in:
Sven Neumann
2008-08-22 20:58:46 +00:00
committed by Sven Neumann
parent 9a52100e44
commit 8c5fe3b574
2 changed files with 41 additions and 89 deletions

View File

@ -1,3 +1,8 @@
2008-08-22 Sven Neumann <sven@gimp.org>
* app/widgets/gimpnavigationview.c: indicate the viewport by
shading the outside region using Cairo.
2008-08-22 Martin Nordholts <martinn@svn.gnome.org> 2008-08-22 Martin Nordholts <martinn@svn.gnome.org>
* app/display/gimpnavigationeditor.c: Align static function * app/display/gimpnavigationeditor.c: Align static function

View File

@ -70,17 +70,13 @@ struct _GimpNavigationView
gint motion_offset_x; gint motion_offset_x;
gint motion_offset_y; gint motion_offset_y;
gboolean has_grab; gboolean has_grab;
GdkGC *gc;
}; };
static void gimp_navigation_view_realize (GtkWidget *widget);
static void gimp_navigation_view_unrealize (GtkWidget *widget);
static void gimp_navigation_view_size_allocate (GtkWidget *widget, static void gimp_navigation_view_size_allocate (GtkWidget *widget,
GtkAllocation *allocation); GtkAllocation *allocation);
static gboolean gimp_navigation_view_expose (GtkWidget *widget, static gboolean gimp_navigation_view_expose (GtkWidget *widget,
GdkEventExpose *eevent); GdkEventExpose *event);
static gboolean gimp_navigation_view_button_press (GtkWidget *widget, static gboolean gimp_navigation_view_button_press (GtkWidget *widget,
GdkEventButton *bevent); GdkEventButton *bevent);
static gboolean gimp_navigation_view_button_release (GtkWidget *widget, static gboolean gimp_navigation_view_button_release (GtkWidget *widget,
@ -94,7 +90,7 @@ static gboolean gimp_navigation_view_key_press (GtkWidget *widget,
static void gimp_navigation_view_transform (GimpNavigationView *nav_view); static void gimp_navigation_view_transform (GimpNavigationView *nav_view);
static void gimp_navigation_view_draw_marker (GimpNavigationView *nav_view, static void gimp_navigation_view_draw_marker (GimpNavigationView *nav_view,
GdkRectangle *area); cairo_t *cr);
G_DEFINE_TYPE (GimpNavigationView, gimp_navigation_view, GIMP_TYPE_VIEW) G_DEFINE_TYPE (GimpNavigationView, gimp_navigation_view, GIMP_TYPE_VIEW)
@ -142,8 +138,6 @@ gimp_navigation_view_class_init (GimpNavigationViewClass *klass)
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
GDK_TYPE_SCROLL_DIRECTION); GDK_TYPE_SCROLL_DIRECTION);
widget_class->realize = gimp_navigation_view_realize;
widget_class->unrealize = gimp_navigation_view_unrealize;
widget_class->size_allocate = gimp_navigation_view_size_allocate; widget_class->size_allocate = gimp_navigation_view_size_allocate;
widget_class->expose_event = gimp_navigation_view_expose; widget_class->expose_event = gimp_navigation_view_expose;
widget_class->button_press_event = gimp_navigation_view_button_press; widget_class->button_press_event = gimp_navigation_view_button_press;
@ -173,34 +167,6 @@ gimp_navigation_view_init (GimpNavigationView *view)
view->motion_offset_x = 0; view->motion_offset_x = 0;
view->motion_offset_y = 0; view->motion_offset_y = 0;
view->has_grab = FALSE; view->has_grab = FALSE;
view->gc = NULL;
}
static void
gimp_navigation_view_realize (GtkWidget *widget)
{
GimpNavigationView *nav_view = GIMP_NAVIGATION_VIEW (widget);
GTK_WIDGET_CLASS (parent_class)->realize (widget);
nav_view->gc = gdk_gc_new (widget->window);
gdk_gc_set_function (nav_view->gc, GDK_INVERT);
}
static void
gimp_navigation_view_unrealize (GtkWidget *widget)
{
GimpNavigationView *nav_view = GIMP_NAVIGATION_VIEW (widget);
if (nav_view->gc)
{
g_object_unref (nav_view->gc);
nav_view->gc = NULL;
}
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
} }
static void static void
@ -215,14 +181,22 @@ gimp_navigation_view_size_allocate (GtkWidget *widget,
static gboolean static gboolean
gimp_navigation_view_expose (GtkWidget *widget, gimp_navigation_view_expose (GtkWidget *widget,
GdkEventExpose *eevent) GdkEventExpose *event)
{ {
if (GTK_WIDGET_DRAWABLE (widget)) if (GTK_WIDGET_DRAWABLE (widget))
{ {
GTK_WIDGET_CLASS (parent_class)->expose_event (widget, eevent); cairo_t *cr;
gimp_navigation_view_draw_marker (GIMP_NAVIGATION_VIEW (widget), GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event);
&eevent->area);
cr = gdk_cairo_create (widget->window);
gdk_cairo_region (cr, event->region);
cairo_clip (cr);
gimp_navigation_view_draw_marker (GIMP_NAVIGATION_VIEW (widget), cr);
cairo_destroy (cr);
} }
return TRUE; return TRUE;
@ -511,56 +485,36 @@ gimp_navigation_view_transform (GimpNavigationView *nav_view)
static void static void
gimp_navigation_view_draw_marker (GimpNavigationView *nav_view, gimp_navigation_view_draw_marker (GimpNavigationView *nav_view,
GdkRectangle *area) cairo_t *cr)
{ {
GimpView *view = GIMP_VIEW (nav_view); GimpView *view = GIMP_VIEW (nav_view);
if (view->renderer->viewable && if (view->renderer->viewable && nav_view->width && nav_view->height)
nav_view->width &&
nav_view->height)
{ {
GtkWidget *widget = GTK_WIDGET (view); GtkWidget *widget = GTK_WIDGET (view);
gint start_x; GdkColor *color = &widget->style->fg[widget->state];
gint start_y;
if (area) cairo_translate (cr, widget->allocation.x, widget->allocation.y);
gdk_gc_set_clip_rectangle (nav_view->gc, area); cairo_rectangle (cr,
0, 0, widget->allocation.width, widget->allocation.height);
cairo_rectangle (cr,
nav_view->p_x, nav_view->p_y, nav_view->p_width, nav_view->p_height);
start_x = widget->allocation.x + nav_view->p_x; cairo_set_source_rgba (cr,
start_y = widget->allocation.y + nav_view->p_y; color->red / 65535.,
color->green / 65535.,
color->blue / 65535., 0.5);
/* Draw outer frame */ cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
gdk_gc_set_line_attributes (nav_view->gc, cairo_fill (cr);
OUTER_BORDER_PEN_WIDTH,
GDK_LINE_SOLID,
GDK_CAP_BUTT,
GDK_JOIN_MITER);
gdk_draw_rectangle (widget->window, cairo_rectangle (cr,
nav_view->gc, nav_view->p_x, nav_view->p_y, nav_view->p_width, nav_view->p_height);
FALSE,
start_x + OUTER_BORDER_PEN_WIDTH / 2,
start_y + OUTER_BORDER_PEN_WIDTH / 2,
nav_view->p_width - OUTER_BORDER_PEN_WIDTH,
nav_view->p_height - OUTER_BORDER_PEN_WIDTH);
/* Draw inner frame */ gdk_cairo_set_source_color (cr, &widget->style->bg[widget->state]);
gdk_gc_set_line_attributes (nav_view->gc,
INNER_BORDER_PEN_WIDTH,
GDK_LINE_ON_OFF_DASH,
GDK_CAP_BUTT,
GDK_JOIN_MITER);
gdk_draw_rectangle (widget->window, cairo_set_line_width (cr, 2);
nav_view->gc, cairo_stroke (cr);
FALSE,
start_x + OUTER_BORDER_PEN_WIDTH + INNER_BORDER_PEN_WIDTH / 2,
start_y + OUTER_BORDER_PEN_WIDTH + INNER_BORDER_PEN_WIDTH / 2,
nav_view->p_width - OUTER_BORDER_PEN_WIDTH * 2 - INNER_BORDER_PEN_WIDTH,
nav_view->p_height - OUTER_BORDER_PEN_WIDTH * 2 - INNER_BORDER_PEN_WIDTH);
if (area)
gdk_gc_set_clip_rectangle (nav_view->gc, NULL);
} }
} }
@ -571,20 +525,14 @@ gimp_navigation_view_set_marker (GimpNavigationView *nav_view,
gdouble width, gdouble width,
gdouble height) gdouble height)
{ {
GtkWidget *navview;
GimpView *view; GimpView *view;
g_return_if_fail (GIMP_IS_NAVIGATION_VIEW (nav_view)); g_return_if_fail (GIMP_IS_NAVIGATION_VIEW (nav_view));
navview = GTK_WIDGET (nav_view);
view = GIMP_VIEW (nav_view); view = GIMP_VIEW (nav_view);
g_return_if_fail (view->renderer->viewable); g_return_if_fail (view->renderer->viewable);
/* remove old marker */
if (GTK_WIDGET_DRAWABLE (view))
gimp_navigation_view_draw_marker (nav_view, &navview->allocation);
nav_view->x = x; nav_view->x = x;
nav_view->y = y; nav_view->y = y;
nav_view->width = MAX (1.0, width); nav_view->width = MAX (1.0, width);
@ -593,8 +541,7 @@ gimp_navigation_view_set_marker (GimpNavigationView *nav_view,
gimp_navigation_view_transform (nav_view); gimp_navigation_view_transform (nav_view);
/* draw new marker */ /* draw new marker */
if (GTK_WIDGET_DRAWABLE (view)) gtk_widget_queue_draw (GTK_WIDGET (view));
gimp_navigation_view_draw_marker (nav_view, &navview->allocation);
} }
void void