From 29a46bbf2d36b8abc419348f33aa7f1f91043be5 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 10 Feb 2017 16:19:21 +0100 Subject: Bookmark improvements Added icons to bookmark tree Bookmarks can now be rearranged Add/remove items from bookmark tree --- src/forms/bookmarksdialog.cpp | 53 +++++++++++++++++++- src/forms/bookmarksdialog.h | 14 +++++- src/forms/bookmarksdialog.ui | 111 ++++++++++++++++++++++++++++++++++++------ src/xbel/xbel.cpp | 59 ++++++++++++++++------ src/xbel/xbel.h | 14 ++++-- 5 files changed, 214 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/forms/bookmarksdialog.cpp b/src/forms/bookmarksdialog.cpp index bf5a9fc..d61cf18 100644 --- a/src/forms/bookmarksdialog.cpp +++ b/src/forms/bookmarksdialog.cpp @@ -20,17 +20,42 @@ #include "bookmarksdialog.h" #include "ui_bookmarksdialog.h" - +#include #include "xbel/xbel.h" +#include "mainwindow.h" -BookmarksDialog::BookmarksDialog(QWidget *parent) : +BookmarksDialog::BookmarksDialog(MainWindow *parent) : QDialog(parent), ui(new Ui::BookmarksDialog) { + parentWindow = parent; 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->addSeparator_toolButton->setText("---"); + 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->deleteItem_toolButton->setShortcut(QKeySequence::Delete); + connect(ui->deleteItem_toolButton, SIGNAL(clicked(bool)), this, SLOT(deleteCurrentItem())); xbel = new Xbel(ui->treeWidget); xbel->read("bookmarks.xbel"); + + 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->addSeparator_toolButton, &QToolButton::clicked, [this]() { + xbel->addSeparator(ui->treeWidget->currentItem()); + }); } BookmarksDialog::~BookmarksDialog() @@ -40,3 +65,27 @@ BookmarksDialog::~BookmarksDialog() delete xbel; delete ui; } + +void BookmarksDialog::deleteCurrentItem() +{ + delete ui->treeWidget->currentItem(); +} + +void BookmarksDialog::openItem(QTreeWidgetItem *item, int column) +{ + Q_UNUSED(column) + + parentWindow->createNewTab(QUrl::fromUserInput(item->text(1))); +} + +void BookmarksDialog::showItemDetails() +{ + QTreeWidgetItem *item = ui->treeWidget->currentItem(); + if(!item) { + ui->title_lineEdit->setText(""); + ui->href_label->setText(""); + return; + } + ui->title_lineEdit->setText(item->text(0)); + ui->href_lineEdit->setText(item->text(1)); +} diff --git a/src/forms/bookmarksdialog.h b/src/forms/bookmarksdialog.h index b01fc8b..e2387d7 100644 --- a/src/forms/bookmarksdialog.h +++ b/src/forms/bookmarksdialog.h @@ -28,15 +28,27 @@ namespace Ui { class BookmarksDialog; } +class MainWindow; class BookmarksDialog : public QDialog { Q_OBJECT public: - explicit BookmarksDialog(QWidget *parent = 0); + explicit BookmarksDialog(MainWindow *parent = 0); ~BookmarksDialog(); +public slots: + // void addFolder(const QString &title); + // void addBookmark(const QString &title, const QString &href); + // void addSeparator(); + void deleteCurrentItem(); + +private slots: + void openItem(QTreeWidgetItem *item, int column); + void showItemDetails(); + private: + MainWindow *parentWindow; Ui::BookmarksDialog *ui; Xbel *xbel; }; diff --git a/src/forms/bookmarksdialog.ui b/src/forms/bookmarksdialog.ui index f578737..a0e4316 100644 --- a/src/forms/bookmarksdialog.ui +++ b/src/forms/bookmarksdialog.ui @@ -6,27 +6,110 @@ 0 0 - 640 + 820 480 Bookmarks - + - - - - 1 - - - - - 2 - - - + + + + + true + + + QAbstractItemView::InternalMove + + + Qt::MoveAction + + + + Title + + + + + href + + + + + + + + + + + + ... + + + + + + + ... + + + + + + + ... + + + + + + + ... + + + + + + + + + + 250 + 0 + + + + + 250 + 16777215 + + + + Details + + + + + + href + + + + + + + + + + + + + + + diff --git a/src/xbel/xbel.cpp b/src/xbel/xbel.cpp index 509be1f..2047e99 100644 --- a/src/xbel/xbel.cpp +++ b/src/xbel/xbel.cpp @@ -26,6 +26,11 @@ Xbel::Xbel(QTreeWidget *widget) { 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)); } bool Xbel::read(const QString &xbel) @@ -93,11 +98,14 @@ void Xbel::readChildElements(QTreeWidgetItem *parentItem) if(xmlReader.name() == "title") { readTitle(parentItem); } else if(xmlReader.name() == "folder") { - readFolder(parentItem); + readChildElements(addFolder(parentItem)); } else if(xmlReader.name() == "bookmark") { - readBookmark(parentItem); + QTreeWidgetItem *item = addBookmark(parentItem); + item->setText(1, xmlReader.attributes().value("href").toString()); + readChildElements(item); } else if(xmlReader.name() == "separator") { - readSeparator(parentItem); + addSeparator(parentItem); + xmlReader.skipCurrentElement(); } else { xmlReader.skipCurrentElement(); } @@ -109,32 +117,51 @@ void Xbel::readTitle(QTreeWidgetItem *item) item->setText(0, xmlReader.readElementText()); } -void Xbel::readFolder(QTreeWidgetItem *parentItem) +QTreeWidgetItem *Xbel::addFolder(QTreeWidgetItem *parentItem) { - QTreeWidgetItem *folderItem = createChildItem(parentItem); + QTreeWidgetItem *folderItem = createChildItem(parentFolder(parentItem), "folder"); folderItem->setExpanded(xmlReader.attributes().value("folded") != "no"); + folderItem->setFlags(folderItem->flags() | Qt::ItemIsEditable); + folderItem->setIcon(0, folderIcon); - readChildElements(folderItem); + return folderItem; } -void Xbel::readBookmark(QTreeWidgetItem *parentItem) +QTreeWidgetItem *Xbel::addBookmark(QTreeWidgetItem *parentItem) { - QTreeWidgetItem *bookmarkItem = createChildItem(parentItem); - bookmarkItem->setFlags(bookmarkItem->flags() | Qt::ItemIsEditable); + 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, xmlReader.attributes().value("href").toString()); + bookmarkItem->setText(1, "Unknown Address"); - readChildElements(bookmarkItem); + return bookmarkItem; } -void Xbel::readSeparator(QTreeWidgetItem *parentItem) +void Xbel::addSeparator(QTreeWidgetItem *parentItem) { - QTreeWidgetItem *separatorItem = createChildItem(parentItem); + QTreeWidgetItem *separatorItem = createChildItem(parentFolder(parentItem), "separator"); + separatorItem->setFlags(separatorItem->flags() & ~Qt::ItemIsDropEnabled); separatorItem->setText(0, "-----"); - xmlReader.skipCurrentElement(); } -QTreeWidgetItem *Xbel::createChildItem(QTreeWidgetItem *item) +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) { @@ -142,7 +169,7 @@ QTreeWidgetItem *Xbel::createChildItem(QTreeWidgetItem *item) } else { childItem = new QTreeWidgetItem(treeWidget); } - childItem->setData(0, Qt::UserRole, xmlReader.name().toString()); + childItem->setData(0, Qt::UserRole, type); return childItem; } diff --git a/src/xbel/xbel.h b/src/xbel/xbel.h index 7f80eeb..6ffafb1 100644 --- a/src/xbel/xbel.h +++ b/src/xbel/xbel.h @@ -22,6 +22,7 @@ #define XBELREADER_H #include +#include class QTreeWidget; class QTreeWidgetItem; @@ -32,17 +33,22 @@ public: bool read(const QString &xbel); bool write(const QString &xbel); + QTreeWidgetItem *addFolder(QTreeWidgetItem *parentItem); + QTreeWidgetItem *addBookmark(QTreeWidgetItem *parentItem); + void addSeparator(QTreeWidgetItem *parentItem); + private: void readChildElements(QTreeWidgetItem *parentItem); void readTitle(QTreeWidgetItem *item); - void readFolder(QTreeWidgetItem *parentItem); - void readBookmark(QTreeWidgetItem *parentItem); - void readSeparator(QTreeWidgetItem *parentItem); - QTreeWidgetItem *createChildItem(QTreeWidgetItem *item); + QTreeWidgetItem *parentFolder(QTreeWidgetItem *item); + QTreeWidgetItem *createChildItem(QTreeWidgetItem *item, const QString &type); void writeItem(QTreeWidgetItem *item); + QIcon folderIcon; + QIcon bookmarkIcon; + QTreeWidget *treeWidget; QXmlStreamReader xmlReader; QXmlStreamWriter xmlWriter; -- cgit v1.2.1