Added system item support, support for RGBControlers with multiple item backends, and item settings widgets

This commit is contained in:
Carl Klemm 2020-05-05 22:29:43 +02:00
parent a761eb4317
commit 5fb9ca7cc0
56 changed files with 635 additions and 210 deletions

View file

@ -50,13 +50,13 @@ Item::Item(const ItemData& itemData, QObject *parent): QObject(parent), ItemDat
Item::~Item()
{
for(size_t i = 0; i < actors_.size(); i++) delete actors_[i];
}
void Item::store(QJsonObject &json)
{
json["Name"] = name_;
json["ItemId"] = static_cast<double>(itemId_);
json["override"] = override_;
QJsonArray actorsArray;
for(size_t i = 0; i < actors_.size(); ++i)
{
@ -77,17 +77,23 @@ void Item::load(const QJsonObject &json, const bool preserve)
name_ = json["Name"].toString(name_);
itemId_ = static_cast<uint32_t>(json["ItemId"].toDouble(0));
}
override_ = json["override"].toBool(false);
const QJsonArray actorsArray(json["Actors"].toArray(QJsonArray()));
for(int i = 0; i < actorsArray.size(); ++i)
{
if(actorsArray[i].isObject())
{
Actor* actor = Actor::loadActor(actorsArray[i].toObject());
std::shared_ptr<Actor> actor = Actor::loadActor(actorsArray[i].toObject());
if(actor != nullptr) addActor(actor);
}
}
}
void Item::actorSetValue(uint8_t value)
{
if(!override_) setValue(value);
}
void Item::setValue(uint8_t value)
{
value_ = value;
@ -99,34 +105,32 @@ void Item::informValue(uint8_t value)
Item::setValue(value);
}
void Item::addActor(Actor* actor)
void Item::addActor(std::shared_ptr<Actor> actor)
{
actor->setParent(this);
actors_.push_back(actor);
if(!secondaryFlag)
{
qDebug()<<"connecting actor";
connect(actor, &Actor::sigValue, this, &Item::setValue);
connect(actor.get(), &Actor::sigValue, this, &Item::actorSetValue);
}
connect(this, &Item::valueChanged, actor, &Actor::onValueChanged);
connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged);
SensorActor* sensorActor = dynamic_cast<SensorActor*>(actor);
if(sensorActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor, &SensorActor::sensorEvent);
std::shared_ptr<SensorActor> sensorActor = std::dynamic_pointer_cast<SensorActor>(actor);
if(sensorActor)connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor.get(), &SensorActor::sensorEvent);
Regulator* regulator = dynamic_cast<Regulator*>(actor);
if(regulator != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, regulator, &Regulator::sensorEvent);
std::shared_ptr<Regulator> regulator = std::dynamic_pointer_cast<Regulator>(actor);
if(regulator)connect(&globalSensors, &SensorStore::sensorChangedState, regulator.get(), &Regulator::sensorEvent);
PolynomalActor* polynomalActor = dynamic_cast<PolynomalActor*>(actor);
if(polynomalActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor, &PolynomalActor::sensorEvent);
std::shared_ptr<PolynomalActor> polynomalActor = std::dynamic_pointer_cast<PolynomalActor>(actor);
if(polynomalActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor.get(), &PolynomalActor::sensorEvent);
}
bool Item::removeActor(Actor* actor)
bool Item::removeActor(std::shared_ptr<Actor> actor)
{
for(unsigned int i = 0; i < actors_.size(); i++)
{
if(actors_[i] == actor)
{
delete actor;
actors_.erase(actors_.begin()+i);
return true;
}
@ -134,13 +138,22 @@ bool Item::removeActor(Actor* actor)
return false;
}
void Item::setOverride(const bool in)
{
override_ = in;
}
bool Item::getOverride()
{
return override_;
}
void Item::removeAllActors()
{
for(unsigned int i = 0; i < actors_.size(); i++) delete actors_[i];
actors_.clear();
}
std::vector< Actor* >& Item::getActors()
std::vector< std::shared_ptr<Actor> >& Item::getActors()
{
return actors_;
}