[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdegraphics/gwenview
From:       Aurélien Gâteau <aurelien.gateau () free ! fr>
Date:       2007-06-30 22:54:26
Message-ID: 1183244066.539403.1964.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 681947 by gateau:

Finished implementation of Document::modified property.


 M  +1 -1      lib/abstractdocumentimpl.cpp  
 M  +2 -0      lib/abstractdocumentimpl.h  
 M  +23 -2     lib/document.cpp  
 M  +14 -1     lib/document.h  
 M  +5 -0      lib/documentloadedimpl.cpp  
 M  +1 -0      lib/documentloadedimpl.h  
 M  +4 -0      lib/emptydocumentimpl.cpp  
 M  +1 -0      lib/emptydocumentimpl.h  
 M  +8 -0      lib/jpegdocumentloadedimpl.cpp  
 M  +1 -0      lib/jpegdocumentloadedimpl.h  
 M  +6 -1      lib/loadingdocumentimpl.cpp  
 M  +1 -0      lib/loadingdocumentimpl.h  
 M  +20 -0     tests/documenttest.cpp  
 M  +1 -0      tests/documenttest.h  


--- trunk/KDE/kdegraphics/gwenview/lib/abstractdocumentimpl.cpp #681946:681947
@@ -57,7 +57,7 @@
 
 
 void AbstractDocumentImpl::setDocumentImage(const QImage& image) {
-	d->mDocument->setImage(image);
+	d->mDocument->setImageInternal(image);
 }
 
 
--- trunk/KDE/kdegraphics/gwenview/lib/abstractdocumentimpl.h #681946:681947
@@ -53,6 +53,8 @@
 
 	virtual Document::SaveResult save(const KUrl&, const QByteArray& format) = 0;
 
+	virtual void setImage(const QImage&) = 0;
+
 Q_SIGNALS:
 	void loaded();
 
--- trunk/KDE/kdegraphics/gwenview/lib/document.cpp #681946:681947
@@ -38,6 +38,7 @@
 	KUrl mUrl;
 	QImage mImage;
 	QByteArray mFormat;
+	bool mModified;
 };
 
 
@@ -45,6 +46,7 @@
 : QObject()
 , d(new DocumentPrivate) {
     d->mImpl = new EmptyDocumentImpl(this);
+	d->mModified = false;
 }
 
 
@@ -83,6 +85,16 @@
 
 
 void Document::setImage(const QImage& image) {
+	// Don't init mImage directly, because:
+	// - This should not be called until document has finished loading.
+	// - Some impl will want to do special stuff (ex: jpegloaded implementation will
+	// switch to loaded implementation since it won't hold valid raw data
+	// anymore)
+	d->mImpl->setImage(image);
+}
+
+
+void Document::setImageInternal(const QImage& image) {
 	d->mImage = image;
 }
 
@@ -95,7 +107,12 @@
 	while (!isLoaded()) {
 		qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
 	}
-	return d->mImpl->save(url, format.toAscii());
+	Document::SaveResult result = d->mImpl->save(url, format.toAscii());
+	if (result == SR_OK) {
+		d->mModified = false;
+	}
+
+	return result;
 }
 
 QByteArray Document::format() const {
@@ -107,7 +124,11 @@
 }
 
 bool Document::isModified() const {
-	return false;
+	return d->mModified;
 }
 
+void Document::setModified(bool modified) {
+	d->mModified = modified;
+}
+
 } // namespace
--- trunk/KDE/kdegraphics/gwenview/lib/document.h #681946:681947
@@ -57,8 +57,21 @@
 
 	bool isModified() const;
 
+	/**
+	 * Mark the image as modified. Should be called when image pixels have been
+	 * altered outside Document.
+	 */
+	void setModified(bool modified);
+
 	QImage& image();
 
+	/**
+	 * Replaces the current image with image.
+	 * Calling this while the document is loaded won't do anything.
+	 * isModified() will return true after this.
+	 */
+	void setImage(const QImage& image);
+
 	KUrl url() const;
 
 	SaveResult save(const KUrl& url, const QString& format);
@@ -72,7 +85,7 @@
 	friend class DocumentFactory;
 	friend class AbstractDocumentImpl;
 
-	void setImage(const QImage&);
+	void setImageInternal(const QImage&);
 	void setFormat(const QByteArray&);
 	void switchToImpl(AbstractDocumentImpl* impl);
 
--- trunk/KDE/kdegraphics/gwenview/lib/documentloadedimpl.cpp #681946:681947
@@ -84,4 +84,9 @@
 }
 
 
+void DocumentLoadedImpl::setImage(const QImage& image) {
+	setDocumentImage(image);
+	document()->setModified(true);
+}
+
 } // namespace
--- trunk/KDE/kdegraphics/gwenview/lib/documentloadedimpl.h #681946:681947
@@ -42,6 +42,7 @@
 	virtual void init();
 	virtual bool isLoaded() const;
 	virtual Document::SaveResult save(const KUrl&, const QByteArray& format);
+	virtual void setImage(const QImage&);
 
 protected:
 	virtual bool saveInternal(QIODevice* device, const QByteArray& format);
--- trunk/KDE/kdegraphics/gwenview/lib/emptydocumentimpl.cpp #681946:681947
@@ -49,4 +49,8 @@
 	return Document::SR_OtherError;
 }
 
+void EmptyDocumentImpl::setImage(const QImage&) {
+	// Don't do anything for now, but we could imagine switching to loaded impl
+}
+
 } // namespace
--- trunk/KDE/kdegraphics/gwenview/lib/emptydocumentimpl.h #681946:681947
@@ -38,6 +38,7 @@
 	virtual void init();
 	virtual bool isLoaded() const;
 	virtual Document::SaveResult save(const KUrl&, const QByteArray& format);
+	virtual void setImage(const QImage&);
 };
 
 
--- trunk/KDE/kdegraphics/gwenview/lib/jpegdocumentloadedimpl.cpp #681946:681947
@@ -57,4 +57,12 @@
 	}
 }
 
+
+void JpegDocumentLoadedImpl::setImage(const QImage& image) {
+	DocumentLoadedImpl::setImage(image);
+	// mData is no longer relevant, so we'd better switch to a normal loaded
+	// impl
+	switchToImpl(new DocumentLoadedImpl(document()));
+}
+
 } // namespace
--- trunk/KDE/kdegraphics/gwenview/lib/jpegdocumentloadedimpl.h #681946:681947
@@ -38,6 +38,7 @@
 public:
 	JpegDocumentLoadedImpl(Document*, const QByteArray& data);
 	~JpegDocumentLoadedImpl();
+	virtual void setImage(const QImage&);
 
 protected:
 	virtual bool saveInternal(QIODevice* device, const QByteArray& format);
--- trunk/KDE/kdegraphics/gwenview/lib/loadingdocumentimpl.cpp #681946:681947
@@ -31,7 +31,8 @@
 #include <QThread>
 
 // KDE
-#include <KUrl>
+#include <kdebug.h>
+#include <kurl.h>
 
 // Local
 #include "document.h"
@@ -149,4 +150,8 @@
 	return Document::SR_OtherError;
 }
 
+void LoadingDocumentImpl::setImage(const QImage&) {
+	kWarning() << k_funcinfo << " should not be called\n";
+}
+
 } // namespace
--- trunk/KDE/kdegraphics/gwenview/lib/loadingdocumentimpl.h #681946:681947
@@ -41,6 +41,7 @@
 	virtual void init();
 	virtual bool isLoaded() const;
 	virtual Document::SaveResult save(const KUrl&, const QByteArray& format);
+	virtual void setImage(const QImage&);
 
 private Q_SLOTS:
 	void slotImageLoaded();
--- trunk/KDE/kdegraphics/gwenview/tests/documenttest.cpp #681946:681947
@@ -122,3 +122,23 @@
 	QByteArray resultData = resultFile.readAll();
 	QCOMPARE(originalData, resultData);
 }
+
+void DocumentTest::testModify() {
+	KUrl url("orient6.jpg");
+	Document::Ptr doc = DocumentFactory::instance()->load(url);
+	while (!doc->isLoaded()) {
+		QTest::qWait(30);
+	}
+	QVERIFY(!doc->isModified());
+
+	QImage image(10, 10, QImage::Format_ARGB32);
+	image.fill(QColor(Qt::white).rgb());
+
+	doc->setImage(image);
+	QVERIFY(doc->isModified());
+
+	KUrl destUrl(QDir::currentPath() + "/modify.png");
+	QCOMPARE(doc->save(destUrl, "png"), Document::SR_OK);
+
+	QVERIFY(!doc->isModified());
+}
--- trunk/KDE/kdegraphics/gwenview/tests/documenttest.h #681946:681947
@@ -30,4 +30,5 @@
 	void testMultipleLoads();
 	void testSave();
 	void testLosslessSave();
+	void testModify();
 };
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic