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.
163 lines
5.9 KiB
C++
163 lines
5.9 KiB
C++
#include "DeviceWidget.h"
|
||
#include <QVBoxLayout>
|
||
#include <QLabel>
|
||
#include <QPixmap>
|
||
#include <QImage>
|
||
#include <QPushButton>
|
||
#include <QCoreApplication>
|
||
#include <QPointer>
|
||
#include "bank/BankSettingsWindow.h"
|
||
|
||
|
||
DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(parent) {
|
||
auto *layout = new QGridLayout(this);
|
||
layout->setContentsMargins(2, 2, 2, 2);
|
||
layout->setSpacing(0);
|
||
this->setStyleSheet("background-color: lightgray;padding: 2px;");
|
||
|
||
QImage img;
|
||
img.loadFromData(device.image, "JPG");
|
||
|
||
auto *imageLabel = new QLabel(this);
|
||
imageLabel->setPixmap(QPixmap::fromImage(img).scaled(300, 450, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||
imageLabel->setAlignment(Qt::AlignCenter);
|
||
layout->addWidget(imageLabel, 0, 0);
|
||
|
||
auto *statusLabel = new QLabel(device.name, this);
|
||
statusLabel->setWordWrap(true);
|
||
statusLabel->setMaximumWidth(300);
|
||
statusLabel->setStyleSheet(
|
||
"background-color: rgba(0, 0, 0, 0.5);"
|
||
"color: white;"
|
||
);
|
||
// статус — в ту же ячейку, но поверх картинки и по углу
|
||
layout->addWidget(statusLabel, 0, 0, Qt::AlignTop | Qt::AlignLeft);
|
||
|
||
auto *batteryLabel = new QLabel(QString("%1%").arg(device.battery), this);
|
||
batteryLabel->setWordWrap(true);
|
||
batteryLabel->setMaximumWidth(300);
|
||
batteryLabel->setStyleSheet(
|
||
"background-color: rgba(0, 0, 0, 0.5);"
|
||
"color: white;"
|
||
);
|
||
// статус — в ту же ячейку, но поверх картинки и по углу
|
||
layout->addWidget(batteryLabel, 0, 0, Qt::AlignTop | Qt::AlignRight);
|
||
|
||
|
||
auto *overlay = new QWidget(this);
|
||
overlay->setAttribute(Qt::WA_TransparentForMouseEvents, false);
|
||
overlay->setStyleSheet("background: transparent;"); // сам фон прозрачный
|
||
// вертикальный лэйаут списка внутри overlay
|
||
auto *vbox = new QVBoxLayout(overlay);
|
||
vbox->setContentsMargins(2, 0, 0, 2);
|
||
vbox->setSpacing(2);
|
||
|
||
// пример трёх строк (можете генерировать их динамически)
|
||
for (int i = 0; i < 3; ++i) {
|
||
auto *rowWidget = new QWidget(overlay);
|
||
rowWidget->setContentsMargins(0, 0, 0, 0);
|
||
rowWidget->setStyleSheet(
|
||
"background-color: rgba(0, 0, 0, 0.6);" // полупрозрачный фон
|
||
"border-radius: 4px;" // скруглённые углы, если нужно
|
||
);
|
||
|
||
// вешаем на контейнер ваш QHBoxLayout
|
||
auto *hbox = new QHBoxLayout(rowWidget);
|
||
hbox->setContentsMargins(2, 1, 1, 1);
|
||
hbox->setSpacing(0);
|
||
|
||
auto *icon = new QLabel(overlay);
|
||
QPixmap pixmap(QCoreApplication::applicationDirPath() + "/images/alfa_icon.png");
|
||
icon->setPixmap(pixmap);
|
||
icon->setPixmap(pixmap.scaled(18, 18, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||
icon->setStyleSheet(
|
||
"background-color: transparent;"
|
||
"margin: 0px;"
|
||
);
|
||
|
||
|
||
auto *label = new QLabel(QString("Банк %1").arg(i + 1), overlay);
|
||
label->setStyleSheet(
|
||
"background-color: transparent;"
|
||
"margin: 0px;"
|
||
"font-size: 10px;"
|
||
"color: white;"
|
||
);
|
||
|
||
auto *circle = new QLabel(overlay);
|
||
circle->setFixedSize(12, 12);
|
||
circle->setStyleSheet(
|
||
"margin: 0px;"
|
||
"background-color: red; "
|
||
"border-radius: 6px;"
|
||
);
|
||
|
||
auto *btn1 = new QPushButton(overlay);
|
||
QIcon btnIcon(QCoreApplication::applicationDirPath() + "/images/turn_on.png");
|
||
btn1->setIcon(btnIcon);
|
||
btn1->setIconSize(QSize(16, 16));
|
||
btn1->setFlat(true);
|
||
btn1->setStyleSheet(
|
||
"margin: 0px;"
|
||
"background-color: transparent;"
|
||
"border: none;"
|
||
);
|
||
|
||
auto *btn2 = new QPushButton(overlay);
|
||
QIcon btn2Icon(QCoreApplication::applicationDirPath() + "/images/cogwheel.png");
|
||
btn2->setIcon(btn2Icon);
|
||
btn2->setIconSize(QSize(16, 16));
|
||
btn2->setFlat(true);
|
||
btn2->setStyleSheet(
|
||
"margin: 0px;"
|
||
"background-color: transparent;"
|
||
"border: none;"
|
||
);
|
||
|
||
// собираем
|
||
hbox->addWidget(icon);
|
||
hbox->addWidget(label);
|
||
hbox->addWidget(circle);
|
||
hbox->addWidget(btn1);
|
||
hbox->addWidget(btn2);
|
||
|
||
hbox->addStretch();
|
||
vbox->addWidget(rowWidget);
|
||
}
|
||
vbox->addStretch();
|
||
|
||
|
||
// кладём overlay в ту же ячейку, что и картинку,
|
||
// но выравниваем его по левому-нижнему углу
|
||
layout->addWidget(overlay, 0, 0, Qt::AlignLeft | Qt::AlignBottom);
|
||
|
||
auto *addBankBtn = new QPushButton(this);
|
||
addBankBtn->setMaximumWidth(300);
|
||
addBankBtn->setText("Добавить банк +");
|
||
addBankBtn->setStyleSheet(
|
||
"background-color: #fff;"
|
||
"margin-top: 2px;"
|
||
"padding: 4px;"
|
||
"color: #000;"
|
||
);
|
||
|
||
QString deviceId = device.id;
|
||
QString deviceName = device.name;
|
||
connect(addBankBtn, &QPushButton::clicked, this, [deviceId, deviceName]() {
|
||
static QPointer<BankSettingsWindow> bankSettingsWindow;
|
||
|
||
// Если окна нет (либо ещё не было создано, либо уже удалилось) — создаём заново
|
||
if (!bankSettingsWindow) {
|
||
bankSettingsWindow = new BankSettingsWindow(nullptr, deviceId, deviceName);
|
||
bankSettingsWindow->setWindowFlags(bankSettingsWindow->windowFlags() | Qt::Window);
|
||
bankSettingsWindow->setAttribute(Qt::WA_DeleteOnClose);
|
||
}
|
||
|
||
// Показать/поднять/активировать
|
||
bankSettingsWindow->show();
|
||
bankSettingsWindow->raise();
|
||
bankSettingsWindow->activateWindow();
|
||
});
|
||
layout->addWidget(addBankBtn, 1, 0);
|
||
}
|