00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef __KGAMECANVAS_H__
00028 #define __KGAMECANVAS_H__
00029
00030
00031
00032
00033
00034 #include <QtCore/QList>
00035 #include <QtCore/QPoint>
00036 #include <QtGui/QPicture>
00037 #include <QtGui/QPixmap>
00038 #include <QtGui/QPainter>
00039 #include <QtCore/QRect>
00040 #include <QtGui/QRegion>
00041 #include <QtGui/QWidget>
00042 #include <libkdegames_export.h>
00043
00044 class KGameCanvasItem;
00045
00052 class KDEGAMES_EXPORT KGameCanvasAbstract
00053 {
00054 protected:
00055 friend class KGameCanvasItem;
00056
00057 QList<KGameCanvasItem*> m_items;
00058 QList<KGameCanvasItem*> m_animated_items;
00059
00060 public:
00062 KGameCanvasAbstract();
00063
00064 virtual ~KGameCanvasAbstract();
00065
00067 const QList<KGameCanvasItem*>* items() const { return &m_items; }
00068
00070 KGameCanvasItem* itemAt(const QPoint &pos) const;
00071
00073 KGameCanvasItem* itemAt(int x, int y) const { return itemAt(QPoint(x,y)); }
00074
00077 QList<KGameCanvasItem*> itemsAt(const QPoint &pos) const;
00078
00080 QList<KGameCanvasItem*> itemsAt(int x, int y) const { return itemsAt(QPoint(x,y)); }
00081
00083 virtual void ensureAnimating() = 0;
00084
00086 virtual void ensurePendingUpdate() = 0;
00087
00089 virtual void invalidate(const QRect& r, bool translate = true) = 0;
00090
00092 virtual void invalidate(const QRegion& r, bool translate = true) = 0;
00093
00095 virtual class KGameCanvasWidget* topLevelCanvas() = 0;
00096
00098 virtual QPoint canvasPosition() const = 0;
00099 };
00100
00101
00109 class KDEGAMES_EXPORT KGameCanvasItem
00110 {
00111 private:
00112 friend class KGameCanvasAbstract;
00113 friend class KGameCanvasWidget;
00114 friend class KGameCanvasGroup;
00115 friend class KGameCanvasAdapter;
00116
00117 bool m_visible;
00118 bool m_animated;
00119 int m_opacity;
00120 QPoint m_pos;
00121 KGameCanvasAbstract *m_canvas;
00122
00123 bool m_changed;
00124 QRect m_last_rect;
00125
00126 static QPixmap* transparence_pixmap_cache;
00127 static QPixmap* getTransparenceCache(const QSize &s);
00128 virtual void paintInternal(QPainter* p, const QRect& prect, const QRegion& preg,
00129 const QPoint &delta, double cumulative_opacity);
00130
00131 void updateAfterRestack(int from, int to);
00132
00133
00134 virtual void updateChanges();
00135
00136 public:
00143 KGameCanvasItem(KGameCanvasAbstract* canvas = NULL);
00144
00145 virtual ~KGameCanvasItem();
00146
00148 virtual void changed();
00149
00151 bool visible() const { return m_visible; }
00152
00154 void setVisible(bool v);
00155
00157 bool animated() const { return m_animated; }
00158
00160 void setAnimated(bool a);
00161
00163 int opacity() const { return m_opacity; }
00164
00166 void setOpacity(int o);
00167
00169 void hide(){ setVisible(false); }
00170
00172 void show(){ setVisible(true); }
00173
00175 void raise();
00176
00178 void lower();
00179
00181 void stackOver(KGameCanvasItem* ref);
00182
00184 void stackUnder(KGameCanvasItem* ref);
00185
00187 KGameCanvasAbstract *canvas() const { return m_canvas; }
00188
00190 KGameCanvasWidget *topLevelCanvas() const { return m_canvas ? m_canvas->topLevelCanvas() : NULL; }
00191
00194 void putInCanvas(KGameCanvasAbstract *canvas);
00195
00197 QPoint pos() const { return m_pos; }
00198
00200 QPoint absolutePosition() const;
00201
00205 void moveTo(const QPoint &newpos);
00206
00208 void moveTo(int x, int y) { moveTo( QPoint(x,y)); }
00209
00211 virtual void paint(QPainter* p) = 0;
00212
00214 virtual QRect rect() const = 0;
00215
00220 virtual bool layered() const;
00221
00225 virtual void advance(int msecs);
00226 };
00227
00228
00237 class KDEGAMES_EXPORT KGameCanvasDummy : public KGameCanvasItem
00238 {
00239 public:
00241 KGameCanvasDummy(KGameCanvasAbstract* canvas = NULL);
00242
00243 virtual ~KGameCanvasDummy();
00244
00246 virtual void paint(QPainter* p);
00247
00249 virtual QRect rect() const;
00250 };
00251
00252
00260 class KDEGAMES_EXPORT KGameCanvasGroup : public KGameCanvasItem, public KGameCanvasAbstract
00261 {
00262 private:
00263 mutable bool m_child_rect_changed;
00264 mutable QRect m_last_child_rect;
00265
00266 virtual void paintInternal(QPainter* p, const QRect& prect, const QRegion& preg,
00267 const QPoint& delta, double cumulative_opacity);
00268
00269 virtual void ensureAnimating();
00270 virtual void ensurePendingUpdate();
00271 virtual void invalidate(const QRect& r, bool translate = true);
00272 virtual void invalidate(const QRegion& r, bool translate = true);
00273 virtual void updateChanges();
00274 virtual void changed();
00275
00276 public:
00278 KGameCanvasGroup(KGameCanvasAbstract* canvas = NULL);
00279
00280 virtual ~KGameCanvasGroup();
00281
00283 virtual void paint(QPainter* p);
00284
00286 virtual QRect rect() const;
00287
00289 virtual void advance(int msecs);
00290
00292 KGameCanvasWidget* topLevelCanvas();
00293
00294 virtual QPoint canvasPosition() const;
00295 };
00296
00303 class KDEGAMES_EXPORT KGameCanvasPicture : public KGameCanvasItem
00304 {
00305 private:
00306 QPicture m_picture;
00307
00308 public:
00310 KGameCanvasPicture(const QPicture& picture, KGameCanvasAbstract* canvas = NULL);
00311
00313 KGameCanvasPicture(KGameCanvasAbstract* canvas = NULL);
00314
00315 virtual ~KGameCanvasPicture();
00316
00318 QPicture picture() const { return m_picture; }
00319
00321 void setPicture(const QPicture& picture);
00322
00323 virtual void paint(QPainter* p);
00324 virtual QRect rect() const;
00325 };
00326
00333 class KDEGAMES_EXPORT KGameCanvasPixmap : public KGameCanvasItem
00334 {
00335 private:
00336 QPixmap m_pixmap;
00337
00338 public:
00340 KGameCanvasPixmap(const QPixmap& pixmap, KGameCanvasAbstract* canvas = NULL);
00341
00343 KGameCanvasPixmap(KGameCanvasAbstract* canvas = NULL);
00344
00345 virtual ~KGameCanvasPixmap();
00346
00348 QPixmap pixmap() const { return m_pixmap; }
00349
00351 void setPixmap(const QPixmap& pixmap);
00352
00353 virtual void paint(QPainter* p);
00354 virtual QRect rect() const;
00355 virtual bool layered() const { return false; }
00356 };
00357
00364 class KDEGAMES_EXPORT KGameCanvasTiledPixmap : public KGameCanvasItem
00365 {
00366 private:
00367 QPixmap m_pixmap;
00368 QSize m_size;
00369 QPoint m_origin;
00370 bool m_move_orig;
00371
00372 public:
00374 KGameCanvasTiledPixmap(const QPixmap& pixmap, const QSize &size, const QPoint &origin,
00375 bool move_orig, KGameCanvasAbstract* canvas = NULL);
00376
00378 KGameCanvasTiledPixmap(KGameCanvasAbstract* canvas = NULL);
00379
00380 virtual ~KGameCanvasTiledPixmap();
00381
00383 QPixmap pixmap() const { return m_pixmap; }
00384
00386 void setPixmap(const QPixmap& pixmap);
00387
00389 void setSize(const QSize &size);
00390
00392 QPoint origin() const { return m_move_orig ? m_origin + pos() : m_origin; }
00393
00395 void setOrigin(const QPoint &size);
00396
00398 bool moveOrigin(){ return m_move_orig; }
00399
00401 void setMoveOrigin(bool move_orig);
00402
00403 virtual void paint(QPainter* p);
00404 virtual QRect rect() const;
00405 virtual bool layered() const { return false; }
00406 };
00407
00408
00415 class KDEGAMES_EXPORT KGameCanvasRectangle : public KGameCanvasItem
00416 {
00417 private:
00418 QColor m_color;
00419 QSize m_size;
00420
00421 public:
00423 KGameCanvasRectangle(const QColor& color, const QSize &size, KGameCanvasAbstract* canvas = NULL);
00424
00426 KGameCanvasRectangle(KGameCanvasAbstract* canvas = NULL);
00427
00428 virtual ~KGameCanvasRectangle();
00429
00431 QColor color() const { return m_color; }
00432
00434 void setColor(const QColor& color);
00435
00437 void setSize(const QSize &size);
00438
00439 virtual void paint(QPainter* p);
00440 virtual QRect rect() const;
00441 virtual bool layered() const { return false; }
00442 };
00443
00450 class KDEGAMES_EXPORT KGameCanvasText : public KGameCanvasItem
00451 {
00452 public:
00456 enum HPos {
00457 HStart,
00458 HLeft,
00459 HRight,
00460 HCenter
00461 };
00462
00466 enum VPos {
00467 VBaseline,
00468 VTop,
00469 VBottom,
00470 VCenter
00471 };
00472
00473 private:
00474 QString m_text;
00475 QColor m_color;
00476 QFont m_font;
00477 HPos m_hpos;
00478 VPos m_vpos;
00479 QRect m_bounding_rect;
00480
00481 QPoint offsetToDrawPos() const;
00482 void calcBoundingRect();
00483
00484 public:
00486 KGameCanvasText(const QString& text, const QColor& color,
00487 const QFont& font, HPos hp, VPos vp,
00488 KGameCanvasAbstract* canvas = NULL);
00489
00491 KGameCanvasText(KGameCanvasAbstract* canvas = NULL);
00492
00493 virtual ~KGameCanvasText();
00494
00496 QString text() const { return m_text; }
00497
00499 void setText(const QString& text);
00500
00502 QColor color() const { return m_color; }
00503
00505 void setColor(const QColor& color);
00506
00508 QFont font() const { return m_font; }
00509
00511 void setFont(const QFont& font);
00512
00514 HPos hPositioning() const { return m_hpos; }
00515
00517 VPos vPositioning() const { return m_vpos; }
00518
00520 void setPositioning(HPos hp, VPos vp);
00521
00522 virtual void paint(QPainter* p);
00523 virtual QRect rect() const;
00524 virtual bool layered() const { return false; }
00525 };
00526
00534 class KDEGAMES_EXPORT KGameCanvasWidget : public QWidget, public KGameCanvasAbstract
00535 {
00536 Q_OBJECT
00537 private:
00538 friend class KGameCanvasItem;
00539 friend class AnimationNotifier;
00540
00541 class KGameCanvasWidgetPrivate *priv;
00542
00543 virtual void ensureAnimating();
00544 virtual void ensurePendingUpdate();
00545 virtual void invalidate(const QRect& r, bool translate = true);
00546 virtual void invalidate(const QRegion& r, bool translate = true);
00547
00548 virtual void paintEvent(QPaintEvent *event);
00549
00550 private Q_SLOTS:
00551 void processAnimations();
00552 void updateChanges();
00553
00554 public:
00556 KGameCanvasWidget(QWidget* parent = NULL);
00557
00558 virtual ~KGameCanvasWidget();
00559
00561 void setAnimationDelay(int d);
00562
00565 int mSecs();
00566
00568 KGameCanvasWidget* topLevelCanvas();
00569
00571 virtual QPoint canvasPosition() const;
00572 };
00573
00595 class KDEGAMES_EXPORT KGameCanvasAdapter : public KGameCanvasAbstract
00596 {
00597 QRect m_child_rect;
00598 bool m_child_rect_valid;
00599 QRect m_invalidated_rect;
00600
00601 virtual void ensureAnimating() { }
00602 virtual void ensurePendingUpdate();
00603 virtual void invalidate(const QRect& r, bool translate = true);
00604 virtual void invalidate(const QRegion& r, bool translate = true);
00605
00606 QRect childRect();
00607 public:
00609 KGameCanvasAdapter();
00610
00615 virtual class KGameCanvasWidget* topLevelCanvas() { return 0; }
00616
00626 virtual QPoint canvasPosition() const { return QPoint(0, 0); }
00627
00632 virtual void render(QPainter* p);
00633
00640 virtual void updateParent(const QRect& rect) = 0;
00641 };
00642
00643 #endif //__KGRGAMECANVAS_H__