Improvements to chat lobbies:

- added generic methods and items for bouncing generic objects through lobbies
	- added handling of peer typing status
	- proper handling of peer join/leave lobby
	- added sub item ids to lobby messages to allow proper message splitting
	- made 2 different message splitting methods for normal chat vs. lobbies. In v0.6, we'll have to handle all messages the same way.
	- added parent id to RsChatLobbyMsgItem, to allow threaded chat.
	- added possibility to make a lobby public/private (not yet fully working)
	- added items for requesting/exchanging list of public lobbies at friends' (not yet fully working)
	- major cleaning of p3chatservice.cc

Next move:
	- gui for listing friend public lobbies, joining them, etc.
	- load/save of persistent lobbies.
	- autoremove of inactive lobbies

Warning: lobby message items of this version are incompatible with previous versions. It won't crash, but
messages will not pass through.



git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4755 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2012-01-06 22:17:08 +00:00
parent e430612714
commit e9d6940b09
20 changed files with 965 additions and 296 deletions

View file

@ -68,6 +68,11 @@ ChatLobbyDialog::~ChatLobbyDialog()
{
// announce leaving of lobby
// check that the lobby still exists.
ChatLobbyId lid ;
if(!rsMsgs->isLobbyId(getPeerId(),lid))
return ;
if(QMessageBox::Yes == QMessageBox::question(NULL,tr("Unsubscribe to lobby?"),tr("Do you want to unsubscribe to this chat lobby?"),QMessageBox::Yes | QMessageBox::No))
rsMsgs->unsubscribeChatLobby(lobby_id) ;
}
@ -77,11 +82,6 @@ void ChatLobbyDialog::setNickName(const QString& nick)
rsMsgs->setNickNameForChatLobby(lobby_id,nick.toUtf8().constData()) ;
}
void ChatLobbyDialog::updateStatus(const QString &peer_id, int status)
{
// For now. We need something more efficient to tell when the lobby is disconnected.
}
void ChatLobbyDialog::addIncomingChatMsg(const ChatInfo& info)
{
QDateTime sendTime = QDateTime::fromTime_t(info.sendTime);
@ -118,3 +118,25 @@ void ChatLobbyDialog::updateFriendsList()
friendsListWidget->addItem(QString::fromUtf8((*it2).c_str())) ;
}
void ChatLobbyDialog::displayLobbyEvent(int event_type,const QString& nickname,const QString& str)
{
switch(event_type)
{
case RS_CHAT_LOBBY_EVENT_PEER_LEFT: addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), str + tr(" has left the lobby."), TYPE_NORMAL);
break ;
case RS_CHAT_LOBBY_EVENT_PEER_JOINED:
addChatMsg(true, tr("Lobby management"), QDateTime::currentDateTime(), QDateTime::currentDateTime(), str + tr(" joined the lobby."), TYPE_NORMAL);
break ;
case RS_CHAT_LOBBY_EVENT_PEER_STATUS:
updateStatusString(nickname,str) ;
break ;
default:
std::cerr << "ChatLobbyDialog::displayLobbyEvent() Unhandled lobby event type " << event_type << std::endl;
}
}
QString ChatLobbyDialog::makeStatusString(const QString& peer_id, const QString& status_string) const
{
return QString::fromUtf8(peer_id.toStdString().c_str()) + " " + tr(status_string.toAscii());
}

View file

@ -41,6 +41,9 @@ class ChatLobbyDialog: public PopupChatDialog
{
Q_OBJECT
public:
void displayLobbyEvent(int event_type,const QString& nickname,const QString& str) ;
protected:
/** Default constructor */
ChatLobbyDialog(const std::string& id,const ChatLobbyId& lid, const QString &name, QWidget *parent = 0, Qt::WFlags flags = 0);
@ -55,8 +58,8 @@ class ChatLobbyDialog: public PopupChatDialog
// The following methods are differentfrom those of the parent:
//
virtual void updateStatus(const QString &peer_id, int status) ; // needs grouped status. Not yet implemented.
virtual void addIncomingChatMsg(const ChatInfo& info) ; //
virtual QString makeStatusString(const QString& peer_id,const QString& status_string) const ;
protected slots:
void setNickName(const QString&) ;

View file

@ -101,7 +101,10 @@ void CreateLobbyDialog::createLobby()
std::string lobby_name = ui->lobbyName_LE->text().toUtf8().constData() ;
// add to group
ChatLobbyId id = rsMsgs->createChatLobby(lobby_name, mShareList);
int lobby_privacy_type = (ui->security_CB->currentIndex() == 0)?RS_CHAT_LOBBY_PRIVACY_LEVEL_PUBLIC:RS_CHAT_LOBBY_PRIVACY_LEVEL_PRIVATE ;
ChatLobbyId id = rsMsgs->createChatLobby(lobby_name, mShareList, lobby_privacy_type);
std::cerr << "gui: Created chat lobby " << std::hex << id << std::endl ;

View file

@ -133,6 +133,16 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Security policy:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -143,6 +153,20 @@ p, li { white-space: pre-wrap; }
<item>
<widget class="QLineEdit" name="nickName_LE"/>
</item>
<item>
<widget class="QComboBox" name="security_CB">
<item>
<property name="text">
<string>Public (Visible by friends)</string>
</property>
</item>
<item>
<property name="text">
<string>Private (Works on invitation only)</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
</layout>

View file

@ -473,11 +473,15 @@ void PopupChatDialog::updateStatusTyping()
}
}
QString PopupChatDialog::makeStatusString(const QString& peer_id,const QString& status_string) const
{
return QString::fromUtf8(rsPeers->getPeerName(peer_id.toStdString()).c_str()) + " " + tr(status_string.toAscii());
}
// Called by libretroshare through notifyQt to display the peer's status
//
void PopupChatDialog::updateStatusString(const QString& peer_id, const QString& status_string)
{
QString status = QString::fromUtf8(rsPeers->getPeerName(peer_id.toStdString()).c_str()) + " " + tr(status_string.toAscii());
QString status = makeStatusString(peer_id,status_string) ;
ui.statusLabel->setText(status); // displays info for 5 secs.
ui.typingpixmapLabel->setPixmap(QPixmap(":images/typing.png") );

View file

@ -76,7 +76,11 @@ protected:
void insertChatMsgs();
void addChatMsg(bool incoming, const QString &name, const QDateTime &sendTime, const QDateTime &recvTime, const QString &message, enumChatType chatType);
virtual void addIncomingChatMsg(const ChatInfo& info) ; // derived in ChatLobbyDialog.
// derived in ChatLobbyDialog.
//
virtual void addIncomingChatMsg(const ChatInfo& info) ;
virtual QString makeStatusString(const QString& peer_id,const QString& status_string) const ;
private slots:
void pasteLink() ;