Ejemplo n.º 1
0
void QueryResultsNode::contextMenu(const QModelIndexList &list, INodeView *view)
{
    typedef QSet<QueryResultItem::Holder>              ItemsSet;
    typedef QList<QueryResultItem::Holder>             ItemsList;
    typedef QMap<QueryResultItem::Holder, QModelIndex> ItemsIndexMap;

    ItemsSet set;
    ItemsList items;
    QueryResultItem::Holder item;
    ItemsIndexMap itemsIndex;
    ContextMenu contextMenu(m_container.container());

    for (ItemsList::size_type i = 0, size = list.size(); i < size; ++i)
        if ((item = static_cast<QueryResultItem *>(list.at(i).internalPointer())).as<QueryResultItem>()->isPath() && !set.contains(item))
        {
            set.insert(item);
            itemsIndex[item] = list.at(i);
            contextMenu.add(item, item.as<QueryResultPathItem>()->info());
        }

    items = set.toList();

    contextMenu.add(Default::GlobalActions::instance()->copyAction(), ContextMenu::GeneralSection);
    contextMenu.add(Default::GlobalActions::instance()->cutAction(), ContextMenu::GeneralSection);

    if (items.size() == 1 && items.at(0).as<QueryResultPathItem>()->info()->isDir())
        contextMenu.add(Default::GlobalActions::instance()->pasteIntoFolderAction(), ContextMenu::GeneralSection);

    contextMenu.add(Default::GlobalActions::instance()->propertiesAction(), ContextMenu::PropertiesSection);

    if (const Action *action = contextMenu.exec())
    {
        Action::FilesList files = contextMenu.files(action);

        if (action->isAsynchronous())
        {
            ::Tools::Memory::ScopedPointer<PerformActionTask> task;

            if (task = static_cast<const AsyncAction *>(action)->process(this, m_container.container(), files))
            {
                Union update;
                Snapshot::Files list(m_container.container());

                for (Action::FilesList::size_type i = 0, size = files.size(); i < size; ++i)
                {
                    item = files.at(i).first;

//                    item->lock(static_cast<const AsyncAction *>(action)->lockReason());
//                    update.add(itemsIndex.value(item));
                    list.add(item.as<QueryResultPathItem>()->info()->fileName(), item);
                }

//                addTask(task.take(), list);
//                updateFirstColumn(update);
            }
        }
        else
            static_cast<const SyncAction *>(action)->process(m_container.container(), files);
    }
}