diff --git a/libretroshare b/libretroshare index da6b849a4..fdd0d9f4f 160000 --- a/libretroshare +++ b/libretroshare @@ -1 +1 @@ -Subproject commit da6b849a41f3cf6e60f6f76e1f3c4463876a8741 +Subproject commit fdd0d9f4f1522c2536548025587eca08430d5d63 diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.cpp b/retroshare-gui/src/gui/ChatLobbyWidget.cpp index 250d81065..9a7b51756 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.cpp +++ b/retroshare-gui/src/gui/ChatLobbyWidget.cpp @@ -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 event) + { + RsQThreadUtils::postToObject([=](){ + auto ev = dynamic_cast(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(ChatDialog::getExistingChat(ChatId(lobby_id)))) { - cld->displayLobbyEvent(event_type, gxs_id, str); + cld->handleLobbyEvent(event_type, gxs_id, str); } } diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.h b/retroshare-gui/src/gui/ChatLobbyWidget.h index 424780dac..8b355515a 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.h +++ b/retroshare-gui/src/gui/ChatLobbyWidget.h @@ -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; }; diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index c7500b6cf..7e1477864 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -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 event) + { + RsQThreadUtils::postToObject([=](){ + + auto e = dynamic_cast(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; diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h index 7524d5035..375b6c075 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h @@ -21,6 +21,7 @@ #ifndef _SHAREDFILESDIALOG_H #define _SHAREDFILESDIALOG_H +#include #include "ui_SharedFilesDialog.h" #include @@ -145,6 +146,8 @@ protected: QString lastFilterString; QString mLastFilterText ; RsProtectedTimer* mFilterTimer; + + RsEventsHandlerId_t mEventHandlerId ; }; class LocalSharedFilesDialog : public SharedFilesDialog diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp index 3be6343bd..3d5b7d8c7 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp @@ -1115,16 +1115,6 @@ void TransfersDialog::handleEvent_main_thread(std::shared_ptr 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(); diff --git a/retroshare-gui/src/gui/FriendServerControl.cpp b/retroshare-gui/src/gui/FriendServerControl.cpp index 7b031e7e2..eb5988589 100644 --- a/retroshare-gui/src/gui/FriendServerControl.cpp +++ b/retroshare-gui/src/gui/FriendServerControl.cpp @@ -118,7 +118,7 @@ FriendServerControl::FriendServerControl(QWidget *parent) rsEvents->registerEventsHandler( [this](std::shared_ptr 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 RsConnectionEvent *pe = dynamic_cast(event.get()); + const RsFriendListEvent *pe = dynamic_cast(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(); diff --git a/retroshare-gui/src/gui/FriendsDialog.cpp b/retroshare-gui/src/gui/FriendsDialog.cpp index 71b97ea61..b68033478 100644 --- a/retroshare-gui/src/gui/FriendsDialog.cpp +++ b/retroshare-gui/src/gui/FriendsDialog.cpp @@ -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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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() diff --git a/retroshare-gui/src/gui/FriendsDialog.h b/retroshare-gui/src/gui/FriendsDialog.h index 7e86669b8..f6ec0e0a8 100644 --- a/retroshare-gui/src/gui/FriendsDialog.h +++ b/retroshare-gui/src/gui/FriendsDialog.h @@ -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 diff --git a/retroshare-gui/src/gui/Identity/IdentityListModel.h b/retroshare-gui/src/gui/Identity/IdentityListModel.h index 4c3cb43e2..0e1fb5e28 100644 --- a/retroshare-gui/src/gui/Identity/IdentityListModel.h +++ b/retroshare-gui/src/gui/Identity/IdentityListModel.h @@ -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& identities_meta); diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 0c0f3767c..9984436fa 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -31,9 +31,11 @@ #include #include -#include -#include -#include +#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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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(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(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(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*/ diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index b435524f0..59f927ac6 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -25,6 +25,9 @@ #include #include +#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 diff --git a/retroshare-gui/src/gui/MessengerWindow.cpp b/retroshare-gui/src/gui/MessengerWindow.cpp index 77396a928..28db4a7ee 100644 --- a/retroshare-gui/src/gui/MessengerWindow.cpp +++ b/retroshare-gui/src/gui/MessengerWindow.cpp @@ -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 e) + { + RsQThreadUtils::postToObject([=](){ + auto fe = dynamic_cast(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::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())) diff --git a/retroshare-gui/src/gui/MessengerWindow.h b/retroshare-gui/src/gui/MessengerWindow.h index ecfc43b20..e6a0c10db 100644 --- a/retroshare-gui/src/gui/MessengerWindow.h +++ b/retroshare-gui/src/gui/MessengerWindow.h @@ -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 expandedPeers ; static std::set expandedGroups ; + RsEventsHandlerId_t mEventHandlerId ; }; #endif diff --git a/retroshare-gui/src/gui/NetworkView.cpp b/retroshare-gui/src/gui/NetworkView.cpp index 402e14063..0a41c82ef 100644 --- a/retroshare-gui/src/gui/NetworkView.cpp +++ b/retroshare-gui/src/gui/NetworkView.cpp @@ -28,6 +28,7 @@ #include #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 event) + { + RsQThreadUtils::postToObject([=](){ + auto ev = dynamic_cast(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) diff --git a/retroshare-gui/src/gui/NetworkView.h b/retroshare-gui/src/gui/NetworkView.h index f6fcfe0b1..c439cb6c4 100644 --- a/retroshare-gui/src/gui/NetworkView.h +++ b/retroshare-gui/src/gui/NetworkView.h @@ -24,6 +24,7 @@ #include #include +#include #include #include "ui_NetworkView.h" @@ -65,6 +66,7 @@ class NetworkView : public RsAutoUpdatePage std::map _node_ids ; bool _should_update ; + RsEventsHandlerId_t mEventHandlerId; }; #endif diff --git a/retroshare-gui/src/gui/NewsFeed.cpp b/retroshare-gui/src/gui/NewsFeed.cpp index dc0834e71..320184e74 100644 --- a/retroshare-gui/src/gui/NewsFeed.cpp +++ b/retroshare-gui/src/gui/NewsFeed.cpp @@ -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 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 event) void NewsFeed::handleConnectionEvent(std::shared_ptr event) { - const RsConnectionEvent *pe = dynamic_cast(event.get()); + const RsFriendListEvent *pe = dynamic_cast(event.get()); if(!pe) return; auto& e(*pe); @@ -437,18 +437,17 @@ void NewsFeed::handleConnectionEvent(std::shared_ptr 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 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*/) diff --git a/retroshare-gui/src/gui/ShareManager.cpp b/retroshare-gui/src/gui/ShareManager.cpp index 707f9e08b..224af7a22 100644 --- a/retroshare-gui/src/gui/ShareManager.cpp +++ b/retroshare-gui/src/gui/ShareManager.cpp @@ -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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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); } diff --git a/retroshare-gui/src/gui/ShareManager.h b/retroshare-gui/src/gui/ShareManager.h index 1ddfaa0a9..b6d579894 100644 --- a/retroshare-gui/src/gui/ShareManager.h +++ b/retroshare-gui/src/gui/ShareManager.h @@ -77,6 +77,7 @@ private: Ui::ShareManager ui; std::vector mDirInfos ; + RsEventsHandlerId_t mEventHandlerId; }; #endif diff --git a/retroshare-gui/src/gui/chat/ChatDialog.cpp b/retroshare-gui/src/gui/chat/ChatDialog.cpp index d7edd2152..da31dbe3c 100644 --- a/retroshare-gui/src/gui/chat/ChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatDialog.cpp @@ -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() diff --git a/retroshare-gui/src/gui/chat/ChatDialog.h b/retroshare-gui/src/gui/chat/ChatDialog.h index e4656ab33..9d2cb6dd7 100644 --- a/retroshare-gui/src/gui/chat/ChatDialog.h +++ b/retroshare-gui/src/gui/chat/ChatDialog.h @@ -23,6 +23,8 @@ #ifndef CHATDIALOG_H #define CHATDIALOG_H +#include "retroshare/rsstatus.h" + #include #include @@ -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(); diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp index 4d5f0b2ac..fc45b65cc 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.cpp @@ -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()) diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.h b/retroshare-gui/src/gui/chat/ChatLobbyDialog.h index 7039f6c13..0eb54bdc9 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.h +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.h @@ -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(); diff --git a/retroshare-gui/src/gui/chat/ChatTabWidget.cpp b/retroshare-gui/src/gui/chat/ChatTabWidget.cpp index 03357a3e4..9008b250c 100644 --- a/retroshare-gui/src/gui/chat/ChatTabWidget.cpp +++ b/retroshare-gui/src/gui/chat/ChatTabWidget.cpp @@ -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(currentWidget()); if (cd && cd->hasPeerStatus()) { - *icon = QIcon(StatusDefs::imageIM(cd->getPeerStatus())); + *icon = QIcon(StatusDefs::imageIM((RsStatusValue)cd->getPeerStatus())); } else { *icon = QIcon(); } diff --git a/retroshare-gui/src/gui/chat/ChatUserNotify.cpp b/retroshare-gui/src/gui/chat/ChatUserNotify.cpp index dcafae59a..ac80761bc 100644 --- a/retroshare-gui/src/gui/chat/ChatUserNotify.cpp +++ b/retroshare-gui/src/gui/chat/ChatUserNotify.cpp @@ -26,6 +26,7 @@ #include "gui/MainWindow.h" #include "gui/chat/ChatDialog.h" #include "gui/settings/rsharesettings.h" +#include "util/qtthreadsutils.h" #include #include @@ -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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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() diff --git a/retroshare-gui/src/gui/chat/ChatUserNotify.h b/retroshare-gui/src/gui/chat/ChatUserNotify.h index 5ce8cb10a..2824acf5f 100644 --- a/retroshare-gui/src/gui/chat/ChatUserNotify.h +++ b/retroshare-gui/src/gui/chat/ChatUserNotify.h @@ -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 diff --git a/retroshare-gui/src/gui/chat/ChatWidget.cpp b/retroshare-gui/src/gui/chat/ChatWidget.cpp index 32e3991e1..8a842616d 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.cpp +++ b/retroshare-gui/src/gui/chat/ChatWidget.cpp @@ -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 @@ -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)), this, SLOT(fileHashingFinished(QList))); - 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 e) + { + RsQThreadUtils::postToObject([=](){ + auto fe = dynamic_cast(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(); diff --git a/retroshare-gui/src/gui/chat/ChatWidget.h b/retroshare-gui/src/gui/chat/ChatWidget.h index e42df06fe..ed1645b14 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.h +++ b/retroshare-gui/src/gui/chat/ChatWidget.h @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -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 &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 diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.cpp b/retroshare-gui/src/gui/chat/PopupChatDialog.cpp index 7bcf515df..4da5d6fe4 100644 --- a/retroshare-gui/src/gui/chat/PopupChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.cpp @@ -28,6 +28,7 @@ #include "gui/settings/RsharePeerSettings.h" #include "gui/notifyqt.h" #include "util/DateTime.h" +#include "util/qtthreadsutils.h" #include #include @@ -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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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); } diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.h b/retroshare-gui/src/gui/chat/PopupChatDialog.h index a88df7a2f..9708fbaae 100644 --- a/retroshare-gui/src/gui/chat/PopupChatDialog.h +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.h @@ -65,6 +65,8 @@ protected: /** Qt Designer generated object */ Ui::PopupChatDialog ui; + + RsEventsHandlerId_t mEventHandlerId_chat; }; #endif diff --git a/retroshare-gui/src/gui/chat/PopupChatWindow.cpp b/retroshare-gui/src/gui/chat/PopupChatWindow.cpp index 3858c806e..7300b0a8e 100644 --- a/retroshare-gui/src/gui/chat/PopupChatWindow.cpp +++ b/retroshare-gui/src/gui/chat/PopupChatWindow.cpp @@ -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 { diff --git a/retroshare-gui/src/gui/chat/PopupChatWindow.ui b/retroshare-gui/src/gui/chat/PopupChatWindow.ui index 0394a1c31..7f1dc2f24 100644 --- a/retroshare-gui/src/gui/chat/PopupChatWindow.ui +++ b/retroshare-gui/src/gui/chat/PopupChatWindow.ui @@ -85,7 +85,7 @@ - + :/images/tab-dock.png:/images/tab-dock.png @@ -97,7 +97,7 @@ - + :/images/tab-undock.png:/images/tab-undock.png diff --git a/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp b/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp index c5ab40cbf..0e8faba80 100644 --- a/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/PopupDistantChatDialog.cpp @@ -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; } } diff --git a/retroshare-gui/src/gui/common/AvatarWidget.cpp b/retroshare-gui/src/gui/common/AvatarWidget.cpp index 02151730a..75ac697f5 100644 --- a/retroshare-gui/src/gui/common/AvatarWidget.cpp +++ b/retroshare-gui/src/gui/common/AvatarWidget.cpp @@ -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 event) + { + RsQThreadUtils::postToObject([=](){ + + const RsFriendListEvent *e = dynamic_cast(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); } diff --git a/retroshare-gui/src/gui/common/AvatarWidget.h b/retroshare-gui/src/gui/common/AvatarWidget.h index e3b90022b..4e81b3ef1 100644 --- a/retroshare-gui/src/gui/common/AvatarWidget.h +++ b/retroshare-gui/src/gui/common/AvatarWidget.h @@ -24,7 +24,9 @@ #include #include #include +#include #include +#include 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 diff --git a/retroshare-gui/src/gui/common/FriendListModel.cpp b/retroshare-gui/src/gui/common/FriendListModel.cpp index 89a924b01..54f1f3cb2 100644 --- a/retroshare-gui/src/gui/common/FriendListModel.cpp +++ b/retroshare-gui/src/gui/common/FriendListModel.cpp @@ -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;ichild_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(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))); } diff --git a/retroshare-gui/src/gui/common/FriendListModel.h b/retroshare-gui/src/gui/common/FriendListModel.h index e19a84f04..4020e6fc7 100644 --- a/retroshare-gui/src/gui/common/FriendListModel.h +++ b/retroshare-gui/src/gui/common/FriendListModel.h @@ -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; diff --git a/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp b/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp index d9fc4b8dc..47cf2b802 100644 --- a/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp +++ b/retroshare-gui/src/gui/common/FriendSelectionWidget.cpp @@ -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 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(event.get()); + const RsFriendListEvent *fp = dynamic_cast(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::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 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); diff --git a/retroshare-gui/src/gui/common/FriendSelectionWidget.h b/retroshare-gui/src/gui/common/FriendSelectionWidget.h index 425e16774..c9be4bf6b 100644 --- a/retroshare-gui/src/gui/common/FriendSelectionWidget.h +++ b/retroshare-gui/src/gui/common/FriendSelectionWidget.h @@ -25,6 +25,7 @@ #include #include "retroshare/rsevents.h" +#include "retroshare/rsstatus.h" #include #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 &ids, bool onlyDirectSelected); diff --git a/retroshare-gui/src/gui/common/GroupSelectionBox.cpp b/retroshare-gui/src/gui/common/GroupSelectionBox.cpp index c57f6bd37..e2eb533c0 100644 --- a/retroshare-gui/src/gui/common/GroupSelectionBox.cpp +++ b/retroshare-gui/src/gui/common/GroupSelectionBox.cpp @@ -24,6 +24,7 @@ #include "GroupSelectionBox.h" #include "GroupDefs.h" #include "gui/notifyqt.h" +#include "util/qtthreadsutils.h" #include @@ -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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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 selectedIds; diff --git a/retroshare-gui/src/gui/common/GroupSelectionBox.h b/retroshare-gui/src/gui/common/GroupSelectionBox.h index 09ae741c2..6cd4ac9cb 100644 --- a/retroshare-gui/src/gui/common/GroupSelectionBox.h +++ b/retroshare-gui/src/gui/common/GroupSelectionBox.h @@ -21,6 +21,7 @@ #include #include #include +#include class GroupSelectionBox: public QListWidget { @@ -28,6 +29,7 @@ class GroupSelectionBox: public QListWidget public: GroupSelectionBox(QWidget *parent); + virtual ~GroupSelectionBox(); static void selectGroups(const std::list& default_groups) ; @@ -38,6 +40,9 @@ public: private slots: void fillGroups(); + +private: + RsEventsHandlerId_t mEventHandlerId ; }; class GroupSelectionDialog: public QDialog diff --git a/retroshare-gui/src/gui/common/HashBox.cpp b/retroshare-gui/src/gui/common/HashBox.cpp index a046ac071..c4c6cbf4a 100644 --- a/retroshare-gui/src/gui/common/HashBox.cpp +++ b/retroshare-gui/src/gui/common/HashBox.cpp @@ -259,7 +259,7 @@ void HashBox::checkAttachmentReady() emit fileHashingFinished(hashedFiles); auto ev = std::make_shared(); - ev->mEventCode = RsSharedDirectoriesEventCode::DIRECTORY_SWEEP_ENDED; + ev->mEventCode = RsSharedDirectoriesEventCode::HASHING_PROCESS_FINISHED; if(rsEvents) rsEvents->postEvent(ev); } diff --git a/retroshare-gui/src/gui/common/NewFriendList.cpp b/retroshare-gui/src/gui/common/NewFriendList.cpp index 1f2cf27ca..554009818 100644 --- a/retroshare-gui/src/gui/common/NewFriendList.cpp +++ b/retroshare-gui/src/gui/common/NewFriendList.cpp @@ -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 e) { handleEvent(e); }, mEventHandlerId_pssc, RsEventType::PEER_STATE_CHANGED ); - rsEvents->registerEventsHandler( [this](std::shared_ptr e) { handleEvent(e); }, mEventHandlerId_peer, RsEventType::PEER_CONNECTION ); +// rsEvents->registerEventsHandler( [this](std::shared_ptr e) { handleEvent(e); }, mEventHandlerId_pssc, RsEventType::PEER_STATE_CHANGED ); + rsEvents->registerEventsHandler( [this](std::shared_ptr e) { handleEvent(e); }, mEventHandlerId_peer, RsEventType::FRIEND_LIST ); rsEvents->registerEventsHandler( [this](std::shared_ptr 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; diff --git a/retroshare-gui/src/gui/common/NewFriendList.h b/retroshare-gui/src/gui/common/NewFriendList.h index cf4c68e6f..204d984d5 100644 --- a/retroshare-gui/src/gui/common/NewFriendList.h +++ b/retroshare-gui/src/gui/common/NewFriendList.h @@ -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 openGroups; std::set openPeers; diff --git a/retroshare-gui/src/gui/common/StatusDefs.cpp b/retroshare-gui/src/gui/common/StatusDefs.cpp index 5d0db8395..a9fa4e3f9 100644 --- a/retroshare-gui/src/gui/common/StatusDefs.cpp +++ b/retroshare-gui/src/gui/common/StatusDefs.cpp @@ -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; } diff --git a/retroshare-gui/src/gui/common/StatusDefs.h b/retroshare-gui/src/gui/common/StatusDefs.h index b922e28e4..3a167930b 100644 --- a/retroshare-gui/src/gui/common/StatusDefs.h +++ b/retroshare-gui/src/gui/common/StatusDefs.h @@ -24,18 +24,20 @@ #include #include +#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); diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index 7ffdcd687..4b5d9d314 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -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(); + 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 gpg_ids; - rsPeers->getGPGAllList(gpg_ids); - for (std::list::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 common_friends; - - for (std::list::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::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::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 ================================== diff --git a/retroshare-gui/src/gui/feeds/PeerItem.cpp b/retroshare-gui/src/gui/feeds/PeerItem.cpp index 7961abce2..388f3cbc8 100644 --- a/retroshare-gui/src/gui/feeds/PeerItem.cpp +++ b/retroshare-gui/src/gui/feeds/PeerItem.cpp @@ -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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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()) ; diff --git a/retroshare-gui/src/gui/feeds/PeerItem.h b/retroshare-gui/src/gui/feeds/PeerItem.h index 22b9bbaf0..8a7a2abc3 100644 --- a/retroshare-gui/src/gui/feeds/PeerItem.h +++ b/retroshare-gui/src/gui/feeds/PeerItem.h @@ -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 diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.cpp b/retroshare-gui/src/gui/feeds/SecurityItem.cpp index 41d0a4b10..64ee198de 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityItem.cpp @@ -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 e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(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()); diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.h b/retroshare-gui/src/gui/feeds/SecurityItem.h index 7f99c8377..b51943f89 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityItem.h @@ -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 diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp index 8b5b7e707..45b465955 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp @@ -53,7 +53,7 @@ RsGxsChannelPostsModel::RsGxsChannelPostsModel(QObject *parent) RsGxsChannelPostsModel::~RsGxsChannelPostsModel() { - rsEvents->unregisterEventsHandler(mEventHandlerId); +// rsEvents->unregisterEventsHandler(mEventHandlerId); } void RsGxsChannelPostsModel::setMode(TreeMode mode) diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h index c447f11a3..b0829c28c 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h @@ -256,6 +256,6 @@ private: QColor mTextColorNotSubscribed ; QColor mTextColorMissing ; - RsEventsHandlerId_t mEventHandlerId ; + //RsEventsHandlerId_t mEventHandlerId ; friend class const_iterator; }; diff --git a/retroshare-gui/src/gui/im_history/ImHistoryBrowser.cpp b/retroshare-gui/src/gui/im_history/ImHistoryBrowser.cpp index 114071ae7..c9966b67b 100644 --- a/retroshare-gui/src/gui/im_history/ImHistoryBrowser.cpp +++ b/retroshare-gui/src/gui/im_history/ImHistoryBrowser.cpp @@ -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 event) + { + RsQThreadUtils::postToObject([=](){ + + auto ev = dynamic_cast(event.get()); + + if(!ev) + return; + + if(ev->mEventCode == RsChatServiceEventCode::CHAT_HISTORY_CHANGED) + historyChanged(ev->mMsgHistoryId,ev->mHistoryChangeType); + }, this ); + }, mEventHandlerId, RsEventType::CHAT_SERVICE ); } ImHistoryBrowser::~ImHistoryBrowser() diff --git a/retroshare-gui/src/gui/im_history/ImHistoryBrowser.h b/retroshare-gui/src/gui/im_history/ImHistoryBrowser.h index 84ee95234..a9230661c 100644 --- a/retroshare-gui/src/gui/im_history/ImHistoryBrowser.h +++ b/retroshare-gui/src/gui/im_history/ImHistoryBrowser.h @@ -86,6 +86,7 @@ private: /** Qt Designer generated object */ Ui::ImHistoryBrowser ui; + RsEventsHandlerId_t mEventHandlerId; }; class ImHistoryBrowserCreateItemsThread : public QThread diff --git a/retroshare-gui/src/gui/msgs/MessageComposer.cpp b/retroshare-gui/src/gui/msgs/MessageComposer.cpp index aff01fc29..2c07e1f58 100644 --- a/retroshare-gui/src/gui/msgs/MessageComposer.cpp +++ b/retroshare-gui/src/gui/msgs/MessageComposer.cpp @@ -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 e) + { + RsQThreadUtils::postToObject([=](){ + auto fe = dynamic_cast(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; diff --git a/retroshare-gui/src/gui/msgs/MessageComposer.h b/retroshare-gui/src/gui/msgs/MessageComposer.h index c36b08642..180840208 100644 --- a/retroshare-gui/src/gui/msgs/MessageComposer.h +++ b/retroshare-gui/src/gui/msgs/MessageComposer.h @@ -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 _recList ; + RsEventsHandlerId_t mEventHandlerId; }; #endif diff --git a/retroshare-gui/src/gui/msgs/MessageUserNotify.cpp b/retroshare-gui/src/gui/msgs/MessageUserNotify.cpp index b29f264fb..ed4ad1dd6 100644 --- a/retroshare-gui/src/gui/msgs/MessageUserNotify.cpp +++ b/retroshare-gui/src/gui/msgs/MessageUserNotify.cpp @@ -97,12 +97,7 @@ void MessageUserNotify::handleEvent_main_thread(std::shared_ptr 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: diff --git a/retroshare-gui/src/gui/notifyqt.cpp b/retroshare-gui/src/gui/notifyqt.cpp index fb19e8e24..42fd5a614 100644 --- a/retroshare-gui/src/gui/notifyqt.cpp +++ b/retroshare-gui/src/gui/notifyqt.cpp @@ -25,7 +25,9 @@ #include #include #include +#include #include +#include #include @@ -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 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"); qRegisterMetaType("ChatMessage"); qRegisterMetaType("RsGxsChanges"); qRegisterMetaType("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& /*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& /*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& 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 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(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(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(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(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(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(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(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(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.")) ; +} + diff --git a/retroshare-gui/src/gui/notifyqt.h b/retroshare-gui/src/gui/notifyqt.h index 5782ef5b7..5871c510a 100644 --- a/retroshare-gui/src/gui/notifyqt.h +++ b/retroshare-gui/src/gui/notifyqt.h @@ -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& found_files); -#endif - virtual void notifyTurtleSearchResult(uint32_t search_id,const std::list& 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& found_files); +//#endif +// virtual void notifyTurtleSearchResult(uint32_t search_id,const std::list& 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 e); /* called by timer */ + RsEventsHandlerId_t mEventHandlerId; }; #endif diff --git a/retroshare-gui/src/gui/settings/ServerPage.cpp b/retroshare-gui/src/gui/settings/ServerPage.cpp index be2404bc8..72fe6d614 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.cpp +++ b/retroshare-gui/src/gui/settings/ServerPage.cpp @@ -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 event) { handleEvent(event); }, mEventHandlerId, RsEventType::NETWORK ); } +ServerPage::~ServerPage() +{ + rsEvents->unregisterEventsHandler(mEventHandlerId); +} void ServerPage::handleEvent(std::shared_ptr e) { if(e->mType != RsEventType::NETWORK) diff --git a/retroshare-gui/src/gui/settings/ServerPage.h b/retroshare-gui/src/gui/settings/ServerPage.h index a0028e1cb..f4f0eee10 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.h +++ b/retroshare-gui/src/gui/settings/ServerPage.h @@ -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(); diff --git a/retroshare-gui/src/gui/statusbar/hashingstatus.cpp b/retroshare-gui/src/gui/statusbar/hashingstatus.cpp index 109933cc8..8638acb3e 100644 --- a/retroshare-gui/src/gui/statusbar/hashingstatus.cpp +++ b/retroshare-gui/src/gui/statusbar/hashingstatus.cpp @@ -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 event) { - // Warning: no GUI calls should happen here! - if(event->mType != RsEventType::SHARED_DIRECTORIES) return; - const RsSharedDirectoriesEvent *fe = dynamic_cast(event.get()); + const RsSharedDirectoriesEvent *fe = dynamic_cast(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() ; - } } + diff --git a/retroshare-gui/src/gui/statusbar/hashingstatus.h b/retroshare-gui/src/gui/statusbar/hashingstatus.h index 8f09120a1..180206088 100644 --- a/retroshare-gui/src/gui/statusbar/hashingstatus.h +++ b/retroshare-gui/src/gui/statusbar/hashingstatus.h @@ -39,7 +39,6 @@ public: void mousePressEvent(QMouseEvent *); private: - void updateHashingInfo(const QString& s); void handleEvent_main_thread(std::shared_ptr event); ElidedLabel *statusHashing; diff --git a/retroshare-gui/src/gui/toaster/DownloadToaster.cpp b/retroshare-gui/src/gui/toaster/DownloadToaster.cpp index 2818ba265..41b77c842 100644 --- a/retroshare-gui/src/gui/toaster/DownloadToaster.cpp +++ b/retroshare-gui/src/gui/toaster/DownloadToaster.cpp @@ -28,7 +28,7 @@ #include -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() diff --git a/retroshare-gui/src/gui/toaster/DownloadToaster.h b/retroshare-gui/src/gui/toaster/DownloadToaster.h index 3d67e1af1..f63a6aadc 100644 --- a/retroshare-gui/src/gui/toaster/DownloadToaster.h +++ b/retroshare-gui/src/gui/toaster/DownloadToaster.h @@ -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(); diff --git a/retroshare-gui/src/gui/toaster/FriendRequestToaster.cpp b/retroshare-gui/src/gui/toaster/FriendRequestToaster.cpp index 90bde9d10..f4968d55f 100644 --- a/retroshare-gui/src/gui/toaster/FriendRequestToaster.cpp +++ b/retroshare-gui/src/gui/toaster/FriendRequestToaster.cpp @@ -24,8 +24,8 @@ #include -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"); } } diff --git a/retroshare-gui/src/gui/toaster/FriendRequestToaster.h b/retroshare-gui/src/gui/toaster/FriendRequestToaster.h index 07e7c11f8..eebc85301 100644 --- a/retroshare-gui/src/gui/toaster/FriendRequestToaster.h +++ b/retroshare-gui/src/gui/toaster/FriendRequestToaster.h @@ -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(); diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index 617569458..022ae227c 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -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(); diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index 9b0a31b6e..4be85fadc 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -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 }