#include "DesktopSelectionWindow.h" #include #include #include #include #include #include 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()) { // При длинном списке показываем только первые 3 устройства, // а в следующей строке — сколько ещё осталось. const int kMaxShown = 3; text += "\n" + devices.mid(0, kMaxShown).join("\n"); if (devices.size() > kMaxShown) text += QString("\n… ещё %1").arg(devices.size() - kMaxShown); } 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); }