diff --git a/retroshare-gui/src/gui/WikiPoos/WikiDialog.cpp b/retroshare-gui/src/gui/WikiPoos/WikiDialog.cpp index afecb2cd6..c0cb65d96 100644 --- a/retroshare-gui/src/gui/WikiPoos/WikiDialog.cpp +++ b/retroshare-gui/src/gui/WikiPoos/WikiDialog.cpp @@ -21,6 +21,7 @@ * */ +#include #include #include @@ -32,6 +33,10 @@ #include +// These should be in retroshare/ folder. +#include "gxs/rsgxsflags.h" + + #include #include @@ -49,7 +54,8 @@ #define WIKI_DEBUG 1 -#define WIKIDIALOG_LISTING_GROUPDATA 2 +#define WIKIDIALOG_LISTING_GROUPMETA 2 +#define WIKIDIALOG_LISTING_GROUPDATA 3 #define WIKIDIALOG_LISTING_PAGES 5 #define WIKIDIALOG_MOD_LIST 6 #define WIKIDIALOG_MOD_PAGES 7 @@ -58,6 +64,21 @@ #define WIKIDIALOG_EDITTREE_DATA 9 + +/* Images for TreeWidget (Copied from GxsForums.cpp) */ +#define IMAGE_FOLDER ":/images/folder16.png" +#define IMAGE_FOLDERGREEN ":/images/folder_green.png" +#define IMAGE_FOLDERRED ":/images/folder_red.png" +#define IMAGE_FOLDERYELLOW ":/images/folder_yellow.png" +#define IMAGE_FORUM ":/images/konversation.png" +#define IMAGE_SUBSCRIBE ":/images/edit_add24.png" +#define IMAGE_UNSUBSCRIBE ":/images/cancel.png" +#define IMAGE_INFO ":/images/info16.png" +#define IMAGE_NEWFORUM ":/images/new_forum16.png" +#define IMAGE_FORUMAUTHD ":/images/konv_message2.png" +#define IMAGE_COPYLINK ":/images/copyrslink.png" + + /** Constructor */ WikiDialog::WikiDialog(QWidget *parent) : MainPage(parent) @@ -79,6 +100,15 @@ WikiDialog::WikiDialog(QWidget *parent) connect( ui.treeWidget_Pages, SIGNAL(itemSelectionChanged()), this, SLOT(groupTreeChanged())); + + // GroupTreeWidget. + connect(ui.groupTreeWidget, SIGNAL(treeCustomContextMenuRequested(QPoint)), this, SLOT(groupListCustomPopupMenu(QPoint))); + connect(ui.groupTreeWidget, SIGNAL(treeItemActivated(QString)), this, SLOT(wikiGroupChanged(QString))); + + + + + QTimer *timer = new QTimer(this); timer->connect(timer, SIGNAL(timeout()), this, SLOT(checkUpdate())); timer->start(1000); @@ -86,6 +116,14 @@ WikiDialog::WikiDialog(QWidget *parent) /* setup TokenQueue */ mWikiQueue = new TokenQueue(rsWiki->getTokenService(), this); + + /* Setup Group Tree */ + mYourGroups = ui.groupTreeWidget->addCategoryItem(tr("My Groups"), QIcon(IMAGE_FOLDER), true); + mSubscribedGroups = ui.groupTreeWidget->addCategoryItem(tr("Subscribed Groups"), QIcon(IMAGE_FOLDERRED), true); + mPopularGroups = ui.groupTreeWidget->addCategoryItem(tr("Popular Groups"), QIcon(IMAGE_FOLDERGREEN), false); + mOtherGroups = ui.groupTreeWidget->addCategoryItem(tr("Other Groups"), QIcon(IMAGE_FOLDERYELLOW), false); + + } void WikiDialog::checkUpdate() @@ -373,7 +411,47 @@ std::string WikiDialog::getSelectedGroup() void WikiDialog::insertWikiGroups() { - requestGroupList(); + //requestGroupList(); + requestGroupMeta(); +} + + +void WikiDialog::requestGroupMeta() +{ + std::cerr << "WikiDialog::requestGroupMeta()"; + std::cerr << std::endl; + + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_META; + + uint32_t token; + mWikiQueue->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_SUMMARY, opts, WIKIDIALOG_LISTING_GROUPMETA); +} + + +void WikiDialog::loadGroupMeta(const uint32_t &token) +{ + std::cerr << "WikiDialog::loadGroupMeta()"; + std::cerr << std::endl; + + std::list groupMeta; + + if (!rsWiki->getGroupSummary(token, groupMeta)) + { + std::cerr << "WikiDialog::loadGroupMeta() Error getting GroupMeta"; + std::cerr << std::endl; + return; + } + + if (groupMeta.size() > 0) + { + insertGroupsData(groupMeta); + } + else + { + std::cerr << "WikiDialog::loadGroupMeta() ERROR No Groups..."; + std::cerr << std::endl; + } } @@ -400,15 +478,15 @@ void WikiDialog::loadGroupData(const uint32_t &token) std::vector datavector; std::vector::iterator vit; - if (!rsWiki->getCollections(token, datavector)) - { - std::cerr << "WikiDialog::loadGroupData() Error getting GroupData"; - std::cerr << std::endl; - return; - } + if (!rsWiki->getCollections(token, datavector)) + { + std::cerr << "WikiDialog::loadGroupData() Error getting GroupData"; + std::cerr << std::endl; + return; + } - for(vit = datavector.begin(); vit != datavector.end(); vit++) - { + for(vit = datavector.begin(); vit != datavector.end(); vit++) + { RsWikiCollection &group = *vit; /* Add Widget, and request Pages */ @@ -428,10 +506,11 @@ void WikiDialog::loadGroupData(const uint32_t &token) requestPages(groupIds); //requestOriginalPages(groupIds); - } + } } + void WikiDialog::requestPages(const std::list &groupIds) { std::cerr << "WikiDialog::requestPages()"; @@ -439,7 +518,7 @@ void WikiDialog::requestPages(const std::list &groupIds) RsTokReqOptions opts; opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; - opts.mOptions = (RS_TOKREQOPT_MSG_LATEST | RS_TOKREQOPT_MSG_THREAD); // We want latest version of Thread Heads. + opts.mOptions = (RS_TOKREQOPT_MSG_LATEST | RS_TOKREQOPT_MSG_THREAD); // We want latest version of Thread Heads. uint32_t token; mWikiQueue->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, groupIds, WIKIDIALOG_LISTING_PAGES); } @@ -456,7 +535,7 @@ void WikiDialog::loadPages(const uint32_t &token) std::vector snapshots; std::vector::iterator vit; - if (!rsWiki->getSnapshots(token, snapshots)) + if (!rsWiki->getSnapshots(token, snapshots)) { // ERROR return; @@ -464,19 +543,19 @@ void WikiDialog::loadPages(const uint32_t &token) for(vit = snapshots.begin(); vit != snapshots.end(); vit++) { - RsWikiSnapshot page = *vit; + RsWikiSnapshot page = *vit; if (!groupItem) { /* find the entry */ - int itemCount = ui.treeWidget_Pages->topLevelItemCount(); - for (int nIndex = 0; nIndex < itemCount; nIndex++) - { + int itemCount = ui.treeWidget_Pages->topLevelItemCount(); + for (int nIndex = 0; nIndex < itemCount; nIndex++) + { QTreeWidgetItem *tmpItem = ui.treeWidget_Pages->topLevelItem(nIndex); - std::string tmpid = tmpItem->data(WIKI_GROUP_COL_GROUPID, + std::string tmpid = tmpItem->data(WIKI_GROUP_COL_GROUPID, Qt::DisplayRole).toString().toStdString(); if (tmpid == page.mMeta.mGroupId) { - groupItem = tmpItem; + groupItem = tmpItem; break; } } @@ -533,7 +612,7 @@ void WikiDialog::loadWikiPage(const uint32_t &token) // Should only have one WikiPage.... std::vector snapshots; - if (!rsWiki->getSnapshots(token, snapshots)) + if (!rsWiki->getSnapshots(token, snapshots)) { std::cerr << "WikiDialog::loadWikiPage() ERROR"; std::cerr << std::endl; @@ -573,6 +652,10 @@ void WikiDialog::loadRequest(const TokenQueue *queue, const TokenRequest &req) /* now switch on req */ switch(req.mUserType) { + case WIKIDIALOG_LISTING_GROUPMETA: + loadGroupMeta(req.mToken); + break; + case WIKIDIALOG_LISTING_GROUPDATA: loadGroupData(req.mToken); break; @@ -585,7 +668,7 @@ void WikiDialog::loadRequest(const TokenQueue *queue, const TokenRequest &req) loadWikiPage(req.mToken); break; -#define GXSGROUP_NEWGROUPID 1 +#define GXSGROUP_NEWGROUPID 1 case GXSGROUP_NEWGROUPID: insertWikiGroups(); break; @@ -601,4 +684,181 @@ void WikiDialog::loadRequest(const TokenQueue *queue, const TokenRequest &req) +/************************** Group Widget Stuff *********************************/ + + +void WikiDialog::subscribeToGroup() +{ + wikiSubscribe(true); +} + +void WikiDialog::unsubscribeToGroup() +{ + wikiSubscribe(false); +} + +void WikiDialog::wikiSubscribe(bool subscribe) +{ + if (mGroupId.empty()) { + return; + } + + uint32_t token; + rsWiki->subscribeToGroup(token, mGroupId, subscribe); +} + + +void WikiDialog::wikiGroupChanged(const QString &groupId) +{ + mGroupId = groupId.toStdString(); + + if (mGroupId.empty()) { + return; + } + + std::list groupIds; + groupIds.push_back(mGroupId); + requestPages(groupIds); + +} + + +void WikiDialog::groupListCustomPopupMenu(QPoint /*point*/) +{ + + int subscribeFlags = ui.groupTreeWidget->subscribeFlags(QString::fromStdString(mGroupId)); + + QMenu contextMnu(this); + + std::cerr << "WikiDialog::groupListCustomPopupMenu()"; + std::cerr << std::endl; + std::cerr << " mGroupId: " << mGroupId; + std::cerr << std::endl; + std::cerr << " subscribeFlags: " << subscribeFlags; + std::cerr << std::endl; + std::cerr << " IS_GROUP_SUBSCRIBED(): " << IS_GROUP_SUBSCRIBED(subscribeFlags); + std::cerr << std::endl; + std::cerr << " IS_GROUP_ADMIN(): " << IS_GROUP_ADMIN(subscribeFlags); + std::cerr << std::endl; + std::cerr << std::endl; + + QAction *action = contextMnu.addAction(QIcon(IMAGE_SUBSCRIBE), tr("Subscribe to Group"), this, SLOT(subscribeToGroup())); + action->setDisabled (mGroupId.empty() || IS_GROUP_SUBSCRIBED(subscribeFlags)); + + action = contextMnu.addAction(QIcon(IMAGE_UNSUBSCRIBE), tr("Unsubscribe to Group"), this, SLOT(unsubscribeToGroup())); + action->setEnabled (!mGroupId.empty() && IS_GROUP_SUBSCRIBED(subscribeFlags)); + + /************** NOT ENABLED YET *****************/ + + //if (!Settings->getForumOpenAllInNewTab()) { + // action = contextMnu.addAction(QIcon(""), tr("Open in new tab"), this, SLOT(openInNewTab())); + // if (mForumId.empty() || forumThreadWidget(mForumId)) { + // action->setEnabled(false); + // } + //} + + //contextMnu.addSeparator(); + + //contextMnu.addAction(QIcon(IMAGE_NEWFORUM), tr("New Forum"), this, SLOT(newforum())); + + //action = contextMnu.addAction(QIcon(IMAGE_INFO), tr("Show Forum Details"), this, SLOT(showForumDetails())); + //action->setEnabled (!mForumId.empty ()); + + //action = contextMnu.addAction(QIcon(":/images/settings16.png"), tr("Edit Forum Details"), this, SLOT(editForumDetails())); + //action->setEnabled (!mForumId.empty () && IS_GROUP_ADMIN(subscribeFlags)); + + //QAction *shareKeyAct = new QAction(QIcon(":/images/gpgp_key_generate.png"), tr("Share Forum"), &contextMnu); + //connect( shareKeyAct, SIGNAL( triggered() ), this, SLOT( shareKey() ) ); + //shareKeyAct->setEnabled(!mForumId.empty() && IS_GROUP_ADMIN(subscribeFlags)); + //contextMnu.addAction( shareKeyAct); + + //QAction *restoreKeysAct = new QAction(QIcon(":/images/settings16.png"), tr("Restore Publish Rights for Forum" ), &contextMnu); + //connect( restoreKeysAct , SIGNAL( triggered() ), this, SLOT( restoreForumKeys() ) ); + //restoreKeysAct->setEnabled(!mForumId.empty() && !IS_GROUP_ADMIN(subscribeFlags)); + //contextMnu.addAction( restoreKeysAct); + + //action = contextMnu.addAction(QIcon(IMAGE_COPYLINK), tr("Copy RetroShare Link"), this, SLOT(copyForumLink())); + //action->setEnabled(!mForumId.empty()); + + //contextMnu.addSeparator(); + + contextMnu.exec(QCursor::pos()); +} + + + + + +void WikiDialog::insertGroupsData(const std::list &wikiList) +{ + std::list::const_iterator it; + + QList adminList; + QList subList; + QList popList; + QList otherList; + std::multimap popMap; + + for (it = wikiList.begin(); it != wikiList.end(); it++) { + /* sort it into Publish (Own), Subscribed, Popular and Other */ + uint32_t flags = it->mSubscribeFlags; + + GroupItemInfo groupItemInfo; + GroupMetaDataToGroupItemInfo(*it, groupItemInfo); + + if (IS_GROUP_ADMIN(flags)) { + adminList.push_back(groupItemInfo); + } else if (IS_GROUP_SUBSCRIBED(flags)) { + /* subscribed forum */ + subList.push_back(groupItemInfo); + } else { + /* rate the others by popularity */ + popMap.insert(std::make_pair(it->mPop, groupItemInfo)); + } + } + + /* iterate backwards through popMap - take the top 5 or 10% of list */ + uint32_t popCount = 5; + if (popCount < popMap.size() / 10) + { + popCount = popMap.size() / 10; + } + + uint32_t i = 0; + uint32_t popLimit = 0; + std::multimap::reverse_iterator rit; + for(rit = popMap.rbegin(); ((rit != popMap.rend()) && (i < popCount)); rit++, i++) ; + if (rit != popMap.rend()) { + popLimit = rit->first; + } + + for (rit = popMap.rbegin(); rit != popMap.rend(); rit++) { + if (rit->second.popularity < (int) popLimit) { + otherList.append(rit->second); + } else { + popList.append(rit->second); + } + } + + /* now we can add them in as a tree! */ + ui.groupTreeWidget->fillGroupItems(mYourGroups, adminList); + ui.groupTreeWidget->fillGroupItems(mSubscribedGroups, subList); + ui.groupTreeWidget->fillGroupItems(mPopularGroups, popList); + ui.groupTreeWidget->fillGroupItems(mOtherGroups, otherList); + +} + +void WikiDialog::GroupMetaDataToGroupItemInfo(const RsGroupMetaData &groupInfo, GroupItemInfo &groupItemInfo) +{ + + groupItemInfo.id = QString::fromStdString(groupInfo.mGroupId); + groupItemInfo.name = QString::fromUtf8(groupInfo.mGroupName.c_str()); + //groupItemInfo.description = QString::fromUtf8(groupInfo.forumDesc); + groupItemInfo.popularity = groupInfo.mPop; + groupItemInfo.lastpost = QDateTime::fromTime_t(groupInfo.mLastPost); + groupItemInfo.subscribeFlags = groupInfo.mSubscribeFlags; + + groupItemInfo.icon = QIcon(IMAGE_FORUM); + +} diff --git a/retroshare-gui/src/gui/WikiPoos/WikiDialog.h b/retroshare-gui/src/gui/WikiPoos/WikiDialog.h index 39fc80339..3ecb6e0ee 100644 --- a/retroshare-gui/src/gui/WikiPoos/WikiDialog.h +++ b/retroshare-gui/src/gui/WikiPoos/WikiDialog.h @@ -61,6 +61,12 @@ private slots: void insertWikiGroups(); + // GroupTreeWidget stuff. + void groupListCustomPopupMenu(QPoint point); + void subscribeToGroup(); + void unsubscribeToGroup(); + void wikiGroupChanged(const QString &groupId); + private: void clearWikiPage(); @@ -72,6 +78,16 @@ bool getSelectedPage(std::string &groupId, std::string &pageId, std::string &or std::string getSelectedPage(); std::string getSelectedGroup(); + + // Using GroupTreeWidget. +void wikiSubscribe(bool subscribe); +void GroupMetaDataToGroupItemInfo(const RsGroupMetaData &groupInfo, GroupItemInfo &groupItemInfo); +void insertGroupsData(const std::list &wikiList); + + +void requestGroupMeta(); +void loadGroupMeta(const uint32_t &token); + void requestGroupList(); void loadGroupData(const uint32_t &token); @@ -92,6 +108,13 @@ void loadWikiPage(const uint32_t &token); std::string mPageSelected; std::string mModSelected; + + QTreeWidgetItem *mYourGroups; + QTreeWidgetItem *mSubscribedGroups; + QTreeWidgetItem *mPopularGroups; + QTreeWidgetItem *mOtherGroups; + std::string mGroupId; // From GroupTreeWidget + /* UI - from Designer */ Ui::WikiDialog ui; diff --git a/retroshare-gui/src/gui/WikiPoos/WikiDialog.ui b/retroshare-gui/src/gui/WikiPoos/WikiDialog.ui index 3db94846c..005ed0a16 100644 --- a/retroshare-gui/src/gui/WikiPoos/WikiDialog.ui +++ b/retroshare-gui/src/gui/WikiPoos/WikiDialog.ui @@ -105,14 +105,24 @@ 0 0 - 268 - 456 + 241 + 454 0 + + + + + 0 + 150 + + + + @@ -339,8 +349,8 @@ 0 0 - 465 - 456 + 491 + 454 @@ -380,6 +390,14 @@ + + + GroupTreeWidget + QWidget +
gui/common/GroupTreeWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui b/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui index 21e91fe63..ffa98afbd 100644 --- a/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui +++ b/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui @@ -39,9 +39,96 @@ 0 - + + + + + + 16777215 + 50 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 170 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 170 + 0 + + + + + + + + + 255 + 170 + 0 + + + + + + + 255 + 170 + 0 + + + + + + + + + 75 + true + + + + true + + + Warning: The services here are experimental. Please help us test them. + But Remember: Any data here *WILL* be lost when we upgrade the protocols. + + +