Replaced scroll area in NewsFeed with RSFeedWidget.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@7680 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2014-11-15 17:24:49 +00:00
parent dcabaf780d
commit dee39a8840
20 changed files with 477 additions and 290 deletions

View file

@ -20,8 +20,10 @@
****************************************************************/ ****************************************************************/
#include <QTimer> #include <QTimer>
#include <QDateTime>
#include "NewsFeed.h" #include "NewsFeed.h"
#include "ui_NewsFeed.h"
#include <retroshare/rsnotify.h> #include <retroshare/rsnotify.h>
#include <retroshare/rspeers.h> #include <retroshare/rspeers.h>
@ -51,6 +53,7 @@
#include "chat/ChatDialog.h" #include "chat/ChatDialog.h"
#include "msgs/MessageComposer.h" #include "msgs/MessageComposer.h"
#include "common/FeedNotify.h" #include "common/FeedNotify.h"
#include "notifyqt.h"
const uint32_t NEWSFEED_PEERLIST = 0x0001; const uint32_t NEWSFEED_PEERLIST = 0x0001;
@ -67,6 +70,8 @@ const uint32_t NEWSFEED_MESSAGELIST = 0x0008;
const uint32_t NEWSFEED_CHATMSGLIST = 0x0009; const uint32_t NEWSFEED_CHATMSGLIST = 0x0009;
const uint32_t NEWSFEED_SECLIST = 0x000a; const uint32_t NEWSFEED_SECLIST = 0x000a;
#define ROLE_RECEIVED FEED_TREEWIDGET_SORTROLE
/***** /*****
* #define NEWS_DEBUG 1 * #define NEWS_DEBUG 1
****/ ****/
@ -74,11 +79,12 @@ const uint32_t NEWSFEED_SECLIST = 0x000a;
static NewsFeed *instance = NULL; static NewsFeed *instance = NULL;
/** Constructor */ /** Constructor */
NewsFeed::NewsFeed(QWidget *parent) NewsFeed::NewsFeed(QWidget *parent) :
: RsAutoUpdatePage(1000,parent) RsAutoUpdatePage(1000,parent),
ui(new Ui::NewsFeed)
{ {
/* Invoke the Qt Designer generated object setup routine */ /* Invoke the Qt Designer generated object setup routine */
setupUi(this); ui->setupUi(this);
setUpdateWhenInvisible(true); setUpdateWhenInvisible(true);
@ -86,8 +92,12 @@ NewsFeed::NewsFeed(QWidget *parent)
instance = this; instance = this;
} }
connect(removeAllButton, SIGNAL(clicked()), this, SLOT(removeAll())); ui->feedWidget->enableRemove(true);
connect(feedOptionsButton, SIGNAL(clicked()), this, SLOT(feedoptions()));
connect(ui->removeAllButton, SIGNAL(clicked()), ui->feedWidget, SLOT(clear()));
connect(ui->feedOptionsButton, SIGNAL(clicked()), this, SLOT(feedoptions()));
connect(ui->feedWidget, SIGNAL(feedCountChanged()), this, SLOT(sendNewsFeedChanged()));
connect(NotifyQt::getInstance(), SIGNAL(settingsChanged()), this, SLOT(settingsChanged()));
QString hlp_str = tr( QString hlp_str = tr(
" <h1><img width=\"32\" src=\":/images/64px_help.png\">&nbsp;&nbsp;News Feed</h1> \ " <h1><img width=\"32\" src=\":/images/64px_help.png\">&nbsp;&nbsp;News Feed</h1> \
@ -103,7 +113,9 @@ QString hlp_str = tr(
</ul> </p> \ </ul> </p> \
") ; ") ;
registerHelpButton(helpButton,hlp_str) ; registerHelpButton(ui->helpButton,hlp_str) ;
settingsChanged();
} }
NewsFeed::~NewsFeed() NewsFeed::~NewsFeed()
@ -118,6 +130,11 @@ UserNotify *NewsFeed::getUserNotify(QObject *parent)
return new NewsFeedUserNotify(this, parent); return new NewsFeedUserNotify(this, parent);
} }
void NewsFeed::settingsChanged()
{
ui->feedWidget->setSortRole(ROLE_RECEIVED, Settings->getAddFeedsAtEnd() ? Qt::AscendingOrder : Qt::DescendingOrder);
}
void NewsFeed::updateDisplay() void NewsFeed::updateDisplay()
{ {
if (!rsNotify) if (!rsNotify)
@ -235,7 +252,7 @@ void NewsFeed::updateDisplay()
if (rsPlugin) { if (rsPlugin) {
FeedNotify *feedNotify = rsPlugin->qt_feedNotify(); FeedNotify *feedNotify = rsPlugin->qt_feedNotify();
if (feedNotify && feedNotify->notifyEnabled()) { if (feedNotify && feedNotify->notifyEnabled()) {
QWidget *item = feedNotify->feedItem(this); FeedItem *item = feedNotify->feedItem(this);
if (item) { if (item) {
addFeedItem(item); addFeedItem(item);
break; break;
@ -252,6 +269,8 @@ void NewsFeed::testFeeds(uint notifyFlags)
return; return;
} }
instance->ui->feedWidget->enableCountChangedSignal(false);
uint pos = 0; uint pos = 0;
while (notifyFlags) { while (notifyFlags) {
@ -439,6 +458,10 @@ void NewsFeed::testFeeds(uint notifyFlags)
break; break;
} }
} }
instance->ui->feedWidget->enableCountChangedSignal(true);
instance->sendNewsFeedChanged();
} }
void NewsFeed::testFeed(FeedNotify *feedNotify) void NewsFeed::testFeed(FeedNotify *feedNotify)
@ -451,7 +474,7 @@ void NewsFeed::testFeed(FeedNotify *feedNotify)
return; return;
} }
QWidget *feedItem = feedNotify->testFeedItem(instance); FeedItem *feedItem = feedNotify->testFeedItem(instance);
if (!feedItem) { if (!feedItem) {
return; return;
} }
@ -459,62 +482,73 @@ void NewsFeed::testFeed(FeedNotify *feedNotify)
instance->addFeedItem(feedItem); instance->addFeedItem(feedItem);
} }
void NewsFeed::addFeedItem(QWidget *item) void NewsFeed::addFeedItem(FeedItem *item)
{ {
static const unsigned int MAX_WIDGETS_SIZE = 500 ; static const unsigned int MAX_FEEDITEM_COUNT = 500 ;
item->setAttribute(Qt::WA_DeleteOnClose, true); item->setAttribute(Qt::WA_DeleteOnClose, true);
connect(item, SIGNAL(destroyed(QObject*)), this, SLOT(itemDestroyed(QObject*)));
widgets.push_back(item);
// costly, but not really a problem here // costly, but not really a problem here
while(widgets.size() > MAX_WIDGETS_SIZE) int feedItemCount;
{ bool fromTop = Settings->getAddFeedsAtEnd();
QWidget *item = dynamic_cast<QWidget*>(widgets.front()) ;
while ((feedItemCount = ui->feedWidget->feedItemCount()) >= MAX_FEEDITEM_COUNT) {
if(item) FeedItem *feedItem = ui->feedWidget->feedItem(fromTop ? 0 : feedItemCount - 1);
item->close() ; if (!feedItem) {
widgets.pop_front() ; break;
}
ui->feedWidget->removeFeedItem(feedItem);
} }
sendNewsFeedChanged(); ui->feedWidget->addFeedItem(item, ROLE_RECEIVED, QDateTime::currentDateTime());
lockLayout(NULL, true);
if (Settings->getAddFeedsAtEnd()) {
itemsLayout->addWidget(item);
} else {
itemsLayout->insertWidget(0, item);
}
item->show();
lockLayout(item, false);
} }
void NewsFeed::addFeedItemIfUnique(QWidget *item, int itemType, const RsPeerId &sslId, bool replace) struct AddFeedItemIfUniqueData
{ {
foreach (QObject *itemObject, widgets) { AddFeedItemIfUniqueData(int type, const RsPeerId &sslId) : mType(type), mSslId(sslId) {}
SecurityItem *secitem = dynamic_cast<SecurityItem*>(itemObject);
if ((secitem) && (secitem->isSame(sslId, itemType))) int mType;
{ const RsPeerId &mSslId;
if (!replace) };
{
delete item; static bool addFeedItemIfUniqueCallback(FeedItem *feedItem, void *data)
return; {
} AddFeedItemIfUniqueData *findData = (AddFeedItemIfUniqueData*) data;
else if (!findData || findData->mSslId.isNull()) {
{ return false;
secitem->close(); }
break;
} SecurityItem *secitem = dynamic_cast<SecurityItem*>(feedItem);
if (!secitem) {
return false;
}
if (secitem->isSame(findData->mSslId, findData->mType)) {
return true;
}
return false;
}
void NewsFeed::addFeedItemIfUnique(FeedItem *item, int itemType, const RsPeerId &sslId, bool replace)
{
AddFeedItemIfUniqueData data(itemType, sslId);
FeedItem *feedItem = ui->feedWidget->findFeedItem(addFeedItemIfUniqueCallback, &data);
if (feedItem) {
if (!replace) {
delete item;
return;
} }
ui->feedWidget->removeFeedItem(item);
} }
addFeedItem(item); addFeedItem(item);
} }
void NewsFeed::addFeedItemPeerConnect(RsFeedItem &fi) void NewsFeed::addFeedItemPeerConnect(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_CONNECT, false); PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_CONNECT, false);
@ -526,10 +560,9 @@ void NewsFeed::addFeedItemPeerConnect(RsFeedItem &fi)
std::cerr << "NewsFeed::addFeedItemPeerConnect()"; std::cerr << "NewsFeed::addFeedItemPeerConnect()";
std::cerr << std::endl; std::cerr << std::endl;
#endif #endif
} }
void NewsFeed::addFeedItemPeerDisconnect(RsFeedItem &fi) void NewsFeed::addFeedItemPeerDisconnect(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_STD, false); PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_STD, false);
@ -543,7 +576,7 @@ void NewsFeed::addFeedItemPeerDisconnect(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemPeerHello(RsFeedItem &fi) void NewsFeed::addFeedItemPeerHello(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_HELLO, false); PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_HELLO, false);
@ -557,7 +590,7 @@ void NewsFeed::addFeedItemPeerHello(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemPeerNew(RsFeedItem &fi) void NewsFeed::addFeedItemPeerNew(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_NEW_FOF, false); PeerItem *pi = new PeerItem(this, NEWSFEED_PEERLIST, RsPeerId(fi.mId1), PEER_TYPE_NEW_FOF, false);
@ -571,7 +604,7 @@ void NewsFeed::addFeedItemPeerNew(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemSecurityConnectAttempt(RsFeedItem &fi) void NewsFeed::addFeedItemSecurityConnectAttempt(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, fi.mType, false); SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, fi.mType, false);
@ -585,7 +618,7 @@ void NewsFeed::addFeedItemSecurityConnectAttempt(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemSecurityAuthDenied(RsFeedItem &fi) void NewsFeed::addFeedItemSecurityAuthDenied(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, fi.mType, false); SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, fi.mType, false);
@ -599,7 +632,7 @@ void NewsFeed::addFeedItemSecurityAuthDenied(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemSecurityUnknownIn(RsFeedItem &fi) void NewsFeed::addFeedItemSecurityUnknownIn(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, RS_FEED_ITEM_SEC_UNKNOWN_IN, false); SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, RS_FEED_ITEM_SEC_UNKNOWN_IN, false);
@ -613,7 +646,7 @@ void NewsFeed::addFeedItemSecurityUnknownIn(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemSecurityUnknownOut(RsFeedItem &fi) void NewsFeed::addFeedItemSecurityUnknownOut(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, RS_FEED_ITEM_SEC_UNKNOWN_OUT, false); SecurityItem *pi = new SecurityItem(this, NEWSFEED_SECLIST, RsPgpId(fi.mId1), RsPeerId(fi.mId2), fi.mId3, fi.mId4, RS_FEED_ITEM_SEC_UNKNOWN_OUT, false);
@ -627,7 +660,7 @@ void NewsFeed::addFeedItemSecurityUnknownOut(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemChannelNew(RsFeedItem &fi) void NewsFeed::addFeedItemChannelNew(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
// ChanNewItem *cni = new ChanNewItem(this, NEWSFEED_CHANNEWLIST, fi.mId1, false, true); // ChanNewItem *cni = new ChanNewItem(this, NEWSFEED_CHANNEWLIST, fi.mId1, false, true);
@ -641,7 +674,7 @@ void NewsFeed::addFeedItemChannelNew(RsFeedItem &fi)
#endif #endif
} }
//void NewsFeed::addFeedItemChannelUpdate(RsFeedItem &fi) //void NewsFeed::addFeedItemChannelUpdate(const RsFeedItem &fi)
//{ //{
// /* make new widget */ // /* make new widget */
// ChanNewItem *cni = new ChanNewItem(this, NEWSFEED_CHANNEWLIST, fi.mId1, false, false); // ChanNewItem *cni = new ChanNewItem(this, NEWSFEED_CHANNEWLIST, fi.mId1, false, false);
@ -655,7 +688,7 @@ void NewsFeed::addFeedItemChannelNew(RsFeedItem &fi)
//#endif //#endif
//} //}
void NewsFeed::addFeedItemChannelMsg(RsFeedItem &fi) void NewsFeed::addFeedItemChannelMsg(const RsFeedItem &fi)
{ {
RsGxsGroupId grpId(fi.mId1); RsGxsGroupId grpId(fi.mId1);
RsGxsMessageId msgId(fi.mId2); RsGxsMessageId msgId(fi.mId2);
@ -676,7 +709,7 @@ void NewsFeed::addFeedItemChannelMsg(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemForumNew(RsFeedItem &fi) void NewsFeed::addFeedItemForumNew(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
// ForumNewItem *fni = new ForumNewItem(this, NEWSFEED_FORUMNEWLIST, fi.mId1, false, true); // ForumNewItem *fni = new ForumNewItem(this, NEWSFEED_FORUMNEWLIST, fi.mId1, false, true);
@ -690,7 +723,7 @@ void NewsFeed::addFeedItemForumNew(RsFeedItem &fi)
#endif #endif
} }
//void NewsFeed::addFeedItemForumUpdate(RsFeedItem &fi) //void NewsFeed::addFeedItemForumUpdate(const RsFeedItem &fi)
//{ //{
// /* make new widget */ // /* make new widget */
// ForumNewItem *fni = new ForumNewItem(this, NEWSFEED_FORUMNEWLIST, fi.mId1, false, false); // ForumNewItem *fni = new ForumNewItem(this, NEWSFEED_FORUMNEWLIST, fi.mId1, false, false);
@ -704,7 +737,7 @@ void NewsFeed::addFeedItemForumNew(RsFeedItem &fi)
//#endif //#endif
//} //}
void NewsFeed::addFeedItemForumMsg(RsFeedItem &fi) void NewsFeed::addFeedItemForumMsg(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
// ForumMsgItem *fm = new ForumMsgItem(this, NEWSFEED_FORUMMSGLIST, fi.mId1, fi.mId2, false); // ForumMsgItem *fm = new ForumMsgItem(this, NEWSFEED_FORUMMSGLIST, fi.mId1, fi.mId2, false);
@ -719,7 +752,7 @@ void NewsFeed::addFeedItemForumMsg(RsFeedItem &fi)
} }
#if 0 #if 0
void NewsFeed::addFeedItemBlogNew(RsFeedItem &fi) void NewsFeed::addFeedItemBlogNew(const RsFeedItem &fi)
{ {
#ifdef BLOGS #ifdef BLOGS
/* make new widget */ /* make new widget */
@ -737,7 +770,7 @@ void NewsFeed::addFeedItemBlogNew(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemBlogMsg(RsFeedItem &fi) void NewsFeed::addFeedItemBlogMsg(const RsFeedItem &fi)
{ {
#ifdef BLOGS #ifdef BLOGS
/* make new widget */ /* make new widget */
@ -757,7 +790,7 @@ void NewsFeed::addFeedItemBlogMsg(RsFeedItem &fi)
#endif #endif
void NewsFeed::addFeedItemChatNew(RsFeedItem &fi, bool addWithoutCheck) void NewsFeed::addFeedItemChatNew(const RsFeedItem &fi, bool addWithoutCheck)
{ {
#ifdef NEWS_DEBUG #ifdef NEWS_DEBUG
std::cerr << "NewsFeed::addFeedItemChatNew()"; std::cerr << "NewsFeed::addFeedItemChatNew()";
@ -776,7 +809,7 @@ void NewsFeed::addFeedItemChatNew(RsFeedItem &fi, bool addWithoutCheck)
addFeedItem(cm); addFeedItem(cm);
} }
void NewsFeed::addFeedItemMessage(RsFeedItem &fi) void NewsFeed::addFeedItemMessage(const RsFeedItem &fi)
{ {
/* make new widget */ /* make new widget */
MsgItem *mi = new MsgItem(this, NEWSFEED_MESSAGELIST, fi.mId1, false); MsgItem *mi = new MsgItem(this, NEWSFEED_MESSAGELIST, fi.mId1, false);
@ -790,7 +823,7 @@ void NewsFeed::addFeedItemMessage(RsFeedItem &fi)
#endif #endif
} }
void NewsFeed::addFeedItemFilesNew(RsFeedItem &/*fi*/) void NewsFeed::addFeedItemFilesNew(const RsFeedItem &/*fi*/)
{ {
#ifdef NEWS_DEBUG #ifdef NEWS_DEBUG
std::cerr << "NewsFeed::addFeedItemFilesNew()"; std::cerr << "NewsFeed::addFeedItemFilesNew()";
@ -801,7 +834,7 @@ void NewsFeed::addFeedItemFilesNew(RsFeedItem &/*fi*/)
/* FeedHolder Functions (for FeedItem functionality) */ /* FeedHolder Functions (for FeedItem functionality) */
QScrollArea *NewsFeed::getScrollArea() QScrollArea *NewsFeed::getScrollArea()
{ {
return scrollArea; return NULL;
} }
void NewsFeed::deleteFeedItem(QWidget *item, uint32_t /*type*/) void NewsFeed::deleteFeedItem(QWidget *item, uint32_t /*type*/)
@ -832,36 +865,18 @@ void NewsFeed::openComments(uint32_t /*type*/, const RsGxsGroupId &/*groupId*/,
std::cerr << std::endl; std::cerr << std::endl;
} }
void NewsFeed::itemDestroyed(QObject *item) static void sendNewsFeedChangedCallback(FeedItem *feedItem, void *data)
{ {
widgets.remove(item); if (dynamic_cast<PeerItem*>(feedItem) == NULL) {
sendNewsFeedChanged(); /* don't count PeerItem's */
} ++(*((int*) data));
void NewsFeed::removeAll()
{
#ifdef NEWS_DEBUG
std::cerr << "NewsFeed::removeAll()" << std::endl;
#endif
foreach (QObject *item, widgets) {
if (item) {
item->deleteLater();
}
} }
widgets.clear();
} }
void NewsFeed::sendNewsFeedChanged() void NewsFeed::sendNewsFeedChanged()
{ {
int count = 0; int count = 0;
ui->feedWidget->withAll(sendNewsFeedChangedCallback, &count);
foreach (QObject *item, widgets) {
if (dynamic_cast<PeerItem*>(item) == NULL) {
/* don't count PeerItem's */
count++;
}
}
emit newsFeedChanged(count); emit newsFeedChanged(count);
} }

View file

@ -23,18 +23,21 @@
#define _NEWS_FEED_DIALOG_H #define _NEWS_FEED_DIALOG_H
#include "mainpage.h" #include "mainpage.h"
#include "ui_NewsFeed.h"
#include "gui/feeds/FeedHolder.h" #include "gui/feeds/FeedHolder.h"
#include <retroshare-gui/RsAutoUpdatePage.h> #include <retroshare-gui/RsAutoUpdatePage.h>
#define IMAGE_NEWSFEED ":/images/newsfeed/news-feed-32.png" #define IMAGE_NEWSFEED ":/images/newsfeed/news-feed-32.png"
namespace Ui {
class NewsFeed;
}
class RsFeedItem; class RsFeedItem;
class FeedNotify; class FeedNotify;
class FeedItem;
class NewsFeed : public RsAutoUpdatePage, public FeedHolder, private Ui::NewsFeed class NewsFeed : public RsAutoUpdatePage, public FeedHolder
{ {
Q_OBJECT Q_OBJECT
@ -67,42 +70,42 @@ signals:
private slots: private slots:
// void toggleChanMsgItems(bool on); // void toggleChanMsgItems(bool on);
void feedoptions(); void feedoptions();
void settingsChanged();
void removeAll();
void itemDestroyed(QObject*);
private:
void addFeedItem(QWidget *item);
void addFeedItemIfUnique(QWidget *item, int itemType, const RsPeerId &sslId, bool replace);
void addFeedItemPeerConnect(RsFeedItem &fi);
void addFeedItemPeerDisconnect(RsFeedItem &fi);
void addFeedItemPeerNew(RsFeedItem &fi);
void addFeedItemPeerHello(RsFeedItem &fi);
void addFeedItemSecurityConnectAttempt(RsFeedItem &fi);
void addFeedItemSecurityAuthDenied(RsFeedItem &fi);
void addFeedItemSecurityUnknownIn(RsFeedItem &fi);
void addFeedItemSecurityUnknownOut(RsFeedItem &fi);
void addFeedItemChannelNew(RsFeedItem &fi);
// void addFeedItemChannelUpdate(RsFeedItem &fi);
void addFeedItemChannelMsg(RsFeedItem &fi);
void addFeedItemForumNew(RsFeedItem &fi);
// void addFeedItemForumUpdate(RsFeedItem &fi);
void addFeedItemForumMsg(RsFeedItem &fi);
#if 0
void addFeedItemBlogNew(RsFeedItem &fi);
void addFeedItemBlogMsg(RsFeedItem &fi);
#endif
void addFeedItemChatNew(RsFeedItem &fi, bool addWithoutCheck);
void addFeedItemMessage(RsFeedItem &fi);
void addFeedItemFilesNew(RsFeedItem &fi);
void sendNewsFeedChanged(); void sendNewsFeedChanged();
std::list<QObject*> widgets; private:
void addFeedItem(FeedItem *item);
void addFeedItemIfUnique(FeedItem *item, int itemType, const RsPeerId &sslId, bool replace);
void addFeedItemPeerConnect(const RsFeedItem &fi);
void addFeedItemPeerDisconnect(const RsFeedItem &fi);
void addFeedItemPeerNew(const RsFeedItem &fi);
void addFeedItemPeerHello(const RsFeedItem &fi);
void addFeedItemSecurityConnectAttempt(const RsFeedItem &fi);
void addFeedItemSecurityAuthDenied(const RsFeedItem &fi);
void addFeedItemSecurityUnknownIn(const RsFeedItem &fi);
void addFeedItemSecurityUnknownOut(const RsFeedItem &fi);
void addFeedItemChannelNew(const RsFeedItem &fi);
// void addFeedItemChannelUpdate(const RsFeedItem &fi);
void addFeedItemChannelMsg(const RsFeedItem &fi);
void addFeedItemForumNew(const RsFeedItem &fi);
// void addFeedItemForumUpdate(const RsFeedItem &fi);
void addFeedItemForumMsg(const RsFeedItem &fi);
#if 0
void addFeedItemBlogNew(const RsFeedItem &fi);
void addFeedItemBlogMsg(const RsFeedItem &fi);
#endif
void addFeedItemChatNew(const RsFeedItem &fi, bool addWithoutCheck);
void addFeedItemMessage(const RsFeedItem &fi);
void addFeedItemFilesNew(const RsFeedItem &fi);
private:
/* UI - from Designer */
Ui::NewsFeed *ui;
}; };
#endif #endif

View file

@ -113,38 +113,25 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QScrollArea" name="scrollArea"> <widget class="RSFeedWidget" name="feedWidget" native="true">
<property name="widgetResizable"> <property name="sizePolicy">
<bool>true</bool> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property> </property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>551</width>
<height>16</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="itemsLayout">
<property name="spacing">
<number>3</number>
</property>
<property name="margin">
<number>3</number>
</property>
</layout>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
<customwidgets>
<customwidget>
<class>RSFeedWidget</class>
<extends>QWidget</extends>
<header>gui/common/RSFeedWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources> <resources>
<include location="images.qrc"/> <include location="images.qrc"/>
</resources> </resources>

View file

@ -44,12 +44,12 @@ void FeedNotify::setNotifyEnabled(bool /*enabled*/)
{ {
} }
QWidget *FeedNotify::feedItem(FeedHolder */*parent*/) FeedItem *FeedNotify::feedItem(FeedHolder */*parent*/)
{ {
return NULL; return NULL;
} }
QWidget *FeedNotify::testFeedItem(FeedHolder */*parent*/) FeedItem *FeedNotify::testFeedItem(FeedHolder */*parent*/)
{ {
return NULL; return NULL;
} }

View file

@ -25,6 +25,7 @@
#include <QObject> #include <QObject>
class FeedHolder; class FeedHolder;
class FeedItem;
class FeedNotify : public QObject class FeedNotify : public QObject
{ {
@ -37,8 +38,8 @@ public:
virtual bool hasSetting(QString &/*name*/); virtual bool hasSetting(QString &/*name*/);
virtual bool notifyEnabled(); virtual bool notifyEnabled();
virtual void setNotifyEnabled(bool /*enabled*/); virtual void setNotifyEnabled(bool /*enabled*/);
virtual QWidget *feedItem(FeedHolder */*parent*/); virtual FeedItem *feedItem(FeedHolder */*parent*/);
virtual QWidget *testFeedItem(FeedHolder */*parent*/); virtual FeedItem *testFeedItem(FeedHolder */*parent*/);
}; };
#endif // FEEDNOTIFY_H #endif // FEEDNOTIFY_H

View file

@ -45,6 +45,9 @@ RSFeedWidget::RSFeedWidget(QWidget *parent)
/* Remove */ /* Remove */
mEnableRemove = false; mEnableRemove = false;
/* Options */
mCountChangedDisabled = 0;
ui->treeWidget->installEventFilter(this); ui->treeWidget->installEventFilter(this);
} }
@ -85,6 +88,10 @@ bool RSFeedWidget::eventFilter(QObject *object, QEvent *event)
delete(treeItem); delete(treeItem);
} }
if (!mCountChangedDisabled) {
emit feedCountChanged();
}
return true; // eat event return true; // eat event
} }
} }
@ -128,6 +135,10 @@ void RSFeedWidget::addFeedItem(FeedItem *feedItem, Qt::ItemDataRole sortRole, co
connectSignals(feedItem); connectSignals(feedItem);
filterItem(treeItem, feedItem); filterItem(treeItem, feedItem);
if (!mCountChangedDisabled) {
emit feedCountChanged();
}
} }
void RSFeedWidget::addFeedItem(FeedItem *feedItem, const QMap<Qt::ItemDataRole, QVariant> &sort) void RSFeedWidget::addFeedItem(FeedItem *feedItem, const QMap<Qt::ItemDataRole, QVariant> &sort)
@ -149,6 +160,10 @@ void RSFeedWidget::addFeedItem(FeedItem *feedItem, const QMap<Qt::ItemDataRole,
connectSignals(feedItem); connectSignals(feedItem);
filterItem(treeItem, feedItem); filterItem(treeItem, feedItem);
if (!mCountChangedDisabled) {
emit feedCountChanged();
}
} }
void RSFeedWidget::setSort(FeedItem *feedItem, Qt::ItemDataRole sortRole, const QVariant &value) void RSFeedWidget::setSort(FeedItem *feedItem, Qt::ItemDataRole sortRole, const QVariant &value)
@ -184,7 +199,24 @@ void RSFeedWidget::setSort(FeedItem *feedItem, const QMap<Qt::ItemDataRole, QVar
void RSFeedWidget::clear() void RSFeedWidget::clear()
{ {
/* Disconnect signals */
QTreeWidgetItemIterator it(ui->treeWidget);
QTreeWidgetItem *treeItem;
while ((treeItem = *it) != NULL) {
++it;
FeedItem *feedItem = feedItemFromTreeItem(treeItem);
if (feedItem) {
disconnectSignals(feedItem);
}
}
/* Clear items */
ui->treeWidget->clear(); ui->treeWidget->clear();
if (!mCountChangedDisabled) {
emit feedCountChanged();
}
} }
void RSFeedWidget::setSortRole(Qt::ItemDataRole role, Qt::SortOrder order) void RSFeedWidget::setSortRole(Qt::ItemDataRole role, Qt::SortOrder order)
@ -260,11 +292,39 @@ void RSFeedWidget::enableRemove(bool enable)
mEnableRemove = enable; mEnableRemove = enable;
} }
void RSFeedWidget::enableCountChangedSignal(bool enable)
{
if (enable) {
--mCountChangedDisabled;
if (mCountChangedDisabled < 0) {
std::cerr << "RSFeedWidget::enableCountChangedSignal error disable count change signal" << std::endl;
mCountChangedDisabled = 0;
}
} else {
++mCountChangedDisabled;
}
}
void RSFeedWidget::setSelectionMode(QAbstractItemView::SelectionMode mode) void RSFeedWidget::setSelectionMode(QAbstractItemView::SelectionMode mode)
{ {
ui->treeWidget->setSelectionMode(mode); ui->treeWidget->setSelectionMode(mode);
} }
int RSFeedWidget::feedItemCount()
{
return ui->treeWidget->topLevelItemCount();
}
FeedItem *RSFeedWidget::feedItem(int index)
{
QTreeWidgetItem *treeItem = ui->treeWidget->topLevelItem(index);
if (!treeItem) {
return NULL;
}
return feedItemFromTreeItem(treeItem);
}
void RSFeedWidget::removeFeedItem(FeedItem *feedItem) void RSFeedWidget::removeFeedItem(FeedItem *feedItem)
{ {
if (!feedItem) { if (!feedItem) {
@ -277,6 +337,10 @@ void RSFeedWidget::removeFeedItem(FeedItem *feedItem)
if (treeItem) { if (treeItem) {
delete(treeItem); delete(treeItem);
} }
if (!mCountChangedDisabled) {
emit feedCountChanged();
}
} }
void RSFeedWidget::feedItemSizeChanged(FeedItem */*feedItem*/) void RSFeedWidget::feedItemSizeChanged(FeedItem */*feedItem*/)
@ -300,6 +364,10 @@ void RSFeedWidget::feedItemDestroyed(FeedItem *feedItem)
if (treeItem) { if (treeItem) {
delete(treeItem); delete(treeItem);
} }
if (!mCountChangedDisabled) {
emit feedCountChanged();
}
} }
QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(FeedItem *feedItem) QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(FeedItem *feedItem)
@ -333,15 +401,7 @@ bool RSFeedWidget::scrollTo(FeedItem *feedItem, bool focus)
return true; return true;
} }
class RSFeedWidgetCallback void RSFeedWidget::withAll(RSFeedWidgetCallbackFunction callback, void *data)
{
public:
RSFeedWidgetCallback() {}
virtual void callback(FeedItem *feedItem, const QVariant &data) = 0;
};
void RSFeedWidget::withAll(RSFeedWidgetCallbackFunction callback, const QVariant &data)
{ {
if (!callback) { if (!callback) {
return; return;
@ -361,7 +421,7 @@ void RSFeedWidget::withAll(RSFeedWidgetCallbackFunction callback, const QVariant
} }
} }
FeedItem *RSFeedWidget::findFeedItem(RSFeedWidgetFindCallbackFunction callback, const QVariant &data1, const QVariant &data2) FeedItem *RSFeedWidget::findFeedItem(RSFeedWidgetFindCallbackFunction callback, void *data)
{ {
if (!callback) { if (!callback) {
return NULL; return NULL;
@ -377,7 +437,7 @@ FeedItem *RSFeedWidget::findFeedItem(RSFeedWidgetFindCallbackFunction callback,
continue; continue;
} }
if (callback(feedItem, data1, data2)) { if (callback(feedItem, data)) {
return feedItem; return feedItem;
} }
} }
@ -397,9 +457,18 @@ void RSFeedWidget::selectedFeedItems(QList<FeedItem*> &feedItems)
} }
} }
static bool findGxsFeedItemCallback(FeedItem *feedItem, const QVariant &data1, const QVariant &data2) struct FindGxsFeedItemData
{ {
if (!data1.canConvert<RsGxsGroupId>() || !data2.canConvert<RsGxsMessageId>()) { FindGxsFeedItemData(const RsGxsGroupId &groupId, const RsGxsMessageId &messageId) : mGroupId(groupId), mMessageId(messageId) {}
const RsGxsGroupId &mGroupId;
const RsGxsMessageId &mMessageId;
};
static bool findGxsFeedItemCallback(FeedItem *feedItem, void *data)
{
FindGxsFeedItemData *findData = (FindGxsFeedItemData*) data;
if (!findData || findData->mGroupId.isNull() || findData->mMessageId.isNull()) {
return false; return false;
} }
@ -408,8 +477,8 @@ static bool findGxsFeedItemCallback(FeedItem *feedItem, const QVariant &data1, c
return false; return false;
} }
if (item->groupId() != data1.value<RsGxsGroupId>() || if (item->groupId() != findData->mGroupId ||
item->messageId() != data2.value<RsGxsMessageId>()) { item->messageId() != findData->mMessageId) {
return false; return false;
} }
@ -418,6 +487,7 @@ static bool findGxsFeedItemCallback(FeedItem *feedItem, const QVariant &data1, c
GxsFeedItem *RSFeedWidget::findGxsFeedItem(const RsGxsGroupId &groupId, const RsGxsMessageId &messageId) GxsFeedItem *RSFeedWidget::findGxsFeedItem(const RsGxsGroupId &groupId, const RsGxsMessageId &messageId)
{ {
FeedItem *feedItem = findFeedItem(findGxsFeedItemCallback, qVariantFromValue(groupId), qVariantFromValue(messageId)); FindGxsFeedItemData data(groupId, messageId);
FeedItem *feedItem = findFeedItem(findGxsFeedItemCallback, &data);
return dynamic_cast<GxsFeedItem*>(feedItem); return dynamic_cast<GxsFeedItem*>(feedItem);
} }

View file

@ -39,8 +39,8 @@ namespace Ui {
class RSFeedWidget; class RSFeedWidget;
} }
typedef void (*RSFeedWidgetCallbackFunction)(FeedItem *feedItem, const QVariant &data); typedef void (*RSFeedWidgetCallbackFunction)(FeedItem *feedItem, void *data);
typedef bool (*RSFeedWidgetFindCallbackFunction)(FeedItem *feedItem, const QVariant &data1, const QVariant &data2); typedef bool (*RSFeedWidgetFindCallbackFunction)(FeedItem *feedItem, void *data);
typedef bool (*RSFeedWidgetFilterCallbackFunction)(FeedItem *feedItem, const QString &text, int filter); typedef bool (*RSFeedWidgetFilterCallbackFunction)(FeedItem *feedItem, const QString &text, int filter);
class RSFeedWidget : public QWidget class RSFeedWidget : public QWidget
@ -57,27 +57,33 @@ public:
void setSort(FeedItem *feedItem, Qt::ItemDataRole sortRole, const QVariant &value); void setSort(FeedItem *feedItem, Qt::ItemDataRole sortRole, const QVariant &value);
void setSort(FeedItem *feedItem, const QMap<Qt::ItemDataRole, QVariant> &sort); void setSort(FeedItem *feedItem, const QMap<Qt::ItemDataRole, QVariant> &sort);
int feedItemCount();
FeedItem *feedItem(int index);
void removeFeedItem(FeedItem *feedItem); void removeFeedItem(FeedItem *feedItem);
void clear();
void setSortRole(Qt::ItemDataRole role, Qt::SortOrder order); void setSortRole(Qt::ItemDataRole role, Qt::SortOrder order);
void setSortingEnabled(bool enable); void setSortingEnabled(bool enable);
void setFilterCallback(RSFeedWidgetFilterCallbackFunction callback); void setFilterCallback(RSFeedWidgetFilterCallbackFunction callback);
void enableRemove(bool enable); void enableRemove(bool enable);
void enableCountChangedSignal(bool enable);
void setSelectionMode(QAbstractItemView::SelectionMode mode); void setSelectionMode(QAbstractItemView::SelectionMode mode);
bool scrollTo(FeedItem *feedItem, bool focus); bool scrollTo(FeedItem *feedItem, bool focus);
void withAll(RSFeedWidgetCallbackFunction callback, const QVariant &data); void withAll(RSFeedWidgetCallbackFunction callback, void *data);
FeedItem *findFeedItem(RSFeedWidgetFindCallbackFunction callback, const QVariant &data1, const QVariant &data2); FeedItem *findFeedItem(RSFeedWidgetFindCallbackFunction callback, void *data);
void selectedFeedItems(QList<FeedItem*> &feedItems); void selectedFeedItems(QList<FeedItem*> &feedItems);
/* Convenience functions */ /* Convenience functions */
GxsFeedItem *findGxsFeedItem(const RsGxsGroupId &groupId, const RsGxsMessageId &messageId); GxsFeedItem *findGxsFeedItem(const RsGxsGroupId &groupId, const RsGxsMessageId &messageId);
signals:
void feedCountChanged();
public slots: public slots:
void clear();
void setFilter(const QString &text, int type); void setFilter(const QString &text, int type);
void setFilterText(const QString &text); void setFilterText(const QString &text);
void setFilterType(int type); void setFilterType(int type);
@ -109,6 +115,9 @@ private:
/* Remove */ /* Remove */
bool mEnableRemove; bool mEnableRemove;
/* Options */
int mCountChangedDisabled;
Ui::RSFeedWidget *ui; Ui::RSFeedWidget *ui;
}; };

View file

@ -41,8 +41,8 @@
****/ ****/
/** Constructor */ /** Constructor */
ChatMsgItem::ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, const std::string &message) ChatMsgItem::ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, const std::string &message) :
:QWidget(NULL), mParent(parent), mFeedId(feedId), mPeerId(peerId) FeedItem(NULL), mParent(parent), mFeedId(feedId), mPeerId(peerId)
{ {
/* Invoke the Qt Designer generated object setup routine */ /* Invoke the Qt Designer generated object setup routine */
setupUi(this); setupUi(this);
@ -224,16 +224,18 @@ void ChatMsgItem::togglequickmessage()
if (messageFrame->isHidden()) if (messageFrame->isHidden())
{ {
messageFrame->setVisible(true); messageFrame->show();
sendButton->show(); sendButton->show();
cancelButton->show(); cancelButton->show();
} }
else else
{ {
messageFrame->setVisible(false); messageFrame->hide();
sendButton->hide(); sendButton->hide();
cancelButton->hide(); cancelButton->hide();
} }
emit sizeChanged(this);
mParent->lockLayout(this, false); mParent->lockLayout(this, false);
} }
@ -253,6 +255,8 @@ void ChatMsgItem::sendMessage()
messageFrame->setVisible(false); messageFrame->setVisible(false);
sendButton->hide(); sendButton->hide();
cancelButton->hide(); cancelButton->hide();
emit sizeChanged(this);
} }
void ChatMsgItem::on_quickmsgText_textChanged() void ChatMsgItem::on_quickmsgText_textChanged()

View file

@ -23,20 +23,24 @@
#define _CHATMSG_ITEM_DIALOG_H #define _CHATMSG_ITEM_DIALOG_H
#include "ui_ChatMsgItem.h" #include "ui_ChatMsgItem.h"
#include "FeedItem.h"
#include <stdint.h> #include <stdint.h>
class FeedHolder; class FeedHolder;
class ChatMsgItem : public QWidget, private Ui::ChatMsgItem class ChatMsgItem : public FeedItem, private Ui::ChatMsgItem
{ {
Q_OBJECT Q_OBJECT
public: public:
/** Default Constructor */ /** Default Constructor */
ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, const std::string &message); ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, const std::string &message);
void updateItemStatic(); void updateItemStatic();
/* FeedItem */
virtual void expand(bool /*open*/) {}
private slots: private slots:
/* default stuff */ /* default stuff */
void gotoHome(); void gotoHome();
@ -58,7 +62,7 @@ private:
FeedHolder *mParent; FeedHolder *mParent;
uint32_t mFeedId; uint32_t mFeedId;
RsPeerId mPeerId; RsPeerId mPeerId;
}; };
#endif #endif

View file

@ -11,8 +11,17 @@
</rect> </rect>
</property> </property>
<layout class="QGridLayout" name="gridLayout_1"> <layout class="QGridLayout" name="gridLayout_1">
<property name="margin"> <property name="leftMargin">
<number>0</number> <number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QFrame" name="frame"> <widget class="QFrame" name="frame">
@ -204,32 +213,22 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="5"> <item row="3" column="0" colspan="5">
<widget class="QFrame" name="frame_2"> <widget class="QFrame" name="buttonFrame">
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="margin"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
<item row="0" column="0" colspan="6"> <property name="topMargin">
<widget class="QFrame" name="messageFrame"> <number>0</number>
<layout class="QGridLayout" name="gridLayout_3"> </property>
<property name="margin"> <property name="rightMargin">
<number>0</number> <number>0</number>
</property> </property>
<item row="0" column="0" colspan="2"> <property name="bottomMargin">
<widget class="QTextEdit" name="quickmsgText"> <number>0</number>
<property name="maximumSize"> </property>
<size> <item>
<width>16777215</width>
<height>115</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QToolButton" name="quickmsgButton"> <widget class="QToolButton" name="quickmsgButton">
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::NoFocus</enum> <enum>Qt::NoFocus</enum>
@ -252,7 +251,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item>
<widget class="QToolButton" name="msgButton"> <widget class="QToolButton" name="msgButton">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -281,7 +280,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item>
<widget class="QToolButton" name="chatButton"> <widget class="QToolButton" name="chatButton">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -313,7 +312,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="3"> <item>
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -326,7 +325,17 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="5"> <item>
<widget class="QPushButton" name="cancelButton">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="sendButton"> <widget class="QPushButton" name="sendButton">
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::NoFocus</enum> <enum>Qt::NoFocus</enum>
@ -339,13 +348,31 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="4"> </layout>
<widget class="QPushButton" name="cancelButton"> </widget>
<property name="focusPolicy"> </item>
<enum>Qt::NoFocus</enum> <item row="2" column="0" colspan="5">
</property> <widget class="QFrame" name="messageFrame">
<property name="text"> <layout class="QGridLayout" name="gridLayout_3">
<string>Cancel</string> <property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="QTextEdit" name="quickmsgText">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>115</height>
</size>
</property> </property>
</widget> </widget>
</item> </item>

View file

@ -39,8 +39,8 @@
****/ ****/
/** Constructor */ /** Constructor */
MsgItem::MsgItem(FeedHolder *parent, uint32_t feedId, const std::string &msgId, bool isHome) MsgItem::MsgItem(FeedHolder *parent, uint32_t feedId, const std::string &msgId, bool isHome) :
:QWidget(NULL), mParent(parent), mFeedId(feedId), mMsgId(msgId), mIsHome(isHome) FeedItem(NULL), mParent(parent), mFeedId(feedId), mMsgId(msgId), mIsHome(isHome)
{ {
/* Invoke the Qt Designer generated object setup routine */ /* Invoke the Qt Designer generated object setup routine */
setupUi(this); setupUi(this);
@ -194,24 +194,34 @@ void MsgItem::updateItem()
void MsgItem::toggle() void MsgItem::toggle()
{ {
mParent->lockLayout(this, true); expand(expandFrame->isHidden());
}
if (expandFrame->isHidden()) void MsgItem::expand(bool open)
{
if (mParent) {
mParent->lockLayout(this, true);
}
if (open)
{ {
expandFrame->show(); expandFrame->show();
expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png"))); expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png")));
expandButton->setToolTip(tr("Hide")); expandButton->setToolTip(tr("Hide"));
} }
else else
{ {
expandFrame->hide(); expandFrame->hide();
expandButton->setIcon(QIcon(QString(":/images/edit_add24.png"))); expandButton->setIcon(QIcon(QString(":/images/edit_add24.png")));
expandButton->setToolTip(tr("Expand")); expandButton->setToolTip(tr("Expand"));
} }
mParent->lockLayout(this, false); emit sizeChanged(this);
}
if (mParent) {
mParent->lockLayout(this, false);
}
}
void MsgItem::removeItem() void MsgItem::removeItem()
{ {

View file

@ -23,12 +23,13 @@
#define _MSG_ITEM_DIALOG_H #define _MSG_ITEM_DIALOG_H
#include "ui_MsgItem.h" #include "ui_MsgItem.h"
#include "FeedItem.h"
#include <stdint.h> #include <stdint.h>
class FeedHolder; class FeedHolder;
class SubFileItem; class SubFileItem;
class MsgItem : public QWidget, private Ui::MsgItem class MsgItem : public FeedItem, private Ui::MsgItem
{ {
Q_OBJECT Q_OBJECT
@ -38,6 +39,9 @@ public:
void updateItemStatic(); void updateItemStatic();
/* FeedItem */
virtual void expand(bool open);
private slots: private slots:
/* default stuff */ /* default stuff */
void gotoHome(); void gotoHome();

View file

@ -11,8 +11,17 @@
</rect> </rect>
</property> </property>
<layout class="QGridLayout"> <layout class="QGridLayout">
<property name="margin"> <property name="leftMargin">
<number>0</number> <number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QFrame" name="frame"> <widget class="QFrame" name="frame">

View file

@ -40,9 +40,9 @@
****/ ****/
/** Constructor */ /** Constructor */
PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, uint32_t type, bool isHome) PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, uint32_t type, bool isHome) :
:QWidget(NULL), mParent(parent), mFeedId(feedId), FeedItem(NULL), mParent(parent), mFeedId(feedId),
mPeerId(peerId), mType(type), mIsHome(isHome) mPeerId(peerId), mType(type), mIsHome(isHome)
{ {
/* Invoke the Qt Designer generated object setup routine */ /* Invoke the Qt Designer generated object setup routine */
setupUi(this); setupUi(this);
@ -209,9 +209,16 @@ void PeerItem::updateItem()
void PeerItem::toggle() void PeerItem::toggle()
{ {
mParent->lockLayout(this, true); expand(expandFrame->isHidden());
}
if (expandFrame->isHidden()) void PeerItem::expand(bool open)
{
if (mParent) {
mParent->lockLayout(this, true);
}
if (open)
{ {
expandFrame->show(); expandFrame->show();
expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png"))); expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png")));
@ -224,9 +231,12 @@ void PeerItem::toggle()
expandButton->setToolTip(tr("Expand")); expandButton->setToolTip(tr("Expand"));
} }
mParent->lockLayout(this, false); emit sizeChanged(this);
}
if (mParent) {
mParent->lockLayout(this, false);
}
}
void PeerItem::removeItem() void PeerItem::removeItem()
{ {

View file

@ -23,6 +23,7 @@
#define _PEER_ITEM_DIALOG_H #define _PEER_ITEM_DIALOG_H
#include "ui_PeerItem.h" #include "ui_PeerItem.h"
#include "FeedItem.h"
#include <stdint.h> #include <stdint.h>
const uint32_t PEER_TYPE_STD = 0x0001; const uint32_t PEER_TYPE_STD = 0x0001;
@ -32,16 +33,19 @@ const uint32_t PEER_TYPE_NEW_FOF = 0x0004; /* new Friend of Friend */
class FeedHolder; class FeedHolder;
class PeerItem : public QWidget, private Ui::PeerItem class PeerItem : public FeedItem, private Ui::PeerItem
{ {
Q_OBJECT Q_OBJECT
public: public:
/** Default Constructor */ /** Default Constructor */
PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, uint32_t type, bool isHome); PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, uint32_t type, bool isHome);
void updateItemStatic(); void updateItemStatic();
/* FeedItem */
virtual void expand(bool open);
private slots: private slots:
/* default stuff */ /* default stuff */
void removeItem(); void removeItem();

View file

@ -11,8 +11,17 @@
</rect> </rect>
</property> </property>
<layout class="QGridLayout"> <layout class="QGridLayout">
<property name="margin"> <property name="leftMargin">
<number>0</number> <number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QFrame" name="frame"> <widget class="QFrame" name="frame">

View file

@ -43,43 +43,42 @@
****/ ****/
/** Constructor */ /** Constructor */
SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &gpgId, const RsPeerId &sslId, const std::string &sslCn, const std::string& ip_address,uint32_t type, bool isHome) SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &gpgId, const RsPeerId &sslId, const std::string &sslCn, const std::string& ip_address,uint32_t type, bool isHome) :
:QWidget(NULL), mParent(parent), mFeedId(feedId), FeedItem(NULL), mParent(parent), mFeedId(feedId),
mGpgId(gpgId), mSslId(sslId), mSslCn(sslCn), mIP(ip_address), mType(type), mIsHome(isHome) mGpgId(gpgId), mSslId(sslId), mSslCn(sslCn), mIP(ip_address), mType(type), mIsHome(isHome)
{ {
/* Invoke the Qt Designer generated object setup routine */ /* Invoke the Qt Designer generated object setup routine */
setupUi(this); setupUi(this);
quickmsgButton->hide();
chatButton->hide();
removeFriendButton->setEnabled(false);
removeFriendButton->hide();
peerDetailsButton->setEnabled(false);
friendRequesttoolButton->hide();
requestLabel->hide();
/* general ones */ quickmsgButton->hide();
connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) ); chatButton->hide();
connect( clearButton, SIGNAL( clicked( void ) ), this, SLOT( removeItem ( void ) ) ); removeFriendButton->setEnabled(false);
removeFriendButton->hide();
peerDetailsButton->setEnabled(false);
friendRequesttoolButton->hide();
requestLabel->hide();
/* specific ones */ /* general ones */
connect( chatButton, SIGNAL( clicked( void ) ), this, SLOT( openChat ( void ) ) ); connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) );
connect( clearButton, SIGNAL( clicked( void ) ), this, SLOT( removeItem ( void ) ) );
connect( quickmsgButton, SIGNAL( clicked( ) ), this, SLOT( sendMsg() ) ); /* specific ones */
connect( chatButton, SIGNAL( clicked( void ) ), this, SLOT( openChat ( void ) ) );
connect( removeFriendButton, SIGNAL(clicked()), this, SLOT(removeFriend())); connect( quickmsgButton, SIGNAL( clicked( ) ), this, SLOT( sendMsg() ) );
connect( peerDetailsButton, SIGNAL(clicked()), this, SLOT(peerDetails()));
connect( friendRequesttoolButton, SIGNAL(clicked()), this, SLOT(friendRequest()));
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem())); connect( removeFriendButton, SIGNAL(clicked()), this, SLOT(removeFriend()));
connect( peerDetailsButton, SIGNAL(clicked()), this, SLOT(peerDetails()));
connect( friendRequesttoolButton, SIGNAL(clicked()), this, SLOT(friendRequest()));
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem()));
avatar->setId(mSslId); avatar->setId(mSslId);
expandFrame->hide(); expandFrame->hide();
updateItemStatic(); updateItemStatic();
updateItem(); updateItem();
} }
@ -283,9 +282,16 @@ void SecurityItem::updateItem()
void SecurityItem::toggle() void SecurityItem::toggle()
{ {
mParent->lockLayout(this, true); expand(expandFrame->isHidden());
}
if (expandFrame->isHidden()) void SecurityItem::expand(bool open)
{
if (mParent) {
mParent->lockLayout(this, true);
}
if (open)
{ {
expandFrame->show(); expandFrame->show();
expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png"))); expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png")));
@ -298,7 +304,11 @@ void SecurityItem::toggle()
expandButton->setToolTip(tr("Expand")); expandButton->setToolTip(tr("Expand"));
} }
mParent->lockLayout(this, false); emit sizeChanged(this);
if (mParent) {
mParent->lockLayout(this, false);
}
} }
void SecurityItem::removeItem() void SecurityItem::removeItem()

View file

@ -23,6 +23,7 @@
#define _SECURITY_ITEM_DIALOG_H #define _SECURITY_ITEM_DIALOG_H
#include "ui_SecurityItem.h" #include "ui_SecurityItem.h"
#include "FeedItem.h"
#include <stdint.h> #include <stdint.h>
//const uint32_t SEC_TYPE_CONNECT_ATTEMPT = 0x0001; /* failed Connect Attempt */ //const uint32_t SEC_TYPE_CONNECT_ATTEMPT = 0x0001; /* failed Connect Attempt */
@ -32,17 +33,20 @@
class FeedHolder; class FeedHolder;
class SecurityItem : public QWidget, private Ui::SecurityItem class SecurityItem : public FeedItem, private Ui::SecurityItem
{ {
Q_OBJECT Q_OBJECT
public: public:
/** Default Constructor */ /** Default Constructor */
SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &gpgId, const RsPeerId &sslId, const std::string &sslCn, const std::string& ip_addr,uint32_t type, bool isHome); SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &gpgId, const RsPeerId &sslId, const std::string &sslCn, const std::string& ip_addr,uint32_t type, bool isHome);
void updateItemStatic(); void updateItemStatic();
bool isSame(const RsPeerId &sslId, uint32_t type); bool isSame(const RsPeerId &sslId, uint32_t type);
/* FeedItem */
virtual void expand(bool open);
private slots: private slots:
/* default stuff */ /* default stuff */
@ -57,14 +61,12 @@ private slots:
void updateItem(); void updateItem();
private: private:
FeedHolder *mParent; FeedHolder *mParent;
uint32_t mFeedId; uint32_t mFeedId;
RsPgpId mGpgId; RsPgpId mGpgId;
RsPeerId mSslId; RsPeerId mSslId;
std::string mSslCn; std::string mSslCn;
std::string mIP; std::string mIP;
uint32_t mType; uint32_t mType;

View file

@ -11,8 +11,17 @@
</rect> </rect>
</property> </property>
<layout class="QGridLayout"> <layout class="QGridLayout">
<property name="margin"> <property name="leftMargin">
<number>0</number> <number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QFrame" name="frame"> <widget class="QFrame" name="frame">

View file

@ -467,7 +467,7 @@ void GxsChannelPostsWidget::insertRelatedPosts(const uint32_t &token)
insertChannelPosts(posts, NULL, true); insertChannelPosts(posts, NULL, true);
} }
static void setAllMessagesReadCallback(FeedItem *feedItem, const QVariant &data) static void setAllMessagesReadCallback(FeedItem *feedItem, void *data)
{ {
GxsChannelPostItem *channelPostItem = dynamic_cast<GxsChannelPostItem*>(feedItem); GxsChannelPostItem *channelPostItem = dynamic_cast<GxsChannelPostItem*>(feedItem);
if (!channelPostItem) { if (!channelPostItem) {
@ -477,7 +477,7 @@ static void setAllMessagesReadCallback(FeedItem *feedItem, const QVariant &data)
RsGxsGrpMsgIdPair msgPair = std::make_pair(channelPostItem->groupId(), channelPostItem->messageId()); RsGxsGrpMsgIdPair msgPair = std::make_pair(channelPostItem->groupId(), channelPostItem->messageId());
uint32_t token; uint32_t token;
rsGxsChannels->setMessageReadStatus(token, msgPair, data.toBool()); rsGxsChannels->setMessageReadStatus(token, msgPair, *((bool*) data));
} }
void GxsChannelPostsWidget::setAllMessagesRead(bool read) void GxsChannelPostsWidget::setAllMessagesRead(bool read)
@ -486,5 +486,5 @@ void GxsChannelPostsWidget::setAllMessagesRead(bool read)
return; return;
} }
ui->feedWidget->withAll(setAllMessagesReadCallback, read); ui->feedWidget->withAll(setAllMessagesReadCallback, &read);
} }