From cae19827f5114f4ad8c6219b7f344a18d7221f1b Mon Sep 17 00:00:00 2001 From: David Capello Date: Sat, 18 Aug 2012 23:45:37 -0300 Subject: [PATCH] Add DocumentEvent class so all DocumentObserver's member functions receive one parameter. --- src/document.cpp | 7 +++-- src/document_event.h | 67 ++++++++++++++++++++++++++++++++++++++++ src/document_observer.h | 31 ++++++++++--------- src/undo_transaction.cpp | 37 +++++++++++++++++++--- 4 files changed, 122 insertions(+), 20 deletions(-) create mode 100644 src/document_event.h diff --git a/src/document.cpp b/src/document.cpp index 1327db53f..5fd156292 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -24,6 +24,7 @@ #include "base/mutex.h" #include "base/scoped_lock.h" #include "base/unique_ptr.h" +#include "document_event.h" #include "document_observer.h" #include "document_undo.h" #include "file/format_options.h" @@ -70,7 +71,8 @@ Document::Document(Sprite* sprite) Document::~Document() { - notifyObservers(&DocumentObserver::onRemoveSprite, this, m_sprite.get()); + DocumentEvent ev(this, m_sprite); + notifyObservers(&DocumentObserver::onRemoveSprite, ev); if (m_bound.seg) base_free(m_bound.seg); @@ -132,7 +134,8 @@ void Document::addSprite(Sprite* sprite) ASSERT(m_sprite == NULL); // TODO add support for more sprites in the future (e.g. for .ico files) m_sprite.reset(sprite); - notifyObservers(&DocumentObserver::onAddSprite, this, m_sprite.get()); + DocumentEvent ev(this, m_sprite); + notifyObservers(&DocumentObserver::onAddSprite, ev); } const char* Document::getFilename() const diff --git a/src/document_event.h b/src/document_event.h new file mode 100644 index 000000000..686e428c6 --- /dev/null +++ b/src/document_event.h @@ -0,0 +1,67 @@ +/* ASEPRITE + * Copyright (C) 2001-2012 David Capello + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef DOCUMENT_EVENT_H_INCLUDED +#define DOCUMENT_EVENT_H_INCLUDED + +#include "raster/frame_number.h" + +class Cel; +class Document; +class Image; +class Layer; +class LayerImage; +class Sprite; + +class DocumentEvent { +public: + DocumentEvent(Document* document, + Sprite* sprite = NULL, + Layer* layer = NULL, + Cel* cel = NULL, + Image* image = NULL, + int imageIndex = -1, + FrameNumber frame = FrameNumber()) + : m_document(document) + , m_sprite(sprite) + , m_layer(layer) + , m_cel(cel) + , m_image(image) + , m_imageIndex(imageIndex) + , m_frame(frame) { + } + + Document* document() const { return m_document; } + Sprite* sprite() const { return m_sprite; } + Layer* layer() const { return m_layer; } + Cel* cel() const { return m_cel; } + Image* image() const { return m_image; } + int imageIndex() const { return m_imageIndex; } + FrameNumber frame() const { return m_frame; } + +private: + Document* m_document; + Sprite* m_sprite; + Layer* m_layer; + Cel* m_cel; + Image* m_image; + int m_imageIndex; + FrameNumber m_frame; +}; + +#endif diff --git a/src/document_observer.h b/src/document_observer.h index 9f07a9534..60e2d9cc0 100644 --- a/src/document_observer.h +++ b/src/document_observer.h @@ -21,9 +21,7 @@ #include "raster/frame_number.h" -class Document; -class Layer; -class Sprite; +class DocumentEvent; // Observer of document events. The default implementation does // nothing in each handler, so you can override the required events. @@ -31,23 +29,28 @@ class DocumentObserver { public: virtual ~DocumentObserver() { } - virtual void onAddSprite(Document* document, Sprite* sprite) { } + virtual void onAddSprite(DocumentEvent& ev) { } + virtual void onAddLayer(DocumentEvent& ev) { } + virtual void onAddFrame(DocumentEvent& ev) { } + virtual void onAddCel(DocumentEvent& ev) { } - virtual void onAddLayer(Document* document, Layer* layer) { } + virtual void onRemoveSprite(DocumentEvent& ev) { } + virtual void onRemoveLayer(DocumentEvent& ev) { } + virtual void onRemoveFrame(DocumentEvent& ev) { } + virtual void onRemoveCel(DocumentEvent& ev) { } - virtual void onAddFrame(Document* document, FrameNumber frame) { } + virtual void onSpriteSizeChanged(DocumentEvent& ev) { } - virtual void onRemoveSprite(Document* document, Sprite* sprite) { } + virtual void onLayerRestacked(DocumentEvent& ev) { } - virtual void onRemoveLayer(Document* document, Layer* layer) { } + virtual void onCelFrameChanged(DocumentEvent& ev) { } + virtual void onCelPositionChanged(DocumentEvent& ev) { } + virtual void onCelOpacityChanged(DocumentEvent& ev) { } - virtual void onRemoveFrame(Document* document, FrameNumber frame) { } + virtual void onFrameDurationChanged(DocumentEvent& ev) { } - // Called when the active cel data was modified (position, opacity, etc.). - virtual void onModifyCel(Document* document) { } - - // Called when the active cel's image pixels were modified. - virtual void onModifyCelImage(Document* document) { } + virtual void onImageReplaced(DocumentEvent& ev) { } + virtual void onImagePixelsModified(DocumentEvent& ev) { } // Called to destroy the observer. (Here you could call "delete this".) virtual void dispose() { } diff --git a/src/undo_transaction.cpp b/src/undo_transaction.cpp index f9a40d781..395a5b65d 100644 --- a/src/undo_transaction.cpp +++ b/src/undo_transaction.cpp @@ -22,6 +22,7 @@ #include "base/unique_ptr.h" #include "document.h" +#include "document_event.h" #include "document_observer.h" #include "document_undo.h" #include "raster/algorithm/flip_image.h" @@ -205,6 +206,9 @@ void UndoTransaction::setSpriteSize(int w, int h) m_undo->pushUndoer(new undoers::SetSpriteSize(m_undo->getObjects(), m_sprite)); m_sprite->setSize(w, h); + + DocumentEvent ev(m_document, m_sprite); + m_document->notifyObservers(&DocumentObserver::onSpriteSizeChanged, ev); } void UndoTransaction::cropSprite(const gfx::Rect& bounds, int bgcolor) @@ -368,6 +372,9 @@ void UndoTransaction::replaceStockImage(int image_index, Image* new_image) // destroy the old image image_free(old_image); + + DocumentEvent ev(m_document, m_sprite, NULL, NULL, new_image, image_index); + m_document->notifyObservers(&DocumentObserver::onImageReplaced, ev); } /** @@ -388,7 +395,8 @@ LayerImage* UndoTransaction::newLayer() // select the new layer setCurrentLayer(layer); - m_document->notifyObservers(&DocumentObserver::onAddLayer, m_document, layer); + DocumentEvent ev(m_document, m_sprite, layer); + m_document->notifyObservers(&DocumentObserver::onAddLayer, ev); return layer; } @@ -400,7 +408,8 @@ void UndoTransaction::removeLayer(Layer* layer) { ASSERT(layer); - m_document->notifyObservers(&DocumentObserver::onRemoveLayer, m_document, layer); + DocumentEvent ev(m_document, m_sprite, layer); + m_document->notifyObservers(&DocumentObserver::onRemoveLayer, ev); LayerFolder* parent = layer->get_parent(); @@ -438,6 +447,9 @@ void UndoTransaction::restackLayerAfter(Layer* layer, Layer* afterThis) m_undo->pushUndoer(new undoers::MoveLayer(m_undo->getObjects(), layer)); layer->get_parent()->stackLayer(layer, afterThis); + + DocumentEvent ev(m_document, m_sprite, layer); + m_document->notifyObservers(&DocumentObserver::onLayerRestacked, ev); } void UndoTransaction::cropLayer(Layer* layer, int x, int y, int w, int h, int bgcolor) @@ -694,7 +706,8 @@ void UndoTransaction::newFrame() // go to next frame (the new one) setCurrentFrame(newFrame); - m_document->notifyObservers(&DocumentObserver::onAddFrame, m_document, newFrame); + DocumentEvent ev(m_document, m_sprite, NULL, NULL, NULL, -1, newFrame); + m_document->notifyObservers(&DocumentObserver::onAddFrame, ev); } void UndoTransaction::newFrameForLayer(Layer* layer, FrameNumber frame) @@ -731,7 +744,8 @@ void UndoTransaction::removeFrame(FrameNumber frame) { ASSERT(frame >= 0); - m_document->notifyObservers(&DocumentObserver::onRemoveFrame, m_document, frame); + DocumentEvent ev(m_document, m_sprite, NULL, NULL, NULL, -1, frame); + m_document->notifyObservers(&DocumentObserver::onRemoveFrame, ev); // Remove cels from this frame (and displace one position backward // all next frames) @@ -818,6 +832,9 @@ void UndoTransaction::addCel(LayerImage* layer, Cel* cel) layer, cel)); layer->addCel(cel); + + DocumentEvent ev(m_document, m_sprite, layer, cel); + m_document->notifyObservers(&DocumentObserver::onAddCel, ev); } void UndoTransaction::removeCel(LayerImage* layer, Cel* cel) @@ -825,6 +842,9 @@ void UndoTransaction::removeCel(LayerImage* layer, Cel* cel) ASSERT(layer); ASSERT(cel); + DocumentEvent ev(m_document, m_sprite, layer, cel); + m_document->notifyObservers(&DocumentObserver::onRemoveCel, ev); + // find if the image that use the cel to remove, is used by // another cels bool used = false; @@ -861,6 +881,9 @@ void UndoTransaction::setCelFramePosition(Cel* cel, FrameNumber frame) m_undo->pushUndoer(new undoers::SetCelFrame(m_undo->getObjects(), cel)); cel->setFrame(frame); + + DocumentEvent ev(m_document, m_sprite, NULL, cel); + m_document->notifyObservers(&DocumentObserver::onCelFrameChanged, ev); } void UndoTransaction::setCelPosition(Cel* cel, int x, int y) @@ -871,6 +894,9 @@ void UndoTransaction::setCelPosition(Cel* cel, int x, int y) m_undo->pushUndoer(new undoers::SetCelPosition(m_undo->getObjects(), cel)); cel->setPosition(x, y); + + DocumentEvent ev(m_document, m_sprite, NULL, cel); + m_document->notifyObservers(&DocumentObserver::onCelPositionChanged, ev); } void UndoTransaction::setFrameDuration(FrameNumber frame, int msecs) @@ -880,6 +906,9 @@ void UndoTransaction::setFrameDuration(FrameNumber frame, int msecs) m_undo->getObjects(), m_sprite, frame)); m_sprite->setFrameDuration(frame, msecs); + + DocumentEvent ev(m_document, m_sprite, NULL, NULL, NULL, -1, frame); + m_document->notifyObservers(&DocumentObserver::onFrameDurationChanged, ev); } void UndoTransaction::setConstantFrameRate(int msecs)