This commit is contained in:
csoler 2025-09-16 14:29:58 +00:00 committed by GitHub
commit 966f374a6c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
70 changed files with 1288 additions and 942 deletions

@ -1 +1 @@
Subproject commit da6b849a41f3cf6e60f6f76e1f3c4463876a8741
Subproject commit fdd0d9f4f1522c2536548025587eca08430d5d63

View file

@ -35,6 +35,7 @@
#include "settings/rsharesettings.h"
#include "util/HandleRichText.h"
#include "util/misc.h"
#include "util/qtthreadsutils.h"
#include "util/RsQtVersion.h"
#include "retroshare/rsmsgs.h"
@ -105,9 +106,41 @@ ChatLobbyWidget::ChatLobbyWidget(QWidget *parent, Qt::WindowFlags flags)
myInviteYesButton = NULL;
myInviteIdChooser = NULL;
QObject::connect( NotifyQt::getInstance(), SIGNAL(lobbyListChanged()), SLOT(lobbyChanged()));
QObject::connect( NotifyQt::getInstance(), SIGNAL(chatLobbyEvent(qulonglong,int,RsGxsId,QString)), this, SLOT(displayChatLobbyEvent(qulonglong,int,RsGxsId,QString)));
QObject::connect( NotifyQt::getInstance(), SIGNAL(chatLobbyInviteReceived()), this, SLOT(readChatLobbyInvites()));
//QObject::connect( NotifyQt::getInstance(), SIGNAL(lobbyListChanged()), SLOT(lobbyChanged()));
//QObject::connect( NotifyQt::getInstance(), SIGNAL(chatLobbyEvent(qulonglong,int,RsGxsId,QString)), this, SLOT(displayChatLobbyEvent(qulonglong,int,RsGxsId,QString)));
//QObject::connect( NotifyQt::getInstance(), SIGNAL(chatLobbyInviteReceived()), this, SLOT(readChatLobbyInvites()));
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event)
{
RsQThreadUtils::postToObject([=](){
auto ev = dynamic_cast<const RsChatLobbyEvent *>(event.get());
if(!ev) return;
switch(ev->mEventCode)
{
case RsChatLobbyEventCode::CHAT_LOBBY_INVITE_RECEIVED:
readChatLobbyInvites();
break;
case RsChatLobbyEventCode::CHAT_LOBBY_LIST_CHANGED:
lobbyChanged();
break;
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_LEFT:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_STATUS:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_JOINED:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_CHANGE_NICKNAME:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_KEEP_ALIVE:
handleChatLobbyEvent(ev->mLobbyId,ev->mEventCode,ev->mGxsId,QString::fromUtf8(ev->mStr.c_str()));
break;
default:
break;
}
}, this );
}, mEventHandlerId, RsEventType::CHAT_SERVICE );
QObject::connect( ui.lobbyTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(lobbyTreeWidgetCustomPopupMenu(QPoint)));
QObject::connect( ui.lobbyTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(itemDoubleClicked(QTreeWidgetItem*,int)));
@ -236,6 +269,7 @@ ChatLobbyWidget::ChatLobbyWidget(QWidget *parent, Qt::WindowFlags flags)
ChatLobbyWidget::~ChatLobbyWidget()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
// save settings
processSettings(false);
@ -1158,10 +1192,10 @@ void ChatLobbyWidget::itemDoubleClicked(QTreeWidgetItem *item, int /*column*/)
subscribeChatLobbyAtItem(item);
}
void ChatLobbyWidget::displayChatLobbyEvent(qulonglong lobby_id, int event_type, const RsGxsId &gxs_id, const QString& str)
void ChatLobbyWidget::handleChatLobbyEvent(uint64_t lobby_id, RsChatLobbyEventCode event_type, const RsGxsId &gxs_id, const QString& str)
{
if (ChatLobbyDialog *cld = dynamic_cast<ChatLobbyDialog*>(ChatDialog::getExistingChat(ChatId(lobby_id)))) {
cld->displayLobbyEvent(event_type, gxs_id, str);
cld->handleLobbyEvent(event_type, gxs_id, str);
}
}

View file

@ -89,8 +89,8 @@ protected slots:
void unsubscribeItem();
void itemDoubleClicked(QTreeWidgetItem *item, int column);
void updateCurrentLobby() ;
void displayChatLobbyEvent(qulonglong lobby_id, int event_type, const RsGxsId& gxs_id, const QString& str);
void readChatLobbyInvites();
void handleChatLobbyEvent(uint64_t lobby_id, RsChatLobbyEventCode event_type, const RsGxsId &gxs_id, const QString& str);
void readChatLobbyInvites();
void showLobby(QTreeWidgetItem *lobby_item) ;
void showBlankPage(ChatLobbyId id, bool subscribed = false) ;
void unsubscribeChatLobby(ChatLobbyId id) ;
@ -151,5 +151,7 @@ private:
/* UI - from Designer */
Ui::ChatLobbyWidget ui;
RsEventsHandlerId_t mEventHandlerId;
};

View file

@ -22,7 +22,6 @@
#include "rshare.h"
#include "gui/MainWindow.h"
#include "gui/notifyqt.h"
#include "gui/RemoteDirModel.h"
#include "gui/RetroShareLink.h"
#include "gui/ShareManager.h"
@ -35,6 +34,7 @@
#include "gui/settings/rsharesettings.h"
#include "util/RsQtVersion.h"
#include "util/RsAction.h"
#include "util/qtthreadsutils.h"
#include "util/misc.h"
#include "util/rstime.h"
#include "util/rsdir.h"
@ -166,6 +166,7 @@ public:
SharedFilesDialog::~SharedFilesDialog()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
delete tree_model;
delete flat_model;
delete tree_proxyModel;
@ -177,9 +178,36 @@ SharedFilesDialog::SharedFilesDialog(bool remote_mode, QWidget *parent)
/* Invoke the Qt Designer generated object setup routine */
ui.setupUi(this);
NotifyQt *notify = NotifyQt::getInstance();
connect(notify, SIGNAL(filesPreModChanged(bool)), this, SLOT(preModDirectories(bool)));
connect(notify, SIGNAL(filesPostModChanged(bool)), this, SLOT(postModDirectories(bool)));
//connect(notify, SIGNAL(filesPreModChanged(bool)), this, SLOT(preModDirectories(bool)));
//connect(notify, SIGNAL(filesPostModChanged(bool)), this, SLOT(postModDirectories(bool)));
mEventHandlerId = 0;
rsEvents->registerEventsHandler([this](std::shared_ptr<const RsEvent> event)
{
RsQThreadUtils::postToObject([=](){
auto e = dynamic_cast<const RsSharedDirectoriesEvent*>(event.get());
switch(e->mEventCode)
{
case RsSharedDirectoriesEventCode::OWN_DIR_LIST_PROCESSING:
preModDirectories(true);
break;
case RsSharedDirectoriesEventCode::OWN_DIR_LIST_UPDATED:
postModDirectories(true);
break;
case RsSharedDirectoriesEventCode::FRIEND_DIR_LIST_UPDATED:
preModDirectories(false);
postModDirectories(false);
break;
default:
break;
};}, this);
}, mEventHandlerId,RsEventType::SHARED_DIRECTORIES);
connect(ui.viewType_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(changeCurrentViewModel(int)));
connect(ui.dirTreeView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT( spawnCustomPopupMenu( QPoint ) ) );
@ -739,7 +767,6 @@ void SharedFilesDialog::collCreate()
model->getDirDetailsFromSelect(lst, dirVec);
auto RemoteMode = isRemote();
FileSearchFlags f = RemoteMode?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL ;
QString dir_name;

View file

@ -21,6 +21,7 @@
#ifndef _SHAREDFILESDIALOG_H
#define _SHAREDFILESDIALOG_H
#include <retroshare/rsevents.h>
#include "ui_SharedFilesDialog.h"
#include <retroshare-gui/RsAutoUpdatePage.h>
@ -145,6 +146,8 @@ protected:
QString lastFilterString;
QString mLastFilterText ;
RsProtectedTimer* mFilterTimer;
RsEventsHandlerId_t mEventHandlerId ;
};
class LocalSharedFilesDialog : public SharedFilesDialog

View file

@ -1115,16 +1115,6 @@ void TransfersDialog::handleEvent_main_thread(std::shared_ptr<const RsEvent> eve
switch (fe->mFileTransferEventCode)
{
case RsFileTransferEventCode::DOWNLOAD_COMPLETE:
{
FileInfo nfo ;
if(!rsFiles->FileDetails(fe->mHash, RS_FILE_HINTS_DOWNLOAD, nfo))
break;
SoundManager::play(SOUND_DOWNLOAD_COMPLETE);
NotifyQt::getInstance()->addToaster(RS_POPUP_DOWNLOAD, fe->mHash.toStdString(), nfo.fname.c_str(),"");
}
[[fallthrough]];
case RsFileTransferEventCode::COMPLETED_FILES_REMOVED:
getUserNotify()->updateIcon();

View file

@ -118,7 +118,7 @@ FriendServerControl::FriendServerControl(QWidget *parent)
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event)
{
RsQThreadUtils::postToObject([=](){ handleEvent_main_thread(event); }, this );
}, mEventHandlerId_peer, RsEventType::PEER_CONNECTION );
}, mEventHandlerId_peer, RsEventType::FRIEND_LIST );
}
void FriendServerControl::onAutoAddFriends(bool b)
@ -145,14 +145,14 @@ void FriendServerControl::handleEvent_main_thread(std::shared_ptr<const RsEvent>
}
{
const RsConnectionEvent *pe = dynamic_cast<const RsConnectionEvent*>(event.get());
const RsFriendListEvent *pe = dynamic_cast<const RsFriendListEvent*>(event.get());
if(pe)
switch(pe->mConnectionInfoCode)
switch(pe->mEventCode)
{
case RsConnectionEventCode::PEER_ADDED:
case RsConnectionEventCode::PEER_REMOVED:
case RsConnectionEventCode::PEER_CONNECTED: updateContactsStatus();
case RsFriendListEventCode::NODE_ADDED:
case RsFriendListEventCode::NODE_REMOVED:
case RsFriendListEventCode::NODE_CONNECTED: updateContactsStatus();
break;
default: ;
@ -169,7 +169,7 @@ FriendServerControl::~FriendServerControl()
rsEvents->unregisterEventsHandler(mEventHandlerId_peer);
}
void FriendServerControl::launchStatusContextMenu(QPoint p)
void FriendServerControl::launchStatusContextMenu(QPoint /* p */)
{
RsPeerId peer_id = getCurrentPeer();

View file

@ -40,6 +40,7 @@
#include "RetroShareLink.h"
#include "settings/rsharesettings.h"
#include "util/misc.h"
#include "util/qtthreadsutils.h"
#include "util/DateTime.h"
#include "FriendsDialog.h"
#include "NetworkView.h"
@ -77,12 +78,52 @@ FriendsDialog::FriendsDialog(QWidget *parent) : MainPage(parent)
ui.chatWidget->setWelcomeMessage(msg);
ui.chatWidget->init(ChatId::makeBroadcastId(), tr("Broadcast"));
connect(NotifyQt::getInstance(), SIGNAL(chatMessageReceived(ChatMessage)), this, SLOT(chatMessageReceived(ChatMessage)));
connect(NotifyQt::getInstance(), SIGNAL(chatStatusChanged(ChatId,QString)), this, SLOT(chatStatusReceived(ChatId,QString)));
//connect(NotifyQt::getInstance(), SIGNAL(chatMessageReceived(ChatMessage)), this, SLOT(chatMessageReceived(ChatMessage)));
//connect(NotifyQt::getInstance(), SIGNAL(chatStatusChanged(ChatId,QString)), this, SLOT(chatStatusReceived(ChatId,QString)));
mEventHandlerId_chat = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsChatServiceEvent*>(e.get()); if(!fe) return;
switch(fe->mEventCode)
{
case RsChatServiceEventCode::CHAT_MESSAGE_RECEIVED: chatMessageReceived(fe->mMsg); break;
case RsChatServiceEventCode::CHAT_STATUS_CHANGED: chatStatusReceived(fe->mCid,QString::fromUtf8(fe->mStr.c_str())); break;
default:
break;
}
}
, this );
}, mEventHandlerId_chat, RsEventType::CHAT_SERVICE );
#else // def RS_DIRECT_CHAT
ui.tabWidget->removeTab(ui.tabWidget->indexOf(ui.groupChatTab));
ui.tabWidget->removeTab(ui.tabWidget->indexOf(ui.groupChatTab));
#endif // def RS_DIRECT_CHAT
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get()); if(!fe) return;
switch(fe->mEventCode)
{
case RsFriendListEventCode::OWN_STATUS_CHANGED: loadmypersonalstatus();
break;
default: // OWN_AVATAR_CHANGED is handled in AvatarWidget
break;
}
}
, this );
}, mEventHandlerId_friends, RsEventType::FRIEND_LIST );
mEventHandlerId_friends = 0;
connect( ui.mypersonalstatusLabel, SIGNAL(clicked()), SLOT(statusmessage()));
connect( ui.actionSet_your_Avatar, SIGNAL(triggered()), this, SLOT(getAvatar()));
@ -153,6 +194,8 @@ FriendsDialog::~FriendsDialog ()
if (this == instance) {
instance = NULL;
}
rsEvents->unregisterEventsHandler(mEventHandlerId_friends);
rsEvents->unregisterEventsHandler(mEventHandlerId_chat);
}
void FriendsDialog::activatePage(FriendsDialog::Page page)
@ -200,7 +243,17 @@ void FriendsDialog::processSettings(bool bLoad)
void FriendsDialog::chatMessageReceived(const ChatMessage &msg)
{
if(msg.chat_id.isBroadcast())
if(!msg.chat_id.isBroadcast())
return;
QDateTime sendTime = QDateTime::fromTime_t(msg.sendTime);
QDateTime recvTime = QDateTime::fromTime_t(msg.recvTime);
QString message = QString::fromUtf8(msg.msg.c_str());
QString name = QString::fromUtf8(rsPeers->getPeerName(msg.broadcast_peer_id).c_str());
ui.chatWidget->addChatMsg(msg.incoming, name, sendTime, recvTime, message, ChatWidget::MSGTYPE_NORMAL);
if(ui.chatWidget->isActive())
{
QDateTime sendTime = DateTime::DateTimeFromTime_t(msg.sendTime);
QDateTime recvTime = DateTime::DateTimeFromTime_t(msg.recvTime);
@ -220,11 +273,11 @@ void FriendsDialog::chatMessageReceived(const ChatMessage &msg)
void FriendsDialog::chatStatusReceived(const ChatId &chat_id, const QString &status_string)
{
if(chat_id.isBroadcast())
{
QString name = QString::fromUtf8(rsPeers->getPeerName(chat_id.broadcast_status_peer_id).c_str());
ui.chatWidget->updateStatusString(name + " %1", status_string);
}
if(!chat_id.isBroadcast())
return;
QString name = QString::fromUtf8(rsPeers->getPeerName(chat_id.broadcast_status_peer_id).c_str());
ui.chatWidget->updateStatusString(name + " %1", status_string);
}
void FriendsDialog::addFriend()

View file

@ -70,9 +70,6 @@ public:
IdDialog *idDialog;
private slots:
void chatMessageReceived(const ChatMessage& msg);
void chatStatusReceived(const ChatId& chat_id, const QString& status_string);
void addFriend();
void statusmessage();
@ -89,10 +86,17 @@ signals:
void notifyGroupChat(const QString&,const QString&) ;
private:
void chatMessageReceived(const ChatMessage& msg);
void chatStatusReceived(const ChatId& chat_id, const QString& status_string);
void processSettings(bool bLoad);
/** Qt Designer generated object */
Ui::FriendsDialog ui;
RsEventsHandlerId_t mEventHandlerId_friends ;
#ifdef RS_DIRECT_CHAT
RsEventsHandlerId_t mEventHandlerId_chat ;
#endif
};
#endif

View file

@ -168,7 +168,7 @@ public:
/* Color definitions (for standard see default.qss) */
QColor mTextColorGroup;
QColor mTextColorStatus[RS_STATUS_COUNT];
QColor mTextColorStatus[(int)RsStatusValue::RS_STATUS_COUNT];
void setIdentities(const std::list<RsGroupMetaData>& identities_meta);

View file

@ -31,9 +31,11 @@
#include <QMenuBar>
#include <QActionGroup>
#include <retroshare/rsplugin.h>
#include <retroshare/rsconfig.h>
#include <util/argstream.h>
#include "retroshare/rsplugin.h"
#include "retroshare/rsconfig.h"
#include "retroshare/rsevents.h"
#include "util/argstream.h"
#include "util/qtthreadsutils.h"
#if defined(Q_OS_DARWIN)
#include "gui/common/MacDockIconHandler.h"
@ -341,10 +343,11 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags)
createNotifyIcons();
/* calculate friend count */
/* intialize friend count */
updateFriends();
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateFriends()));
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateFriends()));
// connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateFriends()));
// connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateFriends()));
loadOwnStatus();
@ -363,6 +366,24 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags)
settingsChanged();
mFontSizeHandler.registerFontSize(ui->listWidget, 1.5f);
mEventHandlerId_friends = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe)
return;
updateFriends();
}
, this );
}, mEventHandlerId_friends, RsEventType::FRIEND_LIST );
}
/** Destructor. */
@ -373,6 +394,8 @@ MainWindow::~MainWindow()
Settings->setValueToGroup("MainWindow", "SplitterState", ui->splitter->saveState());
Settings->setValueToGroup("MainWindow", "State", saveState());
rsEvents->unregisterEventsHandler(mEventHandlerId_friends);
delete statusComboBox;
delete peerstatus;
delete natstatus;
@ -597,28 +620,6 @@ void MainWindow::setNewPage(int page)
}
}
void MainWindow::displayDiskSpaceWarning(int loc,int size_limit_mb)
{
QString locString ;
switch(loc)
{
case RS_PARTIALS_DIRECTORY: locString = "Partials" ;
break ;
case RS_CONFIG_DIRECTORY: locString = "Config" ;
break ;
case RS_DOWNLOAD_DIRECTORY: locString = "Download" ;
break ;
default:
std::cerr << "Error: " << __PRETTY_FUNCTION__ << " was called with an unknown parameter loc=" << loc << std::endl ;
return ;
}
QMessageBox::critical(NULL,tr("Low disk space warning"),
tr("The disk space in your")+" "+locString +" "+tr("directory is running low (current limit is")+" "+QString::number(size_limit_mb)+tr("MB). \n\n RetroShare will now safely suspend any disk access to this directory. \n\n Please make some free space and click Ok.")) ;
}
/** Creates a tray icon with a context menu and adds it to the system
* notification area. */
void MainWindow::createTrayIcon()
@ -1352,11 +1353,6 @@ void MainWindow::receiveNewArgs(QStringList args)
retroshareLinkActivated(link.toUrl());
}
void MainWindow::displayErrorMessage(int /*a*/,int /*b*/,const QString& error_msg)
{
QMessageBox::critical(NULL, tr("Internal Error"),error_msg) ;
}
void MainWindow::closeEvent(QCloseEvent *e)
{
e->ignore();
@ -1454,7 +1450,7 @@ MainWindow::retranslateUi()
}
/* set status object to status value */
static void setStatusObject(QObject *pObject, int nStatus)
static void setStatusObject(QObject *pObject, RsStatusValue nStatus)
{
QMenu *pMenu = dynamic_cast<QMenu*>(pObject);
if (pMenu) {
@ -1465,7 +1461,7 @@ static void setStatusObject(QObject *pObject, int nStatus)
continue;
}
if (pAction->data().toInt() == nStatus) {
if (pAction->data().toInt() == (int)nStatus) {
pAction->setChecked(true);
break;
}
@ -1475,7 +1471,7 @@ static void setStatusObject(QObject *pObject, int nStatus)
RSComboBox *pComboBox = dynamic_cast<RSComboBox*>(pObject);
if (pComboBox) {
/* set index of combobox */
int nIndex = pComboBox->findData(nStatus, Qt::UserRole);
int nIndex = pComboBox->findData((int)nStatus, Qt::UserRole);
if (nIndex != -1) {
pComboBox->setCurrentIndex(nIndex);
}
@ -1538,20 +1534,20 @@ void MainWindow::initializeStatusObject(QObject *pObject, bool bConnect)
/* initialize menu */
QActionGroup *pGroup = new QActionGroup(pMenu);
QAction *pAction = new QAction(QIcon(StatusDefs::imageStatus(RS_STATUS_ONLINE)), StatusDefs::name(RS_STATUS_ONLINE), pMenu);
pAction->setData(RS_STATUS_ONLINE);
QAction *pAction = new QAction(QIcon(StatusDefs::imageStatus(RsStatusValue::RS_STATUS_ONLINE)), StatusDefs::name(RsStatusValue::RS_STATUS_ONLINE), pMenu);
pAction->setData((int)RsStatusValue::RS_STATUS_ONLINE);
pAction->setCheckable(true);
pMenu->addAction(pAction);
pGroup->addAction(pAction);
pAction = new QAction(QIcon(StatusDefs::imageStatus(RS_STATUS_BUSY)), StatusDefs::name(RS_STATUS_BUSY), pMenu);
pAction->setData(RS_STATUS_BUSY);
pAction = new QAction(QIcon(StatusDefs::imageStatus(RsStatusValue::RS_STATUS_BUSY)), StatusDefs::name(RsStatusValue::RS_STATUS_BUSY), pMenu);
pAction->setData((int)RsStatusValue::RS_STATUS_BUSY);
pAction->setCheckable(true);
pMenu->addAction(pAction);
pGroup->addAction(pAction);
pAction = new QAction(QIcon(StatusDefs::imageStatus(RS_STATUS_AWAY)), StatusDefs::name(RS_STATUS_AWAY), pMenu);
pAction->setData(RS_STATUS_AWAY);
pAction = new QAction(QIcon(StatusDefs::imageStatus(RsStatusValue::RS_STATUS_AWAY)), StatusDefs::name(RsStatusValue::RS_STATUS_AWAY), pMenu);
pAction->setData((int)RsStatusValue::RS_STATUS_AWAY);
pAction->setCheckable(true);
pMenu->addAction(pAction);
pGroup->addAction(pAction);
@ -1563,9 +1559,9 @@ void MainWindow::initializeStatusObject(QObject *pObject, bool bConnect)
/* initialize combobox */
RSComboBox *pComboBox = dynamic_cast<RSComboBox*>(pObject);
if (pComboBox) {
pComboBox->addItem(QIcon(StatusDefs::imageStatus(RS_STATUS_ONLINE)), StatusDefs::name(RS_STATUS_ONLINE), RS_STATUS_ONLINE);
pComboBox->addItem(QIcon(StatusDefs::imageStatus(RS_STATUS_BUSY)), StatusDefs::name(RS_STATUS_BUSY), RS_STATUS_BUSY);
pComboBox->addItem(QIcon(StatusDefs::imageStatus(RS_STATUS_AWAY)), StatusDefs::name(RS_STATUS_AWAY), RS_STATUS_AWAY);
pComboBox->addItem(QIcon(StatusDefs::imageStatus(RsStatusValue::RS_STATUS_ONLINE)), StatusDefs::name(RsStatusValue::RS_STATUS_ONLINE), (int)RsStatusValue::RS_STATUS_ONLINE);
pComboBox->addItem(QIcon(StatusDefs::imageStatus(RsStatusValue::RS_STATUS_BUSY)), StatusDefs::name(RsStatusValue::RS_STATUS_BUSY), (int)RsStatusValue::RS_STATUS_BUSY);
pComboBox->addItem(QIcon(StatusDefs::imageStatus(RsStatusValue::RS_STATUS_AWAY)), StatusDefs::name(RsStatusValue::RS_STATUS_AWAY), (int)RsStatusValue::RS_STATUS_AWAY);
if (bConnect) {
connect(pComboBox, SIGNAL(activated(int)), this, SLOT(statusChangedComboBox(int)));
@ -1593,11 +1589,11 @@ void MainWindow::removeStatusObject(QObject *pObject)
}
/** Save own status Online,Away,Busy **/
void MainWindow::setStatus(QObject *pObject, int nStatus)
void MainWindow::setStatus(QObject *pObject, RsStatusValue nStatus)
{
if (isIdle && nStatus == (int) RS_STATUS_ONLINE) {
if (isIdle && nStatus == RsStatusValue::RS_STATUS_ONLINE) {
/* set idle only when I am online */
nStatus = RS_STATUS_INACTIVE;
nStatus = RsStatusValue::RS_STATUS_INACTIVE;
}
rsStatus->sendStatus(RsPeerId(), nStatus);
@ -1617,7 +1613,7 @@ void MainWindow::statusChangedMenu(QAction *pAction)
return;
}
setStatus(pAction->parent(), pAction->data().toInt());
setStatus(pAction->parent(), RsStatusValue(pAction->data().toInt()));
}
/* new status from combobox in statusbar */
@ -1628,7 +1624,7 @@ void MainWindow::statusChangedComboBox(int index)
}
/* no object known */
setStatus(NULL, statusComboBox->itemData(index, Qt::UserRole).toInt());
setStatus(NULL, RsStatusValue(statusComboBox->itemData(index, Qt::UserRole).toInt()));
}
/*new setting*/

View file

@ -25,6 +25,9 @@
#include <QSystemTrayIcon>
#include <set>
#include "retroshare/rsevents.h"
#include "retroshare/rsstatus.h"
#include "gui/common/rwindow.h"
#include "gui/common/RSComboBox.h"
#include "util/FontSizeHandler.h"
@ -183,7 +186,7 @@ public:
/* initialize widget with status informations, status constant stored in data or in Qt::UserRole */
void initializeStatusObject(QObject *pObject, bool bConnect);
void removeStatusObject(QObject *pObject);
void setStatus(QObject *pObject, int nStatus);
void setStatus(QObject *pObject, RsStatusValue nStatus);
RSComboBox *statusComboBoxInstance();
PeerStatus *peerstatusInstance();
@ -207,9 +210,7 @@ public:
public slots:
void receiveNewArgs(QStringList args);
void displayErrorMessage(int,int,const QString&) ;
void postModDirectories(bool update_local);
void displayDiskSpaceWarning(int loc,int size_limit_mb) ;
void checkAndSetIdle(int idleTime);
void externalLinkActivated(const QUrl &url);
@ -375,6 +376,7 @@ private:
FontSizeHandler mFontSizeHandler;
Ui::MainWindow *ui ;
};
RsEventsHandlerId_t mEventHandlerId_friends;
};
#endif

View file

@ -40,6 +40,7 @@
#include "notifyqt.h"
#include "connect/ConnectFriendWizard.h"
#include "util/PixmapMerging.h"
#include "util/qtthreadsutils.h"
#include "LogoBar.h"
#include "util/Widget.h"
#include "util/misc.h"
@ -95,8 +96,29 @@ MessengerWindow::MessengerWindow(QWidget* parent, Qt::WindowFlags flags)
connect(ui.messagelineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(savestatusmessage()));
connect(NotifyQt::getInstance(), SIGNAL(ownStatusMessageChanged()), this, SLOT(loadmystatusmessage()));
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateOwnStatus(QString,int)));
//connect(NotifyQt::getInstance(), SIGNAL(ownStatusMessageChanged()), this, SLOT(loadmystatusmessage()));
//connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateOwnStatus(QString,int)));
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=](){
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe) return;
switch(fe->mEventCode)
{
case RsFriendListEventCode::NODE_STATUS_CHANGED: updateOwnStatus(QString::fromStdString(fe->mSslId.toStdString()),fe->mStatus);
break;
case RsFriendListEventCode::OWN_STATUS_CHANGED: loadmystatusmessage();
break;
default:
break;
}
}, this );
},mEventHandlerId,RsEventType::FRIEND_LIST);
for (std::set<RsPgpId>::iterator peerIt = expandedPeers.begin(); peerIt != expandedPeers.end(); ++peerIt) {
ui.friendList->addPeerToExpand(*peerIt);
@ -159,6 +181,7 @@ MessengerWindow::~MessengerWindow ()
{
// save settings
processSettings(false);
rsEvents->unregisterEventsHandler(mEventHandlerId);
MainWindow *pMainWindow = MainWindow::getInstance();
if (pMainWindow) {
@ -214,7 +237,7 @@ void MessengerWindow::savestatusmessage()
rsMsgs->setCustomStateString(ui.messagelineEdit->currentText().toUtf8().constData());
}
void MessengerWindow::updateOwnStatus(const QString &peer_id, int status)
void MessengerWindow::updateOwnStatus(const QString &peer_id, RsStatusValue status)
{
// add self nick + own status
if (peer_id == QString::fromStdString(rsPeers->getOwnId().toStdString()))

View file

@ -52,7 +52,7 @@ private slots:
/** Open Shared Manager **/
void openShareManager();
void updateOwnStatus(const QString &peer_id, int status);
void updateOwnStatus(const QString &peer_id, RsStatusValue status);
void savestatusmessage();
@ -68,6 +68,7 @@ private:
static std::set<RsPgpId> expandedPeers ;
static std::set<RsNodeGroupId> expandedGroups ;
RsEventsHandlerId_t mEventHandlerId ;
};
#endif

View file

@ -28,6 +28,7 @@
#include <algorithm>
#include "gui/elastic/elnode.h"
#include "util/qtthreadsutils.h"
/********
* #define DEBUG_NETWORKVIEW
@ -60,12 +61,32 @@ NetworkView::NetworkView(QWidget *parent)
connect( ui.nameBox, SIGNAL(textChanged(QString)), this, SLOT(setNameSearch(QString)));
_should_update = true ;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event)
{
RsQThreadUtils::postToObject([=](){
auto ev = dynamic_cast<const RsGossipDiscoveryEvent *>(event.get());
if(!ev) return;
switch(ev->mGossipDiscoveryEventType)
{
case RsGossipDiscoveryEventType::DISCOVERY_INFO_RECEIVED: update();
[[fallthrough]];
default:
break;
}
}, this );
}, mEventHandlerId, RsEventType::GOSSIP_DISCOVERY );
}
NetworkView::~NetworkView()
{
if(mScene != NULL)
delete mScene ;
rsEvents->unregisterEventsHandler(mEventHandlerId);
if(mScene != NULL)
delete mScene ;
}
void NetworkView::setEdgeLength(int l)

View file

@ -24,6 +24,7 @@
#include <QGraphicsScene>
#include <retroshare/rstypes.h>
#include <retroshare/rsevents.h>
#include <retroshare-gui/RsAutoUpdatePage.h>
#include "ui_NetworkView.h"
@ -65,6 +66,7 @@ class NetworkView : public RsAutoUpdatePage
std::map<RsPgpId,GraphWidget::NodeId> _node_ids ;
bool _should_update ;
RsEventsHandlerId_t mEventHandlerId;
};
#endif

View file

@ -76,7 +76,7 @@ static NewsFeed* instance = nullptr;
NewsFeed::NewsFeed(QWidget *parent) : MainPage(parent), ui(new Ui::NewsFeed),
mEventTypes({
RsEventType::AUTHSSL_CONNECTION_AUTENTICATION,
RsEventType::PEER_CONNECTION ,
RsEventType::FRIEND_LIST ,
RsEventType::GXS_CIRCLES ,
RsEventType::GXS_CHANNELS ,
RsEventType::GXS_FORUMS ,
@ -197,7 +197,7 @@ void NewsFeed::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
if(event->mType == RsEventType::AUTHSSL_CONNECTION_AUTENTICATION && (flags & RS_FEED_TYPE_SECURITY))
handleSecurityEvent(event);
if(event->mType == RsEventType::PEER_CONNECTION && (flags & RS_FEED_TYPE_PEER))
if(event->mType == RsEventType::FRIEND_LIST && (flags & RS_FEED_TYPE_PEER))
handleConnectionEvent(event);
if(event->mType == RsEventType::GXS_CIRCLES && (flags & RS_FEED_TYPE_CIRCLE))
@ -428,7 +428,7 @@ void NewsFeed::handleCircleEvent(std::shared_ptr<const RsEvent> event)
void NewsFeed::handleConnectionEvent(std::shared_ptr<const RsEvent> event)
{
const RsConnectionEvent *pe = dynamic_cast<const RsConnectionEvent*>(event.get());
const RsFriendListEvent *pe = dynamic_cast<const RsFriendListEvent*>(event.get());
if(!pe) return;
auto& e(*pe);
@ -437,18 +437,17 @@ void NewsFeed::handleConnectionEvent(std::shared_ptr<const RsEvent> event)
std::cerr << "NotifyQt: handling connection event from peer " << e.mSslId << std::endl;
#endif
switch(e.mConnectionInfoCode)
switch(e.mEventCode)
{
case RsConnectionEventCode::PEER_CONNECTED:
case RsFriendListEventCode::NODE_CONNECTED:
addFeedItemIfUnique(new PeerItem(this, NEWSFEED_PEERLIST, e.mSslId, PEER_TYPE_CONNECT, false), true);
NotifyQt::getInstance()->addToaster(RS_POPUP_CONNECT, e.mSslId.toStdString().c_str(), "", "");
break;
case RsConnectionEventCode::PEER_DISCONNECTED: // not handled yet
case RsFriendListEventCode::NODE_DISCONNECTED: // not handled yet
break;
case RsConnectionEventCode::PEER_TIME_SHIFT:
case RsFriendListEventCode::NODE_TIME_SHIFT:
addFeedItemIfUnique(new PeerItem(this, NEWSFEED_PEERLIST, e.mSslId, PEER_TYPE_OFFSET, false),false);
break;
case RsConnectionEventCode::PEER_REPORTS_WRONG_IP:
case RsFriendListEventCode::NODE_REPORTS_WRONG_IP:
addFeedItemIfUnique(new SecurityIpItem(
this, e.mSslId, e.mOwnLocator.toString(),
e.mReportedLocator.toString(),
@ -506,8 +505,6 @@ void NewsFeed::handleSecurityEvent(std::shared_ptr<const RsEvent> event)
if (Settings->getMessageFlags() & RS_MESSAGE_CONNECT_ATTEMPT)
MessageComposer::addConnectAttemptMsg(e.mPgpId, e.mSslId, QString::fromStdString(det.name + "(" + det.location + ")"));
NotifyQt::getInstance()->addToaster(RS_POPUP_CONNECT_ATTEMPT, e.mPgpId.toStdString().c_str(), det.location, e.mSslId.toStdString().c_str());
}
void NewsFeed::testFeeds(uint /*notifyFlags*/)

View file

@ -38,6 +38,7 @@
#include "gui/notifyqt.h"
#include "util/RsQtVersion.h"
#include "util/misc.h"
#include "util/qtthreadsutils.h"
#include "gui/common/FilesDefs.h"
/* Images for context menu icons */
@ -73,7 +74,23 @@ ShareManager::ShareManager()
connect(ui.shareddirList, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(doubleClickedCell(int,int)));
connect(ui.shareddirList, SIGNAL(cellChanged(int,int)), this, SLOT(handleCellChange(int,int)));
connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(reload()));
// connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(reload()));
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe)
return;
reload();
}
, this );
}, mEventHandlerId, RsEventType::FRIEND_LIST );
QHeaderView* header = ui.shareddirList->horizontalHeader();
QHeaderView_setSectionResizeModeColumn(header, COLUMN_PATH, QHeaderView::Stretch);
@ -152,6 +169,7 @@ ShareManager::~ShareManager()
{
_instance = NULL;
rsEvents->unregisterEventsHandler(mEventHandlerId);
Settings->saveWidgetInformation(this);
}

View file

@ -77,6 +77,7 @@ private:
Ui::ShareManager ui;
std::vector<SharedDirInfo> mDirInfos ;
RsEventsHandlerId_t mEventHandlerId;
};
#endif

View file

@ -330,7 +330,7 @@ QString ChatDialog::getOwnName() const
return "ChatDialog::getOwnName(): invalid id type passed (RsPeerId is required). This is a bug.";
}
void ChatDialog::setPeerStatus(uint32_t status)
void ChatDialog::setPeerStatus(RsStatusValue status)
{
ChatWidget *cw = getChatWidget();
if (cw)
@ -338,22 +338,17 @@ void ChatDialog::setPeerStatus(uint32_t status)
// convert to virtual peer id
// this is only required for private and distant chat,
// because lobby and broadcast does not have a status
RsPeerId vpid;
if(mChatId.isPeerId())
vpid = mChatId.toPeerId();
if(mChatId.isDistantChatId())
vpid = RsPeerId(mChatId.toDistantChatId());
cw->updateStatus(QString::fromStdString(vpid.toStdString()), status);
cw->updateStatus(mChatId, status);
}
}
int ChatDialog::getPeerStatus()
RsStatusValue ChatDialog::getPeerStatus()
{
ChatWidget *cw = getChatWidget();
if (cw) {
return cw->getPeerStatus();
}
return 0;
return RsStatusValue::RS_STATUS_UNKNOWN;
}
QString ChatDialog::getTitle()

View file

@ -23,6 +23,8 @@
#ifndef CHATDIALOG_H
#define CHATDIALOG_H
#include "retroshare/rsstatus.h"
#include <QWidget>
#include <retroshare/rsmsgs.h>
@ -58,8 +60,8 @@ public:
bool setStyle();
const RSStyle *getStyle();
int getPeerStatus();
void setPeerStatus(uint32_t state);
RsStatusValue getPeerStatus();
void setPeerStatus(RsStatusValue state);
void focusDialog();

View file

@ -848,25 +848,26 @@ QString ChatLobbyDialog::getParticipantName(const RsGxsId& gxs_id) const
}
void ChatLobbyDialog::displayLobbyEvent(int event_type, const RsGxsId& gxs_id, const QString& str)
void ChatLobbyDialog::handleLobbyEvent(RsChatLobbyEventCode event_type, const RsGxsId& gxs_id, const QString& str)
{
RsGxsId qsParticipant;
QString name= getParticipantName(gxs_id) ;
//std::cerr << "Received ChatLobby event " << (int)event_type << " for lobby " << (void*)lobbyId << std::endl;
switch (event_type)
{
case RS_CHAT_LOBBY_EVENT_PEER_LEFT:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_LEFT:
qsParticipant=gxs_id;
ui.chatWidget->addChatMsg(true, tr("Chat room management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 has left the room.").arg(RsHtml::plainText(name)), ChatWidget::MSGTYPE_SYSTEM);
emit peerLeft(id()) ;
break;
case RS_CHAT_LOBBY_EVENT_PEER_JOINED:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_JOINED:
qsParticipant=gxs_id;
ui.chatWidget->addChatMsg(true, tr("Chat room management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 joined the room.").arg(RsHtml::plainText(name)), ChatWidget::MSGTYPE_SYSTEM);
emit peerJoined(id()) ;
break;
case RS_CHAT_LOBBY_EVENT_PEER_STATUS:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_STATUS:
{
qsParticipant=gxs_id;
@ -878,7 +879,7 @@ void ChatLobbyDialog::displayLobbyEvent(int event_type, const RsGxsId& gxs_id, c
}
break;
case RS_CHAT_LOBBY_EVENT_PEER_CHANGE_NICKNAME:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_PEER_CHANGE_NICKNAME:
{
qsParticipant=gxs_id;
@ -894,11 +895,11 @@ void ChatLobbyDialog::displayLobbyEvent(int event_type, const RsGxsId& gxs_id, c
muteParticipant(RsGxsId(str.toStdString())) ;
}
break;
case RS_CHAT_LOBBY_EVENT_KEEP_ALIVE:
case RsChatLobbyEventCode::CHAT_LOBBY_EVENT_KEEP_ALIVE:
//std::cerr << "Received keep alive packet from " << nickname.toStdString() << " in chat room " << getPeerId() << std::endl;
break;
default:
std::cerr << "ChatLobbyDialog::displayLobbyEvent() Unhandled chat room event type " << event_type << std::endl;
std::cerr << "ChatLobbyDialog::handledLobbyEvent() Unhandled chat room event type " << (int)event_type << std::endl;
}
if (!qsParticipant.isNull())

View file

@ -42,7 +42,7 @@ class ChatLobbyDialog: public ChatDialog
friend class ChatDialog;
public:
void displayLobbyEvent(int event_type, const RsGxsId &gxs_id, const QString& str);
void handleLobbyEvent(RsChatLobbyEventCode event_type, const RsGxsId& gxs_id, const QString& str);
virtual void showDialog(uint chatflags);
virtual ChatWidget *getChatWidget();

View file

@ -113,7 +113,7 @@ void ChatTabWidget::tabInfoChanged(ChatDialog *dialog)
}
} else if (dialog->hasPeerStatus()) {
setBlinking(tab, false);
setTabIcon(tab, QIcon(StatusDefs::imageIM(dialog->getPeerStatus())));
setTabIcon(tab, QIcon(StatusDefs::imageIM((RsStatusValue)dialog->getPeerStatus())));
} else {
setBlinking(tab, false);
setTabIcon(tab, QIcon());
@ -155,7 +155,7 @@ void ChatTabWidget::getInfo(bool &isTyping, bool &hasNewMessage, QIcon *icon)
} else {
cd = dynamic_cast<ChatDialog*>(currentWidget());
if (cd && cd->hasPeerStatus()) {
*icon = QIcon(StatusDefs::imageIM(cd->getPeerStatus()));
*icon = QIcon(StatusDefs::imageIM((RsStatusValue)cd->getPeerStatus()));
} else {
*icon = QIcon();
}

View file

@ -26,6 +26,7 @@
#include "gui/MainWindow.h"
#include "gui/chat/ChatDialog.h"
#include "gui/settings/rsharesettings.h"
#include "util/qtthreadsutils.h"
#include <algorithm>
#include <retroshare/rsnotify.h>
@ -57,8 +58,31 @@ static ChatUserNotify* instance = 0;
ChatUserNotify::ChatUserNotify(QObject *parent) :
UserNotify(parent)
{
connect(NotifyQt::getInstance(), SIGNAL(chatMessageReceived(ChatMessage)), this, SLOT(chatMessageReceived(ChatMessage)));
//connect(NotifyQt::getInstance(), SIGNAL(chatMessageReceived(ChatMessage)), this, SLOT(chatMessageReceived(ChatMessage)));
instance = this;
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsChatServiceEvent*>(e.get()); if(!fe) return;
if(!fe)
return;
switch(fe->mEventCode)
{
case RsChatServiceEventCode::CHAT_MESSAGE_RECEIVED: chatMessageReceived(fe->mMsg); break;
default:
break;
}
}
, this );
}, mEventHandlerId, RsEventType::CHAT_SERVICE );
}
ChatUserNotify::~ChatUserNotify()

View file

@ -42,11 +42,10 @@ public:
virtual bool hasSetting(QString *name, QString *group) override;
private slots:
void chatMessageReceived(ChatMessage msg);
private:
virtual QIcon getIcon() override;
void chatMessageReceived(ChatMessage msg);
virtual QIcon getIcon() override;
virtual QIcon getMainIcon(bool hasNew) override;
virtual unsigned int getNewCount() override;
@ -54,6 +53,8 @@ private:
virtual QString getNotifyMessage(bool plural) override;
virtual void iconClicked() override;
RsEventsHandlerId_t mEventHandlerId;
};
#endif // CHATUSERNOTIFY_H

View file

@ -34,10 +34,12 @@
#include "gui/chat/ChatLobbyDialog.h"
#include "gui/gxs/GxsIdDetails.h"
#include "util/misc.h"
#include "util/qtthreadsutils.h"
#include "util/HandleRichText.h"
#include "gui/chat/ChatUserNotify.h"//For BradCast
#include "util/DateTime.h"
#include "util/imageutil.h"
#include "util/qtthreadsutils.h"
#include "gui/im_history/ImHistoryBrowser.h"
#include <retroshare/rsstatus.h>
@ -75,7 +77,7 @@
ChatWidget::ChatWidget(QWidget *parent)
: QWidget(parent)
, completionPosition(0), newMessages(false), typing(false), peerStatus(0)
, completionPosition(0), newMessages(false), typing(false), peerStatus(RsStatusValue::RS_STATUS_UNKNOWN)
, sendingBlocked(false), useCMark(false)
, lastStatusSendTime(0)
, firstShow(true), inChatCharFormatChanged(false), firstSearch(true)
@ -172,8 +174,34 @@ ChatWidget::ChatWidget(QWidget *parent)
connect(ui->hashBox, SIGNAL(fileHashingFinished(QList<HashedFile>)), this, SLOT(fileHashingFinished(QList<HashedFile>)));
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(const QString&, int)), this, SLOT(updateStatus(const QString&, int)));
connect(NotifyQt::getInstance(), SIGNAL(peerHasNewCustomStateString(const QString&, const QString&)), this, SLOT(updatePeersCustomStateString(const QString&, const QString&)));
//connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(const QString&, int)), this, SLOT(updateStatus(const QString&, int)));
mEventHandlerId_friends = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=](){
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe)
return;
switch(fe->mEventCode)
{
case RsFriendListEventCode::NODE_STATUS_CHANGED: updateStatus(ChatId(fe->mSslId),fe->mStatus);
break;
case RsFriendListEventCode::NODE_STATE_STRING_CHANGED: updatePeersCustomStateString(ChatId(fe->mSslId),QString::fromUtf8(fe->mStateString.c_str()));
break;
default:
break;
}
}, this );
},mEventHandlerId_friends,RsEventType::FRIEND_LIST);
//connect(NotifyQt::getInstance(), SIGNAL(peerHasNewCustomStateString(const QString&, const QString&)), this, SLOT(updatePeersCustomStateString(const QString&, const QString&)));
connect(NotifyQt::getInstance(), SIGNAL(chatFontChanged()), this, SLOT(resetFonts()));
connect(ui->textBrowser, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuTextBrowser(QPoint)));
@ -255,6 +283,7 @@ ChatWidget::ChatWidget(QWidget *parent)
ChatWidget::~ChatWidget()
{
processSettings(false);
rsEvents->unregisterEventsHandler(mEventHandlerId_friends);
/* Cleanup plugin functions */
foreach (ChatWidgetHolder *chatWidgetHolder, mChatWidgetHolder) {
@ -369,11 +398,11 @@ void ChatWidget::init(const ChatId &chat_id, const QString &title)
StatusInfo peerStatusInfo;
// No check of return value. Non existing status info is handled as offline.
rsStatus->getStatus(chatId.toPeerId(), peerStatusInfo);
updateStatus(QString::fromStdString(chatId.toPeerId().toStdString()), peerStatusInfo.status);
updateStatus(chatId, peerStatusInfo.status);
// initialize first custom state string
QString customStateString = QString::fromUtf8(rsMsgs->getCustomStateString(chatId.toPeerId()).c_str());
updatePeersCustomStateString(QString::fromStdString(chatId.toPeerId().toStdString()), customStateString);
updatePeersCustomStateString(chatId, customStateString);
} else if (chatType() == CHATTYPE_DISTANT){
hist_chat_type = RS_HISTORY_TYPE_DISTANT ;
messageCount = Settings->getDistantChatHistoryCount();
@ -1792,108 +1821,106 @@ void ChatWidget::setCurrentFileName(const QString &fileName)
setWindowModified(false);
}
void ChatWidget::updateStatus(const QString &peer_id, int status)
void ChatWidget::updateStatus(const ChatId& cid, RsStatusValue status)
{
if (! (chatType() == CHATTYPE_PRIVATE || chatType() == CHATTYPE_DISTANT))
{
// updateTitle is used
return;
// updateTitle is used
return;
}
// make virtual peer id from gxs id in case of distant chat
RsPeerId vpid;
// // make virtual peer id from gxs id in case of distant chat
// RsPeerId vpid;
// if(chatId.isDistantChatId())
// vpid = RsPeerId(chatId.toDistantChatId());
// else
// vpid = chatId.toPeerId();
/* set font size for status */
if (!(cid == chatId))
return;
// the peers status has changed
QString tooltip_info ;
QString peerName ;
if(chatId.isDistantChatId())
vpid = RsPeerId(chatId.toDistantChatId());
else
vpid = chatId.toPeerId();
/* set font size for status */
if (peer_id.toStdString() == vpid.toStdString())
{
// the peers status has changed
DistantChatPeerInfo dcpinfo ;
RsIdentityDetails details ;
QString tooltip_info ;
QString peerName ;
if(rsMsgs->getDistantChatStatus(chatId.toDistantChatId(),dcpinfo))
{
if(rsIdentity->getIdDetails(dcpinfo.to_id,details))
peerName = QString::fromUtf8( details.mNickname.c_str() ) ;
else
peerName = QString::fromStdString(dcpinfo.to_id.toStdString()) ;
if(chatId.isDistantChatId())
{
DistantChatPeerInfo dcpinfo ;
RsIdentityDetails details ;
if(rsMsgs->getDistantChatStatus(chatId.toDistantChatId(),dcpinfo))
{
if(rsIdentity->getIdDetails(dcpinfo.to_id,details))
peerName = QString::fromUtf8( details.mNickname.c_str() ) ;
else
peerName = QString::fromStdString(dcpinfo.to_id.toStdString()) ;
tooltip_info = QString("Identity Id: ")+QString::fromStdString(dcpinfo.to_id.toStdString());
}
else
{
peerName = QString::fromStdString(chatId.toDistantChatId().toStdString()) ;
tooltip_info = QString("Identity Id: unknown (bug?)");
}
}
else
{
peerName = QString::fromUtf8(rsPeers->getPeerName(chatId.toPeerId()).c_str());
tooltip_info = QString("Peer Id: ") + QString::fromStdString(chatId.toPeerId().toStdString());
}
// is scrollbar at the end?
QScrollBar *scrollbar = ui->textBrowser->verticalScrollBar();
bool atEnd = (scrollbar->value() == scrollbar->maximum());
switch (status) {
case RS_STATUS_OFFLINE:
ui->info_Frame->setVisible(true);
ui->infoLabel->setText(peerName + " " + tr("appears to be Offline.") +"\n" + tr("Messages you send will be delivered after Friend is again Online."));
break;
case RS_STATUS_INACTIVE:
ui->info_Frame->setVisible(true);
ui->infoLabel->setText(peerName + " " + tr("is Idle and may not reply"));
break;
case RS_STATUS_ONLINE:
ui->info_Frame->setVisible(false);
break;
case RS_STATUS_AWAY:
ui->infoLabel->setText(peerName + " " + tr("is Away and may not reply"));
ui->info_Frame->setVisible(true);
break;
case RS_STATUS_BUSY:
ui->infoLabel->setText(peerName + " " + tr("is Busy and may not reply"));
ui->info_Frame->setVisible(true);
break;
}
ui->titleLabel->setText(peerName);
ui->titleLabel->setToolTip(tooltip_info);
ui->statusLabel->setText(QString("(%1)").arg(StatusDefs::name(status)));
peerStatus = status;
if (atEnd) {
// scroll to the end
scrollbar->setValue(scrollbar->maximum());
}
emit infoChanged(this);
emit statusChanged(status);
// Notify all ChatWidgetHolder
foreach (ChatWidgetHolder *chatWidgetHolder, mChatWidgetHolder) {
chatWidgetHolder->updateStatus(status);
}
return;
tooltip_info = QString("Identity Id: ")+QString::fromStdString(dcpinfo.to_id.toStdString());
}
else
{
peerName = QString::fromStdString(chatId.toDistantChatId().toStdString()) ;
tooltip_info = QString("Identity Id: unknown (bug?)");
}
}
else
{
peerName = QString::fromUtf8(rsPeers->getPeerName(chatId.toPeerId()).c_str());
tooltip_info = QString("Peer Id: ") + QString::fromStdString(chatId.toPeerId().toStdString());
}
// ignore status change
// is scrollbar at the end?
QScrollBar *scrollbar = ui->textBrowser->verticalScrollBar();
bool atEnd = (scrollbar->value() == scrollbar->maximum());
switch (status) {
default:
case RsStatusValue::RS_STATUS_OFFLINE:
ui->info_Frame->setVisible(true);
ui->infoLabel->setText(peerName + " " + tr("appears to be Offline.") +"\n" + tr("Messages you send will be delivered after Friend is again Online."));
break;
case RsStatusValue::RS_STATUS_INACTIVE:
ui->info_Frame->setVisible(true);
ui->infoLabel->setText(peerName + " " + tr("is Idle and may not reply"));
break;
case RsStatusValue::RS_STATUS_ONLINE:
ui->info_Frame->setVisible(false);
break;
case RsStatusValue::RS_STATUS_AWAY:
ui->infoLabel->setText(peerName + " " + tr("is Away and may not reply"));
ui->info_Frame->setVisible(true);
break;
case RsStatusValue::RS_STATUS_BUSY:
ui->infoLabel->setText(peerName + " " + tr("is Busy and may not reply"));
ui->info_Frame->setVisible(true);
break;
}
ui->titleLabel->setText(peerName);
ui->titleLabel->setToolTip(tooltip_info);
#warning inconsistent conversion here
ui->statusLabel->setText(QString("(%1)").arg(StatusDefs::name((RsStatusValue)status)));
peerStatus = status;
if (atEnd) {
// scroll to the end
scrollbar->setValue(scrollbar->maximum());
}
emit infoChanged(this);
emit statusChanged(status);
// Notify all ChatWidgetHolder
foreach (ChatWidgetHolder *chatWidgetHolder, mChatWidgetHolder) {
chatWidgetHolder->updateStatus(status);
}
}
void ChatWidget::updateTitle()
@ -1906,7 +1933,7 @@ void ChatWidget::updateTitle()
ui->titleLabel->setText(RsHtml::plainText(name) + "@" + RsHtml::plainText(title));
}
void ChatWidget::updatePeersCustomStateString(const QString& peer_id, const QString& status_string)
void ChatWidget::updatePeersCustomStateString(const ChatId& id, const QString& status_string)
{
if (chatType() != CHATTYPE_PRIVATE )
{
@ -1915,7 +1942,7 @@ void ChatWidget::updatePeersCustomStateString(const QString& peer_id, const QStr
QString status_text;
if (RsPeerId(peer_id.toStdString()) == chatId.toPeerId()) {
if (id.toPeerId() == chatId.toPeerId()) {
// the peers status string has changed
if (status_string.isEmpty()) {
ui->statusMessageLabel->hide();

View file

@ -31,6 +31,7 @@
#include <retroshare/rsmsgs.h>
#include <retroshare/rsfiles.h>
#include <retroshare/rsstatus.h>
#include <QCompleter>
#include <QTextCharFormat>
@ -62,7 +63,7 @@ public:
// status comes from notifyPeerStatusChanged
// see rststaus.h for possible values
virtual void updateStatus(int /*status*/) {}
virtual void updateStatus(RsStatusValue /*status*/) {}
protected:
ChatWidget *mChatWidget;
@ -105,7 +106,7 @@ public:
void addToolsAction(QAction *action);
QString getTitle() { return title; }
int getPeerStatus() { return peerStatus; }
RsStatusValue getPeerStatus() { return peerStatus; }
void setName(const QString &name);
bool setStyle();
@ -130,7 +131,7 @@ public:
const QList<ChatWidgetHolder*> &chatWidgetHolderList() { return mChatWidgetHolder; }
public slots:
void updateStatus(const QString &peer_id, int status);
void updateStatus(const ChatId &cid, RsStatusValue status);
void setUseCMark(const bool bUseCMark);
void updateCMPreview();
@ -144,7 +145,7 @@ private slots:
signals:
void infoChanged(ChatWidget*);
void newMessage(ChatWidget*);
void statusChanged(int);
void statusChanged(RsStatusValue);
void textBrowserAskContextMenu(QMenu* contextMnu, QString anchorForPosition, const QPoint point);
protected:
@ -189,7 +190,7 @@ private slots:
void updateLenOfChatTextEdit();
void sendChat();
void updatePeersCustomStateString(const QString& peer_id, const QString& status_string) ;
void updatePeersCustomStateString(const ChatId& id, const QString& status_string) ;
bool fileSave();
bool fileSaveAs();
@ -229,7 +230,7 @@ private:
bool newMessages;
bool typing;
int peerStatus;
RsStatusValue peerStatus;
bool sendingBlocked;
bool useCMark;
@ -272,6 +273,9 @@ private:
ChatLobbyUserNotify* notify;
Ui::ChatWidget *ui;
// RsEventsHandlerId_t mEventHandlerId_chat ;
RsEventsHandlerId_t mEventHandlerId_friends ;
};
#endif // CHATWIDGET_H

View file

@ -28,6 +28,7 @@
#include "gui/settings/RsharePeerSettings.h"
#include "gui/notifyqt.h"
#include "util/DateTime.h"
#include "util/qtthreadsutils.h"
#include <retroshare/rspeers.h>
#include <retroshare/rsiface.h>
@ -50,7 +51,26 @@ PopupChatDialog::PopupChatDialog(QWidget *parent, Qt::WindowFlags flags)
connect(ui.avatarFrameButton, SIGNAL(toggled(bool)), this, SLOT(showAvatarFrame(bool)));
connect(ui.actionClearOfflineMessages, SIGNAL(triggered()), this, SLOT(clearOfflineMessages()));
connect(NotifyQt::getInstance(), SIGNAL(chatStatusChanged(ChatId,QString)), this, SLOT(chatStatusChanged(ChatId,QString)));
//connect(NotifyQt::getInstance(), SIGNAL(chatStatusChanged(ChatId,QString)), this, SLOT(chatStatusChanged(ChatId,QString)));
mEventHandlerId_chat =0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsChatServiceEvent*>(e.get()); if(!fe) return;
switch(fe->mEventCode)
{
case RsChatServiceEventCode::CHAT_STATUS_CHANGED: chatStatusChanged(fe->mCid,QString::fromUtf8(fe->mStr.c_str())); break;
default:
break;
}
}
, this );
}, mEventHandlerId_chat, RsEventType::CHAT_SERVICE );
}
void PopupChatDialog::init(const ChatId &chat_id, const QString &title)
@ -81,6 +101,7 @@ void PopupChatDialog::init(const ChatId &chat_id, const QString &title)
/** Destructor. */
PopupChatDialog::~PopupChatDialog()
{
rsEvents->unregisterEventsHandler(mEventHandlerId_chat);
// save settings
processSettings(false);
}

View file

@ -65,6 +65,8 @@ protected:
/** Qt Designer generated object */
Ui::PopupChatDialog ui;
RsEventsHandlerId_t mEventHandlerId_chat;
};
#endif

View file

@ -360,7 +360,7 @@ void PopupChatWindow::calculateTitle(ChatDialog *dialog)
} else {
mBlinkIcon = QIcon();
if (cd && cd->hasPeerStatus()) {
icon = QIcon(StatusDefs::imageIM(cd->getPeerStatus()));
icon = QIcon(StatusDefs::imageIM((RsStatusValue)cd->getPeerStatus()));
} else {
icon = qApp->windowIcon();
}
@ -371,7 +371,7 @@ void PopupChatWindow::calculateTitle(ChatDialog *dialog)
if (cd) {
QString title = cd->getTitle();
if (cd->hasPeerStatus()) {
title += " (" + StatusDefs::name(cd->getPeerStatus()) + ")";
title += " (" + StatusDefs::name((RsStatusValue)cd->getPeerStatus()) + ")";
}
setWindowTitle(title);
} else {

View file

@ -85,7 +85,7 @@
</action>
<action name="actionDockTab">
<property name="icon">
<iconset resource="../images.qrc">
<iconset>
<normaloff>:/images/tab-dock.png</normaloff>:/images/tab-dock.png</iconset>
</property>
<property name="text">
@ -97,7 +97,7 @@
</action>
<action name="actionUndockTab">
<property name="icon">
<iconset resource="../images.qrc">
<iconset>
<normaloff>:/images/tab-undock.png</normaloff>:/images/tab-undock.png</iconset>
</property>
<property name="text">

View file

@ -121,7 +121,7 @@ void PopupDistantChatDialog::updateDisplay()
getChatWidget()->blockSending(tr( "Can't send message immediately, "
"because there is no tunnel "
"available." ));
setPeerStatus(RS_STATUS_OFFLINE);
setPeerStatus(RsStatusValue::RS_STATUS_OFFLINE);
break ;
case RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED:
std::cerr << "Chat remotely closed. " << std::endl;
@ -131,7 +131,7 @@ void PopupDistantChatDialog::updateDisplay()
getChatWidget()->updateStatusString("%1", tr( "Your partner closed the conversation." ), true );
getChatWidget()->blockSending(tr( "Your partner closed the conversation."));
setPeerStatus(RS_STATUS_OFFLINE) ;
setPeerStatus(RsStatusValue::RS_STATUS_OFFLINE) ;
break ;
case RS_DISTANT_CHAT_STATUS_TUNNEL_DN:
@ -145,7 +145,7 @@ void PopupDistantChatDialog::updateDisplay()
_status_label->setToolTip(msg);
getChatWidget()->updateStatusString("%1", msg, true);
getChatWidget()->blockSending(msg);
setPeerStatus(RS_STATUS_OFFLINE);
setPeerStatus(RsStatusValue::RS_STATUS_OFFLINE);
break;
case RS_DISTANT_CHAT_STATUS_CAN_TALK:
@ -153,7 +153,7 @@ void PopupDistantChatDialog::updateDisplay()
msg = QObject::tr( "End-to-end encrypted conversation established");
_status_label->setToolTip(msg);
getChatWidget()->unblockSending();
setPeerStatus(RS_STATUS_ONLINE);
setPeerStatus(RsStatusValue::RS_STATUS_ONLINE);
break;
}
}

View file

@ -27,6 +27,7 @@
#include "gui/notifyqt.h"
#include "util/misc.h"
#include "util/qtthreadsutils.h"
#include "gui/common/AvatarDefs.h"
#include "gui/common/AvatarDialog.h"
@ -39,21 +40,48 @@
AvatarWidget::AvatarWidget(QWidget *parent) : QLabel(parent), ui(new Ui::AvatarWidget)
{
ui->setupUi(this);
ui->setupUi(this);
mFlag.isOwnId = false;
defaultAvatar = ":/images/no_avatar_background.png";
mPeerState = RS_STATUS_OFFLINE ;
mFlag.isOwnId = false;
defaultAvatar = ":/images/no_avatar_background.png";
mPeerState = RsStatusValue::RS_STATUS_OFFLINE ;
setFrameType(NO_FRAME);
setFrameType(NO_FRAME);
/* connect signals */
//connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&)));
//connect(NotifyQt::getInstance(), SIGNAL(ownAvatarChanged()), this, SLOT(updateOwnAvatar()));
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event)
{
RsQThreadUtils::postToObject([=](){
const RsFriendListEvent *e = dynamic_cast<const RsFriendListEvent*>(event.get());
if(!e)
return;
switch(e->mEventCode)
{
case RsFriendListEventCode::OWN_AVATAR_CHANGED:
case RsFriendListEventCode::NODE_AVATAR_CHANGED: updateAvatar(QString::fromStdString(e->mSslId.toStdString()));
break;
case RsFriendListEventCode::OWN_STATUS_CHANGED:
case RsFriendListEventCode::NODE_STATUS_CHANGED: updateStatus(QString::fromStdString(e->mSslId.toStdString()),e->mStatus);
default:
break;
}
}, this );
}, mEventHandlerId, RsEventType::FRIEND_LIST );
/* connect signals */
connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&)));
connect(NotifyQt::getInstance(), SIGNAL(ownAvatarChanged()), this, SLOT(updateOwnAvatar()));
}
AvatarWidget::~AvatarWidget()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
delete ui;
}
@ -68,15 +96,15 @@ QString AvatarWidget::frameState()
case STATUS_FRAME:
switch (mPeerState)
{
case RS_STATUS_OFFLINE:
case RsStatusValue::RS_STATUS_OFFLINE:
return "OFFLINE";
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_INACTIVE:
return "INACTIVE";
case RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_ONLINE:
return "ONLINE";
case RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_AWAY:
return "AWAY";
case RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_BUSY:
return "BUSY";
}
}
@ -107,6 +135,7 @@ void AvatarWidget::setFrameType(FrameType type)
{
mFrameType = type;
#ifdef TO_REMOVE
switch (mFrameType) {
case NO_FRAME:
disconnect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int)));
@ -118,6 +147,9 @@ void AvatarWidget::setFrameType(FrameType type)
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int)));
break;
}
#endif
//refreshAvatarImage();
refreshStatus();
@ -179,7 +211,7 @@ void AvatarWidget::refreshStatus()
}
case STATUS_FRAME:
{
uint32_t status = 0;
RsStatusValue status = RsStatusValue::RS_STATUS_UNKNOWN;
if (mId.isNotSet())
return;
@ -193,7 +225,7 @@ void AvatarWidget::refreshStatus()
status = statusInfo.status ;
}
else if(mId.isDistantChatId())
status = RS_STATUS_ONLINE ;
status = RsStatusValue::RS_STATUS_ONLINE ;
else
{
std::cerr << "Unhandled chat id type in AvatarWidget::refreshStatus()" << std::endl;
@ -217,10 +249,10 @@ void AvatarWidget::refreshStatus()
{
switch (dcpinfo.status)
{
case RS_DISTANT_CHAT_STATUS_CAN_TALK : status = RS_STATUS_ONLINE ; break;
case RS_DISTANT_CHAT_STATUS_CAN_TALK : status = RsStatusValue::RS_STATUS_ONLINE ; break;
case RS_DISTANT_CHAT_STATUS_UNKNOWN : // Fall-through
case RS_DISTANT_CHAT_STATUS_TUNNEL_DN : // Fall-through
case RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED : status = RS_STATUS_OFFLINE;
case RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED : status = RsStatusValue::RS_STATUS_OFFLINE;
}
}
else
@ -238,20 +270,20 @@ void AvatarWidget::refreshStatus()
}
}
void AvatarWidget::updateStatus(const QString& peerId, int status)
void AvatarWidget::updateStatus(const QString& peerId, RsStatusValue status)
{
if (mId.isPeerId() && mId.toPeerId() == RsPeerId(peerId.toStdString()))
updateStatus(status) ;
}
void AvatarWidget::updateStatus(int status)
void AvatarWidget::updateStatus(RsStatusValue status)
{
if (mFrameType != STATUS_FRAME)
return;
mPeerState = status;
setEnabled(((uint32_t) status == RS_STATUS_OFFLINE) ? false : true);
setEnabled((status == RsStatusValue::RS_STATUS_OFFLINE) ? false : true);
RsApplication::refreshStyleSheet(this, false);
}

View file

@ -24,7 +24,9 @@
#include <QLabel>
#include <stdint.h>
#include <retroshare/rstypes.h>
#include <retroshare/rsevents.h>
#include <retroshare/rsmsgs.h>
#include <retroshare/rsstatus.h>
namespace Ui {
class AvatarWidget;
@ -57,14 +59,14 @@ protected:
void mouseReleaseEvent(QMouseEvent *event);
private slots:
void updateStatus(const QString& peerId, int status);
void updateStatus(const QString& peerId, RsStatusValue status);
void updateAvatar(const QString& peerId);
void updateOwnAvatar();
private:
void refreshAvatarImage() ;
void refreshStatus();
void updateStatus(int status);
void updateStatus(RsStatusValue status);
QString defaultAvatar;
Ui::AvatarWidget *ui;
@ -77,7 +79,9 @@ private:
// bool isGpg : 1;
} mFlag;
FrameType mFrameType;
uint32_t mPeerState;
RsStatusValue mPeerState;
RsEventsHandlerId_t mEventHandlerId;
};
#endif // AVATARWIDGET_H

View file

@ -458,7 +458,7 @@ QVariant RsFriendListModel::statusRole(const EntryIndex& fmpe,int /*column*/) co
StatusInfo status;
rsStatus->getStatus(node->node_info.id, status);
return QVariant(status.status);
return QVariant((int)status.status);
}
return QVariant();
}
@ -603,7 +603,7 @@ QVariant RsFriendListModel::onlineRole(const EntryIndex& e, int /*col*/) const
for(uint32_t i=0;i<prof.child_node_indices.size();++i)
if(mLocations[prof.child_node_indices[i]].node_info.state & RS_PEER_STATE_CONNECTED)
return QVariant(RS_STATUS_ONLINE);
return QVariant((int)RsStatusValue::RS_STATUS_ONLINE);
}
break;
}
@ -616,7 +616,7 @@ QVariant RsFriendListModel::onlineRole(const EntryIndex& e, int /*col*/) const
{
for(uint32_t i=0;i<prof->child_node_indices.size();++i)
if(mLocations[prof->child_node_indices[i]].node_info.state & RS_PEER_STATE_CONNECTED)
return QVariant(RS_STATUS_ONLINE);
return QVariant((int)RsStatusValue::RS_STATUS_ONLINE);
}
}
break;
@ -626,12 +626,12 @@ QVariant RsFriendListModel::onlineRole(const EntryIndex& e, int /*col*/) const
const HierarchicalNodeInformation *node = getNodeInfo(e);
if(node && bool(node->node_info.state & RS_PEER_STATE_CONNECTED))
return QVariant(RS_STATUS_ONLINE);
return QVariant((int)RsStatusValue::RS_STATUS_ONLINE);
else
return QVariant(RS_STATUS_OFFLINE);
return QVariant((int)RsStatusValue::RS_STATUS_OFFLINE);
}
}
return QVariant(RS_STATUS_OFFLINE);
return QVariant((int)RsStatusValue::RS_STATUS_OFFLINE);
}
QVariant RsFriendListModel::fontRole(const EntryIndex& e, int col) const
@ -640,14 +640,14 @@ QVariant RsFriendListModel::fontRole(const EntryIndex& e, int col) const
std::cerr << " font role " << e.type << ", (" << (int)e.group_index << ","<< (int)e.profile_index << ","<< (int)e.node_index << ") col="<< col<<": " << std::endl;
#endif
int status = onlineRole(e,col).toInt();
auto status = RsStatusValue(onlineRole(e,col).toInt());
switch (status)
{
case RS_STATUS_AWAY:
case RS_STATUS_BUSY:
case RS_STATUS_ONLINE:
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_INACTIVE:
{
QFont font ;
QTreeView* myParent = dynamic_cast<QTreeView*>(QAbstractItemModel::parent());
@ -781,7 +781,7 @@ QVariant RsFriendListModel::displayRole(const EntryIndex& e, int col) const
else
{
return QVariant(QString::fromUtf8(node->node_info.location.c_str())+"\n"
+ "(" + StatusDefs::name(statusRole(e,col).toInt()) + ")");
+ "(" + StatusDefs::name(RsStatusValue(statusRole(e,col).toInt())) + ")");
}
else
return QVariant(QString::fromUtf8(node->node_info.location.c_str()));
@ -900,10 +900,10 @@ bool RsFriendListModel::getPeerOnlineStatus(const EntryIndex& e) const
return (noded && (noded->node_info.state & RS_PEER_STATE_CONNECTED));
}
const RsFriendListModel::HierarchicalNodeInformation *RsFriendListModel::getBestNodeInformation(const HierarchicalProfileInformation *profileInfo, uint32_t *status) const
const RsFriendListModel::HierarchicalNodeInformation *RsFriendListModel::getBestNodeInformation(const HierarchicalProfileInformation *profileInfo, RsStatusValue *status) const
{
if (status) {
*status = RS_STATUS_OFFLINE;
*status = RsStatusValue::RS_STATUS_OFFLINE;
}
if (!profileInfo) {
@ -921,28 +921,28 @@ const RsFriendListModel::HierarchicalNodeInformation *RsFriendListModel::getBest
int statusIndex = 0;
switch (statusInfo.status) {
case RS_STATUS_OFFLINE:
case RsStatusValue::RS_STATUS_OFFLINE:
statusIndex = 1;
break;
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_INACTIVE:
statusIndex = 2;
break;
case RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_AWAY:
statusIndex = 3;
break;
case RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_BUSY:
statusIndex = 4;
break;
case RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_ONLINE:
statusIndex = 5;
break;
default:
std::cerr << "FriendListModel: Unknown status " << statusInfo.status << std::endl;
std::cerr << "FriendListModel: Unknown status " << (int)statusInfo.status << std::endl;
}
if (bestStatusIndex == 0 || statusIndex > bestStatusIndex) {
@ -999,7 +999,7 @@ QVariant RsFriendListModel::decorationRole(const EntryIndex& entry,int col) cons
QPixmap sslAvatar;
bool foundAvatar = false;
const HierarchicalProfileInformation *hn = getProfileInfo(entry);
uint32_t status = RS_STATUS_OFFLINE;
RsStatusValue status = RsStatusValue::RS_STATUS_OFFLINE;
const HierarchicalNodeInformation *bestNodeInformation = NULL;
if (mDisplayStatusIcon) {
@ -1049,7 +1049,7 @@ QVariant RsFriendListModel::decorationRole(const EntryIndex& entry,int col) cons
QPixmap sslAvatar;
AvatarDefs::getAvatarFromSslId(RsPeerId(hn->node_info.id.toStdString()), sslAvatar);
if (mDisplayStatusIcon) {
QPixmap sslOverlayIcon = FilesDefs::getPixmapFromQtResourcePath(StatusDefs::imageStatus(statusRole(entry, col).toInt()));
QPixmap sslOverlayIcon = FilesDefs::getPixmapFromQtResourcePath(StatusDefs::imageStatus(RsStatusValue(statusRole(entry, col).toInt())));
return QVariant(QIcon(createAvatar(sslAvatar, sslOverlayIcon)));
}

View file

@ -162,7 +162,7 @@ public:
/* Color definitions (for standard see default.qss) */
QColor mTextColorGroup;
QColor mTextColorStatus[RS_STATUS_COUNT];
QColor mTextColorStatus[(int)RsStatusValue::RS_STATUS_COUNT];
private:
const HierarchicalGroupInformation *getGroupInfo (const EntryIndex&) const;
@ -223,7 +223,7 @@ private:
uint32_t updateFilterStatus(ForumModelIndex i,int column,const QStringList& strings);
const HierarchicalNodeInformation *getBestNodeInformation(const HierarchicalProfileInformation *profileInfo, uint32_t *status = NULL) const;
const HierarchicalNodeInformation *getBestNodeInformation(const HierarchicalProfileInformation *profileInfo, RsStatusValue *status = NULL) const;
QStringList mFilterStrings;
FilterType mFilterType;

View file

@ -101,8 +101,8 @@ FriendSelectionWidget::FriendSelectionWidget(QWidget *parent)
connect(ui->friendList, SIGNAL(itemSelectionChanged()), this, SIGNAL(itemSelectionChanged()));
connect(ui->filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems(QString)));
connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(groupsChanged(int)));
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(const QString&,int)), this, SLOT(peerStatusChanged(const QString&,int)));
//connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(groupsChanged(int)));
//connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(const QString&,int)), this, SLOT(peerStatusChanged(const QString&,int)));
mCompareRole = new RSTreeWidgetItemCompareRole;
mActionSortByState = new QAction(tr("Sort by state"), this);
@ -134,7 +134,7 @@ FriendSelectionWidget::FriendSelectionWidget(QWidget *parent)
RsQThreadUtils::postToObject( [this,event]() { handleEvent_main_thread(event); }) ;}, mEventHandlerId_identities, RsEventType::GXS_IDENTITY );
mEventHandlerId_peers = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) {
RsQThreadUtils::postToObject( [this,event]() { handleEvent_main_thread(event); }) ;}, mEventHandlerId_peers, RsEventType::PEER_CONNECTION );
RsQThreadUtils::postToObject( [this,event]() { handleEvent_main_thread(event); }) ;}, mEventHandlerId_peers, RsEventType::FRIEND_LIST );
mFontSizeHandler.registerFontSize(ui->friendList);
}
@ -149,17 +149,31 @@ void FriendSelectionWidget::handleEvent_main_thread(std::shared_ptr<const RsEven
update(); // Qt flush
return;
}
const RsConnectionEvent *fp = dynamic_cast<const RsConnectionEvent*>(event.get());
const RsFriendListEvent *fp = dynamic_cast<const RsFriendListEvent*>(event.get());
if(fp)
switch(fp->mConnectionInfoCode)
switch(fp->mEventCode)
{
case RsConnectionEventCode::PEER_REMOVED:
case RsConnectionEventCode::PEER_ADDED:
case RsFriendListEventCode::NODE_REMOVED:
case RsFriendListEventCode::NODE_ADDED:
updateDisplay(true);
update(); // Qt flush
break;
default: break ;
case RsFriendListEventCode::GROUP_ADDED:
case RsFriendListEventCode::GROUP_REMOVED:
case RsFriendListEventCode::GROUP_CHANGED:
groupsChanged();
break;
case RsFriendListEventCode::NODE_STATUS_CHANGED:
{
StatusInfo i;
rsStatus->getStatus(fp->mSslId,i);
peerStatusChanged(fp->mSslId,i.status);
}
default:
break ;
}
}
@ -241,7 +255,7 @@ static void initSslItem(QTreeWidgetItem *item, const RsPeerDetails &detail, cons
QString name = PeerDefs::nameWithLocation(detail);
item->setText(COLUMN_NAME, name);
int state = RS_STATUS_OFFLINE;
RsStatusValue state = RsStatusValue::RS_STATUS_OFFLINE;
if (detail.state & RS_PEER_STATE_CONNECTED) {
std::list<StatusInfo>::const_iterator it;
for (it = statusInfo.begin(); it != statusInfo.end() ; ++it) {
@ -252,7 +266,7 @@ static void initSslItem(QTreeWidgetItem *item, const RsPeerDetails &detail, cons
}
}
if (state != (int) RS_STATUS_OFFLINE) {
if (state != RsStatusValue::RS_STATUS_OFFLINE) {
item->setData(COLUMN_NAME, Qt::ForegroundRole, textColorOnline);
}
@ -262,7 +276,7 @@ static void initSslItem(QTreeWidgetItem *item, const RsPeerDetails &detail, cons
item->setData(COLUMN_NAME, ROLE_SORT_GROUP, 1);
item->setData(COLUMN_NAME, ROLE_SORT_STANDARD_GROUP, 0);
item->setData(COLUMN_NAME, ROLE_SORT_NAME, name);
item->setData(COLUMN_NAME, ROLE_SORT_STATE, state);
item->setData(COLUMN_NAME, ROLE_SORT_STATE, (int)state);
}
void FriendSelectionWidget::fillList()
@ -501,17 +515,17 @@ void FriendSelectionWidget::secured_fillList()
sslIds.clear();
rsPeers->getAssociatedSSLIds(*gpgIt, sslIds);
int state = RS_STATUS_OFFLINE;
RsStatusValue state = RsStatusValue::RS_STATUS_OFFLINE;
for (statusIt = statusInfo.begin(); statusIt != statusInfo.end() ; ++statusIt) {
if (std::find(sslIds.begin(), sslIds.end(), statusIt->id) != sslIds.end()) {
if (statusIt->status != RS_STATUS_OFFLINE) {
state = RS_STATUS_ONLINE;
if (statusIt->status != RsStatusValue::RS_STATUS_OFFLINE) {
state = RsStatusValue::RS_STATUS_ONLINE;
break;
}
}
}
if (state != (int) RS_STATUS_OFFLINE) {
if (state != RsStatusValue::RS_STATUS_OFFLINE) {
gpgItem->setData(COLUMN_NAME, Qt::ForegroundRole, textColorOnline());
}
@ -522,7 +536,7 @@ void FriendSelectionWidget::secured_fillList()
gpgItem->setData(COLUMN_NAME, ROLE_SORT_GROUP, 1);
gpgItem->setData(COLUMN_NAME, ROLE_SORT_STANDARD_GROUP, 0);
gpgItem->setData(COLUMN_NAME, ROLE_SORT_NAME, name);
gpgItem->setData(COLUMN_NAME, ROLE_SORT_STATE, state);
gpgItem->setData(COLUMN_NAME, ROLE_SORT_STATE, (int)state);
if (mListModus == MODUS_CHECK) {
gpgItem->setCheckState(0, Qt::Unchecked);
@ -770,23 +784,20 @@ template<> inline void FriendSelectionWidget::setSelectedIds<RsGxsId,FriendSelec
loadIdentities();
}
void FriendSelectionWidget::groupsChanged(int /*type*/)
void FriendSelectionWidget::groupsChanged()
{
if (mShowTypes & SHOW_GROUP) {
fillList();
}
}
void FriendSelectionWidget::peerStatusChanged(const QString& peerId, int status)
void FriendSelectionWidget::peerStatusChanged(const RsPeerId& peerid, RsStatusValue status)
{
if(!isVisible())
return ;
if(RsAutoUpdatePage::eventsLocked())
return ;
RsPeerId peerid(peerId.toStdString()) ;
QString gpgId;
int gpgStatus = RS_STATUS_OFFLINE;
RsStatusValue gpgStatus = RsStatusValue::RS_STATUS_OFFLINE;
if (mShowTypes & (SHOW_GPG | SHOW_NON_FRIEND_GPG)) {
/* need gpg id and online state */
@ -795,7 +806,7 @@ void FriendSelectionWidget::peerStatusChanged(const QString& peerId, int status)
{
gpgId = QString::fromStdString(detail.gpg_id.toStdString());
if (status == (int) RS_STATUS_OFFLINE) {
if (status == RsStatusValue::RS_STATUS_OFFLINE) {
/* try other nodes */
std::list<RsPeerId> sslIds;
rsPeers->getAssociatedSSLIds(detail.gpg_id, sslIds);
@ -806,15 +817,15 @@ void FriendSelectionWidget::peerStatusChanged(const QString& peerId, int status)
for (statusIt = statusInfo.begin(); statusIt != statusInfo.end() ; ++statusIt) {
if (std::find(sslIds.begin(), sslIds.end(), statusIt->id) != sslIds.end()) {
if (statusIt->status != RS_STATUS_OFFLINE) {
gpgStatus = RS_STATUS_ONLINE;
if (statusIt->status != RsStatusValue::RS_STATUS_OFFLINE) {
gpgStatus = RsStatusValue::RS_STATUS_ONLINE;
break;
}
}
}
} else {
/* one node is online */
gpgStatus = RS_STATUS_ONLINE;
gpgStatus = RsStatusValue::RS_STATUS_ONLINE;
}
}
}
@ -834,7 +845,7 @@ void FriendSelectionWidget::peerStatusChanged(const QString& peerId, int status)
case IDTYPE_GPG:
{
if (item->data(COLUMN_DATA, ROLE_ID).toString() == gpgId) {
if (status != (int) RS_STATUS_OFFLINE) {
if (status != RsStatusValue::RS_STATUS_OFFLINE) {
item->setData(COLUMN_NAME, Qt::ForegroundRole, textColorOnline());
} else {
item->setData(COLUMN_NAME, Qt::ForegroundRole, QVariant());
@ -842,7 +853,7 @@ void FriendSelectionWidget::peerStatusChanged(const QString& peerId, int status)
item->setIcon(COLUMN_NAME, FilesDefs::getIconFromQtResourcePath(StatusDefs::imageUser(gpgStatus)));
item->setData(COLUMN_NAME, ROLE_SORT_STATE, gpgStatus);
item->setData(COLUMN_NAME, ROLE_SORT_STATE, (int)gpgStatus);
bFoundGPG = true;
}
@ -850,8 +861,9 @@ void FriendSelectionWidget::peerStatusChanged(const QString& peerId, int status)
break;
case IDTYPE_SSL:
{
if (item->data(COLUMN_DATA, ROLE_ID).toString() == peerId) {
if (status != (int) RS_STATUS_OFFLINE) {
if (RsPeerId(item->data(COLUMN_DATA, ROLE_ID).toString().toStdString()) == peerid)
{
if (status != RsStatusValue::RS_STATUS_OFFLINE) {
item->setData(COLUMN_NAME, Qt::ForegroundRole, textColorOnline());
} else {
item->setData(COLUMN_NAME, Qt::ForegroundRole, QVariant());
@ -859,7 +871,7 @@ void FriendSelectionWidget::peerStatusChanged(const QString& peerId, int status)
item->setIcon(COLUMN_NAME, FilesDefs::getIconFromQtResourcePath(StatusDefs::imageUser(status)));
item->setData(COLUMN_NAME, ROLE_SORT_STATE, status);
item->setData(COLUMN_NAME, ROLE_SORT_STATE, (int)status);
bFoundSSL = true;
}
@ -1262,7 +1274,7 @@ bool FriendSelectionWidget::isSortByState()
void FriendSelectionWidget::filterConnected(bool filter)
{
ui->friendList->filterMinValItems(COLUMN_NAME, filter ? RS_STATUS_AWAY : RS_STATUS_OFFLINE, ROLE_SORT_STATE);
ui->friendList->filterMinValItems(COLUMN_NAME, filter ? double(RsStatusValue::RS_STATUS_AWAY) : double(RsStatusValue::RS_STATUS_OFFLINE), ROLE_SORT_STATE);
mActionFilterConnected->setChecked(filter);

View file

@ -25,6 +25,7 @@
#include <QDialog>
#include "retroshare/rsevents.h"
#include "retroshare/rsstatus.h"
#include <gui/gxs/RsGxsUpdateBroadcastPage.h>
#include "util/FontSizeHandler.h"
@ -137,8 +138,7 @@ public slots:
void filterConnected(bool filter);
private slots:
void groupsChanged(int type);
void peerStatusChanged(const QString& peerId, int status);
void peerStatusChanged(const RsPeerId &peerid, RsStatusValue status);
void filterItems(const QString &text);
void contextMenuRequested(const QPoint &pos);
void itemDoubleClicked(QTreeWidgetItem *item, int column);
@ -147,7 +147,8 @@ private slots:
void deselectAll() ;
private:
void fillList();
void groupsChanged();
void fillList();
void secured_fillList();
void selectedIds_internal(IdType idType, std::set<std::string> &ids, bool onlyDirectSelected);

View file

@ -24,6 +24,7 @@
#include "GroupSelectionBox.h"
#include "GroupDefs.h"
#include "gui/notifyqt.h"
#include "util/qtthreadsutils.h"
#include <algorithm>
@ -34,11 +35,40 @@ GroupSelectionBox::GroupSelectionBox(QWidget *parent)
{
setSelectionMode(QAbstractItemView::SingleSelection);
connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(fillGroups()));
//connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(fillGroups()));
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe)
return;
switch(fe->mEventCode)
{
case RsFriendListEventCode::GROUP_ADDED:
case RsFriendListEventCode::GROUP_REMOVED:
case RsFriendListEventCode::GROUP_CHANGED: fillGroups();
default:
break;
}
}
, this );
}, mEventHandlerId, RsEventType::FRIEND_LIST );
// Fill with available groups
fillGroups();
}
GroupSelectionBox::~GroupSelectionBox()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
}
void GroupSelectionBox::fillGroups()
{
std::list<RsNodeGroupId> selectedIds;

View file

@ -21,6 +21,7 @@
#include <QListWidget>
#include <QDialog>
#include <retroshare/rsids.h>
#include <retroshare/rsevents.h>
class GroupSelectionBox: public QListWidget
{
@ -28,6 +29,7 @@ class GroupSelectionBox: public QListWidget
public:
GroupSelectionBox(QWidget *parent);
virtual ~GroupSelectionBox();
static void selectGroups(const std::list<RsNodeGroupId>& default_groups) ;
@ -38,6 +40,9 @@ public:
private slots:
void fillGroups();
private:
RsEventsHandlerId_t mEventHandlerId ;
};
class GroupSelectionDialog: public QDialog

View file

@ -259,7 +259,7 @@ void HashBox::checkAttachmentReady()
emit fileHashingFinished(hashedFiles);
auto ev = std::make_shared<RsSharedDirectoriesEvent>();
ev->mEventCode = RsSharedDirectoriesEventCode::DIRECTORY_SWEEP_ENDED;
ev->mEventCode = RsSharedDirectoriesEventCode::HASHING_PROCESS_FINISHED;
if(rsEvents)
rsEvents->postEvent(ev);
}

View file

@ -132,8 +132,8 @@ public:
if(is_group_1 ^ is_group_2) // if the two are different, put the group first.
return is_group_1 ;
bool online1 = (left .data(RsFriendListModel::OnlineRole).toInt() != RS_STATUS_OFFLINE);
bool online2 = (right.data(RsFriendListModel::OnlineRole).toInt() != RS_STATUS_OFFLINE);
bool online1 = (left .data(RsFriendListModel::OnlineRole).toInt() != (int)RsStatusValue::RS_STATUS_OFFLINE);
bool online2 = (right.data(RsFriendListModel::OnlineRole).toInt() != (int)RsStatusValue::RS_STATUS_OFFLINE);
if((online1 != online2) && m_sortByState)
return (m_header->sortIndicatorOrder()==Qt::AscendingOrder)?online1:online2 ; // always put online nodes first
@ -155,7 +155,7 @@ public:
// Filter offline friends
if(!m_showOfflineNodes && (index.data(RsFriendListModel::OnlineRole).toInt() == RS_STATUS_OFFLINE))
if(!m_showOfflineNodes && (RsStatusValue(index.data(RsFriendListModel::OnlineRole).toInt()) == RsStatusValue::RS_STATUS_OFFLINE))
return false;
return index.data(RsFriendListModel::FilterRole).toString() == RsFriendListModel::FilterString ;
@ -195,16 +195,16 @@ NewFriendList::NewFriendList(QWidget */*parent*/) : /* RsAutoUpdatePage(5000,par
ui->filterLineEdit->setPlaceholderText(tr("Search")) ;
ui->filterLineEdit->showFilterIcon();
// mEventHandlerId_pssc=0; // forces initialization
mEventHandlerId_peer=0; // forces initialization
mEventHandlerId_gssp=0; // forces initialization
mEventHandlerId_pssc=0; // forces initialization
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e) { handleEvent(e); }, mEventHandlerId_pssc, RsEventType::PEER_STATE_CHANGED );
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e) { handleEvent(e); }, mEventHandlerId_peer, RsEventType::PEER_CONNECTION );
// rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e) { handleEvent(e); }, mEventHandlerId_pssc, RsEventType::PEER_STATE_CHANGED );
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e) { handleEvent(e); }, mEventHandlerId_peer, RsEventType::FRIEND_LIST );
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e) { handleEvent(e); }, mEventHandlerId_gssp, RsEventType::GOSSIP_DISCOVERY );
connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(QString)), this, SLOT(forceUpdateDisplay()));
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(forceUpdateDisplay()));
// connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(QString)), this, SLOT(forceUpdateDisplay()));
// connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(forceUpdateDisplay()));
mModel = new RsFriendListModel(ui->peerTreeWidget);
mProxyModel = new FriendListSortFilterProxyModel(ui->peerTreeWidget->header(),this);
@ -293,7 +293,7 @@ NewFriendList::~NewFriendList()
{
rsEvents->unregisterEventsHandler(mEventHandlerId_peer);
rsEvents->unregisterEventsHandler(mEventHandlerId_gssp);
rsEvents->unregisterEventsHandler(mEventHandlerId_pssc);
// rsEvents->unregisterEventsHandler(mEventHandlerId_pssc);
delete mModel;
delete mProxyModel;

View file

@ -66,18 +66,18 @@ public:
//void updateDisplay() override;
QColor textColorGroup() const { return mModel->mTextColorGroup; }
QColor textColorStatusOffline() const { return mModel->mTextColorStatus[RS_STATUS_OFFLINE ]; }
QColor textColorStatusAway() const { return mModel->mTextColorStatus[RS_STATUS_AWAY ]; }
QColor textColorStatusBusy() const { return mModel->mTextColorStatus[RS_STATUS_BUSY ]; }
QColor textColorStatusOnline() const { return mModel->mTextColorStatus[RS_STATUS_ONLINE ]; }
QColor textColorStatusInactive() const { return mModel->mTextColorStatus[RS_STATUS_INACTIVE]; }
QColor textColorStatusOffline() const { return mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_OFFLINE ]; }
QColor textColorStatusAway() const { return mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_AWAY ]; }
QColor textColorStatusBusy() const { return mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_BUSY ]; }
QColor textColorStatusOnline() const { return mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_ONLINE ]; }
QColor textColorStatusInactive() const { return mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_INACTIVE]; }
void setTextColorGroup(QColor color) { mModel->mTextColorGroup = color; }
void setTextColorStatusOffline(QColor color) { mModel->mTextColorStatus[RS_STATUS_OFFLINE ] = color; }
void setTextColorStatusAway(QColor color) { mModel->mTextColorStatus[RS_STATUS_AWAY ] = color; }
void setTextColorStatusBusy(QColor color) { mModel->mTextColorStatus[RS_STATUS_BUSY ] = color; }
void setTextColorStatusOnline(QColor color) { mModel->mTextColorStatus[RS_STATUS_ONLINE ] = color; }
void setTextColorStatusInactive(QColor color) { mModel->mTextColorStatus[RS_STATUS_INACTIVE] = color; }
void setTextColorStatusOffline(QColor color) { mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_OFFLINE ] = color; }
void setTextColorStatusAway(QColor color) { mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_AWAY ] = color; }
void setTextColorStatusBusy(QColor color) { mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_BUSY ] = color; }
void setTextColorStatusOnline(QColor color) { mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_ONLINE ] = color; }
void setTextColorStatusInactive(QColor color) { mModel->mTextColorStatus[(uint8_t)RsStatusValue::RS_STATUS_INACTIVE] = color; }
public slots:
void filterItems(const QString &text);
@ -127,7 +127,7 @@ private:
bool mShowState;
RsEventsHandlerId_t mEventHandlerId_peer;
RsEventsHandlerId_t mEventHandlerId_gssp;
RsEventsHandlerId_t mEventHandlerId_pssc;
// RsEventsHandlerId_t mEventHandlerId_pssc;
std::set<RsNodeGroupId> openGroups;
std::set<RsPgpId> openPeers;

View file

@ -24,118 +24,124 @@
#include "StatusDefs.h"
QString StatusDefs::name(unsigned int status)
QString StatusDefs::name(RsStatusValue status)
{
switch (status) {
case RS_STATUS_OFFLINE:
default:
case RsStatusValue::RS_STATUS_OFFLINE:
return qApp->translate("StatusDefs", "Offline");
case RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_AWAY:
return qApp->translate("StatusDefs", "Away");
case RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_BUSY:
return qApp->translate("StatusDefs", "Busy");
case RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_ONLINE:
return qApp->translate("StatusDefs", "Online");
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_INACTIVE:
return qApp->translate("StatusDefs", "Idle");
}
std::cerr << "StatusDefs::name: Unknown status requested " << status;
RsErr() << "StatusDefs::name: Unknown status requested " << (int)status;
return "";
}
const char *StatusDefs::imageIM(unsigned int status)
const char *StatusDefs::imageIM(RsStatusValue status)
{
switch (status) {
case RS_STATUS_OFFLINE:
default:
case RsStatusValue::RS_STATUS_OFFLINE:
return ":/images/im-user-offline.png";
case RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_AWAY:
return ":/images/im-user-away.png";
case RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_BUSY:
return ":/images/im-user-busy.png";
case RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_ONLINE:
return ":/images/im-user.png";
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_INACTIVE:
return ":/images/im-user-inactive.png";
}
std::cerr << "StatusDefs::imageIM: Unknown status requested " << status;
RsErr() << "StatusDefs::imageIM: Unknown status requested " << (int)status;
return "";
}
const char *StatusDefs::imageUser(unsigned int status)
const char *StatusDefs::imageUser(RsStatusValue status)
{
switch (status) {
case RS_STATUS_OFFLINE:
default:
case RsStatusValue::RS_STATUS_OFFLINE:
return ":/images/user/identityoffline24.png";
case RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_AWAY:
return ":/images/user/identity24away.png";
case RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_BUSY:
return ":/images/user/identity24busy.png";
case RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_ONLINE:
return ":/images/user/identity24.png";
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_INACTIVE:
return ":/images/user/identity24idle.png";
}
std::cerr << "StatusDefs::imageUser: Unknown status requested " << status;
RsErr() << "StatusDefs::imageUser: Unknown status requested " << (int)status;
return "";
}
const char *StatusDefs::imageStatus(unsigned int status)
const char *StatusDefs::imageStatus(RsStatusValue status)
{
switch (status) {
case RS_STATUS_OFFLINE:
default:
case RsStatusValue::RS_STATUS_OFFLINE:
return ":/icons/user-offline_64.png";
case RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_AWAY:
return ":/icons/user-away_64.png";
case RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_BUSY:
return ":/icons/user-busy_64.png";
case RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_ONLINE:
return ":/icons/user-online_64.png";
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_INACTIVE:
return ":/icons/user-away-extended_64.png";
}
std::cerr << "StatusDefs::imageUser: Unknown status requested " << status;
RsErr() << "StatusDefs::imageUser: Unknown status requested " << (int)status;
return "";
}
QString StatusDefs::tooltip(unsigned int status)
QString StatusDefs::tooltip(RsStatusValue status)
{
switch (status) {
case RS_STATUS_OFFLINE:
default:
case RsStatusValue::RS_STATUS_OFFLINE:
return qApp->translate("StatusDefs", "Friend is offline");
case RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_AWAY:
return qApp->translate("StatusDefs", "Friend is away");
case RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_BUSY:
return qApp->translate("StatusDefs", "Friend is busy");
case RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_ONLINE:
return qApp->translate("StatusDefs", "Friend is online");
case RS_STATUS_INACTIVE:
case RsStatusValue::RS_STATUS_INACTIVE:
return qApp->translate("StatusDefs", "Friend is idle");
}
std::cerr << "StatusDefs::tooltip: Unknown status requested " << status;
RsErr() << "StatusDefs::tooltip: Unknown status requested " << (int)status;
return "";
}
QFont StatusDefs::font(unsigned int status)
QFont StatusDefs::font(RsStatusValue status)
{
QFont font;
switch (status) {
case RS_STATUS_AWAY:
case RS_STATUS_BUSY:
case RS_STATUS_ONLINE:
case RS_STATUS_INACTIVE:
default:
case RsStatusValue::RS_STATUS_AWAY:
case RsStatusValue::RS_STATUS_BUSY:
case RsStatusValue::RS_STATUS_ONLINE:
case RsStatusValue::RS_STATUS_INACTIVE:
font.setBold(true);
return font;
case RS_STATUS_OFFLINE:
case RsStatusValue::RS_STATUS_OFFLINE:
font.setBold(false);
return font;
}
std::cerr << "StatusDefs::font: Unknown status requested " << status;
RsErr() << "StatusDefs::font: Unknown status requested " << (int)status;
return font;
}

View file

@ -24,18 +24,20 @@
#include <QColor>
#include <QFont>
#include "retroshare/rsstatus.h"
struct RsPeerDetails;
class StatusDefs
{
public:
static QString name(unsigned int status);
static const char* imageIM(unsigned int status);
static const char* imageUser(unsigned int status);
static const char* imageStatus(unsigned int status);
static QString tooltip(unsigned int status);
static QString name(RsStatusValue status);
static const char* imageIM(RsStatusValue status);
static const char* imageUser(RsStatusValue status);
static const char* imageStatus(RsStatusValue status);
static QString tooltip(RsStatusValue status);
static QFont font(unsigned int status);
static QFont font(RsStatusValue status);
static QString peerStateString(int peerState);
static QString connectStateString(RsPeerDetails &details);

View file

@ -855,7 +855,14 @@ void ConnectFriendWizard::accept()
ConnectProgressDialog::showProgress(ssl_id);
}
NotifyQt::getInstance()->notifyListChange(NOTIFY_LIST_NEIGHBOURS,1) ;
//NotifyQt::getInstance()->notifyListChange(NOTIFY_LIST_NEIGHBOURS,1) ;
auto ev = std::make_shared<RsFriendListEvent>();
ev->mEventCode = RsFriendListEventCode::NODE_ADDED;
ev->mSslId = peerDetails.id;
ev->mPgpId = peerDetails.gpg_id;
rsEvents->postEvent(ev);
QDialog::accept();
}
@ -968,190 +975,6 @@ void ConnectFriendWizard::openCert()
}
}
#ifdef TO_BE_REMOVED
//========================== CertificatePage =================================
void ConnectFriendWizard::loadFriendCert()
{
QString fileName ;
if(!misc::getOpenFileName(this, RshareSettings::LASTDIR_CERT, tr("Select Certificate"), tr("RetroShare Certificate (*.rsc );;All Files (*)"),fileName))
return ;
if (!fileName.isNull()) {
ui->friendFileNameEdit->setText(fileName);
}
}
void ConnectFriendWizard::generateCertificateCalled()
{
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << " generateCertificateCalled" << std::endl;
#endif
std::string cert = rsPeers->GetRetroshareInvite();
if (cert.empty()) {
QMessageBox::information(this, "RetroShare", tr("Sorry, create certificate failed"), QMessageBox::Ok, QMessageBox::Ok);
return;
}
QString qdir = QFileDialog::getSaveFileName(this, tr("Please choose a filename"), QDir::homePath(), tr("RetroShare Certificate (*.rsc );;All Files (*)"));
//Todo: move save to file to p3Peers::SaveCertificateToFile
if (qdir.isEmpty() == false) {
QFile CertFile(qdir);
if (CertFile.open(QIODevice::WriteOnly/* | QIODevice::Text*/)) {
if (CertFile.write(QByteArray(cert.c_str())) > 0) {
QMessageBox::information(this, "RetroShare", tr("Certificate file successfully created"), QMessageBox::Ok, QMessageBox::Ok);
} else {
QMessageBox::information(this, "RetroShare", tr("Sorry, certificate file creation failed"), QMessageBox::Ok, QMessageBox::Ok);
}
CertFile.close();
} else {
QMessageBox::information(this, "RetroShare", tr("Sorry, certificate file creation failed"), QMessageBox::Ok, QMessageBox::Ok);
}
}
}
//============================= FofPage ======================================
void ConnectFriendWizard::updatePeersList(int index)
{
ui->selectedPeersTW->clearContents();
ui->selectedPeersTW->setRowCount(0);
RsPgpId ownId = rsPeers->getGPGOwnId();
int row = 0;
_id_boxes.clear();
// We have to use this trick because signers are given by their names instead of their ids. That's a cause
// for some confusion when two peers have the same name.
//
std::list<RsPgpId> gpg_ids;
rsPeers->getGPGAllList(gpg_ids);
for (std::list<RsPgpId>::const_iterator it(gpg_ids.begin()); it != gpg_ids.end(); ++it) {
if (*it == ownId) {
// its me
continue;
}
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << "examining peer " << *it << " (name=" << rsPeers->getPeerName(*it);
#endif
RsPeerDetails details ;
if (!rsPeers->getGPGDetails(*it,details)) {
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << " no details." << std::endl ;
#endif
continue;
}
// determine common friends
std::list<RsPgpId> common_friends;
for (std::list<RsPgpId>::const_iterator it2(details.gpgSigners.begin()); it2 != details.gpgSigners.end(); ++it2) {
if(rsPeers->isGPGAccepted(*it2)) {
common_friends.push_back(*it2);
}
}
bool show = false;
switch(index) {
case 0: // "All unsigned friends of my friends"
show = !details.ownsign;
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << "case 0: ownsign=" << details.ownsign << ", show=" << show << std::endl;
#endif
break ;
case 1: // "Unsigned peers who already signed my certificate"
show = details.hasSignedMe && !(details.state & RS_PEER_STATE_FRIEND);
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << "case 1, ownsign=" << details.ownsign << ", is_authed_me=" << details.hasSignedMe << ", show=" << show << std::endl;
#endif
break ;
case 2: // "Peers shown as denied"
show = details.ownsign && !(details.state & RS_PEER_STATE_FRIEND);
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << "case 2, ownsign=" << details.ownsign << ", state_friend=" << (details.state & RS_PEER_STATE_FRIEND) << ", show=" << show << std::endl;
#endif
break ;
}
if (show) {
ui->selectedPeersTW->insertRow(row);
QCheckBox *cb = new QCheckBox;
cb->setChecked(true);
_id_boxes[cb] = details.id;
_gpg_id_boxes[cb] = details.gpg_id;
ui->selectedPeersTW->setCellWidget(row, 0, cb);
ui->selectedPeersTW->setItem(row, 1, new QTableWidgetItem(QString::fromUtf8(details.name.c_str())));
QComboBox *qcb = new QComboBox;
if (common_friends.empty()) {
qcb->addItem(tr("*** None ***"));
} else {
for (std::list<RsPgpId>::const_iterator it2(common_friends.begin()); it2 != common_friends.end(); ++it2) {
qcb->addItem(QString::fromStdString( (*it2).toStdString()));
}
}
ui->selectedPeersTW->setCellWidget(row, 2, qcb);
ui->selectedPeersTW->setItem(row, 3, new QTableWidgetItem(QString::fromStdString(details.id.toStdString())));
++row;
}
}
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << "FofPage::updatePeersList() finished iterating over peers" << std::endl;
#endif
if (row>0) {
ui->selectedPeersTW->resizeColumnsToContents();
ui->makeFriendButton->setEnabled(true);
} else {
ui->makeFriendButton->setEnabled(false);
}
}
void ConnectFriendWizard::signAllSelectedUsers()
{
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << "making lots of friends !!" << std::endl;
#endif
for (std::map<QCheckBox*, RsPeerId>::const_iterator it(_id_boxes.begin()); it != _id_boxes.end(); ++it) {
if (it->first->isChecked()) {
#ifdef FRIEND_WIZARD_DEBUG
std::cerr << "Making friend with " << it->second << std::endl ;
#endif
//rsPeers->AuthCertificate(it->second, "");
rsPeers->addFriend(it->second, _gpg_id_boxes[it->first]);
}
}
ui->FofPage->setComplete(true);
ui->userSelectionCB->setEnabled(false);
ui->selectedPeersTW->setEnabled(false);
ui->makeFriendButton->setEnabled(false);
NotifyQt::getInstance()->notifyListChange(NOTIFY_LIST_NEIGHBOURS,0);
NotifyQt::getInstance()->notifyListChange(NOTIFY_LIST_FRIENDS,0);
}
//============================= RsidPage =====================================
//============================ Emailpage =====================================
#endif
//========================= ErrorMessagePage =================================
//========================== ConclusionPage ==================================

View file

@ -28,6 +28,7 @@
#include "gui/common/StatusDefs.h"
#include "gui/common/FilesDefs.h"
#include "gui/common/AvatarDefs.h"
#include "util/qtthreadsutils.h"
#include "util/DateTime.h"
#include "gui/notifyqt.h"
@ -58,7 +59,23 @@ PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId,
connect( chatButton, SIGNAL( clicked() ), this, SLOT( openChat() ) );
connect( sendmsgButton, SIGNAL( clicked() ), this, SLOT( sendMsg() ) );
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem()));
//connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem()));
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe)
return;
updateItem();
}
, this );
}, mEventHandlerId, RsEventType::FRIEND_LIST );
avatar->setId(ChatId(mPeerId));// TODO: remove unnecesary converstation
@ -68,6 +85,10 @@ PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId,
updateItem();
}
PeerItem::~PeerItem()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
}
uint64_t PeerItem::uniqueIdentifier() const
{
return hash_64bits("PeerItem " + mPeerId.toStdString() + " " + QString::number(mType).toStdString()) ;

View file

@ -40,6 +40,7 @@ class PeerItem : public FeedItem, private Ui::PeerItem
public:
/** Default Constructor */
PeerItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, uint32_t type, bool isHome);
virtual ~PeerItem();
void updateItemStatic();
@ -66,6 +67,7 @@ private:
RsPeerId mPeerId;
uint32_t mType;
bool mIsHome;
RsEventsHandlerId_t mEventHandlerId ;
};
#endif

View file

@ -33,6 +33,7 @@
#include "gui/connect/ConnectFriendWizard.h"
#include "gui/common/AvatarDefs.h"
#include "util/DateTime.h"
#include "util/qtthreadsutils.h"
#include "gui/notifyqt.h"
@ -72,7 +73,23 @@ SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &g
connect( peerDetailsButton, SIGNAL(clicked()), this, SLOT(peerDetails()));
connect( friendRequesttoolButton, SIGNAL(clicked()), this, SLOT(friendRequest()));
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem()));
//connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem()));
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=]()
{
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe)
return;
updateItem();
}
, this );
}, mEventHandlerId, RsEventType::FRIEND_LIST );
avatar->setId(ChatId(mSslId));
@ -82,6 +99,10 @@ SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &g
updateItem();
}
SecurityItem::~SecurityItem()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
}
uint64_t SecurityItem::uniqueIdentifier() const
{
return hash_64bits("SecurityItem " + QString::number(mType).toStdString() + " " + mSslId.toStdString());

View file

@ -39,6 +39,7 @@ class SecurityItem : public FeedItem, private Ui::SecurityItem
public:
/** Default Constructor */
SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &gpgId, const RsPeerId &sslId, const std::string &sslCn, const std::string& ip_addr,uint32_t type, bool isHome);
~SecurityItem();
void updateItemStatic();
@ -67,6 +68,8 @@ private:
std::string mIP;
uint32_t mType;
bool mIsHome;
RsEventsHandlerId_t mEventHandlerId;
};
#endif

View file

@ -53,7 +53,7 @@ RsGxsChannelPostsModel::RsGxsChannelPostsModel(QObject *parent)
RsGxsChannelPostsModel::~RsGxsChannelPostsModel()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
// rsEvents->unregisterEventsHandler(mEventHandlerId);
}
void RsGxsChannelPostsModel::setMode(TreeMode mode)

View file

@ -256,6 +256,6 @@ private:
QColor mTextColorNotSubscribed ;
QColor mTextColorMissing ;
RsEventsHandlerId_t mEventHandlerId ;
//RsEventsHandlerId_t mEventHandlerId ;
friend class const_iterator;
};

View file

@ -32,6 +32,7 @@
#include "IMHistoryItemDelegate.h"
#include "IMHistoryItemPainter.h"
#include "util/HandleRichText.h"
#include "util/qtthreadsutils.h"
#include "gui/common/FilesDefs.h"
#include "rshare.h"
@ -101,7 +102,7 @@ ImHistoryBrowser::ImHistoryBrowser(const ChatId &chatId, QTextEdit *edit,const Q
m_chatId = chatId;
textEdit = edit;
connect(NotifyQt::getInstance(), SIGNAL(historyChanged(uint, int)), this, SLOT(historyChanged(uint, int)));
//connect(NotifyQt::getInstance(), SIGNAL(historyChanged(uint, int)), this, SLOT(historyChanged(uint, int)));
connect(ui.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterChanged(QString)));
@ -138,6 +139,22 @@ ImHistoryBrowser::ImHistoryBrowser(const ChatId &chatId, QTextEdit *edit,const Q
connect(m_createThread, SIGNAL(finished()), this, SLOT(createThreadFinished()));
connect(m_createThread, SIGNAL(progress(int,int)), this, SLOT(createThreadProgress(int,int)));
m_createThread->start();
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event)
{
RsQThreadUtils::postToObject([=](){
auto ev = dynamic_cast<const RsChatServiceEvent*>(event.get());
if(!ev)
return;
if(ev->mEventCode == RsChatServiceEventCode::CHAT_HISTORY_CHANGED)
historyChanged(ev->mMsgHistoryId,ev->mHistoryChangeType);
}, this );
}, mEventHandlerId, RsEventType::CHAT_SERVICE );
}
ImHistoryBrowser::~ImHistoryBrowser()

View file

@ -86,6 +86,7 @@ private:
/** Qt Designer generated object */
Ui::ImHistoryBrowser ui;
RsEventsHandlerId_t mEventHandlerId;
};
class ImHistoryBrowserCreateItemsThread : public QThread

View file

@ -66,6 +66,7 @@
#include "util/misc.h"
#include "util/DateTime.h"
#include "util/HandleRichText.h"
#include "util/qtthreadsutils.h"
#include "util/RsQtVersion.h"
#include "textformat.h"
#include "TagsMenu.h"
@ -215,7 +216,21 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags)
connect(ui.addBccButton, SIGNAL(clicked()), this, SLOT(addBcc()));
connect(ui.addRecommendButton, SIGNAL(clicked()), this, SLOT(addRecommend()));
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(peerStatusChanged(QString,int)));
//connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(peerStatusChanged(QString,int)));
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> e)
{
RsQThreadUtils::postToObject([=](){
auto fe = dynamic_cast<const RsFriendListEvent*>(e.get());
if(!fe || fe->mEventCode != RsFriendListEventCode::NODE_STATUS_CHANGED)
return;
peerStatusChanged(QString::fromStdString(fe->mSslId.toStdString()),fe->mStatus);
}, this );
},mEventHandlerId,RsEventType::FRIEND_LIST);
connect(ui.friendSelectionWidget, SIGNAL(contentChanged()), this, SLOT(buildCompleter()));
connect(ui.friendSelectionWidget, SIGNAL(doubleClicked(int,QString)), this, SLOT(addTo()));
connect(ui.friendSelectionWidget, SIGNAL(itemSelectionChanged()), this, SLOT(friendSelectionChanged()));
@ -421,6 +436,7 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags)
MessageComposer::~MessageComposer()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
delete(m_compareRole);
}
@ -812,7 +828,7 @@ void MessageComposer::buildCompleter()
setNewCompleter(ui.recipientWidget, m_completer);
}
void MessageComposer::peerStatusChanged(const QString& peer_id, int status)
void MessageComposer::peerStatusChanged(const QString& peer_id, RsStatusValue status)
{
int rowCount = ui.recipientWidget->rowCount();
int row;

View file

@ -157,7 +157,7 @@ private slots:
void editingRecipientFinished();
void contactDetails();
void peerStatusChanged(const QString& peer_id, int status);
void peerStatusChanged(const QString& peer_id, RsStatusValue status);
void friendSelectionChanged();
void tagAboutToShow();
@ -274,6 +274,7 @@ private:
Ui::MessageComposer ui;
std::list<FileInfo> _recList ;
RsEventsHandlerId_t mEventHandlerId;
};
#endif

View file

@ -97,12 +97,7 @@ void MessageUserNotify::handleEvent_main_thread(std::shared_ptr<const RsEvent> e
switch (fe->mMailStatusEventCode)
{
case RsMailStatusEventCode::NEW_MESSAGE:
for (it = fe->mChangedMsgIds.begin(); it != fe->mChangedMsgIds.end(); ++it) {
MessageInfo msgInfo;
if (rsMail->getMessage(*it, msgInfo)) {
NotifyQt::getInstance()->addToaster(RS_POPUP_MSG, msgInfo.msgId.c_str(), msgInfo.title.c_str(), msgInfo.msg.c_str() );
}
}
updateIcon();
break;
case RsMailStatusEventCode::MESSAGE_CHANGED:

View file

@ -25,7 +25,9 @@
#include <retroshare/rsnotify.h>
#include <retroshare/rspeers.h>
#include <retroshare/rsidentity.h>
#include <retroshare/rsmsgs.h>
#include <util/rsdir.h>
#include <util/qtthreadsutils.h>
#include <retroshare-gui/RsAutoUpdatePage.h>
@ -102,21 +104,31 @@ NotifyQt::NotifyQt() : cDialog(NULL)
_enabled = false ;
}
#warning TODO: do we need a timer anymore??
// Catch all events that require toasters and
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject([=](){ handleIncomingEvent(event); }, this ); }, mEventHandlerId); // No event type means we expect to catch all possible events
#ifdef TO_REMOVE
// register to allow sending over Qt::QueuedConnection
qRegisterMetaType<ChatId>("ChatId");
qRegisterMetaType<ChatMessage>("ChatMessage");
qRegisterMetaType<RsGxsChanges>("RsGxsChanges");
qRegisterMetaType<RsGxsId>("RsGxsId");
#endif
}
#ifdef TO_REMOVE
void NotifyQt::notifyErrorMsg(int list, int type, std::string msg)
{
{
QMutexLocker m(&_mutex) ;
if(!_enabled)
return ;
}
emit errorOccurred(list,type,QString::fromUtf8(msg.c_str())) ;
{
QMutexLocker m(&_mutex) ;
if(!_enabled)
return ;
}
emit errorOccurred(list,type,QString::fromUtf8(msg.c_str())) ;
}
void NotifyQt::notifyChatMessage(const ChatMessage &msg)
@ -146,6 +158,7 @@ void NotifyQt::notifyOwnAvatarChanged()
#endif
emit ownAvatarChanged() ;
}
#endif
class SignatureEventData
{
@ -305,6 +318,7 @@ bool NotifyQt::askForPluginConfirmation(const std::string& plugin_file_name, con
return false;
}
#ifdef TO_REMOVE
void NotifyQt::notifyDiscInfoChanged()
{
{
@ -477,12 +491,11 @@ void NotifyQt::notifyChatCleared(const ChatId& chat_id)
emit chatCleared(chat_id);
}
void NotifyQt::notifyTurtleSearchResult(uint32_t /*search_id*/,const std::list<TurtleGxsInfo>& /*found_groups*/)
{
std::cerr << "(EE) missing code to handle GXS turtle search result." << std::endl;
}
//void NotifyQt::notifyTurtleSearchResult(uint32_t /*search_id*/,const std::list<TurtleGxsInfo>& /*found_groups*/)
//{
// std::cerr << "(EE) missing code to handle GXS turtle search result." << std::endl;
//}
#ifdef TO_REMOVE
// Mai 2023: distant turtle search now uses RsEvents.
void NotifyQt::notifyTurtleSearchResult(const RsPeerId& pid,uint32_t search_id,const std::list<TurtleFileInfo>& files)
{
@ -509,7 +522,6 @@ void NotifyQt::notifyTurtleSearchResult(const RsPeerId& pid,uint32_t search_id,c
emit gotTurtleSearchResult(search_id,det) ;
}
}
#endif
void NotifyQt::notifyHistoryChanged(uint32_t msgId, int type)
{
@ -534,7 +546,7 @@ void NotifyQt::notifyListChange(int list, int type)
#endif
switch(list)
{
case NOTIFY_LIST_NEIGHBOURS:
case NOTIFY_LIST_NEIGHBOURS:
#ifdef NOTIFY_DEBUG
std::cerr << "received neighbours changed" << std::endl ;
#endif
@ -552,36 +564,36 @@ void NotifyQt::notifyListChange(int list, int type)
#endif
emit filesPostModChanged(true) ; /* Local */
break;
case NOTIFY_LIST_CHAT_LOBBY_INVITATION:
#ifdef NOTIFY_DEBUG
std::cerr << "received files changed" << std::endl ;
#endif
emit chatLobbyInviteReceived() ; /* Local */
break;
case NOTIFY_LIST_DIRLIST_FRIENDS:
#ifdef NOTIFY_DEBUG
std::cerr << "received files changed" << std::endl ;
#endif
emit filesPostModChanged(false) ; /* Local */
break;
case NOTIFY_LIST_SEARCHLIST:
break;
case NOTIFY_LIST_CHANNELLIST:
break;
case NOTIFY_LIST_TRANSFERLIST:
case NOTIFY_LIST_CHAT_LOBBY_INVITATION:
#ifdef NOTIFY_DEBUG
std::cerr << "received transfer changed" << std::endl ;
std::cerr << "received files changed" << std::endl ;
#endif
emit transfersChanged() ;
break;
case NOTIFY_LIST_CONFIG:
emit chatLobbyInviteReceived() ; /* Local */
break;
case NOTIFY_LIST_CONFIG:
#ifdef NOTIFY_DEBUG
std::cerr << "received config changed" << std::endl ;
#endif
emit configChanged() ;
break ;
#ifdef REMOVE
case NOTIFY_LIST_SEARCHLIST:
break;
case NOTIFY_LIST_CHANNELLIST:
break;
case NOTIFY_LIST_TRANSFERLIST:
#ifdef NOTIFY_DEBUG
std::cerr << "received transfer changed" << std::endl ;
#endif
emit transfersChanged() ;
break;
case NOTIFY_LIST_FORUMLIST_LOCKED:
#ifdef NOTIFY_DEBUG
std::cerr << "received forum msg changed" << std::endl ;
@ -607,7 +619,6 @@ void NotifyQt::notifyListChange(int list, int type)
#endif
emit privateChatChanged(list, type);
break;
#endif
case NOTIFY_LIST_CHAT_LOBBY_LIST:
#ifdef NOTIFY_DEBUG
@ -615,7 +626,6 @@ void NotifyQt::notifyListChange(int list, int type)
#endif
emit lobbyListChanged();
break;
case NOTIFY_LIST_GROUPLIST:
#ifdef NOTIFY_DEBUG
std::cerr << "received groups changed" << std::endl ;
@ -652,7 +662,7 @@ void NotifyQt::notifyListPreChange(int list, int /*type*/)
case NOTIFY_LIST_DIRLIST_LOCAL:
emit filesPreModChanged(true) ; /* local */
break;
case NOTIFY_LIST_SEARCHLIST:
case NOTIFY_LIST_SEARCHLIST:
break;
case NOTIFY_LIST_CHANNELLIST:
break;
@ -663,6 +673,7 @@ void NotifyQt::notifyListPreChange(int list, int /*type*/)
}
return;
}
#endif
void NotifyQt::enable()
{
@ -671,22 +682,13 @@ void NotifyQt::enable()
_enabled = true ;
}
void NotifyQt::UpdateGUI()
void NotifyQt::handleIncomingEvent(std::shared_ptr<const RsEvent> event)
{
if(RsAutoUpdatePage::eventsLocked())
return ;
{
QMutexLocker m(&_mutex) ;
if(!_enabled)
return ;
}
static bool already_updated = false ; // these only update once at start because they may already have been set before
// the gui is running, then they get updated by callbacks.
#warning Is this needed anymore??
if(!already_updated)
{
emit neighboursChanged();
emit configChanged();
already_updated = true ;
@ -694,177 +696,197 @@ void NotifyQt::UpdateGUI()
/* Finally Check for PopupMessages / System Error Messages */
if (rsNotify)
{
uint32_t sysid;
uint32_t type;
std::string title, id, msg;
uint popupflags = Settings->getNotifyFlags();
/* You can set timeToShow, timeToLive and timeToHide or can leave the standard */
ToasterItem *toaster = NULL;
if (rsNotify->NotifyPopupMessage(type, id, title, msg))
{
uint popupflags = Settings->getNotifyFlags();
auto insertToaster = [this](ToasterItem *toaster) {
switch(type)
{
case RS_POPUP_ENCRYPTED_MSG:
SoundManager::play(SOUND_MESSAGE_ARRIVED);
/* init attributes */
toaster->widget->setWindowFlags(Qt::ToolTip | Qt::WindowStaysOnTopHint);
if ((popupflags & RS_POPUP_MSG) && !_disableAllToaster)
{
toaster = new ToasterItem(new MessageToaster("", tr("Encrypted message"), QString("[%1]").arg(tr("Encrypted message"))));
}
break;
case RS_POPUP_MSG:
SoundManager::play(SOUND_MESSAGE_ARRIVED);
/* add toaster to waiting list */
waitingToasterList.push_back(toaster);
};
if ((popupflags & RS_POPUP_MSG) && !_disableAllToaster)
{
toaster = new ToasterItem(new MessageToaster(id, QString::fromUtf8(title.c_str()), QString::fromUtf8(msg.c_str())));
}
break;
case RS_POPUP_CONNECT:
SoundManager::play(SOUND_USER_ONLINE);
// check for all possibly handled events
if ((popupflags & RS_POPUP_CONNECT) && !_disableAllToaster)
{
toaster = new ToasterItem(new OnlineToaster(RsPeerId(id)));
}
break;
case RS_POPUP_DOWNLOAD:
SoundManager::play(SOUND_DOWNLOAD_COMPLETE);
auto ev1 = dynamic_cast<const RsMailStatusEvent*>(event.get());
if ((popupflags & RS_POPUP_DOWNLOAD) && !_disableAllToaster)
{
/* id = file hash */
toaster = new ToasterItem(new DownloadToaster(RsFileHash(id), QString::fromUtf8(title.c_str())));
}
break;
case RS_POPUP_CHAT:
if ((popupflags & RS_POPUP_CHAT) && !_disableAllToaster)
{
// TODO: fix for distant chat, look up if dstant chat uses RS_POPUP_CHAT
ChatDialog *chatDialog = ChatDialog::getChat(ChatId(RsPeerId(id)));
ChatWidget *chatWidget;
if (chatDialog && (chatWidget = chatDialog->getChatWidget()) && chatWidget->isActive()) {
// do not show when active
break;
}
toaster = new ToasterItem(new ChatToaster(RsPeerId(id), QString::fromUtf8(msg.c_str())));
}
break;
case RS_POPUP_GROUPCHAT:
if(ev1)
{
if(ev1->mMailStatusEventCode == RsMailStatusEventCode::NEW_MESSAGE)
{
SoundManager::play(SOUND_MESSAGE_ARRIVED);
if((popupflags & RS_POPUP_MSG) && !_disableAllToaster)
{
for(auto msgid:ev1->mChangedMsgIds)
{
Rs::Msgs::MessageInfo msgInfo;
if(rsMsgs->getMessage(msgid, msgInfo))
insertToaster(new ToasterItem(new MessageToaster(msgInfo.from.toStdString(), QString::fromUtf8(msgInfo.title.c_str()), QString::fromUtf8(msgInfo.msg.c_str()))));
}
}
}
return;
}
auto ev2 = dynamic_cast<const RsFriendListEvent*>(event.get());
if(ev2)
{
if(ev2->mEventCode == RsFriendListEventCode::NODE_CONNECTED)
{
SoundManager::play(SOUND_USER_ONLINE);
if ((popupflags & RS_POPUP_CONNECT) && !_disableAllToaster)
insertToaster(new ToasterItem(new OnlineToaster(ev2->mSslId)));
}
return;
}
auto ev3 = dynamic_cast<const RsFileTransferEvent*>(event.get());
if(ev3)
{
if(ev3->mFileTransferEventCode == RsFileTransferEventCode::DOWNLOAD_COMPLETE)
{
SoundManager::play(SOUND_DOWNLOAD_COMPLETE);
if ((popupflags & RS_POPUP_DOWNLOAD) && !_disableAllToaster)
insertToaster(new ToasterItem(new DownloadToaster(ev3->mHash)));
}
return;
}
auto ev4 = dynamic_cast<const RsAuthSslConnectionAutenticationEvent*>(event.get());
if(ev4)
{
if(ev4->mErrorCode == RsAuthSslError::NOT_A_FRIEND)
{
if ((popupflags & RS_POPUP_CONNECT_ATTEMPT) && !_disableAllToaster)
// id = gpgid
// title = ssl name
// msg = peer id
insertToaster(new ToasterItem(new FriendRequestToaster(ev4->mPgpId, ev4->mSslId)));
}
return;
}
// Probably an old thing. To be removed.
// case RS_POPUP_ENCRYPTED_MSG:
// SoundManager::play(SOUND_MESSAGE_ARRIVED);
//
// if ((popupflags & RS_POPUP_MSG) && !_disableAllToaster)
// {
// toaster = new ToasterItem(new MessageToaster("", tr("Encrypted message"), QString("[%1]").arg(tr("Encrypted message"))));
// }
// break;
auto ev5 = dynamic_cast<const RsChatServiceEvent*>(event.get());
if(ev5)
{
// This code below should be simplified. In particular GroupChatToaster, ChatToaster and ChatLobbyToaster should be only one class.
if(ev5->mEventCode == RsChatServiceEventCode::CHAT_MESSAGE_RECEIVED)
{
if (ev5->mCid.isPeerId() && (popupflags & RS_POPUP_CHAT) && !_disableAllToaster)
{
// TODO: fix for distant chat, look up if dstant chat uses RS_POPUP_CHAT
ChatDialog *chatDialog = ChatDialog::getChat(ev5->mCid);
ChatWidget *chatWidget;
if (chatDialog && (chatWidget = chatDialog->getChatWidget()) && chatWidget->isActive()) // do not show when active
return;
insertToaster(new ToasterItem(new ChatToaster(ev5->mCid.toPeerId(), QString::fromUtf8(ev5->mMsg.msg.c_str()))));
}
#ifdef RS_DIRECT_CHAT
if ((popupflags & RS_POPUP_GROUPCHAT) && !_disableAllToaster)
{
MainWindow *mainWindow = MainWindow::getInstance();
if (mainWindow && mainWindow->isActiveWindow() && !mainWindow->isMinimized()) {
if (MainWindow::getActivatePage() == MainWindow::Friends) {
if (FriendsDialog::isGroupChatActive()) {
// do not show when active
break;
}
}
}
toaster = new ToasterItem(new GroupChatToaster(RsPeerId(id), QString::fromUtf8(msg.c_str())));
}
#endif // RS_DIRECT_CHAT
break;
case RS_POPUP_CHATLOBBY:
if ((popupflags & RS_POPUP_CHATLOBBY) && !_disableAllToaster)
{
ChatId chat_id(id);
else if (ev5->mCid.isBroadcast() && (popupflags & RS_POPUP_GROUPCHAT) && !_disableAllToaster)
{
MainWindow *mainWindow = MainWindow::getInstance();
if (mainWindow && mainWindow->isActiveWindow() && !mainWindow->isMinimized()
&& (MainWindow::getActivatePage() == MainWindow::Friends) && (FriendsDialog::isGroupChatActive()))
return;
ChatDialog *chatDialog = ChatDialog::getChat(chat_id);
ChatWidget *chatWidget;
if (chatDialog && (chatWidget = chatDialog->getChatWidget()) && chatWidget->isActive()) {
// do not show when active
break;
}
ChatLobbyDialog *chatLobbyDialog = dynamic_cast<ChatLobbyDialog*>(chatDialog);
insertToaster(new ToasterItem(new GroupChatToaster(ev5->mCid.toPeerId(), QString::fromUtf8(ev5->mMsg.msg.c_str()))));
}
#endif
else if (ev5->mCid.isLobbyId() && (popupflags & RS_POPUP_CHATLOBBY) && !_disableAllToaster)
{
ChatDialog *chatDialog = ChatDialog::getChat(ev5->mCid);
ChatWidget *chatWidget;
RsGxsId sender(title);
if (!chatLobbyDialog || chatLobbyDialog->isParticipantMuted(sender))
break; // participant is muted
if (chatDialog && (chatWidget = chatDialog->getChatWidget()) && chatWidget->isActive())
return;
toaster = new ToasterItem(new ChatLobbyToaster(chat_id.toLobbyId(), sender, QString::fromUtf8(msg.c_str())));
}
break;
case RS_POPUP_CONNECT_ATTEMPT:
if ((popupflags & RS_POPUP_CONNECT_ATTEMPT) && !_disableAllToaster)
{
// id = gpgid
// title = ssl name
// msg = peer id
toaster = new ToasterItem(new FriendRequestToaster(RsPgpId(id), QString::fromUtf8(title.c_str()), RsPeerId(msg)));
}
break;
}
}
ChatLobbyDialog *chatLobbyDialog = dynamic_cast<ChatLobbyDialog*>(chatDialog);
/*Now check Plugins*/
if (!toaster) {
int pluginCount = rsPlugins->nbPlugins();
for (int i = 0; i < pluginCount; ++i) {
RsPlugin *rsPlugin = rsPlugins->plugin(i);
if (rsPlugin) {
ToasterNotify *toasterNotify = rsPlugin->qt_toasterNotify();
if (toasterNotify) {
toaster = toasterNotify->toasterItem();
continue;
}
}
}
}
if (!chatLobbyDialog || chatLobbyDialog->isParticipantMuted(ev5->mMsg.lobby_peer_gxs_id))
return;
if (toaster) {
/* init attributes */
toaster->widget->setWindowFlags(Qt::ToolTip | Qt::WindowStaysOnTopHint);
insertToaster(new ToasterItem(new ChatLobbyToaster(ev5->mCid.toLobbyId(), ev5->mMsg.lobby_peer_gxs_id, QString::fromUtf8(ev5->mMsg.msg.c_str()))));
}
else
return;
}
/* add toaster to waiting list */
//QMutexLocker lock(&waitingToasterMutex);
waitingToasterList.push_back(toaster);
}
return;
}
if (rsNotify->NotifySysMessage(sysid, type, title, msg))
{
/* make a warning message */
switch(type)
{
case RS_SYS_ERROR:
QMessageBox::critical(MainWindow::getInstance(),
QString::fromUtf8(title.c_str()),
QString::fromUtf8(msg.c_str()));
break;
case RS_SYS_WARNING:
QMessageBox::warning(MainWindow::getInstance(),
QString::fromUtf8(title.c_str()),
QString::fromUtf8(msg.c_str()));
break;
default:
case RS_SYS_INFO:
QMessageBox::information(MainWindow::getInstance(),
QString::fromUtf8(title.c_str()),
QString::fromUtf8(msg.c_str()));
break;
}
}
auto ev6 = dynamic_cast<const RsSystemErrorEvent*>(event.get());
if (rsNotify->NotifyLogMessage(sysid, type, title, msg))
{
/* make a log message */
std::string logMesString = title + " " + msg;
switch(type)
{
case RS_SYS_ERROR:
case RS_SYS_WARNING:
case RS_SYS_INFO:
emit logInfoChanged(QString::fromUtf8(logMesString.c_str()));
}
}
}
if(ev6)
{
switch(ev6->mEventCode)
{
case RsSystemErrorEventCode::TIME_SHIFT_PROBLEM:
displayErrorMessage(RS_SYS_WARNING,tr("System time mismatch"),tr("Time shift problem notification. Make sure your machine is on time, because it will break chat rooms."));
break;
case RsSystemErrorEventCode::DISK_SPACE_ERROR:
displayDiskSpaceWarning(ev6->mDiskErrorLocation,ev6->mDiskErrorSizeLimit);
break;
case RsSystemErrorEventCode::DATA_STREAMING_ERROR:
case RsSystemErrorEventCode::GENERAL_ERROR:
displayErrorMessage(RS_SYS_WARNING,tr("Internal error"),QString::fromUtf8(ev6->mErrorMsg.c_str()));
break;
default: break;
}
return;
};
/*Now check Plugins*/
int pluginCount = rsPlugins->nbPlugins();
for (int i = 0; i < pluginCount; ++i) {
RsPlugin *rsPlugin = rsPlugins->plugin(i);
if (rsPlugin) {
ToasterNotify *toasterNotify = rsPlugin->qt_toasterNotify();
if (toasterNotify) {
insertToaster(toasterNotify->toasterItem());
continue;
}
}
}
// if (rsNotify->NotifyLogMessage(sysid, type, title, msg))
// {
// /* make a log message */
// std::string logMesString = title + " " + msg;
// switch(type)
// {
// case RS_SYS_ERROR:
// case RS_SYS_WARNING:
// case RS_SYS_INFO:
// emit logInfoChanged(QString::fromUtf8(logMesString.c_str()));
// }
// }
// }
/* Now start the waiting toasters */
startWaitingToasters();
}
@ -898,7 +920,7 @@ void NotifyQt::testToasters(uint notifyFlags, /*RshareSettings::enumToasterPosit
toaster = new ToasterItem(new OnlineToaster(id));
break;
case RS_POPUP_DOWNLOAD:
toaster = new ToasterItem(new DownloadToaster(RsFileHash::random(), title));
toaster = new ToasterItem(new DownloadToaster(RsFileHash::random()));
break;
case RS_POPUP_CHAT:
toaster = new ToasterItem(new ChatToaster(id, message));
@ -917,7 +939,7 @@ void NotifyQt::testToasters(uint notifyFlags, /*RshareSettings::enumToasterPosit
break;
}
case RS_POPUP_CONNECT_ATTEMPT:
toaster = new ToasterItem(new FriendRequestToaster(pgpid, title, id));
toaster = new ToasterItem(new FriendRequestToaster(pgpid, id));
break;
}
@ -1164,6 +1186,7 @@ void NotifyQt::runningTick()
}
}
#ifdef TO_REMOVE
void NotifyQt::addToaster(uint notifyFlags, const std::string& id, const std::string& title, const std::string& msg)
{
uint pos = 0;
@ -1208,7 +1231,7 @@ void NotifyQt::addToaster(uint notifyFlags, const std::string& id, const std::st
if ((popupflags & RS_POPUP_DOWNLOAD) && !_disableAllToaster)
{
toaster = new ToasterItem(new DownloadToaster(RsFileHash(id), QString::fromUtf8(title.c_str())));
toaster = new ToasterItem(new DownloadToaster(RsFileHash(id)));
}
break;
case RS_POPUP_CHAT:
@ -1223,6 +1246,7 @@ void NotifyQt::addToaster(uint notifyFlags, const std::string& id, const std::st
}
toaster = new ToasterItem(new ChatToaster(RsPeerId(id), QString::fromUtf8(msg.c_str())));
}
break;
case RS_POPUP_GROUPCHAT:
#ifdef RS_DIRECT_CHAT
if ((popupflags & RS_POPUP_GROUPCHAT) && !_disableAllToaster)
@ -1284,3 +1308,46 @@ void NotifyQt::addToaster(uint notifyFlags, const std::string& id, const std::st
/* Now start the waiting toasters */
startWaitingToasters();
}
#endif
void NotifyQt::displayErrorMessage(int type,const QString& title,const QString& error_msg)
{
/* make a warning message */
switch(type)
{
case RS_SYS_ERROR: QMessageBox::critical(MainWindow::getInstance(),title,error_msg);
break;
case RS_SYS_WARNING: QMessageBox::warning(MainWindow::getInstance(),title,error_msg);
break;
case RS_SYS_INFO: QMessageBox::information(MainWindow::getInstance(),title,error_msg);
break;
default: std::cerr << "Warning: unhandled system error type " << type << std::endl;
break;
}
}
void NotifyQt::displayDiskSpaceWarning(int loc,int size_limit_mb)
{
QString locString ;
switch(loc)
{
case RS_PARTIALS_DIRECTORY: locString = "Partials" ;
break ;
case RS_CONFIG_DIRECTORY: locString = "Config" ;
break ;
case RS_DOWNLOAD_DIRECTORY: locString = "Download" ;
break ;
default:
std::cerr << "Error: " << __PRETTY_FUNCTION__ << " was called with an unknown parameter loc=" << loc << std::endl ;
return ;
}
QMessageBox::critical(NULL,tr("Low disk space warning"),
tr("The disk space in your")+" "+locString +" "+tr("directory is running low (current limit is")+" "+QString::number(size_limit_mb)+tr("MB). \n\n RetroShare will now safely suspend any disk access to this directory. \n\n Please make some free space and click Ok.")) ;
}

View file

@ -58,34 +58,34 @@ class NotifyQt: public QObject, public NotifyClient
virtual ~NotifyQt() = default;
void setNetworkDialog(NetworkDialog *c) { cDialog = c; }
// void setNetworkDialog(NetworkDialog *c) { cDialog = c; }
virtual void notifyListPreChange(int list, int type);
virtual void notifyListChange(int list, int type);
virtual void notifyErrorMsg(int list, int sev, std::string msg);
virtual void notifyChatMessage(const ChatMessage& /* msg */);
virtual void notifyChatStatus(const ChatId &chat_id,const std::string& status_string);
virtual void notifyChatCleared(const ChatId &chat_id);
virtual void notifyCustomState(const std::string& peer_id, const std::string& status_string);
#ifdef TO_REMOVE
virtual void notifyTurtleSearchResult(const RsPeerId &pid, uint32_t search_id, const std::list<TurtleFileInfo>& found_files);
#endif
virtual void notifyTurtleSearchResult(uint32_t search_id,const std::list<TurtleGxsInfo>& found_groups);
virtual void notifyPeerHasNewAvatar(std::string peer_id) ;
virtual void notifyOwnAvatarChanged() ;
virtual void notifyChatLobbyEvent(uint64_t /* lobby id */, uint32_t /* event type */, const RsGxsId & /*nickname*/, const std::string& /* any string */) ;
virtual void notifyChatLobbyTimeShift(int time_shift) ;
// virtual void notifyListPreChange(int list, int type);
// virtual void notifyListChange(int list, int type);
// virtual void notifyErrorMsg(int list, int sev, std::string msg);
// virtual void notifyChatMessage(const ChatMessage& /* msg */);
// virtual void notifyChatStatus(const ChatId &chat_id,const std::string& status_string);
// virtual void notifyChatCleared(const ChatId &chat_id);
// virtual void notifyCustomState(const std::string& peer_id, const std::string& status_string);
//#ifdef TO_REMOVE
// virtual void notifyTurtleSearchResult(const RsPeerId &pid, uint32_t search_id, const std::list<TurtleFileInfo>& found_files);
//#endif
// virtual void notifyTurtleSearchResult(uint32_t search_id,const std::list<TurtleGxsInfo>& found_groups);
// virtual void notifyPeerHasNewAvatar(std::string peer_id) ;
// virtual void notifyOwnAvatarChanged() ;
// virtual void notifyChatLobbyEvent(uint64_t /* lobby id */, uint32_t /* event type */, const RsGxsId & /*nickname*/, const std::string& /* any string */) ;
// virtual void notifyChatLobbyTimeShift(int time_shift) ;
virtual void notifyOwnStatusMessageChanged() ;
virtual void notifyDiskFull(uint32_t loc,uint32_t size_in_mb) ;
// virtual void notifyOwnStatusMessageChanged() ;
// virtual void notifyDiskFull(uint32_t loc,uint32_t size_in_mb) ;
/* peer has changed the state */
virtual void notifyPeerStatusChanged(const std::string& peer_id, uint32_t state);
// virtual void notifyPeerStatusChanged(const std::string& peer_id, uint32_t state);
/* one or more peers has changed the states */
virtual void notifyPeerStatusChangedSummary();
// virtual void notifyPeerStatusChangedSummary();
virtual void notifyHistoryChanged(uint32_t msgId, int type);
// virtual void notifyHistoryChanged(uint32_t msgId, int type);
virtual void notifyDiscInfoChanged() ;
// virtual void notifyDiscInfoChanged() ;
virtual bool askForPassword(const std::string& title, const std::string& key_details, bool prev_is_bad, std::string& password, bool &cancelled);
virtual bool askForPluginConfirmation(const std::string& plugin_filename, const std::string& plugin_file_hash,bool first_time);
@ -96,42 +96,43 @@ class NotifyQt: public QObject, public NotifyClient
void testToasters(uint notifyFlags, /*RshareSettings::enumToasterPosition*/ int position, QPoint margin);
void testToaster(ToasterNotify *toasterNotify, /*RshareSettings::enumToasterPosition*/ int position, QPoint margin);
void testToaster(QString tag, ToasterNotify *toasterNotify, /*RshareSettings::enumToasterPosition*/ int position, QPoint margin);
#ifdef TO_REMOVE
void addToaster(uint notifyFlags, const std::string& id, const std::string& title, const std::string& msg);
#endif
void notifySettingsChanged();
signals:
// It's beneficial to send info to the GUI using signals, because signals are thread-safe
// as they get queued by Qt.
//
void hashingInfoChanged(const QString&) const ;
void filesPreModChanged(bool) const ;
void filesPostModChanged(bool) const ;
void transfersChanged() const ;
void friendsChanged() const ;
void lobbyListChanged() const ;
void chatLobbyEvent(qulonglong,int,const RsGxsId&,const QString&) ;
void neighboursChanged() const ;
// void hashingInfoChanged(const QString&) const ;
// void filesPreModChanged(bool) const ;
// void filesPostModChanged(bool) const ;
// void transfersChanged() const ;
// void friendsChanged() const ;
// void lobbyListChanged() const ;
// void chatLobbyEvent(qulonglong,int,const RsGxsId&,const QString&) ;
// void neighboursChanged() const ;
void configChanged() const ;
void logInfoChanged(const QString&) const ;
void chatStatusChanged(const ChatId&,const QString&) const ;
// void chatStatusChanged(const ChatId&,const QString&) const ;
void chatCleared(const ChatId&) const ;
void peerHasNewCustomStateString(const QString& /* peer_id */, const QString& /* status_string */) const ;
void peerHasNewAvatar(const QString& peer_id) const ;
void ownAvatarChanged() const ;
void ownStatusMessageChanged() const ;
void errorOccurred(int,int,const QString&) const ;
void diskFull(int,int) const ;
void peerStatusChanged(const QString& /* peer_id */, int /* status */);
void peerStatusChangedSummary() const;
void gxsChange(const RsGxsChanges& /* changes */);
void chatMessageReceived(ChatMessage msg);
void groupsChanged(int type) const ;
void discInfoChanged() const ;
// void peerHasNewCustomStateString(const QString& /* peer_id */, const QString& /* status_string */) const ;
// void peerHasNewAvatar(const QString& peer_id) const ;
// void ownAvatarChanged() const ;
// void ownStatusMessageChanged() const ;
// void errorOccurred(int,int,const QString&) const ;
// void diskFull(int,int) const ;
// void peerStatusChanged(const QString& /* peer_id */, int /* status */);
// void peerStatusChangedSummary() const;
// void gxsChange(const RsGxsChanges& /* changes */);
// void chatMessageReceived(ChatMessage msg);
// void groupsChanged(int type) const ;
// void discInfoChanged() const ;
void historyChanged(uint msgId, int type);
void chatLobbyInviteReceived() ;
void deferredSignatureHandlingRequested() ;
void chatLobbyTimeShift(int time_shift) ;
// void chatLobbyInviteReceived() ;
// void deferredSignatureHandlingRequested() ;
// void chatLobbyTimeShift(int time_shift) ;
void connectionWithoutCert();
/* Notify from GUI */
@ -141,18 +142,20 @@ class NotifyQt: public QObject, public NotifyClient
void disableAllChanged(bool disableAll) const;
public slots:
void UpdateGUI(); /* called by timer */
void SetDisableAll(bool bValue);
private slots:
void runningTick();
void handleSignatureEvent() ;
void handleChatLobbyTimeShift(int) ;
// void handleChatLobbyTimeShift(int) ;
private:
NotifyQt();
static NotifyQt *_instance;
static void displayDiskSpaceWarning(int loc,int size_limit_mb);
static void displayErrorMessage(int type,const QString& title,const QString& error_msg);
static NotifyQt *_instance;
static bool _disableAllToaster;
/* system notifications */
@ -172,6 +175,9 @@ class NotifyQt: public QObject, public NotifyClient
/* so we can update windows */
NetworkDialog *cDialog;
void handleIncomingEvent(std::shared_ptr<const RsEvent> e); /* called by timer */
RsEventsHandlerId_t mEventHandlerId;
};
#endif

View file

@ -85,7 +85,6 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags)
, manager(NULL), mOngoingConnectivityCheck(-1)
, mIsHiddenNode(false), mHiddenType(RS_HIDDEN_TYPE_NONE)
, mSamAccessible(false)
, mEventHandlerId(0)
{
/* Invoke the Qt Designer generated object setup routine */
ui.setupUi(this);
@ -262,10 +261,15 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags)
if (ui.tabWidget->currentIndex() == TAB_HIDDEN_SERVICE)
updateOutProxyIndicator();
mEventHandlerId = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { handleEvent(event); }, mEventHandlerId, RsEventType::NETWORK );
}
ServerPage::~ServerPage()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
}
void ServerPage::handleEvent(std::shared_ptr<const RsEvent> e)
{
if(e->mType != RsEventType::NETWORK)

View file

@ -53,7 +53,7 @@ class ServerPage: public ConfigPage, public autoProxyCallback
public:
ServerPage(QWidget * parent = 0, Qt::WindowFlags flags = Qt::WindowFlags());
~ServerPage() {}
~ServerPage() ;
/** Loads the settings for this page */
virtual void load();

View file

@ -27,9 +27,12 @@
#include "hashingstatus.h"
#include "gui/common/ElidedLabel.h"
#include "util/qtthreadsutils.h"
#include "util/misc.h"
#include "gui/notifyqt.h"
#include "gui/common/FilesDefs.h"
//#define DEBUG_HASHING_STATUS 1
HashingStatus::HashingStatus(QWidget *parent)
: QWidget(parent)
{
@ -60,36 +63,98 @@ HashingStatus::HashingStatus(QWidget *parent)
void HashingStatus::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
{
// Warning: no GUI calls should happen here!
if(event->mType != RsEventType::SHARED_DIRECTORIES)
return;
const RsSharedDirectoriesEvent *fe = dynamic_cast<const RsSharedDirectoriesEvent*>(event.get());
const RsSharedDirectoriesEvent *fe = dynamic_cast<const RsSharedDirectoriesEvent*>(event.get());
if(!fe)
return;
QString info;
switch (fe->mEventCode)
{
default:
case RsSharedDirectoriesEventCode::STARTING_DIRECTORY_SWEEP:
info = tr("Examining shared files...");
break;
case RsSharedDirectoriesEventCode::DIRECTORY_SWEEP_ENDED:
break;
case RsSharedDirectoriesEventCode::HASHING_FILE:
info = tr("Hashing file") + " " + QString::fromUtf8(fe->mMessage.c_str());
break;
break;
case RsSharedDirectoriesEventCode::HASHING_PROCESS_RESUMED:
statusHashing->setText(mLastText); // fallthrough
#ifdef DEBUG_HASHING_STATUS
std::cerr << "HashStatusEventHandler: received event " << (void*)fe->mEventCode << ": " ;
std::cerr << "HASHING RESUMED" << std::endl;
#endif
case RsSharedDirectoriesEventCode::HASHING_PROCESS_STARTED:
{
#ifdef DEBUG_HASHING_STATUS
std::cerr << "HashStatusEventHandler: received event " << (void*)fe->mEventCode << ": " ;
std::cerr << "HASHING STARTED" << std::endl;
#endif
hashloader->show() ;
hashloader->setMovie(movie) ;
movie->start() ;
statusHashing->setVisible(!_compactMode) ;
}
break;
case RsSharedDirectoriesEventCode::HASHING_PROCESS_PAUSED:
{
#ifdef DEBUG_HASHING_STATUS
std::cerr << "HashStatusEventHandler: received event " << (void*)fe->mEventCode << ": " ;
std::cerr << "HASHING PAUSED" << std::endl;
#endif
movie->stop() ;
hashloader->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/images/resume.png")) ;
mLastText = statusHashing->text();
statusHashing->setText(QObject::tr("[Hashing is paused]"));
setToolTip(QObject::tr("Click to resume the hashing process"));
}
break;
case RsSharedDirectoriesEventCode::HASHING_PROCESS_FINISHED:
{
#ifdef DEBUG_HASHING_STATUS
std::cerr << "HashStatusEventHandler: received event " << (void*)fe->mEventCode << ": " ;
std::cerr << "HASHING FINISHED" << std::endl;
#endif
movie->stop() ;
statusHashing->setText(QString());
statusHashing->hide() ;
setToolTip(QString());
hashloader->hide() ;
}
break;
case RsSharedDirectoriesEventCode::HASHING_FILE:
{
QString msg = QString::number((unsigned long int)fe->mHashCounter+1) + "/" + QString::number((unsigned long int)fe->mTotalFilesToHash);
msg += " (" + misc::friendlyUnit(fe->mTotalHashedSize) + " - "
+ QString::number(int(fe->mTotalHashedSize/double(fe->mTotalSizeToHash)*100.0)) + "%"
+ ((fe->mHashingSpeed>0)?("," + QString::number((double)fe->mHashingSpeed,'f',2) + " MB/s)"):(QString()))
+ " : " + QString::fromUtf8(fe->mFilePath.c_str()) ;
statusHashing->setText(tr("Hashing file") + " " + msg);
setToolTip(msg + "\n"+QObject::tr("Click to pause the hashing process"));
#ifdef DEBUG_HASHING_STATUS
std::cerr << "HashStatusEventHandler: received event " << (void*)fe->mEventCode << ": " ;
std::cerr << "HASHING FILE " << msg.toStdString() << std::endl;
#endif
}
break;
case RsSharedDirectoriesEventCode::SAVING_FILE_INDEX:
info = tr("Saving file index...");
break;
}
{
#ifdef DEBUG_HASHING_STATUS
std::cerr << "HashStatusEventHandler: received event " << (void*)fe->mEventCode << ": " ;
std::cerr << "SAVING FILE INDEX" << std::endl;
#endif
statusHashing->setText(tr("Saving file index..."));
}
break;
// GUI calls should only happen in the GUI thread, which is achieved by postToObject().
updateHashingInfo(info);
};
}
HashingStatus::~HashingStatus()
@ -98,47 +163,8 @@ HashingStatus::~HashingStatus()
delete(movie);
}
void HashingStatus::updateHashingInfo(const QString& s)
{
if (s.isEmpty())
{
statusHashing->hide() ;
hashloader->hide() ;
setToolTip(QString());
movie->stop() ;
} else {
setToolTip(s + "\n"+QObject::tr("Click to pause the hashing process"));
if (_compactMode) {
statusHashing->hide() ;
} else {
statusHashing->setText(s) ;
statusHashing->show() ;
}
hashloader->show() ;
movie->start() ;
}
}
void HashingStatus::mousePressEvent(QMouseEvent *)
{
rsFiles->togglePauseHashingProcess() ;
if(rsFiles->hashingProcessPaused())
{
movie->stop() ;
hashloader->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/images/resume.png")) ;
mLastText = statusHashing->text();
statusHashing->setText(QObject::tr("[Hashing is paused]"));
setToolTip(QObject::tr("Click to resume the hashing process"));
}
else
{
hashloader->setMovie(movie) ;
statusHashing->setText(mLastText);
movie->start() ;
}
}

View file

@ -39,7 +39,6 @@ public:
void mousePressEvent(QMouseEvent *);
private:
void updateHashingInfo(const QString& s);
void handleEvent_main_thread(std::shared_ptr<const RsEvent> event);
ElidedLabel *statusHashing;

View file

@ -28,7 +28,7 @@
#include <retroshare/rsfiles.h>
DownloadToaster::DownloadToaster(const RsFileHash &hash, const QString &name) : QWidget(NULL)
DownloadToaster::DownloadToaster(const RsFileHash &hash) : QWidget(NULL)
{
ui.setupUi(this);
@ -38,8 +38,11 @@ DownloadToaster::DownloadToaster(const RsFileHash &hash, const QString &name) :
connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(hide()));
connect(ui.toasterButton, SIGNAL(clicked()), this, SLOT(play()));
FileInfo info;
rsFiles->FileDetails(hash, RS_FILE_HINTS_LOCAL | RS_FILE_HINTS_DOWNLOAD, info ) ;
/* set informations */
ui.textLabel->setText(name);
ui.textLabel->setText(QString::fromStdString(info.fname));
}
void DownloadToaster::play()

View file

@ -30,7 +30,7 @@ class DownloadToaster : public QWidget
Q_OBJECT
public:
DownloadToaster(const RsFileHash &hash, const QString &name);
DownloadToaster(const RsFileHash &hash);
private slots:
void play();

View file

@ -24,8 +24,8 @@
#include <retroshare/rspeers.h>
FriendRequestToaster::FriendRequestToaster(const RsPgpId &gpgId, const QString &sslName, const RsPeerId &peerId)
: QWidget(NULL), mGpgId(gpgId), mSslId(peerId), mSslName(sslName)
FriendRequestToaster::FriendRequestToaster(const RsPgpId &gpgId, const RsPeerId &peerId)
: QWidget(NULL), mGpgId(gpgId), mSslId(peerId)
{
/* Invoke the Qt Designer generated object setup routine */
ui.setupUi(this);
@ -33,7 +33,8 @@ FriendRequestToaster::FriendRequestToaster(const RsPgpId &gpgId, const QString &
bool knownPeer = false;
RsPeerDetails details;
if (rsPeers->getGPGDetails(mGpgId, details)) {
knownPeer = true;
knownPeer = true;
mSslName = QString::fromUtf8(details.name.c_str());
}
if (knownPeer) {
@ -51,7 +52,7 @@ FriendRequestToaster::FriendRequestToaster(const RsPgpId &gpgId, const QString &
ui.textLabel->setText( peerName + " " + tr("wants to be friend with you on RetroShare"));
ui.avatarWidget->setDefaultAvatar(":/images/avatar_request.png");
} else {
ui.textLabel->setText( sslName + " " + tr("Unknown (Incoming) Connect Attempt"));
ui.textLabel->setText( mSslName + " " + tr("Unknown (Incoming) Connect Attempt"));
ui.avatarWidget->setDefaultAvatar(":/images/avatar_request_unknown.png");
}
}

View file

@ -33,7 +33,7 @@ class FriendRequestToaster : public QWidget
Q_OBJECT
public:
FriendRequestToaster(const RsPgpId &gpgId, const QString &sslName, const RsPeerId &peerId);
FriendRequestToaster(const RsPgpId &gpgId, const RsPeerId &peerId);
private slots:
void friendrequestButtonSlot();

View file

@ -726,20 +726,20 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
#ifdef DEBUG
std::cerr << "connecting signals and slots" << std::endl ;
#endif
QObject::connect(notify,SIGNAL(deferredSignatureHandlingRequested()),notify,SLOT(handleSignatureEvent()),Qt::QueuedConnection) ;
QObject::connect(notify,SIGNAL(chatLobbyTimeShift(int)),notify,SLOT(handleChatLobbyTimeShift(int)),Qt::QueuedConnection) ;
QObject::connect(notify,SIGNAL(diskFull(int,int)) ,w ,SLOT(displayDiskSpaceWarning(int,int))) ;
QObject::connect(notify,SIGNAL(filesPostModChanged(bool)) ,w ,SLOT(postModDirectories(bool)) ,Qt::QueuedConnection ) ;
QObject::connect(notify,SIGNAL(transfersChanged()) ,w->transfersDialog ,SLOT(insertTransfers() )) ;
// QObject::connect(notify,SIGNAL(deferredSignatureHandlingRequested()),notify,SLOT(handleSignatureEvent()),Qt::QueuedConnection) ;
// QObject::connect(notify,SIGNAL(chatLobbyTimeShift(int)),notify,SLOT(handleChatLobbyTimeShift(int)),Qt::QueuedConnection) ;
// QObject::connect(notify,SIGNAL(diskFull(int,int)) ,w ,SLOT(displayDiskSpaceWarning(int,int))) ;
// QObject::connect(notify,SIGNAL(filesPostModChanged(bool)) ,w ,SLOT(postModDirectories(bool)) ,Qt::QueuedConnection ) ;
// QObject::connect(notify,SIGNAL(transfersChanged()) ,w->transfersDialog ,SLOT(insertTransfers() )) ;
QObject::connect(notify,SIGNAL(publicChatChanged(int)) ,w->friendsDialog ,SLOT(publicChatChanged(int) ));
QObject::connect(notify,SIGNAL(neighboursChanged()) ,w->friendsDialog->networkDialog ,SLOT(securedUpdateDisplay())) ;
// QObject::connect(notify,SIGNAL(neighboursChanged()) ,w->friendsDialog->networkDialog ,SLOT(securedUpdateDisplay())) ;
QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&,bool)),w->friendsDialog,SLOT(updatePeerStatusString(const QString&,const QString&,bool)));
QObject::connect(notify,SIGNAL(ownStatusMessageChanged()),w->friendsDialog,SLOT(loadmypersonalstatus()));
// QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&,bool)),w->friendsDialog,SLOT(updatePeerStatusString(const QString&,const QString&,bool)));
// QObject::connect(notify,SIGNAL(ownStatusMessageChanged()),w->friendsDialog,SLOT(loadmypersonalstatus()));
// QObject::connect(notify,SIGNAL(logInfoChanged(const QString&)) ,w->friendsDialog->networkDialog,SLOT(setLogInfo(QString))) ;
QObject::connect(notify,SIGNAL(discInfoChanged()) ,w->friendsDialog->networkView,SLOT(update()),Qt::QueuedConnection) ;
QObject::connect(notify,SIGNAL(errorOccurred(int,int,const QString&)),w,SLOT(displayErrorMessage(int,int,const QString&))) ;
// QObject::connect(notify,SIGNAL(discInfoChanged()) ,w->friendsDialog->networkView,SLOT(update()),Qt::QueuedConnection) ;
// QObject::connect(notify,SIGNAL(errorOccurred(int,int,const QString&)),w,SLOT(displayErrorMessage(int,int,const QString&))) ;
w->installGroupChatNotifier();

View file

@ -1050,12 +1050,9 @@ unfinishedtranslations {
}
messenger {
SOURCES += gui/MessengerWindow.cpp \
gui/common/FriendList.cpp
HEADERS += gui/MessengerWindow.h \
gui/common/FriendList.h
FORMS += gui/MessengerWindow.ui \
gui/common/FriendList.ui
SOURCES += gui/MessengerWindow.cpp
HEADERS += gui/MessengerWindow.h
FORMS += gui/MessengerWindow.ui
DEFiNES += MESSENGER_WINDOW
}