Qt::ItemFlags RetroshareDirModel::flags( const QModelIndex & index ) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::flags()"; std::cerr << std::endl; #endif if (!index.isValid()) return (Qt::ItemIsSelectable); // Error. void *ref = index.internalPointer(); const DirDetails *details = requestDirDetails(ref, RemoteMode); if (!details) return Qt::ItemIsSelectable; // Error. switch(details->type) { case DIR_TYPE_PERSON: return Qt::ItemIsEnabled; case DIR_TYPE_DIR: return Qt::ItemIsSelectable | Qt::ItemIsEnabled; case DIR_TYPE_FILE: return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled; } return Qt::ItemIsSelectable; }
void RetroshareDirModel::getDirDetailsFromSelect (const QModelIndexList &list, std::vector <DirDetails>& dirVec) { dirVec.clear(); /* Fire off requests */ QModelIndexList::const_iterator it; for(it = list.begin(); it != list.end(); it++) { if(it->column()==1) { void *ref = it -> internalPointer(); DirDetails details; uint32_t flags = DIR_FLAGS_DETAILS; if (RemoteMode) { flags |= DIR_FLAGS_REMOTE; } else { flags |= DIR_FLAGS_LOCAL; } if (!requestDirDetails(ref, details, flags)) { continue; } dirVec.push_back(details); } } }
int TreeStyle_RDM::rowCount(const QModelIndex &parent) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::rowCount(): " << parent.internalPointer(); std::cerr << ": "; #endif void *ref = (parent.isValid())? parent.internalPointer() : NULL ; const DirDetails *details = requestDirDetails(ref, RemoteMode); if (!details) { #ifdef RDM_DEBUG std::cerr << "lookup failed -> 0"; std::cerr << std::endl; #endif return 0; } if (details->type == DIR_TYPE_FILE) { #ifdef RDM_DEBUG std::cerr << "lookup FILE: 0"; std::cerr << std::endl; #endif return 0; } /* else PERSON/DIR*/ #ifdef RDM_DEBUG std::cerr << "lookup PER/DIR #" << details->count; std::cerr << std::endl; #endif return details->count; }
Qt::ItemFlags RetroshareDirModel::flags( const QModelIndex & index ) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::flags()"; std::cerr << std::endl; #endif if (!index.isValid()) return (Qt::ItemIsSelectable); // Error. void *ref = index.internalPointer(); DirDetails details; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if (!requestDirDetails(ref, details, flags)) return Qt::ItemIsSelectable; // Error. switch(details.type) { case DIR_TYPE_PERSON: return Qt::ItemIsEnabled; case DIR_TYPE_DIR: return Qt::ItemIsSelectable | Qt::ItemIsEnabled; case DIR_TYPE_FILE: return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled; } return Qt::ItemIsSelectable; }
/* recursively download a directory */ void RetroshareDirModel::downloadDirectory(const DirDetails & dirDetails, int prefixLen) { if (dirDetails.type & DIR_TYPE_FILE) { std::list<std::string> srcIds; QString cleanPath = QDir::cleanPath(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str()) + "/" + QString::fromUtf8(dirDetails.path.substr(prefixLen).c_str())); srcIds.push_back(dirDetails.id); rsFiles->FileRequest(dirDetails.name, dirDetails.hash, dirDetails.count, cleanPath.toUtf8().constData(), RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds); } else if (dirDetails.type & DIR_TYPE_DIR) { std::list<DirStub>::const_iterator it; QDir dwlDir(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str())); QString cleanPath = QDir::cleanPath(QString::fromUtf8(dirDetails.path.substr(prefixLen).c_str())); if (!dwlDir.mkpath(cleanPath)) return; for (it = dirDetails.children.begin(); it != dirDetails.children.end(); it++) { if (!it->ref) continue; DirDetails subDirDetails; FileSearchFlags flags = RS_FILE_HINTS_REMOTE ; if (!requestDirDetails(it->ref, subDirDetails, flags)) continue; downloadDirectory(subDirDetails, prefixLen); } } }
void RetroshareDirModel::getFilePaths(const QModelIndexList &list, std::list<std::string> &fullpaths) { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::getFilePaths()" << std::endl; #endif if (RemoteMode) { #ifdef RDM_DEBUG std::cerr << "No File Paths for remote files" << std::endl; #endif return; } /* translate */ QModelIndexList::const_iterator it; for(it = list.begin(); it != list.end(); it++) { void *ref = it -> internalPointer(); DirDetails details; if (!requestDirDetails(ref, details, RS_FILE_HINTS_LOCAL)) { #ifdef RDM_DEBUG std::cerr << "getFilePaths() Bad Request" << std::endl; #endif continue; } if (details.type != DIR_TYPE_FILE) { #ifdef RDM_DEBUG std::cerr << "getFilePaths() Not File" << std::endl; #endif continue; /* not file! */ } #ifdef RDM_DEBUG std::cerr << "::::::::::::File Details:::: " << std::endl; std::cerr << "Name: " << details.name << std::endl; std::cerr << "Hash: " << details.hash << std::endl; std::cerr << "Size: " << details.count << std::endl; std::cerr << "Path: " << details.path << std::endl; #endif std::string filepath = details.path + "/"; filepath += details.name; #ifdef RDM_DEBUG std::cerr << "Constructed FilePath: " << filepath << std::endl; #endif if (fullpaths.end() == std::find(fullpaths.begin(), fullpaths.end(), filepath)) { fullpaths.push_back(filepath); } } #ifdef RDM_DEBUG std::cerr << "::::::::::::Done getFilePaths" << std::endl; #endif }
QModelIndex TreeStyle_RDM::index(int row, int column, const QModelIndex & parent) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::index(): " << parent.internalPointer(); std::cerr << ": row:" << row << " col:" << column << " "; #endif if(row < 0) return QModelIndex() ; void *ref = (parent.isValid()) ? parent.internalPointer() : NULL; /******** if (!RemoteMode) { remote = &(rsiface->getLocalDirectoryList()); } ********/ DirDetails details; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if (!requestDirDetails(ref, details, flags)) { #ifdef RDM_DEBUG std::cerr << "lookup failed -> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } /* now iterate through the details to * get the reference number */ std::list<DirStub>::iterator it; int i = 0; for(it = details.children.begin(); ((i < row) && (it != details.children.end())); ++it,++i) ; if (it == details.children.end()) { #ifdef RDM_DEBUG std::cerr << "wrong number of children -> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } #ifdef RDM_DEBUG std::cerr << "success index(" << row << "," << column << "," << it->ref << ")"; std::cerr << std::endl; #endif /* we can just grab the reference now */ return createIndex(row, column, it->ref); }
void RetroshareDirModel::getFileInfoFromIndexList(const QModelIndexList& list, std::list<DirDetails>& file_details) { file_details.clear() ; #ifdef RDM_DEBUG std::cerr << "recommendSelected()" << std::endl; #endif if (RemoteMode) { #ifdef RDM_DEBUG std::cerr << "Cannot recommend remote! (should download)" << std::endl; #endif } /* Fire off requests */ std::set<std::string> already_in ; for(QModelIndexList::const_iterator it(list.begin()); it != list.end(); ++it) if(it->column()==0) { void *ref = it -> internalPointer(); DirDetails details; uint32_t flags = DIR_FLAGS_DETAILS; if (RemoteMode) flags |= DIR_FLAGS_REMOTE; else flags |= DIR_FLAGS_LOCAL; if (!requestDirDetails(ref, details, flags)) continue; if(details.type == DIR_TYPE_PERSON) continue ; #ifdef RDM_DEBUG std::cerr << "::::::::::::FileRecommend:::: " << std::endl; std::cerr << "Name: " << details.name << std::endl; std::cerr << "Hash: " << details.hash << std::endl; std::cerr << "Size: " << details.count << std::endl; std::cerr << "Path: " << details.path << std::endl; #endif // Note: for directories, the returned hash, is the peer id, so if we collect // dirs, we need to be a bit more conservative for the if(already_in.find(details.hash+details.name) == already_in.end()) { file_details.push_back(details) ; already_in.insert(details.hash+details.name) ; } } #ifdef RDM_DEBUG std::cerr << "::::::::::::Done FileRecommend" << std::endl; #endif }
QModelIndex TreeStyle_RDM::index(int row, int column, const QModelIndex & parent) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::index(): " << parent.internalPointer(); std::cerr << ": row:" << row << " col:" << column << " "; #endif if(row < 0) return QModelIndex() ; void *ref = (parent.isValid()) ? parent.internalPointer() : NULL; /******** if (!RemoteMode) { remote = &(rsiface->getLocalDirectoryList()); } ********/ const DirDetailsVector *details = requestDirDetails(ref, RemoteMode); if (!details) { #ifdef RDM_DEBUG std::cerr << "lookup failed -> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } /* now iterate through the details to * get the reference number */ if (row >= (int) details->childrenVector.size()) { #ifdef RDM_DEBUG std::cerr << "wrong number of children -> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } #ifdef RDM_DEBUG std::cerr << "success index(" << row << "," << column << "," << details->childrenVector[row].ref << ")"; std::cerr << std::endl; #endif /* we can just grab the reference now */ return createIndex(row, column, details->childrenVector[row].ref); }
bool TreeStyle_RDM::hasChildren(const QModelIndex &parent) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::hasChildren() :" << parent.internalPointer(); std::cerr << ": "; #endif if (!parent.isValid()) { #ifdef RDM_DEBUG std::cerr << "root -> true "; std::cerr << std::endl; #endif return true; } void *ref = parent.internalPointer(); DirDetails details; uint32_t flags = DIR_FLAGS_CHILDREN; if (RemoteMode) flags |= DIR_FLAGS_REMOTE; else flags |= DIR_FLAGS_LOCAL; if (!requestDirDetails(ref, details, flags)) { /* error */ #ifdef RDM_DEBUG std::cerr << "lookup failed -> false"; std::cerr << std::endl; #endif return false; } if (details.type == DIR_TYPE_FILE) { #ifdef RDM_DEBUG std::cerr << "lookup FILE -> false"; std::cerr << std::endl; #endif return false; } /* PERSON/DIR*/ #ifdef RDM_DEBUG std::cerr << "lookup PER/DIR #" << details.count; std::cerr << std::endl; #endif return (details.count > 0); /* do we have children? */ }
void FlatStyle_RDM::updateRefs() { if(RsAutoUpdatePage::eventsLocked()) { _needs_update = true ; return ; } RetroshareDirModel::preMods() ; static const uint32_t MAX_REFS_PER_SECOND = 2000 ; uint32_t nb_treated_refs = 0 ; while(!_ref_stack.empty()) { void *ref = _ref_stack.back() ; #ifdef RDM_DEBUG std::cerr << "FlatStyle_RDM::postMods(): poped ref " << ref << std::endl; #endif _ref_stack.pop_back() ; uint32_t flags = DIR_FLAGS_DETAILS; DirDetails details ; if (requestDirDetails(ref, details, flags)) { if(details.type == DIR_TYPE_FILE) // only push files, not directories nor persons. _ref_entries.push_back(std::pair<void*,QString>(ref,computeDirectoryPath(details))); #ifdef RDM_DEBUG std::cerr << "FlatStyle_RDM::postMods(): addign ref " << ref << std::endl; #endif for(std::list<DirStub>::iterator it = details.children.begin(); it != details.children.end(); it++) _ref_stack.push_back(it->ref) ; } if(++nb_treated_refs > MAX_REFS_PER_SECOND) // we've done enough, let's give back hand to { // the user and setup a timer to finish the job later. _needs_update = true ; if(visible()) QTimer::singleShot(2000,this,SLOT(updateRefs())) ; else std::cerr << "Not visible: suspending update"<< std::endl; break ; } } std::cerr << "reference tab contains " << _ref_entries.size() << " files" << std::endl; if(_ref_stack.empty()) _needs_update = false ; RetroshareDirModel::postMods() ; }
QString FlatStyle_RDM::computeDirectoryPath(const DirDetails& details) const { QString dir ; const DirDetails *det = requestDirDetails(details.parent,RemoteMode); if(!det) return QString(); #ifdef SHOW_TOTAL_PATH do { #endif dir = QString::fromUtf8(det->name.c_str())+"/"+dir ; #ifdef SHOW_TOTAL_PATH if(!requestDirDetails(det.parent,det,flags)) break ; } while(det->parent != NULL); #endif return dir ; }
QString FlatStyle_RDM::computeDirectoryPath(const DirDetails& details) const { QString dir ; DirDetails det(details) ; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if(!requestDirDetails(det.parent,det,flags)) return QString(); #ifdef SHOW_TOTAL_PATH do { #endif dir = QString::fromUtf8(det.name.c_str())+"/"+dir ; #ifdef SHOW_TOTAL_PATH if(!requestDirDetails(det.parent,det,flags)) break ; } while(det.parent != NULL); #endif return dir ; }
QModelIndex TreeStyle_RDM::parent( const QModelIndex & index ) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::parent(): " << index.internalPointer(); std::cerr << ": "; #endif /* create the index */ if (!index.isValid()) { #ifdef RDM_DEBUG std::cerr << "Invalid Index -> invalid"; std::cerr << std::endl; #endif /* Parent is invalid too */ return QModelIndex(); } void *ref = index.internalPointer(); DirDetails details; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if (!requestDirDetails(ref, details, flags)) { #ifdef RDM_DEBUG std::cerr << "Failed Lookup -> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } if (!(details.parent)) { #ifdef RDM_DEBUG std::cerr << "success. parent is Root/NULL --> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } #ifdef RDM_DEBUG std::cerr << "success index(" << details.prow << ",0," << details.parent << ")"; std::cerr << std::endl; #endif return createIndex(details.prow, 0, details.parent); }
bool TreeStyle_RDM::hasChildren(const QModelIndex &parent) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::hasChildren() :" << parent.internalPointer(); std::cerr << ": "; #endif if (!parent.isValid()) { #ifdef RDM_DEBUG std::cerr << "root -> true "; std::cerr << std::endl; #endif return true; } void *ref = parent.internalPointer(); const DirDetails *details = requestDirDetails(ref, RemoteMode); if (!details) { /* error */ #ifdef RDM_DEBUG std::cerr << "lookup failed -> false"; std::cerr << std::endl; #endif return false; } if (details->type == DIR_TYPE_FILE) { #ifdef RDM_DEBUG std::cerr << "lookup FILE -> false"; std::cerr << std::endl; #endif return false; } /* PERSON/DIR*/ #ifdef RDM_DEBUG std::cerr << "lookup PER/DIR #" << details->count; std::cerr << std::endl; #endif return (details->count > 0); /* do we have children? */ }
QModelIndex TreeStyle_RDM::parent( const QModelIndex & index ) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::parent(): " << index.internalPointer(); std::cerr << ": "; #endif /* create the index */ if (!index.isValid()) { #ifdef RDM_DEBUG std::cerr << "Invalid Index -> invalid"; std::cerr << std::endl; #endif /* Parent is invalid too */ return QModelIndex(); } void *ref = index.internalPointer(); const DirDetails *details = requestDirDetails(ref, RemoteMode); if (!details) { #ifdef RDM_DEBUG std::cerr << "Failed Lookup -> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } if (!(details->parent)) { #ifdef RDM_DEBUG std::cerr << "success. parent is Root/NULL --> invalid"; std::cerr << std::endl; #endif return QModelIndex(); } #ifdef RDM_DEBUG std::cerr << "success index(" << details->prow << ",0," << details->parent << ")"; std::cerr << std::endl; #endif return createIndex(details->prow, 0, details->parent); }
void RetroshareDirModel::getAgeIndicatorRec(DirDetails &details, QString &ret) const { if (details.type == DIR_TYPE_FILE) { ret = getAgeIndicatorString(details); return; } else if (details.type == DIR_TYPE_DIR && ret.isEmpty()) { std::list<DirStub>::iterator it; for (it = details.children.begin(); it != details.children.end(); it++) { void *ref = it->ref; DirDetails childDetails; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if (requestDirDetails(ref, childDetails, flags) && ret == tr("")) getAgeIndicatorRec(childDetails, ret); } } }
void RetroshareDirModel::getDirDetailsFromSelect (const QModelIndexList &list, std::vector <DirDetails>& dirVec) { dirVec.clear(); /* Fire off requests */ QModelIndexList::const_iterator it; for(it = list.begin(); it != list.end(); it++) { if(it->column()==1) { void *ref = it -> internalPointer(); const DirDetails *details = requestDirDetails(ref, RemoteMode); if (!details) continue; dirVec.push_back(*details); } } }
int TreeStyle_RDM::rowCount(const QModelIndex &parent) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::rowCount(): " << parent.internalPointer(); std::cerr << ": "; #endif void *ref = (parent.isValid())? parent.internalPointer() : NULL ; DirDetails details; uint32_t flags = DIR_FLAGS_CHILDREN; if (RemoteMode) flags |= DIR_FLAGS_REMOTE; else flags |= DIR_FLAGS_LOCAL; if (!requestDirDetails(ref, details, flags)) { #ifdef RDM_DEBUG std::cerr << "lookup failed -> 0"; std::cerr << std::endl; #endif return 0; } if (details.type == DIR_TYPE_FILE) { #ifdef RDM_DEBUG std::cerr << "lookup FILE: 0"; std::cerr << std::endl; #endif return 0; } /* else PERSON/DIR*/ #ifdef RDM_DEBUG std::cerr << "lookup PER/DIR #" << details.count; std::cerr << std::endl; #endif return details.count; }
void RetroshareDirModel::getDirDetailsFromSelect (const QModelIndexList &list, std::vector <DirDetails>& dirVec) { dirVec.clear(); /* Fire off requests */ QModelIndexList::const_iterator it; for(it = list.begin(); it != list.end(); it++) { if(it->column()==1) { void *ref = it -> internalPointer(); DirDetails details; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if (!requestDirDetails(ref, details, flags)) continue; dirVec.push_back(details); } } }
QVariant RetroshareDirModel::data(const QModelIndex &index, int role) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::data(): " << index.internalPointer(); std::cerr << ": "; std::cerr << std::endl; #endif if (!index.isValid()) return QVariant(); /* get the data from the index */ void *ref = index.internalPointer(); int coln = index.column(); const DirDetails *details = requestDirDetails(ref, RemoteMode); if (!details) return QVariant(); if (role == RetroshareDirModel::FileNameRole) /* end of FileNameRole */ return QString::fromUtf8(details->name.c_str()); if (role == Qt::TextColorRole) { if(details->min_age > ageIndicator) return QVariant(QColor(Qt::gray)) ; else if(RemoteMode) { FileInfo info; QVariant local_file_color = QVariant(QColor(Qt::red)); if(rsFiles->alreadyHaveFile(details->hash, info)) return local_file_color; std::list<RsFileHash> downloads; rsFiles->FileDownloads(downloads); if(std::find(downloads.begin(), downloads.end(), details->hash) != downloads.end()) return local_file_color; else return QVariant(); } else return QVariant() ; // standard } /* end of TextColorRole */ if(role == Qt::DecorationRole) return decorationRole(*details,coln) ; /***************** Qt::EditRole Qt::ToolTipRole Qt::StatusTipRole Qt::WhatsThisRole Qt::SizeHintRole ****************/ if (role == Qt::SizeHintRole) { return QVariant(); // Use standard } /* end of SizeHintRole */ if (role == Qt::TextAlignmentRole) { if(coln == 1) { return int( Qt::AlignRight | Qt::AlignVCenter); } return QVariant(); } /* end of TextAlignmentRole */ if (role == Qt::DisplayRole) return displayRole(*details,coln) ; if (role == SortRole) return sortRole(index,*details,coln) ; return QVariant(); }
QVariant RetroshareDirModel::data(const QModelIndex &index, int role) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::data(): " << index.internalPointer(); std::cerr << ": "; std::cerr << std::endl; #endif if (!index.isValid()) return QVariant(); /* get the data from the index */ void *ref = index.internalPointer(); int coln = index.column(); const DirDetails *details = requestDirDetails(ref, RemoteMode); if (!details) return QVariant(); if (role == RetroshareDirModel::FileNameRole) /* end of FileNameRole */ return QString::fromUtf8(details->name.c_str()); if (role == Qt::TextColorRole) { if(details->min_age > ageIndicator) return QVariant(QColor(Qt::gray)) ; else return QVariant() ; // standard } /* end of TextColorRole */ if(role == Qt::DecorationRole) return decorationRole(*details,coln) ; /***************** Qt::EditRole Qt::ToolTipRole Qt::StatusTipRole Qt::WhatsThisRole Qt::SizeHintRole ****************/ if (role == Qt::SizeHintRole) { return QSize(18, 18); } /* end of SizeHintRole */ if (role == Qt::TextAlignmentRole) { if(coln == 1) { return int( Qt::AlignRight | Qt::AlignVCenter); } return QVariant(); } /* end of TextAlignmentRole */ if (role == Qt::DisplayRole) return displayRole(*details,coln) ; if (role == SortRole) return sortRole(index,*details,coln) ; return QVariant(); }
QVariant RetroshareDirModel::data(const QModelIndex &index, int role) const { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::data(): " << index.internalPointer(); std::cerr << ": "; std::cerr << std::endl; #endif if (!index.isValid()) return QVariant(); /* get the data from the index */ void *ref = index.internalPointer(); int coln = index.column(); DirDetails details; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if (!requestDirDetails(ref, details, flags)) return QVariant(); if (role == RetroshareDirModel::FileNameRole) /* end of FileNameRole */ return QString::fromUtf8(details.name.c_str()); if (role == Qt::TextColorRole) { if(details.min_age > ageIndicator) return Qt::gray ; else return Qt::black ; } /* end of TextColorRole */ if(role == Qt::DecorationRole) return decorationRole(details,coln) ; /***************** Qt::EditRole Qt::ToolTipRole Qt::StatusTipRole Qt::WhatsThisRole Qt::SizeHintRole ****************/ if (role == Qt::SizeHintRole) { return QSize(18, 18); } /* end of SizeHintRole */ if (role == Qt::TextAlignmentRole) { if(coln == 1) { return int( Qt::AlignRight | Qt::AlignVCenter); } return QVariant(); } /* end of TextAlignmentRole */ if (role == Qt::DisplayRole) return displayRole(details,coln) ; if (role == SortRole) return sortRole(index,details,coln) ; return QVariant(); }
/* Drag and Drop Functionality */ QMimeData * RetroshareDirModel::mimeData ( const QModelIndexList & indexes ) const { /* extract from each the member text */ std::string text; QModelIndexList::const_iterator it; std::map<std::string, uint64_t> drags; std::map<std::string, uint64_t>::iterator dit; for(it = indexes.begin(); it != indexes.end(); it++) { void *ref = it -> internalPointer(); DirDetails details; uint32_t flags = DIR_FLAGS_DETAILS; if (RemoteMode) { flags |= DIR_FLAGS_REMOTE; } else { flags |= DIR_FLAGS_LOCAL; } if (!requestDirDetails(ref, details, flags)) { continue; } #ifdef RDM_DEBUG std::cerr << "::::::::::::FileDrag:::: " << std::endl; std::cerr << "Name: " << details.name << std::endl; std::cerr << "Hash: " << details.hash << std::endl; std::cerr << "Size: " << details.count << std::endl; std::cerr << "Path: " << details.path << std::endl; #endif if (details.type != DIR_TYPE_FILE) { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::mimeData() Not File" << std::endl; #endif continue; /* not file! */ } if (drags.end() != (dit = drags.find(details.hash))) { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::mimeData() Duplicate" << std::endl; #endif continue; /* duplicate */ } drags[details.hash] = details.count; std::string line = details.name; line += "/"; line += details.hash; line += "/"; { std::ostringstream out; out << details.count; line += out.str(); line += "/"; } if (RemoteMode) { line += "Remote"; } else { line += "Local"; } line += "/\n"; text += line; } #ifdef RDM_DEBUG std::cerr << "Created MimeData:"; std::cerr << std::endl; std::cerr << text; std::cerr << std::endl; #endif QMimeData *data = new QMimeData(); data->setData("application/x-rsfilelist", QByteArray(text.c_str())); return data; }
/* Drag and Drop Functionality */ QMimeData * RetroshareDirModel::mimeData ( const QModelIndexList & indexes ) const { /* extract from each the member text */ QString text; QModelIndexList::const_iterator it; std::map<std::string, uint64_t> drags; std::map<std::string, uint64_t>::iterator dit; for(it = indexes.begin(); it != indexes.end(); it++) { void *ref = it -> internalPointer(); DirDetails details; FileSearchFlags flags = (RemoteMode)?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL; if (!requestDirDetails(ref, details, flags)) { continue; } #ifdef RDM_DEBUG std::cerr << "::::::::::::FileDrag:::: " << std::endl; std::cerr << "Name: " << details.name << std::endl; std::cerr << "Hash: " << details.hash << std::endl; std::cerr << "Size: " << details.count << std::endl; std::cerr << "Path: " << details.path << std::endl; #endif if (details.type != DIR_TYPE_FILE) { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::mimeData() Not File" << std::endl; #endif continue; /* not file! */ } if (drags.end() != (dit = drags.find(details.hash))) { #ifdef RDM_DEBUG std::cerr << "RetroshareDirModel::mimeData() Duplicate" << std::endl; #endif continue; /* duplicate */ } drags[details.hash] = details.count; QString line = QString("%1/%2/%3/").arg(QString::fromUtf8(details.name.c_str()), QString::fromStdString(details.hash), QString::number(details.count)); if (RemoteMode) { line += "Remote"; } else { line += "Local"; } line += "/\n"; text += line; } #ifdef RDM_DEBUG std::cerr << "Created MimeData:"; std::cerr << std::endl; std::cerr << text; std::cerr << std::endl; #endif QMimeData *data = new QMimeData(); data->setData("application/x-rsfilelist", text.toUtf8()); return data; }