New "zoom_fit" class to ask the parent to zoom to fit.

2000-05-05  Federico Mena Quintero  <federico@helixcode.com>

	* image-view.c: New "zoom_fit" class to ask the parent to zoom to
	fit.

	* ui-image.c (zoom_fit_cb): New handler for the "zoom_fit" signal
	of the image view.

	* window.c (set_mode): Give the focus to the image view widget.

	* full-screen.c (full_screen_key_press): Doh, call the parent
	class handler.
	(full_screen_show): Give the focus to the image view widget.

	* image-view.c (image_view_key_press): New handler for key
	presses.

	* commands.c (set_window_zoom): New function.  Now we use this in
	all other command callbacks.
	(cmd_cb_zoom_fit): Use ui_image_zoom_fit().
	(cmd_cb_full_screen): Use the FullScreen widget directly.

	* full-screen.c (full_screen_set_image): Get the image view and
	operate on it.

	* window.c (window_open_image): Likewise.
	Removed zooming functions.

	* ui-image.c (ui_image_get_image_view): New function.
	Removed image and zooming functions.
	(ui_image_zoom_fit): Set the zoom directly on the image view.
This commit is contained in:
Federico Mena Quintero 2000-05-06 07:07:03 +00:00 committed by Federico Mena Quintero
parent efac00acb3
commit c0dbd4db66
13 changed files with 409 additions and 322 deletions

View file

@ -22,6 +22,7 @@
#include <config.h>
#include <math.h>
#include <stdlib.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtksignal.h>
#include "cursors.h"
#include "image-view.h"
@ -81,6 +82,12 @@ typedef struct {
/* Signal IDs */
enum {
ZOOM_FIT,
LAST_SIGNAL
};
static void image_view_class_init (ImageViewClass *class);
static void image_view_init (ImageView *view);
static void image_view_destroy (GtkObject *object);
@ -96,12 +103,15 @@ static gint image_view_button_press (GtkWidget *widget, GdkEventButton *event);
static gint image_view_button_release (GtkWidget *widget, GdkEventButton *event);
static gint image_view_motion (GtkWidget *widget, GdkEventMotion *event);
static gint image_view_expose (GtkWidget *widget, GdkEventExpose *event);
static gint image_view_key_press (GtkWidget *widget, GdkEventKey *event);
static void image_view_set_scroll_adjustments (GtkWidget *widget,
GtkAdjustment *hadj, GtkAdjustment *vadj);
static GtkWidgetClass *parent_class;
static guint image_view_signals[LAST_SIGNAL];
/**
@ -148,6 +158,14 @@ image_view_class_init (ImageViewClass *class)
parent_class = gtk_type_class (GTK_TYPE_WIDGET);
image_view_signals[ZOOM_FIT] =
gtk_signal_new ("zoom_fit",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (ImageViewClass, zoom_fit),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
object_class->destroy = image_view_destroy;
object_class->finalize = image_view_finalize;
@ -162,6 +180,8 @@ image_view_class_init (ImageViewClass *class)
GTK_TYPE_ADJUSTMENT,
GTK_TYPE_ADJUSTMENT);
gtk_object_class_add_signals (object_class, image_view_signals, LAST_SIGNAL);
widget_class->unmap = image_view_unmap;
widget_class->realize = image_view_realize;
widget_class->unrealize = image_view_unrealize;
@ -172,6 +192,7 @@ image_view_class_init (ImageViewClass *class)
widget_class->button_release_event = image_view_button_release;
widget_class->motion_notify_event = image_view_motion;
widget_class->expose_event = image_view_expose;
widget_class->key_press_event = image_view_key_press;
}
/* Object initialization function for the image view */
@ -183,6 +204,8 @@ image_view_init (ImageView *view)
priv = g_new0 (ImageViewPrivate, 1);
view->priv = priv;
GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS);
priv->zoom = 1.0;
GTK_WIDGET_UNSET_FLAGS (view, GTK_NO_WINDOW);
@ -707,7 +730,7 @@ image_view_realize (GtkWidget *widget)
attr.event_mask = (gtk_widget_get_events (widget)
| GDK_EXPOSURE_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK);
| GDK_KEY_PRESS_MASK);
attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
@ -909,6 +932,9 @@ image_view_button_press (GtkWidget *widget, GdkEventButton *event)
view = IMAGE_VIEW (widget);
priv = view->priv;
if (!GTK_WIDGET_HAS_FOCUS (widget))
gtk_widget_grab_focus (widget);
if (priv->dragging || event->button != 1)
return FALSE;
@ -1025,6 +1051,101 @@ image_view_expose (GtkWidget *widget, GdkEventExpose *event)
return TRUE;
}
/* Key press handler for the image view */
static gint
image_view_key_press (GtkWidget *widget, GdkEventKey *event)
{
ImageView *view;
ImageViewPrivate *priv;
gboolean do_zoom;
double zoom;
gboolean do_scroll;
int xofs, yofs;
view = IMAGE_VIEW (widget);
priv = view->priv;
do_zoom = FALSE;
do_scroll = FALSE;
switch (event->keyval) {
case GDK_Up:
do_scroll = TRUE;
xofs = 0;
yofs = -SCROLL_STEP_SIZE;
break;
case GDK_Down:
do_scroll = TRUE;
xofs = 0;
yofs = SCROLL_STEP_SIZE;
break;
case GDK_Left:
do_scroll = TRUE;
xofs = -SCROLL_STEP_SIZE;
yofs = 0;
break;
case GDK_Right:
do_scroll = TRUE;
xofs = SCROLL_STEP_SIZE;
yofs = 0;
break;
case GDK_equal:
case GDK_KP_Add:
do_zoom = TRUE;
zoom = priv->zoom * 1.05;
break;
case GDK_minus:
case GDK_KP_Subtract:
do_zoom = TRUE;
zoom = priv->zoom / 1.05;
break;
case GDK_1:
do_zoom = TRUE;
zoom = 1.0;
break;
case GDK_F:
case GDK_f:
gtk_signal_emit (GTK_OBJECT (view), image_view_signals[ZOOM_FIT]);
break;
default:
return FALSE;
}
if (do_zoom)
image_view_set_zoom (view, zoom);
if (do_scroll) {
int x, y;
x = CLAMP (priv->xofs + xofs, 0, priv->hadj->upper - priv->hadj->page_size);
y = CLAMP (priv->yofs + yofs, 0, priv->vadj->upper - priv->vadj->page_size);
scroll_to (view, x, y);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->hadj), view);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->vadj), view);
priv->hadj->value = x;
priv->vadj->value = y;
gtk_signal_emit_by_name (GTK_OBJECT (priv->hadj), "value_changed");
gtk_signal_emit_by_name (GTK_OBJECT (priv->vadj), "value_changed");
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->hadj), view);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->vadj), view);
}
return TRUE;
}
/* Callback used when an adjustment is changed */
static void
adjustment_changed_cb (GtkAdjustment *adj, gpointer data)

View file

@ -49,6 +49,9 @@ struct _ImageView {
struct _ImageViewClass {
GtkWidgetClass parent_class;
/* Notification signals */
void (* zoom_fit) (ImageView *view);
/* GTK+ scrolling interface */
void (* set_scroll_adjustments) (GtkWidget *widget,
GtkAdjustment *hadj,

View file

@ -147,6 +147,16 @@ ui_image_new (void)
return ui_image_construct (ui);
}
/* Callback for the zoom_fit signal of the image view */
static void
zoom_fit_cb (ImageView *view, gpointer data)
{
UIImage *ui;
ui = UI_IMAGE (data);
ui_image_zoom_fit (ui);
}
/**
* ui_image_construct:
* @ui: An image view scroller.
@ -167,6 +177,8 @@ ui_image_construct (UIImage *ui)
priv = ui->priv;
priv->view = image_view_new ();
gtk_signal_connect (GTK_OBJECT (priv->view), "zoom_fit",
GTK_SIGNAL_FUNC (zoom_fit_cb), ui);
gtk_container_add (GTK_CONTAINER (ui), priv->view);
gtk_widget_show (priv->view);
@ -176,35 +188,15 @@ ui_image_construct (UIImage *ui)
/**
* ui_image_set_image:
* @ui: An image view scroller.
* @image: An image structure, or NULL if none.
*
* Sets the image to be displayed in an image view scroller.
**/
void
ui_image_set_image (UIImage *ui, Image *image)
{
UIImagePrivate *priv;
g_return_if_fail (ui != NULL);
g_return_if_fail (IS_UI_IMAGE (ui));
priv = ui->priv;
image_view_set_image (IMAGE_VIEW (priv->view), image);
}
/**
* ui_image_get_image:
* ui_image_get_image_view:
* @ui: An image view scroller.
*
* Queries the image that an image view scroller is displaying.
* Queries the image view widget that is inside an image view scroller.
*
* Return value: An image, or NULL if no image is being displayed.
* Return value: An image view widget.
**/
Image *
ui_image_get_image (UIImage *ui)
GtkWidget *
ui_image_get_image_view (UIImage *ui)
{
UIImagePrivate *priv;
@ -212,49 +204,7 @@ ui_image_get_image (UIImage *ui)
g_return_val_if_fail (IS_UI_IMAGE (ui), NULL);
priv = ui->priv;
return image_view_get_image (IMAGE_VIEW (priv->view));
}
/**
* ui_image_set_zoom:
* @ui: An image view scroller.
* @zoom: Desired zoom factor.
*
* Sets the zoom factor of an image view scroller.
**/
void
ui_image_set_zoom (UIImage *ui, double zoom)
{
UIImagePrivate *priv;
g_return_if_fail (ui != NULL);
g_return_if_fail (IS_UI_IMAGE (ui));
g_return_if_fail (zoom > 0.0);
priv = ui->priv;
image_view_set_zoom (IMAGE_VIEW (priv->view), zoom);
}
/**
* ui_image_get_zoom:
* @ui: An image view scroller.
*
* Gets the current zoom factor of an image view scroller.
*
* Return value: Current zoom factor.
**/
double
ui_image_get_zoom (UIImage *ui)
{
UIImagePrivate *priv;
g_return_val_if_fail (ui != NULL, -1.0);
g_return_val_if_fail (IS_UI_IMAGE (ui), -1.0);
priv = ui->priv;
return image_view_get_zoom (IMAGE_VIEW (priv->view));
return priv->view;
}
/**
@ -279,7 +229,7 @@ ui_image_zoom_fit (UIImage *ui)
image = image_view_get_image (IMAGE_VIEW (priv->view));
if (!image) {
ui_image_set_zoom (ui, 1.0);
image_view_set_zoom (IMAGE_VIEW (priv->view), 1.0);
return;
}
@ -295,5 +245,5 @@ ui_image_zoom_fit (UIImage *ui)
iw = ih = 0;
zoom = zoom_fit_scale (w - 2 * xthick, h - 2 * ythick, iw, ih, TRUE);
ui_image_set_zoom (ui, zoom);
image_view_set_zoom (IMAGE_VIEW (priv->view), zoom);
}

View file

@ -57,11 +57,8 @@ GtkType ui_image_get_type (void);
GtkWidget *ui_image_new (void);
GtkWidget *ui_image_construct (UIImage *ui);
void ui_image_set_image (UIImage *ui, Image *image);
Image *ui_image_get_image (UIImage *ui);
GtkWidget *ui_image_get_image_view (UIImage *ui);
void ui_image_set_zoom (UIImage *ui, double zoom);
double ui_image_get_zoom (UIImage *ui);
void ui_image_zoom_fit (UIImage *ui);

View file

@ -1,3 +1,35 @@
2000-05-05 Federico Mena Quintero <federico@helixcode.com>
* image-view.c: New "zoom_fit" class to ask the parent to zoom to
fit.
* ui-image.c (zoom_fit_cb): New handler for the "zoom_fit" signal
of the image view.
* window.c (set_mode): Give the focus to the image view widget.
* full-screen.c (full_screen_key_press): Doh, call the parent
class handler.
(full_screen_show): Give the focus to the image view widget.
* image-view.c (image_view_key_press): New handler for key
presses.
* commands.c (set_window_zoom): New function. Now we use this in
all other command callbacks.
(cmd_cb_zoom_fit): Use ui_image_zoom_fit().
(cmd_cb_full_screen): Use the FullScreen widget directly.
* full-screen.c (full_screen_set_image): Get the image view and
operate on it.
* window.c (window_open_image): Likewise.
Removed zooming functions.
* ui-image.c (ui_image_get_image_view): New function.
Removed image and zooming functions.
(ui_image_zoom_fit): Set the zoom directly on the image view.
2000-04-27 Darin Adler <darin@eazel.com>
* window.c (window_full_screen):

View file

@ -21,10 +21,29 @@
#include <config.h>
#include "commands.h"
#include "full-screen.h"
#include "image-view.h"
#include "ui-image.h"
#include "window.h"
/* Sets the zoom factor of a window's image view */
static void
set_window_zoom (Window *window, double zoom, gboolean mult)
{
UIImage *ui;
ImageView *view;
ui = UI_IMAGE (window_get_ui_image (window));
view = IMAGE_VIEW (ui_image_get_image_view (ui));
if (mult)
zoom *= image_view_get_zoom (view);
image_view_set_zoom (view, zoom);
}
void
cmd_cb_image_open (GtkWidget *widget, gpointer data)
{
@ -40,31 +59,43 @@ cmd_cb_window_close (GtkWidget *widget, gpointer data)
void
cmd_cb_zoom_in (GtkWidget *widget, gpointer data)
{
window_zoom_in (WINDOW (data));
set_window_zoom (WINDOW (data), 1.05, TRUE);
}
void
cmd_cb_zoom_out (GtkWidget *widget, gpointer data)
{
window_zoom_out (WINDOW (data));
set_window_zoom (WINDOW (data), 1.0 / 1.05, TRUE);
}
void
cmd_cb_zoom_1 (GtkWidget *widget, gpointer data)
{
window_zoom_1 (WINDOW (data));
set_window_zoom (WINDOW (data), 1.0, FALSE);
}
void
cmd_cb_zoom_fit (GtkWidget *widget, gpointer data)
{
window_zoom_fit (WINDOW (data));
UIImage *ui;
ui = UI_IMAGE (window_get_ui_image (WINDOW (data)));
ui_image_zoom_fit (ui);
}
void
cmd_cb_full_screen (GtkWidget *widget, gpointer data)
{
window_full_screen (WINDOW (data));
UIImage *ui;
ImageView *view;
GtkWidget *fs;
ui = UI_IMAGE (window_get_ui_image (WINDOW (data)));
view = IMAGE_VIEW (ui_image_get_image_view (ui));
fs = full_screen_new ();
full_screen_set_image (FULL_SCREEN (fs), image_view_get_image (view));
gtk_widget_show (fs);
}
@ -72,55 +103,55 @@ cmd_cb_full_screen (GtkWidget *widget, gpointer data)
void
cmd_cb_zoom_2_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 2.0);
set_window_zoom (WINDOW (data), 2.0, FALSE);
}
void
cmd_cb_zoom_3_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 3.0);
set_window_zoom (WINDOW (data), 3.0, FALSE);
}
void
cmd_cb_zoom_4_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 4.0);
set_window_zoom (WINDOW (data), 4.0, FALSE);
}
void
cmd_cb_zoom_5_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 5.0);
set_window_zoom (WINDOW (data), 5.0, FALSE);
}
void
cmd_cb_zoom_6_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 6.0);
set_window_zoom (WINDOW (data), 6.0, FALSE);
}
void
cmd_cb_zoom_7_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 7.0);
set_window_zoom (WINDOW (data), 7.0, FALSE);
}
void
cmd_cb_zoom_8_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 8.0);
set_window_zoom (WINDOW (data), 8.0, FALSE);
}
void
cmd_cb_zoom_9_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 9.0);
set_window_zoom (WINDOW (data), 9.0, FALSE);
}
void
cmd_cb_zoom_10_1 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 10.0);
set_window_zoom (WINDOW (data), 10.0, FALSE);
}
@ -128,53 +159,53 @@ cmd_cb_zoom_10_1 (GtkWidget *widget, gpointer data)
void
cmd_cb_zoom_1_2 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 2.0);
set_window_zoom (WINDOW (data), 1.0 / 2.0, FALSE);
}
void
cmd_cb_zoom_1_3 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 3.0);
set_window_zoom (WINDOW (data), 1.0 / 3.0, FALSE);
}
void
cmd_cb_zoom_1_4 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 4.0);
set_window_zoom (WINDOW (data), 1.0 / 4.0, FALSE);
}
void
cmd_cb_zoom_1_5 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 5.0);
set_window_zoom (WINDOW (data), 1.0 / 5.0, FALSE);
}
void
cmd_cb_zoom_1_6 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 6.0);
set_window_zoom (WINDOW (data), 1.0 / 6.0, FALSE);
}
void
cmd_cb_zoom_1_7 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 7.0);
set_window_zoom (WINDOW (data), 1.0 / 7.0, FALSE);
}
void
cmd_cb_zoom_1_8 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 8.0);
set_window_zoom (WINDOW (data), 1.0 / 8.0, FALSE);
}
void
cmd_cb_zoom_1_9 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 9.0);
set_window_zoom (WINDOW (data), 1.0 / 9.0, FALSE);
}
void
cmd_cb_zoom_1_10 (GtkWidget *widget, gpointer data)
{
window_set_zoom (WINDOW (data), 1.0 / 10.0);
set_window_zoom (WINDOW (data), 1.0 / 10.0, FALSE);
}

View file

@ -23,6 +23,7 @@
#include <gdk/gdkkeysyms.h>
#include <gtk/gtkmain.h>
#include "full-screen.h"
#include "image-view.h"
#include "ui-image.h"
@ -159,6 +160,8 @@ full_screen_show (GtkWidget *widget)
priv->have_grab = gdk_keyboard_grab (widget->window, TRUE, GDK_CURRENT_TIME) == 0;
gtk_grab_add (widget);
gtk_widget_grab_focus (ui_image_get_image_view (UI_IMAGE (priv->ui)));
}
/* Hide handler for the full screen view */
@ -186,6 +189,16 @@ full_screen_hide (GtkWidget *widget)
static gint
full_screen_key_press (GtkWidget *widget, GdkEventKey *event)
{
gint result;
result = FALSE;
if (GTK_WIDGET_CLASS (parent_class)->key_press_event)
result = (* GTK_WIDGET_CLASS (parent_class)->key_press_event) (widget, event);
if (result)
return result;
if (event->keyval == GDK_Escape) {
gtk_widget_hide (widget);
return TRUE;
@ -221,11 +234,13 @@ void
full_screen_set_image (FullScreen *fs, Image *image)
{
FullScreenPrivate *priv;
GtkWidget *view;
g_return_if_fail (fs != NULL);
g_return_if_fail (IS_FULL_SCREEN (fs));
priv = fs->priv;
ui_image_set_image (UI_IMAGE (priv->ui), image);
view = ui_image_get_image_view (UI_IMAGE (priv->ui));
image_view_set_image (IMAGE_VIEW (view), image);
}

View file

@ -22,6 +22,7 @@
#include <config.h>
#include <math.h>
#include <stdlib.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtksignal.h>
#include "cursors.h"
#include "image-view.h"
@ -81,6 +82,12 @@ typedef struct {
/* Signal IDs */
enum {
ZOOM_FIT,
LAST_SIGNAL
};
static void image_view_class_init (ImageViewClass *class);
static void image_view_init (ImageView *view);
static void image_view_destroy (GtkObject *object);
@ -96,12 +103,15 @@ static gint image_view_button_press (GtkWidget *widget, GdkEventButton *event);
static gint image_view_button_release (GtkWidget *widget, GdkEventButton *event);
static gint image_view_motion (GtkWidget *widget, GdkEventMotion *event);
static gint image_view_expose (GtkWidget *widget, GdkEventExpose *event);
static gint image_view_key_press (GtkWidget *widget, GdkEventKey *event);
static void image_view_set_scroll_adjustments (GtkWidget *widget,
GtkAdjustment *hadj, GtkAdjustment *vadj);
static GtkWidgetClass *parent_class;
static guint image_view_signals[LAST_SIGNAL];
/**
@ -148,6 +158,14 @@ image_view_class_init (ImageViewClass *class)
parent_class = gtk_type_class (GTK_TYPE_WIDGET);
image_view_signals[ZOOM_FIT] =
gtk_signal_new ("zoom_fit",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (ImageViewClass, zoom_fit),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
object_class->destroy = image_view_destroy;
object_class->finalize = image_view_finalize;
@ -162,6 +180,8 @@ image_view_class_init (ImageViewClass *class)
GTK_TYPE_ADJUSTMENT,
GTK_TYPE_ADJUSTMENT);
gtk_object_class_add_signals (object_class, image_view_signals, LAST_SIGNAL);
widget_class->unmap = image_view_unmap;
widget_class->realize = image_view_realize;
widget_class->unrealize = image_view_unrealize;
@ -172,6 +192,7 @@ image_view_class_init (ImageViewClass *class)
widget_class->button_release_event = image_view_button_release;
widget_class->motion_notify_event = image_view_motion;
widget_class->expose_event = image_view_expose;
widget_class->key_press_event = image_view_key_press;
}
/* Object initialization function for the image view */
@ -183,6 +204,8 @@ image_view_init (ImageView *view)
priv = g_new0 (ImageViewPrivate, 1);
view->priv = priv;
GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS);
priv->zoom = 1.0;
GTK_WIDGET_UNSET_FLAGS (view, GTK_NO_WINDOW);
@ -707,7 +730,7 @@ image_view_realize (GtkWidget *widget)
attr.event_mask = (gtk_widget_get_events (widget)
| GDK_EXPOSURE_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK);
| GDK_KEY_PRESS_MASK);
attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
@ -909,6 +932,9 @@ image_view_button_press (GtkWidget *widget, GdkEventButton *event)
view = IMAGE_VIEW (widget);
priv = view->priv;
if (!GTK_WIDGET_HAS_FOCUS (widget))
gtk_widget_grab_focus (widget);
if (priv->dragging || event->button != 1)
return FALSE;
@ -1025,6 +1051,101 @@ image_view_expose (GtkWidget *widget, GdkEventExpose *event)
return TRUE;
}
/* Key press handler for the image view */
static gint
image_view_key_press (GtkWidget *widget, GdkEventKey *event)
{
ImageView *view;
ImageViewPrivate *priv;
gboolean do_zoom;
double zoom;
gboolean do_scroll;
int xofs, yofs;
view = IMAGE_VIEW (widget);
priv = view->priv;
do_zoom = FALSE;
do_scroll = FALSE;
switch (event->keyval) {
case GDK_Up:
do_scroll = TRUE;
xofs = 0;
yofs = -SCROLL_STEP_SIZE;
break;
case GDK_Down:
do_scroll = TRUE;
xofs = 0;
yofs = SCROLL_STEP_SIZE;
break;
case GDK_Left:
do_scroll = TRUE;
xofs = -SCROLL_STEP_SIZE;
yofs = 0;
break;
case GDK_Right:
do_scroll = TRUE;
xofs = SCROLL_STEP_SIZE;
yofs = 0;
break;
case GDK_equal:
case GDK_KP_Add:
do_zoom = TRUE;
zoom = priv->zoom * 1.05;
break;
case GDK_minus:
case GDK_KP_Subtract:
do_zoom = TRUE;
zoom = priv->zoom / 1.05;
break;
case GDK_1:
do_zoom = TRUE;
zoom = 1.0;
break;
case GDK_F:
case GDK_f:
gtk_signal_emit (GTK_OBJECT (view), image_view_signals[ZOOM_FIT]);
break;
default:
return FALSE;
}
if (do_zoom)
image_view_set_zoom (view, zoom);
if (do_scroll) {
int x, y;
x = CLAMP (priv->xofs + xofs, 0, priv->hadj->upper - priv->hadj->page_size);
y = CLAMP (priv->yofs + yofs, 0, priv->vadj->upper - priv->vadj->page_size);
scroll_to (view, x, y);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->hadj), view);
gtk_signal_handler_block_by_data (GTK_OBJECT (priv->vadj), view);
priv->hadj->value = x;
priv->vadj->value = y;
gtk_signal_emit_by_name (GTK_OBJECT (priv->hadj), "value_changed");
gtk_signal_emit_by_name (GTK_OBJECT (priv->vadj), "value_changed");
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->hadj), view);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->vadj), view);
}
return TRUE;
}
/* Callback used when an adjustment is changed */
static void
adjustment_changed_cb (GtkAdjustment *adj, gpointer data)

View file

@ -49,6 +49,9 @@ struct _ImageView {
struct _ImageViewClass {
GtkWidgetClass parent_class;
/* Notification signals */
void (* zoom_fit) (ImageView *view);
/* GTK+ scrolling interface */
void (* set_scroll_adjustments) (GtkWidget *widget,
GtkAdjustment *hadj,

View file

@ -147,6 +147,16 @@ ui_image_new (void)
return ui_image_construct (ui);
}
/* Callback for the zoom_fit signal of the image view */
static void
zoom_fit_cb (ImageView *view, gpointer data)
{
UIImage *ui;
ui = UI_IMAGE (data);
ui_image_zoom_fit (ui);
}
/**
* ui_image_construct:
* @ui: An image view scroller.
@ -167,6 +177,8 @@ ui_image_construct (UIImage *ui)
priv = ui->priv;
priv->view = image_view_new ();
gtk_signal_connect (GTK_OBJECT (priv->view), "zoom_fit",
GTK_SIGNAL_FUNC (zoom_fit_cb), ui);
gtk_container_add (GTK_CONTAINER (ui), priv->view);
gtk_widget_show (priv->view);
@ -176,35 +188,15 @@ ui_image_construct (UIImage *ui)
/**
* ui_image_set_image:
* @ui: An image view scroller.
* @image: An image structure, or NULL if none.
*
* Sets the image to be displayed in an image view scroller.
**/
void
ui_image_set_image (UIImage *ui, Image *image)
{
UIImagePrivate *priv;
g_return_if_fail (ui != NULL);
g_return_if_fail (IS_UI_IMAGE (ui));
priv = ui->priv;
image_view_set_image (IMAGE_VIEW (priv->view), image);
}
/**
* ui_image_get_image:
* ui_image_get_image_view:
* @ui: An image view scroller.
*
* Queries the image that an image view scroller is displaying.
* Queries the image view widget that is inside an image view scroller.
*
* Return value: An image, or NULL if no image is being displayed.
* Return value: An image view widget.
**/
Image *
ui_image_get_image (UIImage *ui)
GtkWidget *
ui_image_get_image_view (UIImage *ui)
{
UIImagePrivate *priv;
@ -212,49 +204,7 @@ ui_image_get_image (UIImage *ui)
g_return_val_if_fail (IS_UI_IMAGE (ui), NULL);
priv = ui->priv;
return image_view_get_image (IMAGE_VIEW (priv->view));
}
/**
* ui_image_set_zoom:
* @ui: An image view scroller.
* @zoom: Desired zoom factor.
*
* Sets the zoom factor of an image view scroller.
**/
void
ui_image_set_zoom (UIImage *ui, double zoom)
{
UIImagePrivate *priv;
g_return_if_fail (ui != NULL);
g_return_if_fail (IS_UI_IMAGE (ui));
g_return_if_fail (zoom > 0.0);
priv = ui->priv;
image_view_set_zoom (IMAGE_VIEW (priv->view), zoom);
}
/**
* ui_image_get_zoom:
* @ui: An image view scroller.
*
* Gets the current zoom factor of an image view scroller.
*
* Return value: Current zoom factor.
**/
double
ui_image_get_zoom (UIImage *ui)
{
UIImagePrivate *priv;
g_return_val_if_fail (ui != NULL, -1.0);
g_return_val_if_fail (IS_UI_IMAGE (ui), -1.0);
priv = ui->priv;
return image_view_get_zoom (IMAGE_VIEW (priv->view));
return priv->view;
}
/**
@ -279,7 +229,7 @@ ui_image_zoom_fit (UIImage *ui)
image = image_view_get_image (IMAGE_VIEW (priv->view));
if (!image) {
ui_image_set_zoom (ui, 1.0);
image_view_set_zoom (IMAGE_VIEW (priv->view), 1.0);
return;
}
@ -295,5 +245,5 @@ ui_image_zoom_fit (UIImage *ui)
iw = ih = 0;
zoom = zoom_fit_scale (w - 2 * xthick, h - 2 * ythick, iw, ih, TRUE);
ui_image_set_zoom (ui, zoom);
image_view_set_zoom (IMAGE_VIEW (priv->view), zoom);
}

View file

@ -57,11 +57,8 @@ GtkType ui_image_get_type (void);
GtkWidget *ui_image_new (void);
GtkWidget *ui_image_construct (UIImage *ui);
void ui_image_set_image (UIImage *ui, Image *image);
Image *ui_image_get_image (UIImage *ui);
GtkWidget *ui_image_get_image_view (UIImage *ui);
void ui_image_set_zoom (UIImage *ui, double zoom);
double ui_image_get_zoom (UIImage *ui);
void ui_image_zoom_fit (UIImage *ui);

View file

@ -23,6 +23,7 @@
#include <gnome.h>
#include "commands.h"
#include "full-screen.h"
#include "image-view.h"
#include "tb-image.h"
#include "ui-image.h"
#include "util.h"
@ -232,6 +233,7 @@ set_mode (Window *window, WindowMode mode)
priv->content = ui_image_new ();
gnome_app_set_contents (GNOME_APP (window), priv->content);
gtk_widget_show (priv->content);
gtk_widget_grab_focus (ui_image_get_image_view (UI_IMAGE (priv->content)));
break;
case WINDOW_MODE_COLLECTION:
@ -711,6 +713,7 @@ window_open_image (Window *window, const char *filename)
gboolean retval;
char *fname;
gboolean free_fname;
GtkWidget *view;
g_return_val_if_fail (window != NULL, FALSE);
g_return_val_if_fail (IS_WINDOW (window), FALSE);
@ -723,7 +726,8 @@ window_open_image (Window *window, const char *filename)
image = image_new ();
retval = image_load (image, filename);
ui_image_set_image (UI_IMAGE (priv->content), image);
view = ui_image_get_image_view (UI_IMAGE (priv->content));
image_view_set_image (IMAGE_VIEW (view), image);
free_fname = FALSE;
@ -748,152 +752,22 @@ window_open_image (Window *window, const char *filename)
return retval;
}
/**
* window_set_zoom:
* @window: An image window.
* @zoom: Desired zoom factor.
* window_get_ui_image:
* @window: A window.
*
* Sets the zoom factor for an image window.
**/
void
window_set_zoom (Window *window, double zoom)
{
WindowPrivate *priv;
UIImage *ui;
g_return_if_fail (window != NULL);
g_return_if_fail (IS_WINDOW (window));
priv = window->priv;
g_return_if_fail (priv->mode == WINDOW_MODE_IMAGE);
g_assert (priv->content != NULL && IS_UI_IMAGE (priv->content));
ui = UI_IMAGE (priv->content);
ui_image_set_zoom (ui, zoom);
}
/**
* window_zoom_in:
* @window: An image window.
*
* Zooms in an image window.
**/
void
window_zoom_in (Window *window)
{
WindowPrivate *priv;
UIImage *ui;
g_return_if_fail (window != NULL);
g_return_if_fail (IS_WINDOW (window));
priv = window->priv;
g_return_if_fail (priv->mode == WINDOW_MODE_IMAGE);
g_assert (priv->content != NULL && IS_UI_IMAGE (priv->content));
ui = UI_IMAGE (priv->content);
ui_image_set_zoom (ui, ui_image_get_zoom (ui) * 1.05);
}
/**
* window_zoom_out:
* @window: An image window.
*
* Zooms out an image window.
**/
void
window_zoom_out (Window *window)
{
WindowPrivate *priv;
UIImage *ui;
g_return_if_fail (window != NULL);
g_return_if_fail (IS_WINDOW (window));
priv = window->priv;
g_return_if_fail (priv->mode == WINDOW_MODE_IMAGE);
g_assert (priv->content != NULL && IS_UI_IMAGE (priv->content));
ui = UI_IMAGE (priv->content);
ui_image_set_zoom (ui, ui_image_get_zoom (ui) / 1.05);
}
/**
* window_zoom_1:
* @window: An image window.
* Queries the image view scroller inside a window.
*
* Zooms the image to 1:1 scale.
* Return value: An image view scroller.
**/
void
window_zoom_1 (Window *window)
GtkWidget *
window_get_ui_image (Window *window)
{
WindowPrivate *priv;
UIImage *ui;
g_return_if_fail (window != NULL);
g_return_if_fail (IS_WINDOW (window));
g_return_val_if_fail (window != NULL, NULL);
g_return_val_if_fail (IS_WINDOW (window), NULL);
priv = window->priv;
g_return_if_fail (priv->mode == WINDOW_MODE_IMAGE);
g_assert (priv->content != NULL && IS_UI_IMAGE (priv->content));
ui = UI_IMAGE (priv->content);
ui_image_set_zoom (ui, 1.0);
}
/**
* window_zoom_fit:
* @window: An image window.
*
* Zooms an image to fit the window size.
**/
void
window_zoom_fit (Window *window)
{
WindowPrivate *priv;
UIImage *ui;
g_return_if_fail (window != NULL);
g_return_if_fail (IS_WINDOW (window));
priv = window->priv;
g_return_if_fail (priv->mode == WINDOW_MODE_IMAGE);
g_assert (priv->content != NULL && IS_UI_IMAGE (priv->content));
ui = UI_IMAGE (priv->content);
ui_image_zoom_fit (ui);
}
/**
* window_full_screen:
* @window: An image window.
*
* Launches a full screen viewer for an image window.
**/
void
window_full_screen (Window *window)
{
WindowPrivate *priv;
UIImage *ui;
GtkWidget *fs;
g_return_if_fail (window != NULL);
g_return_if_fail (IS_WINDOW (window));
priv = window->priv;
g_return_if_fail (priv->mode == WINDOW_MODE_IMAGE);
g_assert (priv->content != NULL && IS_UI_IMAGE (priv->content));
ui = UI_IMAGE (priv->content);
fs = full_screen_new ();
full_screen_set_image (FULL_SCREEN (fs), ui_image_get_image (ui));
gtk_widget_show (fs);
return priv->content;
}

View file

@ -61,14 +61,7 @@ void window_close (Window *window);
void window_open_image_dialog (Window *window);
gboolean window_open_image (Window *window, const char *filename);
void window_set_zoom (Window *window, double zoom);
void window_zoom_in (Window *window);
void window_zoom_out (Window *window);
void window_zoom_1 (Window *window);
void window_zoom_fit (Window *window);
void window_full_screen (Window *window);
GtkWidget *window_get_ui_image (Window *window);