Skip to content

Commit

Permalink
started relative scroll, keep scroll position
Browse files Browse the repository at this point in the history
  • Loading branch information
nadvornik committed Jul 11, 2007
1 parent 44d8cd9 commit 625f31c
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 27 deletions.
36 changes: 23 additions & 13 deletions src/image.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,16 @@ static void image_click_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer d
static void image_drag_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
{
ImageWindow *imd = data;
gint width, height;

printf("drag_cb %p\n", imd->func_drag);
pixbuf_renderer_get_scaled_size(pr, &width, &height);

if (imd->func_drag)
{
imd->func_drag(imd, event->button, event->time,
event->x, event->y, event->state,
event->x - pr->drag_last_x, event->y - pr->drag_last_y,
(gfloat)(pr->drag_last_x - event->x) / width, (gfloat)(pr->drag_last_y - event->y) / height,
imd->data_button);
}
}
Expand Down Expand Up @@ -1298,31 +1302,37 @@ void image_change_from_image(ImageWindow *imd, ImageWindow *source)
pixbuf_renderer_move(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr));
}

void image_sync_scroll_from_image_absolute(ImageWindow *imd, ImageWindow *source)
void image_get_scroll_center(ImageWindow *imd, gfloat *x, gfloat *y)
{
gint src_width, src_height, dst_width, dst_height;
gint src_width, src_height;
gint src_x, src_y;
gfloat dst_x, dst_y;
GdkRectangle src_rect;
GdkRectangle dst_rect;
gfloat dst_scale = pixbuf_renderer_zoom_get_scale(PIXBUF_RENDERER(imd->pr));

pixbuf_renderer_get_virtual_rect(PIXBUF_RENDERER(source->pr), &src_rect);
pixbuf_renderer_get_scaled_size(PIXBUF_RENDERER(source->pr), &src_width, &src_height);
pixbuf_renderer_get_virtual_rect(PIXBUF_RENDERER(imd->pr), &dst_rect);
pixbuf_renderer_get_scaled_size(PIXBUF_RENDERER(imd->pr), &dst_width, &dst_height);
pixbuf_renderer_get_virtual_rect(PIXBUF_RENDERER(imd->pr), &src_rect);
pixbuf_renderer_get_scaled_size(PIXBUF_RENDERER(imd->pr), &src_width, &src_height);

src_x = src_rect.x + src_rect.width / 2;
src_y = src_rect.y + src_rect.height / 2;

dst_x = (gfloat)src_x * dst_width / src_width - dst_rect.width / 2;
dst_y = (gfloat)src_y * dst_height / src_height - dst_rect.height / 2;
*x = (gfloat)src_x / src_width;
*y = (gfloat)src_y / src_height;
}

void image_set_scroll_center(ImageWindow *imd, gfloat x, gfloat y)
{
gint dst_width, dst_height;
gfloat dst_x, dst_y;
gfloat dst_scale = pixbuf_renderer_zoom_get_scale(PIXBUF_RENDERER(imd->pr));

pixbuf_renderer_get_scaled_size(PIXBUF_RENDERER(imd->pr), &dst_width, &dst_height);

dst_x = x * dst_width;
dst_y = y * dst_height;

image_scroll_to_point(imd, dst_x / dst_scale, dst_y / dst_scale, 0, 0);
image_scroll_to_point(imd, dst_x / dst_scale, dst_y / dst_scale, 0.5, 0.5);
}


void image_sync_zoom_from_image(ImageWindow *imd, ImageWindow *source)
{
image_zoom_set(imd, image_zoom_get(source));
Expand Down
4 changes: 3 additions & 1 deletion src/image.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ void image_change_from_image(ImageWindow *imd, ImageWindow *source);
GdkPixbuf *image_get_pixbuf(ImageWindow *imd);


void image_sync_scroll_from_image_absolute(ImageWindow *imd, ImageWindow *source);
void image_get_scroll_center(ImageWindow *imd, gfloat *x, gfloat *y);
void image_set_scroll_center(ImageWindow *imd, gfloat x, gfloat y);

void image_sync_zoom_from_image(ImageWindow *imd, ImageWindow *source);
/* manipulation */
void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height);
Expand Down
37 changes: 24 additions & 13 deletions src/layout_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -1130,10 +1130,15 @@ gint layout_image_get_index(LayoutWindow *lw)

void layout_image_set_path(LayoutWindow *lw, const gchar *path)
{
gfloat sx, sy;
if (!layout_valid(&lw)) return;

image_get_scroll_center(lw->image, &sx, &sy);

image_change_path(lw->image, path, image_zoom_get_default(lw->image, zoom_mode));

image_set_scroll_center(lw->image, sx, sy);

layout_list_sync_path(lw, path);
layout_image_slideshow_continue_check(lw);
layout_bars_new_image(lw);
Expand Down Expand Up @@ -1536,10 +1541,21 @@ static void layout_image_drag_cb(ImageWindow *imd, gint button, guint32 time,
for (i=0; i < MAX_SPLIT_IMAGES; i++)
{
if (lw->split_images[i] && lw->split_images[i] != imd)
// if (lw->connect_zoom)
// image_sync_zoom_from_image(lw->split_images[i], imd);
if (lw->connect_scroll)
image_sync_scroll_from_image_absolute(lw->split_images[i], imd);
if (lw->connect_scroll)
{
gfloat sx, sy;
if (!(state & GDK_CONTROL_MASK))
{
image_get_scroll_center(imd, &sx, &sy);
}
else
{
image_get_scroll_center(lw->split_images[i], &sx, &sy);
sx += dx;
sy += dy;
}
image_set_scroll_center(lw->split_images[i], sx, sy);
}
}
}

Expand Down Expand Up @@ -1586,21 +1602,16 @@ static void layout_image_drag_inactive_cb(ImageWindow *imd, gint button, guint32

gint i = image_idx(lw, imd);

printf("drag inacive\n");
if (i != -1)
{
printf("image activate %d\n", i);
layout_image_activate(lw, i);
}


for (i=0; i < MAX_SPLIT_IMAGES; i++)
{
if (lw->split_images[i] && lw->split_images[i] != imd)
// if (lw->connect_zoom)
// image_sync_zoom_from_image(lw->split_images[i], imd);
if (lw->connect_scroll)
image_sync_scroll_from_image_absolute(lw->split_images[i], imd);
}
/* continue as with active image */
layout_image_drag_cb(imd, button, time, x, y, state, dx, dy, data);
}


Expand Down Expand Up @@ -1660,7 +1671,7 @@ void layout_image_deactivate(LayoutWindow *lw, gint i)
if (!lw->split_images[i]) return;
image_set_update_func(lw->split_images[i], NULL, NULL);
layout_image_set_buttons_inactive(lw, i);
image_set_drag_func(lw->image, layout_image_drag_inactive_cb, lw);
image_set_drag_func(lw->split_images[i], layout_image_drag_inactive_cb, lw);

image_attach_window(lw->split_images[i], NULL, NULL, NULL, FALSE);
image_select(lw->split_images[i], FALSE);
Expand Down

0 comments on commit 625f31c

Please sign in to comment.