213 lines
7.4 KiB
C++
213 lines
7.4 KiB
C++
#include "DeviceWidget.h"
|
||
#include <QVBoxLayout>
|
||
#include <QLabel>
|
||
#include <QPixmap>
|
||
#include <QImage>
|
||
#include <QPushButton>
|
||
#include <QCoreApplication>
|
||
#include <QPointer>
|
||
#include <QPropertyAnimation>
|
||
#include <QGraphicsScene>
|
||
#include "bank/BankSettingsWindow.h"
|
||
#include "dao/ApplicationDAO.h"
|
||
#include "db/ApplicationInfo.h"
|
||
|
||
|
||
QString getColorByStatus(const ApplicationInfo &app) {
|
||
if (!app.install) {
|
||
return "black";
|
||
}
|
||
if (app.status == "active") {
|
||
if (!app.pinCodeChecked) {
|
||
return "orange";
|
||
}
|
||
return "green";
|
||
} else if (app.status == "off") {
|
||
return "red";
|
||
} else {
|
||
return "red";
|
||
}
|
||
}
|
||
|
||
void DeviceWidget::buildBankRow(const ApplicationInfo &app, QWidget *rowWidget, QWidget *parent) {
|
||
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(parent);
|
||
QPixmap pixmap(QString("%1/images/%2_icon.png").arg(QCoreApplication::applicationDirPath(), app.code));
|
||
icon->setPixmap(pixmap);
|
||
icon->setPixmap(pixmap.scaled(18, 18, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||
icon->setStyleSheet(
|
||
"background-color: transparent;"
|
||
"margin: 0px;"
|
||
);
|
||
|
||
|
||
auto *label = new QLabel(app.name, parent);
|
||
label->setStyleSheet(
|
||
"background-color: transparent;"
|
||
"margin: 0px;"
|
||
"font-size: 10px;"
|
||
"color: white;"
|
||
);
|
||
|
||
auto *circle = new QLabel(parent);
|
||
circle->setFixedSize(12, 12);
|
||
const QString color = getColorByStatus(app);
|
||
circle->setStyleSheet(
|
||
"margin: 0px;"
|
||
"background-color: " +color + "; "
|
||
"border-radius: 6px;"
|
||
);
|
||
|
||
// auto *btn1 = new QPushButton(parent);
|
||
// bool turnOn = app.pinCodeChecked && app.status == "active";
|
||
// QIcon btnIcon(QCoreApplication::applicationDirPath() + (turnOn ? "/images/turn_off.png" : "/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(parent);
|
||
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;"
|
||
);
|
||
// в конструкторе окна или сразу после создания btn2:
|
||
connect(btn2, &QPushButton::pressed, this, [btn2] {
|
||
auto anim = new QPropertyAnimation(btn2, "geometry");
|
||
anim->setDuration(120);
|
||
QRect orig = btn2->geometry();
|
||
QRect smaller = orig.adjusted(orig.width() * 0.05,
|
||
orig.height() * 0.05,
|
||
-orig.width() * 0.05,
|
||
-orig.height() * 0.05);
|
||
anim->setStartValue(orig);
|
||
anim->setKeyValueAt(0.5, smaller);
|
||
anim->setEndValue(orig);
|
||
anim->setEasingCurve(QEasingCurve::InOutQuad);
|
||
anim->start(QAbstractAnimation::DeleteWhenStopped);
|
||
});
|
||
|
||
setOpenBanksSettings(btn2);
|
||
|
||
// собираем
|
||
hbox->addWidget(icon);
|
||
hbox->addWidget(label,1);
|
||
hbox->addWidget(circle);
|
||
// hbox->addWidget(btn1);
|
||
hbox->addWidget(btn2);
|
||
|
||
// hbox->addStretch();
|
||
}
|
||
|
||
void DeviceWidget::setOpenBanksSettings(QPushButton *button) {
|
||
QString deviceId = m_device.id;
|
||
QString deviceName = m_device.name;
|
||
connect(button, &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();
|
||
});
|
||
}
|
||
|
||
DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(parent), m_device(device) {
|
||
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 *appsView = new QWidget(this);
|
||
appsView->setAttribute(Qt::WA_TransparentForMouseEvents, false);
|
||
appsView->setStyleSheet("background: transparent;");
|
||
|
||
auto *appsBoxLayout = new QVBoxLayout(appsView);
|
||
appsBoxLayout->setContentsMargins(2, 0, 0, 2);
|
||
appsBoxLayout->setSpacing(2);
|
||
|
||
QList<ApplicationInfo> apps = ApplicationDAO::getApplicationsByDeviceId(device.id);
|
||
for (ApplicationInfo &app: apps) {
|
||
if (app.install) {
|
||
auto *rowWidget = new QWidget(appsView);
|
||
buildBankRow(app, rowWidget, appsView);
|
||
appsBoxLayout->addWidget(rowWidget, 1);
|
||
}
|
||
}
|
||
// appsBoxLayout->addStretch();
|
||
|
||
// кладём overlay в ту же ячейку, что и картинку,
|
||
// но выравниваем его по левому-нижнему углу
|
||
layout->setColumnStretch(0, 1);
|
||
layout->addWidget(appsView, 0, 0, Qt::AlignLeft | Qt::AlignBottom);
|
||
// layout->addWidget(appsView, 0, 0, Qt::AlignLeft); TODO так на всю ширину
|
||
|
||
auto *addBankBtn = new QPushButton(this);
|
||
addBankBtn->setMaximumWidth(300);
|
||
addBankBtn->setText("Добавить банк +");
|
||
addBankBtn->setStyleSheet(
|
||
"background-color: #fff;"
|
||
"margin-top: 2px;"
|
||
"padding: 4px;"
|
||
"color: #000;"
|
||
);
|
||
|
||
setOpenBanksSettings(addBankBtn);
|
||
layout->addWidget(addBankBtn, 1, 0);
|
||
}
|