Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add README file.
[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     //! \cond show_protected
85     void closeEvent(QCloseEvent *ev);
86     void customEvent(QEvent *ev);
87     void mousePressEvent(QMouseEvent *ev);
88     void keyPressEvent(QKeyEvent *ev);
89     void paintEvent(QPaintEvent *ev);
90     void showEvent(QShowEvent *ev);
91     void timerEvent(QTimerEvent *ev);
92     //! \endcond
93
94 private:
95     //! Intervalle de temps entre deux rendus (ms)
96     static const int paintInterval = 33;
97
98     QBasicTimer timer;
99     QMutex imageMutex;
100     QMutex inputMutex;
101     QWaitCondition inputCondition;
102     QMutex syncMutex;
103     QWaitCondition syncCondition;
104     bool terminateThread;
105     int lockCount;
106
107     QImage *image;
108     QPainter *painter;
109
110     QPoint mousePos;
111     Qt::MouseButton mouseButton;
112
113     bool dirtyFlag;
114     QRect dirtyRect;
115
116     DrawingThread *thread;
117
118     void initialize(ThreadFunction fun);
119
120     void setColor(const QColor &color);
121     void setBgColor(const QColor &color);
122     QColor getColor();
123     QColor getBgColor();
124
125     void safeLock(QMutex &mutex);
126     void safeUnlock(QMutex &mutex);
127
128     void dirty();
129     void dirty(int x, int y);
130     void dirty(int x1, int y1, int x2, int y2);
131     void dirty(const QRect &rect);
132
133     void mayUpdate();
134     void realSync();
135     void realDrawText(int x, int y, const char *text, int flags);
136 };
137
138 #endif // !DRAWING_WINDOW_H
139
140 // Local variables:
141 // mode: c++
142 // End: