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/CMakeLists.txt | 6 ++ lib/bookmarks/bookmarkitem.cpp | 61 ++++++++++++ lib/bookmarks/bookmarkitem.h | 53 +++++++++++ lib/bookmarks/bookmarksform.ui | 44 +-------- lib/bookmarks/bookmarksmodel.cpp | 177 +++++++++++++++++++++++++++++++++++ lib/bookmarks/bookmarksmodel.h | 50 ++++++++++ lib/bookmarks/bookmarkswidget.cpp | 89 ++++++------------ lib/bookmarks/bookmarkswidget.h | 9 +- lib/bookmarks/xbel.cpp | 192 +++++++------------------------------- lib/bookmarks/xbel.h | 29 ++---- 10 files changed, 423 insertions(+), 287 deletions(-) create mode 100644 lib/bookmarks/bookmarkitem.cpp create mode 100644 lib/bookmarks/bookmarkitem.h create mode 100644 lib/bookmarks/bookmarksmodel.cpp create mode 100644 lib/bookmarks/bookmarksmodel.h (limited to 'lib') diff --git a/lib/bookmarks/CMakeLists.txt b/lib/bookmarks/CMakeLists.txt index 8fb7f45..53ba51e 100644 --- a/lib/bookmarks/CMakeLists.txt +++ b/lib/bookmarks/CMakeLists.txt @@ -4,6 +4,12 @@ add_library(bookmarks bookmarksform.ui bookmarkswidget.cpp bookmarkswidget.h + # model + bookmarkitem.cpp + bookmarkitem.h + bookmarksmodel.cpp + bookmarksmodel.h + # xbel xbel.cpp xbel.h) diff --git a/lib/bookmarks/bookmarkitem.cpp b/lib/bookmarks/bookmarkitem.cpp new file mode 100644 index 0000000..14ad197 --- /dev/null +++ b/lib/bookmarks/bookmarkitem.cpp @@ -0,0 +1,61 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "bookmarkitem.h" + +BookmarkItem::BookmarkItem(BookmarkItemType type, BookmarkItem *parent) +{ + m_type = type; + + // parentItem will either be a valid item, or a nullptr + m_parentItem = parent; + if(m_parentItem) { + m_parentItem->appendChild(this); + } +} + +BookmarkItem::~BookmarkItem() +{ + qDeleteAll(m_childItems); +} + +void BookmarkItem::appendChild(BookmarkItem *child) +{ + Q_CHECK_PTR(child); + m_childItems.append(child); +} + +BookmarkItem *BookmarkItem::child(int row) +{ + return m_childItems.at(row); +} + +int BookmarkItem::childIndex(BookmarkItem *item) const +{ + return m_childItems.indexOf(item); +} + +int BookmarkItem::childCount() const +{ + return m_childItems.count(); +} + +int BookmarkItem::row() const +{ + if(m_parentItem) { + return m_parentItem->m_childItems.indexOf(const_cast(this)); + } + + // no parent item, we are root + return 0; +} + +BookmarkItem *BookmarkItem::parentItem() +{ + return m_parentItem; +} diff --git a/lib/bookmarks/bookmarkitem.h b/lib/bookmarks/bookmarkitem.h new file mode 100644 index 0000000..839f10e --- /dev/null +++ b/lib/bookmarks/bookmarkitem.h @@ -0,0 +1,53 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include +#include + +#ifndef BOOKMARKITEM_H +#define BOOKMARKITEM_H + +class BookmarkItem +{ +public: + enum BookmarkItemType { + Root, + Folder, + Bookmark + }; + + explicit BookmarkItem(BookmarkItemType type, BookmarkItem *parent = nullptr); + ~BookmarkItem(); + + void appendChild(BookmarkItem *child); + BookmarkItem *child(int row); + int childIndex(BookmarkItem *item) const; + int childCount() const; + + BookmarkItemType type() const { + return m_type; + }; + int columnCount() const { + return 2; + }; + + int row() const; + BookmarkItem *parentItem(); + + // item data + QString title; + QString href; + bool folded = true; + +private: + BookmarkItemType m_type; + BookmarkItem *m_parentItem; + QVector m_childItems; +}; + +#endif //BOOKMARKITEM_H diff --git a/lib/bookmarks/bookmarksform.ui b/lib/bookmarks/bookmarksform.ui index 2df0c4b..4de5e13 100644 --- a/lib/bookmarks/bookmarksform.ui +++ b/lib/bookmarks/bookmarksform.ui @@ -53,49 +53,7 @@ - - - true - - - QAbstractItemView::InternalMove - - - Qt::MoveAction - - - - Title - - - - - href - - - - - - - - Details - - - - - - href - - - - - - - - - - - + diff --git a/lib/bookmarks/bookmarksmodel.cpp b/lib/bookmarks/bookmarksmodel.cpp new file mode 100644 index 0000000..ddd136e --- /dev/null +++ b/lib/bookmarks/bookmarksmodel.cpp @@ -0,0 +1,177 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "bookmarksmodel.h" +#include + +BookmarksModel::BookmarksModel(QStyle *style, QObject *parent) : QAbstractItemModel(parent) +{ + 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)); + + // create a root item + m_rootItem = new BookmarkItem(BookmarkItem::Root, nullptr); + m_rootItem->title = tr("Title"); + m_rootItem->href = tr("href"); +} + +BookmarksModel::~BookmarksModel() +{ + delete m_rootItem; +} + +void BookmarksModel::setRoot(BookmarkItem *root) +{ + Q_CHECK_PTR(root); + + delete m_rootItem; + m_rootItem = root; +} + +QVariant BookmarksModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if(orientation == Qt::Horizontal && role == Qt::DisplayRole) { + if(section == 0) { + return m_rootItem->title; + } else if(section == 1) { + return m_rootItem->href; + } else { + return QVariant(); + } + } + + return QVariant(); +} + +QModelIndex BookmarksModel::index(BookmarkItem *node) const +{ + BookmarkItem *parentItem = node->parentItem(); + if(!parentItem) { + return QModelIndex(); + } + + return createIndex(parentItem->childIndex(node), 0, node); +} + +QModelIndex BookmarksModel::index(int row, int column, const QModelIndex &parent) const +{ + // invalid item requested + if (!hasIndex(row, column, parent)) { + return QModelIndex(); + } + + // index exists + BookmarkItem *parentItem; + if(parent.isValid()) { + parentItem = static_cast(parent.internalPointer()); + } else { + parentItem = m_rootItem; + } + + BookmarkItem *childItem = parentItem->child(row); + if(childItem) { + return createIndex(row, column, childItem); + } + return QModelIndex(); +} + +QModelIndex BookmarksModel::parent(const QModelIndex &index) const +{ + if(!index.isValid()) { + return QModelIndex(); + } + + BookmarkItem *childItem = static_cast(index.internalPointer()); + BookmarkItem *parentItem = childItem->parentItem(); + + if(parentItem == m_rootItem) { + return QModelIndex(); + } + + return createIndex(parentItem->row(), 0, parentItem); +} + +int BookmarksModel::rowCount(const QModelIndex &parent) const +{ + if(parent.column() > 0) { + return 0; + } + + BookmarkItem *parentItem; + if(!parent.isValid()) { + parentItem = m_rootItem; + } else { + parentItem = static_cast(parent.internalPointer()); + } + + return parentItem->childCount(); +} + +int BookmarksModel::columnCount(const QModelIndex &parent) const +{ + if(parent.isValid()) { + return static_cast(parent.internalPointer())->columnCount(); + } else { + return m_rootItem->columnCount(); + } +} + +QVariant BookmarksModel::data(const QModelIndex &index, int role) const +{ + // get data of invalid index? + if (!index.isValid()) { + return QVariant(); + } + + const BookmarkItem *item = static_cast(index.internalPointer()); + switch (role) { + case Qt::DisplayRole: + case Qt::EditRole: + if(index.column() == 0) { + return item->title; + } else if(index.column() == 1) { + return item->href; + } else { + return QVariant(); + } + + case Qt::DecorationRole: + if(index.column() == 0) { + if(item->type() == BookmarkItem::Folder) { + return folderIcon; + } else if(item->type() == BookmarkItem::Bookmark) { + return bookmarkIcon; + } else { + return QVariant(); + } + } else { + return QVariant(); + } + + case OpenUrlRole: + if(item->type() == BookmarkItem::Bookmark) { + return item->href; + } else { + return QVariant(); + } + + default: + return QVariant(); + } +} + +bool BookmarksModel::hasChildren(const QModelIndex &parent) const +{ + if(!parent.isValid()) { + return true; + } + + const BookmarkItem *parentItem = static_cast(parent.internalPointer()); + return (parentItem->type() == BookmarkItem::Folder); +} diff --git a/lib/bookmarks/bookmarksmodel.h b/lib/bookmarks/bookmarksmodel.h new file mode 100644 index 0000000..7493f1c --- /dev/null +++ b/lib/bookmarks/bookmarksmodel.h @@ -0,0 +1,50 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include +#include +#include "bookmarkitem.h" + +#ifndef BOOKMARKSMODEL_H +#define BOOKMARKSMODEL_H + +class QStyle; +class BookmarksModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + enum { + OpenUrlRole = Qt::UserRole + 1 + }; + + explicit BookmarksModel(QStyle *style, QObject *parent = nullptr); + ~BookmarksModel() override; + + void setRoot(BookmarkItem *root); + + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + QModelIndex index(BookmarkItem *node) const; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex &index) const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role) const override; + + bool hasChildren(const QModelIndex &parent) const override ; + +private: + QIcon folderIcon; + QIcon bookmarkIcon; + + BookmarkItem *m_rootItem; + +}; + +#endif //BOOKMARKSMODEL_H diff --git a/lib/bookmarks/bookmarkswidget.cpp b/lib/bookmarks/bookmarkswidget.cpp index 0b13254..daec3f4 100644 --- a/lib/bookmarks/bookmarkswidget.cpp +++ b/lib/bookmarks/bookmarkswidget.cpp @@ -8,7 +8,6 @@ #include "bookmarkswidget.h" #include "ui_bookmarksform.h" -#include #include BookmarksWidget::BookmarksWidget(const QString &path, QWidget *parent) : @@ -20,38 +19,24 @@ BookmarksWidget::BookmarksWidget(const QString &path, QWidget *parent) : setWindowTitle(tr("Bookmarks")); ui->setupUi(this); - ui->treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch); - - QStyle *style = ui->treeWidget->style(); - ui->addFolder_toolButton->setIcon(style->standardPixmap(QStyle::SP_DirIcon)); - ui->addBookmark_toolButton->setIcon(style->standardPixmap(QStyle::SP_FileIcon)); - ui->deleteItem_toolButton->setIcon(style->standardPixmap(QStyle::SP_TrashIcon)); - - connect(ui->treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(showItemDetails())); - connect(ui->treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(openItem(QTreeWidgetItem*,int))); + ui->treeView->header()->setSectionResizeMode(QHeaderView::Stretch); + ui->addFolder_toolButton->setIcon(style()->standardPixmap(QStyle::SP_DirIcon)); + ui->addBookmark_toolButton->setIcon(style()->standardPixmap(QStyle::SP_FileIcon)); + ui->deleteItem_toolButton->setIcon(style()->standardPixmap(QStyle::SP_TrashIcon)); ui->deleteItem_toolButton->setShortcut(QKeySequence::Delete); - m_path = path; - xbel = new Xbel(ui->treeWidget); - qDebug("Reading bookmarks [%s] %s", qUtf8Printable(m_path), xbel->read(m_path) ? "ok" : "failed"); + m_model = new BookmarksModel(style(), this); + ui->treeView->setModel(m_model); - connect(ui->addFolder_toolButton, &QToolButton::clicked, this, [&]() { - xbel->addFolder(ui->treeWidget->currentItem()); - }); - connect(ui->addBookmark_toolButton, &QToolButton::clicked, this, [&]() { - xbel->addBookmark(ui->treeWidget->currentItem()); - }); - connect(ui->deleteItem_toolButton, &QToolButton::clicked, this, [&]() { - delete ui->treeWidget->currentItem(); - }); + xbel = new Xbel(path); + BookmarkItem *rootNode = xbel->read(); + m_model->setRoot(rootNode); + expandNodes(rootNode); + //qDebug("Reading bookmarks [%s] %s", qUtf8Printable(m_path), xbel->read(m_path) ? "ok" : "failed"); - // editing bookmarks - connect(ui->title_lineEdit, &QLineEdit::returnPressed, this, [&]() { - ui->treeWidget->currentItem()->setText(0, ui->title_lineEdit->text()); - }); - connect(ui->href_lineEdit, &QLineEdit::returnPressed, this, [&]() { - ui->treeWidget->currentItem()->setText(1, ui->href_lineEdit->text()); + connect(ui->treeView, &QTreeView::activated, this, [this](const QModelIndex &index) { + emit openUrl(m_model->data(index, BookmarksModel::OpenUrlRole).toUrl()); }); } @@ -63,41 +48,29 @@ BookmarksWidget::~BookmarksWidget() void BookmarksWidget::save() { - qDebug("Writing bookmarks [%s] %s", qUtf8Printable(m_path), xbel->write(m_path) ? "ok" : "failed"); + // TODO: check if saving is needed + //qDebug("Writing bookmarks [%s] %s", qUtf8Printable(m_path), xbel->write(m_path) ? "ok" : "failed"); } QAbstractItemModel *BookmarksWidget::model() const { - return ui->treeWidget->model(); -} - -QStringList BookmarksWidget::searchItem(QTreeWidgetItem *item, const QString &term) -{ - if(item->text(1).contains(term)) { - return { item->text(1) }; - } - - QStringList ret; - for(int i = 0; i < item->childCount(); ++i) { - ret += searchItem(item->child(i), term); - } - return ret; -} - -void BookmarksWidget::openItem(QTreeWidgetItem *item, int column) -{ - Q_UNUSED(column) - emit openUrl(QUrl::fromUserInput(item->text(1))); + Q_CHECK_PTR(m_model); + return m_model; } -void BookmarksWidget::showItemDetails() +void BookmarksWidget::expandNodes(BookmarkItem *node) { - QTreeWidgetItem *item = ui->treeWidget->currentItem(); - if(!item) { - ui->title_lineEdit->setText(""); - ui->href_label->setText(""); - return; + // iterate through children + for(int i = 0; i < node->childCount(); ++i) { + BookmarkItem *childNode = node->child(i); + + // and if it's a folder + if(childNode->type() == BookmarkItem::Folder) { + QModelIndex index = m_model->index(childNode); + ui->treeView->setExpanded(index, !childNode->folded); + + // only folders have children, so go through them + expandNodes(childNode); + } } - ui->title_lineEdit->setText(item->text(0)); - ui->href_lineEdit->setText(item->text(1)); -} +} \ No newline at end of file diff --git a/lib/bookmarks/bookmarkswidget.h b/lib/bookmarks/bookmarkswidget.h index 5b815c0..cdc013e 100644 --- a/lib/bookmarks/bookmarkswidget.h +++ b/lib/bookmarks/bookmarkswidget.h @@ -11,7 +11,7 @@ #include #include "xbel.h" -#include +#include "bookmarksmodel.h" namespace Ui { class BookmarksDialog; @@ -31,15 +31,12 @@ public: signals: void openUrl(const QUrl &url); -private slots: - void openItem(QTreeWidgetItem *item, int column); - void showItemDetails(); private: - QStringList searchItem(QTreeWidgetItem *item, const QString &term); + void expandNodes(BookmarkItem *node); - QString m_path; Ui::BookmarksDialog *ui; + BookmarksModel *m_model; Xbel *xbel; }; 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); } } diff --git a/lib/bookmarks/xbel.h b/lib/bookmarks/xbel.h index ed0a256..1c03b74 100644 --- a/lib/bookmarks/xbel.h +++ b/lib/bookmarks/xbel.h @@ -9,37 +9,20 @@ #ifndef XBELREADER_H #define XBELREADER_H +#include #include -#include +#include "bookmarkitem.h" -class QTreeWidget; -class QTreeWidgetItem; class Xbel { public: - explicit Xbel(QTreeWidget *widget); - bool read(const QString &xbel); - bool write(const QString &xbel); - - QTreeWidgetItem *addFolder(QTreeWidgetItem *parentItem); - QTreeWidgetItem *addBookmark(QTreeWidgetItem *parentItem); - void addSeparator(QTreeWidgetItem *parentItem); + explicit Xbel(const QString &path); + BookmarkItem *read(); private: - void readChildElements(QTreeWidgetItem *parentItem); - void readTitle(QTreeWidgetItem *item); - - QTreeWidgetItem *parentFolder(QTreeWidgetItem *item); - QTreeWidgetItem *createChildItem(QTreeWidgetItem *item, const QString &type); - - void writeItem(QTreeWidgetItem *item); - - QIcon folderIcon; - QIcon bookmarkIcon; + void readChildElements(QXmlStreamReader &reader, BookmarkItem *parentItem); - QTreeWidget *treeWidget; - QXmlStreamReader xmlReader; - QXmlStreamWriter xmlWriter; + QString m_path; }; #endif // XBELREADER_H -- cgit v1.2.1