-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 @@ -32,30 +32,23 @@ #include <qfile.h> #include <qpainter.h> #include <qspinbox.h> #include <qtoolbutton.h> #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); // init menu setToolBarsMovable(false); @@ -103,14 +96,12 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pUndoAction->addTo(navigationToolBar); m_pRedoAction = new QAction(tr("Redo"), Resource::loadIconSet("drawpad/redo"), QString::null, 0, this); connect(m_pRedoAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(redo())); 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())); m_pFirstPageAction->addTo(navigationToolBar); m_pPreviousPageAction = new QAction(tr("Previous Page"), Resource::loadIconSet("back"), QString::null, 0, this); connect(m_pPreviousPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(goPreviousPage())); @@ -121,14 +112,12 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pNextPageAction->addTo(navigationToolBar); m_pLastPageAction = new QAction(tr("Last Page"), Resource::loadIconSet("fastforward"), QString::null, 0, this); connect(m_pLastPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(goLastPage())); m_pLastPageAction->addTo(navigationToolBar); - updateNavigationToolButtons(); - // init draw mode toolbar QPEToolBar* drawModeToolBar = new QPEToolBar(this); m_pPointDrawModeAction = new QAction(tr("Draw Point"), Resource::loadIconSet("drawpad/point.png"), QString::null, 0, this); m_pPointDrawModeAction->setToggleAction(true); @@ -214,12 +203,23 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) QToolTip::add(m_pBrushColorToolButton, tr("Fill Color")); m_pBrushColorToolButton->setPopup(brushColorPopupMenu); m_pBrushColorToolButton->setPopupDelay(0); 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(); + } } DrawPad::~DrawPad() { QFile file(Global::applicationFileName("drawpad", "drawpad.xml")); @@ -376,6 +376,15 @@ void DrawPad::updateNavigationToolButtons() { m_pFirstPageAction->setEnabled(m_pDrawPadCanvas->goPreviousPageEnabled()); m_pPreviousPageAction->setEnabled(m_pDrawPadCanvas->goPreviousPageEnabled()); m_pNextPageAction->setEnabled(m_pDrawPadCanvas->goNextPageEnabled()); 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 @@ -28,13 +28,13 @@ class QWidgetStack; class DrawPad : public QMainWindow { Q_OBJECT public: - DrawPad(QWidget* parent = 0, const char* name = 0, WFlags f = WType_TopLevel); + DrawPad(QWidget* parent = 0, const char* name = 0); ~DrawPad(); DrawMode* drawMode() { return m_pDrawMode; } QPen pen() { return m_pen; } QBrush brush() { return m_brush; } @@ -51,12 +51,13 @@ private slots: void changeBrushColor(const QColor& color); void choosePenColor(); void chooseBrushColor(); void updateUndoRedoToolButtons(); void updateNavigationToolButtons(); + void updateCaption(); private: DrawPadCanvas* m_pDrawPadCanvas; DrawMode* m_pDrawMode; QPen m_pen; 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 @@ -6,26 +6,30 @@ HEADERS = colordialog.h \ drawpad.h \ drawpadcanvas.h \ ellipsedrawmode.h \ erasedrawmode.h \ filldrawmode.h \ linedrawmode.h \ + newpagedialog.h \ pointdrawmode.h \ - rectangledrawmode.h + rectangledrawmode.h \ + shapedrawmode.h SOURCES = colordialog.cpp \ colorpanel.cpp \ drawmode.cpp \ drawpad.cpp \ drawpadcanvas.cpp \ ellipsedrawmode.cpp \ erasedrawmode.cpp \ filldrawmode.cpp \ linedrawmode.cpp \ main.cpp \ + newpagedialog.cpp \ pointdrawmode.cpp \ - rectangledrawmode.cpp + rectangledrawmode.cpp \ + shapedrawmode.cpp INCLUDEPATH += $(OPIEDIR)/include \ $(QTDIR)/src/3rdparty/zlib DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe DESTDIR = $(OPIEDIR)/bin TARGET = drawpad 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 @@ -12,12 +12,13 @@ ***************************************************************************/ #include "drawpadcanvas.h" #include "drawmode.h" #include "drawpad.h" +#include "newpagedialog.h" #include <qbuffer.h> #include <qimage.h> #include <qpainter.h> #include <qpixmap.h> #include <qtextcodec.h> @@ -134,23 +135,18 @@ bool DrawPadCanvasXmlHandler::characters(const QString& ch) m_pixmaps.append(pixmap); } return true; } -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()))); } DrawPadCanvas::~DrawPadCanvas() { } @@ -166,20 +162,39 @@ void DrawPadCanvas::load(QIODevice* ioDevice) xmlSimpleReader.setContentHandler(&drawPadCanvasXmlHandler); xmlSimpleReader.parse(xmlInputSource); m_pages = drawPadCanvasXmlHandler.pixmaps(); if (m_pages.isEmpty()) { - m_pages.append(new QPixmap(width(), height())); + m_pages.append(new QPixmap(contentsRect().size())); m_pages.current()->fill(Qt::white); } 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(); + 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(); } void DrawPadCanvas::save(QIODevice* ioDevice) { QTextStream textStream(ioDevice); textStream.setCodec(QTextCodec::codecForName("UTF-8")); @@ -226,59 +241,83 @@ void DrawPadCanvas::save(QIODevice* ioDevice) QPixmap* DrawPadCanvas::currentPage() { return m_pages.current(); } +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); 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(); emit pageBackupsChanged(); } 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(); + } } void DrawPadCanvas::clearPage() { m_pages.current()->fill(Qt::white); - repaint(); + + viewport()->update(); } void DrawPadCanvas::deletePage() { m_pages.remove(m_pages.current()); if (m_pages.isEmpty()) { - m_pages.append(new QPixmap(width(), height())); + m_pages.append(new QPixmap(contentsRect().size())); m_pages.current()->fill(Qt::white); } 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(); emit pageBackupsChanged(); } bool DrawPadCanvas::undoEnabled() @@ -301,75 +340,85 @@ bool DrawPadCanvas::goNextPageEnabled() return (m_pages.current() != m_pages.getLast()); } void DrawPadCanvas::undo() { *(m_pages.current()) = *(m_pageBackups.prev()); - repaint(); + + viewport()->update(); emit pageBackupsChanged(); } void DrawPadCanvas::redo() { *(m_pages.current()) = *(m_pageBackups.next()); - repaint(); + + viewport()->update(); emit pageBackupsChanged(); } void DrawPadCanvas::goFirstPage() { m_pages.first(); 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(); emit pageBackupsChanged(); } void DrawPadCanvas::goPreviousPage() { m_pages.prev(); 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(); emit pageBackupsChanged(); } void DrawPadCanvas::goNextPage() { m_pages.next(); 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(); emit pageBackupsChanged(); } void DrawPadCanvas::goLastPage() { m_pages.last(); 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(); emit pageBackupsChanged(); } -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); QPixmap* currentBackup = m_pageBackups.current(); while (m_pageBackups.last() != currentBackup) { m_pageBackups.removeLast(); @@ -381,40 +430,17 @@ void DrawPadCanvas::mouseReleaseEvent(QMouseEvent* e) m_pageBackups.append(new QPixmap(*(m_pages.current()))); emit pageBackupsChanged(); } -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 @@ -11,38 +11,41 @@ * * ***************************************************************************/ #ifndef DRAWPADCANVAS_H #define DRAWPADCANVAS_H -#include <qwidget.h> +#include <qscrollview.h> #include <qlist.h> #include <qpointarray.h> 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); bool undoEnabled(); bool redoEnabled(); bool goPreviousPageEnabled(); bool goNextPageEnabled(); QPixmap* currentPage(); + uint pagePosition(); + uint pageCount(); public slots: void clearAll(); void newPage(); void clearPage(); void deletePage(); @@ -57,17 +60,16 @@ public slots: signals: void pagesChanged(); void pageBackupsChanged(); 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: DrawPad* m_pDrawPad; QList<QPixmap> m_pages; QList<QPixmap> m_pageBackups; }; 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 @@ -17,70 +17,29 @@ #include "drawpadcanvas.h" #include <qpainter.h> #include <qpixmap.h> EllipseDrawMode::EllipseDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas) - : DrawMode(drawPad, drawPadCanvas) + : ShapeDrawMode(drawPad, drawPadCanvas) { - m_mousePressed = false; - m_polyline.resize(3); } 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 @@ -11,26 +11,20 @@ * * ***************************************************************************/ #ifndef ELLIPSEDRAWMODE_H #define ELLIPSEDRAWMODE_H -#include "drawmode.h" +#include "shapedrawmode.h" -#include <qpointarray.h> - -class EllipseDrawMode : public DrawMode +class EllipseDrawMode : public ShapeDrawMode { public: EllipseDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas); ~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); }; #endif // ELLIPSEDRAWMODE_H 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 @@ -60,9 +60,15 @@ void EraseDrawMode::mouseMoveEvent(QMouseEvent* e) 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()); + 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 @@ -42,13 +42,13 @@ void FillDrawMode::mousePressEvent(QMouseEvent* e) fillEast(x + 1, y); fillSouth(x, y + 1); fillWest(x - 1, y); fillNorth(x, y - 1); m_pDrawPadCanvas->currentPage()->convertFromImage(m_image); - m_pDrawPadCanvas->repaint(); + m_pDrawPadCanvas->viewport()->update(); } } void FillDrawMode::mouseReleaseEvent(QMouseEvent* e) { Q_UNUSED(e) 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 @@ -13,71 +13,27 @@ #include "linedrawmode.h" #include "drawpad.h" #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); } 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 @@ -11,26 +11,20 @@ * * ***************************************************************************/ #ifndef LINEDRAWMODE_H #define LINEDRAWMODE_H -#include "drawmode.h" +#include "shapedrawmode.h" -#include <qpointarray.h> - -class LineDrawMode : public DrawMode +class LineDrawMode : public ShapeDrawMode { public: LineDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas); ~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); }; #endif // LINEDRAWMODE_H 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 @@ -59,9 +59,15 @@ void PointDrawMode::mouseMoveEvent(QMouseEvent* e) 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()); + 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 @@ -13,71 +13,27 @@ #include "rectangledrawmode.h" #include "drawpad.h" #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); } 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 @@ -11,26 +11,20 @@ * * ***************************************************************************/ #ifndef RECTANGLEDRAWMODE_H #define RECTANGLEDRAWMODE_H -#include "drawmode.h" +#include "shapedrawmode.h" -#include <qpointarray.h> - -class RectangleDrawMode : public DrawMode +class RectangleDrawMode : public ShapeDrawMode { public: RectangleDrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas); ~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); }; #endif // RECTANGLEDRAWMODE_H 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 |