kgamecanvas.h

Go to the documentation of this file.
00001 /*  Originally created for KBoard
00002     Copyright 2006 Maurizio Monge <maurizio.monge@gmail.com>
00003 
00004 BSD License
00005 Redistribution and use in source and binary forms, with or without
00006 modification, are permitted provided that the following conditions
00007 are met:
00008 
00009 1. Redistributions of source code must retain the above copyright
00010    notice, this list of conditions and the following disclaimer.
00011 2. Redistributions in binary form must reproduce the above copyright
00012    notice, this list of conditions and the following disclaimer in the
00013    documentation and/or other materials provided with the distribution.
00014 
00015 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00016 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00017 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00018 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00019 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00020 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00021 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00022 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00023 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00024 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025  */
00026 
00027 #ifndef __KGAMECANVAS_H__
00028 #define __KGAMECANVAS_H__
00029 
00030 /*
00031  *  Author: Maurizio Monge <maurizio.monge@gmail.com>
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     /* function to update pending changes, called from parent */
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 
00593 class KDEGAMES_EXPORT KGameCanvasAdapter : public KGameCanvasAbstract
00594 {
00595     QRect m_child_rect;
00596     bool m_child_rect_valid;
00597     QRect m_invalidated_rect;
00598 
00599     virtual void ensureAnimating() { }
00600     virtual void ensurePendingUpdate();
00601     virtual void invalidate(const QRect& r, bool translate = true);
00602     virtual void invalidate(const QRegion& r, bool translate = true);
00603 
00604     QRect childRect();
00605 public:
00607     KGameCanvasAdapter();
00608 
00613     virtual class KGameCanvasWidget* topLevelCanvas() { return 0; }
00614 
00624     virtual QPoint canvasPosition() const { return QPoint(0, 0); }
00625 
00630     virtual void render(QPainter* p);
00631 
00638     virtual void updateParent(const QRect& rect) = 0;
00639 };
00640 
00641 #endif //__KGRGAMECANVAS_H__

Generated on Sun Mar 16 08:02:53 2008 for Libkdegames by  doxygen 1.5.3