##// END OF EJS Templates
Really basic implementation of Downloader which might replace current...
Really basic implementation of Downloader which might replace current NetworkController It is currently really basic, it only does synchronous DLs with or without authentication. It is written to isolate as much as possible Qt Network classes. Signed-off-by: Alexis Jeandet <alexis.jeandet@member.fsf.org>

File last commit:

r1308:c5e93e891fc6
r1342:91cbf8a85daf
Show More
CatalogueTreeModel.cpp
219 lines | 5.8 KiB | text/x-c | CppLexer
/ gui / src / Catalogue / CatalogueTreeModel.cpp
#include "Catalogue/CatalogueTreeModel.h"
#include <Catalogue/CatalogueTreeItems/CatalogueAbstractTreeItem.h>
#include <QMimeData>
#include <memory>
#include <Common/MimeTypesDef.h>
struct CatalogueTreeModel::CatalogueTreeModelPrivate {
std::unique_ptr<CatalogueAbstractTreeItem> m_RootItem = nullptr;
CatalogueTreeModelPrivate() : m_RootItem{std::make_unique<CatalogueAbstractTreeItem>()} {}
};
CatalogueTreeModel::CatalogueTreeModel(QObject *parent)
: QAbstractItemModel(parent), impl{spimpl::make_unique_impl<CatalogueTreeModelPrivate>()}
{
}
QModelIndex CatalogueTreeModel::addTopLevelItem(CatalogueAbstractTreeItem *item)
{
auto nbTopLevelItems = impl->m_RootItem->children().count();
beginInsertRows(QModelIndex(), nbTopLevelItems, nbTopLevelItems);
impl->m_RootItem->addChild(item);
endInsertRows();
emit dataChanged(QModelIndex(), QModelIndex());
return index(nbTopLevelItems, 0);
}
QVector<CatalogueAbstractTreeItem *> CatalogueTreeModel::topLevelItems() const
{
return impl->m_RootItem->children();
}
void CatalogueTreeModel::addChildItem(CatalogueAbstractTreeItem *child,
const QModelIndex &parentIndex)
{
auto parentItem = item(parentIndex);
int c = parentItem->children().count();
beginInsertRows(parentIndex, c, c);
parentItem->addChild(child);
endInsertRows();
emit dataChanged(parentIndex, parentIndex);
}
void CatalogueTreeModel::removeChildItem(CatalogueAbstractTreeItem *child,
const QModelIndex &parentIndex)
{
auto parentItem = item(parentIndex);
int i = parentItem->children().indexOf(child);
beginRemoveRows(parentIndex, i, i);
parentItem->removeChild(child);
endRemoveRows();
emit dataChanged(parentIndex, parentIndex);
}
void CatalogueTreeModel::refresh(const QModelIndex &index)
{
emit dataChanged(index, index);
}
CatalogueAbstractTreeItem *CatalogueTreeModel::item(const QModelIndex &index) const
{
return static_cast<CatalogueAbstractTreeItem *>(index.internalPointer());
}
QModelIndex CatalogueTreeModel::indexOf(CatalogueAbstractTreeItem *item, int column) const
{
auto parentItem = item->parent();
if (!parentItem) {
return QModelIndex();
}
auto row = parentItem->children().indexOf(item);
return createIndex(row, column, item);
}
QModelIndex CatalogueTreeModel::index(int row, int column, const QModelIndex &parent) const
{
if (column > 0) {
int a = 0;
}
if (!hasIndex(row, column, parent)) {
return QModelIndex();
}
CatalogueAbstractTreeItem *parentItem = nullptr;
if (!parent.isValid()) {
parentItem = impl->m_RootItem.get();
}
else {
parentItem = item(parent);
}
auto childItem = parentItem->children().value(row);
if (childItem) {
return createIndex(row, column, childItem);
}
return QModelIndex();
}
QModelIndex CatalogueTreeModel::parent(const QModelIndex &index) const
{
if (!index.isValid()) {
return QModelIndex();
}
auto childItem = item(index);
auto parentItem = childItem->parent();
if (parentItem == nullptr || parentItem->parent() == nullptr) {
return QModelIndex();
}
auto row = parentItem->parent()->children().indexOf(parentItem);
return createIndex(row, 0, parentItem);
}
int CatalogueTreeModel::rowCount(const QModelIndex &parent) const
{
CatalogueAbstractTreeItem *parentItem = nullptr;
if (!parent.isValid()) {
parentItem = impl->m_RootItem.get();
}
else {
parentItem = item(parent);
}
return parentItem->children().count();
}
int CatalogueTreeModel::columnCount(const QModelIndex &parent) const
{
return (int)Column::Count;
}
Qt::ItemFlags CatalogueTreeModel::flags(const QModelIndex &index) const
{
auto treeItem = item(index);
if (treeItem) {
return treeItem->flags(index.column());
}
return Qt::NoItemFlags;
}
QVariant CatalogueTreeModel::data(const QModelIndex &index, int role) const
{
auto treeItem = item(index);
if (treeItem) {
return treeItem->data(index.column(), role);
}
return QModelIndex();
}
bool CatalogueTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
auto treeItem = item(index);
if (treeItem) {
auto result = treeItem->setData(index.column(), role, value);
if (result && index.column() == (int)Column::Name) {
emit itemRenamed(index);
}
return result;
}
return false;
}
bool CatalogueTreeModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row,
int column, const QModelIndex &parent) const
{
auto draggedIndex = parent;
auto draggedItem = item(draggedIndex);
if (draggedItem) {
return draggedItem->canDropMimeData(data, action);
}
return false;
}
bool CatalogueTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row,
int column, const QModelIndex &parent)
{
bool result = false;
auto draggedIndex = parent;
auto draggedItem = item(draggedIndex);
if (draggedItem) {
result = draggedItem->dropMimeData(data, action);
if (result) {
emit itemDropped(draggedIndex, data, action);
}
}
return result;
}
Qt::DropActions CatalogueTreeModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction;
}
QStringList CatalogueTreeModel::mimeTypes() const
{
return {MIME_TYPE_EVENT_LIST, MIME_TYPE_SOURCE_CATALOGUE_LIST};
}