From 1e8abe4a99236ae7ab1889531660ba7bbfb8aee7 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sat, 20 Jan 2018 17:10:51 +0100 Subject: Saner bookmark editing - Fixed bug with bookmarks in folders getting duplicated --- lib/bookmarks/bookmarksform.ui | 48 +++++++++++++++++++++++++++++++++++++++ lib/bookmarks/bookmarksmodel.cpp | 41 +++++++++++++++++++++++---------- lib/bookmarks/bookmarksmodel.h | 4 +++- lib/bookmarks/bookmarkswidget.cpp | 35 ++++++++++++++++++++-------- lib/bookmarks/bookmarkswidget.h | 2 -- lib/bookmarks/xbel.cpp | 44 +++++++++++++++++++---------------- 6 files changed, 130 insertions(+), 44 deletions(-) (limited to 'lib') diff --git a/lib/bookmarks/bookmarksform.ui b/lib/bookmarks/bookmarksform.ui index 4de5e13..5d0f269 100644 --- a/lib/bookmarks/bookmarksform.ui +++ b/lib/bookmarks/bookmarksform.ui @@ -55,6 +55,54 @@ + + + + Edit Bookmark + + + + + + Title + + + + + + + Address + + + + + + + + + + + + + + + + Edit Folder + + + + + + Name + + + + + + + + + diff --git a/lib/bookmarks/bookmarksmodel.cpp b/lib/bookmarks/bookmarksmodel.cpp index 3498f71..418d456 100644 --- a/lib/bookmarks/bookmarksmodel.cpp +++ b/lib/bookmarks/bookmarksmodel.cpp @@ -175,6 +175,15 @@ Qt::ItemFlags BookmarksModel::flags(const QModelIndex &index) const return flags; } +BookmarkItem::BookmarkItemType BookmarksModel::type(const QModelIndex &index) const +{ + if(!index.isValid()) { + return BookmarkItem::Root; + } + + return static_cast(index.internalPointer())->type(); +} + QVariant BookmarksModel::data(const QModelIndex &index, int role) const { // get data of invalid index? @@ -207,6 +216,9 @@ QVariant BookmarksModel::data(const QModelIndex &index, int role) const return QVariant(); } + case TitleRole: + return item->title; + case OpenUrlRole: if(item->type() == BookmarkItem::Bookmark) { return item->href; @@ -230,25 +242,30 @@ bool BookmarksModel::setData(const QModelIndex &index, const QVariant &value, in return false; case BookmarkItem::Folder: - if(index.column() == 0) { + if(role == TitleRole && (node->title != value.toString())) { node->title = value.toString(); modified = true; - emit dataChanged(index, index); + emit dataChanged(this->index(node, 0), this->index(node, 1)); + //emit dataChanged(index, index); return true; } return false; case BookmarkItem::Bookmark: - if(index.column() == 0) { - node->title = value.toString(); - modified = true; - emit dataChanged(index, index); - return true; - } else if(index.column() == 1) { - node->href = value.toString(); - modified = true; - emit dataChanged(index, index); - return true; + if(role == TitleRole && (node->title != value.toString())) { + node->title = value.toString(); + modified = true; + emit dataChanged(this->index(node, 0), this->index(node, 1)); + //emit dataChanged(index, index); + return true; + + } else if(role == OpenUrlRole && (node->href != value.toString())) { + node->href = value.toString(); + modified = true; + emit dataChanged(this->index(node, 0), this->index(node, 1)); + //emit dataChanged(index, index); + return true; + } return false; } diff --git a/lib/bookmarks/bookmarksmodel.h b/lib/bookmarks/bookmarksmodel.h index 0fb5e04..ea1d203 100644 --- a/lib/bookmarks/bookmarksmodel.h +++ b/lib/bookmarks/bookmarksmodel.h @@ -22,7 +22,8 @@ class BookmarksModel : public QAbstractItemModel public: enum { - OpenUrlRole = Qt::UserRole + 1 + TitleRole = Qt::UserRole + 1, + OpenUrlRole = Qt::UserRole + 2 }; explicit BookmarksModel(QStyle *style, QObject *parent = nullptr); @@ -45,6 +46,7 @@ public: int columnCount(const QModelIndex &parent = QModelIndex()) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; + BookmarkItem::BookmarkItemType type(const QModelIndex &index) const; QVariant data(const QModelIndex &index, int role) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; diff --git a/lib/bookmarks/bookmarkswidget.cpp b/lib/bookmarks/bookmarkswidget.cpp index e148831..93287c4 100644 --- a/lib/bookmarks/bookmarkswidget.cpp +++ b/lib/bookmarks/bookmarkswidget.cpp @@ -20,14 +20,14 @@ BookmarksWidget::BookmarksWidget(const QString &path, QWidget *parent) ui->setupUi(this); ui->treeView->header()->setSectionResizeMode(QHeaderView::Stretch); + ui->bookmark_groupBox->setVisible(false); + ui->folder_groupBox->setVisible(false); 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); - editEntry_shortcut = new QShortcut(QKeySequence("F2"), this); - m_model = new BookmarksModel(style(), this); ui->treeView->setModel(m_model); @@ -36,10 +36,7 @@ BookmarksWidget::BookmarksWidget(const QString &path, QWidget *parent) m_model->expandItems(ui->treeView); connect(ui->treeView, &QTreeView::activated, this, [this](const QModelIndex &index) { - if(ui->treeView->isPersistentEditorOpen(index)) - ui->treeView->closePersistentEditor(index); - else - emit openUrl(m_model->data(index, BookmarksModel::OpenUrlRole).toUrl()); + emit openUrl(m_model->data(index, BookmarksModel::OpenUrlRole).toUrl()); }); connect(ui->addBookmark_toolButton, &QToolButton::clicked, this, [this]() { @@ -51,9 +48,29 @@ BookmarksWidget::BookmarksWidget(const QString &path, QWidget *parent) m_model->insertItem(BookmarkItem::Folder, idx); }); - connect(editEntry_shortcut, &QShortcut::activated, this, [this]() { - QModelIndex idx = ui->treeView->currentIndex(); - ui->treeView->openPersistentEditor(idx); + connect(ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, [this](const QModelIndex ¤t, const QModelIndex &previous) { + // save the previous item + if(previous.isValid()) { + if(m_model->type(previous) == BookmarkItem::Folder) { + m_model->setData(previous, ui->folderTitle->text(), BookmarksModel::TitleRole); + ui->folder_groupBox->setVisible(false); + } else if(m_model->type(previous) == BookmarkItem::Bookmark) { + m_model->setData(previous, ui->bookmarkTitle->text(), BookmarksModel::TitleRole); + m_model->setData(previous, ui->bookmarkHref->text(), BookmarksModel::OpenUrlRole); + ui->bookmark_groupBox->setVisible(false); + } + } + + if(current.isValid()) { + if(m_model->type(current) == BookmarkItem::Folder) { + ui->folderTitle->setText(m_model->data(current, BookmarksModel::TitleRole).toString()); + ui->folder_groupBox->setVisible(true); + } else if(m_model->type(current) == BookmarkItem::Bookmark) { + ui->bookmarkTitle->setText(m_model->data(current, BookmarksModel::TitleRole).toString()); + ui->bookmarkHref->setText(m_model->data(current, BookmarksModel::OpenUrlRole).toString()); + ui->bookmark_groupBox->setVisible(true); + } + } }); } diff --git a/lib/bookmarks/bookmarkswidget.h b/lib/bookmarks/bookmarkswidget.h index ec3469b..23e275f 100644 --- a/lib/bookmarks/bookmarkswidget.h +++ b/lib/bookmarks/bookmarkswidget.h @@ -40,8 +40,6 @@ private: Ui::BookmarksDialog *ui; BookmarksModel *m_model; Xbel *xbel; - - QShortcut *editEntry_shortcut; }; #endif // BOOKMARKSDIALOG_H diff --git a/lib/bookmarks/xbel.cpp b/lib/bookmarks/xbel.cpp index d19641c..1be9c7e 100644 --- a/lib/bookmarks/xbel.cpp +++ b/lib/bookmarks/xbel.cpp @@ -97,26 +97,30 @@ bool Xbel::write(BookmarkItem *root) void Xbel::writeChildElements(QXmlStreamWriter &writer, BookmarkItem *parentItem) { - for(int i = 0; i < parentItem->childCount(); ++i) { - BookmarkItem *node = parentItem->child(i); - switch(node->type()) { - case BookmarkItem::Root: - break; - case BookmarkItem::Folder: - writer.writeStartElement("folder"); - writer.writeAttribute("folded", node->folded ? "yes" : "no"); - writer.writeTextElement("title", node->title); - for(int j = 0; j < node->childCount(); ++j) { - writeChildElements(writer, node); - } - writer.writeEndElement(); - break; - case BookmarkItem::Bookmark: - writer.writeStartElement("bookmark"); - writer.writeAttribute("href", node->href); - writer.writeTextElement("title", node->title); - writer.writeEndElement(); - break; + switch(parentItem->type()) { + case BookmarkItem::Root: + for(int i = 0; i < parentItem->childCount(); ++i) { + writeChildElements(writer, parentItem->child(i)); } + break; + + case BookmarkItem::Folder: + writer.writeStartElement("folder"); + writer.writeAttribute("folded", parentItem->folded ? "yes" : "no"); + writer.writeTextElement("title", parentItem->title); + + for(int i = 0; i < parentItem->childCount(); ++i) { + writeChildElements(writer, parentItem->child(i)); + } + + writer.writeEndElement(); + break; + + case BookmarkItem::Bookmark: + writer.writeStartElement("bookmark"); + writer.writeAttribute("href", parentItem->href); + writer.writeTextElement("title", parentItem->title); + writer.writeEndElement(); + break; } } -- cgit v1.2.1