1
0
forked from BRT/arc
arc/views/device/DeviceWidget.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

163 lines
5.9 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 "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);
}