diff options
Diffstat (limited to 'src/gui/serverChatDialog.cpp')
| -rw-r--r-- | src/gui/serverChatDialog.cpp | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/src/gui/serverChatDialog.cpp b/src/gui/serverChatDialog.cpp new file mode 100644 index 0000000..ec1f299 --- /dev/null +++ b/src/gui/serverChatDialog.cpp @@ -0,0 +1,281 @@ +/* + # Copyright (c) 2009, 2010 - OpenSLX Project, Computer Center University of + # Freiburg + # + # This program is free software distributed under the GPL version 2. + # See http://openslx.org/COPYING + # + # If you have any feedback please consult http://openslx.org/feedback and + # send your suggestions, praise, or complaints to feedback@openslx.org + # + # General information about OpenSLX can be found at http://openslx.org/ + # ----------------------------------------------------------------------------- + # serverChatDialog.cpp + # - graphical chat interface for the pvsmgr + # ----------------------------------------------------------------------------- + */ + +#include "serverChatDialog.h" +#include <src/gui/mainWindow.h> +#include "ui_serverChatDialog.h" + +ServerChatDialog::ServerChatDialog(QWidget *parent) : + QDialog(parent), uichat(new Ui::ServerChatDialogClass) +{ + uichat->setupUi(this); + _nickname = "PVSMGR"; + connect(uichat->pushButton, SIGNAL(clicked()), this, SLOT(chat_send())); + + // add first tab for public messages + uichat->tabWidget->clear(); + QTextEdit *t = new QTextEdit(); + t->setReadOnly(true); + uichat->tabWidget->addTab(t, "@all"); + _hash = new QHash<QString, QTextEdit*> (); + _hash->insert(uichat->tabWidget->tabText(0), t); + + // setup menu + _menu = new QMenu(); + _sendFileAction = new QAction(tr("&Send File..."), this); + _menu->addAction(_sendFileAction); + + connect(uichat->listWidget, SIGNAL(doubleClicked(QModelIndex)), this, + SLOT(addTab(QModelIndex))); + connect(uichat->tabWidget, SIGNAL(tabCloseRequested(int)), this, + SLOT(removeTab(int))); + connect(uichat->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(removeIcon(int))); + connect(uichat->listWidget, SIGNAL(customContextMenuRequested(QPoint)), this, + SLOT(showMenu(QPoint))); + connect(_sendFileAction, SIGNAL(triggered()), this, SLOT(sendFile())); + + this->setAcceptDrops(true); +} + +ServerChatDialog::~ServerChatDialog() +{ +} + +void ServerChatDialog::setTrayIcon(QSystemTrayIcon *trayIcon) +{ + // _trayIcon = trayIcon; + // FIXME: messageClicked() is always emitted, not only on chat msg + //connect(_trayIcon, SIGNAL(messageClicked()), this, SLOT(open())); +} + +//////////////////////////////////////////////////////////////////////////////// +// Slots + +void ServerChatDialog::open() +{ + uichat->lineEdit->setFocus(); + setVisible(true); +} + +void ServerChatDialog::chat_receive(QString nick_from, QString nick_to, + QString msg) +{ + qDebug("[%s] R %s <- %s : %s", metaObject()->className(), + qPrintable(nick_to), qPrintable(nick_from), qPrintable(msg)); + + if (nick_to == uichat->tabWidget->tabText(0)) + showMsg(nick_from, msg, getTab(nick_to)); // public message or own msg + else + { + if (nick_to == "PVSMGR") + showMsg(nick_from, msg, getTab(nick_from)); // private message + else if (nick_from == "PVSMGR") + showMsg(nick_from, msg, getTab(nick_to)); // private message + } +} + +void ServerChatDialog::chat_send() +{ + QString msg = uichat->lineEdit->text(); + if (msg != "") + { + msg = "PVSMGR:"+ msg; + QString nick_to = uichat->tabWidget->tabText(uichat->tabWidget->currentIndex()); + PVSMsg myMsg(PVSMESSAGE, nick_to, msg, 0); + MainWindow::getWindow()->sendChatMsg(myMsg); + uichat->lineEdit->clear(); + uichat->lineEdit->setFocus(); + + qDebug("[%s] S %s -> %s : %s", metaObject()->className(), + qPrintable(_nickname), qPrintable(nick_to), qPrintable(msg)); + + } +} + +void ServerChatDialog::chat_nicklist_update() +{ + uichat->listWidget->clear(); + uichat->listWidget->addItems(_nickList); +} + +void ServerChatDialog::chat_client_add(QString nick) +{ + if (!_nickList.contains(nick)) + _nickList.append(nick); + showEvent("-> " + nick + tr(" has joined the chat.")); +} + +void ServerChatDialog::chat_client_remove(QString nick) +{ + _nickList.removeOne(nick); + showEvent("<- " + nick + tr(" has left the chat.")); +} + +void ServerChatDialog::addTab(QModelIndex i) +{ + QString text = i.data().toString(); + if (_hash->contains(text)) + { + uichat->tabWidget->setCurrentWidget(_hash->value(text)); + } + else + { + QTextEdit *t = new QTextEdit(); + t->setReadOnly(true); + uichat->tabWidget->setCurrentIndex(uichat->tabWidget->addTab(t, text)); + _hash->insert(text, t); + } + uichat->lineEdit->setFocus(); +} + +void ServerChatDialog::removeTab(int i) +{ + if (i != 0) + { + _tabList.removeOne(_hash->value(uichat->tabWidget->tabText(i))); + _hash->remove(uichat->tabWidget->tabText(i)); + uichat->tabWidget->removeTab(i); + uichat->lineEdit->setFocus(); + } +} + +void ServerChatDialog::removeIcon(int i) +{ + uichat->tabWidget->setTabIcon(i, QIcon()); +} + +//////////////////////////////////////////////////////////////////////////////// +// Private + +QTextEdit* ServerChatDialog::getTab(QString text) +{ + if (!_hash->contains(text)) + { + QTextEdit *t = new QTextEdit(); + t->setReadOnly(true); + uichat->tabWidget->addTab(t, text); + _hash->insert(text, t); + _tabList.append(t); + } + uichat->lineEdit->setFocus(); + return _hash->value(text); +} + +void ServerChatDialog::showMsg(QString nick_from, QString msg, QTextEdit *t) +{ + // move cursor at the end + t->moveCursor(QTextCursor::End); + + // print time + if (nick_from == "PVSMGR") + t->setTextColor(QColor(0, 100, 100)); + else + t->setTextColor(QColor(0, 100, 0)); + t->append("[" + QTime::currentTime().toString("hh:mm") + "] "); + + // print nickname + if (nick_from == "PVSMGR") + t->setTextColor(QColor(0, 100, 255)); + else + t->setTextColor(QColor(0, 0, 255)); + t->insertPlainText("<" + nick_from + "> "); + + // print message + if (nick_from == "PVSMGR") + t->setTextColor(QColor(100, 100, 100)); + else + t->setTextColor(QColor(0, 0, 0)); + t->insertPlainText(msg); + + // show icon if not current tab + if (uichat->tabWidget->currentIndex() != uichat->tabWidget->indexOf(t)) + uichat->tabWidget->setTabIcon(uichat->tabWidget->indexOf(t), QIcon(":chat_msg16.svg")); +} + +void ServerChatDialog::showMenu(QPoint p) +{ + _menu->popup(uichat->listWidget->mapToGlobal(p)); +} + +void ServerChatDialog::sendFile() +{ + ServerFileTransfert* sft = new ServerFileTransfert(this); + QString cTab = uichat->listWidget->currentItem()->text(); + QString hostIP = PVSConnectionManager::getManager()->getClientFromUsername(cTab)->getIp(); + if (hostIP != "") + sft->sendFileToHost(hostIP); +} + +void ServerChatDialog::sendFile(QString filename) +{ + if (uichat->tabWidget->currentIndex() == 0 || filename == "") + return; + + // ask user + QString nick = uichat->tabWidget->tabText(uichat->tabWidget->currentIndex()); + QMessageBox::StandardButton result = QMessageBox::question(0, + tr("PVS File Transfer with ")+nick, + tr("Send file '") + filename + tr("' to ") + nick + "?", + QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); + + if (result != QMessageBox::Ok) + return; + + ServerFileTransfert* sft = new ServerFileTransfert(this); + QString hostIP = PVSConnectionManager::getManager()->getClientFromUsername(nick)->getIp(); + if (hostIP != "") + sft->sendFileToHost(hostIP, filename); +} + + +void ServerChatDialog::showEvent(QString msg) +{ + QTextEdit *t = _hash->value(uichat->tabWidget->tabText(0)); + + // move cursor at the end + t->moveCursor(QTextCursor::End); + + t->setTextColor(QColor(150, 150, 150)); + + // print time + t->append("[" + QTime::currentTime().toString("hh:mm") + "] "); + + // print message + t->insertPlainText(msg); +} + +void ServerChatDialog::dragEnterEvent(QDragEnterEvent *event) +{ + event->accept(); +} + +void ServerChatDialog::dragMoveEvent(QDragMoveEvent *event) +{ + event->accept(); +} + +void ServerChatDialog::dragLeaveEvent(QDragLeaveEvent *event) +{ + event->accept(); +} + +void ServerChatDialog::dropEvent(QDropEvent *event) +{ + event->accept(); + if (event->mimeData()->hasUrls()) + sendFile(event->mimeData()->urls()[0].toLocalFile()); +} |
