author | leseb <leseb> | 2002-03-17 15:31:12 (UTC) |
---|---|---|
committer | leseb <leseb> | 2002-03-17 15:31:12 (UTC) |
commit | 378db8490c6c80ced939622605be1500fa126a2d (patch) (side-by-side diff) | |
tree | b39bbe287f70a1e867060eb14b86536e7d727d17 /noncore/graphics/drawpad | |
parent | 31e0537b3406d3e89df6424cded2570d28d61df4 (diff) | |
download | opie-378db8490c6c80ced939622605be1500fa126a2d.zip opie-378db8490c6c80ced939622605be1500fa126a2d.tar.gz opie-378db8490c6c80ced939622605be1500fa126a2d.tar.bz2 |
Basic undo/redo
-rw-r--r-- | noncore/graphics/drawpad/drawmode.h | 6 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpad.cpp | 81 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpad.h | 17 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpadcanvas.cpp | 135 | ||||
-rw-r--r-- | noncore/graphics/drawpad/drawpadcanvas.h | 12 |
5 files changed, 159 insertions, 92 deletions
diff --git a/noncore/graphics/drawpad/drawmode.h b/noncore/graphics/drawpad/drawmode.h index d4ecadd..4e80fe2 100644 --- a/noncore/graphics/drawpad/drawmode.h +++ b/noncore/graphics/drawpad/drawmode.h @@ -23,5 +23,7 @@ class DrawMode : QObject { -public: +protected: DrawMode(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas); - ~DrawMode(); + +public: + virtual ~DrawMode(); diff --git a/noncore/graphics/drawpad/drawpad.cpp b/noncore/graphics/drawpad/drawpad.cpp index 3c593b6..5cc2197 100644 --- a/noncore/graphics/drawpad/drawpad.cpp +++ b/noncore/graphics/drawpad/drawpad.cpp @@ -43,2 +43,4 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pDrawPadCanvas = new DrawPadCanvas(this, this); + connect(m_pDrawPadCanvas, SIGNAL(pagesChanged()), this, SLOT(updateNavigationToolButtons())); + connect(m_pDrawPadCanvas, SIGNAL(pageBackupsChanged()), this, SLOT(updateUndoRedoToolButtons())); @@ -73,3 +75,3 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) QAction* clearAllAction = new QAction(tr("Clear All"), QString::null, 0, this); - connect(clearAllAction, SIGNAL(activated()), this, SLOT(clearAll())); + connect(clearAllAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(clearAll())); clearAllAction->addTo(toolsPopupMenu); @@ -88,3 +90,3 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) QAction* newPageAction = new QAction(tr("New Page"), Resource::loadIconSet("new"), QString::null, 0, this); - connect(newPageAction, SIGNAL(activated()), this, SLOT(newPage())); + connect(newPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(newPage())); newPageAction->addTo(pageToolBar); @@ -96,3 +98,3 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) QAction* deletePageAction = new QAction(tr("Delete Page"), Resource::loadIconSet("trash"), QString::null, 0, this); - connect(deletePageAction, SIGNAL(activated()), this, SLOT(deletePage())); + connect(deletePageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(deletePage())); deletePageAction->addTo(pageToolBar); @@ -106,4 +108,14 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) + m_pUndoAction = new QAction(tr("Undo"), Resource::loadIconSet("drawpad/undo"), QString::null, 0, this); + connect(m_pUndoAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(undo())); + 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()), this, SLOT(goFirstPage())); + connect(m_pFirstPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(goFirstPage())); m_pFirstPageAction->addTo(navigationToolBar); @@ -111,3 +123,3 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pPreviousPageAction = new QAction(tr("Previous Page"), Resource::loadIconSet("back"), QString::null, 0, this); - connect(m_pPreviousPageAction, SIGNAL(activated()), this, SLOT(goPreviousPage())); + connect(m_pPreviousPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(goPreviousPage())); m_pPreviousPageAction->addTo(navigationToolBar); @@ -115,3 +127,3 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pNextPageAction = new QAction(tr("Next Page"), Resource::loadIconSet("forward"), QString::null, 0, this); - connect(m_pNextPageAction, SIGNAL(activated()), this, SLOT(goNextPage())); + connect(m_pNextPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(goNextPage())); m_pNextPageAction->addTo(navigationToolBar); @@ -119,6 +131,6 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) m_pLastPageAction = new QAction(tr("Last Page"), Resource::loadIconSet("fastforward"), QString::null, 0, this); - connect(m_pLastPageAction, SIGNAL(activated()), this, SLOT(goLastPage())); + connect(m_pLastPageAction, SIGNAL(activated()), m_pDrawPadCanvas, SLOT(goLastPage())); m_pLastPageAction->addTo(navigationToolBar); - updateNavigationToolBar(); + updateNavigationToolButtons(); @@ -163,2 +175,5 @@ DrawPad::DrawPad(QWidget* parent, const char* name, WFlags f) emptyToolBar->setHorizontalStretchable(true); + emptyToolBar->addSeparator(); + + // init draw parameters toolbar @@ -220,44 +235,2 @@ DrawPad::~DrawPad() -void DrawPad::clearAll() -{ - m_pDrawPadCanvas->clearAll(); - updateNavigationToolBar(); -} - -void DrawPad::newPage() -{ - m_pDrawPadCanvas->newPage(); - updateNavigationToolBar(); -} - -void DrawPad::deletePage() -{ - m_pDrawPadCanvas->deletePage(); - updateNavigationToolBar(); -} - -void DrawPad::goFirstPage() -{ - m_pDrawPadCanvas->goFirstPage(); - updateNavigationToolBar(); -} - -void DrawPad::goPreviousPage() -{ - m_pDrawPadCanvas->goPreviousPage(); - updateNavigationToolBar(); -} - -void DrawPad::goNextPage() -{ - m_pDrawPadCanvas->goNextPage(); - updateNavigationToolBar(); -} - -void DrawPad::goLastPage() -{ - m_pDrawPadCanvas->goLastPage(); - updateNavigationToolBar(); -} - void DrawPad::setPointDrawMode() @@ -383,3 +356,9 @@ void DrawPad::changeBrushColor(int index) -void DrawPad::updateNavigationToolBar() +void DrawPad::updateUndoRedoToolButtons() +{ + m_pUndoAction->setEnabled(m_pDrawPadCanvas->undoEnabled()); + m_pRedoAction->setEnabled(m_pDrawPadCanvas->redoEnabled()); +} + +void DrawPad::updateNavigationToolButtons() { diff --git a/noncore/graphics/drawpad/drawpad.h b/noncore/graphics/drawpad/drawpad.h index 0ece408..ee81ddf 100644 --- a/noncore/graphics/drawpad/drawpad.h +++ b/noncore/graphics/drawpad/drawpad.h @@ -41,11 +41,2 @@ public: private slots: - void clearAll(); - void newPage(); - void deletePage(); - - void goFirstPage(); - void goPreviousPage(); - void goNextPage(); - void goLastPage(); - void setPointDrawMode(); @@ -61,5 +52,6 @@ private slots: -private: - void updateNavigationToolBar(); + void updateUndoRedoToolButtons(); + void updateNavigationToolButtons(); +private: DrawPadCanvas* m_pDrawPadCanvas; @@ -71,2 +63,5 @@ private: + QAction* m_pUndoAction; + QAction* m_pRedoAction; + QAction* m_pFirstPageAction; diff --git a/noncore/graphics/drawpad/drawpadcanvas.cpp b/noncore/graphics/drawpad/drawpadcanvas.cpp index f02f478..08f7b66 100644 --- a/noncore/graphics/drawpad/drawpadcanvas.cpp +++ b/noncore/graphics/drawpad/drawpadcanvas.cpp @@ -145,5 +145,7 @@ DrawPadCanvas::DrawPadCanvas(DrawPad* drawPad, QWidget* parent, const char* name m_pDrawPad = drawPad; - m_buffers.setAutoDelete(true); - m_buffers.append(new QPixmap(width(), height())); - m_buffers.current()->fill(Qt::white); + 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()))); } @@ -166,9 +168,12 @@ void DrawPadCanvas::load(QIODevice* ioDevice) - m_buffers = drawPadCanvasXmlHandler.pixmaps(); + m_pages = drawPadCanvasXmlHandler.pixmaps(); - if (m_buffers.isEmpty()) { - m_buffers.append(new QPixmap(width(), height())); - m_buffers.current()->fill(Qt::white); + if (m_pages.isEmpty()) { + m_pages.append(new QPixmap(width(), height())); + m_pages.current()->fill(Qt::white); } + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); + repaint(); @@ -184,3 +189,3 @@ void DrawPadCanvas::save(QIODevice* ioDevice) - QListIterator<QPixmap> bufferIterator(m_buffers); + QListIterator<QPixmap> bufferIterator(m_pages); @@ -223,3 +228,3 @@ QPixmap* DrawPadCanvas::currentPage() { - return m_buffers.current(); + return m_pages.current(); } @@ -228,8 +233,14 @@ void DrawPadCanvas::clearAll() { - m_buffers.clear(); + m_pages.clear(); + + m_pages.append(new QPixmap(width(), height())); + m_pages.current()->fill(Qt::white); - m_buffers.append(new QPixmap(width(), height())); - m_buffers.current()->fill(Qt::white); + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); repaint(); + + emit pagesChanged(); + emit pageBackupsChanged(); } @@ -238,5 +249,10 @@ void DrawPadCanvas::newPage() { - m_buffers.insert(m_buffers.at() + 1, new QPixmap(width(), height())); - m_buffers.current()->fill(Qt::white); + 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(); + + emit pagesChanged(); + emit pageBackupsChanged(); } @@ -245,3 +261,3 @@ void DrawPadCanvas::clearPage() { - m_buffers.current()->fill(Qt::white); + m_pages.current()->fill(Qt::white); repaint(); @@ -251,10 +267,26 @@ void DrawPadCanvas::deletePage() { - m_buffers.remove(m_buffers.current()); + m_pages.remove(m_pages.current()); - if (m_buffers.isEmpty()) { - m_buffers.append(new QPixmap(width(), height())); - m_buffers.current()->fill(Qt::white); + if (m_pages.isEmpty()) { + m_pages.append(new QPixmap(width(), height())); + m_pages.current()->fill(Qt::white); } + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); + repaint(); + + emit pagesChanged(); + emit pageBackupsChanged(); +} + +bool DrawPadCanvas::undoEnabled() +{ + return (m_pageBackups.current() != m_pageBackups.getFirst()); +} + +bool DrawPadCanvas::redoEnabled() +{ + return (m_pageBackups.current() != m_pageBackups.getLast()); } @@ -263,3 +295,3 @@ bool DrawPadCanvas::goPreviousPageEnabled() { - return (m_buffers.current() != m_buffers.getFirst()); + return (m_pages.current() != m_pages.getFirst()); } @@ -268,3 +300,19 @@ bool DrawPadCanvas::goNextPageEnabled() { - return (m_buffers.current() != m_buffers.getLast()); + return (m_pages.current() != m_pages.getLast()); +} + +void DrawPadCanvas::undo() +{ + *(m_pages.current()) = *(m_pageBackups.prev()); + repaint(); + + emit pageBackupsChanged(); +} + +void DrawPadCanvas::redo() +{ + *(m_pages.current()) = *(m_pageBackups.next()); + repaint(); + + emit pageBackupsChanged(); } @@ -273,4 +321,9 @@ void DrawPadCanvas::goFirstPage() { - m_buffers.first(); + m_pages.first(); + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); repaint(); + + emit pagesChanged(); + emit pageBackupsChanged(); } @@ -279,4 +332,9 @@ void DrawPadCanvas::goPreviousPage() { - m_buffers.prev(); + m_pages.prev(); + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); repaint(); + + emit pagesChanged(); + emit pageBackupsChanged(); } @@ -285,4 +343,9 @@ void DrawPadCanvas::goNextPage() { - m_buffers.next(); + m_pages.next(); + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); repaint(); + + emit pagesChanged(); + emit pageBackupsChanged(); } @@ -291,4 +354,9 @@ void DrawPadCanvas::goLastPage() { - m_buffers.last(); + m_pages.last(); + m_pageBackups.clear(); + m_pageBackups.append(new QPixmap(*(m_pages.current()))); repaint(); + + emit pagesChanged(); + emit pageBackupsChanged(); } @@ -303,2 +371,15 @@ void DrawPadCanvas::mouseReleaseEvent(QMouseEvent* e) m_pDrawPad->drawMode()->mouseReleaseEvent(e); + + QPixmap* currentBackup = m_pageBackups.current(); + while (m_pageBackups.last() != currentBackup) { + m_pageBackups.removeLast(); + } + + while (m_pageBackups.count() >= (5 + 1)) { + m_pageBackups.removeFirst(); + } + + m_pageBackups.append(new QPixmap(*(m_pages.current()))); + + emit pageBackupsChanged(); } @@ -314,3 +395,3 @@ void DrawPadCanvas::resizeEvent(QResizeEvent* e) - QListIterator<QPixmap> bufferIterator(m_buffers); + QListIterator<QPixmap> bufferIterator(m_pages); @@ -336,3 +417,3 @@ void DrawPadCanvas::paintEvent(QPaintEvent* e) QRect r = rects[i]; - bitBlt(this, r.x(), r.y(), m_buffers.current(), r.x(), r.y(), r.width(), r.height()); + bitBlt(this, r.x(), r.y(), m_pages.current(), r.x(), r.y(), r.width(), r.height()); } diff --git a/noncore/graphics/drawpad/drawpadcanvas.h b/noncore/graphics/drawpad/drawpadcanvas.h index 2ec9298..eddcb43 100644 --- a/noncore/graphics/drawpad/drawpadcanvas.h +++ b/noncore/graphics/drawpad/drawpadcanvas.h @@ -36,2 +36,4 @@ public: + bool undoEnabled(); + bool redoEnabled(); bool goPreviousPageEnabled(); @@ -47,2 +49,5 @@ public slots: + void undo(); + void redo(); + void goFirstPage(); @@ -52,2 +57,6 @@ public slots: +signals: + void pagesChanged(); + void pageBackupsChanged(); + protected: @@ -61,3 +70,4 @@ private: DrawPad* m_pDrawPad; - QList<QPixmap> m_buffers; + QList<QPixmap> m_pages; + QList<QPixmap> m_pageBackups; }; |