#4624 Allow customization of date/time components in labels

This commit is contained in:
Gaute Lindkvist 2019-08-23 14:13:13 +02:00
parent a86ae13bb7
commit 7951899717
9 changed files with 165 additions and 55 deletions

View File

@ -22,6 +22,7 @@
#include <QLocale>
#include <QString>
#include "cafAppEnum.h"
#include <cvfAssert.h>
#include <ctime>
@ -47,6 +48,30 @@ const QString RiaQDateTimeTools::TIMESPAN_HALFYEAR_NAME = "Half Year";
const QString RiaQDateTimeTools::TIMESPAN_YEAR_NAME = "Year";
const QString RiaQDateTimeTools::TIMESPAN_DECADE_NAME = "Decade";
namespace caf
{
template<>
void caf::AppEnum<RiaQDateTimeTools::DateFormatComponents>::setUp()
{
addItem(RiaQDateTimeTools::DATE_FORMAT_NONE, "NO_DATE", "No Date");
addItem(RiaQDateTimeTools::DATE_FORMAT_YEAR, "YEAR", "Year Only");
addItem(RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH, "YEAR_MONTH", "Year and Month");
addItem(RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY, "YEAR_MONTH_DAY", "Year, Month and Day");
setDefault(RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
}
template<>
void caf::AppEnum<RiaQDateTimeTools::TimeFormatComponents>::setUp()
{
addItem(RiaQDateTimeTools::TIME_FORMAT_NONE, "NO_TIME", "No Time of Day");
addItem(RiaQDateTimeTools::TIME_FORMAT_HOUR, "HOUR", "Hour Only");
addItem(RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE, "HOUR_MINUTE", "Hour and Minute");
addItem(RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE_SECOND, "HOUR_MINUTE_SECONDS", "Hour, Minutes and Seconds");
setDefault(RiaQDateTimeTools::TIME_FORMAT_NONE);
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -66,6 +66,7 @@ class RiaQDateTimeTools
public:
enum DateFormatComponents
{
DATE_FORMAT_UNSPECIFIED = -2,
DATE_FORMAT_NONE = -1,
DATE_FORMAT_YEAR = 0,
DATE_FORMAT_YEAR_MONTH,
@ -75,6 +76,7 @@ public:
enum TimeFormatComponents
{
TIME_FORMAT_UNSPECIFIED = -2,
TIME_FORMAT_NONE = -1,
TIME_FORMAT_HOUR,
TIME_FORMAT_HOUR_MINUTE,

View File

@ -926,10 +926,13 @@ void RimSummaryPlot::updateTimeAxis()
if (m_timeAxisProperties->timeMode() == RimSummaryTimeAxisProperties::DATE)
{
RiaQDateTimeTools::DateFormatComponents dateComponents = m_timeAxisProperties->dateComponents();
RiaQDateTimeTools::TimeFormatComponents timeComponents = m_timeAxisProperties->timeComponents();
QString dateFormat = m_timeAxisProperties->dateFormat();
QString timeFormat = m_timeAxisProperties->timeFormat();
m_qwtPlot->useDateBasedTimeAxis(dateFormat, timeFormat);
m_qwtPlot->useDateBasedTimeAxis(dateFormat, timeFormat, dateComponents, timeComponents);
}
else
{

View File

@ -49,6 +49,7 @@ void caf::AppEnum<RimSummaryTimeAxisProperties::TimeUnitType>::setUp()
addItem(RimSummaryTimeAxisProperties::MINUTES, "MINUTES", "Minutes");
addItem(RimSummaryTimeAxisProperties::HOURS, "HOURS", "Hours");
addItem(RimSummaryTimeAxisProperties::DAYS, "DAYS ", "Days");
addItem(RimSummaryTimeAxisProperties::MONTHS, "MONTHS", "Months");
addItem(RimSummaryTimeAxisProperties::YEARS, "YEARS", "Years");
setDefault(RimSummaryTimeAxisProperties::YEARS);
@ -68,8 +69,8 @@ RimSummaryTimeAxisProperties::RimSummaryTimeAxisProperties()
CAF_PDM_InitField(&m_isActive, "Active", true, "Active", "", "", "");
m_isActive.uiCapability()->setUiHidden(true);
CAF_PDM_InitField(&showTitle, "ShowTitle", false, "Show Title", "", "", "");
CAF_PDM_InitField(&title, "Title", QString("Time"), "Title", "", "", "");
CAF_PDM_InitField(&showTitle, "ShowTitle", false, "Show Title ", "", "", "");
CAF_PDM_InitField(&title, "Title", QString("Time"), "Title ", "", "", "");
CAF_PDM_InitField(&m_isAutoZoom, "AutoZoom", true, "Set Range Automatically", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_timeMode, "TimeMode", "Time Mode", "", "", "");
@ -99,12 +100,16 @@ RimSummaryTimeAxisProperties::RimSummaryTimeAxisProperties()
m_titleFontSize = RiaFontCache::pointSizeFromFontSizeEnum(RiaApplication::instance()->preferences()->defaultPlotFontSize());
CAF_PDM_InitField(&m_valuesFontSize, "ValuesFontSize", 10, "Font Size", "", "", "");
m_valuesFontSize = RiaFontCache::pointSizeFromFontSizeEnum(RiaApplication::instance()->preferences()->defaultPlotFontSize());
CAF_PDM_InitField(&m_automaticDateComponents, "AutoDate", true, "Automatic Date/Time Labels", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_dateComponents, "DateComponents", "Set Date Label", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_timeComponents, "TimeComponents", "Set Time Label", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_dateFormat, "DateFormat", "Date Format", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_dateFormat, "DateFormat", "Date Label Format", "", "", "");
m_dateFormat.uiCapability()->setUiEditorTypeName(caf::PdmUiComboBoxEditor::uiEditorTypeName());
m_dateFormat = RiaApplication::instance()->preferences()->dateFormat();
CAF_PDM_InitFieldNoDefault(&m_timeFormat, "TimeFormat", "Time Format", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_timeFormat, "TimeFormat", "Time Label Format", "", "", "");
m_timeFormat.uiCapability()->setUiEditorTypeName(caf::PdmUiComboBoxEditor::uiEditorTypeName());
m_timeFormat = RiaApplication::instance()->preferences()->timeFormat();
@ -361,7 +366,7 @@ QList<caf::PdmOptionItemInfo> RimSummaryTimeAxisProperties::calculateValueOption
{
QDate exampleDate = QDate(2019, 8, 16);
QString fullDateFormat =
RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
RiaQDateTimeTools::dateFormatString(dateFormat, dateComponents(RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY));
QString uiText = QString("%1 (%2)").arg(fullDateFormat).arg(exampleDate.toString(fullDateFormat));
uiText.replace("AP", "AM/PM");
options.push_back(caf::PdmOptionItemInfo(uiText, QVariant::fromValue(dateFormat)));
@ -373,7 +378,7 @@ QList<caf::PdmOptionItemInfo> RimSummaryTimeAxisProperties::calculateValueOption
{
QTime exampleTime = QTime(15, 48, 22);
QString timeFormatString =
RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE_SECOND);
RiaQDateTimeTools::timeFormatString(timeFormat, timeComponents(RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE_SECOND));
QString uiText = QString("%1 (%2)").arg(timeFormatString).arg(exampleTime.toString(timeFormatString));
uiText.replace("AP", "AM/PM");
options.push_back(caf::PdmOptionItemInfo(uiText, QVariant::fromValue(timeFormat)));
@ -466,6 +471,22 @@ double RimSummaryTimeAxisProperties::fromDaysToDisplayUnitScale()
return scale;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaQDateTimeTools::DateFormatComponents RimSummaryTimeAxisProperties::dateComponents(RiaQDateTimeTools::DateFormatComponents fallback) const
{
return m_automaticDateComponents() ? fallback : m_dateComponents();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaQDateTimeTools::TimeFormatComponents RimSummaryTimeAxisProperties::timeComponents(RiaQDateTimeTools::TimeFormatComponents fallback) const
{
return m_automaticDateComponents() ? fallback : m_timeComponents();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -489,9 +510,13 @@ void RimSummaryTimeAxisProperties::defineUiOrdering(QString uiConfigName, caf::P
{
caf::PdmUiGroup& titleGroup = *(uiOrdering.addNewGroup("Axis Title"));
titleGroup.add(&showTitle);
titleGroup.add(&title);
titleGroup.add(&m_titlePositionEnum);
titleGroup.add(&m_titleFontSize);
titleGroup.add(&title);
title.uiCapability()->setUiReadOnly(!showTitle());
if (showTitle())
{
titleGroup.add(&m_titlePositionEnum);
titleGroup.add(&m_titleFontSize);
}
caf::PdmUiGroup* timeGroup = uiOrdering.addNewGroup("Time Values");
timeGroup->add(&m_timeMode);
@ -501,8 +526,12 @@ void RimSummaryTimeAxisProperties::defineUiOrdering(QString uiConfigName, caf::P
timeGroup->add(&m_visibleTimeRangeMax, false);
timeGroup->add(&m_visibleDateRangeMin, true);
timeGroup->add(&m_visibleTimeRangeMin, false);
timeGroup->add(&m_dateFormat);
timeGroup->add(&m_timeFormat);
timeGroup->add(&m_automaticDateComponents);
if (!m_automaticDateComponents())
{
timeGroup->add(&m_dateComponents);
timeGroup->add(&m_timeComponents);
}
}
else
{
@ -511,6 +540,19 @@ void RimSummaryTimeAxisProperties::defineUiOrdering(QString uiConfigName, caf::P
timeGroup->add(&m_visibleTimeSinceStartRangeMin);
}
timeGroup->add(&m_valuesFontSize);
if (m_timeMode() == DATE)
{
caf::PdmUiGroup* advancedGroup = timeGroup->addNewGroup("Date/Time Label Format");
advancedGroup->setCollapsedByDefault(true);
if (m_automaticDateComponents() || m_dateComponents() != RiaQDateTimeTools::DATE_FORMAT_NONE)
{
advancedGroup->add(&m_dateFormat);
}
if (m_automaticDateComponents() || m_timeComponents() != RiaQDateTimeTools::TIME_FORMAT_NONE)
{
advancedGroup->add(&m_timeFormat);
}
}
uiOrdering.skipRemainingFields(true);
}

View File

@ -50,10 +50,14 @@ public:
SECONDS,
MINUTES,
HOURS,
DAYS,
DAYS,
MONTHS,
YEARS
};
typedef caf::AppEnum<RiaQDateTimeTools::DateFormatComponents> DateFormatEnum;
typedef caf::AppEnum<RiaQDateTimeTools::TimeFormatComponents> TimeFormatEnum;
public:
RimSummaryTimeAxisProperties();
@ -71,6 +75,9 @@ public:
double fromTimeTToDisplayUnitScale();
double fromDaysToDisplayUnitScale();
RiaQDateTimeTools::DateFormatComponents dateComponents(RiaQDateTimeTools::DateFormatComponents fallback = RiaQDateTimeTools::DATE_FORMAT_UNSPECIFIED) const;
RiaQDateTimeTools::TimeFormatComponents timeComponents(RiaQDateTimeTools::TimeFormatComponents fallback = RiaQDateTimeTools::TIME_FORMAT_UNSPECIFIED) const;
const QString& dateFormat() const;
const QString& timeFormat() const;
@ -125,6 +132,9 @@ private:
caf::PdmField<int> m_titleFontSize;
caf::PdmField<caf::AppEnum<AxisTitlePositionType>> m_titlePositionEnum;
caf::PdmField<int> m_valuesFontSize;
caf::PdmField<bool> m_automaticDateComponents;
caf::PdmField<DateFormatEnum> m_dateComponents;
caf::PdmField<TimeFormatEnum> m_timeComponents;
caf::PdmField<QString> m_dateFormat;
caf::PdmField<QString> m_timeFormat;

View File

@ -114,7 +114,9 @@ void RiuQwtPlotTools::setDefaultAxes(QwtPlot* plot)
//--------------------------------------------------------------------------------------------------
void RiuQwtPlotTools::enableDateBasedBottomXAxis(QwtPlot* plot,
const QString& dateFormat,
const QString& timeFormat)
const QString& timeFormat,
RiaQDateTimeTools::DateFormatComponents dateComponents,
RiaQDateTimeTools::TimeFormatComponents timeComponents)
{
QwtDateScaleDraw* scaleDraw = new QwtDateScaleDraw(Qt::UTC);
@ -129,7 +131,7 @@ void RiuQwtPlotTools::enableDateBasedBottomXAxis(QwtPlot* plot,
for (QwtDate::IntervalType interval : intervals)
{
scaleDraw->setDateFormat(interval, dateTimeFormatForInterval(interval, dateFormat, timeFormat));
scaleDraw->setDateFormat(interval, dateTimeFormatForInterval(interval, dateFormat, timeFormat, dateComponents, timeComponents));
}
QwtDateScaleEngine* scaleEngine = new QwtDateScaleEngine(Qt::UTC);
@ -142,39 +144,51 @@ void RiuQwtPlotTools::enableDateBasedBottomXAxis(QwtPlot* plot,
//--------------------------------------------------------------------------------------------------
QString RiuQwtPlotTools::dateTimeFormatForInterval(QwtDate::IntervalType interval,
const QString& dateFormat,
const QString& timeFormat)
const QString& timeFormat,
RiaQDateTimeTools::DateFormatComponents dateComponents,
RiaQDateTimeTools::TimeFormatComponents timeComponents)
{
switch (interval)
{
case QwtDate::Millisecond:
return RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE_SECOND_MILLISECOND);
case QwtDate::Second:
return RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE_SECOND);
case QwtDate::Minute: {
QString fullFormat = RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE);
fullFormat += "\n";
fullFormat += RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
return fullFormat;
}
case QwtDate::Hour: {
QString fullFormat = RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR);
if (!fullFormat.endsWith("AP"))
{
fullFormat += ":00";
}
fullFormat += "\n";
fullFormat += RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
return fullFormat;
}
case QwtDate::Day:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
case QwtDate::Week:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH);
case QwtDate::Month:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH);
case QwtDate::Year:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR);
default:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
}
if (dateComponents != RiaQDateTimeTools::DATE_FORMAT_UNSPECIFIED && timeComponents != RiaQDateTimeTools::TIME_FORMAT_UNSPECIFIED)
{
return RiaQDateTimeTools::dateFormatString(dateFormat, dateComponents) + "\n" +
RiaQDateTimeTools::timeFormatString(timeFormat, timeComponents);
}
else
{
switch (interval)
{
case QwtDate::Millisecond:
return RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE_SECOND_MILLISECOND);
case QwtDate::Second:
return RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE_SECOND);
case QwtDate::Minute:
{
QString fullFormat = RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR_MINUTE);
fullFormat += "\n";
fullFormat += RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
return fullFormat;
}
case QwtDate::Hour:
{
QString fullFormat = RiaQDateTimeTools::timeFormatString(timeFormat, RiaQDateTimeTools::TIME_FORMAT_HOUR);
if (!fullFormat.endsWith("AP"))
{
fullFormat += ":00";
}
fullFormat += "\n";
fullFormat += RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
return fullFormat;
}
case QwtDate::Day:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
case QwtDate::Week:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH);
case QwtDate::Month:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH);
case QwtDate::Year:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR);
default:
return RiaQDateTimeTools::dateFormatString(dateFormat, RiaQDateTimeTools::DATE_FORMAT_YEAR_MONTH_DAY);
}
}
}

View File

@ -27,8 +27,15 @@ class RiuQwtPlotTools
public:
static void setCommonPlotBehaviour(QwtPlot* plot);
static void setDefaultAxes(QwtPlot* plot);
static void enableDateBasedBottomXAxis(QwtPlot* plot, const QString& dateFormat, const QString& timeFormat);
static void enableDateBasedBottomXAxis(QwtPlot* plot,
const QString& dateFormat,
const QString& timeFormat,
RiaQDateTimeTools::DateFormatComponents dateComponents = RiaQDateTimeTools::DATE_FORMAT_UNSPECIFIED,
RiaQDateTimeTools::TimeFormatComponents timeComponents = RiaQDateTimeTools::TIME_FORMAT_UNSPECIFIED);
static QString
dateTimeFormatForInterval(QwtDate::IntervalType interval, const QString& dateFormat, const QString& timeFormat);
static QString dateTimeFormatForInterval(QwtDate::IntervalType interval,
const QString& dateFormat,
const QString& timeFormat,
RiaQDateTimeTools::DateFormatComponents dateComponents,
RiaQDateTimeTools::TimeFormatComponents timeComponents);
};

View File

@ -102,9 +102,11 @@ RiuSummaryQwtPlot::RiuSummaryQwtPlot(RimViewWindow* viewWindow, QWidget* parent
///
//--------------------------------------------------------------------------------------------------
void RiuSummaryQwtPlot::useDateBasedTimeAxis(const QString& dateFormat,
const QString& timeFormat)
const QString& timeFormat,
RiaQDateTimeTools::DateFormatComponents dateComponents,
RiaQDateTimeTools::TimeFormatComponents timeComponents)
{
RiuQwtPlotTools::enableDateBasedBottomXAxis(this, dateFormat, timeFormat);
RiuQwtPlotTools::enableDateBasedBottomXAxis(this, dateFormat, timeFormat, dateComponents, timeComponents);
}
//--------------------------------------------------------------------------------------------------

View File

@ -41,7 +41,12 @@ class RiuSummaryQwtPlot : public RiuQwtPlot
public:
RiuSummaryQwtPlot(RimViewWindow* ownerViewWindow, QWidget* parent = nullptr);
void useDateBasedTimeAxis(const QString& dateFormat, const QString& timeFormat);
void
useDateBasedTimeAxis(const QString& dateFormat,
const QString& timeFormat,
RiaQDateTimeTools::DateFormatComponents dateComponents = RiaQDateTimeTools::DATE_FORMAT_UNSPECIFIED,
RiaQDateTimeTools::TimeFormatComponents timeComponents = RiaQDateTimeTools::TIME_FORMAT_UNSPECIFIED);
void useTimeBasedTimeAxis();
void addOrUpdateEnsembleCurveSetLegend(RimEnsembleCurveSet* curveSetToShowLegendFor);