void Account::handleFileList (const QList<DriveItem>& items)
{
QList<QList<QStandardItem*>> treeItems;
QHash<QString, QStandardItem*> id2ItemDir;
QHash<QString, DriveItem> trashedItems;
QList<DriveItem> othersItems;
Q_FOREACH (const DriveItem& item, items)
{
if (item.Labels_ & DriveItem::ILRemoved)
{
trashedItems [item.Id_] = item;
continue;
}
if (item.ParentIsRoot_)
treeItems << CreateNewItem (item, id2ItemDir);
else
othersItems << item;
}
int i = 0;
while (!othersItems.isEmpty ())
{
if (othersItems.count () == i)
break;
DriveItem item = othersItems.at (i++);
if (id2ItemDir.contains (item.ParentId_))
{
auto row = CreateNewItem (item, id2ItemDir);
id2ItemDir [item.ParentId_]->appendRow (row);
othersItems.removeAt (i - 1);
i = 0;
}
}
QList<DriveItem> result;
QStringList removedKeys;
Q_FOREACH (const auto& key, trashedItems.keys ())
{
const auto& item = trashedItems [key];
if (!trashedItems.contains (item.ParentId_))
{
treeItems << CreateNewItem (trashedItems [key], id2ItemDir);
removedKeys << key;
}
}
for (const auto& key : removedKeys)
trashedItems.remove (key);
i = 0;
while (!trashedItems.isEmpty ())
{
if (trashedItems.count () == i)
break;
auto key = trashedItems.keys ().at (i++);
DriveItem item = trashedItems [key];
if (id2ItemDir.contains (item.ParentId_))
{
auto row = CreateNewItem (item, id2ItemDir);
id2ItemDir [item.ParentId_]->appendRow (row);
trashedItems.remove (key);
i = 0;
}
}
emit gotListing (QList<QList<QStandardItem*>> ());
emit gotListing (treeItems);
}