void USBLinkTreeWidget::usblink_dirlist_callback(struct usblink_file *file, bool is_error, void *data) { if(is_error) return; QTreeWidget *w = static_cast<QTreeWidget*>(data); //End of enumeration or error if(!file) { //Find a dir to fill with entries for(int i = 0; i < w->topLevelItemCount(); ++i) if(usblink_dirlist_nested(w->topLevelItem(i))) return; // FIXME: If a file is transferred concurrently, this may never be set to false. if(usblink_queue_size() == 1) usblink_tree->doing_dirlist = false; return; } //Add directory entry to tree widget emit usblink_tree->wantToAddTreeItem(itemForUSBLinkFile(file), nullptr); }
void USBLinkTreeWidget::usblink_dirlist_callback_nested(struct usblink_file *file, bool is_error, void *data) { QTreeWidgetItem *w = static_cast<QTreeWidgetItem*>(data); //End of enumeration or error if(!file) { w->setData(1, Qt::UserRole, QVariant(true)); //Dir is now filled if(!is_error) { //Find a dir to fill with entries for(int i = 0; i < w->treeWidget()->topLevelItemCount(); ++i) if(usblink_dirlist_nested(w->treeWidget()->topLevelItem(i))) return; } // FIXME: If a file is transferred concurrently, this may never be set to false. if(usblink_queue_size() == 1) usblink_tree->doing_dirlist = false; return; } //Add directory entry to tree widget item (parent) emit usblink_tree->wantToAddTreeItem(itemForUSBLinkFile(file), w); }
static bool usblink_dirlist_nested(QTreeWidgetItem *w) { if(w->data(0, Qt::UserRole).value<bool>() == false) //Not a directory return false; if(w->data(1, Qt::UserRole).value<bool>() == false) //Not filled yet { QByteArray path_utf8 = usblink_path_item(w).toUtf8(); usblink_queue_dirlist(path_utf8.data(), MainWindow::usblink_dirlist_callback_nested, w); return true; } else { for(int i = 0; i < w->childCount(); ++i) if(usblink_dirlist_nested(w->child(i))) return true; } return false; }
bool USBLinkTreeWidget::usblink_dirlist_nested(QTreeWidgetItem *w) { // Find a directory (w or its children) to fill if(w->data(0, Qt::UserRole).value<bool>() == false) //Not a directory return false; if(w->data(1, Qt::UserRole).value<bool>() == false) //Not filled yet { std::string path_utf8 = usblink_path_item(w).toStdString(); usblink_queue_dirlist(path_utf8, USBLinkTreeWidget::usblink_dirlist_callback_nested, w); return true; } else { for(int i = 0; i < w->childCount(); ++i) if(usblink_dirlist_nested(w->child(i))) return true; } return false; }
void MainWindow::usblink_dirlist_callback(struct usblink_file *file, void *data) { QTreeWidget *w = static_cast<QTreeWidget*>(data); //End of enumeration or error if(!file) { refresh_filebrowser = true; //Find a dir to fill with entries for(int i = 0; i < w->topLevelItemCount(); ++i) if(usblink_dirlist_nested(w->topLevelItem(i))) return; return; } //Add directory entry to tree widget QTreeWidgetItem *item = new QTreeWidgetItem({QString::fromUtf8(file->filename), file->is_dir ? "" : naturalSize(file->size)}); item->setData(0, Qt::UserRole, QVariant(file->is_dir)); item->setData(1, Qt::UserRole, QVariant(false)); w->addTopLevelItem(item); }