/usr/local/CPAN/Qt/ChatDialog.pm
package ChatDialog;
use strict;
use warnings;
use QtCore4;
use QtGui4;
use Ui_ChatDialog;
use Client;
use QtCore4::isa qw( Qt::Dialog );
use QtCore4::slots
appendMessage => ['const QString &', 'const QString &'],
returnPressed => [],
newParticipant => ['const QString &'],
participantLeft => ['const QString &'],
showInformation => [];
sub client() {
return this->{client};
}
sub myNickName() {
return this->{myNickName};
}
sub tableFormat() {
return this->{tableFormat};
}
sub ui() {
return this->{ui};
}
sub NEW
{
my ($class, $parent) = @_;
$class->SUPER::NEW($parent);
this->{client} = Client();
this->{tableFormat} = Qt::TextTableFormat();
this->{ui} = Ui_ChatDialog->setupUi(this);
ui->lineEdit->setFocusPolicy(Qt::StrongFocus());
ui->textEdit->setFocusPolicy(Qt::NoFocus());
ui->textEdit->setReadOnly(1);
ui->listWidget->setFocusPolicy(Qt::NoFocus());
this->connect(ui->lineEdit, SIGNAL 'returnPressed()', this, SLOT 'returnPressed()');
this->connect(client, SIGNAL 'newMessage(QString,QString)',
this, SLOT 'appendMessage(QString,QString)');
this->connect(client, SIGNAL 'newParticipant(QString)',
this, SLOT 'newParticipant(QString)');
this->connect(client, SIGNAL 'participantLeft(QString)',
this, SLOT 'participantLeft(QString)');
this->{myNickName} = client->nickName();
newParticipant(myNickName);
tableFormat->setBorder(0);
Qt::Timer::singleShot(10 * 1000, this, SLOT 'showInformation()');
}
sub appendMessage
{
my ($from, $message) = @_;
if (!defined $from || !defined $message) {
return;
}
my $cursor = Qt::TextCursor(ui->textEdit->textCursor());
$cursor->movePosition(Qt::TextCursor::End());
my $table = $cursor->insertTable(1, 2, tableFormat);
$table->cellAt(0, 0)->firstCursorPosition()->insertText('<' . $from . '> ');
$table->cellAt(0, 1)->firstCursorPosition()->insertText($message);
my $bar = ui->textEdit->verticalScrollBar();
$bar->setValue($bar->maximum());
}
sub returnPressed
{
my $text = ui->lineEdit->text();
if (!defined $text) {
return;
}
if ($text =~ m#^/#) {
my $color = ui->textEdit->textColor();
ui->textEdit->setTextColor(Qt::Color(Qt::red()));
$text =~ s/ .*//g;
ui->textEdit->append(this->tr('! Unknown command: ') . $text);
ui->textEdit->setTextColor($color);
} else {
client->sendMessage($text);
appendMessage(myNickName, $text);
}
ui->lineEdit->clear();
}
sub newParticipant
{
my ($nick) = @_;
if (!defined $nick) {
return;
}
my $color = ui->textEdit->textColor();
ui->textEdit->setTextColor(Qt::Color(Qt::gray()));
ui->textEdit->append( '* ' . $nick . this->tr('has joined'));
ui->textEdit->setTextColor($color);
ui->listWidget->addItem($nick);
}
sub participantLeft
{
my ($nick) = @_;
if (!defined $nick) {
return;
}
my $items = ui->listWidget->findItems($nick, Qt::MatchExactly());
if (!defined $items) {
return;
}
ui->listWidget->removeItemWidget( $items->[0] );
my $color = ui->textEdit->textColor();
ui->textEdit->setTextColor(Qt::Color(Qt::gray()));
ui->textEdit->append( '* ' . $nick . this->tr('has left'));
ui->textEdit->setTextColor($color);
}
sub showInformation
{
if (ui->listWidget->count() == 1) {
Qt::MessageBox::information(this, this->tr('Chat'),
this->tr('Launch several instances of this ' .
'program on your local network and ' .
'start chatting!'));
}
}
1;