HCircleView::HCircleView( int viewID_, QWidget *parent ) : ViewWidget( viewID_, parent) { setCaption("Harmonic Circle"); Q3BoxLayout *mainLayout = new Q3HBoxLayout(this); Q3BoxLayout *leftLayout = new Q3VBoxLayout(mainLayout); Q3BoxLayout *rightLayout = new Q3VBoxLayout(mainLayout); Q3Grid *waveFrame = new Q3Grid(1, this); waveFrame->setFrameStyle(Q3Frame::WinPanel | Q3Frame::Sunken); leftLayout->addWidget(waveFrame); hCircleWidget = new HCircleWidget(waveFrame); Q3BoxLayout *bottomLayout = new Q3HBoxLayout(leftLayout); QwtWheel* ZoomWheel = new QwtWheel(this); ZoomWheel->setOrientation(Qt::Vertical); ZoomWheel->setWheelWidth(14); ZoomWheel->setRange(0.001, 0.1, 0.001, 1); ZoomWheel->setValue(0.007); hCircleWidget->setZoom(0.007); QToolTip::add(ZoomWheel, "Zoom in or out"); rightLayout->addWidget(ZoomWheel); QwtWheel* lowestValueWheel = new QwtWheel(this); lowestValueWheel->setOrientation(Qt::Vertical); lowestValueWheel->setWheelWidth(14); lowestValueWheel->setRange(-160, 10, 0.01, 1); lowestValueWheel->setValue(-100); hCircleWidget->setLowestValue(-100); QToolTip::add(lowestValueWheel, "Change the lowest value"); rightLayout->addWidget(lowestValueWheel); rightLayout->addStretch(2); QwtWheel* thresholdWheel = new QwtWheel(this); thresholdWheel->setOrientation(Qt::Horizontal); thresholdWheel->setWheelWidth(14); thresholdWheel->setRange(-160, 10, 0.01, 1); thresholdWheel->setValue(-100); hCircleWidget->setThreshold(-100); QToolTip::add(thresholdWheel, "Change the harmonic threshold"); bottomLayout->addWidget(thresholdWheel); bottomLayout->addStretch(2); connect(ZoomWheel, SIGNAL(valueChanged(double)), hCircleWidget, SLOT(setZoom(double))); connect(ZoomWheel, SIGNAL(valueChanged(double)), hCircleWidget, SLOT(update())); connect(lowestValueWheel, SIGNAL(valueChanged(double)), hCircleWidget, SLOT(setLowestValue(double))); connect(lowestValueWheel, SIGNAL(valueChanged(double)), hCircleWidget, SLOT(update())); connect(thresholdWheel, SIGNAL(valueChanged(double)), hCircleWidget, SLOT(setThreshold(double))); connect(thresholdWheel, SIGNAL(valueChanged(double)), hCircleWidget, SLOT(update())); }
HTrackView::HTrackView( int viewID_, QWidget *parent ) : ViewWidget( viewID_, parent) { //setCaption("HTrack view"); Q3GridLayout *mainLayout = new Q3GridLayout(this, 2, 2); mainLayout->setResizeMode(QLayout::SetNoConstraint); //QBoxLayout *topLayout = new QVBoxLayout(mainLayout); //QBoxLayout *rightLayout = new QVBoxLayout(mainLayout); Q3BoxLayout *rightLayout = new Q3VBoxLayout(); Q3BoxLayout *bottomLayout = new Q3HBoxLayout(); Q3Grid *frame = new Q3Grid(1, this); frame->setFrameStyle(Q3Frame::WinPanel | Q3Frame::Sunken); //frame->setLineWidth(2); //frame->setMidLineWidth(2); QWidget *aWidget = new QWidget(frame); hTrackWidget = new HTrackWidget(aWidget); hTrackWidget->setWhatsThis("Shows a 3D keyboard with the current note coloured. " "Vertical columns (or tracks), each representing a harmonic (or component frequency), protrude from the back, and move further away over time. " "The height of each track is related to how much energy is at that frequency. " "Tracks alternate in colour for better visibility. It can be seen how the hamonics in a note fit into the musical scale."); //hTrackWidget->show(); peakThresholdSlider = new QSlider(0, 100, 10, 5, Qt::Vertical, this); QToolTip::add(peakThresholdSlider, "Thresholding of harmonics"); rotateXWheel = new QwtWheel(this); rotateXWheel->setWheelWidth(20); rotateXWheel->setRange(-180, 180, 0.1, 1); QToolTip::add(rotateXWheel, "Rotate piano horizonally"); rotateYWheel = new QwtWheel(this); rotateYWheel->setOrientation(Qt::Vertical); rotateYWheel->setWheelWidth(20); rotateYWheel->setRange(-90, 0, 0.1, 1); QToolTip::add(rotateYWheel, "Rotate piano vertically"); distanceWheel = new QwtWheel(this); distanceWheel->setOrientation(Qt::Vertical); //distanceWheel->setWheelWidth(20); distanceWheel->setRange(100, 5000, 10, 20); distanceWheel->setTotalAngle(20*360); QToolTip::add(distanceWheel, "Move towards/away from piano"); QPushButton *homeButton = new QPushButton("Reset", this, "homebutton"); QToolTip::add(homeButton, "Return to the original view"); QSizeGrip *sizeGrip = new QSizeGrip(this); //sizeGrip->setFixedSize(15, 15); mainLayout->addWidget(frame, 0, 0); mainLayout->addLayout(bottomLayout, 1, 0); mainLayout->addLayout(rightLayout, 0, 1); rightLayout->addStretch(2); rightLayout->addWidget(peakThresholdSlider); rightLayout->addStretch(4); rightLayout->addWidget(rotateYWheel); rightLayout->addSpacing(14); rightLayout->addWidget(distanceWheel); bottomLayout->addStretch(0); bottomLayout->addWidget(homeButton); bottomLayout->addSpacing(14); bottomLayout->addWidget(rotateXWheel); //bottomLayout->addSpacing(20); mainLayout->addWidget(sizeGrip, 1, 1); //make the widget get updated when the view changes connect(gdata->view, SIGNAL(onSlowUpdate(double)), hTrackWidget, SLOT(update())); connect(peakThresholdSlider, SIGNAL(valueChanged(int)), this, SLOT(setPeakThreshold(int))); connect(rotateYWheel, SIGNAL(valueChanged(double)), hTrackWidget, SLOT(setViewAngleVertical(double))); connect(rotateYWheel, SIGNAL(valueChanged(double)), hTrackWidget, SLOT(update())); connect(hTrackWidget, SIGNAL(viewAngleVerticalChanged(double)), rotateYWheel, SLOT(setValue(double))); connect(distanceWheel, SIGNAL(valueChanged(double)), hTrackWidget, SLOT(setDistanceAway(double))); connect(distanceWheel, SIGNAL(valueChanged(double)), hTrackWidget, SLOT(update())); connect(hTrackWidget, SIGNAL(distanceAwayChanged(double)), distanceWheel, SLOT(setValue(double))); connect(rotateXWheel, SIGNAL(valueChanged(double)), hTrackWidget, SLOT(setViewAngleHorizontal(double))); connect(rotateXWheel, SIGNAL(valueChanged(double)), hTrackWidget, SLOT(update())); connect(hTrackWidget, SIGNAL(viewAngleHorizontalChanged(double)), rotateXWheel, SLOT(setValue(double))); connect(homeButton, SIGNAL(clicked()), hTrackWidget, SLOT(home())); }