1
0
forked from BRT/arc
arc/views/bank/BankSettingsWindow.cpp
trnsmkot dc3057a9f4 Add bank management functionality with UI and DAO improvements
Introduce `BankSettingsWindow` for managing bank data, added `EditBankDialog` for editing bank details, and created reusable `PaddedItemDelegate` for list padding. Refactor DAO to support fetching multiple applications by device ID for improved data handling. Adjust existing components to integrate new bank-related features.
2025-05-27 14:25:33 +07:00

222 lines
8.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "BankSettingsWindow.h"
#include <QVBoxLayout>
#include <QDir>
#include <QFile>
#include <QHeaderView>
#include <QScrollArea>
#include <QCoreApplication>
#include <QPushButton>
#include <QTableWidget>
#include <utility>
#include <QMessageBox>
#include <QLabel>
#include <QDialog>
#include "dao/ApplicationDAO.h"
#include "db/ApplicationInfo.h"
#include "common/PaddedItemDelegate.h"
#include "device/EditBankDialog.h"
#include "widget/common/CollapsibleSection.h"
QTableWidgetItem *BankSettingsWindow::createTableWidget(const QString &text) {
QTableWidgetItem *item = new QTableWidgetItem(text);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
return item;
}
BankSettingsWindow::BankSettingsWindow(QWidget *parent, QString deviceId, QString deviceName)
: QWidget(parent,
Qt::Window
| Qt::WindowTitleHint
| Qt::WindowSystemMenuHint
| Qt::WindowCloseButtonHint
| Qt::WindowMinMaxButtonsHint),
m_deviceId(std::move(deviceId)),
m_deviceName(std::move(deviceName)
) {
setWindowTitle("Настройки банка [" + m_deviceName + "]");
setMinimumSize(820, 400);
setMaximumSize(820, 400);
resize(820, 400);
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);
QList<ApplicationInfo> applications = ApplicationDAO::getApplicationsByDeviceId(m_deviceId);
QTableWidget *tableWidget = new QTableWidget(this);
tableWidget->setSelectionMode(QAbstractItemView::NoSelection);
tableWidget->setFocusPolicy(Qt::NoFocus);
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: 2px;"
" border: none;"
" text-align: left;"
" vertical-align: middle; "
"}"
"QTableWidget::item:selected {"
// " background-color: #cce5ff;"
// " color: #003366;"
"}"
"QTableCornerButton::section {"
// " background-color: #e0e0e0;"
// " border: 1px solid grey;"
"}"
"QPushButton {"
"border-radius: 4px;"
"height: 26px;"
"}"
"QPushButton[btnClass='delete'] {"
"background-color: red;"
"}"
"QPushButton[btnClass='edit'] {"
"background-color: green;"
"}"
"QPushButton[btnClass='delete']:pressed {"
"background-color: blue;"
"}"
"QPushButton[btnClass='edit']:pressed {"
"background-color: blue;"
"}"
);
tableWidget->setRowCount(applications.length());
tableWidget->setColumnCount(7);
tableWidget->setHorizontalHeaderLabels({
"",
"Имя",
"Пин-код",
"Статус",
"Комментарий",
"",
""
});
tableWidget->setWordWrap(true);
tableWidget->setTextElideMode(Qt::ElideNone);
QMargins cellPadding{8, 4, 8, 4};
auto *delegate = new PaddedItemDelegate(cellPadding, tableWidget);
tableWidget->setItemDelegateForColumn(1, delegate);
tableWidget->setItemDelegateForColumn(2, delegate);
tableWidget->setItemDelegateForColumn(3, delegate);
tableWidget->setItemDelegateForColumn(4, delegate);
tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
for (int i = 0; i < 8; ++i) {
tableWidget->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents);
}
tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
tableWidget->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Stretch);
for (int k = 0; k < applications.size(); ++k) {
const ApplicationInfo &app = applications[k];
auto *icon = new QLabel(tableWidget);
QPixmap pixmap(QCoreApplication::applicationDirPath() + "/images/alfa_icon.png");
icon->setPixmap(pixmap);
icon->setPixmap(pixmap.scaled(20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation));
icon->setStyleSheet(
"background-color: transparent;"
"padding:0 4px 0 0;"
);
icon->setMinimumSize(24, 20);
tableWidget->setCellWidget(k, 0, icon);
tableWidget->setItem(k, 1, createTableWidget(app.name == "rshb" ? "Россельхозбанк" : app.name));
tableWidget->setItem(k, 2, createTableWidget(app.pinCode));
tableWidget->setItem(k, 3, createTableWidget(app.status));
QTableWidgetItem *item = new QTableWidgetItem(app.comment);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
item->setSizeHint(QSize(100, app.comment.length() / 2)); // Минимальная высота ячейки для переноса
tableWidget->setItem(k, 4, item);
// auto *deleteBtnItem = new QTableWidgetItem;
// tableWidget->setItem(k, 4, deleteBtnItem);
auto *deleteBtn = new QPushButton(" Удалить ", tableWidget);
deleteBtn->setProperty("btnClass", "delete");
// deleteBtn->setStyleSheet("padding: 4px 8px;");
// deleteBtn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
tableWidget->setCellWidget(k, 5, deleteBtn);
connect(deleteBtn, &QPushButton::clicked, this, [this, app]() {
QMessageBox msgBox(this);
msgBox.setWindowTitle(tr("Подтверждение"));
msgBox.setText("Точно удалить все данные банка: " + app.name + "?");
// добавляем свои кнопки с нужными надписями
QPushButton *deleteBtn = msgBox.addButton(tr("Удалить"), QMessageBox::AcceptRole);
QPushButton *closeBtn = msgBox.addButton(tr("Отмена"), QMessageBox::RejectRole);
// по умолчанию фокус на «Закрыть»
msgBox.setDefaultButton(closeBtn);
// делаем окно модальным и блокируем всё остальное
msgBox.setModal(true);
msgBox.exec(); // <-- блокирует до закрытия сообщения
if (msgBox.clickedButton() == deleteBtn) {
// тут выполняем удаление
} else {
// просто закрыли — ничего не делаем
}
});
// auto *editBtn = new QTableWidgetItem;
// tableWidget->setItem(k, 5, editBtn);
auto *btn = new QPushButton(" Редактировать ", tableWidget);
btn->setProperty("btnClass", "edit");
// btn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
tableWidget->setCellWidget(k, 6, btn);
connect(btn, &QPushButton::clicked, this, [this]() {
BankEditDialog dlg(this);
if (dlg.exec() == QDialog::Accepted) {
// Пользователь нажал «OK»
QString v1 = dlg.firstValue();
QString v2 = dlg.secondValue();
bool on = dlg.toggled();
// … обработка значений …
} else {
// Пользователь нажал «Cancel» или закрыл окно
}
});
}
layout->addWidget(tableWidget);
tableWidget->resizeRowsToContents();
// Добавим вертикальный 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);
}