#include "BankSettingsWindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #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 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); }