1
0
forked from BRT/arc
arc/views/bank/BankSettingsWindow.cpp
2025-05-27 14:54:29 +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 < 7; ++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);
}