192 lines
7.3 KiB
C++
192 lines
7.3 KiB
C++
#include "TransactionWindow.h"
|
||
|
||
#include <qabstractitemview.h>
|
||
#include <QDialog>
|
||
#include <QHeaderView>
|
||
#include <QPixmap>
|
||
#include <QPushButton>
|
||
#include <QVBoxLayout>
|
||
#include <QLabel>
|
||
#include <QScrollArea>
|
||
#include <QTableWidget>
|
||
#include <QStyledItemDelegate>
|
||
|
||
#include "dao/MaterialDAO.h"
|
||
#include "dao/TransactionDAO.h"
|
||
|
||
class AmountDelegate : public QStyledItemDelegate {
|
||
public:
|
||
explicit AmountDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {
|
||
}
|
||
|
||
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
|
||
QStyleOptionViewItem opt = option;
|
||
initStyleOption(&opt, index);
|
||
|
||
// Получаем значение суммы
|
||
QString text = index.data().toString();
|
||
bool isNegative = text.toDouble() < 0;
|
||
|
||
// Настраиваем цвета
|
||
if (isNegative) {
|
||
opt.backgroundBrush = QColor(255, 230, 230); // Светло-красный фон
|
||
opt.palette.setColor(QPalette::Text, QColor(255, 0, 0)); // Красный текст
|
||
} else {
|
||
opt.backgroundBrush = QColor(230, 255, 230); // Светло-зеленый фон
|
||
opt.palette.setColor(QPalette::Text, QColor(0, 128, 0)); // Зеленый текст
|
||
}
|
||
|
||
// Рисуем ячейку
|
||
QStyledItemDelegate::paint(painter, opt, index);
|
||
}
|
||
};
|
||
|
||
QTableWidgetItem *createTableWidget(const QString &text) {
|
||
QTableWidgetItem *item = new QTableWidgetItem(text);
|
||
item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
|
||
return item;
|
||
}
|
||
|
||
TransactionWindow::TransactionWindow(const int accountId, QWidget *parent): QDialog(parent) {
|
||
setWindowTitle("Транзакции");
|
||
setMinimumSize(800, 600);
|
||
|
||
auto *mainLayout = new QVBoxLayout(this);
|
||
|
||
// Скролл-область
|
||
auto *scrollArea = new QScrollArea(this);
|
||
scrollArea->setWidgetResizable(true);
|
||
|
||
// Виджет-контейнер, в котором будет layout с таблицами и лейблами
|
||
auto *contentWidget = new QWidget;
|
||
auto *layout = new QVBoxLayout(contentWidget);
|
||
|
||
// Убираем отступы и рамку
|
||
contentWidget->setContentsMargins(0, 0, 0, 0); // Убираем отступы
|
||
layout->setContentsMargins(0, 0, 0, 0); // Убираем отступы у layout
|
||
scrollArea->setStyleSheet("border: none;"); // Убираем рамку
|
||
layout->setAlignment(Qt::AlignTop);
|
||
|
||
MaterialInfo account = MaterialDAO::getAccountById(accountId);
|
||
QList<TransactionInfo> transactions = TransactionDAO::getTransactions(accountId);
|
||
|
||
QTableWidget *tableWidget = new QTableWidget(this);
|
||
tableWidget->setStyleSheet(
|
||
"QTableWidget {"
|
||
" border: 1px solid grey;"
|
||
" gridline-color: lightgrey;"
|
||
" background-color: #f9f9f9;"
|
||
" font-size: 14px;"
|
||
"}"
|
||
"QHeaderView::section {"
|
||
" background-color: #e0e0e0;"
|
||
" border: 1px solid grey;"
|
||
" padding: 4px;"
|
||
" font-weight: bold;"
|
||
" text-align: left center;"
|
||
"}"
|
||
"QTableWidget::item {"
|
||
" padding: 4px;"
|
||
" border: none;"
|
||
" text-align: left top;"
|
||
"}"
|
||
"QTableWidget::item:selected {"
|
||
" background-color: #cce5ff;"
|
||
" color: #003366;"
|
||
"}"
|
||
"QTableCornerButton::section {"
|
||
" background-color: #e0e0e0;"
|
||
" border: 1px solid grey;"
|
||
"}"
|
||
);
|
||
|
||
tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||
|
||
tableWidget->setRowCount(transactions.length());
|
||
tableWidget->setColumnCount(7);
|
||
tableWidget->setHorizontalHeaderLabels({
|
||
"Дата и время",
|
||
"Сумма",
|
||
"Банк",
|
||
"Телефон",
|
||
"Статус",
|
||
"Описание",
|
||
""
|
||
});
|
||
tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
||
for (int i = 0; i < 5; ++i) {
|
||
tableWidget->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents);
|
||
}
|
||
tableWidget->horizontalHeader()->setSectionResizeMode(5, QHeaderView::Stretch);
|
||
|
||
tableWidget->setItemDelegateForColumn(1, new AmountDelegate(tableWidget));
|
||
|
||
for (int k = 0; k < transactions.size(); ++k) {
|
||
TransactionInfo tr = transactions[k];
|
||
tableWidget->setItem(k, 0, createTableWidget(tr.bankTime));
|
||
tableWidget->setItem(k, 1, createTableWidget(QString::number(tr.amount)));
|
||
tableWidget->setItem(k, 2, createTableWidget(tr.bankName));
|
||
tableWidget->setItem(k, 3, createTableWidget(tr.phone));
|
||
tableWidget->setItem(k, 4, createTableWidget(transactionStatusToString(tr.status)));
|
||
|
||
QTableWidgetItem *item = new QTableWidgetItem(tr.description);
|
||
item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
|
||
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
|
||
item->setSizeHint(QSize(100, tr.description.length() / 2));
|
||
tableWidget->setItem(k, 5, item);
|
||
|
||
if (!tr.receiptImage.isEmpty()) {
|
||
auto *docBtn = new QPushButton("Документы", tableWidget);
|
||
docBtn->setStyleSheet("background-color: #1565C0; color: white;");
|
||
tableWidget->setCellWidget(k, 6, docBtn);
|
||
|
||
connect(docBtn, &QPushButton::clicked, this, [this, tr]() {
|
||
QPixmap pixmap;
|
||
pixmap.loadFromData(tr.receiptImage);
|
||
if (pixmap.isNull()) return;
|
||
|
||
auto *imgDialog = new QDialog(this);
|
||
imgDialog->setWindowTitle("Документ");
|
||
imgDialog->setAttribute(Qt::WA_DeleteOnClose);
|
||
auto *dlgLayout = new QVBoxLayout(imgDialog);
|
||
auto *imgLabel = new QLabel(imgDialog);
|
||
imgLabel->setPixmap(pixmap.scaled(600, 1000, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||
dlgLayout->addWidget(imgLabel);
|
||
imgDialog->resize(imgLabel->pixmap().size());
|
||
imgDialog->show();
|
||
});
|
||
}
|
||
}
|
||
layout->addWidget(tableWidget);
|
||
tableWidget->resizeColumnsToContents();
|
||
tableWidget->resizeRowsToContents();
|
||
|
||
// Подгоняем ширину окна под содержимое таблицы
|
||
int totalWidth = tableWidget->verticalHeader()->width() + tableWidget->frameWidth() * 2 + 20;
|
||
for (int i = 0; i < tableWidget->columnCount(); ++i) {
|
||
totalWidth += tableWidget->columnWidth(i);
|
||
}
|
||
resize(qMax(800, totalWidth), 600);
|
||
|
||
// for (int row = 0; row < tableWidget->rowCount(); ++row) {
|
||
// for (int col = 0; col < tableWidget->columnCount(); ++col) {
|
||
// QTableWidgetItem *item = tableWidget->item(row, col);
|
||
// if (item) {
|
||
// item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
// Добавим вертикальный Spacer в конец, чтобы прокручиваемая область не растягивала контент
|
||
// QSpacerItem *spacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||
// layout->addItem(spacer);
|
||
|
||
contentWidget->setLayout(layout);
|
||
scrollArea->setWidget(contentWidget);
|
||
mainLayout->addWidget(scrollArea);
|
||
setLayout(mainLayout);
|
||
setWindowTitle("Транзакции");
|
||
|
||
setModal(true);
|
||
}
|