diff options
| author | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-01-07 00:48:27 +0100 | 
|---|---|---|
| committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-01-07 00:48:27 +0100 | 
| commit | e0f64f9330fc30553dc9d8dcf308079f5d391526 (patch) | |
| tree | 8c21a08f25208150ed4f0bcbf8496334c2e08bcc /lib/bookmarks | |
| parent | Updated ReadMe and pkgbuild (diff) | |
| download | smolbote-e0f64f9330fc30553dc9d8dcf308079f5d391526.tar.xz | |
Added BookmarksModel
TODO: Editing bookmarks
TODO: Saving bookmarks
BUG: Completer doesn't search through folders
Diffstat (limited to 'lib/bookmarks')
| -rw-r--r-- | lib/bookmarks/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | lib/bookmarks/bookmarkitem.cpp | 61 | ||||
| -rw-r--r-- | lib/bookmarks/bookmarkitem.h | 53 | ||||
| -rw-r--r-- | lib/bookmarks/bookmarksform.ui | 44 | ||||
| -rw-r--r-- | lib/bookmarks/bookmarksmodel.cpp | 177 | ||||
| -rw-r--r-- | lib/bookmarks/bookmarksmodel.h | 50 | ||||
| -rw-r--r-- | lib/bookmarks/bookmarkswidget.cpp | 89 | ||||
| -rw-r--r-- | lib/bookmarks/bookmarkswidget.h | 9 | ||||
| -rw-r--r-- | lib/bookmarks/xbel.cpp | 192 | ||||
| -rw-r--r-- | lib/bookmarks/xbel.h | 29 | 
10 files changed, 423 insertions, 287 deletions
| 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<BookmarkItem*>(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 <QVariant> +#include <QVector> + +#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<BookmarkItem*> 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 @@      </layout>     </item>     <item> -    <widget class="QTreeWidget" name="treeWidget"> -     <property name="dragEnabled"> -      <bool>true</bool> -     </property> -     <property name="dragDropMode"> -      <enum>QAbstractItemView::InternalMove</enum> -     </property> -     <property name="defaultDropAction"> -      <enum>Qt::MoveAction</enum> -     </property> -     <column> -      <property name="text"> -       <string notr="true">Title</string> -      </property> -     </column> -     <column> -      <property name="text"> -       <string>href</string> -      </property> -     </column> -    </widget> -   </item> -   <item> -    <widget class="QGroupBox" name="groupBox"> -     <property name="title"> -      <string>Details</string> -     </property> -     <layout class="QFormLayout" name="formLayout"> -      <item row="1" column="0"> -       <widget class="QLabel" name="href_label"> -        <property name="text"> -         <string>href</string> -        </property> -       </widget> -      </item> -      <item row="1" column="1"> -       <widget class="QLineEdit" name="href_lineEdit"/> -      </item> -      <item row="0" column="1"> -       <widget class="QLineEdit" name="title_lineEdit"/> -      </item> -     </layout> -    </widget> +    <widget class="QTreeView" name="treeView"/>     </item>    </layout>   </widget> 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 <QStyle> + +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<BookmarkItem*>(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<BookmarkItem*>(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<BookmarkItem*>(parent.internalPointer()); +    } + +    return parentItem->childCount(); +} + +int BookmarksModel::columnCount(const QModelIndex &parent) const +{ +    if(parent.isValid()) { +        return static_cast<BookmarkItem*>(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<BookmarkItem *>(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<BookmarkItem *>(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 <QAbstractItemModel> +#include <QIcon> +#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 <QTreeWidget>  #include <QUrl>  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 <QWidget>  #include "xbel.h" -#include <QAbstractItemModel> +#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 <QFile> -#include <QTreeWidgetItem> - -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("<!DOCTYPE xbel>"); -    xmlWriter.writeStartElement("xbel"); -    xmlWriter.writeAttribute("version", "1.0"); -    for(int i=0; i<treeWidget->topLevelItemCount(); 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 <QString>  #include <QXmlStreamReader> -#include <QIcon> +#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 | 
