2010-05-14 07:48:20 -04:00
/****************************************************************
2007-11-14 22:18:48 -05:00
* RetroShare is distributed under the following license :
*
* Copyright ( C ) 2006 , 2007 crypton
*
* 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
2009-07-13 15:58:11 -04:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
2007-11-14 22:18:48 -05:00
* Boston , MA 02110 - 1301 , USA .
2008-11-24 09:07:26 -05:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-11-14 22:18:48 -05:00
2008-11-24 09:07:26 -05:00
# include <QFile>
2007-11-14 22:18:48 -05:00
# include <QFileInfo>
2010-07-23 14:52:58 -04:00
# include <QShortcut>
# include <QWidgetAction>
# include <QScrollBar>
# include <QColorDialog>
# include <QFontDialog>
# include <QDropEvent>
2010-08-28 15:50:38 -04:00
# include <QFileDialog>
2008-11-24 09:07:26 -05:00
# include "common/vmessagebox.h"
2010-09-12 10:10:28 -04:00
# include "common/StatusDefs.h"
2010-09-14 13:47:11 -04:00
# include "common/Emoticons.h"
2010-01-18 17:44:09 -05:00
# include <gui/mainpagestack.h>
2008-11-24 09:07:26 -05:00
2010-09-04 10:23:30 -04:00
# include "retroshare/rsinit.h"
2008-11-24 09:07:26 -05:00
# include "PeersDialog.h"
2010-08-06 05:40:23 -04:00
# include <retroshare/rsiface.h>
# include <retroshare/rspeers.h>
# include <retroshare/rsstatus.h>
# include <retroshare/rsmsgs.h>
# include <retroshare/rsnotify.h>
2010-05-11 16:02:52 -04:00
# include "settings/rsharesettings.h"
2008-01-25 03:49:40 -05:00
2007-11-14 22:18:48 -05:00
# include "chat/PopupChatDialog.h"
2010-05-23 15:13:41 -04:00
# include "msgs/MessageComposer.h"
2007-11-14 22:18:48 -05:00
# include "connect/ConfCertDialog.h"
2009-01-22 20:58:56 -05:00
# include "profile/ProfileView.h"
2009-09-25 21:10:25 -04:00
# include "profile/ProfileWidget.h"
2009-10-08 15:08:44 -04:00
# include "profile/StatusMessage.h"
2009-09-22 18:47:49 -04:00
# include "gui/connect/ConnectFriendWizard.h"
2010-01-16 20:36:50 -05:00
# include "gui/forums/CreateForum.h"
2010-05-02 07:41:23 -04:00
# include "gui/channels/CreateChannel.h"
2010-07-23 14:52:58 -04:00
# include "gui/feeds/AttachFileItem.h"
2010-09-01 10:15:50 -04:00
# include "gui/im_history/ImHistoryBrowser.h"
2010-07-15 07:25:34 -04:00
# include "RetroShareLink.h"
2008-12-07 09:19:13 -05:00
2010-05-02 20:09:55 -04:00
# include "MainWindow.h"
2010-08-12 12:00:21 -04:00
# include "NewsFeed.h"
2010-05-02 20:09:55 -04:00
2007-11-14 22:18:48 -05:00
# include <sstream>
2010-01-20 17:02:43 -05:00
# include <time.h>
2010-01-31 17:29:30 -05:00
# include <sys/stat.h>
2010-08-25 14:31:56 -04:00
# include <algorithm>
2007-11-14 22:18:48 -05:00
2010-05-05 07:47:29 -04:00
# include <QSound>
2008-11-24 09:07:26 -05:00
/* Images for context menu icons */
2007-11-14 22:18:48 -05:00
# define IMAGE_REMOVEFRIEND ": / images / removefriend16.png"
# define IMAGE_EXPIORTFRIEND ": / images / exportpeers_16x16.png"
2008-04-07 20:31:46 -04:00
# define IMAGE_PEERINFO ": / images / peerdetails_16x16.png"
2007-11-14 22:18:48 -05:00
# define IMAGE_CHAT ": / images / chat.png"
2008-04-03 17:32:45 -04:00
# define IMAGE_MSG ": / images / message-mail.png"
2009-01-22 20:58:56 -05:00
# define IMAGE_CONNECT ": / images / connect_friend.png"
2007-11-14 22:18:48 -05:00
/* Images for Status icons */
2010-09-02 04:25:30 -04:00
# define IMAGE_AVAILABLE ": / images / user / identityavaiblecyan24.png"
2009-04-29 11:48:01 -04:00
# define IMAGE_CONNECT2 ": / images / reload24.png"
2010-07-15 07:25:34 -04:00
# define IMAGE_PASTELINK ": / images / pasterslink.png"
2008-11-24 09:07:26 -05:00
2010-06-08 17:38:36 -04:00
# define COLUMN_COUNT 3
# define COLUMN_NAME 0
# define COLUMN_STATE 1
# define COLUMN_INFO 2
2010-06-25 10:19:48 -04:00
# define COLUMN_DATA 0 // column for storing the userdata id
# define ROLE_SORT Qt::UserRole
# define ROLE_ID Qt::UserRole + 1
2010-06-08 17:38:36 -04:00
2008-07-09 05:53:47 -04:00
/******
* # define PEERS_DEBUG 1
* * * * */
2010-06-08 17:38:36 -04:00
// quick and dirty for sorting, better use QTreeView and QSortFilterProxyModel
2010-06-17 13:39:32 -04:00
class MyPeerTreeWidgetItem : public QTreeWidgetItem
2010-06-08 17:38:36 -04:00
{
public :
2010-06-17 13:39:32 -04:00
MyPeerTreeWidgetItem ( QTreeWidget * pWidget , int type ) : QTreeWidgetItem ( type )
2010-06-08 17:38:36 -04:00
{
m_pWidget = pWidget ; // can't access the member "view"
}
bool operator < ( const QTreeWidgetItem & other ) const
{
2010-06-11 19:28:05 -04:00
int role = Qt : : DisplayRole ;
2010-06-08 17:38:36 -04:00
int column = m_pWidget ? m_pWidget - > sortColumn ( ) : 0 ;
2010-06-11 19:28:05 -04:00
switch ( column ) {
case COLUMN_STATE :
// sort by state set in user role
2010-06-25 10:19:48 -04:00
role = ROLE_SORT ;
2010-06-11 19:28:05 -04:00
// no break;
case COLUMN_NAME :
{
const QVariant v1 = data ( column , role ) ;
const QVariant v2 = other . data ( column , role ) ;
return ( v1 . toString ( ) . compare ( v2 . toString ( ) , Qt : : CaseInsensitive ) < 0 ) ;
}
2010-06-08 17:38:36 -04:00
}
// let the standard do the sort
return QTreeWidgetItem : : operator < ( other ) ;
}
private :
QTreeWidget * m_pWidget ; // the member "view" is private
} ;
2008-07-09 05:53:47 -04:00
2008-11-24 09:07:26 -05:00
/** Constructor */
PeersDialog : : PeersDialog ( QWidget * parent )
2010-09-04 10:23:30 -04:00
: RsAutoUpdatePage ( 1500 , parent )
2008-11-24 09:07:26 -05:00
{
2010-09-04 10:23:30 -04:00
/* Invoke the Qt Designer generated object setup routine */
ui . setupUi ( this ) ;
2009-09-30 18:30:57 -04:00
2010-09-04 10:23:30 -04:00
last_status_send_time = 0 ;
2010-01-18 17:44:09 -05:00
2010-09-04 10:23:30 -04:00
connect ( ui . peertreeWidget , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( peertreeWidgetCostumPopupMenu ( QPoint ) ) ) ;
connect ( ui . peertreeWidget , SIGNAL ( itemDoubleClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( chatfriend ( QTreeWidgetItem * ) ) ) ;
2007-11-14 22:18:48 -05:00
2010-09-04 10:23:30 -04:00
connect ( ui . avatartoolButton , SIGNAL ( clicked ( ) ) , SLOT ( getAvatar ( ) ) ) ;
connect ( ui . mypersonalstatuslabel , SIGNAL ( clicked ( ) ) , SLOT ( statusmessage ( ) ) ) ;
connect ( ui . actionSet_your_Avatar , SIGNAL ( triggered ( ) ) , this , SLOT ( getAvatar ( ) ) ) ;
connect ( ui . actionSet_your_Personal_Message , SIGNAL ( triggered ( ) ) , this , SLOT ( statusmessage ( ) ) ) ;
connect ( ui . addfileButton , SIGNAL ( clicked ( ) ) , this , SLOT ( addExtraFile ( ) ) ) ;
connect ( ui . msgText , SIGNAL ( anchorClicked ( const QUrl & ) ) , SLOT ( anchorClicked ( const QUrl & ) ) ) ;
2010-01-16 20:36:50 -05:00
2010-09-04 10:23:30 -04:00
connect ( ui . action_Hide_Offline_Friends , SIGNAL ( triggered ( ) ) , this , SLOT ( insertPeers ( ) ) ) ;
connect ( ui . action_Hide_Status_Column , SIGNAL ( triggered ( ) ) , this , SLOT ( statusColumn ( ) ) ) ;
2010-01-19 16:43:40 -05:00
2010-09-04 10:23:30 -04:00
ui . peertabWidget - > setTabPosition ( QTabWidget : : North ) ;
ui . peertabWidget - > addTab ( new ProfileWidget ( ) , QString ( tr ( " Profile " ) ) ) ;
ui . peertabWidget - > addTab ( new NewsFeed ( ) , QString ( tr ( " Friends Storm " ) ) ) ;
2009-09-25 21:10:25 -04:00
2010-09-04 10:23:30 -04:00
ui . peertreeWidget - > setColumnCount ( 4 ) ;
ui . peertreeWidget - > setColumnHidden ( 3 , true ) ;
ui . peertreeWidget - > setColumnHidden ( 2 , true ) ;
ui . peertreeWidget - > sortItems ( 0 , Qt : : AscendingOrder ) ;
2009-07-13 15:58:11 -04:00
2010-09-04 10:23:30 -04:00
// set header text aligment
QTreeWidgetItem * headerItem = ui . peertreeWidget - > headerItem ( ) ;
headerItem - > setTextAlignment ( COLUMN_NAME , Qt : : AlignHCenter | Qt : : AlignVCenter ) ;
headerItem - > setTextAlignment ( COLUMN_STATE , Qt : : AlignLeft | Qt : : AlignVCenter ) ;
headerItem - > setTextAlignment ( COLUMN_INFO , Qt : : AlignHCenter | Qt : : AlignVCenter ) ;
2008-07-12 07:57:09 -04:00
2010-09-04 10:23:30 -04:00
connect ( ui . Sendbtn , SIGNAL ( clicked ( ) ) , this , SLOT ( sendMsg ( ) ) ) ;
connect ( ui . emoticonBtn , SIGNAL ( clicked ( ) ) , this , SLOT ( smileyWidgetgroupchat ( ) ) ) ;
2008-07-10 06:34:49 -04:00
2010-09-04 10:23:30 -04:00
ui . lineEdit - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui . lineEdit , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( contextMenu ( QPoint ) ) ) ;
2010-03-17 11:34:36 -04:00
2010-09-04 10:23:30 -04:00
pasteLinkAct = new QAction ( QIcon ( " :/images/pasterslink.png " ) , tr ( " Paste retroshare Link " ) , this ) ;
connect ( pasteLinkAct , SIGNAL ( triggered ( ) ) , this , SLOT ( pasteLink ( ) ) ) ;
2009-07-13 15:58:11 -04:00
2010-09-04 10:23:30 -04:00
connect ( ui . msgText , SIGNAL ( customContextMenuRequested ( const QPoint & ) ) , this , SLOT ( displayInfoChatMenu ( const QPoint & ) ) ) ;
2009-07-13 15:58:11 -04:00
2010-09-04 10:23:30 -04:00
connect ( ui . textboldChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setFont ( ) ) ) ;
connect ( ui . textunderlineChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setFont ( ) ) ) ;
connect ( ui . textitalicChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setFont ( ) ) ) ;
connect ( ui . fontsButton , SIGNAL ( clicked ( ) ) , this , SLOT ( getFont ( ) ) ) ;
connect ( ui . colorChatButton , SIGNAL ( clicked ( ) ) , this , SLOT ( setColor ( ) ) ) ;
connect ( ui . actionSave_History , SIGNAL ( triggered ( ) ) , this , SLOT ( fileSaveAs ( ) ) ) ;
2009-07-13 15:58:11 -04:00
2010-09-04 10:23:30 -04:00
ui . fontsButton - > setIcon ( QIcon ( QString ( " :/images/fonts.png " ) ) ) ;
2009-07-13 15:58:11 -04:00
2010-09-04 10:23:30 -04:00
_currentColor = Qt : : black ;
2009-07-13 15:58:11 -04:00
2010-09-04 10:23:30 -04:00
QPixmap pxm ( 16 , 16 ) ;
pxm . fill ( _currentColor ) ;
ui . colorChatButton - > setIcon ( pxm ) ;
2010-09-10 14:38:46 -04:00
mCurrentFont . fromString ( Settings - > getChatScreenFont ( ) ) ;
2010-09-04 10:23:30 -04:00
ui . lineEdit - > setFont ( mCurrentFont ) ;
2010-09-07 11:49:31 -04:00
style . setStyleFromSettings ( ChatStyle : : TYPE_PUBLIC ) ;
2010-09-04 10:23:30 -04:00
setChatInfo ( tr ( " Welcome to RetroShare's group chat. " ) , QString : : fromUtf8 ( " blue " ) ) ;
if ( Settings - > valueFromGroup ( " Chat " , QString : : fromUtf8 ( " GroupChat_History " ) , true ) . toBool ( ) ) {
historyKeeper . init ( QString : : fromStdString ( RsInit : : RsProfileConfigDirectory ( ) ) + " /chatPublic.xml " ) ;
QList < IMHistoryItem > historyItems ;
historyKeeper . getMessages ( historyItems , 20 ) ;
foreach ( IMHistoryItem item , historyItems ) {
addChatMsg ( item . incoming , true , item . name , item . sendTime , item . messageText ) ;
}
}
QMenu * grpchatmenu = new QMenu ( ) ;
grpchatmenu - > addAction ( ui . actionClearChat ) ;
grpchatmenu - > addAction ( ui . actionSave_History ) ;
grpchatmenu - > addAction ( ui . actionMessageHistory ) ;
ui . menuButton - > setMenu ( grpchatmenu ) ;
_underline = false ;
QMenu * menu = new QMenu ( ) ;
menu - > addAction ( ui . actionAdd_Friend ) ;
menu - > addSeparator ( ) ;
menu - > addAction ( ui . actionCreate_New_Forum ) ;
# ifndef RS_RELEASE_VERSION
menu - > addAction ( ui . actionCreate_New_Channel ) ;
# endif
menu - > addAction ( ui . actionSet_your_Avatar ) ;
menu - > addAction ( ui . actionSet_your_Personal_Message ) ;
2009-07-13 15:58:11 -04:00
2010-09-04 10:23:30 -04:00
ui . menupushButton - > setMenu ( menu ) ;
//ui.msgText->setOpenExternalLinks ( false );
//ui.msgText->setOpenLinks ( false );
setAcceptDrops ( true ) ;
ui . lineEdit - > setAcceptDrops ( false ) ;
updateAvatar ( ) ;
loadmypersonalstatus ( ) ;
displayMenu ( ) ;
// load settings
processSettings ( true ) ;
// workaround for Qt bug, should be solved in next Qt release 4.7.0
// http://bugreports.qt.nokia.com/browse/QTBUG-8270
QShortcut * Shortcut = new QShortcut ( QKeySequence ( Qt : : Key_Delete ) , ui . peertreeWidget , 0 , 0 , Qt : : WidgetShortcut ) ;
connect ( Shortcut , SIGNAL ( activated ( ) ) , this , SLOT ( removefriend ( ) ) ) ;
ui . lineEdit - > installEventFilter ( this ) ;
// add self nick and Avatar to Friends.
RsPeerDetails pd ;
if ( rsPeers - > getPeerDetails ( rsPeers - > getOwnId ( ) , pd ) ) {
QString titleStr ( " <span style= \" font-size:16pt; font-weight:500; "
" color:#32cd32; \" >%1</span> " ) ;
ui . nicklabel - > setText ( titleStr . arg ( QString : : fromStdString ( pd . name ) + tr ( " (me) " ) + QString : : fromStdString ( pd . location ) ) ) ;
}
/* Hide platform specific features */
2008-11-24 09:07:26 -05:00
# ifdef Q_WS_WIN
# endif
}
2007-11-14 22:18:48 -05:00
2010-05-11 16:02:52 -04:00
PeersDialog : : ~ PeersDialog ( )
{
2010-06-08 17:38:36 -04:00
// save settings
processSettings ( false ) ;
2010-05-11 16:02:52 -04:00
}
2010-06-08 17:38:36 -04:00
void PeersDialog : : processSettings ( bool bLoad )
{
QHeaderView * header = ui . peertreeWidget - > header ( ) ;
Settings - > beginGroup ( QString ( " PeersDialog " ) ) ;
if ( bLoad ) {
// load settings
// state of peer tree
header - > restoreState ( Settings - > value ( " PeerTree " ) . toByteArray ( ) ) ;
2010-06-16 15:00:28 -04:00
// state of hideUnconnected
2010-06-18 17:59:33 -04:00
ui . action_Hide_Offline_Friends - > setChecked ( Settings - > value ( " hideUnconnected " , false ) . toBool ( ) ) ;
// state of hideStatusColumn
ui . action_Hide_Status_Column - > setChecked ( Settings - > value ( " hideStatusColumn " , false ) . toBool ( ) ) ;
2010-06-16 15:00:28 -04:00
2010-06-08 17:38:36 -04:00
// state of splitter
ui . splitter - > restoreState ( Settings - > value ( " Splitter " ) . toByteArray ( ) ) ;
2010-08-27 20:30:18 -04:00
ui . splitter_2 - > restoreState ( Settings - > value ( " GroupChatSplitter " ) . toByteArray ( ) ) ;
2010-06-08 17:38:36 -04:00
} else {
// save settings
// state of peer tree
Settings - > setValue ( " PeerTree " , header - > saveState ( ) ) ;
2010-06-16 15:00:28 -04:00
// state of hideUnconnected
2010-06-18 17:59:33 -04:00
Settings - > setValue ( " hideUnconnected " , ui . action_Hide_Offline_Friends - > isChecked ( ) ) ;
// state of hideStatusColumn
Settings - > setValue ( " hideStatusColumn " , ui . action_Hide_Status_Column - > isChecked ( ) ) ;
2010-06-16 15:00:28 -04:00
2010-06-08 17:38:36 -04:00
// state of splitter
Settings - > setValue ( " Splitter " , ui . splitter - > saveState ( ) ) ;
2010-08-27 20:30:18 -04:00
Settings - > setValue ( " GroupChatSplitter " , ui . splitter_2 - > saveState ( ) ) ;
2010-06-08 17:38:36 -04:00
}
Settings - > endGroup ( ) ;
}
2010-09-04 10:23:30 -04:00
void PeersDialog : : showEvent ( QShowEvent * event )
{
static bool first = true ;
if ( first ) {
// Workaround: now the scroll position is correct calculated
first = false ;
QScrollBar * scrollbar = ui . msgText - > verticalScrollBar ( ) ;
scrollbar - > setValue ( scrollbar - > maximum ( ) ) ;
}
2010-09-10 16:43:11 -04:00
RsAutoUpdatePage : : showEvent ( event ) ;
2010-09-04 10:23:30 -04:00
}
2010-03-17 11:34:36 -04:00
void PeersDialog : : pasteLink ( )
{
ui . lineEdit - > insertHtml ( RSLinkClipboard : : toHtml ( ) ) ;
}
void PeersDialog : : contextMenu ( QPoint point )
{
if ( RSLinkClipboard : : empty ( ) )
return ;
QMenu contextMnu ( this ) ;
contextMnu . addAction ( pasteLinkAct ) ;
2010-05-14 16:55:44 -04:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
2010-03-17 11:34:36 -04:00
}
2008-11-24 09:07:26 -05:00
void PeersDialog : : peertreeWidgetCostumPopupMenu ( QPoint point )
{
2010-07-15 07:25:34 -04:00
QTreeWidgetItem * c = getCurrentPeer ( ) ;
2008-11-24 09:07:26 -05:00
2010-07-15 07:25:34 -04:00
QMenu contextMnu ( this ) ;
2010-01-18 17:44:40 -05:00
2010-07-15 07:25:34 -04:00
QAction * expandAll = new QAction ( tr ( " Expand all " ) , & contextMnu ) ;
connect ( expandAll , SIGNAL ( triggered ( ) ) , ui . peertreeWidget , SLOT ( expandAll ( ) ) ) ;
2010-01-18 17:44:40 -05:00
2010-07-15 07:25:34 -04:00
QAction * collapseAll = new QAction ( tr ( " Collapse all " ) , & contextMnu ) ;
connect ( collapseAll , SIGNAL ( triggered ( ) ) , ui . peertreeWidget , SLOT ( collapseAll ( ) ) ) ;
2007-11-14 22:18:48 -05:00
2010-07-15 07:25:34 -04:00
QAction * chatAct = new QAction ( QIcon ( IMAGE_CHAT ) , tr ( " Chat " ) , & contextMnu ) ;
2010-08-30 09:03:12 -04:00
if ( c ) {
connect ( chatAct , SIGNAL ( triggered ( ) ) , this , SLOT ( chatfriendproxy ( ) ) ) ;
} else {
chatAct - > setDisabled ( true ) ;
}
2007-11-14 22:18:48 -05:00
2010-07-15 07:25:34 -04:00
QAction * msgAct = new QAction ( QIcon ( IMAGE_MSG ) , tr ( " Message Friend " ) , & contextMnu ) ;
2010-08-30 09:03:12 -04:00
if ( c ) {
connect ( msgAct , SIGNAL ( triggered ( ) ) , this , SLOT ( msgfriend ( ) ) ) ;
} else {
msgAct - > setDisabled ( true ) ;
}
2009-07-13 15:58:11 -04:00
2010-07-15 07:25:34 -04:00
QAction * connectfriendAct = new QAction ( QIcon ( IMAGE_CONNECT ) , tr ( " Connect To Friend " ) , & contextMnu ) ;
2010-08-30 09:03:12 -04:00
if ( c ) {
connect ( connectfriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( connectfriend ( ) ) ) ;
} else {
connectfriendAct - > setDisabled ( true ) ;
}
2009-01-22 20:58:56 -05:00
2010-07-15 07:25:34 -04:00
QAction * configurefriendAct = new QAction ( QIcon ( IMAGE_PEERINFO ) , tr ( " Peer Details " ) , & contextMnu ) ;
2010-08-30 09:03:12 -04:00
if ( c ) {
connect ( configurefriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( configurefriend ( ) ) ) ;
} else {
configurefriendAct - > setDisabled ( true ) ;
}
2009-07-13 15:58:11 -04:00
2010-07-15 07:25:34 -04:00
QAction * recommendfriendAct = new QAction ( QIcon ( IMAGE_EXPIORTFRIEND ) , tr ( " Recomend this Friend to... " ) , & contextMnu ) ;
2010-08-30 09:03:12 -04:00
if ( c & & c - > type ( ) = = 0 ) {
connect ( recommendfriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( recommendfriend ( ) ) ) ;
} else {
recommendfriendAct - > setDisabled ( true ) ;
}
2010-07-15 07:25:34 -04:00
2010-09-03 13:04:27 -04:00
QAction * pastePersonAct = new QAction ( QIcon ( IMAGE_PASTELINK ) , tr ( " Paste Friend Link " ) , & contextMnu ) ;
2010-07-15 07:25:34 -04:00
if ( ! RSLinkClipboard : : empty ( RetroShareLink : : TYPE_PERSON ) ) {
connect ( pastePersonAct , SIGNAL ( triggered ( ) ) , this , SLOT ( pastePerson ( ) ) ) ;
} else {
pastePersonAct - > setDisabled ( true ) ;
}
QAction * profileviewAct = new QAction ( QIcon ( IMAGE_PEERINFO ) , tr ( " Profile View " ) , & contextMnu ) ;
2010-08-30 09:03:12 -04:00
if ( c ) {
connect ( profileviewAct , SIGNAL ( triggered ( ) ) , this , SLOT ( viewprofile ( ) ) ) ;
} else {
profileviewAct - > setDisabled ( true ) ;
}
2010-07-15 07:25:34 -04:00
QAction * exportfriendAct = new QAction ( QIcon ( IMAGE_EXPIORTFRIEND ) , tr ( " Export Friend " ) , & contextMnu ) ;
2010-08-30 09:03:12 -04:00
if ( c ) {
connect ( exportfriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( exportfriend ( ) ) ) ;
2010-07-15 07:25:34 -04:00
} else {
2010-08-30 09:03:12 -04:00
exportfriendAct - > setDisabled ( true ) ;
2010-07-15 07:25:34 -04:00
}
2009-07-13 15:58:11 -04:00
2010-08-30 09:03:12 -04:00
QAction * removefriendAct = new QAction ( QIcon ( IMAGE_REMOVEFRIEND ) , tr ( " Deny Friend " ) , & contextMnu ) ;
if ( c ) {
if ( c - > type ( ) = = 1 ) {
//this is a SSL key
removefriendAct - > setText ( tr ( " Remove Friend Location " ) ) ;
}
connect ( removefriendAct , SIGNAL ( triggered ( ) ) , this , SLOT ( removefriend ( ) ) ) ;
} else {
removefriendAct - > setDisabled ( true ) ;
}
2008-11-24 09:07:26 -05:00
2010-07-15 07:25:34 -04:00
QWidget * widget = new QWidget ( & contextMnu ) ;
widget - > setStyleSheet ( " .QWidget{background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #FEFEFE, stop:1 #E8E8E8); border: 1px solid #CCCCCC;} " ) ;
2007-11-14 22:18:48 -05:00
2010-07-15 07:25:34 -04:00
QHBoxLayout * hbox = new QHBoxLayout ( ) ;
hbox - > setMargin ( 0 ) ;
hbox - > setSpacing ( 6 ) ;
2009-09-24 17:38:40 -04:00
2010-07-15 07:25:34 -04:00
iconLabel = new QLabel ( this ) ;
iconLabel - > setPixmap ( QPixmap ( " :/images/user/friends24.png " ) ) ;
iconLabel - > setMaximumSize ( iconLabel - > frameSize ( ) . height ( ) + 24 , 24 ) ;
hbox - > addWidget ( iconLabel ) ;
2010-08-30 09:03:12 -04:00
textLabel = new QLabel ( tr ( " <strong>RetroShare instance</strong> " ) , widget ) ;
if ( c & & c - > type ( ) = = 0 ) {
2010-07-15 07:25:34 -04:00
//this is a GPG key
2010-08-30 09:03:12 -04:00
textLabel - > setText ( tr ( " <strong>GPG Key</strong> " ) ) ;
2010-07-15 07:25:34 -04:00
}
hbox - > addWidget ( textLabel ) ;
spacerItem = new QSpacerItem ( 40 , 20 , QSizePolicy : : Expanding , QSizePolicy : : Minimum ) ;
hbox - > addItem ( spacerItem ) ;
widget - > setLayout ( hbox ) ;
2009-09-24 17:38:40 -04:00
2010-07-15 07:25:34 -04:00
QWidgetAction * widgetAction = new QWidgetAction ( this ) ;
widgetAction - > setDefaultWidget ( widget ) ;
contextMnu . addAction ( widgetAction ) ;
contextMnu . addAction ( chatAct ) ;
contextMnu . addAction ( msgAct ) ;
contextMnu . addAction ( configurefriendAct ) ;
//contextMnu.addAction( profileviewAct);
2010-08-30 09:03:12 -04:00
contextMnu . addAction ( recommendfriendAct ) ;
2010-08-28 15:50:38 -04:00
contextMnu . addAction ( connectfriendAct ) ;
2010-07-15 07:25:34 -04:00
contextMnu . addAction ( pastePersonAct ) ;
contextMnu . addAction ( removefriendAct ) ;
//contextMnu.addAction( exportfriendAct);
contextMnu . addSeparator ( ) ;
contextMnu . addAction ( expandAll ) ;
contextMnu . addAction ( collapseAll ) ;
contextMnu . exec ( QCursor : : pos ( ) ) ;
2008-11-24 09:07:26 -05:00
}
2010-05-06 10:39:50 -04:00
// replaced by shortcut
//void PeersDialog::keyPressEvent(QKeyEvent *e)
//{
// if(e->key() == Qt::Key_Delete)
// {
// removefriend() ;
// e->accept() ;
// }
// else
// MainPage::keyPressEvent(e) ;
//}
2010-01-17 12:58:28 -05:00
2009-11-17 07:45:06 -05:00
void PeersDialog : : updateDisplay ( )
{
2010-09-04 10:23:30 -04:00
insertPeers ( ) ;
2009-11-17 07:45:06 -05:00
}
2007-11-14 22:18:48 -05:00
/* get the list of peers from the RsIface. */
void PeersDialog : : insertPeers ( )
{
2010-08-03 08:35:26 -04:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::insertPeers() called. " < < std : : endl ;
# endif
std : : list < std : : string > gpgFriends ;
std : : list < std : : string > : : iterator it ;
std : : list < StatusInfo > statusInfo ;
2010-08-20 14:45:44 -04:00
rsStatus - > getStatusList ( statusInfo ) ;
2010-08-03 08:35:26 -04:00
if ( ! rsPeers ) {
/* not ready yet! */
std : : cerr < < " PeersDialog::insertPeers() not ready yet : rsPeers unintialized. " < < std : : endl ;
return ;
}
bool bHideUnconnected = ui . action_Hide_Offline_Friends - > isChecked ( ) ;
2010-09-01 13:56:15 -04:00
std : : list < std : : string > privateChatIds ;
rsMsgs - > getPrivateChatQueueIds ( privateChatIds ) ;
2010-08-03 08:35:26 -04:00
rsPeers - > getGPGAcceptedList ( gpgFriends ) ;
//add own gpg id, if we have more than on location (ssl client)
std : : list < std : : string > ownSslContacts ;
std : : string ownId = rsPeers - > getGPGOwnId ( ) ;
rsPeers - > getSSLChildListOfGPGId ( ownId , ownSslContacts ) ;
if ( ownSslContacts . size ( ) > 0 ) {
gpgFriends . push_back ( ownId ) ;
}
/* get a link to the table */
QTreeWidget * peertreeWidget = ui . peertreeWidget ;
//remove items that are not friends anymore
int itemCount = peertreeWidget - > topLevelItemCount ( ) ;
int index = 0 ;
while ( index < itemCount ) {
std : : string gpg_widget_id = ( peertreeWidget - > topLevelItem ( index ) ) - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) . toStdString ( ) ;
2010-08-25 14:31:56 -04:00
if ( std : : find ( gpgFriends . begin ( ) , gpgFriends . end ( ) , gpg_widget_id ) = = gpgFriends . end ( ) ) {
2010-08-03 08:35:26 -04:00
delete ( peertreeWidget - > takeTopLevelItem ( index ) ) ;
// count again
itemCount = peertreeWidget - > topLevelItemCount ( ) ;
} else {
index + + ;
}
}
//add the gpg friends
for ( it = gpgFriends . begin ( ) ; it ! = gpgFriends . end ( ) ; it + + ) {
2010-02-08 09:06:43 -05:00
# ifdef PEERS_DEBUG
2010-08-03 08:35:26 -04:00
std : : cerr < < " PeersDialog::insertPeers() inserting gpg_id : " < < * it < < std : : endl ;
2010-02-08 09:06:43 -05:00
# endif
2010-06-08 17:38:36 -04:00
2010-08-03 08:35:26 -04:00
/* make a widget per friend */
QTreeWidgetItem * gpg_item = NULL ;
QTreeWidgetItem * gpg_item_loop = NULL ;
QString gpgid = QString : : fromStdString ( * it ) ;
itemCount = peertreeWidget - > topLevelItemCount ( ) ;
for ( int nIndex = 0 ; nIndex < itemCount ; nIndex + + ) {
gpg_item_loop = peertreeWidget - > topLevelItem ( nIndex ) ;
if ( gpg_item_loop - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) = = gpgid ) {
gpg_item = gpg_item_loop ;
break ;
}
}
2007-11-14 22:18:48 -05:00
2010-08-03 08:35:26 -04:00
RsPeerDetails detail ;
if ( ( ! rsPeers - > getPeerDetails ( * it , detail ) | | ! detail . accept_connection )
& & detail . gpg_id ! = ownId ) {
//don't accept anymore connection, remove from the view
if ( gpg_item ) {
delete ( peertreeWidget - > takeTopLevelItem ( peertreeWidget - > indexOfTopLevelItem ( gpg_item ) ) ) ;
}
continue ;
2008-01-25 03:49:40 -05:00
}
2010-08-03 08:35:26 -04:00
if ( gpg_item = = NULL ) {
gpg_item = new MyPeerTreeWidgetItem ( peertreeWidget , 0 ) ; //set type to 0 for custom popup menu
2010-09-10 16:43:11 -04:00
/* Add gpg item to the list. Add here, because for setHidden the item must be added */
peertreeWidget - > addTopLevelItem ( gpg_item ) ;
2010-08-03 08:35:26 -04:00
gpg_item - > setChildIndicatorPolicy ( QTreeWidgetItem : : DontShowIndicatorWhenChildless ) ;
}
2010-06-08 17:38:36 -04:00
2010-08-03 08:35:26 -04:00
gpg_item - > setText ( COLUMN_NAME , QString : : fromStdString ( detail . name ) ) ;
gpg_item - > setSizeHint ( COLUMN_NAME , QSize ( 26 , 26 ) ) ;
2007-11-14 22:18:48 -05:00
2010-08-03 08:35:26 -04:00
gpg_item - > setTextAlignment ( COLUMN_NAME , Qt : : AlignLeft | Qt : : AlignVCenter ) ;
2010-01-13 19:38:36 -05:00
2010-08-03 08:35:26 -04:00
/* not displayed, used to find back the item */
gpg_item - > setData ( COLUMN_DATA , ROLE_ID , QString : : fromStdString ( detail . id ) ) ;
2010-01-02 16:45:46 -05:00
2010-03-06 16:30:18 -05:00
//remove items that are not friends anymore
2010-08-03 08:35:26 -04:00
int childCount = gpg_item - > childCount ( ) ;
int childIndex = 0 ;
while ( childIndex < childCount ) {
std : : string ssl_id = gpg_item - > child ( childIndex ) - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) . toStdString ( ) ;
if ( ! rsPeers - > isFriend ( ssl_id ) ) {
delete ( gpg_item - > takeChild ( childIndex ) ) ;
// count again
childCount = gpg_item - > childCount ( ) ;
2010-01-13 16:25:18 -05:00
} else {
2010-08-03 08:35:26 -04:00
childIndex + + ;
2010-01-13 16:25:18 -05:00
}
}
2010-08-03 08:35:26 -04:00
//update the childs (ssl certs)
bool gpg_connected = false ;
bool gpg_online = false ;
2010-09-01 13:56:15 -04:00
bool gpg_hasPrivateChat = false ;
2010-08-03 08:35:26 -04:00
std : : list < std : : string > sslContacts ;
2010-09-08 14:36:36 -04:00
2010-08-03 08:35:26 -04:00
rsPeers - > getSSLChildListOfGPGId ( detail . gpg_id , sslContacts ) ;
for ( std : : list < std : : string > : : iterator sslIt = sslContacts . begin ( ) ; sslIt ! = sslContacts . end ( ) ; sslIt + + ) {
QTreeWidgetItem * sslItem = NULL ;
//find the corresponding sslItem child item of the gpg item
bool newChild = true ;
childCount = gpg_item - > childCount ( ) ;
for ( int childIndex = 0 ; childIndex < childCount ; childIndex + + ) {
if ( gpg_item - > child ( childIndex ) - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) . toStdString ( ) = = * sslIt ) {
sslItem = gpg_item - > child ( childIndex ) ;
newChild = false ;
2010-06-25 10:19:48 -04:00
break ;
}
2010-01-13 16:22:52 -05:00
}
2009-07-13 15:58:11 -04:00
2010-08-03 08:35:26 -04:00
RsPeerDetails sslDetail ;
if ( ! rsPeers - > getPeerDetails ( * sslIt , sslDetail ) | | ! rsPeers - > isFriend ( * sslIt ) ) {
# ifdef PEERS_DEBUG
std : : cerr < < " Removing widget from the view : id : " < < * sslIt < < std : : endl ;
# endif
//child has disappeared, remove it from the gpg_item
if ( sslItem ) {
gpg_item - > removeChild ( sslItem ) ;
2010-05-12 16:10:22 -04:00
}
2010-01-13 16:25:18 -05:00
continue ;
}
2007-11-14 22:18:48 -05:00
2010-08-03 08:35:26 -04:00
if ( newChild ) {
sslItem = new MyPeerTreeWidgetItem ( peertreeWidget , 1 ) ; //set type to 1 for custom popup menu
2010-09-10 16:43:11 -04:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::insertPeers() inserting sslItem. " < < std : : endl ;
# endif
/* Add ssl child to the list. Add here, because for setHidden the item must be added */
gpg_item - > addChild ( sslItem ) ;
// gpg_item->setExpanded(true);
2010-05-12 16:10:22 -04:00
}
2010-01-13 16:25:18 -05:00
/* not displayed, used to find back the item */
2010-08-03 08:35:26 -04:00
sslItem - > setData ( COLUMN_DATA , ROLE_ID , QString : : fromStdString ( sslDetail . id ) ) ;
2010-01-13 16:16:18 -05:00
2010-08-03 08:35:26 -04:00
QString sText ;
2010-08-06 17:14:25 -04:00
std : : string customStateString ;
if ( sslDetail . state & RS_PEER_STATE_CONNECTED ) {
customStateString = rsMsgs - > getCustomStateString ( sslDetail . id ) ;
}
2010-09-12 10:10:28 -04:00
sText = tr ( " location " ) + " : " + QString : : fromStdString ( sslDetail . location ) ;
2010-08-03 08:35:26 -04:00
if ( customStateString . empty ( ) = = false ) {
2010-09-12 10:10:28 -04:00
sText + = " - " + QString : : fromStdString ( customStateString ) ;
2010-08-03 08:35:26 -04:00
}
sslItem - > setText ( COLUMN_NAME , sText ) ;
sslItem - > setToolTip ( COLUMN_NAME , sText ) ;
2010-05-12 16:10:22 -04:00
2010-08-03 08:35:26 -04:00
/* not displayed, used to find back the item */
sslItem - > setText ( COLUMN_STATE , QString : : fromStdString ( sslDetail . autoconnect ) ) ;
// sort location
sslItem - > setData ( COLUMN_STATE , ROLE_SORT , sText ) ;
/* change color and icon */
2010-09-01 13:56:15 -04:00
QIcon sslIcon ;
2010-09-08 14:36:36 -04:00
QFont sslFont ;
QColor sslColor ;
2010-08-03 08:35:26 -04:00
if ( sslDetail . state & RS_PEER_STATE_CONNECTED ) {
sslItem - > setHidden ( false ) ;
gpg_connected = true ;
2010-09-01 13:56:15 -04:00
sslIcon = QIcon ( " :/images/connect_established.png " ) ;
2010-08-03 08:35:26 -04:00
sslItem - > setIcon ( COLUMN_STATE , ( QIcon ( " :/images/encrypted32.png " ) ) ) ;
2010-09-08 14:36:36 -04:00
sslFont . setBold ( true ) ;
sslColor = Qt : : darkBlue ;
2010-08-03 08:35:26 -04:00
} else if ( sslDetail . state & RS_PEER_STATE_ONLINE ) {
sslItem - > setHidden ( bHideUnconnected ) ;
gpg_online = true ;
2010-01-13 16:25:18 -05:00
2010-09-08 14:36:36 -04:00
sslFont . setBold ( true ) ;
sslColor = Qt : : black ;
2010-08-03 08:35:26 -04:00
} else {
sslItem - > setHidden ( bHideUnconnected ) ;
if ( sslDetail . autoconnect ! = " Offline " ) {
2010-09-01 13:56:15 -04:00
sslIcon = QIcon ( " :/images/connect_creating.png " ) ;
2010-01-13 16:22:52 -05:00
} else {
2010-09-01 13:56:15 -04:00
sslIcon = QIcon ( " :/images/connect_no.png " ) ;
2010-01-13 16:16:18 -05:00
}
2010-01-13 16:22:52 -05:00
2010-09-08 14:36:36 -04:00
sslFont . setBold ( false ) ;
sslColor = Qt : : black ;
2010-01-13 16:16:18 -05:00
}
2010-01-13 16:25:18 -05:00
2010-09-01 13:56:15 -04:00
if ( std : : find ( privateChatIds . begin ( ) , privateChatIds . end ( ) , sslDetail . id ) ! = privateChatIds . end ( ) ) {
// private chat is available
sslIcon = QIcon ( " :/images/chat.png " ) ;
gpg_hasPrivateChat = true ;
}
sslItem - > setIcon ( COLUMN_NAME , sslIcon ) ;
2010-09-08 14:36:36 -04:00
for ( int i = 0 ; i < COLUMN_COUNT ; i + + ) {
sslItem - > setTextColor ( i , sslColor ) ;
sslItem - > setFont ( i , sslFont ) ;
}
2010-08-03 08:35:26 -04:00
}
int i = 0 ;
2010-09-01 13:56:15 -04:00
QIcon gpgIcon ;
2010-08-03 08:35:26 -04:00
if ( gpg_connected ) {
gpg_item - > setHidden ( false ) ;
2010-09-08 14:36:36 -04:00
2010-09-12 10:10:28 -04:00
int bestPeerState = 0 ; // for gpg item
std : : string bestSslId ; // for gpg item
unsigned int bestRSState = 0 ; // for gpg item
2010-06-08 17:38:36 -04:00
2010-08-03 08:35:26 -04:00
std : : list < StatusInfo > : : iterator it ;
for ( it = statusInfo . begin ( ) ; it ! = statusInfo . end ( ) ; it + + ) {
2010-06-08 17:38:36 -04:00
2010-08-03 08:35:26 -04:00
// don't forget the kids
2010-09-08 14:36:36 -04:00
std : : list < std : : string > : : iterator cont_it ;
2010-08-03 08:35:26 -04:00
for ( cont_it = sslContacts . begin ( ) ; cont_it ! = sslContacts . end ( ) ; cont_it + + ) {
2010-06-08 17:38:36 -04:00
2010-08-03 08:35:26 -04:00
if ( ( it - > id = = * cont_it ) & & ( rsPeers - > isOnline ( * cont_it ) ) ) {
2010-06-08 17:38:36 -04:00
2010-09-08 14:36:36 -04:00
int peerState = 0 ;
2010-09-12 10:10:28 -04:00
gpg_item - > setText ( COLUMN_INFO , StatusDefs : : name ( it - > status ) ) ;
2010-06-08 17:38:36 -04:00
2010-08-03 08:35:26 -04:00
switch ( it - > status ) {
case RS_STATUS_INACTIVE :
2010-09-08 14:36:36 -04:00
peerState = PEER_STATE_INACTIVE ;
2010-08-03 08:35:26 -04:00
break ;
case RS_STATUS_ONLINE :
2010-09-08 14:36:36 -04:00
peerState = PEER_STATE_ONLINE ;
2010-08-03 08:35:26 -04:00
break ;
case RS_STATUS_AWAY :
2010-09-08 14:36:36 -04:00
peerState = PEER_STATE_AWAY ;
2010-08-03 08:35:26 -04:00
break ;
case RS_STATUS_BUSY :
2010-09-08 14:36:36 -04:00
peerState = PEER_STATE_BUSY ;
2010-08-03 08:35:26 -04:00
break ;
2010-06-08 17:38:36 -04:00
}
2010-09-08 14:36:36 -04:00
/* find the best ssl contact for the gpg item */
if ( bestPeerState = = 0 ) {
/* first ssl contact */
bestPeerState = peerState ;
bestSslId = * cont_it ;
2010-09-12 10:10:28 -04:00
bestRSState = it - > status ;
2010-09-08 14:36:36 -04:00
} else if ( peerState < bestPeerState ) {
/* higher state */
bestPeerState = peerState ;
bestSslId = * cont_it ;
2010-09-12 10:10:28 -04:00
bestRSState = it - > status ;
2010-09-08 14:36:36 -04:00
} else if ( peerState = = bestPeerState ) {
/* equal state ... use first */
}
}
}
}
2010-09-11 16:25:08 -04:00
if ( bestPeerState = = 0 ) {
// show as online
bestPeerState = PEER_STATE_ONLINE ;
2010-09-12 10:10:28 -04:00
bestRSState = RS_STATUS_ONLINE ;
2010-09-11 16:25:08 -04:00
}
2010-09-08 14:36:36 -04:00
2010-09-12 10:10:28 -04:00
QColor textColor = StatusDefs : : textColor ( bestRSState ) ;
QFont font = StatusDefs : : font ( bestRSState ) ;
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
gpg_item - > setTextColor ( i , textColor ) ;
gpg_item - > setFont ( i , font ) ;
2010-01-18 17:42:10 -05:00
}
2010-09-08 14:36:36 -04:00
2010-09-12 10:10:28 -04:00
gpgIcon = QIcon ( StatusDefs : : imageUser ( bestRSState ) ) ;
gpg_item - > setText ( COLUMN_STATE , StatusDefs : : name ( bestRSState ) ) ;
gpg_item - > setToolTip ( COLUMN_NAME , StatusDefs : : tooltip ( bestRSState ) ) ;
2010-09-11 16:52:37 -04:00
gpg_item - > setData ( COLUMN_STATE , ROLE_SORT , BuildStateSortString ( true , gpg_item - > text ( COLUMN_NAME ) , bestPeerState ) ) ;
2010-08-03 08:35:26 -04:00
} else if ( gpg_online ) {
gpg_item - > setHidden ( bHideUnconnected ) ;
2010-09-02 04:25:30 -04:00
gpgIcon = QIcon ( IMAGE_AVAILABLE ) ;
2010-08-03 08:35:26 -04:00
gpg_item - > setText ( COLUMN_STATE , tr ( " Available " ) ) ;
gpg_item - > setData ( COLUMN_STATE , ROLE_SORT , BuildStateSortString ( true , gpg_item - > text ( COLUMN_NAME ) , PEER_STATE_AVAILABLE ) ) ;
QFont font ;
font . setBold ( true ) ;
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
gpg_item - > setTextColor ( i , ( Qt : : black ) ) ;
gpg_item - > setFont ( i , font ) ;
}
} else {
gpg_item - > setHidden ( bHideUnconnected ) ;
2010-09-12 10:10:28 -04:00
gpgIcon = QIcon ( StatusDefs : : imageUser ( RS_STATUS_OFFLINE ) ) ;
gpg_item - > setText ( COLUMN_STATE , StatusDefs : : name ( RS_STATUS_OFFLINE ) ) ;
2010-08-03 08:35:26 -04:00
gpg_item - > setData ( COLUMN_STATE , ROLE_SORT , BuildStateSortString ( true , gpg_item - > text ( COLUMN_NAME ) , PEER_STATE_OFFLINE ) ) ;
2010-09-12 10:10:28 -04:00
QColor textColor = StatusDefs : : textColor ( RS_STATUS_OFFLINE ) ;
QFont font = StatusDefs : : font ( RS_STATUS_OFFLINE ) ;
2010-08-03 08:35:26 -04:00
for ( i = 0 ; i < COLUMN_COUNT ; i + + ) {
2010-09-12 10:10:28 -04:00
gpg_item - > setTextColor ( i , textColor ) ;
gpg_item - > setFont ( i , font ) ;
2010-06-13 08:26:23 -04:00
}
2010-01-13 16:22:52 -05:00
}
2010-08-03 08:35:26 -04:00
2010-09-01 13:56:15 -04:00
if ( gpg_hasPrivateChat ) {
gpgIcon = QIcon ( " :/images/chat.png " ) ;
}
gpg_item - > setIcon ( COLUMN_NAME , gpgIcon ) ;
2010-08-03 08:35:26 -04:00
}
2010-08-30 09:03:12 -04:00
QTreeWidgetItem * c = getCurrentPeer ( ) ;
if ( c & & c - > isHidden ( ) ) {
// active item is hidden, deselect it
ui . peertreeWidget - > setCurrentItem ( NULL ) ;
}
2007-11-14 22:18:48 -05:00
}
/* Utility Fns */
std : : string getPeerRsCertId ( QTreeWidgetItem * i )
{
2010-06-25 10:19:48 -04:00
std : : string id = i - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) . toStdString ( ) ;
return id ;
2007-11-14 22:18:48 -05:00
}
/** Open a QFileDialog to browse for export a file. */
void PeersDialog : : exportfriend ( )
{
QTreeWidgetItem * c = getCurrentPeer ( ) ;
2008-07-09 05:53:47 -04:00
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " PeersDialog::exportfriend() " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
if ( ! c )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-01-13 16:16:18 -05:00
std : : cerr < < " PeersDialog::exportfriend() None Selected -- sorry " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return ;
}
std : : string id = getPeerRsCertId ( c ) ;
QString fileName = QFileDialog : : getSaveFileName ( this , tr ( " Save Certificate " ) , " " ,
tr ( " Certificates (*.pqi) " ) ) ;
std : : string file = fileName . toStdString ( ) ;
if ( file ! = " " )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::exportfriend() Saving to: " < < file < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2008-01-25 03:49:40 -05:00
if ( rsPeers )
{
2010-01-13 16:22:52 -05:00
rsPeers - > saveCertificateToFile ( id , file ) ;
2008-01-25 03:49:40 -05:00
}
2007-11-14 22:18:48 -05:00
}
}
2010-06-17 13:39:32 -04:00
void PeersDialog : : chatfriendproxy ( )
{
chatfriend ( getCurrentPeer ( ) ) ;
2010-04-15 08:02:23 -04:00
}
2010-06-17 13:39:32 -04:00
void PeersDialog : : chatfriend ( QTreeWidgetItem * pPeer )
2010-04-15 08:02:23 -04:00
{
2010-06-17 13:39:32 -04:00
if ( pPeer = = NULL ) {
return ;
2010-04-15 08:02:23 -04:00
}
2007-11-14 22:18:48 -05:00
2010-06-25 10:19:48 -04:00
std : : string id = pPeer - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) . toStdString ( ) ;
2010-06-17 13:39:32 -04:00
PopupChatDialog : : chatFriend ( id ) ;
2007-11-14 22:18:48 -05:00
}
void PeersDialog : : msgfriend ( )
{
2010-06-17 13:39:32 -04:00
QTreeWidgetItem * peer = getCurrentPeer ( ) ;
2007-11-14 22:18:48 -05:00
2010-06-17 13:39:32 -04:00
if ( ! peer )
return ;
2010-05-02 20:09:55 -04:00
2010-06-25 10:19:48 -04:00
std : : string id = peer - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) . toStdString ( ) ;
2010-06-17 13:39:32 -04:00
MessageComposer : : msgFriend ( id ) ;
2007-11-14 22:18:48 -05:00
}
2010-07-15 07:25:34 -04:00
void PeersDialog : : recommendfriend ( )
{
QTreeWidgetItem * peer = getCurrentPeer ( ) ;
if ( ! peer )
return ;
std : : list < std : : string > ids ;
ids . push_back ( peer - > data ( COLUMN_DATA , ROLE_ID ) . toString ( ) . toStdString ( ) ) ;
MessageComposer : : recommendFriend ( ids ) ;
}
void PeersDialog : : pastePerson ( )
{
RSLinkClipboard : : process ( RetroShareLink : : TYPE_PERSON , RSLINK_PROCESS_NOTIFY_ERROR ) ;
}
2007-11-14 22:18:48 -05:00
QTreeWidgetItem * PeersDialog : : getCurrentPeer ( )
{
/* get the current, and extract the Id */
/* get a link to the table */
QTreeWidget * peerWidget = ui . peertreeWidget ;
QTreeWidgetItem * item = peerWidget - > currentItem ( ) ;
if ( ! item )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " Invalid Current Item " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return NULL ;
}
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
/* Display the columns of this item. */
std : : ostringstream out ;
out < < " CurrentPeerItem: " < < std : : endl ;
2010-06-08 17:38:36 -04:00
for ( int i = 1 ; i < COLUMN_COUNT ; i + + )
2007-11-14 22:18:48 -05:00
{
QString txt = item - > text ( i ) ;
out < < " \t " < < i < < " : " < < txt . toStdString ( ) < < std : : endl ;
}
std : : cerr < < out . str ( ) ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return item ;
}
/* So from the Peers Dialog we can call the following control Functions:
* ( 1 ) Remove Current . FriendRemove ( id )
* ( 2 ) Allow / DisAllow . FriendStatus ( id , accept )
* ( 2 ) Connect . FriendConnectAttempt ( id , accept )
* ( 3 ) Set Address . FriendSetAddress ( id , str , port )
* ( 4 ) Set Trust . FriendTrustSignature ( id , bool )
* ( 5 ) Configure ( GUI Only ) - > 3 / 4
*
* All of these rely on the finding of the current Id .
*/
2009-07-13 15:58:11 -04:00
2007-11-14 22:18:48 -05:00
2008-11-24 09:07:26 -05:00
void PeersDialog : : removefriend ( )
2007-11-14 22:18:48 -05:00
{
QTreeWidgetItem * c = getCurrentPeer ( ) ;
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2007-11-14 22:18:48 -05:00
std : : cerr < < " PeersDialog::removefriend() " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
if ( ! c )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-04-15 08:02:23 -04:00
std : : cerr < < " PeersDialog::removefriend() None Selected -- sorry " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2007-11-14 22:18:48 -05:00
return ;
}
2008-01-25 03:49:40 -05:00
if ( rsPeers )
{
2010-05-06 13:04:09 -04:00
if ( ( QMessageBox : : question ( this , tr ( " RetroShare " ) , tr ( " Do you want to remove this Friend? " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : Yes ) ) = = QMessageBox : : Yes )
{
rsPeers - > removeFriend ( getPeerRsCertId ( c ) ) ;
emit friendsUpdated ( ) ;
}
else
return ;
2008-01-25 03:49:40 -05:00
}
2007-11-14 22:18:48 -05:00
}
2008-11-24 09:07:26 -05:00
void PeersDialog : : connectfriend ( )
2007-11-14 22:18:48 -05:00
{
2010-08-28 15:50:38 -04:00
QTreeWidgetItem * c = getCurrentPeer ( ) ;
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-08-28 15:50:38 -04:00
std : : cerr < < " PeersDialog::connectfriend() " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2010-08-28 15:50:38 -04:00
if ( ! c )
{
2009-07-13 15:58:11 -04:00
# ifdef PEERS_DEBUG
2010-08-28 15:50:38 -04:00
std : : cerr < < " PeersDialog::connectfriend() Noone Selected -- sorry " < < std : : endl ;
2008-07-09 05:53:47 -04:00
# endif
2010-08-28 15:50:38 -04:00
return ;
}
2008-04-07 18:54:15 -04:00
2010-08-28 15:50:38 -04:00
if ( rsPeers )
{
if ( c - > type ( ) = = 0 ) {
int childCount = c - > childCount ( ) ;
for ( int childIndex = 0 ; childIndex < childCount ; childIndex + + ) {
QTreeWidgetItem * item = c - > child ( childIndex ) ;
if ( item - > type ( ) = = 1 ) {
rsPeers - > connectAttempt ( getPeerRsCertId ( item ) ) ;
item - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_CONNECT2 ) ) ) ;
}
}
} else {
//this is a SSL key
rsPeers - > connectAttempt ( getPeerRsCertId ( c ) ) ;
c - > setIcon ( COLUMN_NAME , ( QIcon ( IMAGE_CONNECT2 ) ) ) ;
}
}
2007-11-14 22:18:48 -05:00
}
/* GUI stuff -> don't do anything directly with Control */
2008-11-24 09:07:26 -05:00
void PeersDialog : : configurefriend ( )
2007-11-14 22:18:48 -05:00
{
2009-05-07 18:43:11 -04:00
ConfCertDialog : : show ( getPeerRsCertId ( getCurrentPeer ( ) ) ) ;
2007-11-14 22:18:48 -05:00
}
2009-09-30 18:30:57 -04:00
void PeersDialog : : resetStatusBar ( )
{
2010-02-08 11:42:26 -05:00
# ifdef PEERS_DEBUG
2009-09-30 18:30:57 -04:00
std : : cerr < < " PeersDialog: reseting status bar. " < < std : : endl ;
2010-02-08 11:42:26 -05:00
# endif
2009-09-30 18:30:57 -04:00
ui . statusStringLabel - > setText ( QString ( " " ) ) ;
}
void PeersDialog : : updateStatusTyping ( )
{
2010-08-30 14:33:19 -04:00
if ( time ( NULL ) - last_status_send_time > 5 ) // limit 'peer is typing' packets to at most every 10 sec
{
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog: sending group chat typing info. " < < std : : endl ;
# endif
2009-09-30 18:30:57 -04:00
2010-08-30 14:33:19 -04:00
# ifdef ONLY_FOR_LINGUIST
tr ( " is typing... " ) ;
# endif
rsMsgs - > sendGroupChatStatusString ( " is typing... " ) ;
last_status_send_time = time ( NULL ) ;
}
2009-09-30 18:30:57 -04:00
}
2010-08-30 14:33:19 -04:00
2009-09-30 18:30:57 -04:00
// Called by libretroshare through notifyQt to display the peer's status
//
2010-08-30 14:33:19 -04:00
void PeersDialog : : updateStatusString ( const QString & peer_id , const QString & status_string )
2009-09-30 18:30:57 -04:00
{
2010-08-30 14:33:19 -04:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog: received group chat typing info. updating gui. " < < std : : endl ;
# endif
2009-09-30 18:30:57 -04:00
2010-08-30 14:33:19 -04:00
QString status = QString : : fromStdString ( rsPeers - > getPeerName ( peer_id . toStdString ( ) ) ) + " " + tr ( status_string . toAscii ( ) ) ;
ui . statusStringLabel - > setText ( status ) ; // displays info for 5 secs.
2009-09-30 18:30:57 -04:00
2010-08-30 14:33:19 -04:00
QTimer : : singleShot ( 5000 , this , SLOT ( resetStatusBar ( ) ) ) ;
2009-09-30 18:30:57 -04:00
}
2009-09-30 16:53:18 -04:00
void PeersDialog : : updatePeersAvatar ( const QString & peer_id )
{
2010-09-01 13:56:15 -04:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog: Got notified of new avatar for peer " < < peer_id . toStdString ( ) < < std : : endl ;
# endif
2009-09-30 16:53:18 -04:00
2010-09-01 13:56:15 -04:00
PopupChatDialog * pcd = PopupChatDialog : : getPrivateChat ( peer_id . toStdString ( ) , 0 ) ;
if ( pcd ) {
pcd - > updatePeerAvatar ( peer_id . toStdString ( ) ) ;
}
2009-09-30 16:53:18 -04:00
}
2009-09-29 16:37:20 -04:00
void PeersDialog : : updatePeerStatusString ( const QString & peer_id , const QString & status_string , bool is_private_chat )
2009-05-05 15:15:32 -04:00
{
2010-08-30 14:33:19 -04:00
if ( is_private_chat )
{
2010-09-01 13:56:15 -04:00
PopupChatDialog * pcd = PopupChatDialog : : getPrivateChat ( peer_id . toStdString ( ) , 0 ) ;
if ( pcd ) {
pcd - > updateStatusString ( peer_id , status_string ) ;
}
2010-08-30 14:33:19 -04:00
}
else
{
# ifdef PEERS_DEBUG
std : : cerr < < " Updating public chat msg from peer " < < rsPeers - > getPeerName ( peer_id . toStdString ( ) ) < < " : " < < status_string . toStdString ( ) < < std : : endl ;
# endif
2009-09-30 18:30:57 -04:00
2010-08-30 14:33:19 -04:00
updateStatusString ( peer_id , status_string ) ;
}
2009-05-05 15:15:32 -04:00
}
2007-11-14 22:18:48 -05:00
2010-09-01 13:56:15 -04:00
void PeersDialog : : publicChatChanged ( int type )
{
if ( type = = NOTIFY_TYPE_ADD ) {
insertChat ( ) ;
}
}
2010-09-04 10:23:30 -04:00
void PeersDialog : : addChatMsg ( bool incoming , bool history , QString & name , QDateTime & sendTime , QString & message )
{
unsigned int formatFlag = CHAT_FORMATMSG_EMBED_LINKS ;
// embed smileys ?
if ( Settings - > valueFromGroup ( QString ( " Chat " ) , QString : : fromUtf8 ( " Emoteicons_GroupChat " ) , true ) . toBool ( ) ) {
formatFlag | = CHAT_FORMATMSG_EMBED_SMILEYS ;
}
ChatStyle : : enumFormatMessage type ;
if ( incoming ) {
if ( history ) {
type = ChatStyle : : FORMATMSG_HINCOMING ;
} else {
type = ChatStyle : : FORMATMSG_INCOMING ;
}
} else {
if ( history ) {
type = ChatStyle : : FORMATMSG_HOUTGOING ;
} else {
type = ChatStyle : : FORMATMSG_OUTGOING ;
}
}
QString formatMsg = style . formatMessage ( type , name , sendTime , message , formatFlag ) ;
ui . msgText - > append ( formatMsg ) ;
}
2008-07-10 06:34:49 -04:00
void PeersDialog : : insertChat ( )
{
2010-08-31 13:13:52 -04:00
std : : list < ChatInfo > newchat ;
2010-09-01 13:56:15 -04:00
if ( ! rsMsgs - > getPublicChatQueue ( newchat ) )
2010-08-31 13:13:52 -04:00
{
# ifdef PEERS_DEBUG
std : : cerr < < " no chat available. " < < std : : endl ;
# endif
return ;
}
# ifdef PEERS_DEBUG
std : : cerr < < " got new chat. " < < std : : endl ;
# endif
std : : list < ChatInfo > : : iterator it ;
2008-07-10 06:34:49 -04:00
2010-08-31 13:13:52 -04:00
/* add in lines at the bottom */
for ( it = newchat . begin ( ) ; it ! = newchat . end ( ) ; it + + )
{
/* are they private? */
if ( it - > chatflags & RS_CHAT_PRIVATE )
{
2010-09-01 13:56:15 -04:00
/* this should not happen */
2010-08-31 13:13:52 -04:00
continue ;
}
2008-07-10 06:34:49 -04:00
2010-09-04 10:23:30 -04:00
QDateTime sendTime = QDateTime : : fromTime_t ( it - > sendTime ) ;
QString name = QString : : fromStdString ( rsPeers - > getPeerName ( it - > rsid ) ) ;
QString msg = QString : : fromStdWString ( it - > msg ) ;
2008-07-10 06:34:49 -04:00
2010-09-04 10:23:30 -04:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::insertChat(): " < < msg < < std : : endl ;
# endif
2008-07-10 06:34:49 -04:00
2010-09-04 10:23:30 -04:00
bool incoming = false ;
2010-02-07 07:36:37 -05:00
2010-08-31 13:13:52 -04:00
// notify with a systray icon msg
if ( it - > rsid ! = rsPeers - > getOwnId ( ) )
{
2010-09-04 10:23:30 -04:00
incoming = true ;
2010-08-31 13:13:52 -04:00
// This is a trick to translate HTML into text.
2010-09-04 10:23:30 -04:00
QTextEdit editor ;
editor . setHtml ( msg ) ;
QString notifyMsg = name + " : " + editor . toPlainText ( ) ;
2010-08-31 13:13:52 -04:00
if ( notifyMsg . length ( ) > 30 )
2010-09-04 10:23:30 -04:00
emit notifyGroupChat ( QString ( " New group chat " ) , notifyMsg . left ( 30 ) + QString ( " ... " ) ) ;
2010-08-31 13:13:52 -04:00
else
emit notifyGroupChat ( QString ( " New group chat " ) , notifyMsg ) ;
}
2010-02-07 07:36:37 -05:00
2010-09-04 10:23:30 -04:00
historyKeeper . addMessage ( incoming , it - > rsid , name , sendTime , msg ) ;
addChatMsg ( incoming , false , name , sendTime , msg ) ;
2010-08-31 13:13:52 -04:00
}
2008-07-10 06:34:49 -04:00
}
2010-09-04 10:23:30 -04:00
bool PeersDialog : : eventFilter ( QObject * obj , QEvent * event )
2008-07-10 06:34:49 -04:00
{
2010-09-04 10:23:30 -04:00
if ( obj = = ui . lineEdit ) {
if ( event - > type ( ) = = QEvent : : KeyPress ) {
updateStatusTyping ( ) ;
QKeyEvent * keyEvent = static_cast < QKeyEvent * > ( event ) ;
if ( keyEvent & & ( keyEvent - > key ( ) = = Qt : : Key_Enter | | keyEvent - > key ( ) = = Qt : : Key_Return ) ) {
// Enter pressed
if ( Settings - > getChatSendMessageWithCtrlReturn ( ) ) {
if ( keyEvent - > modifiers ( ) & Qt : : ControlModifier ) {
// send message with Ctrl+Enter
sendMsg ( ) ;
return true ; // eat event
}
} else {
if ( keyEvent - > modifiers ( ) & Qt : : ControlModifier ) {
// insert return
ui . lineEdit - > textCursor ( ) . insertText ( " \n " ) ;
} else {
// send message with Enter
sendMsg ( ) ;
}
return true ; // eat event
}
}
}
}
// pass the event on to the parent class
return RsAutoUpdatePage : : eventFilter ( obj , event ) ;
2008-07-10 06:34:49 -04:00
}
void PeersDialog : : sendMsg ( )
{
QTextEdit * lineWidget = ui . lineEdit ;
2010-09-04 10:23:30 -04:00
if ( lineWidget - > toPlainText ( ) . isEmpty ( ) ) {
// nothing to send
return ;
}
2008-07-10 06:34:49 -04:00
2010-09-04 10:23:30 -04:00
std : : wstring message = lineWidget - > toHtml ( ) . toStdWString ( ) ;
2009-07-13 15:58:11 -04:00
2010-09-01 13:56:15 -04:00
# ifdef PEERS_DEBUG
std : : string msg ( ci . msg . begin ( ) , ci . msg . end ( ) ) ;
std : : cerr < < " PeersDialog::sendMsg(): " < < msg < < std : : endl ;
# endif
2008-07-10 06:34:49 -04:00
2010-09-01 13:56:15 -04:00
rsMsgs - > sendPublicChat ( message ) ;
ui . lineEdit - > clear ( ) ;
setFont ( ) ;
2008-07-10 06:34:49 -04:00
2010-09-01 13:56:15 -04:00
/* redraw send list */
insertSendList ( ) ;
2008-07-10 06:34:49 -04:00
}
void PeersDialog : : insertSendList ( )
{
2010-05-12 16:10:22 -04:00
# ifdef false
2008-07-10 06:34:49 -04:00
std : : list < std : : string > peers ;
std : : list < std : : string > : : iterator it ;
if ( ! rsPeers )
{
/* not ready yet! */
return ;
}
rsPeers - > getOnlineList ( peers ) ;
/* get a link to the table */
//QTreeWidget *sendWidget = ui.msgSendList;
QList < QTreeWidgetItem * > items ;
for ( it = peers . begin ( ) ; it ! = peers . end ( ) ; it + + )
{
RsPeerDetails details ;
if ( ! rsPeers - > getPeerDetails ( * it , details ) )
{
continue ; /* BAD */
}
/* make a widget per friend */
QTreeWidgetItem * item = new QTreeWidgetItem ( ( QTreeWidget * ) 0 ) ;
/* add all the labels */
/* (0) Person */
item - > setText ( 0 , QString : : fromStdString ( details . name ) ) ;
item - > setFlags ( Qt : : ItemIsUserCheckable | Qt : : ItemIsEnabled ) ;
//item -> setFlags(Qt::ItemIsUserCheckable);
item - > setCheckState ( 0 , Qt : : Checked ) ;
if ( rsicontrol - > IsInChat ( * it ) )
{
item - > setCheckState ( 0 , Qt : : Checked ) ;
}
else
{
item - > setCheckState ( 0 , Qt : : Unchecked ) ;
}
/* disable for the moment */
item - > setFlags ( Qt : : ItemIsUserCheckable ) ;
item - > setCheckState ( 0 , Qt : : Checked ) ;
/* add to the list */
items . append ( item ) ;
}
/* remove old items */
//sendWidget->clear();
//sendWidget->setColumnCount(1);
/* add the items in! */
//sendWidget->insertTopLevelItems(0, items);
//sendWidget->update(); /* update display */
2010-05-12 16:10:22 -04:00
# endif
2008-07-10 06:34:49 -04:00
}
/* to toggle the state */
void PeersDialog : : toggleSendItem ( QTreeWidgetItem * item , int col )
{
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2008-07-10 06:34:49 -04:00
std : : cerr < < " ToggleSendItem() " < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2008-07-10 06:34:49 -04:00
/* extract id */
std : : string id = ( item - > text ( 4 ) ) . toStdString ( ) ;
/* get state */
bool inChat = ( Qt : : Checked = = item - > checkState ( 0 ) ) ; /* alway column 0 */
/* call control fns */
rsicontrol - > SetInChat ( id , inChat ) ;
return ;
}
2009-03-12 13:57:30 -04:00
//============================================================================
2008-07-10 06:34:49 -04:00
void PeersDialog : : setColor ( )
{
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
bool ok ;
QRgb color = QColorDialog : : getRgba ( ui . lineEdit - > textColor ( ) . rgba ( ) , & ok , this ) ;
if ( ok ) {
_currentColor = QColor ( color ) ;
2009-01-22 20:58:56 -05:00
QPixmap pxm ( 16 , 16 ) ;
2008-07-10 06:34:49 -04:00
pxm . fill ( _currentColor ) ;
ui . colorChatButton - > setIcon ( pxm ) ;
}
setFont ( ) ;
}
void PeersDialog : : getFont ( )
{
bool ok ;
mCurrentFont = QFontDialog : : getFont ( & ok , mCurrentFont , this ) ;
setFont ( ) ;
}
void PeersDialog : : setFont ( )
{
mCurrentFont . setBold ( ui . textboldChatButton - > isChecked ( ) ) ;
mCurrentFont . setUnderline ( ui . textunderlineChatButton - > isChecked ( ) ) ;
mCurrentFont . setItalic ( ui . textitalicChatButton - > isChecked ( ) ) ;
ui . lineEdit - > setFont ( mCurrentFont ) ;
ui . lineEdit - > setTextColor ( _currentColor ) ;
2010-09-10 14:38:46 -04:00
Settings - > setChatScreenFont ( mCurrentFont . toString ( ) ) ;
2008-07-10 06:34:49 -04:00
2008-11-24 09:07:26 -05:00
ui . lineEdit - > setFocus ( ) ;
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
}
2009-07-13 15:58:11 -04:00
void PeersDialog : : underline ( )
2008-11-24 09:07:26 -05:00
{
_underline = ! _underline ;
ui . lineEdit - > setFontUnderline ( _underline ) ;
2008-07-10 06:34:49 -04:00
}
2009-07-13 15:58:11 -04:00
2008-07-10 06:34:49 -04:00
2008-11-24 09:07:26 -05:00
// Update Chat Info information
2009-07-13 15:58:11 -04:00
void PeersDialog : : setChatInfo ( QString info , QColor color )
2008-11-24 09:07:26 -05:00
{
static unsigned int nbLines = 0 ;
+ + nbLines ;
// Check log size, clear it if too big
if ( nbLines > 200 ) {
ui . msgText - > clear ( ) ;
nbLines = 1 ;
}
ui . msgText - > append ( QString : : fromUtf8 ( " <font color='grey'> " ) + QTime : : currentTime ( ) . toString ( QString : : fromUtf8 ( " hh:mm:ss " ) ) + QString : : fromUtf8 ( " </font> - <font color=' " ) + color . name ( ) + QString : : fromUtf8 ( " '><i> " ) + info + QString : : fromUtf8 ( " </i></font> " ) ) ;
}
2009-07-13 15:58:11 -04:00
void PeersDialog : : on_actionClearChat_triggered ( )
2008-11-24 09:07:26 -05:00
{
2010-09-04 10:23:30 -04:00
ui . msgText - > clear ( ) ;
2008-11-24 09:07:26 -05:00
}
2009-07-13 15:58:11 -04:00
void PeersDialog : : displayInfoChatMenu ( const QPoint & pos )
2008-11-24 09:07:26 -05:00
{
// Log Menu
QMenu myChatMenu ( this ) ;
myChatMenu . addAction ( ui . actionClearChat ) ;
// XXX: Why mapToGlobal() is not enough?
myChatMenu . exec ( mapToGlobal ( pos ) + QPoint ( 0 , 80 ) ) ;
2008-07-10 06:34:49 -04:00
}
void PeersDialog : : smileyWidgetgroupchat ( )
2009-07-13 15:58:11 -04:00
{
2010-09-14 13:47:11 -04:00
Emoticons : : showSmileyWidget ( this , ui . emoticonBtn , SLOT ( addSmileys ( ) ) , true ) ;
2008-11-24 09:07:26 -05:00
}
2008-07-10 06:34:49 -04:00
void PeersDialog : : addSmileys ( )
{
2010-09-04 10:23:30 -04:00
ui . lineEdit - > textCursor ( ) . insertText ( qobject_cast < QPushButton * > ( sender ( ) ) - > toolTip ( ) . split ( " | " ) . first ( ) ) ;
2008-07-10 06:34:49 -04:00
}
2007-11-14 22:18:48 -05:00
2009-01-22 20:58:56 -05:00
/* GUI stuff -> don't do anything directly with Control */
void PeersDialog : : viewprofile ( )
{
/* display Dialog */
QTreeWidgetItem * c = getCurrentPeer ( ) ;
static ProfileView * profileview = new ProfileView ( ) ;
if ( ! c )
return ;
/* set the Id */
std : : string id = getPeerRsCertId ( c ) ;
profileview - > setPeerId ( id ) ;
profileview - > show ( ) ;
}
2009-09-02 18:42:31 -04:00
void PeersDialog : : updateAvatar ( )
{
unsigned char * data = NULL ;
int size = 0 ;
rsMsgs - > getOwnAvatarData ( data , size ) ;
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-02 18:42:31 -04:00
std : : cerr < < " Image size = " < < size < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-02 18:42:31 -04:00
if ( size = = 0 )
std : : cerr < < " Got no image " < < std : : endl ;
// set the image
QPixmap pix ;
2009-09-07 09:59:38 -04:00
pix . loadFromData ( data , size , " PNG " ) ;
ui . avatartoolButton - > setIcon ( pix ) ; // writes image into ba in PNG format
2009-09-02 18:42:31 -04:00
2010-06-17 13:39:32 -04:00
PopupChatDialog : : updateAllAvatars ( ) ;
2009-09-30 18:30:57 -04:00
2009-09-02 18:42:31 -04:00
delete [ ] data ;
}
void PeersDialog : : getAvatar ( )
{
2010-02-22 07:53:24 -05:00
QString fileName = QFileDialog : : getOpenFileName ( this , " Load File " , QDir : : homePath ( ) , " Pictures (*.png *.xpm *.jpg *.tiff *.gif) " ) ;
2009-09-02 18:42:31 -04:00
if ( ! fileName . isEmpty ( ) )
{
2010-05-14 07:17:19 -04:00
QPixmap picture ;
2010-08-30 11:43:07 -04:00
picture = QPixmap ( fileName ) . scaled ( 96 , 96 , Qt : : IgnoreAspectRatio , Qt : : SmoothTransformation ) ;
2009-09-02 18:42:31 -04:00
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-02 18:42:31 -04:00
std : : cerr < < " Sending avatar image down the pipe " < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-02 18:42:31 -04:00
// send avatar down the pipe for other peers to get it.
QByteArray ba ;
QBuffer buffer ( & ba ) ;
buffer . open ( QIODevice : : WriteOnly ) ;
2009-09-07 09:59:38 -04:00
picture . save ( & buffer , " PNG " ) ; // writes image into ba in PNG format
2009-09-02 18:42:31 -04:00
2010-02-07 18:01:46 -05:00
# ifdef PEERS_DEBUG
2009-09-02 18:42:31 -04:00
std : : cerr < < " Image size = " < < ba . size ( ) < < std : : endl ;
2010-02-07 18:01:46 -05:00
# endif
2009-09-02 18:42:31 -04:00
rsMsgs - > setOwnAvatarData ( ( unsigned char * ) ( ba . data ( ) ) , ba . size ( ) ) ; // last char 0 included.
2009-09-30 18:30:57 -04:00
// I suppressed this because it gets called already by rsMsgs->setOwnAvatarData() through a Qt notification signal
//updateAvatar() ;
2009-09-02 18:42:31 -04:00
}
}
void PeersDialog : : changeAvatarClicked ( )
{
updateAvatar ( ) ;
2009-09-22 18:47:49 -04:00
}
void PeersDialog : : on_actionAdd_Friend_activated ( )
{
2010-05-02 20:09:55 -04:00
ConnectFriendWizard connectwiz ( this ) ;
2009-09-22 18:47:49 -04:00
2010-05-02 20:09:55 -04:00
connectwiz . exec ( ) ;
2009-09-22 18:47:49 -04:00
}
2010-01-16 20:36:50 -05:00
void PeersDialog : : on_actionCreate_New_Forum_activated ( )
{
2010-05-02 20:09:55 -04:00
MainWindow : : activatePage ( MainWindow : : Forums ) ;
CreateForum cf ( this ) ;
cf . exec ( ) ;
2010-01-16 20:36:50 -05:00
}
void PeersDialog : : on_actionCreate_New_Channel_activated ( )
{
2010-05-02 20:09:55 -04:00
# ifndef RS_RELEASE_VERSION
MainWindow : : activatePage ( MainWindow : : Channels ) ;
2010-05-02 07:41:23 -04:00
2010-05-02 20:09:55 -04:00
CreateChannel cf ( this ) ;
cf . exec ( ) ;
# endif
2010-01-16 20:36:50 -05:00
}
2010-05-02 20:09:55 -04:00
2009-09-29 18:52:46 -04:00
/** Loads own personal status */
void PeersDialog : : loadmypersonalstatus ( )
{
2010-07-20 15:45:07 -04:00
ui . mypersonalstatuslabel - > setText ( QString : : fromStdString ( rsMsgs - > getCustomStateString ( ) ) ) ;
2009-09-29 18:52:46 -04:00
}
2009-10-08 15:08:44 -04:00
void PeersDialog : : statusmessage ( )
{
2010-05-02 20:09:55 -04:00
StatusMessage statusmsgdialog ( this ) ;
statusmsgdialog . exec ( ) ;
2009-10-08 15:08:44 -04:00
}
2010-01-31 17:29:30 -05:00
void PeersDialog : : addExtraFile ( )
{
// select a file
QString qfile = QFileDialog : : getOpenFileName ( this , tr ( " Add Extra File " ) , " " , " " , 0 ,
QFileDialog : : DontResolveSymlinks ) ;
std : : string filePath = qfile . toStdString ( ) ;
if ( filePath ! = " " )
{
PeersDialog : : addAttachment ( filePath ) ;
}
}
void PeersDialog : : addAttachment ( std : : string filePath ) {
/* add a AttachFileItem to the attachment section */
2010-02-07 18:01:46 -05:00
std : : cerr < < " PopupChatDialog::addExtraFile() hashing file. " < < std : : endl ;
2010-01-31 17:29:30 -05:00
/* add widget in for new destination */
AttachFileItem * file = new AttachFileItem ( filePath ) ;
//file->
ui . verticalLayout - > addWidget ( file , 1 , 0 ) ;
//when the file is local or is finished hashing, call the fileHashingFinished method to send a chat message
if ( file - > getState ( ) = = AFI_STATE_LOCAL ) {
fileHashingFinished ( file ) ;
} else {
QObject : : connect ( file , SIGNAL ( fileFinished ( AttachFileItem * ) ) , SLOT ( fileHashingFinished ( AttachFileItem * ) ) ) ;
}
}
2010-09-01 13:56:15 -04:00
void PeersDialog : : fileHashingFinished ( AttachFileItem * file )
{
std : : cerr < < " PeersDialog::fileHashingFinished() started. " < < std : : endl ;
2010-03-17 11:34:36 -04:00
2010-09-01 13:56:15 -04:00
//check that the file is ok tos end
if ( file - > getState ( ) = = AFI_STATE_ERROR ) {
2010-03-17 11:34:36 -04:00
# ifdef PEERS_DEBUG
2010-09-01 13:56:15 -04:00
std : : cerr < < " PopupChatDialog::fileHashingFinished error file is not hashed. " < < std : : endl ;
2010-03-17 11:34:36 -04:00
# endif
2010-09-01 13:56:15 -04:00
return ;
}
2010-01-31 17:29:30 -05:00
2010-09-01 13:56:15 -04:00
//convert fileSize from uint_64 to string for html link
// char fileSizeChar [100];
// sprintf(fileSizeChar, "%lld", file->FileSize());
// std::string fileSize = *(&fileSizeChar);
2010-01-31 17:29:30 -05:00
2010-09-01 13:56:15 -04:00
std : : string mesgString = RetroShareLink ( QString : : fromStdString ( file - > FileName ( ) ) ,
file - > FileSize ( ) ,
QString : : fromStdString ( file - > FileHash ( ) ) ) . toHtml ( ) . toStdString ( ) ;
2010-01-31 17:29:30 -05:00
2010-09-01 13:56:15 -04:00
// std::string mesgString = "<a href='retroshare://file|" + (file->FileName()) + "|" + fileSize + "|" + (file->FileHash()) + "'>"
// + "retroshare://file|" + (file->FileName()) + "|" + fileSize + "|" + (file->FileHash()) + "</a>";
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::fileHashingFinished mesgString : " < < mesgString < < std : : endl ;
# endif
2010-01-31 17:29:30 -05:00
2010-09-01 13:56:15 -04:00
rsMsgs - > sendPublicChat ( QString : : fromStdString ( mesgString ) . toStdWString ( ) ) ;
setFont ( ) ;
2010-01-31 17:29:30 -05:00
}
void PeersDialog : : anchorClicked ( const QUrl & link )
{
2010-07-15 07:25:34 -04:00
# ifdef PEERS_DEBUG
std : : cerr < < " PeersDialog::anchorClicked link.scheme() : " < < link . scheme ( ) . toStdString ( ) < < std : : endl ;
# endif
2010-01-31 17:29:30 -05:00
2010-07-15 07:25:34 -04:00
RetroShareLink : : processUrl ( link , NULL , RSLINK_PROCESS_NOTIFY_ALL ) ;
2010-01-31 17:29:30 -05:00
}
void PeersDialog : : dropEvent ( QDropEvent * event )
{
if ( ! ( Qt : : CopyAction & event - > possibleActions ( ) ) )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dropEvent() Rejecting uncopyable DropAction " < < std : : endl ;
2010-01-31 17:29:30 -05:00
/* can't do it */
return ;
}
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dropEvent() Formats " < < std : : endl ;
2010-01-31 17:29:30 -05:00
QStringList formats = event - > mimeData ( ) - > formats ( ) ;
QStringList : : iterator it ;
for ( it = formats . begin ( ) ; it ! = formats . end ( ) ; it + + )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " Format: " < < ( * it ) . toStdString ( ) < < std : : endl ;
2010-01-31 17:29:30 -05:00
}
if ( event - > mimeData ( ) - > hasUrls ( ) )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dropEvent() Urls: " < < std : : endl ;
2010-01-31 17:29:30 -05:00
QList < QUrl > urls = event - > mimeData ( ) - > urls ( ) ;
QList < QUrl > : : iterator uit ;
for ( uit = urls . begin ( ) ; uit ! = urls . end ( ) ; uit + + )
{
std : : string localpath = uit - > toLocalFile ( ) . toStdString ( ) ;
2010-02-07 18:01:46 -05:00
std : : cerr < < " Whole URL: " < < uit - > toString ( ) . toStdString ( ) < < std : : endl ;
std : : cerr < < " or As Local File: " < < localpath < < std : : endl ;
2010-01-31 17:29:30 -05:00
if ( localpath . size ( ) > 0 )
{
struct stat buf ;
//Check that the file does exist and is not a directory
if ( ( - 1 = = stat ( localpath . c_str ( ) , & buf ) ) ) {
std : : cerr < < " PeersDialog::dropEvent() file does not exists. " < < std : : endl ;
QMessageBox mb ( tr ( " Drop file error. " ) , tr ( " File not found or file name not accepted. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 ) ;
mb . setButtonText ( QMessageBox : : Ok , " OK " ) ;
mb . exec ( ) ;
} else if ( S_ISDIR ( buf . st_mode ) ) {
std : : cerr < < " PeersDialog::dropEvent() directory not accepted. " < < std : : endl ;
QMessageBox mb ( tr ( " Drop file error. " ) , tr ( " Directory can't be dropped, only files are accepted. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 ) ;
mb . setButtonText ( QMessageBox : : Ok , " OK " ) ;
mb . exec ( ) ;
} else {
PeersDialog : : addAttachment ( localpath ) ;
}
}
}
}
event - > setDropAction ( Qt : : CopyAction ) ;
event - > accept ( ) ;
}
void PeersDialog : : dragEnterEvent ( QDragEnterEvent * event )
{
/* print out mimeType */
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dragEnterEvent() Formats " < < std : : endl ;
2010-01-31 17:29:30 -05:00
QStringList formats = event - > mimeData ( ) - > formats ( ) ;
QStringList : : iterator it ;
for ( it = formats . begin ( ) ; it ! = formats . end ( ) ; it + + )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " Format: " < < ( * it ) . toStdString ( ) < < std : : endl ;
2010-01-31 17:29:30 -05:00
}
if ( event - > mimeData ( ) - > hasUrls ( ) )
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dragEnterEvent() Accepting Urls " < < std : : endl ;
2010-01-31 17:29:30 -05:00
event - > acceptProposedAction ( ) ;
}
else
{
2010-02-07 18:01:46 -05:00
std : : cerr < < " PeersDialog::dragEnterEvent() No Urls " < < std : : endl ;
2010-01-31 17:29:30 -05:00
}
}
2010-04-27 18:08:38 -04:00
bool PeersDialog : : fileSave ( )
{
if ( fileName . isEmpty ( ) )
return fileSaveAs ( ) ;
QFile file ( fileName ) ;
if ( ! file . open ( QFile : : WriteOnly ) )
return false ;
QTextStream ts ( & file ) ;
ts . setCodec ( QTextCodec : : codecForName ( " UTF-8 " ) ) ;
ts < < ui . msgText - > document ( ) - > toPlainText ( ) ;
ui . msgText - > document ( ) - > setModified ( false ) ;
return true ;
}
bool PeersDialog : : fileSaveAs ( )
{
QString fn = QFileDialog : : getSaveFileName ( this , tr ( " Save as... " ) ,
QString ( ) , tr ( " Text File (*.txt );;All Files (*) " ) ) ;
if ( fn . isEmpty ( ) )
return false ;
setCurrentFileName ( fn ) ;
return fileSave ( ) ;
}
void PeersDialog : : setCurrentFileName ( const QString & fileName )
{
this - > fileName = fileName ;
ui . msgText - > document ( ) - > setModified ( false ) ;
setWindowModified ( false ) ;
2010-05-02 07:41:23 -04:00
}
2010-05-05 07:47:29 -04:00
////play sound when recv a message
void PeersDialog : : playsound ( ) {
2010-05-20 17:53:27 -04:00
Settings - > beginGroup ( " Sound " ) ;
Settings - > beginGroup ( " SoundFilePath " ) ;
QString OnlineSound = Settings - > value ( " NewChatMessage " , " " ) . toString ( ) ;
Settings - > endGroup ( ) ;
Settings - > beginGroup ( " Enable " ) ;
bool flag = Settings - > value ( " NewChatMessage " , false ) . toBool ( ) ;
Settings - > endGroup ( ) ;
Settings - > endGroup ( ) ;
2010-05-05 07:47:29 -04:00
if ( ! OnlineSound . isEmpty ( ) & & flag )
if ( QSound : : isAvailable ( ) )
2010-05-11 16:02:52 -04:00
QSound : : play ( OnlineSound ) ;
2010-05-05 07:47:29 -04:00
}
2010-06-18 17:59:33 -04:00
void PeersDialog : : displayMenu ( )
{
QMenu * displaymenu = new QMenu ( ) ;
displaymenu - > addAction ( ui . action_Hide_Offline_Friends ) ;
displaymenu - > addAction ( ui . action_Hide_Status_Column ) ;
ui . displayButton - > setMenu ( displaymenu ) ;
}
void PeersDialog : : statusColumn ( )
{
/* Set header resize modes and initial section sizes */
QHeaderView * peerheader = ui . peertreeWidget - > header ( ) ;
if ( ui . action_Hide_Status_Column - > isChecked ( ) )
{
ui . peertreeWidget - > setColumnHidden ( 1 , true ) ;
peerheader - > resizeSection ( 0 , 200 ) ;
}
else
{
ui . peertreeWidget - > setColumnHidden ( 1 , false ) ;
peerheader - > resizeSection ( 0 , 200 ) ;
}
}
2010-09-01 10:15:50 -04:00
void PeersDialog : : on_actionMessageHistory_triggered ( )
{
2010-09-05 16:50:34 -04:00
ImHistoryBrowser imBrowser ( false , historyKeeper , ui . lineEdit , this ) ;
2010-09-01 10:15:50 -04:00
imBrowser . exec ( ) ;
}