mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
Modified the patch from electron.
Moved the calls to the plugin to ChatWidget for use with all types of chats (private chat, chat lobby and distant chat). Recompile needed git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6980 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
7b0a6afa56
commit
92fabf4c56
@ -55,9 +55,10 @@ class ftServer ;
|
|||||||
class ConfigPage ;
|
class ConfigPage ;
|
||||||
class RsPQIService ;
|
class RsPQIService ;
|
||||||
class RsAutoUpdatePage ;
|
class RsAutoUpdatePage ;
|
||||||
class PopupChatDialog_WidgetsHolder ;
|
|
||||||
class SoundEvents;
|
class SoundEvents;
|
||||||
class FeedNotify;
|
class FeedNotify;
|
||||||
|
class ChatWidget;
|
||||||
|
class ChatWidgetHolder;
|
||||||
|
|
||||||
// Plugin API version. Not used yet, but will be in the future the
|
// Plugin API version. Not used yet, but will be in the future the
|
||||||
// main value that decides for compatibility.
|
// main value that decides for compatibility.
|
||||||
@ -143,8 +144,8 @@ class RsPlugin
|
|||||||
virtual std::string qt_transfers_tab_name()const { return "Tab" ; } // Tab name
|
virtual std::string qt_transfers_tab_name()const { return "Tab" ; } // Tab name
|
||||||
virtual void qt_sound_events(SoundEvents &/*events*/) const { } // Sound events
|
virtual void qt_sound_events(SoundEvents &/*events*/) const { } // Sound events
|
||||||
|
|
||||||
// provide buttons for the PopupChatDialog
|
// Provide buttons for the ChatWidget
|
||||||
virtual PopupChatDialog_WidgetsHolder *qt_allocate_new_popup_chat_dialog_widgets() const { return NULL ; }
|
virtual ChatWidgetHolder *qt_get_chat_widget_holder(ChatWidget */*chatWidget*/) const { return NULL ; }
|
||||||
|
|
||||||
virtual QTranslator *qt_translator(QApplication * /* app */, const QString& /* languageCode */, const QString& /* externalDir */ ) const { return NULL ; }
|
virtual QTranslator *qt_translator(QApplication * /* app */, const QString& /* languageCode */, const QString& /* externalDir */ ) const { return NULL ; }
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ SOURCES = services/p3vors.cc \
|
|||||||
gui/SpeexProcessor.cpp \
|
gui/SpeexProcessor.cpp \
|
||||||
gui/audiodevicehelper.cpp \
|
gui/audiodevicehelper.cpp \
|
||||||
gui/VoipStatistics.cpp \
|
gui/VoipStatistics.cpp \
|
||||||
gui/AudioPopupChatDialog.cpp \
|
gui/AudioChatWidgetHolder.cpp \
|
||||||
gui/PluginGUIHandler.cpp \
|
gui/PluginGUIHandler.cpp \
|
||||||
gui/PluginNotifier.cpp \
|
gui/PluginNotifier.cpp \
|
||||||
VOIPPlugin.cpp
|
VOIPPlugin.cpp
|
||||||
@ -45,7 +45,7 @@ HEADERS = services/p3vors.h \
|
|||||||
gui/SpeexProcessor.h \
|
gui/SpeexProcessor.h \
|
||||||
gui/audiodevicehelper.h \
|
gui/audiodevicehelper.h \
|
||||||
gui/VoipStatistics.h \
|
gui/VoipStatistics.h \
|
||||||
gui/AudioPopupChatDialog.h \
|
gui/AudioChatWidgetHolder.h \
|
||||||
gui/PluginGUIHandler.h \
|
gui/PluginGUIHandler.h \
|
||||||
gui/PluginNotifier.h \
|
gui/PluginNotifier.h \
|
||||||
interface/rsvoip.h \
|
interface/rsvoip.h \
|
||||||
|
@ -12,10 +12,11 @@
|
|||||||
|
|
||||||
#include "gui/VoipStatistics.h"
|
#include "gui/VoipStatistics.h"
|
||||||
#include "gui/AudioInputConfig.h"
|
#include "gui/AudioInputConfig.h"
|
||||||
#include "gui/AudioPopupChatDialog.h"
|
#include "gui/AudioChatWidgetHolder.h"
|
||||||
#include "gui/PluginGUIHandler.h"
|
#include "gui/PluginGUIHandler.h"
|
||||||
#include "gui/PluginNotifier.h"
|
#include "gui/PluginNotifier.h"
|
||||||
#include "gui/SoundManager.h"
|
#include "gui/SoundManager.h"
|
||||||
|
#include "gui/chat/ChatWidget.h"
|
||||||
|
|
||||||
#define IMAGE_VOIP ":/images/talking_on.svg"
|
#define IMAGE_VOIP ":/images/talking_on.svg"
|
||||||
|
|
||||||
@ -106,17 +107,25 @@ QDialog *VOIPPlugin::qt_about_page() const
|
|||||||
return about_dialog ;
|
return about_dialog ;
|
||||||
}
|
}
|
||||||
|
|
||||||
PopupChatDialog_WidgetsHolder *VOIPPlugin::qt_allocate_new_popup_chat_dialog_widgets() const
|
ChatWidgetHolder *VOIPPlugin::qt_get_chat_widget_holder(ChatWidget *chatWidget) const
|
||||||
{
|
{
|
||||||
AudioPopupChatDialogWidgetsHolder *ap = new AudioPopupChatDialogWidgetsHolder() ;
|
switch (chatWidget->chatType()) {
|
||||||
|
case ChatWidget::CHATTYPE_PRIVATE:
|
||||||
|
return new AudioChatWidgetHolder(chatWidget);
|
||||||
|
case ChatWidget::CHATTYPE_UNKNOWN:
|
||||||
|
case ChatWidget::CHATTYPE_LOBBY:
|
||||||
|
case ChatWidget::CHATTYPE_DISTANT:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return ap ;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string VOIPPlugin::qt_transfers_tab_name() const
|
std::string VOIPPlugin::qt_transfers_tab_name() const
|
||||||
{
|
{
|
||||||
return QObject::tr("RTT Statistics").toUtf8().constData() ;
|
return QObject::tr("RTT Statistics").toUtf8().constData() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
RsAutoUpdatePage *VOIPPlugin::qt_transfers_tab() const
|
RsAutoUpdatePage *VOIPPlugin::qt_transfers_tab() const
|
||||||
{
|
{
|
||||||
return new VoipStatistics ;
|
return new VoipStatistics ;
|
||||||
|
@ -18,7 +18,7 @@ class VOIPPlugin: public RsPlugin
|
|||||||
virtual QDialog *qt_about_page() const ;
|
virtual QDialog *qt_about_page() const ;
|
||||||
virtual RsAutoUpdatePage *qt_transfers_tab() const ;
|
virtual RsAutoUpdatePage *qt_transfers_tab() const ;
|
||||||
virtual std::string qt_transfers_tab_name() const ;
|
virtual std::string qt_transfers_tab_name() const ;
|
||||||
virtual PopupChatDialog_WidgetsHolder *qt_allocate_new_popup_chat_dialog_widgets() const ;
|
virtual ChatWidgetHolder *qt_get_chat_widget_holder(ChatWidget *chatWidget) const ;
|
||||||
|
|
||||||
virtual QIcon *qt_icon() const;
|
virtual QIcon *qt_icon() const;
|
||||||
virtual QTranslator *qt_translator(QApplication *app, const QString& languageCode, const QString& externalDir) const;
|
virtual QTranslator *qt_translator(QApplication *app, const QString& languageCode, const QString& externalDir) const;
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
#include <QPropertyAnimation>
|
#include <QPropertyAnimation>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include "AudioPopupChatDialog.h"
|
|
||||||
|
#include "AudioChatWidgetHolder.h"
|
||||||
|
#include <gui/audiodevicehelper.h>
|
||||||
#include "interface/rsvoip.h"
|
#include "interface/rsvoip.h"
|
||||||
#include "gui/SoundManager.h"
|
#include "gui/SoundManager.h"
|
||||||
#include "util/HandleRichText.h"
|
#include "util/HandleRichText.h"
|
||||||
#include "gui/common/StatusDefs.h"
|
#include "gui/common/StatusDefs.h"
|
||||||
|
#include "gui/chat/ChatWidget.h"
|
||||||
|
|
||||||
#include <retroshare/rsstatus.h>
|
#include <retroshare/rsstatus.h>
|
||||||
|
|
||||||
#define CALL_START ":/images/call-start-22.png"
|
#define CALL_START ":/images/call-start-22.png"
|
||||||
@ -13,7 +17,8 @@
|
|||||||
#define CALL_HOLD ":/images/call-hold-22.png"
|
#define CALL_HOLD ":/images/call-hold-22.png"
|
||||||
|
|
||||||
|
|
||||||
AudioPopupChatDialogWidgetsHolder::AudioPopupChatDialogWidgetsHolder()
|
AudioChatWidgetHolder::AudioChatWidgetHolder(ChatWidget *chatWidget)
|
||||||
|
: QObject(), ChatWidgetHolder(chatWidget)
|
||||||
{
|
{
|
||||||
audioListenToggleButton = new QToolButton ;
|
audioListenToggleButton = new QToolButton ;
|
||||||
audioListenToggleButton->setMinimumSize(QSize(28,28)) ;
|
audioListenToggleButton->setMinimumSize(QSize(28,28)) ;
|
||||||
@ -21,7 +26,7 @@ AudioPopupChatDialogWidgetsHolder::AudioPopupChatDialogWidgetsHolder()
|
|||||||
audioListenToggleButton->setText(QString()) ;
|
audioListenToggleButton->setText(QString()) ;
|
||||||
audioListenToggleButton->setToolTip(tr("Mute yourself"));
|
audioListenToggleButton->setToolTip(tr("Mute yourself"));
|
||||||
|
|
||||||
std::cerr << "****** VOIPLugin: Creating new AudioPopupChatDialog !!" << std::endl;
|
std::cerr << "****** VOIPLugin: Creating new AudioChatWidgetHolder !!" << std::endl;
|
||||||
|
|
||||||
QIcon icon ;
|
QIcon icon ;
|
||||||
icon.addPixmap(QPixmap(":/images/audio-volume-muted-22.png")) ;
|
icon.addPixmap(QPixmap(":/images/audio-volume-muted-22.png")) ;
|
||||||
@ -67,28 +72,23 @@ AudioPopupChatDialogWidgetsHolder::AudioPopupChatDialogWidgetsHolder()
|
|||||||
connect(audioMuteCaptureToggleButton, SIGNAL(clicked()), this , SLOT(toggleAudioMuteCapture()));
|
connect(audioMuteCaptureToggleButton, SIGNAL(clicked()), this , SLOT(toggleAudioMuteCapture()));
|
||||||
connect(hangupButton, SIGNAL(clicked()), this , SLOT(hangupCall()));
|
connect(hangupButton, SIGNAL(clicked()), this , SLOT(hangupCall()));
|
||||||
|
|
||||||
|
mChatWidget->addChatBarWidget(audioListenToggleButton) ;
|
||||||
|
mChatWidget->addChatBarWidget(audioMuteCaptureToggleButton) ;
|
||||||
|
mChatWidget->addChatBarWidget(hangupButton) ;
|
||||||
|
|
||||||
outputProcessor = NULL ;
|
outputProcessor = NULL ;
|
||||||
outputDevice = NULL ;
|
outputDevice = NULL ;
|
||||||
inputProcessor = NULL ;
|
inputProcessor = NULL ;
|
||||||
inputDevice = NULL ;
|
inputDevice = NULL ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioPopupChatDialogWidgetsHolder::init(const std::string &peerId, const QString &title, ChatWidget* chatWidget)
|
AudioChatWidgetHolder::~AudioChatWidgetHolder()
|
||||||
{
|
{
|
||||||
this->peerId = peerId;
|
if(inputDevice != NULL)
|
||||||
this->chatWidget = chatWidget;
|
inputDevice->stop() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<QWidget*> AudioPopupChatDialogWidgetsHolder::getWidgets()
|
void AudioChatWidgetHolder::toggleAudioListen()
|
||||||
{
|
|
||||||
std::vector<QWidget*> v;
|
|
||||||
v.push_back(audioListenToggleButton);
|
|
||||||
v.push_back(audioMuteCaptureToggleButton);
|
|
||||||
v.push_back(hangupButton);
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioPopupChatDialogWidgetsHolder::toggleAudioListen()
|
|
||||||
{
|
{
|
||||||
std::cerr << "******** VOIPLugin: Toggling audio listen!" << std::endl;
|
std::cerr << "******** VOIPLugin: Toggling audio listen!" << std::endl;
|
||||||
if (audioListenToggleButton->isChecked()) {
|
if (audioListenToggleButton->isChecked()) {
|
||||||
@ -102,7 +102,7 @@ void AudioPopupChatDialogWidgetsHolder::toggleAudioListen()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioPopupChatDialogWidgetsHolder::hangupCall()
|
void AudioChatWidgetHolder::hangupCall()
|
||||||
{
|
{
|
||||||
std::cerr << "******** VOIPLugin: Hangup call!" << std::endl;
|
std::cerr << "******** VOIPLugin: Hangup call!" << std::endl;
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ void AudioPopupChatDialogWidgetsHolder::hangupCall()
|
|||||||
audioMuteCaptureToggleButton->setChecked(false);
|
audioMuteCaptureToggleButton->setChecked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioPopupChatDialogWidgetsHolder::toggleAudioMuteCapture()
|
void AudioChatWidgetHolder::toggleAudioMuteCapture()
|
||||||
{
|
{
|
||||||
std::cerr << "******** VOIPLugin: Toggling audio mute capture!" << std::endl;
|
std::cerr << "******** VOIPLugin: Toggling audio mute capture!" << std::endl;
|
||||||
if (audioMuteCaptureToggleButton->isChecked()) {
|
if (audioMuteCaptureToggleButton->isChecked()) {
|
||||||
@ -139,8 +139,8 @@ void AudioPopupChatDialogWidgetsHolder::toggleAudioMuteCapture()
|
|||||||
connect(inputProcessor, SIGNAL(networkPacketReady()), this, SLOT(sendAudioData()));
|
connect(inputProcessor, SIGNAL(networkPacketReady()), this, SLOT(sendAudioData()));
|
||||||
inputDevice->start(inputProcessor);
|
inputDevice->start(inputProcessor);
|
||||||
|
|
||||||
if (chatWidget) {
|
if (mChatWidget) {
|
||||||
chatWidget->addChatMsg(true, tr("VoIP Status"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("Outgoing Call is started..."), ChatWidget::TYPE_SYSTEM);
|
mChatWidget->addChatMsg(true, tr("VoIP Status"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("Outgoing Call is started..."), ChatWidget::MSGTYPE_SYSTEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -149,13 +149,10 @@ void AudioPopupChatDialogWidgetsHolder::toggleAudioMuteCapture()
|
|||||||
inputDevice->stop();
|
inputDevice->stop();
|
||||||
}
|
}
|
||||||
audioMuteCaptureToggleButton->setToolTip(tr("Resume Call"));
|
audioMuteCaptureToggleButton->setToolTip(tr("Resume Call"));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioPopupChatDialogWidgetsHolder::addAudioData(const QString name, QByteArray* array)
|
void AudioChatWidgetHolder::addAudioData(const QString name, QByteArray* array)
|
||||||
{
|
{
|
||||||
if (!audioMuteCaptureToggleButton->isChecked()) {
|
if (!audioMuteCaptureToggleButton->isChecked()) {
|
||||||
//launch an animation. Don't launch it if already animating
|
//launch an animation. Don't launch it if already animating
|
||||||
@ -214,17 +211,18 @@ void AudioPopupChatDialogWidgetsHolder::addAudioData(const QString name, QByteAr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioPopupChatDialogWidgetsHolder::sendAudioData() {
|
void AudioChatWidgetHolder::sendAudioData()
|
||||||
|
{
|
||||||
while(inputProcessor && inputProcessor->hasPendingPackets()) {
|
while(inputProcessor && inputProcessor->hasPendingPackets()) {
|
||||||
QByteArray qbarray = inputProcessor->getNetworkPacket();
|
QByteArray qbarray = inputProcessor->getNetworkPacket();
|
||||||
RsVoipDataChunk chunk;
|
RsVoipDataChunk chunk;
|
||||||
chunk.size = qbarray.size();
|
chunk.size = qbarray.size();
|
||||||
chunk.data = (void*)qbarray.constData();
|
chunk.data = (void*)qbarray.constData();
|
||||||
rsVoip->sendVoipData(peerId,chunk);
|
rsVoip->sendVoipData(mChatWidget->getPeerId(),chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioPopupChatDialogWidgetsHolder::updateStatus(int status)
|
void AudioChatWidgetHolder::updateStatus(int status)
|
||||||
{
|
{
|
||||||
audioListenToggleButton->setEnabled(true);
|
audioListenToggleButton->setEnabled(true);
|
||||||
audioMuteCaptureToggleButton->setEnabled(true);
|
audioMuteCaptureToggleButton->setEnabled(true);
|
||||||
@ -238,4 +236,3 @@ void AudioPopupChatDialogWidgetsHolder::updateStatus(int status)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
41
plugins/VOIP/gui/AudioChatWidgetHolder.h
Normal file
41
plugins/VOIP/gui/AudioChatWidgetHolder.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include <QObject>
|
||||||
|
#include <QGraphicsEffect>
|
||||||
|
#include <gui/SpeexProcessor.h>
|
||||||
|
#include <gui/chat/ChatWidget.h>
|
||||||
|
|
||||||
|
class QToolButton;
|
||||||
|
class QAudioInput;
|
||||||
|
class QAudioOutput;
|
||||||
|
|
||||||
|
#define VOIP_SOUND_INCOMING_CALL "VOIP_incoming_call"
|
||||||
|
|
||||||
|
class AudioChatWidgetHolder : public QObject, public ChatWidgetHolder
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
AudioChatWidgetHolder(ChatWidget *chatWidget);
|
||||||
|
virtual ~AudioChatWidgetHolder();
|
||||||
|
|
||||||
|
virtual void updateStatus(int status);
|
||||||
|
|
||||||
|
void addAudioData(const QString name, QByteArray* array) ;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void toggleAudioListen();
|
||||||
|
void toggleAudioMuteCapture();
|
||||||
|
void hangupCall() ;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void sendAudioData();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QAudioInput* inputDevice;
|
||||||
|
QAudioOutput* outputDevice;
|
||||||
|
QtSpeex::SpeexInputProcessor* inputProcessor;
|
||||||
|
QtSpeex::SpeexOutputProcessor* outputProcessor;
|
||||||
|
|
||||||
|
QToolButton *audioListenToggleButton ;
|
||||||
|
QToolButton *audioMuteCaptureToggleButton ;
|
||||||
|
QToolButton *hangupButton ;
|
||||||
|
};
|
@ -1,52 +0,0 @@
|
|||||||
#include <QObject>
|
|
||||||
#include <QGraphicsEffect>
|
|
||||||
#include <gui/SpeexProcessor.h>
|
|
||||||
#include <gui/chat/PopupChatDialog.h>
|
|
||||||
#include <gui/audiodevicehelper.h>
|
|
||||||
|
|
||||||
class QToolButton;
|
|
||||||
|
|
||||||
#define VOIP_SOUND_INCOMING_CALL "VOIP_incoming_call"
|
|
||||||
|
|
||||||
class AudioPopupChatDialogWidgetsHolder: public QObject, public PopupChatDialog_WidgetsHolder
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
AudioPopupChatDialogWidgetsHolder();
|
|
||||||
|
|
||||||
virtual void init(const std::string &peerId, const QString &title, ChatWidget* chatWidget);
|
|
||||||
virtual std::vector<QWidget*> getWidgets();
|
|
||||||
virtual void updateStatus(int status);
|
|
||||||
|
|
||||||
virtual ~AudioPopupChatDialogWidgetsHolder()
|
|
||||||
{
|
|
||||||
if(inputDevice != NULL)
|
|
||||||
inputDevice->stop() ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addAudioData(const QString name, QByteArray* array) ;
|
|
||||||
private slots:
|
|
||||||
void toggleAudioListen();
|
|
||||||
void toggleAudioMuteCapture();
|
|
||||||
void hangupCall() ;
|
|
||||||
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void sendAudioData();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QAudioInput* inputDevice;
|
|
||||||
QAudioOutput* outputDevice;
|
|
||||||
QtSpeex::SpeexInputProcessor* inputProcessor;
|
|
||||||
QtSpeex::SpeexOutputProcessor* outputProcessor;
|
|
||||||
|
|
||||||
std::string peerId;
|
|
||||||
ChatWidget* chatWidget;
|
|
||||||
|
|
||||||
QToolButton *audioListenToggleButton ;
|
|
||||||
QToolButton *audioMuteCaptureToggleButton ;
|
|
||||||
QToolButton *hangupButton ;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
@ -4,7 +4,8 @@
|
|||||||
#include <interface/rsvoip.h>
|
#include <interface/rsvoip.h>
|
||||||
#include "PluginGUIHandler.h"
|
#include "PluginGUIHandler.h"
|
||||||
#include <gui/chat/ChatDialog.h>
|
#include <gui/chat/ChatDialog.h>
|
||||||
#include <gui/AudioPopupChatDialog.h>
|
#include <gui/AudioChatWidgetHolder.h>
|
||||||
|
#include "gui/chat/ChatWidget.h"
|
||||||
|
|
||||||
void PluginGUIHandler::ReceivedInvitation(const QString& /*peer_id*/)
|
void PluginGUIHandler::ReceivedInvitation(const QString& /*peer_id*/)
|
||||||
{
|
{
|
||||||
@ -33,29 +34,30 @@ void PluginGUIHandler::ReceivedVoipData(const QString& peer_id)
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatDialog *cd = ChatDialog::getExistingChat(peer_id.toStdString()) ;
|
ChatDialog *di = ChatDialog::getExistingChat(peer_id.toStdString()) ;
|
||||||
|
if (di) {
|
||||||
|
ChatWidget *cw = di->getChatWidget();
|
||||||
|
if (cw) {
|
||||||
|
const QList<ChatWidgetHolder*> &chatWidgetHolderList = cw->chatWidgetHolderList();
|
||||||
|
|
||||||
PopupChatDialog *pcd = dynamic_cast<PopupChatDialog*>(cd);
|
foreach (ChatWidgetHolder *chatWidgetHolder, chatWidgetHolderList) {
|
||||||
|
AudioChatWidgetHolder *acwh = dynamic_cast<AudioChatWidgetHolder*>(chatWidgetHolder) ;
|
||||||
|
|
||||||
if(pcd != NULL)
|
if (acwh) {
|
||||||
{
|
for (unsigned int i = 0; i < chunks.size(); ++i) {
|
||||||
std::vector<PopupChatDialog_WidgetsHolder*> whs = pcd->getWidgets();
|
for (unsigned int chunkIndex=0; chunkIndex<chunks.size(); chunkIndex++){
|
||||||
for(unsigned int whIndex=0; whIndex<whs.size(); whIndex++)
|
|
||||||
{
|
|
||||||
AudioPopupChatDialogWidgetsHolder* apcdwh;
|
|
||||||
if((apcdwh = dynamic_cast<AudioPopupChatDialogWidgetsHolder*>(whs[whIndex])))
|
|
||||||
{
|
|
||||||
for(unsigned int chunkIndex=0; chunkIndex<chunks.size(); chunkIndex++){
|
|
||||||
QByteArray qb(reinterpret_cast<const char *>(chunks[chunkIndex].data),chunks[chunkIndex].size);
|
QByteArray qb(reinterpret_cast<const char *>(chunks[chunkIndex].data),chunks[chunkIndex].size);
|
||||||
apcdwh->addAudioData(peer_id,&qb);
|
acwh->addAudioData(peer_id,&qb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
std::cerr << "Error: received audio data for a chat dialog that does not stand Audio (Peer id = " << peer_id.toStdString() << "!" << std::endl;
|
std::cerr << "Error: received audio data for a chat dialog that does not stand Audio (Peer id = " << peer_id.toStdString() << "!" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(unsigned int chunkIndex=0; chunkIndex<chunks.size(); chunkIndex++){
|
for(unsigned int chunkIndex=0; chunkIndex<chunks.size(); chunkIndex++){
|
||||||
free(chunks[chunkIndex].data);
|
free(chunks[chunkIndex].data);
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
#include <retroshare/rsiface.h>
|
#include <retroshare/rsiface.h>
|
||||||
#include <retroshare/rsnotify.h>
|
#include <retroshare/rsnotify.h>
|
||||||
#include <retroshare/rspeers.h>
|
#include <retroshare/rspeers.h>
|
||||||
#include <retroshare/rsplugin.h>
|
|
||||||
|
|
||||||
static std::map<std::string, ChatDialog*> chatDialogs;
|
static std::map<std::string, ChatDialog*> chatDialogs;
|
||||||
|
|
||||||
@ -125,14 +124,8 @@ void ChatDialog::init(const std::string &peerId, const QString &title)
|
|||||||
} else {
|
} else {
|
||||||
RsPeerDetails sslDetails;
|
RsPeerDetails sslDetails;
|
||||||
if (rsPeers->getPeerDetails(peerId, sslDetails)) {
|
if (rsPeers->getPeerDetails(peerId, sslDetails)) {
|
||||||
PopupChatDialog* pcd = new PopupChatDialog();
|
cd = new PopupChatDialog();
|
||||||
PopupChatDialog_WidgetsHolder *wh = NULL;
|
|
||||||
for(int i=0;i<rsPlugins->nbPlugins();++i){
|
|
||||||
if(rsPlugins->plugin(i) != NULL && (wh = rsPlugins->plugin(i)->qt_allocate_new_popup_chat_dialog_widgets()) != NULL){
|
|
||||||
pcd->addWidgets(wh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cd = pcd;
|
|
||||||
chatDialogs[peerId] = cd;
|
chatDialogs[peerId] = cd;
|
||||||
cd->init(peerId, PeerDefs::nameWithLocation(sslDetails));
|
cd->init(peerId, PeerDefs::nameWithLocation(sslDetails));
|
||||||
}
|
}
|
||||||
|
@ -293,7 +293,7 @@ void ChatLobbyDialog::addIncomingChatMsg(const ChatInfo& info)
|
|||||||
//std::cerr << "message from rsid " << info.rsid.c_str() << std::endl;
|
//std::cerr << "message from rsid " << info.rsid.c_str() << std::endl;
|
||||||
|
|
||||||
if(!isParticipantMuted(name)) {
|
if(!isParticipantMuted(name)) {
|
||||||
ui.chatWidget->addChatMsg(true, name, sendTime, recvTime, message, ChatWidget::TYPE_NORMAL);
|
ui.chatWidget->addChatMsg(true, name, sendTime, recvTime, message, ChatWidget::MSGTYPE_NORMAL);
|
||||||
emit messageReceived(id()) ;
|
emit messageReceived(id()) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -520,12 +520,12 @@ void ChatLobbyDialog::displayLobbyEvent(int event_type, const QString& nickname,
|
|||||||
switch (event_type) {
|
switch (event_type) {
|
||||||
case RS_CHAT_LOBBY_EVENT_PEER_LEFT:
|
case RS_CHAT_LOBBY_EVENT_PEER_LEFT:
|
||||||
qsParticipant=str;
|
qsParticipant=str;
|
||||||
ui.chatWidget->addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 has left the lobby.").arg(RsHtml::plainText(str)), ChatWidget::TYPE_SYSTEM);
|
ui.chatWidget->addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 has left the lobby.").arg(RsHtml::plainText(str)), ChatWidget::MSGTYPE_SYSTEM);
|
||||||
emit peerLeft(id()) ;
|
emit peerLeft(id()) ;
|
||||||
break;
|
break;
|
||||||
case RS_CHAT_LOBBY_EVENT_PEER_JOINED:
|
case RS_CHAT_LOBBY_EVENT_PEER_JOINED:
|
||||||
qsParticipant=str;
|
qsParticipant=str;
|
||||||
ui.chatWidget->addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 joined the lobby.").arg(RsHtml::plainText(str)), ChatWidget::TYPE_SYSTEM);
|
ui.chatWidget->addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 joined the lobby.").arg(RsHtml::plainText(str)), ChatWidget::MSGTYPE_SYSTEM);
|
||||||
emit peerJoined(id()) ;
|
emit peerJoined(id()) ;
|
||||||
break;
|
break;
|
||||||
case RS_CHAT_LOBBY_EVENT_PEER_STATUS:
|
case RS_CHAT_LOBBY_EVENT_PEER_STATUS:
|
||||||
@ -537,7 +537,7 @@ void ChatLobbyDialog::displayLobbyEvent(int event_type, const QString& nickname,
|
|||||||
break;
|
break;
|
||||||
case RS_CHAT_LOBBY_EVENT_PEER_CHANGE_NICKNAME:
|
case RS_CHAT_LOBBY_EVENT_PEER_CHANGE_NICKNAME:
|
||||||
qsParticipant=str;
|
qsParticipant=str;
|
||||||
ui.chatWidget->addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 changed his name to: %2").arg(RsHtml::plainText(nickname), RsHtml::plainText(str)), ChatWidget::TYPE_SYSTEM);
|
ui.chatWidget->addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), tr("%1 changed his name to: %2").arg(RsHtml::plainText(nickname), RsHtml::plainText(str)), ChatWidget::MSGTYPE_SYSTEM);
|
||||||
|
|
||||||
// TODO if a user was muted and changed his name, update mute list, but only, when the muted peer, dont change his name to a other peer in your chat lobby
|
// TODO if a user was muted and changed his name, update mute list, but only, when the muted peer, dont change his name to a other peer in your chat lobby
|
||||||
if (isParticipantMuted(nickname) && !isNicknameInLobby(str)) {
|
if (isParticipantMuted(nickname) && !isNicknameInLobby(str)) {
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include <retroshare/rspeers.h>
|
#include <retroshare/rspeers.h>
|
||||||
#include <retroshare/rshistory.h>
|
#include <retroshare/rshistory.h>
|
||||||
#include <retroshare/rsmsgs.h>
|
#include <retroshare/rsmsgs.h>
|
||||||
|
#include <retroshare/rsplugin.h>
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
@ -67,7 +68,7 @@ ChatWidget::ChatWidget(QWidget *parent) :
|
|||||||
newMessages = false;
|
newMessages = false;
|
||||||
typing = false;
|
typing = false;
|
||||||
peerStatus = 0;
|
peerStatus = 0;
|
||||||
isChatLobby = false;
|
mChatType = CHATTYPE_UNKNOWN;
|
||||||
firstShow = true;
|
firstShow = true;
|
||||||
inChatCharFormatChanged = false;
|
inChatCharFormatChanged = false;
|
||||||
completer = NULL;
|
completer = NULL;
|
||||||
@ -152,6 +153,11 @@ ChatWidget::~ChatWidget()
|
|||||||
{
|
{
|
||||||
processSettings(false);
|
processSettings(false);
|
||||||
|
|
||||||
|
/* Cleanup plugin functions */
|
||||||
|
foreach (ChatWidgetHolder *chatWidgetHolder, mChatWidgetHolder) {
|
||||||
|
delete(chatWidgetHolder);
|
||||||
|
}
|
||||||
|
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,10 +184,26 @@ void ChatWidget::init(const std::string &peerId, const QString &title)
|
|||||||
|
|
||||||
ChatLobbyId lid;
|
ChatLobbyId lid;
|
||||||
if (rsMsgs->isLobbyId(peerId, lid)) {
|
if (rsMsgs->isLobbyId(peerId, lid)) {
|
||||||
isChatLobby = true;
|
mChatType = CHATTYPE_LOBBY;
|
||||||
chatStyle.setStyleFromSettings(ChatStyle::TYPE_PUBLIC);
|
|
||||||
} else {
|
} else {
|
||||||
|
uint32_t status;
|
||||||
|
std::string pgp_id;
|
||||||
|
if (rsMsgs->getDistantChatStatus(peerId, status, pgp_id)) {
|
||||||
|
mChatType = CHATTYPE_DISTANT;
|
||||||
|
} else {
|
||||||
|
mChatType = CHATTYPE_PRIVATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (mChatType) {
|
||||||
|
case CHATTYPE_UNKNOWN:
|
||||||
|
case CHATTYPE_PRIVATE:
|
||||||
|
case CHATTYPE_DISTANT:
|
||||||
chatStyle.setStyleFromSettings(ChatStyle::TYPE_PRIVATE);
|
chatStyle.setStyleFromSettings(ChatStyle::TYPE_PRIVATE);
|
||||||
|
break;
|
||||||
|
case CHATTYPE_LOBBY:
|
||||||
|
chatStyle.setStyleFromSettings(ChatStyle::TYPE_PUBLIC);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentColor.setNamedColor(PeerSettings->getPrivateChatColor(peerId));
|
currentColor.setNamedColor(PeerSettings->getPrivateChatColor(peerId));
|
||||||
@ -194,7 +216,30 @@ void ChatWidget::init(const std::string &peerId, const QString &title)
|
|||||||
// load style
|
// load style
|
||||||
PeerSettings->getStyle(peerId, "ChatWidget", style);
|
PeerSettings->getStyle(peerId, "ChatWidget", style);
|
||||||
|
|
||||||
if (!isChatLobby) {
|
/* Add plugin functions */
|
||||||
|
int pluginCount = rsPlugins->nbPlugins();
|
||||||
|
for (int i = 0; i < pluginCount; ++i) {
|
||||||
|
RsPlugin *plugin = rsPlugins->plugin(i);
|
||||||
|
if (plugin) {
|
||||||
|
ChatWidgetHolder *chatWidgetHolder = plugin->qt_get_chat_widget_holder(this);
|
||||||
|
if (chatWidgetHolder) {
|
||||||
|
mChatWidgetHolder.push_back(chatWidgetHolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t hist_chat_type;
|
||||||
|
int messageCount;
|
||||||
|
|
||||||
|
if (chatType() == CHATTYPE_LOBBY) {
|
||||||
|
hist_chat_type = RS_HISTORY_TYPE_LOBBY;
|
||||||
|
messageCount = Settings->getLobbyChatHistoryCount();
|
||||||
|
|
||||||
|
updateTitle();
|
||||||
|
} else {
|
||||||
|
hist_chat_type = RS_HISTORY_TYPE_PRIVATE ;
|
||||||
|
messageCount = Settings->getPrivateChatHistoryCount();
|
||||||
|
|
||||||
// initialize first status
|
// initialize first status
|
||||||
StatusInfo peerStatusInfo;
|
StatusInfo peerStatusInfo;
|
||||||
// No check of return value. Non existing status info is handled as offline.
|
// No check of return value. Non existing status info is handled as offline.
|
||||||
@ -204,12 +249,8 @@ void ChatWidget::init(const std::string &peerId, const QString &title)
|
|||||||
// initialize first custom state string
|
// initialize first custom state string
|
||||||
QString customStateString = QString::fromUtf8(rsMsgs->getCustomStateString(peerId).c_str());
|
QString customStateString = QString::fromUtf8(rsMsgs->getCustomStateString(peerId).c_str());
|
||||||
updatePeersCustomStateString(QString::fromStdString(peerId), customStateString);
|
updatePeersCustomStateString(QString::fromStdString(peerId), customStateString);
|
||||||
} else {
|
|
||||||
updateTitle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t hist_chat_type = isChatLobby?RS_HISTORY_TYPE_LOBBY:RS_HISTORY_TYPE_PRIVATE ;
|
|
||||||
int messageCount = isChatLobby?(Settings->getLobbyChatHistoryCount()):(Settings->getPrivateChatHistoryCount());
|
|
||||||
|
|
||||||
if (rsHistory->getEnable(hist_chat_type))
|
if (rsHistory->getEnable(hist_chat_type))
|
||||||
{
|
{
|
||||||
@ -222,7 +263,7 @@ void ChatWidget::init(const std::string &peerId, const QString &title)
|
|||||||
|
|
||||||
std::list<HistoryMsg>::iterator historyIt;
|
std::list<HistoryMsg>::iterator historyIt;
|
||||||
for (historyIt = historyMsgs.begin(); historyIt != historyMsgs.end(); historyIt++)
|
for (historyIt = historyMsgs.begin(); historyIt != historyMsgs.end(); historyIt++)
|
||||||
addChatMsg(historyIt->incoming, QString::fromUtf8(historyIt->peerName.c_str()), QDateTime::fromTime_t(historyIt->sendTime), QDateTime::fromTime_t(historyIt->recvTime), QString::fromUtf8(historyIt->message.c_str()), TYPE_HISTORY);
|
addChatMsg(historyIt->incoming, QString::fromUtf8(historyIt->peerName.c_str()), QDateTime::fromTime_t(historyIt->sendTime), QDateTime::fromTime_t(historyIt->recvTime), QString::fromUtf8(historyIt->message.c_str()), MSGTYPE_HISTORY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +313,7 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event)
|
|||||||
updateStatusTyping();
|
updateStatusTyping();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isChatLobby) {
|
if (chatType() == CHATTYPE_LOBBY) {
|
||||||
if (keyEvent->key() == Qt::Key_Tab) {
|
if (keyEvent->key() == Qt::Key_Tab) {
|
||||||
completeNickname((bool)(keyEvent->modifiers() & Qt::ShiftModifier));
|
completeNickname((bool)(keyEvent->modifiers() & Qt::ShiftModifier));
|
||||||
return true; // eat event
|
return true; // eat event
|
||||||
@ -524,7 +565,7 @@ void ChatWidget::setWelcomeMessage(QString &text)
|
|||||||
ui->textBrowser->setText(text);
|
ui->textBrowser->setText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatWidget::addChatMsg(bool incoming, const QString &name, const QDateTime &sendTime, const QDateTime &recvTime, const QString &message, enumChatType chatType)
|
void ChatWidget::addChatMsg(bool incoming, const QString &name, const QDateTime &sendTime, const QDateTime &recvTime, const QString &message, MsgType chatType)
|
||||||
{
|
{
|
||||||
#ifdef CHAT_DEBUG
|
#ifdef CHAT_DEBUG
|
||||||
std::cout << "ChatWidget::addChatMsg message : " << message.toStdString() << std::endl;
|
std::cout << "ChatWidget::addChatMsg message : " << message.toStdString() << std::endl;
|
||||||
@ -564,18 +605,18 @@ void ChatWidget::addChatMsg(bool incoming, const QString &name, const QDateTime
|
|||||||
}
|
}
|
||||||
|
|
||||||
ChatStyle::enumFormatMessage type;
|
ChatStyle::enumFormatMessage type;
|
||||||
if (chatType == TYPE_OFFLINE) {
|
if (chatType == MSGTYPE_OFFLINE) {
|
||||||
type = ChatStyle::FORMATMSG_OOUTGOING;
|
type = ChatStyle::FORMATMSG_OOUTGOING;
|
||||||
} else if (chatType == TYPE_SYSTEM) {
|
} else if (chatType == MSGTYPE_SYSTEM) {
|
||||||
type = ChatStyle::FORMATMSG_SYSTEM;
|
type = ChatStyle::FORMATMSG_SYSTEM;
|
||||||
} else if (chatType == TYPE_HISTORY || addDate) {
|
} else if (chatType == MSGTYPE_HISTORY || addDate) {
|
||||||
lastMsgDate=QDate::currentDate();
|
lastMsgDate=QDate::currentDate();
|
||||||
type = incoming ? ChatStyle::FORMATMSG_HINCOMING : ChatStyle::FORMATMSG_HOUTGOING;
|
type = incoming ? ChatStyle::FORMATMSG_HINCOMING : ChatStyle::FORMATMSG_HOUTGOING;
|
||||||
} else {
|
} else {
|
||||||
type = incoming ? ChatStyle::FORMATMSG_INCOMING : ChatStyle::FORMATMSG_OUTGOING;
|
type = incoming ? ChatStyle::FORMATMSG_INCOMING : ChatStyle::FORMATMSG_OUTGOING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chatType == TYPE_SYSTEM) {
|
if (chatType == MSGTYPE_SYSTEM) {
|
||||||
formatFlag |= CHAT_FORMATMSG_SYSTEM;
|
formatFlag |= CHAT_FORMATMSG_SYSTEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -587,7 +628,7 @@ void ChatWidget::addChatMsg(bool incoming, const QString &name, const QDateTime
|
|||||||
|
|
||||||
resetStatusBar();
|
resetStatusBar();
|
||||||
|
|
||||||
if (incoming && chatType == TYPE_NORMAL) {
|
if (incoming && chatType == MSGTYPE_NORMAL) {
|
||||||
emit newMessage(this);
|
emit newMessage(this);
|
||||||
|
|
||||||
if (!isActive()) {
|
if (!isActive()) {
|
||||||
@ -697,7 +738,7 @@ void ChatWidget::sendChat()
|
|||||||
|
|
||||||
if (rsMsgs->sendPrivateChat(peerId, msg)) {
|
if (rsMsgs->sendPrivateChat(peerId, msg)) {
|
||||||
QDateTime currentTime = QDateTime::currentDateTime();
|
QDateTime currentTime = QDateTime::currentDateTime();
|
||||||
addChatMsg(false, name, currentTime, currentTime, QString::fromStdWString(msg), TYPE_NORMAL);
|
addChatMsg(false, name, currentTime, currentTime, QString::fromStdWString(msg), MSGTYPE_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
chatWidget->clear();
|
chatWidget->clear();
|
||||||
@ -900,7 +941,7 @@ void ChatWidget::setCurrentFileName(const QString &fileName)
|
|||||||
|
|
||||||
void ChatWidget::updateStatus(const QString &peer_id, int status)
|
void ChatWidget::updateStatus(const QString &peer_id, int status)
|
||||||
{
|
{
|
||||||
if (isChatLobby) {
|
if (chatType() == CHATTYPE_LOBBY) {
|
||||||
// updateTitle is used
|
// updateTitle is used
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -961,6 +1002,11 @@ void ChatWidget::updateStatus(const QString &peer_id, int status)
|
|||||||
emit infoChanged(this);
|
emit infoChanged(this);
|
||||||
emit statusChanged(status);
|
emit statusChanged(status);
|
||||||
|
|
||||||
|
// Notify all ChatWidgetHolder
|
||||||
|
foreach (ChatWidgetHolder *chatWidgetHolder, mChatWidgetHolder) {
|
||||||
|
chatWidgetHolder->updateStatus(status);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -969,7 +1015,7 @@ void ChatWidget::updateStatus(const QString &peer_id, int status)
|
|||||||
|
|
||||||
void ChatWidget::updateTitle()
|
void ChatWidget::updateTitle()
|
||||||
{
|
{
|
||||||
if (!isChatLobby) {
|
if (!chatType() != CHATTYPE_LOBBY) {
|
||||||
// updateStatus is used
|
// updateStatus is used
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -35,22 +35,41 @@
|
|||||||
class QAction;
|
class QAction;
|
||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
class QPushButton;
|
class QPushButton;
|
||||||
|
class ChatWidget;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class ChatWidget;
|
class ChatWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// a Container for the logic behind buttons in a PopupChatDialog
|
||||||
|
// Plugins can implement this interface to provide their own buttons
|
||||||
|
class ChatWidgetHolder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ChatWidgetHolder(ChatWidget *chatWidget) : mChatWidget(chatWidget) {}
|
||||||
|
virtual ~ChatWidgetHolder() {}
|
||||||
|
|
||||||
|
// status comes from notifyPeerStatusChanged
|
||||||
|
// see rststaus.h for possible values
|
||||||
|
virtual void updateStatus(int /*status*/) {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ChatWidget *mChatWidget;
|
||||||
|
};
|
||||||
|
|
||||||
class ChatWidget : public QWidget
|
class ChatWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum enumChatType { TYPE_NORMAL, TYPE_HISTORY, TYPE_OFFLINE, TYPE_SYSTEM };
|
enum MsgType { MSGTYPE_NORMAL, MSGTYPE_HISTORY, MSGTYPE_OFFLINE, MSGTYPE_SYSTEM };
|
||||||
|
enum ChatType { CHATTYPE_UNKNOWN, CHATTYPE_PRIVATE, CHATTYPE_LOBBY, CHATTYPE_DISTANT };
|
||||||
|
|
||||||
explicit ChatWidget(QWidget *parent = 0);
|
explicit ChatWidget(QWidget *parent = 0);
|
||||||
~ChatWidget();
|
~ChatWidget();
|
||||||
|
|
||||||
void init(const std::string &peerId, const QString &title);
|
void init(const std::string &peerId, const QString &title);
|
||||||
|
ChatType chatType() { return mChatType; }
|
||||||
|
|
||||||
bool hasNewMessages() { return newMessages; }
|
bool hasNewMessages() { return newMessages; }
|
||||||
bool isTyping() { return typing; }
|
bool isTyping() { return typing; }
|
||||||
@ -60,7 +79,7 @@ public:
|
|||||||
void removeFromParent(QWidget *oldParent);
|
void removeFromParent(QWidget *oldParent);
|
||||||
|
|
||||||
void setWelcomeMessage(QString &text);
|
void setWelcomeMessage(QString &text);
|
||||||
void addChatMsg(bool incoming, const QString &name, const QDateTime &sendTime, const QDateTime &recvTime, const QString &message, enumChatType chatType);
|
void addChatMsg(bool incoming, const QString &name, const QDateTime &sendTime, const QDateTime &recvTime, const QString &message, MsgType chatType);
|
||||||
void updateStatusString(const QString &statusMask, const QString &statusString);
|
void updateStatusString(const QString &statusMask, const QString &statusString);
|
||||||
|
|
||||||
void addToolsAction(QAction *action);
|
void addToolsAction(QAction *action);
|
||||||
@ -79,6 +98,8 @@ public:
|
|||||||
void setDefaultExtraFileFlags(TransferRequestFlags f) ;
|
void setDefaultExtraFileFlags(TransferRequestFlags f) ;
|
||||||
void pasteText(const QString&);
|
void pasteText(const QString&);
|
||||||
|
|
||||||
|
const QList<ChatWidgetHolder*> &chatWidgetHolderList() { return mChatWidgetHolder; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void updateStatus(const QString &peer_id, int status);
|
void updateStatus(const QString &peer_id, int status);
|
||||||
|
|
||||||
@ -151,7 +172,7 @@ private:
|
|||||||
bool newMessages;
|
bool newMessages;
|
||||||
bool typing;
|
bool typing;
|
||||||
int peerStatus;
|
int peerStatus;
|
||||||
bool isChatLobby;
|
ChatType mChatType;
|
||||||
|
|
||||||
time_t lastStatusSendTime;
|
time_t lastStatusSendTime;
|
||||||
|
|
||||||
@ -166,6 +187,8 @@ private:
|
|||||||
|
|
||||||
QCompleter *completer;
|
QCompleter *completer;
|
||||||
|
|
||||||
|
QList<ChatWidgetHolder*> mChatWidgetHolder;
|
||||||
|
|
||||||
Ui::ChatWidget *ui;
|
Ui::ChatWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -51,18 +51,8 @@ PopupChatDialog::PopupChatDialog(QWidget *parent, Qt::WindowFlags flags)
|
|||||||
connect(NotifyQt::getInstance(), SIGNAL(chatStatusChanged(const QString&, const QString&, bool)), this, SLOT(chatStatusChanged(const QString&, const QString&, bool)));
|
connect(NotifyQt::getInstance(), SIGNAL(chatStatusChanged(const QString&, const QString&, bool)), this, SLOT(chatStatusChanged(const QString&, const QString&, bool)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PopupChatDialog::addWidgets(PopupChatDialog_WidgetsHolder *wh){
|
|
||||||
widgetsHolders.push_back(wh);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<PopupChatDialog_WidgetsHolder*> PopupChatDialog::getWidgets(){
|
|
||||||
return widgetsHolders;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PopupChatDialog::init(const std::string &peerId, const QString &title)
|
void PopupChatDialog::init(const std::string &peerId, const QString &title)
|
||||||
{
|
{
|
||||||
connect(ui.chatWidget, SIGNAL(statusChanged(int)), this, SLOT(statusChanged(int)));
|
|
||||||
|
|
||||||
ChatDialog::init(peerId, title);
|
ChatDialog::init(peerId, title);
|
||||||
|
|
||||||
/* Hide or show the avatar frames */
|
/* Hide or show the avatar frames */
|
||||||
@ -87,18 +77,6 @@ void PopupChatDialog::init(const std::string &peerId, const QString &title)
|
|||||||
|
|
||||||
// load settings
|
// load settings
|
||||||
processSettings(true);
|
processSettings(true);
|
||||||
|
|
||||||
// Add ChatBarWidgets from Plugins
|
|
||||||
std::vector<PopupChatDialog_WidgetsHolder*>::iterator it;
|
|
||||||
for(it = widgetsHolders.begin(); it != widgetsHolders.end(); ++it){
|
|
||||||
PopupChatDialog_WidgetsHolder *wh = *it;
|
|
||||||
wh->init(peerId, title, ui.chatWidget);
|
|
||||||
std::vector<QWidget*> widgetsVector = wh->getWidgets();
|
|
||||||
std::vector<QWidget*>::iterator it2;
|
|
||||||
for(it2 = widgetsVector.begin(); it2 != widgetsVector.end(); ++it2){
|
|
||||||
addChatBarWidget(*it2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Destructor. */
|
/** Destructor. */
|
||||||
@ -106,12 +84,6 @@ PopupChatDialog::~PopupChatDialog()
|
|||||||
{
|
{
|
||||||
// save settings
|
// save settings
|
||||||
processSettings(false);
|
processSettings(false);
|
||||||
|
|
||||||
std::vector<PopupChatDialog_WidgetsHolder*>::iterator it;
|
|
||||||
for(it = widgetsHolders.begin(); it != widgetsHolders.end(); ++it){
|
|
||||||
PopupChatDialog_WidgetsHolder *wh = *it;
|
|
||||||
delete wh;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatWidget *PopupChatDialog::getChatWidget()
|
ChatWidget *PopupChatDialog::getChatWidget()
|
||||||
@ -163,15 +135,10 @@ void PopupChatDialog::addIncomingChatMsg(const ChatInfo& info)
|
|||||||
QString message = QString::fromStdWString(info.msg);
|
QString message = QString::fromStdWString(info.msg);
|
||||||
QString name = getPeerName(info.rsid) ;
|
QString name = getPeerName(info.rsid) ;
|
||||||
|
|
||||||
cw->addChatMsg(true, name, sendTime, recvTime, message, ChatWidget::TYPE_NORMAL);
|
cw->addChatMsg(true, name, sendTime, recvTime, message, ChatWidget::MSGTYPE_NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PopupChatDialog::addChatBarWidget(QWidget *w)
|
|
||||||
{
|
|
||||||
getChatWidget()->addChatBarWidget(w) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PopupChatDialog::onChatChanged(int list, int type)
|
void PopupChatDialog::onChatChanged(int list, int type)
|
||||||
{
|
{
|
||||||
if (list == NOTIFY_LIST_PRIVATE_OUTGOING_CHAT) {
|
if (list == NOTIFY_LIST_PRIVATE_OUTGOING_CHAT) {
|
||||||
@ -204,7 +171,7 @@ void PopupChatDialog::onChatChanged(int list, int type)
|
|||||||
QDateTime recvTime = QDateTime::fromTime_t(it->recvTime);
|
QDateTime recvTime = QDateTime::fromTime_t(it->recvTime);
|
||||||
QString message = QString::fromStdWString(it->msg);
|
QString message = QString::fromStdWString(it->msg);
|
||||||
|
|
||||||
ui.chatWidget->addChatMsg(false, name, sendTime, recvTime, message, ChatWidget::TYPE_OFFLINE);
|
ui.chatWidget->addChatMsg(false, name, sendTime, recvTime, message, ChatWidget::MSGTYPE_OFFLINE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +190,7 @@ void PopupChatDialog::onChatChanged(int list, int type)
|
|||||||
QDateTime recvTime = QDateTime::fromTime_t(it->recvTime);
|
QDateTime recvTime = QDateTime::fromTime_t(it->recvTime);
|
||||||
QString message = QString::fromStdWString(it->msg);
|
QString message = QString::fromStdWString(it->msg);
|
||||||
|
|
||||||
ui.chatWidget->addChatMsg(false, name, sendTime, recvTime, message, ChatWidget::TYPE_NORMAL);
|
ui.chatWidget->addChatMsg(false, name, sendTime, recvTime, message, ChatWidget::MSGTYPE_NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,15 +228,3 @@ void PopupChatDialog::clearOfflineMessages()
|
|||||||
rsMsgs->clearPrivateChatQueue(false, peerId);
|
rsMsgs->clearPrivateChatQueue(false, peerId);
|
||||||
manualDelete = false;
|
manualDelete = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PopupChatDialog::statusChanged(int status)
|
|
||||||
{
|
|
||||||
updateStatus(status);
|
|
||||||
|
|
||||||
// Notify Plugins
|
|
||||||
std::vector<PopupChatDialog_WidgetsHolder*>::iterator it;
|
|
||||||
for(it = widgetsHolders.begin(); it != widgetsHolders.end(); ++it){
|
|
||||||
PopupChatDialog_WidgetsHolder *wh = *it;
|
|
||||||
wh->updateStatus(status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -28,34 +28,16 @@
|
|||||||
|
|
||||||
#include <retroshare/rsmsgs.h>
|
#include <retroshare/rsmsgs.h>
|
||||||
|
|
||||||
// a Container for the logic behind buttons in a PopupChatDialog
|
|
||||||
// Plugins can implement this interface to provide their own buttons
|
|
||||||
class PopupChatDialog_WidgetsHolder{
|
|
||||||
public:
|
|
||||||
virtual ~PopupChatDialog_WidgetsHolder(){}
|
|
||||||
virtual void init(const std::string &peerId, const QString &title, ChatWidget* chatWidget) = 0;
|
|
||||||
virtual std::vector<QWidget*> getWidgets() = 0;
|
|
||||||
|
|
||||||
// status comes from notifyPeerStatusChanged
|
|
||||||
// see rststaus.h for possible values
|
|
||||||
virtual void updateStatus(int status) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PopupChatDialog : public ChatDialog
|
class PopupChatDialog : public ChatDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
friend class ChatDialog;
|
friend class ChatDialog;
|
||||||
|
|
||||||
public:
|
|
||||||
virtual void addWidgets(PopupChatDialog_WidgetsHolder *wh);
|
|
||||||
virtual std::vector<PopupChatDialog_WidgetsHolder*> getWidgets();
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void showAvatarFrame(bool show);
|
void showAvatarFrame(bool show);
|
||||||
void clearOfflineMessages();
|
void clearOfflineMessages();
|
||||||
void chatStatusChanged(const QString &peerId, const QString &statusString, bool isPrivateChat);
|
void chatStatusChanged(const QString &peerId, const QString &statusString, bool isPrivateChat);
|
||||||
void statusChanged(int);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** Default constructor */
|
/** Default constructor */
|
||||||
@ -73,9 +55,6 @@ protected:
|
|||||||
|
|
||||||
void processSettings(bool load);
|
void processSettings(bool load);
|
||||||
|
|
||||||
// used by plugins
|
|
||||||
void addChatBarWidget(QWidget *w) ;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void addIncomingChatMsg(const ChatInfo& info);
|
virtual void addIncomingChatMsg(const ChatInfo& info);
|
||||||
virtual void onChatChanged(int list, int type);
|
virtual void onChatChanged(int list, int type);
|
||||||
@ -83,7 +62,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
bool manualDelete;
|
bool manualDelete;
|
||||||
std::list<ChatInfo> savedOfflineChat;
|
std::list<ChatInfo> savedOfflineChat;
|
||||||
std::vector<PopupChatDialog_WidgetsHolder*> widgetsHolders;
|
|
||||||
|
|
||||||
/** Qt Designer generated object */
|
/** Qt Designer generated object */
|
||||||
Ui::PopupChatDialog ui;
|
Ui::PopupChatDialog ui;
|
||||||
|
@ -50,7 +50,7 @@ PopupDistantChatDialog::PopupDistantChatDialog(QWidget *parent, Qt::WindowFlags
|
|||||||
|
|
||||||
_update_timer->start() ;
|
_update_timer->start() ;
|
||||||
|
|
||||||
addChatBarWidget(_status_label) ;
|
getChatWidget()->addChatBarWidget(_status_label) ;
|
||||||
updateDisplay() ;
|
updateDisplay() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,11 +146,3 @@ QString PopupDistantChatDialog::getPeerName(const std::string& id) const
|
|||||||
else
|
else
|
||||||
return ChatDialog::getPeerName(id) ;
|
return ChatDialog::getPeerName(id) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user