Merge pull request #1353 from csoler/v0.6-FileLists

V0.6 file lists
This commit is contained in:
csoler 2018-09-30 13:31:26 +02:00 committed by GitHub
commit 79a8b2183f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 295 additions and 98 deletions

View file

@ -76,6 +76,7 @@
#define IMAGE_COLLOPEN ":/images/library.png"
#define IMAGE_EDITSHARE ":/images/edit_16.png"
#define IMAGE_MYFILES ":/icons/svg/folders1.svg"
#define IMAGE_REMOVE ":/images/deletemail24.png"
/*define viewType_CB value */
#define VIEW_TYPE_TREE 0
@ -229,6 +230,9 @@ SharedFilesDialog::SharedFilesDialog(RetroshareDirModel *_tree_model,RetroshareD
sendlinkAct = new QAction(QIcon(IMAGE_COPYLINK), tr( "Send retroshare Links" ), this );
connect( sendlinkAct , SIGNAL( triggered() ), this, SLOT( sendLinkTo( ) ) );
removeExtraFileAct = new QAction(QIcon(IMAGE_REMOVE), tr( "Stop sharing this file" ), this );
connect( removeExtraFileAct , SIGNAL( triggered() ), this, SLOT( removeExtraFile() ) );
collCreateAct= new QAction(QIcon(IMAGE_COLLCREATE), tr("Create Collection..."), this) ;
connect(collCreateAct,SIGNAL(triggered()),this,SLOT(collCreate())) ;
collModifAct= new QAction(QIcon(IMAGE_COLLMODIF), tr("Modify Collection..."), this) ;
@ -1093,7 +1097,7 @@ void LocalSharedFilesDialog::spawnCustomPopupMenu( QPoint point )
currentFile = model->data(midx, RetroshareDirModel::FileNameRole).toString() ;
int type = model->getType(midx) ;
if (type != DIR_TYPE_DIR && type != DIR_TYPE_FILE) return;
if (type != DIR_TYPE_DIR && type != DIR_TYPE_FILE && type != DIR_TYPE_EXTRA_FILE) return;
QMenu contextMnu(this) ;
@ -1127,58 +1131,70 @@ void LocalSharedFilesDialog::spawnCustomPopupMenu( QPoint point )
contextMnu.addMenu(&collectionMenu) ;
contextMnu.addSeparator() ;//------------------------------------
contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to..."), this, SLOT(recommendFilesToMsg())) ;
break;
case DIR_TYPE_EXTRA_FILE:
contextMnu.addAction(openfileAct) ;
contextMnu.addSeparator() ;//------------------------------------
contextMnu.addAction(copylinkAct) ;
contextMnu.addAction(sendlinkAct) ;
contextMnu.addAction(removeExtraFileAct) ;
break ;
default :
return ;
}
GxsChannelDialog *channelDialog = dynamic_cast<GxsChannelDialog*>(MainWindow::getPage(MainWindow::Channels));
QMenu shareChannelMenu(tr("Share on channel...")) ; // added here because the shareChannelMenu QMenu object is deleted afterwards
if(channelDialog != NULL)
if(type != DIR_TYPE_EXTRA_FILE)
{
shareChannelMenu.setIcon(QIcon(IMAGE_CHANNEL));
GxsChannelDialog *channelDialog = dynamic_cast<GxsChannelDialog*>(MainWindow::getPage(MainWindow::Channels));
QMenu shareChannelMenu(tr("Share on channel...")) ; // added here because the shareChannelMenu QMenu object is deleted afterwards
std::map<RsGxsGroupId,RsGroupMetaData> grp_metas ;
channelDialog->getGroupList(grp_metas) ;
if(channelDialog != NULL)
{
shareChannelMenu.setIcon(QIcon(IMAGE_CHANNEL));
std::vector<std::pair<std::string,RsGxsGroupId> > grplist ; // I dont use a std::map because two or more channels may have the same name.
std::map<RsGxsGroupId,RsGroupMetaData> grp_metas ;
channelDialog->getGroupList(grp_metas) ;
for(auto it(grp_metas.begin());it!=grp_metas.end();++it)
if(IS_GROUP_PUBLISHER((*it).second.mSubscribeFlags) && IS_GROUP_SUBSCRIBED((*it).second.mSubscribeFlags))
grplist.push_back(std::make_pair((*it).second.mGroupName, (*it).second.mGroupId));
std::vector<std::pair<std::string,RsGxsGroupId> > grplist ; // I dont use a std::map because two or more channels may have the same name.
std::sort(grplist.begin(),grplist.end(),ChannelCompare()) ;
for(auto it(grp_metas.begin());it!=grp_metas.end();++it)
if(IS_GROUP_PUBLISHER((*it).second.mSubscribeFlags) && IS_GROUP_SUBSCRIBED((*it).second.mSubscribeFlags))
grplist.push_back(std::make_pair((*it).second.mGroupName, (*it).second.mGroupId));
for(auto it(grplist.begin());it!=grplist.end();++it)
std::sort(grplist.begin(),grplist.end(),ChannelCompare()) ;
for(auto it(grplist.begin());it!=grplist.end();++it)
shareChannelMenu.addAction(QString::fromUtf8((*it).first.c_str()), this, SLOT(shareOnChannel()))->setData(QString::fromStdString((*it).second.toStdString())) ;
contextMnu.addMenu(&shareChannelMenu) ;
}
contextMnu.addMenu(&shareChannelMenu) ;
}
GxsForumsDialog *forumsDialog = dynamic_cast<GxsForumsDialog*>(MainWindow::getPage(MainWindow::Forums));
QMenu shareForumMenu(tr("Share on forum...")) ; // added here because the shareChannelMenu QMenu object is deleted afterwards
GxsForumsDialog *forumsDialog = dynamic_cast<GxsForumsDialog*>(MainWindow::getPage(MainWindow::Forums));
QMenu shareForumMenu(tr("Share on forum...")) ; // added here because the shareChannelMenu QMenu object is deleted afterwards
if(forumsDialog != NULL)
{
shareForumMenu.setIcon(QIcon(IMAGE_FORUMS));
if(forumsDialog != NULL)
{
shareForumMenu.setIcon(QIcon(IMAGE_FORUMS));
std::map<RsGxsGroupId,RsGroupMetaData> grp_metas ;
forumsDialog->getGroupList(grp_metas) ;
std::map<RsGxsGroupId,RsGroupMetaData> grp_metas ;
forumsDialog->getGroupList(grp_metas) ;
std::vector<std::pair<std::string,RsGxsGroupId> > grplist ; // I dont use a std::map because two or more channels may have the same name.
std::vector<std::pair<std::string,RsGxsGroupId> > grplist ; // I dont use a std::map because two or more channels may have the same name.
for(auto it(grp_metas.begin());it!=grp_metas.end();++it)
if(IS_GROUP_SUBSCRIBED((*it).second.mSubscribeFlags))
grplist.push_back(std::make_pair((*it).second.mGroupName, (*it).second.mGroupId));
for(auto it(grp_metas.begin());it!=grp_metas.end();++it)
if(IS_GROUP_SUBSCRIBED((*it).second.mSubscribeFlags))
grplist.push_back(std::make_pair((*it).second.mGroupName, (*it).second.mGroupId));
std::sort(grplist.begin(),grplist.end(),ChannelCompare()) ;
std::sort(grplist.begin(),grplist.end(),ChannelCompare()) ;
for(auto it(grplist.begin());it!=grplist.end();++it)
shareForumMenu.addAction(QString::fromUtf8((*it).first.c_str()), this, SLOT(shareInForum()))->setData(QString::fromStdString((*it).second.toStdString())) ;
for(auto it(grplist.begin());it!=grplist.end();++it)
shareForumMenu.addAction(QString::fromUtf8((*it).first.c_str()), this, SLOT(shareInForum()))->setData(QString::fromStdString((*it).second.toStdString())) ;
contextMnu.addMenu(&shareForumMenu) ;
contextMnu.addMenu(&shareForumMenu) ;
}
}
contextMnu.exec(QCursor::pos()) ;
@ -1564,6 +1580,20 @@ void SharedFilesDialog::FilterItems()
#endif
}
void SharedFilesDialog::removeExtraFile()
{
std::list<DirDetails> files_info ;
model->getFileInfoFromIndexList(getSelected(),files_info);
for(auto it(files_info.begin());it!=files_info.end();++it)
{
std::cerr << "removing file " << (*it).name << ", hash = " << (*it).hash << std::endl;
rsFiles->ExtraFileRemove((*it).hash);
}
}
#ifdef DEPRECATED_CODE
bool SharedFilesDialog::flat_FilterItem(const QModelIndex &index, const QString &text, int /*level*/)
{

View file

@ -66,6 +66,7 @@ private slots:
void copyLink();
void copyLinkhtml();
void sendLinkTo();
void removeExtraFile();
void collCreate();
void collModif();
@ -122,6 +123,7 @@ protected:
QAction* sendlinkAct;
QAction* sendchatlinkAct;
QAction* copylinkhtmlAct;
QAction* removeExtraFileAct;
QAction *collCreateAct;
QAction *collModifAct;

View file

@ -162,7 +162,7 @@ bool TreeStyle_RDM::hasChildren(const QModelIndex &parent) const
return false;
}
if (details.type == DIR_TYPE_FILE)
if (details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE)
{
#ifdef RDM_DEBUG
std::cerr << "lookup FILE -> false";
@ -220,7 +220,7 @@ int TreeStyle_RDM::rowCount(const QModelIndex &parent) const
#endif
return 0;
}
if (details.type == DIR_TYPE_FILE)
if (details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE)
{
#ifdef RDM_DEBUG
std::cerr << "lookup FILE: 0";
@ -425,7 +425,7 @@ QVariant RetroshareDirModel::decorationRole(const DirDetails& details,int coln)
else
return QIcon(categoryIcon);
}
else if (details.type == DIR_TYPE_FILE) /* File */
else if (details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE) /* File */
{
// extensions predefined
if(details.hash.isNull())
@ -457,13 +457,12 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
QString res ;
if(RemoteMode)
{
res = QString::fromUtf8(rsPeers->getPeerName(details.id).c_str());
}
else
{
res = tr("My files");
}
else if(details.id == rsPeers->getOwnId())
res = tr("My files");
else
res = tr("Temporary shared files");
return res ;
}
case COLUMN_FILENB: {
@ -471,8 +470,10 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
if(RemoteMode)
rsFiles->getSharedDirStatistics(details.id,stats) ;
else
else if(details.id == rsPeers->getOwnId())
rsFiles->getSharedDirStatistics(rsPeers->getOwnId(),stats) ;
else
stats.total_number_of_files = details.count;
if(stats.total_number_of_files > 0)
{
@ -488,8 +489,10 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
if(RemoteMode)
rsFiles->getSharedDirStatistics(details.id,stats) ;
else
else if(details.id == rsPeers->getOwnId())
rsFiles->getSharedDirStatistics(rsPeers->getOwnId(),stats) ;
else
return QString();
if(stats.total_shared_size > 0)
return misc::friendlyUnit(stats.total_shared_size) ;
@ -499,6 +502,8 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
case COLUMN_AGE:
if(!isNewerThanEpoque(details.max_mtime))
return QString();
else if(details.id != rsPeers->getOwnId())
return QString();
else
return misc::timeRelativeToNow(details.max_mtime);
@ -506,7 +511,7 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
return QString() ;
}
}
else if (details.type == DIR_TYPE_FILE) /* File */
else if (details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE) /* File */
{
switch(coln)
{
@ -517,7 +522,7 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
case COLUMN_SIZE:
return misc::friendlyUnit(details.count);
case COLUMN_AGE:
return misc::timeRelativeToNow(details.max_mtime);
return (details.type == DIR_TYPE_FILE)?(misc::timeRelativeToNow(details.max_mtime)):QString();
case COLUMN_FRIEND_ACCESS:
return QVariant();
case COLUMN_WN_VISU_DIR:
@ -598,7 +603,7 @@ QString FlatStyle_RDM::computeDirectoryPath(const DirDetails& details) const
QVariant FlatStyle_RDM::displayRole(const DirDetails& details,int coln) const
{
if (details.type == DIR_TYPE_FILE) /* File */
if (details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE) /* File */
switch(coln)
{
case COLUMN_NAME: return QString::fromUtf8(details.name.c_str());
@ -654,7 +659,7 @@ QVariant TreeStyle_RDM::sortRole(const QModelIndex& /*index*/,const DirDetails&
return QString();
}
}
else if (details.type == DIR_TYPE_FILE) /* File */
else if (details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE) /* File */
{
switch(coln)
{
@ -707,7 +712,7 @@ QVariant FlatStyle_RDM::sortRole(const QModelIndex& /*index*/,const DirDetails&
* Dir : name, (0) count, (0) path, (0) ts
*/
if (details.type == DIR_TYPE_FILE) /* File */
if (details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE) /* File */
{
switch(coln)
{
@ -769,7 +774,7 @@ QVariant RetroshareDirModel::data(const QModelIndex &index, int role) const
if (role == Qt::TextColorRole)
{
if(details.type == DIR_TYPE_FILE && details.hash.isNull())
if((details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE) && details.hash.isNull())
return QVariant(QColor(Qt::green)) ;
else if(ageIndicator != IND_ALWAYS && details.max_mtime + ageIndicator < time(NULL))
return QVariant(QColor(Qt::gray)) ;
@ -796,7 +801,7 @@ QVariant RetroshareDirModel::data(const QModelIndex &index, int role) const
return decorationRole(details,coln) ;
if(role == Qt::ToolTipRole)
if(!isNewerThanEpoque(details.max_mtime))
if(!isNewerThanEpoque(details.max_mtime) && details.type == DIR_TYPE_PERSON)
return tr("This node hasn't sent any directory information yet.") ;
/*****************
@ -1083,6 +1088,7 @@ Qt::ItemFlags RetroshareDirModel::flags( const QModelIndex & index ) const
case DIR_TYPE_PERSON: return isNewerThanEpoque(details.max_mtime)? (Qt::ItemIsEnabled):(Qt::NoItemFlags) ;
case DIR_TYPE_DIR: return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
case DIR_TYPE_FILE: return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled;
case DIR_TYPE_EXTRA_FILE: return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled;
}
return Qt::ItemIsSelectable;
@ -1400,7 +1406,7 @@ void RetroshareDirModel::openSelected(const QModelIndexList &qmil)
QDir dir(QString::fromUtf8((*it).path.c_str()));
QString dest;
if ((*it).type & DIR_TYPE_FILE) {
if ((*it).type & DIR_TYPE_FILE || (*it).type & DIR_TYPE_EXTRA_FILE) {
dest = dir.absoluteFilePath(QString::fromUtf8(it->name.c_str()));
} else if ((*it).type & DIR_TYPE_DIR) {
dest = dir.absolutePath();
@ -1509,7 +1515,7 @@ void RetroshareDirModel::filterItems(const std::list<std::string>& keywords,uint
mFilteredPointers.insert(p) ;
++found ;
while(det.type == DIR_TYPE_FILE || det.type == DIR_TYPE_DIR)
while(det.type == DIR_TYPE_FILE || det.type == DIR_TYPE_EXTRA_FILE || det.type == DIR_TYPE_DIR)
{
p = det.parent ;
rsFiles->RequestDirDetails( p, det, flags);
@ -1555,7 +1561,7 @@ QMimeData * RetroshareDirModel::mimeData ( const QModelIndexList & indexes ) con
std::cerr << "Path: " << details.path << std::endl;
#endif
if (details.type != DIR_TYPE_FILE)
if (details.type != DIR_TYPE_FILE && details.type != DIR_TYPE_EXTRA_FILE)
{
#ifdef RDM_DEBUG
std::cerr << "RetroshareDirModel::mimeData() Not File" << std::endl;
@ -1657,7 +1663,7 @@ void FlatStyle_RDM::updateRefs()
if (requestDirDetails(ref, RemoteMode,details))
{
if(details.type == DIR_TYPE_FILE) // only push files, not directories nor persons.
if(details.type == DIR_TYPE_FILE || details.type == DIR_TYPE_EXTRA_FILE) // only push files, not directories nor persons.
_ref_entries.push_back(ref) ;
#ifdef RDM_DEBUG
std::cerr << "FlatStyle_RDM::postMods(): adding ref " << ref << std::endl;
@ -1683,6 +1689,9 @@ void FlatStyle_RDM::updateRefs()
std::cerr << "reference tab contains " << std::dec << _ref_entries.size() << " files" << std::endl;
}
if(_ref_stack.empty())
_needs_update = false ;
RetroshareDirModel::postMods() ;
}

View file

@ -561,7 +561,7 @@ void SubFileItem::cancel()
if (((mType == SFI_TYPE_ATTACH) || (mType == SFI_TYPE_CHANNEL)) && (mFlag & SFI_FLAG_CREATE))
{
hide();
rsFiles->ExtraFileRemove(FileHash(), RS_FILE_REQ_ANONYMOUS_ROUTING | RS_FILE_REQ_EXTRA);
rsFiles->ExtraFileRemove(FileHash());//, RS_FILE_REQ_ANONYMOUS_ROUTING | RS_FILE_REQ_EXTRA);
mPath = "";
}
else