DownloadRideDialog::DownloadRideDialog(Context *context, bool embedded) : context(context), cancelled(false), action(actionIdle), embedded(embedded) { setAttribute(Qt::WA_DeleteOnClose); setWindowTitle(tr("Download Data")); HelpWhatsThis *help = new HelpWhatsThis(this); this->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::MenuBar_Activity_Download)); deviceCombo = new QComboBox(this); QList<QString> deviceTypes = Devices::typeNames(); Q_FOREACH(QString device, deviceTypes) { deviceCombo->addItem(device); }
VDOTCalculator::VDOTCalculator(QWidget *parent) : QDialog(parent) { bool metricRnPace = appsettings->value(this, GC_PACE, true).toBool(); setWindowTitle(tr("VDOT and T-Pace Calculator")); HelpWhatsThis *help = new HelpWhatsThis(this); this->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::MenuBar_Tools_VDOT_CALC)); setAttribute(Qt::WA_DeleteOnClose); setMinimumSize(300 *dpiXFactor, 300 *dpiYFactor); QVBoxLayout *mainVBox = new QVBoxLayout(this); QHBoxLayout *distHBox = new QHBoxLayout; distHBox->addWidget(new QLabel(tr("Your Test Race:"))); distHBox->addStretch(); distSpinBox = new QDoubleSpinBox(this); distSpinBox->setDecimals(3); if (metricRnPace) { distSpinBox->setRange(1.5, 42.195); distSpinBox->setSuffix(tr(" km")); distSpinBox->setValue(10.0); } else { distSpinBox->setRange(1.5/KM_PER_MILE, 42.195/KM_PER_MILE); distSpinBox->setSuffix(tr(" mi")); distSpinBox->setValue(10.0/KM_PER_MILE); } distSpinBox->setSingleStep(1.0); distSpinBox->setWrapping(false); distSpinBox->setAlignment(Qt::AlignRight); distHBox->addWidget(distSpinBox); distHBox->addStretch(); mainVBox->addLayout(distHBox); QHBoxLayout *timeHBox = new QHBoxLayout; hoursSpinBox = new QDoubleSpinBox(this); hoursSpinBox->setDecimals(0); hoursSpinBox->setRange(0, 6); hoursSpinBox->setSuffix(tr(" hours")); hoursSpinBox->setSingleStep(1.0); hoursSpinBox->setWrapping(false); hoursSpinBox->setAlignment(Qt::AlignRight); hoursSpinBox->setValue(0.0); timeHBox->addWidget(hoursSpinBox); minsSpinBox = new QDoubleSpinBox(this); minsSpinBox->setDecimals(0); minsSpinBox->setRange(0.0, 59.0); minsSpinBox->setSuffix(tr(" mins")); minsSpinBox->setSingleStep(1.0); minsSpinBox->setWrapping(false); minsSpinBox->setAlignment(Qt::AlignRight); minsSpinBox->setValue(40.0); timeHBox->addWidget(minsSpinBox); secsSpinBox = new QDoubleSpinBox(this); secsSpinBox->setDecimals(0); secsSpinBox->setRange(0.0, 59.0); secsSpinBox->setSuffix(tr(" secs")); secsSpinBox->setSingleStep(1.0); secsSpinBox->setWrapping(true); secsSpinBox->setAlignment(Qt::AlignRight); timeHBox->addWidget(secsSpinBox); mainVBox->addLayout(timeHBox); mainVBox->addStretch(); QHBoxLayout *vdotHBox = new QHBoxLayout; vdotHBox->addStretch(); labelVDOT = new QLabel(tr("Your Daniels VDOT:")); vdotHBox->addWidget(labelVDOT); txtVDOT = new QLineEdit(this); txtVDOT->setAlignment(Qt::AlignRight); txtVDOT->setReadOnly(true); vdotHBox->addWidget(txtVDOT, Qt::AlignLeft); vdotHBox->addStretch(); mainVBox->addLayout(vdotHBox); mainVBox->addStretch(); // Training Pace Table QVBoxLayout *tableLayout = new QVBoxLayout; labelTPACE = new QLabel(tr("Your Training Paces:")); tableLayout->addWidget(labelTPACE); tableWidgetTPACE = new QTableWidget(5, 3, this); tableWidgetTPACE->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); for (int j = 0; j< 3; j++) tableWidgetTPACE->setColumnWidth(j, 60*dpiXFactor); QStringList vLabels; vLabels<<tr("E-Pace")<<tr("M-Pace")<< tr("T-Pace")<<tr("I-Pace")<<tr("R-Pace"); tableWidgetTPACE->setVerticalHeaderLabels(vLabels); tableWidgetTPACE->verticalHeader()->setStretchLastSection(true); QStringList hLabels; hLabels<< tr("200")<<tr("400")<<(metricRnPace ? tr("1000") : tr("mile")); tableWidgetTPACE->setHorizontalHeaderLabels(hLabels); tableWidgetTPACE->horizontalHeader()->setStretchLastSection(true); for (int i = 0; i < tableWidgetTPACE->rowCount(); i++) { for (int j = 0; j < tableWidgetTPACE->rowCount(); j++) { QTableWidgetItem *item = new QTableWidgetItem(); item->setFlags(item->flags() ^ Qt::ItemIsEditable); item->setTextAlignment(Qt::AlignCenter); tableWidgetTPACE->setItem(i, j, item); } } tableWidgetTPACE->selectRow(2); // Highlight T-Pace tableWidgetTPACE->resizeRowsToContents(); tableLayout->addWidget(tableWidgetTPACE); mainVBox->addLayout(tableLayout); mainVBox->addStretch(); QHBoxLayout *targetHBox = new QHBoxLayout; targetHBox->addWidget(new QLabel(tr("Your Target Race:"))); targetHBox->addStretch(); targetSpinBox = new QDoubleSpinBox(this); targetSpinBox->setDecimals(3); if (metricRnPace) { targetSpinBox->setRange(1.5, 42.195); targetSpinBox->setSuffix(tr(" km")); targetSpinBox->setValue(21.0975); } else { targetSpinBox->setRange(1.5/KM_PER_MILE, 42.195/KM_PER_MILE); targetSpinBox->setSuffix(tr(" mi")); targetSpinBox->setValue(21.0975/KM_PER_MILE); } targetSpinBox->setSingleStep(1.0); targetSpinBox->setWrapping(false); targetSpinBox->setAlignment(Qt::AlignRight); targetHBox->addWidget(targetSpinBox); targetHBox->addStretch(); mainVBox->addLayout(targetHBox); QHBoxLayout *eqvHBox = new QHBoxLayout; eqvHBox->addStretch(); labelEQV = new QLabel(tr("Equivalent Time:")); eqvHBox->addWidget(labelEQV); txtEQV = new QLineEdit(this); txtEQV->setAlignment(Qt::AlignRight); txtEQV->setReadOnly(true); eqvHBox->addWidget(txtEQV, Qt::AlignLeft); eqvHBox->addStretch(); mainVBox->addLayout(eqvHBox); mainVBox->addStretch(); QHBoxLayout *buttonHBox = new QHBoxLayout; btnCalculate = new QPushButton(this); btnCalculate->setText(tr("Calculate")); buttonHBox->addStretch(); buttonHBox->addWidget(btnCalculate); btnOK = new QPushButton(this); btnOK->setText(tr("Done")); buttonHBox->addWidget(btnOK); mainVBox->addLayout(buttonHBox); connect(btnOK, SIGNAL(clicked()), this, SLOT(on_btnOK_clicked())); connect(btnCalculate, SIGNAL(clicked()), this, SLOT(on_btnCalculate_clicked())); }
AerolabWindow::AerolabWindow(Context *context) : GcChartWindow(context), context(context) { setControls(NULL); // Aerolab tab layout: QVBoxLayout *vLayout = new QVBoxLayout; QHBoxLayout *cLayout = new QHBoxLayout; // Plot: aerolab = new Aerolab(this, context); HelpWhatsThis *help = new HelpWhatsThis(aerolab); aerolab->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::ChartRides_Aerolab)); // Left controls layout: QVBoxLayout *leftControls = new QVBoxLayout; QFontMetrics metrics(QApplication::font()); int labelWidth1 = metrics.width("Crr") + 10; // Crr: QHBoxLayout *crrLayout = new QHBoxLayout; crrLabel = new QLabel(tr("Crr"), this); crrLabel->setFixedWidth(labelWidth1); crrLineEdit = new QLineEdit(); crrLineEdit->setFixedWidth(75); crrLineEdit->setText(QString("%1").arg(aerolab->getCrr()) ); /*crrQLCDNumber = new QLCDNumber(7); crrQLCDNumber->setMode(QLCDNumber::Dec); crrQLCDNumber->setSmallDecimalPoint(false); crrQLCDNumber->setSegmentStyle(QLCDNumber::Flat); crrQLCDNumber->display(QString("%1").arg(aerolab->getCrr()) );*/ crrSlider = new QSlider(Qt::Horizontal); crrSlider->setTickPosition(QSlider::TicksBelow); crrSlider->setTickInterval(1000); crrSlider->setMinimum(1000); crrSlider->setMaximum(10000); crrSlider->setValue(aerolab->intCrr()); crrLayout->addWidget( crrLabel ); crrLayout->addWidget( crrLineEdit ); //crrLayout->addWidget( crrQLCDNumber ); crrLayout->addWidget( crrSlider ); // CdA: QHBoxLayout *cdaLayout = new QHBoxLayout; cdaLabel = new QLabel(tr("CdA"), this); cdaLabel->setFixedWidth(labelWidth1); cdaLineEdit = new QLineEdit(); cdaLineEdit->setFixedWidth(75); cdaLineEdit->setText(QString("%1").arg(aerolab->getCda()) ); /*cdaQLCDNumber = new QLCDNumber(7); cdaQLCDNumber->setMode(QLCDNumber::Dec); cdaQLCDNumber->setSmallDecimalPoint(false); cdaQLCDNumber->setSegmentStyle(QLCDNumber::Flat); cdaQLCDNumber->display(QString("%1").arg(aerolab->getCda()) );*/ cdaSlider = new QSlider(Qt::Horizontal); cdaSlider->setTickPosition(QSlider::TicksBelow); cdaSlider->setTickInterval(100); cdaSlider->setMinimum(1); cdaSlider->setMaximum(6000); cdaSlider->setValue(aerolab->intCda()); cdaLayout->addWidget( cdaLabel ); //cdaLayout->addWidget( cdaQLCDNumber ); cdaLayout->addWidget( cdaLineEdit ); cdaLayout->addWidget( cdaSlider ); // Eta: QHBoxLayout *etaLayout = new QHBoxLayout; etaLabel = new QLabel(tr("Eta"), this); etaLabel->setFixedWidth(labelWidth1); etaLineEdit = new QLineEdit(); etaLineEdit->setFixedWidth(75); etaLineEdit->setText(QString("%1").arg(aerolab->getEta()) ); /*etaQLCDNumber = new QLCDNumber(7); etaQLCDNumber->setMode(QLCDNumber::Dec); etaQLCDNumber->setSmallDecimalPoint(false); etaQLCDNumber->setSegmentStyle(QLCDNumber::Flat); etaQLCDNumber->display(QString("%1").arg(aerolab->getEta()) );*/ etaSlider = new QSlider(Qt::Horizontal); etaSlider->setTickPosition(QSlider::TicksBelow); etaSlider->setTickInterval(1000); etaSlider->setMinimum(8000); etaSlider->setMaximum(12000); etaSlider->setValue(aerolab->intEta()); etaLayout->addWidget( etaLabel ); etaLayout->addWidget( etaLineEdit ); //etaLayout->addWidget( etaQLCDNumber ); etaLayout->addWidget( etaSlider ); // Add to leftControls: leftControls->addLayout( crrLayout ); leftControls->addLayout( cdaLayout ); leftControls->addLayout( etaLayout ); // Right controls layout: QVBoxLayout *rightControls = new QVBoxLayout; int labelWidth2 = metrics.width("Total Mass (kg)") + 10; // Total mass: QHBoxLayout *mLayout = new QHBoxLayout; mLabel = new QLabel(tr("Total Mass (kg)"), this); mLabel->setFixedWidth(labelWidth2); mLineEdit = new QLineEdit(); mLineEdit->setFixedWidth(70); mLineEdit->setText(QString("%1").arg(aerolab->getTotalMass()) ); /*mQLCDNumber = new QLCDNumber(7); mQLCDNumber->setMode(QLCDNumber::Dec); mQLCDNumber->setSmallDecimalPoint(false); mQLCDNumber->setSegmentStyle(QLCDNumber::Flat); mQLCDNumber->display(QString("%1").arg(aerolab->getTotalMass()) );*/ mSlider = new QSlider(Qt::Horizontal); mSlider->setTickPosition(QSlider::TicksBelow); mSlider->setTickInterval(1000); mSlider->setMinimum(3500); mSlider->setMaximum(15000); mSlider->setValue(aerolab->intTotalMass()); mLayout->addWidget( mLabel ); mLayout->addWidget( mLineEdit ); //mLayout->addWidget( mQLCDNumber ); mLayout->addWidget( mSlider ); // Rho: QHBoxLayout *rhoLayout = new QHBoxLayout; rhoLabel = new QLabel(tr("Rho (kg/m^3)"), this); rhoLabel->setFixedWidth(labelWidth2); rhoLineEdit = new QLineEdit(); rhoLineEdit->setFixedWidth(70); rhoLineEdit->setText(QString("%1").arg(aerolab->getRho()) ); /*rhoQLCDNumber = new QLCDNumber(7); rhoQLCDNumber->setMode(QLCDNumber::Dec); rhoQLCDNumber->setSmallDecimalPoint(false); rhoQLCDNumber->setSegmentStyle(QLCDNumber::Flat); rhoQLCDNumber->display(QString("%1").arg(aerolab->getRho()) );*/ rhoSlider = new QSlider(Qt::Horizontal); rhoSlider->setTickPosition(QSlider::TicksBelow); rhoSlider->setTickInterval(1000); rhoSlider->setMinimum(9000); rhoSlider->setMaximum(14000); rhoSlider->setValue(aerolab->intRho()); rhoLayout->addWidget( rhoLabel ); rhoLayout->addWidget( rhoLineEdit ); //rhoLayout->addWidget( rhoQLCDNumber ); rhoLayout->addWidget( rhoSlider ); // Elevation offset: QHBoxLayout *eoffsetLayout = new QHBoxLayout; eoffsetLabel = new QLabel(tr("Eoffset (m)"), this); eoffsetLabel->setFixedWidth(labelWidth2); eoffsetLineEdit = new QLineEdit(); eoffsetLineEdit->setFixedWidth(70); eoffsetLineEdit->setText(QString("%1").arg(aerolab->getEoffset()) ); /*eoffsetQLCDNumber = new QLCDNumber(7); eoffsetQLCDNumber->setMode(QLCDNumber::Dec); eoffsetQLCDNumber->setSmallDecimalPoint(false); eoffsetQLCDNumber->setSegmentStyle(QLCDNumber::Flat); eoffsetQLCDNumber->display(QString("%1").arg(aerolab->getEoffset()) );*/ eoffsetSlider = new QSlider(Qt::Horizontal); eoffsetSlider->setTickPosition(QSlider::TicksBelow); eoffsetSlider->setTickInterval(20000); eoffsetSlider->setMinimum(-30000); eoffsetSlider->setMaximum(250000); eoffsetSlider->setValue(aerolab->intEoffset()); eoffsetLayout->addWidget( eoffsetLabel ); eoffsetLayout->addWidget( eoffsetLineEdit ); //eoffsetLayout->addWidget( eoffsetQLCDNumber ); eoffsetLayout->addWidget( eoffsetSlider ); QVBoxLayout *checkboxLayout = new QVBoxLayout; eoffsetAuto = new QCheckBox(tr("eoffset auto"), this); eoffsetAuto->setCheckState(Qt::Checked); checkboxLayout->addWidget(eoffsetAuto); constantAlt = new QCheckBox(tr("Constant altitude (velodrome,...)"), this); checkboxLayout->addWidget(constantAlt); eoffsetLayout->addLayout(checkboxLayout); QHBoxLayout *smoothLayout = new QHBoxLayout; QComboBox *comboDistance = new QComboBox(); comboDistance->addItem(tr("X Axis Shows Time")); comboDistance->addItem(tr("X Axis Shows Distance")); comboDistance->setCurrentIndex(1); smoothLayout->addWidget(comboDistance); QPushButton *btnEstCdACrr = new QPushButton(tr("&Estimate CdA and Crr"), this); smoothLayout->addWidget(btnEstCdACrr); // Add to leftControls: rightControls->addLayout( mLayout ); rightControls->addLayout( rhoLayout ); rightControls->addLayout( eoffsetLayout ); rightControls->addLayout( smoothLayout ); // Assemble controls layout: cLayout->addLayout(leftControls); cLayout->addLayout(rightControls); // Zoomer: allZoomer = new QwtPlotZoomer(aerolab->canvas()); allZoomer->setRubberBand(QwtPicker::RectRubberBand); allZoomer->setTrackerMode(QwtPicker::AlwaysOff); allZoomer->setEnabled(true); allZoomer->setMousePattern( QwtEventPattern::MouseSelect2, Qt::RightButton, Qt::ControlModifier ); allZoomer->setMousePattern( QwtEventPattern::MouseSelect3, Qt::RightButton ); // SIGNALs to SLOTs: connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(context, SIGNAL(rideChanged(RideItem*)), this, SLOT(rideSelected())); connect(crrSlider, SIGNAL(valueChanged(int)),this, SLOT(setCrrFromSlider())); connect(crrLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(setCrrFromText(const QString))); connect(cdaSlider, SIGNAL(valueChanged(int)), this, SLOT(setCdaFromSlider())); connect(cdaLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(setCdaFromText(const QString))); connect(mSlider, SIGNAL(valueChanged(int)),this, SLOT(setTotalMassFromSlider())); connect(mLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(setTotalMassFromText(const QString))); connect(rhoSlider, SIGNAL(valueChanged(int)), this, SLOT(setRhoFromSlider())); connect(rhoLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(setRhoFromText(const QString))); connect(etaSlider, SIGNAL(valueChanged(int)), this, SLOT(setEtaFromSlider())); connect(etaLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(setEtaFromText(const QString))); connect(eoffsetSlider, SIGNAL(valueChanged(int)), this, SLOT(setEoffsetFromSlider())); connect(eoffsetLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(setEoffsetFromText(const QString))); connect(eoffsetAuto, SIGNAL(stateChanged(int)), this, SLOT(setAutoEoffset(int))); connect(constantAlt, SIGNAL(stateChanged(int)), this, SLOT(setConstantAlt(int))); connect(comboDistance, SIGNAL(currentIndexChanged(int)), this, SLOT(setByDistance(int))); connect(btnEstCdACrr, SIGNAL(clicked()), this, SLOT(doEstCdACrr())); connect(context, SIGNAL(configChanged(qint32)), aerolab, SLOT(configChanged(qint32))); connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); connect(context, SIGNAL(intervalSelected() ), this, SLOT(intervalSelected())); connect(context, SIGNAL(intervalZoom(IntervalItem*) ), this, SLOT(zoomInterval(IntervalItem*))); connect(allZoomer, SIGNAL( zoomed(const QRectF) ), this, SLOT(zoomChanged())); // Build the tab layout: vLayout->addWidget(aerolab); vLayout->addLayout(cLayout); setChartLayout(vLayout); // tooltip on hover over point //************************************ aerolab->tooltip = new LTMToolTip( QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::VLineRubberBand, QwtPicker::AlwaysOn, aerolab->canvas(), "" ); aerolab->tooltip->setRubberBand( QwtPicker::VLineRubberBand ); aerolab->tooltip->setMousePattern( QwtEventPattern::MouseSelect1, Qt::LeftButton, Qt::ShiftModifier ); aerolab->tooltip->setTrackerPen( QColor( Qt::black ) ); QColor inv( Qt::white ); inv.setAlpha( 0 ); aerolab->tooltip->setRubberBandPen( inv ); aerolab->tooltip->setEnabled( true ); aerolab->_canvasPicker = new LTMCanvasPicker( aerolab ); connect( aerolab->_canvasPicker, SIGNAL( pointHover( QwtPlotCurve*, int ) ), aerolab, SLOT ( pointHover( QwtPlotCurve*, int ) ) ); configChanged(CONFIG_APPEARANCE); // pickup colors etc }
ModelWindow::ModelWindow(Context *context) : GcChartWindow(context), context(context), ride(NULL), current(NULL) { QWidget *c = new QWidget(this); HelpWhatsThis *helpConfig = new HelpWhatsThis(c); c->setWhatsThis(helpConfig->getWhatsThisText(HelpWhatsThis::ChartRides_3D)); QFormLayout *cl = new QFormLayout(c); setControls(c); // the plot widget QHBoxLayout *mainLayout = new QHBoxLayout; modelPlot= new ModelPlot(context, this); zpane = new QSlider(Qt::Vertical); zpane->setTickInterval(1); zpane->setMinimum(0); zpane->setMaximum(100); zpane->setValue(0); mainLayout->addWidget(zpane); mainLayout->addWidget(modelPlot); setChartLayout(mainLayout); HelpWhatsThis *help = new HelpWhatsThis(modelPlot); modelPlot->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::ChartRides_3D)); // preset Values presetLabel = new QLabel(tr("Analyse"), this); presetValues = new QComboBox; fillPresets(presetValues); presetValues->setCurrentIndex(1); cl->addRow(presetLabel, presetValues); // labels xLabel = new QLabel(tr("X-Axis:"), this); xSelector = new QComboBox; addStandardChannels(xSelector); xSelector->setCurrentIndex(0); // power cl->addRow(xLabel, xSelector); yLabel = new QLabel(tr("Y-Axis:"), this); ySelector = new QComboBox; addStandardChannels(ySelector); ySelector->setCurrentIndex(1); // cadence cl->addRow(yLabel, ySelector); zLabel = new QLabel(tr("Z-Axis:"), this); zSelector = new QComboBox; addStandardChannels(zSelector); zSelector->addItem(tr("Time at X&Y"), MODEL_XYTIME); zSelector->setCurrentIndex(12); // time at xy cl->addRow(zLabel, zSelector); colorLabel = new QLabel(tr("Color:"), this); colorSelector = new QComboBox; addStandardChannels(colorSelector); colorSelector->addItem(tr("Power Zone"), MODEL_POWERZONE); colorSelector->addItem(tr("Time at X&Y"), MODEL_XYTIME); colorSelector->setCurrentIndex(12); // power zone cl->addRow(colorLabel, colorSelector); binLabel = new QLabel(tr("Bin Width:"), this); binWidthLineEdit = new QLineEdit(this); binWidthLineEdit->setFixedWidth(30); binWidthLineEdit->setText("5"); cl->addRow(binLabel, binWidthLineEdit); binWidthSlider = new QSlider(Qt::Horizontal); binWidthSlider->setTickPosition(QSlider::TicksBelow); binWidthSlider->setTickInterval(1); binWidthSlider->setMinimum(3); binWidthSlider->setMaximum(100); binWidthSlider->setValue(5); cl->addRow(binWidthSlider); // selectors styleSelector = new QComboBox; styleSelector->addItem(tr("Bar")); styleSelector->addItem(tr("Grid")); styleSelector->addItem(tr("Surface")); styleSelector->addItem(tr("Dots")); styleSelector->setCurrentIndex(0); cl->addRow(styleSelector); ignore = new QCheckBox(tr("Ignore Zero")); ignore->setChecked(true); cl->addRow(ignore); grid = new QCheckBox(tr("Show Grid")); grid->setChecked(true); cl->addRow(grid); frame = new QCheckBox(tr("Frame Intervals")); frame->setChecked(true); cl->addRow(frame); legend = new QCheckBox(tr("Legend")); legend->setChecked(true); cl->addRow(legend); // now connect up the widgets connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(context, SIGNAL(intervalSelected()), this, SLOT(intervalSelected())); connect(presetValues, SIGNAL(currentIndexChanged(int)), this, SLOT(applyPreset(int))); connect(xSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(setDirty())); connect(ySelector, SIGNAL(currentIndexChanged(int)), this, SLOT(setDirty())); connect(zSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(setDirty())); connect(colorSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(setDirty())); connect(grid, SIGNAL(stateChanged(int)), this, SLOT(setGrid())); connect(legend, SIGNAL(stateChanged(int)), this, SLOT(setLegend())); connect(frame, SIGNAL(stateChanged(int)), this, SLOT(setFrame())); connect(styleSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(styleSelected(int))); connect(ignore, SIGNAL(stateChanged(int)), this, SLOT(setDirty())); connect(binWidthSlider, SIGNAL(valueChanged(int)), this, SLOT(setBinWidthFromSlider())); connect(binWidthLineEdit, SIGNAL(editingFinished()), this, SLOT(setBinWidthFromLineEdit())); connect(zpane, SIGNAL(valueChanged(int)), this, SLOT(setZPane(int))); connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); // set colors on first run configChanged(CONFIG_APPEARANCE); }
LTMWindow::LTMWindow(Context *context) : GcChartWindow(context), context(context), dirty(true), stackDirty(true), compareDirty(true) { useToToday = useCustom = false; plotted = DateRange(QDate(01,01,01), QDate(01,01,01)); lastRefresh = QTime::currentTime().addSecs(-10); // the plot QVBoxLayout *mainLayout = new QVBoxLayout; QPalette palette; palette.setBrush(QPalette::Background, QBrush(GColor(CTRENDPLOTBACKGROUND))); // single plot plotWidget = new QWidget(this); plotWidget->setPalette(palette); QVBoxLayout *plotLayout = new QVBoxLayout(plotWidget); plotLayout->setSpacing(0); plotLayout->setContentsMargins(0,0,0,0); ltmPlot = new LTMPlot(this, context, true); spanSlider = new QxtSpanSlider(Qt::Horizontal, this); spanSlider->setFocusPolicy(Qt::NoFocus); spanSlider->setHandleMovementMode(QxtSpanSlider::NoOverlapping); spanSlider->setLowerValue(0); spanSlider->setUpperValue(15); QFont smallFont; smallFont.setPointSize(6); scrollLeft = new QPushButton("<", this); scrollLeft->setFont(smallFont); scrollLeft->setAutoRepeat(true); scrollLeft->setFixedHeight(16); scrollLeft->setFixedWidth(16); scrollLeft->setContentsMargins(0,0,0,0); scrollRight = new QPushButton(">", this); scrollRight->setFont(smallFont); scrollRight->setAutoRepeat(true); scrollRight->setFixedHeight(16); scrollRight->setFixedWidth(16); scrollRight->setContentsMargins(0,0,0,0); QHBoxLayout *span = new QHBoxLayout; span->addWidget(scrollLeft); span->addWidget(spanSlider); span->addWidget(scrollRight); plotLayout->addWidget(ltmPlot); plotLayout->addLayout(span); #ifdef Q_OS_MAC // BUG in QMacStyle and painting of spanSlider // so we use a plain style to avoid it, but only // on a MAC, since win and linux are fine #if QT_VERSION > 0x5000 QStyle *style = QStyleFactory::create("fusion"); #else QStyle *style = QStyleFactory::create("Cleanlooks"); #endif spanSlider->setStyle(style); scrollLeft->setStyle(style); scrollRight->setStyle(style); #endif // the stack of plots plotsWidget = new QWidget(this); plotsWidget->setPalette(palette); plotsLayout = new QVBoxLayout(plotsWidget); plotsLayout->setSpacing(0); plotsLayout->setContentsMargins(0,0,0,0); plotArea = new QScrollArea(this); #ifdef Q_OS_WIN QStyle *cde = QStyleFactory::create(OS_STYLE); plotArea->setStyle(cde); #endif plotArea->setAutoFillBackground(false); plotArea->setWidgetResizable(true); plotArea->setWidget(plotsWidget); plotArea->setFrameStyle(QFrame::NoFrame); plotArea->setContentsMargins(0,0,0,0); plotArea->setPalette(palette); // the data table QFont defaultFont; // mainwindow sets up the defaults.. we need to apply #ifdef NOWEBKIT dataSummary = new QWebEngineView(this); dataSummary->settings()->setFontSize(QWebEngineSettings::DefaultFontSize, defaultFont.pointSize()+1); dataSummary->settings()->setFontFamily(QWebEngineSettings::StandardFont, defaultFont.family()); #else dataSummary = new QWebView(this); dataSummary->settings()->setFontSize(QWebSettings::DefaultFontSize, defaultFont.pointSize()+1); dataSummary->settings()->setFontFamily(QWebSettings::StandardFont, defaultFont.family()); #endif dataSummary->setContentsMargins(0,0,0,0); dataSummary->page()->view()->setContentsMargins(0,0,0,0); dataSummary->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); dataSummary->setAcceptDrops(false); // compare plot page compareplotsWidget = new QWidget(this); compareplotsWidget->setPalette(palette); compareplotsLayout = new QVBoxLayout(compareplotsWidget); compareplotsLayout->setSpacing(0); compareplotsLayout->setContentsMargins(0,0,0,0); compareplotArea = new QScrollArea(this); #ifdef Q_OS_WIN cde = QStyleFactory::create(OS_STYLE); compareplotArea->setStyle(cde); #endif compareplotArea->setAutoFillBackground(false); compareplotArea->setWidgetResizable(true); compareplotArea->setWidget(compareplotsWidget); compareplotArea->setFrameStyle(QFrame::NoFrame); compareplotArea->setContentsMargins(0,0,0,0); compareplotArea->setPalette(palette); // the stack stackWidget = new QStackedWidget(this); stackWidget->addWidget(plotWidget); stackWidget->addWidget(dataSummary); stackWidget->addWidget(plotArea); stackWidget->addWidget(compareplotArea); stackWidget->setCurrentIndex(0); mainLayout->addWidget(stackWidget); setChartLayout(mainLayout); HelpWhatsThis *helpStack = new HelpWhatsThis(stackWidget); stackWidget->setWhatsThis(helpStack->getWhatsThisText(HelpWhatsThis::ChartTrends_MetricTrends)); // reveal controls QHBoxLayout *revealLayout = new QHBoxLayout; revealLayout->setContentsMargins(0,0,0,0); revealLayout->addStretch(); revealLayout->addWidget(new QLabel(tr("Group by"),this)); rGroupBy = new QxtStringSpinBox(this); QStringList strings; strings << tr("Days") << tr("Weeks") << tr("Months") << tr("Years") << tr("Time Of Day") << tr("All"); rGroupBy->setStrings(strings); rGroupBy->setValue(0); revealLayout->addWidget(rGroupBy); rData = new QCheckBox(tr("Data Table"), this); rStack = new QCheckBox(tr("Stacked"), this); QVBoxLayout *checks = new QVBoxLayout; checks->setSpacing(2); checks->setContentsMargins(0,0,0,0); checks->addWidget(rData); checks->addWidget(rStack); revealLayout->addLayout(checks); revealLayout->addStretch(); setRevealLayout(revealLayout); // add additional menu items before setting // controls since the menu is SET from setControls QAction *exportData = new QAction(tr("Export Chart Data..."), this); addAction(exportData); // the controls QWidget *c = new QWidget; c->setContentsMargins(0,0,0,0); HelpWhatsThis *helpConfig = new HelpWhatsThis(c); c->setWhatsThis(helpConfig->getWhatsThisText(HelpWhatsThis::ChartTrends_MetricTrends)); QVBoxLayout *cl = new QVBoxLayout(c); cl->setContentsMargins(0,0,0,0); cl->setSpacing(0); setControls(c); // the popup popup = new GcPane(); ltmPopup = new LTMPopup(context); QVBoxLayout *popupLayout = new QVBoxLayout(); popupLayout->addWidget(ltmPopup); popup->setLayout(popupLayout); ltmTool = new LTMTool(context, &settings); // initialise settings.ltmTool = ltmTool; settings.groupBy = LTM_DAY; settings.legend = ltmTool->showLegend->isChecked(); settings.events = ltmTool->showEvents->isChecked(); settings.shadeZones = ltmTool->shadeZones->isChecked(); settings.showData = ltmTool->showData->isChecked(); settings.stack = ltmTool->showStack->isChecked(); settings.stackWidth = ltmTool->stackSlider->value(); rData->setChecked(ltmTool->showData->isChecked()); rStack->setChecked(ltmTool->showStack->isChecked()); cl->addWidget(ltmTool); connect(this, SIGNAL(dateRangeChanged(DateRange)), this, SLOT(dateRangeChanged(DateRange))); connect(this, SIGNAL(styleChanged(int)), this, SLOT(styleChanged(int))); connect(ltmTool, SIGNAL(filterChanged()), this, SLOT(filterChanged())); connect(context, SIGNAL(homeFilterChanged()), this, SLOT(filterChanged())); connect(ltmTool->groupBy, SIGNAL(currentIndexChanged(int)), this, SLOT(groupBySelected(int))); connect(rGroupBy, SIGNAL(valueChanged(int)), this, SLOT(rGroupBySelected(int))); connect(ltmTool->applyButton, SIGNAL(clicked(bool)), this, SLOT(applyClicked(void))); connect(ltmTool->shadeZones, SIGNAL(stateChanged(int)), this, SLOT(shadeZonesClicked(int))); connect(ltmTool->showData, SIGNAL(stateChanged(int)), this, SLOT(showDataClicked(int))); connect(rData, SIGNAL(stateChanged(int)), this, SLOT(showDataClicked(int))); connect(ltmTool->showStack, SIGNAL(stateChanged(int)), this, SLOT(showStackClicked(int))); connect(rStack, SIGNAL(stateChanged(int)), this, SLOT(showStackClicked(int))); connect(ltmTool->stackSlider, SIGNAL(valueChanged(int)), this, SLOT(zoomSliderChanged())); connect(ltmTool->showLegend, SIGNAL(stateChanged(int)), this, SLOT(showLegendClicked(int))); connect(ltmTool->showEvents, SIGNAL(stateChanged(int)), this, SLOT(showEventsClicked(int))); connect(ltmTool, SIGNAL(useCustomRange(DateRange)), this, SLOT(useCustomRange(DateRange))); connect(ltmTool, SIGNAL(useThruToday()), this, SLOT(useThruToday())); connect(ltmTool, SIGNAL(useStandardRange()), this, SLOT(useStandardRange())); connect(ltmTool, SIGNAL(curvesChanged()), this, SLOT(refresh())); connect(context, SIGNAL(filterChanged()), this, SLOT(filterChanged())); connect(context, SIGNAL(refreshUpdate(QDate)), this, SLOT(refreshUpdate(QDate))); connect(context, SIGNAL(refreshEnd()), this, SLOT(refresh())); // comparing things connect(context, SIGNAL(compareDateRangesStateChanged(bool)), this, SLOT(compareChanged())); connect(context, SIGNAL(compareDateRangesChanged()), this, SLOT(compareChanged())); connect(context, SIGNAL(rideAdded(RideItem*)), this, SLOT(refresh(void))); connect(context, SIGNAL(rideDeleted(RideItem*)), this, SLOT(refresh(void))); connect(context, SIGNAL(rideSaved(RideItem*)), this, SLOT(refresh(void))); connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); connect(context, SIGNAL(presetSelected(int)), this, SLOT(presetSelected(int))); // custom menu item connect(exportData, SIGNAL(triggered()), this, SLOT(exportData())); // normal view connect(spanSlider, SIGNAL(lowerPositionChanged(int)), this, SLOT(spanSliderChanged())); connect(spanSlider, SIGNAL(upperPositionChanged(int)), this, SLOT(spanSliderChanged())); connect(scrollLeft, SIGNAL(clicked()), this, SLOT(moveLeft())); connect(scrollRight, SIGNAL(clicked()), this, SLOT(moveRight())); configChanged(CONFIG_APPEARANCE); }
PfPvWindow::PfPvWindow(Context *context) : GcChartWindow(context), context(context), current(NULL), compareStale(true), stale(false) { QWidget *c = new QWidget; HelpWhatsThis *helpConfig = new HelpWhatsThis(c); c->setWhatsThis(helpConfig->getWhatsThisText(HelpWhatsThis::ChartRides_PFvV)); QVBoxLayout *cl = new QVBoxLayout(c); setControls(c); // // reveal controls widget // // layout reveal controls QHBoxLayout *revealLayout = new QHBoxLayout; revealLayout->setContentsMargins(0,0,0,0); rShade = new QCheckBox(tr("Shade zones")); if (appsettings->value(this, GC_SHADEZONES, true).toBool() == true) rShade->setCheckState(Qt::Checked); else rShade->setCheckState(Qt::Unchecked); rMergeInterval = new QCheckBox; rMergeInterval->setText(tr("Merge intervals")); rMergeInterval->setCheckState(Qt::Unchecked); rMergeInterval->hide(); // lets not - its not that useful rFrameInterval = new QCheckBox; rFrameInterval->setText(tr("Frame intervals")); rFrameInterval->setCheckState(Qt::Checked); QVBoxLayout *checks = new QVBoxLayout; checks->addStretch(); checks->addWidget(rShade); checks->addWidget(rMergeInterval); checks->addWidget(rFrameInterval); checks->addStretch(); revealLayout->addStretch(); revealLayout->addLayout(checks); revealLayout->addStretch(); setRevealLayout(revealLayout); // the plot QVBoxLayout *vlayout = new QVBoxLayout; pfPvPlot = new PfPvPlot(context); vlayout->addWidget(pfPvPlot); HelpWhatsThis *help = new HelpWhatsThis(pfPvPlot); pfPvPlot->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::ChartRides_PFvV)); setChartLayout(vlayout); setAutoFillBackground(true); // allow zooming pfpvZoomer = new QwtPlotZoomer(pfPvPlot->canvas()); pfpvZoomer->setRubberBand(QwtPicker::RectRubberBand); pfpvZoomer->setRubberBandPen(GColor(CPLOTSELECT)); pfpvZoomer->setTrackerMode(QwtPicker::AlwaysOff); pfpvZoomer->setEnabled(true); pfpvZoomer->setMousePattern(QwtEventPattern::MouseSelect1, Qt::LeftButton); pfpvZoomer->setMousePattern(QwtEventPattern::MouseSelect2, Qt::RightButton, Qt::ControlModifier); pfpvZoomer->setMousePattern(QwtEventPattern::MouseSelect3, Qt::RightButton); // double click doubleClickPicker = new PfPvDoubleClickPicker(pfPvPlot); // the controls QFormLayout *f = new QFormLayout; cl->addLayout(f); QLabel *qaCPLabel = new QLabel(tr("Watts:"), this); qaCPValue = new QLineEdit(QString("%1").arg(pfPvPlot->getCP())); qaCPValue->setValidator(new QIntValidator(0, 9999, qaCPValue)); f->addRow(qaCPLabel, qaCPValue); QLabel *qaCadLabel = new QLabel(tr("RPM:"), this); qaCadValue = new QLineEdit(QString("%1").arg(pfPvPlot->getCAD())); qaCadValue->setValidator(new QIntValidator(0, 999, qaCadValue)); f->addRow(qaCadLabel, qaCadValue); QLabel *qaClLabel = new QLabel(tr("Crank Length (m):"), this); qaClValue = new QLineEdit(QString("%1").arg(1000 * pfPvPlot->getCL())); f->addRow(qaClLabel, qaClValue); shadeZonesPfPvCheckBox = new QCheckBox; shadeZonesPfPvCheckBox->setText(tr("Shade zones")); if (appsettings->value(this, GC_SHADEZONES, true).toBool() == true) shadeZonesPfPvCheckBox->setCheckState(Qt::Checked); else shadeZonesPfPvCheckBox->setCheckState(Qt::Unchecked); cl->addWidget(shadeZonesPfPvCheckBox); mergeIntervalPfPvCheckBox = new QCheckBox; mergeIntervalPfPvCheckBox->setText(tr("Merge intervals")); mergeIntervalPfPvCheckBox->setCheckState(Qt::Unchecked); cl->addWidget(mergeIntervalPfPvCheckBox); frameIntervalPfPvCheckBox = new QCheckBox; frameIntervalPfPvCheckBox->setText(tr("Frame intervals")); frameIntervalPfPvCheckBox->setCheckState(Qt::Checked); cl->addWidget(frameIntervalPfPvCheckBox); gearRatioDisplayPfPvCheckBox = new QCheckBox; gearRatioDisplayPfPvCheckBox->setText(tr("Gear Ratio Display")); gearRatioDisplayPfPvCheckBox->setCheckState(Qt::Checked); cl->addWidget(gearRatioDisplayPfPvCheckBox); cl->addStretch(); connect(pfPvPlot, SIGNAL(changedCP(const QString&)), qaCPValue, SLOT(setText(const QString&)) ); connect(pfPvPlot, SIGNAL(changedCAD(const QString&)), qaCadValue, SLOT(setText(const QString&)) ); connect(pfPvPlot, SIGNAL(changedCL(const QString&)), qaClValue, SLOT(setText(const QString&)) ); connect(qaCPValue, SIGNAL(editingFinished()), this, SLOT(setQaCPFromLineEdit())); connect(qaCadValue, SIGNAL(editingFinished()), this, SLOT(setQaCADFromLineEdit())); connect(qaClValue, SIGNAL(editingFinished()), this, SLOT(setQaCLFromLineEdit())); connect(shadeZonesPfPvCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setShadeZonesPfPvFromCheckBox())); connect(rShade, SIGNAL(stateChanged(int)), this, SLOT(setrShadeZonesPfPvFromCheckBox())); connect(mergeIntervalPfPvCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setMergeIntervalsPfPvFromCheckBox())); connect(rMergeInterval, SIGNAL(stateChanged(int)), this, SLOT(setrMergeIntervalsPfPvFromCheckBox())); connect(frameIntervalPfPvCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setFrameIntervalsPfPvFromCheckBox())); connect(rFrameInterval, SIGNAL(stateChanged(int)), this, SLOT(setrFrameIntervalsPfPvFromCheckBox())); connect(gearRatioDisplayPfPvCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setGearRatioDisplayPfPvFromCheckBox())); connect(doubleClickPicker, SIGNAL(doubleClicked(int, int)), this, SLOT(doubleClicked(int, int))); // GC signals connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(context, SIGNAL(rideChanged(RideItem*)), this, SLOT(forceReplot())); connect(context, SIGNAL(intervalSelected()), this, SLOT(intervalSelected())); connect(context, SIGNAL(intervalsChanged()), this, SLOT(intervalSelected())); connect(context, SIGNAL(intervalHover(IntervalItem*)), this, SLOT(intervalHover(IntervalItem*))); connect(context->athlete, SIGNAL(zonesChanged()), this, SLOT(zonesChanged())); connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); connect(context, SIGNAL(configChanged(qint32)), pfPvPlot, SLOT(configChanged(qint32))); // comparing things connect(context, SIGNAL(compareIntervalsStateChanged(bool)), this, SLOT(compareChanged())); connect(context, SIGNAL(compareIntervalsChanged()), this, SLOT(compareChanged())); configChanged(CONFIG_APPEARANCE); // share current setting with Plot setGearRatioDisplayPfPvFromCheckBox(); }
TodaysPlanWorkoutDownload::TodaysPlanWorkoutDownload(Context *context) : QDialog(context->mainWindow), context(context) { nam = new QNetworkAccessManager(this); connect(nam, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> & )), this, SLOT(onSslErrors(QNetworkReply*, const QList<QSslError> & ))); setAttribute(Qt::WA_DeleteOnClose); setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); setWindowTitle(tr("Download future workouts from Today's Plan")); // help HelpWhatsThis *help = new HelpWhatsThis(this); this->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::MenuBar_Tools_Download_TP)); // make the dialog a resonable size setMinimumWidth(650); setMinimumHeight(400); QVBoxLayout *layout = new QVBoxLayout; setLayout(layout); // TopLine Fields and Layout all = new QCheckBox(tr("check/uncheck all"), this); all->setChecked(true); QLabel *fromLabel = new QLabel(tr("From:"), this); QLabel *toLabel = new QLabel(tr("To:"), this); from = new QDateEdit(this); from->setDate(QDate::currentDate()); from->setCalendarPopup(true); to = new QDateEdit(this); to->setDate(QDate::currentDate().addMonths(1)); to->setCalendarPopup(true); refreshButton = new QPushButton(tr("Refresh List"), this); QHBoxLayout *topline = new QHBoxLayout; topline->addWidget(all); topline->addStretch(); topline->addWidget(fromLabel); topline->addWidget(from); topline->addWidget(toLabel); topline->addWidget(to); topline->addStretch(); topline->addWidget(refreshButton); // Filelist Widget files = new QTreeWidget; #ifdef Q_OS_MAC files->setAttribute(Qt::WA_MacShowFocusRect, 0); #endif files->headerItem()->setText(0, tr("")); files->headerItem()->setText(1, tr("Date")); files->headerItem()->setText(2, tr("Name")); files->headerItem()->setText(3, tr("T-Score")); files->headerItem()->setText(4, tr("Duration")); files->headerItem()->setText(5, tr("Action")); files->setColumnCount(6); files->setColumnWidth(0, 30*dpiXFactor); // selector files->setColumnWidth(1, 100*dpiXFactor); // date files->setColumnWidth(2, 220*dpiXFactor); // workout description files->setColumnWidth(3, 70*dpiXFactor); // T-Score files->setColumnWidth(4, 70*dpiXFactor); // duration files->setSelectionMode(QAbstractItemView::SingleSelection); files->setEditTriggers(QAbstractItemView::SelectedClicked); // allow edit files->setUniformRowHeights(true); files->setIndentation(0); // BottomLine Fields and Layout QHBoxLayout *bottomLine = new QHBoxLayout; status = new QLabel("", this); status->hide(); overwrite = new QCheckBox(tr("Overwrite existing workouts"), this); close = new QPushButton(tr("Close"), this); download = new QPushButton(tr("Download"), this); bottomLine->addWidget(overwrite); bottomLine->addWidget(status); bottomLine->addStretch(); bottomLine->addWidget(close); bottomLine->addWidget(download); layout->addLayout(topline); layout->addWidget(files); layout->addLayout(bottomLine); // connect signals and slots up.. connect(download, SIGNAL(clicked()), this, SLOT(downloadClicked())); connect(all, SIGNAL(stateChanged(int)), this, SLOT(allClicked())); connect(close, SIGNAL(clicked()), this, SLOT(cancelClicked())); connect(refreshButton, SIGNAL(clicked()), this, SLOT(refreshClicked())); // fill the data refreshClicked(); }
GcScopeBar::GcScopeBar(Context *context) : QWidget(context->mainWindow), context(context) { setFixedHeight(23); setContentsMargins(10,0,10,0); layout = new QHBoxLayout(this); layout->setSpacing(2); layout->setContentsMargins(0,0,0,0); searchLabel = new GcLabel(tr("Search/Filter:")); searchLabel->setYOff(1); searchLabel->setFixedHeight(20); searchLabel->setHighlighted(true); QFont font; layout->addWidget(searchLabel); searchLabel->hide(); connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); connect(context, SIGNAL(filterChanged()), this, SLOT(setHighlighted())); connect(context, SIGNAL(compareIntervalsStateChanged(bool)), this, SLOT(setCompare())); connect(context, SIGNAL(compareDateRangesStateChanged(bool)), this, SLOT(setCompare())); //We always use QT widgets now home = new GcScopeButton(this); #ifdef GC_HAVE_ICAL diary = new GcScopeButton(this); #endif anal = new GcScopeButton(this); train = new GcScopeButton(this); // now set the text for each one home->setText(tr("Trends")); layout->addWidget(home); connect(home, SIGNAL(clicked(bool)), this, SLOT(clickedHome())); HelpWhatsThis *helpHome = new HelpWhatsThis(home); home->setWhatsThis(helpHome->getWhatsThisText(HelpWhatsThis::ScopeBar_Trends)); #ifdef GC_HAVE_ICAL diary->setText(tr("Diary")); layout->addWidget(diary); connect(diary, SIGNAL(clicked(bool)), this, SLOT(clickedDiary())); HelpWhatsThis *helpDiary = new HelpWhatsThis(diary); diary->setWhatsThis(helpDiary->getWhatsThisText(HelpWhatsThis::ScopeBar_Diary)); #endif anal->setText(tr("Activities")); anal->setChecked(true); layout->addWidget(anal); connect(anal, SIGNAL(clicked(bool)), this, SLOT(clickedAnal())); HelpWhatsThis *helpAnal = new HelpWhatsThis(anal); anal->setWhatsThis(helpAnal->getWhatsThisText(HelpWhatsThis::ScopeBar_Rides)); train->setText(tr("Train")); layout->addWidget(train); connect(train, SIGNAL(clicked(bool)), this, SLOT(clickedTrain())); HelpWhatsThis *helpTrain = new HelpWhatsThis(train); train->setWhatsThis(helpTrain->getWhatsThisText(HelpWhatsThis::ScopeBar_Train)); configChanged(255); }
EstimateCPDialog::EstimateCPDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Critical Power Estimator")); HelpWhatsThis *help = new HelpWhatsThis(this); this->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::MenuBar_Tools_CP_EST)); setAttribute(Qt::WA_DeleteOnClose); setFixedSize(300, 300); QVBoxLayout *mainVBox = new QVBoxLayout(this); QHBoxLayout *hlayout = new QHBoxLayout; QLabel *sportLabel = new QLabel(tr("Sport")); sportCombo = new QComboBox(); sportCombo->addItem(tr("Bike")); sportCombo->addItem(tr("Run")); sportCombo->addItem(tr("Swim")); sportCombo->setCurrentIndex(0); hlayout->addStretch(); hlayout->addWidget(sportLabel); hlayout->addWidget(sportCombo); hlayout->addStretch(); mainVBox->addLayout(hlayout); mainVBox->addWidget(new QLabel(tr("Your best short effort (3-5 min):"))); mainVBox->addLayout(setupMinsSecs(shortMinsSpinBox, shortSecsSpinBox, shortWattsSpinBox, 5.0, 3.0)); mainVBox->addWidget(new QLabel(tr("Your best long effort (15-60 min):"))); mainVBox->addLayout(setupMinsSecs(longMinsSpinBox, longSecsSpinBox, longWattsSpinBox, 60.0, 20.0)); mainVBox->addStretch(); QHBoxLayout *cpHBox = new QHBoxLayout; cpHBox->addStretch(); labelCP = new QLabel(tr("Your critical power:")); cpHBox->addWidget(labelCP); txtCP = new QLineEdit(this); txtCP->setAlignment(Qt::AlignRight); txtCP->setReadOnly(true); cpHBox->addWidget(txtCP, Qt::AlignLeft); cpHBox->addStretch(); mainVBox->addLayout(cpHBox); QHBoxLayout *wpHBox = new QHBoxLayout; wpHBox->addStretch(); labelWP = new QLabel(tr("Your W':")); wpHBox->addWidget(labelWP); txtWP = new QLineEdit(this); txtWP->setAlignment(Qt::AlignRight); txtWP->setReadOnly(true); wpHBox->addWidget(txtWP, Qt::AlignLeft); wpHBox->addStretch(); mainVBox->addLayout(wpHBox); mainVBox->addStretch(); QHBoxLayout *buttonHBox = new QHBoxLayout; btnCalculate = new QPushButton(this); btnCalculate->setText(tr("Estimate")); buttonHBox->addStretch(); buttonHBox->addWidget(btnCalculate); btnOK = new QPushButton(this); btnOK->setText(tr("Done")); buttonHBox->addWidget(btnOK); mainVBox->addLayout(buttonHBox); connect(sportCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeSport())); connect(btnOK, SIGNAL(clicked()), this, SLOT(on_btnOK_clicked())); connect(btnCalculate, SIGNAL(clicked()), this, SLOT(on_btnCalculate_clicked())); }
LapsEditor::LapsEditor(bool isSwim) : isSwim(isSwim) { setWindowTitle(tr("Laps Editor")); HelpWhatsThis *help = new HelpWhatsThis(this); this->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::MenuBar_Activity_Manual_LapsEditor)); #ifdef Q_OS_MAC setFixedSize(625,415); #else setFixedSize(630,420); #endif // // Create the GUI widgets // // Laps table const int nCols = 7; const int nRows = 100; tableWidget = new QTableWidget(nRows, nCols, this); QStringList hLabels; tableWidget->setColumnWidth(0, 48); for (int j = 1; j < nCols; j++) tableWidget->setColumnWidth(j, 88); hLabels<<tr("reps")<<tr("work dist")<< tr("work min")<<tr("work sec")<<tr("rest dist")<<tr("rest min")<<tr("rest sec"); tableWidget->setHorizontalHeaderLabels(hLabels); tableWidget->verticalHeader()->setVisible(false); for (int i = 0; i < nRows; i++) { QTableWidgetItemUInt *item = new QTableWidgetItemUInt(); item->setTextAlignment(Qt::AlignRight); item->setData(Qt::EditRole, 1); tableWidget->setItem(i, 0, item); for (int j = 1; j < nCols; j++) { QTableWidgetItem *item; if (!isSwim && (j == 1 || j == 4)) item = new QTableWidgetItemUDouble(); else item = new QTableWidgetItemUInt(); item->setTextAlignment(Qt::AlignRight); item->setData(Qt::EditRole, 0); tableWidget->setItem(i, j, item); } } // buttons okButton = new QPushButton(tr("&OK"), this); cancelButton = new QPushButton(tr("&Cancel"), this); // save by default -- we don't overwrite and // the user will expect enter to save laps okButton->setDefault(true); cancelButton->setDefault(false); // // LAY OUT THE GUI // QVBoxLayout *mainLayout = new QVBoxLayout(this); QHBoxLayout *table = new QHBoxLayout; mainLayout->addLayout(table); table->addWidget(tableWidget); QHBoxLayout *buttons = new QHBoxLayout; mainLayout->addLayout(buttons); buttons->addStretch(); buttons->addWidget(okButton); buttons->addWidget(cancelButton); // dialog buttons connect(okButton, SIGNAL(clicked()), this, SLOT(okClicked())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked())); }
HrPwWindow::HrPwWindow(Context *context) : GcChartWindow(context), context(context), current(NULL) { setControls(NULL); // // reveal controls widget // // reveal controls rDelay = new QLabel(tr("HR Delay")); rDelayEdit = new QLineEdit(); rDelayEdit->setFixedWidth(30); rDelaySlider = new QSlider(Qt::Horizontal); rDelaySlider->setTickPosition(QSlider::TicksBelow); rDelaySlider->setTickInterval(10); rDelaySlider->setMinimum(1); rDelaySlider->setMaximum(100); rDelayEdit->setValidator(new QIntValidator(rDelaySlider->minimum(), rDelaySlider->maximum(), rDelayEdit)); rSmooth = new QLabel(tr("Smooth")); rSmoothEdit = new QLineEdit(); rSmoothEdit->setFixedWidth(30); rSmoothSlider = new QSlider(Qt::Horizontal); rSmoothSlider->setTickPosition(QSlider::TicksBelow); rSmoothSlider->setTickInterval(50); rSmoothSlider->setMinimum(1); rSmoothSlider->setMaximum(500); rSmoothEdit->setValidator(new QIntValidator(rSmoothSlider->minimum(), rSmoothSlider->maximum(), rSmoothEdit)); // layout reveal controls QHBoxLayout *r = new QHBoxLayout; r->setSpacing(4 *dpiXFactor); r->setContentsMargins(0,0,0,0); r->addStretch(); r->addWidget(rDelay); r->addWidget(rDelayEdit); r->addWidget(rDelaySlider); r->addSpacing(5); r->addWidget(rSmooth); r->addWidget(rSmoothEdit); r->addWidget(rSmoothSlider); r->addStretch(); setRevealLayout(r); // // Chart layout // QVBoxLayout *vlayout = new QVBoxLayout; // main plot hrPwPlot = new HrPwPlot(context, this); HelpWhatsThis *help = new HelpWhatsThis(hrPwPlot); hrPwPlot->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::ChartRides_HRvsPw)); // tooltip on hover over point hrPwPlot->tooltip = new LTMToolTip(QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::VLineRubberBand, QwtPicker::AlwaysOn, hrPwPlot->canvas(), ""); hrPwPlot->tooltip->setRubberBand(QwtPicker::VLineRubberBand); hrPwPlot->tooltip->setMousePattern(QwtEventPattern::MouseSelect1, Qt::LeftButton, Qt::ShiftModifier); hrPwPlot->tooltip->setTrackerPen(QColor(Qt::black)); hrPwPlot->_canvasPicker = new LTMCanvasPicker(hrPwPlot); // setup the plot QColor inv(Qt::white); inv.setAlpha(0); hrPwPlot->tooltip->setRubberBandPen(inv); hrPwPlot->tooltip->setEnabled(true); vlayout->addWidget(hrPwPlot); vlayout->setStretch(0, 100); // just the hr and power as a plot smallPlot = new SmallPlot(this); smallPlot->setMaximumHeight(200); smallPlot->setMinimumHeight(100); vlayout->addWidget(smallPlot); vlayout->setStretch(1, 20); setChartLayout(vlayout); // // the controls // QWidget *c = new QWidget(this); HelpWhatsThis *helpConfig = new HelpWhatsThis(c); c->setWhatsThis(helpConfig->getWhatsThisText(HelpWhatsThis::ChartRides_HRvsPw)); setControls(c); QFormLayout *cl = new QFormLayout(c); QLabel *delayLabel = new QLabel(tr("HR delay"), this); delayEdit = new QLineEdit(this); delayEdit->setFixedWidth(30); cl->addRow(delayLabel, delayEdit); delaySlider = new QSlider(Qt::Horizontal); delaySlider->setTickPosition(QSlider::TicksBelow); delaySlider->setTickInterval(1); delaySlider->setMinimum(1); delaySlider->setMaximum(100); delayEdit->setValidator(new QIntValidator(delaySlider->minimum(), delaySlider->maximum(), delayEdit)); cl->addRow(delaySlider); smooth = 240; QLabel *smoothLabel = new QLabel(tr("Smooth"), this); smoothEdit = new QLineEdit(this); smoothEdit->setFixedWidth(30); smoothEdit->setText(QString("%1").arg(smooth)); cl->addRow(smoothLabel, smoothEdit); smoothSlider = new QSlider(Qt::Horizontal); smoothSlider->setTickPosition(QSlider::TicksBelow); smoothSlider->setTickInterval(10); smoothSlider->setMinimum(0); smoothSlider->setMaximum(500); smoothSlider->setValue(smooth); smoothEdit->setValidator(new QIntValidator(smoothSlider->minimum(), smoothSlider->maximum(), smoothEdit)); cl->addRow(smoothSlider); joinlineCheckBox = new QCheckBox(this);; joinlineCheckBox->setText(tr("Join points")); joinlineCheckBox->setCheckState(Qt::Unchecked); setJoinLineFromCheckBox(); cl->addRow(joinlineCheckBox); shadeZones = new QCheckBox(this);; shadeZones->setText(tr("Shade Zones")); shadeZones->setCheckState(Qt::Checked); setShadeZones(); cl->addRow(shadeZones); fullplot = new QCheckBox(this);; fullplot->setText(tr("Show Full Plot")); fullplot->setCheckState(Qt::Checked); showHidePlot(); cl->addRow(fullplot); // connect them all up now initialised connect(hrPwPlot->_canvasPicker, SIGNAL(pointHover(QwtPlotCurve*, int)), hrPwPlot, SLOT(pointHover(QwtPlotCurve*, int))); connect(joinlineCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setJoinLineFromCheckBox())); connect(shadeZones, SIGNAL(stateChanged(int)), this, SLOT(setShadeZones())); connect(fullplot, SIGNAL(stateChanged(int)), this, SLOT(showHidePlot())); connect(smoothEdit, SIGNAL(editingFinished()), this, SLOT(setSmoothingFromLineEdit())); connect(smoothSlider, SIGNAL(valueChanged(int)), this, SLOT(setSmoothingFromSlider())); connect(delayEdit, SIGNAL(editingFinished()), this, SLOT(setDelayFromLineEdit())); connect(delaySlider, SIGNAL(valueChanged(int)), this, SLOT(setDelayFromSlider())); connect(rSmoothEdit, SIGNAL(editingFinished()), this, SLOT(setrSmoothingFromLineEdit())); connect(rSmoothSlider, SIGNAL(valueChanged(int)), this, SLOT(setrSmoothingFromSlider())); connect(rDelayEdit, SIGNAL(editingFinished()), this, SLOT(setrDelayFromLineEdit())); connect(rDelaySlider, SIGNAL(valueChanged(int)), this, SLOT(setrDelayFromSlider())); connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(context, SIGNAL(rideChanged(RideItem*)), this, SLOT(rideSelected())); connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); // set colors etc on first run configChanged(CONFIG_APPEARANCE); }
BestIntervalDialog::BestIntervalDialog(Context *context) : context(context) { setAttribute(Qt::WA_DeleteOnClose); setWindowTitle("Find Intervals"); HelpWhatsThis *help = new HelpWhatsThis(this); this->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::FindIntervals)); QVBoxLayout *mainLayout = new QVBoxLayout(this); QHBoxLayout *intervalLengthLayout = new QHBoxLayout; QLabel *intervalLengthLabel = new QLabel(tr("Interval length: "), this); intervalLengthLayout->addWidget(intervalLengthLabel); hrsSpinBox = new QDoubleSpinBox(this); hrsSpinBox->setDecimals(0); hrsSpinBox->setMinimum(0.0); hrsSpinBox->setSuffix(" hrs"); hrsSpinBox->setSingleStep(1.0); hrsSpinBox->setAlignment(Qt::AlignRight); intervalLengthLayout->addWidget(hrsSpinBox); minsSpinBox = new QDoubleSpinBox(this); minsSpinBox->setDecimals(0); minsSpinBox->setRange(0.0, 59.0); minsSpinBox->setSuffix(" mins"); minsSpinBox->setSingleStep(1.0); minsSpinBox->setWrapping(true); minsSpinBox->setAlignment(Qt::AlignRight); minsSpinBox->setValue(1.0); intervalLengthLayout->addWidget(minsSpinBox); secsSpinBox = new QDoubleSpinBox(this); secsSpinBox->setDecimals(0); secsSpinBox->setRange(0.0, 59.0); secsSpinBox->setSuffix(" secs"); secsSpinBox->setSingleStep(1.0); secsSpinBox->setWrapping(true); secsSpinBox->setAlignment(Qt::AlignRight); intervalLengthLayout->addWidget(secsSpinBox); mainLayout->addLayout(intervalLengthLayout); QHBoxLayout *intervalCountLayout = new QHBoxLayout; QLabel *intervalCountLabel = new QLabel(tr("How many to find: "), this); intervalCountLayout->addWidget(intervalCountLabel); countSpinBox = new QDoubleSpinBox(this); countSpinBox->setDecimals(0); countSpinBox->setMinimum(1.0); countSpinBox->setValue(5.0); // lets default to the top 5 powers countSpinBox->setSingleStep(1.0); countSpinBox->setAlignment(Qt::AlignRight); intervalCountLayout->addWidget(countSpinBox); mainLayout->addLayout(intervalCountLayout); QLabel *resultsLabel = new QLabel(tr("Results:"), this); mainLayout->addWidget(resultsLabel); // user can select from the results to add // to the ride intervals resultsTable = new QTableWidget; mainLayout->addWidget(resultsTable); resultsTable->setColumnCount(5); resultsTable->setColumnHidden(3, true); // has start time in secs resultsTable->setColumnHidden(4, true); // has stop time in secs resultsTable->horizontalHeader()->hide(); // resultsTable->verticalHeader()->hide(); resultsTable->setShowGrid(false); QHBoxLayout *buttonLayout = new QHBoxLayout; findButton = new QPushButton(tr("&Find Intervals"), this); buttonLayout->addWidget(findButton); doneButton = new QPushButton(tr("&Done"), this); buttonLayout->addWidget(doneButton); addButton = new QPushButton(tr("&Add to Intervals")); buttonLayout->addWidget(addButton); mainLayout->addLayout(buttonLayout); connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked())); connect(doneButton, SIGNAL(clicked()), this, SLOT(doneClicked())); connect(addButton, SIGNAL(clicked()), this, SLOT(addClicked())); }
GcScopeBar::GcScopeBar(Context *context) : QWidget(context->mainWindow), context(context) { setFixedHeight(23); setContentsMargins(10,0,10,0); layout = new QHBoxLayout(this); layout->setSpacing(2); layout->setContentsMargins(0,0,0,0); searchLabel = new GcLabel(tr("Search/Filter:")); searchLabel->setYOff(1); searchLabel->setFixedHeight(20); searchLabel->setHighlighted(true); QFont font; font.setPointSize(10); font.setWeight(QFont::Black); searchLabel->setFont(font); layout->addWidget(searchLabel); searchLabel->hide(); connect(context, SIGNAL(filterChanged()), this, SLOT(setHighlighted())); connect(context, SIGNAL(compareIntervalsStateChanged(bool)), this, SLOT(setCompare())); connect(context, SIGNAL(compareDateRangesStateChanged(bool)), this, SLOT(setCompare())); // Mac uses QtMacButton - recessed etc #ifdef Q_OS_MAC home = new QtMacButton(this, QtMacButton::Recessed); #ifdef GC_HAVE_ICAL diary = new QtMacButton(this, QtMacButton::Recessed); #endif anal = new QtMacButton(this, QtMacButton::Recessed); train = new QtMacButton(this, QtMacButton::Recessed); #else // Windows / Linux uses GcScopeButton - pushbutton home = new GcScopeButton(this); #ifdef GC_HAVE_ICAL diary = new GcScopeButton(this); #endif anal = new GcScopeButton(this); train = new GcScopeButton(this); #endif // now set the text for each one home->setText(tr("Trends")); layout->addWidget(home); connect(home, SIGNAL(clicked(bool)), this, SLOT(clickedHome())); HelpWhatsThis *helpHome = new HelpWhatsThis(home); home->setWhatsThis(helpHome->getWhatsThisText(HelpWhatsThis::ScopeBar_Trends)); #ifdef GC_HAVE_ICAL diary->setText(tr("Diary")); layout->addWidget(diary); connect(diary, SIGNAL(clicked(bool)), this, SLOT(clickedDiary())); HelpWhatsThis *helpDiary = new HelpWhatsThis(diary); diary->setWhatsThis(helpDiary->getWhatsThisText(HelpWhatsThis::ScopeBar_Diary)); #endif anal->setText(tr("Activities")); anal->setWidth(70); anal->setChecked(true); layout->addWidget(anal); connect(anal, SIGNAL(clicked(bool)), this, SLOT(clickedAnal())); HelpWhatsThis *helpAnal = new HelpWhatsThis(anal); anal->setWhatsThis(helpAnal->getWhatsThisText(HelpWhatsThis::ScopeBar_Rides)); train->setText(tr("Train")); layout->addWidget(train); connect(train, SIGNAL(clicked(bool)), this, SLOT(clickedTrain())); HelpWhatsThis *helpTrain = new HelpWhatsThis(train); train->setWhatsThis(helpTrain->getWhatsThisText(HelpWhatsThis::ScopeBar_Train)); //layout->addWidget(traintool); //XXX!!! eek // we now need to adjust the buttons according to their text size // this is particularly bad for German's who, as a nation, must // suffer from RSI from typing and writing more than any other nation ;) QFontMetrics fontMetric(font); int width = fontMetric.width(tr("Trends")); home->setWidth(width+30); width = fontMetric.width(tr("Activities")); anal->setWidth(width+30); width = fontMetric.width(tr("Train")); train->setWidth(width+30); #ifdef GC_HAVE_ICAL width = fontMetric.width(tr("Diary")); diary->setWidth(width+30); #endif }