diff --git a/kmymoney/mymoney/mymoneyenums.h b/kmymoney/mymoney/mymoneyenums.h --- a/kmymoney/mymoney/mymoneyenums.h +++ b/kmymoney/mymoney/mymoneyenums.h @@ -103,6 +103,8 @@ enum class DataLock { Automatic = 0, UserDefined, DataOptionCount }; inline uint qHash(const DataLock key, uint seed) { return ::qHash(static_cast(key), seed); } + enum class ChartPalette { Application = 0, Default, Rainbow, Subdued, End}; + inline uint qHash(const ChartPalette key, uint seed) { return ::qHash(static_cast(key), seed); } } namespace Schedule { diff --git a/kmymoney/mymoney/mymoneyreport.h b/kmymoney/mymoney/mymoneyreport.h --- a/kmymoney/mymoney/mymoneyreport.h +++ b/kmymoney/mymoney/mymoneyreport.h @@ -47,6 +47,7 @@ namespace eMyMoney { namespace Report { enum class InvestmentSum; } } namespace eMyMoney { namespace Report { enum class ChartType; } } namespace eMyMoney { namespace Report { enum class DataLock; } } +namespace eMyMoney { namespace Report { enum class ChartPalette; } } /** * This class defines a report within the MyMoneyEngine. The report class @@ -151,6 +152,9 @@ eMyMoney::Report::ChartType chartType() const; void setChartType(eMyMoney::Report::ChartType type); + eMyMoney::Report::ChartPalette chartPalette() const; + void setChartPalette(eMyMoney::Report::ChartPalette type); + bool isChartDataLabels() const; void setChartDataLabels(bool f); diff --git a/kmymoney/mymoney/mymoneyreport.cpp b/kmymoney/mymoney/mymoneyreport.cpp --- a/kmymoney/mymoney/mymoneyreport.cpp +++ b/kmymoney/mymoney/mymoneyreport.cpp @@ -400,6 +400,18 @@ d->m_chartType = type; } +eMyMoney::Report::ChartPalette MyMoneyReport::chartPalette() const +{ + Q_D(const MyMoneyReport); + return d->m_chartPalette; +} + +void MyMoneyReport::setChartPalette(eMyMoney::Report::ChartPalette type) +{ + Q_D(MyMoneyReport); + d->m_chartPalette = type; +} + bool MyMoneyReport::isChartDataLabels() const { Q_D(const MyMoneyReport); diff --git a/kmymoney/mymoney/mymoneyreport_p.h b/kmymoney/mymoney/mymoneyreport_p.h --- a/kmymoney/mymoney/mymoneyreport_p.h +++ b/kmymoney/mymoney/mymoneyreport_p.h @@ -61,6 +61,7 @@ m_dateLock(eMyMoney::TransactionFilter::Date::UserDefined), m_accountGroupFilter(false), m_chartType(eMyMoney::Report::ChartType::Line), + m_chartPalette(eMyMoney::Report::ChartPalette::Application), m_chartDataLabels(true), m_chartCHGridLines(true), m_chartSVGridLines(true), @@ -222,6 +223,10 @@ * What format should be used to draw this report as a chart */ eMyMoney::Report::ChartType m_chartType; + /** + * What color palette should be used to draw this report as a chart + */ + eMyMoney::Report::ChartPalette m_chartPalette; /** * Whether the value of individual data points should be drawn on the chart */ diff --git a/kmymoney/plugins/views/reports/core/kreportchartview.cpp b/kmymoney/plugins/views/reports/core/kreportchartview.cpp --- a/kmymoney/plugins/views/reports/core/kreportchartview.cpp +++ b/kmymoney/plugins/views/reports/core/kreportchartview.cpp @@ -262,16 +262,30 @@ AbstractDiagram* planeDiagram = cPlane->diagram(); planeDiagram->setAntiAliasing(true); - //the palette - we set it here because it is a property of the diagram - switch (KMyMoneySettings::chartsPalette()) { - case 0: + // setup chart color palette + switch (config.chartPalette()) { + case eMyMoney::Report::ChartPalette::Application: + switch (KMyMoneySettings::chartsPalette()) { + case 0: + planeDiagram->useDefaultColors(); + break; + case 1: + planeDiagram->useRainbowColors(); + break; + case 2: + default: + planeDiagram->useSubduedColors(); + break; + } + break; + case eMyMoney::Report::ChartPalette::Default: planeDiagram->useDefaultColors(); break; - case 1: + case eMyMoney::Report::ChartPalette::Rainbow: planeDiagram->useRainbowColors(); break; - case 2: default: + case eMyMoney::Report::ChartPalette::Subdued: planeDiagram->useSubduedColors(); break; } diff --git a/kmymoney/plugins/views/reports/kbalancechartdlg.cpp b/kmymoney/plugins/views/reports/kbalancechartdlg.cpp --- a/kmymoney/plugins/views/reports/kbalancechartdlg.cpp +++ b/kmymoney/plugins/views/reports/kbalancechartdlg.cpp @@ -97,6 +97,7 @@ reportCfg.setChartSVGridLines(false); reportCfg.setChartDataLabels(false); reportCfg.setChartType(eMyMoney::Report::ChartType::Line); + reportCfg.setChartPalette(eMyMoney::Report::ChartPalette::Application); reportCfg.setIncludingForecast(true); reportCfg.setIncludingBudgetActuals(true); if (account.accountType() == eMyMoney::Account::Type::Investment) { diff --git a/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp b/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp --- a/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp +++ b/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp @@ -304,8 +304,9 @@ if (d->m_tabChart) { eMyMoney::Report::ChartType ct[5] = { eMyMoney::Report::ChartType::Line, eMyMoney::Report::ChartType::Bar, eMyMoney::Report::ChartType::StackedBar, eMyMoney::Report::ChartType::Pie, eMyMoney::Report::ChartType::Ring }; + eMyMoney::Report::ChartPalette cp[4] = { eMyMoney::Report::ChartPalette::Application, eMyMoney::Report::ChartPalette::Default, eMyMoney::Report::ChartPalette::Rainbow, eMyMoney::Report::ChartPalette::Subdued }; d->m_currentState.setChartType(ct[d->m_tabChart->ui->m_comboType->currentIndex()]); - + d->m_currentState.setChartPalette(cp[d->m_tabChart->ui->m_comboPalette->currentIndex()]); d->m_currentState.setChartCHGridLines(d->m_tabChart->ui->m_checkCHGridLines->isChecked()); d->m_currentState.setChartSVGridLines(d->m_tabChart->ui->m_checkSVGridLines->isChecked()); d->m_currentState.setChartDataLabels(d->m_tabChart->ui->m_checkValues->isChecked()); @@ -551,6 +552,17 @@ default: throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid charttype"); } + combo = d->m_tabChart->ui->m_comboPalette; + switch (d->m_initialState.chartPalette()) { + case eMyMoney::Report::ChartPalette::Application: + case eMyMoney::Report::ChartPalette::Default: + case eMyMoney::Report::ChartPalette::Rainbow: + case eMyMoney::Report::ChartPalette::Subdued: + combo->setCurrentItem(static_cast(d->m_initialState.chartPalette())); + break; + default: + throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid chartpalette"); + } d->m_tabChart->ui->m_checkCHGridLines->setChecked(d->m_initialState.isChartCHGridLines()); d->m_tabChart->ui->m_checkSVGridLines->setChecked(d->m_initialState.isChartSVGridLines()); d->m_tabChart->ui->m_checkValues->setChecked(d->m_initialState.isChartDataLabels()); diff --git a/kmymoney/plugins/views/reports/reporttabchart.ui b/kmymoney/plugins/views/reports/reporttabchart.ui --- a/kmymoney/plugins/views/reports/reporttabchart.ui +++ b/kmymoney/plugins/views/reports/reporttabchart.ui @@ -62,6 +62,48 @@ + + + + + + + 0 + 0 + + + + <p>Select what form you would like the chart to be drawn as.</p> + + + Chart Palette + + + false + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 121 + 20 + + + + + + diff --git a/kmymoney/plugins/views/reports/reporttabimpl.cpp b/kmymoney/plugins/views/reports/reporttabimpl.cpp --- a/kmymoney/plugins/views/reports/reporttabimpl.cpp +++ b/kmymoney/plugins/views/reports/reporttabimpl.cpp @@ -102,6 +102,11 @@ ui->m_comboType->addItem(i18nc("type of graphic chart", "Ring"), static_cast(eMyMoney::Report::ChartType::Ring)); connect(ui->m_comboType, static_cast(&QComboBox::currentIndexChanged), this, &ReportTabChart::slotChartTypeChanged); emit ui->m_comboType->currentIndexChanged(ui->m_comboType->currentIndex()); + + ui->m_comboPalette->addItem(i18nc("type of graphic palette", "Use application setting"), static_cast(eMyMoney::Report::ChartPalette::Application)); + ui->m_comboPalette->addItem(i18nc("type of graphic palette", "Default"), static_cast(eMyMoney::Report::ChartPalette::Default)); + ui->m_comboPalette->addItem(i18nc("type of graphic palette", "Rainbow"), static_cast(eMyMoney::Report::ChartPalette::Rainbow)); + ui->m_comboPalette->addItem(i18nc("type of graphic palette", "Subdued"), static_cast(eMyMoney::Report::ChartPalette::Subdued)); } ReportTabChart::~ReportTabChart() diff --git a/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp b/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp --- a/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp +++ b/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp @@ -87,7 +87,7 @@ SettlementPeriod, ShowSTLTCapitalGains, TermsSeparator, Pattern, CaseSensitive, RegEx, InvertText, State, From, To, - Validity, + Validity, ChartPalette, // insert new entries above this line LastAttribute }; @@ -173,6 +173,7 @@ {Attribute::Report::Detail, QStringLiteral("detail")}, {Attribute::Report::ColumnsAreDays, QStringLiteral("columnsaredays")}, {Attribute::Report::ChartType, QStringLiteral("charttype")}, + {Attribute::Report::ChartPalette, QStringLiteral("chartpalette")}, {Attribute::Report::ChartCHGridLines, QStringLiteral("chartchgridlines")}, {Attribute::Report::ChartSVGridLines, QStringLiteral("chartsvgridlines")}, {Attribute::Report::ChartDataLabels, QStringLiteral("chartdatalabels")}, @@ -403,6 +404,48 @@ return typeAttributeLUT().key(text, 4); } + QHash chartPaletteLUT() + { + static const QHash lut { + {eMyMoney::Report::ChartPalette::Application, QStringLiteral("appplication")}, + {eMyMoney::Report::ChartPalette::Default, QStringLiteral("default")}, + {eMyMoney::Report::ChartPalette::Rainbow, QStringLiteral("rainbow")}, + {eMyMoney::Report::ChartPalette::Subdued, QStringLiteral("subdued")}, + }; + return lut; + } + + QString reportNames(eMyMoney::Report::ChartPalette textID) + { + return chartPaletteLUT().value(textID); + } + + eMyMoney::Report::ChartPalette stringToChartPalette(const QString &text) + { + return chartPaletteLUT().key(text, eMyMoney::Report::ChartPalette::End); + } + + QHash paletteAttributeLUT() + { + static const QHash lut { + {0, QStringLiteral("application")}, + {1, QStringLiteral("default")}, + {2, QStringLiteral("rainbow")}, + {3, QStringLiteral("subdued")}, + }; + return lut; + } + + QString paletteAttributeToString(int textID) + { + return paletteAttributeLUT().value(textID); + } + + int stringToPaletteAttribute(const QString &text) + { + return paletteAttributeLUT().key(text, 4); + } + QHash stateAttributeLUT() { static const QHash lut { @@ -713,6 +756,12 @@ else report.setChartType(eMyMoney::Report::ChartType::None); + const auto chartPaletteFromXML = stringToChartPalette(node.attribute(attributeName(Attribute::Report::ChartPalette))); + if (chartPaletteFromXML != eMyMoney::Report::ChartPalette::End) + report.setChartPalette(chartPaletteFromXML); + else + report.setChartPalette(eMyMoney::Report::ChartPalette::Application); + report.setChartCHGridLines(node.attribute(attributeName(Attribute::Report::ChartCHGridLines), "1").toUInt()); report.setChartSVGridLines(node.attribute(attributeName(Attribute::Report::ChartSVGridLines), "1").toUInt()); report.setChartDataLabels(node.attribute(attributeName(Attribute::Report::ChartDataLabels), "1").toUInt()); @@ -911,6 +960,7 @@ el.setAttribute(attributeName(Attribute::Report::IncludesUnused), report.isIncludingUnusedAccounts()); el.setAttribute(attributeName(Attribute::Report::ColumnsAreDays), report.isColumnsAreDays()); el.setAttribute(attributeName(Attribute::Report::ChartType), reportNames(report.chartType())); + el.setAttribute(attributeName(Attribute::Report::ChartPalette), reportNames(report.chartPalette())); el.setAttribute(attributeName(Attribute::Report::ChartCHGridLines), report.isChartCHGridLines()); el.setAttribute(attributeName(Attribute::Report::ChartSVGridLines), report.isChartSVGridLines()); el.setAttribute(attributeName(Attribute::Report::ChartDataLabels), report.isChartDataLabels());