From c5a80cce36369e5b20c25f21f70e84b6b70ae464 Mon Sep 17 00:00:00 2001 From: Phenom Date: Fri, 6 Nov 2020 18:05:39 +0100 Subject: [PATCH] Add Download All files in Channel post --- .../GxsChannelFilesStatusWidget.cpp | 4 + .../gxschannels/GxsChannelFilesStatusWidget.h | 4 + .../GxsChannelPostsWidgetWithModel.cpp | 112 ++++++++++++------ .../GxsChannelPostsWidgetWithModel.h | 5 +- .../GxsChannelPostsWidgetWithModel.ui | 31 +++-- 5 files changed, 109 insertions(+), 47 deletions(-) diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.cpp index bc019e426..365dab3f3 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.cpp @@ -284,6 +284,7 @@ void GxsChannelFilesStatusWidget::download() rsFiles->FileRequest(mFile.mName, mFile.mHash, mFile.mSize, destination, RS_FILE_REQ_ANONYMOUS_ROUTING, sources); + emit onButtonClick();// Signals the parent widget to e.g. update the downloadable file count check(); } @@ -291,6 +292,7 @@ void GxsChannelFilesStatusWidget::pause() { rsFiles->FileControl(mFile.mHash, RS_FILE_CTRL_PAUSE); + emit onButtonClick();// Signals the parent widget to e.g. update the downloadable file count check(); } @@ -298,6 +300,7 @@ void GxsChannelFilesStatusWidget::resume() { rsFiles->FileControl(mFile.mHash, RS_FILE_CTRL_START); + emit onButtonClick();// Signals the parent widget to e.g. update the downloadable file count check(); } @@ -309,6 +312,7 @@ void GxsChannelFilesStatusWidget::cancel() rsFiles->FileCancel(mFile.mHash); + emit onButtonClick();// Signals the parent widget to e.g. update the downloadable file count check(); } diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.h b/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.h index 1effe0549..8f2f7f8e4 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.h +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.h @@ -37,6 +37,10 @@ public: explicit GxsChannelFilesStatusWidget(const RsGxsFile &file, QWidget *parent = 0); ~GxsChannelFilesStatusWidget(); +signals: + + void onButtonClick(); + private slots: void check(); void download(); diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp index 4f3d37285..d73ad29ad 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.cpp @@ -56,7 +56,7 @@ * #define DEBUG_CHANNEL ***/ -static const int mTokenTypeGroupData = 1; +//static const int mTokenTypeGroupData = 1; static const int CHANNEL_TABS_DETAILS= 0; static const int CHANNEL_TABS_POSTS = 1; @@ -268,14 +268,18 @@ void ChannelPostDelegate::setWidgetGrid(bool use_grid) //=== ChannelPostFilesDelegate ===// //===============================================================================================================================================// -QWidget *ChannelPostFilesDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex& index) const +QWidget *ChannelPostFilesDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex& index) const { ChannelPostFileInfo file = index.data(Qt::UserRole).value() ; - if(index.column() == RsGxsChannelPostFilesModel::COLUMN_FILES_FILE) - return new GxsChannelFilesStatusWidget(file,parent); - else - return NULL; + if(index.column() == RsGxsChannelPostFilesModel::COLUMN_FILES_FILE) + { + GxsChannelFilesStatusWidget* w = new GxsChannelFilesStatusWidget(file,parent); + connect(w,SIGNAL(onButtonClick()),this->parent(),SLOT(updateDAll_PB())); + return w; + } + else + return NULL; } void ChannelPostFilesDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { @@ -381,7 +385,7 @@ GxsChannelPostsWidgetWithModel::GxsChannelPostsWidgetWithModel(const RsGxsGroupI connect(ui->commentsDialog,SIGNAL(commentsLoaded(int)),this,SLOT(updateCommentsCount(int))); ui->channelPostFiles_TV->setModel(mChannelPostFilesModel = new RsGxsChannelPostFilesModel(this)); - ui->channelPostFiles_TV->setItemDelegate(new ChannelPostFilesDelegate()); + ui->channelPostFiles_TV->setItemDelegate(new ChannelPostFilesDelegate(this)); ui->channelPostFiles_TV->setPlaceholderText(tr("No files in this post, or no post selected")); ui->channelPostFiles_TV->setSortingEnabled(true); ui->channelPostFiles_TV->sortByColumn(3, Qt::AscendingOrder); // sort by time @@ -391,7 +395,7 @@ GxsChannelPostsWidgetWithModel::GxsChannelPostsWidgetWithModel(const RsGxsGroupI connect(ui->channelFiles_TV->header(),SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(sortColumnFiles(int,Qt::SortOrder))); ui->channelFiles_TV->setModel(mChannelFilesModel = new RsGxsChannelPostFilesModel()); - ui->channelFiles_TV->setItemDelegate(mFilesDelegate = new ChannelPostFilesDelegate()); + ui->channelFiles_TV->setItemDelegate(mFilesDelegate = new ChannelPostFilesDelegate(this)); ui->channelFiles_TV->setPlaceholderText(tr("No files in the channel, or no channel selected")); ui->channelFiles_TV->setSortingEnabled(true); ui->channelFiles_TV->sortByColumn(3, Qt::AscendingOrder); // sort by time @@ -404,6 +408,9 @@ GxsChannelPostsWidgetWithModel::GxsChannelPostsWidgetWithModel(const RsGxsGroupI ui->postName_LB->hide(); ui->postTime_LB->hide(); ui->postLogo_LB->hide(); + ui->postDAll_PB->hide(); + + connect(ui->postDAll_PB,SIGNAL(clicked()),this,SLOT(download())); ui->postDetails_TE->setPlaceholderText(tr("No text to display")); @@ -411,11 +418,11 @@ GxsChannelPostsWidgetWithModel::GxsChannelPostsWidgetWithModel(const RsGxsGroupI ui->splitter->setStretchFactor(0, 1); ui->splitter->setStretchFactor(1, 0); - QFontMetricsF fm(font()); + QFontMetricsF fm(font()); - if(mChannelPostsModel->getMode() == RsGxsChannelPostsModel::TREE_MODE_GRID) - for(int i=0;icolumnCount();++i) - ui->postsTree->setColumnWidth(i,mChannelPostsDelegate->cellSize(i,font(),ui->postsTree->width())); + if(mChannelPostsModel->getMode() == RsGxsChannelPostsModel::TREE_MODE_GRID) + for(int i=0;icolumnCount();++i) + ui->postsTree->setColumnWidth(i,mChannelPostsDelegate->cellSize(i,font(),ui->postsTree->width())); /* Setup UI helper */ @@ -659,6 +666,34 @@ void GxsChannelPostsWidgetWithModel::download() rsFiles->FileRequest(file.mName, file.mHash, file.mSize, destination, RS_FILE_REQ_ANONYMOUS_ROUTING, sources); } + + ui->postDAll_PB->hide(); +} + +void GxsChannelPostsWidgetWithModel::updateDAll_PB() +{ + QModelIndex index = ui->postsTree->selectionModel()->currentIndex(); + RsGxsChannelPost post = index.data(Qt::UserRole).value() ; + + size_t newFileToDl = 0; + uint64_t newFileTotalSize = 0; + QString newFilesDetails; + + for(auto& file:post.mFiles) + { + FileInfo fileInfo; + if (!rsFiles->FileDetails(file.mHash, RS_FILE_HINTS_DOWNLOAD | RS_FILE_HINTS_SPEC_ONLY, fileInfo)) { + ++newFileToDl; + newFileTotalSize += file.mSize; + newFilesDetails += QString::fromUtf8(file.mName.c_str()) + " " + misc::friendlyUnit(file.mSize) + "\n"; + } + } + + ui->postDAll_PB->setHidden(newFileToDl == 0); + ui->postDAll_PB->setToolTip((newFileToDl == 1 ? tr("Download this file:") : tr("Download All these %1 files:").arg(newFileToDl) ) + "\n" + + newFilesDetails + + tr("Totaling: %1").arg(misc::friendlyUnit(newFileTotalSize))); + } void GxsChannelPostsWidgetWithModel::editPost() @@ -745,9 +780,9 @@ void GxsChannelPostsWidgetWithModel::showPostDetails() std::cerr << "showPostDetails: setting mSelectedPost to current post Id " << post.mMeta.mMsgId << ". Previous value: " << mSelectedPost << std::endl; mSelectedPost = post.mMeta.mMsgId; - std::list files; - for(auto& file:post.mFiles) - files.push_back(ChannelPostFileInfo(file,post.mMeta.mPublishTs)); + std::list files; + for(auto& file:post.mFiles) + files.push_back(ChannelPostFileInfo(file,post.mMeta.mPublishTs)); mChannelPostFilesModel->setFiles(files); @@ -793,6 +828,8 @@ void GxsChannelPostsWidgetWithModel::showPostDetails() RsThread::async([postId]() { rsGxsChannels->markRead(postId, true) ; } ); } + + updateDAll_PB(); } void GxsChannelPostsWidgetWithModel::updateCommentsCount(int n) @@ -842,21 +879,21 @@ void GxsChannelPostsWidgetWithModel::updateGroupData() void GxsChannelPostsWidgetWithModel::postChannelPostLoad() { - std::cerr << "Post channel load..." << std::endl; + std::cerr << "Post channel load..." << std::endl; if(!mSelectedPost.isNull()) - { - QModelIndex index = mChannelPostsModel->getIndexOfMessage(mSelectedPost); + { + QModelIndex index = mChannelPostsModel->getIndexOfMessage(mSelectedPost); - std::cerr << "Setting current index to " << index.row() << ","<< index.column() << " for current post " - << mSelectedPost.toStdString() << std::endl; + std::cerr << "Setting current index to " << index.row() << ","<< index.column() << " for current post " + << mSelectedPost.toStdString() << std::endl; ui->postsTree->selectionModel()->setCurrentIndex(index,QItemSelectionModel::ClearAndSelect); ui->postsTree->scrollTo(index);//May change if model reloaded ui->postsTree->setFocus(); - } - else - std::cerr << "No pre-selected channel post." << std::endl; + } + else + std::cerr << "No pre-selected channel post." << std::endl; std::list files; @@ -891,6 +928,8 @@ void GxsChannelPostsWidgetWithModel::postChannelPostLoad() void GxsChannelPostsWidgetWithModel::updateDisplay(bool complete) { + // First, clear all widget + blank(); #ifdef DEBUG_CHANNEL std::cerr << "udateDisplay: groupId()=" << groupId()<< std::endl; #endif @@ -911,7 +950,7 @@ void GxsChannelPostsWidgetWithModel::updateDisplay(bool complete) } if(complete) // need to update the group data, reload the messages etc. { -#warning todo +#warning csoler 2020-06-02 : todo //saveExpandedItems(mSavedExpandedMessages); //if(mGroupId != mChannelPostsModel->currentGroupId()) @@ -972,7 +1011,7 @@ QString GxsChannelPostsWidgetWithModel::groupName(bool) return QString::fromUtf8(mGroup.mMeta.mGroupName.c_str()); } -void GxsChannelPostsWidgetWithModel::groupNameChanged(const QString &name) +void GxsChannelPostsWidgetWithModel::groupNameChanged(const QString &/*name*/) { // if (groupId().isNull()) { // ui->nameLabel->setText(tr("No Channel Selected")); @@ -1114,13 +1153,13 @@ void GxsChannelPostsWidgetWithModel::insertChannelDetails(const RsGxsChannelGrou ui->infoAdministrator->setId(group.mMeta.mAuthorId) ; - if(!group.mMeta.mAuthorId.isNull()) - { - RetroShareLink link = RetroShareLink::createMessage(group.mMeta.mAuthorId, ""); - ui->infoAdministrator->setText(link.toHtml()); - } - else - ui->infoAdministrator->setText("[No contact author]"); + if(!group.mMeta.mAuthorId.isNull()) + { + RetroShareLink link = RetroShareLink::createMessage(group.mMeta.mAuthorId, ""); + ui->infoAdministrator->setText(link.toHtml()); + } + else + ui->infoAdministrator->setText("[No contact author]"); ui->infoCreated->setText(DateTime::formatLongDateTime(group.mMeta.mPublishTs)); @@ -1233,6 +1272,7 @@ void GxsChannelPostsWidgetWithModel::blank() ui->postLogo_LB->hide(); ui->postName_LB->hide(); ui->postTime_LB->hide(); + ui->postDAll_PB->hide(); groupNameChanged(QString()); } @@ -1320,11 +1360,11 @@ public: void GxsChannelPostsWidgetWithModel::setAllMessagesReadDo(bool read, uint32_t& /*token*/) { - if (groupId().isNull() || !IS_GROUP_SUBSCRIBED(mGroup.mMeta.mSubscribeFlags)) - return; + if (groupId().isNull() || !IS_GROUP_SUBSCRIBED(mGroup.mMeta.mSubscribeFlags)) + return; - QModelIndex src_index; + //QModelIndex src_index; - mChannelPostsModel->setAllMsgReadStatus(read); + mChannelPostsModel->setAllMsgReadStatus(read); } diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.h b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.h index fe299a864..01bb86757 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.h +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.h @@ -142,8 +142,9 @@ protected: private slots: void showPostDetails(); void updateGroupData(); - void download(); - void createMsg(); + void download(); + void updateDAll_PB(); + void createMsg(); // void toggleAutoDownload(); void subscribeGroup(bool subscribe); void filterChanged(QString); diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui index a1daef1af..cec64ed95 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui @@ -380,7 +380,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Description</span></p></body></html> @@ -496,6 +496,17 @@ p, li { white-space: pre-wrap; } + + + + + + + + :/icons/png/download.png:/icons/png/download.png + + + @@ -506,6 +517,7 @@ p, li { white-space: pre-wrap; } 75 true + true @@ -613,24 +625,25 @@ p, li { white-space: pre-wrap; } - GxsIdLabel - QLabel -
gui/gxs/GxsIdLabel.h
+ LineEditClear + QLineEdit +
gui/common/LineEditClear.h
SubscribeToolButton QToolButton
gui/common/SubscribeToolButton.h
+ + GxsIdLabel + QLabel +
gui/gxs/GxsIdLabel.h
+
RSTreeView QTreeView
gui/common/RSTreeView.h
-
- - LineEditClear - QLineEdit -
gui/common/LineEditClear.h
+ 1
GxsCommentDialog