-rw-r--r-- | noncore/graphics/drawpad/drawpad.cpp | 39 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpad.h | 3 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpad.pro | 8 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpadcanvas.cpp | 138 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpadcanvas.h | 18 | ||||
-rw-r--r-- | noncore/graphics/drawpad/ellipsedrawmode.cpp | 63 | ||||
-rw-r--r-- | noncore/graphics/drawpad/ellipsedrawmode.h | 16 | ||||
-rw-r--r-- | noncore/graphics/drawpad/erasedrawmode.cpp | 8 | ||||
-rw-r--r-- | noncore/graphics/drawpad/filldrawmode.cpp | 2 | ||||
-rw-r--r-- | noncore/graphics/drawpad/linedrawmode.cpp | 60 | ||||
-rw-r--r-- | noncore/graphics/drawpad/linedrawmode.h | 16 | ||||
-rw-r--r-- | noncore/graphics/drawpad/newpagedialog.cpp | 61 | ||||
-rw-r--r-- | noncore/graphics/drawpad/newpagedialog.h | 40 | ||||
-rw-r--r-- | noncore/graphics/drawpad/pointdrawmode.cpp | 8 | ||||
-rw-r--r-- | noncore/graphics/drawpad/rectangledrawmode.cpp | 60 | ||||
-rw-r--r-- | noncore/graphics/drawpad/rectangledrawmode.h | 16 | ||||
-rw-r--r-- | noncore/graphics/drawpad/shapedrawmode.cpp | 92 | ||||
-rw-r--r-- | noncore/graphics/drawpad/shapedrawmode.h | 41 |
18 files changed, 415 insertions, 274 deletions
diff --git a/noncore/graphics/drawpad/drawpad.cpp b/noncore/graphics/drawpad/drawpad.cpp index f67bef8..e94187f 100644 --- a/noncore/graphics/drawpad/drawpad.cpp +++ b/noncore/graphics/drawpad/drawpad.cpp @@ -36,22 +36,15 @@ #include <qtooltip.h> -DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) - : QMainWindow(parent, name, f) +DrawPad::DrawPad(QWidget* parent, const char* name) + : QMainWindow(parent, name) { - setCaption(tr("DrawPad")); - // init members m_pDrawPadCanvas = new DrawPadCanvas(this, this); + connect(m_pDrawPadCanvas, SIGNAL(pagesChanged()), this, SLOT(updateNavigationToolButtons())); + connect(m_pDrawPadCanvas, SIGNAL(pagesChanged()), this, SLOT(updateCaption())); connect(m_pDrawPadCanvas, SIGNAL(pageBackupsChanged()), this, SLOT(updateUndoRedoToolButtons())); - QFile file(Global::applicationFileName("drawpad", "drawpad.xml")); - - if (file.open(IO_ReadOnly)) { - m_pDrawPadCanvas->load(&file); - file.close(); - } - setCentralWidget(m_pDrawPadCanvas); @@ -107,6 +100,4 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pRedoAction->addTo(navigationToolBar); - updateUndoRedoToolButtons(); - m_pFirstPageAction = new QAction(tr("First Page"), Resource::loadIconSet("fastback"), QString::null, 0, this); connect(m_pFirstPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(goFirstPage())); @@ -125,6 +116,4 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pLastPageAction->addTo(navigationToolBar); - updateNavigationToolButtons(); - // init draw mode toolbar @@ -218,4 +207,15 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) brushColorPopupMenu->activateItemAt(1); + + // init pages + + QFile file(Global::applicationFileName("drawpad", "drawpad.xml")); + + if (file.open(IO_ReadOnly)) { + m_pDrawPadCanvas->load(&file); + file.close(); + } else { + m_pDrawPadCanvas->initialPage(); + } } @@ -380,2 +380,11 @@ void DrawPad::updateNavigationToolButtons() m_pLastPageAction->setEnabled(m_pDrawPadCanvas->goNextPageEnabled()); } + +void DrawPad::updateCaption() +{ + uint pagePosition = m_pDrawPadCanvas->pagePosition(); + uint pageCount = m_pDrawPadCanvas->pageCount(); + + setCaption(tr("DrawPad") + " - " + tr("Page") + " " + + QString::number(pagePosition) + "/" + QString::number(pageCount)); +} diff --git a/noncore/graphics/drawpad/drawpad.h b/noncore/graphics/drawpad/drawpad.h index 35b3be4..c49a559 100644 --- a/noncore/graphics/drawpad/drawpad.h +++ b/noncore/graphics/drawpad/drawpad.h @@ -32,5 +32,5 @@ class DrawPad : public QMainWindow public: - DrawPad(QWidget* parent = 0, const char* name = 0, WFlags f = WType_TopLevel); + DrawPad(QWidget* parent = 0, const char* name = 0); ~DrawPad(); @@ -55,4 +55,5 @@ private slots: void updateUndoRedoToolButtons(); void updateNavigationToolButtons(); + void updateCaption(); private: diff --git a/noncore/graphics/drawpad/drawpad.pro b/noncore/graphics/drawpad/drawpad.pro index 407a039..b0eb009 100644 --- a/noncore/graphics/drawpad/drawpad.pro +++ b/noncore/graphics/drawpad/drawpad.pro @@ -10,6 +10,8 @@ HEADERS = colordialog.h \ filldrawmode.h \ linedrawmode.h \ + newpagedialog.h \ pointdrawmode.h \ - rectangledrawmode.h + rectangledrawmode.h \ + shapedrawmode.h SOURCES = colordialog.cpp \ colorpanel.cpp \ @@ -22,6 +24,8 @@ SOURCES = colordialog.cpp \ linedrawmode.cpp \ main.cpp \ + newpagedialog.cpp \ pointdrawmode.cpp \ - rectangledrawmode.cpp + rectangledrawmode.cpp \ + shapedrawmode.cpp INCLUDEPATH += $(OPIEDIR)/include \ $(QTDIR)/src/3rdparty/zlib diff --git a/noncore/graphics/drawpad/drawpadcanvas.cpp b/noncore/graphics/drawpad/drawpadcanvas.cpp index 08f7b66..49a8cf0 100644 --- a/noncore/graphics/drawpad/drawpadcanvas.cpp +++ b/noncore/graphics/drawpad/drawpadcanvas.cpp @@ -16,4 +16,5 @@ #include "drawmode.h" #include "drawpad.h" +#include "newpagedialog.h" #include <qbuffer.h> @@ -138,15 +139,10 @@ bool DrawPadCanvasXmlHandler::characters(const QString& ch) } -DrawPadCanvas::DrawPadCanvas(DrawPad* drawPad, QWidget* parent, const char* name, WFlags f) - : QWidget(parent, name, f) +DrawPadCanvas::DrawPadCanvas(DrawPad* drawPad, QWidget* parent, const char* name) + : QScrollView(parent, name) { - setBackgroundMode(QWidget::PaletteBase); - m_pDrawPad = drawPad; m_pages.setAutoDelete(true); - m_pages.append(new QPixmap(width(), height())); - m_pages.current()->fill(Qt::white); m_pageBackups.setAutoDelete(true); - m_pageBackups.append(new QPixmap(*(m_pages.current()))); } @@ -170,5 +166,5 @@ void DrawPadCanvas::load(QIODevice* ioDevice) if (m_pages.isEmpty()) { - m_pages.append(new QPixmap(width(), height())); + m_pages.append(new QPixmap(contentsRect().size())); m_pages.current()->fill(Qt::white); } @@ -177,5 +173,24 @@ void DrawPadCanvas::load(QIODevice* ioDevice) m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); + + emit pagesChanged(); + emit pageBackupsChanged(); +} + +void DrawPadCanvas::initialPage() +{ + m_pages.append(new QPixmap(234, 252)); + m_pages.current()->fill(Qt::white); + + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); + + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); + + emit pagesChanged(); + emit pageBackupsChanged(); } @@ -230,9 +245,19 @@ QPixmap* DrawPadCanvas::currentPage() } +uint DrawPadCanvas::pagePosition() +{ + return (m_pages.at() + 1); +} + +uint DrawPadCanvas::pageCount() +{ + return m_pages.count(); +} + void DrawPadCanvas::clearAll() { m_pages.clear(); - m_pages.append(new QPixmap(width(), height())); + m_pages.append(new QPixmap(contentsRect().size())); m_pages.current()->fill(Qt::white); @@ -240,5 +265,6 @@ void DrawPadCanvas::clearAll() m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); emit pagesChanged(); @@ -248,12 +274,23 @@ void DrawPadCanvas::clearAll() void DrawPadCanvas::newPage() { - m_pages.insert(m_pages.at() + 1, new QPixmap(width(), height())); - m_pages.current()->fill(Qt::white); - m_pageBackups.clear(); - m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + QRect rect = contentsRect(); - emit pagesChanged(); - emit pageBackupsChanged(); + NewPageDialog newPageDialog(this); + newPageDialog.setWidth(rect.width()); + newPageDialog.setHeight(rect.height()); + + if (newPageDialog.exec() == QDialog::Accepted) { + m_pages.insert(m_pages.at() + 1, new QPixmap(newPageDialog.width(), newPageDialog.height())); + m_pages.current()->fill(Qt::white); + + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); + + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); + + emit pagesChanged(); + emit pageBackupsChanged(); + } } @@ -261,5 +298,6 @@ void DrawPadCanvas::clearPage() { m_pages.current()->fill(Qt::white); - repaint(); + + viewport()->update(); } @@ -269,5 +307,5 @@ void DrawPadCanvas::deletePage() if (m_pages.isEmpty()) { - m_pages.append(new QPixmap(width(), height())); + m_pages.append(new QPixmap(contentsRect().size())); m_pages.current()->fill(Qt::white); } @@ -276,5 +314,6 @@ void DrawPadCanvas::deletePage() m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); emit pagesChanged(); @@ -305,5 +344,6 @@ void DrawPadCanvas::undo() { *(m_pages.current()) = *(m_pageBackups.prev()); - repaint(); + + viewport()->update(); emit pageBackupsChanged(); @@ -313,5 +353,6 @@ void DrawPadCanvas::redo() { *(m_pages.current()) = *(m_pageBackups.next()); - repaint(); + + viewport()->update(); emit pageBackupsChanged(); @@ -323,5 +364,7 @@ void DrawPadCanvas::goFirstPage() m_pageBackups.clear(); m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); emit pagesChanged(); @@ -334,5 +377,7 @@ void DrawPadCanvas::goPreviousPage() m_pageBackups.clear(); m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); emit pagesChanged(); @@ -345,5 +390,7 @@ void DrawPadCanvas::goNextPage() m_pageBackups.clear(); m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); emit pagesChanged(); @@ -356,5 +403,7 @@ void DrawPadCanvas::goLastPage() m_pageBackups.clear(); m_pageBackups.append(new QPixmap(*(m_pages.current()))); - repaint(); + + resizeContents(m_pages.current()->width(), m_pages.current()->height()); + viewport()->update(); emit pagesChanged(); @@ -362,10 +411,10 @@ void DrawPadCanvas::goLastPage() } -void DrawPadCanvas::mousePressEvent(QMouseEvent* e) +void DrawPadCanvas::contentsMousePressEvent(QMouseEvent* e) { m_pDrawPad->drawMode()->mousePressEvent(e); } -void DrawPadCanvas::mouseReleaseEvent(QMouseEvent* e) +void DrawPadCanvas::contentsMouseReleaseEvent(QMouseEvent* e) { m_pDrawPad->drawMode()->mouseReleaseEvent(e); @@ -385,36 +434,13 @@ void DrawPadCanvas::mouseReleaseEvent(QMouseEvent* e) } -void DrawPadCanvas::mouseMoveEvent(QMouseEvent* e) +void DrawPadCanvas::contentsMouseMoveEvent(QMouseEvent* e) { m_pDrawPad->drawMode()->mouseMoveEvent(e); } -void DrawPadCanvas::resizeEvent(QResizeEvent* e) +void DrawPadCanvas::drawContents(QPainter* p, int cx, int cy, int cw, int ch) { - QWidget::resizeEvent(e); - - QListIterator<QPixmap> bufferIterator(m_pages); + QRect clipRect(cx, cy, cw, ch); - for (bufferIterator.toFirst(); bufferIterator.current() != 0; ++bufferIterator) { - int w = width() > bufferIterator.current()->width() ? width() : bufferIterator.current()->width(); - int h = height() > bufferIterator.current()->height() ? height() : bufferIterator.current()->height(); - - QPixmap tmpPixmap(*(bufferIterator.current())); - bufferIterator.current()->resize(w, h); - bufferIterator.current()->fill(Qt::white); - - bitBlt(bufferIterator.current(), 0, 0, &tmpPixmap, 0, 0, tmpPixmap.width(), tmpPixmap.height()); - } -} - -void DrawPadCanvas::paintEvent(QPaintEvent* e) -{ - QWidget::paintEvent(e); - - QArray<QRect> rects = e->region().rects(); - - for (uint i = 0; i < rects.count(); i++) { - QRect r = rects[i]; - bitBlt(this, r.x(), r.y(), m_pages.current(), r.x(), r.y(), r.width(), r.height()); - } + p->drawPixmap(clipRect.topLeft(), *(m_pages.current()), clipRect); } diff --git a/noncore/graphics/drawpad/drawpadcanvas.h b/noncore/graphics/drawpad/drawpadcanvas.h index eddcb43..4836a3f 100644 --- a/noncore/graphics/drawpad/drawpadcanvas.h +++ b/noncore/graphics/drawpad/drawpadcanvas.h @@ -15,5 +15,5 @@ #define DRAWPADCANVAS_H -#include <qwidget.h> +#include <qscrollview.h> #include <qlist.h> @@ -24,13 +24,14 @@ class DrawPad; class QPixmap; -class DrawPadCanvas : public QWidget +class DrawPadCanvas : public QScrollView { Q_OBJECT public: - DrawPadCanvas(DrawPad* drawPad, QWidget* parent = 0, const char* name = 0, WFlags f = 0); + DrawPadCanvas(DrawPad* drawPad, QWidget* parent = 0, const char* name = 0); ~DrawPadCanvas(); void load(QIODevice* ioDevice); + void initialPage(); void save(QIODevice* ioDevice); @@ -41,4 +42,6 @@ public: QPixmap* currentPage(); + uint pagePosition(); + uint pageCount(); public slots: @@ -61,9 +64,8 @@ signals: protected: - void mousePressEvent(QMouseEvent* e); - void mouseReleaseEvent(QMouseEvent* e); - void mouseMoveEvent(QMouseEvent* e); - void resizeEvent(QResizeEvent* e); - void paintEvent(QPaintEvent* e); + void contentsMousePressEvent(QMouseEvent* e); + void contentsMouseReleaseEvent(QMouseEvent* e); + void contentsMouseMoveEvent(QMouseEvent* e); + void drawContents(QPainter* p, int cx, int cy, int cw, int ch); private: diff --git a/noncore/graphics/drawpad/ellipsedrawmode.cpp b/noncore/graphics/drawpad/ellipsedrawmode.cpp index 12a1113..f9cfa73 100644 --- a/noncore/graphics/drawpad/ellipsedrawmode.cpp +++ b/noncore/graphics/drawpad/ellipsedrawmode.cpp @@ -21,8 +21,6 @@ EllipseDrawMode::EllipseDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas) - : DrawMode(drawPad, drawPadCanvas) + : ShapeDrawMode(drawPad, drawPadCanvas) { - m_mousePressed = false; - m_polyline.resize(3); } @@ -31,56 +29,17 @@ EllipseDrawMode::~EllipseDrawMode() } -void EllipseDrawMode::mousePressEvent(QMouseEvent* e) +void EllipseDrawMode::drawFinalShape(QPainter& p) { - m_mousePressed = true; - m_polyline[2] = m_polyline[1] = m_polyline[0] = e->pos(); + p.setRasterOp(Qt::NotROP); + p.drawRect(QRect(m_polyline[2], m_polyline[0])); + p.setPen(m_pDrawPad->pen()); + p.setRasterOp(Qt::CopyROP); + p.drawEllipse(QRect(m_polyline[2], m_polyline[0])); } -void EllipseDrawMode::mouseReleaseEvent(QMouseEvent* e) +void EllipseDrawMode::drawTemporaryShape(QPainter& p) { - Q_UNUSED(e) - - QPainter painter; - painter.begin(m_pDrawPadCanvas->currentPage()); - painter.setRasterOp(Qt::NotROP); - painter.drawRect(QRect(m_polyline[2], m_polyline[0])); - painter.setPen(m_pDrawPad->pen()); - painter.setRasterOp(Qt::CopyROP); - painter.drawEllipse(QRect(m_polyline[2], m_polyline[0])); - painter.end(); - - QRect r = m_polyline.boundingRect(); - r = r.normalize(); - r.setLeft(r.left() - m_pDrawPad->pen().width()); - r.setTop(r.top() - m_pDrawPad->pen().width()); - r.setRight(r.right() + m_pDrawPad->pen().width()); - r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); - - m_mousePressed = false; -} - -void EllipseDrawMode::mouseMoveEvent(QMouseEvent* e) -{ - if (m_mousePressed) { - QPainter painter; - painter.begin(m_pDrawPadCanvas->currentPage()); - painter.setRasterOp(Qt::NotROP); - m_polyline[0] = e->pos(); - painter.drawRect(QRect(m_polyline[2], m_polyline[1])); - painter.drawRect(QRect(m_polyline[2], m_polyline[0])); - painter.end(); - - QRect r = m_polyline.boundingRect(); - r = r.normalize(); - r.setLeft(r.left() - m_pDrawPad->pen().width()); - r.setTop(r.top() - m_pDrawPad->pen().width()); - r.setRight(r.right() + m_pDrawPad->pen().width()); - r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); - - m_polyline[1] = m_polyline[0]; - } + p.setRasterOp(Qt::NotROP); + p.drawRect(QRect(m_polyline[2], m_polyline[1])); + p.drawRect(QRect(m_polyline[2], m_polyline[0])); } diff --git a/noncore/graphics/drawpad/ellipsedrawmode.h b/noncore/graphics/drawpad/ellipsedrawmode.h index 4787518..0246caa 100644 --- a/noncore/graphics/drawpad/ellipsedrawmode.h +++ b/noncore/graphics/drawpad/ellipsedrawmode.h @@ -15,9 +15,7 @@ #define ELLIPSEDRAWMODE_H -#include "drawmode.h" +#include "shapedrawmode.h" -#include <qpointarray.h> - -class EllipseDrawMode : public DrawMode +class EllipseDrawMode : public ShapeDrawMode { public: @@ -25,11 +23,7 @@ public: ~EllipseDrawMode(); - void mousePressEvent(QMouseEvent* e); - void mouseReleaseEvent(QMouseEvent* e); - void mouseMoveEvent(QMouseEvent* e); - -private: - bool m_mousePressed; - QPointArray m_polyline; +protected: + void drawFinalShape(QPainter& p); + void drawTemporaryShape(QPainter& p); }; diff --git a/noncore/graphics/drawpad/erasedrawmode.cpp b/noncore/graphics/drawpad/erasedrawmode.cpp index 990cecb..0e585cc 100644 --- a/noncore/graphics/drawpad/erasedrawmode.cpp +++ b/noncore/graphics/drawpad/erasedrawmode.cpp @@ -64,5 +64,11 @@ void EraseDrawMode::mouseMoveEvent(QMouseEvent* e) r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); + QRect viewportRect(m_pDrawPadCanvas->contentsToViewport(r.topLeft()), + m_pDrawPadCanvas->contentsToViewport(r.bottomRight())); + + bitBlt(m_pDrawPadCanvas->viewport(), viewportRect.x(), viewportRect.y(), + m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); + + m_pDrawPadCanvas->viewport()->update(viewportRect); } } diff --git a/noncore/graphics/drawpad/filldrawmode.cpp b/noncore/graphics/drawpad/filldrawmode.cpp index 8f68550..1f81cd5 100644 --- a/noncore/graphics/drawpad/filldrawmode.cpp +++ b/noncore/graphics/drawpad/filldrawmode.cpp @@ -46,5 +46,5 @@ void FillDrawMode::mousePressEvent(QMouseEvent* e) m_pDrawPadCanvas->currentPage()->convertFromImage(m_image); - m_pDrawPadCanvas->repaint(); + m_pDrawPadCanvas->viewport()->update(); } } diff --git a/noncore/graphics/drawpad/linedrawmode.cpp b/noncore/graphics/drawpad/linedrawmode.cpp index 15445fc..d432fad 100644 --- a/noncore/graphics/drawpad/linedrawmode.cpp +++ b/noncore/graphics/drawpad/linedrawmode.cpp @@ -17,12 +17,7 @@ #include "drawpadcanvas.h" -#include <qpainter.h> -#include <qpixmap.h> - LineDrawMode::LineDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas) - : DrawMode(drawPad, drawPadCanvas) + : ShapeDrawMode(drawPad, drawPadCanvas) { - m_mousePressed = false; - m_polyline.resize(3); } @@ -31,53 +26,14 @@ LineDrawMode::~LineDrawMode() } -void LineDrawMode::mousePressEvent(QMouseEvent* e) +void LineDrawMode::drawFinalShape(QPainter& p) { - m_mousePressed = true; - m_polyline[2] = m_polyline[1] = m_polyline[0] = e->pos(); + p.setPen(m_pDrawPad->pen()); + p.drawLine(m_polyline[2], m_polyline[0]); } -void LineDrawMode::mouseReleaseEvent(QMouseEvent* e) +void LineDrawMode::drawTemporaryShape(QPainter& p) { - Q_UNUSED(e) - - QPainter painter; - painter.begin(m_pDrawPadCanvas->currentPage()); - painter.setPen(m_pDrawPad->pen()); - painter.drawLine(m_polyline[2], m_polyline[0]); - painter.end(); - - QRect r = m_polyline.boundingRect(); - r = r.normalize(); - r.setLeft(r.left() - m_pDrawPad->pen().width()); - r.setTop(r.top() - m_pDrawPad->pen().width()); - r.setRight(r.right() + m_pDrawPad->pen().width()); - r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); - - m_mousePressed = false; -} - -void LineDrawMode::mouseMoveEvent(QMouseEvent* e) -{ - if (m_mousePressed) { - QPainter painter; - painter.begin(m_pDrawPadCanvas->currentPage()); - painter.setRasterOp(Qt::NotROP); - m_polyline[0] = e->pos(); - painter.drawLine(m_polyline[2], m_polyline[1]); - painter.drawLine(m_polyline[2], m_polyline[0]); - painter.end(); - - QRect r = m_polyline.boundingRect(); - r = r.normalize(); - r.setLeft(r.left() - m_pDrawPad->pen().width()); - r.setTop(r.top() - m_pDrawPad->pen().width()); - r.setRight(r.right() + m_pDrawPad->pen().width()); - r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); - - m_polyline[1] = m_polyline[0]; - } + p.setRasterOp(Qt::NotROP); + p.drawLine(m_polyline[2], m_polyline[1]); + p.drawLine(m_polyline[2], m_polyline[0]); } diff --git a/noncore/graphics/drawpad/linedrawmode.h b/noncore/graphics/drawpad/linedrawmode.h index 25ae2cf..0ddd0ad 100644 --- a/noncore/graphics/drawpad/linedrawmode.h +++ b/noncore/graphics/drawpad/linedrawmode.h @@ -15,9 +15,7 @@ #define LINEDRAWMODE_H -#include "drawmode.h" +#include "shapedrawmode.h" -#include <qpointarray.h> - -class LineDrawMode : public DrawMode +class LineDrawMode : public ShapeDrawMode { public: @@ -25,11 +23,7 @@ public: ~LineDrawMode(); - void mousePressEvent(QMouseEvent* e); - void mouseReleaseEvent(QMouseEvent* e); - void mouseMoveEvent(QMouseEvent* e); - -private: - bool m_mousePressed; - QPointArray m_polyline; +protected: + void drawFinalShape(QPainter& p); + void drawTemporaryShape(QPainter& p); }; diff --git a/noncore/graphics/drawpad/newpagedialog.cpp b/noncore/graphics/drawpad/newpagedialog.cpp new file mode 100644 index 0000000..c11d977 --- a/dev/null +++ b/noncore/graphics/drawpad/newpagedialog.cpp @@ -0,0 +1,61 @@ +/*************************************************************************** + * * + * DrawPad - a drawing program for Opie Environment * + * * + * (C) 2002 by S. Prud'homme <prudhomme@laposte.net> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "newpagedialog.h" + +#include <qlabel.h> +#include <qlayout.h> +#include <qspinbox.h> + +NewPageDialog::NewPageDialog(QWidget* parent, const char* name) + : QDialog(parent, name, true) +{ + setCaption(tr("New Page")); + + QLabel* widthLabel = new QLabel(tr("Width :"), this); + QLabel* heightLabel = new QLabel(tr("Height :"), this); + + m_pWidthSpinBox = new QSpinBox(1, 1024, 1, this); + m_pHeightSpinBox = new QSpinBox(1, 1024, 1, this); + + QGridLayout* gridLayout = new QGridLayout(this, 2, 2, 2, 2); + + gridLayout->addWidget(widthLabel, 0, 0); + gridLayout->addWidget(heightLabel, 1, 0); + gridLayout->addWidget(m_pWidthSpinBox, 0, 1); + gridLayout->addWidget(m_pHeightSpinBox, 1, 1); +} + +NewPageDialog::~NewPageDialog() +{ +} + +void NewPageDialog::setWidth(int width) +{ + m_pWidthSpinBox->setValue(width); +} + +void NewPageDialog::setHeight(int height) +{ + m_pHeightSpinBox->setValue(height); +} + +int NewPageDialog::width() +{ + return m_pWidthSpinBox->value(); +} + +int NewPageDialog::height() +{ + return m_pHeightSpinBox->value(); +} diff --git a/noncore/graphics/drawpad/newpagedialog.h b/noncore/graphics/drawpad/newpagedialog.h new file mode 100644 index 0000000..a2b6b87 --- a/dev/null +++ b/noncore/graphics/drawpad/newpagedialog.h @@ -0,0 +1,40 @@ +/*************************************************************************** + * * + * DrawPad - a drawing program for Opie Environment * + * * + * (C) 2002 by S. Prud'homme <prudhomme@laposte.net> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef NEWPAGEDIALOG_H +#define NEWPAGEDIALOG_H + +#include <qdialog.h> + +class QSpinBox; + +class NewPageDialog : public QDialog +{ + Q_OBJECT + +public: + NewPageDialog(QWidget* parent = 0, const char* name = 0); + ~NewPageDialog(); + + void setWidth(int width); + void setHeight(int height); + + int width(); + int height(); + +private: + QSpinBox* m_pWidthSpinBox; + QSpinBox* m_pHeightSpinBox; +}; + +#endif // NEWPAGEDIALOG_H diff --git a/noncore/graphics/drawpad/pointdrawmode.cpp b/noncore/graphics/drawpad/pointdrawmode.cpp index 30753d6..e251f1b 100644 --- a/noncore/graphics/drawpad/pointdrawmode.cpp +++ b/noncore/graphics/drawpad/pointdrawmode.cpp @@ -63,5 +63,11 @@ void PointDrawMode::mouseMoveEvent(QMouseEvent* e) r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); + QRect viewportRect(m_pDrawPadCanvas->contentsToViewport(r.topLeft()), + m_pDrawPadCanvas->contentsToViewport(r.bottomRight())); + + bitBlt(m_pDrawPadCanvas->viewport(), viewportRect.x(), viewportRect.y(), + m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); + + m_pDrawPadCanvas->viewport()->update(viewportRect); } } diff --git a/noncore/graphics/drawpad/rectangledrawmode.cpp b/noncore/graphics/drawpad/rectangledrawmode.cpp index 60d7cea..0226544 100644 --- a/noncore/graphics/drawpad/rectangledrawmode.cpp +++ b/noncore/graphics/drawpad/rectangledrawmode.cpp @@ -17,12 +17,7 @@ #include "drawpadcanvas.h" -#include <qpainter.h> -#include <qpixmap.h> - RectangleDrawMode::RectangleDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas) - : DrawMode(drawPad, drawPadCanvas) + : ShapeDrawMode(drawPad, drawPadCanvas) { - m_mousePressed = false; - m_polyline.resize(3); } @@ -31,53 +26,14 @@ RectangleDrawMode::~RectangleDrawMode() } -void RectangleDrawMode::mousePressEvent(QMouseEvent* e) +void RectangleDrawMode::drawFinalShape(QPainter& p) { - m_mousePressed = true; - m_polyline[2] = m_polyline[1] = m_polyline[0] = e->pos(); + p.setPen(m_pDrawPad->pen()); + p.drawRect(QRect(m_polyline[2], m_polyline[0])); } -void RectangleDrawMode::mouseReleaseEvent(QMouseEvent* e) +void RectangleDrawMode::drawTemporaryShape(QPainter& p) { - Q_UNUSED(e) - - QPainter painter; - painter.begin(m_pDrawPadCanvas->currentPage()); - painter.setPen(m_pDrawPad->pen()); - painter.drawRect(QRect(m_polyline[2], m_polyline[0])); - painter.end(); - - QRect r = m_polyline.boundingRect(); - r = r.normalize(); - r.setLeft(r.left() - m_pDrawPad->pen().width()); - r.setTop(r.top() - m_pDrawPad->pen().width()); - r.setRight(r.right() + m_pDrawPad->pen().width()); - r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); - - m_mousePressed = false; -} - -void RectangleDrawMode::mouseMoveEvent(QMouseEvent* e) -{ - if (m_mousePressed) { - QPainter painter; - painter.begin(m_pDrawPadCanvas->currentPage()); - painter.setRasterOp(Qt::NotROP); - m_polyline[0] = e->pos(); - painter.drawRect(QRect(m_polyline[2], m_polyline[1])); - painter.drawRect(QRect(m_polyline[2], m_polyline[0])); - painter.end(); - - QRect r = m_polyline.boundingRect(); - r = r.normalize(); - r.setLeft(r.left() - m_pDrawPad->pen().width()); - r.setTop(r.top() - m_pDrawPad->pen().width()); - r.setRight(r.right() + m_pDrawPad->pen().width()); - r.setBottom(r.bottom() + m_pDrawPad->pen().width()); - - bitBlt(m_pDrawPadCanvas, r.x(), r.y(), m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); - - m_polyline[1] = m_polyline[0]; - } + p.setRasterOp(Qt::NotROP); + p.drawRect(QRect(m_polyline[2], m_polyline[1])); + p.drawRect(QRect(m_polyline[2], m_polyline[0])); } diff --git a/noncore/graphics/drawpad/rectangledrawmode.h b/noncore/graphics/drawpad/rectangledrawmode.h index 62b85b1..186533d 100644 --- a/noncore/graphics/drawpad/rectangledrawmode.h +++ b/noncore/graphics/drawpad/rectangledrawmode.h @@ -15,9 +15,7 @@ #define RECTANGLEDRAWMODE_H -#include "drawmode.h" +#include "shapedrawmode.h" -#include <qpointarray.h> - -class RectangleDrawMode : public DrawMode +class RectangleDrawMode : public ShapeDrawMode { public: @@ -25,11 +23,7 @@ public: ~RectangleDrawMode(); - void mousePressEvent(QMouseEvent* e); - void mouseReleaseEvent(QMouseEvent* e); - void mouseMoveEvent(QMouseEvent* e); - -private: - bool m_mousePressed; - QPointArray m_polyline; +protected: + void drawFinalShape(QPainter& p); + void drawTemporaryShape(QPainter& p); }; diff --git a/noncore/graphics/drawpad/shapedrawmode.cpp b/noncore/graphics/drawpad/shapedrawmode.cpp new file mode 100644 index 0000000..8b9877d --- a/dev/null +++ b/noncore/graphics/drawpad/shapedrawmode.cpp @@ -0,0 +1,92 @@ +/*************************************************************************** + * * + * DrawPad - a drawing program for Opie Environment * + * * + * (C) 2002 by S. Prud'homme <prudhomme@laposte.net> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "shapedrawmode.h" + +#include "drawpad.h" +#include "drawpadcanvas.h" + +#include <qpainter.h> +#include <qpixmap.h> + +ShapeDrawMode::ShapeDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas) + : DrawMode(drawPad, drawPadCanvas) +{ + m_mousePressed = false; + m_polyline.resize(3); +} + +ShapeDrawMode::~ShapeDrawMode() +{ +} + +void ShapeDrawMode::mousePressEvent(QMouseEvent* e) +{ + m_mousePressed = true; + m_polyline[2] = m_polyline[1] = m_polyline[0] = e->pos(); +} + +void ShapeDrawMode::mouseReleaseEvent(QMouseEvent* e) +{ + Q_UNUSED(e) + + QPainter painter; + painter.begin(m_pDrawPadCanvas->currentPage()); + drawFinalShape(painter); + painter.end(); + + QRect r = m_polyline.boundingRect(); + r = r.normalize(); + r.setLeft(r.left() - m_pDrawPad->pen().width()); + r.setTop(r.top() - m_pDrawPad->pen().width()); + r.setRight(r.right() + m_pDrawPad->pen().width()); + r.setBottom(r.bottom() + m_pDrawPad->pen().width()); + + QRect viewportRect(m_pDrawPadCanvas->contentsToViewport(r.topLeft()), + m_pDrawPadCanvas->contentsToViewport(r.bottomRight())); + + bitBlt(m_pDrawPadCanvas->viewport(), viewportRect.x(), viewportRect.y(), + m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); + + m_pDrawPadCanvas->viewport()->update(viewportRect); + + m_mousePressed = false; +} + +void ShapeDrawMode::mouseMoveEvent(QMouseEvent* e) +{ + if (m_mousePressed) { + m_polyline[0] = e->pos(); + QPainter painter; + painter.begin(m_pDrawPadCanvas->currentPage()); + drawTemporaryShape(painter); + painter.end(); + + QRect r = m_polyline.boundingRect(); + r = r.normalize(); + r.setLeft(r.left() - m_pDrawPad->pen().width()); + r.setTop(r.top() - m_pDrawPad->pen().width()); + r.setRight(r.right() + m_pDrawPad->pen().width()); + r.setBottom(r.bottom() + m_pDrawPad->pen().width()); + + QRect viewportRect(m_pDrawPadCanvas->contentsToViewport(r.topLeft()), + m_pDrawPadCanvas->contentsToViewport(r.bottomRight())); + + bitBlt(m_pDrawPadCanvas->viewport(), viewportRect.x(), viewportRect.y(), + m_pDrawPadCanvas->currentPage(), r.x(), r.y(), r.width(), r.height()); + + m_pDrawPadCanvas->viewport()->update(viewportRect); + + m_polyline[1] = m_polyline[0]; + } +} diff --git a/noncore/graphics/drawpad/shapedrawmode.h b/noncore/graphics/drawpad/shapedrawmode.h new file mode 100644 index 0000000..292478f --- a/dev/null +++ b/noncore/graphics/drawpad/shapedrawmode.h @@ -0,0 +1,41 @@ +/*************************************************************************** + * * + * DrawPad - a drawing program for Opie Environment * + * * + * (C) 2002 by S. Prud'homme <prudhomme@laposte.net> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef SHAPEDRAWMODE_H +#define SHAPEDRAWMODE_H + +#include "drawmode.h" + +#include <qpointarray.h> + +class ShapeDrawMode : public DrawMode +{ +public: + ShapeDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas); + ~ShapeDrawMode(); + + void mousePressEvent(QMouseEvent* e); + void mouseReleaseEvent(QMouseEvent* e); + void mouseMoveEvent(QMouseEvent* e); + +protected: + virtual void drawFinalShape(QPainter& p) = 0; + virtual void drawTemporaryShape(QPainter& p) = 0; + + QPointArray m_polyline; + +private: + bool m_mousePressed; +}; + +#endif // SHAPEDRAWMODE_H |