From e0f64f9330fc30553dc9d8dcf308079f5d391526 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sun, 7 Jan 2018 00:48:27 +0100 Subject: Added BookmarksModel TODO: Editing bookmarks TODO: Saving bookmarks BUG: Completer doesn't search through folders --- lib/bookmarks/xbel.cpp | 192 +++++++++---------------------------------------- 1 file changed, 35 insertions(+), 157 deletions(-) (limited to 'lib/bookmarks/xbel.cpp') diff --git a/lib/bookmarks/xbel.cpp b/lib/bookmarks/xbel.cpp index 523ed99..eeb019a 100644 --- a/lib/bookmarks/xbel.cpp +++ b/lib/bookmarks/xbel.cpp @@ -9,185 +9,63 @@ #include "xbel.h" #include -#include - -Xbel::Xbel(QTreeWidget *widget) +Xbel::Xbel(const QString &path) { - treeWidget = widget; - - QStyle *style = treeWidget->style(); - folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Normal, QIcon::On); - folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon), QIcon::Normal, QIcon::Off); - bookmarkIcon.addPixmap(style->standardPixmap(QStyle::SP_FileIcon)); + m_path = path; } -bool Xbel::read(const QString &xbel) +BookmarkItem *Xbel::read() { - // no file specified - if(xbel.isEmpty()) { - return false; + BookmarkItem *root = new BookmarkItem(BookmarkItem::Root, nullptr); + root->title = QObject::tr("Title"); + root->href = QObject::tr("href"); + + // if the path is empty, there is nothing to load + if(m_path.isEmpty()) { + return root; } - QFile file(xbel); + QFile file(m_path); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - // file cannot be opened - return false; + // file cannot be opened for reading + return root; } - xmlReader.setDevice(&file); + QXmlStreamReader xmlReader(&file); if(xmlReader.readNextStartElement()) { - if(xmlReader.name() == "xbel" && xmlReader.attributes().value("version") == "1.0") { - qDebug("valid xbel"); - readChildElements(0); - } else { - qDebug("invalid xbel"); - return false; + if(!(xmlReader.name() == "xbel" && xmlReader.attributes().value("version") == "1.0")) { + // invalid xbel + qWarning("Error parsing %s", qUtf8Printable(m_path)); + return root; } + readChildElements(xmlReader, root); } - return true; -} - -bool Xbel::write(const QString &xbel) -{ - // no file specified - if(xbel.isEmpty()) { - return false; - } - - QFile file(xbel); - if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - // file cannot be opened - qDebug("Cannot open xbel: %s", qUtf8Printable(xbel)); - return false; - } - - xmlWriter.setAutoFormatting(true); - xmlWriter.setDevice(&file); - - xmlWriter.writeStartDocument(); - xmlWriter.writeDTD(""); - xmlWriter.writeStartElement("xbel"); - xmlWriter.writeAttribute("version", "1.0"); - for(int i=0; itopLevelItemCount(); i++) { - writeItem(treeWidget->topLevelItem(i)); - } - - xmlWriter.writeEndDocument(); - - file.flush(); - file.close(); - return true; + return root; } -void Xbel::readChildElements(QTreeWidgetItem *parentItem) -{ - while(xmlReader.readNextStartElement()) { - if(xmlReader.name() == "title") { - readTitle(parentItem); - } else if(xmlReader.name() == "folder") { - QTreeWidgetItem *item = addFolder(parentItem); - item->setText(1, xmlReader.attributes().value("href").toString()); - readChildElements(item); - } else if(xmlReader.name() == "bookmark") { - QTreeWidgetItem *item = addBookmark(parentItem); - item->setText(1, xmlReader.attributes().value("href").toString()); - readChildElements(item); - } else if(xmlReader.name() == "separator") { - addSeparator(parentItem); - xmlReader.skipCurrentElement(); - } else { - xmlReader.skipCurrentElement(); - } - } -} -void Xbel::readTitle(QTreeWidgetItem *item) +void Xbel::readChildElements(QXmlStreamReader &reader, BookmarkItem *parentItem) { - item->setText(0, xmlReader.readElementText()); -} + while(reader.readNextStartElement()) { + if(reader.name() == "title") { + parentItem->title = reader.readElementText(); -QTreeWidgetItem *Xbel::addFolder(QTreeWidgetItem *parentItem) -{ - QTreeWidgetItem *folderItem = createChildItem(parentFolder(parentItem), "folder"); - //folderItem->setExpanded(xmlReader.attributes().value("folded") != "no"); - treeWidget->setItemExpanded(folderItem, xmlReader.attributes().value("folded") != "yes"); - folderItem->setFlags(folderItem->flags() | Qt::ItemIsEditable); - folderItem->setIcon(0, folderIcon); + } else if(reader.name() == "folder") { + BookmarkItem *item = new BookmarkItem(BookmarkItem::Folder, parentItem); + item->href = reader.attributes().value("href").toString(); + item->folded = reader.attributes().value("folded") == QLatin1String("yes"); + readChildElements(reader, item); - return folderItem; -} + } else if(reader.name() == "bookmark") { + BookmarkItem *item = new BookmarkItem(BookmarkItem::Bookmark, parentItem); + item->href = reader.attributes().value("href").toString(); + readChildElements(reader, item); -QTreeWidgetItem *Xbel::addBookmark(QTreeWidgetItem *parentItem) -{ - QTreeWidgetItem *bookmarkItem = createChildItem(parentFolder(parentItem), "bookmark"); - bookmarkItem->setFlags((bookmarkItem->flags() | Qt::ItemIsEditable) & ~Qt::ItemIsDropEnabled); - bookmarkItem->setIcon(0, bookmarkIcon); - bookmarkItem->setText(0, "Unknown Title"); - bookmarkItem->setText(1, "Unknown Address"); - - return bookmarkItem; -} - -void Xbel::addSeparator(QTreeWidgetItem *parentItem) -{ - QTreeWidgetItem *separatorItem = createChildItem(parentFolder(parentItem), "separator"); - separatorItem->setFlags(separatorItem->flags() & ~Qt::ItemIsDropEnabled); - separatorItem->setText(0, "-----"); -} - -QTreeWidgetItem *Xbel::parentFolder(QTreeWidgetItem *item) -{ - QTreeWidgetItem *parentItem = item; - - if(parentItem) { - while(parentItem->data(0, Qt::UserRole) != "folder") { - parentItem = parentItem->parent(); - if(parentItem == 0) { - break; - } - } - } - - return parentItem; -} - -QTreeWidgetItem *Xbel::createChildItem(QTreeWidgetItem *item, const QString &type) -{ - QTreeWidgetItem *childItem; - if(item) { - childItem = new QTreeWidgetItem(item); - } else { - childItem = new QTreeWidgetItem(treeWidget); - } - childItem->setData(0, Qt::UserRole, type); - return childItem; -} - -void Xbel::writeItem(QTreeWidgetItem *item) -{ - QString tagName = item->data(0, Qt::UserRole).toString(); - if (tagName == "folder") { - xmlWriter.writeStartElement(tagName); - if(!item->text(1).isEmpty()) { - xmlWriter.writeAttribute("href", item->text(1)); - } - xmlWriter.writeAttribute("folded", treeWidget->isItemExpanded(item) ? "no" : "yes"); - xmlWriter.writeTextElement("title", item->text(0)); - for (int i = 0; i < item->childCount(); ++i) { - writeItem(item->child(i)); - } - xmlWriter.writeEndElement(); - } else if (tagName == "bookmark") { - xmlWriter.writeStartElement(tagName); - if (!item->text(1).isEmpty()) { - xmlWriter.writeAttribute("href", item->text(1)); + } else { + reader.skipCurrentElement(); } - xmlWriter.writeTextElement("title", item->text(0)); - xmlWriter.writeEndElement(); - } else if (tagName == "separator") { - xmlWriter.writeEmptyElement(tagName); } } -- cgit v1.2.1