From b14fecfc2af4c0dd18be65bbef0b8a922400cc60 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Sun, 16 Apr 2023 17:44:50 +0200 Subject: [PATCH] FeedReader: Message of a local feed can be added as forum and board message --- .../gui/FeedReaderMessageWidget.cpp | 119 ++++++++++++++++++ .../FeedReader/gui/FeedReaderMessageWidget.h | 4 + plugins/FeedReader/interface/rsFeedReader.h | 10 ++ plugins/FeedReader/lang/FeedReader_en.ts | 18 ++- plugins/FeedReader/services/p3FeedReader.cc | 82 ++++++++++++ plugins/FeedReader/services/p3FeedReader.h | 5 + .../src/gui/gxsforums/CreateGxsForumMsg.cpp | 6 +- 7 files changed, 237 insertions(+), 7 deletions(-) diff --git a/plugins/FeedReader/gui/FeedReaderMessageWidget.cpp b/plugins/FeedReader/gui/FeedReaderMessageWidget.cpp index 96198f400..5be5d3ebc 100644 --- a/plugins/FeedReader/gui/FeedReaderMessageWidget.cpp +++ b/plugins/FeedReader/gui/FeedReaderMessageWidget.cpp @@ -36,8 +36,12 @@ #include "gui/settings/rsharesettings.h" #include "util/HandleRichText.h" #include "util/QtVersion.h" +#include "gui/Posted/PostedCreatePostDialog.h" +#include "gui/gxsforums/CreateGxsForumMsg.h" #include "retroshare/rsiface.h" +#include "retroshare/rsgxsforums.h" +#include "retroshare/rsposted.h" #define COLUMN_MSG_COUNT 4 #define COLUMN_MSG_TITLE 0 @@ -350,6 +354,20 @@ void FeedReaderMessageWidget::msgTreeCustomPopupMenu(QPoint /*point*/) action = contextMnu.addAction(QIcon(""), tr("Remove"), this, SLOT(removeMsg())); action->setEnabled(!selectedItems.empty()); + if (selectedItems.size() == 1 && (mFeedReader->forums() || mFeedReader->posted())) { + contextMnu.addSeparator(); + + if (mFeedReader->forums()) { + QMenu *menu = contextMnu.addMenu(tr("Add to forum")); + connect(menu, SIGNAL(aboutToShow()), this, SLOT(fillForumMenu())); + } + + if (mFeedReader->posted()) { + QMenu *menu = contextMnu.addMenu(tr("Add to board")); + connect(menu, SIGNAL(aboutToShow()), this, SLOT(fillPostedMenu())); + } + } + contextMnu.addSeparator(); action = contextMnu.addAction(QIcon(""), tr("Retransform"), this, SLOT(retransformMsg())); @@ -850,3 +868,104 @@ void FeedReaderMessageWidget::openLinkMsg() QDesktopServices::openUrl(QUrl(link)); } + +void FeedReaderMessageWidget::fillForumMenu() +{ + QMenu *menu = dynamic_cast(sender()) ; + if (!menu) { + return; + } + + disconnect(menu, SIGNAL(aboutToShow()), this, SLOT(fillForumMenu())); + + std::vector groups; + if (mFeedReader->getForumGroups(groups, true)) { + for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) { + const RsGxsForumGroup &group = *it; + QAction *action = menu->addAction(QString::fromUtf8(group.mMeta.mGroupName.c_str()), this, SLOT(addToForum())); + action->setData(QString::fromUtf8(group.mMeta.mGroupId.toStdString().c_str())); + } + } +} + +void FeedReaderMessageWidget::fillPostedMenu() +{ + QMenu *menu = dynamic_cast(sender()) ; + if (!menu) { + return; + } + + disconnect(menu, SIGNAL(aboutToShow()), this, SLOT(fillPostedMenu())); + + std::vector groups; + if (mFeedReader->getPostedGroups(groups, true)) { + for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) { + const RsPostedGroup &group = *it; + QAction *action = menu->addAction(QString::fromUtf8(group.mMeta.mGroupName.c_str()), this, SLOT(addToPosted())); + action->setData(QString::fromUtf8(group.mMeta.mGroupId.toStdString().c_str())); + } + } +} + +void FeedReaderMessageWidget::addToForum() +{ + QAction *action = dynamic_cast(sender()) ; + if (!action) { + return; + } + + QString id = action->data().toString(); + if (id.isEmpty()) { + return; + } + + QList selectedItems = ui->msgTreeWidget->selectedItems(); + if (selectedItems.size() != 1) { + return; + } + + std::string msgId = selectedItems[0]->data(COLUMN_MSG_DATA, ROLE_MSG_ID).toString().toStdString(); + FeedMsgInfo msgInfo; + if (!mFeedReader->getMsgInfo(mFeedId, msgId, msgInfo)) { + return; + } + + RsGxsGroupId forumId(id.toStdString()); + + CreateGxsForumMsg *msgDialog = new CreateGxsForumMsg(forumId, RsGxsMessageId(), RsGxsMessageId(), RsGxsId()) ; + msgDialog->setSubject(QString::fromUtf8(msgInfo.title.c_str())); + msgDialog->insertPastedText(QString::fromUtf8(msgInfo.description.c_str())); + msgDialog->show(); +} + +void FeedReaderMessageWidget::addToPosted() +{ + QAction *action = dynamic_cast(sender()) ; + if (!action) { + return; + } + + QString id = action->data().toString(); + if (id.isEmpty()) { + return; + } + + QList selectedItems = ui->msgTreeWidget->selectedItems(); + if (selectedItems.size() != 1) { + return; + } + + std::string msgId = selectedItems[0]->data(COLUMN_MSG_DATA, ROLE_MSG_ID).toString().toStdString(); + FeedMsgInfo msgInfo; + if (!mFeedReader->getMsgInfo(mFeedId, msgId, msgInfo)) { + return; + } + + RsGxsGroupId postedId(id.toStdString()); + + PostedCreatePostDialog *msgDialog = new PostedCreatePostDialog(mFeedReader->posted(), postedId); + msgDialog->setTitle(QString::fromUtf8(msgInfo.title.c_str())); + msgDialog->setNotes(QString::fromUtf8(msgInfo.description.c_str())); + msgDialog->setLink(QString::fromUtf8(msgInfo.link.c_str())); + msgDialog->show(); +} diff --git a/plugins/FeedReader/gui/FeedReaderMessageWidget.h b/plugins/FeedReader/gui/FeedReaderMessageWidget.h index 452c407ad..317d61e71 100644 --- a/plugins/FeedReader/gui/FeedReaderMessageWidget.h +++ b/plugins/FeedReader/gui/FeedReaderMessageWidget.h @@ -73,6 +73,10 @@ private slots: void openLinkMsg(); void copyLinkMsg(); void retransformMsg(); + void fillForumMenu(); + void fillPostedMenu(); + void addToForum(); + void addToPosted(); /* FeedReaderNotify */ void feedChanged(uint32_t feedId, int type); diff --git a/plugins/FeedReader/interface/rsFeedReader.h b/plugins/FeedReader/interface/rsFeedReader.h index 3de449ba0..bfb239400 100644 --- a/plugins/FeedReader/interface/rsFeedReader.h +++ b/plugins/FeedReader/interface/rsFeedReader.h @@ -25,8 +25,13 @@ #include #include #include +#include class RsFeedReader; +class RsGxsForums; +class RsPosted; +class RsGxsForumGroup; +class RsPostedGroup; extern RsFeedReader *rsFeedReader; enum RsFeedReaderErrorState { @@ -232,6 +237,11 @@ public: virtual bool retransformMsg(uint32_t feedId, const std::string &msgId) = 0; virtual bool clearMessageCache(uint32_t feedId) = 0; + virtual RsGxsForums* forums() = 0; + virtual RsPosted* posted() = 0; + virtual bool getForumGroups(std::vector &groups, bool onlyOwn) = 0; + virtual bool getPostedGroups(std::vector &groups, bool onlyOwn) = 0; + virtual RsFeedReaderErrorState processXPath(const std::list &xpathsToUse, const std::list &xpathsToRemove, std::string &description, std::string &errorString) = 0; virtual RsFeedReaderErrorState processXslt(const std::string &xslt, std::string &description, std::string &errorString) = 0; }; diff --git a/plugins/FeedReader/lang/FeedReader_en.ts b/plugins/FeedReader/lang/FeedReader_en.ts index 500c46810..af6f9422f 100644 --- a/plugins/FeedReader/lang/FeedReader_en.ts +++ b/plugins/FeedReader/lang/FeedReader_en.ts @@ -194,8 +194,8 @@ - - + + Edit feed @@ -530,7 +530,7 @@ - + Title @@ -616,13 +616,23 @@ Remove + + + Add to forum + + + Add to board + + + + Retransform - + Hide diff --git a/plugins/FeedReader/services/p3FeedReader.cc b/plugins/FeedReader/services/p3FeedReader.cc index 104e137c6..0e3310aa5 100644 --- a/plugins/FeedReader/services/p3FeedReader.cc +++ b/plugins/FeedReader/services/p3FeedReader.cc @@ -2532,3 +2532,85 @@ bool p3FeedReader::waitForToken(RsGxsIfaceHelper *interface, uint32_t token) return false; } + +bool p3FeedReader::getForumGroups(std::vector &groups, bool onlyOwn) +{ + if (!mForums) { + std::cerr << "p3FeedReader::getForumGroups - can't get groups, member mForums is not set" << std::endl; + return false; + } + + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA; + + uint32_t token; + if (!mForums->requestGroupInfo(token, opts)) { + std::cerr << "p3FeedReader::getForumGroups - can't get group list" << std::endl; + return false; + } + + if (!waitForToken(mForums, token)) { + std::cerr << "p3FeedReader::getForumGroups - waitForToken for list failed" << std::endl; + return false; + } + + if (!mForums->getGroupData(token, groups)) { + std::cerr << "p3FeedReader::getForumGroups - getGroupData failed" << std::endl; + return false; + } + + if (onlyOwn) { + // filter groups + for (std::vector::iterator it = groups.begin(); it != groups.end(); ) { + const RsGxsForumGroup &group = *it; + if (IS_GROUP_PUBLISHER(group.mMeta.mSubscribeFlags) && IS_GROUP_ADMIN(group.mMeta.mSubscribeFlags)) { + ++it; + } else { + it = groups.erase(it); + } + } + } + + return true; +} + +bool p3FeedReader::getPostedGroups(std::vector &groups, bool onlyOwn) +{ + if (!mPosted) { + std::cerr << "p3FeedReader::getPostedGroups - can't get groups, member mPosted is not set" << std::endl; + return false; + } + + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA; + + uint32_t token; + if (!mPosted->requestGroupInfo(token, opts)) { + std::cerr << "p3FeedReader::getPostedGroups - can't get group list" << std::endl; + return false; + } + + if (!waitForToken(mPosted, token)) { + std::cerr << "p3FeedReader::getPostedGroups - waitForToken for list failed" << std::endl; + return false; + } + + if (!mPosted->getGroupData(token, groups)) { + std::cerr << "p3FeedReader::getForumGroups - getGroupData failed" << std::endl; + return false; + } + + if (onlyOwn) { + // filter groups + for (std::vector::iterator it = groups.begin(); it != groups.end(); ) { + const RsPostedGroup &group = *it; + if (IS_GROUP_PUBLISHER(group.mMeta.mSubscribeFlags) && IS_GROUP_ADMIN(group.mMeta.mSubscribeFlags)) { + ++it; + } else { + it = groups.erase(it); + } + } + } + + return true; +} diff --git a/plugins/FeedReader/services/p3FeedReader.h b/plugins/FeedReader/services/p3FeedReader.h index ac251b23a..c69832506 100644 --- a/plugins/FeedReader/services/p3FeedReader.h +++ b/plugins/FeedReader/services/p3FeedReader.h @@ -75,6 +75,11 @@ public: virtual bool retransformMsg(uint32_t feedId, const std::string &msgId); virtual bool clearMessageCache(uint32_t feedId); + virtual RsGxsForums* forums() { return mForums; } + virtual RsPosted* posted() { return mPosted; } + virtual bool getForumGroups(std::vector &groups, bool onlyOwn); + virtual bool getPostedGroups(std::vector &groups, bool onlyOwn); + virtual RsFeedReaderErrorState processXPath(const std::list &xpathsToUse, const std::list &xpathsToRemove, std::string &description, std::string &errorString); virtual RsFeedReaderErrorState processXslt(const std::string &xslt, std::string &description, std::string &errorString); diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index 493f254d4..4236b6f04 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -68,19 +68,19 @@ CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessage mStateHelper->addWidget(CREATEGXSFORUMMSG_FORUMINFO, ui->postButton); mStateHelper->addWidget(CREATEGXSFORUMMSG_FORUMINFO, ui->innerFrame); mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_FORUMINFO, ui->forumName); - mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_FORUMINFO, ui->forumSubject); + mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_FORUMINFO, ui->forumSubject, false); mStateHelper->addClear(CREATEGXSFORUMMSG_FORUMINFO, ui->forumName); mStateHelper->addWidget(CREATEGXSFORUMMSG_PARENTMSG, ui->postButton); mStateHelper->addWidget(CREATEGXSFORUMMSG_PARENTMSG, ui->innerFrame); mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_PARENTMSG, ui->forumName); - mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_PARENTMSG, ui->forumSubject); + mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_PARENTMSG, ui->forumSubject, false); mStateHelper->addClear(CREATEGXSFORUMMSG_PARENTMSG, ui->forumName); mStateHelper->addWidget(CREATEGXSFORUMMSG_ORIGMSG, ui->postButton); mStateHelper->addWidget(CREATEGXSFORUMMSG_ORIGMSG, ui->innerFrame); mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_ORIGMSG, ui->forumName); - mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_ORIGMSG, ui->forumSubject); + mStateHelper->addLoadPlaceholder(CREATEGXSFORUMMSG_ORIGMSG, ui->forumSubject, false); mStateHelper->addClear(CREATEGXSFORUMMSG_ORIGMSG, ui->forumName);