2014-07-07 00:19:45 +08:00
/*
2015-06-06 09:40:08 +08:00
Copyright © 2014 - 2015 by The qTox Project
2014-07-07 00:19:45 +08:00
This file is part of qTox , a Qt - based graphical interface for Tox .
2015-06-06 09:40:08 +08:00
qTox is libre software : you can redistribute it and / or modify
2014-07-07 00:19:45 +08:00
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
2015-06-06 09:40:08 +08:00
qTox is distributed in the hope that it will be useful ,
2014-07-07 00:19:45 +08:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
2015-06-06 09:40:08 +08:00
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2014-07-07 00:19:45 +08:00
2015-06-06 09:40:08 +08:00
You should have received a copy of the GNU General Public License
along with qTox . If not , see < http : //www.gnu.org/licenses/>.
2014-07-07 00:19:45 +08:00
*/
2014-06-25 04:11:11 +08:00
# include "widget.h"
2015-06-17 02:25:19 +08:00
# include "contentlayout.h"
2014-08-11 16:00:08 +08:00
# include "ui_mainwindow.h"
2015-04-24 08:32:09 +08:00
# include "src/core/core.h"
2015-06-06 07:44:47 +08:00
# include "src/persistence/settings.h"
2015-06-19 22:58:48 +08:00
# include "contentdialog.h"
2014-10-08 12:26:25 +08:00
# include "src/friend.h"
# include "src/friendlist.h"
# include "tool/friendrequestdialog.h"
# include "friendwidget.h"
# include "src/grouplist.h"
# include "src/group.h"
# include "groupwidget.h"
# include "form/groupchatform.h"
2015-05-31 03:10:43 +08:00
# include "circlewidget.h"
2015-06-06 07:44:47 +08:00
# include "src/widget/style.h"
2014-10-08 12:26:25 +08:00
# include "friendlistwidget.h"
# include "form/chatform.h"
# include "maskablepixmapwidget.h"
2015-06-06 07:44:47 +08:00
# include "src/persistence/historykeeper.h"
# include "src/net/autoupdate.h"
# include "src/audio/audio.h"
2014-11-27 21:13:35 +08:00
# include "src/platform/timer.h"
2015-01-29 21:56:53 +08:00
# include "systemtrayicon.h"
2015-02-06 19:28:49 +08:00
# include "src/nexus.h"
2015-02-16 07:24:42 +08:00
# include "src/widget/gui.h"
2015-06-06 07:44:47 +08:00
# include "src/persistence/offlinemsgengine.h"
# include "src/widget/translator.h"
2015-06-08 02:24:55 +08:00
# include "src/widget/form/addfriendform.h"
# include "src/widget/form/filesform.h"
# include "src/widget/form/profileform.h"
# include "src/widget/form/settingswidget.h"
2015-08-22 17:05:16 +08:00
# include "tool/removefrienddialog.h"
2015-02-07 02:51:03 +08:00
# include <cassert>
2014-06-25 04:11:11 +08:00
# include <QMessageBox>
# include <QDebug>
2014-07-01 10:12:17 +08:00
# include <QFile>
# include <QString>
2014-09-24 22:51:16 +08:00
# include <QBuffer>
2014-07-01 10:12:17 +08:00
# include <QPainter>
# include <QMouseEvent>
2014-07-02 05:50:07 +08:00
# include <QClipboard>
2014-09-11 21:44:34 +08:00
# include <QThread>
2015-02-05 06:11:21 +08:00
# include <QDialogButtonBox>
2015-03-27 07:10:32 +08:00
# include <QShortcut>
2014-10-16 17:47:58 +08:00
# include <QTimer>
2014-10-09 06:31:20 +08:00
# include <QStyleFactory>
2015-02-13 22:23:21 +08:00
# include <QString>
# include <QByteArray>
# include <QImageReader>
# include <QList>
2015-02-22 20:21:42 +08:00
# include <QDesktopServices>
# include <QProcess>
2015-06-17 02:25:19 +08:00
# include <QWindow>
2014-10-18 07:06:30 +08:00
# include <tox/tox.h>
2014-06-25 04:11:11 +08:00
2015-07-02 01:12:50 +08:00
# ifdef Q_OS_MAC
# include <QMenuBar>
# include <QWindow>
# endif
2015-02-07 02:51:03 +08:00
# ifdef Q_OS_ANDROID
# define IS_ON_DESKTOP_GUI 0
# else
# define IS_ON_DESKTOP_GUI 1
# endif
2015-02-20 20:26:41 +08:00
bool toxActivateEventHandler ( const QByteArray & )
2014-11-26 01:11:05 +08:00
{
2015-02-20 20:26:41 +08:00
if ( ! Widget : : getInstance ( ) - > isActiveWindow ( ) )
Widget : : getInstance ( ) - > forceShow ( ) ;
2015-04-24 19:01:50 +08:00
2015-02-20 20:26:41 +08:00
return true ;
2014-11-26 01:11:05 +08:00
}
2014-06-25 04:11:11 +08:00
Widget * Widget : : instance { nullptr } ;
2014-08-11 16:00:08 +08:00
Widget : : Widget ( QWidget * parent )
: QMainWindow ( parent ) ,
2015-02-06 08:27:07 +08:00
icon { nullptr } ,
2015-06-06 09:45:44 +08:00
trayMenu { nullptr } ,
2014-08-11 16:00:08 +08:00
ui ( new Ui : : MainWindow ) ,
2014-12-12 00:49:11 +08:00
activeChatroomWidget { nullptr } ,
eventFlag ( false ) ,
2015-02-06 08:27:07 +08:00
eventIcon ( false )
2015-03-28 04:15:51 +08:00
{
2015-03-20 03:24:06 +08:00
installEventFilter ( this ) ;
2015-06-05 18:26:04 +08:00
Translator : : translate ( ) ;
2014-10-15 23:35:58 +08:00
}
void Widget : : init ( )
2014-06-25 04:11:11 +08:00
{
ui - > setupUi ( this ) ;
2014-11-28 17:16:37 +08:00
2014-12-12 00:49:11 +08:00
timer = new QTimer ( ) ;
timer - > start ( 1000 ) ;
2015-02-08 00:18:25 +08:00
offlineMsgTimer = new QTimer ( ) ;
offlineMsgTimer - > start ( 15000 ) ;
2014-12-02 04:02:44 +08:00
2015-06-06 03:37:01 +08:00
statusOnline = new QAction ( this ) ;
2015-02-12 20:18:04 +08:00
statusOnline - > setIcon ( getStatusIcon ( Status : : Online , 10 , 10 ) ) ;
2015-02-07 02:16:01 +08:00
connect ( statusOnline , SIGNAL ( triggered ( ) ) , this , SLOT ( setStatusOnline ( ) ) ) ;
2015-06-06 03:37:01 +08:00
statusAway = new QAction ( this ) ;
2015-02-12 20:18:04 +08:00
statusAway - > setIcon ( getStatusIcon ( Status : : Away , 10 , 10 ) ) ;
2015-02-07 02:16:01 +08:00
connect ( statusAway , SIGNAL ( triggered ( ) ) , this , SLOT ( setStatusAway ( ) ) ) ;
2015-06-06 03:37:01 +08:00
statusBusy = new QAction ( this ) ;
2015-02-12 20:18:04 +08:00
statusBusy - > setIcon ( getStatusIcon ( Status : : Busy , 10 , 10 ) ) ;
2015-02-07 02:16:01 +08:00
connect ( statusBusy , SIGNAL ( triggered ( ) ) , this , SLOT ( setStatusBusy ( ) ) ) ;
2014-10-04 16:54:50 +08:00
layout ( ) - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
2014-11-16 01:29:41 +08:00
ui - > friendList - > setStyleSheet ( Style : : resolve ( Style : : getStylesheet ( " :ui/friendList/friendList.css " ) ) ) ;
2014-07-01 10:12:17 +08:00
2015-02-12 20:18:04 +08:00
profilePicture = new MaskablePixmapWidget ( this , QSize ( 40 , 40 ) , " :/img/avatar_mask.svg " ) ;
profilePicture - > setPixmap ( QPixmap ( " :/img/contact_dark.svg " ) ) ;
2014-09-28 01:13:46 +08:00
profilePicture - > setClickable ( true ) ;
2014-11-03 07:26:23 +08:00
ui - > myProfile - > insertWidget ( 0 , profilePicture ) ;
ui - > myProfile - > insertSpacing ( 1 , 7 ) ;
2014-09-26 22:39:29 +08:00
2015-06-13 00:09:01 +08:00
filterMenu = new QMenu ( this ) ;
filterGroup = new QActionGroup ( this ) ;
filterDisplayGroup = new QActionGroup ( this ) ;
filterDisplayName = new QAction ( this ) ;
filterDisplayName - > setCheckable ( true ) ;
filterDisplayName - > setChecked ( true ) ;
filterDisplayGroup - > addAction ( filterDisplayName ) ;
filterMenu - > addAction ( filterDisplayName ) ;
filterDisplayActivity = new QAction ( this ) ;
filterDisplayActivity - > setCheckable ( true ) ;
filterDisplayGroup - > addAction ( filterDisplayActivity ) ;
filterMenu - > addAction ( filterDisplayActivity ) ;
filterMenu - > addSeparator ( ) ;
filterAllAction = new QAction ( this ) ;
filterAllAction - > setCheckable ( true ) ;
filterAllAction - > setChecked ( true ) ;
filterGroup - > addAction ( filterAllAction ) ;
filterMenu - > addAction ( filterAllAction ) ;
filterOnlineAction = new QAction ( this ) ;
filterOnlineAction - > setCheckable ( true ) ;
filterGroup - > addAction ( filterOnlineAction ) ;
filterMenu - > addAction ( filterOnlineAction ) ;
filterOfflineAction = new QAction ( this ) ;
filterOfflineAction - > setCheckable ( true ) ;
filterGroup - > addAction ( filterOfflineAction ) ;
filterMenu - > addAction ( filterOfflineAction ) ;
filterFriendsAction = new QAction ( this ) ;
filterFriendsAction - > setCheckable ( true ) ;
filterGroup - > addAction ( filterFriendsAction ) ;
filterMenu - > addAction ( filterFriendsAction ) ;
filterGroupsAction = new QAction ( this ) ;
filterGroupsAction - > setCheckable ( true ) ;
filterGroup - > addAction ( filterGroupsAction ) ;
filterMenu - > addAction ( filterGroupsAction ) ;
ui - > searchContactFilterBox - > setMenu ( filterMenu ) ;
2015-06-17 02:25:19 +08:00
/*ui->mainContent->setLayout(new QVBoxLayout());
2014-06-25 04:11:11 +08:00
ui - > mainHead - > setLayout ( new QVBoxLayout ( ) ) ;
2014-06-26 04:43:28 +08:00
ui - > mainHead - > layout ( ) - > setMargin ( 0 ) ;
ui - > mainHead - > layout ( ) - > setSpacing ( 0 ) ;
2014-10-09 06:31:20 +08:00
2014-12-12 02:05:52 +08:00
if ( QStyleFactory : : keys ( ) . contains ( Settings : : getInstance ( ) . getStyle ( ) )
2014-10-09 06:31:20 +08:00
& & Settings : : getInstance ( ) . getStyle ( ) ! = " None " )
{
ui - > mainHead - > setStyle ( QStyleFactory : : create ( Settings : : getInstance ( ) . getStyle ( ) ) ) ;
ui - > mainContent - > setStyle ( QStyleFactory : : create ( Settings : : getInstance ( ) . getStyle ( ) ) ) ;
2015-06-17 02:25:19 +08:00
} */
2015-04-24 19:01:50 +08:00
2015-05-11 05:40:08 +08:00
# ifndef Q_OS_MAC
2015-06-17 02:25:19 +08:00
//ui->mainHead->setStyleSheet(Style::getStylesheet(":ui/settings/mainHead.css"));
//ui->mainContent->setStyleSheet(Style::getStylesheet(":ui/settings/mainContent.css"));
2014-11-03 07:26:23 +08:00
ui - > statusHead - > setStyleSheet ( Style : : getStylesheet ( " :/ui/window/statusPanel.css " ) ) ;
2015-05-11 05:40:08 +08:00
ui - > statusPanel - > setStyleSheet ( Style : : getStylesheet ( " :/ui/window/statusPanel.css " ) ) ;
# endif
2014-08-11 16:00:08 +08:00
2015-06-07 11:20:06 +08:00
contactListWidget = new FriendListWidget ( this , Settings : : getInstance ( ) . getGroupchatPosition ( ) ) ;
2014-08-22 23:19:16 +08:00
ui - > friendList - > setWidget ( contactListWidget ) ;
2014-08-12 01:46:14 +08:00
ui - > friendList - > setLayoutDirection ( Qt : : RightToLeft ) ;
2015-05-28 01:17:12 +08:00
ui - > friendList - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
2014-06-25 04:11:11 +08:00
2014-09-01 17:08:02 +08:00
ui - > statusLabel - > setEditable ( true ) ;
2014-10-04 16:24:20 +08:00
ui - > statusPanel - > setStyleSheet ( Style : : getStylesheet ( " :/ui/window/statusPanel.css " ) ) ;
2014-07-06 03:30:00 +08:00
2014-07-06 04:54:27 +08:00
QMenu * statusButtonMenu = new QMenu ( ui - > statusButton ) ;
2015-02-07 02:16:01 +08:00
statusButtonMenu - > addAction ( statusOnline ) ;
statusButtonMenu - > addAction ( statusAway ) ;
statusButtonMenu - > addAction ( statusBusy ) ;
2014-07-06 04:54:27 +08:00
ui - > statusButton - > setMenu ( statusButtonMenu ) ;
2014-08-11 19:56:52 +08:00
// disable proportional scaling
2014-08-11 20:07:27 +08:00
ui - > mainSplitter - > setStretchFactor ( 0 , 0 ) ;
ui - > mainSplitter - > setStretchFactor ( 1 , 1 ) ;
2014-06-25 04:11:11 +08:00
2015-02-12 20:18:04 +08:00
onStatusSet ( Status : : Offline ) ;
2014-07-06 21:51:24 +08:00
2014-09-03 06:01:04 +08:00
// Disable some widgets until we're connected to the DHT
ui - > statusButton - > setEnabled ( false ) ;
2014-11-16 04:30:20 +08:00
Style : : setThemeColor ( Settings : : getInstance ( ) . getThemeColor ( ) ) ;
2015-02-07 02:01:31 +08:00
reloadTheme ( ) ;
2015-03-12 02:04:29 +08:00
updateIcons ( ) ;
2015-04-24 19:01:50 +08:00
2014-10-18 22:54:52 +08:00
filesForm = new FilesForm ( ) ;
addFriendForm = new AddFriendForm ;
2015-03-04 04:29:01 +08:00
profileForm = new ProfileForm ( ) ;
2014-10-18 22:54:52 +08:00
settingsWidget = new SettingsWidget ( ) ;
2014-06-25 04:11:11 +08:00
2015-02-06 19:28:49 +08:00
Core * core = Nexus : : getCore ( ) ;
2015-05-12 02:14:09 +08:00
connect ( core , & Core : : fileDownloadFinished , filesForm , & FilesForm : : onFileDownloadComplete ) ;
connect ( core , & Core : : fileUploadFinished , filesForm , & FilesForm : : onFileUploadComplete ) ;
2015-02-06 19:28:49 +08:00
connect ( settingsWidget , & SettingsWidget : : setShowSystemTray , this , & Widget : : onSetShowSystemTray ) ;
2015-05-12 02:14:09 +08:00
connect ( core , & Core : : selfAvatarChanged , profileForm , & ProfileForm : : onSelfAvatarLoaded ) ;
connect ( ui - > addButton , & QPushButton : : clicked , this , & Widget : : onAddClicked ) ;
connect ( ui - > groupButton , & QPushButton : : clicked , this , & Widget : : onGroupClicked ) ;
connect ( ui - > transferButton , & QPushButton : : clicked , this , & Widget : : onTransferClicked ) ;
connect ( ui - > settingsButton , & QPushButton : : clicked , this , & Widget : : onSettingsClicked ) ;
2015-03-11 10:01:13 +08:00
connect ( profilePicture , & MaskablePixmapWidget : : clicked , this , & Widget : : showProfile ) ;
connect ( ui - > nameLabel , & CroppingLabel : : clicked , this , & Widget : : showProfile ) ;
2015-06-08 02:25:05 +08:00
connect ( ui - > statusLabel , & CroppingLabel : : editFinished , this , & Widget : : onStatusMessageChanged ) ;
2014-11-28 17:16:37 +08:00
connect ( ui - > mainSplitter , & QSplitter : : splitterMoved , this , & Widget : : onSplitterMoved ) ;
2015-05-12 02:14:09 +08:00
connect ( addFriendForm , & AddFriendForm : : friendRequested , this , & Widget : : friendRequested ) ;
2014-12-12 00:49:11 +08:00
connect ( timer , & QTimer : : timeout , this , & Widget : : onUserAwayCheck ) ;
connect ( timer , & QTimer : : timeout , this , & Widget : : onEventIconTick ) ;
2015-02-20 18:56:20 +08:00
connect ( timer , & QTimer : : timeout , this , & Widget : : onTryCreateTrayIcon ) ;
2015-02-13 13:27:49 +08:00
connect ( offlineMsgTimer , & QTimer : : timeout , this , & Widget : : processOfflineMsgs ) ;
2015-04-09 00:18:07 +08:00
connect ( ui - > searchContactText , & QLineEdit : : textChanged , this , & Widget : : searchContacts ) ;
2015-06-13 00:09:01 +08:00
connect ( filterGroup , & QActionGroup : : triggered , this , & Widget : : searchContacts ) ;
connect ( filterDisplayGroup , & QActionGroup : : triggered , this , & Widget : : changeDisplayMode ) ;
2015-05-28 01:17:12 +08:00
connect ( ui - > friendList , & QWidget : : customContextMenuRequested , this , & Widget : : friendListContextMenu ) ;
2014-06-25 04:11:11 +08:00
2015-03-27 07:10:32 +08:00
// keyboard shortcuts
new QShortcut ( Qt : : CTRL + Qt : : Key_Q , this , SLOT ( close ( ) ) ) ;
2015-03-22 16:16:32 +08:00
new QShortcut ( Qt : : CTRL + Qt : : SHIFT + Qt : : Key_Tab , this , SLOT ( previousContact ( ) ) ) ;
new QShortcut ( Qt : : CTRL + Qt : : Key_Tab , this , SLOT ( nextContact ( ) ) ) ;
new QShortcut ( Qt : : CTRL + Qt : : Key_PageUp , this , SLOT ( previousContact ( ) ) ) ;
new QShortcut ( Qt : : CTRL + Qt : : Key_PageDown , this , SLOT ( nextContact ( ) ) ) ;
2015-03-27 07:10:32 +08:00
2015-07-02 01:12:50 +08:00
# ifdef Q_OS_MAC
2015-07-09 20:43:19 +08:00
QAction * windowMenu = Nexus : : getInstance ( ) . windowMenu - > menuAction ( ) ;
QAction * fileMenu = Nexus : : getInstance ( ) . globalMenuBar - > insertMenu ( windowMenu , new QMenu ( tr ( " File " ) , this ) ) ;
2015-07-02 01:12:50 +08:00
2015-07-09 20:43:19 +08:00
QAction * editProfileAction = fileMenu - > menu ( ) - > addAction ( tr ( " Edit Profile " ) ) ;
2015-07-02 01:12:50 +08:00
connect ( editProfileAction , & QAction : : triggered , this , & Widget : : showProfile ) ;
2015-07-09 20:43:19 +08:00
QMenu * changeStatusMenu = fileMenu - > menu ( ) - > addMenu ( tr ( " Change Status " ) ) ;
fileMenu - > menu ( ) - > addAction ( changeStatusMenu - > menuAction ( ) ) ;
2015-07-02 01:12:50 +08:00
changeStatusMenu - > addAction ( statusOnline ) ;
changeStatusMenu - > addSeparator ( ) ;
changeStatusMenu - > addAction ( statusAway ) ;
changeStatusMenu - > addAction ( statusBusy ) ;
2015-07-09 20:43:19 +08:00
fileMenu - > menu ( ) - > addSeparator ( ) ;
QAction * logoutAction = fileMenu - > menu ( ) - > addAction ( tr ( " Log out " ) ) ;
2015-07-02 01:12:50 +08:00
connect ( logoutAction , & QAction : : triggered , [ this ] ( )
{
Nexus : : getInstance ( ) . showLogin ( ) ;
} ) ;
2015-07-09 20:43:19 +08:00
QAction * editMenu = Nexus : : getInstance ( ) . globalMenuBar - > insertMenu ( windowMenu , new QMenu ( tr ( " Edit " ) , this ) ) ;
editMenu - > menu ( ) - > addSeparator ( ) ;
2015-07-02 01:12:50 +08:00
2015-07-09 20:43:19 +08:00
QAction * viewMenu = Nexus : : getInstance ( ) . globalMenuBar - > insertMenu ( windowMenu , new QMenu ( tr ( " View " ) , this ) ) ;
2015-07-02 01:12:50 +08:00
2015-07-09 20:43:19 +08:00
QMenu * filterMenu = viewMenu - > menu ( ) - > addMenu ( tr ( " Filter... " ) ) ;
2015-07-02 01:12:50 +08:00
filterMenu - > addAction ( filterDisplayName ) ;
filterMenu - > addAction ( filterDisplayActivity ) ;
filterMenu - > addSeparator ( ) ;
filterMenu - > addAction ( filterAllAction ) ;
filterMenu - > addAction ( filterOnlineAction ) ;
filterMenu - > addAction ( filterOfflineAction ) ;
filterMenu - > addAction ( filterFriendsAction ) ;
filterMenu - > addAction ( filterGroupsAction ) ;
2015-07-09 20:43:19 +08:00
viewMenu - > menu ( ) - > addSeparator ( ) ;
fullscreenAction = viewMenu - > menu ( ) - > addAction ( tr ( " Enter Fullscreen " ) ) ;
2015-07-02 01:12:50 +08:00
fullscreenAction - > setShortcut ( QKeySequence : : FullScreen ) ;
connect ( fullscreenAction , & QAction : : triggered , this , & Widget : : toggleFullscreen ) ;
2015-07-09 20:43:19 +08:00
QAction * contactMenu = Nexus : : getInstance ( ) . globalMenuBar - > insertMenu ( windowMenu , new QMenu ( tr ( " Contacts " ) , this ) ) ;
2015-07-02 01:12:50 +08:00
2015-07-09 20:43:19 +08:00
QAction * addContactAction = contactMenu - > menu ( ) - > addAction ( tr ( " Add Contact... " ) ) ;
2015-07-02 01:12:50 +08:00
connect ( addContactAction , & QAction : : triggered , this , & Widget : : onAddClicked ) ;
2015-07-17 20:20:47 +08:00
QAction * nextConversationAction = new QAction ( tr ( " Next Conversation " ) , this ) ;
Nexus : : getInstance ( ) . windowMenu - > addAction ( nextConversationAction ) ;
2015-07-02 01:12:50 +08:00
nextConversationAction - > setShortcut ( QKeySequence : : SelectNextPage ) ;
connect ( nextConversationAction , & QAction : : triggered , this , & Widget : : nextContact ) ;
2015-07-17 20:20:47 +08:00
QAction * previousConversationAction = new QAction ( tr ( " Previous Conversation " ) , this ) ;
Nexus : : getInstance ( ) . windowMenu - > addAction ( previousConversationAction ) ;
2015-07-02 01:12:50 +08:00
previousConversationAction - > setShortcut ( QKeySequence : : SelectPreviousPage ) ;
connect ( previousConversationAction , & QAction : : triggered , this , & Widget : : previousContact ) ;
2015-07-09 20:43:19 +08:00
Nexus : : getInstance ( ) . windowMenu - > addSeparator ( ) ;
QAction * frontAction = Nexus : : getInstance ( ) . windowMenu - > addAction ( tr ( " Bring All to Front " ) ) ;
2015-07-02 01:12:50 +08:00
connect ( frontAction , & QAction : : triggered , this , & Widget : : bringAllToFront ) ;
2015-07-09 20:43:19 +08:00
QAction * preferencesAction = viewMenu - > menu ( ) - > addAction ( QString ( ) ) ;
2015-07-02 01:12:50 +08:00
preferencesAction - > setMenuRole ( QAction : : PreferencesRole ) ;
connect ( preferencesAction , & QAction : : triggered , this , & Widget : : onSettingsClicked ) ;
2015-07-09 20:43:19 +08:00
QAction * aboutAction = viewMenu - > menu ( ) - > addAction ( QString ( ) ) ;
2015-07-02 01:12:50 +08:00
aboutAction - > setMenuRole ( QAction : : AboutRole ) ;
connect ( aboutAction , & QAction : : triggered , [ this ] ( )
{
onSettingsClicked ( ) ;
settingsWidget - > showAbout ( ) ;
} ) ;
# endif
2015-06-17 02:25:19 +08:00
contentLayout = nullptr ;
onSeparateWindowChanged ( Settings : : getInstance ( ) . getSeparateWindow ( ) , false ) ;
2015-05-10 11:40:49 +08:00
ui - > addButton - > setCheckable ( true ) ;
ui - > transferButton - > setCheckable ( true ) ;
ui - > settingsButton - > setCheckable ( true ) ;
2015-06-23 02:01:50 +08:00
if ( contentLayout ! = nullptr )
onAddClicked ( ) ;
2014-11-10 07:31:29 +08:00
2015-06-17 02:25:19 +08:00
//restore window state
restoreGeometry ( Settings : : getInstance ( ) . getWindowGeometry ( ) ) ;
restoreState ( Settings : : getInstance ( ) . getWindowState ( ) ) ;
ui - > mainSplitter - > restoreState ( Settings : : getInstance ( ) . getSplitterState ( ) ) ;
2015-06-02 04:17:39 +08:00
connect ( settingsWidget , & SettingsWidget : : compactToggled , contactListWidget , & FriendListWidget : : onCompactChanged ) ;
2015-03-12 08:41:18 +08:00
connect ( settingsWidget , & SettingsWidget : : groupchatPositionToggled , contactListWidget , & FriendListWidget : : onGroupchatPositionChanged ) ;
2015-06-17 02:25:19 +08:00
connect ( settingsWidget , & SettingsWidget : : separateWindowToggled , this , & Widget : : onSeparateWindowClicked ) ;
2014-11-10 07:31:29 +08:00
# if (AUTOUPDATE_ENABLED)
if ( Settings : : getInstance ( ) . getCheckUpdates ( ) )
AutoUpdater : : checkUpdatesAsyncInteractive ( ) ;
# endif
2015-06-06 03:37:01 +08:00
retranslateUi ( ) ;
Translator : : registerHandler ( std : : bind ( & Widget : : retranslateUi , this ) , this ) ;
2015-02-20 18:56:20 +08:00
if ( ! Settings : : getInstance ( ) . getShowSystemTray ( ) )
show ( ) ;
2014-10-18 22:54:52 +08:00
}
2015-03-20 03:24:06 +08:00
bool Widget : : eventFilter ( QObject * obj , QEvent * event )
{
2015-03-26 00:27:33 +08:00
if ( event - > type ( ) = = QEvent : : WindowStateChange & & obj ! = NULL )
2015-03-20 03:24:06 +08:00
{
QWindowStateChangeEvent * ce = static_cast < QWindowStateChangeEvent * > ( event ) ;
if ( windowState ( ) & Qt : : WindowMinimized )
{
if ( ce - > oldState ( ) & Qt : : WindowMaximized )
wasMaximized = true ;
else
wasMaximized = false ;
}
}
return false ;
}
2015-03-12 02:04:29 +08:00
void Widget : : updateIcons ( )
2014-11-27 01:58:30 +08:00
{
2015-02-12 20:18:04 +08:00
if ( ! icon )
return ;
2014-12-12 00:49:11 +08:00
QString status ;
if ( eventIcon )
2015-04-24 19:01:50 +08:00
{
2014-12-12 00:49:11 +08:00
status = " event " ;
2015-04-24 19:01:50 +08:00
}
2014-11-27 01:58:30 +08:00
else
2014-12-12 00:49:11 +08:00
{
status = ui - > statusButton - > property ( " status " ) . toString ( ) ;
if ( ! status . length ( ) )
status = " offline " ;
}
2015-03-11 19:01:10 +08:00
QIcon ico = QIcon : : fromTheme ( " qtox- " + status ) ;
if ( ico . isNull ( ) )
{
QString color = Settings : : getInstance ( ) . getLightTrayIcon ( ) ? " light " : " dark " ;
2015-05-19 04:54:58 +08:00
ico = QIcon ( " :img/taskbar/ " + color + " /taskbar_ " + status + " .svg " ) ;
2015-03-11 19:01:10 +08:00
}
2015-03-12 02:04:29 +08:00
setWindowIcon ( ico ) ;
if ( icon )
icon - > setIcon ( ico ) ;
2014-11-27 01:58:30 +08:00
}
2014-06-25 04:11:11 +08:00
Widget : : ~ Widget ( )
{
2015-06-06 03:37:01 +08:00
Translator : : unregister ( this ) ;
2015-01-05 16:54:03 +08:00
AutoUpdater : : abortUpdates ( ) ;
2015-02-20 18:56:20 +08:00
if ( icon )
icon - > hide ( ) ;
2015-04-24 19:01:50 +08:00
2015-03-04 04:29:01 +08:00
delete profileForm ;
2014-09-30 17:44:27 +08:00
delete settingsWidget ;
2014-10-18 22:54:52 +08:00
delete addFriendForm ;
delete filesForm ;
2014-12-12 00:49:11 +08:00
delete timer ;
2015-02-08 00:18:25 +08:00
delete offlineMsgTimer ;
2015-06-17 02:25:19 +08:00
delete contentLayout ;
2014-06-25 04:11:11 +08:00
2014-11-07 22:55:32 +08:00
FriendList : : clear ( ) ;
2014-11-20 17:13:13 +08:00
GroupList : : clear ( ) ;
2014-10-21 02:03:44 +08:00
delete trayMenu ;
2014-06-25 04:11:11 +08:00
delete ui ;
2014-09-30 17:44:27 +08:00
instance = nullptr ;
2014-06-25 04:11:11 +08:00
}
Widget * Widget : : getInstance ( )
{
2015-02-07 02:51:03 +08:00
assert ( IS_ON_DESKTOP_GUI ) ; // Widget must only be used on Desktop platforms
2014-06-25 04:11:11 +08:00
if ( ! instance )
instance = new Widget ( ) ;
2015-04-24 19:01:50 +08:00
2014-06-25 04:11:11 +08:00
return instance ;
}
2014-08-11 16:00:08 +08:00
void Widget : : closeEvent ( QCloseEvent * event )
2014-07-03 14:43:23 +08:00
{
2014-12-12 02:05:52 +08:00
if ( Settings : : getInstance ( ) . getShowSystemTray ( ) & & Settings : : getInstance ( ) . getCloseToTray ( ) = = true )
2014-10-20 03:47:06 +08:00
{
event - > ignore ( ) ;
this - > hide ( ) ;
}
else
{
2014-11-28 17:16:37 +08:00
saveWindowGeometry ( ) ;
saveSplitterGeometry ( ) ;
2015-02-01 07:03:42 +08:00
qApp - > exit ( 0 ) ;
2014-10-20 03:47:06 +08:00
QWidget : : closeEvent ( event ) ;
}
2014-07-03 14:43:23 +08:00
}
2014-07-01 10:12:17 +08:00
2014-10-20 19:50:12 +08:00
void Widget : : changeEvent ( QEvent * event )
{
if ( event - > type ( ) = = QEvent : : WindowStateChange )
{
2015-05-12 02:14:09 +08:00
if ( isMinimized ( ) & &
Settings : : getInstance ( ) . getShowSystemTray ( ) & &
Settings : : getInstance ( ) . getMinimizeToTray ( ) )
2014-10-20 19:50:12 +08:00
this - > hide ( ) ;
}
2014-07-03 14:43:23 +08:00
}
2014-07-01 10:12:17 +08:00
2014-11-28 17:16:37 +08:00
void Widget : : resizeEvent ( QResizeEvent * event )
{
Q_UNUSED ( event ) ;
saveWindowGeometry ( ) ;
2015-01-26 01:43:30 +08:00
emit resized ( ) ;
2014-11-28 17:16:37 +08:00
}
2014-06-25 04:11:11 +08:00
QString Widget : : getUsername ( )
{
2015-02-06 19:28:49 +08:00
return Nexus : : getCore ( ) - > getUsername ( ) ;
2014-06-25 04:11:11 +08:00
}
2014-09-24 22:51:16 +08:00
void Widget : : onSelfAvatarLoaded ( const QPixmap & pic )
{
2014-09-26 22:39:29 +08:00
profilePicture - > setPixmap ( pic ) ;
2014-09-24 22:51:16 +08:00
}
2014-06-25 04:11:11 +08:00
void Widget : : onConnected ( )
{
2014-09-03 06:01:04 +08:00
ui - > statusButton - > setEnabled ( true ) ;
2014-11-18 09:40:36 +08:00
if ( beforeDisconnect = = Status : : Offline )
emit statusSet ( Status : : Online ) ;
else
emit statusSet ( beforeDisconnect ) ;
2014-06-25 04:11:11 +08:00
}
void Widget : : onDisconnected ( )
{
2015-02-12 20:18:04 +08:00
beforeDisconnect = getStatusFromString ( ui - > statusButton - > property ( " status " ) . toString ( ) ) ;
2014-09-03 06:01:04 +08:00
ui - > statusButton - > setEnabled ( false ) ;
2014-06-25 04:11:11 +08:00
emit statusSet ( Status : : Offline ) ;
}
void Widget : : onFailedToStartCore ( )
{
QMessageBox critical ( this ) ;
2015-09-08 04:43:22 +08:00
critical . setText ( tr ( " toxcore failed to start, the application will terminate after you close this message. " ) ) ;
2014-06-25 04:11:11 +08:00
critical . setIcon ( QMessageBox : : Critical ) ;
critical . exec ( ) ;
qApp - > quit ( ) ;
}
2014-10-06 04:49:44 +08:00
void Widget : : onBadProxyCore ( )
{
2015-05-26 04:37:19 +08:00
Settings : : getInstance ( ) . setProxyType ( 0 ) ;
2014-10-06 04:49:44 +08:00
QMessageBox critical ( this ) ;
critical . setText ( tr ( " toxcore failed to start with your proxy settings. qTox cannot run; please modify your "
" settings and restart. " , " popup text " ) ) ;
critical . setIcon ( QMessageBox : : Critical ) ;
critical . exec ( ) ;
onSettingsClicked ( ) ;
}
2014-06-25 04:11:11 +08:00
void Widget : : onStatusSet ( Status status )
{
2015-02-12 20:18:04 +08:00
ui - > statusButton - > setProperty ( " status " , getStatusTitle ( status ) ) ;
ui - > statusButton - > setIcon ( getStatusIcon ( status , 10 , 10 ) ) ;
2015-03-12 02:04:29 +08:00
updateIcons ( ) ;
2014-06-25 04:11:11 +08:00
}
2015-06-17 02:25:19 +08:00
void Widget : : onSeparateWindowClicked ( bool separate )
{
onSeparateWindowChanged ( separate , true ) ;
}
void Widget : : onSeparateWindowChanged ( bool separate , bool clicked )
{
if ( ! separate )
{
QWindowList windowList = QGuiApplication : : topLevelWindows ( ) ;
2015-06-19 22:58:48 +08:00
2015-06-17 02:25:19 +08:00
for ( QWindow * window : windowList )
{
if ( window - > objectName ( ) = = " detachedWindow " )
window - > close ( ) ;
}
QWidget * contentWidget = new QWidget ( this ) ;
contentLayout = new ContentLayout ( contentWidget ) ;
ui - > mainSplitter - > addWidget ( contentWidget ) ;
clicked = true ;
setMinimumWidth ( 775 ) ;
}
else
{
2015-07-01 00:29:09 +08:00
int width = ui - > friendList - > size ( ) . width ( ) ;
2015-06-17 02:25:19 +08:00
if ( contentLayout ! = nullptr )
{
2015-06-19 22:58:48 +08:00
contentLayout - > clear ( ) ;
contentLayout - > parentWidget ( ) - > setParent ( 0 ) ; // Remove from splitter.
2015-06-17 02:25:19 +08:00
contentLayout - > parentWidget ( ) - > hide ( ) ;
contentLayout - > parentWidget ( ) - > deleteLater ( ) ;
contentLayout - > deleteLater ( ) ;
contentLayout = nullptr ;
}
setMinimumWidth ( ui - > tooliconsZone - > sizeHint ( ) . width ( ) ) ;
if ( clicked )
2015-07-01 19:49:36 +08:00
{
showNormal ( ) ;
2015-07-01 00:29:09 +08:00
resize ( width , height ( ) ) ;
2015-07-01 19:49:36 +08:00
}
2015-06-19 22:58:48 +08:00
setWindowTitle ( QString ( ) ) ;
2015-06-23 02:01:50 +08:00
setActiveToolMenuButton ( None ) ;
2015-06-17 02:25:19 +08:00
}
if ( clicked )
onSettingsClicked ( ) ;
}
2014-11-15 08:28:44 +08:00
void Widget : : setWindowTitle ( const QString & title )
{
2015-06-19 22:58:48 +08:00
if ( title . isEmpty ( ) )
{
QMainWindow : : setWindowTitle ( QApplication : : applicationName ( ) ) ;
}
else
{
QString tmp = title ;
/// <[^>]*> Regexp to remove HTML tags, in case someone used them in title
QMainWindow : : setWindowTitle ( QApplication : : applicationName ( ) + QStringLiteral ( " - " ) + tmp . remove ( QRegExp ( " <[^>]*> " ) ) ) ;
}
2014-11-15 08:28:44 +08:00
}
2015-01-26 18:43:34 +08:00
void Widget : : forceShow ( )
{
hide ( ) ; // Workaround to force minimized window to be restored
show ( ) ;
activateWindow ( ) ;
}
2014-06-25 04:11:11 +08:00
void Widget : : onAddClicked ( )
{
2015-06-17 02:25:19 +08:00
if ( Settings : : getInstance ( ) . getSeparateWindow ( ) )
{
if ( ! addFriendForm - > isShown ( ) )
{
addFriendForm - > show ( createContentDialog ( tr ( " Add friend " ) ) ) ;
setActiveToolMenuButton ( Widget : : None ) ;
}
}
else
{
hideMainForms ( nullptr ) ;
addFriendForm - > show ( contentLayout ) ;
setWindowTitle ( tr ( " Add friend " ) ) ;
setActiveToolMenuButton ( Widget : : AddButton ) ;
}
2014-06-25 04:11:11 +08:00
}
void Widget : : onGroupClicked ( )
{
2015-08-31 04:23:05 +08:00
Nexus : : getCore ( ) - > createGroup ( ) ;
2014-06-25 04:11:11 +08:00
}
void Widget : : onTransferClicked ( )
{
2015-06-17 02:25:19 +08:00
if ( Settings : : getInstance ( ) . getSeparateWindow ( ) )
{
if ( ! filesForm - > isShown ( ) )
{
filesForm - > show ( createContentDialog ( tr ( " File transfers " ) ) ) ;
setActiveToolMenuButton ( Widget : : None ) ;
}
}
else
{
hideMainForms ( nullptr ) ;
filesForm - > show ( contentLayout ) ;
setWindowTitle ( tr ( " File transfers " ) ) ;
setActiveToolMenuButton ( Widget : : TransferButton ) ;
}
2014-06-25 04:11:11 +08:00
}
2015-02-22 20:21:42 +08:00
void Widget : : confirmExecutableOpen ( const QFileInfo file )
2015-02-20 03:14:19 +08:00
{
2015-02-22 20:21:42 +08:00
static const QStringList dangerousExtensions = { " app " , " bat " , " com " , " cpl " , " dmg " , " exe " , " hta " , " jar " , " js " , " jse " , " lnk " , " msc " , " msh " , " msh1 " , " msh1xml " , " msh2 " , " msh2xml " , " mshxml " , " msi " , " msp " , " pif " , " ps1 " , " ps1xml " , " ps2 " , " ps2xml " , " psc1 " , " psc2 " , " py " , " reg " , " scf " , " sh " , " src " , " vb " , " vbe " , " vbs " , " ws " , " wsc " , " wsf " , " wsh " } ;
if ( dangerousExtensions . contains ( file . suffix ( ) ) )
2015-02-20 03:14:19 +08:00
{
2015-03-26 00:27:33 +08:00
if ( ! GUI : : askQuestion ( tr ( " Executable file " , " popup title " ) , tr ( " You have asked qTox to open an executable file. Executable files can potentially damage your computer. Are you sure want to open this file? " , " popup text " ) , false , true ) )
2015-02-22 20:21:42 +08:00
return ;
2015-04-24 19:01:50 +08:00
2015-02-22 20:21:42 +08:00
// The user wants to run this file, so make it executable and run it
QFile ( file . filePath ( ) ) . setPermissions ( file . permissions ( ) | QFile : : ExeOwner | QFile : : ExeUser | QFile : : ExeGroup | QFile : : ExeOther ) ;
QProcess : : startDetached ( file . filePath ( ) ) ;
}
else
{
2015-03-01 17:43:43 +08:00
QDesktopServices : : openUrl ( QUrl : : fromLocalFile ( file . filePath ( ) ) ) ;
2015-02-20 03:14:19 +08:00
}
}
2014-10-21 02:03:44 +08:00
void Widget : : onIconClick ( QSystemTrayIcon : : ActivationReason reason )
2014-10-08 22:17:05 +08:00
{
2015-01-26 18:43:34 +08:00
switch ( reason )
{
2014-10-21 02:03:44 +08:00
case QSystemTrayIcon : : Trigger :
2014-11-26 01:11:05 +08:00
{
2015-01-26 18:43:34 +08:00
if ( isHidden ( ) )
{
show ( ) ;
activateWindow ( ) ;
2015-03-20 03:24:06 +08:00
if ( wasMaximized )
showMaximized ( ) ;
else
showNormal ( ) ;
2015-01-26 18:43:34 +08:00
}
2015-01-30 07:40:20 +08:00
else if ( isMinimized ( ) )
{
2015-01-26 18:43:34 +08:00
forceShow ( ) ;
2015-03-15 04:06:33 +08:00
activateWindow ( ) ;
2015-03-20 03:24:06 +08:00
if ( wasMaximized )
showMaximized ( ) ;
else
showNormal ( ) ;
2015-01-30 07:40:20 +08:00
}
2015-01-26 18:43:34 +08:00
else
2015-01-30 07:40:20 +08:00
{
2015-03-20 03:24:06 +08:00
wasMaximized = isMaximized ( ) ;
2015-03-15 04:06:33 +08:00
if ( Settings : : getInstance ( ) . getMinimizeToTray ( ) )
hide ( ) ;
else
showMinimized ( ) ;
2015-01-30 07:40:20 +08:00
}
2015-01-26 18:43:34 +08:00
break ;
2014-11-26 01:11:05 +08:00
}
2014-10-21 02:03:44 +08:00
case QSystemTrayIcon : : MiddleClick :
2015-03-20 03:24:06 +08:00
wasMaximized = isMaximized ( ) ;
2015-03-15 04:06:33 +08:00
if ( Settings : : getInstance ( ) . getMinimizeToTray ( ) )
hide ( ) ;
else
showMinimized ( ) ;
2014-10-21 02:03:44 +08:00
break ;
2015-01-30 00:33:17 +08:00
case QSystemTrayIcon : : Unknown :
if ( isHidden ( ) )
forceShow ( ) ;
break ;
2014-10-21 02:03:44 +08:00
default :
2015-01-26 18:43:34 +08:00
break ;
2014-10-21 02:03:44 +08:00
}
2014-10-08 22:17:05 +08:00
}
2014-06-25 04:11:11 +08:00
void Widget : : onSettingsClicked ( )
{
2015-06-17 02:25:19 +08:00
if ( Settings : : getInstance ( ) . getSeparateWindow ( ) )
{
if ( ! settingsWidget - > isShown ( ) )
{
settingsWidget - > show ( createContentDialog ( tr ( " Settings " ) ) ) ;
setActiveToolMenuButton ( Widget : : None ) ;
}
}
else
{
hideMainForms ( nullptr ) ;
settingsWidget - > show ( contentLayout ) ;
setWindowTitle ( tr ( " Settings " ) ) ;
setActiveToolMenuButton ( Widget : : SettingButton ) ;
}
2014-06-25 04:11:11 +08:00
}
2015-03-11 10:01:13 +08:00
void Widget : : showProfile ( ) // onAvatarClicked, onUsernameClicked
{
2015-07-01 00:29:09 +08:00
if ( Settings : : getInstance ( ) . getSeparateWindow ( ) )
{
if ( ! profileForm - > isShown ( ) )
{
profileForm - > show ( createContentDialog ( tr ( " Profile " ) ) ) ;
setActiveToolMenuButton ( Widget : : None ) ;
}
}
else
{
hideMainForms ( nullptr ) ;
profileForm - > show ( contentLayout ) ;
setWindowTitle ( tr ( " Profile " ) ) ;
setActiveToolMenuButton ( Widget : : None ) ;
}
2015-03-11 10:01:13 +08:00
}
2015-06-17 02:25:19 +08:00
void Widget : : hideMainForms ( GenericChatroomWidget * chatroomWidget )
2014-06-25 04:11:11 +08:00
{
2015-05-08 01:47:18 +08:00
setActiveToolMenuButton ( Widget : : None ) ;
2015-07-01 00:29:09 +08:00
if ( contentLayout ! = nullptr )
contentLayout - > clear ( ) ;
2014-10-04 16:54:50 +08:00
2014-09-02 00:20:28 +08:00
if ( activeChatroomWidget ! = nullptr )
activeChatroomWidget - > setAsInactiveChatroom ( ) ;
2015-06-17 02:25:19 +08:00
activeChatroomWidget = chatroomWidget ;
2014-06-25 04:11:11 +08:00
}
void Widget : : onUsernameChanged ( const QString & newUsername , const QString & oldUsername )
{
2015-01-21 19:10:41 +08:00
setUsername ( oldUsername ) ; // restore old username until Core tells us to set it
2015-02-06 19:28:49 +08:00
Nexus : : getCore ( ) - > setUsername ( newUsername ) ;
2014-06-25 04:11:11 +08:00
}
void Widget : : setUsername ( const QString & username )
{
ui - > nameLabel - > setText ( username ) ;
2015-01-21 19:10:41 +08:00
ui - > nameLabel - > setToolTip ( username ) ; // for overlength names
2015-01-23 01:43:44 +08:00
QString sanename = username ;
sanename . remove ( QRegExp ( " [ \\ t \\ n \\ v \\ f \\ r \\ x0000] " ) ) ;
nameMention = QRegExp ( " \\ b " + QRegExp : : escape ( username ) + " \\ b " , Qt : : CaseInsensitive ) ;
sanitizedNameMention = QRegExp ( " \\ b " + QRegExp : : escape ( sanename ) + " \\ b " , Qt : : CaseInsensitive ) ;
2014-06-25 04:11:11 +08:00
}
2015-06-08 02:25:05 +08:00
void Widget : : onStatusMessageChanged ( const QString & newStatusMessage )
2014-06-25 04:11:11 +08:00
{
2015-06-08 02:25:05 +08:00
// Keep old status message until Core tells us to set it.
2015-02-06 19:28:49 +08:00
Nexus : : getCore ( ) - > setStatusMessage ( newStatusMessage ) ;
2014-06-25 04:11:11 +08:00
}
void Widget : : setStatusMessage ( const QString & statusMessage )
{
ui - > statusLabel - > setText ( statusMessage ) ;
2014-07-16 00:04:26 +08:00
ui - > statusLabel - > setToolTip ( statusMessage ) ; // for overlength messsages
2014-06-25 04:11:11 +08:00
}
2015-02-03 07:56:51 +08:00
void Widget : : reloadHistory ( )
{
for ( auto f : FriendList : : getAllFriends ( ) )
2015-09-04 00:58:23 +08:00
f - > getChatForm ( ) - > loadHistory ( QDateTime : : currentDateTime ( ) . addDays ( - 7 ) , true ) ;
2015-02-03 07:56:51 +08:00
}
2014-06-25 04:11:11 +08:00
void Widget : : addFriend ( int friendId , const QString & userId )
{
2015-05-18 04:55:50 +08:00
ToxId userToxId = ToxId ( userId ) ;
2014-11-16 22:48:18 +08:00
Friend * newfriend = FriendList : : addFriend ( friendId , userToxId ) ;
2015-06-24 02:58:30 +08:00
QDate activityDate = Settings : : getInstance ( ) . getFriendActivity ( newfriend - > getToxId ( ) ) ;
QDate chatDate = newfriend - > getChatForm ( ) - > getLatestDate ( ) ;
if ( chatDate > activityDate & & chatDate . isValid ( ) )
Settings : : getInstance ( ) . setFriendActivity ( newfriend - > getToxId ( ) , chatDate ) ;
2015-06-06 03:34:32 +08:00
contactListWidget - > addFriendWidget ( newfriend - > getFriendWidget ( ) , Status : : Offline , Settings : : getInstance ( ) . getFriendCircleID ( newfriend - > getToxId ( ) ) ) ;
2014-11-07 22:55:32 +08:00
2015-02-06 19:28:49 +08:00
Core * core = Nexus : : getCore ( ) ;
2015-06-08 02:25:05 +08:00
connect ( newfriend , & Friend : : displayedNameChanged , this , & Widget : : onFriendDisplayChanged ) ;
2015-06-11 00:11:50 +08:00
connect ( settingsWidget , & SettingsWidget : : compactToggled , newfriend - > getFriendWidget ( ) , & GenericChatroomWidget : : compactChange ) ;
2015-06-23 02:01:50 +08:00
connect ( newfriend - > getFriendWidget ( ) , SIGNAL ( chatroomWidgetClicked ( GenericChatroomWidget * , bool ) ) , this , SLOT ( onChatroomWidgetClicked ( GenericChatroomWidget * , bool ) ) ) ;
2014-11-06 23:26:22 +08:00
connect ( newfriend - > getFriendWidget ( ) , SIGNAL ( removeFriend ( int ) ) , this , SLOT ( removeFriend ( int ) ) ) ;
connect ( newfriend - > getFriendWidget ( ) , SIGNAL ( copyFriendIdToClipboard ( int ) ) , this , SLOT ( copyFriendIdToClipboard ( int ) ) ) ;
connect ( newfriend - > getFriendWidget ( ) , SIGNAL ( chatroomWidgetClicked ( GenericChatroomWidget * ) ) , newfriend - > getChatForm ( ) , SLOT ( focusInput ( ) ) ) ;
2015-04-20 05:12:44 +08:00
connect ( newfriend - > getChatForm ( ) , & GenericChatForm : : sendMessage , core , & Core : : sendMessage ) ;
2014-11-06 23:26:22 +08:00
connect ( newfriend - > getChatForm ( ) , & GenericChatForm : : sendAction , core , & Core : : sendAction ) ;
2015-04-20 05:12:44 +08:00
connect ( newfriend - > getChatForm ( ) , & ChatForm : : sendFile , core , & Core : : sendFile ) ;
connect ( newfriend - > getChatForm ( ) , & ChatForm : : answerCall , core , & Core : : answerCall ) ;
connect ( newfriend - > getChatForm ( ) , & ChatForm : : hangupCall , core , & Core : : hangupCall ) ;
connect ( newfriend - > getChatForm ( ) , & ChatForm : : rejectCall , core , & Core : : rejectCall ) ;
connect ( newfriend - > getChatForm ( ) , & ChatForm : : startCall , core , & Core : : startCall ) ;
connect ( newfriend - > getChatForm ( ) , & ChatForm : : cancelCall , core , & Core : : cancelCall ) ;
connect ( newfriend - > getChatForm ( ) , & ChatForm : : micMuteToggle , core , & Core : : micMuteToggle ) ;
connect ( newfriend - > getChatForm ( ) , & ChatForm : : volMuteToggle , core , & Core : : volMuteToggle ) ;
2014-11-18 10:15:44 +08:00
connect ( newfriend - > getChatForm ( ) , & ChatForm : : aliasChanged , newfriend - > getFriendWidget ( ) , & FriendWidget : : setAlias ) ;
2014-11-06 23:26:22 +08:00
connect ( core , & Core : : fileReceiveRequested , newfriend - > getChatForm ( ) , & ChatForm : : onFileRecvRequest ) ;
connect ( core , & Core : : avInvite , newfriend - > getChatForm ( ) , & ChatForm : : onAvInvite ) ;
connect ( core , & Core : : avStart , newfriend - > getChatForm ( ) , & ChatForm : : onAvStart ) ;
connect ( core , & Core : : avCancel , newfriend - > getChatForm ( ) , & ChatForm : : onAvCancel ) ;
connect ( core , & Core : : avEnd , newfriend - > getChatForm ( ) , & ChatForm : : onAvEnd ) ;
connect ( core , & Core : : avRinging , newfriend - > getChatForm ( ) , & ChatForm : : onAvRinging ) ;
connect ( core , & Core : : avStarting , newfriend - > getChatForm ( ) , & ChatForm : : onAvStarting ) ;
connect ( core , & Core : : avEnding , newfriend - > getChatForm ( ) , & ChatForm : : onAvEnding ) ;
connect ( core , & Core : : avRequestTimeout , newfriend - > getChatForm ( ) , & ChatForm : : onAvRequestTimeout ) ;
connect ( core , & Core : : avPeerTimeout , newfriend - > getChatForm ( ) , & ChatForm : : onAvPeerTimeout ) ;
connect ( core , & Core : : avMediaChange , newfriend - > getChatForm ( ) , & ChatForm : : onAvMediaChange ) ;
connect ( core , & Core : : avCallFailed , newfriend - > getChatForm ( ) , & ChatForm : : onAvCallFailed ) ;
connect ( core , & Core : : avRejected , newfriend - > getChatForm ( ) , & ChatForm : : onAvRejected ) ;
connect ( core , & Core : : friendAvatarChanged , newfriend - > getChatForm ( ) , & ChatForm : : onAvatarChange ) ;
connect ( core , & Core : : friendAvatarChanged , newfriend - > getFriendWidget ( ) , & FriendWidget : : onAvatarChange ) ;
connect ( core , & Core : : friendAvatarRemoved , newfriend - > getChatForm ( ) , & ChatForm : : onAvatarRemoved ) ;
connect ( core , & Core : : friendAvatarRemoved , newfriend - > getFriendWidget ( ) , & FriendWidget : : onAvatarRemoved ) ;
2014-09-24 23:55:54 +08:00
// Try to get the avatar from the cache
2014-09-28 06:19:30 +08:00
QPixmap avatar = Settings : : getInstance ( ) . getSavedAvatar ( userId ) ;
2014-09-24 23:55:54 +08:00
if ( ! avatar . isNull ( ) )
{
2014-11-06 23:26:22 +08:00
newfriend - > getChatForm ( ) - > onAvatarChange ( friendId , avatar ) ;
newfriend - > getFriendWidget ( ) - > onAvatarChange ( friendId , avatar ) ;
2014-09-24 23:55:54 +08:00
}
2015-04-09 00:18:07 +08:00
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-06-07 11:20:06 +08:00
newfriend - > getFriendWidget ( ) - > search ( ui - > searchContactText - > text ( ) , filterOffline ( filter ) ) ;
2015-06-24 02:58:30 +08:00
2014-06-27 01:45:47 +08:00
}
2014-11-10 03:23:43 +08:00
void Widget : : addFriendFailed ( const QString & , const QString & errorInfo )
2014-06-27 01:45:47 +08:00
{
2014-11-10 08:04:35 +08:00
QString info = QString ( tr ( " Couldn't request friendship " ) ) ;
2014-12-12 02:05:52 +08:00
if ( ! errorInfo . isEmpty ( ) ) {
2014-11-10 03:23:43 +08:00
info = info + ( QString ( " : " ) + errorInfo ) ;
}
QMessageBox : : critical ( 0 , " Error " , info ) ;
2014-06-25 04:11:11 +08:00
}
2015-06-15 21:48:34 +08:00
void Widget : : onFriendshipChanged ( int friendId )
{
Friend * who = FriendList : : findFriend ( friendId ) ;
updateFriendActivity ( who ) ;
}
2014-06-25 04:11:11 +08:00
void Widget : : onFriendStatusChanged ( int friendId , Status status )
{
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( ! f )
return ;
2015-03-26 00:27:33 +08:00
2014-11-09 09:01:02 +08:00
bool isActualChange = f - > getStatus ( ) ! = status ;
2015-03-26 00:27:33 +08:00
if ( isActualChange )
2015-03-23 17:38:24 +08:00
{
2015-03-26 00:27:33 +08:00
if ( f - > getStatus ( ) = = Status : : Offline )
2015-04-20 05:12:44 +08:00
contactListWidget - > moveWidget ( f - > getFriendWidget ( ) , Status : : Online ) ;
2015-03-26 00:27:33 +08:00
else if ( status = = Status : : Offline )
2015-04-20 05:12:44 +08:00
contactListWidget - > moveWidget ( f - > getFriendWidget ( ) , Status : : Offline ) ;
2015-03-12 08:30:01 +08:00
}
2014-11-06 23:26:22 +08:00
f - > setStatus ( status ) ;
f - > getFriendWidget ( ) - > updateStatusLight ( ) ;
2015-03-26 03:08:46 +08:00
if ( f - > getFriendWidget ( ) - > isActive ( ) )
{
QString windowTitle = f - > getFriendWidget ( ) - > getName ( ) ;
if ( ! f - > getFriendWidget ( ) - > getStatusString ( ) . isNull ( ) )
windowTitle + = " ( " + f - > getFriendWidget ( ) - > getStatusString ( ) + " ) " ;
setWindowTitle ( windowTitle ) ;
}
2015-04-24 19:01:50 +08:00
2015-06-23 02:01:50 +08:00
ContentDialog : : updateFriendStatus ( friendId ) ;
2014-10-18 07:06:30 +08:00
//won't print the message if there were no messages before
2014-12-12 02:05:52 +08:00
if ( ! f - > getChatForm ( ) - > isEmpty ( )
2014-11-10 16:09:20 +08:00
& & Settings : : getInstance ( ) . getStatusChangeNotificationEnabled ( ) )
2014-10-18 07:06:30 +08:00
{
QString fStatus = " " ;
2015-03-21 16:59:28 +08:00
switch ( f - > getStatus ( ) )
2015-04-24 19:01:50 +08:00
{
2014-10-18 07:06:30 +08:00
case Status : : Away :
fStatus = tr ( " away " , " contact status " ) ; break ;
case Status : : Busy :
fStatus = tr ( " busy " , " contact status " ) ; break ;
case Status : : Offline :
2015-02-18 21:02:10 +08:00
fStatus = tr ( " offline " , " contact status " ) ;
f - > getChatForm ( ) - > setFriendTyping ( false ) ; // Hide the "is typing" message when a friend goes offline
break ;
2014-10-18 07:06:30 +08:00
default :
fStatus = tr ( " online " , " contact status " ) ; break ;
}
2014-11-09 09:01:02 +08:00
if ( isActualChange )
f - > getChatForm ( ) - > addSystemInfoMessage ( tr ( " %1 is now %2 " , " e.g. \" Dubslow is now online \" " ) . arg ( f - > getDisplayedName ( ) ) . arg ( fStatus ) ,
2015-01-05 01:21:35 +08:00
ChatMessage : : INFO , QDateTime : : currentDateTime ( ) ) ;
2014-10-18 07:06:30 +08:00
}
2014-11-10 19:30:56 +08:00
if ( isActualChange & & status ! = Status : : Offline )
{ // wait a little
2015-02-08 00:18:25 +08:00
QTimer : : singleShot ( 250 , f - > getChatForm ( ) - > getOfflineMsgEngine ( ) , SLOT ( deliverOfflineMsgs ( ) ) ) ;
2014-11-10 19:30:56 +08:00
}
2014-06-25 04:11:11 +08:00
}
void Widget : : onFriendStatusMessageChanged ( int friendId , const QString & message )
{
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( ! f )
return ;
2014-09-29 02:09:10 +08:00
QString str = message ; str . replace ( ' \n ' , ' ' ) ;
str . remove ( ' \r ' ) ; str . remove ( QChar ( ( char ) 0 ) ) ; // null terminator...
f - > setStatusMessage ( str ) ;
2015-06-23 02:01:50 +08:00
ContentDialog : : updateFriendStatusMessage ( friendId , message ) ;
2014-06-25 04:11:11 +08:00
}
void Widget : : onFriendUsernameChanged ( int friendId , const QString & username )
{
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( ! f )
return ;
2014-09-29 02:09:10 +08:00
QString str = username ; str . replace ( ' \n ' , ' ' ) ;
str . remove ( ' \r ' ) ; str . remove ( QChar ( ( char ) 0 ) ) ; // null terminator...
f - > setName ( str ) ;
2015-06-08 02:25:05 +08:00
}
void Widget : : onFriendDisplayChanged ( FriendWidget * friendWidget , Status s )
{
contactListWidget - > moveWidget ( friendWidget , s ) ;
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-06-08 02:25:05 +08:00
switch ( s )
{
case Status : : Offline :
friendWidget - > searchName ( ui - > searchContactText - > text ( ) , filterOffline ( filter ) ) ;
default :
friendWidget - > searchName ( ui - > searchContactText - > text ( ) , filterOnline ( filter ) ) ;
}
2015-06-07 11:20:06 +08:00
2014-06-25 04:11:11 +08:00
}
2015-06-23 02:01:50 +08:00
void Widget : : onChatroomWidgetClicked ( GenericChatroomWidget * widget , bool group )
2014-06-25 04:11:11 +08:00
{
2015-06-23 02:01:50 +08:00
widget - > resetEventFlags ( ) ;
widget - > updateStatusLight ( ) ;
2015-06-27 02:43:08 +08:00
if ( widget - > chatFormIsSet ( true ) & & ! group )
2015-06-23 02:01:50 +08:00
return ;
if ( Settings : : getInstance ( ) . getSeparateWindow ( ) | | group )
2015-06-17 02:25:19 +08:00
{
2015-06-23 02:01:50 +08:00
ContentDialog * dialog = nullptr ;
2015-06-19 22:58:48 +08:00
2015-06-23 02:01:50 +08:00
if ( ! Settings : : getInstance ( ) . getDontGroupWindows ( ) & & ! group )
dialog = ContentDialog : : current ( ) ;
2015-06-19 22:58:48 +08:00
2015-06-23 02:01:50 +08:00
if ( dialog = = nullptr )
2015-07-01 00:29:09 +08:00
dialog = createContentDialog ( ) ;
2015-06-19 22:58:48 +08:00
2015-06-23 02:01:50 +08:00
dialog - > show ( ) ;
Friend * frnd = widget - > getFriend ( ) ;
if ( frnd ! = nullptr )
{
addFriendDialog ( frnd , dialog ) ;
}
else
{
Group * group = widget - > getGroup ( ) ;
addGroupDialog ( group , dialog ) ;
2015-06-19 22:58:48 +08:00
}
2015-06-23 02:01:50 +08:00
dialog - > raise ( ) ;
dialog - > activateWindow ( ) ;
2015-06-17 02:25:19 +08:00
}
else
{
2015-06-19 22:58:48 +08:00
hideMainForms ( widget ) ;
2015-06-17 02:25:19 +08:00
widget - > setChatForm ( contentLayout ) ;
widget - > setAsActiveChatroom ( ) ;
2015-06-23 02:01:50 +08:00
setWindowTitle ( widget - > getTitle ( ) ) ;
2015-06-17 02:25:19 +08:00
}
2014-06-25 04:11:11 +08:00
}
2014-10-02 14:01:23 +08:00
void Widget : : onFriendMessageReceived ( int friendId , const QString & message , bool isAction )
2014-06-25 04:11:11 +08:00
{
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( ! f )
return ;
2014-10-14 13:49:27 +08:00
QDateTime timestamp = QDateTime : : currentDateTime ( ) ;
2015-05-24 02:58:41 +08:00
f - > getChatForm ( ) - > addMessage ( f - > getToxId ( ) , message , isAction , timestamp , true ) ;
2014-10-14 22:36:17 +08:00
2015-05-24 02:58:41 +08:00
HistoryKeeper : : getInstance ( ) - > addChatEntry ( f - > getToxId ( ) . publicKey , isAction ? " /me " + f - > getDisplayedName ( ) + " " + message : message ,
f - > getToxId ( ) . publicKey , timestamp , true ) ;
2014-06-28 00:12:43 +08:00
2015-06-23 02:01:50 +08:00
newFriendMessageAlert ( friendId ) ;
2014-06-25 04:11:11 +08:00
}
2014-11-01 22:19:11 +08:00
void Widget : : onReceiptRecieved ( int friendId , int receipt )
{
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( ! f )
return ;
2015-02-08 00:18:25 +08:00
f - > getChatForm ( ) - > getOfflineMsgEngine ( ) - > dischargeReceipt ( receipt ) ;
2014-11-01 22:19:11 +08:00
}
2015-06-23 02:01:50 +08:00
void Widget : : addFriendDialog ( Friend * frnd , ContentDialog * dialog )
{
2015-06-27 02:43:08 +08:00
if ( ! ContentDialog : : getFriendDialog ( frnd - > getFriendID ( ) ) & & ! Settings : : getInstance ( ) . getSeparateWindow ( ) & & activeChatroomWidget = = frnd - > getFriendWidget ( ) )
onAddClicked ( ) ;
2015-06-23 02:01:50 +08:00
FriendWidget * friendWidget = dialog - > addFriend ( frnd - > getFriendID ( ) , frnd - > getDisplayedName ( ) ) ;
friendWidget - > setStatusMsg ( frnd - > getFriendWidget ( ) - > getStatusMsg ( ) ) ;
connect ( friendWidget , SIGNAL ( removeFriend ( int ) ) , this , SLOT ( removeFriend ( int ) ) ) ;
connect ( friendWidget , SIGNAL ( copyFriendIdToClipboard ( int ) ) , this , SLOT ( copyFriendIdToClipboard ( int ) ) ) ;
connect ( Core : : getInstance ( ) , & Core : : friendAvatarChanged , friendWidget , & FriendWidget : : onAvatarChange ) ;
connect ( Core : : getInstance ( ) , & Core : : friendAvatarRemoved , friendWidget , & FriendWidget : : onAvatarRemoved ) ;
QPixmap avatar = Settings : : getInstance ( ) . getSavedAvatar ( frnd - > getToxId ( ) . toString ( ) ) ;
if ( ! avatar . isNull ( ) )
friendWidget - > onAvatarChange ( frnd - > getFriendID ( ) , avatar ) ;
}
void Widget : : addGroupDialog ( Group * group , ContentDialog * dialog )
{
GroupWidget * groupWidget = dialog - > addGroup ( group - > getGroupId ( ) , group - > getName ( ) ) ;
connect ( groupWidget , SIGNAL ( removeGroup ( int ) ) , this , SLOT ( removeGroup ( int ) ) ) ;
connect ( groupWidget , SIGNAL ( chatroomWidgetClicked ( GenericChatroomWidget * ) ) , group - > getChatForm ( ) , SLOT ( focusInput ( ) ) ) ;
}
2015-06-24 00:54:00 +08:00
bool Widget : : newFriendMessageAlert ( int friendId )
2015-06-23 02:01:50 +08:00
{
bool hasActive ;
QWidget * currentWindow ;
ContentDialog * contentDialog = ContentDialog : : getFriendDialog ( friendId ) ;
2015-06-24 00:54:00 +08:00
Friend * f = FriendList : : findFriend ( friendId ) ;
2015-06-23 02:01:50 +08:00
if ( contentDialog ! = nullptr )
{
currentWindow = contentDialog - > window ( ) ;
hasActive = ContentDialog : : isFriendWidgetActive ( friendId ) ;
}
else
{
currentWindow = window ( ) ;
2015-06-24 00:54:00 +08:00
hasActive = f - > getFriendWidget ( ) = = activeChatroomWidget ;
2015-06-23 02:01:50 +08:00
}
2015-06-24 00:54:00 +08:00
if ( newMessageAlert ( currentWindow , hasActive ) )
{
f - > setEventFlag ( true ) ;
f - > getFriendWidget ( ) - > updateStatusLight ( ) ;
if ( contentDialog = = nullptr )
{
if ( hasActive )
setWindowTitle ( f - > getFriendWidget ( ) - > getTitle ( ) ) ;
}
else
{
ContentDialog : : updateFriendStatus ( friendId ) ;
}
return true ;
}
return false ;
2015-06-23 02:01:50 +08:00
}
2015-06-24 00:54:00 +08:00
bool Widget : : newGroupMessageAlert ( int groupId )
2015-06-23 02:01:50 +08:00
{
bool hasActive ;
QWidget * currentWindow ;
ContentDialog * contentDialog = ContentDialog : : getGroupDialog ( groupId ) ;
if ( contentDialog ! = nullptr )
{
currentWindow = contentDialog - > window ( ) ;
hasActive = ContentDialog : : isGroupWidgetActive ( groupId ) ;
}
else
{
currentWindow = window ( ) ;
2015-06-24 00:54:00 +08:00
hasActive = GroupList : : findGroup ( groupId ) - > getGroupWidget ( ) = = activeChatroomWidget ;
2015-06-23 02:01:50 +08:00
}
2015-06-24 00:54:00 +08:00
return newMessageAlert ( currentWindow , hasActive ) ;
2015-06-23 02:01:50 +08:00
}
2015-06-24 00:54:00 +08:00
bool Widget : : newMessageAlert ( QWidget * currentWindow , bool isActive )
2014-06-28 05:36:44 +08:00
{
2015-07-01 21:22:05 +08:00
bool inactiveWindow = isMinimized ( ) | | ! currentWindow - > isActiveWindow ( ) ;
2015-06-23 02:01:50 +08:00
if ( ! inactiveWindow & & isActive )
2015-06-24 00:54:00 +08:00
return false ;
2015-04-24 19:01:50 +08:00
2015-03-18 16:45:51 +08:00
if ( ui - > statusButton - > property ( " status " ) . toString ( ) = = " busy " )
2015-06-24 00:54:00 +08:00
return false ;
2015-01-21 19:10:41 +08:00
2015-06-23 02:01:50 +08:00
QApplication : : alert ( currentWindow ) ;
2014-08-30 21:15:23 +08:00
2015-01-21 19:10:41 +08:00
if ( Settings : : getInstance ( ) . getShowWindow ( ) )
2014-11-10 08:23:41 +08:00
{
2015-06-23 02:01:50 +08:00
currentWindow - > show ( ) ;
2015-01-21 19:10:41 +08:00
if ( inactiveWindow & & Settings : : getInstance ( ) . getShowInFront ( ) )
2015-06-24 00:54:00 +08:00
currentWindow - > activateWindow ( ) ;
2014-11-10 08:23:41 +08:00
}
2015-01-21 19:10:41 +08:00
2015-03-22 08:57:28 +08:00
if ( Settings : : getInstance ( ) . getNotifySound ( ) )
2014-08-30 21:15:23 +08:00
{
2015-03-22 08:57:28 +08:00
static QFile sndFile ( " :audio/notification.pcm " ) ;
static QByteArray sndData ;
if ( sndData . isEmpty ( ) )
{
sndFile . open ( QIODevice : : ReadOnly ) ;
sndData = sndFile . readAll ( ) ;
sndFile . close ( ) ;
}
2014-08-30 21:15:23 +08:00
2015-03-22 08:57:28 +08:00
Audio : : playMono16Sound ( sndData ) ;
}
2015-06-24 00:54:00 +08:00
return true ;
2014-06-28 05:36:44 +08:00
}
2014-10-08 10:20:38 +08:00
void Widget : : playRingtone ( )
{
2015-03-18 16:45:51 +08:00
if ( ui - > statusButton - > property ( " status " ) . toString ( ) = = " busy " )
return ;
2015-04-24 19:01:50 +08:00
2015-08-31 03:36:39 +08:00
// for whatever reason this plays slower/downshifted from what any other program plays the file as... but whatever
static QFile sndFile1 ( " :audio/ToxicIncomingCall.pcm " ) ;
2014-10-08 10:20:38 +08:00
static QByteArray sndData1 ;
if ( sndData1 . isEmpty ( ) )
{
sndFile1 . open ( QIODevice : : ReadOnly ) ;
sndData1 = sndFile1 . readAll ( ) ;
sndFile1 . close ( ) ;
}
2014-11-17 02:04:45 +08:00
Audio : : playMono16Sound ( sndData1 ) ;
2014-10-08 10:20:38 +08:00
}
2014-06-25 04:11:11 +08:00
void Widget : : onFriendRequestReceived ( const QString & userId , const QString & message )
{
2015-08-31 04:23:05 +08:00
FriendRequestDialog dialog ( this , userId , message ) ;
if ( dialog . exec ( ) = = QDialog : : Accepted )
emit friendRequestAccepted ( userId ) ;
2014-06-25 04:11:11 +08:00
}
2015-06-12 21:53:44 +08:00
void Widget : : updateFriendActivity ( Friend * frnd )
{
QDate date = Settings : : getInstance ( ) . getFriendActivity ( frnd - > getToxId ( ) ) ;
if ( date ! = QDate : : currentDate ( ) )
{
2015-07-01 21:10:55 +08:00
// Update old activity before after new one. Store old date first.
QDate oldDate = Settings : : getInstance ( ) . getFriendActivity ( frnd - > getToxId ( ) ) ;
2015-06-12 21:53:44 +08:00
Settings : : getInstance ( ) . setFriendActivity ( frnd - > getToxId ( ) , QDate : : currentDate ( ) ) ;
contactListWidget - > moveWidget ( frnd - > getFriendWidget ( ) , frnd - > getStatus ( ) ) ;
2015-07-01 21:10:55 +08:00
contactListWidget - > updateActivityDate ( oldDate ) ;
2015-06-12 21:53:44 +08:00
}
}
2014-11-12 07:00:24 +08:00
void Widget : : removeFriend ( Friend * f , bool fake )
2015-05-12 04:48:32 +08:00
{
if ( ! fake )
{
2015-08-22 17:05:16 +08:00
RemoveFriendDialog ask ( this , f ) ;
ask . exec ( ) ;
if ( ! ask . accepted ( ) )
2015-05-12 04:48:32 +08:00
return ;
2015-08-22 17:05:16 +08:00
else if ( ask . removeHistory ( ) )
2015-05-24 02:58:41 +08:00
HistoryKeeper : : getInstance ( ) - > removeFriendHistory ( f - > getToxId ( ) . publicKey ) ;
2015-05-12 04:48:32 +08:00
}
2015-06-06 09:40:08 +08:00
2014-11-06 23:26:22 +08:00
f - > getFriendWidget ( ) - > setAsInactiveChatroom ( ) ;
if ( static_cast < GenericChatroomWidget * > ( f - > getFriendWidget ( ) ) = = activeChatroomWidget )
2014-11-12 06:27:30 +08:00
{
2014-09-02 00:20:28 +08:00
activeChatroomWidget = nullptr ;
2014-11-12 06:27:30 +08:00
onAddClicked ( ) ;
}
2015-06-06 09:40:08 +08:00
2015-06-15 21:48:34 +08:00
contactListWidget - > removeFriendWidget ( f - > getFriendWidget ( ) ) ;
2015-07-01 22:19:15 +08:00
ContentDialog * lastDialog = ContentDialog : : getFriendDialog ( f - > getFriendID ( ) ) ;
if ( lastDialog ! = nullptr )
lastDialog - > removeFriend ( f - > getFriendID ( ) ) ;
2014-11-12 07:00:24 +08:00
FriendList : : removeFriend ( f - > getFriendID ( ) , fake ) ;
2015-02-06 19:28:49 +08:00
Nexus : : getCore ( ) - > removeFriend ( f - > getFriendID ( ) , fake ) ;
2015-06-06 09:40:08 +08:00
2014-06-25 04:11:11 +08:00
delete f ;
2015-07-01 22:19:15 +08:00
if ( contentLayout ! = nullptr & & contentLayout - > mainHead - > layout ( ) - > isEmpty ( ) )
2014-06-25 04:11:11 +08:00
onAddClicked ( ) ;
2014-11-02 16:45:44 +08:00
2015-06-03 18:26:48 +08:00
contactListWidget - > reDraw ( ) ;
2014-06-25 04:11:11 +08:00
}
2014-07-23 17:22:09 +08:00
void Widget : : removeFriend ( int friendId )
{
2014-11-12 07:00:24 +08:00
removeFriend ( FriendList : : findFriend ( friendId ) , false ) ;
2014-07-23 17:22:09 +08:00
}
2014-10-09 16:07:26 +08:00
void Widget : : clearContactsList ( )
{
2015-06-04 22:36:08 +08:00
assert ( QThread : : currentThread ( ) = = qApp - > thread ( ) ) ;
2014-11-07 22:55:32 +08:00
QList < Friend * > friends = FriendList : : getAllFriends ( ) ;
for ( Friend * f : friends )
2014-11-12 07:00:24 +08:00
removeFriend ( f , true ) ;
2014-11-20 17:13:13 +08:00
QList < Group * > groups = GroupList : : getAllGroups ( ) ;
for ( Group * g : groups )
2014-11-12 07:00:24 +08:00
removeGroup ( g , true ) ;
2014-10-09 16:07:26 +08:00
}
2015-07-01 00:29:09 +08:00
ContentDialog * Widget : : createContentDialog ( ) const
{
return new ContentDialog ( settingsWidget ) ;
}
2015-06-17 02:25:19 +08:00
ContentLayout * Widget : : createContentDialog ( const QString & title ) const
{
QDialog * dialog = new QDialog ( ) ;
ContentLayout * contentLayout = new ContentLayout ( dialog ) ;
dialog - > setObjectName ( " detached " ) ;
dialog - > setLayout ( contentLayout ) ;
dialog - > layout ( ) - > setMargin ( 0 ) ;
dialog - > layout ( ) - > setSpacing ( 0 ) ;
2015-07-01 21:22:05 +08:00
dialog - > setMinimumSize ( 720 , 400 ) ;
2015-06-17 02:25:19 +08:00
dialog - > setAttribute ( Qt : : WA_DeleteOnClose ) ;
dialog - > setWindowTitle ( title ) ;
dialog - > show ( ) ;
return contentLayout ;
}
2014-07-02 05:50:07 +08:00
void Widget : : copyFriendIdToClipboard ( int friendId )
{
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( f ! = nullptr )
{
QClipboard * clipboard = QApplication : : clipboard ( ) ;
2015-02-06 19:28:49 +08:00
clipboard - > setText ( Nexus : : getCore ( ) - > getFriendAddress ( f - > getFriendID ( ) ) , QClipboard : : Clipboard ) ;
2014-07-02 05:50:07 +08:00
}
}
2014-11-13 07:13:11 +08:00
void Widget : : onGroupInviteReceived ( int32_t friendId , uint8_t type , QByteArray invite )
2014-06-25 04:11:11 +08:00
{
2014-11-11 23:05:01 +08:00
if ( type = = TOX_GROUPCHAT_TYPE_TEXT | | type = = TOX_GROUPCHAT_TYPE_AV )
2014-06-25 04:11:11 +08:00
{
2015-08-31 04:23:05 +08:00
if ( GUI : : askQuestion ( tr ( " Group invite " , " popup title " ) , tr ( " %1 has invited you to a groupchat. Would you like to join? " , " popup text " ) . arg ( Nexus : : getCore ( ) - > getFriendUsername ( friendId ) ) , true , false ) )
{
int groupId = Nexus : : getCore ( ) - > joinGroupchat ( friendId , type , ( uint8_t * ) invite . data ( ) , invite . length ( ) ) ;
if ( groupId < 0 )
{
qWarning ( ) < < " onGroupInviteReceived: Unable to accept group invite " ;
return ;
}
}
2014-11-11 23:05:01 +08:00
}
else
{
2015-05-11 20:54:03 +08:00
qWarning ( ) < < " onGroupInviteReceived: Unknown groupchat type: " < < type ;
2014-06-25 04:11:11 +08:00
return ;
}
}
2014-11-23 23:55:49 +08:00
void Widget : : onGroupMessageReceived ( int groupnumber , int peernumber , const QString & message , bool isAction )
2014-06-25 04:11:11 +08:00
{
Group * g = GroupList : : findGroup ( groupnumber ) ;
if ( ! g )
return ;
2015-05-24 02:58:41 +08:00
ToxId author = Core : : getInstance ( ) - > getGroupPeerToxId ( groupnumber , peernumber ) ;
2015-05-18 04:26:56 +08:00
bool targeted = ! author . isActiveProfile ( ) & & ( message . contains ( nameMention ) | | message . contains ( sanitizedNameMention ) ) ;
2014-12-04 01:47:07 +08:00
if ( targeted & & ! isAction )
2014-11-23 23:22:29 +08:00
g - > getChatForm ( ) - > addAlertMessage ( author , message , QDateTime : : currentDateTime ( ) ) ;
2014-10-20 19:05:45 +08:00
else
2014-11-23 23:55:49 +08:00
g - > getChatForm ( ) - > addMessage ( author , message , isAction , QDateTime : : currentDateTime ( ) , true ) ;
2014-06-28 07:10:02 +08:00
2015-01-21 19:10:41 +08:00
g - > setEventFlag ( static_cast < GenericChatroomWidget * > ( g - > getGroupWidget ( ) ) ! = activeChatroomWidget ) ;
if ( targeted | | Settings : : getInstance ( ) . getGroupAlwaysNotify ( ) )
2015-06-23 02:01:50 +08:00
newGroupMessageAlert ( g - > getGroupId ( ) ) ;
2015-01-21 19:10:41 +08:00
if ( targeted )
g - > setMentionedFlag ( true ) ; // useful for highlighting line or desktop notifications
g - > getGroupWidget ( ) - > updateStatusLight ( ) ;
2015-06-23 02:01:50 +08:00
ContentDialog : : updateGroupStatus ( g - > getGroupId ( ) ) ;
2015-03-26 03:08:46 +08:00
if ( g - > getGroupWidget ( ) - > isActive ( ) )
{
QString windowTitle = g - > getGroupWidget ( ) - > getName ( ) ;
if ( ! g - > getGroupWidget ( ) - > getStatusString ( ) . isNull ( ) )
windowTitle + = " ( " + g - > getGroupWidget ( ) - > getStatusString ( ) + " ) " ;
setWindowTitle ( windowTitle ) ;
}
2014-06-25 04:11:11 +08:00
}
void Widget : : onGroupNamelistChanged ( int groupnumber , int peernumber , uint8_t Change )
{
Group * g = GroupList : : findGroup ( groupnumber ) ;
if ( ! g )
{
2015-05-11 20:54:03 +08:00
qDebug ( ) < < " onGroupNamelistChanged: Group " < < groupnumber < < " not found, creating it " ;
2014-06-25 04:11:11 +08:00
g = createGroup ( groupnumber ) ;
}
2015-02-06 19:28:49 +08:00
QString name = Nexus : : getCore ( ) - > getGroupPeerName ( groupnumber , peernumber ) ;
2014-06-25 04:11:11 +08:00
TOX_CHAT_CHANGE change = static_cast < TOX_CHAT_CHANGE > ( Change ) ;
if ( change = = TOX_CHAT_CHANGE_PEER_ADD )
2014-09-12 00:05:02 +08:00
{
if ( name . isEmpty ( ) )
name = tr ( " <Unknown> " , " Placeholder when we don't know someone's name in a group chat " ) ;
2015-01-03 17:17:53 +08:00
2014-11-23 23:22:29 +08:00
// g->addPeer(peernumber,name);
g - > regeneratePeerList ( ) ;
2015-01-03 03:29:39 +08:00
// g->getChatForm()->addSystemInfoMessage(tr("%1 has joined the chat").arg(name), "white", QDateTime::currentDateTime());
2014-10-20 19:34:17 +08:00
// we can't display these messages until irungentoo fixes peernumbers
// https://github.com/irungentoo/toxcore/issues/1128
2014-09-12 00:05:02 +08:00
}
2014-06-25 04:11:11 +08:00
else if ( change = = TOX_CHAT_CHANGE_PEER_DEL )
2014-10-20 19:34:17 +08:00
{
2014-11-23 23:22:29 +08:00
// g->removePeer(peernumber);
g - > regeneratePeerList ( ) ;
2015-01-03 03:29:39 +08:00
// g->getChatForm()->addSystemInfoMessage(tr("%1 has left the chat").arg(name), "white", QDateTime::currentDateTime());
2014-10-20 19:34:17 +08:00
}
else if ( change = = TOX_CHAT_CHANGE_PEER_NAME ) // core overwrites old name before telling us it changed...
2015-04-24 19:01:50 +08:00
{
2015-02-06 19:28:49 +08:00
g - > updatePeer ( peernumber , Nexus : : getCore ( ) - > getGroupPeerName ( groupnumber , peernumber ) ) ;
2015-04-24 19:01:50 +08:00
}
2014-06-25 04:11:11 +08:00
}
2014-11-06 08:22:50 +08:00
void Widget : : onGroupTitleChanged ( int groupnumber , const QString & author , const QString & title )
{
Group * g = GroupList : : findGroup ( groupnumber ) ;
if ( ! g )
return ;
if ( ! author . isEmpty ( ) )
2015-01-05 01:21:35 +08:00
g - > getChatForm ( ) - > addSystemInfoMessage ( tr ( " %1 has set the title to %2 " ) . arg ( author , title ) , ChatMessage : : INFO , QDateTime : : currentDateTime ( ) ) ;
2015-06-07 11:20:06 +08:00
2015-06-08 02:25:05 +08:00
contactListWidget - > renameGroupWidget ( g - > getGroupWidget ( ) , title ) ;
2015-06-24 02:58:30 +08:00
g - > setName ( title ) ;
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-06-07 11:20:06 +08:00
g - > getGroupWidget ( ) - > searchName ( ui - > searchContactText - > text ( ) , filterGroups ( filter ) ) ;
2014-11-06 08:22:50 +08:00
}
2015-03-13 14:00:12 +08:00
void Widget : : onGroupPeerAudioPlaying ( int groupnumber , int peernumber )
{
Group * g = GroupList : : findGroup ( groupnumber ) ;
if ( ! g )
return ;
g - > getChatForm ( ) - > peerAudioPlaying ( peernumber ) ;
}
2014-11-12 07:00:24 +08:00
void Widget : : removeGroup ( Group * g , bool fake )
2014-06-25 04:11:11 +08:00
{
2014-11-23 23:22:29 +08:00
g - > getGroupWidget ( ) - > setAsInactiveChatroom ( ) ;
if ( static_cast < GenericChatroomWidget * > ( g - > getGroupWidget ( ) ) = = activeChatroomWidget )
2014-10-30 17:44:26 +08:00
{
2014-09-02 00:20:28 +08:00
activeChatroomWidget = nullptr ;
2014-10-30 17:44:26 +08:00
onAddClicked ( ) ;
}
2014-11-23 23:22:29 +08:00
GroupList : : removeGroup ( g - > getGroupId ( ) , fake ) ;
2015-07-01 22:19:15 +08:00
ContentDialog * contentDialog = ContentDialog : : getGroupDialog ( g - > getGroupId ( ) ) ;
if ( contentDialog ! = nullptr )
contentDialog - > removeGroup ( g - > getGroupId ( ) ) ;
2015-02-06 19:28:49 +08:00
Nexus : : getCore ( ) - > removeGroup ( g - > getGroupId ( ) , fake ) ;
2014-06-25 04:11:11 +08:00
delete g ;
2015-07-01 19:49:36 +08:00
if ( contentLayout ! = nullptr & & contentLayout - > mainHead - > layout ( ) - > isEmpty ( ) )
2014-06-25 04:11:11 +08:00
onAddClicked ( ) ;
2014-11-02 16:45:44 +08:00
2015-06-03 18:26:48 +08:00
contactListWidget - > reDraw ( ) ;
2014-06-25 04:11:11 +08:00
}
2014-10-09 16:07:26 +08:00
void Widget : : removeGroup ( int groupId )
{
removeGroup ( GroupList : : findGroup ( groupId ) ) ;
}
2014-06-25 04:11:11 +08:00
Group * Widget : : createGroup ( int groupId )
{
Group * g = GroupList : : findGroup ( groupId ) ;
if ( g )
{
2015-05-11 20:54:03 +08:00
qWarning ( ) < < " createGroup: Group already exists " ;
2014-06-25 04:11:11 +08:00
return g ;
}
2015-04-25 07:50:35 +08:00
Core * core = Nexus : : getCore ( ) ;
2014-06-25 04:11:11 +08:00
QString groupName = QString ( " Groupchat #%1 " ) . arg ( groupId ) ;
2015-04-25 07:50:35 +08:00
Group * newgroup = GroupList : : addGroup ( groupId , groupName , core - > isGroupAvEnabled ( groupId ) ) ;
2015-06-07 11:20:06 +08:00
2015-05-28 01:17:12 +08:00
contactListWidget - > addGroupWidget ( newgroup - > getGroupWidget ( ) ) ;
2014-11-23 23:22:29 +08:00
newgroup - > getGroupWidget ( ) - > updateStatusLight ( ) ;
2015-06-11 00:11:50 +08:00
connect ( settingsWidget , & SettingsWidget : : compactToggled , newgroup - > getGroupWidget ( ) , & GenericChatroomWidget : : compactChange ) ;
2015-06-23 02:01:50 +08:00
connect ( newgroup - > getGroupWidget ( ) , SIGNAL ( chatroomWidgetClicked ( GenericChatroomWidget * , bool ) ) , this , SLOT ( onChatroomWidgetClicked ( GenericChatroomWidget * , bool ) ) ) ;
2014-11-23 23:22:29 +08:00
connect ( newgroup - > getGroupWidget ( ) , SIGNAL ( removeGroup ( int ) ) , this , SLOT ( removeGroup ( int ) ) ) ;
connect ( newgroup - > getGroupWidget ( ) , SIGNAL ( chatroomWidgetClicked ( GenericChatroomWidget * ) ) , newgroup - > getChatForm ( ) , SLOT ( focusInput ( ) ) ) ;
2015-04-20 05:12:44 +08:00
connect ( newgroup - > getChatForm ( ) , & GroupChatForm : : sendMessage , core , & Core : : sendGroupMessage ) ;
connect ( newgroup - > getChatForm ( ) , & GroupChatForm : : sendAction , core , & Core : : sendGroupAction ) ;
2014-11-23 23:22:29 +08:00
connect ( newgroup - > getChatForm ( ) , & GroupChatForm : : groupTitleChanged , core , & Core : : changeGroupTitle ) ;
2015-06-07 11:20:06 +08:00
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-06-07 11:20:06 +08:00
newgroup - > getGroupWidget ( ) - > searchName ( ui - > searchContactText - > text ( ) , filterGroups ( filter ) ) ;
2014-06-25 04:11:11 +08:00
return newgroup ;
}
2014-06-30 05:38:48 +08:00
void Widget : : onEmptyGroupCreated ( int groupId )
{
2015-06-18 23:27:50 +08:00
Group * group = createGroup ( groupId ) ;
// Only rename group if groups are visible.
if ( Widget : : getInstance ( ) - > groupsVisible ( ) )
group - > getGroupWidget ( ) - > editName ( ) ;
2014-06-30 05:38:48 +08:00
}
2014-07-01 03:14:51 +08:00
2014-07-03 06:27:30 +08:00
bool Widget : : event ( QEvent * e )
2014-07-01 10:12:17 +08:00
{
2015-03-21 16:59:28 +08:00
switch ( e - > type ( ) )
2014-12-12 00:49:11 +08:00
{
2014-10-16 17:47:58 +08:00
case QEvent : : WindowActivate :
if ( activeChatroomWidget ! = nullptr )
{
activeChatroomWidget - > resetEventFlags ( ) ;
activeChatroomWidget - > updateStatusLight ( ) ;
2015-03-26 03:08:46 +08:00
QString windowTitle = activeChatroomWidget - > getName ( ) ;
if ( ! activeChatroomWidget - > getStatusString ( ) . isNull ( ) )
windowTitle + = " ( " + activeChatroomWidget - > getStatusString ( ) + " ) " ;
setWindowTitle ( windowTitle ) ;
2014-10-16 17:47:58 +08:00
}
2014-12-12 00:49:11 +08:00
if ( eventFlag )
{
eventFlag = false ;
eventIcon = false ;
2015-03-12 02:04:29 +08:00
updateIcons ( ) ;
2014-12-12 00:49:11 +08:00
}
2014-10-16 17:47:58 +08:00
default :
break ;
2014-07-03 06:27:30 +08:00
}
2014-07-01 10:12:17 +08:00
return QWidget : : event ( e ) ;
}
2014-11-26 20:34:08 +08:00
void Widget : : onUserAwayCheck ( )
2014-11-15 07:43:38 +08:00
{
2014-12-02 08:14:06 +08:00
# ifdef QTOX_PLATFORM_EXT
2014-11-27 02:27:20 +08:00
uint32_t autoAwayTime = Settings : : getInstance ( ) . getAutoAwayTime ( ) * 60 * 1000 ;
2014-11-15 07:43:38 +08:00
2014-12-02 05:28:53 +08:00
if ( ui - > statusButton - > property ( " status " ) . toString ( ) = = " online " )
2014-10-16 17:47:58 +08:00
{
2014-12-02 05:28:53 +08:00
if ( autoAwayTime & & Platform : : getIdleTime ( ) > = autoAwayTime )
2014-11-26 20:34:08 +08:00
{
2015-05-11 20:54:03 +08:00
qDebug ( ) < < " auto away activated at " < < QTime : : currentTime ( ) . toString ( ) ;
2014-12-02 05:28:53 +08:00
emit statusSet ( Status : : Away ) ;
autoAwayActive = true ;
2014-11-26 20:34:08 +08:00
}
}
2014-12-02 05:28:53 +08:00
else if ( ui - > statusButton - > property ( " status " ) . toString ( ) = = " away " )
2014-10-16 17:47:58 +08:00
{
2014-12-02 05:28:53 +08:00
if ( autoAwayActive & & ( ! autoAwayTime | | Platform : : getIdleTime ( ) < autoAwayTime ) )
2014-11-26 20:34:08 +08:00
{
2015-05-11 20:54:03 +08:00
qDebug ( ) < < " auto away deactivated at " < < QTime : : currentTime ( ) . toString ( ) ;
2014-12-02 05:28:53 +08:00
emit statusSet ( Status : : Online ) ;
autoAwayActive = false ;
2014-11-26 20:34:08 +08:00
}
2014-10-16 17:47:58 +08:00
}
2014-12-02 05:28:53 +08:00
else if ( autoAwayActive )
2015-04-24 19:01:50 +08:00
{
2014-11-26 20:34:08 +08:00
autoAwayActive = false ;
2015-04-24 19:01:50 +08:00
}
2014-12-02 08:14:06 +08:00
# endif
2014-10-16 17:47:58 +08:00
}
2014-12-12 00:49:11 +08:00
void Widget : : onEventIconTick ( )
{
if ( eventFlag )
{
eventIcon ^ = true ;
2015-03-12 02:04:29 +08:00
updateIcons ( ) ;
2014-12-12 00:49:11 +08:00
}
}
2015-02-20 18:56:20 +08:00
void Widget : : onTryCreateTrayIcon ( )
{
static int32_t tries = 15 ;
if ( ! icon & & tries - - )
{
if ( QSystemTrayIcon : : isSystemTrayAvailable ( ) )
{
icon = new SystemTrayIcon ;
2015-03-12 02:04:29 +08:00
updateIcons ( ) ;
2015-02-20 18:56:20 +08:00
trayMenu = new QMenu ;
actionQuit = new QAction ( tr ( " &Quit " ) , this ) ;
connect ( actionQuit , SIGNAL ( triggered ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
trayMenu - > addAction ( statusOnline ) ;
trayMenu - > addAction ( statusAway ) ;
trayMenu - > addAction ( statusBusy ) ;
trayMenu - > addSeparator ( ) ;
trayMenu - > addAction ( actionQuit ) ;
icon - > setContextMenu ( trayMenu ) ;
connect ( icon , SIGNAL ( activated ( QSystemTrayIcon : : ActivationReason ) ) ,
this , SLOT ( onIconClick ( QSystemTrayIcon : : ActivationReason ) ) ) ;
if ( Settings : : getInstance ( ) . getShowSystemTray ( ) )
{
icon - > show ( ) ;
setHidden ( Settings : : getInstance ( ) . getAutostartInTray ( ) ) ;
}
else
2015-04-24 19:01:50 +08:00
{
2015-02-20 18:56:20 +08:00
show ( ) ;
2015-04-24 19:01:50 +08:00
}
2015-07-09 20:43:19 +08:00
# ifdef Q_OS_MAC
QMenu * changeStatusMenu = new QMenu ( tr ( " Status " ) , this ) ;
changeStatusMenu - > addAction ( statusOnline ) ;
statusOnline - > setIconVisibleInMenu ( true ) ;
changeStatusMenu - > addSeparator ( ) ;
changeStatusMenu - > addAction ( statusAway ) ;
changeStatusMenu - > addAction ( statusBusy ) ;
QMenu * dockMenu = new QMenu ( this ) ;
dockMenu - > addAction ( changeStatusMenu - > menuAction ( ) ) ;
qt_mac_set_dock_menu ( dockMenu ) ;
# endif
2015-02-20 18:56:20 +08:00
}
else if ( ! isVisible ( ) )
2015-04-24 19:01:50 +08:00
{
2015-02-20 18:56:20 +08:00
show ( ) ;
2015-04-24 19:01:50 +08:00
}
2015-02-20 18:56:20 +08:00
}
else
{
disconnect ( timer , & QTimer : : timeout , this , & Widget : : onTryCreateTrayIcon ) ;
if ( ! icon )
{
2015-05-11 20:54:03 +08:00
qWarning ( ) < < " No system tray detected! " ;
2015-02-20 18:56:20 +08:00
show ( ) ;
}
}
}
2014-07-06 04:54:27 +08:00
void Widget : : setStatusOnline ( )
{
2015-05-12 05:01:25 +08:00
if ( ! ui - > statusButton - > isEnabled ( ) )
return ;
2015-02-06 19:28:49 +08:00
Nexus : : getCore ( ) - > setStatus ( Status : : Online ) ;
2014-07-06 04:54:27 +08:00
}
void Widget : : setStatusAway ( )
{
2015-05-12 05:01:25 +08:00
if ( ! ui - > statusButton - > isEnabled ( ) )
return ;
2015-02-06 19:28:49 +08:00
Nexus : : getCore ( ) - > setStatus ( Status : : Away ) ;
2014-07-06 04:54:27 +08:00
}
void Widget : : setStatusBusy ( )
2014-07-04 01:33:08 +08:00
{
2015-05-12 05:01:25 +08:00
if ( ! ui - > statusButton - > isEnabled ( ) )
return ;
2015-02-06 19:28:49 +08:00
Nexus : : getCore ( ) - > setStatus ( Status : : Busy ) ;
2014-07-04 01:33:08 +08:00
}
2014-07-21 02:17:06 +08:00
2015-04-20 05:12:44 +08:00
void Widget : : onMessageSendResult ( uint32_t friendId , const QString & message , int messageId )
2014-09-24 00:35:06 +08:00
{
Q_UNUSED ( message )
2014-11-10 19:30:56 +08:00
Q_UNUSED ( messageId )
2014-09-24 00:35:06 +08:00
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( ! f )
return ;
}
void Widget : : onGroupSendResult ( int groupId , const QString & message , int result )
{
Q_UNUSED ( message )
Group * g = GroupList : : findGroup ( groupId ) ;
if ( ! g )
return ;
if ( result = = - 1 )
2015-01-05 01:21:35 +08:00
g - > getChatForm ( ) - > addSystemInfoMessage ( tr ( " Message failed to send " ) , ChatMessage : : INFO , QDateTime : : currentDateTime ( ) ) ;
2014-09-24 00:35:06 +08:00
}
2014-10-16 00:18:32 +08:00
2015-01-04 19:20:36 +08:00
void Widget : : onFriendTypingChanged ( int friendId , bool isTyping )
{
Friend * f = FriendList : : findFriend ( friendId ) ;
if ( ! f )
return ;
2015-04-24 19:01:50 +08:00
2015-01-04 19:20:36 +08:00
f - > getChatForm ( ) - > setFriendTyping ( isTyping ) ;
}
2015-02-20 18:56:20 +08:00
void Widget : : onSetShowSystemTray ( bool newValue )
{
if ( icon )
icon - > setVisible ( newValue ) ;
2014-11-14 04:33:11 +08:00
}
2014-11-28 06:35:56 +08:00
void Widget : : saveWindowGeometry ( )
{
Settings : : getInstance ( ) . setWindowGeometry ( saveGeometry ( ) ) ;
Settings : : getInstance ( ) . setWindowState ( saveState ( ) ) ;
}
void Widget : : saveSplitterGeometry ( )
{
Settings : : getInstance ( ) . setSplitterState ( ui - > mainSplitter - > saveState ( ) ) ;
}
2014-11-28 17:16:37 +08:00
void Widget : : onSplitterMoved ( int pos , int index )
{
Q_UNUSED ( pos ) ;
Q_UNUSED ( index ) ;
saveSplitterGeometry ( ) ;
}
2014-11-14 04:33:11 +08:00
2015-06-07 11:20:06 +08:00
void Widget : : cycleContacts ( bool forward )
2015-03-22 15:59:42 +08:00
{
2015-06-07 11:20:06 +08:00
contactListWidget - > cycleContacts ( activeChatroomWidget , forward ) ;
}
2015-03-22 15:59:42 +08:00
2015-06-07 11:20:06 +08:00
bool Widget : : filterGroups ( int index )
{
switch ( index )
{
case FilterCriteria : : Offline :
case FilterCriteria : : Friends :
return true ;
default :
return false ;
}
}
2015-03-22 15:59:42 +08:00
2015-06-07 11:20:06 +08:00
bool Widget : : filterOffline ( int index )
{
switch ( index )
{
case FilterCriteria : : Online :
case FilterCriteria : : Groups :
return true ;
default :
return false ;
}
}
2015-03-22 15:59:42 +08:00
2015-06-07 11:20:06 +08:00
bool Widget : : filterOnline ( int index )
{
switch ( index )
{
case FilterCriteria : : Offline :
case FilterCriteria : : Groups :
return true ;
default :
return false ;
}
2015-03-22 15:59:42 +08:00
}
2015-02-13 13:27:49 +08:00
void Widget : : processOfflineMsgs ( )
{
if ( OfflineMsgEngine : : globalMutex . tryLock ( ) )
{
QList < Friend * > frnds = FriendList : : getAllFriends ( ) ;
for ( Friend * f : frnds )
f - > getChatForm ( ) - > getOfflineMsgEngine ( ) - > deliverOfflineMsgs ( ) ;
OfflineMsgEngine : : globalMutex . unlock ( ) ;
}
}
2014-11-10 21:06:35 +08:00
void Widget : : clearAllReceipts ( )
{
QList < Friend * > frnds = FriendList : : getAllFriends ( ) ;
for ( Friend * f : frnds )
2015-02-08 00:18:25 +08:00
f - > getChatForm ( ) - > getOfflineMsgEngine ( ) - > removeAllReciepts ( ) ;
2014-11-15 03:12:23 +08:00
}
2014-11-16 04:30:20 +08:00
void Widget : : reloadTheme ( )
{
2015-02-07 19:46:55 +08:00
QString statusPanelStyle = Style : : getStylesheet ( " :/ui/window/statusPanel.css " ) ;
2015-04-01 16:01:25 +08:00
ui - > tooliconsZone - > setStyleSheet ( Style : : resolve ( " QPushButton{background-color:@themeDark;border:none;}QPushButton:hover{background-color:@themeMediumDark;border:none;}QPushButton:checked{background-color:@themeMedium;border:none;}QPushButton:pressed{background-color:@themeMediumLight;border:none;} " ) ) ;
2015-02-07 19:46:55 +08:00
ui - > statusPanel - > setStyleSheet ( statusPanelStyle ) ;
ui - > statusHead - > setStyleSheet ( statusPanelStyle ) ;
2014-11-16 04:30:20 +08:00
ui - > friendList - > setStyleSheet ( Style : : getStylesheet ( " :ui/friendList/friendList.css " ) ) ;
ui - > statusButton - > setStyleSheet ( Style : : getStylesheet ( " :ui/statusButton/statusButton.css " ) ) ;
2015-06-25 23:55:06 +08:00
contactListWidget - > reDraw ( ) ;
2014-11-16 04:30:20 +08:00
for ( Friend * f : FriendList : : getAllFriends ( ) )
f - > getFriendWidget ( ) - > reloadTheme ( ) ;
2014-11-20 17:13:13 +08:00
for ( Group * g : GroupList : : getAllGroups ( ) )
2014-11-23 23:22:29 +08:00
g - > getGroupWidget ( ) - > reloadTheme ( ) ;
2014-11-16 04:30:20 +08:00
}
2015-02-28 01:56:47 +08:00
void Widget : : nextContact ( )
{
2015-06-18 03:45:03 +08:00
cycleContacts ( true ) ;
2015-02-28 01:56:47 +08:00
}
void Widget : : previousContact ( )
{
2015-06-18 03:45:03 +08:00
cycleContacts ( false ) ;
2015-02-28 01:56:47 +08:00
}
2015-02-12 20:18:04 +08:00
QString Widget : : getStatusIconPath ( Status status )
{
switch ( status )
{
case Status : : Online :
return " :img/status/dot_online.svg " ;
case Status : : Away :
return " :img/status/dot_away.svg " ;
case Status : : Busy :
return " :img/status/dot_busy.svg " ;
case Status : : Offline :
default :
return " :img/status/dot_offline.svg " ;
}
}
inline QIcon Widget : : getStatusIcon ( Status status , uint32_t w /*=0*/ , uint32_t h /*=0*/ )
{
if ( w > 0 & & h > 0 )
return getStatusIconPixmap ( status , w , h ) ;
else
return QIcon ( getStatusIconPath ( status ) ) ;
}
QPixmap Widget : : getStatusIconPixmap ( Status status , uint32_t w , uint32_t h )
{
QPixmap pix ( w , h ) ;
pix . load ( getStatusIconPath ( status ) ) ;
return pix ;
}
QString Widget : : getStatusTitle ( Status status )
{
switch ( status )
{
case Status : : Online :
return " online " ;
case Status : : Away :
return " away " ;
case Status : : Busy :
return " busy " ;
case Status : : Offline :
default :
return " offline " ;
}
}
Status Widget : : getStatusFromString ( QString status )
{
if ( status = = " online " )
return Status : : Online ;
else if ( status = = " busy " )
return Status : : Busy ;
else if ( status = = " away " )
return Status : : Away ;
else
return Status : : Offline ;
}
2015-04-01 16:01:25 +08:00
2015-04-09 00:18:07 +08:00
void Widget : : searchContacts ( )
{
QString searchString = ui - > searchContactText - > text ( ) ;
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-04-09 00:18:07 +08:00
2015-06-07 11:20:06 +08:00
contactListWidget - > searchChatrooms ( searchString , filterOnline ( filter ) , filterOffline ( filter ) , filterGroups ( filter ) ) ;
2015-06-13 00:09:01 +08:00
updateFilterText ( ) ;
2015-06-07 11:20:06 +08:00
contactListWidget - > reDraw ( ) ;
}
2015-06-13 00:09:01 +08:00
void Widget : : changeDisplayMode ( )
{
2015-06-19 02:55:46 +08:00
filterDisplayGroup - > setEnabled ( false ) ;
2015-06-13 00:09:01 +08:00
if ( filterDisplayGroup - > checkedAction ( ) = = filterDisplayActivity )
contactListWidget - > setMode ( FriendListWidget : : Activity ) ;
else if ( filterDisplayGroup - > checkedAction ( ) = = filterDisplayName )
contactListWidget - > setMode ( FriendListWidget : : Name ) ;
2015-06-18 23:27:50 +08:00
searchContacts ( ) ;
2015-06-19 02:55:46 +08:00
filterDisplayGroup - > setEnabled ( true ) ;
updateFilterText ( ) ;
2015-06-13 00:09:01 +08:00
}
void Widget : : updateFilterText ( )
{
ui - > searchContactFilterBox - > setText ( filterDisplayGroup - > checkedAction ( ) - > text ( ) + QStringLiteral ( " | " ) + filterGroup - > checkedAction ( ) - > text ( ) ) ;
}
int Widget : : getFilterCriteria ( ) const
{
QAction * checked = filterGroup - > checkedAction ( ) ;
if ( checked = = filterOnlineAction )
return Online ;
else if ( checked = = filterOfflineAction )
return Offline ;
else if ( checked = = filterFriendsAction )
return Friends ;
else if ( checked = = filterGroupsAction )
return Groups ;
return All ;
}
2015-06-07 11:20:06 +08:00
void Widget : : searchCircle ( CircleWidget * circleWidget )
{
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-06-07 11:20:06 +08:00
circleWidget - > search ( ui - > searchContactText - > text ( ) , true , filterOnline ( filter ) , filterOffline ( filter ) ) ;
}
void Widget : : searchItem ( GenericChatItemWidget * chatItem , GenericChatItemWidget : : ItemType type )
{
bool hide ;
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-06-07 11:20:06 +08:00
switch ( type )
2015-04-09 00:18:07 +08:00
{
2015-06-07 11:20:06 +08:00
case GenericChatItemWidget : : GroupItem :
hide = filterGroups ( filter ) ;
2015-04-09 00:18:07 +08:00
break ;
default :
2015-06-07 11:20:06 +08:00
hide = true ;
2015-04-09 00:18:07 +08:00
}
2015-06-07 11:20:06 +08:00
chatItem - > searchName ( ui - > searchContactText - > text ( ) , hide ) ;
}
bool Widget : : groupsVisible ( ) const
{
2015-06-13 00:09:01 +08:00
int filter = getFilterCriteria ( ) ;
2015-06-07 11:20:06 +08:00
return ! filterGroups ( filter ) ;
2015-04-09 00:18:07 +08:00
}
2015-05-28 01:17:12 +08:00
void Widget : : friendListContextMenu ( const QPoint & pos )
2015-04-09 00:18:07 +08:00
{
2015-05-28 01:17:12 +08:00
QMenu menu ( this ) ;
QAction * addCircleAction = menu . addAction ( tr ( " Add new circle... " ) ) ;
QAction * chosenAction = menu . exec ( ui - > friendList - > mapToGlobal ( pos ) ) ;
2015-04-09 00:18:07 +08:00
2015-05-28 01:17:12 +08:00
if ( chosenAction = = addCircleAction )
2015-06-02 04:17:39 +08:00
contactListWidget - > addCircleWidget ( ) ;
2015-04-09 00:18:07 +08:00
}
2015-04-01 16:01:25 +08:00
void Widget : : setActiveToolMenuButton ( ActiveToolMenuButton newActiveButton )
{
ui - > addButton - > setChecked ( newActiveButton = = Widget : : AddButton ) ;
ui - > addButton - > setDisabled ( newActiveButton = = Widget : : AddButton ) ;
ui - > groupButton - > setChecked ( newActiveButton = = Widget : : GroupButton ) ;
ui - > groupButton - > setDisabled ( newActiveButton = = Widget : : GroupButton ) ;
ui - > transferButton - > setChecked ( newActiveButton = = Widget : : TransferButton ) ;
ui - > transferButton - > setDisabled ( newActiveButton = = Widget : : TransferButton ) ;
ui - > settingsButton - > setChecked ( newActiveButton = = Widget : : SettingButton ) ;
ui - > settingsButton - > setDisabled ( newActiveButton = = Widget : : SettingButton ) ;
}
2015-06-06 03:37:01 +08:00
void Widget : : retranslateUi ( )
{
QString name = ui - > nameLabel - > text ( ) , status = ui - > statusLabel - > text ( ) ;
ui - > retranslateUi ( this ) ;
ui - > nameLabel - > setText ( name ) ;
ui - > statusLabel - > setText ( status ) ;
2015-06-13 00:09:01 +08:00
filterDisplayName - > setText ( tr ( " By Name " ) ) ;
filterDisplayActivity - > setText ( tr ( " By Activity " ) ) ;
filterAllAction - > setText ( tr ( " All " ) ) ;
filterOnlineAction - > setText ( tr ( " Online " ) ) ;
filterOfflineAction - > setText ( tr ( " Offline " ) ) ;
filterFriendsAction - > setText ( tr ( " Friends " ) ) ;
filterGroupsAction - > setText ( tr ( " Groups " ) ) ;
ui - > searchContactText - > setPlaceholderText ( tr ( " Search Contacts " ) ) ;
updateFilterText ( ) ;
2015-06-06 03:37:01 +08:00
ui - > searchContactText - > setPlaceholderText ( tr ( " Search Contacts " ) ) ;
statusOnline - > setText ( tr ( " Online " , " Button to set your status to 'Online' " ) ) ;
statusAway - > setText ( tr ( " Away " , " Button to set your status to 'Away' " ) ) ;
statusBusy - > setText ( tr ( " Busy " , " Button to set your status to 'Busy' " ) ) ;
2015-06-19 22:58:48 +08:00
//setWindowTitle(tr("Settings"));
2015-06-06 03:37:01 +08:00
}
2015-07-02 01:12:50 +08:00
# ifdef Q_OS_MAC
void Widget : : bringAllToFront ( )
{
QWindowList windowList = QApplication : : topLevelWindows ( ) ;
for ( QWindow * window : windowList )
{
window - > raise ( ) ;
window - > showNormal ( ) ;
window - > requestActivate ( ) ;
}
}
void Widget : : toggleFullscreen ( )
{
QWidget * window = QApplication : : activeWindow ( ) ;
if ( window - > isFullScreen ( ) )
{
window - > showNormal ( ) ;
fullscreenAction - > setText ( tr ( " Enter Fullscreen " ) ) ;
}
else
{
window - > showFullScreen ( ) ;
fullscreenAction - > setText ( tr ( " Exit Fullscreen " ) ) ;
}
}
# endif