165 lines
6 KiB
C++
165 lines
6 KiB
C++
/*---------------------------------------------------------*\
|
|
| OpenRGBNanoleafSettingsPage.cpp |
|
|
| |
|
|
| User interface for OpenRGB Nanoleaf settings page |
|
|
| |
|
|
| This file is part of the OpenRGB project |
|
|
| SPDX-License-Identifier: GPL-2.0-only |
|
|
\*---------------------------------------------------------*/
|
|
|
|
#include "OpenRGBNanoleafSettingsPage.h"
|
|
#include "ui_OpenRGBNanoleafSettingsPage.h"
|
|
#include "OpenRGBNanoleafNewDeviceDialog.h"
|
|
#include "ResourceManager.h"
|
|
#include "SettingsManager.h"
|
|
#include "LogManager.h"
|
|
|
|
using json = nlohmann::json;
|
|
|
|
OpenRGBNanoleafSettingsPage::OpenRGBNanoleafSettingsPage(QWidget *parent) :
|
|
QWidget(parent),
|
|
ui(new Ui::OpenRGBNanoleafSettingsPage)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
json nanoleaf_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("NanoleafDevices");
|
|
|
|
if(nanoleaf_settings.contains("devices"))
|
|
{
|
|
for(json::const_iterator it = nanoleaf_settings["devices"].begin(); it != nanoleaf_settings["devices"].end(); ++it)
|
|
{
|
|
const json& device = it.value();
|
|
const std::string& location = it.key();
|
|
|
|
if(device.contains("ip") && device.contains("port"))
|
|
{
|
|
OpenRGBNanoleafSettingsEntry* entry = new OpenRGBNanoleafSettingsEntry(QString::fromStdString(device["ip"]), device["port"]);
|
|
|
|
entries[location] = entry;
|
|
|
|
QListWidgetItem* item = new QListWidgetItem;
|
|
|
|
item->setSizeHint(entry->sizeHint());
|
|
|
|
ui->NanoleafDeviceList->addItem(item);
|
|
ui->NanoleafDeviceList->setItemWidget(item, entry);
|
|
ui->NanoleafDeviceList->show();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
OpenRGBNanoleafSettingsPage::~OpenRGBNanoleafSettingsPage()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void OpenRGBNanoleafSettingsPage::changeEvent(QEvent *event)
|
|
{
|
|
if(event->type() == QEvent::LanguageChange)
|
|
{
|
|
ui->retranslateUi(this);
|
|
}
|
|
}
|
|
|
|
void OpenRGBNanoleafSettingsPage::on_AddNanoleafDeviceButton_clicked()
|
|
{
|
|
/*-----------------------------------------------------*\
|
|
| Open a popup to manually add a device by setting ip |
|
|
| and port |
|
|
\*-----------------------------------------------------*/
|
|
OpenRGBNanoleafNewDeviceDialog dialog;
|
|
NanoleafDevice device = dialog.show();
|
|
if(!device.ip.empty())
|
|
{
|
|
LOG_TRACE("[%s] Add %s:%d", "Nanoleaf", device.ip.c_str(), device.port);
|
|
std::string location = device.ip+":"+std::to_string(device.port);
|
|
|
|
if(entries.find(location) == entries.end())
|
|
{
|
|
OpenRGBNanoleafSettingsEntry* entry = new OpenRGBNanoleafSettingsEntry(QString::fromUtf8(device.ip.c_str()), device.port);
|
|
|
|
entries[location] = entry;
|
|
|
|
QListWidgetItem* item = new QListWidgetItem;
|
|
|
|
item->setSizeHint(entry->sizeHint());
|
|
|
|
ui->NanoleafDeviceList->addItem(item);
|
|
ui->NanoleafDeviceList->setItemWidget(item, entry);
|
|
ui->NanoleafDeviceList->show();
|
|
|
|
json nanoleaf_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("NanoleafDevices");
|
|
nanoleaf_settings["devices"][location]["ip"] = device.ip;
|
|
nanoleaf_settings["devices"][location]["port"] = device.port;
|
|
ResourceManager::get()->GetSettingsManager()->SetSettings("NanoleafDevices", nanoleaf_settings);
|
|
ResourceManager::get()->GetSettingsManager()->SaveSettings();
|
|
}
|
|
}
|
|
}
|
|
|
|
void OpenRGBNanoleafSettingsPage::on_RemoveNanoleafDeviceButton_clicked()
|
|
{
|
|
/*-------------------------------------------------*\
|
|
| Remove the selected device |
|
|
\*-------------------------------------------------*/
|
|
int cur_row = ui->NanoleafDeviceList->currentRow();
|
|
|
|
if(cur_row < 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
QListWidgetItem* item = ui->NanoleafDeviceList->item(cur_row);
|
|
OpenRGBNanoleafSettingsEntry* entry = (OpenRGBNanoleafSettingsEntry*) ui->NanoleafDeviceList->itemWidget(item);
|
|
LOG_TRACE("[%s] Remove %s:%d", "Nanoleaf", entry->address.toStdString().c_str(), entry->port);
|
|
|
|
ui->NanoleafDeviceList->removeItemWidget(item);
|
|
delete item;
|
|
|
|
std::string location = entry->address.toStdString()+":"+std::to_string(entry->port);
|
|
delete entries[location];
|
|
entries.erase(location);
|
|
|
|
json nanoleaf_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("NanoleafDevices");
|
|
nanoleaf_settings["devices"].erase(location);
|
|
ResourceManager::get()->GetSettingsManager()->SetSettings("NanoleafDevices", nanoleaf_settings);
|
|
ResourceManager::get()->GetSettingsManager()->SaveSettings();
|
|
}
|
|
|
|
void OpenRGBNanoleafSettingsPage::on_ScanForNanoleafDevicesButton_clicked()
|
|
{
|
|
/*-----------------------------------------------------*\
|
|
| Create a worker thread for the mDNS query and hookup |
|
|
| callbacks for when it finds devices |
|
|
\*-----------------------------------------------------*/
|
|
OpenRGBNanoleafScanningThread *scanThread = new OpenRGBNanoleafScanningThread;
|
|
|
|
connect(scanThread, SIGNAL(DeviceFound(QString, int)),
|
|
SLOT(on_DeviceFound(QString, int)));
|
|
|
|
connect(scanThread, SIGNAL(finished()),
|
|
scanThread, SLOT(deleteLater()));
|
|
|
|
scanThread->start();
|
|
}
|
|
|
|
void OpenRGBNanoleafSettingsPage::on_DeviceFound(QString address, int port)
|
|
{
|
|
std::string location = address.toStdString()+":"+std::to_string(port);
|
|
|
|
if(entries.find(location) == entries.end())
|
|
{
|
|
OpenRGBNanoleafSettingsEntry* entry = new OpenRGBNanoleafSettingsEntry(address, port);
|
|
|
|
entries[location] = entry;
|
|
|
|
QListWidgetItem* item = new QListWidgetItem;
|
|
|
|
item->setSizeHint(entry->sizeHint());
|
|
|
|
ui->NanoleafDeviceList->addItem(item);
|
|
ui->NanoleafDeviceList->setItemWidget(item, entry);
|
|
ui->NanoleafDeviceList->show();
|
|
}
|
|
}
|