From f779510603e01de438e337c82c439cc6649cd7c3 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Wed, 7 Feb 2018 21:08:39 +0100 Subject: Rewrote bookmark manager to use QTreeWidget over QTreeView - cut out all the boilerplate that was BookmarkItem/BookmarksModel - deleting items no longer crash; proper drag'n'drop - Split Xbel into XbelReader and XbelWriter --- lib/bookmarks/bookmarksmodel.cpp | 393 --------------------------------------- 1 file changed, 393 deletions(-) delete mode 100644 lib/bookmarks/bookmarksmodel.cpp (limited to 'lib/bookmarks/bookmarksmodel.cpp') diff --git a/lib/bookmarks/bookmarksmodel.cpp b/lib/bookmarks/bookmarksmodel.cpp deleted file mode 100644 index 5b91216..0000000 --- a/lib/bookmarks/bookmarksmodel.cpp +++ /dev/null @@ -1,393 +0,0 @@ -/* - * 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: https://neueland.iserlohn-fortress.net/smolbote.hg - * - * SPDX-License-Identifier: GPL-3.0 - */ - -#include "bookmarksmodel.h" -#include -#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; -} - -bool BookmarksModel::isModified() const -{ - return modified; -} - -bool BookmarksModel::read(Xbel *xbel) -{ - Q_CHECK_PTR(xbel); - // if there are items in the bookmark list, we're adding to them, so the model becomes modified - if(m_rootItem->childCount() != 0) { - modified = true; - } - return xbel->read(m_rootItem); -} - -bool BookmarksModel::write(Xbel *xbel) -{ - Q_CHECK_PTR(xbel); - return xbel->write(m_rootItem); -} - -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, int column) const -{ - BookmarkItem *parentItem = node->parentItem(); - if(!parentItem) { - return QModelIndex(); - } - - return createIndex(parentItem->childIndex(node), column, 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(); -} - -QModelIndex BookmarksModel::insertItem(BookmarkItem::BookmarkItemType type, const QModelIndex &parent) -{ - BookmarkItem *parentItem; - if(!parent.isValid()) { - parentItem = m_rootItem; - } else { - parentItem = static_cast(parent.internalPointer()); - if(parentItem->type() == BookmarkItem::Bookmark) - parentItem = parentItem->parentItem(); - } - - beginInsertRows(index(parentItem), parentItem->row(), parentItem->row()); - auto *node = new BookmarkItem(type, parentItem); - node->title = tr("title"); - node->href = tr("href"); - endInsertRows(); - - return index(node); -} - -bool BookmarksModel::removeItem(const QModelIndex &node) -{ - if(!node.isValid()) - return false; - - auto *item = static_cast(node.internalPointer()); - auto *parentItem = item->parentItem(); - - beginRemoveRows(node, node.row(), node.row()); - parentItem->removeChild(item); - delete item; - endRemoveRows(); - return true; -} - -int BookmarksModel::columnCount(const QModelIndex &parent) const -{ - if(parent.isValid()) { - return static_cast(parent.internalPointer())->columnCount(); - } else { - return m_rootItem->columnCount(); - } -} - -Qt::ItemFlags BookmarksModel::flags(const QModelIndex &index) const -{ - if(!index.isValid()) - return Qt::NoItemFlags; - - Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled; - auto *node = static_cast(index.internalPointer()); - switch(node->type()) { - case BookmarkItem::Root: - break; - case BookmarkItem::Folder: - flags |= Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; - break; - case BookmarkItem::Bookmark: - flags |= Qt::ItemIsEnabled | Qt::ItemNeverHasChildren | Qt::ItemIsDragEnabled; - break; - } - 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? - 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 TitleRole: - return item->title; - - case OpenUrlRole: - if(item->type() == BookmarkItem::Bookmark) { - return item->href; - } else { - return QVariant(); - } - - default: - return QVariant(); - } -} - -bool BookmarksModel::setData(const QModelIndex &index, const QVariant &value, int role) -{ - if(!index.isValid()) - return false; - - auto *node = static_cast(index.internalPointer()); - switch(node->type()) { - case BookmarkItem::Root: - return false; - - case BookmarkItem::Folder: - 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; - } - return false; - - case BookmarkItem::Bookmark: - 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; - } -} - -bool BookmarksModel::hasChildren(const QModelIndex &parent) const -{ - if(!parent.isValid()) { - return true; - } - - const BookmarkItem *parentItem = static_cast(parent.internalPointer()); - return (parentItem->type() == BookmarkItem::Folder); -} - -QModelIndexList BookmarksModel::match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const -{ - QModelIndexList list; - - // search root - BookmarkItem *searchRoot; - if(!start.isValid()) { - searchRoot = m_rootItem; - } else { - searchRoot = static_cast(start.internalPointer()); - } - - // iterate through searchRoot children - for(int i = 0; i < searchRoot->childCount(); ++i) { - BookmarkItem *item = searchRoot->child(i); - if(item->type() == BookmarkItem::Bookmark) { - if(item->href.contains(value.toString())) { - list.append(index(item, 1)); - } - } else if(item->type() == BookmarkItem::Folder) { - list.append(match(index(item), role, value, hits, flags)); - } - } - - return list; -} - -void BookmarksModel::expandItems(QTreeView *view, BookmarkItem *root) -{ - if(root == nullptr) - root = m_rootItem; - - // iterate through children - for(int i = 0; i < root->childCount(); ++i) { - BookmarkItem *childNode = root->child(i); - - // and if it's a folder - if(childNode->type() == BookmarkItem::Folder) { - QModelIndex idx = index(childNode); - view->setExpanded(idx, !childNode->folded); - - // only folders have children, so go through them - expandItems(view, childNode); - } - } -} -QMimeData *BookmarksModel::mimeData(const QModelIndexList &indexes) const -{ - auto *qMimeData = new QMimeData(); - QByteArray data; - - for(const QModelIndex &idx : indexes) { - if(idx.column() != 0 || !idx.isValid()) - continue; - - QByteArray encodedData; - QBuffer buffer(&encodedData); - buffer.open(QBuffer::ReadWrite); - Xbel writer(&buffer); - writer.write(static_cast(idx.internalPointer())); - - data.append(encodedData); - } - - qMimeData->setData(mimeTypes().first(), data); - - return qMimeData; -} - -bool BookmarksModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) -{ - if(action == Qt::IgnoreAction) - return true; - - // invalid format or column - if(!data->hasFormat(mimeTypes().first()) || column > 0) - return false; - - QByteArray bytes = data->data(mimeTypes().first()); - - QBuffer buffer(&bytes); - buffer.open(QIODevice::ReadOnly); - - Xbel reader(&buffer); - auto *parentItem = static_cast(parent.internalPointer()); - Q_CHECK_PTR(parentItem); - - beginInsertRows(parent, parentItem->row(), parentItem->row()); - reader.read(parentItem); - endInsertRows(); - - modified = true; - return true; -} -- cgit v1.2.1