diff --git a/libretroshare/src/dbase/fimonitor.cc b/libretroshare/src/dbase/fimonitor.cc index 7756d7759..a20d35e68 100644 --- a/libretroshare/src/dbase/fimonitor.cc +++ b/libretroshare/src/dbase/fimonitor.cc @@ -195,31 +195,34 @@ bool FileIndexMonitor::loadLocalCache(const CacheData &data) /* called with sto { bool ok = false; - fiMutex.lock(); { /* LOCKED DIRS */ + fiMutex.lock(); + { /* LOCKED DIRS */ - //fi.root->name = data.pid; + //fi.root->name = data.pid; - /* More error checking needed here! */ + /* More error checking needed here! */ - std::string name = data.name ; // this trick allows to load the complete file. Not the one being shared. - name[name.length()-1] = 'c' ; + std::string name = data.name ; // this trick allows to load the complete file. Not the one being shared. + name[name.length()-1] = 'c' ; - if ((ok = fi.loadIndex(data.path + '/' + name, "", data.size))) - { + if ((ok = fi.loadIndex(data.path + '/' + name, "", data.size))) + { #ifdef FIM_DEBUG - std::cerr << "FileIndexMonitor::loadCache() Success!"; - std::cerr << std::endl; + std::cerr << "FileIndexMonitor::loadCache() Success!"; + std::cerr << std::endl; #endif - fi.root->row = 0; - fi.root->name = data.pname ; - } - else - { + fi.root->row = 0; + fi.root->name = data.pname ; + } + else + { #ifdef FIM_DEBUG - std::cerr << "FileIndexMonitor::loadCache() Failed!"; - std::cerr << std::endl; + std::cerr << "FileIndexMonitor::loadCache() Failed!"; + std::cerr << std::endl; #endif - } + } + + fi.updateMaxModTime() ; } fiMutex.unlock(); /* UNLOCKED DIRS */ @@ -1026,6 +1029,7 @@ int FileIndexMonitor::RequestDirDetails(void *ref, DirDetails &details, uint32_t details.path = "root"; details.age = 0; details.flags = 0; + details.min_age = 0 ; return true ; } diff --git a/libretroshare/src/dbase/findex.cc b/libretroshare/src/dbase/findex.cc index 5c8f849c4..f8ed0a6a2 100644 --- a/libretroshare/src/dbase/findex.cc +++ b/libretroshare/src/dbase/findex.cc @@ -559,6 +559,24 @@ int FileIndex::setRootDirectories(std::list inlist, time_t updtime) return 1; } +void FileIndex::updateMaxModTime() +{ + RecursUpdateMaxModTime(root) ; +} +void FileIndex::RecursUpdateMaxModTime(DirEntry *dir) +{ + time_t max_mod_t = 0 ; + + for(std::map::iterator it(dir->subdirs.begin());it!=dir->subdirs.end();++it) + { + RecursUpdateMaxModTime(it->second) ; + max_mod_t = std::max(max_mod_t, it->second->most_recent_time) ; + } + for(std::map::iterator it(dir->files.begin());it!=dir->files.end();++it) + max_mod_t = std::max(max_mod_t, it->second->modtime) ; + + dir->most_recent_time = max_mod_t ; +} int FileIndex::getRootDirectories(std::list &outlist) { @@ -571,7 +589,7 @@ int FileIndex::getRootDirectories(std::list &outlist) return 1; } - /* update (index building) */ +/* update (index building) */ DirEntry *FileIndex::updateDirEntry(std::string fpath, FileEntry fe, time_t utime) { /* path is to parent */ @@ -1183,7 +1201,7 @@ bool FileIndex::extractData(void *ref,DirDetails& details) if(!isValid(ref)) { #ifdef FI_DEBUG - std::cerr << "FileIndex::RequestDirDetails() asked for an invalid pointer " << (void*)ref << std::endl; + std::cerr << "FileIndex::extractData() asked for an invalid pointer " << (void*)ref << std::endl; #endif return false ; } @@ -1192,11 +1210,12 @@ bool FileIndex::extractData(void *ref,DirDetails& details) DirEntry *dir = dynamic_cast(file); details.children = std::list() ; + time_t now = time(NULL) ; if (dir!=NULL) /* has children --- fill */ { #ifdef FI_DEBUG - std::cerr << "FileIndex::RequestDirDetails() ref=dir" << std::endl; + std::cerr << "FileIndex::extractData() ref=dir" << std::endl; #endif /* extract all the entries */ for(std::map::const_iterator dit(dir->subdirs.begin()); dit != dir->subdirs.end(); ++dit) @@ -1225,22 +1244,24 @@ bool FileIndex::extractData(void *ref,DirDetails& details) details.type = DIR_TYPE_DIR; details.hash = ""; details.count = dir->subdirs.size() + dir->files.size(); + details.min_age = now - dir->most_recent_time ; } else { #ifdef FI_DEBUG - std::cerr << "FileIndexStore::RequestDirDetails() ref=file" << std::endl; + std::cerr << "FileIndexStore::extractData() ref=file" << std::endl; #endif details.type = DIR_TYPE_FILE; details.count = file->size; + details.min_age = now - file->modtime ; } #ifdef FI_DEBUG - std::cerr << "FileIndexStore::RequestDirDetails() name: " << file->name << std::endl; + std::cerr << "FileIndexStore::extractData() name: " << file->name << std::endl; #endif details.ref = file; details.hash = file->hash; - details.age = time(NULL) - file->modtime; + details.age = now - file->modtime; details.flags = 0;//file->pop; /* find parent pointer, and row */ diff --git a/libretroshare/src/dbase/findex.h b/libretroshare/src/dbase/findex.h index f1372de09..67febd805 100644 --- a/libretroshare/src/dbase/findex.h +++ b/libretroshare/src/dbase/findex.h @@ -144,6 +144,8 @@ void writeFileInfo(std::ostringstream&); std::map subdirs; std::map files; + time_t most_recent_time; /* last updated */ + /* Inherited members from FileEntry: int size - count for dirs std::string name; - directory name @@ -226,6 +228,12 @@ class FileIndex int searchHash(std::string hash, std::list &results) const; int searchBoolExp(Expression * exp, std::list &results) const; + /// Recursively compute the maximum modification time of children. + /// Used to easily retrieve mose recent files. + // + void updateMaxModTime() ; + void RecursUpdateMaxModTime(DirEntry *) ; + PersonEntry *root; static std::set _pointers ; diff --git a/libretroshare/src/dbase/fistore.cc b/libretroshare/src/dbase/fistore.cc index bb9a3a131..9808dbd60 100644 --- a/libretroshare/src/dbase/fistore.cc +++ b/libretroshare/src/dbase/fistore.cc @@ -126,10 +126,12 @@ int FileIndexStore::loadCache(const CacheData &data) for(it = indices.begin(); it != indices.end(); it++) { (it->second)->root->row = i++; + it->second->FileIndex::updateMaxModTime() ; } if (localindex) { localindex->root->row = 0; + localindex->updateMaxModTime() ; } unlockData(); @@ -220,6 +222,7 @@ int FileIndexStore::RequestDirDetails(void *ref, DirDetails &details, uint32_t f details.count = indices.size(); details.age = 0; details.flags = 0; + details.min_age = 0; unlockData(); return true ; diff --git a/libretroshare/src/rsiface/rstypes.h b/libretroshare/src/rsiface/rstypes.h index 902bc8caa..cb68af237 100644 --- a/libretroshare/src/rsiface/rstypes.h +++ b/libretroshare/src/rsiface/rstypes.h @@ -244,6 +244,7 @@ class DirDetails uint64_t count; uint32_t age; uint32_t flags; + uint32_t min_age ; // minimum age of files in this subtree std::list children; }; diff --git a/retroshare-gui/src/gui/RemoteDirModel.cpp b/retroshare-gui/src/gui/RemoteDirModel.cpp index 437ca2190..9653de447 100644 --- a/retroshare-gui/src/gui/RemoteDirModel.cpp +++ b/retroshare-gui/src/gui/RemoteDirModel.cpp @@ -41,7 +41,7 @@ RemoteDirModel::RemoteDirModel(bool mode, QObject *parent) : QAbstractItemModel(parent), RemoteMode(mode), nIndex(1), indexSet(1) /* ass zero index cant be used */, - ageIndicator(0) + ageIndicator(IND_ALWAYS) { setSupportedDragActions(Qt::CopyAction); treeStyle(); @@ -147,7 +147,6 @@ void RemoteDirModel::treeStyle() std::cerr << "lookup PER/DIR #" << details.count; std::cerr << std::endl; #endif - return details.count; } @@ -184,10 +183,10 @@ QString RemoteDirModel::getAgeIndicatorString(const DirDetails &details) const case IND_LAST_MONTH: if (age < 30 * 24 * 60 * 60) return nind; break; - case IND_OLDER: - if (age >= 30 * 24 * 60 * 60) return oind; - break; - case IND_DEFAULT: +// case IND_OLDER: +// if (age >= 30 * 24 * 60 * 60) return oind; +// break; + case IND_ALWAYS: return ret; default: return ret; @@ -232,6 +231,18 @@ QString RemoteDirModel::getAgeIndicatorString(const DirDetails &details) const return QString::fromStdString(finfo.path) ; } + if (role == Qt::TextColorRole) + { + FileInfo finfo; + rsFiles->FileDetails(details.hash, 0, finfo); + + if(details.min_age > ageIndicator) + return Qt::gray ; + else + return Qt::black ; + } + + if (role == Qt::DecorationRole) { @@ -404,7 +415,7 @@ QString RemoteDirModel::getAgeIndicatorString(const DirDetails &details) const case 4: { QString ind(""); - if (ageIndicator != IND_DEFAULT) + if (ageIndicator != IND_ALWAYS) ind = getAgeIndicatorString(details); return ind; } @@ -577,14 +588,15 @@ QModelIndex RemoteDirModel::index(int row, int column, const QModelIndex & paren return QModelIndex(); } + /* now iterate through the details to * get the reference number */ std::list::iterator it; int i = 0; - for(it = details.children.begin(); ((i < row) && (it != details.children.end())); ++it, ++i) ; - + for(it = details.children.begin(); ((i < row) && (it != details.children.end())); ++it,++i) ; + if (it == details.children.end()) { #ifdef RDM_DEBUG @@ -715,14 +727,14 @@ Qt::ItemFlags RemoteDirModel::flags( const QModelIndex & index ) const } -void RemoteDirModel::update (const QModelIndex &index ) -{ -#ifdef RDM_DEBUG - //std::cerr << "Directory Request(" << id << ") : "; - //std::cerr << path << std::endl; -#endif - //rsFiles -> RequestDirectories(id, path, 1); -} +//void RemoteDirModel::update (const QModelIndex &index ) +//{ +//#ifdef RDM_DEBUG +// //std::cerr << "Directory Request(" << id << ") : "; +// //std::cerr << path << std::endl; +//#endif +// //rsFiles -> RequestDirectories(id, path, 1); +//} void RemoteDirModel::downloadSelected(QModelIndexList list) { diff --git a/retroshare-gui/src/gui/RemoteDirModel.h b/retroshare-gui/src/gui/RemoteDirModel.h index c2aeb0348..2c949b6e0 100644 --- a/retroshare-gui/src/gui/RemoteDirModel.h +++ b/retroshare-gui/src/gui/RemoteDirModel.h @@ -30,11 +30,10 @@ #include "util/misc.h" #include "rsiface/rstypes.h" -#define IND_DEFAULT 0 -#define IND_LAST_DAY 1 -#define IND_LAST_WEEK 2 -#define IND_LAST_MONTH 3 -#define IND_OLDER 4 +static const uint32_t IND_LAST_DAY = 3600*24 ; +static const uint32_t IND_LAST_WEEK = 3600*24*7 ; +static const uint32_t IND_LAST_MONTH = 3600*24*31 ; // I know, this is approximate +static const uint32_t IND_ALWAYS = ~(uint32_t)0 ; class RemoteDirModel : public QAbstractItemModel { @@ -82,13 +81,13 @@ class RemoteDirModel : public QAbstractItemModel void getFilePaths(QModelIndexList list, std::list &fullpaths); - void changeAgeIndicator(int indicator) { ageIndicator = indicator; } + void changeAgeIndicator(uint32_t indicator) { ageIndicator = indicator; } public slots: - void collapsed ( const QModelIndex & index ) { update(index); } - void expanded ( const QModelIndex & index ) { update(index); } +// void collapsed ( const QModelIndex & index ) { update(index); } +// void expanded ( const QModelIndex & index ) { update(index); } /* Drag and Drop Functionality */ public: @@ -97,14 +96,14 @@ class RemoteDirModel : public QAbstractItemModel virtual QStringList mimeTypes () const; private: - void update (const QModelIndex &index ); +// void update (const QModelIndex &index ); void treeStyle(); void downloadDirectory(const DirDetails & details, int prefixLen); static QString getFlagsString(uint32_t) ; QString getAgeIndicatorString(const DirDetails &) const; void getAgeIndicatorRec(DirDetails &details, QString &ret) const; - int ageIndicator; + uint32_t ageIndicator; QIcon categoryIcon; QIcon peerIcon; diff --git a/retroshare-gui/src/gui/SharedFilesDialog.cpp b/retroshare-gui/src/gui/SharedFilesDialog.cpp index d44033fbb..f74df69c4 100644 --- a/retroshare-gui/src/gui/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/SharedFilesDialog.cpp @@ -846,7 +846,12 @@ void SharedFilesDialog::showFrameSplitted(bool show) void SharedFilesDialog::indicatorChanged(int index) { - model->changeAgeIndicator(index); - localModel->changeAgeIndicator(index); + static uint32_t correct_indicator[4] = { IND_ALWAYS,IND_LAST_DAY,IND_LAST_WEEK,IND_LAST_MONTH } ; + + model->changeAgeIndicator(correct_indicator[index]); + localModel->changeAgeIndicator(correct_indicator[index]); + + ui.remoteDirTreeView->update(ui.remoteDirTreeView->rootIndex()); + ui.localDirTreeView->update(ui.localDirTreeView->rootIndex()) ; } diff --git a/retroshare-gui/src/gui/SharedFilesDialog.ui b/retroshare-gui/src/gui/SharedFilesDialog.ui index 39d830a79..084661e7f 100644 --- a/retroshare-gui/src/gui/SharedFilesDialog.ui +++ b/retroshare-gui/src/gui/SharedFilesDialog.ui @@ -669,27 +669,22 @@ p, li { white-space: pre-wrap; } - No indicator + Always - Last day + One day old - Last week + One Week old - Last month - - - - - Older + One month old diff --git a/retroshare-gui/src/gui/TransfersDialog.cpp b/retroshare-gui/src/gui/TransfersDialog.cpp index f1cd08cec..97c854549 100644 --- a/retroshare-gui/src/gui/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/TransfersDialog.cpp @@ -763,7 +763,9 @@ void TransfersDialog::insertTransfers() FileInfo info; if (!rsFiles->FileDetails(*it, RS_FILE_HINTS_DOWNLOAD, info)) continue; //if file transfer is a cache file index file, don't show it - if (info.flags & CB_CODE_CACHE) continue; + // + if (/*(!_show_cache_transfers) &&*/ (info.flags & CB_CODE_CACHE)) + continue; symbol = ""; name = QString::fromUtf8(info.fname.c_str()); @@ -978,6 +980,8 @@ void TransfersDialog::insertTransfers() { continue; } + if (/*(!_show_cache_transfers) &&*/ (info.flags & CB_CODE_CACHE)) + continue ; std::list::iterator pit; for(pit = info.peers.begin(); pit != info.peers.end(); pit++)