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;