File indexing completed on 2024-12-08 08:10:35

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 KTL_CANVASITEMS_H_
0011 #define KTL_CANVASITEMS_H_
0012 
0013 #include "canvasitemlist.h"
0014 
0015 #include <QBrush>
0016 #include <QObject>
0017 #include <QPen>
0018 #include <QPolygon>
0019 #include <QRect>
0020 
0021 class QPainter;
0022 
0023 class KtlQCanvasPolygonalItem;
0024 class KtlQCanvasRectangle;
0025 class KtlQCanvasPolygon;
0026 class KtlQCanvasEllipse;
0027 class KtlQCanvasLine;
0028 class KtlQCanvasChunk;
0029 class KtlQCanvas;
0030 class KtlQCanvasItem;
0031 class KtlQCanvasView;
0032 
0033 class KtlQCanvasItemExtra;
0034 
0035 class KtlQCanvasItem : public QObject
0036 {
0037     Q_OBJECT
0038 public:
0039     KtlQCanvasItem(KtlQCanvas *canvas);
0040     ~KtlQCanvasItem() override;
0041 
0042     double x() const
0043     {
0044         return myx;
0045     }
0046     double y() const
0047     {
0048         return myy;
0049     }
0050     double z() const
0051     {
0052         return myz;
0053     } // (depth)
0054 
0055     virtual void moveBy(double const dx, double const dy);
0056     void move(double const x, double const y);
0057     void setX(double a)
0058     {
0059         move(a, y());
0060     }
0061     void setY(double a)
0062     {
0063         move(x(), a);
0064     }
0065     void setZ(double a);
0066 
0067     virtual bool collidesWith(const KtlQCanvasItem *) const = 0;
0068 
0069     KtlQCanvasItemList collisions(const bool exact /* NO DEFAULT */) const;
0070 
0071     virtual void setCanvas(KtlQCanvas *);
0072 
0073     virtual void draw(QPainter &) = 0;
0074 
0075     void show();
0076     void hide();
0077 
0078     virtual void setVisible(bool yes);
0079     bool isVisible() const
0080     {
0081         return vis;
0082     }
0083     virtual void setSelected(const bool yes);
0084     bool isSelected() const
0085     {
0086         return sel;
0087     }
0088 
0089     virtual QRect boundingRect() const = 0;
0090 
0091     KtlQCanvas *canvas() const
0092     {
0093         return cnv;
0094     }
0095 
0096     virtual bool collidesWith(const KtlQCanvasPolygonalItem *, const KtlQCanvasRectangle *, const KtlQCanvasEllipse *) const = 0;
0097 
0098     bool needRedraw() const
0099     {
0100         return m_bNeedRedraw;
0101     }
0102     void setNeedRedraw(const bool needRedraw)
0103     {
0104         m_bNeedRedraw = needRedraw;
0105     }
0106 
0107 protected:
0108     void update()
0109     {
0110         changeChunks();
0111     }
0112 
0113     virtual QPolygon chunks() const;
0114     virtual void addToChunks();
0115     virtual void removeFromChunks();
0116     virtual void changeChunks();
0117 
0118     bool val;
0119     double myx, myy, myz;
0120 
0121 private:
0122     KtlQCanvas *cnv;
0123     static KtlQCanvas *current_canvas;
0124     KtlQCanvasItemExtra *ext;
0125     KtlQCanvasItemExtra &extra();
0126     bool m_bNeedRedraw;
0127     bool vis;
0128     bool sel;
0129 };
0130 
0131 class KtlQPolygonalProcessor;
0132 
0133 class KtlQCanvasPolygonalItem : public KtlQCanvasItem
0134 {
0135 public:
0136     KtlQCanvasPolygonalItem(KtlQCanvas *canvas);
0137     ~KtlQCanvasPolygonalItem() override;
0138 
0139     bool collidesWith(const KtlQCanvasItem *) const override;
0140 
0141     virtual void setPen(const QPen &p);
0142     virtual void setBrush(const QBrush &b);
0143 
0144     QPen pen() const
0145     {
0146         return pn;
0147     }
0148     QBrush brush() const
0149     {
0150         return br;
0151     }
0152 
0153     virtual QPolygon areaPoints() const = 0;
0154     QRect boundingRect() const override;
0155 
0156 protected:
0157     void draw(QPainter &) override;
0158     virtual void drawShape(QPainter &) = 0;
0159 
0160     bool winding() const;
0161     void setWinding(bool);
0162 
0163     void invalidate();
0164     bool isValid() const
0165     {
0166         return val;
0167     }
0168 
0169 private:
0170     void scanPolygon(const QPolygon &pa, int winding, KtlQPolygonalProcessor &process) const;
0171 
0172     QPolygon chunks() const override;
0173 
0174     bool collidesWith(const KtlQCanvasPolygonalItem *, const KtlQCanvasRectangle *, const KtlQCanvasEllipse *) const override;
0175 
0176     QBrush br;
0177     QPen pn;
0178     bool wind;
0179 };
0180 
0181 class KtlQCanvasRectangle : public KtlQCanvasPolygonalItem
0182 {
0183 public:
0184     KtlQCanvasRectangle(KtlQCanvas *canvas);
0185     KtlQCanvasRectangle(const QRect &, KtlQCanvas *canvas);
0186     KtlQCanvasRectangle(int x, int y, int width, int height, KtlQCanvas *canvas);
0187 
0188     ~KtlQCanvasRectangle() override;
0189 
0190     int width() const;
0191     int height() const;
0192     void setSize(const int w, const int h);
0193     QSize size() const
0194     {
0195         return QSize(w, h);
0196     }
0197     QPolygon areaPoints() const override;
0198     QRect rect() const
0199     {
0200         return QRect(int(x()), int(y()), w, h);
0201     }
0202 
0203     bool collidesWith(const KtlQCanvasItem *) const override;
0204 
0205 protected:
0206     void drawShape(QPainter &) override;
0207     QPolygon chunks() const override;
0208 
0209 private:
0210     bool collidesWith(const KtlQCanvasPolygonalItem *, const KtlQCanvasRectangle *, const KtlQCanvasEllipse *) const override;
0211 
0212     int w, h;
0213 };
0214 
0215 class KtlQCanvasPolygon : public KtlQCanvasPolygonalItem
0216 {
0217 public:
0218     KtlQCanvasPolygon(KtlQCanvas *canvas);
0219     ~KtlQCanvasPolygon() override;
0220     void setPoints(QPolygon);
0221     QPolygon points() const;
0222     void moveBy(double dx, double dy) override;
0223 
0224     QPolygon areaPoints() const override;
0225 
0226 protected:
0227     void drawShape(QPainter &) override;
0228     // TODO FIXME guarts are added for debugging memory corruption (poly takes non-pointer values)
0229     int guardBef[10];
0230     QPolygon *poly;
0231     int guardAft[10];
0232 };
0233 
0234 class KtlQCanvasLine : public KtlQCanvasPolygonalItem
0235 {
0236 public:
0237     KtlQCanvasLine(KtlQCanvas *canvas);
0238     ~KtlQCanvasLine() override;
0239     void setPoints(int x1, int y1, int x2, int y2);
0240 
0241     QPoint startPoint() const
0242     {
0243         return QPoint(x1, y1);
0244     }
0245     QPoint endPoint() const
0246     {
0247         return QPoint(x2, y2);
0248     }
0249 
0250     void setPen(const QPen &p) override;
0251     void moveBy(double dx, double dy) override;
0252 
0253 protected:
0254     void drawShape(QPainter &) override;
0255     QPolygon areaPoints() const override;
0256 
0257 private:
0258     int x1, y1, x2, y2;
0259 };
0260 
0261 class KtlQCanvasEllipse : public KtlQCanvasPolygonalItem
0262 {
0263 public:
0264     KtlQCanvasEllipse(KtlQCanvas *canvas);
0265     KtlQCanvasEllipse(int width, int height, KtlQCanvas *canvas);
0266     KtlQCanvasEllipse(int width, int height, int startangle, int angle, KtlQCanvas *canvas);
0267 
0268     ~KtlQCanvasEllipse() override;
0269 
0270     int width() const;
0271     int height() const;
0272     void setSize(int w, int h);
0273     void setAngles(int start, int length);
0274     int angleStart() const
0275     {
0276         return a1;
0277     }
0278     int angleLength() const
0279     {
0280         return a2;
0281     }
0282     QPolygon areaPoints() const override;
0283 
0284     bool collidesWith(const KtlQCanvasItem *) const override;
0285 
0286 protected:
0287     void drawShape(QPainter &) override;
0288 
0289 private:
0290     bool collidesWith(const KtlQCanvasPolygonalItem *, const KtlQCanvasRectangle *, const KtlQCanvasEllipse *) const override;
0291     int w, h;
0292     int a1, a2;
0293 };
0294 
0295 #endif // KTL_CANVASITEMS_H_