You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
6.8 KiB
263 lines
6.8 KiB
15 years ago
|
/*
|
||
|
* This file is part of the KDE project
|
||
|
*
|
||
|
* Copyright (c) 2005 Boudewijn Rempt <boud@valdyas.org>
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* This program 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 General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*/
|
||
|
|
||
|
#ifndef KO_BIRD_EYE_PANEL
|
||
|
#define KO_BIRD_EYE_PANEL
|
||
|
|
||
|
#include <qrect.h>
|
||
|
#include <qwidget.h>
|
||
|
|
||
|
#include <KoPoint.h>
|
||
|
#include <KoRect.h>
|
||
|
|
||
|
class QPixmap;
|
||
|
class KAction;
|
||
|
class KoDocument;
|
||
|
class WdgBirdEye;
|
||
|
|
||
|
|
||
|
class KoCanvasAdapter {
|
||
|
|
||
|
public:
|
||
|
|
||
|
KoCanvasAdapter();
|
||
|
virtual ~KoCanvasAdapter();
|
||
|
|
||
|
/**
|
||
|
* Returns the area of the document that is visible, in pixels
|
||
|
*/
|
||
|
virtual KoRect visibleArea() = 0;
|
||
|
|
||
|
/**
|
||
|
* Returns the total area of the document in pixels. Use KoPageLayout and KoZoomhandler
|
||
|
* to take care of zoom, points and whatnot when computing this.
|
||
|
*/
|
||
|
virtual QRect size() = 0;
|
||
|
|
||
|
/**
|
||
|
* Return the current canvas zoom factor.
|
||
|
*/
|
||
|
virtual double zoomFactor() = 0;
|
||
|
|
||
|
/**
|
||
|
* Show pt in the center of the view
|
||
|
*/
|
||
|
virtual void setViewCenterPoint(double x, double y) = 0;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* The zoom listener interface defines methods that the bird eye
|
||
|
* panel will call whenever the zoomlevel is changed through one
|
||
|
* of the panel actions.
|
||
|
*/
|
||
|
class KoZoomAdapter {
|
||
|
|
||
|
public:
|
||
|
|
||
|
KoZoomAdapter();
|
||
|
virtual ~KoZoomAdapter();
|
||
|
|
||
|
/**
|
||
|
* Zoom to the specified factor around the point x and y
|
||
|
*/
|
||
|
virtual void zoomTo(double x, double y, double factor ) = 0;
|
||
|
|
||
|
/**
|
||
|
* Zoom one step in.
|
||
|
*/
|
||
|
virtual void zoomIn() = 0;
|
||
|
|
||
|
/**
|
||
|
* Zoom one step out.
|
||
|
*/
|
||
|
virtual void zoomOut() = 0;
|
||
|
|
||
|
/**
|
||
|
* Get the minimum zoom factor that this listener supports.
|
||
|
*/
|
||
|
virtual double getMinZoom() = 0;
|
||
|
|
||
|
/**
|
||
|
* Get the maximum zoom factor that this listener supports.
|
||
|
*/
|
||
|
virtual double getMaxZoom() = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
class KoThumbnailAdapter
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
KoThumbnailAdapter();
|
||
|
~KoThumbnailAdapter();
|
||
|
|
||
|
/**
|
||
|
* Returns the size of the document in pixels.
|
||
|
* If the document is a KoDocument that uses a KoPageLayout, the same
|
||
|
* formula as in the generatePreview() method should be used to go from points
|
||
|
* to pixels.
|
||
|
*
|
||
|
* @returns the size in pixels.
|
||
|
*/
|
||
|
virtual QSize pixelSize() = 0;
|
||
|
|
||
|
/**
|
||
|
* Returns the specified rectangle of the thumbnail as a QImage. thumbnailSize
|
||
|
* gives the dimensions of the whole document thumbnail, and r specifies a rectangle
|
||
|
* within that.
|
||
|
*
|
||
|
* @param r the rectangle in the thumbnail to be rendered
|
||
|
* @param thumbnailSize the size in pixels of the full thumbnail
|
||
|
*/
|
||
|
virtual QImage image(QRect r, QSize thumbnailSize) = 0;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* A complex widget that provides an overview of a document
|
||
|
* with a red panning rectangle to and a zoom slider and a toolbar
|
||
|
* with a couple of useful functions.
|
||
|
*/
|
||
|
class KoBirdEyePanel : public QWidget {
|
||
|
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
* Create a new bird eye panel.
|
||
|
*
|
||
|
* @param zoomListener the object that listens to the zoom instructions we give
|
||
|
* @param thumbnailProvider the class that creates the small image at the right
|
||
|
* zoomlevel
|
||
|
* @param canvas the place the document is painted.
|
||
|
* @param parent the parent widget
|
||
|
* @param name the QObject name of this bird eye widget
|
||
|
* @param f the widget flags (@see QWidget)
|
||
|
*/
|
||
|
KoBirdEyePanel( KoZoomAdapter * zoomListener,
|
||
|
KoThumbnailAdapter * thumbnailProvider,
|
||
|
KoCanvasAdapter * canvas,
|
||
|
QWidget * parent,
|
||
|
const char * name = 0,
|
||
|
WFlags f = 0 );
|
||
|
|
||
|
virtual ~KoBirdEyePanel();
|
||
|
|
||
|
bool eventFilter(QObject*, QEvent*);
|
||
|
|
||
|
public slots:
|
||
|
|
||
|
void setZoomListener( KoZoomAdapter * zoomListener) { m_zoomListener = zoomListener; }
|
||
|
|
||
|
/**
|
||
|
* Set a new thumbnail provider. This will first delete the existing provider.
|
||
|
**/
|
||
|
void setThumbnailProvider( KoThumbnailAdapter * thumbnailProvider );
|
||
|
|
||
|
/**
|
||
|
* Connect to this slot to inform the bird's eye view of changes in
|
||
|
* the view transformation, i.e. zoom level or scroll changes.
|
||
|
*/
|
||
|
void slotViewTransformationChanged();
|
||
|
|
||
|
void cursorPosChanged(Q_INT32 xpos, Q_INT32 ypos);
|
||
|
|
||
|
void zoomMinus();
|
||
|
void zoomPlus();
|
||
|
|
||
|
/**
|
||
|
* Connect to this slot if a (rectangular) area of your document is changed.
|
||
|
*
|
||
|
* @param r The rect that has been changed: this is unzoomed.
|
||
|
*/
|
||
|
void slotUpdate(const QRect & r);
|
||
|
|
||
|
protected slots:
|
||
|
|
||
|
void updateVisibleArea();
|
||
|
void zoomValueChanged(int zoom);
|
||
|
void zoom100();
|
||
|
void sliderChanged(int);
|
||
|
|
||
|
protected:
|
||
|
void setZoom(int zoom);
|
||
|
|
||
|
void handleMouseMove(QPoint);
|
||
|
void handleMouseMoveAction(QPoint);
|
||
|
void handleMousePress(QPoint);
|
||
|
void fitThumbnailToView();
|
||
|
void renderView();
|
||
|
void resizeViewEvent(QSize size);
|
||
|
void paintViewEvent(QPaintEvent *e);
|
||
|
void makeThumbnailRectVisible(const QRect& r);
|
||
|
|
||
|
enum enumDragHandle {
|
||
|
DragHandleNone,
|
||
|
DragHandleLeft,
|
||
|
DragHandleCentre,
|
||
|
DragHandleRight,
|
||
|
DragHandleTop,
|
||
|
DragHandleBottom
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* Returns the drag handle type at point p in thumbnail coordinates.
|
||
|
*/
|
||
|
enumDragHandle dragHandleAt(QPoint p);
|
||
|
|
||
|
/**
|
||
|
* Returns the rectangle in the thumbnail covered by the given document rectangle.
|
||
|
*/
|
||
|
QRect documentToThumbnail(const KoRect& docRect);
|
||
|
|
||
|
/**
|
||
|
* Returns the rectangle in the document covered by the given thumbnail rectangle.
|
||
|
*/
|
||
|
KoRect thumbnailToDocument(const QRect& thumbnailRect);
|
||
|
|
||
|
/**
|
||
|
* Converts a point in the view to a point in the thumbnail.
|
||
|
*/
|
||
|
QPoint viewToThumbnail(const QPoint& viewPoint);
|
||
|
|
||
|
private:
|
||
|
|
||
|
WdgBirdEye * m_page;
|
||
|
|
||
|
KoZoomAdapter * m_zoomListener;
|
||
|
KoThumbnailAdapter * m_thumbnailProvider;
|
||
|
KoCanvasAdapter * m_canvas;
|
||
|
|
||
|
KAction* m_zoomIn;
|
||
|
KAction* m_zoomOut;
|
||
|
QPixmap m_viewBuffer;
|
||
|
QPixmap m_thumbnail;
|
||
|
|
||
|
QSize m_documentSize;
|
||
|
QRect m_visibleAreaInThumbnail;
|
||
|
bool m_dragging;
|
||
|
enumDragHandle m_dragHandle;
|
||
|
QPoint m_lastDragPos;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|