Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
.
[graphlib.git] / DrawingWindow.h
index 7291e96..73fdc26 100644 (file)
 #include <QImage>
 #include <QMutex>
 #include <QPainter>
+#include <QPen>
 #include <QRect>
+#include <QWaitCondition>
 #include <QWidget>
 #include <Qt>
 
-class DrawingWindow: public QWidget {
-/*     Q_OBJECT */
+class DrawingThread;
 
+/*!
+ * Fenêtre de dessin.
+ *  
+ */
+class DrawingWindow: public QWidget {
 public:
-    typedef int (*ThreadFunction)(DrawingWindow &);
+    //! Type de la fonction de dessin, passée en paramètre de construction.
+    typedef void (*ThreadFunction)(DrawingWindow &);
 
+    //! Largeur par défaut de la fenêtre.
     static const int DEFAULT_WIDTH = 640;
+    //! Hauteur par défaut de la fenêtre.
     static const int DEFAULT_HEIGHT = 480;
 
     DrawingWindow(ThreadFunction fun,
-                  int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT);
+                  int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
     DrawingWindow(QWidget *parent,
                   ThreadFunction fun,
-                  int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT);
+                  int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
     DrawingWindow(QWidget *parent, Qt::WindowFlags flags,
                   ThreadFunction fun,
-                  int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT);
+                  int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
 
     ~DrawingWindow();
 
-    int width() const;
-    int height() const;
+    //! Largeur de la fenêtre.
+    const int width;
+    //! Hauteur de la fenêtre.
+    const int height;
 
+    void setColor(unsigned int color);
+    void setColor(const char *name);
     void setColor(float red, float green, float blue);
-    void setColor(const QColor &color);
+
+    void setBgColor(unsigned int color);
+    void setBgColor(const char *name);
+    void setBgColor(float red, float green, float blue);
+
+    void clearGraph();
 
     void drawPoint(int x, int y);
     void drawLine(int x1, int y1, int x2, int y2);
+    void drawRect(int x1, int y1, int x2, int y2);
+    void fillRect(int x1, int y1, int x2, int y2);
+    void drawCircle(int x, int y, int r);
+    void fillCircle(int x, int y, int r);
+
+    void drawText(int x, int y, const char *text, int flags = 0);
+    void drawTextBg(int x, int y, const char *text, int flags = 0);
+
+    unsigned int getPointColor(int x, int y);
+
+    bool sync(unsigned long time = ULONG_MAX);
+
+    void closeGraph();
+
+    void sleep(unsigned long secs);
+    void msleep(unsigned long msecs);
+    void usleep(unsigned long usecs);
 
 protected:
+    void closeEvent(QCloseEvent *ev);
+    void customEvent(QEvent *ev);
+    void keyPressEvent(QKeyEvent *ev);
     void paintEvent(QPaintEvent *ev);
     void showEvent(QShowEvent *ev);
     void timerEvent(QTimerEvent *ev);
 
 private:
-    class DrawingThread;
-
+    //! Intervalle de temps entre deux rendus (ms)
     static const int paintInterval = 33;
 
     QBasicTimer timer;
+    QMutex imageMutex;
+    QMutex syncMutex;
+    QWaitCondition syncCondition;
+    bool terminateThread;
+    int lockCount;
 
     QImage *image;
     QPainter *painter;
 
-    DrawingThread *thread;
-    bool thread_started;
-
     bool dirtyFlag;
     QRect dirtyRect;
 
-    QMutex mutex;
+    DrawingThread *thread;
+
+    void initialize(ThreadFunction fun);
 
-    void initialize(ThreadFunction fun, int width, int height);
+    void setColor(const QColor& color);
+    void setBgColor(const QColor& color);
+    QColor getColor();
+    QColor getBgColor();
 
-    void lock();
-    void unlock();
+    void safeLock(QMutex &mutex);
+    void safeUnlock(QMutex &mutex);
 
-    void setDirtyRect();
-    void setDirtyRect(int x, int y);
-    void setDirtyRect(int x1, int y1, int x2, int y2);
-    void setDirtyRect(const QRect &rect);
-};
+    void dirty();
+    void dirty(int x, int y);
+    void dirty(int x1, int y1, int x2, int y2);
+    void dirty(const QRect &rect);
 
-inline
-int DrawingWindow::width() const
-{
-    return image->width();
-}
-
-inline
-int DrawingWindow::height() const
-{
-    return image->height();
-}
-
-inline
-void DrawingWindow::lock()
-{
-    mutex.lock();
-}
-
-inline
-void DrawingWindow::unlock()
-{
-    mutex.unlock();
-}
-
-inline
-void DrawingWindow::setDirtyRect()
-{
-    dirtyFlag = true;
-    dirtyRect.setRect(0, 0, width(), height());
-}
-
-inline
-void DrawingWindow::setDirtyRect(int x, int y)
-{
-    setDirtyRect(QRect(x, y, 1, 1));
-}
-
-inline
-void DrawingWindow::setDirtyRect(int x1, int y1, int x2, int y2)
-{
-    QRect r;
-    r.setCoords(x1, y1, x2, y2);
-    setDirtyRect(r.normalized());
-}
+    void mayUpdate();
+    void realSync();
+    void realDrawText(int x, int y, const char *text, int flags);
+};
 
 #endif // !DRAWING_WINDOW_H
+
+// Local variables:
+// mode: c++
+// End: