aboutsummaryrefslogtreecommitdiff
path: root/cashflow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cashflow.cpp')
-rw-r--r--cashflow.cpp72
1 files changed, 72 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();
}