diff options
| -rw-r--r-- | cashflow.cpp | 72 | ||||
| -rw-r--r-- | cashflow.h | 2 | ||||
| -rw-r--r-- | cashflow.ui | 10 |
3 files changed, 84 insertions, 0 deletions
diff --git a/cashflow.cpp b/cashflow.cpp index a8b6a5a..f5f8211 100644 --- a/cashflow.cpp +++ b/cashflow.cpp @@ -15,6 +15,8 @@ #include <QFile> #include <QTextStream> #include <QFileInfo> +#include <QSignalBlocker> +#include <limits> CashFlow::CashFlow(QWidget *parent) : QMainWindow(parent) @@ -197,6 +199,7 @@ void CashFlow::setupConnections() { connect(ui->searchEdit, &QLineEdit::textChanged, this, &CashFlow::onSearchTextChanged); connect(ui->collapseAllBtn, &QPushButton::clicked, this, &CashFlow::onCollapseAll); connect(ui->expandAllBtn, &QPushButton::clicked, this, &CashFlow::onExpandAll); + connect(ui->jumpTodayBtn, &QPushButton::clicked, this, &CashFlow::onJumpToToday); connect(ui->transactionTable, &QTableWidget::cellDoubleClicked, this, &CashFlow::onTransactionTableDoubleClicked); // Auto-save period and show balances settings @@ -453,6 +456,7 @@ void CashFlow::refreshTransactionTable() { // Store ID in first column's data for retrieval later QTableWidgetItem *dateItem = new QTableWidgetItem(t.date.toString("MM/dd/yy")); dateItem->setData(Qt::UserRole, t.id); + dateItem->setData(Qt::UserRole + 2, t.date.toString(Qt::ISODate)); dateItem->setFlags(dateItem->flags() & ~Qt::ItemIsEditable); ui->transactionTable->setItem(row, 0, dateItem); @@ -1185,6 +1189,74 @@ void CashFlow::onDateRangeChanged() { refreshView(); } +void CashFlow::onJumpToToday() { + QDate today = QDate::currentDate(); + QDate currentFrom = ui->dateFromEdit->date(); + QDate currentTo = ui->dateToEdit->date(); + bool rangeChanged = false; + + if (today < currentFrom || today > currentTo) { + PeriodType periodType = static_cast<PeriodType>(ui->periodCombo->currentIndex()); + QDate periodStart = getPeriodStart(today, periodType); + QDate periodEnd = getPeriodEnd(today, periodType); + + QSignalBlocker blockFrom(ui->dateFromEdit); + QSignalBlocker blockTo(ui->dateToEdit); + + ui->dateFromEdit->setDate(periodStart); + ui->dateToEdit->setDate(periodEnd); + rangeChanged = true; + } + + if (rangeChanged) { + onDateRangeChanged(); + } + + jumpToDateInTable(today); +} + +void CashFlow::jumpToDateInTable(const QDate &date) { + qDebug() << "[JumpToToday] Target date:" << date.toString(Qt::ISODate); + int rowCount = ui->transactionTable->rowCount(); + int targetRow = -1; + int bestDistance = std::numeric_limits<int>::max(); + + for (int row = 0; row < rowCount; ++row) { + QTableWidgetItem *dateItem = ui->transactionTable->item(row, 0); + if (!dateItem) continue; + if (dateItem->data(Qt::UserRole).toInt() == -1) continue; // Skip period rows + + QString rawDateText = dateItem->text(); + QString isoDateText = dateItem->data(Qt::UserRole + 2).toString(); + QDate rowDate = QDate::fromString(isoDateText, Qt::ISODate); + if (!rowDate.isValid()) { + qDebug() << "[JumpToToday] Skipping row" << row << "invalid date text:" << rawDateText; + continue; + } + + int distance = qAbs(rowDate.daysTo(date)); + if (distance < bestDistance) { + bestDistance = distance; + targetRow = row; + qDebug() << "[JumpToToday] Candidate row" << row + << "date" << rowDate.toString(Qt::ISODate) + << "distance" << distance; + if (distance == 0) { + break; + } + } + } + + if (targetRow != -1) { + qDebug() << "[JumpToToday] Selected row" << targetRow + << "distance" << bestDistance; + ui->transactionTable->setCurrentCell(targetRow, 0); + ui->transactionTable->scrollToItem(ui->transactionTable->item(targetRow, 0), QAbstractItemView::PositionAtCenter); + } else { + qDebug() << "[JumpToToday] No valid transaction rows found."; + } +} + void CashFlow::onPeriodChanged() { refreshView(); } @@ -51,6 +51,7 @@ private slots: void onSearchTextChanged(); void onCollapseAll(); void onExpandAll(); + void onJumpToToday(); void onTransactionTableDoubleClicked(int row, int column); private: @@ -97,5 +98,6 @@ private: void populateRecurringRulesCombo(); void updateOccurrenceKey(); QString generateOccurrenceKey(const QDate &date, RecurrenceFrequency frequency) const; + void jumpToDateInTable(const QDate &date); }; #endif // CASHFLOW_H diff --git a/cashflow.ui b/cashflow.ui index 14d4562..3bed492 100644 --- a/cashflow.ui +++ b/cashflow.ui @@ -119,6 +119,16 @@ </property> </widget> </item> + <item> + <widget class="QPushButton" name="jumpTodayBtn"> + <property name="text"> + <string>Today</string> + </property> + <property name="toolTip"> + <string>Jump the view to today's date</string> + </property> + </widget> + </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> |
