summaryrefslogtreecommitdiffstats
path: root/src/gui/serverChatDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/serverChatDialog.cpp')
-rw-r--r--src/gui/serverChatDialog.cpp281
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());
+}