X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/graphlib.git/blobdiff_plain/5c05d2a8c6ae75e14df6ec9a7503a7ec6ee01cbf..0c7533943fe784cb13a7213905ffd59784da0dea:/DrawingWindow.h diff --git a/DrawingWindow.h b/DrawingWindow.h index c89c845..17e9d0d 100644 --- a/DrawingWindow.h +++ b/DrawingWindow.h @@ -1,23 +1,113 @@ #ifndef DRAWING_WINDOW_H #define DRAWING_WINDOW_H -#include "DrawingArea.h" +#include +#include +#include +#include +#include +#include +#include +#include #include +#include + +class DrawingThread; class DrawingWindow: public QWidget { public: - DrawingWindow(const DrawingArea &a); - DrawingWindow(QWidget *parent, const DrawingArea &a); + typedef void (*ThreadFunction)(DrawingWindow &); + + static const int DEFAULT_WIDTH = 640; + static const int DEFAULT_HEIGHT = 480; + + DrawingWindow(ThreadFunction fun, + int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT); + DrawingWindow(QWidget *parent, + ThreadFunction fun, + int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT); DrawingWindow(QWidget *parent, Qt::WindowFlags flags, - const DrawingArea &a); + ThreadFunction fun, + 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(unsigned int color); + void setColor(const char *name); + 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(); + + 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 paintEvent(QPaintEvent *e); + 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: - const DrawingArea &drawingArea; + static const int paintInterval = 33; + + QBasicTimer timer; + QMutex imageMutex; + QMutex syncMutex; + QWaitCondition syncCondition; + bool terminateThread; + int lockCount; + + QImage *image; + QPainter *painter; + + bool dirtyFlag; + QRect dirtyRect; + + DrawingThread *thread; + + void initialize(ThreadFunction f); + + 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 initialize(); + void mayUpdate(); }; #endif // !DRAWING_WINDOW_H