Merge pull request #2147 from csoler/v0.6-BugFixing_2

Still bug fixing 0.6.6-RC1
This commit is contained in:
csoler 2020-12-09 22:58:13 +01:00 committed by GitHub
commit 906c1f03e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 100 additions and 184 deletions

View File

@ -240,6 +240,11 @@ enum class RsGxsCircleEventCode: uint8_t
* The circle has been deleted by auto-cleaning. * The circle has been deleted by auto-cleaning.
* */ * */
CIRCLE_DELETED = 0x07, CIRCLE_DELETED = 0x07,
/**
* Circle has been updated (name, parent circle, type, etc)
* */
CIRCLE_UPDATED = 0x08,
}; };
struct RsGxsCircleEvent: RsEvent struct RsGxsCircleEvent: RsEvent
@ -312,8 +317,7 @@ public:
* @param[out] details Storage for the circle details * @param[out] details Storage for the circle details
* @return false if something failed, true otherwhise * @return false if something failed, true otherwhise
*/ */
virtual bool getCircleDetails( virtual bool getCircleDetails(const RsGxsCircleId& id, RsGxsCircleDetails& details ) = 0;
const RsGxsCircleId& id, RsGxsCircleDetails& details ) = 0;
/** /**
* @brief Get list of known external circles ids. Memory cached * @brief Get list of known external circles ids. Memory cached
@ -321,8 +325,7 @@ public:
* @param[in] circleIds Storage for circles id list * @param[in] circleIds Storage for circles id list
* @return false if something failed, true otherwhise * @return false if something failed, true otherwhise
*/ */
virtual bool getCircleExternalIdList( virtual bool getCircleExternalIdList(std::set<RsGxsCircleId>& circleIds ) = 0;
std::list<RsGxsCircleId>& circleIds ) = 0;
/** /**
* @brief Get circles summaries list. * @brief Get circles summaries list.

View File

@ -153,7 +153,7 @@ p3GxsCircles::p3GxsCircles( RsGeneralDataService *gds, RsNetworkExchangeService
mLastCacheUpdateEvent = 0; mLastCacheUpdateEvent = 0;
mLastDebugPrintTS = 0; mLastDebugPrintTS = 0;
RsTickEvent::schedule_now(CIRCLE_EVENT_LOADIDS); RsTickEvent::schedule_now(CIRCLE_EVENT_CACHELOAD);
mDummyIdToken = 0; mDummyIdToken = 0;
} }
@ -654,10 +654,8 @@ void p3GxsCircles::notifyChanges(std::vector<RsGxsNotify *> &changes)
// for new circles we need to add them to the list. // for new circles we need to add them to the list.
// we don't know the type of this circle here // we don't know the type of this circle here
// original behavior was to add all ids to the external ids list // original behavior was to add all ids to the external ids list
addCircleIdToList(RsGxsCircleId(*git), 0);
circles_to_reload.insert(RsGxsCircleId(*git)); circles_to_reload.insert(RsGxsCircleId(*git));
} // fallthrough } // fallthrough
case RsGxsNotify::TYPE_STATISTICS_CHANGED: case RsGxsNotify::TYPE_STATISTICS_CHANGED:
{ {
@ -743,7 +741,18 @@ void p3GxsCircles::notifyChanges(std::vector<RsGxsNotify *> &changes)
rsEvents->postEvent(ev); rsEvents->postEvent(ev);
} }
} if( old_circle_grp_item->meta.mGroupName != new_circle_grp_item->meta.mGroupName
|| old_circle_grp_item->meta.mGroupFlags != new_circle_grp_item->meta.mGroupFlags
|| old_circle_grp_item->meta.mAuthorId != new_circle_grp_item->meta.mAuthorId
|| old_circle_grp_item->meta.mCircleId != new_circle_grp_item->meta.mCircleId
)
{
auto ev = std::make_shared<RsGxsCircleEvent>();
ev->mCircleId = RsGxsCircleId(new_circle_grp_item->meta.mGroupId);
ev->mCircleEventType = RsGxsCircleEventCode::CIRCLE_UPDATED;
rsEvents->postEvent(ev);
}
}
else if(c->getType()==RsGxsNotify::TYPE_GROUP_DELETED) else if(c->getType()==RsGxsNotify::TYPE_GROUP_DELETED)
{ {
auto ev = std::make_shared<RsGxsCircleEvent>(); auto ev = std::make_shared<RsGxsCircleEvent>();
@ -824,7 +833,7 @@ bool p3GxsCircles::getCircleDetails(const RsGxsCircleId& id, RsGxsCircleDetails&
return false; return false;
} }
bool p3GxsCircles::getCircleExternalIdList(std::list<RsGxsCircleId> &circleIds) bool p3GxsCircles::getCircleExternalIdList(std::set<RsGxsCircleId> &circleIds)
{ {
#ifdef DEBUG_CIRCLES #ifdef DEBUG_CIRCLES
std::cerr << "p3GxsCircles::getCircleIdList()"; std::cerr << "p3GxsCircles::getCircleIdList()";
@ -832,14 +841,10 @@ bool p3GxsCircles::getCircleExternalIdList(std::list<RsGxsCircleId> &circleIds)
#endif // DEBUG_CIRCLES #endif // DEBUG_CIRCLES
RsStackMutex stack(mCircleMtx); /********** STACK LOCKED MTX ******/ RsStackMutex stack(mCircleMtx); /********** STACK LOCKED MTX ******/
if (circleIds.empty())
circleIds = mCircleExternalIdList; for(auto& cache: mCircleCache)
else if(cache.second.mIsExternal)
{ circleIds.insert(cache.first);
std::list<RsGxsCircleId>::const_iterator it;
for(it = mCircleExternalIdList.begin(); it != mCircleExternalIdList.begin(); ++it)
circleIds.push_back(*it);
}
return true; return true;
} }
@ -1006,18 +1011,6 @@ bool p3GxsCircles::getMsgData(const uint32_t &token, std::vector<RsGxsCircleMsg>
for(; vit != msgItems.end(); ++vit) for(; vit != msgItems.end(); ++vit)
{ {
#ifdef TO_REMOVE
RsGxsCircleMsgItem* item = dynamic_cast<RsGxsCircleMsgItem*>(*vit);
if(item)
{
RsGxsCircleMsg msg = item->mMsg;
msg.mMeta = item->meta;
msgs.push_back(msg);
delete item;
}
#endif
RsGxsCircleSubscriptionRequestItem* rsItem = dynamic_cast<RsGxsCircleSubscriptionRequestItem*>(*vit); RsGxsCircleSubscriptionRequestItem* rsItem = dynamic_cast<RsGxsCircleSubscriptionRequestItem*>(*vit);
if (rsItem) if (rsItem)
@ -1087,10 +1080,6 @@ RsGenExchange::ServiceCreate_Return p3GxsCircles::service_CreateGroup(RsGxsGrpIt
item->meta.mCircleId = RsGxsCircleId(item->meta.mGroupId); item->meta.mCircleId = RsGxsCircleId(item->meta.mGroupId);
} }
// the advantage of adding the id to the list now is, that we know the cirlce type at this point
// this is not the case in NotifyChanges()
addCircleIdToList(RsGxsCircleId(item->meta.mGroupId), item->meta.mCircleType);
return SERVICE_CREATE_SUCCESS; return SERVICE_CREATE_SUCCESS;
} }
@ -1210,67 +1199,6 @@ bool RsGxsCircleCache::addLocalFriend(const RsPgpId &pgpId)
return true; return true;
} }
/************************************************************************************/
/************************************************************************************/
bool p3GxsCircles::request_CircleIdList()
{
/* trigger request to load missing ids into cache */
#ifdef DEBUG_CIRCLES
std::cerr << "p3GxsCircles::request_CircleIdList()";
std::cerr << std::endl;
#endif // DEBUG_CIRCLES
uint32_t ansType = RS_TOKREQ_ANSTYPE_SUMMARY;
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_META;
uint32_t token = 0;
RsGenExchange::getTokenService()->requestGroupInfo(token, ansType, opts);
GxsTokenQueue::queueRequest(token, CIRCLEREQ_CIRCLE_LIST);
return true;
}
bool p3GxsCircles::load_CircleIdList(uint32_t token)
{
#ifdef DEBUG_CIRCLES
std::cerr << "p3GxsCircles::load_CircleIdList() : " << token;
std::cerr << std::endl;
#endif // DEBUG_CIRCLES
std::list<RsGroupMetaData> groups;
bool ok = RsGenExchange::getGroupMeta(token, groups);
if(ok)
{
// Save List
{
RsStackMutex stack(mCircleMtx); /********** STACK LOCKED MTX ******/
mCirclePersonalIdList.clear();
mCircleExternalIdList.clear();
}
for(std::list<RsGroupMetaData>::iterator it = groups.begin(); it != groups.end(); ++it)
{
addCircleIdToList(RsGxsCircleId(it->mGroupId), it->mCircleType);
}
}
else
{
std::cerr << "p3GxsCircles::load_CircleIdList() ERROR no data";
std::cerr << std::endl;
return false;
}
return true;
}
/************************************************************************************/ /************************************************************************************/
/************************************************************************************/ /************************************************************************************/
/************************************************************************************/ /************************************************************************************/
@ -1713,24 +1641,6 @@ bool p3GxsCircles::locked_checkCircleCacheForAutoSubscribe(RsGxsCircleCache& cac
return true; return true;
} }
void p3GxsCircles::addCircleIdToList(const RsGxsCircleId &circleId, uint32_t circleType)
{
RsStackMutex stack(mCircleMtx); /********** STACK LOCKED MTX ******/
if (circleType == GXS_CIRCLE_TYPE_LOCAL)
{
if(mCirclePersonalIdList.end() == std::find(mCirclePersonalIdList.begin(), mCirclePersonalIdList.end(), circleId)){
mCirclePersonalIdList.push_back(circleId);
}
}
else
{
if(mCircleExternalIdList.end() == std::find(mCircleExternalIdList.begin(), mCircleExternalIdList.end(), circleId)){
mCircleExternalIdList.push_back(circleId);
}
}
}
bool p3GxsCircles::service_checkIfGroupIsStillUsed(const RsGxsGrpMetaData& meta) bool p3GxsCircles::service_checkIfGroupIsStillUsed(const RsGxsGrpMetaData& meta)
{ {
#ifdef GXSFORUMS_CHANNELS #ifdef GXSFORUMS_CHANNELS
@ -1802,10 +1712,6 @@ void p3GxsCircles::handleResponse(uint32_t token, uint32_t req_type)
// stuff. // stuff.
switch(req_type) switch(req_type)
{ {
case CIRCLEREQ_CIRCLE_LIST:
load_CircleIdList(token);
break;
case CIRCLEREQ_MESSAGE_DATA: case CIRCLEREQ_MESSAGE_DATA:
processMembershipRequests(token); processMembershipRequests(token);
break; break;
@ -1831,10 +1737,6 @@ void p3GxsCircles::handle_event(uint32_t event_type, const std::string &elabel)
// stuff. // stuff.
switch(event_type) switch(event_type)
{ {
case CIRCLE_EVENT_LOADIDS:
request_CircleIdList();
break;
case CIRCLE_EVENT_CACHELOAD: case CIRCLE_EVENT_CACHELOAD:
cache_start_load(); cache_start_load();
break; break;

View File

@ -271,7 +271,7 @@ public:
) override; ) override;
virtual bool getCircleDetails(const RsGxsCircleId &id, RsGxsCircleDetails &details) override; virtual bool getCircleDetails(const RsGxsCircleId &id, RsGxsCircleDetails &details) override;
virtual bool getCircleExternalIdList(std::list<RsGxsCircleId> &circleIds) override; virtual bool getCircleExternalIdList(std::set<RsGxsCircleId> &circleIds) override;
virtual bool isLoaded(const RsGxsCircleId &circleId) override; virtual bool isLoaded(const RsGxsCircleId &circleId) override;
virtual bool loadCircle(const RsGxsCircleId &circleId) override; virtual bool loadCircle(const RsGxsCircleId &circleId) override;
@ -326,8 +326,6 @@ protected:
private: private:
// Load data. // Load data.
bool request_CircleIdList();
bool load_CircleIdList(uint32_t token);
bool processMembershipRequests(uint32_t token); bool processMembershipRequests(uint32_t token);
// Need some crazy arsed cache to store the circle info. // Need some crazy arsed cache to store the circle info.
@ -351,21 +349,11 @@ protected:
p3IdService *mIdentities; // Needed for constructing Circle Info, p3IdService *mIdentities; // Needed for constructing Circle Info,
PgpAuxUtils *mPgpUtils; PgpAuxUtils *mPgpUtils;
// put a circle id into the external or personal circle id list
// this function locks the mutex
// if the id is already in the list, it will not be added again
// G10h4ck: this is terrible, an std::set instead of a list should be used
// to guarantee uniqueness
void addCircleIdToList(const RsGxsCircleId& circleId, uint32_t circleType);
RsMutex mCircleMtx; /* Locked Below Here */ RsMutex mCircleMtx; /* Locked Below Here */
RsMutex mKnownCirclesMtx; /* Locked Below Here */ RsMutex mKnownCirclesMtx; /* Locked Below Here */
std::map<RsGxsGroupId,rstime_t> mKnownCircles; std::map<RsGxsGroupId,rstime_t> mKnownCircles;
std::list<RsGxsCircleId> mCircleExternalIdList;
std::list<RsGxsCircleId> mCirclePersonalIdList;
/***** Caching Circle Info, *****/ /***** Caching Circle Info, *****/
// waiting for subcircle to load. (first is part of each of the second list) // waiting for subcircle to load. (first is part of each of the second list)

View File

@ -380,6 +380,18 @@ void p3GxsForums::notifyChanges(std::vector<RsGxsNotify *> &changes)
rsEvents->postEvent(ev); rsEvents->postEvent(ev);
} }
if( old_forum_grp_item->mGroup.mDescription != new_forum_grp_item->mGroup.mDescription
|| old_forum_grp_item->meta.mGroupName != new_forum_grp_item->meta.mGroupName
|| old_forum_grp_item->meta.mGroupFlags != new_forum_grp_item->meta.mGroupFlags
|| old_forum_grp_item->meta.mAuthorId != new_forum_grp_item->meta.mAuthorId
|| old_forum_grp_item->meta.mCircleId != new_forum_grp_item->meta.mCircleId
)
{
auto ev = std::make_shared<RsGxsForumEvent>();
ev->mForumGroupId = new_forum_grp_item->meta.mGroupId;
ev->mForumEventCode = RsForumEventCode::UPDATED_FORUM;
rsEvents->postEvent(ev);
}
} }
break; break;

View File

@ -159,7 +159,7 @@
<item row="0" column="1"> <item row="0" column="1">
<widget class="QToolButton" name="createLobbyToolButton"> <widget class="QToolButton" name="createLobbyToolButton">
<property name="toolTip"> <property name="toolTip">
<string>Create chat lobby</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Create new chat room&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>

View File

@ -152,6 +152,9 @@
</item> </item>
<item row="3" column="1" colspan="5"> <item row="3" column="1" colspan="5">
<widget class="QLabel" name="infoLastPost"> <widget class="QLabel" name="infoLastPost">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This includes posts, comments to posts and votes to comments.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string notr="true">unknown</string> <string notr="true">unknown</string>
</property> </property>
@ -217,8 +220,11 @@
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This includes posts, comments to posts and votes to comments.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string>Last Post:</string> <string>Last activity:</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -230,6 +236,9 @@
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Includes all posts, comments and votes. This number is progressively updates when new friend connect. The local vs. at friends difference may indicate that you would get older posts by increasing the synchronization period.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string notr="true">0</string> <string notr="true">0</string>
</property> </property>
@ -269,7 +278,7 @@
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Popularity</string> <string>Popularity:</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -287,8 +296,11 @@
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Includes all posts, comments and votes. This number is progressively updated when new friend connect. The local vs. at friends difference may indicate that you would get older posts by increasing the synchronization period.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string>Posts</string> <string>Contributions:</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -340,7 +352,7 @@
<string notr="true">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <string notr="true">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;Description&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;Description&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="textInteractionFlags"> <property name="textInteractionFlags">
@ -592,23 +604,16 @@ p, li { white-space: pre-wrap; }
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget>
<class>GxsIdChooser</class>
<extends>QComboBox</extends>
<header>gui/gxs/GxsIdChooser.h</header>
</customwidget>
<customwidget> <customwidget>
<class>LineEditClear</class> <class>LineEditClear</class>
<extends>QLineEdit</extends> <extends>QLineEdit</extends>
<header location="global">gui/common/LineEditClear.h</header> <header location="global">gui/common/LineEditClear.h</header>
</customwidget> </customwidget>
<customwidget>
<class>RSTabWidget</class>
<extends>QTabWidget</extends>
<header>gui/common/RSTabWidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>RSTreeView</class>
<extends>QTreeView</extends>
<header>gui/common/RSTreeView.h</header>
<container>1</container>
</customwidget>
<customwidget> <customwidget>
<class>GxsIdLabel</class> <class>GxsIdLabel</class>
<extends>QLabel</extends> <extends>QLabel</extends>
@ -620,14 +625,21 @@ p, li { white-space: pre-wrap; }
<header>gui/common/SubscribeToolButton.h</header> <header>gui/common/SubscribeToolButton.h</header>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>GxsIdChooser</class> <class>RSTreeView</class>
<extends>QComboBox</extends> <extends>QTreeView</extends>
<header>gui/gxs/GxsIdChooser.h</header> <header>gui/common/RSTreeView.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>RSTabWidget</class>
<extends>QTabWidget</extends>
<header>gui/common/RSTabWidget.h</header>
<container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<resources> <resources>
<include location="../icons.qrc"/>
<include location="Posted_images.qrc"/> <include location="Posted_images.qrc"/>
<include location="../icons.qrc"/>
</resources> </resources>
<connections/> <connections/>
</ui> </ui>

View File

@ -134,14 +134,8 @@ public:
QModelIndex index = sourceModel()->index(source_row,0,source_parent); QModelIndex index = sourceModel()->index(source_row,0,source_parent);
if(index.data(RsFriendListModel::TypeRole) == RsFriendListModel::ENTRY_TYPE_GROUP) if(index.data(RsFriendListModel::TypeRole) == RsFriendListModel::ENTRY_TYPE_GROUP) // always show groups, so we can delete them even when empty
{ return true;
RsGroupInfo group_info ;
static_cast<RsFriendListModel*>(sourceModel())->getGroupData(index,group_info);
if(group_info.peerIds.empty())
return false;
}
// Filter offline friends // Filter offline friends

View File

@ -163,7 +163,7 @@ void GxsChannelPostItem::setup()
ui->downloadButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/download.png")); ui->downloadButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/download.png"));
ui->playButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/play.png")); ui->playButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/play.png"));
ui->commentButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/comment.png")); ui->commentButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/comment.png"));
ui->editButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/pencil-edit-button.png")); //ui->editButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/pencil-edit-button.png"));
ui->copyLinkButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/copy.png")); ui->copyLinkButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/copy.png"));
ui->expandButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/down-arrow.png")); ui->expandButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/down-arrow.png"));
ui->readAndClearButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/correct.png")); ui->readAndClearButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/correct.png"));
@ -196,7 +196,7 @@ void GxsChannelPostItem::setup()
connect(ui->commentButton, SIGNAL(clicked()), this, SLOT(loadComments())); connect(ui->commentButton, SIGNAL(clicked()), this, SLOT(loadComments()));
connect(ui->playButton, SIGNAL(clicked()), this, SLOT(play(void))); connect(ui->playButton, SIGNAL(clicked()), this, SLOT(play(void)));
connect(ui->editButton, SIGNAL(clicked()), this, SLOT(edit(void))); //connect(ui->editButton, SIGNAL(clicked()), this, SLOT(edit(void)));
connect(ui->copyLinkButton, SIGNAL(clicked()), this, SLOT(copyMessageLink())); connect(ui->copyLinkButton, SIGNAL(clicked()), this, SLOT(copyMessageLink()));
connect(ui->readButton, SIGNAL(toggled(bool)), this, SLOT(readToggled(bool))); connect(ui->readButton, SIGNAL(toggled(bool)), this, SLOT(readToggled(bool)));
@ -447,8 +447,8 @@ void GxsChannelPostItem::fill()
else else
ui->logoLabel->setPicture( FilesDefs::getPixmapFromQtResourcePath(":/images/thumb-default-video.png") ); ui->logoLabel->setPicture( FilesDefs::getPixmapFromQtResourcePath(":/images/thumb-default-video.png") );
if( !IS_GROUP_PUBLISHER(mGroupMeta.mSubscribeFlags) ) //if( !IS_GROUP_PUBLISHER(mGroupMeta.mSubscribeFlags) )
ui->editButton->hide() ; ui->editButton->hide() ; // never show this button. Feeds are not the place to edit posts.
if (!mIsHome) if (!mIsHome)
{ {

View File

@ -63,7 +63,7 @@ bool MakeGxsCircleDesc(const RsGxsCircleId &id, QString &desc)
void GxsCircleChooser::loadGxsCircles() void GxsCircleChooser::loadGxsCircles()
{ {
std::list<RsGxsCircleId> ids; std::set<RsGxsCircleId> ids;
rsGxsCircles->getCircleExternalIdList(ids); rsGxsCircles->getCircleExternalIdList(ids);
if (ids.empty()) if (ids.empty())
@ -73,10 +73,9 @@ void GxsCircleChooser::loadGxsCircles()
return; return;
} }
std::list<RsGxsCircleId>::iterator it;
int i = 0; int i = 0;
int def = -1; int def = -1;
for(it = ids.begin(); it != ids.end(); ++it, ++i) for(auto it(ids.begin()); it != ids.end(); ++it, ++i)
{ {
/* add to Chooser */ /* add to Chooser */
QString str; QString str;
@ -91,15 +90,11 @@ void GxsCircleChooser::loadGxsCircles()
addItem(str, id); addItem(str, id);
if (mDefaultCircleId == *it) if (mDefaultCircleId == *it)
{
def = i; def = i;
}
} }
if (def >= 0) if (def >= 0)
{
setCurrentIndex(def); setCurrentIndex(def);
}
} }
bool GxsCircleChooser::getChosenCircle(RsGxsCircleId &id) bool GxsCircleChooser::getChosenCircle(RsGxsCircleId &id)

View File

@ -234,6 +234,9 @@
</item> </item>
<item row="0" column="3"> <item row="0" column="3">
<widget class="QLabel" name="infoPosts"> <widget class="QLabel" name="infoPosts">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Includes all posts, comments and votes. This number is progressively updated when new friend connect. The local vs. at friends difference may indicate that you would get older posts by increasing the synchronization period.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string notr="true">0</string> <string notr="true">0</string>
</property> </property>
@ -251,6 +254,9 @@
</item> </item>
<item row="1" column="3"> <item row="1" column="3">
<widget class="QLabel" name="infoLastPost"> <widget class="QLabel" name="infoLastPost">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This includes posts, comments to posts and votes to comments.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string notr="true">unknown</string> <string notr="true">unknown</string>
</property> </property>
@ -277,8 +283,11 @@
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This includes posts, comments to posts and votes to comments.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string>Last Post:</string> <string>Last activity:</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -310,7 +319,7 @@
</font> </font>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;The number of posts at friends is progressively updated.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;The new numbers will show next time you load this channel.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;The two numbers differ depending on your friends synchronization&lt;/p&gt;&lt;p&gt;time limits as well as yours.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Includes all posts, comments and votes. This number is progressively updated when new friend connect. The local vs. at friends difference may indicate that you would get older posts by increasing the synchronization period.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="text"> <property name="text">
<string>Posts (locally / at friends):</string> <string>Posts (locally / at friends):</string>
@ -380,7 +389,7 @@
<string notr="true">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <string notr="true">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;Description&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;Description&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="textInteractionFlags"> <property name="textInteractionFlags">
@ -627,18 +636,18 @@ p, li { white-space: pre-wrap; }
<customwidget> <customwidget>
<class>LineEditClear</class> <class>LineEditClear</class>
<extends>QLineEdit</extends> <extends>QLineEdit</extends>
<header>gui/common/LineEditClear.h</header> <header location="global">gui/common/LineEditClear.h</header>
</customwidget>
<customwidget>
<class>SubscribeToolButton</class>
<extends>QToolButton</extends>
<header>gui/common/SubscribeToolButton.h</header>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>GxsIdLabel</class> <class>GxsIdLabel</class>
<extends>QLabel</extends> <extends>QLabel</extends>
<header>gui/gxs/GxsIdLabel.h</header> <header>gui/gxs/GxsIdLabel.h</header>
</customwidget> </customwidget>
<customwidget>
<class>SubscribeToolButton</class>
<extends>QToolButton</extends>
<header>gui/common/SubscribeToolButton.h</header>
</customwidget>
<customwidget> <customwidget>
<class>RSTreeView</class> <class>RSTreeView</class>
<extends>QTreeView</extends> <extends>QTreeView</extends>

View File

@ -66,7 +66,8 @@ void GxsForumsDialog::handleEvent_main_thread(std::shared_ptr<const RsEvent> eve
updateGroupStatisticsReal(e->mForumGroupId); // update the list immediately updateGroupStatisticsReal(e->mForumGroupId); // update the list immediately
break; break;
case RsForumEventCode::NEW_FORUM: // [[fallthrough]]; case RsForumEventCode::NEW_FORUM: // [[fallthrough]];
case RsForumEventCode::UPDATED_FORUM: // [[fallthrough]];
case RsForumEventCode::DELETED_FORUM: // [[fallthrough]]; case RsForumEventCode::DELETED_FORUM: // [[fallthrough]];
case RsForumEventCode::SUBSCRIBE_STATUS_CHANGED: case RsForumEventCode::SUBSCRIBE_STATUS_CHANGED:
updateDisplay(true); updateDisplay(true);