Logo AND Algorithmique Numérique Distribuée

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