The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Window;

# use blib;
use Qt;
use Qt::QString;
use Qt::QWidget;
use Qt::QCheckBox;
use Qt::QComboBox;
use Qt::QGroupBox;
use Qt::QLabel;
use Qt::QSpinBox;
use Qt::QStackedWidget;
use Qt::QGridLayout;
use Qt::QBoxLayout;

use SlidersGroup;

our @ISA = qw(Qt::QWidget);
our @EXPORT = qw(Window);


sub Window {
    my $class = 'Window';
    my $this = QWidget();
    bless $this, $class;

    $this->{horizontalSliders} = SlidersGroup(Qt::Horizontal, QString("Horizontal"));
    $this->{verticalSliders} = SlidersGroup(Qt::Vertical, QString("Vertical"));

    $this->{stackedWidget} = QStackedWidget();
    $this->{stackedWidget}->addWidget($this->{horizontalSliders});
    $this->{stackedWidget}->addWidget($this->{verticalSliders});

    $this->createControls(QString("Controls"));

    $this->connect($this->{horizontalSliders}, SIGNAL('valueChanged(int)'), $this->{verticalSliders}, SLOT('setValue(int)'));
    $this->connect($this->{verticalSliders}, SIGNAL('valueChanged(int)'), $this->{valueSpinBox}, SLOT('setValue(int)'));
    $this->connect($this->{valueSpinBox}, SIGNAL('valueChanged(int)'), $this->{horizontalSliders}, SLOT('setValue(int)'));

    $this->{layout} = QHBoxLayout();
    $this->{layout}->addWidget($this->{controlsGroup});
    $this->{layout}->addWidget($this->{stackedWidget});
    $this->setLayout($this->{layout});

    $this->{minimumSpinBox}->setValue(0);
    $this->{maximumSpinBox}->setValue(20);
    $this->{valueSpinBox}->setValue(5);

    $this->setWindowTitle(QString('Sliders'));

    return $this;
}


sub createControls {
    my $this = shift;
    my $title = shift;
    $this->{controlsGroup} = QGroupBox($title);

    $this->{minimumLabel} = QLabel(QString('Minimum value:'));
    $this->{maximumLabel} = QLabel(QString('Maximum value:'));
    $this->{valueLabel} = QLabel(QString('Current value:'));

    $this->{invertedAppearance} = QCheckBox(QString('Inverted appearance'));
    $this->{invertedKeyBindings} = QCheckBox(QString('Inverted key bindings'));

    $this->{minimumSpinBox} = QSpinBox();
    $this->{minimumSpinBox}->setRange(-100, 100);
    $this->{minimumSpinBox}->setSingleStep(1);

    $this->{maximumSpinBox} = QSpinBox();
    $this->{maximumSpinBox}->setRange(-100, 100);
    $this->{maximumSpinBox}->setSingleStep(1);
    
    $this->{valueSpinBox} = QSpinBox();
    $this->{valueSpinBox}->setRange(-100, 100);
    $this->{valueSpinBox}->setSingleStep(1);

    $this->{orientationCombo} = QComboBox();
    $this->{orientationCombo}->addItem(QString("Horizontal slider-like widgets"));
    $this->{orientationCombo}->addItem(QString("Vertical slider-like widgets"));

    $this->connect($this->{orientationCombo}, SIGNAL('activated(int)'), $this->{stackedWidget}, SLOT('setCurrentIndex(int)'));
    $this->connect($this->{minimumSpinBox}, SIGNAL('valueChanged(int)'), $this->{horizontalSliders}, SLOT('setMinimum(int)'));
    $this->connect($this->{minimumSpinBox}, SIGNAL('valueChanged(int)'), $this->{verticalSliders}, SLOT('setMinimum(int)'));
    $this->connect($this->{maximumSpinBox}, SIGNAL('valueChanged(int)'), $this->{horizontalSliders}, SLOT('setMaximum(int)'));
    $this->connect($this->{maximumSpinBox}, SIGNAL('valueChanged(int)'), $this->{verticalSliders}, SLOT('setMaximum(int)'));
    $this->connect($this->{invertedAppearance}, SIGNAL('toggled(bool)'), $this->{horizontalSliders}, SLOT('invertAppearance(bool)'));
    $this->connect($this->{invertedAppearance}, SIGNAL('toggled(bool)'), $this->{verticalSliders}, SLOT('invertAppearance(bool)'));
    $this->connect($this->{invertedKeyBindings}, SIGNAL('toggled(bool)'), $this->{horizontalSliders}, SLOT('invertKeyBindings(bool)'));
    $this->connect($this->{invertedKeyBindings}, SIGNAL('toggled(bool)'), $this->{verticalSliders}, SLOT('invertKeyBindings(bool)'));

    $this->{controlsLayout} = QGridLayout();
    $this->{controlsLayout}->addWidget($this->{minimumLabel}, 0, 0);
    $this->{controlsLayout}->addWidget($this->{maximumLabel}, 1, 0);
    $this->{controlsLayout}->addWidget($this->{valueLabel}, 2, 0);
    $this->{controlsLayout}->addWidget($this->{minimumSpinBox}, 0, 1);
    $this->{controlsLayout}->addWidget($this->{maximumSpinBox}, 1, 1);
    $this->{controlsLayout}->addWidget($this->{valueSpinBox}, 2, 1);
    $this->{controlsLayout}->addWidget($this->{invertedAppearance}, 0, 2);
    $this->{controlsLayout}->addWidget($this->{invertedKeyBindings}, 1, 2);
    $this->{controlsLayout}->addWidget($this->{orientationCombo}, 3, 0, 1, 3);
    $this->{controlsGroup}->setLayout($this->{controlsLayout});
}

1;