void DateRangeSelectionWidget::Private::_k_rangeEndEdited( const QDate& date ) { if ( date < m_range.start() ) setRange( DateRange( date, date ) ); else setRange( DateRange( m_range.start(), date ) ); emit q->rangeChanged( m_range ); }
void DateRangeSelectionWidget::Private::_k_rangeStartEdited( const QDate& date ) { if ( date > m_range.end() ) setRange( DateRange( date, date ) ); else setRange( DateRange( date, m_range.end() ) ); emit q->rangeChanged( m_range ); }
ConstraintTypes::TagMatch::TagMatch( QDomElement& xmlelem, ConstraintNode* p ) : MatchingConstraint( p ) , m_comparer( new Comparer() ) , m_fieldsModel( new TagMatchFieldsModel() ) { DEBUG_BLOCK QDomAttr a; a = xmlelem.attributeNode( "field" ); if ( !a.isNull() ) { if ( m_fieldsModel->contains( a.value() ) ) m_field = a.value(); else debug() << a.value() << "is not a recognized field name" << endl; } a = xmlelem.attributeNode( "comparison" ); if ( !a.isNull() ) { m_comparison = a.value().toInt(); } a = xmlelem.attributeNode( "value" ); if ( !a.isNull() ) { if ( m_fieldsModel->type_of( m_field ) == FieldTypeInt ) { m_value = a.value().toInt(); } else if ( m_fieldsModel->type_of( m_field ) == FieldTypeDate ) { if ( m_comparison == CompareDateWithin ) { QStringList parts = a.value().split(" "); if ( parts.size() == 2 ) { int u = parts.at( 0 ).toInt(); int v = 0; if ( parts.at( 1 ) == "months" ) v = 1; else if ( parts.at( 1 ) == "years" ) v = 2; m_value = QVariant::fromValue( DateRange( u, v ) ); } else m_value = QVariant::fromValue( DateRange( 0, 0 ) ); } else m_value = QDate::fromString( a.value(), Qt::ISODate ); } else { // String type m_value = a.value(); } } a = xmlelem.attributeNode( "invert" ); if ( !a.isNull() && a.value() == "true" ) m_invert = true; else m_invert = false; a = xmlelem.attributeNode( "strictness" ); if ( !a.isNull() ) m_strictness = a.value().toDouble(); debug() << getName(); }
void DateRangeSelectionWidget::Private::_k_afterClicked() { if ( m_range.start().isValid() ) setRange( DateRange( m_range.start(), QDate() ) ); else if ( m_range.end().isValid() ) setRange( DateRange( m_range.end(), QDate() ) ); else setRange( DateRange( QDate::currentDate(), QDate() ) ); emit q->rangeChanged( m_range ); }
void DateRangeSelectionWidget::Private::_k_anytimeClicked() { checkButton( m_anytimeButton ); setRange( DateRange() ); emit q->rangeChanged( m_range ); }
DateRange DateRange::intersect(DateRange const& other) const { if (isNull() || other.isNull()) { return DateRange(); } QDate startDate = std::max(m_startDate, other.startDate()); QDate endDate = std::min(this->endDate(), other.endDate()); if (startDate <= endDate) { return DateRange(startDate, endDate); } else { return DateRange(); } }
void TimelineSideBarWidget::slotAlbumSelected(Album* album) { SAlbum* salbum = dynamic_cast<SAlbum*>(album); if (!salbum) { slotResetSelection(); return; } SearchXmlReader reader(salbum->query()); // The timeline query consists of groups, with two date time fields each DateRangeList list; while (!reader.atEnd()) { // read groups if (reader.readNext() == SearchXml::Group) { QDateTime start, end; int numberOfFields = 0; while (!reader.atEnd()) { // read fields reader.readNext(); if (reader.isEndElement()) { break; } if (reader.isFieldElement()) { if (numberOfFields == 0) { start = reader.valueToDateTime(); } else if (numberOfFields == 1) { end = reader.valueToDateTime(); } ++numberOfFields; } } if (numberOfFields) { list << DateRange(start, end); } } } d->timeLineWidget->setSelectedDateRange(list); }
void LTMSidebar::dateRangeTreeWidgetSelectionChanged() { if (active == true) return; const Season *dateRange = NULL; if (dateRangeTree->selectedItems().isEmpty()) dateRange = NULL; else { QTreeWidgetItem *which = dateRangeTree->selectedItems().first(); if (which != allDateRanges) { dateRange = &seasons->seasons.at(allDateRanges->indexOfChild(which)); } else { dateRange = NULL; } } if (dateRange) { int i; // clear events - we need to add for currently selected season for (i=allEvents->childCount(); i > 0; i--) { delete allEvents->takeChild(0); } // add this seasons events for (i=0; i <dateRange->events.count(); i++) { SeasonEvent event = dateRange->events.at(i); QTreeWidgetItem *add = new QTreeWidgetItem(allEvents); add->setText(0, event.name); add->setText(1, event.date.toString("MMM d, yyyy")); } // make sure they fit eventTree->header()->resizeSections(QHeaderView::ResizeToContents); appsettings->setCValue(main->cyclist, GC_LTM_LAST_DATE_RANGE, dateRange->id().toString()); } // Let the view know its changed.... if (dateRange) emit dateRangeChanged(DateRange(dateRange->start, dateRange->end, dateRange->name)); else emit dateRangeChanged(DateRange()); }
Currency RoutineAllocator::allocate(DateRange const& period, Currency available) { DateRange range; if (m_history.isEmpty()) { range = DateRange(); } else { Q_ASSERT(m_history.lastKey() < period.startDate()); range = DateRange(m_history.firstKey(), period.startDate().addDays(-1)); } DateRange firstDay(range.startDate(), range.startDate()); foreach (Currency const& total, m_historyTotals) { Currency amount = total.amortize(range, firstDay) * period.days(); m_allocation -= amount; available += amount; }
void BudgetBalancer::advancePeriodToDate(QDate const& date) { // if no budget is defined, instantiate a default 1-month budget cycle to // attempt to give useful info out of the box if (m_period.isNull()) { m_period = DateRange(date, Interval(1, Interval::Period::MONTHS)); } while (m_period.endDate() < date) { allocateCategories(); processRecords(); ++m_period; } }
void LTMWindow::presetSelected(int index) { // apply a preset if we are configured to do that... if (ltmTool->usePreset->isChecked()) { // save chart setup int groupBy = settings.groupBy; bool legend = settings.legend; bool events = settings.events; bool stack = settings.stack; bool shadeZones = settings.shadeZones; QDateTime start = settings.start; QDateTime end = settings.end; // apply preset settings = context->athlete->presets[index]; // now get back the local chart setup settings.ltmTool = ltmTool; settings.bests = &bestsresults; settings.groupBy = groupBy; settings.legend = legend; settings.events = events; settings.stack = stack; settings.shadeZones = shadeZones; settings.start = start; settings.end = end; // Set the specification FilterSet fs; fs.addFilter(context->isfiltered, context->filters); fs.addFilter(context->ishomefiltered, context->homeFilters); fs.addFilter(ltmTool->isFiltered(), ltmTool->filters()); settings.specification.setFilterSet(fs); settings.specification.setDateRange(DateRange(settings.start.date(), settings.end.date())); ltmTool->applySettings(); refresh(); setProperty("subtitle", settings.name); } else { setProperty("subtitle", property("title").toString()); } }
void HomeWindow::selected() { setUpdatesEnabled(false); if (loaded == false) { restoreState(); loaded = true; if (!currentStyle) tabSelected(0); } resizeEvent(NULL); // force a relayout rideSelected(); dateRangeChanged(DateRange()); setUpdatesEnabled(true); update(); }
void LTMWindow::refreshPlot() { if (amVisible() == true) { if (isCompare()) { // COMPARE PLOTS stackWidget->setCurrentIndex(3); refreshCompare(); } else if (ltmTool->showData->isChecked()) { // DATA TABLE stackWidget->setCurrentIndex(1); refreshDataTable(); } else { if (ltmTool->showStack->isChecked()) { // STACK PLOTS refreshStackPlots(); stackWidget->setCurrentIndex(2); stackDirty = false; } else { // NORMAL PLOTS plotted = DateRange(settings.start.date(), settings.end.date()); ltmPlot->setData(&settings); stackWidget->setCurrentIndex(0); dirty = false; spanSlider->setMinimum(ltmPlot->axisScaleDiv(QwtPlot::xBottom).lowerBound()); spanSlider->setMaximum(ltmPlot->axisScaleDiv(QwtPlot::xBottom).upperBound()); spanSlider->setLowerValue(spanSlider->minimum()); spanSlider->setUpperValue(spanSlider->maximum()); } } } }
void LTMWindow::refreshPlot() { if (amVisible() == true) { if (isCompare()) { // COMPARE PLOTS stackWidget->setCurrentIndex(3); refreshCompare(); } else if (ltmTool->showData->isChecked()) { // DATA TABLE stackWidget->setCurrentIndex(1); refreshDataTable(); } else { if (ltmTool->showStack->isChecked()) { // STACK PLOTS refreshStackPlots(); stackWidget->setCurrentIndex(2); stackDirty = false; } else { // NORMAL PLOTS plotted = DateRange(settings.start.date(), settings.end.date()); ltmPlot->setData(&settings); stackWidget->setCurrentIndex(0); dirty = false; } } } }
void DateRangeSelectionWidget::Private::_k_calendarDateClicked( const QDate& date ) { if ( QApplication::keyboardModifiers() & Qt::ShiftModifier ) { if ( m_range.start().isValid() && date < m_range.start() ) { setRange( DateRange( date, m_range.end().isValid() ? m_range.end() : m_range.start() ) ); emit q->rangeChanged( m_range ); } else if ( m_range.end().isValid() && date < m_range.end() ) { setRange( DateRange( date, m_range.end() ) ); emit q->rangeChanged( m_range ); } else if ( m_range.end().isValid() && date > m_range.end() ) { setRange( DateRange( m_range.start().isValid() ? m_range.start() : m_range.end(), date ) ); emit q->rangeChanged( m_range ); } else if ( m_range.start().isValid() && date > m_range.start() ) { setRange( DateRange( m_range.start(), date ) ); emit q->rangeChanged( m_range ); } } else if ( m_beforeButton->isChecked() ) { setRange( DateRange( QDate(), date ) ); emit q->rangeChanged( m_range ); } else if ( m_afterButton->isChecked() ) { setRange( DateRange( date, QDate() ) ); emit q->rangeChanged( m_range ); } else { setRange( DateRange( date, date ) ); emit q->rangeChanged( m_range ); } }
void BudgetBalancer::processItem(LedgerBudget const& budget) { // if there is a budget period, process recorded items until we are within // range of this budget command advancePeriodToDate(budget.date()); // if the current period started before today, or if it already has recorded // commands, then end the period today and process what we have if (m_period.startDate() != budget.date() || m_numRecords != 0) { m_period = DateRange(m_period.startDate(), budget.date()); allocateCategories(); processRecords(); } // remove categories that are not in this budget command, or that have // changed, and allocate their funds to the available category auto categories = budget.categories(); for (auto it = m_categories.cbegin(); it != m_categories.cend(); ++it) { if (!categories.contains(it.key()) || categories[it.key()].type != it->type) { switch (it->type) { case LedgerBudget::Category::Type::GOAL: // nothing to do for goals break; case LedgerBudget::Category::Type::INCOME: // nothing to do for income type break; case LedgerBudget::Category::Type::RESERVE_AMOUNT: { Currency amount = m_reserveAmountAllocator.deallocate(it.key()); if (!amount.isZero()) { emit message(budget, QString("Reserve category '%1' was closed with " "a balance of %2. Those funds are " "available again.") .arg(it.key()) .arg(amount.toString())); } m_available += amount; break; } case LedgerBudget::Category::Type::RESERVE_PERCENT: { Currency amount = m_reservePercentAllocator.deallocate(it.key()); if (!amount.isZero()) { emit message(budget, QString("Reserve category '%1' was closed with " "a balance of %2. Those funds are " "available again.") .arg(it.key()) .arg(amount.toString())); } m_available += amount; break; } case LedgerBudget::Category::Type::ROUTINE: m_routineAllocator.deallocate(it.key()); break; } } } // configure new and changed budget categories for (auto it = categories.cbegin(); it != categories.cend(); ++it) { switch (it->type) { case LedgerBudget::Category::Type::GOAL: m_goalAllocator.budget(budget.date()); break; case LedgerBudget::Category::Type::INCOME: // nothing to do for income break; case LedgerBudget::Category::Type::RESERVE_AMOUNT: m_reserveAmountAllocator.budget(budget.date(), it.key(), it->amount, it->interval); break; case LedgerBudget::Category::Type::RESERVE_PERCENT: m_reservePercentAllocator.budget(it.key(), it->percentage); break; case LedgerBudget::Category::Type::ROUTINE: // nothing to do for routine expenses break; } } m_categories = categories; // reset the dates for the new period m_period = DateRange(budget.date(), budget.interval()); }
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); #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 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); #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(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") << 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); // 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->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(configChanged())); connect(context, SIGNAL(presetSelected(int)), this, SLOT(presetSelected(int))); 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)); 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); }
void DateSettingsEdit::setDateSettings() { if (active) return; // first lets disable everything active = true; fromDateEdit->setEnabled(false); toDateEdit->setEnabled(false); startDateEdit->setEnabled(false); thisperiod->setEnabled(false); prevperiod->setEnabled(false); lastn->setEnabled(false); lastnx->setEnabled(false); // the date selection types have changed if (radioSelected->isChecked()) { // current selection emit useStandardRange(); } else if (radioCustom->isChecked()) { // between x and y fromDateEdit->setEnabled(true); toDateEdit->setEnabled(true); // set date range using custom values emit useCustomRange(DateRange(fromDateEdit->date(), toDateEdit->date())); } else if (radioToday->isChecked()) { // current selected thru to today emit useThruToday(); } else if (radioLast->isChecked()) { // last n 'weeks etc' lastn->setEnabled(true); lastnx->setEnabled(true); QDate from; QDate today = QDate::currentDate(); // calculate range up to today... switch(lastnx->currentIndex()) { case 0 : // days from = today.addDays(lastn->value() * -1); break; case 1 : // weeks from = today.addDays(lastn->value() * -7); break; case 2 : // months from = today.addMonths(lastn->value() * -1); break; case 3 : // years from = today.addYears(lastn->value() * -1); break; } emit useCustomRange(DateRange(from, today)); } else if (radioFrom->isChecked()) { // from date - today startDateEdit->setEnabled(true); emit useCustomRange(DateRange(startDateEdit->date(), QDate::currentDate())); } else if (radioThis->isChecked()) { thisperiod->setEnabled(true); prevperiod->setEnabled(true); QDate today = QDate::currentDate(); QDate from, to; switch(thisperiod->currentIndex()) { case 0 : // weeks { int dow = today.dayOfWeek(); // 1-7, where 1=monday from = today.addDays(-1 * (dow-1)); to = from.addDays(6); // prevperiods from = from.addDays(prevperiod->value() * -7); to = to.addDays(prevperiod->value() * -7); } break; case 1 : // months from = QDate(today.year(), today.month(), 1); to = from.addMonths(1).addDays(-1); from = from.addMonths(prevperiod->value() * -1); to = to.addMonths(prevperiod->value() * -1); break; case 2 : // years from = QDate(today.year(), 1, 1); to = from.addYears(1).addDays(-1); from = from.addYears(prevperiod->value() * -1); to = to.addYears(prevperiod->value() * -1); break; } emit useCustomRange(DateRange(from, to)); } active = false; }
void Resource::updateProblems() { // Delete existing problems for this resource Problem::clearProblems(*this, true, false); // Problem detection disabled on this resource if (!getDetectProblems()) return; // Loop through the loadplans Date excessProblemStart; Date shortageProblemStart; bool excessProblem = false; bool shortageProblem = false; double curMax(0.0); double shortageQty(0.0); double curMin(0.0); double excessQty(0.0); for (loadplanlist::const_iterator iter = loadplans.begin(); iter != loadplans.end(); ) { // Process changes in the maximum or minimum targets if (iter->getEventType() == 4) curMax = iter->getMax(); else if (iter->getEventType() == 3) curMin = iter->getMin(); // Only consider the last loadplan for a certain date const TimeLine<LoadPlan>::Event *f = &*(iter++); if (iter!=loadplans.end() && iter->getDate()==f->getDate()) continue; // Check against minimum target double delta = f->getOnhand() - curMin; if (delta < -ROUNDING_ERROR) { if (!shortageProblem) { shortageProblemStart = f->getDate(); shortageQty = delta; shortageProblem = true; } else if (delta < shortageQty) // New shortage qty shortageQty = delta; } else { if (shortageProblem) { // New problem now ends if (f->getDate() != shortageProblemStart) new ProblemCapacityUnderload(this, DateRange(shortageProblemStart, f->getDate()), -shortageQty); shortageProblem = false; } } // Note that theoretically we can have a minimum and a maximum problem for // the same moment in time. // Check against maximum target delta = f->getOnhand() - curMax; if (delta > ROUNDING_ERROR) { if (!excessProblem) { excessProblemStart = f->getDate(); excessQty = delta; excessProblem = true; } else if (delta > excessQty) excessQty = delta; } else { if (excessProblem) { // New problem now ends if (f->getDate() != excessProblemStart) new ProblemCapacityOverload(this, excessProblemStart, f->getDate(), excessQty); excessProblem = false; } } } // End of for-loop through the loadplans // The excess lasts till the end of the horizon... if (excessProblem) new ProblemCapacityOverload(this, excessProblemStart, Date::infiniteFuture, excessQty); // The shortage lasts till the end of the horizon... if (shortageProblem) new ProblemCapacityUnderload(this, DateRange(shortageProblemStart, Date::infiniteFuture), -shortageQty); }