diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /krita/ui/kis_canvas.h | |
download | koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip |
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'krita/ui/kis_canvas.h')
-rw-r--r-- | krita/ui/kis_canvas.h | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/krita/ui/kis_canvas.h b/krita/ui/kis_canvas.h new file mode 100644 index 00000000..b9e38738 --- /dev/null +++ b/krita/ui/kis_canvas.h @@ -0,0 +1,381 @@ +/* + * Copyright (c) 1999 Matthias Elter <me@kde.org> + * Copyright (c) 2004-2006 Adrian Page <adrian@pagenet.plus.com> + * + * 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 KIS_CANVAS_H_ +#define KIS_CANVAS_H_ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <qwidget.h> +#ifdef HAVE_GL +#include <qgl.h> +#endif +#include <qpainter.h> + +#include "kis_global.h" +#include "kis_point.h" +#include "kis_vec.h" +#include "kis_input_device.h" + +#ifdef Q_WS_X11 + +// Irix has a different (and better) XInput tablet driver to +// the XFree/xorg driver. Qt needs a separate code path for that +// and so would we. +#if defined(HAVE_XINPUTEXT) && !defined(Q_OS_IRIX) +#define EXTENDED_X11_TABLET_SUPPORT +#endif + +#include <map> +#include <X11/Xlib.h> + +#if defined(EXTENDED_X11_TABLET_SUPPORT) +#include <X11/extensions/XInput.h> +#endif + +#endif // Q_WS_X11 + +class KisEvent; +class KisMoveEvent; +class KisButtonPressEvent; +class KisButtonReleaseEvent; +class KisDoubleClickEvent; +class KisCanvasWidgetPainter; + +class KisCanvasWidget : public QObject { + Q_OBJECT + +public: + KisCanvasWidget(); + virtual ~KisCanvasWidget(); + + // When enabled, the canvas may throw away move events if the application + // is unable to keep up with them, i.e. intermediate move events in the event + // queue are skipped. + void enableMoveEventCompressionHint(bool enableMoveCompression) { m_enableMoveEventCompressionHint = enableMoveCompression; } + + virtual KisCanvasWidgetPainter *createPainter() = 0; + +#ifdef EXTENDED_X11_TABLET_SUPPORT + static KisInputDevice findActiveInputDevice(); + virtual void selectTabletDeviceEvents() = 0; + + static void selectTabletDeviceEvents(QWidget *widget); +#endif + +#ifdef Q_WS_X11 + static void initX11Support(); +#endif + +signals: + void sigGotPaintEvent(QPaintEvent*); + void sigGotEnterEvent(QEvent*); + void sigGotLeaveEvent(QEvent*); + void sigGotMouseWheelEvent(QWheelEvent*); + void sigGotKeyPressEvent(QKeyEvent*); + void sigGotKeyReleaseEvent(QKeyEvent*); + void sigGotDragEnterEvent(QDragEnterEvent*); + void sigGotDropEvent(QDropEvent*); + void sigGotMoveEvent(KisMoveEvent *); + void sigGotButtonPressEvent(KisButtonPressEvent *); + void sigGotButtonReleaseEvent(KisButtonReleaseEvent *); + void sigGotDoubleClickEvent(KisDoubleClickEvent *); + +protected: + void widgetGotPaintEvent(QPaintEvent *event); + void widgetGotMousePressEvent(QMouseEvent *event); + void widgetGotMouseReleaseEvent(QMouseEvent *event); + void widgetGotMouseDoubleClickEvent(QMouseEvent *event); + void widgetGotMouseMoveEvent(QMouseEvent *event); + void widgetGotTabletEvent(QTabletEvent *event); + void widgetGotEnterEvent(QEvent *event ); + void widgetGotLeaveEvent(QEvent *event); + void widgetGotWheelEvent(QWheelEvent *event); + void widgetGotKeyPressEvent(QKeyEvent *event); + void widgetGotKeyReleaseEvent(QKeyEvent *event); + void widgetGotDragEnterEvent(QDragEnterEvent *event); + void widgetGotDropEvent(QDropEvent *event); + void moveEvent(KisMoveEvent *event); + void buttonPressEvent(KisButtonPressEvent *event); + void buttonReleaseEvent(KisButtonReleaseEvent *event); + void doubleClickEvent(KisDoubleClickEvent *event); + void translateTabletEvent(KisEvent *event); + +protected: + + bool m_enableMoveEventCompressionHint; + double m_lastPressure; + +#ifdef Q_WS_X11 + // On X11 systems, Qt throws away mouse move events if the application + // is unable to keep up with them. We override this behaviour so that + // we receive all move events, so that painting follows the mouse's motion + // accurately. + bool x11Event(XEvent *event, Display *x11Display, WId winId, QPoint widgetOriginPos); + static Qt::ButtonState translateX11ButtonState(int state); + static Qt::ButtonState translateX11Button(unsigned int button); + + static bool X11SupportInitialised; + + // Modifier masks for alt/meta - detected at run-time + static long X11AltMask; + static long X11MetaMask; + + int m_lastRootX; + int m_lastRootY; + +#ifdef EXTENDED_X11_TABLET_SUPPORT + +public: + class X11TabletDevice + { + public: + X11TabletDevice(); + X11TabletDevice(const XDeviceInfo *deviceInfo); + + bool mightBeTabletDevice() const { return m_mightBeTabletDevice; } + + XID id() const { return m_deviceId; } + XDevice *xDevice() const { return m_XDevice; } + QString name() const { return m_name; } + + KisInputDevice inputDevice() const { return m_inputDevice; } + void setInputDevice(KisInputDevice inputDevice) { m_inputDevice = inputDevice; } + + void setEnabled(bool enabled); + bool enabled() const; + + Q_INT32 numAxes() const; + + void setXAxis(Q_INT32 axis); + void setYAxis(Q_INT32 axis); + void setPressureAxis(Q_INT32 axis); + void setXTiltAxis(Q_INT32 axis); + void setYTiltAxis(Q_INT32 axis); + void setWheelAxis(Q_INT32 axis); + void setToolIDAxis(Q_INT32 axis); + void setSerialNumberAxis(Q_INT32 axis); + + static const Q_INT32 NoAxis = -1; + static const Q_INT32 DefaultAxis = -2; + + Q_INT32 xAxis() const; + Q_INT32 yAxis() const; + Q_INT32 pressureAxis() const; + Q_INT32 xTiltAxis() const; + Q_INT32 yTiltAxis() const; + Q_INT32 wheelAxis() const; + Q_INT32 toolIDAxis() const; + Q_INT32 serialNumberAxis() const; + + void readSettingsFromConfig(); + void writeSettingsToConfig(); + + // These return -1 if the device does not support the event + int buttonPressEvent() const { return m_buttonPressEvent; } + int buttonReleaseEvent() const { return m_buttonReleaseEvent; } + int motionNotifyEvent() const { return m_motionNotifyEvent; } + int proximityInEvent() const { return m_proximityInEvent; } + int proximityOutEvent() const { return m_proximityOutEvent; } + + void enableEvents(QWidget *widget) const; + + class State + { + public: + State() {} + State(const KisPoint& pos, double pressure, const KisVector2D& tilt, double wheel, + Q_UINT32 toolID, Q_UINT32 serialNumber); + + // Position, pressure and wheel are normalised to 0 - 1 + KisPoint pos() const { return m_pos; } + double pressure() const { return m_pressure; } + // Tilt is normalised to -1->+1 + KisVector2D tilt() const { return m_tilt; } + double wheel() const { return m_wheel; } + // Wacom tool id and serial number of device. + Q_UINT32 toolID() const { return m_toolID; } + Q_UINT32 serialNumber() const { return m_serialNumber; } + + private: + KisPoint m_pos; + double m_pressure; + KisVector2D m_tilt; + double m_wheel; + Q_UINT32 m_toolID; + Q_UINT32 m_serialNumber; + }; + + State translateAxisData(const int *axisData) const; + + private: + double translateAxisValue(int value, const XAxisInfo& axisInfo) const; + + XID m_deviceId; + XDevice *m_XDevice; + + QString m_name; + + bool m_mightBeTabletDevice; + KisInputDevice m_inputDevice; + + bool m_enabled; + + Q_INT32 m_xAxis; + Q_INT32 m_yAxis; + Q_INT32 m_pressureAxis; + Q_INT32 m_xTiltAxis; + Q_INT32 m_yTiltAxis; + Q_INT32 m_wheelAxis; + Q_INT32 m_toolIDAxis; + Q_INT32 m_serialNumberAxis; + + QValueVector<XAxisInfo> m_axisInfo; + + int m_motionNotifyEvent; + int m_buttonPressEvent; + int m_buttonReleaseEvent; + int m_proximityInEvent; + int m_proximityOutEvent; + + QValueVector<XEventClass> m_eventClassList; + }; + + typedef std::map<XID, X11TabletDevice> X11XIDTabletDeviceMap; + static X11XIDTabletDeviceMap& tabletDeviceMap(); + +protected: + static int X11DeviceMotionNotifyEvent; + static int X11DeviceButtonPressEvent; + static int X11DeviceButtonReleaseEvent; + static int X11ProximityInEvent; + static int X11ProximityOutEvent; + + static X11XIDTabletDeviceMap X11TabletDeviceMap; + +#endif // EXTENDED_X11_TABLET_SUPPORT + +#endif // Q_WS_X11 +}; + +class KisCanvas : public QObject { + Q_OBJECT + +public: + KisCanvas(QWidget *parent, const char *name); + virtual ~KisCanvas(); + + // When enabled, the canvas may throw away move events if the application + // is unable to keep up with them, i.e. intermediate move events in the event + // queue are skipped. + void enableMoveEventCompressionHint(bool enableMoveCompression); + + bool isOpenGLCanvas() const; + + /** + * Returns true if the cursor is over the canvas. + */ + bool cursorIsOverCanvas() const; + + /** + * Handle the given event (which must be a key event) as if the canvas + * had received it directly. + */ + void handleKeyEvent(QEvent *e); + + int width() const; + int height() const; + + void update(); + void update(const QRect& r); + void update(int x, int y, int width, int height); + void repaint(); + void repaint(bool erase); + void repaint(int x, int y, int width, int height, bool erase = true); + void repaint(const QRect& r, bool erase = true); + void repaint(const QRegion& r, bool erase = true); + + void updateGeometry(); + +#if defined(EXTENDED_X11_TABLET_SUPPORT) + void selectTabletDeviceEvents(); +#endif + +signals: + void sigGotPaintEvent(QPaintEvent*); + void sigGotEnterEvent(QEvent*); + void sigGotLeaveEvent(QEvent*); + void sigGotMouseWheelEvent(QWheelEvent*); + void sigGotKeyPressEvent(QKeyEvent*); + void sigGotKeyReleaseEvent(QKeyEvent*); + void sigGotDragEnterEvent(QDragEnterEvent*); + void sigGotDropEvent(QDropEvent*); + void sigGotMoveEvent(KisMoveEvent *); + void sigGotButtonPressEvent(KisButtonPressEvent *); + void sigGotButtonReleaseEvent(KisButtonReleaseEvent *); + void sigGotDoubleClickEvent(KisDoubleClickEvent *); + +protected: + // Allow KisView to render on the widget directly, but everything else + // has restricted access. + friend class KisView; + friend class KisCanvasPainter; + + // One of these will be valid, the other null. In Qt3, using a QPainter on + // a QGLWidget is not reliable. + QWidget *QPaintDeviceWidget() const; +#ifdef HAVE_GL + QGLWidget *OpenGLWidget() const; +#endif + void createQPaintDeviceCanvas(); +#ifdef HAVE_GL + void createOpenGLCanvas(QGLWidget *sharedContextWidget); +#endif + void show(); + void hide(); + void setGeometry(int x, int y, int width, int height); + + void setUpdatesEnabled(bool updatesEnabled); + bool isUpdatesEnabled() const; + + void setFocusPolicy(QWidget::FocusPolicy focusPolicy); + + const QCursor& cursor() const; + void setCursor(const QCursor& cursor); + + KisCanvasWidgetPainter *createPainter(); + KisCanvasWidget *canvasWidget() const; + +protected: +#ifdef HAVE_GL + void createCanvasWidget(bool useOpenGL, QGLWidget *sharedContextWidget = 0); +#else + void createCanvasWidget(bool useOpenGL); +#endif + QWidget *m_parent; + QString m_name; + KisCanvasWidget *m_canvasWidget; + bool m_enableMoveEventCompressionHint; + bool m_useOpenGL; +}; + +#endif // KIS_CANVAS_H_ + |