r14706 by fschmid - Vector Import Plugins: more previews in the Fileselectors for vector images, added them for ODG and SXD.

scribus-commit scribus-commit at lists.scribus.net
Sat Feb 13 12:00:25 CET 2010


Revision: 14706
Author: fschmid
Date: 2010-02-13T10:53:50.916109Z
Commit message: Vector Import Plugins: more previews in the Fileselectors for vector images, added them for ODG and SXD.

Changeset: 
M  /trunk/Scribus/scribus/plugins/fileloader/oodraw/oodrawimp.h
M  /trunk/Scribus/scribus/plugins/fileloader/oodraw/oodrawimp.cpp

Diffs:
Index: scribus/plugins/fileloader/oodraw/oodrawimp.cpp
===================================================================
--- scribus/plugins/fileloader/oodraw/oodrawimp.cpp	(revision 14705)
+++ scribus/plugins/fileloader/oodraw/oodrawimp.cpp	(revision 14706)
@@ -132,6 +132,7 @@
 	odtformat.fileExtensions = QStringList() << "odg";
 	odtformat.load = true;
 	odtformat.save = false;
+	odtformat.thumb = true;
 	odtformat.mimeTypes = QStringList("application/vnd.oasis.opendocument.graphics"); // MIME types
 	odtformat.priority = 64; // Priority
 	registerFormat(odtformat);
@@ -145,6 +146,7 @@
 	sxdformat.fileExtensions = QStringList() << "sxd";
 	sxdformat.load = true;
 	sxdformat.save = false;
+	sxdformat.thumb = true;
 	sxdformat.mimeTypes = QStringList("application/vnd.sun.xml.draw"); // MIME types
 	sxdformat.priority = 64; // Priority
 	registerFormat(sxdformat);
@@ -214,6 +216,26 @@
 	return importDone;
 }
 
+QImage OODrawImportPlugin::readThumbnail(const QString& fileName)
+{
+	bool wasUndo = false;
+	if( fileName.isEmpty() )
+		return QImage();
+	if (UndoManager::undoEnabled())
+	{
+		UndoManager::instance()->setUndoEnabled(false);
+		wasUndo = true;
+	}
+	m_Doc = NULL;
+	OODPlug *dia = new OODPlug(m_Doc);
+	Q_CHECK_PTR(dia);
+	QImage ret = dia->readThumbnail(fileName);
+	if (wasUndo)
+		UndoManager::instance()->setUndoEnabled(true);
+	delete dia;
+	return ret;
+}
+
 OODPlug::OODPlug(ScribusDoc* doc)
 {
 	m_Doc=doc;
@@ -225,6 +247,196 @@
 	tmpSel=new Selection(this, false);
 }
 
+QImage OODPlug::readThumbnail(QString fileName )
+{
+	QByteArray f, f2, f3;
+	if ( !QFile::exists(fileName) )
+		return QImage();
+	FileUnzip* fun = new FileUnzip(fileName);
+	stylePath   = fun->getFile("styles.xml");
+	contentPath = fun->getFile("content.xml");
+	metaPath = fun->getFile("meta.xml");
+	delete fun;
+	// Qt4 NULL -> isNull()
+	if ((!stylePath.isNull()) && (!contentPath.isNull()))
+	{
+		HaveMeta = false;
+		QString docname = fileName.right(fileName.length() - fileName.lastIndexOf("/") - 1);
+		docname = docname.left(docname.lastIndexOf("."));
+		loadRawText(stylePath, f);
+		if(!inpStyles.setContent(f))
+			return QImage();
+		loadRawText(contentPath, f2);
+		if(!inpContents.setContent(f2))
+			return QImage();
+		QFile::remove(stylePath);
+		QFile::remove(contentPath);
+		HaveMeta = false;
+		if (!metaPath.isEmpty())
+		{
+			loadRawText(metaPath, f3);
+			HaveMeta = inpMeta.setContent(f3);
+			QFile::remove(f3);
+		}
+	}
+	else if ((stylePath.isNull()) && (!contentPath.isNull()))
+	{
+		QFile f2(contentPath);
+		f2.remove();
+	}
+	else if ((!stylePath.isNull()) && (contentPath.isNull()))
+	{
+		QFile f1(stylePath);
+		f1.remove();
+	}
+	QString CurDirP = QDir::currentPath();
+	QFileInfo efp(fileName);
+	QDir::setCurrent(efp.path());
+	bool isOODraw2 = false;
+	QDomNode drawPagePNode;
+	QList<PageItem*> Elements;
+	createStyleMap( inpStyles );
+	QDomElement docElem = inpContents.documentElement();
+	QDomNode automaticStyles = docElem.namedItem( "office:automatic-styles" );
+	if( !automaticStyles.isNull() )
+		insertStyles( automaticStyles.toElement() );
+	QDomNode body = docElem.namedItem( "office:body" );
+	QDomNode drawPage = body.namedItem( "draw:page" );
+	if ( drawPage.isNull() )
+	{
+		QDomNode offDraw = body.namedItem( "office:drawing" );
+		drawPage = offDraw.namedItem( "draw:page" );
+		if (drawPage.isNull())
+			return QImage();
+		else
+		{
+			isOODraw2 = true;
+			drawPagePNode = body.namedItem( "office:drawing" );
+		}
+	}
+	else 
+		drawPagePNode = body;
+	StyleStack::Mode mode = isOODraw2 ? StyleStack::OODraw2x : StyleStack::OODraw1x;
+	m_styleStack.setMode( mode );
+	QDomElement dp = drawPage.toElement();
+	QDomElement *master = m_styles[dp.attribute( "draw:master-page-name" )];
+	QDomElement *style = NULL;
+	QDomElement properties;
+	if (isOODraw2)
+	{
+		style = m_styles.value(master->attribute( "style:page-layout-name" ), NULL);
+		if (style)
+			properties = style->namedItem("style:page-layout-properties" ).toElement();
+	}
+	else
+	{
+		style = m_styles.value(master->attribute( "style:page-master-name" ), NULL);
+		if (style)
+			properties = style->namedItem( "style:properties" ).toElement();
+	}
+	double width = !properties.attribute( "fo:page-width" ).isEmpty() ? parseUnit(properties.attribute( "fo:page-width" ) ) : 550.0;
+	double height = !properties.attribute( "fo:page-height" ).isEmpty() ? parseUnit(properties.attribute( "fo:page-height" ) ) : 841.0;
+	m_Doc = new ScribusDoc();
+	m_Doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
+	m_Doc->setPage(width, height, 0, 0, 0, 0, 0, 0, false, false);
+	m_Doc->addPage(0);
+	m_Doc->setGUI(false, ScCore->primaryMainWindow(), 0);
+	Elements.clear();
+	m_Doc->setLoading(true);
+	m_Doc->DoDrawing = false;
+	m_Doc->scMW()->ScriptRunning = true;
+	if (!m_Doc->PageColors.contains("Black"))
+		m_Doc->PageColors.insert("Black", ScColor(0, 0, 0, 255));
+	QDomNode drawPag = drawPagePNode.firstChild();
+	QDomElement dpg = drawPag.toElement();
+	m_styleStack.clear();
+	fillStyleStack( dpg );
+	QList<PageItem*> el = parseGroup( dpg );
+	for (int ec = 0; ec < el.count(); ++ec)
+		Elements.append(el.at(ec));
+	tmpSel->clear();
+	if (Elements.count() > 0)
+	{
+		bool isGroup = true;
+		int firstElem = -1;
+		if (Elements.at(0)->Groups.count() != 0)
+			firstElem = Elements.at(0)->Groups.top();
+		for (int bx = 0; bx < Elements.count(); ++bx)
+		{
+			PageItem* bxi = Elements.at(bx);
+			if (bxi->Groups.count() != 0)
+			{
+				if (bxi->Groups.top() != firstElem)
+					isGroup = false;
+			}
+			else
+				isGroup = false;
+		}
+		if (!isGroup)
+		{
+			double minx = 99999.9;
+			double miny = 99999.9;
+			double maxx = -99999.9;
+			double maxy = -99999.9;
+			uint lowestItem = 999999;
+			uint highestItem = 0;
+			for (int a = 0; a < Elements.count(); ++a)
+			{
+				Elements.at(a)->Groups.push(m_Doc->GroupCounter);
+				PageItem* currItem = Elements.at(a);
+				lowestItem = qMin(lowestItem, currItem->ItemNr);
+				highestItem = qMax(highestItem, currItem->ItemNr);
+				double x1, x2, y1, y2;
+				currItem->getVisualBoundingRect(&x1, &y1, &x2, &y2);
+				minx = qMin(minx, x1);
+				miny = qMin(miny, y1);
+				maxx = qMax(maxx, x2);
+				maxy = qMax(maxy, y2);
+			}
+			double gx = minx;
+			double gy = miny;
+			double gw = maxx - minx;
+			double gh = maxy - miny;
+			PageItem *high = m_Doc->Items->at(highestItem);
+			int z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, gx, gy, gw, gh, 0, m_Doc->itemToolPrefs.shapeFillColor, m_Doc->itemToolPrefs.shapeLineColor, true);
+			PageItem *neu = m_Doc->Items->takeAt(z);
+			m_Doc->Items->insert(lowestItem, neu);
+			neu->Groups.push(m_Doc->GroupCounter);
+			neu->setItemName( tr("Group%1").arg(neu->Groups.top()));
+			neu->AutoName = false;
+			neu->isGroupControl = true;
+			neu->groupsLastItem = high;
+			neu->setTextFlowMode(PageItem::TextFlowDisabled);
+			for (int a = 0; a < m_Doc->Items->count(); ++a)
+			{
+				m_Doc->Items->at(a)->ItemNr = a;
+			}
+			Elements.prepend(neu);
+			m_Doc->GroupCounter++;
+		}
+	}
+	m_Doc->DoDrawing = true;
+	m_Doc->m_Selection->delaySignalsOn();
+	for (int dre=0; dre<Elements.count(); ++dre)
+	{
+		tmpSel->addItem(Elements.at(dre), true);
+	}
+	tmpSel->setGroupRect();
+	double xs = tmpSel->width();
+	double ys = tmpSel->height();
+	double sc = 500.0 / qMax(xs, ys);
+	m_Doc->scaleGroup(sc, sc, true, tmpSel);
+	QImage tmpImage = Elements.at(0)->DrawObj_toImage();
+	tmpImage.setText("XSize", QString("%1").arg(xs));
+	tmpImage.setText("YSize", QString("%1").arg(ys));
+	m_Doc->m_Selection->delaySignalsOff();
+	m_Doc->scMW()->ScriptRunning = false;
+	m_Doc->setLoading(false);
+	delete m_Doc;
+	QDir::setCurrent(CurDirP);
+	return tmpImage;
+}
+
 bool OODPlug::import(QString fileName, const TransactionSettings& trSettings, int flags )
 {
 	bool importDone = false;
Index: scribus/plugins/fileloader/oodraw/oodrawimp.h
===================================================================
--- scribus/plugins/fileloader/oodraw/oodrawimp.h	(revision 14705)
+++ scribus/plugins/fileloader/oodraw/oodrawimp.h	(revision 14706)
@@ -33,6 +33,7 @@
 		virtual void languageChange();
 		virtual bool fileSupported(QIODevice* file, const QString & fileName=QString::null) const;
 		virtual bool loadFile(const QString & fileName, const FileFormat & fmt, int flags, int index = 0);
+		virtual QImage readThumbnail(const QString& fileName);
 		virtual void addToMainWindowMenu(ScribusMainWindow *) {};
 
 		// Special features - File->Import slot
@@ -98,6 +99,7 @@
 	bool importFailed;
 	bool importCanceled;
 	bool import(QString fName, const TransactionSettings& trSettings, int flags);
+	QImage readThumbnail(QString fn);
 	static double parseUnit(const QString &unit);
 
 protected:




More information about the scribus-commit mailing list