Added GroupTreeWidget to WikiDialog - enables subscribing to groups. (taken from GxsForums)

Added Orange Warning Message to GXS Window...




git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6150 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
drbob 2013-02-26 23:40:24 +00:00
parent 61c3afe56d
commit aac114ba8e
4 changed files with 414 additions and 26 deletions

View File

@ -21,6 +21,7 @@
*
*/
#include <QMenu>
#include <QFile>
#include <QFileInfo>
@ -32,6 +33,10 @@
#include <retroshare/rswiki.h>
// These should be in retroshare/ folder.
#include "gxs/rsgxsflags.h"
#include <iostream>
#include <sstream>
@ -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<RsGroupMetaData> 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<RsWikiCollection> datavector;
std::vector<RsWikiCollection>::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<RsGxsGroupId> &groupIds)
{
std::cerr << "WikiDialog::requestPages()";
@ -439,7 +518,7 @@ void WikiDialog::requestPages(const std::list<RsGxsGroupId> &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<RsWikiSnapshot> snapshots;
std::vector<RsWikiSnapshot>::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<RsWikiSnapshot> 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<RsGxsGroupId> 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<RsGroupMetaData> &wikiList)
{
std::list<RsGroupMetaData>::const_iterator it;
QList<GroupItemInfo> adminList;
QList<GroupItemInfo> subList;
QList<GroupItemInfo> popList;
QList<GroupItemInfo> otherList;
std::multimap<uint32_t, GroupItemInfo> 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<uint32_t, GroupItemInfo>::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);
}

View File

@ -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<RsGroupMetaData> &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;

View File

@ -105,14 +105,24 @@
<rect>
<x>0</x>
<y>0</y>
<width>268</width>
<height>456</height>
<width>241</width>
<height>454</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="GroupTreeWidget" name="groupTreeWidget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QTreeWidget" name="treeWidget_Pages">
<column>
@ -339,8 +349,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>465</width>
<height>456</height>
<width>491</width>
<height>454</height>
</rect>
</property>
<property name="styleSheet">
@ -380,6 +390,14 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>GroupTreeWidget</class>
<extends>QWidget</extends>
<header>gui/common/GroupTreeWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="Wiki_images.qrc"/>
</resources>

View File

@ -39,9 +39,96 @@
<property name="horizontalSpacing">
<number>0</number>
</property>
<item row="0" column="0">
<item row="1" column="0">
<widget class="MainPageStack" name="stackPages" native="true"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>50</height>
</size>
</property>
<property name="palette">
<palette>
<active>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>170</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>170</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>170</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>170</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="text">
<string> Warning: The services here are experimental. Please help us test them.
But Remember: Any data here *WILL* be lost when we upgrade the protocols.</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>