114 lines
2.2 KiB
C++
114 lines
2.2 KiB
C++
#include "itemstore.h"
|
|
#include <QJsonArray>
|
|
#include <QDebug>
|
|
#include "train.h"
|
|
#include "../trainjs.h"
|
|
|
|
ItemStore::ItemStore(QObject *parent): QObject(parent)
|
|
{
|
|
}
|
|
|
|
void ItemStore::addItem(std::shared_ptr<Item> item)
|
|
{
|
|
if(!item)
|
|
{
|
|
qWarning()<<"invalid item";
|
|
return;
|
|
}
|
|
bool mached = false;
|
|
for(unsigned i = 0; i < items_.size(); i++ )
|
|
if(*items_[i] == *item) mached = true;
|
|
if(!mached)
|
|
{
|
|
items_.push_back(std::shared_ptr<Item>(item));
|
|
|
|
if(dynamic_cast<Train*>(item.get()))
|
|
{
|
|
std::vector<std::shared_ptr<TrainJs>> joysticks = TrainJs::getJsDevices();
|
|
for(auto joystick: joysticks)
|
|
{
|
|
if(!joystick->itemIsSet())
|
|
{
|
|
joystick->setItem(item);
|
|
connect(joystick.get(), &TrainJs::reqNewItem, this, &ItemStore::jsReqNewItem);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
itemAdded(std::weak_ptr<Item>(items_.back()));
|
|
}
|
|
qDebug()<<"Got item: "<<item->id()<<" matched: "<<mached;
|
|
}
|
|
|
|
void ItemStore::jsReqNewItem()
|
|
{
|
|
if(items_.empty())
|
|
return;
|
|
|
|
qDebug()<<__func__<<"new item requested";
|
|
|
|
std::vector<std::shared_ptr<TrainJs>> joysticks = TrainJs::getJsDevices();
|
|
for(auto joystick: joysticks)
|
|
{
|
|
if(joystick->getWantsNewItem())
|
|
{
|
|
std::shared_ptr<Item> oldItem = joystick->getItem().lock();
|
|
for(size_t i = 0; i < items_.size(); ++i)
|
|
{
|
|
if(!oldItem || *items_[i] == *oldItem)
|
|
{
|
|
if(i+1 < items_.size())
|
|
joystick->setItem(items_[i+1]);
|
|
else
|
|
joystick->setItem(items_[0]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ItemStore::addItems(const std::vector<std::shared_ptr<Item>>& itemIn)
|
|
{
|
|
for(unsigned j = 0; j < itemIn.size(); j++)
|
|
addItem(itemIn[j]);
|
|
|
|
}
|
|
|
|
void ItemStore::removeItem(const ItemData& item)
|
|
{
|
|
for(unsigned j = 0; j < items_.size(); j++)
|
|
{
|
|
if(item == *items_[j])
|
|
{
|
|
items_.erase(items_.begin()+j);
|
|
--j;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void ItemStore::clear()
|
|
{
|
|
for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]);
|
|
items_.clear();
|
|
}
|
|
|
|
|
|
void ItemStore::itemStateChanged(const ItemData& item)
|
|
{
|
|
|
|
for(unsigned i = 0; i < items_.size(); i++ )
|
|
{
|
|
if(items_[i]->operator==(item))
|
|
{
|
|
|
|
if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue());
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|