Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove multi-pass.
[graphlib.git] / DrawingWindow.h
1 #ifndef DRAWING_WINDOW_H
2 #define DRAWING_WINDOW_H
3
4 #include <QBasicTimer>
5 #include <QColor>
6 #include <QFont>
7 #include <QImage>
8 #include <QMutex>
9 #include <QPainter>
10 #include <QPen>
11 #include <QRect>
12 #include <QWaitCondition>
13 #include <QWidget>
14 #include <Qt>
15 #include <string>
16
17 class DrawingThread;
18
19 class DrawingWindow: public QWidget {
20 public:
21     typedef void (*ThreadFunction)(DrawingWindow &);
22
23     static const int DEFAULT_WIDTH = 640;
24     static const int DEFAULT_HEIGHT = 480;
25
26     DrawingWindow(ThreadFunction fun,
27                   int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
28     DrawingWindow(QWidget *parent,
29                   ThreadFunction fun,
30                   int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
31     DrawingWindow(QWidget *parent, Qt::WindowFlags flags,
32                   ThreadFunction fun,
33                   int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
34
35     ~DrawingWindow();
36
37     const int width;
38     const int height;
39
40     void setColor(unsigned int color);
41     void setColor(const char *name);
42     void setColor(float red, float green, float blue);
43
44     void setBgColor(unsigned int color);
45     void setBgColor(const char *name);
46     void setBgColor(float red, float green, float blue);
47
48     void setPenWidth(int width);
49
50     const QFont &getFont() const;
51     void setFont(const QFont &font);
52
53     void setAntialiasing(bool state);
54
55     void clearGraph();
56
57     void drawPoint(int x, int y);
58     void drawLine(int x1, int y1, int x2, int y2);
59     void drawRect(int x1, int y1, int x2, int y2);
60     void fillRect(int x1, int y1, int x2, int y2);
61     void drawCircle(int x, int y, int r);
62     void fillCircle(int x, int y, int r);
63     void drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3);
64     void fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3);
65
66     void drawText(int x, int y, const char *text, int flags = 0);
67     void drawText(int x, int y, const std::string &text, int flags = 0);
68     void drawTextBg(int x, int y, const char *text, int flags = 0);
69     void drawTextBg(int x, int y, const std::string &text, int flags = 0);
70
71     unsigned int getPointColor(int x, int y) const;
72
73     bool waitMousePress(int &x, int &y, int &button,
74                         unsigned long time = ULONG_MAX);
75     bool sync(unsigned long time = ULONG_MAX);
76
77     void closeGraph();
78
79     static void sleep(unsigned long secs);
80     static void msleep(unsigned long msecs);
81     static void usleep(unsigned long usecs);
82
83 protected:
84     void closeEvent(QCloseEvent *ev);
85     void customEvent(QEvent *ev);
86     void mousePressEvent(QMouseEvent *ev);
87     void keyPressEvent(QKeyEvent *ev);
88     void paintEvent(QPaintEvent *ev);
89     void showEvent(QShowEvent *ev);
90     void timerEvent(QTimerEvent *ev);
91
92 private:
93     //! Intervalle de temps entre deux rendus (ms)
94     static const int paintInterval = 33;
95
96     QBasicTimer timer;
97     QMutex imageMutex;
98     QMutex mouseMutex;
99     QWaitCondition mouseCondition;
100     QMutex syncMutex;
101     QWaitCondition syncCondition;
102     bool terminateThread;
103     int lockCount;
104
105     QImage *image;
106     QPainter *painter;
107
108     QPoint mousePos;
109     Qt::MouseButton mouseButton;
110
111     bool dirtyFlag;
112     QRect dirtyRect;
113
114     DrawingThread *thread;
115
116     void initialize(ThreadFunction fun);
117
118     void setColor(const QColor &color);
119     void setBgColor(const QColor &color);
120     QColor getColor();
121     QColor getBgColor();
122
123     void safeLock(QMutex &mutex);
124     void safeUnlock(QMutex &mutex);
125
126     void dirty();
127     void dirty(int x, int y);
128     void dirty(int x1, int y1, int x2, int y2);
129     void dirty(const QRect &rect);
130
131     void mayUpdate();
132     void realSync();
133     void realDrawText(int x, int y, const char *text, int flags);
134 };
135
136 #endif // !DRAWING_WINDOW_H
137
138 // Local variables:
139 // mode: c++
140 // End: