ginebra2/ContentViews/TiledWebView.h
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
#ifndef TILEDWEBVIEW_H
hgs
parents:
diff changeset
     2
#define TILEDWEBVIEW_H
hgs
parents:
diff changeset
     3
hgs
parents:
diff changeset
     4
#include <QGraphicsWebView>
hgs
parents:
diff changeset
     5
hgs
parents:
diff changeset
     6
#include <QTime>
hgs
parents:
diff changeset
     7
#include <QTimer>
hgs
parents:
diff changeset
     8
hgs
parents:
diff changeset
     9
#ifdef USE_OWN_TILED_CACHE
hgs
parents:
diff changeset
    10
#define USE_TILED_CACHE
hgs
parents:
diff changeset
    11
#endif
hgs
parents:
diff changeset
    12
hgs
parents:
diff changeset
    13
//#define USE_ASSISTANT_ITEM
hgs
parents:
diff changeset
    14
hgs
parents:
diff changeset
    15
#ifdef USE_ASSISTANT_ITEM
hgs
parents:
diff changeset
    16
class TiledWebView;
hgs
parents:
diff changeset
    17
class TiledWebViewAssistant : public QGraphicsWidget {
hgs
parents:
diff changeset
    18
public:
hgs
parents:
diff changeset
    19
    void paint(QPainter* painter, const QStyleOptionGraphicsItem* options, QWidget* widget);
hgs
parents:
diff changeset
    20
    TiledWebView* m_master;
hgs
parents:
diff changeset
    21
};
hgs
parents:
diff changeset
    22
#endif
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
class TiledWebView : public QGraphicsWebView
hgs
parents:
diff changeset
    25
{
hgs
parents:
diff changeset
    26
    Q_OBJECT
hgs
parents:
diff changeset
    27
protected:
hgs
parents:
diff changeset
    28
    TiledWebView(QGraphicsItem* parent = 0);
hgs
parents:
diff changeset
    29
    virtual ~TiledWebView();
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
    struct Tile {
hgs
parents:
diff changeset
    32
        Tile();
hgs
parents:
diff changeset
    33
        QPixmap img;
hgs
parents:
diff changeset
    34
        QRectF dirtyRect; // in tile coordinates
hgs
parents:
diff changeset
    35
        bool ready;
hgs
parents:
diff changeset
    36
        bool used;
hgs
parents:
diff changeset
    37
    };
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
    struct TileSet {
hgs
parents:
diff changeset
    40
        TileSet(QPoint aT, QRectF aR) { t = aT; r = aR; }
hgs
parents:
diff changeset
    41
        TileSet(const TileSet &o) { t = o.t; r = o.r; }
hgs
parents:
diff changeset
    42
        QPoint t;
hgs
parents:
diff changeset
    43
        QRectF r;
hgs
parents:
diff changeset
    44
    };
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
    void paint(QPainter* painter, const QStyleOptionGraphicsItem* options, QWidget* widget);
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
    Tile* createTile(const QPoint& p);
hgs
parents:
diff changeset
    49
    Tile* tileAt(const QPoint& p) const;
hgs
parents:
diff changeset
    50
    Tile* tileAt(int x, int y) const { return tileAt(QPoint(x, y)); }
hgs
parents:
diff changeset
    51
    void setTileAt(const QPoint& p,Tile* t);
hgs
parents:
diff changeset
    52
    void setTileAt(int x, int y,Tile* t) { setTileAt(QPoint(x, y), t); }
hgs
parents:
diff changeset
    53
    QPoint tileAtPoint(const QPointF& p) const;
hgs
parents:
diff changeset
    54
    QRectF tileRect(const QPoint& t) const; // return is in tile coords
hgs
parents:
diff changeset
    55
    QRectF mapToTileCoords(const QRectF& rect) const
hgs
parents:
diff changeset
    56
        { return QRectF(mapToTileCoords(rect.topLeft()),mapToTileCoords(rect.size())); }
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    QPointF mapToTileCoords(const QPointF& p) const     { return p * m_tilesScale; }
hgs
parents:
diff changeset
    59
    QSizeF mapToTileCoords(const QSizeF& s) const     { return s * m_tilesScale; }
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
    QRectF mapFromTileCoords(const QRectF& rect) const
hgs
parents:
diff changeset
    62
        { return QRectF(mapFromTileCoords(rect.topLeft()),mapFromTileCoords(rect.size())); }
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
    QPointF mapFromTileCoords(const QPointF& p) const     { return p / m_tilesScale; }
hgs
parents:
diff changeset
    65
    QSizeF mapFromTileCoords(const QSizeF& s) const     { return s / m_tilesScale; }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    QRectF viewPortRect() const;
hgs
parents:
diff changeset
    68
    QPoint findTile4Update(bool inView, bool addDirty = false) const;
hgs
parents:
diff changeset
    69
    QList<QPoint> findTileLine4Update(bool dirty, bool inView, bool useScrollDirection = true) const;
hgs
parents:
diff changeset
    70
    void boundTile(QPoint& t) const;
hgs
parents:
diff changeset
    71
    QRectF updateTile(const QPoint& t);
hgs
parents:
diff changeset
    72
    void paintTile(QPainter* painter, const QPoint& t, const QRectF& dirtyRect, QRegion& dirtyRegion);
hgs
parents:
diff changeset
    73
    void createTileField();
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
    QRectF validateTileRect(const QRectF& rect, const QSize& dim) const;
hgs
parents:
diff changeset
    77
    QRectF adjustedTileRect(const QSize& dim) const;
hgs
parents:
diff changeset
    78
    QRectF centeredTileRect(const QSize& dim) const;
hgs
parents:
diff changeset
    79
    void adjustTilesToViewPort(bool center = false);
hgs
parents:
diff changeset
    80
    void moveTilesRect(const QRectF& newTilesRect);
hgs
parents:
diff changeset
    81
    void resetTiles(const QRect& r, bool remove);
hgs
parents:
diff changeset
    82
    void scrollTileField(const QPoint& diff);
hgs
parents:
diff changeset
    83
    static QPixmap* getUnprepPixmap();
hgs
parents:
diff changeset
    84
    void checkTilesField();
hgs
parents:
diff changeset
    85
    void setPage(QWebPage* page);
hgs
parents:
diff changeset
    86
    QList<QRectF> updateViewportTiles(QList<TileSet> *updatedTiles = 0);
hgs
parents:
diff changeset
    87
    QList<QRectF> updateScrollAreaTilesChunk(QList<TileSet> *updatedTiles = 0, bool inPaint = 0);
hgs
parents:
diff changeset
    88
    void doScaleCommit();
hgs
parents:
diff changeset
    89
    void doTilesFieldRebuild();
hgs
parents:
diff changeset
    90
    void updateSceneRects(const QList<QRectF>& dirtyTiles);
hgs
parents:
diff changeset
    91
#ifdef USE_ASSISTANT_ITEM
hgs
parents:
diff changeset
    92
    void resizeEvent(QGraphicsSceneResizeEvent *event);
hgs
parents:
diff changeset
    93
#endif
hgs
parents:
diff changeset
    94
    QSize getTileFieldDim();
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    QVector<Tile*> m_tilesPool;
hgs
parents:
diff changeset
    97
    Tile** m_tilesField;
hgs
parents:
diff changeset
    98
    QSize  m_tilesDim;
hgs
parents:
diff changeset
    99
    QRectF m_tilesRect;
hgs
parents:
diff changeset
   100
    qreal  m_tilesScale;
hgs
parents:
diff changeset
   101
    bool   m_inUpdate;
hgs
parents:
diff changeset
   102
    bool   m_tilesRectCentered;
hgs
parents:
diff changeset
   103
    QTime  m_userPaintTS;
hgs
parents:
diff changeset
   104
    QTimer m_updateTimer;
hgs
parents:
diff changeset
   105
    bool   m_tilesFrozen;
hgs
parents:
diff changeset
   106
    bool   m_needViewportTilesUpdate;
hgs
parents:
diff changeset
   107
    bool   m_needScaleCommit;
hgs
parents:
diff changeset
   108
    bool   m_needTilesFieldRebuild;
hgs
parents:
diff changeset
   109
    QPoint m_lastScrollDelta;
hgs
parents:
diff changeset
   110
#ifdef USE_ASSISTANT_ITEM
hgs
parents:
diff changeset
   111
    TiledWebViewAssistant* m_assistant;
hgs
parents:
diff changeset
   112
#endif // USE_ASSISTANT_ITEM
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
private slots:
hgs
parents:
diff changeset
   115
    void repaintRequested(QRect);
hgs
parents:
diff changeset
   116
    void updateTimeout();
hgs
parents:
diff changeset
   117
    void scheduleScaleUpdate();
hgs
parents:
diff changeset
   118
    void startUpdateTimer();
hgs
parents:
diff changeset
   119
    void stopUpdateTimer();
hgs
parents:
diff changeset
   120
    void loadStarted();
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
public slots:
hgs
parents:
diff changeset
   123
    void viewportUpdated();
hgs
parents:
diff changeset
   124
    void commitZoom();
hgs
parents:
diff changeset
   125
    void setTiledBackingStoreFrozen(bool frozen);
hgs
parents:
diff changeset
   126
    void userActivity();
hgs
parents:
diff changeset
   127
    void viewScrolled(QPoint& scrollPos, QPoint& delta);
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
  friend class TiledWebViewAssistant;
hgs
parents:
diff changeset
   130
};
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
#endif // TILEDWEBVIEW_H