示例#1
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;
}
示例#2
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();
}
示例#3
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;
}