示例#1
0
QModelIndex InventoryItemModel::parent(const QModelIndex &index) const
{
    if (!index.isValid())
        return QModelIndex();

    AbstractInventoryItem *childItem = GetItem(index);
    assert(childItem);
    InventoryFolder *parentItem = static_cast<InventoryFolder *>(childItem->GetParent());
    if (parentItem == static_cast<InventoryFolder *>(dataModel_->GetRoot()))
        return QModelIndex();

    return createIndex(parentItem->Row(), 0, reinterpret_cast<void *>(static_cast<AbstractInventoryItem*>(parentItem)));

/*
    if (!index.isValid())
        return QModelIndex();

    TreeItem *childItem = getItem(index);
    TreeItem *parentItem = childItem->parent();

    if (parentItem == rootItem)
        return QModelIndex();

    return createIndex(parentItem->childNumber(), 0, parentItem);
*/
}
示例#2
0
QMimeData *InventoryItemModel::mimeData(const QModelIndexList &indexes) const
{
    QMimeData *mimeData = new QMimeData();
    QByteArray encodedData;
    QDataStream stream(&encodedData, QIODevice::WriteOnly);

    foreach(QModelIndex index, indexes)
    {
        if (index.isValid())
        {
            QString info, asset_type, asset_ref;

            AbstractInventoryItem *item = GetItem(index);
            InventoryAsset *asset = dynamic_cast<InventoryAsset *>(item);
            if (asset)
            {
                asset_type.append(QString("%1").arg(asset->GetAssetType()));
                asset_ref = asset->GetAssetReference();
            }
            else
            {
                asset_type.append(QString("%1").arg(RexTypes::RexAT_None));
                asset_ref = RexUUID().ToString().c_str();
            }

            info.append(asset_type + ";" + item->GetID() + ";" + item->GetName() + ";" + asset_ref);
            stream << info;
        }
    }

    mimeData->setData("application/vnd.inventory.item", encodedData);
    return mimeData;
}
示例#3
0
Qt::ItemFlags InventoryItemModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = Qt::ItemIsEnabled;
    if (!index.isValid())
        return flags;

    AbstractInventoryItem *item = GetItem(index);
    AbstractInventoryItem::InventoryItemType type = item->GetItemType();
    if (type == AbstractInventoryItem::Type_Asset)
    {
        if (!item->IsLibraryItem())
            flags |= Qt::ItemIsDropEnabled;
        flags |= Qt::ItemIsDragEnabled;
    }

    if (type == AbstractInventoryItem::Type_Folder)
        if (!item->IsLibraryItem())
            flags |= Qt::ItemIsDropEnabled;

    if (!item->IsEditable())
        return flags;

    flags |= Qt::ItemIsSelectable;

    if (type == AbstractInventoryItem::Type_Folder)
        flags |= Qt::ItemIsDragEnabled;

    flags |= Qt::ItemIsEditable;

    return flags;
}
示例#4
0
bool InventoryItemModel::canFetchMore(const QModelIndex & parent) const
{
    AbstractInventoryItem *item = GetItem(parent);
    if (item && item->GetItemType() == AbstractInventoryItem::Type_Folder)
    {
        InventoryFolder *folder = dynamic_cast<InventoryFolder*>(item);
        if (folder)
            return folder->IsDirty();
    }
    return false;
}
示例#5
0
bool InventoryItemModel::Open(const QModelIndex &index)
{
    AbstractInventoryItem *item = GetItem(index);

    if (item->GetItemType() == AbstractInventoryItem::Type_Folder)
    {
        fetchMore(index);
        return canFetchMore(index);
    }

    if (item->GetItemType() == AbstractInventoryItem::Type_Asset)
        return dataModel_->OpenItem(item);

    return false;
}
示例#6
0
void InventoryTreeView::dragMoveEvent(QDragMoveEvent *event)
{
    if (event->mimeData()->hasFormat("application/vnd.inventory.item"))
    {
        if (event->source() == this)
        {
            InventoryItemModel *itemModel = checked_static_cast<InventoryItemModel *>(model());
            assert(itemModel);

            AbstractInventoryItem *draggedItem = itemModel->GetItem(selectionModel()->currentIndex());
            assert(draggedItem);
            QModelIndex destIndex = indexAt(event->pos());

            if (!destIndex.isValid())
            {
                event->ignore();
                return;
            }

            AbstractInventoryItem *destItem = 0;

            if (itemModel->GetItem(destIndex)->GetItemType() == AbstractInventoryItem::Type_Asset)
                destItem = itemModel->GetItem(destIndex)->GetParent();
            else
                destItem = itemModel->GetItem(destIndex);

            if (!destItem || destItem->IsLibraryItem() || (draggedItem->GetParent() == destItem))
            {
                event->ignore();
                return;
            }

            if (draggedItem ->IsLibraryItem())
                event->setDropAction(Qt::CopyAction);
            else
                event->setDropAction(Qt::MoveAction);

            event->accept();
        }
        else
            event->acceptProposedAction();
    }
    else if(event->mimeData()->hasUrls())
        event->accept();
    else
        event->ignore();
}
示例#7
0
int InventoryItemModel::rowCount(const QModelIndex &parent) const
{
    if (parent.column() > 0 || !dataModel_->GetRoot())
        return 0;

    if (!parent.isValid())
        dynamic_cast<InventoryFolder *>(dataModel_->GetRoot())->ChildCount();

    AbstractInventoryItem *item = GetItem(parent);
    if (item->GetItemType() == AbstractInventoryItem::Type_Folder)
    {
        InventoryFolder *parentFolder = static_cast<InventoryFolder *>(item);
        return parentFolder->ChildCount();
    }

    return 0;
}
示例#8
0
QVariant InventoryItemModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    AbstractInventoryItem *item = GetItem(index);

    if (role == Qt::DecorationRole)
    {
        if (item->GetItemType() == AbstractInventoryItem::Type_Folder)
            return QIcon(":images/iconFolderClosed.png");

        if (item->GetItemType() == AbstractInventoryItem::Type_Asset)
            return QIcon(":images/iconResource.png");
    }

    if (role != Qt::DisplayRole)
        return QVariant();

    return QVariant(item->GetName());
}
示例#9
0
bool InventoryItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (role != Qt::EditRole)
        return false;

    AbstractInventoryItem *item = GetItem(index);

    InventoryFolder *folder = dynamic_cast<InventoryFolder *>(item);
    if (folder && !folder->IsEditable())
            return false;
    if (item->GetName() == value.toString())
        return false;

    QString oldName = item->GetName();
    item->SetName(value.toString());

    // Is this needed anymore?  
    emit dataChanged(index, index);

    // Notify server. Give updated item and old name (webdav needs this at least)
    dataModel_->NotifyServerAboutItemUpdate(item, oldName);

    return true;
}
示例#10
0
bool InventoryItemModel::removeRows(int position, int rows, const QModelIndex &parent)
{
    InventoryFolder *parentFolder = dynamic_cast<InventoryFolder *>(GetItem(parent));
    if (!parentFolder)
        return false;

    AbstractInventoryItem *childItem = parentFolder->Child(position);
    if (!childItem)
        return false;

    if (childItem->GetItemType() == AbstractInventoryItem::Type_Folder)
        if (!static_cast<InventoryFolder *>(childItem)->IsEditable())
            return false;

    bool removeRow = false;
    if (itemMoveFlag_)
    {
        // We don't want to notify server if we're just moving (i.e. deleting temporarily from one location).
        int idx = itemsToBeMoved_.indexOf(childItem->GetID());
        if (idx != -1)
        {
            // Do not remove library items from the model.
            if (!childItem->IsLibraryItem())
                removeRow = true;

            itemsToBeMoved_.remove(idx);
        }
    }
    //else if(!itemMoveFlag_ && itemsToBeMoved_.size() == 0)
    else
    {
        removeRow = true;

        if(useTrash_)
        {
            // When deleting items, we move them first to the Trash folder.
            InventoryFolder *trashFolder = static_cast<InventoryFolder *>(dataModel_->GetTrashFolder());
            if (parentFolder == trashFolder)
            {
                // If the folder is already in the trash folder, delete it for good.
                dataModel_->NotifyServerAboutItemRemove(childItem);
            }
            else
            {
                // Move to the Trash folder.
                dataModel_->NotifyServerAboutItemMove(childItem);
                InsertExistingItem(position, trashFolder, childItem);
            }
        }
        else
            dataModel_->NotifyServerAboutItemRemove(childItem);
    }

    if (itemsToBeMoved_.size() <= 0)
        itemMoveFlag_ = false;

    if (removeRow)
    {
        beginRemoveRows(parent, position, position + rows - 1);
        bool success = parentFolder->RemoveChildren(position, rows);
        endRemoveRows();
        return success;
    }

    return false;
}