File indexing completed on 2024-12-08 05:08:31
0001 /*************************************************************************** 0002 * Copyright (C) 1999-2005 Trolltech AS * 0003 * Copyright (C) 2006 David Saxton <david@bluehaze.org> * 0004 * * 0005 * This file may be distributed and/or modified under the terms of the * 0006 * GNU General Public License version 2 as published by the Free * 0007 * Software Foundation * 0008 ***************************************************************************/ 0009 0010 #ifndef QCANVAS_H 0011 #define QCANVAS_H 0012 0013 #include <map> 0014 0015 #include "ktlqt3support/ktlq3scrollview.h" 0016 #include <QPixmap> 0017 // #include "q3ptrlist.h" 0018 #include <QBrush> 0019 #include <QList> 0020 #include <QPen> 0021 // #include "q3pointarray.h" // 2018.08.14 0022 0023 #include "canvasitemlist.h" 0024 0025 class KtlQCanvasView; 0026 class KtlQCanvasChunk; 0027 0028 class KtlQCanvas : public QObject 0029 { 0030 Q_OBJECT 0031 public: 0032 KtlQCanvas(QObject *parent = nullptr); 0033 KtlQCanvas(const int w, const int h); 0034 KtlQCanvas(QPixmap p, int h, int v, int tilewidth, int tileheight); 0035 0036 ~KtlQCanvas() override; 0037 0038 virtual void setTiles(QPixmap tiles, int h, int v, int tilewidth, int tileheight); 0039 virtual void setBackgroundPixmap(const QPixmap &p); 0040 QPixmap backgroundPixmap() const; 0041 0042 virtual void setBackgroundColor(const QColor &c); 0043 QColor backgroundColor() const; 0044 0045 virtual void setTile(int x, int y, int tilenum); 0046 int tile(int x, int y) const 0047 { 0048 return grid[x + y * htiles]; 0049 } 0050 0051 int tilesHorizontally() const 0052 { 0053 return htiles; 0054 } 0055 int tilesVertically() const 0056 { 0057 return vtiles; 0058 } 0059 0060 int tileWidth() const 0061 { 0062 return tilew; 0063 } 0064 int tileHeight() const 0065 { 0066 return tileh; 0067 } 0068 0069 virtual void resize(const QRect &newSize); 0070 int width() const 0071 { 0072 return size().width(); 0073 } 0074 int height() const 0075 { 0076 return size().height(); 0077 } 0078 QSize size() const 0079 { 0080 return m_size.size(); 0081 } 0082 QRect rect() const 0083 { 0084 return m_size; 0085 } 0086 bool onCanvas(const int x, const int y) const 0087 { 0088 return onCanvas(QPoint(x, y)); 0089 } 0090 bool onCanvas(const QPoint &p) const 0091 { 0092 return m_size.contains(p); 0093 } 0094 bool validChunk(const int x, const int y) const 0095 { 0096 return validChunk(QPoint(x, y)); 0097 } 0098 bool validChunk(const QPoint &p) const 0099 { 0100 return m_chunkSize.contains(p); 0101 } 0102 0103 int chunkSize() const 0104 { 0105 return chunksize; 0106 } 0107 virtual void retune(int chunksize, int maxclusters = 100); 0108 virtual void setChangedChunk(int i, int j); 0109 virtual void setChangedChunkContaining(int x, int y); 0110 virtual void setAllChanged(); 0111 virtual void setChanged(const QRect &area); 0112 virtual void setUnchanged(const QRect &area); 0113 0114 // These call setChangedChunk. 0115 void addItemToChunk(KtlQCanvasItem *, int i, int j); 0116 void removeItemFromChunk(KtlQCanvasItem *, int i, int j); 0117 void addItemToChunkContaining(KtlQCanvasItem *, int x, int y); 0118 void removeItemFromChunkContaining(KtlQCanvasItem *, int x, int y); 0119 0120 KtlQCanvasItemList allItems(); 0121 KtlQCanvasItemList collisions(const QPoint &) /* const */; 0122 KtlQCanvasItemList collisions(const QRect &) /* const */; 0123 KtlQCanvasItemList collisions(const QPolygon &pa, const KtlQCanvasItem *item, bool exact) const; 0124 0125 void drawArea(const QRect &, QPainter *p); 0126 0127 // These are for KtlQCanvasView to call 0128 virtual void addView(KtlQCanvasView *); 0129 virtual void removeView(KtlQCanvasView *); 0130 void drawCanvasArea(const QRect &, QPainter *p, bool double_buffer); 0131 void drawViewArea(KtlQCanvasView *view, QPainter *p, const QRect &r, bool dbuf); 0132 0133 // These are for KtlQCanvasItem to call 0134 virtual void addItem(KtlQCanvasItem *); 0135 virtual void removeItem(const KtlQCanvasItem *); 0136 0137 virtual void setUpdatePeriod(int ms); 0138 int toChunkScaling(int x) const; 0139 0140 signals: 0141 void resized(); 0142 0143 public slots: 0144 virtual void advance(); 0145 virtual void update(); 0146 0147 protected: 0148 virtual void drawBackground(QPainter &, const QRect &area); 0149 virtual void drawForeground(QPainter &, const QRect &area); 0150 0151 private: 0152 void init(int w, int h, int chunksze = 16, int maxclust = 100); 0153 void init(const QRect &r, int chunksze = 16, int maxclust = 100); 0154 void initChunkSize(const QRect &s); 0155 0156 KtlQCanvasChunk &chunk(int i, int j) const; 0157 KtlQCanvasChunk &chunkContaining(int x, int y) const; 0158 0159 QRect changeBounds(const QRect &inarea); 0160 void drawChanges(const QRect &inarea); 0161 void drawChangedItems(QPainter &painter); 0162 void setNeedRedraw(const KtlQCanvasItemList *list); 0163 0164 QPixmap offscr; 0165 int chunksize; 0166 int maxclusters; 0167 QRect m_size; 0168 QRect m_chunkSize; 0169 KtlQCanvasChunk *chunks; 0170 0171 SortedCanvasItems m_canvasItems; 0172 QList<KtlQCanvasView *> m_viewList; 0173 0174 void initTiles(QPixmap p, int h, int v, int tilewidth, int tileheight); 0175 ushort *grid; 0176 ushort htiles; 0177 ushort vtiles; 0178 ushort tilew; 0179 ushort tileh; 0180 bool oneone; 0181 QPixmap pm; 0182 QTimer *update_timer; 0183 QColor bgcolor; 0184 bool debug_redraw_areas; 0185 0186 friend void qt_unview(KtlQCanvas *c); 0187 0188 KtlQCanvas(const KtlQCanvas &); 0189 KtlQCanvas &operator=(const KtlQCanvas &); 0190 }; 0191 0192 class KtlQCanvasViewData; 0193 0194 class KtlQCanvasView : public KtlQ3ScrollView 0195 { 0196 Q_OBJECT 0197 public: 0198 KtlQCanvasView(QWidget *parent = nullptr, Qt::WindowFlags f = {}); // 2018.08.15 - unused? 0199 KtlQCanvasView(KtlQCanvas *viewing, QWidget *parent = nullptr, Qt::WindowFlags f = {}); 0200 ~KtlQCanvasView() override; 0201 0202 KtlQCanvas *canvas() const 0203 { 0204 return viewing; 0205 } 0206 void setCanvas(KtlQCanvas *v); 0207 0208 const QTransform &worldMatrix() const; 0209 const QTransform &inverseWorldMatrix() const; 0210 bool setWorldTransform(const QTransform &); 0211 0212 protected: 0213 /** overrides KtlQ3ScrollView::drawContents() */ // override paintEvent? 0214 void drawContents(QPainter *, int cx, int cy, int cw, int ch) override; 0215 QSize sizeHint() const override; 0216 0217 private: 0218 void drawContents(QPainter *) override; 0219 KtlQCanvas *viewing; 0220 KtlQCanvasViewData *d; 0221 friend void qt_unview(KtlQCanvas *c); 0222 KtlQCanvasView(const KtlQCanvasView &); 0223 KtlQCanvasView &operator=(const KtlQCanvasView &); 0224 0225 private slots: 0226 void cMoving(int, int); 0227 void updateContentsSize(); 0228 }; 0229 0230 #endif // QCANVAS_H