2014-05-04 18:59:06 -04:00
/****************************************************************
* RetroShare is distributed under the following license :
*
* Copyright ( C ) 2008 Robert Fernie
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
* Boston , MA 02110 - 1301 , USA .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <QMenu>
# include <QMessageBox>
# include <QToolButton>
# include "GxsGroupFrameDialog.h"
# include "ui_GxsGroupFrameDialog.h"
# include "GxsMessageFrameWidget.h"
# include "gui/settings/rsharesettings.h"
# include "gui/RetroShareLink.h"
2014-10-13 14:31:47 -04:00
# include "gui/gxs/GxsGroupShareKey.h"
2014-05-04 18:59:06 -04:00
# include "gui/common/RSTreeWidget.h"
# include "gui/notifyqt.h"
2014-05-07 17:04:54 -04:00
# include "gui/common/UIStateHelper.h"
2014-05-07 20:00:21 -04:00
# include "GxsCommentDialog.h"
2014-05-04 18:59:06 -04:00
//#define DEBUG_GROUPFRAMEDIALOG
/* Images for TreeWidget */
# define IMAGE_SUBSCRIBE ": / images / edit_add24.png"
# define IMAGE_UNSUBSCRIBE ": / images / cancel.png"
# define IMAGE_INFO ": / images / info16.png"
//#define IMAGE_GROUPAUTHD ":/images/konv_message2.png"
# define IMAGE_COPYLINK ": / images / copyrslink.png"
2014-05-06 13:15:20 -04:00
# define IMAGE_EDIT ": / images / edit_16.png"
2014-05-07 20:00:21 -04:00
# define IMAGE_SHARE ": / images / share-icon-16.png"
# define IMAGE_TABNEW ": / images / tab-new.png"
2018-06-20 17:26:37 -04:00
# define IMAGE_DELETE ": / images / delete.png"
2018-07-05 05:43:55 -04:00
# define IMAGE_RETRIEVE ": / images / edit_add24.png"
2014-05-07 20:00:21 -04:00
# define IMAGE_COMMENT ""
2014-05-04 18:59:06 -04:00
2014-05-07 17:04:54 -04:00
# define TOKEN_TYPE_GROUP_SUMMARY 1
2014-07-05 14:33:11 -04:00
//#define TOKEN_TYPE_SUBSCRIBE_CHANGE 2
2014-05-04 18:59:06 -04:00
//#define TOKEN_TYPE_CURRENTGROUP 3
2014-07-06 12:39:09 -04:00
# define TOKEN_TYPE_STATISTICS 4
2014-05-04 18:59:06 -04:00
2014-05-07 20:00:21 -04:00
# define MAX_COMMENT_TITLE 32
2014-05-04 18:59:06 -04:00
/*
* Transformation Notes :
* there are still a couple of things that the new groups differ from Old version .
* these will need to be addressed in the future .
* - > Child TS ( for sorting ) is not handled by GXS , this will probably have to be done in the GUI .
* - > Need to handle IDs properly .
* - > Much more to do .
*/
/** Constructor */
2018-07-05 08:00:04 -04:00
GxsGroupFrameDialog : : GxsGroupFrameDialog ( RsGxsIfaceHelper * ifaceImpl , QWidget * parent , bool allow_dist_sync )
2014-05-04 18:59:06 -04:00
: RsGxsUpdateBroadcastPage ( ifaceImpl , parent )
{
/* Invoke the Qt Designer generated object setup routine */
ui = new Ui : : GxsGroupFrameDialog ( ) ;
ui - > setupUi ( this ) ;
mInitialized = false ;
2018-07-05 08:00:04 -04:00
mDistSyncAllowed = allow_dist_sync ;
2015-08-26 08:51:34 -04:00
mInFill = false ;
2014-09-24 19:57:47 -04:00
mCountChildMsgs = false ;
2014-05-04 18:59:06 -04:00
mYourGroups = NULL ;
mSubscribedGroups = NULL ;
mPopularGroups = NULL ;
mOtherGroups = NULL ;
mMessageWidget = NULL ;
/* Setup Queue */
mInterface = ifaceImpl ;
2014-07-20 15:35:33 -04:00
mTokenService = mInterface - > getTokenService ( ) ;
2014-05-04 18:59:06 -04:00
mTokenQueue = new TokenQueue ( mInterface - > getTokenService ( ) , this ) ;
/* Setup UI helper */
2014-05-07 17:04:54 -04:00
mStateHelper = new UIStateHelper ( this ) ;
mStateHelper - > addWidget ( TOKEN_TYPE_GROUP_SUMMARY , ui - > loadingLabel , UISTATE_LOADING_VISIBLE ) ;
2014-05-04 18:59:06 -04:00
connect ( ui - > groupTreeWidget , SIGNAL ( treeCustomContextMenuRequested ( QPoint ) ) , this , SLOT ( groupTreeCustomPopupMenu ( QPoint ) ) ) ;
2018-06-21 03:26:03 -04:00
connect ( ui - > groupTreeWidget , SIGNAL ( treeCurrentItemChanged ( QString ) ) , this , SLOT ( changedCurrentGroup ( QString ) ) ) ;
2014-05-04 18:59:06 -04:00
connect ( ui - > groupTreeWidget - > treeWidget ( ) , SIGNAL ( signalMouseMiddleButtonClicked ( QTreeWidgetItem * ) ) , this , SLOT ( groupTreeMiddleButtonClicked ( QTreeWidgetItem * ) ) ) ;
connect ( ui - > messageTabWidget , SIGNAL ( tabCloseRequested ( int ) ) , this , SLOT ( messageTabCloseRequested ( int ) ) ) ;
connect ( ui - > messageTabWidget , SIGNAL ( currentChanged ( int ) ) , this , SLOT ( messageTabChanged ( int ) ) ) ;
connect ( ui - > todoPushButton , SIGNAL ( clicked ( ) ) , this , SLOT ( todo ( ) ) ) ;
2018-07-05 08:00:04 -04:00
ui - > groupTreeWidget - > setDistSearchVisible ( allow_dist_sync ) ;
if ( allow_dist_sync )
connect ( ui - > groupTreeWidget , SIGNAL ( distantSearchRequested ( const QString & ) ) , this , SLOT ( searchNetwork ( const QString & ) ) ) ;
2014-05-04 18:59:06 -04:00
/* Set initial size the splitter */
2014-12-13 18:32:23 -05:00
ui - > splitter - > setStretchFactor ( 0 , 0 ) ;
ui - > splitter - > setStretchFactor ( 1 , 1 ) ;
2014-05-04 18:59:06 -04:00
QList < int > sizes ;
sizes < < 300 < < width ( ) ; // Qt calculates the right sizes
ui - > splitter - > setSizes ( sizes ) ;
2014-09-10 17:38:43 -04:00
# ifndef UNFINISHED
ui - > todoPushButton - > hide ( ) ;
# endif
2014-05-04 18:59:06 -04:00
}
GxsGroupFrameDialog : : ~ GxsGroupFrameDialog ( )
{
// save settings
processSettings ( false ) ;
delete ( mTokenQueue ) ;
delete ( ui ) ;
}
2018-07-05 04:11:12 -04:00
void GxsGroupFrameDialog : : getGroupList ( std : : map < RsGxsGroupId , RsGroupMetaData > & group_list )
2017-10-21 15:23:40 -04:00
{
group_list = mCachedGroupMetas ;
if ( group_list . empty ( ) )
requestGroupSummary ( ) ;
}
2014-05-04 18:59:06 -04:00
void GxsGroupFrameDialog : : initUi ( )
{
2017-02-25 17:52:57 -05:00
registerHelpButton ( ui - > helpButton , getHelpString ( ) , pageName ( ) ) ;
2014-09-10 17:38:43 -04:00
2014-05-04 18:59:06 -04:00
ui - > titleBarPixmap - > setPixmap ( QPixmap ( icon ( ICON_NAME ) ) ) ;
ui - > titleBarLabel - > setText ( text ( TEXT_NAME ) ) ;
/* Initialize group tree */
QToolButton * newGroupButton = new QToolButton ( this ) ;
newGroupButton - > setIcon ( QIcon ( icon ( ICON_NEW ) ) ) ;
newGroupButton - > setToolTip ( text ( TEXT_NEW ) ) ;
connect ( newGroupButton , SIGNAL ( clicked ( ) ) , this , SLOT ( newGroup ( ) ) ) ;
ui - > groupTreeWidget - > addToolButton ( newGroupButton ) ;
/* Create group tree */
mYourGroups = ui - > groupTreeWidget - > addCategoryItem ( text ( TEXT_YOUR_GROUP ) , QIcon ( icon ( ICON_YOUR_GROUP ) ) , true ) ;
mSubscribedGroups = ui - > groupTreeWidget - > addCategoryItem ( text ( TEXT_SUBSCRIBED_GROUP ) , QIcon ( icon ( ICON_SUBSCRIBED_GROUP ) ) , true ) ;
mPopularGroups = ui - > groupTreeWidget - > addCategoryItem ( text ( TEXT_POPULAR_GROUP ) , QIcon ( icon ( ICON_POPULAR_GROUP ) ) , false ) ;
mOtherGroups = ui - > groupTreeWidget - > addCategoryItem ( text ( TEXT_OTHER_GROUP ) , QIcon ( icon ( ICON_OTHER_GROUP ) ) , false ) ;
if ( text ( TEXT_TODO ) . isEmpty ( ) ) {
ui - > todoPushButton - > hide ( ) ;
}
// load settings
mSettingsName = settingsGroupName ( ) ;
processSettings ( true ) ;
2014-07-24 10:54:23 -04:00
if ( groupFrameSettingsType ( ) ! = GroupFrameSettings : : Nothing ) {
connect ( NotifyQt : : getInstance ( ) , SIGNAL ( settingsChanged ( ) ) , this , SLOT ( settingsChanged ( ) ) ) ;
settingsChanged ( ) ;
}
2014-05-04 18:59:06 -04:00
}
void GxsGroupFrameDialog : : showEvent ( QShowEvent * event )
{
if ( ! mInitialized ) {
/* Problem: virtual methods cannot be used in constructor */
mInitialized = true ;
initUi ( ) ;
}
RsGxsUpdateBroadcastPage : : showEvent ( event ) ;
}
void GxsGroupFrameDialog : : processSettings ( bool load )
{
if ( mSettingsName . isEmpty ( ) ) {
return ;
}
Settings - > beginGroup ( mSettingsName ) ;
if ( load ) {
// load settings
// state of splitter
ui - > splitter - > restoreState ( Settings - > value ( " Splitter " ) . toByteArray ( ) ) ;
} else {
// save settings
// state of splitter
Settings - > setValue ( " Splitter " , ui - > splitter - > saveState ( ) ) ;
}
2018-05-08 06:08:08 -04:00
ui - > groupTreeWidget - > processSettings ( load ) ;
2014-05-04 18:59:06 -04:00
Settings - > endGroup ( ) ;
}
2014-07-24 10:54:23 -04:00
void GxsGroupFrameDialog : : settingsChanged ( )
{
GroupFrameSettings groupFrameSettings ;
if ( Settings - > getGroupFrameSettings ( groupFrameSettingsType ( ) , groupFrameSettings ) ) {
setSingleTab ( ! groupFrameSettings . mOpenAllInNewTab ) ;
setHideTabBarWithOneTab ( groupFrameSettings . mHideTabBarWithOneTab ) ;
}
}
2014-05-04 18:59:06 -04:00
void GxsGroupFrameDialog : : setSingleTab ( bool singleTab )
{
if ( singleTab ) {
if ( ! mMessageWidget ) {
mMessageWidget = createMessageWidget ( RsGxsGroupId ( ) ) ;
// remove close button of the the first tab
ui - > messageTabWidget - > hideCloseButton ( ui - > messageTabWidget - > indexOf ( mMessageWidget ) ) ;
}
} else {
if ( mMessageWidget ) {
delete ( mMessageWidget ) ;
mMessageWidget = NULL ;
}
}
}
2014-07-14 17:29:51 -04:00
void GxsGroupFrameDialog : : setHideTabBarWithOneTab ( bool hideTabBarWithOneTab )
{
ui - > messageTabWidget - > setHideTabBarWithOneTab ( hideTabBarWithOneTab ) ;
}
2014-05-04 18:59:06 -04:00
void GxsGroupFrameDialog : : updateDisplay ( bool complete )
{
2014-07-05 14:33:11 -04:00
if ( complete | | ! getGrpIds ( ) . empty ( ) | | ! getGrpIdsMeta ( ) . empty ( ) ) {
2014-05-04 18:59:06 -04:00
/* Update group list */
requestGroupSummary ( ) ;
2014-07-06 12:39:09 -04:00
} else {
2014-07-20 15:35:33 -04:00
/* Update all groups of changed messages */
2018-06-21 09:46:59 -04:00
std : : map < RsGxsGroupId , std : : set < RsGxsMessageId > > msgIds ;
2014-07-20 15:35:33 -04:00
getAllMsgIds ( msgIds ) ;
2018-06-21 09:46:59 -04:00
for ( auto msgIt = msgIds . begin ( ) ; msgIt ! = msgIds . end ( ) ; + + msgIt ) {
2014-07-20 15:35:33 -04:00
updateMessageSummaryList ( msgIt - > first ) ;
2014-07-06 12:39:09 -04:00
}
2014-05-04 18:59:06 -04:00
}
2018-06-23 16:25:36 -04:00
updateSearchResults ( ) ;
}
void GxsGroupFrameDialog : : updateSearchResults ( )
{
const std : : set < TurtleRequestId > & reqs = getSearchResults ( ) ;
for ( auto it ( reqs . begin ( ) ) ; it ! = reqs . end ( ) ; + + it )
2018-06-24 10:55:38 -04:00
{
2018-06-23 16:25:36 -04:00
std : : cerr < < " updating search ID " < < std : : hex < < * it < < std : : dec < < std : : endl ;
2018-06-24 10:55:38 -04:00
std : : map < RsGxsGroupId , RsGxsGroupSummary > group_infos ;
getDistantSearchResults ( * it , group_infos ) ;
std : : cerr < < " retrieved " < < std : : endl ;
2018-06-24 17:15:22 -04:00
auto it2 = mSearchGroupsItems . find ( * it ) ;
if ( mSearchGroupsItems . end ( ) = = it2 )
{
std : : cerr < < " GxsGroupFrameDialog::updateSearchResults(): received result notification for req " < < std : : hex < < * it < < std : : dec < < " but no item present! " < < std : : endl ;
continue ; // we could create the item just as well but since this situation is not supposed to happen, I prefer to make this a failure case.
}
QList < GroupItemInfo > group_items ;
for ( auto it3 ( group_infos . begin ( ) ) ; it3 ! = group_infos . end ( ) ; + + it3 )
2018-07-05 04:11:12 -04:00
if ( mCachedGroupMetas . find ( it3 - > first ) = = mCachedGroupMetas . end ( ) )
{
2018-06-24 17:15:22 -04:00
std : : cerr < < " adding new group " < < it3 - > first < < " " < < it3 - > second . group_id < < " \" " < < it3 - > second . group_name < < " \" " < < std : : endl ;
2018-07-05 04:11:12 -04:00
GroupItemInfo i ;
i . id = QString ( it3 - > second . group_id . toStdString ( ) . c_str ( ) ) ;
i . name = QString : : fromUtf8 ( it3 - > second . group_name . c_str ( ) ) ;
i . description = QString : : fromUtf8 ( it3 - > second . group_description . c_str ( ) ) ;
i . popularity = 0 ; // could be set to the number of hits
2018-06-24 17:15:22 -04:00
i . lastpost = QDateTime : : fromTime_t ( it3 - > second . last_message_ts ) ;
i . subscribeFlags = 0 ; // irrelevant here
i . publishKey = false ; // IS_GROUP_PUBLISHER(groupInfo.mSubscribeFlags) ;
i . adminKey = false ; // IS_GROUP_ADMIN(groupInfo.mSubscribeFlags) ;
i . max_visible_posts = it3 - > second . number_of_messages ;
2018-07-05 04:11:12 -04:00
group_items . push_back ( i ) ;
2018-06-24 17:15:22 -04:00
}
ui - > groupTreeWidget - > fillGroupItems ( it2 - > second , group_items ) ;
2018-06-24 10:55:38 -04:00
}
2014-05-04 18:59:06 -04:00
}
void GxsGroupFrameDialog : : todo ( )
{
QMessageBox : : information ( this , " Todo " , text ( TEXT_TODO ) ) ;
}
2018-06-20 17:26:37 -04:00
void GxsGroupFrameDialog : : removeCurrentSearch ( )
{
QAction * action = dynamic_cast < QAction * > ( sender ( ) ) ;
if ( ! action )
return ;
TurtleRequestId search_request_id = action - > data ( ) . toUInt ( ) ;
2018-06-24 17:15:22 -04:00
auto it = mSearchGroupsItems . find ( search_request_id ) ;
2018-06-20 17:26:37 -04:00
2018-06-24 17:15:22 -04:00
if ( it = = mSearchGroupsItems . end ( ) )
2018-06-20 17:26:37 -04:00
return ;
ui - > groupTreeWidget - > removeSearchItem ( it - > second ) ;
2018-06-24 17:15:22 -04:00
mSearchGroupsItems . erase ( it ) ;
mKnownGroups . erase ( search_request_id ) ;
2018-06-20 17:26:37 -04:00
}
void GxsGroupFrameDialog : : removeAllSearches ( )
{
2018-06-24 17:15:22 -04:00
for ( auto it ( mSearchGroupsItems . begin ( ) ) ; it ! = mSearchGroupsItems . end ( ) ; + + it )
2018-06-20 17:26:37 -04:00
ui - > groupTreeWidget - > removeSearchItem ( it - > second ) ;
2018-06-24 17:15:22 -04:00
mSearchGroupsItems . clear ( ) ;
mKnownGroups . clear ( ) ;
2018-06-20 17:26:37 -04:00
}
2014-05-25 17:43:05 -04:00
void GxsGroupFrameDialog : : groupTreeCustomPopupMenu ( QPoint point )
2014-05-04 18:59:06 -04:00
{
2018-06-22 17:38:31 -04:00
// First separately handle the case of search top level items
2018-06-20 17:26:37 -04:00
2018-06-22 17:38:31 -04:00
TurtleRequestId search_request_id = 0 ;
2018-06-20 17:26:37 -04:00
2018-06-22 17:38:31 -04:00
if ( ui - > groupTreeWidget - > isSearchRequestItem ( point , search_request_id ) )
2018-05-08 06:08:08 -04:00
{
2018-06-20 17:26:37 -04:00
QMenu contextMnu ( this ) ;
contextMnu . addAction ( QIcon ( IMAGE_DELETE ) , tr ( " Remove this search " ) , this , SLOT ( removeCurrentSearch ( ) ) ) - > setData ( search_request_id ) ;
contextMnu . addAction ( QIcon ( IMAGE_DELETE ) , tr ( " Remove all searches " ) , this , SLOT ( removeAllSearches ( ) ) ) ;
contextMnu . exec ( QCursor : : pos ( ) ) ;
2018-06-22 17:38:31 -04:00
return ;
}
2018-06-20 17:26:37 -04:00
2018-07-05 05:43:55 -04:00
// Then check whether we have a searched item, or a normal group
QString group_id_s ;
if ( ui - > groupTreeWidget - > isSearchRequestResult ( point , group_id_s , search_request_id ) )
{
QMenu contextMnu ( this ) ;
contextMnu . addAction ( QIcon ( IMAGE_RETRIEVE ) , tr ( " Request data " ) , this , SLOT ( distantRequestGroupData ( ) ) ) - > setData ( group_id_s ) ;
contextMnu . exec ( QCursor : : pos ( ) ) ;
return ;
}
2014-05-29 09:34:08 -04:00
QString id = ui - > groupTreeWidget - > itemIdAt ( point ) ;
2014-05-25 17:43:05 -04:00
if ( id . isEmpty ( ) ) return ;
mGroupId = RsGxsGroupId ( id . toStdString ( ) ) ;
2014-05-04 18:59:06 -04:00
int subscribeFlags = ui - > groupTreeWidget - > subscribeFlags ( QString : : fromStdString ( mGroupId . toStdString ( ) ) ) ;
2018-06-20 17:26:37 -04:00
bool isAdmin = IS_GROUP_ADMIN ( subscribeFlags ) ;
bool isPublisher = IS_GROUP_PUBLISHER ( subscribeFlags ) ;
2014-05-04 18:59:06 -04:00
bool isSubscribed = IS_GROUP_SUBSCRIBED ( subscribeFlags ) ;
QMenu contextMnu ( this ) ;
QAction * action ;
2016-12-05 17:42:44 -05:00
2015-12-07 11:11:25 -05:00
if ( mMessageWidget ) {
action = contextMnu . addAction ( QIcon ( IMAGE_TABNEW ) , tr ( " Open in new tab " ) , this , SLOT ( openInNewTab ( ) ) ) ;
if ( mGroupId . isNull ( ) | | messageWidget ( mGroupId , true ) ) {
action - > setEnabled ( false ) ;
}
}
2014-05-04 18:59:06 -04:00
if ( isSubscribed ) {
action = contextMnu . addAction ( QIcon ( IMAGE_UNSUBSCRIBE ) , tr ( " Unsubscribe " ) , this , SLOT ( unsubscribeGroup ( ) ) ) ;
action - > setEnabled ( ! mGroupId . isNull ( ) & & IS_GROUP_SUBSCRIBED ( subscribeFlags ) ) ;
} else {
action = contextMnu . addAction ( QIcon ( IMAGE_SUBSCRIBE ) , tr ( " Subscribe " ) , this , SLOT ( subscribeGroup ( ) ) ) ;
action - > setDisabled ( mGroupId . isNull ( ) | | IS_GROUP_SUBSCRIBED ( subscribeFlags ) ) ;
}
contextMnu . addSeparator ( ) ;
contextMnu . addAction ( QIcon ( icon ( ICON_NEW ) ) , text ( TEXT_NEW ) , this , SLOT ( newGroup ( ) ) ) ;
action = contextMnu . addAction ( QIcon ( IMAGE_INFO ) , tr ( " Show Details " ) , this , SLOT ( showGroupDetails ( ) ) ) ;
action - > setEnabled ( ! mGroupId . isNull ( ) ) ;
2014-05-06 13:15:20 -04:00
action = contextMnu . addAction ( QIcon ( IMAGE_EDIT ) , tr ( " Edit Details " ) , this , SLOT ( editGroupDetails ( ) ) ) ;
2014-05-04 18:59:06 -04:00
action - > setEnabled ( ! mGroupId . isNull ( ) & & isAdmin ) ;
2018-06-22 17:38:31 -04:00
uint32_t current_store_time = mInterface - > getStoragePeriod ( mGroupId ) / 86400 ;
uint32_t current_sync_time = mInterface - > getSyncPeriod ( mGroupId ) / 86400 ;
2016-12-05 17:42:44 -05:00
2018-06-22 17:38:31 -04:00
std : : cerr < < " Got sync= " < < current_sync_time < < " . store= " < < current_store_time < < std : : endl ;
QAction * actnn = NULL ;
2016-12-05 17:42:44 -05:00
QMenu * ctxMenu2 = contextMnu . addMenu ( tr ( " Synchronise posts of last... " ) ) ;
2018-06-22 17:38:31 -04:00
actnn = ctxMenu2 - > addAction ( tr ( " 5 days " ) , this , SLOT ( setSyncPostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 5 ) ) ; if ( current_sync_time = = 5 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
2016-12-13 16:46:30 -05:00
actnn = ctxMenu2 - > addAction ( tr ( " 2 weeks " ) , this , SLOT ( setSyncPostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 15 ) ) ; if ( current_sync_time = = 15 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 1 month " ) , this , SLOT ( setSyncPostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 30 ) ) ; if ( current_sync_time = = 30 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 3 months " ) , this , SLOT ( setSyncPostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 90 ) ) ; if ( current_sync_time = = 90 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 6 months " ) , this , SLOT ( setSyncPostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 180 ) ) ; if ( current_sync_time = = 180 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
2017-02-28 02:14:08 -05:00
actnn = ctxMenu2 - > addAction ( tr ( " 1 year " ) , this , SLOT ( setSyncPostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 372 ) ) ; if ( current_sync_time = = 372 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
2016-12-13 16:46:30 -05:00
actnn = ctxMenu2 - > addAction ( tr ( " Indefinitly " ) , this , SLOT ( setSyncPostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 0 ) ) ; if ( current_sync_time = = 0 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
2016-12-05 17:42:44 -05:00
2018-06-22 17:38:31 -04:00
ctxMenu2 = contextMnu . addMenu ( tr ( " Store posts for at most... " ) ) ;
actnn = ctxMenu2 - > addAction ( tr ( " 5 days " ) , this , SLOT ( setStorePostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 5 ) ) ; if ( current_store_time = = 5 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 2 weeks " ) , this , SLOT ( setStorePostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 15 ) ) ; if ( current_store_time = = 15 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 1 month " ) , this , SLOT ( setStorePostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 30 ) ) ; if ( current_store_time = = 30 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 3 months " ) , this , SLOT ( setStorePostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 90 ) ) ; if ( current_store_time = = 90 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 6 months " ) , this , SLOT ( setStorePostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 180 ) ) ; if ( current_store_time = = 180 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " 1 year " ) , this , SLOT ( setStorePostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 372 ) ) ; if ( current_store_time = = 372 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
actnn = ctxMenu2 - > addAction ( tr ( " Indefinitly " ) , this , SLOT ( setStorePostsDelay ( ) ) ) ; actnn - > setData ( QVariant ( 0 ) ) ; if ( current_store_time = = 0 ) { actnn - > setEnabled ( false ) ; actnn - > setIcon ( QIcon ( " :/images/start.png " ) ) ; }
2016-12-05 16:14:48 -05:00
2014-07-22 11:04:36 -04:00
if ( shareKeyType ( ) ) {
2018-06-22 17:38:31 -04:00
action = contextMnu . addAction ( QIcon ( IMAGE_SHARE ) , tr ( " Share publish permissions " ) , this , SLOT ( sharePublishKey ( ) ) ) ;
action - > setEnabled ( ! mGroupId . isNull ( ) & & isPublisher ) ;
2014-07-22 11:04:36 -04:00
}
2014-05-04 18:59:06 -04:00
2014-07-22 11:04:36 -04:00
if ( getLinkType ( ) ! = RetroShareLink : : TYPE_UNKNOWN ) {
action = contextMnu . addAction ( QIcon ( IMAGE_COPYLINK ) , tr ( " Copy RetroShare Link " ) , this , SLOT ( copyGroupLink ( ) ) ) ;
action - > setEnabled ( ! mGroupId . isNull ( ) ) ;
}
2014-05-04 18:59:06 -04:00
contextMnu . addSeparator ( ) ;
action = contextMnu . addAction ( QIcon ( " :/images/message-mail-read.png " ) , tr ( " Mark all as read " ) , this , SLOT ( markMsgAsRead ( ) ) ) ;
action - > setEnabled ( ! mGroupId . isNull ( ) & & isSubscribed ) ;
action = contextMnu . addAction ( QIcon ( " :/images/message-mail.png " ) , tr ( " Mark all as unread " ) , this , SLOT ( markMsgAsUnread ( ) ) ) ;
action - > setEnabled ( ! mGroupId . isNull ( ) & & isSubscribed ) ;
/* Add special actions */
QList < QAction * > actions ;
groupTreeCustomActions ( mGroupId , subscribeFlags , actions ) ;
if ( ! actions . isEmpty ( ) ) {
contextMnu . addSeparator ( ) ;
contextMnu . addActions ( actions ) ;
}
2018-05-08 06:08:08 -04:00
//Add Standard Menu
ui - > groupTreeWidget - > treeWidget ( ) - > createStandardContextMenu ( & contextMnu ) ;
2014-05-04 18:59:06 -04:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
}
2016-12-05 16:14:48 -05:00
void GxsGroupFrameDialog : : setStorePostsDelay ( )
{
QAction * action = dynamic_cast < QAction * > ( sender ( ) ) ;
if ( ! action | | mGroupId . isNull ( ) )
{
std : : cerr < < " (EE) Cannot find action/group that called me! Group is " < < mGroupId < < " , action is " < < ( void * ) action < < " " < < __PRETTY_FUNCTION__ < < std : : endl ;
return ;
}
uint32_t duration = action - > data ( ) . toUInt ( ) ;
std : : cerr < < " Data is " < < duration < < std : : endl ;
2016-12-05 17:42:44 -05:00
mInterface - > setStoragePeriod ( mGroupId , duration * 86400 ) ;
2016-12-13 15:12:34 -05:00
// If the sync is larger, we reduce it. No need to sync more than we store. The machinery below also takes care of this.
//
uint32_t sync_period = mInterface - > getSyncPeriod ( mGroupId ) ;
if ( duration > 0 ) // the >0 test is to discard the indefinitly test. Basically, if we store for less than indefinitly, the sync is reduced accordingly.
{
if ( sync_period = = 0 | | sync_period > duration * 86400 )
{
mInterface - > setSyncPeriod ( mGroupId , duration * 86400 ) ;
std : : cerr < < " (II) auto adjusting sync period to " < < duration < < " days as well. " < < std : : endl ;
}
}
2016-12-05 16:14:48 -05:00
}
void GxsGroupFrameDialog : : setSyncPostsDelay ( )
{
QAction * action = dynamic_cast < QAction * > ( sender ( ) ) ;
if ( ! action | | mGroupId . isNull ( ) )
{
std : : cerr < < " (EE) Cannot find action/group that called me! Group is " < < mGroupId < < " , action is " < < ( void * ) action < < " " < < __PRETTY_FUNCTION__ < < std : : endl ;
return ;
}
uint32_t duration = action - > data ( ) . toUInt ( ) ;
std : : cerr < < " Data is " < < duration < < std : : endl ;
2016-12-05 17:42:44 -05:00
mInterface - > setSyncPeriod ( mGroupId , duration * 86400 ) ;
2016-12-13 15:12:34 -05:00
// If the store is smaller, we increase it accordingly. No need to sync more than we store. The machinery below also takes care of this.
//
uint32_t store_period = mInterface - > getStoragePeriod ( mGroupId ) ;
if ( duration = = 0 )
mInterface - > setStoragePeriod ( mGroupId , duration * 86400 ) ; // indefinite sync => indefinite storage
else
{
if ( store_period ! = 0 & & store_period < duration * 86400 )
{
mInterface - > setStoragePeriod ( mGroupId , duration * 86400 ) ; // indefinite sync => indefinite storage
std : : cerr < < " (II) auto adjusting storage period to " < < duration < < " days as well. " < < std : : endl ;
}
}
2016-12-05 16:14:48 -05:00
}
2014-05-04 18:59:06 -04:00
void GxsGroupFrameDialog : : restoreGroupKeys ( void )
{
QMessageBox : : warning ( this , " RetroShare " , " ToDo " ) ;
# ifdef TOGXS
mInterface - > groupRestoreKeys ( mGroupId ) ;
# endif
}
void GxsGroupFrameDialog : : newGroup ( )
{
GxsGroupDialog * dialog = createNewGroupDialog ( mTokenQueue ) ;
if ( ! dialog ) {
return ;
}
dialog - > exec ( ) ;
delete ( dialog ) ;
}
void GxsGroupFrameDialog : : subscribeGroup ( )
{
groupSubscribe ( true ) ;
}
void GxsGroupFrameDialog : : unsubscribeGroup ( )
{
groupSubscribe ( false ) ;
}
void GxsGroupFrameDialog : : groupSubscribe ( bool subscribe )
{
if ( mGroupId . isNull ( ) ) {
return ;
}
uint32_t token ;
mInterface - > subscribeToGroup ( token , mGroupId , subscribe ) ;
2014-07-05 14:33:11 -04:00
// Replaced by meta data changed
// mTokenQueue->queueRequest(token, 0, RS_TOKREQ_ANSTYPE_ACK, TOKEN_TYPE_SUBSCRIBE_CHANGE);
2014-05-04 18:59:06 -04:00
}
void GxsGroupFrameDialog : : showGroupDetails ( )
{
if ( mGroupId . isNull ( ) ) {
return ;
}
GxsGroupDialog * dialog = createGroupDialog ( mTokenQueue , mInterface - > getTokenService ( ) , GxsGroupDialog : : MODE_SHOW , mGroupId ) ;
if ( ! dialog ) {
return ;
}
dialog - > exec ( ) ;
delete ( dialog ) ;
}
void GxsGroupFrameDialog : : editGroupDetails ( )
{
if ( mGroupId . isNull ( ) ) {
return ;
}
GxsGroupDialog * dialog = createGroupDialog ( mTokenQueue , mInterface - > getTokenService ( ) , GxsGroupDialog : : MODE_EDIT , mGroupId ) ;
if ( ! dialog ) {
return ;
}
dialog - > exec ( ) ;
delete ( dialog ) ;
}
void GxsGroupFrameDialog : : copyGroupLink ( )
{
if ( mGroupId . isNull ( ) ) {
return ;
}
2014-07-26 19:52:45 -04:00
QString name ;
if ( ! getCurrentGroupName ( name ) ) return ;
2014-05-27 17:14:05 -04:00
2017-07-16 07:11:47 -04:00
RetroShareLink link = RetroShareLink : : createGxsGroupLink ( getLinkType ( ) , mGroupId , name ) ;
if ( link . valid ( ) ) {
2014-07-26 19:52:45 -04:00
QList < RetroShareLink > urls ;
urls . push_back ( link ) ;
RSLinkClipboard : : copyLinks ( urls ) ;
}
2014-05-27 17:14:05 -04:00
}
bool GxsGroupFrameDialog : : getCurrentGroupName ( QString & name )
{
2014-07-26 19:52:45 -04:00
return ui - > groupTreeWidget - > getGroupName ( QString : : fromStdString ( mGroupId . toStdString ( ) ) , name ) ;
2014-05-04 18:59:06 -04:00
}
void GxsGroupFrameDialog : : markMsgAsRead ( )
{
GxsMessageFrameWidget * msgWidget = messageWidget ( mGroupId , false ) ;
if ( msgWidget ) {
msgWidget - > setAllMessagesRead ( true ) ;
}
}
void GxsGroupFrameDialog : : markMsgAsUnread ( )
{
GxsMessageFrameWidget * msgWidget = messageWidget ( mGroupId , false ) ;
if ( msgWidget ) {
msgWidget - > setAllMessagesRead ( false ) ;
}
}
2016-06-16 22:23:27 -04:00
void GxsGroupFrameDialog : : sharePublishKey ( )
2014-05-04 18:59:06 -04:00
{
if ( mGroupId . isNull ( ) ) {
return ;
}
2014-10-05 15:14:05 -04:00
// QMessageBox::warning(this, "", "ToDo");
2014-07-26 17:18:03 -04:00
2014-10-13 14:31:47 -04:00
GroupShareKey shareUi ( this , mGroupId , shareKeyType ( ) ) ;
2014-10-05 15:14:05 -04:00
shareUi . exec ( ) ;
2014-05-04 18:59:06 -04:00
}
2017-05-18 16:31:52 -04:00
void GxsGroupFrameDialog : : loadComment ( const RsGxsGroupId & grpId , const QVector < RsGxsMessageId > & msg_versions , const RsGxsMessageId & most_recent_msgId , const QString & title )
2014-05-07 20:00:21 -04:00
{
RsGxsCommentService * commentService = getCommentService ( ) ;
if ( ! commentService ) {
/* No comment service available */
return ;
}
2017-05-18 16:31:52 -04:00
GxsCommentDialog * commentDialog = commentWidget ( most_recent_msgId ) ;
2014-05-07 20:00:21 -04:00
if ( ! commentDialog ) {
QString comments = title ;
if ( title . length ( ) > MAX_COMMENT_TITLE )
{
comments . truncate ( MAX_COMMENT_TITLE - 3 ) ;
comments + = " ... " ;
}
commentDialog = new GxsCommentDialog ( this , mInterface - > getTokenService ( ) , commentService ) ;
2017-05-18 16:31:52 -04:00
QWidget * commentHeader = createCommentHeaderWidget ( grpId , most_recent_msgId ) ;
2014-05-07 20:00:21 -04:00
if ( commentHeader ) {
commentDialog - > setCommentHeader ( commentHeader ) ;
}
2017-05-18 16:31:52 -04:00
std : : set < RsGxsMessageId > msgv ;
for ( int i = 0 ; i < msg_versions . size ( ) ; + + i )
msgv . insert ( msg_versions [ i ] ) ;
commentDialog - > commentLoad ( grpId , msgv , most_recent_msgId ) ;
2014-05-07 20:00:21 -04:00
int index = ui - > messageTabWidget - > addTab ( commentDialog , comments ) ;
ui - > messageTabWidget - > setTabIcon ( index , QIcon ( IMAGE_COMMENT ) ) ;
}
ui - > messageTabWidget - > setCurrentWidget ( commentDialog ) ;
}
2014-10-25 11:50:00 -04:00
bool GxsGroupFrameDialog : : navigate ( const RsGxsGroupId & groupId , const RsGxsMessageId & msgId )
2014-05-04 18:59:06 -04:00
{
if ( groupId . isNull ( ) ) {
return false ;
}
2014-10-25 11:50:00 -04:00
if ( mStateHelper - > isLoading ( TOKEN_TYPE_GROUP_SUMMARY ) ) {
mNavigatePendingGroupId = groupId ;
mNavigatePendingMsgId = msgId ;
/* No information if group is available */
return true ;
}
QString groupIdString = QString : : fromStdString ( groupId . toStdString ( ) ) ;
if ( ui - > groupTreeWidget - > activateId ( groupIdString , msgId . isNull ( ) ) = = NULL ) {
2014-05-04 18:59:06 -04:00
return false ;
2014-10-25 11:50:00 -04:00
}
2018-06-21 03:26:03 -04:00
changedCurrentGroup ( groupIdString ) ;
2014-10-25 11:50:00 -04:00
/* search exisiting tab */
GxsMessageFrameWidget * msgWidget = messageWidget ( mGroupId , false ) ;
if ( ! msgWidget ) {
return false ;
}
2014-05-04 18:59:06 -04:00
2014-10-25 11:50:00 -04:00
if ( msgId . isNull ( ) ) {
return true ;
}
2014-05-04 18:59:06 -04:00
2014-10-25 19:52:33 -04:00
return msgWidget - > navigate ( msgId ) ;
2014-05-04 18:59:06 -04:00
}
GxsMessageFrameWidget * GxsGroupFrameDialog : : messageWidget ( const RsGxsGroupId & groupId , bool ownTab )
{
int tabCount = ui - > messageTabWidget - > count ( ) ;
for ( int index = 0 ; index < tabCount ; + + index ) {
GxsMessageFrameWidget * childWidget = dynamic_cast < GxsMessageFrameWidget * > ( ui - > messageTabWidget - > widget ( index ) ) ;
if ( ownTab & & mMessageWidget & & childWidget = = mMessageWidget ) {
continue ;
}
if ( childWidget & & childWidget - > groupId ( ) = = groupId ) {
return childWidget ;
}
}
return NULL ;
}
GxsMessageFrameWidget * GxsGroupFrameDialog : : createMessageWidget ( const RsGxsGroupId & groupId )
{
GxsMessageFrameWidget * msgWidget = createMessageFrameWidget ( groupId ) ;
if ( ! msgWidget ) {
return NULL ;
}
int index = ui - > messageTabWidget - > addTab ( msgWidget , msgWidget - > groupName ( true ) ) ;
ui - > messageTabWidget - > setTabIcon ( index , msgWidget - > groupIcon ( ) ) ;
2014-05-07 20:00:21 -04:00
2014-05-04 18:59:06 -04:00
connect ( msgWidget , SIGNAL ( groupChanged ( QWidget * ) ) , this , SLOT ( messageTabInfoChanged ( QWidget * ) ) ) ;
2015-03-14 17:13:28 -04:00
connect ( msgWidget , SIGNAL ( waitingChanged ( QWidget * ) ) , this , SLOT ( messageTabWaitingChanged ( QWidget * ) ) ) ;
2017-05-18 16:31:52 -04:00
connect ( msgWidget , SIGNAL ( loadComment ( RsGxsGroupId , QVector < RsGxsMessageId > , RsGxsMessageId , QString ) ) , this , SLOT ( loadComment ( RsGxsGroupId , QVector < RsGxsMessageId > , RsGxsMessageId , QString ) ) ) ;
2014-05-04 18:59:06 -04:00
return msgWidget ;
}
2017-05-18 16:31:52 -04:00
GxsCommentDialog * GxsGroupFrameDialog : : commentWidget ( const RsGxsMessageId & msgId )
2014-05-07 20:00:21 -04:00
{
int tabCount = ui - > messageTabWidget - > count ( ) ;
for ( int index = 0 ; index < tabCount ; + + index ) {
GxsCommentDialog * childWidget = dynamic_cast < GxsCommentDialog * > ( ui - > messageTabWidget - > widget ( index ) ) ;
if ( childWidget & & childWidget - > messageId ( ) = = msgId ) {
return childWidget ;
}
}
return NULL ;
}
2018-06-21 03:26:03 -04:00
void GxsGroupFrameDialog : : changedCurrentGroup ( const QString & groupId )
2014-05-04 18:59:06 -04:00
{
2015-08-26 08:51:34 -04:00
if ( mInFill ) {
return ;
}
2018-02-18 17:12:59 -05:00
if ( groupId . isEmpty ( ) ) {
if ( mMessageWidget ) {
mMessageWidget - > setGroupId ( RsGxsGroupId ( ) ) ;
ui - > messageTabWidget - > setCurrentWidget ( mMessageWidget ) ;
}
return ;
}
2014-05-04 18:59:06 -04:00
mGroupId = RsGxsGroupId ( groupId . toStdString ( ) ) ;
if ( mGroupId . isNull ( ) ) {
return ;
}
/* search exisiting tab */
GxsMessageFrameWidget * msgWidget = messageWidget ( mGroupId , true ) ;
if ( ! msgWidget ) {
if ( mMessageWidget ) {
/* not found, use standard tab */
msgWidget = mMessageWidget ;
msgWidget - > setGroupId ( mGroupId ) ;
} else {
/* create new tab */
msgWidget = createMessageWidget ( mGroupId ) ;
}
}
ui - > messageTabWidget - > setCurrentWidget ( msgWidget ) ;
}
void GxsGroupFrameDialog : : groupTreeMiddleButtonClicked ( QTreeWidgetItem * item )
{
openGroupInNewTab ( RsGxsGroupId ( ui - > groupTreeWidget - > itemId ( item ) . toStdString ( ) ) ) ;
}
void GxsGroupFrameDialog : : openInNewTab ( )
{
openGroupInNewTab ( mGroupId ) ;
}
void GxsGroupFrameDialog : : openGroupInNewTab ( const RsGxsGroupId & groupId )
{
if ( groupId . isNull ( ) ) {
return ;
}
/* search exisiting tab */
GxsMessageFrameWidget * msgWidget = messageWidget ( groupId , true ) ;
if ( ! msgWidget ) {
/* not found, create new tab */
msgWidget = createMessageWidget ( groupId ) ;
}
ui - > messageTabWidget - > setCurrentWidget ( msgWidget ) ;
}
void GxsGroupFrameDialog : : messageTabCloseRequested ( int index )
{
2014-05-07 20:00:21 -04:00
QWidget * widget = ui - > messageTabWidget - > widget ( index ) ;
if ( ! widget ) {
2014-05-04 18:59:06 -04:00
return ;
}
2014-05-07 20:00:21 -04:00
GxsMessageFrameWidget * msgWidget = dynamic_cast < GxsMessageFrameWidget * > ( widget ) ;
if ( msgWidget & & msgWidget = = mMessageWidget ) {
/* Don't close single tab */
2014-05-04 18:59:06 -04:00
return ;
}
2014-05-07 20:00:21 -04:00
delete ( widget ) ;
2014-05-04 18:59:06 -04:00
}
void GxsGroupFrameDialog : : messageTabChanged ( int index )
{
GxsMessageFrameWidget * msgWidget = dynamic_cast < GxsMessageFrameWidget * > ( ui - > messageTabWidget - > widget ( index ) ) ;
if ( ! msgWidget ) {
return ;
}
ui - > groupTreeWidget - > activateId ( QString : : fromStdString ( msgWidget - > groupId ( ) . toStdString ( ) ) , false ) ;
}
void GxsGroupFrameDialog : : messageTabInfoChanged ( QWidget * widget )
{
int index = ui - > messageTabWidget - > indexOf ( widget ) ;
if ( index < 0 ) {
return ;
}
GxsMessageFrameWidget * msgWidget = dynamic_cast < GxsMessageFrameWidget * > ( ui - > messageTabWidget - > widget ( index ) ) ;
if ( ! msgWidget ) {
return ;
}
ui - > messageTabWidget - > setTabText ( index , msgWidget - > groupName ( true ) ) ;
ui - > messageTabWidget - > setTabIcon ( index , msgWidget - > groupIcon ( ) ) ;
}
2015-03-14 17:13:28 -04:00
void GxsGroupFrameDialog : : messageTabWaitingChanged ( QWidget * widget )
{
int index = ui - > messageTabWidget - > indexOf ( widget ) ;
if ( index < 0 ) {
return ;
}
GxsMessageFrameWidget * msgWidget = dynamic_cast < GxsMessageFrameWidget * > ( ui - > messageTabWidget - > widget ( index ) ) ;
if ( ! msgWidget ) {
return ;
}
ui - > groupTreeWidget - > setWaiting ( QString : : fromStdString ( msgWidget - > groupId ( ) . toStdString ( ) ) , msgWidget - > isWaiting ( ) ) ;
}
2014-05-04 18:59:06 -04:00
///***** INSERT GROUP LISTS *****/
2014-09-11 18:07:06 -04:00
void GxsGroupFrameDialog : : groupInfoToGroupItemInfo ( const RsGroupMetaData & groupInfo , GroupItemInfo & groupItemInfo , const RsUserdata */ * userdata */ )
2014-05-04 18:59:06 -04:00
{
groupItemInfo . id = QString : : fromStdString ( groupInfo . mGroupId . toStdString ( ) ) ;
groupItemInfo . name = QString : : fromUtf8 ( groupInfo . mGroupName . c_str ( ) ) ;
groupItemInfo . popularity = groupInfo . mPop ;
groupItemInfo . lastpost = QDateTime : : fromTime_t ( groupInfo . mLastPost ) ;
2014-12-27 17:13:29 -05:00
groupItemInfo . subscribeFlags = groupInfo . mSubscribeFlags ;
2016-06-16 22:23:27 -04:00
groupItemInfo . publishKey = IS_GROUP_PUBLISHER ( groupInfo . mSubscribeFlags ) ;
groupItemInfo . adminKey = IS_GROUP_ADMIN ( groupInfo . mSubscribeFlags ) ;
2014-12-27 17:13:29 -05:00
groupItemInfo . max_visible_posts = groupInfo . mVisibleMsgCount ;
2014-05-04 18:59:06 -04:00
# if TOGXS
if ( groupInfo . mGroupFlags & RS_DISTRIB_AUTHEN_REQ ) {
groupItemInfo . name + = " ( " + tr ( " AUTHD " ) + " ) " ;
groupItemInfo . icon = QIcon ( IMAGE_GROUPAUTHD ) ;
}
else
# endif
{
groupItemInfo . icon = QIcon ( icon ( ICON_DEFAULT ) ) ;
}
}
2018-07-05 04:11:12 -04:00
void GxsGroupFrameDialog : : insertGroupsData ( const std : : map < RsGxsGroupId , RsGroupMetaData > & groupList , const RsUserdata * userdata )
2014-05-04 18:59:06 -04:00
{
if ( ! mInitialized ) {
return ;
}
2015-08-26 08:51:34 -04:00
mInFill = true ;
2014-05-04 18:59:06 -04:00
QList < GroupItemInfo > adminList ;
QList < GroupItemInfo > subList ;
QList < GroupItemInfo > popList ;
QList < GroupItemInfo > otherList ;
std : : multimap < uint32_t , GroupItemInfo > popMap ;
2018-07-05 04:11:12 -04:00
for ( auto it = groupList . begin ( ) ; it ! = groupList . end ( ) ; + + it ) {
2014-05-04 18:59:06 -04:00
/* sort it into Publish (Own), Subscribed, Popular and Other */
2018-07-05 04:11:12 -04:00
uint32_t flags = it - > second . mSubscribeFlags ;
2014-05-04 18:59:06 -04:00
GroupItemInfo groupItemInfo ;
2018-07-05 04:11:12 -04:00
groupInfoToGroupItemInfo ( it - > second , groupItemInfo , userdata ) ;
2014-05-04 18:59:06 -04:00
if ( IS_GROUP_SUBSCRIBED ( flags ) )
{
if ( IS_GROUP_ADMIN ( flags ) )
{
adminList . push_back ( groupItemInfo ) ;
}
else
{
/* subscribed group */
subList . push_back ( groupItemInfo ) ;
}
}
else
{
2017-06-29 16:11:44 -04:00
//popMap.insert(std::make_pair(it->mPop, groupItemInfo)); /* rate the others by popularity */
2018-07-05 04:11:12 -04:00
popMap . insert ( std : : make_pair ( it - > second . mLastPost , groupItemInfo ) ) ; /* rate the others by time of last post */
2014-05-04 18:59:06 -04:00
}
}
/* 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 ;
std : : multimap < uint32_t , GroupItemInfo > : : reverse_iterator rit ;
2017-07-15 07:32:04 -04:00
//uint32_t popLimit = 0;
2017-06-29 16:11:44 -04:00
//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 , + + i ) {
//if (rit->second.popularity > (int) popLimit) {
if ( i < popCount )
2014-05-04 18:59:06 -04:00
popList . append ( rit - > second ) ;
2017-06-29 16:11:44 -04:00
else
otherList . append ( rit - > second ) ;
2014-05-04 18:59:06 -04:00
}
/* now we can add them in as a tree! */
ui - > groupTreeWidget - > fillGroupItems ( mYourGroups , adminList ) ;
ui - > groupTreeWidget - > fillGroupItems ( mSubscribedGroups , subList ) ;
2017-03-21 09:52:40 -04:00
mSubscribedGroups - > setText ( 2 , QString : : number ( mSubscribedGroups - > childCount ( ) ) ) ; // 1 COLUMN_UNREAD 2 COLUMN_POPULARITY
2014-05-04 18:59:06 -04:00
ui - > groupTreeWidget - > fillGroupItems ( mPopularGroups , popList ) ;
2017-03-21 09:52:40 -04:00
mPopularGroups - > setText ( 2 , QString : : number ( mPopularGroups - > childCount ( ) ) ) ;
2014-05-04 18:59:06 -04:00
ui - > groupTreeWidget - > fillGroupItems ( mOtherGroups , otherList ) ;
2017-03-21 09:52:40 -04:00
mOtherGroups - > setText ( 2 , QString : : number ( mOtherGroups - > childCount ( ) ) ) ;
2014-05-04 18:59:06 -04:00
2015-08-26 08:51:34 -04:00
mInFill = false ;
2014-07-05 14:33:11 -04:00
/* Re-fill group */
if ( ! ui - > groupTreeWidget - > activateId ( QString : : fromStdString ( mGroupId . toStdString ( ) ) , true ) ) {
mGroupId . clear ( ) ;
}
2014-05-04 18:59:06 -04:00
updateMessageSummaryList ( RsGxsGroupId ( ) ) ;
}
void GxsGroupFrameDialog : : updateMessageSummaryList ( RsGxsGroupId groupId )
{
if ( ! mInitialized ) {
return ;
}
2014-07-06 12:39:09 -04:00
if ( groupId . isNull ( ) ) {
QTreeWidgetItem * items [ 2 ] = { mYourGroups , mSubscribedGroups } ;
2014-10-21 18:33:02 -04:00
for ( int item = 0 ; item < 2 ; + + item ) {
2014-07-06 12:39:09 -04:00
int child ;
int childCount = items [ item ] - > childCount ( ) ;
2014-10-21 18:33:02 -04:00
for ( child = 0 ; child < childCount ; + + child ) {
2014-07-06 12:39:09 -04:00
QTreeWidgetItem * childItem = items [ item ] - > child ( child ) ;
QString childId = ui - > groupTreeWidget - > itemId ( childItem ) ;
if ( childId . isEmpty ( ) ) {
continue ;
2014-05-04 18:59:06 -04:00
}
2014-07-06 12:39:09 -04:00
2014-07-20 15:35:33 -04:00
requestGroupStatistics ( RsGxsGroupId ( childId . toLatin1 ( ) . constData ( ) ) ) ;
2014-05-04 18:59:06 -04:00
}
}
2014-07-06 12:39:09 -04:00
} else {
2014-07-20 15:35:33 -04:00
requestGroupStatistics ( groupId ) ;
2014-05-04 18:59:06 -04:00
}
}
/*********************** **** **** **** ***********************/
/** Request / Response of Data ********************************/
/*********************** **** **** **** ***********************/
void GxsGroupFrameDialog : : requestGroupSummary ( )
{
2014-05-07 17:04:54 -04:00
mStateHelper - > setLoading ( TOKEN_TYPE_GROUP_SUMMARY , true ) ;
2014-05-04 18:59:06 -04:00
# ifdef DEBUG_GROUPFRAMEDIALOG
std : : cerr < < " GxsGroupFrameDialog::requestGroupSummary() " ;
std : : cerr < < std : : endl ;
# endif
2014-05-07 17:04:54 -04:00
mTokenQueue - > cancelActiveRequestTokens ( TOKEN_TYPE_GROUP_SUMMARY ) ;
2014-05-04 18:59:06 -04:00
RsTokReqOptions opts ;
2014-09-11 18:07:06 -04:00
opts . mReqType = requestGroupSummaryType ( ) ;
2014-05-04 18:59:06 -04:00
uint32_t token ;
2014-05-07 17:04:54 -04:00
mTokenQueue - > requestGroupInfo ( token , RS_TOKREQ_ANSTYPE_SUMMARY , opts , TOKEN_TYPE_GROUP_SUMMARY ) ;
2014-05-04 18:59:06 -04:00
}
2014-09-11 18:07:06 -04:00
void GxsGroupFrameDialog : : loadGroupSummaryToken ( const uint32_t & token , std : : list < RsGroupMetaData > & groupInfo , RsUserdata * & /*userdata*/ )
{
/* Default implementation for request type GXS_REQUEST_TYPE_GROUP_META */
mInterface - > getGroupSummary ( token , groupInfo ) ;
}
2014-05-04 18:59:06 -04:00
void GxsGroupFrameDialog : : loadGroupSummary ( const uint32_t & token )
{
# ifdef DEBUG_GROUPFRAMEDIALOG
std : : cerr < < " GxsGroupFrameDialog::loadGroupSummary() " ;
std : : cerr < < std : : endl ;
# endif
std : : list < RsGroupMetaData > groupInfo ;
2014-09-11 18:07:06 -04:00
RsUserdata * userdata = NULL ;
loadGroupSummaryToken ( token , groupInfo , userdata ) ;
2014-05-04 18:59:06 -04:00
2018-07-05 04:11:12 -04:00
mCachedGroupMetas . clear ( ) ;
for ( auto it ( groupInfo . begin ( ) ) ; it ! = groupInfo . end ( ) ; + + it )
mCachedGroupMetas [ ( * it ) . mGroupId ] = * it ;
2017-10-21 15:23:40 -04:00
2018-07-05 04:11:12 -04:00
insertGroupsData ( mCachedGroupMetas , userdata ) ;
updateSearchResults ( ) ;
2014-05-04 18:59:06 -04:00
2014-09-11 18:07:06 -04:00
mStateHelper - > setLoading ( TOKEN_TYPE_GROUP_SUMMARY , false ) ;
2014-05-04 18:59:06 -04:00
2014-09-11 18:07:06 -04:00
if ( userdata ) {
delete ( userdata ) ;
2014-05-04 18:59:06 -04:00
}
2014-10-25 11:50:00 -04:00
if ( ! mNavigatePendingGroupId . isNull ( ) ) {
/* Navigate pending */
navigate ( mNavigatePendingGroupId , mNavigatePendingMsgId ) ;
mNavigatePendingGroupId . clear ( ) ;
mNavigatePendingMsgId . clear ( ) ;
}
2014-05-04 18:59:06 -04:00
}
/*********************** **** **** **** ***********************/
/*********************** **** **** **** ***********************/
2014-07-05 14:33:11 -04:00
//void GxsGroupFrameDialog::acknowledgeSubscribeChange(const uint32_t &token)
//{
//#ifdef DEBUG_GROUPFRAMEDIALOG
// std::cerr << "GxsGroupFrameDialog::acknowledgeSubscribeChange()";
// std::cerr << std::endl;
//#endif
2014-05-04 18:59:06 -04:00
2014-07-05 14:33:11 -04:00
// RsGxsGroupId groupId;
// mInterface->acknowledgeGrp(token, groupId);
2014-05-04 18:59:06 -04:00
2014-07-05 14:33:11 -04:00
// fillComplete();
//}
2014-05-04 18:59:06 -04:00
/*********************** **** **** **** ***********************/
/*********************** **** **** **** ***********************/
//void GxsGroupFrameDialog::requestGroupSummary_CurrentGroup(const RsGxsGroupId &groupId)
//{
// RsTokReqOptions opts;
// opts.mReqType = GXS_REQUEST_TYPE_GROUP_META;
// std::list<std::string> grpIds;
// grpIds.push_back(groupId);
// std::cerr << "GxsGroupFrameDialog::requestGroupSummary_CurrentGroup(" << groupId << ")";
// std::cerr << std::endl;
// uint32_t token;
// mInteface->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_SUMMARY, opts, grpIds, TOKEN_TYPE_CURRENTGROUP);
//}
//void GxsGroupFrameDialog::loadGroupSummary_CurrentGroup(const uint32_t &token)
//{
// std::cerr << "GxsGroupFrameDialog::loadGroupSummary_CurrentGroup()";
// std::cerr << std::endl;
// std::list<RsGroupMetaData> groupInfo;
// rsGxsForums->getGroupSummary(token, groupInfo);
// if (groupInfo.size() == 1)
// {
// RsGroupMetaData fi = groupInfo.front();
// mSubscribeFlags = fi.mSubscribeFlags;
// }
// else
// {
// resetData();
// std::cerr << "GxsGroupFrameDialog::loadGroupSummary_CurrentGroup() ERROR Invalid Number of Groups...";
// std::cerr << std::endl;
// }
// setValid(true);
//}
/*********************** **** **** **** ***********************/
/*********************** **** **** **** ***********************/
2014-07-20 15:35:33 -04:00
void GxsGroupFrameDialog : : requestGroupStatistics ( const RsGxsGroupId & groupId )
2014-07-06 12:39:09 -04:00
{
uint32_t token ;
2014-07-20 15:35:33 -04:00
mTokenService - > requestGroupStatistic ( token , groupId ) ;
mTokenQueue - > queueRequest ( token , 0 , RS_TOKREQ_ANSTYPE_ACK , TOKEN_TYPE_STATISTICS ) ;
2014-07-06 12:39:09 -04:00
}
void GxsGroupFrameDialog : : loadGroupStatistics ( const uint32_t & token )
{
2014-07-20 15:35:33 -04:00
GxsGroupStatistic stats ;
mInterface - > getGroupStatistic ( token , stats ) ;
2014-07-06 12:39:09 -04:00
2014-07-20 15:35:33 -04:00
QTreeWidgetItem * item = ui - > groupTreeWidget - > getItemFromId ( QString : : fromStdString ( stats . mGrpId . toStdString ( ) ) ) ;
if ( ! item ) {
return ;
2014-07-06 12:39:09 -04:00
}
2014-07-20 15:35:33 -04:00
2014-12-16 01:54:15 -05:00
ui - > groupTreeWidget - > setUnreadCount ( item , mCountChildMsgs ? ( stats . mNumThreadMsgsUnread + stats . mNumChildMsgsUnread ) : stats . mNumThreadMsgsUnread ) ;
2014-07-06 12:39:09 -04:00
}
/*********************** **** **** **** ***********************/
/*********************** **** **** **** ***********************/
2014-05-04 18:59:06 -04:00
void GxsGroupFrameDialog : : loadRequest ( const TokenQueue * queue , const TokenRequest & req )
{
# ifdef DEBUG_GROUPFRAMEDIALOG
std : : cerr < < " GxsGroupFrameDialog::loadRequest() UserType: " < < req . mUserType ;
std : : cerr < < std : : endl ;
# endif
if ( queue = = mTokenQueue )
{
/* now switch on req */
switch ( req . mUserType )
{
2014-05-07 17:04:54 -04:00
case TOKEN_TYPE_GROUP_SUMMARY :
2014-05-04 18:59:06 -04:00
loadGroupSummary ( req . mToken ) ;
break ;
2014-07-05 14:33:11 -04:00
// case TOKEN_TYPE_SUBSCRIBE_CHANGE:
// acknowledgeSubscribeChange(req.mToken);
// break;
2014-05-04 18:59:06 -04:00
// case TOKEN_TYPE_CURRENTGROUP:
// loadGroupSummary_CurrentGroup(req.mToken);
// break;
2014-07-06 12:39:09 -04:00
case TOKEN_TYPE_STATISTICS :
loadGroupStatistics ( req . mToken ) ;
break ;
2014-05-04 18:59:06 -04:00
default :
std : : cerr < < " GxsGroupFrameDialog::loadRequest() ERROR: INVALID TYPE " ;
std : : cerr < < std : : endl ;
}
}
}
2018-06-20 16:30:44 -04:00
TurtleRequestId GxsGroupFrameDialog : : distantSearch ( const QString & search_string ) // this should be overloaded in the child class
{
2018-06-21 07:48:57 -04:00
std : : cerr < < " Searching for \" " < < search_string . toStdString ( ) < < " \" . Function is not overloaded, so nothing will happen. " < < std : : endl ;
2018-06-20 16:30:44 -04:00
return 0 ;
}
void GxsGroupFrameDialog : : searchNetwork ( const QString & search_string )
{
2018-06-20 17:26:37 -04:00
if ( search_string . isNull ( ) )
return ;
2018-06-20 16:30:44 -04:00
uint32_t request_id = distantSearch ( search_string ) ;
if ( request_id = = 0 )
return ;
2018-06-24 17:15:22 -04:00
mSearchGroupsItems [ request_id ] = ui - > groupTreeWidget - > addSearchItem ( tr ( " Search for " ) + " \" " + search_string + " \" " , ( uint32_t ) request_id , QIcon ( icon ( ICON_SEARCH ) ) ) ;
2018-06-20 16:30:44 -04:00
}
2018-07-05 05:43:55 -04:00
void GxsGroupFrameDialog : : distantRequestGroupData ( )
{
QAction * action = dynamic_cast < QAction * > ( sender ( ) ) ;
if ( ! action )
return ;
RsGxsGroupId group_id ( action - > data ( ) . toString ( ) . toStdString ( ) ) ;
if ( group_id . isNull ( ) )
{
std : : cerr < < " Cannot retrieve group! Group id is null! " < < std : : endl ;
}
std : : cerr < < " Explicit request for group " < < group_id < < std : : endl ;
checkRequestGroup ( group_id ) ;
}