RealtimePlot::RealtimePlot() : pwrCurve(NULL), showPowerState(Qt::Checked), showPow30sState(Qt::Checked), showHrState(Qt::Checked), showSpeedState(Qt::Checked), showCadState(Qt::Checked), showAltState(Qt::Checked), smooth(0) { setInstanceName("Realtime Plot"); //insertLegend(new QwtLegend(), QwtPlot::BottomLegend); pwr30Data = new Realtime30PwrData; pwrData = new RealtimePwrData; altPwrData = new RealtimePwrData; spdData = new RealtimeSpdData; hrData = new RealtimeHrData; cadData = new RealtimeCadData; // Setup the axis (of evil :-) setAxisTitle(yLeft, "Watts"); setAxisTitle(yRight, "Cadence / HR"); setAxisTitle(yRight2, "Speed"); setAxisTitle(xBottom, "Seconds Ago"); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); setAxisMaxMinor(yLeft2, 0); setAxisMaxMinor(yRight, 0); setAxisMaxMinor(yRight2, 0); QPalette pal; setAxisScale(yLeft, 0, 500); // watts pal.setColor(QPalette::WindowText, GColor(CPOWER)); pal.setColor(QPalette::Text, GColor(CPOWER)); axisWidget(QwtPlot::yLeft)->setPalette(pal); axisWidget(QwtPlot::yLeft)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScale(yRight, 0, 230); // cadence / hr pal.setColor(QPalette::WindowText, GColor(CHEARTRATE)); pal.setColor(QPalette::Text, GColor(CHEARTRATE)); axisWidget(QwtPlot::yRight)->setPalette(pal); axisWidget(QwtPlot::yRight)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScale(xBottom, MAXSAMPLES, 0, 15); // time ago pal.setColor(QPalette::WindowText, GColor(CPLOTMARKER)); pal.setColor(QPalette::Text, GColor(CPLOTMARKER)); axisWidget(QwtPlot::xBottom)->setPalette(pal); axisWidget(QwtPlot::xBottom)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScale(yRight2, 0, 60); // speed km/h - 60kmh on a turbo is good going! pal.setColor(QPalette::WindowText, GColor(CSPEED)); pal.setColor(QPalette::Text, GColor(CSPEED)); axisWidget(QwtPlot::yRight2)->setPalette(pal); axisWidget(QwtPlot::yRight2)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisLabelRotation(yRight2,90); setAxisLabelAlignment(yRight2,Qt::AlignVCenter); enableAxis(xBottom, false); // very little value and some cpu overhead enableAxis(yLeft, true); enableAxis(yRight, true); enableAxis(yRight2, true); // 30s Power curve pwr30Curve = new QwtPlotCurve("30s Power"); pwr30Curve->setRenderHint(QwtPlotItem::RenderAntialiased); // too cpu intensive pwr30Curve->attach(this); pwr30Curve->setYAxis(QwtPlot::yLeft); // Power curve pwrCurve = new QwtPlotCurve("Power"); //pwrCurve->setRenderHint(QwtPlotItem::RenderAntialiased); pwrCurve->setData(pwrData); pwrCurve->attach(this); pwrCurve->setYAxis(QwtPlot::yLeft); altPwrCurve = new QwtPlotCurve("Alt Power"); //pwrCurve->setRenderHint(QwtPlotItem::RenderAntialiased); altPwrCurve->setData(altPwrData); altPwrCurve->attach(this); altPwrCurve->setYAxis(QwtPlot::yLeft); // HR hrCurve = new QwtPlotCurve("HeartRate"); //hrCurve->setRenderHint(QwtPlotItem::RenderAntialiased); hrCurve->setData(hrData); hrCurve->attach(this); hrCurve->setYAxis(QwtPlot::yRight); // Cadence cadCurve = new QwtPlotCurve("Cadence"); //cadCurve->setRenderHint(QwtPlotItem::RenderAntialiased); cadCurve->setData(cadData); cadCurve->attach(this); cadCurve->setYAxis(QwtPlot::yRight); // Speed spdCurve = new QwtPlotCurve("Speed"); //spdCurve->setRenderHint(QwtPlotItem::RenderAntialiased); spdCurve->setData(spdData); spdCurve->attach(this); spdCurve->setYAxis(QwtPlot::yRight2); // Load // lodCurve = new QwtPlotCurve("Load"); // //lodCurve->setRenderHint(QwtPlotItem::RenderAntialiased); // QPen lodpen = QPen(QColor(128,128,128)); // lodpen.setWidth(2.0); // lodCurve->setPen(lodpen); // QColor brush_color = QColor(124, 91, 31); // brush_color.setAlpha(64); // lodCurve->setBrush(brush_color); // fill below the line // lodCurve->setData(lodData); // lodCurve->attach(this); // lodCurve->setYAxis(QwtPlot::yLeft); canvas()->setFrameStyle(QFrame::NoFrame); configChanged(); // set colors }
HomeWindow::HomeWindow(Context *context, QString name, QString /* windowtitle */) : GcWindow(context), context(context), name(name), active(false), clicked(NULL), dropPending(false), chartCursor(-2), loaded(false) { // setup control area QWidget *cw = new QWidget(this); cw->setContentsMargins(0,0,0,0); QVBoxLayout *cl = new QVBoxLayout(cw); cl->setSpacing(0); cl->setContentsMargins(0,0,0,0); QLabel *titleLabel = new QLabel(tr("Title"), this); QHBoxLayout *hl = new QHBoxLayout; hl->setSpacing(5); hl->setContentsMargins(0,0,0,0); titleEdit = new QLineEdit(this); titleEdit->setEnabled(false); controlStack = new QStackedWidget(this); controlStack->setContentsMargins(0,0,0,0); hl->addWidget(titleLabel); hl->addWidget(titleEdit); cl->addLayout(hl); cl->addSpacing(15); cl->addWidget(controlStack); setControls(cw); setProperty("isManager", true); setAcceptDrops(true); QVBoxLayout *layout = new QVBoxLayout(this); QFont bigandbold; bigandbold.setPointSize(bigandbold.pointSize() + 2); bigandbold.setWeight(QFont::Bold); style = new QStackedWidget(this); style->setAutoFillBackground(false); layout->setSpacing(0); layout->setContentsMargins(0,0,0,0); layout->addWidget(style); QPalette palette; palette.setBrush(backgroundRole(), QColor("#B3B4B6")); setAutoFillBackground(false); // each style has its own container widget QWidget *tabArea = new QWidget(this); tabArea->setContentsMargins(0,0,0,0); // no spacing now, used to be 20px QVBoxLayout *tabLayout = new QVBoxLayout(tabArea); tabLayout->setContentsMargins(0,0,0,0); tabLayout->setSpacing(0); tabbed = new QStackedWidget(this); chartbar = new ChartBar(context); tabLayout->addWidget(chartbar); tabLayout->addWidget(tabbed); style->addWidget(tabArea); // tiled tileWidget = new QWidget(this); tileWidget->setAutoFillBackground(false); tileWidget->setPalette(palette); tileWidget->setContentsMargins(0,0,0,0); tileGrid = new QGridLayout(tileWidget); tileGrid->setSpacing(0); tileArea = new QScrollArea(this); #ifdef Q_OS_WIN QStyle *cde = QStyleFactory::create(OS_STYLE); tileArea->setStyle(cde); #endif tileArea->setAutoFillBackground(false); tileArea->setPalette(palette); tileArea->setWidgetResizable(true); tileArea->setWidget(tileWidget); tileArea->setFrameStyle(QFrame::NoFrame); tileArea->setContentsMargins(0,0,0,0); style->addWidget(tileArea); winWidget = new QWidget(this); winWidget->setAutoFillBackground(false); winWidget->setContentsMargins(0,0,0,0); winWidget->setPalette(palette); winFlow = new GcWindowLayout(winWidget, 0, tileSpacing, tileSpacing); winFlow->setContentsMargins(tileMargin,tileMargin,tileMargin,tileMargin); winArea = new QScrollArea(this); winArea->setAutoFillBackground(false); winArea->setPalette(palette); winArea->setWidgetResizable(true); winArea->setWidget(winWidget); winArea->setFrameStyle(QFrame::NoFrame); winArea->setContentsMargins(0,0,0,0); style->addWidget(winArea); winWidget->installEventFilter(this); // to draw cursor winWidget->setMouseTracking(true); // to draw cursor // enable right click to add a chart winArea->setContextMenuPolicy(Qt::CustomContextMenu); tabArea->setContextMenuPolicy(Qt::CustomContextMenu); connect(winArea,SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(rightClick(const QPoint &))); connect(tabArea,SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(rightClick(const QPoint &))); currentStyle=-1; styleChanged(2); connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(this, SIGNAL(dateRangeChanged(DateRange)), this, SLOT(dateRangeChanged(DateRange))); connect(context, SIGNAL(configChanged()), this, SLOT(configChanged())); //connect(tabbed, SIGNAL(currentChanged(int)), this, SLOT(tabSelected(int))); //connect(tabbed, SIGNAL(tabCloseRequested(int)), this, SLOT(removeChart(int))); //connect(tb, SIGNAL(tabMoved(int,int)), this, SLOT(tabMoved(int,int))); connect(chartbar, SIGNAL(currentIndexChanged(int)), this, SLOT(tabSelected(int))); connect(titleEdit, SIGNAL(textChanged(const QString&)), SLOT(titleChanged())); installEventFilter(this); qApp->installEventFilter(this); }
void KdeConnectPluginConfig::slotConfigChanged() { Q_EMIT configChanged(); }
PfPvPlot::PfPvPlot(Context *context) : rideItem (NULL), context(context), hover(NULL), cp_ (0), cad_ (85), cl_ (0.175), shade_zones(true) { static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); setAutoFillBackground(true); setAxisTitle(yLeft, tr("Average Effective Pedal Force (N)")); setAxisScale(yLeft, 0, 600); setAxisTitle(xBottom, tr("Circumferential Pedal Velocity (m/s)")); setAxisScale(xBottom, 0, 3); setAxisMaxMinor(yLeft, 0); setAxisMaxMinor(xBottom, 0); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(xBottom, sd); sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); sd->enableComponent(QwtScaleDraw::Ticks, false); sd->enableComponent(QwtScaleDraw::Backbone, false); setAxisScaleDraw(yLeft, sd); mX = new QwtPlotMarker(); mX->setLineStyle(QwtPlotMarker::VLine); mX->attach(this); mY = new QwtPlotMarker(); mY->setLineStyle(QwtPlotMarker::HLine); mY->attach(this); cpCurve = new QwtPlotCurve(); cpCurve->setRenderHint(QwtPlotItem::RenderAntialiased); cpCurve->attach(this); curve = new QwtPlotCurve(); curve->attach(this); cl_ = appsettings->value(this, GC_CRANKLENGTH).toDouble() / 1000.0; // markup timeInQuadrant tiqMarker[0] = new QwtPlotMarker(); tiqMarker[0]->attach(this); tiqMarker[0]->setXValue(2.9); tiqMarker[0]->setYValue(580); tiqMarker[1] = new QwtPlotMarker(); tiqMarker[1]->attach(this); tiqMarker[1]->setXValue(0.1); tiqMarker[1]->setYValue(580); tiqMarker[2] = new QwtPlotMarker(); tiqMarker[2]->attach(this); tiqMarker[2]->setXValue(0.1); tiqMarker[2]->setYValue(10); tiqMarker[3] = new QwtPlotMarker(); tiqMarker[3]->attach(this); tiqMarker[3]->setXValue(2.9); tiqMarker[3]->setYValue(10); merge_intervals = false; frame_intervals = true; gear_ratio_display = false; // only default on first time through, after this the user may have adjusted if (appsettings->value(this, GC_SHADEZONES, true).toBool()==false) shade_zones = false; else shade_zones = true; configChanged(); recalc(); }
ConfigPage* FriendMapController::qt_config_page() const { auto configPage = new FriendMapConfigPage(settings); connect(configPage, SIGNAL(configChanged()), this, SLOT(configChanged())); return configPage; }
PowerHist::PowerHist(Context *context): minX(0), maxX(0), rideItem(NULL), context(context), series(RideFile::watts), lny(false), shade(false), zoned(false), binw(3), withz(true), dt(1), absolutetime(true), cache(NULL), source(Ride) { binw = appsettings->value(this, GC_HIST_BIN_WIDTH, 5).toInt(); if (appsettings->value(this, GC_SHADEZONES, true).toBool() == true) shade = true; else shade = false; // create a background object for shading bg = new PowerHistBackground(this); bg->attach(this); hrbg = new HrHistBackground(this); hrbg->attach(this); setCanvasBackground(Qt::white); canvas()->setFrameStyle(QFrame::NoFrame); setParameterAxisTitle(); setAxisTitle(yLeft, absolutetime ? tr("Time (minutes)") : tr("Time (percent)")); curve = new QwtPlotCurve(""); curve->setStyle(QwtPlotCurve::Steps); curve->setRenderHint(QwtPlotItem::RenderAntialiased); curve->attach(this); curveSelected = new QwtPlotCurve(""); curveSelected->setStyle(QwtPlotCurve::Steps); curveSelected->setRenderHint(QwtPlotItem::RenderAntialiased); curveSelected->attach(this); grid = new QwtPlotGrid(); grid->enableX(false); grid->attach(this); zoneLabels = QList<PowerHistZoneLabel *>(); hrzoneLabels = QList<HrHistZoneLabel *>(); zoomer = new penTooltip(this->canvas()); canvasPicker = new LTMCanvasPicker(this); connect(canvasPicker, SIGNAL(pointHover(QwtPlotCurve*, int)), this, SLOT(pointHover(QwtPlotCurve*, int))); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); configChanged(); }
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(); }
/*! \brief Load new configuration. * \param cfgfile * \returns True if config is OK, False if not (e.g. no input device specified). * * If cfgfile is an absolute path it will be used as is, otherwise it is assumed to be the * name of a file under m_cfg_dir. * * If cfgfile does not exist it will be created. * * If no input device is specified, we return false to signal that the I/O configuration * dialog should be run. * * FIXME: Refactor. */ bool MainWindow::loadConfig(const QString cfgfile, bool check_crash) { bool conf_ok = false; bool skipLoadingSettings = false; qDebug() << "Loading configuration from:" << cfgfile; if (m_settings) delete m_settings; if (QDir::isAbsolutePath(cfgfile)) m_settings = new QSettings(cfgfile, QSettings::IniFormat); else m_settings = new QSettings(QString("%1/%2").arg(m_cfg_dir).arg(cfgfile), QSettings::IniFormat); qDebug() << "Configuration file:" << m_settings->fileName(); if (check_crash) { if (m_settings->value("crashed", false).toBool()) { qDebug() << "Crash guard triggered!" << endl; QMessageBox* askUserAboutConfig = new QMessageBox(QMessageBox::Warning, tr("Crash Detected!"), tr("<p>Gqrx has detected problems with the current configuration. " "Loading the configuration again could cause the application to crash.</p>" "<p>Do you want to edit the settings?</p>"), QMessageBox::Yes | QMessageBox::No); askUserAboutConfig->setDefaultButton(QMessageBox::Yes); askUserAboutConfig->setTextFormat(Qt::RichText); askUserAboutConfig->exec(); if (askUserAboutConfig->result() == QMessageBox::Yes) skipLoadingSettings = true; delete askUserAboutConfig; } else { m_settings->setValue("crashed", true); // clean exit will set this to FALSE saveConfig(cfgfile); } } if (skipLoadingSettings) return false; emit configChanged(m_settings); // manual reconf (FIXME: check status) bool conv_ok = false; QString indev = m_settings->value("input/device", "").toString(); if (!indev.isEmpty()) { conf_ok = true; rx->set_input_device(indev.toStdString()); // Update window title QRegExp regexp("'([a-zA-Z0-9 \\-\\_\\/\\.\\,\\(\\)]+)'"); QString devlabel; if (regexp.indexIn(indev, 0) != -1) devlabel = regexp.cap(1); else devlabel = indev; //"Unknown"; setWindowTitle(QString("Gqrx %1 - %2").arg(VERSION).arg(devlabel)); // Add available antenna connectors to the UI std::vector<std::string> antennas = rx->get_antennas(); uiDockInputCtl->setAntennas(antennas); } QString outdev = m_settings->value("output/device", "").toString(); rx->set_output_device(outdev.toStdString()); int sr = m_settings->value("input/sample_rate", 0).toInt(&conv_ok); if (conv_ok && (sr > 0)) { double actual_rate = rx->set_input_rate(sr); qDebug() << "Requested sample rate:" << sr; qDebug() << "Actual sample rate :" << QString("%1").arg(actual_rate, 0, 'f', 6); uiDockRxOpt->setFilterOffsetRange((qint64)(0.9*actual_rate)); ui->plotter->setSampleRate(actual_rate); ui->plotter->setSpanFreq((quint32)actual_rate); } uiDockInputCtl->readSettings(m_settings); uiDockRxOpt->readSettings(m_settings); uiDockFft->readSettings(m_settings); uiDockAudio->readSettings(m_settings); ui->freqCtrl->setFrequency(m_settings->value("input/frequency", 144500000).toLongLong(&conv_ok)); setNewFrequency(ui->freqCtrl->getFrequency()); // ensure all GUI and RF is updated return conf_ok; }
ArrangerView::ArrangerView(QWidget* parent) : TopWin(TopWin::ARRANGER, parent, "arrangerview", Qt::Window) { setWindowTitle(tr("MusE: Arranger")); setFocusPolicy(Qt::NoFocus); arranger = new Arranger(this, "arranger"); setCentralWidget(arranger); //setFocusProxy(arranger); scoreOneStaffPerTrackMapper = new QSignalMapper(this); scoreAllInOneMapper = new QSignalMapper(this); editSignalMapper = new QSignalMapper(this); QShortcut* sc = new QShortcut(shortcuts[SHRT_DELETE].key, this); sc->setContext(Qt::WindowShortcut); connect(sc, SIGNAL(activated()), editSignalMapper, SLOT(map())); editSignalMapper->setMapping(sc, CMD_DELETE); // Toolbars --------------------------------------------------------- editTools = new EditToolBar(this, arrangerTools); addToolBar(editTools); editTools->setObjectName("arrangerTools"); visTracks = new VisibleTracks(this); addToolBar(visTracks); connect(editTools, SIGNAL(toolChanged(int)), arranger, SLOT(setTool(int))); connect(visTracks, SIGNAL(visibilityChanged()), MusEGlobal::song, SLOT(update()) ); connect(arranger, SIGNAL(editPart(MusECore::Track*)), MusEGlobal::muse, SLOT(startEditor(MusECore::Track*))); connect(arranger, SIGNAL(dropSongFile(const QString&)), MusEGlobal::muse, SLOT(loadProjectFile(const QString&))); connect(arranger, SIGNAL(dropMidiFile(const QString&)), MusEGlobal::muse, SLOT(importMidi(const QString&))); connect(arranger, SIGNAL(startEditor(MusECore::PartList*,int)), MusEGlobal::muse, SLOT(startEditor(MusECore::PartList*,int))); connect(arranger, SIGNAL(toolChanged(int)), editTools, SLOT(set(int))); connect(MusEGlobal::muse, SIGNAL(configChanged()), arranger, SLOT(configChanged())); connect(arranger, SIGNAL(setUsedTool(int)), editTools, SLOT(set(int))); connect(arranger, SIGNAL(selectionChanged()), SLOT(selectionChanged())); connect(MusEGlobal::song, SIGNAL(songChanged(MusECore::SongChangedFlags_t)), this, SLOT(songChanged(MusECore::SongChangedFlags_t))); //-------- Edit Actions editCutAction = new QAction(QIcon(*editcutIconSet), tr("C&ut"), this); editCopyAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy"), this); editCopyRangeAction = new QAction(QIcon(*editcopyIconSet), tr("Copy in range"), this); editPasteAction = new QAction(QIcon(*editpasteIconSet), tr("&Paste"), this); editPasteCloneAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste c&lone"), this); editPasteToTrackAction = new QAction(QIcon(*editpaste2TrackIconSet), tr("Paste to selected &track"), this); editPasteCloneToTrackAction = new QAction(QIcon(*editpasteClone2TrackIconSet), tr("Paste clone to selected trac&k"), this); editPasteDialogAction = new QAction(QIcon(*editpasteIconSet), tr("Paste (show dialo&g)"), this); editInsertEMAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert Empty Measure"), this); editDeleteSelectedAction = new QAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks"), this); editDuplicateSelTrackAction = new QAction(QIcon(*edit_track_addIcon), tr("Duplicate Selected Tracks"), this); editShrinkPartsAction = new QAction(tr("Shrink selected parts"), this); editExpandPartsAction = new QAction(tr("Expand selected parts"), this); editCleanPartsAction = new QAction(tr("Purge hidden events from selected parts"), this); addTrack = new QMenu(tr("Add Track"), this); addTrack->setIcon(QIcon(*edit_track_addIcon)); select = new QMenu(tr("Select"), this); select->setIcon(QIcon(*selectIcon)); editSelectAllAction = new QAction(QIcon(*select_allIcon), tr("Select &All"), this); editDeselectAllAction = new QAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"), this); editInvertSelectionAction = new QAction(QIcon(*select_invert_selectionIcon), tr("Invert &Selection"), this); editInsideLoopAction = new QAction(QIcon(*select_inside_loopIcon), tr("&Inside Loop"), this); editOutsideLoopAction = new QAction(QIcon(*select_outside_loopIcon), tr("&Outside Loop"), this); editAllPartsAction = new QAction( QIcon(*select_all_parts_on_trackIcon), tr("All &Parts on Track"), this); scoreSubmenu = new QMenu(tr("Score"), this); scoreSubmenu->setIcon(QIcon(*scoreIconSet)); scoreAllInOneSubsubmenu = new QMenu(tr("all tracks in one staff"), this); scoreOneStaffPerTrackSubsubmenu = new QMenu(tr("one staff per track"), this); scoreSubmenu->addMenu(scoreAllInOneSubsubmenu); scoreSubmenu->addMenu(scoreOneStaffPerTrackSubsubmenu); updateScoreMenus(); startScoreEditAction = new QAction(*scoreIconSet, tr("New score window"), this); startPianoEditAction = new QAction(*pianoIconSet, tr("Pianoroll"), this); startDrumEditAction = new QAction(QIcon(*edit_drummsIcon), tr("Drums"), this); startListEditAction = new QAction(QIcon(*edit_listIcon), tr("List"), this); startWaveEditAction = new QAction(QIcon(*edit_waveIcon), tr("Wave"), this); master = new QMenu(tr("Mastertrack"), this); master->setIcon(QIcon(*edit_mastertrackIcon)); masterGraphicAction = new QAction(QIcon(*mastertrack_graphicIcon),tr("Graphic"), this); masterListAction = new QAction(QIcon(*mastertrack_listIcon),tr("List"), this); midiTransformerAction = new QAction(QIcon(*midi_transformIcon), tr("Midi &Transform"), this); //-------- Structure Actions strGlobalCutAction = new QAction(tr("Global Cut"), this); strGlobalInsertAction = new QAction(tr("Global Insert"), this); strGlobalSplitAction = new QAction(tr("Global Split"), this); strGlobalCutSelAction = new QAction(tr("Global Cut - selected tracks"), this); strGlobalInsertSelAction = new QAction(tr("Global Insert - selected tracks"), this); strGlobalSplitSelAction = new QAction(tr("Global Split - selected tracks"), this); //------------------------------------------------------------- // popup Edit //------------------------------------------------------------- QMenu* menuEdit = menuBar()->addMenu(tr("&Edit")); menuEdit->addActions(MusEGlobal::undoRedo->actions()); menuEdit->addSeparator(); menuEdit->addAction(editCutAction); menuEdit->addAction(editCopyAction); menuEdit->addAction(editCopyRangeAction); menuEdit->addAction(editPasteAction); menuEdit->addAction(editPasteToTrackAction); menuEdit->addAction(editPasteCloneAction); menuEdit->addAction(editPasteCloneToTrackAction); menuEdit->addAction(editPasteDialogAction); menuEdit->addAction(editInsertEMAction); menuEdit->addSeparator(); menuEdit->addAction(editShrinkPartsAction); menuEdit->addAction(editExpandPartsAction); menuEdit->addAction(editCleanPartsAction); menuEdit->addSeparator(); menuEdit->addAction(editDeleteSelectedAction); menuEdit->addMenu(addTrack); menuEdit->addAction(editDuplicateSelTrackAction); menuEdit->addMenu(select); select->addAction(editSelectAllAction); select->addAction(editDeselectAllAction); select->addAction(editInvertSelectionAction); select->addAction(editInsideLoopAction); select->addAction(editOutsideLoopAction); select->addAction(editAllPartsAction); menuEdit->addSeparator(); menuEdit->addAction(startPianoEditAction); menuEdit->addMenu(scoreSubmenu); menuEdit->addAction(startScoreEditAction); menuEdit->addAction(startDrumEditAction); menuEdit->addAction(startListEditAction); menuEdit->addAction(startWaveEditAction); menuEdit->addMenu(master); master->addAction(masterGraphicAction); master->addAction(masterListAction); menuEdit->addSeparator(); menuEdit->addAction(midiTransformerAction); QMenu* menuStructure = menuEdit->addMenu(tr("&Structure")); menuStructure->addAction(strGlobalCutAction); menuStructure->addAction(strGlobalInsertAction); menuStructure->addAction(strGlobalSplitAction); menuStructure->addSeparator(); menuStructure->addAction(strGlobalCutSelAction); menuStructure->addAction(strGlobalInsertSelAction); menuStructure->addAction(strGlobalSplitSelAction); QMenu* functions_menu = menuBar()->addMenu(tr("Functions")); QAction* func_quantize_action = functions_menu->addAction(tr("&Quantize Notes"), editSignalMapper, SLOT(map())); QAction* func_notelen_action = functions_menu->addAction(tr("Change note &length"), editSignalMapper, SLOT(map())); QAction* func_velocity_action = functions_menu->addAction(tr("Change note &velocity"), editSignalMapper, SLOT(map())); QAction* func_cresc_action = functions_menu->addAction(tr("Crescendo/Decrescendo"), editSignalMapper, SLOT(map())); QAction* func_transpose_action = functions_menu->addAction(tr("Transpose"), editSignalMapper, SLOT(map())); QAction* func_erase_action = functions_menu->addAction(tr("Erase Events (Not Parts)"), editSignalMapper, SLOT(map())); QAction* func_move_action = functions_menu->addAction(tr("Move Events (Not Parts)"), editSignalMapper, SLOT(map())); QAction* func_fixed_len_action = functions_menu->addAction(tr("Set Fixed Note Length"), editSignalMapper, SLOT(map())); QAction* func_del_overlaps_action = functions_menu->addAction(tr("Delete Overlapping Notes"), editSignalMapper, SLOT(map())); QAction* func_legato_action = functions_menu->addAction(tr("Legato"), editSignalMapper, SLOT(map())); editSignalMapper->setMapping(func_quantize_action, CMD_QUANTIZE); editSignalMapper->setMapping(func_notelen_action, CMD_NOTELEN); editSignalMapper->setMapping(func_velocity_action, CMD_VELOCITY); editSignalMapper->setMapping(func_cresc_action, CMD_CRESCENDO); editSignalMapper->setMapping(func_transpose_action, CMD_TRANSPOSE); editSignalMapper->setMapping(func_erase_action, CMD_ERASE); editSignalMapper->setMapping(func_move_action, CMD_MOVE); editSignalMapper->setMapping(func_fixed_len_action, CMD_FIXED_LEN); editSignalMapper->setMapping(func_del_overlaps_action, CMD_DELETE_OVERLAPS); editSignalMapper->setMapping(func_legato_action, CMD_LEGATO); QMenu* menuSettings = menuBar()->addMenu(tr("Window &Config")); menuSettings->addAction(tr("Configure &custom columns"), this, SLOT(configCustomColumns())); menuSettings->addSeparator(); menuSettings->addAction(subwinAction); menuSettings->addAction(shareAction); menuSettings->addAction(fullscreenAction); //-------- Edit connections connect(editCutAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editCopyAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editCopyRangeAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editPasteAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editPasteCloneAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editPasteToTrackAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editPasteCloneToTrackAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editPasteDialogAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editInsertEMAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editDeleteSelectedAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editDuplicateSelTrackAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editShrinkPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editExpandPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editCleanPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editSelectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editDeselectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editInvertSelectionAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editInsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editOutsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editAllPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); editSignalMapper->setMapping(editCutAction, CMD_CUT); editSignalMapper->setMapping(editCopyAction, CMD_COPY); editSignalMapper->setMapping(editCopyRangeAction, CMD_COPY_RANGE); editSignalMapper->setMapping(editPasteAction, CMD_PASTE); editSignalMapper->setMapping(editPasteCloneAction, CMD_PASTE_CLONE); editSignalMapper->setMapping(editPasteToTrackAction, CMD_PASTE_TO_TRACK); editSignalMapper->setMapping(editPasteCloneToTrackAction, CMD_PASTE_CLONE_TO_TRACK); editSignalMapper->setMapping(editPasteDialogAction, CMD_PASTE_DIALOG); editSignalMapper->setMapping(editInsertEMAction, CMD_INSERTMEAS); editSignalMapper->setMapping(editDeleteSelectedAction, CMD_DELETE_TRACK); editSignalMapper->setMapping(editDuplicateSelTrackAction, CMD_DUPLICATE_TRACK); editSignalMapper->setMapping(editShrinkPartsAction, CMD_SHRINK_PART); editSignalMapper->setMapping(editExpandPartsAction, CMD_EXPAND_PART); editSignalMapper->setMapping(editCleanPartsAction, CMD_CLEAN_PART); editSignalMapper->setMapping(editSelectAllAction, CMD_SELECT_ALL); editSignalMapper->setMapping(editDeselectAllAction, CMD_SELECT_NONE); editSignalMapper->setMapping(editInvertSelectionAction, CMD_SELECT_INVERT); editSignalMapper->setMapping(editInsideLoopAction, CMD_SELECT_ILOOP); editSignalMapper->setMapping(editOutsideLoopAction, CMD_SELECT_OLOOP); editSignalMapper->setMapping(editAllPartsAction, CMD_SELECT_PARTS); connect(editSignalMapper, SIGNAL(mapped(int)), this, SLOT(cmd(int))); connect(startPianoEditAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startPianoroll())); connect(startScoreEditAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startScoreQuickly())); connect(startDrumEditAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startDrumEditor())); connect(startListEditAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startListEditor())); connect(startWaveEditAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startWaveEditor())); connect(scoreOneStaffPerTrackMapper, SIGNAL(mapped(QWidget*)), MusEGlobal::muse, SLOT(openInScoreEdit_oneStaffPerTrack(QWidget*))); connect(scoreAllInOneMapper, SIGNAL(mapped(QWidget*)), MusEGlobal::muse, SLOT(openInScoreEdit_allInOne(QWidget*))); connect(masterGraphicAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startMasterEditor())); connect(masterListAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startLMasterEditor())); connect(midiTransformerAction, SIGNAL(activated()), MusEGlobal::muse, SLOT(startMidiTransformer())); //-------- Structure connections connect(strGlobalCutAction, SIGNAL(activated()), SLOT(globalCut())); connect(strGlobalInsertAction, SIGNAL(activated()), SLOT(globalInsert())); connect(strGlobalSplitAction, SIGNAL(activated()), SLOT(globalSplit())); connect(strGlobalCutSelAction, SIGNAL(activated()), SLOT(globalCutSel())); connect(strGlobalInsertSelAction, SIGNAL(activated()), SLOT(globalInsertSel())); connect(strGlobalSplitSelAction, SIGNAL(activated()), SLOT(globalSplitSel())); connect(MusEGlobal::muse, SIGNAL(configChanged()), SLOT(updateShortcuts())); QClipboard* cb = QApplication::clipboard(); connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged())); connect(cb, SIGNAL(selectionChanged()), SLOT(clipboardChanged())); finalizeInit(); // work around for probable QT/WM interaction bug. // for certain window managers, e.g xfce, this window is // is displayed although not specifically set to show(); // bug: 2811156 Softsynth GUI unclosable with XFCE4 (and a few others) // Nov 21, 2012 Hey this causes the thing not to open at all, EVER, on Lubuntu and some others! // And we had a request to remove this from a knowledgable tester. REMOVE Tim. ///show(); ///hide(); }
KeyboardApplet::KeyboardApplet(QObject *parent, const QVariantList &args): Plasma::Applet(parent, args), xEventNotifier(), rules(Rules::readRules(Rules::READ_EXTRAS)), keyboardConfig(new KeyboardConfig()), layoutsMenu(new LayoutsMenu(*keyboardConfig, *rules, flags)) { if( ! X11Helper::xkbSupported(NULL) ) { setFailedToLaunch(true, i18n("XKB extension failed to initialize")); return; } m_svg = new Plasma::Svg(this); m_svg->setImagePath("widgets/labeltexture"); m_svg->setContainsMultipleImages(true); resize(48,48); setHasConfigurationInterface(false); setAspectRatioMode(Plasma::KeepAspectRatio); //setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum)); setBackgroundHints(DefaultBackground); connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), this, SLOT(themeChanged())); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.connect(QString(), KEYBOARD_DBUS_OBJECT_PATH, KEYBOARD_DBUS_SERVICE_NAME, KEYBOARD_DBUS_CONFIG_RELOAD_MESSAGE, this, SLOT(configChanged())); }
KeyboardApplet::~KeyboardApplet() { QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.disconnect(QString(), KEYBOARD_DBUS_OBJECT_PATH, KEYBOARD_DBUS_SERVICE_NAME, KEYBOARD_DBUS_CONFIG_RELOAD_MESSAGE, this, SLOT(configChanged())); delete layoutsMenu; delete rules; }
WaveEdit::WaveEdit(MusECore::PartList* pl, QWidget* parent, const char* name) : MidiEditor(TopWin::WAVE, 1, pl, parent, name) { setFocusPolicy(Qt::NoFocus); colorMode = colorModeInit; QSignalMapper* mapper = new QSignalMapper(this); QSignalMapper* colorMapper = new QSignalMapper(this); QAction* act; //---------Pulldown Menu---------------------------- // We probably don't need an empty menu - Orcan //QMenu* menuFile = menuBar()->addMenu(tr("&File")); QMenu* menuEdit = menuBar()->addMenu(tr("&Edit")); menuFunctions = menuBar()->addMenu(tr("Func&tions")); menuGain = menuFunctions->addMenu(tr("&Gain")); act = menuGain->addAction("200%"); mapper->setMapping(act, WaveCanvas::CMD_GAIN_200); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuGain->addAction("150%"); mapper->setMapping(act, WaveCanvas::CMD_GAIN_150); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuGain->addAction("75%"); mapper->setMapping(act, WaveCanvas::CMD_GAIN_75); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuGain->addAction("50%"); mapper->setMapping(act, WaveCanvas::CMD_GAIN_50); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuGain->addAction("25%"); mapper->setMapping(act, WaveCanvas::CMD_GAIN_25); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuGain->addAction(tr("Other")); mapper->setMapping(act, WaveCanvas::CMD_GAIN_FREE); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); connect(mapper, SIGNAL(mapped(int)), this, SLOT(cmd(int))); menuFunctions->addSeparator(); copyAction = menuEdit->addAction(tr("&Copy")); mapper->setMapping(copyAction, WaveCanvas::CMD_EDIT_COPY); connect(copyAction, SIGNAL(triggered()), mapper, SLOT(map())); copyPartRegionAction = menuEdit->addAction(tr("&Create Part from Region")); mapper->setMapping(copyPartRegionAction, WaveCanvas::CMD_CREATE_PART_REGION); connect(copyPartRegionAction, SIGNAL(triggered()), mapper, SLOT(map())); cutAction = menuEdit->addAction(tr("C&ut")); mapper->setMapping(cutAction, WaveCanvas::CMD_EDIT_CUT); connect(cutAction, SIGNAL(triggered()), mapper, SLOT(map())); pasteAction = menuEdit->addAction(tr("&Paste")); mapper->setMapping(pasteAction, WaveCanvas::CMD_EDIT_PASTE); connect(pasteAction, SIGNAL(triggered()), mapper, SLOT(map())); act = menuEdit->addAction(tr("Edit in E&xternal Editor")); mapper->setMapping(act, WaveCanvas::CMD_EDIT_EXTERNAL); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); menuEdit->addSeparator(); // REMOVE Tim. Also remove CMD_ADJUST_WAVE_OFFSET and so on... // adjustWaveOffsetAction = menuEdit->addAction(tr("Adjust wave offset...")); // mapper->setMapping(adjustWaveOffsetAction, WaveCanvas::CMD_ADJUST_WAVE_OFFSET); // connect(adjustWaveOffsetAction, SIGNAL(triggered()), mapper, SLOT(map())); act = menuFunctions->addAction(tr("Mute Selection")); mapper->setMapping(act, WaveCanvas::CMD_MUTE); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuFunctions->addAction(tr("Normalize Selection")); mapper->setMapping(act, WaveCanvas::CMD_NORMALIZE); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuFunctions->addAction(tr("Fade In Selection")); mapper->setMapping(act, WaveCanvas::CMD_FADE_IN); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuFunctions->addAction(tr("Fade Out Selection")); mapper->setMapping(act, WaveCanvas::CMD_FADE_OUT); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); act = menuFunctions->addAction(tr("Reverse Selection")); mapper->setMapping(act, WaveCanvas::CMD_REVERSE); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); select = menuEdit->addMenu(QIcon(*selectIcon), tr("Select")); selectAllAction = select->addAction(QIcon(*select_allIcon), tr("Select &All")); mapper->setMapping(selectAllAction, WaveCanvas::CMD_SELECT_ALL); connect(selectAllAction, SIGNAL(triggered()), mapper, SLOT(map())); selectNoneAction = select->addAction(QIcon(*select_allIcon), tr("&Deselect All")); mapper->setMapping(selectNoneAction, WaveCanvas::CMD_SELECT_NONE); connect(selectNoneAction, SIGNAL(triggered()), mapper, SLOT(map())); select->addSeparator(); selectPrevPartAction = select->addAction(QIcon(*select_all_parts_on_trackIcon), tr("&Previous Part")); mapper->setMapping(selectPrevPartAction, WaveCanvas::CMD_SELECT_PREV_PART); connect(selectPrevPartAction, SIGNAL(triggered()), mapper, SLOT(map())); selectNextPartAction = select->addAction(QIcon(*select_all_parts_on_trackIcon), tr("&Next Part")); mapper->setMapping(selectNextPartAction, WaveCanvas::CMD_SELECT_NEXT_PART); connect(selectNextPartAction, SIGNAL(triggered()), mapper, SLOT(map())); QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config")); eventColor = settingsMenu->addMenu(tr("&Event Color")); QActionGroup* actgrp = new QActionGroup(this); actgrp->setExclusive(true); evColorNormalAction = actgrp->addAction(tr("&Part colors")); evColorNormalAction->setCheckable(true); colorMapper->setMapping(evColorNormalAction, 0); evColorPartsAction = actgrp->addAction(tr("&Gray")); evColorPartsAction->setCheckable(true); colorMapper->setMapping(evColorPartsAction, 1); connect(evColorNormalAction, SIGNAL(triggered()), colorMapper, SLOT(map())); connect(evColorPartsAction, SIGNAL(triggered()), colorMapper, SLOT(map())); eventColor->addActions(actgrp->actions()); connect(colorMapper, SIGNAL(mapped(int)), this, SLOT(eventColorModeChanged(int))); settingsMenu->addSeparator(); settingsMenu->addAction(subwinAction); settingsMenu->addAction(shareAction); settingsMenu->addAction(fullscreenAction); connect(MusEGlobal::muse, SIGNAL(configChanged()), SLOT(configChanged())); //-------------------------------------------------- // ToolBar: Solo Cursor1 Cursor2 tools2 = new MusEGui::EditToolBar(this, waveEditTools); addToolBar(tools2); addToolBarBreak(); tb1 = addToolBar(tr("WaveEdit tools")); tb1->setObjectName("WaveEdit tools"); //tb1->setLabel(tr("weTools")); solo = new QToolButton(); solo->setText(tr("Solo")); solo->setCheckable(true); solo->setFocusPolicy(Qt::NoFocus); tb1->addWidget(solo); connect(solo, SIGNAL(toggled(bool)), SLOT(soloChanged(bool))); QLabel* label = new QLabel(tr("Cursor")); tb1->addWidget(label); label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); label->setIndent(3); pos1 = new PosLabel(0); pos1->setFixedHeight(22); tb1->addWidget(pos1); pos2 = new PosLabel(0); pos2->setFixedHeight(22); pos2->setSmpte(true); tb1->addWidget(pos2); //--------------------------------------------------- // Rest //--------------------------------------------------- int yscale = 256; int xscale; if (!parts()->empty()) { // Roughly match total size of part MusECore::Part* firstPart = parts()->begin()->second; xscale = 0 - firstPart->lenFrame()/_widthInit[_type]; } else { xscale = -8000; } hscroll = new ScrollScale(-32768, 1, xscale, 10000, Qt::Horizontal, mainw, 0, false, 10000.0); //view = new WaveView(this, mainw, xscale, yscale); canvas = new WaveCanvas(this, mainw, xscale, yscale); //wview = canvas; // HACK! QSizeGrip* corner = new QSizeGrip(mainw); ymag = new QSlider(Qt::Vertical, mainw); ymag->setMinimum(1); ymag->setMaximum(256); ymag->setPageStep(256); ymag->setValue(yscale); ymag->setFocusPolicy(Qt::NoFocus); time = new MTScale(&_raster, mainw, xscale, true); ymag->setFixedWidth(16); connect(canvas, SIGNAL(mouseWheelMoved(int)), this, SLOT(moveVerticalSlider(int))); connect(ymag, SIGNAL(valueChanged(int)), canvas, SLOT(setYScale(int))); connect(canvas, SIGNAL(horizontalZoom(bool, const QPoint&)), SLOT(horizontalZoom(bool, const QPoint&))); connect(canvas, SIGNAL(horizontalZoom(int, const QPoint&)), SLOT(horizontalZoom(int, const QPoint&))); time->setOrigin(0, 0); mainGrid->setRowStretch(0, 100); mainGrid->setColumnStretch(0, 100); mainGrid->addWidget(time, 0, 0, 1, 2); mainGrid->addWidget(MusECore::hLine(mainw), 1, 0, 1, 2); mainGrid->addWidget(canvas, 2, 0); mainGrid->addWidget(ymag, 2, 1); mainGrid->addWidget(hscroll, 3, 0); mainGrid->addWidget(corner, 3, 1, Qt::AlignBottom | Qt::AlignRight); canvas->setFocus(); connect(canvas, SIGNAL(toolChanged(int)), tools2, SLOT(set(int))); connect(tools2, SIGNAL(toolChanged(int)), canvas, SLOT(setTool(int))); connect(hscroll, SIGNAL(scrollChanged(int)), canvas, SLOT(setXPos(int))); connect(hscroll, SIGNAL(scaleChanged(int)), canvas, SLOT(setXMag(int))); setWindowTitle(canvas->getCaption()); connect(canvas, SIGNAL(followEvent(int)), hscroll, SLOT(setOffset(int))); connect(hscroll, SIGNAL(scrollChanged(int)), time, SLOT(setXPos(int))); connect(hscroll, SIGNAL(scaleChanged(int)), time, SLOT(setXMag(int))); connect(time, SIGNAL(timeChanged(unsigned)), SLOT(timeChanged(unsigned))); connect(canvas, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned))); connect(canvas, SIGNAL(horizontalScroll(unsigned)),hscroll, SLOT(setPos(unsigned))); connect(canvas, SIGNAL(horizontalScrollNoLimit(unsigned)),hscroll, SLOT(setPosNoLimit(unsigned))); connect(hscroll, SIGNAL(scaleChanged(int)), SLOT(updateHScrollRange())); connect(MusEGlobal::song, SIGNAL(songChanged(MusECore::SongChangedFlags_t)), SLOT(songChanged1(MusECore::SongChangedFlags_t))); // For the wave editor, let's start with the operation range selection tool. canvas->setTool(MusEGui::RangeTool); tools2->set(MusEGui::RangeTool); setEventColorMode(colorMode); initShortcuts(); updateHScrollRange(); configChanged(); if(!parts()->empty()) { MusECore::WavePart* part = (MusECore::WavePart*)(parts()->begin()->second); solo->setChecked(part->track()->solo()); } initTopwinState(); finalizeInit(); }
averageEdit->setText(QString("%1").arg(1) ); averageLayout->addWidget(averageEdit); controlsLayout->addRow(averageLabel, averageLayout); // display label... QVBoxLayout *layout = new QVBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(3,3,3,3); valueLabel = new QLabel(this); valueLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter); layout->addWidget(valueLabel); // get updates.. connect(context, SIGNAL(telemetryUpdate(RealtimeData)), this, SLOT(telemetryUpdate(RealtimeData))); connect(context, SIGNAL(configChanged()), this, SLOT(seriesChanged())); connect(context, SIGNAL(stop()), this, SLOT(stop())); connect(context, SIGNAL(start()), this, SLOT(start())); connect(context, SIGNAL(newLap()), this, SLOT(onNewLap())); connect(seriesSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(seriesChanged())); connect(averageSlider, SIGNAL(valueChanged(int)),this, SLOT(setAverageFromSlider())); connect(averageEdit, SIGNAL(textChanged(const QString)), this, SLOT(setAverageFromText(const QString))); // setup colors seriesChanged(); // setup fontsize etc resizeEvent(NULL); // set to zero
Athlete::Athlete(Context *context, const QDir &home) { // athlete name this->home = home; this->context = context; context->athlete = this; cyclist = home.dirName(); isclean = false; // Recovering from a crash? if(!appsettings->cvalue(cyclist, GC_SAFEEXIT, true).toBool()) { GcCrashDialog *crashed = new GcCrashDialog(home); crashed->exec(); } appsettings->setCValue(cyclist, GC_SAFEEXIT, false); // will be set to true on exit // Before we initialise we need to run the upgrade wizard for this athlete GcUpgrade v3; v3.upgrade(context->athlete->home); // metric / non-metric QVariant unit = appsettings->cvalue(cyclist, GC_UNIT); if (unit == 0) { // Default to system locale unit = appsettings->value(this, GC_UNIT, QLocale::system().measurementSystem() == QLocale::MetricSystem ? GC_UNIT_METRIC : GC_UNIT_IMPERIAL); appsettings->setCValue(cyclist, GC_UNIT, unit); } useMetricUnits = (unit.toString() == GC_UNIT_METRIC); // Power Zones zones_ = new Zones; QFile zonesFile(home.absolutePath() + "/power.zones"); if (zonesFile.exists()) { if (!zones_->read(zonesFile)) { QMessageBox::critical(context->mainWindow, tr("Zones File Error"), zones_->errorString()); } else if (! zones_->warningString().isEmpty()) QMessageBox::warning(context->mainWindow, tr("Reading Zones File"), zones_->warningString()); } // Heartrate Zones hrzones_ = new HrZones; QFile hrzonesFile(home.absolutePath() + "/hr.zones"); if (hrzonesFile.exists()) { if (!hrzones_->read(hrzonesFile)) { QMessageBox::critical(context->mainWindow, tr("HR Zones File Error"), hrzones_->errorString()); } else if (! hrzones_->warningString().isEmpty()) QMessageBox::warning(context->mainWindow, tr("Reading HR Zones File"), hrzones_->warningString()); } // read athlete's charts.xml and translate etc LTMSettings reader; reader.readChartXML(context->athlete->home, context->athlete->useMetricUnits, presets); translateDefaultCharts(presets); // Metadata rideMetadata_ = new RideMetadata(context,true); rideMetadata_->hide(); // Date Ranges seasons = new Seasons(home); // Search / filter #ifdef GC_HAVE_LUCENE namedSearches = new NamedSearches(this); // must be before navigator lucene = new Lucene(context, context); // before metricDB attempts to refresh #endif // metrics DB metricDB = new MetricAggregator(context); // just to catch config updates! metricDB->refreshMetrics(); // the model atop the metric DB sqlModel = new QSqlTableModel(this, metricDB->db()->connection()); sqlModel->setTable("metrics"); sqlModel->setEditStrategy(QSqlTableModel::OnManualSubmit); // Downloaders withingsDownload = new WithingsDownload(context); zeoDownload = new ZeoDownload(context); calendarDownload = new CalendarDownload(context); // Calendar #ifdef GC_HAVE_ICAL rideCalendar = new ICalendar(context); // my local/remote calendar entries davCalendar = new CalDAV(context); // remote caldav davCalendar->download(); // refresh the diary window #endif // RIDE TREE -- transitionary treeWidget = new QTreeWidget; treeWidget->setColumnCount(3); treeWidget->setSelectionMode(QAbstractItemView::SingleSelection); treeWidget->header()->resizeSection(0,60); treeWidget->header()->resizeSection(1,100); treeWidget->header()->resizeSection(2,70); treeWidget->header()->hide(); treeWidget->setAlternatingRowColors (false); treeWidget->setIndentation(5); treeWidget->hide(); allRides = new QTreeWidgetItem(context->athlete->treeWidget, FOLDER_TYPE); allRides->setText(0, tr("All Activities")); treeWidget->expandItem(context->athlete->allRides); treeWidget->setFirstItemColumnSpanned (context->athlete->allRides, true); //.INTERVALS TREE -- transitionary intervalWidget = new IntervalTreeView(context); intervalWidget->setColumnCount(1); intervalWidget->setIndentation(5); intervalWidget->setSortingEnabled(false); intervalWidget->header()->hide(); intervalWidget->setAlternatingRowColors (false); intervalWidget->setSelectionBehavior(QAbstractItemView::SelectRows); intervalWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); intervalWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); intervalWidget->setContextMenuPolicy(Qt::CustomContextMenu); intervalWidget->setFrameStyle(QFrame::NoFrame); allIntervals = context->athlete->intervalWidget->invisibleRootItem(); allIntervals->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); allIntervals->setText(0, tr("Intervals")); // populate ride list QTreeWidgetItem *last = NULL; QStringListIterator i(RideFileFactory::instance().listRideFiles(home)); while (i.hasNext()) { QString name = i.next(); QDateTime dt; if (RideFile::parseRideFileName(name, &dt)) { last = new RideItem(RIDE_TYPE, home.path(), name, dt, zones(), hrZones(), context); allRides->addChild(last); } } // trap signals connect(context, SIGNAL(configChanged()), this, SLOT(configChanged())); connect(treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(rideTreeWidgetSelectionChanged())); connect(context,SIGNAL(rideAdded(RideItem*)),this,SLOT(checkCPX(RideItem*))); connect(context,SIGNAL(rideDeleted(RideItem*)),this,SLOT(checkCPX(RideItem*))); connect(intervalWidget,SIGNAL(itemSelectionChanged()), this, SLOT(intervalTreeWidgetSelectionChanged())); connect(intervalWidget,SIGNAL(itemChanged(QTreeWidgetItem *,int)), this, SLOT(updateRideFileIntervals())); }
IntervalSidebar::IntervalSidebar(Context *context) : QWidget(context->mainWindow), context(context) { QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->setContentsMargins(0,0,0,0); mainLayout->setSpacing(0); setContentsMargins(0,0,0,0); splitter = new GcSplitter(Qt::Vertical); mainLayout->addWidget(splitter); // Route routeNavigator = new IntervalNavigator(context, "Route", true); routeNavigator->setProperty("nomenu", true); groupByMapper = NULL; // Bests bestNavigator = new IntervalNavigator(context, "Best", true); bestNavigator->setProperty("nomenu", true); // retrieve settings (properties are saved when we close the window) if (appsettings->cvalue(context->athlete->cyclist, GC_ROUTEHEADINGS, "").toString() != "") { routeNavigator->setSortByIndex(appsettings->cvalue(context->athlete->cyclist, GC_ROUTESORTBY).toInt()); routeNavigator->setSortByOrder(appsettings->cvalue(context->athlete->cyclist, GC_ROUTESORTBYORDER).toInt()); //routeNavigator->setGroupBy(appsettings->cvalue(context->athlete->cyclist, GC_ROUTEGROUPBY).toInt()); routeNavigator->setColumns(appsettings->cvalue(context->athlete->cyclist, GC_ROUTEHEADINGS).toString()); routeNavigator->setWidths(appsettings->cvalue(context->athlete->cyclist, GC_ROUTEHEADINGWIDTHS).toString()); } if (appsettings->cvalue(context->athlete->cyclist, GC_BESTHEADINGS, "").toString() != "") { bestNavigator->setSortByIndex(appsettings->cvalue(context->athlete->cyclist, GC_BESTSORTBY).toInt()); bestNavigator->setSortByOrder(appsettings->cvalue(context->athlete->cyclist, GC_BESTSORTBYORDER).toInt()); bestNavigator->setColumns(appsettings->cvalue(context->athlete->cyclist, GC_BESTHEADINGS).toString()); bestNavigator->setWidths(appsettings->cvalue(context->athlete->cyclist, GC_BESTHEADINGWIDTHS).toString()); } QWidget *routeWidget = new QWidget(this); routeWidget->setContentsMargins(0,0,0,0); #ifndef Q_OS_MAC // not on mac thanks routeWidget->setStyleSheet("padding: 0px; border: 0px; margin: 0px;"); #endif QVBoxLayout *routeLayout = new QVBoxLayout(routeWidget); routeLayout->setSpacing(0); routeLayout->setContentsMargins(0,0,0,0); routeLayout->addWidget(routeNavigator); routeItem = new GcSplitterItem(tr("Routes"), iconFromPNG(":images/sidebar/folder.png"), this); QAction *routeAction = new QAction(iconFromPNG(":images/sidebar/extra.png"), tr("Menu"), this); routeItem->addAction(routeAction); connect(routeAction, SIGNAL(triggered(void)), this, SLOT(routePopup())); routeItem->addWidget(routeWidget); QWidget *bestWidget = new QWidget(this); bestWidget->setContentsMargins(0,0,0,0); #ifndef Q_OS_MAC // not on mac thanks bestWidget->setStyleSheet("padding: 0px; border: 0px; margin: 0px;"); #endif QVBoxLayout *bestLayout = new QVBoxLayout(bestWidget); bestLayout->setSpacing(0); bestLayout->setContentsMargins(0,0,0,0); bestLayout->addWidget(bestNavigator); bestItem = new GcSplitterItem(tr("Bests"), iconFromPNG(":images/sidebar/folder.png"), this); QAction *bestAction = new QAction(iconFromPNG(":images/sidebar/extra.png"), tr("Menu"), this); bestItem->addAction(bestAction); connect(bestAction, SIGNAL(triggered(void)), this, SLOT(bestPopup())); bestItem->addWidget(bestWidget); splitter->addWidget(routeItem); splitter->addWidget(bestItem); splitter->prepare(context->athlete->cyclist, "interval"); // GC signal connect(context, SIGNAL(configChanged()), this, SLOT(configChanged())); // right click menus... connect(routeNavigator,SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showRouteMenu(const QPoint &))); //connect(context->athlete->intervalWidget,SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showIntervalMenu(const QPoint &))); connect(bestNavigator,SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showBestMenu(const QPoint &))); connect (context, SIGNAL(filterChanged()), this, SLOT(filterChanged())); configChanged(); }
void ViewController::emitConfigChanged() { Q_EMIT configChanged(); }
void PowerHist::recalc(bool force) { QVector<unsigned int> *array = NULL; QVector<unsigned int> *selectedArray = NULL; int arrayLength = 0; // lets make sure we need to recalculate if (force == false && LASTsource == source && LASTcache == cache && LASTrideItem == rideItem && LASTseries == series && LASTshade == shade && LASTuseMetricUnits == context->athlete->useMetricUnits && LASTlny == lny && LASTzoned == zoned && LASTbinw == binw && LASTwithz == withz && LASTdt == dt && LASTabsolutetime == absolutetime) { return; // nothing has changed } else { // remember for next time LASTsource = source; LASTcache = cache; LASTrideItem = rideItem; LASTseries = series; LASTshade = shade; LASTuseMetricUnits = context->athlete->useMetricUnits; LASTlny = lny; LASTzoned = zoned; LASTbinw = binw; LASTwithz = withz; LASTdt = dt; LASTabsolutetime = absolutetime; } if (source == Ride && !rideItem) return; // make sure the interval length is set if not plotting metrics if (source != Metric && dt <= 0) return; if (source == Metric) { // we use the metricArray array = &metricArray; arrayLength = metricArray.size(); selectedArray = NULL; } else if (series == RideFile::watts && zoned == false) { array = &wattsArray; arrayLength = wattsArray.size(); selectedArray = &wattsSelectedArray; } else if ((series == RideFile::watts || series == RideFile::wattsKg) && zoned == true) { array = &wattsZoneArray; arrayLength = wattsZoneArray.size(); selectedArray = &wattsZoneSelectedArray; } else if (series == RideFile::aPower && zoned == false) { array = &aPowerArray; arrayLength = aPowerArray.size(); selectedArray = &aPowerSelectedArray; } else if (series == RideFile::wattsKg && zoned == false) { array = &wattsKgArray; arrayLength = wattsKgArray.size(); selectedArray = &wattsKgSelectedArray; } else if (series == RideFile::nm) { array = &nmArray; arrayLength = nmArray.size(); selectedArray = &nmSelectedArray; } else if (series == RideFile::hr && zoned == false) { array = &hrArray; arrayLength = hrArray.size(); selectedArray = &hrSelectedArray; } else if (series == RideFile::hr && zoned == true) { array = &hrZoneArray; arrayLength = hrZoneArray.size(); selectedArray = &hrZoneSelectedArray; } else if (series == RideFile::kph) { array = &kphArray; arrayLength = kphArray.size(); selectedArray = &kphSelectedArray; } else if (series == RideFile::cad) { array = &cadArray; arrayLength = cadArray.size(); selectedArray = &cadSelectedArray; } RideFile::SeriesType baseSeries = (series == RideFile::wattsKg) ? RideFile::watts : series; // null curve please -- we have no data! if (!array || arrayLength == 0 || (source == Ride && !rideItem->ride()->isDataPresent(baseSeries))) { // create empty curves when no data const double zero = 0; curve->setData(&zero, &zero, 0); curveSelected->setData(&zero, &zero, 0); updatePlot(); return; } // binning of data when not zoned - we can't zone for series besides // watts and hr so ignore zoning for those data series if (zoned == false || (zoned == true && (series != RideFile::watts && series != RideFile::wattsKg && series != RideFile::hr))) { // we add a bin on the end since the last "incomplete" bin // will be dropped otherwise int count = int(ceil((arrayLength - 1) / (binw)))+1; // allocate space for data, plus beginning and ending point QVector<double> parameterValue(count+2, 0.0); QVector<double> totalTime(count+2, 0.0); QVector<double> totalTimeSelected(count+2, 0.0); int i; for (i = 1; i <= count; ++i) { double high = i * round(binw/delta); double low = high - round(binw/delta); if (low==0 && !withz) low++; parameterValue[i] = high*delta; totalTime[i] = 1e-9; // nonzero to accomodate log plot totalTimeSelected[i] = 1e-9; // nonzero to accomodate log plot while (low < high && low<arrayLength) { if (selectedArray && (*selectedArray).size()>low) totalTimeSelected[i] += dt * (*selectedArray)[low]; totalTime[i] += dt * (*array)[low++]; } } totalTime[i] = 1e-9; // nonzero to accomodate log plot totalTimeSelected[i] = 1e-9; // nonzero to accomodate log plot parameterValue[i] = i * delta * binw; totalTime[0] = 1e-9; totalTimeSelected[0] = 1e-9; parameterValue[0] = 0; // convert vectors from absolute time to percentage // if the user has selected that if (!absolutetime) { percentify(totalTime, 1); percentify(totalTimeSelected, 1); } curve->setData(parameterValue.data(), totalTime.data(), count + 2); curveSelected->setData(parameterValue.data(), totalTimeSelected.data(), count + 2); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::xBottom, sd); // HR typically starts at 80 or so, rather than zero // lets crop the chart so we can focus on the data // if we're working with HR data... minX=0; if (!withz && series == RideFile::hr) { for (int i=1; i<hrArray.size(); i++) { if (hrArray[i] > 0.1) { minX = i; break; } } } setAxisScale(xBottom, minX, parameterValue[count + 1]); // we only do zone labels when using absolute values refreshZoneLabels(); refreshHRZoneLabels(); } else { // we're not binning instead we are prettyfing the columnar // display in much the same way as the weekly summary workds // Each zone column will have 4 points QVector<double> xaxis (array->size() * 4); QVector<double> yaxis (array->size() * 4); QVector<double> selectedxaxis (selectedArray->size() * 4); QVector<double> selectedyaxis (selectedArray->size() * 4); // samples to time for (int i=0, offset=0; i<array->size(); i++) { double x = (double) i - 0.5; double y = dt * (double)(*array)[i]; xaxis[offset] = x +0.05; yaxis[offset] = 0; offset++; xaxis[offset] = x+0.05; yaxis[offset] = y; offset++; xaxis[offset] = x+0.95; yaxis[offset] = y; offset++; xaxis[offset] = x +0.95; yaxis[offset] = 0; offset++; } for (int i=0, offset=0; i<selectedArray->size(); i++) { double x = (double)i - 0.5; double y = dt * (double)(*selectedArray)[i]; selectedxaxis[offset] = x +0.05; selectedyaxis[offset] = 0; offset++; selectedxaxis[offset] = x+0.05; selectedyaxis[offset] = y; offset++; selectedxaxis[offset] = x+0.95; selectedyaxis[offset] = y; offset++; selectedxaxis[offset] = x +0.95; selectedyaxis[offset] = 0; offset++; } if (!absolutetime) { percentify(yaxis, 2); percentify(selectedyaxis, 2); } // set those curves curve->setData(xaxis.data(), yaxis.data(), xaxis.size()); curveSelected->setData(selectedxaxis.data(), selectedyaxis.data(), selectedxaxis.size()); // zone scale draw if ((series == RideFile::watts || series == RideFile::wattsKg) && zoned && rideItem && rideItem->zones) { setAxisScaleDraw(QwtPlot::xBottom, new ZoneScaleDraw(rideItem->zones, rideItem->zoneRange())); if (rideItem->zoneRange() >= 0) setAxisScale(QwtPlot::xBottom, -0.99, rideItem->zones->numZones(rideItem->zoneRange()), 1); else setAxisScale(QwtPlot::xBottom, -0.99, 0, 1); } // hr scale draw int hrRange; if (series == RideFile::hr && zoned && rideItem && context->athlete->hrZones() && (hrRange=context->athlete->hrZones()->whichRange(rideItem->dateTime.date())) != -1) { setAxisScaleDraw(QwtPlot::xBottom, new HrZoneScaleDraw(context->athlete->hrZones(), hrRange)); if (hrRange >= 0) setAxisScale(QwtPlot::xBottom, -0.99, context->athlete->hrZones()->numZones(hrRange), 1); else setAxisScale(QwtPlot::xBottom, -0.99, 0, 1); } // watts zoned for a time range if (source == Cache && zoned && (series == RideFile::watts || series == RideFile::wattsKg) && context->athlete->zones()) { setAxisScaleDraw(QwtPlot::xBottom, new ZoneScaleDraw(context->athlete->zones(), 0)); if (context->athlete->zones()->getRangeSize()) setAxisScale(QwtPlot::xBottom, -0.99, context->athlete->zones()->numZones(0), 1); // use zones from first defined range } // hr zoned for a time range if (source == Cache && zoned && series == RideFile::hr && context->athlete->hrZones()) { setAxisScaleDraw(QwtPlot::xBottom, new HrZoneScaleDraw(context->athlete->hrZones(), 0)); if (context->athlete->hrZones()->getRangeSize()) setAxisScale(QwtPlot::xBottom, -0.99, context->athlete->hrZones()->numZones(0), 1); // use zones from first defined range } setAxisMaxMinor(QwtPlot::xBottom, 0); } setYMax(); configChanged(); // setup the curve colors to appropriate values updatePlot(); }
MainWindow::MainWindow() : m_settings(QString::fromAscii("Doxygen.org"), QString::fromAscii("Doxywizard")) { QMenu *file = menuBar()->addMenu(tr("File")); file->addAction(tr("Open..."), this, SLOT(openConfig()), Qt::CTRL+Qt::Key_O); m_recentMenu = file->addMenu(tr("Open recent")); file->addAction(tr("Save"), this, SLOT(saveConfig()), Qt::CTRL+Qt::Key_S); file->addAction(tr("Save as..."), this, SLOT(saveConfigAs()), Qt::SHIFT+Qt::CTRL+Qt::Key_S); file->addAction(tr("Quit"), this, SLOT(quit()), Qt::CTRL+Qt::Key_Q); QMenu *settings = menuBar()->addMenu(tr("Settings")); settings->addAction(tr("Reset to factory defaults"), this,SLOT(resetToDefaults())); settings->addAction(tr("Use current settings at startup"), this,SLOT(makeDefaults())); settings->addAction(tr("Clear recent list"), this,SLOT(clearRecent())); QMenu *help = menuBar()->addMenu(tr("Help")); help->addAction(tr("Online manual"), this, SLOT(manual()), Qt::Key_F1); help->addAction(tr("About"), this, SLOT(about()) ); m_expert = new Expert; m_wizard = new Wizard(m_expert->modelData()); // ----------- top part ------------------ QWidget *topPart = new QWidget; QVBoxLayout *rowLayout = new QVBoxLayout(topPart); // select working directory QHBoxLayout *dirLayout = new QHBoxLayout; m_workingDir = new QLineEdit; m_selWorkingDir = new QPushButton(tr("Select...")); dirLayout->addWidget(m_workingDir); dirLayout->addWidget(m_selWorkingDir); //------------- bottom part -------------- QWidget *runTab = new QWidget; QVBoxLayout *runTabLayout = new QVBoxLayout(runTab); // run doxygen QHBoxLayout *runLayout = new QHBoxLayout; m_run = new QPushButton(tr("Run doxygen")); m_run->setEnabled(false); m_runStatus = new QLabel(tr("Status: not running")); m_saveLog = new QPushButton(tr("Save log...")); m_saveLog->setEnabled(false); QPushButton *showSettings = new QPushButton(tr("Show configuration")); runLayout->addWidget(m_run); runLayout->addWidget(m_runStatus); runLayout->addStretch(1); runLayout->addWidget(showSettings); runLayout->addWidget(m_saveLog); // output produced by doxygen runTabLayout->addLayout(runLayout); runTabLayout->addWidget(new QLabel(tr("Output produced by doxygen"))); QGridLayout *grid = new QGridLayout; m_outputLog = new QTextEdit; m_outputLog->setReadOnly(true); m_outputLog->setFontFamily(QString::fromAscii("courier")); m_outputLog->setMinimumWidth(600); grid->addWidget(m_outputLog,0,0); grid->setColumnStretch(0,1); grid->setRowStretch(0,1); QHBoxLayout *launchLayout = new QHBoxLayout; m_launchHtml = new QPushButton(tr("Show HTML output")); launchLayout->addWidget(m_launchHtml); launchLayout->addStretch(1); grid->addLayout(launchLayout,1,0); runTabLayout->addLayout(grid); QTabWidget *tabs = new QTabWidget; tabs->addTab(m_wizard,tr("Wizard")); tabs->addTab(m_expert,tr("Expert")); tabs->addTab(runTab,tr("Run")); rowLayout->addWidget(new QLabel(tr("Step 1: Specify the working directory from which doxygen will run"))); rowLayout->addLayout(dirLayout); rowLayout->addWidget(new QLabel(tr("Step 2: Configure doxygen using the Wizard and/or Expert tab, then switch to the Run tab to generate the documentation"))); rowLayout->addWidget(tabs); setCentralWidget(topPart); statusBar()->showMessage(tr("Welcome to Doxygen"),messageTimeout); m_runProcess = new QProcess; m_running = false; m_timer = new QTimer; // connect signals and slots connect(tabs,SIGNAL(currentChanged(int)),SLOT(selectTab(int))); connect(m_selWorkingDir,SIGNAL(clicked()),SLOT(selectWorkingDir())); connect(m_recentMenu,SIGNAL(triggered(QAction*)),SLOT(openRecent(QAction*))); connect(m_workingDir,SIGNAL(returnPressed()),SLOT(updateWorkingDir())); connect(m_runProcess,SIGNAL(readyReadStandardOutput()),SLOT(readStdout())); connect(m_runProcess,SIGNAL(finished(int, QProcess::ExitStatus)),SLOT(runComplete())); connect(m_timer,SIGNAL(timeout()),SLOT(readStdout())); connect(m_run,SIGNAL(clicked()),SLOT(runDoxygen())); connect(m_launchHtml,SIGNAL(clicked()),SLOT(showHtmlOutput())); connect(m_saveLog,SIGNAL(clicked()),SLOT(saveLog())); connect(showSettings,SIGNAL(clicked()),SLOT(showSettings())); connect(m_expert,SIGNAL(changed()),SLOT(configChanged())); loadSettings(); updateLaunchButtonState(); m_modified = false; updateTitle(); m_wizard->refresh(); }
void KSVPathConfig::slotChanged() { emit configChanged(); }
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)); // the plot QVBoxLayout *mainLayout = new QVBoxLayout; ltmPlot = new LTMPlot(this, context, true); // the stack of plots QPalette palette; palette.setBrush(QPalette::Background, QBrush(GColor(CPLOTBACKGROUND))); plotsWidget = new QWidget(this); plotsWidget->setPalette(palette); plotsLayout = new QVBoxLayout(plotsWidget); plotsLayout->setSpacing(0); plotsLayout->setContentsMargins(0,0,0,0); plotArea = new QScrollArea(this); 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 dataSummary = new QWebView(this); dataSummary->setContentsMargins(0,0,0,0); dataSummary->page()->view()->setContentsMargins(0,0,0,0); dataSummary->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); dataSummary->setAcceptDrops(false); QFont defaultFont; // mainwindow sets up the defaults.. we need to apply dataSummary->settings()->setFontSize(QWebSettings::DefaultFontSize, defaultFont.pointSize()+1); dataSummary->settings()->setFontFamily(QWebSettings::StandardFont, defaultFont.family()); // 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); 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(ltmPlot); stackWidget->addWidget(dataSummary); stackWidget->addWidget(plotArea); stackWidget->addWidget(compareplotArea); stackWidget->setCurrentIndex(0); mainLayout->addWidget(stackWidget); setChartLayout(mainLayout); // 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"); 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); // the controls QWidget *c = new QWidget; c->setContentsMargins(0,0,0,0); 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.data = NULL; 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(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->saveButton, SIGNAL(clicked(bool)), this, SLOT(saveClicked(void))); 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(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(configChanged()), this, SLOT(refresh())); }
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); }
void QApplicationStatus::updateConfig(const pb::EmcStatusConfig &config) { Service::recurseMessage(config, &m_config); emit configChanged(m_config); }
StartMainPage::StartMainPage(QWidget* parent, GvCore* gvCore) : QFrame(parent) , d(new StartMainPagePrivate) { d->q = this; d->mGvCore = gvCore; d->mSearchUiInitialized = false; d->setupUi(this); if (styleIsGtkBased()) { // Gtk-based styles do not apply the correct background color on tabs. // As a workaround, use the Plastique style instead. QStyle* fix = new QPlastiqueStyle(); fix->setParent(this); d->mHistoryWidget->tabBar()->setStyle(fix); d->mPlacesTagsWidget->tabBar()->setStyle(fix); } setFrameStyle(QFrame::NoFrame); // Bookmark view d->mBookmarksModel = new KFilePlacesModel(this); d->mBookmarksView->setModel(d->mBookmarksModel); d->mBookmarksView->setAutoResizeItemsEnabled(false); connect(d->mBookmarksView, SIGNAL(urlChanged(KUrl)), SIGNAL(urlSelected(KUrl))); // Tag view connect(d->mTagView, SIGNAL(clicked(QModelIndex)), SLOT(slotTagViewClicked(QModelIndex))); // Recent folder view connect(d->mRecentFoldersView, SIGNAL(indexActivated(QModelIndex)), SLOT(slotListViewActivated(QModelIndex))); connect(d->mRecentFoldersView, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showRecentFoldersViewContextMenu(QPoint))); // Url bag view d->mRecentUrlsView->setItemDelegate(new HistoryViewDelegate(d->mRecentUrlsView)); connect(d->mRecentUrlsView, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showRecentFoldersViewContextMenu(QPoint))); if (KGlobalSettings::singleClick()) { if (KGlobalSettings::changeCursorOverIcon()) { d->mRecentUrlsView->setCursor(Qt::PointingHandCursor); } connect(d->mRecentUrlsView, SIGNAL(clicked(QModelIndex)), SLOT(slotListViewActivated(QModelIndex))); } else { connect(d->mRecentUrlsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(slotListViewActivated(QModelIndex))); } d->updateHistoryTab(); connect(GwenviewConfig::self(), SIGNAL(configChanged()), SLOT(loadConfig())); d->mRecentFoldersView->setFocus(); }
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); }
AllPlot::AllPlot(AllPlotWindow *parent, MainWindow *mainWindow): QwtPlot(parent), rideItem(NULL), unit(0), shade_zones(true), showPowerState(3), showHrState(Qt::Checked), showSpeedState(Qt::Checked), showCadState(Qt::Checked), showAltState(Qt::Checked), bydist(false), parent(parent) { boost::shared_ptr<QSettings> settings = GetApplicationSettings(); unit = settings->value(GC_UNIT); referencePlot = NULL; useMetricUnits = (unit.toString() == "Metric"); // options for turning off/on shading on all plot // will come in with a future patch, for now we // enable zone shading by default, since this is // the current default behaviour if (false) shade_zones = false; else shade_zones = true; smooth = settings->value(GC_RIDE_PLOT_SMOOTHING).toInt(); if (smooth < 1) smooth = 1; // create a background object for shading bg = new AllPlotBackground(this); bg->attach(this); insertLegend(new QwtLegend(), QwtPlot::BottomLegend); setCanvasBackground(GColor(CPLOTBACKGROUND)); setXTitle(); wattsCurve = new QwtPlotCurve(tr("Power")); hrCurve = new QwtPlotCurve(tr("Heart Rate")); hrCurve->setYAxis(yLeft2); speedCurve = new QwtPlotCurve(tr("Speed")); speedCurve->setYAxis(yRight); cadCurve = new QwtPlotCurve(tr("Cadence")); cadCurve->setYAxis(yLeft2); altCurve = new QwtPlotCurve(tr("Altitude")); // altCurve->setRenderHint(QwtPlotItem::RenderAntialiased); altCurve->setYAxis(yRight2); intervalHighlighterCurve = new QwtPlotCurve(); intervalHighlighterCurve->setYAxis(yLeft); intervalHighlighterCurve->setData(IntervalPlotData(this, mainWindow)); intervalHighlighterCurve->attach(this); this->legend()->remove(intervalHighlighterCurve); // don't show in legend grid = new QwtPlotGrid(); grid->enableX(false); grid->attach(this); // get rid of nasty blank space on right of the plot plotLayout()->setAlignCanvasToScales(true); configChanged(); // set colors }
//! Preenche collectionSurfaces conforme valores da interface void SurfacesConfigDialog::getFields(QVector<struct wsWeatherDataPcdSurface> &collectionSurfaces, bool &changed) { collectionSurfaces = _collectionSurfaces; changed = configChanged(); }
void Konfigurator::slotApply() { emit configChanged(((KonfiguratorPage*)(currentPage()->widget()))->apply()); }
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); }
HomeWindow::HomeWindow(MainWindow *mainWindow, QString name, QString /* windowtitle */) : GcWindow(mainWindow), mainWindow(mainWindow), name(name), active(false), clicked(NULL), dropPending(false), chartCursor(-2), loaded(false) { setInstanceName("Home Window"); // setup control area QWidget *cw = new QWidget(this); cw->setContentsMargins(0,0,0,0); QVBoxLayout *cl = new QVBoxLayout(cw); cl->setSpacing(0); cl->setContentsMargins(0,0,0,0); QLabel *titleLabel = new QLabel("Title", this); QHBoxLayout *hl = new QHBoxLayout; hl->setSpacing(5); hl->setContentsMargins(0,0,0,0); titleEdit = new QLineEdit(this); titleEdit->setEnabled(false); controlStack = new QStackedWidget(this); controlStack->setContentsMargins(0,0,0,0); hl->addWidget(titleLabel); hl->addWidget(titleEdit); cl->addLayout(hl); cl->addSpacing(15); cl->addWidget(controlStack); setControls(cw); setProperty("isManager", true); setAcceptDrops(true); QVBoxLayout *layout = new QVBoxLayout(this); QFont bigandbold; bigandbold.setPointSize(bigandbold.pointSize() + 2); bigandbold.setWeight(QFont::Bold); QHBoxLayout *titleBar = new QHBoxLayout; QLabel *space = new QLabel("", this); space->setFixedHeight(20); titleBar->addWidget(space); style = new QStackedWidget(this); style->setAutoFillBackground(false); layout->setSpacing(0); layout->setContentsMargins(0,0,0,0); layout->addWidget(style); QPalette palette; palette.setBrush(backgroundRole(), QColor("#B3B4B6")); setAutoFillBackground(false); // each style has its own container widget QWidget *tabArea = new QWidget(this); tabArea->setContentsMargins(20,20,20,20); QVBoxLayout *tabLayout = new QVBoxLayout(tabArea); tabLayout->setContentsMargins(0,0,0,0); tabLayout->setSpacing(0); tabbed = new QTabWidget(this); #ifdef Q_OS_MAC tabbed->setAttribute(Qt::WA_MacShowFocusRect, 0); #endif tabbed->setContentsMargins(0,0,0,0); tabbed->setTabsClosable(false); tabbed->setPalette(palette); tabbed->setDocumentMode(false); tabbed->setMovable(true); tabbed->setElideMode(Qt::ElideNone); tabbed->setUsesScrollButtons(true); QTabBar *tb = tabbed->findChild<QTabBar*>(QLatin1String("qt_tabwidget_tabbar")); tb->setShape(QTabBar::RoundedSouth); tb->setDrawBase(false); tabbed->setStyleSheet("QTabWidget::tab-bar { alignment: center; }" "QTabWidget::pane { top: 20px; }"); tabLayout->addWidget(tabbed); style->addWidget(tabArea); // tiled tileWidget = new QWidget(this); tileWidget->setAutoFillBackground(false); tileWidget->setPalette(palette); tileWidget->setContentsMargins(0,0,0,0); tileGrid = new QGridLayout(tileWidget); tileGrid->setSpacing(0); tileArea = new QScrollArea(this); tileArea->setAutoFillBackground(false); tileArea->setPalette(palette); tileArea->setWidgetResizable(true); tileArea->setWidget(tileWidget); tileArea->setFrameStyle(QFrame::NoFrame); tileArea->setContentsMargins(0,0,0,0); style->addWidget(tileArea); winWidget = new QWidget(this); winWidget->setAutoFillBackground(false); winWidget->setContentsMargins(0,0,0,0); winWidget->setPalette(palette); winFlow = new GcWindowLayout(winWidget, 0, tileSpacing, tileSpacing); winFlow->setContentsMargins(tileMargin,tileMargin,tileMargin,tileMargin); winArea = new QScrollArea(this); winArea->setAutoFillBackground(false); winArea->setPalette(palette); winArea->setWidgetResizable(true); winArea->setWidget(winWidget); winArea->setFrameStyle(QFrame::NoFrame); winArea->setContentsMargins(0,0,0,0); style->addWidget(winArea); winWidget->installEventFilter(this); // to draw cursor winWidget->setMouseTracking(true); // to draw cursor // enable right click to add a chart winArea->setContextMenuPolicy(Qt::CustomContextMenu); tabArea->setContextMenuPolicy(Qt::CustomContextMenu); connect(winArea,SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(rightClick(const QPoint &))); connect(tabArea,SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(rightClick(const QPoint &))); currentStyle=-1; styleChanged(2); connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(this, SIGNAL(dateRangeChanged(DateRange)), this, SLOT(dateRangeChanged(DateRange))); connect(mainWindow, SIGNAL(configChanged()), this, SLOT(configChanged())); connect(tabbed, SIGNAL(currentChanged(int)), this, SLOT(tabSelected(int))); connect(tabbed, SIGNAL(tabCloseRequested(int)), this, SLOT(removeChart(int))); connect(tb, SIGNAL(tabMoved(int,int)), this, SLOT(tabMoved(int,int))); connect(titleEdit, SIGNAL(textChanged(const QString&)), SLOT(titleChanged())); installEventFilter(this); application->installEventFilter(this); }
void NotifyQt::UpdateGUI() { #ifndef MINIMAL_RSGUI /* hack to force updates until we've fixed that part */ static time_t lastTs = 0; // std::cerr << "Got update signal t=" << lastTs << std::endl ; lastTs = time(NULL) ; static bool already_updated = false ; // these only update once at start because they may already have been set before // the gui is running, then they get updated by callbacks. if(!already_updated) { emit messagesChanged() ; emit neighborsChanged(); emit configChanged(); already_updated = true ; } /* Finally Check for PopupMessages / System Error Messages */ if (rsNotify) { uint32_t sysid; uint32_t type; std::string title, id, msg; if (rsNotify->NotifyPopupMessage(type, id, title, msg)) { uint popupflags = Settings->getNotifyFlags(); /* You can set timeToShow, timeToLive and timeToHide or can leave the standard */ Toaster *toaster = NULL; /* id the name */ std::string name; std::string realmsg; unsigned char *data = NULL; int size = 0 ; if (type == RS_POPUP_DOWNLOAD) { /* id = file hash */ } else { name = rsPeers->getPeerName(id); realmsg = "<strong>" + name + "</strong>"; rsMsgs->getAvatarData(id,data,size); } switch(type) { case RS_POPUP_MSG: if (popupflags & RS_POPUP_MSG) { toaster = new Toaster(new MessageToaster(QString::fromStdString(realmsg), QString::fromStdString(title), QString::fromStdString(msg))); } break; case RS_POPUP_CONNECT: if (popupflags & RS_POPUP_CONNECT) { QPixmap avatar; if(size != 0) { // set the image avatar.loadFromData(data,size,"PNG"); } else { avatar = QPixmap(":/images/user/personal64.png"); } toaster = new Toaster(new OnlineToaster(id, QString::fromStdString(realmsg), avatar)); } break; case RS_POPUP_DOWNLOAD: if (popupflags & RS_POPUP_DOWNLOAD) { toaster = new Toaster(new DownloadToaster(id, QString::fromUtf8(title.c_str()))); } break; } if (data) { delete[] data; } if (toaster) { /* init attributes */ toaster->widget->setWindowFlags(Qt::ToolTip | Qt::WindowStaysOnTopHint); /* add toaster to waiting list */ // QMutexLocker lock(&waitingToasterMutex); waitingToasterList.push_back(toaster); } } if (rsNotify->NotifySysMessage(sysid, type, title, msg)) { /* make a warning message */ switch(type) { case RS_SYS_ERROR: QMessageBox::critical(MainWindow::getInstance(), QString::fromStdString(title), QString::fromStdString(msg)); break; case RS_SYS_WARNING: QMessageBox::warning(MainWindow::getInstance(), QString::fromStdString(title), QString::fromStdString(msg)); break; default: case RS_SYS_INFO: QMessageBox::information(MainWindow::getInstance(), QString::fromStdString(title), QString::fromStdString(msg)); break; } } if (rsNotify->NotifyLogMessage(sysid, type, title, msg)) { /* make a log message */ std::string logMesString = title + " " + msg; switch(type) { case RS_SYS_ERROR: case RS_SYS_WARNING: case RS_SYS_INFO: emit logInfoChanged(QString(logMesString.c_str())); default:; } } } /* Now start the waiting toasters */ startWaitingToasters(); #endif // MINIMAL_RSGUI }