]> git.sesse.net Git - kdenlive/blobdiff - src/titledocument.cpp
Title files (*.kdenlivetitle) stored as utf-8 instead of ascii now. http://www.kdenli...
[kdenlive] / src / titledocument.cpp
index ca30117bb178bfa2e58e658a051ac14a1c09a91d..9b5c58237fb507536c2781798364276ae0bdeacc 100644 (file)
  ***************************************************************************/
 #include "titledocument.h"
 #include <QGraphicsScene>
-#include <QDomDocument>
 #include <QDomElement>
 #include <QGraphicsItem>
 #include <QGraphicsRectItem>
 #include <QGraphicsTextItem>
+#include <QGraphicsSvgItem>
 #include <KDebug>
 #include <QFile>
 #include <KTemporaryFile>
@@ -34,12 +34,9 @@ void TitleDocument::setScene(QGraphicsScene* _scene) {
     scene = _scene;
 }
 
-bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv) {
+QDomDocument TitleDocument::xml(QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv) {
     QDomDocument doc;
 
-    if (!scene)
-        return false;
-
     QDomElement main = doc.createElement("kdenlivetitle");
     doc.appendChild(main);
 
@@ -50,6 +47,14 @@ bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv,
         QGraphicsTextItem *t;
 
         switch (item->type()) {
+        case 7:
+            e.setAttribute("type", "QGraphicsPixmapItem");
+            content.setAttribute("url", item->data(Qt::UserRole).toString());
+            break;
+        case 13:
+            e.setAttribute("type", "QGraphicsSvgItem");
+            content.setAttribute("url", item->data(Qt::UserRole).toString());
+            break;
         case 3:
             e.setAttribute("type", "QGraphicsRectItem");
             content.setAttribute("rect", rectFToString(((QGraphicsRectItem*)item)->rect()));
@@ -63,12 +68,12 @@ bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv,
             //content.appendChild(doc.createTextNode(((QGraphicsTextItem*)item)->toHtml()));
             content.appendChild(doc.createTextNode(t->toPlainText()));
             font = t->font();
-            e.setAttribute("font", font.family());
-            e.setAttribute("font-bold", font.bold());
-            e.setAttribute("font-size", font.pointSize());
-            e.setAttribute("font-italic", font.italic());
-            e.setAttribute("font-underline", font.underline());
-            e.setAttribute("font-color", colorToString(t->defaultTextColor()));
+            content.setAttribute("font", font.family());
+            content.setAttribute("font-bold", font.bold());
+            content.setAttribute("font-size", font.pointSize());
+            content.setAttribute("font-italic", font.italic());
+            content.setAttribute("font-underline", font.underline());
+            content.setAttribute("font-color", colorToString(t->defaultTextColor()));
             break;
         default:
             continue;
@@ -108,31 +113,48 @@ bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv,
         main.appendChild(endp);
     }
     QDomElement backgr = doc.createElement("background");
-    QList<QGraphicsItem *> items = scene->items();
+    QColor color = getBackgroundColor();
+    backgr.setAttribute("color", colorToString(color));
+    main.appendChild(backgr);
+
+    return doc;
+}
+
+/** \brief Get the background color (incl. alpha) from the document, if possibly
+  * \returns The background color of the document, inclusive alpha. If none found, returns (0,0,0,0) */
+QColor TitleDocument::getBackgroundColor() {
     QColor color(0, 0, 0, 0);
-    for (int i = 0; i < items.size(); i++) {
-        if (items.at(i)->zValue() == -1100) {
-            color = ((QGraphicsRectItem *)items.at(i))->brush().color();
-            break;
+    if (scene) {
+        QList<QGraphicsItem *> items = scene->items();
+        for (int i = 0; i < items.size(); i++) {
+            if (items.at(i)->zValue() == -1100) {
+                color = ((QGraphicsRectItem *)items.at(i))->brush().color();
+                return color;
+            }
         }
     }
-    backgr.setAttribute("color", colorToString(color));
-    main.appendChild(backgr);
+    return color;
+}
+
 
+bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv) {
+    if (!scene)
+        return false;
+
+    QDomDocument doc = xml(startv, endv);
     KTemporaryFile tmpfile;
     if (!tmpfile.open()) kWarning() << "/////  CANNOT CREATE TMP FILE in: " << tmpfile.fileName();
     QFile xmlf(tmpfile.fileName());
     xmlf.open(QIODevice::WriteOnly);
-    xmlf.write(doc.toString().toAscii());
+    xmlf.write(doc.toString().toUtf8());
     xmlf.close();
     kDebug() << KIO::NetAccess::upload(tmpfile.fileName(), url, 0);
-
+    return true;
 }
 
-int TitleDocument::loadDocument(const KUrl& url , QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv) {
+int TitleDocument::loadDocument(const KUrl& url, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv) {
     QString tmpfile;
     QDomDocument doc;
-    int maxZValue = 0;
     double aspect_ratio = 4.0 / 3.0;
     if (!scene)
         return -1;
@@ -145,58 +167,78 @@ int TitleDocument::loadDocument(const KUrl& url , QGraphicsPolygonItem* startv,
         } else
             return -1;
         KIO::NetAccess::removeTempFile(tmpfile);
-        QDomNodeList titles = doc.elementsByTagName("kdenlivetitle");
-        if (titles.size()) {
+        return loadFromXml(doc, startv, endv);
+    }
+}
 
-            QDomNodeList items = titles.item(0).childNodes();
-            for (int i = 0;i < items.count();i++) {
-                QGraphicsItem *gitem = NULL;
-                kDebug() << items.item(i).attributes().namedItem("type").nodeValue();
-                int zValue = items.item(i).attributes().namedItem("z-index").nodeValue().toInt();
-                if (zValue > -1000)
-                    if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsTextItem") {
-                        QFont font(items.item(i).attributes().namedItem("font").nodeValue());
-                        font.setBold(items.item(i).attributes().namedItem("font-bold").nodeValue().toInt());
-                        font.setItalic(items.item(i).attributes().namedItem("font-italic").nodeValue().toInt());
-                        font.setUnderline(items.item(i).attributes().namedItem("font-underline").nodeValue().toInt());
-                        font.setPointSize(items.item(i).attributes().namedItem("font-size").nodeValue().toInt());
-                        QColor col(stringToColor(items.item(i).attributes().namedItem("font-color").nodeValue()));
-                        QGraphicsTextItem *txt = scene->addText(items.item(i).namedItem("content").firstChild().nodeValue(), font);
-                        txt->setDefaultTextColor(col);
-                        txt->setTextInteractionFlags(Qt::NoTextInteraction);
-                        gitem = txt;
+int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv) {
+    QDomNodeList titles = doc.elementsByTagName("kdenlivetitle");
+    int maxZValue = 0;
+    if (titles.size()) {
+
+        QDomNodeList items = titles.item(0).childNodes();
+        for (int i = 0;i < items.count();i++) {
+            QGraphicsItem *gitem = NULL;
+            kDebug() << items.item(i).attributes().namedItem("type").nodeValue();
+            int zValue = items.item(i).attributes().namedItem("z-index").nodeValue().toInt();
+            if (zValue > -1000)
+                if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsTextItem") {
+                    QFont font(items.item(i).namedItem("content").attributes().namedItem("font").nodeValue());
+                    font.setBold(items.item(i).namedItem("content").attributes().namedItem("font-bold").nodeValue().toInt());
+                    font.setItalic(items.item(i).namedItem("content").attributes().namedItem("font-italic").nodeValue().toInt());
+                    font.setUnderline(items.item(i).namedItem("content").attributes().namedItem("font-underline").nodeValue().toInt());
+                    font.setPointSize(items.item(i).namedItem("content").attributes().namedItem("font-size").nodeValue().toInt());
+                    QColor col(stringToColor(items.item(i).namedItem("content").attributes().namedItem("font-color").nodeValue()));
+                    QGraphicsTextItem *txt = scene->addText(items.item(i).namedItem("content").firstChild().nodeValue(), font);
+                    txt->setDefaultTextColor(col);
+                    txt->setTextInteractionFlags(Qt::NoTextInteraction);
+                    gitem = txt;
+                } else
+                    if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsRectItem") {
+                        QString rect = items.item(i).namedItem("content").attributes().namedItem("rect").nodeValue();
+                        QString br_str = items.item(i).namedItem("content").attributes().namedItem("brushcolor").nodeValue();
+                        QString pen_str = items.item(i).namedItem("content").attributes().namedItem("pencolor").nodeValue();
+                        double penwidth = items.item(i).namedItem("content").attributes().namedItem("penwidth").nodeValue().toDouble();
+                        QGraphicsRectItem *rec = scene->addRect(stringToRect(rect), QPen(QBrush(stringToColor(pen_str)), penwidth), QBrush(stringToColor(br_str)));
+                        gitem = rec;
                     } else
-                        if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsRectItem") {
-                            QString rect = items.item(i).namedItem("content").attributes().namedItem("rect").nodeValue();
-                            QString br_str = items.item(i).namedItem("content").attributes().namedItem("brushcolor").nodeValue();
-                            QString pen_str = items.item(i).namedItem("content").attributes().namedItem("pencolor").nodeValue();
-                            double penwidth = items.item(i).namedItem("content").attributes().namedItem("penwidth").nodeValue().toDouble();
-                            QGraphicsRectItem *rec = scene->addRect(stringToRect(rect), QPen(QBrush(stringToColor(pen_str)), penwidth), QBrush(stringToColor(br_str)));
+                        if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsPixmapItem") {
+                            QString url = items.item(i).namedItem("content").attributes().namedItem("url").nodeValue();
+                            QPixmap pix(url);
+                            QGraphicsPixmapItem *rec = scene->addPixmap(pix);
+                            rec->setData(Qt::UserRole, url);
                             gitem = rec;
-                        }
-                //pos and transform
-                if (gitem) {
-                    QPointF p(items.item(i).namedItem("position").attributes().namedItem("x").nodeValue().toDouble(),
-                              items.item(i).namedItem("position").attributes().namedItem("y").nodeValue().toDouble());
-                    gitem->setPos(p);
-                    gitem->setTransform(stringToTransform(items.item(i).namedItem("position").firstChild().firstChild().nodeValue()));
-                    int zValue = items.item(i).attributes().namedItem("z-index").nodeValue().toInt();
-                    if (zValue > maxZValue) maxZValue = zValue;
-                    gitem->setZValue(zValue);
-                    gitem->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
-                }
-                if (items.item(i).nodeName() == "background") {
-                    kDebug() << items.item(i).attributes().namedItem("color").nodeValue();
-                    QColor color = QColor(stringToColor(items.item(i).attributes().namedItem("color").nodeValue()));
-                    //color.setAlpha(items.item(i).attributes().namedItem("alpha").nodeValue().toInt());
-                    QList<QGraphicsItem *> items = scene->items();
-                    for (int i = 0; i < items.size(); i++) {
-                        if (items.at(i)->zValue() == -1100) {
-                            ((QGraphicsRectItem *)items.at(i))->setBrush(QBrush(color));
-                            break;
-                        }
+                        } else
+                            if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsSvgItem") {
+                                QString url = items.item(i).namedItem("content").attributes().namedItem("url").nodeValue();
+                                QGraphicsSvgItem *rec = new QGraphicsSvgItem(url);
+                                scene->addItem(rec);
+                                rec->setData(Qt::UserRole, url);
+                                gitem = rec;
+                            }
+            //pos and transform
+            if (gitem) {
+                QPointF p(items.item(i).namedItem("position").attributes().namedItem("x").nodeValue().toDouble(),
+                          items.item(i).namedItem("position").attributes().namedItem("y").nodeValue().toDouble());
+                gitem->setPos(p);
+                gitem->setTransform(stringToTransform(items.item(i).namedItem("position").firstChild().firstChild().nodeValue()));
+                int zValue = items.item(i).attributes().namedItem("z-index").nodeValue().toInt();
+                if (zValue > maxZValue) maxZValue = zValue;
+                gitem->setZValue(zValue);
+                gitem->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+            }
+            if (items.item(i).nodeName() == "background") {
+                kDebug() << items.item(i).attributes().namedItem("color").nodeValue();
+                QColor color = QColor(stringToColor(items.item(i).attributes().namedItem("color").nodeValue()));
+                //color.setAlpha(items.item(i).attributes().namedItem("alpha").nodeValue().toInt());
+                QList<QGraphicsItem *> items = scene->items();
+                for (int i = 0; i < items.size(); i++) {
+                    if (items.at(i)->zValue() == -1100) {
+                        ((QGraphicsRectItem *)items.at(i))->setBrush(QBrush(color));
+                        break;
                     }
-                } /*else if (items.item(i).nodeName() == "startviewport" && startv) {
+                }
+            } /*else if (items.item(i).nodeName() == "startviewport" && startv) {
                     QPointF p(items.item(i).attributes().namedItem("x").nodeValue().toDouble(), items.item(i).attributes().namedItem("y").nodeValue().toDouble());
                     double width = items.item(i).attributes().namedItem("size").nodeValue().toDouble();
                     QRectF rect(-width, -width / aspect_ratio, width*2.0, width / aspect_ratio*2.0);
@@ -211,7 +253,6 @@ int TitleDocument::loadDocument(const KUrl& url , QGraphicsPolygonItem* startv,
                     endv->setPolygon(rect);
                     endv->setPos(p);
                 }*/
-            }
         }
     }
     return maxZValue;