summaryrefslogtreecommitdiffstats
path: root/kview/kimageviewer/canvas.h
diff options
context:
space:
mode:
Diffstat (limited to 'kview/kimageviewer/canvas.h')
-rw-r--r--kview/kimageviewer/canvas.h348
1 files changed, 348 insertions, 0 deletions
diff --git a/kview/kimageviewer/canvas.h b/kview/kimageviewer/canvas.h
new file mode 100644
index 00000000..61b565b4
--- /dev/null
+++ b/kview/kimageviewer/canvas.h
@@ -0,0 +1,348 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001-2002 Matthias Kretz <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+// $Id$
+
+#ifndef KIMAGEVIEWER_CANVAS_H
+#define KIMAGEVIEWER_CANVAS_H
+
+class QColor;
+class QSize;
+class QImage;
+class QRect;
+class QPoint;
+class QWidget;
+
+#include <qstring.h>
+#include <qobjectdefs.h>
+#include <kdemacros.h>
+namespace KImageViewer
+{
+
+/**
+ * An image canvas widget
+ *
+ * @author Matthias Kretz <[email protected]>
+ *
+ * You'll find an implementation in kdegraphics (KView). You may
+ * still use this interface in your program but it will only work
+ * if you have an implementation installed.
+ *
+ * This is what you have to do to get an image canvas embedded in
+ * your program:
+ *
+ * <pre>
+ QWidget * widget = KParts::ComponentFactory::createInstanceFromQuery<QWidget>( "KImageViewer/Canvas", QString::null, this );
+ m_canvas = static_cast<KImageViewer::Canvas *>( widget->qt_cast( "KImageViewer::Canvas" ) );
+ if( ! ( widget && m_canvas ) )
+ {
+ KMessageBox::error( this, "Could not find the Canvas!" );
+ kapp->quit();
+ }
+ setCentralWidget( widget );
+ connect( widget, SIGNAL( contextPress( const QPoint & ) ), SLOT( mySlot( const QPoint & ) ) );
+ connect( m_canvas->widget(), SIGNAL( contextPress( const QPoint & ) ), SLOT( mySlot( const QPoint & ) ) );
+ </pre>
+ *
+ * You can't connect signals or slots using KImageViewer::Canvas, because this interface
+ * doesn't inherit from QObject. But you can cast to QWidget and use that instead (or just
+ * keep the original pointer to QWidget around, like shown in the example).
+ *
+ * This interface is not guaranteed to be kept binary or source compatible
+ * until it's finished. So if you're using this interface please get in contact
+ * with me.
+ */
+class KDE_EXPORT Canvas
+{
+ public:
+ /**
+ * set the background color of the canvas
+ */
+ virtual void setBgColor( const QColor & ) = 0;
+
+ /**
+ * returns the current background color
+ */
+ virtual const QColor & bgColor() const = 0;
+
+ /**
+ * the depth of the contained image
+ */
+ virtual int imageDepth() const = 0;
+
+ /**
+ * the size of the unzoomed image
+ */
+ virtual QSize imageSize() const = 0;
+
+ /**
+ * the size of the zoomed (current) image
+ */
+ virtual QSize currentSize() const = 0;
+
+ /**
+ * returns the zoom factor
+ */
+ virtual double zoom() const = 0;
+
+ /**
+ * @return The current (unzoomed) image
+ * Take care that the canas may delete the image so you probably need to
+ * make a copy of the image if you want to keep it around.
+ */
+ virtual const QImage * image() const = 0;
+
+ /**
+ * Scrolls the content so that the point (x, y) is in the top-left corner.
+ */
+ virtual void setXYOffset( int x, int y ) = 0;
+
+ /**
+ * Returns the leftmost visible X coordinate of the image.
+ */
+ virtual int xOffset() const = 0;
+
+ /**
+ * Returns the topmost visible Y coordinate of the image.
+ */
+ virtual int yOffset() const = 0;
+
+ /**
+ * Returns whether to use fast or smooth scaling
+ */
+ virtual bool fastScale() const = 0;
+
+ /**
+ * Return whether the image should always be centered.
+ */
+ virtual bool centered() const = 0;
+
+ /**
+ * Return the selected rectangle. If nothing is selected the rectangle is
+ * empty but doesn't have to be null.
+ */
+ virtual QRect selection() const = 0;
+
+ /**
+ * Returns whether the aspect ratio of the image is kept
+ */
+ virtual bool keepAspectRatio() const = 0;
+
+ /**
+ * @return the number of available blend effects
+ */
+ virtual unsigned int numOfBlendEffects() const { return 0; }
+
+ /**
+ * @return the description of the blend effect
+ */
+ virtual QString blendEffectDescription( unsigned int ) const { return QString::null; }
+
+ /**
+ * Sets the blending effect used to create a transition between images
+ */
+ virtual void setBlendEffect( unsigned int idx ) { m_iBlendEffect = idx; }
+
+ /**
+ * @return the current blend effect index
+ */
+ virtual unsigned int blendEffect() const { return m_iBlendEffect; }
+
+ /**
+ * @return the current maximum image size
+ */
+ virtual const QSize & maximumImageSize() const = 0;
+
+ /**
+ * @return the current minimum image size
+ */
+ virtual const QSize & minimumImageSize() const = 0;
+
+ /**
+ * @return a pointer to the QWidget interface of this object
+ */
+ virtual QWidget * widget() = 0;
+
+ signals:
+ /**
+ * a mouse button was pressed and a context menu should be openend
+ */
+ virtual void contextPress( const QPoint & ) = 0;
+
+ /**
+ * the size of the image has changed (a new image was loaded, or the
+ * image was zoomed or cropped)
+ *
+ * it passes the new size of the image
+ */
+ virtual void imageSizeChanged( const QSize & ) = 0;
+
+ /**
+ * The zoom of the image has changed.
+ */
+ virtual void zoomChanged( double zoom ) = 0;
+
+ /**
+ * The selection has changed. Connect to this signal if you want to
+ * do something with a selection of the image (e.g. crop).
+ */
+ virtual void selectionChanged( const QRect & ) = 0;
+
+ /**
+ * Emitted when an image is finished being shown. If a blend effect is being used
+ * the signal is emitted when the effect is finished.
+ */
+ virtual void showingImageDone() = 0;
+
+ /**
+ * This signal is emitted whenever the canvas changes between image/no-image. For
+ * example, if someone calls @ref clear() hasImage( false ) is emitted if an image
+ * was shown before.
+ */
+ virtual void hasImage( bool ) = 0;
+
+ /**
+ * Some methods of the canvas not only change the way the image is shown (e.g. zoom)
+ * but also change the image itself (e.g. rotation) - @ref image() returns something
+ * different. If such a change happens this signal is emitted.
+ * It is not emitted when a new image is set with the @ref setImage() methods.
+ */
+ virtual void imageChanged() = 0;
+
+ /**
+ * The current mouse cursor position on the image.
+ */
+ virtual void cursorPos( const QPoint & ) = 0;
+
+ public slots:
+ /**
+ * Set if the image should always be centered if the canvas is
+ * bigger than the image.
+ */
+ virtual void setCentered( bool ) = 0;
+
+ /**
+ * Give the canvas a new image to show. The zoom level is kept.
+ */
+ virtual void setImage( const QImage & ) = 0;
+
+ /**
+ * Give the canvas a new image to show.
+ *
+ * You have to pass the size the image should have when it appears
+ * on screen.
+ */
+ virtual void setImage( const QImage &, const QSize & ) = 0;
+
+ /**
+ * Set the zoom to be used when showing the image.
+ */
+ virtual void setZoom( double ) = 0;
+
+ /**
+ * Fit the image into the requested width and height.
+ */
+ virtual void boundImageTo( const QSize & size ) = 0;
+
+ /**
+ * Set the maximum size of the image. If this is set the image will
+ * never exceed this size.
+ *
+ * If you set this to 0x0 the image size may be as big as possible
+ */
+ virtual void setMaximumImageSize( const QSize & ) = 0;
+
+ /**
+ * Set the minimum size of the image. If this is set the image will
+ * never be smaller than this size.
+ *
+ * If you set this to 0x0 the image size can be as small as possible
+ */
+ virtual void setMinimumImageSize( const QSize & ) = 0;
+
+ /**
+ * Resize the image to the given size. It will keep the aspect ratio
+ * as long as keepAspectRatio is true (default). The image will be as
+ * large as possible within the given constraints.
+ */
+ virtual void resizeImage( const QSize & ) = 0;
+
+ /**
+ * Hides the scrollbars of the canvas. It's still possible to scroll
+ * by moving the image with the mouse.
+ */
+ virtual void hideScrollbars( bool ) = 0;
+
+ /**
+ * Changes the zoom behaviour: Normally the aspect ratio of the image
+ * won't change, but if you want to allow it you may do.
+ */
+ virtual void setKeepAspectRatio( bool ) = 0;
+
+ /**
+ * If the canvas supports different methods for scaling you may
+ * switch between fast and smooth scaling.
+ *
+ * It defaults to smooth scaling.
+ */
+ virtual void setFastScale( bool ) = 0;
+
+ /**
+ * clears the canvas (no image loaded)
+ */
+ virtual void clear() = 0;
+
+ /**
+ * flip the image horizontally
+ *
+ * @param change If set to true the internal image will be changed, else
+ * only the shown image changes and @ref image() still returns
+ * the same as before this call.
+ */
+ virtual void flipHorizontal( bool change = false ) = 0;
+
+ /**
+ * flip the image vertically
+ *
+ * @param change If set to true the internal image will be changed, else
+ * only the shown image changes and @ref image() still returns
+ * the same as before this call.
+ */
+ virtual void flipVertical( bool change = false ) = 0;
+
+ /**
+ * rotate the image a degrees counterclockwise
+ *
+ * @param angle The angle in degrees that the image should be rotated.
+ * @param change If set to true the internal image will be changed, else
+ * only the shown image changes and @ref image() still returns
+ * the same as before this call.
+ */
+ virtual void rotate( double angle, bool change = false ) = 0;
+
+ protected:
+ Canvas();
+ virtual ~Canvas();
+ unsigned int m_iBlendEffect;
+
+}; //class Canvas
+} //namespace KImageViewer
+
+// vim:sw=4:ts=4
+
+#endif // KIMAGEVIEWER_CANVAS_H