File indexing completed on 2024-06-16 04:46:40
0001 /* 0002 SPDX-FileCopyrightText: 2000-2004 Michael Edwardes <mte@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2000-2004 Javier Campos Morales <javi_c@users.sourceforge.net> 0004 SPDX-FileCopyrightText: 2000-2004 Felix Rodriguez <frodriguez@users.sourceforge.net> 0005 SPDX-FileCopyrightText: 2000-2004 John C <thetacoturtle@users.sourceforge.net> 0006 SPDX-FileCopyrightText: 2000-2004 Thomas Baumgart <ipwizard@users.sourceforge.net> 0007 SPDX-FileCopyrightText: 2000-2004 Kevin Tambascio <ktambascio@users.sourceforge.net> 0008 SPDX-FileCopyrightText: 2000-2004 Ace Jones <ace.j@hotpop.com> 0009 SPDX-FileCopyrightText: 2017, 2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com> 0010 SPDX-FileCopyrightText: 2018 Michael Kiefer <Michael-Kiefer@web.de> 0011 SPDX-License-Identifier: GPL-2.0-or-later 0012 */ 0013 0014 #include "kreportconfigurationfilterdlg.h" 0015 0016 // ---------------------------------------------------------------------------- 0017 // QT Includes 0018 0019 #include <QPushButton> 0020 0021 // ---------------------------------------------------------------------------- 0022 // KDE Includes 0023 0024 #include <KHelpClient> 0025 #include <KLocalizedString> 0026 0027 // ---------------------------------------------------------------------------- 0028 // Project Includes 0029 0030 #include "ktransactionfilter.h" 0031 #include "kmymoneyaccountselector.h" 0032 #include "mymoneyfile.h" 0033 #include "mymoneyexception.h" 0034 #include "mymoneybudget.h" 0035 #include "mymoneyreport.h" 0036 #include "daterangedlg.h" 0037 #include "reporttabimpl.h" 0038 #include "mymoneyenums.h" 0039 0040 #include <ui_kreportconfigurationfilterdlg.h> 0041 #include <ui_reporttabgeneral.h> 0042 #include <ui_reporttabrowcolpivot.h> 0043 #include <ui_reporttabrowcolquery.h> 0044 #include <ui_reporttabchart.h> 0045 #include <ui_reporttabrange.h> 0046 #include <ui_reporttabcapitalgain.h> 0047 #include <ui_reporttabperformance.h> 0048 0049 class KReportConfigurationFilterDlgPrivate 0050 { 0051 Q_DISABLE_COPY(KReportConfigurationFilterDlgPrivate) 0052 0053 public: 0054 KReportConfigurationFilterDlgPrivate(KReportConfigurationFilterDlg *qq) : 0055 q_ptr(qq), 0056 ui(new Ui::KReportConfigurationFilterDlg), 0057 m_tabRowColPivot(nullptr), 0058 m_tabRowColQuery(nullptr), 0059 m_tabChart(nullptr), 0060 m_tabRange(nullptr), 0061 m_dateRange(nullptr) 0062 { 0063 } 0064 0065 ~KReportConfigurationFilterDlgPrivate() 0066 { 0067 delete ui; 0068 } 0069 0070 KReportConfigurationFilterDlg *q_ptr; 0071 Ui::KReportConfigurationFilterDlg *ui; 0072 0073 QPointer<ReportTabGeneral> m_tabGeneral; 0074 QPointer<ReportTabRowColPivot> m_tabRowColPivot; 0075 QPointer<ReportTabRowColQuery> m_tabRowColQuery; 0076 QPointer<ReportTabChart> m_tabChart; 0077 QPointer<ReportTabRange> m_tabRange; 0078 QPointer<ReportTabCapitalGain> m_tabCapitalGain; 0079 QPointer<ReportTabPerformance> m_tabPerformance; 0080 QPointer<KTransactionFilter> m_tabFilters; 0081 0082 MyMoneyReport m_initialState; 0083 MyMoneyReport m_currentState; 0084 QVector<MyMoneyBudget> m_budgets; 0085 DateRangeDlg *m_dateRange; 0086 }; 0087 0088 KReportConfigurationFilterDlg::KReportConfigurationFilterDlg(MyMoneyReport report, QWidget *parent) : 0089 QDialog(parent), 0090 d_ptr(new KReportConfigurationFilterDlgPrivate(this)) 0091 { 0092 Q_D(KReportConfigurationFilterDlg); 0093 0094 d->ui->setupUi(this); 0095 d->m_initialState = report; 0096 d->m_currentState = report; 0097 0098 // 0099 // Rework labeling 0100 // 0101 0102 setWindowTitle(i18n("Report Configuration")); 0103 // 0104 // Rework the buttons 0105 // 0106 0107 // the Apply button is always enabled 0108 d->ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); 0109 d->ui->buttonBox->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip for report configuration apply button", "Apply the configuration changes to the report")); 0110 0111 0112 connect(d->ui->buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotSearch); 0113 connect(d->ui->buttonBox->button(QDialogButtonBox::Close), &QAbstractButton::clicked, this, &QDialog::close); 0114 connect(d->ui->buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotReset); 0115 connect(d->ui->buttonBox->button(QDialogButtonBox::Help), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotShowHelp); 0116 0117 // 0118 // Add new tabs 0119 // 0120 if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::PivotTable) { 0121 // we will use date range together with data range 0122 d->m_tabFilters = new KTransactionFilter(this, (report.rowType() == eMyMoney::Report::RowType::Account), true, false); 0123 } else { 0124 d->m_tabFilters = new KTransactionFilter(this, (report.rowType() == eMyMoney::Report::RowType::Account), report.isInvestmentsOnly()); 0125 d->m_dateRange = d->m_tabFilters->dateRange(); 0126 } 0127 0128 d->ui->m_tabWidget->addTab(d->m_tabFilters, i18nc("Filters tab", "Filters")); 0129 0130 d->m_tabGeneral = new ReportTabGeneral(d->ui->m_criteriaTab); 0131 d->ui->m_criteriaTab->insertTab(0, d->m_tabGeneral, i18nc("General tab", "General")); 0132 0133 if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::PivotTable) { 0134 int tabNr = 1; 0135 if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) { 0136 d->m_tabRowColPivot = new ReportTabRowColPivot(d->ui->m_criteriaTab); 0137 d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabRowColPivot, i18n("Rows/Columns")); 0138 connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotRowTypeChanged)); 0139 connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo)); 0140 //control the state of the includeTransfer check 0141 connect(d->m_tabFilters->categoriesView(), &KMyMoneySelector::stateChanged, this, &KReportConfigurationFilterDlg::slotUpdateCheckTransfers); 0142 } 0143 0144 d->m_tabChart = new ReportTabChart(d->ui->m_criteriaTab); 0145 d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabChart, i18n("Chart")); 0146 0147 d->m_tabRange = new ReportTabRange(d->ui->m_criteriaTab); 0148 d->ui->m_criteriaTab->insertTab(tabNr, d->m_tabRange, i18n("Range")); 0149 0150 d->m_dateRange = d->m_tabRange->m_dateRange; 0151 0152 if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) { 0153 connect(d->m_tabRange->ui->m_comboColumns, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, &KReportConfigurationFilterDlg::slotColumnTypeChanged); 0154 connect(d->m_tabRange->ui->m_comboColumns, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo)); 0155 } 0156 connect(d->m_tabChart->ui->m_logYaxis, &QCheckBox::stateChanged, this, &KReportConfigurationFilterDlg::slotLogAxisChanged); 0157 connect(d->m_tabChart->ui->m_negExpenses, &QCheckBox::stateChanged, this, &KReportConfigurationFilterDlg::slotNegExpensesChanged); 0158 } else if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::QueryTable) { 0159 // eInvestmentHoldings is a special-case report, and you cannot configure the 0160 // rows & columns of that report. 0161 if (d->m_initialState.rowType() < eMyMoney::Report::RowType::AccountByTopAccount) { 0162 d->m_tabRowColQuery = new ReportTabRowColQuery(d->ui->m_criteriaTab); 0163 d->ui->m_criteriaTab->insertTab(1, d->m_tabRowColQuery, i18n("Rows/Columns")); 0164 } 0165 if (d->m_initialState.queryColumns() & eMyMoney::Report::QueryColumn::CapitalGain) { 0166 d->m_tabCapitalGain = new ReportTabCapitalGain(d->ui->m_criteriaTab); 0167 d->ui->m_criteriaTab->insertTab(1, d->m_tabCapitalGain, i18n("Report")); 0168 } 0169 if (d->m_initialState.queryColumns() & eMyMoney::Report::QueryColumn::Performance) { 0170 d->m_tabPerformance = new ReportTabPerformance(d->ui->m_criteriaTab); 0171 d->ui->m_criteriaTab->insertTab(1, d->m_tabPerformance, i18n("Report")); 0172 } 0173 } 0174 0175 d->ui->m_criteriaTab->setCurrentIndex(d->ui->m_criteriaTab->indexOf(d->m_tabGeneral)); 0176 d->ui->m_criteriaTab->setMinimumSize(500, 200); 0177 0178 QList<MyMoneyBudget> list = MyMoneyFile::instance()->budgetList(); 0179 QList<MyMoneyBudget>::const_iterator it_b; 0180 for (it_b = list.constBegin(); it_b != list.constEnd(); ++it_b) { 0181 d->m_budgets.push_back(*it_b); 0182 } 0183 0184 // 0185 // Now set up the widgets with proper values 0186 // 0187 slotReset(); 0188 } 0189 0190 KReportConfigurationFilterDlg::~KReportConfigurationFilterDlg() 0191 { 0192 } 0193 0194 MyMoneyReport KReportConfigurationFilterDlg::getConfig() const 0195 { 0196 Q_D(const KReportConfigurationFilterDlg); 0197 return d->m_currentState; 0198 } 0199 0200 void KReportConfigurationFilterDlg::slotSearch() 0201 { 0202 Q_D(KReportConfigurationFilterDlg); 0203 // setup the filter from the dialog widgets 0204 auto filter = d->m_tabFilters->setupFilter(); 0205 0206 // Copy the m_filter over to the filter part of m_currentConfig. 0207 d->m_currentState.assignFilter(filter); 0208 0209 // Then extract the report properties 0210 d->m_currentState.setName(d->m_tabGeneral->ui->m_editName->text()); 0211 d->m_currentState.setComment(d->m_tabGeneral->ui->m_editComment->text()); 0212 d->m_currentState.setConvertCurrency(d->m_tabGeneral->ui->m_checkCurrency->isChecked()); 0213 d->m_currentState.setFavorite(d->m_tabGeneral->ui->m_checkFavorite->isChecked()); 0214 d->m_currentState.setSkipZero(d->m_tabGeneral->ui->m_skipZero->isChecked()); 0215 0216 if (d->m_tabRowColPivot) { 0217 eMyMoney::Report::DetailLevel dl[4] = { eMyMoney::Report::DetailLevel::All, eMyMoney::Report::DetailLevel::Top, eMyMoney::Report::DetailLevel::Group, eMyMoney::Report::DetailLevel::Total }; 0218 0219 d->m_currentState.setDetailLevel(dl[d->m_tabRowColPivot->ui->m_comboDetail->currentIndex()]); 0220 0221 // modify the rowtype only if the widget is enabled 0222 if (d->m_tabRowColPivot->ui->m_comboRows->isEnabled()) { 0223 eMyMoney::Report::RowType rt[2] = { eMyMoney::Report::RowType::ExpenseIncome, eMyMoney::Report::RowType::AssetLiability }; 0224 d->m_currentState.setRowType(rt[d->m_tabRowColPivot->ui->m_comboRows->currentIndex()]); 0225 } 0226 0227 d->m_currentState.setShowingRowTotals(false); 0228 if (d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == 0) 0229 d->m_currentState.setShowingRowTotals(d->m_tabRowColPivot->ui->m_checkTotalColumn->isChecked()); 0230 0231 d->m_currentState.setShowingColumnTotals(d->m_tabRowColPivot->ui->m_checkTotalRow->isChecked()); 0232 d->m_currentState.setIncludingSchedules(d->m_tabRowColPivot->ui->m_checkScheduled->isChecked()); 0233 d->m_currentState.setPropagateBudgetDifference(d->m_tabRowColPivot->ui->m_propagateRemainder->isChecked()); 0234 d->m_currentState.setIncludingTransfers(d->m_tabRowColPivot->ui->m_checkTransfers->isChecked()); 0235 0236 d->m_currentState.setIncludingUnusedAccounts(d->m_tabRowColPivot->ui->m_checkUnused->isChecked()); 0237 0238 if (d->m_tabRowColPivot->ui->m_comboBudget->isEnabled() && (d->m_budgets.count() > 0)) { 0239 d->m_currentState.setBudget(d->m_budgets[d->m_tabRowColPivot->ui->m_comboBudget->currentItem()].id(), d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual); 0240 } else { 0241 d->m_currentState.setBudget(QString(), false); 0242 } 0243 0244 //set moving average days 0245 if (d->m_tabRowColPivot->ui->m_movingAverageDays->isEnabled()) { 0246 d->m_currentState.setMovingAverageDays(d->m_tabRowColPivot->ui->m_movingAverageDays->value()); 0247 } 0248 } else if (d->m_tabRowColQuery) { 0249 eMyMoney::Report::RowType rtq[8] = { eMyMoney::Report::RowType::Category, eMyMoney::Report::RowType::TopCategory, eMyMoney::Report::RowType::Tag, eMyMoney::Report::RowType::Payee, eMyMoney::Report::RowType::Account, eMyMoney::Report::RowType::TopAccount, eMyMoney::Report::RowType::Month, eMyMoney::Report::RowType::Week, }; 0250 d->m_currentState.setRowType(rtq[d->m_tabRowColQuery->ui->m_comboOrganizeBy->currentIndex()]); 0251 0252 unsigned qc = eMyMoney::Report::QueryColumn::None; 0253 0254 if (d->m_currentState.queryColumns() & eMyMoney::Report::QueryColumn::Loan) 0255 // once a loan report, always a loan report 0256 qc = eMyMoney::Report::QueryColumn::Loan; 0257 0258 if (d->m_tabRowColQuery->ui->m_checkNumber->isChecked()) 0259 qc |= eMyMoney::Report::QueryColumn::Number; 0260 if (d->m_tabRowColQuery->ui->m_checkPayee->isChecked()) 0261 qc |= eMyMoney::Report::QueryColumn::Payee; 0262 if (d->m_tabRowColQuery->ui->m_checkTag->isChecked()) 0263 qc |= eMyMoney::Report::QueryColumn::Tag; 0264 if (d->m_tabRowColQuery->ui->m_checkCategory->isChecked()) 0265 qc |= eMyMoney::Report::QueryColumn::Category; 0266 if (d->m_tabRowColQuery->ui->m_checkMemo->isChecked()) 0267 qc |= eMyMoney::Report::QueryColumn::Memo; 0268 if (d->m_tabRowColQuery->ui->m_checkAccount->isChecked()) 0269 qc |= eMyMoney::Report::QueryColumn::Account; 0270 if (d->m_tabRowColQuery->ui->m_checkReconciled->isChecked()) 0271 qc |= eMyMoney::Report::QueryColumn::Reconciled; 0272 if (d->m_tabRowColQuery->ui->m_checkAction->isChecked()) 0273 qc |= eMyMoney::Report::QueryColumn::Action; 0274 if (d->m_tabRowColQuery->ui->m_checkShares->isChecked()) 0275 qc |= eMyMoney::Report::QueryColumn::Shares; 0276 if (d->m_tabRowColQuery->ui->m_checkPrice->isChecked()) 0277 qc |= eMyMoney::Report::QueryColumn::Price; 0278 if (d->m_tabRowColQuery->ui->m_checkBalance->isChecked()) 0279 qc |= eMyMoney::Report::QueryColumn::Balance; 0280 0281 d->m_currentState.setQueryColumns(static_cast<eMyMoney::Report::QueryColumn>(qc)); 0282 0283 d->m_currentState.setTax(d->m_tabRowColQuery->ui->m_checkTax->isChecked()); 0284 d->m_currentState.setInvestmentsOnly(d->m_tabRowColQuery->ui->m_checkInvestments->isChecked()); 0285 d->m_currentState.setLoansOnly(d->m_tabRowColQuery->ui->m_checkLoans->isChecked()); 0286 0287 d->m_currentState.setDetailLevel(d->m_tabRowColQuery->ui->m_checkHideSplitDetails->isChecked() ? 0288 eMyMoney::Report::DetailLevel::None : eMyMoney::Report::DetailLevel::All); 0289 d->m_currentState.setHideTransactions(d->m_tabRowColQuery->ui->m_checkHideTransactions->isChecked()); 0290 d->m_currentState.setShowingColumnTotals(!d->m_tabRowColQuery->ui->m_checkHideTotals->isChecked()); 0291 0292 d->m_currentState.setIncludingTransfers(d->m_tabRowColQuery->ui->m_checkTransfers->isChecked()); 0293 } 0294 0295 if (d->m_tabChart) { 0296 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 }; 0297 eMyMoney::Report::ChartPalette cp[4] = { eMyMoney::Report::ChartPalette::Application, eMyMoney::Report::ChartPalette::Default, eMyMoney::Report::ChartPalette::Rainbow, eMyMoney::Report::ChartPalette::Subdued }; 0298 d->m_currentState.setChartType(ct[d->m_tabChart->ui->m_comboType->currentIndex()]); 0299 d->m_currentState.setChartPalette(cp[d->m_tabChart->ui->m_comboPalette->currentIndex()]); 0300 d->m_currentState.setChartCHGridLines(d->m_tabChart->ui->m_checkCHGridLines->isChecked()); 0301 d->m_currentState.setChartSVGridLines(d->m_tabChart->ui->m_checkSVGridLines->isChecked()); 0302 d->m_currentState.setChartDataLabels(d->m_tabChart->ui->m_checkValues->isChecked()); 0303 d->m_currentState.setChartByDefault(d->m_tabChart->ui->m_checkShowChart->isChecked()); 0304 d->m_currentState.setChartLineWidth(d->m_tabChart->ui->m_lineWidth->value()); 0305 d->m_currentState.setLogYAxis(d->m_tabChart->ui->m_logYaxis->isChecked()); 0306 d->m_currentState.setNegExpenses(d->m_tabChart->ui->m_negExpenses->isChecked()); 0307 } 0308 0309 if (d->m_tabRange) { 0310 d->m_currentState.setDataRangeStart(d->m_tabRange->ui->m_dataRangeStart->text()); 0311 d->m_currentState.setDataRangeEnd(d->m_tabRange->ui->m_dataRangeEnd->text()); 0312 d->m_currentState.setDataMajorTick(d->m_tabRange->ui->m_dataMajorTick->text()); 0313 d->m_currentState.setDataMinorTick(d->m_tabRange->ui->m_dataMinorTick->text()); 0314 d->m_currentState.setYLabelsPrecision(d->m_tabRange->ui->m_yLabelsPrecision->value()); 0315 d->m_currentState.setDataFilter((eMyMoney::Report::DataLock)d->m_tabRange->ui->m_dataLock->currentIndex()); 0316 0317 eMyMoney::Report::ColumnType ct[6] = { eMyMoney::Report::ColumnType::Days, eMyMoney::Report::ColumnType::Weeks, eMyMoney::Report::ColumnType::Months, eMyMoney::Report::ColumnType::BiMonths, eMyMoney::Report::ColumnType::Quarters, eMyMoney::Report::ColumnType::Years, }; 0318 bool dy[6] = { true, true, false, false, false, false }; 0319 d->m_currentState.setColumnType(ct[d->m_tabRange->ui->m_comboColumns->currentIndex()]); 0320 0321 //TODO (Ace) This should be implicit in the call above. MMReport needs fixin' 0322 d->m_currentState.setColumnsAreDays(dy[d->m_tabRange->ui->m_comboColumns->currentIndex()]); 0323 d->m_currentState.setDateFilter(d->m_dateRange->fromDate(), d->m_dateRange->toDate()); 0324 } 0325 0326 // setup the date lock 0327 eMyMoney::TransactionFilter::Date range = d->m_dateRange->dateRange(); 0328 d->m_currentState.setDateFilter(range); 0329 0330 if (d->m_tabCapitalGain) { 0331 d->m_currentState.setTermSeparator(d->m_tabCapitalGain->ui->m_termSeparator->date()); 0332 d->m_currentState.setShowSTLTCapitalGains(d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->isChecked()); 0333 d->m_currentState.setSettlementPeriod(d->m_tabCapitalGain->ui->m_settlementPeriod->value()); 0334 d->m_currentState.setShowingColumnTotals(!d->m_tabCapitalGain->ui->m_checkHideTotals->isChecked()); 0335 d->m_currentState.setInvestmentSum(static_cast<eMyMoney::Report::InvestmentSum>(d->m_tabCapitalGain->ui->m_investmentSum->currentData().toInt())); 0336 } 0337 0338 if (d->m_tabPerformance) { 0339 d->m_currentState.setShowingColumnTotals(!d->m_tabPerformance->ui->m_checkHideTotals->isChecked()); 0340 d->m_currentState.setInvestmentSum(static_cast<eMyMoney::Report::InvestmentSum>(d->m_tabPerformance->ui->m_investmentSum->currentData().toInt())); 0341 } 0342 0343 done(true); 0344 } 0345 0346 void KReportConfigurationFilterDlg::slotRowTypeChanged(int row) 0347 { 0348 Q_D(KReportConfigurationFilterDlg); 0349 d->m_tabRowColPivot->ui->m_checkTotalColumn->setEnabled(row == 0); 0350 } 0351 0352 void KReportConfigurationFilterDlg::slotColumnTypeChanged(int row) 0353 { 0354 Q_D(KReportConfigurationFilterDlg); 0355 if ((d->m_tabRowColPivot->ui->m_comboBudget->isEnabled() && row < 2)) { 0356 d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); 0357 } 0358 } 0359 0360 void KReportConfigurationFilterDlg::slotUpdateColumnsCombo() 0361 { 0362 Q_D(KReportConfigurationFilterDlg); 0363 const int monthlyIndex = 2; 0364 const int incomeExpenseIndex = 0; 0365 const bool isIncomeExpenseForecast = d->m_currentState.isIncludingForecast() && d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == incomeExpenseIndex; 0366 if (isIncomeExpenseForecast && d->m_tabRange->ui->m_comboColumns->currentIndex() != monthlyIndex) { 0367 d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); 0368 } 0369 } 0370 0371 void KReportConfigurationFilterDlg::slotUpdateColumnsCombo(int) 0372 { 0373 slotUpdateColumnsCombo(); 0374 } 0375 0376 void KReportConfigurationFilterDlg::slotLogAxisChanged(int state) 0377 { 0378 Q_D(KReportConfigurationFilterDlg); 0379 if (state == Qt::Checked) 0380 d->m_tabRange->setRangeLogarythmic(true); 0381 else 0382 d->m_tabRange->setRangeLogarythmic(false); 0383 } 0384 0385 void KReportConfigurationFilterDlg::slotNegExpensesChanged(int state) 0386 { 0387 Q_D(KReportConfigurationFilterDlg); 0388 d->m_tabChart->setNegExpenses(state == Qt::Checked); 0389 } 0390 0391 void KReportConfigurationFilterDlg::slotReset() 0392 { 0393 Q_D(KReportConfigurationFilterDlg); 0394 // 0395 // Set up the widget from the initial filter 0396 // 0397 d->m_currentState = d->m_initialState; 0398 0399 // 0400 // Report Properties 0401 // 0402 0403 d->m_tabGeneral->ui->m_editName->setText(d->m_initialState.name()); 0404 d->m_tabGeneral->ui->m_editComment->setText(d->m_initialState.comment()); 0405 d->m_tabGeneral->ui->m_checkCurrency->setChecked(d->m_initialState.isConvertCurrency()); 0406 d->m_tabGeneral->ui->m_checkFavorite->setChecked(d->m_initialState.isFavorite()); 0407 0408 if (d->m_initialState.isIncludingPrice() || d->m_initialState.isSkippingZero()) { 0409 d->m_tabGeneral->ui->m_skipZero->setChecked(d->m_initialState.isSkippingZero()); 0410 } else { 0411 d->m_tabGeneral->ui->m_skipZero->setEnabled(false); 0412 } 0413 0414 if (d->m_tabRowColPivot) { 0415 KComboBox *combo = d->m_tabRowColPivot->ui->m_comboDetail; 0416 switch (d->m_initialState.detailLevel()) { 0417 case eMyMoney::Report::DetailLevel::None: 0418 case eMyMoney::Report::DetailLevel::End: 0419 case eMyMoney::Report::DetailLevel::All: 0420 combo->setCurrentItem(i18nc("All accounts", "All"), false); 0421 break; 0422 case eMyMoney::Report::DetailLevel::Top: 0423 combo->setCurrentItem(i18n("Top-Level"), false); 0424 break; 0425 case eMyMoney::Report::DetailLevel::Group: 0426 combo->setCurrentItem(i18n("Groups"), false); 0427 break; 0428 case eMyMoney::Report::DetailLevel::Total: 0429 combo->setCurrentItem(i18n("Totals"), false); 0430 break; 0431 } 0432 0433 combo = d->m_tabRowColPivot->ui->m_comboRows; 0434 switch (d->m_initialState.rowType()) { 0435 case eMyMoney::Report::RowType::ExpenseIncome: 0436 case eMyMoney::Report::RowType::Budget: 0437 case eMyMoney::Report::RowType::BudgetActual: 0438 combo->setCurrentItem(i18n("Income & Expenses"), false); // income / expense 0439 break; 0440 default: 0441 combo->setCurrentItem(i18n("Assets & Liabilities"), false); // asset / liability 0442 break; 0443 } 0444 d->m_tabRowColPivot->ui->m_checkTotalColumn->setChecked(d->m_initialState.isShowingRowTotals()); 0445 d->m_tabRowColPivot->ui->m_checkTotalRow->setChecked(d->m_initialState.isShowingColumnTotals()); 0446 d->m_tabRowColPivot->ui->m_propagateRemainder->setEnabled(d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual); 0447 d->m_tabRowColPivot->ui->m_propagateRemainder->setChecked(d->m_initialState.isPropagateBudgetDifference()); 0448 d->m_tabRowColPivot->ui->m_checkTotalRow->setDisabled(d->m_initialState.isPropagateBudgetDifference()); 0449 0450 connect(d->m_tabRowColPivot->ui->m_propagateRemainder, &QCheckBox::stateChanged, this, [&](int _state) { 0451 Q_D(KReportConfigurationFilterDlg); 0452 const auto state = static_cast<Qt::CheckState>(_state); 0453 d->m_tabRowColPivot->ui->m_checkTotalColumn->setDisabled(state == Qt::Checked); 0454 switch (state) { 0455 case Qt::Checked: 0456 d->m_tabRowColPivot->ui->m_checkTotalColumn->setChecked(false); 0457 break; 0458 default: 0459 break; 0460 } 0461 }); 0462 0463 slotRowTypeChanged(combo->currentIndex()); 0464 0465 //load budgets combo 0466 d->m_tabRowColPivot->ui->m_comboBudget->setDisabled(true); 0467 if (d->m_initialState.rowType() == eMyMoney::Report::RowType::Budget 0468 || d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual) { 0469 d->m_tabRowColPivot->ui->m_comboBudget->setEnabled(true); 0470 d->m_tabRowColPivot->ui->m_comboRows->setEnabled(false); 0471 d->m_tabRowColPivot->ui->m_rowsLabel->setEnabled(false); 0472 d->m_tabRowColPivot->ui->m_budgetFrame->setEnabled(!d->m_budgets.empty()); 0473 auto i = 0; 0474 for (QVector<MyMoneyBudget>::const_iterator it_b = d->m_budgets.constBegin(); it_b != d->m_budgets.constEnd(); ++it_b) { 0475 d->m_tabRowColPivot->ui->m_comboBudget->insertItem((*it_b).name(), i); 0476 //set the current selected item 0477 if ((d->m_initialState.budget() == "Any" && (*it_b).budgetStart().year() == QDate::currentDate().year()) 0478 || d->m_initialState.budget() == (*it_b).id()) 0479 d->m_tabRowColPivot->ui->m_comboBudget->setCurrentItem(i); 0480 i++; 0481 } 0482 } 0483 0484 //set moving average days spinbox 0485 QSpinBox *spinbox = d->m_tabRowColPivot->ui->m_movingAverageDays; 0486 spinbox->setEnabled(d->m_initialState.isIncludingMovingAverage()); 0487 d->m_tabRowColPivot->ui->m_movingAverageLabel->setEnabled(d->m_initialState.isIncludingMovingAverage()); 0488 0489 if (d->m_initialState.isIncludingMovingAverage()) { 0490 spinbox->setValue(d->m_initialState.movingAverageDays()); 0491 } 0492 0493 d->m_tabRowColPivot->ui->m_checkScheduled->setChecked(d->m_initialState.isIncludingSchedules()); 0494 d->m_tabRowColPivot->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers()); 0495 d->m_tabRowColPivot->ui->m_checkUnused->setChecked(d->m_initialState.isIncludingUnusedAccounts()); 0496 } else if (d->m_tabRowColQuery) { 0497 KComboBox *combo = d->m_tabRowColQuery->ui->m_comboOrganizeBy; 0498 switch (d->m_initialState.rowType()) { 0499 case eMyMoney::Report::RowType::NoRows: 0500 case eMyMoney::Report::RowType::Category: 0501 combo->setCurrentItem(i18n("Categories"), false); 0502 break; 0503 case eMyMoney::Report::RowType::TopCategory: 0504 combo->setCurrentItem(i18n("Top Categories"), false); 0505 break; 0506 case eMyMoney::Report::RowType::Tag: 0507 combo->setCurrentItem(i18n("Tags"), false); 0508 break; 0509 case eMyMoney::Report::RowType::Payee: 0510 combo->setCurrentItem(i18n("Payees"), false); 0511 break; 0512 case eMyMoney::Report::RowType::Account: 0513 combo->setCurrentItem(i18n("Accounts"), false); 0514 break; 0515 case eMyMoney::Report::RowType::TopAccount: 0516 combo->setCurrentItem(i18n("Top Accounts"), false); 0517 break; 0518 case eMyMoney::Report::RowType::Month: 0519 combo->setCurrentItem(i18n("Month"), false); 0520 break; 0521 case eMyMoney::Report::RowType::Week: 0522 combo->setCurrentItem(i18n("Week"), false); 0523 break; 0524 default: 0525 throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): QueryTable report has invalid rowtype"); 0526 } 0527 0528 unsigned qc = d->m_initialState.queryColumns(); 0529 d->m_tabRowColQuery->ui->m_checkNumber->setChecked(qc & eMyMoney::Report::QueryColumn::Number); 0530 d->m_tabRowColQuery->ui->m_checkPayee->setChecked(qc & eMyMoney::Report::QueryColumn::Payee); 0531 d->m_tabRowColQuery->ui->m_checkTag->setChecked(qc & eMyMoney::Report::QueryColumn::Tag); 0532 d->m_tabRowColQuery->ui->m_checkCategory->setChecked(qc & eMyMoney::Report::QueryColumn::Category); 0533 d->m_tabRowColQuery->ui->m_checkMemo->setChecked(qc & eMyMoney::Report::QueryColumn::Memo); 0534 d->m_tabRowColQuery->ui->m_checkAccount->setChecked(qc & eMyMoney::Report::QueryColumn::Account); 0535 d->m_tabRowColQuery->ui->m_checkReconciled->setChecked(qc & eMyMoney::Report::QueryColumn::Reconciled); 0536 d->m_tabRowColQuery->ui->m_checkAction->setChecked(qc & eMyMoney::Report::QueryColumn::Action); 0537 d->m_tabRowColQuery->ui->m_checkShares->setChecked(qc & eMyMoney::Report::QueryColumn::Shares); 0538 d->m_tabRowColQuery->ui->m_checkPrice->setChecked(qc & eMyMoney::Report::QueryColumn::Price); 0539 d->m_tabRowColQuery->ui->m_checkBalance->setChecked(qc & eMyMoney::Report::QueryColumn::Balance); 0540 0541 d->m_tabRowColQuery->ui->m_checkTax->setChecked(d->m_initialState.isTax()); 0542 d->m_tabRowColQuery->ui->m_checkInvestments->setChecked(d->m_initialState.isInvestmentsOnly()); 0543 d->m_tabRowColQuery->ui->m_checkLoans->setChecked(d->m_initialState.isLoansOnly()); 0544 0545 d->m_tabRowColQuery->ui->m_checkHideTransactions->setChecked(d->m_initialState.isHideTransactions()); 0546 d->m_tabRowColQuery->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals()); 0547 d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setEnabled(!d->m_initialState.isHideTransactions()); 0548 0549 d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setChecked 0550 (d->m_initialState.detailLevel() == eMyMoney::Report::DetailLevel::None || d->m_initialState.isHideTransactions()); 0551 d->m_tabRowColQuery->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers()); 0552 } 0553 0554 if (d->m_tabChart) { 0555 KMyMoneyGeneralCombo* combo = d->m_tabChart->ui->m_comboType; 0556 switch (d->m_initialState.chartType()) { 0557 case eMyMoney::Report::ChartType::None: 0558 combo->setCurrentItem(static_cast<int>(eMyMoney::Report::ChartType::Line)); 0559 break; 0560 case eMyMoney::Report::ChartType::Line: 0561 case eMyMoney::Report::ChartType::Bar: 0562 case eMyMoney::Report::ChartType::StackedBar: 0563 case eMyMoney::Report::ChartType::Pie: 0564 case eMyMoney::Report::ChartType::Ring: 0565 combo->setCurrentItem(static_cast<int>(d->m_initialState.chartType())); 0566 break; 0567 default: 0568 throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid charttype"); 0569 } 0570 combo = d->m_tabChart->ui->m_comboPalette; 0571 switch (d->m_initialState.chartPalette()) { 0572 case eMyMoney::Report::ChartPalette::Application: 0573 case eMyMoney::Report::ChartPalette::Default: 0574 case eMyMoney::Report::ChartPalette::Rainbow: 0575 case eMyMoney::Report::ChartPalette::Subdued: 0576 combo->setCurrentItem(static_cast<int>(d->m_initialState.chartPalette())); 0577 break; 0578 default: 0579 throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid chartpalette"); 0580 } 0581 d->m_tabChart->ui->m_checkCHGridLines->setChecked(d->m_initialState.isChartCHGridLines()); 0582 d->m_tabChart->ui->m_checkSVGridLines->setChecked(d->m_initialState.isChartSVGridLines()); 0583 d->m_tabChart->ui->m_checkValues->setChecked(d->m_initialState.isChartDataLabels()); 0584 d->m_tabChart->ui->m_checkShowChart->setChecked(d->m_initialState.isChartByDefault()); 0585 d->m_tabChart->ui->m_lineWidth->setValue(d->m_initialState.chartLineWidth()); 0586 d->m_tabChart->ui->m_logYaxis->setChecked(d->m_initialState.isLogYAxis()); 0587 d->m_tabChart->ui->m_negExpenses->setChecked(d->m_initialState.isNegExpenses()); 0588 } 0589 0590 if (d->m_tabRange) { 0591 d->m_tabRange->ui->m_dataRangeStart->setText(d->m_initialState.dataRangeStart()); 0592 d->m_tabRange->ui->m_dataRangeEnd->setText(d->m_initialState.dataRangeEnd()); 0593 d->m_tabRange->ui->m_dataMajorTick->setText(d->m_initialState.dataMajorTick()); 0594 d->m_tabRange->ui->m_dataMinorTick->setText(d->m_initialState.dataMinorTick()); 0595 d->m_tabRange->ui->m_yLabelsPrecision->setValue(d->m_initialState.yLabelsPrecision()); 0596 d->m_tabRange->ui->m_dataLock->setCurrentIndex((int)d->m_initialState.dataFilter()); 0597 0598 KComboBox *combo = d->m_tabRange->ui->m_comboColumns; 0599 if (d->m_initialState.isColumnsAreDays()) { 0600 switch (d->m_initialState.columnType()) { 0601 case eMyMoney::Report::ColumnType::NoColumns: 0602 case eMyMoney::Report::ColumnType::Days: 0603 combo->setCurrentItem(i18nc("@item the columns will display daily data", "Daily"), false); 0604 break; 0605 case eMyMoney::Report::ColumnType::Weeks: 0606 combo->setCurrentItem(i18nc("@item the columns will display weekly data", "Weekly"), false); 0607 break; 0608 default: 0609 break; 0610 } 0611 } else { 0612 switch (d->m_initialState.columnType()) { 0613 case eMyMoney::Report::ColumnType::NoColumns: 0614 case eMyMoney::Report::ColumnType::Months: 0615 combo->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); 0616 break; 0617 case eMyMoney::Report::ColumnType::BiMonths: 0618 combo->setCurrentItem(i18nc("@item the columns will display bi-monthly data", "Bi-Monthly"), false); 0619 break; 0620 case eMyMoney::Report::ColumnType::Quarters: 0621 combo->setCurrentItem(i18nc("@item the columns will display quarterly data", "Quarterly"), false); 0622 break; 0623 case eMyMoney::Report::ColumnType::Years: 0624 combo->setCurrentItem(i18nc("@item the columns will display yearly data", "Yearly"), false); 0625 break; 0626 default: 0627 break; 0628 } 0629 } 0630 } 0631 0632 if (d->m_tabCapitalGain) { 0633 d->m_tabCapitalGain->ui->m_termSeparator->setDate(d->m_initialState.termSeparator()); 0634 d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->setChecked(d->m_initialState.isShowingSTLTCapitalGains()); 0635 d->m_tabCapitalGain->ui->m_settlementPeriod->setValue(d->m_initialState.settlementPeriod()); 0636 d->m_tabCapitalGain->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals()); 0637 d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(true); 0638 d->m_tabCapitalGain->ui->m_investmentSum->clear(); 0639 d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only owned"), static_cast<int>(eMyMoney::Report::InvestmentSum::Owned)); 0640 d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::Sold)); 0641 d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(false); 0642 d->m_tabCapitalGain->ui->m_investmentSum->setCurrentIndex(d->m_tabCapitalGain->ui->m_investmentSum->findData(static_cast<int>(d->m_initialState.investmentSum()))); 0643 } 0644 0645 if (d->m_tabPerformance) { 0646 d->m_tabPerformance->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals()); 0647 d->m_tabPerformance->ui->m_investmentSum->blockSignals(true); 0648 d->m_tabPerformance->ui->m_investmentSum->clear(); 0649 d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("From period"), static_cast<int>(eMyMoney::Report::InvestmentSum::Period)); 0650 d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Owned and sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::OwnedAndSold)); 0651 d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only owned"), static_cast<int>(eMyMoney::Report::InvestmentSum::Owned)); 0652 d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::Sold)); 0653 d->m_tabPerformance->ui->m_investmentSum->blockSignals(false); 0654 d->m_tabPerformance->ui->m_investmentSum->setCurrentIndex(d->m_tabPerformance->ui->m_investmentSum->findData(static_cast<int>(d->m_initialState.investmentSum()))); 0655 } 0656 0657 d->m_tabFilters->resetFilter(d->m_initialState); 0658 0659 if (d->m_dateRange) { 0660 d->m_initialState.updateDateFilter(); 0661 QDate dateFrom, dateTo; 0662 if (d->m_initialState.dateFilter(dateFrom, dateTo)) { 0663 if (d->m_initialState.isDateUserDefined()) { 0664 d->m_dateRange->setDateRange(dateFrom, dateTo); 0665 } else { 0666 d->m_dateRange->setDateRange(d->m_initialState.dateRange()); 0667 } 0668 } else { 0669 d->m_dateRange->setDateRange(eMyMoney::TransactionFilter::Date::All); 0670 } 0671 } 0672 } 0673 0674 void KReportConfigurationFilterDlg::slotShowHelp() 0675 { 0676 Q_D(KReportConfigurationFilterDlg); 0677 if (d->ui->m_tabWidget->currentIndex() == 1) 0678 d->m_tabFilters->slotShowHelp(); 0679 else 0680 KHelpClient::invokeHelp("details.reports.config"); 0681 } 0682 0683 //TODO Fix the reports and engine to include transfers even if categories are filtered - bug #1523508 0684 void KReportConfigurationFilterDlg::slotUpdateCheckTransfers() 0685 { 0686 Q_D(KReportConfigurationFilterDlg); 0687 auto cb = d->m_tabRowColPivot->ui->m_checkTransfers; 0688 if (!d->m_tabFilters->categoriesView()->allItemsSelected()) { 0689 cb->setChecked(false); 0690 cb->setDisabled(true); 0691 } else { 0692 cb->setEnabled(true); 0693 } 0694 }