/usr/local/CPAN/Qt/DropSiteWindow.pm
package DropSiteWindow;
use strict;
use warnings;
use QtCore4;
use QtGui4;
# [DropSiteWindow header]
use QtCore4::isa qw( Qt::Widget );
use QtCore4::slots
updateFormatsTable => ['const QMimeData *'];
use DropArea;
sub dropArea() {
return this->{dropArea};
}
sub abstractLabel() {
return this->{abstractLabel};
}
sub formatsTable() {
return this->{formatsTable};
}
sub clearButton() {
return this->{clearButton};
}
sub quitButton() {
return this->{quitButton};
}
sub buttonBox() {
return this->{buttonBox};
}
# [DropSiteWindow header]
# [constructor part1]
sub NEW
{
my ($class) = @_;
$class->SUPER::NEW();
this->{abstractLabel} = Qt::Label(this->tr('This example accepts drags from other ' .
'applications and displays the MIME types ' .
'provided by the drag object.'));
this->abstractLabel->setWordWrap(1);
this->abstractLabel->adjustSize();
# [constructor part1]
# [constructor part2]
this->{dropArea} = DropArea();
this->connect(this->dropArea, SIGNAL 'changed(const QMimeData *)',
this, SLOT 'updateFormatsTable(const QMimeData *)');
# [constructor part2]
# [constructor part3]
my @labels = (this->tr('Format'), this->tr('Content'));
this->{formatsTable} = Qt::TableWidget();
this->formatsTable->setColumnCount(2);
this->formatsTable->setEditTriggers(Qt::AbstractItemView::NoEditTriggers());
this->formatsTable->setHorizontalHeaderLabels(\@labels);
this->formatsTable->horizontalHeader()->setStretchLastSection(1);
# [constructor part3]
# [constructor part4]
this->{clearButton} = Qt::PushButton(this->tr('Clear'));
this->{quitButton} = Qt::PushButton(this->tr('Quit'));
this->{buttonBox} = Qt::DialogButtonBox();
this->buttonBox->addButton(this->clearButton, Qt::DialogButtonBox::ActionRole());
this->buttonBox->addButton(this->quitButton, Qt::DialogButtonBox::RejectRole());
this->connect(this->quitButton, SIGNAL 'pressed()', this, SLOT 'close()');
this->connect(this->clearButton, SIGNAL 'pressed()', this->dropArea, SLOT 'clear()');
# [constructor part4]
# [constructor part5]
my $mainLayout = Qt::VBoxLayout();
$mainLayout->addWidget(this->abstractLabel);
$mainLayout->addWidget(this->dropArea);
$mainLayout->addWidget(this->formatsTable);
$mainLayout->addWidget(this->buttonBox);
this->setLayout($mainLayout);
this->setWindowTitle(this->tr('Drop Site'));
this->setMinimumSize(350, 500);
}
# [constructor part5]
sub simplified
{
my ($text) = @_;
$text =~ s/[\s]+/ /g;
$text =~ s/^ //g;
$text =~ s/ $//g;
return $text;
}
# [updateFormatsTable() part1]
sub updateFormatsTable
{
my ($mimeData) = @_;
this->formatsTable->setRowCount(0);
if (!$mimeData) {
return;
}
# [updateFormatsTable() part1]
# [updateFormatsTable() part2]
foreach my $format ( @{$mimeData->formats()} ) {
my $formatItem = Qt::TableWidgetItem($format);
$formatItem->setFlags(Qt::ItemIsEnabled());
$formatItem->setTextAlignment(Qt::AlignTop() | Qt::AlignLeft());
# [updateFormatsTable() part2]
# [updateFormatsTable() part3]
my $text;
if ($format eq 'text/plain') {
$text = this->simplified($mimeData->text());
} elsif ($format eq 'text/html') {
$text = this->simplified($mimeData->html());
} elsif ($format eq 'text/uri-list') {
my $urlList = $mimeData->urls();
foreach my $url ( @{$urlList} ) {
$text .= $url . ' ';
}
} else {
my $data = $mimeData->data($format);
for (my $i = 0; $i < $data->size() && $i < 32; ++$i) {
my $hex = uc sprintf '%02x', $data->at($i);
$text .= $hex . ' ';
}
}
# [updateFormatsTable() part3]
# [updateFormatsTable() part4]
my $row = this->formatsTable->rowCount();
this->formatsTable->insertRow($row);
this->formatsTable->setItem($row, 0, Qt::TableWidgetItem($format));
this->formatsTable->setItem($row, 1, Qt::TableWidgetItem(Qt::String($text)));
}
this->formatsTable->resizeColumnToContents(0);
}
# [updateFormatsTable() part4]
1;