aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUGS.md23
-rw-r--r--lib/bookmarks/CMakeLists.txt6
-rw-r--r--lib/bookmarks/bookmarkitem.cpp61
-rw-r--r--lib/bookmarks/bookmarkitem.h53
-rw-r--r--lib/bookmarks/bookmarksform.ui44
-rw-r--r--lib/bookmarks/bookmarksmodel.cpp177
-rw-r--r--lib/bookmarks/bookmarksmodel.h50
-rw-r--r--lib/bookmarks/bookmarkswidget.cpp89
-rw-r--r--lib/bookmarks/bookmarkswidget.h9
-rw-r--r--lib/bookmarks/xbel.cpp192
-rw-r--r--lib/bookmarks/xbel.h29
11 files changed, 428 insertions, 305 deletions
diff --git a/BUGS.md b/BUGS.md
index 5881350..03eee94 100644
--- a/BUGS.md
+++ b/BUGS.md
@@ -1,10 +1,6 @@
## Known bugs
List of known bugs that can't be fixed atm
-### Closing sometimes causes the program to crash
-How to reproduce: enter an address into the address bar, load the page, crash on exit
-- crash is somewhere in Qt code?
-
### Search terms in address bar
QUrl always seems to return true when checking if valid url. Workaround is to prepend '#'
to the search.
@@ -18,36 +14,27 @@ A field on a page is probably taking focus.
## To do list
List of things to do before 1.0 release
-### Auto-destruct cookies
+### Cookies
- cookie whitelist and blacklist
### Request filter
- How are multiple IPs per hostname to be treated?
- Multiple hostnames on a line get ignored after the first one
-### No Script
-- there's already a profile setting to disable scripts
-- check if it applies to OTR
-
-### Deny URI Leaks
-Deny 'resource://' to prevent website fingerprinting
-
-### Deny mouse information
-
### Settings dialog
-- reset button
-- Settings dialog only displays values (Save button does nothing)
- show settings dialog on startup if config was auto-generated
+- dialog buttons
### Bookmarks
-- review code
+- BUG: Completer doesn't search through folders
+- TODO: BookmarkItem icon url
+- TOOD: Saving BookmarksModel
### Downloads
- review code
- download speed
- Elapsed time, avg speed, remaining time
- In details: stop, pause/resume
-- script to run other downloader
### Rewrite documentation
- quickstart/manual that lists keyboard shortcuts
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