diff options
Diffstat (limited to 'tools/designer/src/lib/shared/zoomwidget_p.h')
-rw-r--r-- | tools/designer/src/lib/shared/zoomwidget_p.h | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/tools/designer/src/lib/shared/zoomwidget_p.h b/tools/designer/src/lib/shared/zoomwidget_p.h new file mode 100644 index 0000000..fe850f7 --- /dev/null +++ b/tools/designer/src/lib/shared/zoomwidget_p.h @@ -0,0 +1,238 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef ZOOMWIDGET_H +#define ZOOMWIDGET_H + +#include "shared_global_p.h" + +#include <QtGui/QGraphicsView> +#include <QtGui/QGraphicsProxyWidget> +#include <QtCore/QList> + +QT_BEGIN_NAMESPACE + +class QGraphicsScene; +class QMenu; +class QAction; +class QActionGroup; + +namespace qdesigner_internal { + +// A checkable zoom menu action group. Operates in percent. + +class QDESIGNER_SHARED_EXPORT ZoomMenu : public QObject { + Q_OBJECT + Q_DISABLE_COPY(ZoomMenu) + +public: + ZoomMenu(QObject *parent = 0); + void addActions(QMenu *m); + + int zoom() const; + + // Return a list of available zoom values. + static QList<int> zoomValues(); + +public slots: + void setZoom(int percent); + +signals: + void zoomChanged(int); + +private slots: + void slotZoomMenu(QAction *); + +private: + static int zoomOf(const QAction *a); + + QActionGroup *m_menuActions; +}; + +/* Zoom view: A QGraphicsView with a zoom menu */ + +class QDESIGNER_SHARED_EXPORT ZoomView : public QGraphicsView +{ + Q_PROPERTY(int zoom READ zoom WRITE setZoom DESIGNABLE true SCRIPTABLE true) + Q_PROPERTY(bool zoomContextMenuEnabled READ isZoomContextMenuEnabled WRITE setZoomContextMenuEnabled DESIGNABLE true SCRIPTABLE true) + Q_PROPERTY(bool autoScrollSuppressed READ isAutoScrollSuppressed WRITE setAutoScrollSuppressed DESIGNABLE true SCRIPTABLE true) + + Q_OBJECT + Q_DISABLE_COPY(ZoomView) +public: + ZoomView(QWidget *parent = 0); + + /* Zoom in percent (for easily implementing menus) and qreal zoomFactor + * in sync */ + int zoom() const; // in percent + qreal zoomFactor() const; + + // Zoom Menu on QGraphicsView. + bool isZoomContextMenuEnabled() const; + void setZoomContextMenuEnabled(bool e); + + // Suppress scrolling when changing zoom. Default: on + bool isAutoScrollSuppressed() const; + void setAutoScrollSuppressed(bool s); + + QGraphicsScene &scene() { return *m_scene; } + const QGraphicsScene &scene() const { return *m_scene; } + + // Helpers for menu + ZoomMenu *zoomMenu(); + + QPoint scrollPosition() const; + void setScrollPosition(const QPoint& pos); + void scrollToOrigin(); + +public slots: + void setZoom(int percent); + void showContextMenu(const QPoint &globalPos); + +protected: + void contextMenuEvent(QContextMenuEvent *event); + + // Overwrite for implementing additional behaviour when doing setZoom(); + virtual void applyZoom(); + +private: + QGraphicsScene *m_scene; + int m_zoom; + qreal m_zoomFactor; + + bool m_zoomContextMenuEnabled; + bool m_autoScrollSuppressed; + bool m_resizeBlocked; + ZoomMenu *m_zoomMenu; +}; + +/* The proxy widget used in ZoomWidget. It refuses to move away from 0,0, + * This behaviour is required for Windows only. */ + +class QDESIGNER_SHARED_EXPORT ZoomProxyWidget : public QGraphicsProxyWidget { + Q_DISABLE_COPY(ZoomProxyWidget) +public: + explicit ZoomProxyWidget(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); + +protected: + virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); +}; + +/* Zoom widget: A QGraphicsView-based container for a widget that allows for + * zooming it. Communicates changes in size in the following ways: + * 1) Embedded widget wants to resize: Listen for its resize in event filter + * and resize + * 2) Zoom is changed: resize to fully display the embedded widget + * 3) Outer widget changes (by manually resizing the window: + * Pass the scaled change on to the embedded widget. + * Provides helper functions for a zoom context menu on the widget. */ + +class QDESIGNER_SHARED_EXPORT ZoomWidget : public ZoomView +{ + Q_PROPERTY(bool widgetZoomContextMenuEnabled READ isWidgetZoomContextMenuEnabled WRITE setWidgetZoomContextMenuEnabled DESIGNABLE true SCRIPTABLE true) + Q_PROPERTY(bool itemAcceptDrops READ itemAcceptDrops WRITE setItemAcceptDrops DESIGNABLE true SCRIPTABLE true) + Q_OBJECT + Q_DISABLE_COPY(ZoomWidget) + +public: + ZoomWidget(QWidget *parent = 0); + void setWidget(QWidget *w, Qt::WindowFlags wFlags = 0); + + const QGraphicsProxyWidget *proxy() const { return m_proxy; } + QGraphicsProxyWidget *proxy() { return m_proxy; } + + /* Enable the zoom Menu on the Widget (as opposed ZoomView's menu which + * is on the canvas). */ + bool isWidgetZoomContextMenuEnabled() const; + void setWidgetZoomContextMenuEnabled(bool e); + + void setItemAcceptDrops(bool); + bool itemAcceptDrops() const; + + virtual QSize minimumSizeHint() const; + virtual QSize sizeHint() const; + + bool zoomedEventFilter(QObject *watched, QEvent *event); + +public slots: + // debug state + void dump() const; + +protected: + void resizeEvent(QResizeEvent * event); + + // Overwritten from ZoomView + virtual void applyZoom(); + // Overwrite to actually perform a resize. This is required if we are in a layout. Default does resize(). + virtual void doResize(const QSize &s); + +private: + // Factory function for QGraphicsProxyWidgets which can be overwritten. Default creates a ZoomProxyWidget + virtual QGraphicsProxyWidget *createProxyWidget(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0) const; + QSize widgetSizeToViewSize(const QSize &s, bool *ptrToValid = 0) const; + + void resizeToWidgetSize(); + QSize viewPortMargin() const; + QSize widgetSize() const; + QSizeF widgetDecorationSizeF() const; + + QGraphicsProxyWidget *m_proxy; + bool m_viewResizeBlocked; + bool m_widgetResizeBlocked; + bool m_widgetZoomContextMenuEnabled; +}; + +} // namespace qdesigner_internal + +QT_END_NAMESPACE + +#endif |