diff options
Diffstat (limited to 'examples/network/network-chat/chatdialog.cpp')
-rw-r--r-- | examples/network/network-chat/chatdialog.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/examples/network/network-chat/chatdialog.cpp b/examples/network/network-chat/chatdialog.cpp new file mode 100644 index 0000000..7e88e5b --- /dev/null +++ b/examples/network/network-chat/chatdialog.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> + +#include "chatdialog.h" + +ChatDialog::ChatDialog(QWidget *parent) + : QDialog(parent) +{ + setupUi(this); + + lineEdit->setFocusPolicy(Qt::StrongFocus); + textEdit->setFocusPolicy(Qt::NoFocus); + textEdit->setReadOnly(true); + listWidget->setFocusPolicy(Qt::NoFocus); + + connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(returnPressed())); + connect(&client, SIGNAL(newMessage(const QString &, const QString &)), + this, SLOT(appendMessage(const QString &, const QString &))); + connect(&client, SIGNAL(newParticipant(const QString &)), + this, SLOT(newParticipant(const QString &))); + connect(&client, SIGNAL(participantLeft(const QString &)), + this, SLOT(participantLeft(const QString &))); + + myNickName = client.nickName(); + newParticipant(myNickName); + tableFormat.setBorder(0); + QTimer::singleShot(10 * 1000, this, SLOT(showInformation())); +} + +void ChatDialog::appendMessage(const QString &from, const QString &message) +{ + if (from.isEmpty() || message.isEmpty()) + return; + + QTextCursor cursor(textEdit->textCursor()); + cursor.movePosition(QTextCursor::End); + QTextTable *table = cursor.insertTable(1, 2, tableFormat); + table->cellAt(0, 0).firstCursorPosition().insertText("<" + from + "> "); + table->cellAt(0, 1).firstCursorPosition().insertText(message); + QScrollBar *bar = textEdit->verticalScrollBar(); + bar->setValue(bar->maximum()); +} + +void ChatDialog::returnPressed() +{ + QString text = lineEdit->text(); + if (text.isEmpty()) + return; + + if (text.startsWith(QChar('/'))) { + QColor color = textEdit->textColor(); + textEdit->setTextColor(Qt::red); + textEdit->append(tr("! Unknown command: %1") + .arg(text.left(text.indexOf(' ')))); + textEdit->setTextColor(color); + } else { + client.sendMessage(text); + appendMessage(myNickName, text); + } + + lineEdit->clear(); +} + +void ChatDialog::newParticipant(const QString &nick) +{ + if (nick.isEmpty()) + return; + + QColor color = textEdit->textColor(); + textEdit->setTextColor(Qt::gray); + textEdit->append(tr("* %1 has joined").arg(nick)); + textEdit->setTextColor(color); + listWidget->addItem(nick); +} + +void ChatDialog::participantLeft(const QString &nick) +{ + if (nick.isEmpty()) + return; + + QList<QListWidgetItem *> items = listWidget->findItems(nick, + Qt::MatchExactly); + if (items.isEmpty()) + return; + + delete items.at(0); + QColor color = textEdit->textColor(); + textEdit->setTextColor(Qt::gray); + textEdit->append(tr("* %1 has left").arg(nick)); + textEdit->setTextColor(color); +} + +void ChatDialog::showInformation() +{ + if (listWidget->count() == 1) { + QMessageBox::information(this, tr("Chat"), + tr("Launch several instances of this " + "program on your local network and " + "start chatting!")); + } +} |