X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/graphlib.git/blobdiff_plain/2ecf02eeb3c25c56ad5de3a340fd7fd8ebdfa679..74665428c9dea8375c3888976e5eb0fa6cb8d7b4:/DrawingWindow.h diff --git a/DrawingWindow.h b/DrawingWindow.h index 4ad8b94..732183a 100644 --- a/DrawingWindow.h +++ b/DrawingWindow.h @@ -1,10 +1,18 @@ #ifndef DRAWING_WINDOW_H #define DRAWING_WINDOW_H +#include +#include +#include +#include +#include +#include +#include +#include #include #include -class DrawingWindowPrivate; +class DrawingThread; class DrawingWindow: public QWidget { public: @@ -14,24 +22,26 @@ public: 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(); const int width; const int height; - // http://www.w3.org/TR/SVG/types.html#ColorKeywords - void setColor(float red, float green, float blue); + void setColor(unsigned int color); void setColor(const char *name); - void setBgColor(float red, float green, float blue); + void setColor(float red, float green, float blue); + + void setBgColor(unsigned int color); void setBgColor(const char *name); + void setBgColor(float red, float green, float blue); void clearGraph(); @@ -42,8 +52,17 @@ public: 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 waitMousePress(int &x, int &y, int &button, + unsigned long time = ULONG_MAX); bool sync(unsigned long time = ULONG_MAX); + void closeGraph(); + void sleep(unsigned long secs); void msleep(unsigned long msecs); void usleep(unsigned long usecs); @@ -51,15 +70,58 @@ public: protected: void closeEvent(QCloseEvent *ev); void customEvent(QEvent *ev); + void mousePressEvent(QMouseEvent *ev); void keyPressEvent(QKeyEvent *ev); void paintEvent(QPaintEvent *ev); void showEvent(QShowEvent *ev); void timerEvent(QTimerEvent *ev); private: - DrawingWindowPrivate * const d; + //! Intervalle de temps entre deux rendus (ms) + static const int paintInterval = 33; + + QBasicTimer timer; + QMutex imageMutex; + QMutex mouseMutex; + QWaitCondition mouseCondition; + QMutex syncMutex; + QWaitCondition syncCondition; + bool terminateThread; + int lockCount; - friend class DrawingWindowPrivate; + QImage *image; + QPainter *painter; + + QPoint mousePos; + Qt::MouseButton mouseButton; + + bool dirtyFlag; + QRect dirtyRect; + + DrawingThread *thread; + + void initialize(ThreadFunction fun); + + void setColor(const QColor& color); + void setBgColor(const QColor& color); + QColor getColor(); + QColor getBgColor(); + + void safeLock(QMutex &mutex); + void safeUnlock(QMutex &mutex); + + void dirty(); + void dirty(int x, int y); + void dirty(int x1, int y1, int x2, int y2); + void dirty(const QRect &rect); + + void mayUpdate(); + void realSync(); + void realDrawText(int x, int y, const char *text, int flags); }; #endif // !DRAWING_WINDOW_H + +// Local variables: +// mode: c++ +// End: