1
0
forked from BRT/arc
arc/views/widget/loader/DesktopSelectionWindow.cpp

70 lines
2.4 KiB
C++

#include "DesktopSelectionWindow.h"
#include <QCloseEvent>
#include <QJsonObject>
#include <QLabel>
#include <QPushButton>
#include <QStringList>
#include <QVBoxLayout>
namespace {
// Имена устройств десктопа (поле devices ответа /api/v1/desktop/).
// Отрезаем суффикс после последнего тире: "Infinix X6525D-da7b22..." -> "Infinix X6525D".
QStringList deviceNamesOf(const QJsonObject &d) {
QStringList names;
for (const QJsonValue &devVal : d["devices"].toArray()) {
const QJsonObject dev = devVal.toObject();
QString name = dev["name"].toString();
if (name.isEmpty()) name = dev["unique_name"].toString();
const int dash = name.lastIndexOf('-');
if (dash > 0) name = name.left(dash);
if (!name.isEmpty()) names << name;
}
return names;
}
} // namespace
DesktopSelectionWindow::DesktopSelectionWindow(const QJsonArray &desktops, QWidget *parent)
: QWidget(parent, Qt::Window) {
setWindowTitle("Выбор десктопа");
setMinimumWidth(360);
auto *layout = new QVBoxLayout(this);
layout->addWidget(new QLabel("Выберите десктоп для синхронизации:"));
for (const QJsonValue &dVal : desktops) {
const QJsonObject d = dVal.toObject();
const QString id = d["id"].toString();
QString title = d["unique_name"].toString();
if (title.isEmpty()) title = id;
const QStringList devices = deviceNamesOf(d);
QString text = title;
if (!devices.isEmpty()) text += "\n" + devices.join("\n");
auto *btn = new QPushButton(text);
btn->setStyleSheet("text-align: left; padding: 8px;");
connect(btn, &QPushButton::clicked, this, [this, id]() {
m_chosen = true;
emit desktopChosen(id);
close();
});
layout->addWidget(btn);
}
auto *createBtn = new QPushButton("Создать новый");
createBtn->setStyleSheet("padding: 8px;");
connect(createBtn, &QPushButton::clicked, this, [this]() {
m_chosen = true;
emit desktopChosen(QString());
close();
});
layout->addWidget(createBtn);
}
void DesktopSelectionWindow::closeEvent(QCloseEvent *event) {
// Закрытие окна без выбора (крестик) трактуем как отмену.
if (!m_chosen) emit cancelled();
QWidget::closeEvent(event);
}