mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-12-10 06:15:50 -05:00
Added "peer is typing" functionality to private chat. This shoudld be extended to additional stuff like "idle", and to public chat. Also the display is the status bar of the chat window could be made nicer, e.g. directly in the msg window. Suppressed ChatDialog class that is not more used
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1164 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
ce3db07a63
commit
e144e75ba6
18 changed files with 495 additions and 975 deletions
|
|
@ -1,529 +0,0 @@
|
|||
/****************************************************************
|
||||
* RetroShare is distributed under the following license:
|
||||
*
|
||||
* Copyright (C) 2006, crypton
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
****************************************************************/
|
||||
#include <QtGui>
|
||||
|
||||
#include "rshare.h"
|
||||
#include "ChatDialog.h"
|
||||
|
||||
#include "rsiface/rsiface.h"
|
||||
#include "rsiface/rspeers.h"
|
||||
#include "rsiface/rsmsgs.h"
|
||||
#include "rsiface/rsnotify.h"
|
||||
|
||||
#include "chat/PopupChatDialog.h"
|
||||
#include <sstream>
|
||||
|
||||
#include <QTextCodec>
|
||||
#include <QTextEdit>
|
||||
#include <QTextCursor>
|
||||
#include <QTextList>
|
||||
#include <QTextStream>
|
||||
#include <QTextDocumentFragment>
|
||||
|
||||
#include <QContextMenuEvent>
|
||||
#include <QMenu>
|
||||
#include <QCursor>
|
||||
#include <QPoint>
|
||||
#include <QMouseEvent>
|
||||
#include <QPixmap>
|
||||
#include <QHeaderView>
|
||||
#include <QtGui/QKeyEvent>
|
||||
|
||||
/** Constructor */
|
||||
ChatDialog::ChatDialog(QWidget *parent)
|
||||
: MainPage (parent)
|
||||
{
|
||||
/* Invoke the Qt Designer generated object setup routine */
|
||||
ui.setupUi(this);
|
||||
|
||||
loadEmoticonsgroupchat();
|
||||
|
||||
setWindowIcon(QIcon(QString(":/images/rstray3.png")));
|
||||
|
||||
connect(ui.lineEdit, SIGNAL(textChanged ( ) ), this, SLOT(checkChat( ) ));
|
||||
connect(ui.Sendbtn, SIGNAL(clicked()), this, SLOT(sendMsg()));
|
||||
connect(ui.emoticonBtn, SIGNAL(clicked()), this, SLOT(smileyWidgetgroupchat()));
|
||||
|
||||
|
||||
connect( ui.msgSendList, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( msgSendListCostumPopupMenu( QPoint ) ) );
|
||||
connect( ui.msgText, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayInfoChatMenu(const QPoint&)));
|
||||
|
||||
connect(ui.textboldChatButton, SIGNAL(clicked()), this, SLOT(setFont()));
|
||||
connect(ui.textunderlineChatButton, SIGNAL(clicked()), this, SLOT(setFont()));
|
||||
connect(ui.textitalicChatButton, SIGNAL(clicked()), this, SLOT(setFont()));
|
||||
connect(ui.fontsButton, SIGNAL(clicked()), this, SLOT(getFont()));
|
||||
connect(ui.colorChatButton, SIGNAL(clicked()), this, SLOT(setColor()));
|
||||
|
||||
ui.fontsButton->setIcon(QIcon(QString(":/images/fonts.png")));
|
||||
|
||||
// connect(ui.msgSendList, SIGNAL(itemChanged( QTreeWidgetItem *, int ) ),
|
||||
// this, SLOT(toggleSendItem( QTreeWidgetItem *, int ) ));
|
||||
|
||||
|
||||
/* hide the Tree +/- */
|
||||
ui.msgSendList -> setRootIsDecorated( false );
|
||||
|
||||
/* to hide the header */
|
||||
ui.msgSendList->header()->hide();
|
||||
|
||||
_currentColor = Qt::black;
|
||||
QPixmap pxm(24,24);
|
||||
pxm.fill(_currentColor);
|
||||
ui.colorChatButton->setIcon(pxm);
|
||||
|
||||
//QFont font = QFont("Comic Sans MS", 10);
|
||||
mCurrentFont = QFont("Comic Sans MS", 12);
|
||||
ui.lineEdit->setFont(mCurrentFont);
|
||||
|
||||
setChatInfo(tr("Welcome to RetroShare's group chat."), QString::fromUtf8("blue"));
|
||||
|
||||
QMenu * grpchatmenu = new QMenu();
|
||||
grpchatmenu->addAction(ui.actionClearChat);
|
||||
ui.menuButton->setMenu(grpchatmenu);
|
||||
|
||||
_underline = false;
|
||||
|
||||
QTimer *timer = new QTimer(this);
|
||||
timer->connect(timer, SIGNAL(timeout()), this, SLOT(insertChat()));
|
||||
timer->start(500); /* half a second */
|
||||
|
||||
/* Hide platform specific features */
|
||||
#ifdef Q_WS_WIN
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void ChatDialog::msgSendListCostumPopupMenu( QPoint point )
|
||||
{
|
||||
|
||||
QMenu contextMnu( this );
|
||||
QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier );
|
||||
|
||||
privchatAct = new QAction(QIcon(), tr( "Chat" ), this );
|
||||
connect( privchatAct , SIGNAL( triggered() ), this, SLOT( privchat() ) );
|
||||
|
||||
contextMnu.clear();
|
||||
contextMnu.addAction( privchatAct);
|
||||
contextMnu.exec( mevent->globalPos() );
|
||||
}
|
||||
|
||||
void ChatDialog::insertChat()
|
||||
{
|
||||
if (!rsMsgs->chatAvailable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<ChatInfo> newchat;
|
||||
if (!rsMsgs->getNewChat(newchat))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QTextEdit *msgWidget = ui.msgText;
|
||||
std::list<ChatInfo>::iterator it;
|
||||
|
||||
|
||||
/** A RshareSettings object used for saving/loading settings */
|
||||
RshareSettings settings;
|
||||
uint chatflags = settings.getChatFlags();
|
||||
|
||||
/* add in lines at the bottom */
|
||||
for(it = newchat.begin(); it != newchat.end(); it++)
|
||||
{
|
||||
std::string msg(it->msg.begin(), it->msg.end());
|
||||
std::cerr << "ChatDialog::insertChat(): " << msg << std::endl;
|
||||
|
||||
/* are they private? */
|
||||
if (it->chatflags & RS_CHAT_PRIVATE)
|
||||
{
|
||||
std::cerr << "ChatDialog::insert(Private)Chat(): ";
|
||||
std::cerr << "Flags(" << chatflags << ") " << msg << std::endl;
|
||||
|
||||
PopupChatDialog *pcd = getPrivateChat(it->rsid, it->name, chatflags);
|
||||
pcd->addChatMsg(&(*it));
|
||||
continue;
|
||||
}
|
||||
|
||||
std::ostringstream out;
|
||||
QString currenttxt = msgWidget->toHtml();
|
||||
QString extraTxt;
|
||||
|
||||
QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");
|
||||
QString name = QString::fromStdString(it->name);
|
||||
QString line = "<span style=\"color:#C00000\">" + timestamp + "</span>" +
|
||||
"<span style=\"color:#2D84C9\"><strong>" + " " + name + "</strong></span>";
|
||||
|
||||
extraTxt += line;
|
||||
|
||||
extraTxt += QString::fromStdWString(it->msg);
|
||||
|
||||
/* add it everytime */
|
||||
currenttxt += extraTxt;
|
||||
|
||||
QHashIterator<QString, QString> i(smileys);
|
||||
while(i.hasNext())
|
||||
{
|
||||
i.next();
|
||||
currenttxt.replace(i.key(), "<img src=\"" + i.value() + "\">");
|
||||
}
|
||||
|
||||
|
||||
msgWidget->setHtml(currenttxt);
|
||||
|
||||
|
||||
QScrollBar *qsb = msgWidget->verticalScrollBar();
|
||||
qsb -> setValue(qsb->maximum());
|
||||
}
|
||||
}
|
||||
|
||||
void ChatDialog::checkChat()
|
||||
{
|
||||
/* if <return> at the end of the text -> we can send it! */
|
||||
QTextEdit *chatWidget = ui.lineEdit;
|
||||
std::string txt = chatWidget->toPlainText().toStdString();
|
||||
if ('\n' == txt[txt.length()-1])
|
||||
{
|
||||
//std::cerr << "Found <return> found at end of :" << txt << ": should send!";
|
||||
//std::cerr << std::endl;
|
||||
if (txt.length()-1 == txt.find('\n')) /* only if on first line! */
|
||||
{
|
||||
/* should remove last char ... */
|
||||
sendMsg();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//std::cerr << "No <return> found in :" << txt << ":";
|
||||
//std::cerr << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void ChatDialog::sendMsg()
|
||||
{
|
||||
QTextEdit *lineWidget = ui.lineEdit;
|
||||
|
||||
ChatInfo ci;
|
||||
//ci.msg = lineWidget->Text().toStdWString();
|
||||
ci.msg = lineWidget->toHtml().toStdWString();
|
||||
ci.chatflags = RS_CHAT_PUBLIC;
|
||||
|
||||
std::string msg(ci.msg.begin(), ci.msg.end());
|
||||
//std::cerr << "ChatDialog::sendMsg(): " << msg << std::endl;
|
||||
|
||||
rsMsgs -> ChatSend(ci);
|
||||
ui.lineEdit->clear();
|
||||
setFont();
|
||||
|
||||
/* redraw send list */
|
||||
insertSendList();
|
||||
|
||||
}
|
||||
|
||||
void ChatDialog::insertSendList()
|
||||
{
|
||||
std::list<std::string> peers;
|
||||
std::list<std::string>::iterator it;
|
||||
|
||||
if (!rsPeers)
|
||||
{
|
||||
/* not ready yet! */
|
||||
return;
|
||||
}
|
||||
|
||||
rsPeers->getOnlineList(peers);
|
||||
|
||||
/* get a link to the table */
|
||||
QTreeWidget *sendWidget = ui.msgSendList;
|
||||
QList<QTreeWidgetItem *> items;
|
||||
|
||||
for(it = peers.begin(); it != peers.end(); it++)
|
||||
{
|
||||
|
||||
RsPeerDetails details;
|
||||
if (!rsPeers->getPeerDetails(*it, details))
|
||||
{
|
||||
continue; /* BAD */
|
||||
}
|
||||
|
||||
/* make a widget per friend */
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0);
|
||||
|
||||
/* add all the labels */
|
||||
/* (0) Person */
|
||||
item -> setText(0, QString::fromStdString(details.name));
|
||||
|
||||
item -> setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
|
||||
//item -> setFlags(Qt::ItemIsUserCheckable);
|
||||
|
||||
item -> setCheckState(0, Qt::Checked);
|
||||
|
||||
if (rsicontrol->IsInChat(*it))
|
||||
{
|
||||
item -> setCheckState(0, Qt::Checked);
|
||||
}
|
||||
else
|
||||
{
|
||||
item -> setCheckState(0, Qt::Unchecked);
|
||||
}
|
||||
|
||||
/* disable for the moment */
|
||||
item -> setFlags(Qt::ItemIsUserCheckable);
|
||||
item -> setCheckState(0, Qt::Checked);
|
||||
|
||||
/* add to the list */
|
||||
items.append(item);
|
||||
}
|
||||
|
||||
/* remove old items */
|
||||
sendWidget->clear();
|
||||
sendWidget->setColumnCount(1);
|
||||
|
||||
/* add the items in! */
|
||||
sendWidget->insertTopLevelItems(0, items);
|
||||
|
||||
sendWidget->update(); /* update display */
|
||||
}
|
||||
|
||||
|
||||
/* to toggle the state */
|
||||
|
||||
|
||||
void ChatDialog::toggleSendItem( QTreeWidgetItem *item, int col )
|
||||
{
|
||||
//std::cerr << "ToggleSendItem()" << std::endl;
|
||||
|
||||
/* extract id */
|
||||
std::string id = (item -> text(4)).toStdString();
|
||||
|
||||
/* get state */
|
||||
bool inChat = (Qt::Checked == item -> checkState(0)); /* alway column 0 */
|
||||
|
||||
/* call control fns */
|
||||
|
||||
rsicontrol -> SetInChat(id, inChat);
|
||||
return;
|
||||
}
|
||||
|
||||
void ChatDialog::privchat()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
PopupChatDialog *ChatDialog::getPrivateChat(std::string id, std::string name, uint chatflags)
|
||||
{
|
||||
/* see if it exists already */
|
||||
PopupChatDialog *popupchatdialog = NULL;
|
||||
bool show = false;
|
||||
|
||||
if (chatflags & RS_CHAT_REOPEN)
|
||||
{
|
||||
show = true;
|
||||
std::cerr << "reopen flag so: enable SHOW popupchatdialog()";
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
|
||||
|
||||
std::map<std::string, PopupChatDialog *>::iterator it;
|
||||
if (chatDialogs.end() != (it = chatDialogs.find(id)))
|
||||
{
|
||||
/* exists already */
|
||||
popupchatdialog = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
popupchatdialog = new PopupChatDialog(id, name);
|
||||
chatDialogs[id] = popupchatdialog;
|
||||
|
||||
if (chatflags & RS_CHAT_OPEN_NEW)
|
||||
{
|
||||
std::cerr << "new chat so: enable SHOW popupchatdialog()";
|
||||
std::cerr << std::endl;
|
||||
|
||||
show = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (show)
|
||||
{
|
||||
std::cerr << "SHOWING popupchatdialog()";
|
||||
std::cerr << std::endl;
|
||||
|
||||
popupchatdialog->show();
|
||||
}
|
||||
|
||||
/* now only do these if the window is visible */
|
||||
if (popupchatdialog->isVisible())
|
||||
{
|
||||
if (chatflags & RS_CHAT_FOCUS)
|
||||
{
|
||||
std::cerr << "focus chat flag so: GETFOCUS popupchatdialog()";
|
||||
std::cerr << std::endl;
|
||||
|
||||
popupchatdialog->getfocus();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr << "no focus chat flag so: FLASH popupchatdialog()";
|
||||
std::cerr << std::endl;
|
||||
|
||||
popupchatdialog->flash();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr << "not visible ... so leave popupchatdialog()";
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
|
||||
return popupchatdialog;
|
||||
}
|
||||
|
||||
void ChatDialog::clearOldChats()
|
||||
{
|
||||
/* nothing yet */
|
||||
|
||||
}
|
||||
|
||||
void ChatDialog::setColor()
|
||||
{
|
||||
|
||||
bool ok;
|
||||
QRgb color = QColorDialog::getRgba(ui.lineEdit->textColor().rgba(), &ok, this);
|
||||
if (ok) {
|
||||
_currentColor = QColor(color);
|
||||
QPixmap pxm(24,24);
|
||||
pxm.fill(_currentColor);
|
||||
ui.colorChatButton->setIcon(pxm);
|
||||
}
|
||||
setFont();
|
||||
}
|
||||
|
||||
void ChatDialog::getFont()
|
||||
{
|
||||
bool ok;
|
||||
mCurrentFont = QFontDialog::getFont(&ok, mCurrentFont, this);
|
||||
setFont();
|
||||
}
|
||||
|
||||
void ChatDialog::setFont()
|
||||
{
|
||||
mCurrentFont.setBold(ui.textboldChatButton->isChecked());
|
||||
mCurrentFont.setUnderline(ui.textunderlineChatButton->isChecked());
|
||||
mCurrentFont.setItalic(ui.textitalicChatButton->isChecked());
|
||||
ui.lineEdit->setFont(mCurrentFont);
|
||||
ui.lineEdit->setTextColor(_currentColor);
|
||||
|
||||
ui.lineEdit->setFocus();
|
||||
|
||||
}
|
||||
|
||||
void ChatDialog::underline()
|
||||
{
|
||||
_underline = !_underline;
|
||||
ui.lineEdit->setFontUnderline(_underline);
|
||||
}
|
||||
|
||||
|
||||
// Update Chat Info information
|
||||
void ChatDialog::setChatInfo(QString info, QColor color)
|
||||
{
|
||||
static unsigned int nbLines = 0;
|
||||
++nbLines;
|
||||
// Check log size, clear it if too big
|
||||
if(nbLines > 200) {
|
||||
ui.msgText->clear();
|
||||
nbLines = 1;
|
||||
}
|
||||
ui.msgText->append(QString::fromUtf8("<font color='grey'>")+ QTime::currentTime().toString(QString::fromUtf8("hh:mm:ss")) + QString::fromUtf8("</font> - <font color='") + color.name() +QString::fromUtf8("'><i>") + info + QString::fromUtf8("</i></font>"));
|
||||
}
|
||||
|
||||
void ChatDialog::on_actionClearChat_triggered()
|
||||
{
|
||||
ui.msgText->clear();
|
||||
}
|
||||
|
||||
void ChatDialog::displayInfoChatMenu(const QPoint& pos)
|
||||
{
|
||||
// Log Menu
|
||||
QMenu myChatMenu(this);
|
||||
myChatMenu.addAction(ui.actionClearChat);
|
||||
// XXX: Why mapToGlobal() is not enough?
|
||||
myChatMenu.exec(mapToGlobal(pos)+QPoint(0,80));
|
||||
}
|
||||
|
||||
void ChatDialog::loadEmoticonsgroupchat()
|
||||
{
|
||||
QDir smdir(QApplication::applicationDirPath() + "/emoticons/kopete");
|
||||
QFileInfoList sminfo = smdir.entryInfoList(QStringList() << "*.gif" << "*.png", QDir::Files, QDir::Name);
|
||||
foreach(QFileInfo info, sminfo)
|
||||
{
|
||||
QString smcode = info.fileName().replace(".gif", "");
|
||||
QString smstring;
|
||||
for(int i = 0; i < 9; i+=3)
|
||||
{
|
||||
smstring += QString((char)smcode.mid(i,3).toInt());
|
||||
}
|
||||
//qDebug(smstring.toAscii());
|
||||
smileys.insert(smstring, info.absoluteFilePath());
|
||||
}
|
||||
}
|
||||
|
||||
void ChatDialog::smileyWidgetgroupchat()
|
||||
{
|
||||
qDebug("MainWindow::smileyWidget()");
|
||||
QWidget *smWidget = new QWidget;
|
||||
smWidget->setWindowTitle("Emoticons");
|
||||
smWidget->setWindowIcon(QIcon(QString(":/images/rstray3.png")));
|
||||
smWidget->setFixedSize(256,256);
|
||||
|
||||
|
||||
|
||||
int x = 0, y = 0;
|
||||
|
||||
QHashIterator<QString, QString> i(smileys);
|
||||
while(i.hasNext())
|
||||
{
|
||||
i.next();
|
||||
QPushButton *smButton = new QPushButton("", smWidget);
|
||||
smButton->setGeometry(x*24, y*24, 24,24);
|
||||
smButton->setIconSize(QSize(24,24));
|
||||
smButton->setIcon(QPixmap(i.value()));
|
||||
smButton->setToolTip(i.key());
|
||||
//smButton->setFixedSize(24,24);
|
||||
++x;
|
||||
if(x > 4)
|
||||
{
|
||||
x = 0;
|
||||
y++;
|
||||
}
|
||||
connect(smButton, SIGNAL(clicked()), this, SLOT(addSmileys()));
|
||||
}
|
||||
|
||||
smWidget->show();
|
||||
}
|
||||
|
||||
void ChatDialog::addSmileys()
|
||||
{
|
||||
ui.lineEdit->setText(ui.lineEdit->toHtml() + qobject_cast<QPushButton*>(sender())->toolTip());
|
||||
}
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
/****************************************************************
|
||||
* RetroShare is distributed under the following license:
|
||||
*
|
||||
* Copyright (C) 2006, crypton
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
****************************************************************/
|
||||
|
||||
#ifndef _CHATDIALOG_H
|
||||
#define _CHATDIALOG_H
|
||||
|
||||
#include "mainpage.h"
|
||||
#include "ui_ChatDialog.h"
|
||||
|
||||
#include "chat/PopupChatDialog.h"
|
||||
|
||||
class QFont;
|
||||
class QAction;
|
||||
class QTextEdit;
|
||||
class QTextCharFormat;
|
||||
|
||||
class ChatDialog : public MainPage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
/** Default Constructor */
|
||||
ChatDialog(QWidget *parent = 0);
|
||||
/** Default Destructor */
|
||||
|
||||
PopupChatDialog *getPrivateChat(std::string id, std::string name, uint chatflags);
|
||||
void clearOldChats();
|
||||
|
||||
void loadEmoticonsgroupchat();
|
||||
|
||||
|
||||
|
||||
public slots:
|
||||
|
||||
void insertChat();
|
||||
void setChatInfo(QString info, QColor color=QApplication::palette().color(QPalette::WindowText));
|
||||
|
||||
void smileyWidgetgroupchat();
|
||||
void addSmileys();
|
||||
|
||||
private slots:
|
||||
|
||||
void toggleSendItem( QTreeWidgetItem *item, int col );
|
||||
|
||||
/** Create the context popup menu and it's submenus */
|
||||
void msgSendListCostumPopupMenu( QPoint point );
|
||||
|
||||
void setColor();
|
||||
void insertSendList();
|
||||
void checkChat();
|
||||
void sendMsg();
|
||||
|
||||
void privchat();
|
||||
|
||||
void setFont();
|
||||
void getFont();
|
||||
void underline();
|
||||
|
||||
|
||||
|
||||
void on_actionClearChat_triggered();
|
||||
void displayInfoChatMenu(const QPoint& pos);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
QAction *actionTextBold;
|
||||
QAction *actionTextUnderline;
|
||||
QAction *actionTextItalic;
|
||||
|
||||
/** Define the popup menus for the Context menu */
|
||||
QMenu* contextMnu;
|
||||
/** Defines the actions for the context menu */
|
||||
QAction* privchatAct;
|
||||
|
||||
QTreeView *msgSendList;
|
||||
|
||||
// QColor textColor;
|
||||
QColor _currentColor;
|
||||
bool _underline;
|
||||
|
||||
QHash<QString, QString> smileys;
|
||||
|
||||
std::map<std::string, PopupChatDialog *> chatDialogs;
|
||||
|
||||
QFont mCurrentFont; /* how the text will come out */
|
||||
|
||||
/** Qt Designer generated object */
|
||||
Ui::ChatDialog ui;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ public:
|
|||
void clearOldChats();
|
||||
|
||||
void loadEmoticonsgroupchat();
|
||||
void setChatDialog(ChatDialog *cd);
|
||||
// void setChatDialog(ChatDialog *cd);
|
||||
|
||||
public slots:
|
||||
|
||||
|
|
@ -72,6 +72,8 @@ private slots:
|
|||
/** Create the context popup menu and it's submenus */
|
||||
void peertreeWidgetCostumPopupMenu( QPoint point );
|
||||
|
||||
void updatePeerStatusString(const QString& peer_id,const QString& chat_status) ;
|
||||
|
||||
/** Export friend in Friends Dialog */
|
||||
void exportfriend();
|
||||
/** Remove friend */
|
||||
|
|
@ -109,7 +111,7 @@ private:
|
|||
/* (2) Utility Fns */
|
||||
QTreeWidgetItem *getCurrentPeer();
|
||||
|
||||
ChatDialog *chatDialog;
|
||||
// ChatDialog *chatDialog;
|
||||
|
||||
|
||||
/** Define the popup menus for the Context menu */
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ PopupChatDialog::PopupChatDialog(std::string id, std::string name,
|
|||
|
||||
loadEmoticons();
|
||||
|
||||
last_status_send_time = 0 ;
|
||||
styleHtm = appDir + "/style/chat/default.htm";
|
||||
|
||||
/* Hide Avatar frame */
|
||||
|
|
@ -85,9 +86,8 @@ PopupChatDialog::PopupChatDialog(std::string id, std::string name,
|
|||
connect(ui.styleButton, SIGNAL(clicked()), SLOT(changeStyle()));
|
||||
|
||||
// Create the status bar
|
||||
std::ostringstream statusstr;
|
||||
statusstr << "Chatting with " << dialogName << " (" << id << ")" ;
|
||||
statusBar()->showMessage(QString::fromStdString(statusstr.str()));
|
||||
resetStatusBar() ;
|
||||
|
||||
ui.textBrowser->setOpenExternalLinks ( false );
|
||||
|
||||
QString title = QString::fromStdString(name) + " :" + tr(" RetroShare - Encrypted Chat") ;
|
||||
|
|
@ -129,6 +129,30 @@ PopupChatDialog::PopupChatDialog(std::string id, std::string name,
|
|||
updatePeerAvatar(id) ;
|
||||
}
|
||||
|
||||
void PopupChatDialog::resetStatusBar()
|
||||
{
|
||||
statusBar()->showMessage(QString("Chatting with ") + QString::fromStdString(dialogName) + " (" +QString::fromStdString(dialogId)+ ")") ;
|
||||
}
|
||||
|
||||
void PopupChatDialog::updateStatusTyping()
|
||||
{
|
||||
if(time(NULL) - last_status_send_time > 5) // limit 'peer is typing' packets to at most every 10 sec
|
||||
{
|
||||
rsMsgs->sendStatusString(dialogId, rsiface->getConfig().ownName + " is typing...");
|
||||
last_status_send_time = time(NULL) ;
|
||||
}
|
||||
}
|
||||
|
||||
// Called by libretroshare through notifyQt to display the peer's status
|
||||
//
|
||||
void PopupChatDialog::updateStatusString(const QString& status_string)
|
||||
{
|
||||
statusBar()->showMessage(status_string,2000) ; // displays info for 5 secs.
|
||||
|
||||
QTimer::singleShot(2000,this,SLOT(resetStatusBar())) ;
|
||||
}
|
||||
|
||||
|
||||
/** Destructor. */
|
||||
PopupChatDialog::~PopupChatDialog()
|
||||
{
|
||||
|
|
@ -259,23 +283,12 @@ void PopupChatDialog::addChatMsg(ChatInfo *ci)
|
|||
void PopupChatDialog::checkChat()
|
||||
{
|
||||
/* if <return> at the end of the text -> we can send it! */
|
||||
QTextEdit *chatWidget = ui.chattextEdit;
|
||||
std::string txt = chatWidget->toPlainText().toStdString();
|
||||
if ('\n' == txt[txt.length()-1])
|
||||
{
|
||||
//std::cerr << "Found <return> found at end of :" << txt << ": should send!";
|
||||
//std::cerr << std::endl;
|
||||
if (txt.length()-1 == txt.find('\n')) /* only if on first line! */
|
||||
{
|
||||
/* should remove last char ... */
|
||||
sendChat();
|
||||
}
|
||||
}
|
||||
QTextEdit *chatWidget = ui.chattextEdit;
|
||||
std::string txt = chatWidget->toPlainText().toStdString();
|
||||
if ('\n' == txt[txt.length()-1] && txt.length()-1 == txt.find('\n')) /* only if on first line! */
|
||||
sendChat();
|
||||
else
|
||||
{
|
||||
//std::cerr << "No <return> found in :" << txt << ":";
|
||||
//std::cerr << std::endl;
|
||||
}
|
||||
updateStatusTyping() ;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -75,6 +75,9 @@ public slots:
|
|||
|
||||
void changeStyle();
|
||||
|
||||
void resetStatusBar() ;
|
||||
void updateStatusTyping() ;
|
||||
void updateStatusString(const QString&) ;
|
||||
protected:
|
||||
void closeEvent (QCloseEvent * event);
|
||||
|
||||
|
|
@ -107,6 +110,7 @@ private:
|
|||
unsigned int lastChatTime;
|
||||
std::string lastChatName;
|
||||
|
||||
time_t last_status_send_time ;
|
||||
QHash<QString, QString> smileys;
|
||||
QColor mCurrentColor;
|
||||
QFont mCurrentFont;
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@ int main(int argc, char *argv[])
|
|||
RsIface *iface = createRsIface(*notify);
|
||||
RsControl *rsServer = createRsControl(*iface, *notify);
|
||||
|
||||
notify->setRsIface(iface);
|
||||
|
||||
/* save to the global variables */
|
||||
rsiface = iface;
|
||||
|
|
@ -140,14 +139,17 @@ int main(int argc, char *argv[])
|
|||
//skinWindow->setCentralWidget(w);
|
||||
|
||||
/* Attach the Dialogs, to the Notify Class */
|
||||
notify->setNetworkDialog(w->networkDialog);
|
||||
notify->setPeersDialog(w->peersDialog);
|
||||
notify->setDirDialog(w->sharedfilesDialog);
|
||||
notify->setTransfersDialog(w->transfersDialog);
|
||||
notify->setChatDialog(w->chatDialog);
|
||||
notify->setMessagesDialog(w->messagesDialog);
|
||||
notify->setChannelsDialog(w->channelsDialog);
|
||||
notify->setMessengerWindow(w->messengerWindow);
|
||||
// Not needed anymore since the notify class is directly connected by Qt signals/slots to the correct widgets below.
|
||||
//
|
||||
// notify->setRsIface(iface);
|
||||
// notify->setNetworkDialog(w->networkDialog);
|
||||
// notify->setPeersDialog(w->peersDialog);
|
||||
// notify->setDirDialog(w->sharedfilesDialog);
|
||||
// notify->setTransfersDialog(w->transfersDialog);
|
||||
// notify->setChatDialog(w->chatDialog);
|
||||
// notify->setMessagesDialog(w->messagesDialog);
|
||||
// notify->setChannelsDialog(w->channelsDialog);
|
||||
// notify->setMessengerWindow(w->messengerWindow);
|
||||
|
||||
// I'm using a signal to transfer the hashing info to the mainwindow, because Qt schedules signals properly to
|
||||
// avoid clashes between infos from threads.
|
||||
|
|
@ -167,6 +169,8 @@ int main(int argc, char *argv[])
|
|||
QObject::connect(notify,SIGNAL(messagesChanged()) ,w->messagesDialog ,SLOT(insertMessages() )) ;
|
||||
QObject::connect(notify,SIGNAL(configChanged()) ,w->messagesDialog ,SLOT(displayConfig() )) ;
|
||||
|
||||
QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&)),w->peersDialog,SLOT(updatePeerStatusString(const QString&,const QString&)));
|
||||
|
||||
/* only show window, if not startMinimized */
|
||||
if (!startMinimised)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -39,16 +39,19 @@ void NotifyQt::notifyErrorMsg(int list, int type, std::string msg)
|
|||
return;
|
||||
}
|
||||
|
||||
void NotifyQt::notifyChatStatus(const std::string& peer_id,const std::string& status_string)
|
||||
{
|
||||
std::cerr << "Received chat status string: " << status_string << std::endl ;
|
||||
emit chatStatusChanged(QString::fromStdString(peer_id),QString::fromStdString(status_string)) ;
|
||||
}
|
||||
|
||||
#ifdef TURTLE_HOPPING
|
||||
void NotifyQt::notifyTurtleSearchResult(uint32_t search_id,const std::list<TurtleFileInfo>& files)
|
||||
{
|
||||
std::cerr << "in notify search result..." << std::endl ;
|
||||
|
||||
// QList<TurtleFileInfo> qfiles ;
|
||||
|
||||
for(std::list<TurtleFileInfo>::const_iterator it(files.begin());it!=files.end();++it)
|
||||
emit gotTurtleSearchResult(search_id,*it) ;
|
||||
// qfiles.push_back(*it) ;
|
||||
}
|
||||
#endif
|
||||
void NotifyQt::notifyHashingInfo(std::string fileinfo)
|
||||
|
|
@ -56,10 +59,11 @@ void NotifyQt::notifyHashingInfo(std::string fileinfo)
|
|||
emit hashingInfoChanged(QString::fromStdString(fileinfo)) ;
|
||||
}
|
||||
|
||||
void NotifyQt::notifyChat()
|
||||
{
|
||||
return;
|
||||
}
|
||||
//void NotifyQt::notifyChat()
|
||||
//{
|
||||
// std::cerr << "Received chat notification" << std::endl ;
|
||||
// return;
|
||||
//}
|
||||
|
||||
void NotifyQt::notifyListChange(int list, int type)
|
||||
{
|
||||
|
|
@ -90,7 +94,6 @@ void NotifyQt::notifyListChange(int list, int type)
|
|||
emit filesPostModChanged(true) ; /* Local */
|
||||
break;
|
||||
case NOTIFY_LIST_SEARCHLIST:
|
||||
//displaySearch();
|
||||
break;
|
||||
case NOTIFY_LIST_MESSAGELIST:
|
||||
#ifdef DEBUG
|
||||
|
|
@ -99,7 +102,6 @@ void NotifyQt::notifyListChange(int list, int type)
|
|||
emit messagesChanged() ;
|
||||
break;
|
||||
case NOTIFY_LIST_CHANNELLIST:
|
||||
//displayChannels();
|
||||
break;
|
||||
case NOTIFY_LIST_TRANSFERLIST:
|
||||
#ifdef DEBUG
|
||||
|
|
@ -128,7 +130,6 @@ void NotifyQt::notifyListPreChange(int list, int type)
|
|||
switch(list)
|
||||
{
|
||||
case NOTIFY_LIST_NEIGHBOURS:
|
||||
//preDisplayNeighbours();
|
||||
break;
|
||||
case NOTIFY_LIST_FRIENDS:
|
||||
emit friendsChanged() ;
|
||||
|
|
@ -138,16 +139,12 @@ void NotifyQt::notifyListPreChange(int list, int type)
|
|||
emit filesPreModChanged(true) ; /* local */
|
||||
break;
|
||||
case NOTIFY_LIST_SEARCHLIST:
|
||||
//preDisplaySearch();
|
||||
break;
|
||||
case NOTIFY_LIST_MESSAGELIST:
|
||||
//preDisplayMessages();
|
||||
break;
|
||||
case NOTIFY_LIST_CHANNELLIST:
|
||||
//preDisplayChannels();
|
||||
break;
|
||||
case NOTIFY_LIST_TRANSFERLIST:
|
||||
//preDisplayTransfers();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -176,7 +173,7 @@ void NotifyQt::UpdateGUI()
|
|||
|
||||
if (time(NULL) > lastTs + 5) // update every 5 seconds. I don't know what to do with these.
|
||||
{
|
||||
displayChannels();
|
||||
// displayChannels();
|
||||
}
|
||||
|
||||
lastTs = time(NULL) ;
|
||||
|
|
@ -273,88 +270,88 @@ void NotifyQt::UpdateGUI()
|
|||
}
|
||||
}
|
||||
|
||||
void NotifyQt::displaySearch()
|
||||
{
|
||||
iface->lockData(); /* Lock Interface */
|
||||
//void NotifyQt::displaySearch()
|
||||
//{
|
||||
// iface->lockData(); /* Lock Interface */
|
||||
//
|
||||
//#ifdef NOTIFY_DEBUG
|
||||
// std::ostringstream out;
|
||||
// std::cerr << out.str();
|
||||
//#endif
|
||||
//
|
||||
// iface->unlockData(); /* UnLock Interface */
|
||||
//}
|
||||
|
||||
#ifdef NOTIFY_DEBUG
|
||||
std::ostringstream out;
|
||||
std::cerr << out.str();
|
||||
#endif
|
||||
// void NotifyQt::displayChat()
|
||||
// {
|
||||
// iface->lockData(); /* Lock Interface */
|
||||
//
|
||||
// #ifdef NOTIFY_DEBUG
|
||||
// std::ostringstream out;
|
||||
// std::cerr << out.str();
|
||||
// #endif
|
||||
//
|
||||
// iface->unlockData(); /* UnLock Interface */
|
||||
//
|
||||
// if (hDialog)
|
||||
// hDialog -> insertChat();
|
||||
// }
|
||||
//
|
||||
//
|
||||
//void NotifyQt::displayChannels()
|
||||
//{
|
||||
// iface->lockData(); /* Lock Interface */
|
||||
//
|
||||
//#ifdef NOTIFY_DEBUG
|
||||
// std::ostringstream out;
|
||||
// std::cerr << out.str();
|
||||
//#endif
|
||||
//
|
||||
// iface->unlockData(); /* UnLock Interface */
|
||||
//
|
||||
// if (sDialog)
|
||||
// sDialog -> insertChannels();
|
||||
//}
|
||||
//
|
||||
//
|
||||
//void NotifyQt::displayTransfers()
|
||||
//{
|
||||
// /* Do the GUI */
|
||||
// if (tDialog)
|
||||
// tDialog->insertTransfers();
|
||||
//}
|
||||
//
|
||||
//
|
||||
//void NotifyQt::preDisplayNeighbours()
|
||||
//{
|
||||
//
|
||||
//}
|
||||
//
|
||||
//void NotifyQt::preDisplayFriends()
|
||||
//{
|
||||
//
|
||||
//}
|
||||
|
||||
iface->unlockData(); /* UnLock Interface */
|
||||
}
|
||||
|
||||
void NotifyQt::displayChat()
|
||||
{
|
||||
iface->lockData(); /* Lock Interface */
|
||||
|
||||
#ifdef NOTIFY_DEBUG
|
||||
std::ostringstream out;
|
||||
std::cerr << out.str();
|
||||
#endif
|
||||
|
||||
iface->unlockData(); /* UnLock Interface */
|
||||
|
||||
if (hDialog)
|
||||
hDialog -> insertChat();
|
||||
}
|
||||
|
||||
|
||||
void NotifyQt::displayChannels()
|
||||
{
|
||||
iface->lockData(); /* Lock Interface */
|
||||
|
||||
#ifdef NOTIFY_DEBUG
|
||||
std::ostringstream out;
|
||||
std::cerr << out.str();
|
||||
#endif
|
||||
|
||||
iface->unlockData(); /* UnLock Interface */
|
||||
|
||||
if (sDialog)
|
||||
sDialog -> insertChannels();
|
||||
}
|
||||
|
||||
|
||||
void NotifyQt::displayTransfers()
|
||||
{
|
||||
/* Do the GUI */
|
||||
if (tDialog)
|
||||
tDialog->insertTransfers();
|
||||
}
|
||||
|
||||
|
||||
void NotifyQt::preDisplayNeighbours()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void NotifyQt::preDisplayFriends()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void NotifyQt::preDisplaySearch()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void NotifyQt::preDisplayMessages()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void NotifyQt::preDisplayChannels()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void NotifyQt::preDisplayTransfers()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
//void NotifyQt::preDisplaySearch()
|
||||
//{
|
||||
//
|
||||
//}
|
||||
//
|
||||
//void NotifyQt::preDisplayMessages()
|
||||
//{
|
||||
//
|
||||
//}
|
||||
//
|
||||
//void NotifyQt::preDisplayChannels()
|
||||
//{
|
||||
//
|
||||
//}
|
||||
//
|
||||
//void NotifyQt::preDisplayTransfers()
|
||||
//{
|
||||
//
|
||||
//
|
||||
//}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -26,29 +26,30 @@ class NotifyQt: public QObject, public NotifyBase
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
NotifyQt() : cDialog(NULL), pDialog(NULL),
|
||||
dDialog(NULL), tDialog(NULL),
|
||||
hDialog(NULL), mDialog(NULL),
|
||||
sDialog(NULL), mWindow(NULL)
|
||||
{ return; }
|
||||
NotifyQt() {}
|
||||
// : cDialog(NULL), pDialog(NULL),
|
||||
// dDialog(NULL), tDialog(NULL),
|
||||
// hDialog(NULL), mDialog(NULL),
|
||||
// sDialog(NULL), mWindow(NULL)
|
||||
// { return; }
|
||||
|
||||
virtual ~NotifyQt() { return; }
|
||||
|
||||
void setNetworkDialog(NetworkDialog *c) { cDialog = c; }
|
||||
void setPeersDialog(PeersDialog *p) { pDialog = p; }
|
||||
void setDirDialog(SharedFilesDialog *d) { dDialog = d; }
|
||||
void setTransfersDialog(TransfersDialog *t) { tDialog = t; }
|
||||
void setChatDialog(ChatDialog *m) { hDialog = m; }
|
||||
void setMessagesDialog(MessagesDialog *m) { mDialog = m; }
|
||||
void setChannelsDialog(ChannelsDialog *s) { sDialog = s; }
|
||||
void setMessengerWindow(MessengerWindow *mw) { mWindow = mw; }
|
||||
|
||||
void setRsIface(RsIface *i) { iface = i; }
|
||||
// void setNetworkDialog(NetworkDialog *c) { cDialog = c; }
|
||||
// void setPeersDialog(PeersDialog *p) { pDialog = p; }
|
||||
// void setDirDialog(SharedFilesDialog *d) { dDialog = d; }
|
||||
// void setTransfersDialog(TransfersDialog *t) { tDialog = t; }
|
||||
// void setChatDialog(ChatDialog *m) { hDialog = m; }
|
||||
// void setMessagesDialog(MessagesDialog *m) { mDialog = m; }
|
||||
// void setChannelsDialog(ChannelsDialog *s) { sDialog = s; }
|
||||
// void setMessengerWindow(MessengerWindow *mw) { mWindow = mw; }
|
||||
// void setRsIface(RsIface *i) { iface = i; }
|
||||
|
||||
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 notifyChat();
|
||||
// virtual void notifyChat();
|
||||
virtual void notifyChatStatus(const std::string& peer_id,const std::string& status_string);
|
||||
virtual void notifyHashingInfo(std::string fileinfo);
|
||||
#ifdef TURTLE_HOPPING
|
||||
virtual void notifyTurtleSearchResult(uint32_t search_id,const std::list<TurtleFileInfo>& found_files);
|
||||
|
|
@ -66,6 +67,7 @@ class NotifyQt: public QObject, public NotifyBase
|
|||
void neighborsChanged() const ;
|
||||
void messagesChanged() const ;
|
||||
void configChanged() const ;
|
||||
void chatStatusChanged(const QString&,const QString&) const ;
|
||||
#ifdef TURTLE_HOPPING
|
||||
void gotTurtleSearchResult(qulonglong search_id,TurtleFileInfo file) const ;
|
||||
#endif
|
||||
|
|
@ -76,34 +78,34 @@ class NotifyQt: public QObject, public NotifyBase
|
|||
|
||||
private:
|
||||
|
||||
void displayNeighbours();
|
||||
void displayFriends();
|
||||
// void displayNeighbours();
|
||||
// void displayFriends();
|
||||
// void displayDirectories();
|
||||
void displaySearch();
|
||||
void displayChat();
|
||||
void displayMessages();
|
||||
void displayChannels();
|
||||
void displayTransfers();
|
||||
// void displaySearch();
|
||||
// void displayChat();
|
||||
// void displayMessages();
|
||||
// void displayChannels();
|
||||
// void displayTransfers();
|
||||
|
||||
void preDisplayNeighbours();
|
||||
void preDisplayFriends();
|
||||
// void preDisplayNeighbours();
|
||||
// void preDisplayFriends();
|
||||
// void preDisplayDirectories();
|
||||
void preDisplaySearch();
|
||||
void preDisplayMessages();
|
||||
void preDisplayChannels();
|
||||
void preDisplayTransfers();
|
||||
// void preDisplaySearch();
|
||||
// void preDisplayMessages();
|
||||
// void preDisplayChannels();
|
||||
// void preDisplayTransfers();
|
||||
|
||||
/* so we can update windows */
|
||||
NetworkDialog *cDialog;
|
||||
PeersDialog *pDialog;
|
||||
SharedFilesDialog *dDialog;
|
||||
TransfersDialog *tDialog;
|
||||
ChatDialog *hDialog;
|
||||
MessagesDialog *mDialog;
|
||||
ChannelsDialog *sDialog;
|
||||
MessengerWindow *mWindow;
|
||||
// NetworkDialog *cDialog;
|
||||
// PeersDialog *pDialog;
|
||||
// SharedFilesDialog *dDialog;
|
||||
// TransfersDialog *tDialog;
|
||||
// ChatDialog *hDialog;
|
||||
// MessagesDialog *mDialog;
|
||||
// ChannelsDialog *sDialog;
|
||||
// MessengerWindow *mWindow;
|
||||
|
||||
RsIface *iface;
|
||||
// RsIface *iface;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -200,6 +200,7 @@ class NotifyBase
|
|||
virtual void notifyListChange(int list, int type) { (void) list; (void) type; return; }
|
||||
virtual void notifyErrorMsg(int list, int sev, std::string msg) { (void) list; (void) sev; (void) msg; return; }
|
||||
virtual void notifyChat() { return; }
|
||||
virtual void notifyChatStatus(const std::string& peer_id,const std::string& status_string) {}
|
||||
virtual void notifyHashingInfo(std::string fileinfo) { (void)fileinfo; return ; }
|
||||
virtual void notifyTurtleSearchResult(uint32_t search_id,const std::list<TurtleFileInfo>& files) { (void)files; }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ virtual bool MessageRead(std::string mid) = 0;
|
|||
virtual bool chatAvailable() = 0;
|
||||
virtual bool ChatSend(ChatInfo &ci) = 0;
|
||||
virtual bool getNewChat(std::list<ChatInfo> &chats) = 0;
|
||||
virtual void sendStatusString(const std::string& id,const std::string& status_string) = 0 ;
|
||||
|
||||
// get avatar data for peer pid
|
||||
virtual void getAvatarData(std::string pid,unsigned char *& data,int& size) = 0 ;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue