2008-04-09 08:57:26 -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
2010-05-01 15:03:35 -04:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
2008-04-09 08:57:26 -04:00
* Boston , MA 02110 - 1301 , USA .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-23 14:52:58 -04:00
# include <QMenu>
# include <QFile>
# include <QDateTime>
# include <QMessageBox>
2011-05-02 17:50:20 -04:00
# include <QKeyEvent>
2011-06-07 18:28:07 -04:00
# include <QProgressBar>
2010-07-23 14:52:58 -04:00
2008-04-09 08:57:26 -04:00
# include "ForumsDialog.h"
2010-09-14 13:47:11 -04:00
# include "forums/CreateForum.h"
# include "forums/CreateForumMsg.h"
# include "forums/ForumDetails.h"
2010-09-14 15:38:47 -04:00
# include "forums/EditForumDetails.h"
2010-05-23 15:13:41 -04:00
# include "msgs/MessageComposer.h"
2010-09-14 13:47:11 -04:00
# include "settings/rsharesettings.h"
# include "common/Emoticons.h"
2010-11-09 18:56:02 -05:00
# include "common/RSItemDelegate.h"
2010-12-25 07:52:29 -05:00
# include "common/PopularityDefs.h"
2011-04-19 15:42:44 -04:00
# include "RetroShareLink.h"
2008-04-09 08:57:26 -04:00
2010-08-06 05:40:23 -04:00
# include <retroshare/rspeers.h>
# include <retroshare/rsforums.h>
2010-01-04 09:29:49 -05:00
2008-11-02 10:20:42 -05:00
# include <algorithm>
2008-04-09 08:57:26 -04:00
2011-06-06 17:44:16 -04:00
//#define DEBUG_FORUMS
2008-04-09 08:57:26 -04:00
/* Images for context menu icons */
# define IMAGE_MESSAGE ": / images / folder-draft.png"
# define IMAGE_MESSAGEREPLY ": / images / mail_reply.png"
# define IMAGE_MESSAGEREMOVE ": / images / mail_delete.png"
# define IMAGE_DOWNLOAD ": / images / start.png"
# define IMAGE_DOWNLOADALL ": / images / startall.png"
2008-11-26 19:01:46 -05:00
/* Images for TreeWidget */
2008-08-12 08:03:23 -04:00
# define IMAGE_FOLDER ": / images / folder16.png"
2008-08-16 21:09:32 -04:00
# define IMAGE_FOLDERGREEN ": / images / folder_green.png"
# define IMAGE_FOLDERRED ": / images / folder_red.png"
# define IMAGE_FOLDERYELLOW ": / images / folder_yellow.png"
2008-08-12 08:03:23 -04:00
# define IMAGE_FORUM ": / images / konversation16.png"
2009-08-13 09:35:18 -04:00
# define IMAGE_SUBSCRIBE ": / images / edit_add24.png"
2008-08-12 17:07:41 -04:00
# define IMAGE_UNSUBSCRIBE ": / images / cancel.png"
# define IMAGE_INFO ": / images / info16.png"
# define IMAGE_NEWFORUM ": / images / new_forum16.png"
2010-01-01 13:58:39 -05:00
# define IMAGE_FORUMAUTHD ": / images / konv_message2.png"
2011-04-19 15:42:44 -04:00
# define IMAGE_COPYLINK ": / images / copyrslink.png"
2008-08-12 17:07:41 -04:00
2010-05-19 16:17:43 -04:00
# define VIEW_LAST_POST 0
# define VIEW_THREADED 1
# define VIEW_FLAT 2
2008-08-12 17:07:41 -04:00
2010-08-08 18:58:10 -04:00
/* Thread constants */
# define COLUMN_THREAD_COUNT 6
# define COLUMN_THREAD_TITLE 0
# define COLUMN_THREAD_READ 1
# define COLUMN_THREAD_DATE 2
# define COLUMN_THREAD_AUTHOR 3
# define COLUMN_THREAD_SIGNED 4
# define COLUMN_THREAD_CONTENT 5
# define COLUMN_THREAD_DATA 0 // column for storing the userdata like msgid and parentid
# define ROLE_THREAD_MSGID Qt::UserRole
# define ROLE_THREAD_STATUS Qt::UserRole + 1
2011-02-11 19:04:32 -05:00
# define ROLE_THREAD_MISSING Qt::UserRole + 2
2010-08-08 18:58:10 -04:00
// no need to copy, don't count in ROLE_THREAD_COUNT
2011-02-11 19:04:32 -05:00
# define ROLE_THREAD_READCHILDREN Qt::UserRole + 3
# define ROLE_THREAD_UNREADCHILDREN Qt::UserRole + 4
2010-08-08 18:58:10 -04:00
2011-02-11 19:04:32 -05:00
# define ROLE_THREAD_COUNT 3
2010-08-08 18:58:10 -04:00
# define IS_UNREAD(status) ((status & FORUM_MSG_STATUS_READ) == 0 || (status & FORUM_MSG_STATUS_UNREAD_BY_USER))
2011-06-07 18:28:07 -04:00
# define IS_FORUM_ADMIN(subscribeFlags) (subscribeFlags & RS_DISTRIB_ADMIN)
# define IS_FORUM_SUBSCRIBED(subscribeFlags) (subscribeFlags & (RS_DISTRIB_ADMIN | RS_DISTRIB_SUBSCRIBED))
2010-08-08 18:58:10 -04:00
2010-05-19 16:17:43 -04:00
static int FilterColumnFromComboBox ( int nIndex )
{
switch ( nIndex ) {
case 0 :
2010-08-08 18:58:10 -04:00
return COLUMN_THREAD_DATE ;
2010-05-19 16:17:43 -04:00
case 1 :
2010-08-08 18:58:10 -04:00
return COLUMN_THREAD_TITLE ;
2010-05-19 16:17:43 -04:00
case 2 :
2010-08-08 18:58:10 -04:00
return COLUMN_THREAD_AUTHOR ;
2010-05-19 16:17:43 -04:00
case 3 :
2010-08-08 18:58:10 -04:00
return COLUMN_THREAD_CONTENT ;
2010-05-19 16:17:43 -04:00
}
2008-08-12 17:07:41 -04:00
2010-08-08 18:58:10 -04:00
return COLUMN_THREAD_TITLE ;
2010-05-19 16:17:43 -04:00
}
static int FilterColumnToComboBox ( int nIndex )
{
switch ( nIndex ) {
2010-08-08 18:58:10 -04:00
case COLUMN_THREAD_DATE :
2010-05-19 16:17:43 -04:00
return 0 ;
2010-08-08 18:58:10 -04:00
case COLUMN_THREAD_TITLE :
2010-05-19 16:17:43 -04:00
return 1 ;
2010-08-08 18:58:10 -04:00
case COLUMN_THREAD_AUTHOR :
2010-05-19 16:17:43 -04:00
return 2 ;
2010-08-08 18:58:10 -04:00
case COLUMN_THREAD_CONTENT :
2010-05-19 16:17:43 -04:00
return 3 ;
}
2010-08-08 18:58:10 -04:00
return FilterColumnToComboBox ( COLUMN_THREAD_TITLE ) ;
2010-05-19 16:17:43 -04:00
}
2008-04-09 08:57:26 -04:00
/** Constructor */
2008-11-26 19:01:46 -05:00
ForumsDialog : : ForumsDialog ( QWidget * parent )
2010-07-05 15:41:46 -04:00
: RsAutoUpdatePage ( 1000 , parent )
2008-04-09 08:57:26 -04:00
{
2010-05-19 16:17:43 -04:00
/* Invoke the Qt Designer generated object setup routine */
ui . setupUi ( this ) ;
2008-04-09 08:57:26 -04:00
2010-05-20 17:53:27 -04:00
m_bProcessSettings = false ;
2011-06-07 18:28:07 -04:00
subscribeFlags = 0 ;
2010-05-20 17:53:27 -04:00
2010-12-26 19:15:25 -05:00
connect ( ui . forumTreeWidget , SIGNAL ( treeCustomContextMenuRequested ( QPoint ) ) , this , SLOT ( forumListCustomPopupMenu ( QPoint ) ) ) ;
2010-05-19 16:17:43 -04:00
connect ( ui . threadTreeWidget , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( threadListCustomPopupMenu ( QPoint ) ) ) ;
2008-04-09 08:57:26 -04:00
2011-05-16 17:24:16 -04:00
connect ( ui . newForumButton , SIGNAL ( clicked ( ) ) , this , SLOT ( newforum ( ) ) ) ;
2010-05-19 16:17:43 -04:00
connect ( ui . newmessageButton , SIGNAL ( clicked ( ) ) , this , SLOT ( createmessage ( ) ) ) ;
2010-08-08 18:58:10 -04:00
connect ( ui . newthreadButton , SIGNAL ( clicked ( ) ) , this , SLOT ( createthread ( ) ) ) ;
2008-04-15 12:40:38 -04:00
2010-12-26 19:15:25 -05:00
connect ( ui . forumTreeWidget , SIGNAL ( treeCurrentItemChanged ( QString ) ) , this , SLOT ( changedForum ( QString ) ) ) ;
2008-04-15 12:40:38 -04:00
2010-05-19 16:17:43 -04:00
connect ( ui . threadTreeWidget , SIGNAL ( itemSelectionChanged ( ) ) , this , SLOT ( changedThread ( ) ) ) ;
2010-08-08 18:58:10 -04:00
connect ( ui . threadTreeWidget , SIGNAL ( itemClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( clickedThread ( QTreeWidgetItem * , int ) ) ) ;
2010-05-19 16:17:43 -04:00
connect ( ui . viewBox , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( changedViewBox ( ) ) ) ;
2008-04-15 12:40:38 -04:00
2010-05-19 16:17:43 -04:00
connect ( ui . expandButton , SIGNAL ( clicked ( ) ) , this , SLOT ( togglethreadview ( ) ) ) ;
connect ( ui . previousButton , SIGNAL ( clicked ( ) ) , this , SLOT ( previousMessage ( ) ) ) ;
connect ( ui . nextButton , SIGNAL ( clicked ( ) ) , this , SLOT ( nextMessage ( ) ) ) ;
2011-05-15 16:21:14 -04:00
connect ( ui . downloadButton , SIGNAL ( clicked ( ) ) , this , SLOT ( downloadAllFiles ( ) ) ) ;
2010-01-14 08:03:43 -05:00
2010-05-19 16:17:43 -04:00
connect ( ui . clearButton , SIGNAL ( clicked ( ) ) , this , SLOT ( clearFilter ( ) ) ) ;
connect ( ui . filterPatternLineEdit , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( filterRegExpChanged ( ) ) ) ;
connect ( ui . filterColumnComboBox , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( filterColumnChanged ( ) ) ) ;
2008-04-15 12:40:38 -04:00
2011-02-03 19:53:44 -05:00
/* Set initial size the splitter */
QList < int > sizes ;
sizes < < 300 < < width ( ) ; // Qt calculates the right sizes
ui . splitter - > setSizes ( sizes ) ;
2010-08-08 18:58:10 -04:00
/* Set own item delegate */
2010-11-09 18:56:02 -05:00
RSItemDelegate * itemDelegate = new RSItemDelegate ( this ) ;
itemDelegate - > removeFocusRect ( COLUMN_THREAD_READ ) ;
itemDelegate - > setSpacing ( QSize ( 0 , 2 ) ) ;
ui . threadTreeWidget - > setItemDelegate ( itemDelegate ) ;
2010-05-19 16:17:43 -04:00
/* Set header resize modes and initial section sizes */
QHeaderView * ttheader = ui . threadTreeWidget - > header ( ) ;
2010-08-08 18:58:10 -04:00
ttheader - > setResizeMode ( COLUMN_THREAD_TITLE , QHeaderView : : Interactive ) ;
2010-10-03 18:29:03 -04:00
ttheader - > resizeSection ( COLUMN_THREAD_DATE , 140 ) ;
ttheader - > resizeSection ( COLUMN_THREAD_TITLE , 290 ) ;
2010-05-01 15:03:35 -04:00
2010-08-08 18:58:10 -04:00
ui . threadTreeWidget - > sortItems ( COLUMN_THREAD_DATE , Qt : : DescendingOrder ) ;
2008-08-12 08:24:47 -04:00
2010-08-08 18:58:10 -04:00
/* Set text of column "Read" to empty - without this the column has a number as header text */
QTreeWidgetItem * headerItem = ui . threadTreeWidget - > headerItem ( ) ;
headerItem - > setText ( COLUMN_THREAD_READ , " " ) ;
2009-09-13 09:25:24 -04:00
2010-05-19 16:17:43 -04:00
m_ForumNameFont = QFont ( " Times " , 12 , QFont : : Bold ) ;
ui . forumName - > setFont ( m_ForumNameFont ) ;
ui . threadTitle - > setFont ( m_ForumNameFont ) ;
2010-05-01 15:03:35 -04:00
2011-01-04 15:19:45 -05:00
/* Initialize group tree */
ui . forumTreeWidget - > initDisplayMenu ( ui . displayButton ) ;
2010-05-01 15:03:35 -04:00
/* create forum tree */
2010-12-26 19:15:25 -05:00
yourForums = ui . forumTreeWidget - > addCategoryItem ( tr ( " Your Forums " ) , QIcon ( IMAGE_FOLDER ) , true ) ;
subscribedForums = ui . forumTreeWidget - > addCategoryItem ( tr ( " Subscribed Forums " ) , QIcon ( IMAGE_FOLDERRED ) , true ) ;
popularForums = ui . forumTreeWidget - > addCategoryItem ( tr ( " Popular Forums " ) , QIcon ( IMAGE_FOLDERGREEN ) , false ) ;
otherForums = ui . forumTreeWidget - > addCategoryItem ( tr ( " Other Forums " ) , QIcon ( IMAGE_FOLDERYELLOW ) , false ) ;
2010-05-01 15:03:35 -04:00
2011-06-06 17:44:16 -04:00
lastViewType = - 1 ;
2008-04-09 08:57:26 -04:00
2010-05-19 16:17:43 -04:00
ui . clearButton - > hide ( ) ;
// load settings
processSettings ( true ) ;
2010-08-08 18:58:10 -04:00
/* Set header sizes for the fixed columns and resize modes, must be set after processSettings */
ttheader - > resizeSection ( COLUMN_THREAD_READ , 24 ) ;
ttheader - > setResizeMode ( COLUMN_THREAD_READ , QHeaderView : : Fixed ) ;
ttheader - > hideSection ( COLUMN_THREAD_CONTENT ) ;
2011-06-07 18:28:07 -04:00
ui . progressBar - > hide ( ) ;
fillThread = NULL ;
2010-08-08 18:58:10 -04:00
insertThreads ( ) ;
2011-05-02 17:50:20 -04:00
ui . threadTreeWidget - > installEventFilter ( this ) ;
2010-08-08 18:58:10 -04:00
/* Hide platform specific features */
2008-04-09 08:57:26 -04:00
# ifdef Q_WS_WIN
# endif
}
2010-05-19 16:17:43 -04:00
ForumsDialog : : ~ ForumsDialog ( )
{
2011-06-07 18:28:07 -04:00
if ( fillThread ) {
fillThread - > stop ( ) ;
delete ( fillThread ) ;
fillThread = NULL ;
}
2010-05-19 16:17:43 -04:00
// save settings
processSettings ( false ) ;
}
void ForumsDialog : : processSettings ( bool bLoad )
{
2010-05-20 17:53:27 -04:00
m_bProcessSettings = true ;
2010-05-19 16:17:43 -04:00
QHeaderView * pHeader = ui . threadTreeWidget - > header ( ) ;
2010-05-20 17:53:27 -04:00
Settings - > beginGroup ( QString ( " ForumsDialog " ) ) ;
2010-05-19 16:17:43 -04:00
if ( bLoad ) {
// load settings
// expandFiles
2010-05-20 17:53:27 -04:00
bool bValue = Settings - > value ( " expandButton " , true ) . toBool ( ) ;
2010-05-19 16:17:43 -04:00
ui . expandButton - > setChecked ( bValue ) ;
togglethreadview_internal ( ) ;
// filterColumn
2010-05-20 17:53:27 -04:00
int nValue = FilterColumnToComboBox ( Settings - > value ( " filterColumn " , true ) . toInt ( ) ) ;
2010-05-19 16:17:43 -04:00
ui . filterColumnComboBox - > setCurrentIndex ( nValue ) ;
// index of viewBox
2010-05-20 17:53:27 -04:00
ui . viewBox - > setCurrentIndex ( Settings - > value ( " viewBox " , VIEW_THREADED ) . toInt ( ) ) ;
2010-05-19 16:17:43 -04:00
// state of thread tree
2010-05-20 17:53:27 -04:00
pHeader - > restoreState ( Settings - > value ( " ThreadTree " ) . toByteArray ( ) ) ;
2010-05-19 16:17:43 -04:00
// state of splitter
2010-05-20 17:53:27 -04:00
ui . splitter - > restoreState ( Settings - > value ( " Splitter " ) . toByteArray ( ) ) ;
ui . threadSplitter - > restoreState ( Settings - > value ( " threadSplitter " ) . toByteArray ( ) ) ;
2010-05-19 16:17:43 -04:00
} else {
// save settings
// state of thread tree
2010-05-20 17:53:27 -04:00
Settings - > setValue ( " ThreadTree " , pHeader - > saveState ( ) ) ;
2010-05-19 16:17:43 -04:00
// state of splitter
2010-05-20 17:53:27 -04:00
Settings - > setValue ( " Splitter " , ui . splitter - > saveState ( ) ) ;
Settings - > setValue ( " threadSplitter " , ui . threadSplitter - > saveState ( ) ) ;
2010-05-19 16:17:43 -04:00
}
2010-05-20 17:53:27 -04:00
2011-01-04 15:19:45 -05:00
ui . forumTreeWidget - > processSettings ( Settings , bLoad ) ;
2010-05-20 17:53:27 -04:00
Settings - > endGroup ( ) ;
m_bProcessSettings = false ;
2010-05-19 16:17:43 -04:00
}
2008-04-09 08:57:26 -04:00
void ForumsDialog : : forumListCustomPopupMenu ( QPoint point )
{
2010-05-01 15:03:35 -04:00
QMenu contextMnu ( this ) ;
2010-11-15 18:33:32 -05:00
QAction * action = contextMnu . addAction ( QIcon ( IMAGE_SUBSCRIBE ) , tr ( " Subscribe to Forum " ) , this , SLOT ( subscribeToForum ( ) ) ) ;
2011-06-07 18:28:07 -04:00
action - > setDisabled ( mCurrForumId . empty ( ) | | IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
2010-05-01 15:03:35 -04:00
2010-11-15 18:33:32 -05:00
action = contextMnu . addAction ( QIcon ( IMAGE_UNSUBSCRIBE ) , tr ( " Unsubscribe to Forum " ) , this , SLOT ( unsubscribeToForum ( ) ) ) ;
2011-06-07 18:28:07 -04:00
action - > setEnabled ( ! mCurrForumId . empty ( ) & & IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
2010-05-01 15:03:35 -04:00
2010-11-15 18:33:32 -05:00
contextMnu . addSeparator ( ) ;
2010-05-01 15:03:35 -04:00
2010-11-15 18:33:32 -05:00
contextMnu . addAction ( QIcon ( IMAGE_NEWFORUM ) , tr ( " New Forum " ) , this , SLOT ( newforum ( ) ) ) ;
2010-05-01 15:03:35 -04:00
2010-11-15 18:33:32 -05:00
action = contextMnu . addAction ( QIcon ( IMAGE_INFO ) , tr ( " Show Forum Details " ) , this , SLOT ( showForumDetails ( ) ) ) ;
action - > setEnabled ( ! mCurrForumId . empty ( ) ) ;
2010-09-14 15:38:47 -04:00
2010-11-15 18:33:32 -05:00
action = contextMnu . addAction ( QIcon ( " :/images/settings16.png " ) , tr ( " Edit Forum Details " ) , this , SLOT ( editForumDetails ( ) ) ) ;
2011-06-07 18:28:07 -04:00
action - > setEnabled ( ! mCurrForumId . empty ( ) & & IS_FORUM_ADMIN ( subscribeFlags ) ) ;
2010-01-02 17:50:56 -05:00
2011-02-08 17:34:54 -05:00
QAction * restoreKeysAct = new QAction ( QIcon ( " :/images/settings16.png " ) , tr ( " Restore Publish Rights for Forum " ) , & contextMnu ) ;
connect ( restoreKeysAct , SIGNAL ( triggered ( ) ) , this , SLOT ( restoreForumKeys ( ) ) ) ;
2011-06-07 18:28:07 -04:00
restoreKeysAct - > setEnabled ( ! mCurrForumId . empty ( ) & & ! IS_FORUM_ADMIN ( subscribeFlags ) ) ;
2011-02-08 17:34:54 -05:00
contextMnu . addAction ( restoreKeysAct ) ;
2011-04-19 15:42:44 -04:00
action = contextMnu . addAction ( QIcon ( IMAGE_COPYLINK ) , tr ( " Copy RetroShare Link " ) , this , SLOT ( copyForumLink ( ) ) ) ;
action - > setEnabled ( ! mCurrForumId . empty ( ) ) ;
2010-05-01 15:03:35 -04:00
contextMnu . addSeparator ( ) ;
2010-11-15 18:33:32 -05:00
action = contextMnu . addAction ( QIcon ( " :/images/message-mail-read.png " ) , tr ( " Mark all as read " ) , this , SLOT ( markMsgAsReadAll ( ) ) ) ;
2011-06-07 18:28:07 -04:00
action - > setEnabled ( ! mCurrForumId . empty ( ) & & IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
2010-11-15 18:33:32 -05:00
action = contextMnu . addAction ( QIcon ( " :/images/message-mail.png " ) , tr ( " Mark all as unread " ) , this , SLOT ( markMsgAsUnreadAll ( ) ) ) ;
2011-06-07 18:28:07 -04:00
action - > setEnabled ( ! mCurrForumId . empty ( ) & & IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
2011-06-06 17:44:16 -04:00
# ifdef DEBUG_FORUMS
contextMnu . addSeparator ( ) ;
action = contextMnu . addAction ( " Generate mass data " , this , SLOT ( generateMassData ( ) ) ) ;
2011-06-07 18:28:07 -04:00
action - > setEnabled ( ! mCurrForumId . empty ( ) & & IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
2011-06-06 17:44:16 -04:00
# endif
2010-05-14 16:55:44 -04:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
2008-04-09 08:57:26 -04:00
}
void ForumsDialog : : threadListCustomPopupMenu ( QPoint point )
{
2011-06-07 18:28:07 -04:00
if ( fillThread ) {
return ;
}
2010-05-01 15:03:35 -04:00
QMenu contextMnu ( this ) ;
2008-04-09 08:57:26 -04:00
2010-07-15 07:25:34 -04:00
QAction * replyAct = new QAction ( QIcon ( IMAGE_MESSAGEREPLY ) , tr ( " Reply " ) , & contextMnu ) ;
2010-05-01 15:03:35 -04:00
connect ( replyAct , SIGNAL ( triggered ( ) ) , this , SLOT ( createmessage ( ) ) ) ;
2008-04-09 08:57:26 -04:00
2010-07-15 07:25:34 -04:00
QAction * newthreadAct = new QAction ( QIcon ( IMAGE_DOWNLOADALL ) , tr ( " Start New Thread " ) , & contextMnu ) ;
2011-06-07 18:28:07 -04:00
newthreadAct - > setEnabled ( IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
2010-08-08 18:58:10 -04:00
connect ( newthreadAct , SIGNAL ( triggered ( ) ) , this , SLOT ( createthread ( ) ) ) ;
2008-04-09 08:57:26 -04:00
2010-07-15 07:25:34 -04:00
QAction * replyauthorAct = new QAction ( QIcon ( IMAGE_MESSAGEREPLY ) , tr ( " Reply to Author " ) , & contextMnu ) ;
2010-05-01 15:03:35 -04:00
connect ( replyauthorAct , SIGNAL ( triggered ( ) ) , this , SLOT ( replytomessage ( ) ) ) ;
2008-04-09 08:57:26 -04:00
2010-07-15 07:25:34 -04:00
QAction * expandAll = new QAction ( tr ( " Expand all " ) , & contextMnu ) ;
2010-05-01 15:03:35 -04:00
connect ( expandAll , SIGNAL ( triggered ( ) ) , ui . threadTreeWidget , SLOT ( expandAll ( ) ) ) ;
2008-04-09 08:57:26 -04:00
2010-07-15 07:25:34 -04:00
QAction * collapseAll = new QAction ( tr ( " Collapse all " ) , & contextMnu ) ;
2010-05-01 15:03:35 -04:00
connect ( collapseAll , SIGNAL ( triggered ( ) ) , ui . threadTreeWidget , SLOT ( collapseAll ( ) ) ) ;
2010-08-08 18:58:10 -04:00
QAction * markMsgAsRead = new QAction ( QIcon ( " :/images/message-mail-read.png " ) , tr ( " Mark as read " ) , & contextMnu ) ;
connect ( markMsgAsRead , SIGNAL ( triggered ( ) ) , this , SLOT ( markMsgAsRead ( ) ) ) ;
2010-11-15 18:33:32 -05:00
QAction * markMsgAsReadChildren = new QAction ( QIcon ( " :/images/message-mail-read.png " ) , tr ( " Mark as read " ) + " ( " + tr ( " with children " ) + " ) " , & contextMnu ) ;
connect ( markMsgAsReadChildren , SIGNAL ( triggered ( ) ) , this , SLOT ( markMsgAsReadChildren ( ) ) ) ;
2010-08-08 18:58:10 -04:00
QAction * markMsgAsUnread = new QAction ( QIcon ( " :/images/message-mail.png " ) , tr ( " Mark as unread " ) , & contextMnu ) ;
connect ( markMsgAsUnread , SIGNAL ( triggered ( ) ) , this , SLOT ( markMsgAsUnread ( ) ) ) ;
2010-11-15 18:33:32 -05:00
QAction * markMsgAsUnreadChildren = new QAction ( QIcon ( " :/images/message-mail.png " ) , tr ( " Mark as unread " ) + " ( " + tr ( " with children " ) + " ) " , & contextMnu ) ;
connect ( markMsgAsUnreadChildren , SIGNAL ( triggered ( ) ) , this , SLOT ( markMsgAsUnreadChildren ( ) ) ) ;
2010-08-08 18:58:10 -04:00
2011-06-07 18:28:07 -04:00
if ( IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) {
2010-08-08 18:58:10 -04:00
QList < QTreeWidgetItem * > Rows ;
QList < QTreeWidgetItem * > RowsRead ;
QList < QTreeWidgetItem * > RowsUnread ;
int nCount = getSelectedMsgCount ( & Rows , & RowsRead , & RowsUnread ) ;
if ( RowsUnread . size ( ) = = 0 ) {
markMsgAsRead - > setDisabled ( true ) ;
}
if ( RowsRead . size ( ) = = 0 ) {
markMsgAsUnread - > setDisabled ( true ) ;
}
bool bHasUnreadChildren = false ;
bool bHasReadChildren = false ;
int nRowCount = Rows . count ( ) ;
for ( int i = 0 ; i < nRowCount ; i + + ) {
if ( bHasUnreadChildren | | Rows [ i ] - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_UNREADCHILDREN ) . toBool ( ) ) {
bHasUnreadChildren = true ;
}
if ( bHasReadChildren | | Rows [ i ] - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_READCHILDREN ) . toBool ( ) ) {
bHasReadChildren = true ;
}
}
2010-11-15 18:33:32 -05:00
markMsgAsReadChildren - > setEnabled ( bHasUnreadChildren ) ;
markMsgAsUnreadChildren - > setEnabled ( bHasReadChildren ) ;
2010-08-08 18:58:10 -04:00
if ( nCount = = 1 ) {
2010-05-01 15:03:35 -04:00
replyAct - > setEnabled ( true ) ;
replyauthorAct - > setEnabled ( true ) ;
2010-09-13 19:35:21 -04:00
} else {
replyAct - > setDisabled ( true ) ;
replyauthorAct - > setDisabled ( true ) ;
2010-05-01 15:03:35 -04:00
}
2010-08-08 18:58:10 -04:00
} else {
markMsgAsRead - > setDisabled ( true ) ;
2010-11-15 18:33:32 -05:00
markMsgAsReadChildren - > setDisabled ( true ) ;
2010-08-08 18:58:10 -04:00
markMsgAsUnread - > setDisabled ( true ) ;
2010-11-15 18:33:32 -05:00
markMsgAsUnreadChildren - > setDisabled ( true ) ;
2010-08-08 18:58:10 -04:00
replyAct - > setDisabled ( true ) ;
replyauthorAct - > setDisabled ( true ) ;
2010-05-01 15:03:35 -04:00
}
contextMnu . addAction ( replyAct ) ;
2010-06-23 18:11:42 -04:00
contextMnu . addAction ( newthreadAct ) ;
2010-05-01 15:03:35 -04:00
contextMnu . addAction ( replyauthorAct ) ;
2011-04-19 15:42:44 -04:00
QAction * action = contextMnu . addAction ( QIcon ( IMAGE_COPYLINK ) , tr ( " Copy RetroShare Link " ) , this , SLOT ( copyMessageLink ( ) ) ) ;
action - > setEnabled ( ! mCurrForumId . empty ( ) & & ! mCurrThreadId . empty ( ) ) ;
2010-05-01 15:03:35 -04:00
contextMnu . addSeparator ( ) ;
2010-08-08 18:58:10 -04:00
contextMnu . addAction ( markMsgAsRead ) ;
2010-11-15 18:33:32 -05:00
contextMnu . addAction ( markMsgAsReadChildren ) ;
2010-08-08 18:58:10 -04:00
contextMnu . addAction ( markMsgAsUnread ) ;
2010-11-15 18:33:32 -05:00
contextMnu . addAction ( markMsgAsUnreadChildren ) ;
2010-08-08 18:58:10 -04:00
contextMnu . addSeparator ( ) ;
2010-05-01 15:03:35 -04:00
contextMnu . addAction ( expandAll ) ;
contextMnu . addAction ( collapseAll ) ;
2010-05-14 16:55:44 -04:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
2008-04-09 08:57:26 -04:00
}
2011-05-02 17:50:20 -04:00
bool ForumsDialog : : eventFilter ( QObject * obj , QEvent * event )
{
if ( obj = = ui . threadTreeWidget ) {
if ( event - > type ( ) = = QEvent : : KeyPress ) {
QKeyEvent * keyEvent = static_cast < QKeyEvent * > ( event ) ;
if ( keyEvent & & keyEvent - > key ( ) = = Qt : : Key_Space ) {
// Space pressed
QTreeWidgetItem * item = ui . threadTreeWidget - > currentItem ( ) ;
clickedThread ( item , COLUMN_THREAD_READ ) ;
return true ; // eat event
}
}
}
// pass the event on to the parent class
return RsAutoUpdatePage : : eventFilter ( obj , event ) ;
}
2011-02-08 17:34:54 -05:00
void ForumsDialog : : restoreForumKeys ( void )
{
rsForums - > forumRestoreKeys ( mCurrForumId ) ;
}
2010-05-19 16:17:43 -04:00
void ForumsDialog : : togglethreadview ( )
2008-04-09 08:57:26 -04:00
{
2010-05-19 16:17:43 -04:00
// save state of button
2010-05-20 17:53:27 -04:00
Settings - > setValueToGroup ( " ForumsDialog " , " expandButton " , ui . expandButton - > isChecked ( ) ) ;
2008-04-09 08:57:26 -04:00
2010-05-19 16:17:43 -04:00
togglethreadview_internal ( ) ;
}
2008-04-09 08:57:26 -04:00
2010-05-19 16:17:43 -04:00
void ForumsDialog : : togglethreadview_internal ( )
{
if ( ui . expandButton - > isChecked ( ) ) {
ui . postText - > setVisible ( true ) ;
ui . expandButton - > setIcon ( QIcon ( QString ( " :/images/edit_remove24.png " ) ) ) ;
2010-09-13 11:11:20 -04:00
ui . expandButton - > setToolTip ( tr ( " Hide " ) ) ;
2010-05-19 16:17:43 -04:00
} else {
ui . postText - > setVisible ( false ) ;
ui . expandButton - > setIcon ( QIcon ( QString ( " :/images/edit_add24.png " ) ) ) ;
2010-09-13 11:11:20 -04:00
ui . expandButton - > setToolTip ( tr ( " Expand " ) ) ;
2010-05-19 16:17:43 -04:00
}
2008-04-15 12:40:38 -04:00
}
2010-07-05 15:41:46 -04:00
void ForumsDialog : : updateDisplay ( )
2008-04-15 12:40:38 -04:00
{
2010-05-19 16:17:43 -04:00
std : : list < std : : string > forumIds ;
std : : list < std : : string > : : iterator it ;
if ( ! rsForums )
return ;
2008-04-15 12:40:38 -04:00
2010-05-19 16:17:43 -04:00
if ( rsForums - > forumsChanged ( forumIds ) )
{
/* update Forums List */
insertForums ( ) ;
it = std : : find ( forumIds . begin ( ) , forumIds . end ( ) , mCurrForumId ) ;
if ( it ! = forumIds . end ( ) )
{
/* update threads as well */
insertThreads ( ) ;
}
}
2008-04-09 08:57:26 -04:00
}
2010-05-01 15:03:35 -04:00
static void CleanupItems ( QList < QTreeWidgetItem * > & Items )
2008-04-09 08:57:26 -04:00
{
2010-05-01 15:03:35 -04:00
QList < QTreeWidgetItem * > : : iterator Item ;
for ( Item = Items . begin ( ) ; Item ! = Items . end ( ) ; Item + + ) {
2010-05-17 17:42:18 -04:00
if ( * Item ) {
delete ( * Item ) ;
}
2010-05-01 15:03:35 -04:00
}
2011-06-09 19:16:56 -04:00
Items . clear ( ) ;
2008-04-09 08:57:26 -04:00
}
2010-12-26 19:15:25 -05:00
void ForumsDialog : : forumInfoToGroupItemInfo ( const ForumInfo & forumInfo , GroupItemInfo & groupItemInfo )
{
groupItemInfo . id = QString : : fromStdString ( forumInfo . forumId ) ;
groupItemInfo . name = QString : : fromStdWString ( forumInfo . forumName ) ;
groupItemInfo . description = QString : : fromStdWString ( forumInfo . forumDesc ) ;
groupItemInfo . popularity = forumInfo . pop ;
groupItemInfo . lastpost = QDateTime : : fromTime_t ( forumInfo . lastPost ) ;
if ( forumInfo . forumFlags & RS_DISTRIB_AUTHEN_REQ ) {
groupItemInfo . name + = " ( " + tr ( " AUTHD " ) + " ) " ;
groupItemInfo . icon = QIcon ( IMAGE_FORUMAUTHD ) ;
} else {
groupItemInfo . icon = QIcon ( IMAGE_FORUM ) ;
}
}
2008-04-09 08:57:26 -04:00
void ForumsDialog : : insertForums ( )
{
std : : list < ForumInfo > forumList ;
std : : list < ForumInfo > : : iterator it ;
if ( ! rsForums )
{
return ;
}
rsForums - > getForumList ( forumList ) ;
2010-12-26 19:15:25 -05:00
QList < GroupItemInfo > adminList ;
QList < GroupItemInfo > subList ;
QList < GroupItemInfo > popList ;
QList < GroupItemInfo > otherList ;
std : : multimap < uint32_t , GroupItemInfo > popMap ;
2008-04-09 08:57:26 -04:00
2010-12-26 19:15:25 -05:00
for ( it = forumList . begin ( ) ; it ! = forumList . end ( ) ; it + + ) {
2008-04-09 08:57:26 -04:00
/* sort it into Publish (Own), Subscribed, Popular and Other */
2008-12-05 19:30:56 -05:00
uint32_t flags = it - > subscribeFlags ;
2008-04-09 08:57:26 -04:00
2010-12-26 19:15:25 -05:00
GroupItemInfo groupItemInfo ;
forumInfoToGroupItemInfo ( * it , groupItemInfo ) ;
2008-04-09 08:57:26 -04:00
2010-12-26 19:15:25 -05:00
if ( flags & RS_DISTRIB_ADMIN ) {
adminList . push_back ( groupItemInfo ) ;
} else if ( flags & RS_DISTRIB_SUBSCRIBED ) {
/* subscribed forum */
subList . push_back ( groupItemInfo ) ;
} else {
2008-04-09 08:57:26 -04:00
/* rate the others by popularity */
2010-12-26 19:15:25 -05:00
popMap . insert ( std : : make_pair ( it - > pop , groupItemInfo ) ) ;
2008-04-09 08:57:26 -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 ;
uint32_t popLimit = 0 ;
2010-12-26 19:15:25 -05:00
std : : multimap < uint32_t , GroupItemInfo > : : reverse_iterator rit ;
2008-04-09 08:57:26 -04:00
for ( rit = popMap . rbegin ( ) ; ( ( rit ! = popMap . rend ( ) ) & & ( i < popCount ) ) ; rit + + , i + + ) ;
2010-12-26 19:15:25 -05:00
if ( rit ! = popMap . rend ( ) ) {
popLimit = rit - > first ;
}
2008-04-09 08:57:26 -04:00
2010-12-26 19:15:25 -05:00
for ( rit = popMap . rbegin ( ) ; rit ! = popMap . rend ( ) ; rit + + ) {
if ( rit - > second . popularity < ( int ) popLimit ) {
otherList . append ( rit - > second ) ;
} else {
popList . append ( rit - > second ) ;
}
2008-04-09 08:57:26 -04:00
}
/* now we can add them in as a tree! */
2010-12-26 19:15:25 -05:00
ui . forumTreeWidget - > fillGroupItems ( yourForums , adminList ) ;
ui . forumTreeWidget - > fillGroupItems ( subscribedForums , subList ) ;
ui . forumTreeWidget - > fillGroupItems ( popularForums , popList ) ;
ui . forumTreeWidget - > fillGroupItems ( otherForums , otherList ) ;
2010-12-25 07:52:29 -05:00
updateMessageSummaryList ( " " ) ;
2008-04-09 08:57:26 -04:00
}
2010-12-26 19:15:25 -05:00
void ForumsDialog : : changedForum ( const QString & id )
2008-04-09 08:57:26 -04:00
{
2010-12-26 19:15:25 -05:00
mCurrForumId = id . toStdString ( ) ;
2010-05-01 15:03:35 -04:00
2010-12-26 19:15:25 -05:00
insertThreads ( ) ;
2008-04-15 12:40:38 -04:00
}
2008-04-09 08:57:26 -04:00
2010-05-01 15:03:35 -04:00
void ForumsDialog : : changedThread ( )
2008-04-15 12:40:38 -04:00
{
2011-06-09 19:16:56 -04:00
if ( fillThread ) {
return ;
}
2010-05-01 15:03:35 -04:00
/* just grab the ids of the current item */
QTreeWidgetItem * curr = ui . threadTreeWidget - > currentItem ( ) ;
2008-04-09 08:57:26 -04:00
2010-05-01 15:03:35 -04:00
if ( ( ! curr ) | | ( ! curr - > isSelected ( ) ) ) {
2010-08-08 18:58:10 -04:00
mCurrThreadId = " " ;
2010-05-01 15:03:35 -04:00
} else {
2010-08-08 18:58:10 -04:00
mCurrThreadId = curr - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) . toString ( ) . toStdString ( ) ;
2010-05-01 15:03:35 -04:00
}
insertPost ( ) ;
2008-04-15 12:40:38 -04:00
}
2008-04-09 08:57:26 -04:00
2010-08-08 18:58:10 -04:00
void ForumsDialog : : clickedThread ( QTreeWidgetItem * item , int column )
{
2011-06-07 18:28:07 -04:00
if ( mCurrForumId . empty ( ) | | ! IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) {
2010-08-08 18:58:10 -04:00
return ;
}
if ( item = = NULL ) {
return ;
}
if ( column = = COLUMN_THREAD_READ ) {
QList < QTreeWidgetItem * > Rows ;
Rows . append ( item ) ;
uint32_t status = item - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
setMsgAsReadUnread ( Rows , IS_UNREAD ( status ) ) ;
return ;
}
}
void ForumsDialog : : CalculateIconsAndFonts ( QTreeWidgetItem * pItem , bool & bHasReadChilddren , bool & bHasUnreadChilddren )
{
uint32_t status = pItem - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
bool bUnread = IS_UNREAD ( status ) ;
2011-02-11 19:04:32 -05:00
bool missing = pItem - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MISSING ) . toBool ( ) ;
2010-08-08 18:58:10 -04:00
// set icon
2011-02-11 19:04:32 -05:00
if ( missing ) {
pItem - > setIcon ( COLUMN_THREAD_READ , QIcon ( ) ) ;
2010-08-08 18:58:10 -04:00
pItem - > setIcon ( COLUMN_THREAD_TITLE , QIcon ( ) ) ;
} else {
2011-02-11 19:04:32 -05:00
if ( bUnread ) {
pItem - > setIcon ( COLUMN_THREAD_READ , QIcon ( " :/images/message-state-unread.png " ) ) ;
} else {
pItem - > setIcon ( COLUMN_THREAD_READ , QIcon ( " :/images/message-state-read.png " ) ) ;
}
if ( status & FORUM_MSG_STATUS_READ ) {
pItem - > setIcon ( COLUMN_THREAD_TITLE , QIcon ( ) ) ;
} else {
pItem - > setIcon ( COLUMN_THREAD_TITLE , QIcon ( " :/images/message-state-new.png " ) ) ;
}
2010-08-08 18:58:10 -04:00
}
int nItem ;
int nItemCount = pItem - > childCount ( ) ;
bool bMyReadChilddren = false ;
bool bMyUnreadChilddren = false ;
for ( nItem = 0 ; nItem < nItemCount ; nItem + + ) {
CalculateIconsAndFonts ( pItem - > child ( nItem ) , bMyReadChilddren , bMyUnreadChilddren ) ;
}
// set font
for ( int i = 0 ; i < COLUMN_THREAD_COUNT ; i + + ) {
QFont qf = pItem - > font ( i ) ;
2010-11-13 17:42:20 -05:00
2011-06-07 18:28:07 -04:00
if ( ! IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) {
2010-11-13 17:42:20 -05:00
qf . setBold ( false ) ;
pItem - > setTextColor ( i , Qt : : black ) ;
} else if ( bUnread ) {
qf . setBold ( true ) ;
pItem - > setTextColor ( i , Qt : : black ) ;
} else if ( bMyUnreadChilddren ) {
qf . setBold ( true ) ;
pItem - > setTextColor ( i , Qt : : gray ) ;
} else {
qf . setBold ( false ) ;
pItem - > setTextColor ( i , Qt : : gray ) ;
}
2011-02-11 19:04:32 -05:00
if ( missing ) {
/* Missing message */
pItem - > setTextColor ( i , Qt : : darkRed ) ;
}
2010-08-08 18:58:10 -04:00
pItem - > setFont ( i , qf ) ;
}
pItem - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_READCHILDREN , bHasReadChilddren | | bMyReadChilddren ) ;
pItem - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_UNREADCHILDREN , bHasUnreadChilddren | | bMyUnreadChilddren ) ;
bHasReadChilddren = bHasReadChilddren | | bMyReadChilddren | | ! bUnread ;
bHasUnreadChilddren = bHasUnreadChilddren | | bMyUnreadChilddren | | bUnread ;
}
void ForumsDialog : : CalculateIconsAndFonts ( QTreeWidgetItem * pItem /*= NULL*/ )
{
bool bDummy1 = false ;
bool bDummy2 = false ;
if ( pItem ) {
CalculateIconsAndFonts ( pItem , bDummy1 , bDummy2 ) ;
return ;
}
int nItem ;
int nItemCount = ui . threadTreeWidget - > topLevelItemCount ( ) ;
for ( nItem = 0 ; nItem < nItemCount ; nItem + + ) {
bDummy1 = false ;
bDummy2 = false ;
CalculateIconsAndFonts ( ui . threadTreeWidget - > topLevelItem ( nItem ) , bDummy1 , bDummy2 ) ;
}
}
2011-06-07 18:28:07 -04:00
void ForumsDialog : : fillThreadFinished ( )
{
// thread has finished
if ( fillThread = = sender ( ) ) {
ui . progressBar - > hide ( ) ;
if ( fillThread - > wasStopped ( ) ) {
// thread was stopped
} else {
/* add all messages in! */
if ( lastViewType ! = fillThread - > viewType | | lastForumID ! = mCurrForumId ) {
ui . threadTreeWidget - > clear ( ) ;
lastViewType = fillThread - > viewType ;
lastForumID = mCurrForumId ;
ui . threadTreeWidget - > insertTopLevelItems ( 0 , fillThread - > items ) ;
// clear list
fillThread - > items . clear ( ) ;
} else {
FillThreads ( fillThread - > items , fillThread - > expandNewMessages , fillThread - > itemToExpand ) ;
// cleanup list
CleanupItems ( fillThread - > items ) ;
}
2011-06-09 19:16:56 -04:00
QList < QTreeWidgetItem * > : : iterator Item ;
for ( Item = fillThread - > itemToExpand . begin ( ) ; Item ! = fillThread - > itemToExpand . end ( ) ; Item + + ) {
if ( ( * Item ) - > isHidden ( ) = = false ) {
( * Item ) - > setExpanded ( true ) ;
}
}
2011-06-07 18:28:07 -04:00
fillThread - > itemToExpand . clear ( ) ;
if ( ui . filterPatternLineEdit - > text ( ) . isEmpty ( ) = = false ) {
FilterItems ( ) ;
}
insertPost ( ) ;
CalculateIconsAndFonts ( ) ;
ui . newmessageButton - > setEnabled ( IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
ui . newthreadButton - > setEnabled ( IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) ;
}
fillThread - > deleteLater ( ) ;
fillThread = NULL ;
}
}
void ForumsDialog : : fillThreadProgress ( int current , int count )
{
// show fill progress
if ( count ) {
ui . progressBar - > setValue ( current * ui . progressBar - > maximum ( ) / count ) ;
}
}
2008-04-15 12:40:38 -04:00
void ForumsDialog : : insertThreads ( )
{
2011-06-06 17:44:16 -04:00
# ifdef DEBUG_FORUMS
2010-05-19 16:17:43 -04:00
/* get the current Forum */
std : : cerr < < " ForumsDialog::insertThreads() " < < std : : endl ;
2011-06-06 17:44:16 -04:00
# endif
2008-04-09 08:57:26 -04:00
2011-06-07 18:28:07 -04:00
if ( fillThread ) {
// delete fill thread
fillThread - > stop ( ) ;
delete ( fillThread ) ;
fillThread = NULL ;
ui . progressBar - > hide ( ) ;
}
subscribeFlags = 0 ;
ui . newmessageButton - > setEnabled ( false ) ;
ui . newthreadButton - > setEnabled ( false ) ;
ui . postText - > clear ( ) ;
ui . threadTitle - > clear ( ) ;
2008-04-09 08:57:26 -04:00
2010-12-26 19:15:25 -05:00
if ( mCurrForumId . empty ( ) )
2010-05-19 16:17:43 -04:00
{
/* not an actual forum - clear */
ui . threadTreeWidget - > clear ( ) ;
/* when no Thread selected - clear */
ui . forumName - > clear ( ) ;
/* clear last stored forumID */
2010-08-08 18:58:10 -04:00
mCurrForumId . erase ( ) ;
2011-06-06 17:44:16 -04:00
lastForumID . erase ( ) ;
2011-06-07 18:28:07 -04:00
2011-06-06 17:44:16 -04:00
# ifdef DEBUG_FORUMS
2010-05-19 16:17:43 -04:00
std : : cerr < < " ForumsDialog::insertThreads() Current Thread Invalid " < < std : : endl ;
2011-06-06 17:44:16 -04:00
# endif
2008-04-15 12:40:38 -04:00
2010-05-19 16:17:43 -04:00
return ;
}
2009-09-09 17:17:03 -04:00
2010-08-08 18:58:10 -04:00
ForumInfo fi ;
2011-06-07 18:28:07 -04:00
if ( ! rsForums - > getForumInfo ( mCurrForumId , fi ) ) {
2010-08-08 18:58:10 -04:00
return ;
}
2011-06-07 18:28:07 -04:00
subscribeFlags = fi . subscribeFlags ;
ui . forumName - > setText ( QString : : fromStdWString ( fi . forumName ) ) ;
2010-05-01 15:03:35 -04:00
2011-06-07 18:28:07 -04:00
ui . progressBar - > show ( ) ;
2010-05-01 15:03:35 -04:00
2011-06-07 18:28:07 -04:00
// create fill thread
fillThread = new ForumsFillThread ( this ) ;
// set data
fillThread - > forumId = mCurrForumId ;
fillThread - > filterColumn = FilterColumnFromComboBox ( ui . filterColumnComboBox - > currentIndex ( ) ) ;
fillThread - > subscribeFlags = subscribeFlags ;
fillThread - > viewType = ui . viewBox - > currentIndex ( ) ;
if ( lastViewType ! = fillThread - > viewType | | lastForumID ! = mCurrForumId ) {
fillThread - > fillComplete = true ;
2010-05-19 16:17:43 -04:00
}
2010-05-01 15:03:35 -04:00
2011-06-07 18:28:07 -04:00
if ( fillThread - > viewType = = VIEW_FLAT ) {
ui . threadTreeWidget - > setRootIsDecorated ( false ) ;
} else {
ui . threadTreeWidget - > setRootIsDecorated ( true ) ;
2010-08-08 18:58:10 -04:00
}
2011-06-07 18:28:07 -04:00
// connect thread
connect ( fillThread , SIGNAL ( finished ( ) ) , this , SLOT ( fillThreadFinished ( ) ) ) ;
connect ( fillThread , SIGNAL ( progress ( int , int ) ) , this , SLOT ( fillThreadProgress ( int , int ) ) ) ;
// start thread
fillThread - > start ( ) ;
2008-04-09 08:57:26 -04:00
}
2011-06-07 18:28:07 -04:00
void ForumsDialog : : FillThreads ( QList < QTreeWidgetItem * > & ThreadList , bool expandNewMessages , QList < QTreeWidgetItem * > & itemToExpand )
2008-04-09 08:57:26 -04:00
{
2010-05-12 18:23:05 -04:00
int Index = 0 ;
2010-05-01 15:03:35 -04:00
QTreeWidgetItem * Thread ;
2010-05-17 17:42:18 -04:00
QList < QTreeWidgetItem * > : : iterator NewThread ;
// delete not existing
while ( Index < ui . threadTreeWidget - > topLevelItemCount ( ) ) {
Thread = ui . threadTreeWidget - > topLevelItem ( Index ) ;
// search existing new thread
int Found = - 1 ;
for ( NewThread = ThreadList . begin ( ) ; NewThread ! = ThreadList . end ( ) ; NewThread + + ) {
2010-08-08 18:58:10 -04:00
if ( Thread - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) = = ( * NewThread ) - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) ) {
2010-05-17 17:42:18 -04:00
// found it
Found = Index ;
break ;
}
}
if ( Found > = 0 ) {
Index + + ;
} else {
delete ( ui . threadTreeWidget - > takeTopLevelItem ( Index ) ) ;
}
}
2010-05-01 15:03:35 -04:00
// iterate all new threads
for ( NewThread = ThreadList . begin ( ) ; NewThread ! = ThreadList . end ( ) ; NewThread + + ) {
// search existing thread
int Found = - 1 ;
int Count = ui . threadTreeWidget - > topLevelItemCount ( ) ;
for ( Index = 0 ; Index < Count ; Index + + ) {
Thread = ui . threadTreeWidget - > topLevelItem ( Index ) ;
2010-08-08 18:58:10 -04:00
if ( Thread - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) = = ( * NewThread ) - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) ) {
2010-05-01 15:03:35 -04:00
// found it
Found = Index ;
break ;
}
}
2010-08-08 18:58:10 -04:00
2010-05-01 15:03:35 -04:00
if ( Found > = 0 ) {
// set child data
2010-08-08 18:58:10 -04:00
int i ;
for ( i = 0 ; i < COLUMN_THREAD_COUNT ; i + + ) {
2010-05-01 15:03:35 -04:00
Thread - > setText ( i , ( * NewThread ) - > text ( i ) ) ;
}
2010-08-08 18:58:10 -04:00
for ( i = 0 ; i < ROLE_THREAD_COUNT ; i + + ) {
Thread - > setData ( COLUMN_THREAD_DATA , Qt : : UserRole + i , ( * NewThread ) - > data ( COLUMN_THREAD_DATA , Qt : : UserRole + i ) ) ;
}
2010-05-01 15:03:35 -04:00
// fill recursive
2011-06-06 17:44:16 -04:00
FillChildren ( Thread , * NewThread , expandNewMessages , itemToExpand ) ;
2010-05-01 15:03:35 -04:00
} else {
// add new thread
2010-05-17 17:42:18 -04:00
ui . threadTreeWidget - > addTopLevelItem ( * NewThread ) ;
2010-08-08 18:58:10 -04:00
Thread = * NewThread ;
2010-05-17 17:42:18 -04:00
* NewThread = NULL ;
2010-05-01 15:03:35 -04:00
}
2010-08-08 18:58:10 -04:00
uint32_t status = Thread - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
2011-06-06 17:44:16 -04:00
if ( expandNewMessages & & IS_UNREAD ( status ) ) {
2010-08-08 18:58:10 -04:00
QTreeWidgetItem * pParent = Thread ;
while ( ( pParent = pParent - > parent ( ) ) ! = NULL ) {
if ( std : : find ( itemToExpand . begin ( ) , itemToExpand . end ( ) , pParent ) = = itemToExpand . end ( ) ) {
itemToExpand . push_back ( pParent ) ;
}
}
}
2010-05-01 15:03:35 -04:00
}
2010-05-17 17:42:18 -04:00
}
2010-05-01 15:03:35 -04:00
2011-06-07 18:28:07 -04:00
void ForumsDialog : : FillChildren ( QTreeWidgetItem * Parent , QTreeWidgetItem * NewParent , bool expandNewMessages , QList < QTreeWidgetItem * > & itemToExpand )
2010-05-17 17:42:18 -04:00
{
int Index = 0 ;
int NewIndex ;
int NewCount = NewParent - > childCount ( ) ;
2010-05-01 15:03:35 -04:00
2010-05-17 17:42:18 -04:00
QTreeWidgetItem * Child ;
QTreeWidgetItem * NewChild ;
// delete not existing
while ( Index < Parent - > childCount ( ) ) {
Child = Parent - > child ( Index ) ;
// search existing new child
2010-05-01 15:03:35 -04:00
int Found = - 1 ;
2010-05-17 17:42:18 -04:00
int Count = NewParent - > childCount ( ) ;
for ( NewIndex = 0 ; NewIndex < Count ; NewIndex + + ) {
NewChild = NewParent - > child ( NewIndex ) ;
2010-08-08 18:58:10 -04:00
if ( NewChild - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) = = Child - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) ) {
2010-05-01 15:03:35 -04:00
// found it
Found = Index ;
break ;
}
}
if ( Found > = 0 ) {
Index + + ;
} else {
2010-05-17 17:42:18 -04:00
delete ( Parent - > takeChild ( Index ) ) ;
2010-05-01 15:03:35 -04:00
}
}
// iterate all new children
for ( NewIndex = 0 ; NewIndex < NewCount ; NewIndex + + ) {
NewChild = NewParent - > child ( NewIndex ) ;
// search existing child
int Found = - 1 ;
int Count = Parent - > childCount ( ) ;
for ( Index = 0 ; Index < Count ; Index + + ) {
Child = Parent - > child ( Index ) ;
2010-08-08 18:58:10 -04:00
if ( Child - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) = = NewChild - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) ) {
2010-05-01 15:03:35 -04:00
// found it
Found = Index ;
break ;
}
}
2010-08-08 18:58:10 -04:00
2010-05-01 15:03:35 -04:00
if ( Found > = 0 ) {
// set child data
2010-08-08 18:58:10 -04:00
int i ;
for ( i = 0 ; i < COLUMN_THREAD_COUNT ; i + + ) {
2010-05-01 15:03:35 -04:00
Child - > setText ( i , NewChild - > text ( i ) ) ;
}
2010-08-08 18:58:10 -04:00
for ( i = 0 ; i < ROLE_THREAD_COUNT ; i + + ) {
Child - > setData ( COLUMN_THREAD_DATA , Qt : : UserRole + i , NewChild - > data ( COLUMN_THREAD_DATA , Qt : : UserRole + i ) ) ;
}
2010-05-01 15:03:35 -04:00
// fill recursive
2011-06-06 17:44:16 -04:00
FillChildren ( Child , NewChild , expandNewMessages , itemToExpand ) ;
2010-05-01 15:03:35 -04:00
} else {
// add new child
2010-08-08 18:58:10 -04:00
Child = NewParent - > takeChild ( NewIndex ) ;
Parent - > addChild ( Child ) ;
2010-05-17 17:42:18 -04:00
NewIndex - - ;
NewCount - - ;
2010-05-01 15:03:35 -04:00
}
2010-08-08 18:58:10 -04:00
uint32_t status = Child - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
2011-06-06 17:44:16 -04:00
if ( expandNewMessages & & IS_UNREAD ( status ) ) {
2010-08-08 18:58:10 -04:00
QTreeWidgetItem * pParent = Child ;
while ( ( pParent = pParent - > parent ( ) ) ! = NULL ) {
if ( std : : find ( itemToExpand . begin ( ) , itemToExpand . end ( ) , pParent ) = = itemToExpand . end ( ) ) {
itemToExpand . push_back ( pParent ) ;
}
}
}
2010-05-01 15:03:35 -04:00
}
}
2008-04-09 08:57:26 -04:00
void ForumsDialog : : insertPost ( )
{
2010-08-08 18:58:10 -04:00
if ( ( mCurrForumId = = " " ) | | ( mCurrThreadId = = " " ) )
2010-05-19 16:17:43 -04:00
{
ui . postText - > setText ( " " ) ;
ui . threadTitle - > setText ( " " ) ;
ui . previousButton - > setEnabled ( false ) ;
ui . nextButton - > setEnabled ( false ) ;
2010-09-13 19:35:21 -04:00
ui . newmessageButton - > setEnabled ( false ) ;
2010-05-19 16:17:43 -04:00
return ;
}
2008-04-09 08:57:26 -04:00
2010-05-19 16:17:43 -04:00
QTreeWidgetItem * curr = ui . threadTreeWidget - > currentItem ( ) ;
if ( curr ) {
QTreeWidgetItem * Parent = curr - > parent ( ) ;
int Index = Parent ? Parent - > indexOfChild ( curr ) : ui . threadTreeWidget - > indexOfTopLevelItem ( curr ) ;
int Count = Parent ? Parent - > childCount ( ) : ui . threadTreeWidget - > topLevelItemCount ( ) ;
ui . previousButton - > setEnabled ( Index > 0 ) ;
ui . nextButton - > setEnabled ( Index < Count - 1 ) ;
} else {
// there is something wrong
ui . previousButton - > setEnabled ( false ) ;
ui . nextButton - > setEnabled ( false ) ;
}
2010-05-01 15:03:35 -04:00
2011-06-07 18:28:07 -04:00
ui . newmessageButton - > setEnabled ( IS_FORUM_SUBSCRIBED ( subscribeFlags ) & & mCurrThreadId . empty ( ) = = false ) ;
2010-09-13 19:35:21 -04:00
2010-05-19 16:17:43 -04:00
/* get the Post */
ForumMsgInfo msg ;
2010-08-08 18:58:10 -04:00
if ( ! rsForums - > getForumMessage ( mCurrForumId , mCurrThreadId , msg ) )
2010-05-19 16:17:43 -04:00
{
ui . postText - > setText ( " " ) ;
return ;
}
2010-05-01 15:03:35 -04:00
2010-08-08 18:58:10 -04:00
bool bSetToReadOnActive = Settings - > getForumMsgSetToReadOnActivate ( ) ;
uint32_t status = curr - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
QList < QTreeWidgetItem * > Row ;
Row . append ( curr ) ;
if ( status & FORUM_MSG_STATUS_READ ) {
if ( bSetToReadOnActive & & ( status & FORUM_MSG_STATUS_UNREAD_BY_USER ) ) {
/* set to read */
setMsgAsReadUnread ( Row , true ) ;
}
} else {
/* set to read */
if ( bSetToReadOnActive ) {
setMsgAsReadUnread ( Row , true ) ;
} else {
/* set to unread by user */
setMsgAsReadUnread ( Row , false ) ;
}
2010-05-19 16:17:43 -04:00
}
2010-05-01 15:03:35 -04:00
2010-12-30 12:09:32 -05:00
QString extraTxt = RsHtml : : formatText ( QString : : fromStdWString ( msg . msg ) , RSHTML_FORMATTEXT_EMBED_SMILEYS | RSHTML_FORMATTEXT_EMBED_LINKS ) ;
2008-04-09 08:57:26 -04:00
2010-05-19 16:17:43 -04:00
ui . postText - > setHtml ( extraTxt ) ;
2010-08-08 18:58:10 -04:00
ui . threadTitle - > setText ( QString : : fromStdWString ( msg . title ) ) ;
2008-04-09 08:57:26 -04:00
}
2010-05-01 15:03:35 -04:00
void ForumsDialog : : previousMessage ( )
{
QTreeWidgetItem * Item = ui . threadTreeWidget - > currentItem ( ) ;
if ( Item = = NULL ) {
return ;
}
2008-04-09 08:57:26 -04:00
2010-05-01 15:03:35 -04:00
QTreeWidgetItem * Parent = Item - > parent ( ) ;
int Index = Parent ? Parent - > indexOfChild ( Item ) : ui . threadTreeWidget - > indexOfTopLevelItem ( Item ) ;
if ( Index > 0 ) {
QTreeWidgetItem * Previous = Parent ? Parent - > child ( Index - 1 ) : ui . threadTreeWidget - > topLevelItem ( Index - 1 ) ;
if ( Previous ) {
ui . threadTreeWidget - > setCurrentItem ( Previous ) ;
}
}
}
void ForumsDialog : : nextMessage ( )
{
QTreeWidgetItem * Item = ui . threadTreeWidget - > currentItem ( ) ;
if ( Item = = NULL ) {
return ;
}
QTreeWidgetItem * Parent = Item - > parent ( ) ;
int Index = Parent ? Parent - > indexOfChild ( Item ) : ui . threadTreeWidget - > indexOfTopLevelItem ( Item ) ;
int Count = Parent ? Parent - > childCount ( ) : ui . threadTreeWidget - > topLevelItemCount ( ) ;
if ( Index < Count - 1 ) {
QTreeWidgetItem * Next = Parent ? Parent - > child ( Index + 1 ) : ui . threadTreeWidget - > topLevelItem ( Index + 1 ) ;
if ( Next ) {
ui . threadTreeWidget - > setCurrentItem ( Next ) ;
}
}
}
2011-05-15 16:21:14 -04:00
void ForumsDialog : : downloadAllFiles ( )
{
QStringList urls ;
if ( RsHtml : : findAnchors ( ui . postText - > toHtml ( ) , urls ) = = false ) {
return ;
}
if ( urls . count ( ) = = 0 ) {
return ;
}
RetroShareLink : : process ( urls , RetroShareLink : : TYPE_FILE , true ) ;
}
2010-05-01 15:03:35 -04:00
// TODO
2010-08-08 18:58:10 -04:00
#if 0
2008-04-09 08:57:26 -04:00
void ForumsDialog : : removemessage ( )
{
//std::cerr << "ForumsDialog::removemessage()" << std::endl;
std : : string cid , mid ;
if ( ! getCurrentMsg ( cid , mid ) )
{
//std::cerr << "ForumsDialog::removemessage()";
//std::cerr << " No Message selected" << std::endl;
return ;
}
rsMsgs - > MessageDelete ( mid ) ;
2010-08-08 18:58:10 -04:00
}
2008-04-09 08:57:26 -04:00
# endif
2010-08-08 18:58:10 -04:00
/* get selected messages
the messages tree is single selected , but who knows . . . */
int ForumsDialog : : getSelectedMsgCount ( QList < QTreeWidgetItem * > * pRows , QList < QTreeWidgetItem * > * pRowsRead , QList < QTreeWidgetItem * > * pRowsUnread )
{
if ( pRowsRead ) pRowsRead - > clear ( ) ;
if ( pRowsUnread ) pRowsUnread - > clear ( ) ;
QList < QTreeWidgetItem * > selectedItems = ui . threadTreeWidget - > selectedItems ( ) ;
for ( QList < QTreeWidgetItem * > : : iterator it = selectedItems . begin ( ) ; it ! = selectedItems . end ( ) ; it + + ) {
if ( pRows ) pRows - > append ( * it ) ;
if ( pRowsRead | | pRowsUnread ) {
uint32_t status = ( * it ) - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
if ( IS_UNREAD ( status ) ) {
if ( pRowsUnread ) pRowsUnread - > append ( * it ) ;
} else {
if ( pRowsRead ) pRowsRead - > append ( * it ) ;
}
}
}
return selectedItems . size ( ) ;
2008-04-09 08:57:26 -04:00
}
2010-08-08 18:58:10 -04:00
void ForumsDialog : : setMsgAsReadUnread ( QList < QTreeWidgetItem * > & Rows , bool bRead )
{
QList < QTreeWidgetItem * > : : iterator Row ;
2010-08-11 04:31:11 -04:00
std : : list < QTreeWidgetItem * > changedItems ;
2008-04-09 08:57:26 -04:00
2010-08-08 18:58:10 -04:00
for ( Row = Rows . begin ( ) ; Row ! = Rows . end ( ) ; Row + + ) {
2011-02-11 19:04:32 -05:00
if ( ( * Row ) - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MISSING ) . toBool ( ) ) {
/* Missing message */
continue ;
}
2010-08-08 18:58:10 -04:00
uint32_t status = ( * Row ) - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
/* set always as read ... */
uint32_t statusNew = status | FORUM_MSG_STATUS_READ ;
if ( bRead ) {
/* ... and as read by user */
statusNew & = ~ FORUM_MSG_STATUS_UNREAD_BY_USER ;
} else {
/* ... and as unread by user */
statusNew | = FORUM_MSG_STATUS_UNREAD_BY_USER ;
}
if ( status ! = statusNew ) {
std : : string msgId = ( * Row ) - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) . toString ( ) . toStdString ( ) ;
rsForums - > setMessageStatus ( mCurrForumId , msgId , statusNew , FORUM_MSG_STATUS_READ | FORUM_MSG_STATUS_UNREAD_BY_USER ) ;
( * Row ) - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS , statusNew ) ;
2010-08-11 04:31:11 -04:00
QTreeWidgetItem * parentItem = * Row ;
while ( parentItem - > parent ( ) ) {
parentItem = parentItem - > parent ( ) ;
}
if ( std : : find ( changedItems . begin ( ) , changedItems . end ( ) , parentItem ) = = changedItems . end ( ) ) {
changedItems . push_back ( parentItem ) ;
}
2010-08-08 18:58:10 -04:00
}
}
2010-08-11 04:31:11 -04:00
if ( changedItems . size ( ) ) {
for ( std : : list < QTreeWidgetItem * > : : iterator it = changedItems . begin ( ) ; it ! = changedItems . end ( ) ; it + + ) {
CalculateIconsAndFonts ( * it ) ;
}
2010-08-09 17:20:34 -04:00
updateMessageSummaryList ( mCurrForumId ) ;
2010-08-08 18:58:10 -04:00
}
}
2010-11-15 18:33:32 -05:00
void ForumsDialog : : markMsgAsReadUnread ( bool bRead , bool bChildren , bool bForum )
2008-04-09 08:57:26 -04:00
{
2011-06-07 18:28:07 -04:00
if ( mCurrForumId . empty ( ) | | ! IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) {
2010-08-08 18:58:10 -04:00
return ;
}
2008-04-09 08:57:26 -04:00
2010-08-08 18:58:10 -04:00
/* get selected messages */
QList < QTreeWidgetItem * > Rows ;
2010-11-15 18:33:32 -05:00
if ( bForum ) {
int itemCount = ui . threadTreeWidget - > topLevelItemCount ( ) ;
for ( int item = 0 ; item < itemCount ; item + + ) {
Rows . push_back ( ui . threadTreeWidget - > topLevelItem ( item ) ) ;
}
} else {
getSelectedMsgCount ( & Rows , NULL , NULL ) ;
}
2008-04-09 08:57:26 -04:00
2010-11-15 18:33:32 -05:00
if ( bChildren ) {
2010-08-08 18:58:10 -04:00
/* add children */
QList < QTreeWidgetItem * > AllRows ;
2008-04-09 08:57:26 -04:00
2010-08-08 18:58:10 -04:00
while ( Rows . isEmpty ( ) = = false ) {
QTreeWidgetItem * pRow = Rows . takeFirst ( ) ;
/* add only items with the right state or with not FORUM_MSG_STATUS_READ */
uint32_t status = pRow - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS ) . toUInt ( ) ;
if ( IS_UNREAD ( status ) = = bRead | | ( status & FORUM_MSG_STATUS_READ ) = = 0 ) {
AllRows . append ( pRow ) ;
}
for ( int i = 0 ; i < pRow - > childCount ( ) ; i + + ) {
/* add child to main list and let the main loop do the work */
Rows . append ( pRow - > child ( i ) ) ;
}
}
if ( AllRows . isEmpty ( ) ) {
/* nothing to do */
return ;
}
setMsgAsReadUnread ( AllRows , bRead ) ;
2008-04-09 08:57:26 -04:00
2010-08-08 18:58:10 -04:00
return ;
}
setMsgAsReadUnread ( Rows , bRead ) ;
}
void ForumsDialog : : markMsgAsRead ( )
{
2010-11-15 18:33:32 -05:00
markMsgAsReadUnread ( true , false , false ) ;
}
void ForumsDialog : : markMsgAsReadChildren ( )
{
markMsgAsReadUnread ( true , true , false ) ;
2010-08-08 18:58:10 -04:00
}
2008-04-09 08:57:26 -04:00
2010-08-08 18:58:10 -04:00
void ForumsDialog : : markMsgAsReadAll ( )
{
2010-11-15 18:33:32 -05:00
markMsgAsReadUnread ( true , true , true ) ;
2008-04-09 08:57:26 -04:00
}
2010-08-08 18:58:10 -04:00
void ForumsDialog : : markMsgAsUnread ( )
{
2010-11-15 18:33:32 -05:00
markMsgAsReadUnread ( false , false , false ) ;
}
void ForumsDialog : : markMsgAsUnreadChildren ( )
{
markMsgAsReadUnread ( false , true , false ) ;
2010-08-08 18:58:10 -04:00
}
void ForumsDialog : : markMsgAsUnreadAll ( )
{
2010-11-15 18:33:32 -05:00
markMsgAsReadUnread ( false , true , true ) ;
2010-08-08 18:58:10 -04:00
}
2008-04-09 08:57:26 -04:00
2011-04-19 15:42:44 -04:00
void ForumsDialog : : copyForumLink ( )
{
if ( mCurrForumId . empty ( ) ) {
return ;
}
ForumInfo fi ;
if ( rsForums - > getForumInfo ( mCurrForumId , fi ) ) {
2011-05-04 06:22:49 -04:00
RetroShareLink link ;
2011-05-08 19:11:27 -04:00
if ( link . createForum ( fi . forumId , " " ) ) {
2011-04-19 15:42:44 -04:00
std : : vector < RetroShareLink > urls ;
urls . push_back ( link ) ;
RSLinkClipboard : : copyLinks ( urls ) ;
}
}
}
void ForumsDialog : : copyMessageLink ( )
{
if ( mCurrForumId . empty ( ) | | mCurrThreadId . empty ( ) ) {
return ;
}
ForumInfo fi ;
if ( rsForums - > getForumInfo ( mCurrForumId , fi ) ) {
2011-05-04 06:22:49 -04:00
RetroShareLink link ;
2011-05-08 19:11:27 -04:00
if ( link . createForum ( mCurrForumId , mCurrThreadId ) ) {
2011-04-19 15:42:44 -04:00
std : : vector < RetroShareLink > urls ;
urls . push_back ( link ) ;
RSLinkClipboard : : copyLinks ( urls ) ;
}
}
}
2008-04-09 08:57:26 -04:00
void ForumsDialog : : newforum ( )
{
2010-05-01 15:03:35 -04:00
CreateForum cf ( this ) ;
cf . exec ( ) ;
2008-04-09 08:57:26 -04:00
}
2008-04-15 12:40:38 -04:00
void ForumsDialog : : createmessage ( )
{
2011-06-07 18:28:07 -04:00
if ( mCurrForumId . empty ( ) | | ! IS_FORUM_SUBSCRIBED ( subscribeFlags ) ) {
2010-05-01 15:03:35 -04:00
return ;
}
2010-08-08 18:58:10 -04:00
CreateForumMsg * cfm = new CreateForumMsg ( mCurrForumId , mCurrThreadId ) ;
2010-05-01 15:03:35 -04:00
cfm - > show ( ) ;
2008-04-15 12:40:38 -04:00
2010-05-01 15:03:35 -04:00
/* window will destroy itself! */
2008-04-15 12:40:38 -04:00
}
2010-08-08 18:58:10 -04:00
void ForumsDialog : : createthread ( )
2008-04-15 12:40:38 -04:00
{
2010-05-01 15:03:35 -04:00
if ( mCurrForumId . empty ( ) ) {
2010-09-14 15:38:47 -04:00
QMessageBox : : information ( this , tr ( " RetroShare " ) , tr ( " No Forum Selected! " ) ) ;
2010-05-01 15:03:35 -04:00
return ;
}
CreateForumMsg * cfm = new CreateForumMsg ( mCurrForumId , " " ) ;
cfm - > setWindowTitle ( tr ( " Start New Thread " ) ) ;
cfm - > show ( ) ;
2008-04-15 12:40:38 -04:00
2010-05-01 15:03:35 -04:00
/* window will destroy itself! */
2008-04-15 12:40:38 -04:00
}
2008-06-13 11:46:34 -04:00
void ForumsDialog : : subscribeToForum ( )
{
forumSubscribe ( true ) ;
}
void ForumsDialog : : unsubscribeToForum ( )
{
forumSubscribe ( false ) ;
}
void ForumsDialog : : forumSubscribe ( bool subscribe )
{
2010-12-26 19:15:25 -05:00
if ( mCurrForumId . empty ( ) ) {
return ;
2010-08-08 18:58:10 -04:00
}
2008-06-13 11:46:34 -04:00
2010-12-26 19:15:25 -05:00
rsForums - > forumSubscribe ( mCurrForumId , subscribe ) ;
2008-06-13 11:46:34 -04:00
}
void ForumsDialog : : showForumDetails ( )
{
2010-12-26 19:15:25 -05:00
if ( mCurrForumId . empty ( ) ) {
2010-05-01 15:03:35 -04:00
return ;
}
2010-01-02 10:47:07 -05:00
2010-05-01 15:03:35 -04:00
ForumDetails fui ;
2008-06-13 11:46:34 -04:00
2010-05-01 15:03:35 -04:00
fui . showDetails ( mCurrForumId ) ;
fui . exec ( ) ;
2008-06-13 11:46:34 -04:00
}
2010-09-14 15:38:47 -04:00
void ForumsDialog : : editForumDetails ( )
{
2010-12-26 19:15:25 -05:00
if ( mCurrForumId . empty ( ) ) {
2010-09-14 15:38:47 -04:00
return ;
}
EditForumDetails editUi ( mCurrForumId , this ) ;
editUi . exec ( ) ;
}
2010-01-09 11:33:00 -05:00
void ForumsDialog : : replytomessage ( )
{
2010-08-08 18:58:10 -04:00
if ( mCurrForumId . empty ( ) ) {
2010-05-01 15:03:35 -04:00
return ;
}
2010-08-08 18:58:10 -04:00
std : : string fId = mCurrForumId ;
std : : string pId = mCurrThreadId ;
2010-05-01 15:03:35 -04:00
ForumMsgInfo msgInfo ;
rsForums - > getForumMessage ( fId , pId , msgInfo ) ;
if ( rsPeers - > getPeerName ( msgInfo . srcId ) ! = " " )
{
2010-11-02 17:11:11 -04:00
MessageComposer * nMsgDialog = MessageComposer : : newMsg ( ) ;
nMsgDialog - > insertTitleText ( QString : : fromStdWString ( msgInfo . title ) , MessageComposer : : REPLY ) ;
2010-05-01 15:03:35 -04:00
QTextDocument doc ;
doc . setHtml ( QString : : fromStdWString ( msgInfo . msg ) ) ;
2010-11-02 17:11:11 -04:00
nMsgDialog - > insertPastedText ( doc . toPlainText ( ) ) ;
2010-09-27 17:05:52 -04:00
nMsgDialog - > addRecipient ( MessageComposer : : TO , msgInfo . srcId , false ) ;
2010-05-01 15:03:35 -04:00
nMsgDialog - > show ( ) ;
nMsgDialog - > activateWindow ( ) ;
2010-05-02 20:09:55 -04:00
/* window will destroy itself! */
2010-05-01 15:03:35 -04:00
}
else
{
QMessageBox : : information ( this , tr ( " RetroShare " ) , tr ( " You cant reply a Anonymous Author " ) ) ;
}
2010-01-09 11:33:00 -05:00
}
2008-06-13 11:46:34 -04:00
2010-05-19 16:17:43 -04:00
void ForumsDialog : : filterRegExpChanged ( )
{
// QRegExp regExp(ui.filterPatternLineEdit->text(), Qt::CaseInsensitive , QRegExp::FixedString);
// proxyModel->setFilterRegExp(regExp);
QString text = ui . filterPatternLineEdit - > text ( ) ;
if ( text . isEmpty ( ) ) {
ui . clearButton - > hide ( ) ;
} else {
ui . clearButton - > show ( ) ;
}
FilterItems ( ) ;
}
/* clear Filter */
void ForumsDialog : : clearFilter ( )
{
ui . filterPatternLineEdit - > clear ( ) ;
ui . filterPatternLineEdit - > setFocus ( ) ;
}
void ForumsDialog : : changedViewBox ( )
{
2010-05-20 17:53:27 -04:00
if ( m_bProcessSettings ) {
return ;
}
2010-05-19 16:17:43 -04:00
// save index
2010-05-20 17:53:27 -04:00
Settings - > setValueToGroup ( " ForumsDialog " , " viewBox " , ui . viewBox - > currentIndex ( ) ) ;
2010-05-19 16:17:43 -04:00
insertThreads ( ) ;
}
void ForumsDialog : : filterColumnChanged ( )
{
2010-05-20 17:53:27 -04:00
if ( m_bProcessSettings ) {
return ;
}
2011-06-06 17:44:16 -04:00
int filterColumn = FilterColumnFromComboBox ( ui . filterColumnComboBox - > currentIndex ( ) ) ;
if ( filterColumn = = COLUMN_THREAD_CONTENT ) {
2010-05-19 16:17:43 -04:00
// need content ... refill
insertThreads ( ) ;
} else {
FilterItems ( ) ;
}
// save index
2011-06-06 17:44:16 -04:00
Settings - > setValueToGroup ( " ForumsDialog " , " filterColumn " , filterColumn ) ;
2010-05-19 16:17:43 -04:00
}
void ForumsDialog : : FilterItems ( )
{
QString sPattern = ui . filterPatternLineEdit - > text ( ) ;
2011-06-06 17:44:16 -04:00
int filterColumn = FilterColumnFromComboBox ( ui . filterColumnComboBox - > currentIndex ( ) ) ;
2010-05-19 16:17:43 -04:00
int nCount = ui . threadTreeWidget - > topLevelItemCount ( ) ;
for ( int nIndex = 0 ; nIndex < nCount ; nIndex + + ) {
2011-06-06 17:44:16 -04:00
FilterItem ( ui . threadTreeWidget - > topLevelItem ( nIndex ) , sPattern , filterColumn ) ;
2010-05-19 16:17:43 -04:00
}
}
2011-06-06 17:44:16 -04:00
bool ForumsDialog : : FilterItem ( QTreeWidgetItem * pItem , QString & sPattern , int filterColumn )
2010-05-19 16:17:43 -04:00
{
bool bVisible = true ;
if ( sPattern . isEmpty ( ) = = false ) {
2011-06-06 17:44:16 -04:00
if ( pItem - > text ( filterColumn ) . contains ( sPattern , Qt : : CaseInsensitive ) = = false ) {
2010-05-19 16:17:43 -04:00
bVisible = false ;
}
}
int nVisibleChildCount = 0 ;
int nCount = pItem - > childCount ( ) ;
for ( int nIndex = 0 ; nIndex < nCount ; nIndex + + ) {
2011-06-06 17:44:16 -04:00
if ( FilterItem ( pItem - > child ( nIndex ) , sPattern , filterColumn ) ) {
2010-05-19 16:17:43 -04:00
nVisibleChildCount + + ;
}
}
if ( bVisible | | nVisibleChildCount ) {
pItem - > setHidden ( false ) ;
} else {
pItem - > setHidden ( true ) ;
}
return ( bVisible | | nVisibleChildCount ) ;
}
2010-08-09 17:20:34 -04:00
void ForumsDialog : : updateMessageSummaryList ( std : : string forumId )
{
2010-12-26 19:15:25 -05:00
QTreeWidgetItem * items [ 2 ] = { yourForums , subscribedForums } ;
for ( int item = 0 ; item < 2 ; item + + ) {
int child ;
int childCount = items [ item ] - > childCount ( ) ;
for ( child = 0 ; child < childCount ; child + + ) {
QTreeWidgetItem * childItem = items [ item ] - > child ( child ) ;
std : : string childId = ui . forumTreeWidget - > itemId ( childItem ) . toStdString ( ) ;
if ( childId . empty ( ) ) {
continue ;
}
2010-08-09 17:20:34 -04:00
2010-12-26 19:15:25 -05:00
if ( forumId . empty ( ) | | childId = = forumId ) {
/* calculate unread messages */
2010-08-09 17:20:34 -04:00
unsigned int newMessageCount = 0 ;
unsigned int unreadMessageCount = 0 ;
2010-12-26 19:15:25 -05:00
rsForums - > getMessageCount ( childId , newMessageCount , unreadMessageCount ) ;
2010-08-09 17:20:34 -04:00
2010-12-26 19:15:25 -05:00
ui . forumTreeWidget - > setUnreadCount ( childItem , unreadMessageCount ) ;
2010-08-09 17:20:34 -04:00
if ( forumId . empty ( ) = = false ) {
2010-12-26 19:15:25 -05:00
/* Calculate only this forum */
2010-08-09 17:20:34 -04:00
break ;
}
}
}
}
}
2011-04-19 15:42:44 -04:00
bool ForumsDialog : : navigate ( const std : : string & forumId , const std : : string & msgId )
{
if ( forumId . empty ( ) ) {
return false ;
}
if ( ui . forumTreeWidget - > activateId ( QString : : fromStdString ( forumId ) , msgId . empty ( ) ) = = NULL ) {
return false ;
}
/* Threads are filled in changedForum */
if ( mCurrForumId ! = forumId ) {
return false ;
}
if ( msgId . empty ( ) ) {
return true ;
}
/* Search exisiting item */
QTreeWidgetItemIterator itemIterator ( ui . threadTreeWidget ) ;
QTreeWidgetItem * item = NULL ;
while ( ( item = * itemIterator ) ! = NULL ) {
itemIterator + + ;
if ( item - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) . toString ( ) . toStdString ( ) = = msgId ) {
ui . threadTreeWidget - > setCurrentItem ( item ) ;
ui . threadTreeWidget - > setFocus ( ) ;
return true ;
}
}
return false ;
}
2011-06-06 17:44:16 -04:00
void ForumsDialog : : generateMassData ( )
{
# ifdef DEBUG_FORUMS
if ( mCurrForumId . empty ( ) ) {
return ;
}
if ( QMessageBox : : question ( this , " Generate mass data " , " Do you really want to generate mass data ? " , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : No ) = = QMessageBox : : No ) {
return ;
}
for ( int thread = 1 ; thread < 1000 ; thread + + ) {
ForumMsgInfo threadInfo ;
threadInfo . forumId = mCurrForumId ;
threadInfo . title = QString ( " Test %1 " ) . arg ( thread , 3 , 10 , QChar ( ' 0 ' ) ) . toStdWString ( ) ;
threadInfo . msg = QString ( " That is only a test " ) . toStdWString ( ) ;
if ( rsForums - > ForumMessageSend ( threadInfo ) = = false ) {
return ;
}
for ( int msg = 1 ; msg < 3 ; msg + + ) {
ForumMsgInfo msgInfo ;
msgInfo . forumId = mCurrForumId ;
msgInfo . threadId = threadInfo . msgId ;
msgInfo . parentId = threadInfo . msgId ;
msgInfo . title = threadInfo . title ;
msgInfo . msg = threadInfo . msg ;
if ( rsForums - > ForumMessageSend ( msgInfo ) = = false ) {
return ;
}
}
}
# endif
}
2011-06-07 18:28:07 -04:00
// ForumsFillThread
ForumsFillThread : : ForumsFillThread ( ForumsDialog * parent )
: QThread ( parent )
{
stopped = false ;
expandNewMessages = Settings - > getExpandNewMessages ( ) ;
fillComplete = false ;
filterColumn = 0 ;
subscribeFlags = 0 ;
viewType = 0 ;
}
ForumsFillThread : : ~ ForumsFillThread ( )
{
// remove all items (when items are available, the thread was terminated)
CleanupItems ( items ) ;
itemToExpand . clear ( ) ;
}
void ForumsFillThread : : stop ( )
{
disconnect ( ) ;
stopped = true ;
wait ( ) ;
}
void ForumsFillThread : : run ( )
{
uint32_t status ;
std : : list < ThreadInfoSummary > threads ;
std : : list < ThreadInfoSummary > : : iterator tit ;
rsForums - > getForumThreadList ( forumId , threads ) ;
bool flatView = false ;
bool useChildTS = false ;
switch ( viewType )
{
case VIEW_LAST_POST :
useChildTS = true ;
break ;
case VIEW_FLAT :
flatView = true ;
break ;
case VIEW_THREADED :
break ;
}
int count = threads . size ( ) ;
int pos = 0 ;
for ( tit = threads . begin ( ) ; tit ! = threads . end ( ) ; tit + + )
{
if ( stopped ) {
break ;
}
# ifdef DEBUG_FORUMS
std : : cerr < < " FForumsFillThread::run() Adding TopLevel Thread: mId: " ;
std : : cerr < < tit - > msgId < < std : : endl ;
# endif
ForumMsgInfo msginfo ;
if ( rsForums - > getForumMessage ( forumId , tit - > msgId , msginfo ) = = false ) {
# ifdef DEBUG_FORUMS
std : : cerr < < " ForumsFillThread::run() Failed to Get Msg " ;
std : : cerr < < std : : endl ;
# endif
continue ;
}
/* add Msg */
/* setup
*
*/
QTreeWidgetItem * item = new QTreeWidgetItem ( ) ;
QString text ;
{
QDateTime qtime ;
if ( useChildTS )
qtime . setTime_t ( tit - > childTS ) ;
else
qtime . setTime_t ( tit - > ts ) ;
text = qtime . toString ( " yyyy-MM-dd hh:mm:ss " ) ;
if ( useChildTS )
{
QDateTime qtime2 ;
qtime2 . setTime_t ( tit - > ts ) ;
QString timestamp2 = qtime2 . toString ( " yyyy-MM-dd hh:mm:ss " ) ;
text + = " / " ;
text + = timestamp2 ;
}
item - > setText ( COLUMN_THREAD_DATE , text ) ;
}
item - > setText ( COLUMN_THREAD_TITLE , QString : : fromStdWString ( tit - > title ) ) ;
text = QString : : fromStdString ( rsPeers - > getPeerName ( msginfo . srcId ) ) ;
if ( text . isEmpty ( ) )
{
item - > setText ( COLUMN_THREAD_AUTHOR , tr ( " Anonymous " ) ) ;
}
else
{
item - > setText ( COLUMN_THREAD_AUTHOR , text ) ;
}
if ( msginfo . msgflags & RS_DISTRIB_AUTHEN_REQ )
{
item - > setText ( COLUMN_THREAD_SIGNED , tr ( " signed " ) ) ;
item - > setIcon ( COLUMN_THREAD_SIGNED , QIcon ( " :/images/mail-signed.png " ) ) ;
}
else
{
item - > setText ( COLUMN_THREAD_SIGNED , tr ( " none " ) ) ;
item - > setIcon ( COLUMN_THREAD_SIGNED , QIcon ( " :/images/mail-signature-unknown.png " ) ) ;
}
if ( filterColumn = = COLUMN_THREAD_CONTENT ) {
// need content for filter
QTextDocument doc ;
doc . setHtml ( QString : : fromStdWString ( msginfo . msg ) ) ;
item - > setText ( COLUMN_THREAD_CONTENT , doc . toPlainText ( ) . replace ( QString ( " \n " ) , QString ( " " ) ) ) ;
}
item - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID , QString : : fromStdString ( tit - > msgId ) ) ;
if ( IS_FORUM_SUBSCRIBED ( subscribeFlags ) & & ! ( msginfo . msgflags & RS_DISTRIB_MISSING_MSG ) ) {
rsForums - > getMessageStatus ( msginfo . forumId , msginfo . msgId , status ) ;
} else {
// show message as read
status = FORUM_MSG_STATUS_READ ;
}
item - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS , status ) ;
item - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_MISSING , ( msginfo . msgflags & RS_DISTRIB_MISSING_MSG ) ? true : false ) ;
std : : list < QTreeWidgetItem * > threadlist ;
threadlist . push_back ( item ) ;
while ( threadlist . size ( ) > 0 )
{
if ( stopped ) {
break ;
}
/* get children */
QTreeWidgetItem * parent = threadlist . front ( ) ;
threadlist . pop_front ( ) ;
std : : string pId = parent - > data ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID ) . toString ( ) . toStdString ( ) ;
std : : list < ThreadInfoSummary > msgs ;
std : : list < ThreadInfoSummary > : : iterator mit ;
# ifdef DEBUG_FORUMS
std : : cerr < < " ForumsFillThread::run() Getting Children of : " < < pId ;
std : : cerr < < std : : endl ;
# endif
if ( rsForums - > getForumThreadMsgList ( forumId , pId , msgs ) )
{
# ifdef DEBUG_FORUMS
std : : cerr < < " ForumsFillThread::run() #Children " < < msgs . size ( ) ;
std : : cerr < < std : : endl ;
# endif
/* iterate through child */
for ( mit = msgs . begin ( ) ; mit ! = msgs . end ( ) ; mit + + )
{
# ifdef DEBUG_FORUMS
std : : cerr < < " ForumsFillThread::run() adding " < < mit - > msgId ;
std : : cerr < < std : : endl ;
# endif
ForumMsgInfo msginfo ;
if ( rsForums - > getForumMessage ( forumId , mit - > msgId , msginfo ) = = false ) {
# ifdef DEBUG_FORUMS
std : : cerr < < " ForumsFillThread::run() Failed to Get Msg " ;
std : : cerr < < std : : endl ;
# endif
continue ;
}
QTreeWidgetItem * child = NULL ;
if ( flatView )
{
child = new QTreeWidgetItem ( ) ;
}
else
{
child = new QTreeWidgetItem ( parent ) ;
}
{
QDateTime qtime ;
if ( useChildTS )
qtime . setTime_t ( mit - > childTS ) ;
else
qtime . setTime_t ( mit - > ts ) ;
text = qtime . toString ( " yyyy-MM-dd hh:mm:ss " ) ;
if ( useChildTS )
{
QDateTime qtime2 ;
qtime2 . setTime_t ( mit - > ts ) ;
QString timestamp2 = qtime2 . toString ( " yyyy-MM-dd hh:mm:ss " ) ;
text + = " / " ;
text + = timestamp2 ;
}
child - > setText ( COLUMN_THREAD_DATE , text ) ;
}
child - > setText ( COLUMN_THREAD_TITLE , QString : : fromStdWString ( mit - > title ) ) ;
text = QString : : fromStdString ( rsPeers - > getPeerName ( msginfo . srcId ) ) ;
if ( text . isEmpty ( ) )
{
child - > setText ( COLUMN_THREAD_AUTHOR , tr ( " Anonymous " ) ) ;
}
else
{
child - > setText ( COLUMN_THREAD_AUTHOR , text ) ;
}
if ( msginfo . msgflags & RS_DISTRIB_AUTHEN_REQ )
{
child - > setText ( COLUMN_THREAD_SIGNED , tr ( " signed " ) ) ;
child - > setIcon ( COLUMN_THREAD_SIGNED , ( QIcon ( " :/images/mail-signed.png " ) ) ) ;
}
else
{
child - > setText ( COLUMN_THREAD_SIGNED , tr ( " none " ) ) ;
child - > setIcon ( COLUMN_THREAD_SIGNED , ( QIcon ( " :/images/mail-signature-unknown.png " ) ) ) ;
}
if ( filterColumn = = COLUMN_THREAD_CONTENT ) {
// need content for filter
QTextDocument doc ;
doc . setHtml ( QString : : fromStdWString ( msginfo . msg ) ) ;
child - > setText ( COLUMN_THREAD_CONTENT , doc . toPlainText ( ) . replace ( QString ( " \n " ) , QString ( " " ) ) ) ;
}
child - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_MSGID , QString : : fromStdString ( mit - > msgId ) ) ;
if ( IS_FORUM_SUBSCRIBED ( subscribeFlags ) & & ! ( msginfo . msgflags & RS_DISTRIB_MISSING_MSG ) ) {
rsForums - > getMessageStatus ( msginfo . forumId , msginfo . msgId , status ) ;
} else {
// show message as read
status = FORUM_MSG_STATUS_READ ;
}
child - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_STATUS , status ) ;
child - > setData ( COLUMN_THREAD_DATA , ROLE_THREAD_MISSING , ( msginfo . msgflags & RS_DISTRIB_MISSING_MSG ) ? true : false ) ;
if ( fillComplete & & expandNewMessages & & IS_UNREAD ( status ) ) {
QTreeWidgetItem * pParent = child ;
while ( ( pParent = pParent - > parent ( ) ) ! = NULL ) {
if ( std : : find ( itemToExpand . begin ( ) , itemToExpand . end ( ) , pParent ) = = itemToExpand . end ( ) ) {
itemToExpand . push_back ( pParent ) ;
}
}
}
/* setup child */
threadlist . push_back ( child ) ;
if ( flatView )
{
items . append ( child ) ;
}
}
}
}
/* add to list */
items . append ( item ) ;
emit progress ( + + pos , count ) ;
}
}