package MainWindow;
use strict;
use warnings;
use QtCore4;
use QtGui4;
# [0]
use QtCore4::isa qw( Qt::MainWindow );
use QtCore4::slots
about => [],
changeStyle => ['bool'],
changeSize => ['bool'],
changeSizeBool => [],
changeIcon => [],
addImages => [],
removeAllImages => [];
use IconPreviewArea;
use ImageDelegate;
use IconSizeSpinBox;
sub centralWidget() {
return this->{centralWidget};
}
sub setCentralWidget($) {
this->{centralWidget} = shift;
this->SUPER::setCentralWidget( this->centralWidget );
}
sub previewGroupBox() {
return this->{previewGroupBox};
}
sub setPreviewGroupBox($) {
return this->{previewGroupBox} = shift;
}
sub previewArea() {
return this->{previewArea};
}
sub setPreviewArea($) {
return this->{previewArea} = shift;
}
sub imagesGroupBox() {
return this->{imagesGroupBox};
}
sub setImagesGroupBox($) {
return this->{imagesGroupBox} = shift;
}
sub imagesTable() {
return this->{imagesTable};
}
sub setImagesTable($) {
return this->{imagesTable} = shift;
}
sub iconSizeGroupBox() {
return this->{iconSizeGroupBox};
}
sub setIconSizeGroupBox($) {
return this->{iconSizeGroupBox} = shift;
}
sub smallRadioButton() {
return this->{smallRadioButton};
}
sub setSmallRadioButton($) {
return this->{smallRadioButton} = shift;
}
sub largeRadioButton() {
return this->{largeRadioButton};
}
sub setLargeRadioButton($) {
return this->{largeRadioButton} = shift;
}
sub toolBarRadioButton() {
return this->{toolBarRadioButton};
}
sub setToolBarRadioButton($) {
return this->{toolBarRadioButton} = shift;
}
sub listViewRadioButton() {
return this->{listViewRadioButton};
}
sub setListViewRadioButton($) {
return this->{listViewRadioButton} = shift;
}
sub iconViewRadioButton() {
return this->{iconViewRadioButton};
}
sub setIconViewRadioButton($) {
return this->{iconViewRadioButton} = shift;
}
sub tabBarRadioButton() {
return this->{tabBarRadioButton};
}
sub setTabBarRadioButton($) {
return this->{tabBarRadioButton} = shift;
}
sub otherRadioButton() {
return this->{otherRadioButton};
}
sub setOtherRadioButton($) {
return this->{otherRadioButton} = shift;
}
sub otherSpinBox() {
return this->{otherSpinBox};
}
sub setOtherSpinBox($) {
return this->{otherSpinBox} = shift;
}
sub fileMenu() {
return this->{fileMenu};
}
sub setFileMenu($) {
return this->{fileMenu} = shift;
}
sub viewMenu() {
return this->{viewMenu};
}
sub setViewMenu($) {
return this->{viewMenu} = shift;
}
sub helpMenu() {
return this->{helpMenu};
}
sub setHelpMenu($) {
return this->{helpMenu} = shift;
}
sub addImagesAct() {
return this->{addImagesAct};
}
sub setAddImagesAct($) {
return this->{addImagesAct} = shift;
}
sub removeAllImagesAct() {
return this->{removeAllImagesAct};
}
sub setRemoveAllImagesAct($) {
return this->{removeAllImagesAct} = shift;
}
sub exitAct() {
return this->{exitAct};
}
sub setExitAct($) {
return this->{exitAct} = shift;
}
sub guessModeStateAct() {
return this->{guessModeStateAct};
}
sub setGuessModeStateAct($) {
return this->{guessModeStateAct} = shift;
}
sub styleActionGroup() {
return this->{styleActionGroup};
}
sub setStyleActionGroup($) {
return this->{styleActionGroup} = shift;
}
sub aboutAct() {
return this->{aboutAct};
}
sub setAboutAct($) {
return this->{aboutAct} = shift;
}
sub aboutQtAct() {
return this->{aboutQtAct};
}
sub setAboutQtAct($) {
return this->{aboutQtAct} = shift;
}
# [0]
# [0]
sub NEW {
my ( $class ) = @_;
$class->SUPER::NEW();
this->setCentralWidget(Qt::Widget());
this->createPreviewGroupBox();
this->createImagesGroupBox();
this->createIconSizeGroupBox();
this->createActions();
this->createMenus();
this->createContextMenu();
my $mainLayout = Qt::GridLayout();
$mainLayout->addWidget(this->previewGroupBox, 0, 0, 1, 2);
$mainLayout->addWidget(this->imagesGroupBox, 1, 0);
$mainLayout->addWidget(this->iconSizeGroupBox, 1, 1);
this->centralWidget->setLayout($mainLayout);
this->setWindowTitle(this->tr('Icons'));
this->checkCurrentStyle();
this->otherRadioButton->click();
this->resize(this->minimumSizeHint());
}
# [0]
# [1]
sub about {
Qt::MessageBox::about(this, this->tr('About Icons'),
this->tr('The Icons example illustrates how Qt4 renders an icon in ' .
'different modes (active, normal, disabled, and selected) and ' .
'states (on and off) based on a set of images.'));
}
# [1]
# [2]
sub changeStyle {
my ($checked) = @_;
if (!$checked) {
return;
}
#my $action = Qt::Action() = qobject_cast(sender());
my $action = this->sender();
# [2] //! [3]
my $style = Qt::StyleFactory::create($action->data()->toString());
# [3] //! [4]
Qt::Application::setStyle($style);
this->smallRadioButton->setText(sprintf this->tr('Small (%d x %d)'),
$style->pixelMetric(Qt::Style::PM_SmallIconSize(), undef, undef),
$style->pixelMetric(Qt::Style::PM_SmallIconSize(), undef, undef));
this->largeRadioButton->setText(sprintf this->tr('Large (%d x %d)'),
$style->pixelMetric(Qt::Style::PM_LargeIconSize(), undef, undef),
$style->pixelMetric(Qt::Style::PM_LargeIconSize(), undef, undef));
this->toolBarRadioButton->setText(sprintf this->tr('Toolbars (%d x %d)'),
$style->pixelMetric(Qt::Style::PM_ToolBarIconSize(), undef, undef),
$style->pixelMetric(Qt::Style::PM_ToolBarIconSize(), undef, undef));
this->listViewRadioButton->setText(sprintf this->tr('List views (%d x %d)'),
$style->pixelMetric(Qt::Style::PM_ListViewIconSize(), undef, undef),
$style->pixelMetric(Qt::Style::PM_ListViewIconSize(), undef, undef));
this->iconViewRadioButton->setText(sprintf this->tr('Icon views (%d x %d)'),
$style->pixelMetric(Qt::Style::PM_IconViewIconSize(), undef, undef),
$style->pixelMetric(Qt::Style::PM_IconViewIconSize(), undef, undef));
this->tabBarRadioButton->setText(sprintf this->tr('Tab bars (%d x %d)'),
$style->pixelMetric(Qt::Style::PM_TabBarIconSize(), undef, undef),
$style->pixelMetric(Qt::Style::PM_TabBarIconSize(), undef, undef));
this->changeSize(1);
}
# [4]
# [5]
sub changeSizeBool {
this->changeSize(1);
}
sub changeSize {
my ($checked) = @_;
if (!$checked) {
return;
}
my $extent;
if (this->otherRadioButton->isChecked()) {
$extent = this->otherSpinBox->value();
} else {
my $metric;
if (this->smallRadioButton->isChecked()) {
$metric = Qt::Style::PM_SmallIconSize();
} elsif (this->largeRadioButton->isChecked()) {
$metric = Qt::Style::PM_LargeIconSize();
} elsif (this->toolBarRadioButton->isChecked()) {
$metric = Qt::Style::PM_ToolBarIconSize();
} elsif (this->listViewRadioButton->isChecked()) {
$metric = Qt::Style::PM_ListViewIconSize();
} elsif (this->iconViewRadioButton->isChecked()) {
$metric = Qt::Style::PM_IconViewIconSize();
} else {
$metric = Qt::Style::PM_TabBarIconSize();
}
$extent = Qt::Application::style()->pixelMetric($metric, undef, undef);
}
this->previewArea->setSize(Qt::Size($extent, $extent));
this->otherSpinBox->setEnabled(this->otherRadioButton->isChecked());
}
# [5]
# [6]
sub changeIcon {
my $icon = Qt::Icon();
for (my $row = 0; $row < this->imagesTable->rowCount(); ++$row) {
my $item0 = this->imagesTable->item($row, 0);
my $item1 = this->imagesTable->item($row, 1);
my $item2 = this->imagesTable->item($row, 2);
if ($item0->checkState() == Qt::Checked()) {
my $mode;
if ($item1->text() eq this->tr('Normal')) {
$mode = Qt::Icon::Normal();
} elsif ($item1->text() eq this->tr('Active')) {
$mode = Qt::Icon::Active();
} elsif ($item1->text() eq this->tr('Disabled')) {
$mode = Qt::Icon::Disabled();
} else {
$mode = Qt::Icon::Selected();
}
my $state;
if ($item2->text() eq this->tr('On')) {
$state = Qt::Icon::On();
} else {
$state = Qt::Icon::Off();
# [6] //! [7]
}
# [7]
# [8]
my $fileName = $item0->data(Qt::UserRole())->toString();
my $image = Qt::Image(Qt::String($fileName));
if ($image) {
$icon->addPixmap(Qt::Pixmap::fromImage($image), $mode, $state);
}
# [8] //! [9]
}
# [9] //! [10]
}
# [10]
# [11]
this->previewArea->setIcon($icon);
}
# [11]
# [12]
sub addImages {
my $fileNames = Qt::FileDialog::getOpenFileNames(this,
this->tr('Open Images'), '',
this->tr('Images (*.png *.xpm *.jpg);;') .
this->tr('All Files (*)'));
if ( ref $fileNames eq 'ARRAY' ) {
foreach my $fileName ( @{$fileNames} ) {
my $row = this->imagesTable->rowCount();
this->imagesTable->setRowCount($row + 1);
# [12]
# [13]
my $imageName = Qt::FileInfo($fileName)->baseName();
# [13] //! [14]
my $item0 = Qt::TableWidgetItem($imageName);
$item0->setData(Qt::UserRole(), Qt::Variant(Qt::String($fileName)));
$item0->setFlags($item0->flags()&~${Qt::ItemIsEditable()});
# [14]
# [15]
my $item1 = Qt::TableWidgetItem(this->tr('Normal'));
# [15] //! [16]
my $item2 = Qt::TableWidgetItem(this->tr('Off'));
if (this->guessModeStateAct->isChecked()) {
if ($fileName =~ m/_act/) {
$item1->setText(this->tr('Active'));
} elsif ($fileName =~ m/_dis/) {
$item1->setText(this->tr('Disabled'));
} elsif ($fileName =~ m/_sel/) {
$item1->setText(this->tr('Selected'));
}
if ($fileName =~ m/_on/) {
$item2->setText(this->tr('On'));
}
# [16] //! [17]
}
# [17]
# [18]
this->imagesTable->setItem($row, 0, $item0);
# [18] //! [19]
this->imagesTable->setItem($row, 1, $item1);
this->imagesTable->setItem($row, 2, $item2);
this->imagesTable->openPersistentEditor($item1);
this->imagesTable->openPersistentEditor($item2);
$item0->setCheckState(Qt::Checked());
}
}
}
# [19]
# [20]
sub removeAllImages {
this->imagesTable->setRowCount(0);
this->changeIcon();
}
# [20]
sub createPreviewGroupBox {
this->setPreviewGroupBox( Qt::GroupBox(this->tr('Preview')) );
this->setPreviewArea( IconPreviewArea() );
my $layout = Qt::VBoxLayout();
$layout->addWidget(this->previewArea);
this->previewGroupBox->setLayout($layout);
return;
}
# [21]
sub createImagesGroupBox {
this->setImagesGroupBox( Qt::GroupBox(this->tr('Images')) );
this->setImagesTable( Qt::TableWidget() );
this->imagesTable->setSelectionMode(Qt::AbstractItemView::NoSelection());
this->imagesTable->setItemDelegate(ImageDelegate(this));
# [21]
# [22]
my @labels;
# [22] //! [23]
@labels = (this->tr('Image'), this->tr('Mode'), this->tr('State'));
this->imagesTable->horizontalHeader()->setDefaultSectionSize(90);
this->imagesTable->setColumnCount(3);
this->imagesTable->setHorizontalHeaderLabels(\@labels);
this->imagesTable->horizontalHeader()->setResizeMode(0, Qt::HeaderView::Stretch());
this->imagesTable->horizontalHeader()->setResizeMode(1, Qt::HeaderView::Fixed());
this->imagesTable->horizontalHeader()->setResizeMode(2, Qt::HeaderView::Fixed());
this->imagesTable->verticalHeader()->hide();
# [23]
# [24]
this->connect(this->imagesTable, SIGNAL 'itemChanged(QTableWidgetItem *)',
# [24] //! [25]
this, SLOT 'changeIcon()');
my $layout = Qt::VBoxLayout();
$layout->addWidget(this->imagesTable);
this->imagesGroupBox->setLayout($layout);
}
# [25]
# [26]
sub createIconSizeGroupBox {
this->setIconSizeGroupBox( Qt::GroupBox(this->tr('Icon Size')) );
this->setSmallRadioButton( Qt::RadioButton() );
this->setLargeRadioButton( Qt::RadioButton() );
this->setToolBarRadioButton( Qt::RadioButton() );
this->setListViewRadioButton( Qt::RadioButton() );
this->setIconViewRadioButton( Qt::RadioButton() );
this->setTabBarRadioButton( Qt::RadioButton() );
this->setOtherRadioButton( Qt::RadioButton(this->tr('Other:')) );
this->setOtherSpinBox( IconSizeSpinBox() );
this->otherSpinBox->setRange(8, 128);
this->otherSpinBox->setValue(64);
# [26]
# [27]
this->connect(this->smallRadioButton, SIGNAL 'toggled(bool)',
this, SLOT 'changeSize(bool)');
this->connect(this->largeRadioButton, SIGNAL 'toggled(bool)',
this, SLOT 'changeSize(bool)');
this->connect(this->toolBarRadioButton, SIGNAL 'toggled(bool)',
this, SLOT 'changeSize(bool)');
this->connect(this->listViewRadioButton, SIGNAL 'toggled(bool)',
this, SLOT 'changeSize(bool)');
this->connect(this->iconViewRadioButton, SIGNAL 'toggled(bool)',
this, SLOT 'changeSize(bool)');
this->connect(this->tabBarRadioButton, SIGNAL 'toggled(bool)',
this, SLOT 'changeSize(bool)');
this->connect(this->otherRadioButton, SIGNAL 'toggled(bool)',
this, SLOT 'changeSize(bool)');
this->connect(this->otherSpinBox, SIGNAL 'valueChanged(int)', this, SLOT 'changeSizeBool()');
my $otherSizeLayout = Qt::HBoxLayout();
$otherSizeLayout->addWidget(this->otherRadioButton);
$otherSizeLayout->addWidget(this->otherSpinBox);
$otherSizeLayout->addStretch();
my $layout = Qt::GridLayout();
$layout->addWidget(this->smallRadioButton, 0, 0);
$layout->addWidget(this->largeRadioButton, 1, 0);
$layout->addWidget(this->toolBarRadioButton, 2, 0);
$layout->addWidget(this->listViewRadioButton, 0, 1);
$layout->addWidget(this->iconViewRadioButton, 1, 1);
$layout->addWidget(this->tabBarRadioButton, 2, 1);
$layout->addLayout($otherSizeLayout, 3, 0, 1, 2);
$layout->setRowStretch(4, 1);
this->iconSizeGroupBox->setLayout($layout);
}
# [27]
# [28]
sub createActions {
this->setAddImagesAct( Qt::Action(this->tr('&Add Images...'), this) );
this->addImagesAct->setShortcut(Qt::KeySequence(this->tr('Ctrl+A')));
this->connect(this->addImagesAct, SIGNAL 'triggered()', this, SLOT 'addImages()');
this->setRemoveAllImagesAct( Qt::Action(this->tr('&Remove All Images'), this) );
this->removeAllImagesAct->setShortcut( Qt::KeySequence(this->tr('Ctrl+R')) );
this->connect(this->removeAllImagesAct, SIGNAL 'triggered()',
this, SLOT 'removeAllImages()');
this->setExitAct( Qt::Action(this->tr('&Quit'), this) );
this->exitAct->setShortcut( Qt::KeySequence(this->tr('Ctrl+Q')) );
this->connect(this->exitAct, SIGNAL 'triggered()', this, SLOT 'close()');
this->setStyleActionGroup( Qt::ActionGroup(this) );
foreach my $styleName ( @{Qt::StyleFactory::keys()} ) {
utf8::encode( $styleName );
my $action = Qt::Action(this->styleActionGroup);
$action->setText( sprintf this->tr('%s Style'), $styleName );
$action->setData(Qt::Variant(Qt::String($styleName)));
$action->setCheckable(1);
this->connect($action, SIGNAL 'triggered(bool)', this, SLOT 'changeStyle(bool)');
}
this->setGuessModeStateAct( Qt::Action(this->tr('&Guess Image Mode/State'), this) );
this->guessModeStateAct->setCheckable(1);
this->guessModeStateAct->setChecked(1);
this->setAboutAct( Qt::Action(this->tr('&About'), this) );
this->connect(this->aboutAct, SIGNAL 'triggered()', this, SLOT 'about()');
this->setAboutQtAct( Qt::Action(this->tr('About &Qt'), this) );
this->connect(this->aboutQtAct, SIGNAL 'triggered()', qApp, SLOT 'aboutQt()');
}
# [28]
# [29]
sub createMenus {
this->setFileMenu( this->menuBar()->addMenu(this->tr('&File')) );
this->fileMenu->addAction(this->addImagesAct);
this->fileMenu->addAction(this->removeAllImagesAct);
this->fileMenu->addSeparator();
this->fileMenu->addAction(this->exitAct);
this->setViewMenu( this->menuBar()->addMenu(this->tr('&View')) );
foreach my $action ( @{this->styleActionGroup->actions()} ) {
this->viewMenu->addAction($action);
}
this->viewMenu->addSeparator();
this->viewMenu->addAction(this->guessModeStateAct);
this->menuBar()->addSeparator();
this->setHelpMenu( this->menuBar()->addMenu(this->tr('&Help')) );
this->helpMenu->addAction(this->aboutAct);
this->helpMenu->addAction(this->aboutQtAct);
}
# [29]
# [30]
sub createContextMenu {
this->imagesTable->setContextMenuPolicy(Qt::ActionsContextMenu());
this->imagesTable->addAction(this->addImagesAct);
this->imagesTable->addAction(this->removeAllImagesAct);
}
# [30]
# [31]
sub checkCurrentStyle {
foreach my $action ( @{this->styleActionGroup->actions()} ) {
my $styleName = $action->data()->toString();
my $candidate = Qt::StyleFactory::create($styleName);
#printf "AppStyle: 0x%x\n", Qt::_internal::sv_to_ptr(Qt::Application::style());
Qt::_internal::sv_to_ptr(Qt::Application::style());
if ($candidate->metaObject()->className()
eq Qt::Application::style()->metaObject()->className()) {
$action->trigger();
return;
}
}
}
# [31]
1;