Database: sqlite default to appdata kworship.db
[kworship.git] / kworship / playlist / KwPlaylistItem.cpp
blob5e2651e60645fe4d7a9ec027f4770c15b38c7241
1 /***************************************************************************
2 * This file is part of KWorship. *
3 * Copyright 2008 James Hogan <james@albanarts.com> *
4 * *
5 * KWorship is free software: you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation, either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * KWorship is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with KWorship. If not, write to the Free Software Foundation, *
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ***************************************************************************/
20 /**
21 * @file KwPlaylistItem.cpp
22 * @brief An item that can be added to a playlist.
23 * @author James Hogan <james@albanarts.com>
26 #include "KwPlaylistItem.h"
27 #include "KwPlaylistUnknown.h"
28 #include "KwResourceLink.h"
29 #include <KwDisplayStyles.h>
31 #include <QDomDocument>
32 #include <QDomElement>
35 * Item factory
38 /// Get a factory object.
39 KwPlaylistItem::Factory* KwPlaylistItem::factory()
41 static Factory fac;
42 return &fac;
46 * Constructors + destructor.
49 /// Default constructor.
50 KwPlaylistItem::KwPlaylistItem()
51 : KwFilterObject()
52 , KwCssScope(KwDisplayStyles::schema())
53 , m_domDocument()
54 , m_domPreserve(m_domDocument.createDocumentFragment())
58 /// Construct from a DOM element.
59 KwPlaylistItem::KwPlaylistItem(const QDomElement& element, KwResourceManager* resourceManager)
60 : KwCssScope(KwDisplayStyles::schema())
61 , m_domDocument()
62 , m_domPreserve(m_domDocument.createDocumentFragment())
64 // Import the children of element into m_domPreserve
65 QDomNodeList children = element.childNodes();
66 for (int i = 0; i < children.size(); ++i)
68 QDomNode child = children.item(i);
69 if (child.isElement())
71 QDomElement childElement = child.toElement();
72 if (childElement.tagName() == "resource")
74 QString name = childElement.attribute("name");
75 if (!name.isEmpty())
77 setResource(name, new KwResourceLink(childElement, resourceManager));
78 // Don't preserve this resource
79 continue;
82 else if (childElement.tagName() == "style")
84 importStylesFromDom(childElement, resourceManager);
85 continue;
88 QDomNode preserved = m_domDocument.importNode(child, true); // deep copy
89 m_domPreserve.appendChild(preserved);
93 /// Destructor.
94 KwPlaylistItem::~KwPlaylistItem()
96 // Delete resource links
97 Resources::iterator it;
98 for (it = m_resources.begin(); it != m_resources.end(); ++it)
100 delete (*it).link;
105 * DOM Translation.
108 /// Create an item from a DOM element.
109 KwPlaylistItem* KwPlaylistItem::createFromDom(const QDomElement& element, KwResourceManager* resourceManager)
111 // Look at the type
112 QString type = element.attribute("type");
113 KwPlaylistItem* item = factory()->construct(type, element, resourceManager);
114 if (0 == item)
116 item = new KwPlaylistUnknown(element, resourceManager);
118 return item;
121 /// Export this item to the DOM.
122 void KwPlaylistItem::exportToDom(QDomDocument& document, QDomElement& element, KwResourceManager* resourceManager) const
124 // Add an item element with type attribute and child elements determined by type
125 QDomElement itemElement = document.createElement("playlist_item");
126 element.appendChild(itemElement);
127 QString type = itemType();
128 itemElement.setAttribute("type", type);
130 if (!isScopeEmpty())
132 QDomElement styleElem = document.createElement("style");
133 itemElement.appendChild(styleElem);
134 exportStylesToDom(document, styleElem, resourceManager);
137 exportDetailsToDom(document, itemElement, resourceManager);
139 // Export resources after type specific stuff so they can be modified at the last minute
140 Resources::const_iterator it;
141 for (it = m_resources.constBegin(); it != m_resources.constEnd(); ++it)
143 if (!(*it).link->isNull())
145 QDomElement resourceElement = document.createElement("resource");
146 resourceElement.setAttribute("name", (*it).name);
147 itemElement.appendChild(resourceElement);
149 (*it).link->exportToDom(document, resourceElement, resourceManager);
153 // Add preserve elements as well
154 QDomNode importedFragment = document.importNode(m_domPreserve, true);
155 itemElement.appendChild(importedFragment);
159 * Protected methods
162 /// Indicate that elements of a particular tag name have been handled.
163 void KwPlaylistItem::elementsHandled(const QString& tagName)
165 QDomElement current = m_domPreserve.firstChildElement(tagName);
166 while (!current.isNull())
168 m_domPreserve.removeChild(current);
169 current = current.nextSiblingElement(tagName);
173 /// Indicate that the first elements of a particular tag name have been handled.
174 void KwPlaylistItem::elementHandled(const QString& tagName)
176 QDomElement current = m_domPreserve.firstChildElement(tagName);
177 if (!current.isNull())
179 m_domPreserve.removeChild(current);
183 /// Get a resource by name.
184 KwResourceLink* KwPlaylistItem::getResource(const QString& name, bool create)
186 Resources::iterator it;
187 for (it = m_resources.begin(); it != m_resources.end(); ++it)
189 if ((*it).name == name)
191 return (*it).link;
194 if (create)
196 Resource resource = { name, new KwResourceLink };
197 m_resources.push_back(resource);
198 return resource.link;
200 return 0;
203 /// Set a resource associated with a name.
204 KwResourceLink* KwPlaylistItem::setResource(const QString& name, KwResourceLink* link)
206 deleteResource(name);
207 Resource resource = { name, link };
208 m_resources.push_back(resource);
209 return link;
212 /// Delete a resource.
213 void KwPlaylistItem::deleteResource(const QString& name)
215 Resources::iterator it;
216 for (it = m_resources.begin(); it != m_resources.end(); ++it)
218 if ((*it).name == name)
220 delete (*it).link;
221 m_resources.erase(it);