From a301bdbaa7241ad38eb5e9d798aab86db1112431 Mon Sep 17 00:00:00 2001 From: uvos Date: Wed, 8 Nov 2023 23:35:50 +0100 Subject: [PATCH] Add time to the sensor list widget, also broadcast and recive the time of a sensor --- SHinterface.pro | 174 +++++++++--------- src/actors/actor.cpp | 2 +- src/broadcast.cpp | 13 +- src/main.cpp | 17 +- src/mainobject.cpp | 10 +- src/mainobject.h | 6 +- src/pipewire.cpp | 72 ++++++++ src/pipewire.h | 56 ++++++ src/sensors/pipewiresensor.cpp | 74 ++++++++ src/sensors/pipewiresensor.h | 40 +++++ src/sensors/sensor.h | 17 +- src/ui/itemsettingsdialog.cpp | 6 +- src/ui/mainwindow.cpp | 2 + src/ui/mainwindow.ui | 312 ++++++++++++++++++--------------- src/ui/sensorlistwidget.cpp | 22 ++- 15 files changed, 557 insertions(+), 266 deletions(-) create mode 100644 src/pipewire.cpp create mode 100644 src/pipewire.h create mode 100644 src/sensors/pipewiresensor.cpp create mode 100644 src/sensors/pipewiresensor.h diff --git a/SHinterface.pro b/SHinterface.pro index 4ee98f9..ab27aa7 100644 --- a/SHinterface.pro +++ b/SHinterface.pro @@ -25,130 +25,130 @@ QMAKE_CXXFLAGS += -std=c++17 -O2 SOURCES += \ src/actors/factoractor.cpp \ - src/actors/polynomalactor.cpp \ - src/broadcast.cpp \ - src/iomuliplexer.cpp \ - src/items/messageitem.cpp \ - src/items/systemitem.cpp \ - src/ui/actorwidgets/factoractorwidget.cpp \ - src/ui/itemcreationdialog.cpp \ - src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \ - src/mainobject.cpp \ - src/apgetconnected.cpp \ - src/ui/actorwidgets/polynomalactorwidget.cpp \ - src/ui/actorwidgets/sensoractorwidget.cpp \ - src/ui/actorwidgets/alarmwidget.cpp \ - src/ui/actorwidgets/timeractorwidget.cpp \ - src/ui/itemsettingswidgets/relayitemsettingswidget.cpp \ - src/ui/itemsettingswidgets/systemitemsettingswidget.cpp \ - src/ui/itemwidget.cpp \ - src/ui/itemsettingsdialog.cpp \ - src/ui/itemscrollbox.cpp \ - src/items/poweritem.cpp \ - src/ui/actorwidgets/regulatorwdiget.cpp + src/actors/polynomalactor.cpp \ + src/broadcast.cpp \ + src/iomuliplexer.cpp \ + src/items/messageitem.cpp \ + src/items/systemitem.cpp \ + src/ui/actorwidgets/factoractorwidget.cpp \ + src/ui/itemcreationdialog.cpp \ + src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \ + src/mainobject.cpp \ + src/apgetconnected.cpp \ + src/ui/actorwidgets/polynomalactorwidget.cpp \ + src/ui/actorwidgets/sensoractorwidget.cpp \ + src/ui/actorwidgets/alarmwidget.cpp \ + src/ui/actorwidgets/timeractorwidget.cpp \ + src/ui/itemsettingswidgets/relayitemsettingswidget.cpp \ + src/ui/itemsettingswidgets/systemitemsettingswidget.cpp \ + src/ui/itemwidget.cpp \ + src/ui/itemsettingsdialog.cpp \ + src/ui/itemscrollbox.cpp \ + src/items/poweritem.cpp \ + src/ui/actorwidgets/regulatorwdiget.cpp SOURCES += \ src/ui/actorsettingsdialog.cpp \ - src/ui/mainwindow.cpp \ - src/ui/sensorlistwidget.cpp + src/ui/mainwindow.cpp \ + src/ui/sensorlistwidget.cpp SOURCES += \ src/actors/actor.cpp \ - src/actors/sensoractor.cpp \ - src/actors/alarmtime.cpp \ - src/actors/regulator.cpp \ - src/actors/timeractor.cpp + src/actors/sensoractor.cpp \ + src/actors/alarmtime.cpp \ + src/actors/regulator.cpp \ + src/actors/timeractor.cpp SOURCES += \ src/sensors/sensor.cpp \ - src/sensors/speakersensor.cpp \ - src/sensors/sunsensor.cpp \ - src/sensors/ocupancysensor.cpp + src/sensors/speakersensor.cpp \ + src/sensors/sunsensor.cpp \ + src/sensors/ocupancysensor.cpp SOURCES += \ src/items/relay.cpp \ - src/items/item.cpp \ - src/items/itemstore.cpp \ - src/items/auxitem.cpp \ - src/items/rgbitem.cpp + src/items/item.cpp \ + src/items/itemstore.cpp \ + src/items/auxitem.cpp \ + src/items/rgbitem.cpp SOURCES += \ src/alarmactions.cpp \ - src/main.cpp \ - src/microcontroller.cpp \ - src/sun.cpp + src/main.cpp \ + src/microcontroller.cpp \ + src/sun.cpp HEADERS += \ src/actors/factoractor.h \ - src/actors/polynomalactor.h \ - src/broadcast.h \ - src/iomuliplexer.h \ - src/items/messageitem.h \ - src/items/systemitem.h \ - src/ui/actorwidgets/factoractorwidget.h \ - src/ui/itemcreationdialog.h \ - src/ui/itemsettingswidgets/messageitemsettingswidget.h \ - src/mainobject.h \ - src/apgetconnected.h \ - src/ui/actorwidgets/alarmwidget.h \ - src/ui/actorwidgets/polynomalactorwidget.h \ - src/ui/actorwidgets/sensoractorwidget.h \ - src/ui/actorwidgets/timeractorwidget.h \ - src/ui/itemsettingswidgets/relayitemsettingswidget.h \ - src/ui/itemsettingswidgets/systemitemsettingswidget.h \ - src/ui/itemwidget.h \ - src/ui/itemsettingsdialog.h \ - src/ui/itemscrollbox.h \ - src/items/poweritem.h \ - src/ui/actorwidgets/regulatorwdiget.h + src/actors/polynomalactor.h \ + src/broadcast.h \ + src/iomuliplexer.h \ + src/items/messageitem.h \ + src/items/systemitem.h \ + src/ui/actorwidgets/factoractorwidget.h \ + src/ui/itemcreationdialog.h \ + src/ui/itemsettingswidgets/messageitemsettingswidget.h \ + src/mainobject.h \ + src/apgetconnected.h \ + src/ui/actorwidgets/alarmwidget.h \ + src/ui/actorwidgets/polynomalactorwidget.h \ + src/ui/actorwidgets/sensoractorwidget.h \ + src/ui/actorwidgets/timeractorwidget.h \ + src/ui/itemsettingswidgets/relayitemsettingswidget.h \ + src/ui/itemsettingswidgets/systemitemsettingswidget.h \ + src/ui/itemwidget.h \ + src/ui/itemsettingsdialog.h \ + src/ui/itemscrollbox.h \ + src/items/poweritem.h \ + src/ui/actorwidgets/regulatorwdiget.h HEADERS += \ src/ui/actorsettingsdialog.h \ - src/ui/mainwindow.h \ - src/ui/sensorlistwidget.h + src/ui/mainwindow.h \ + src/ui/sensorlistwidget.h HEADERS += \ src/actors/actor.h \ - src/actors/alarmtime.h \ - src/actors/sensoractor.h \ - src/actors/regulator.h \ - src/actors/timeractor.h + src/actors/alarmtime.h \ + src/actors/sensoractor.h \ + src/actors/regulator.h \ + src/actors/timeractor.h HEADERS += \ src/sensors/sensor.h \ - src/sensors/speakersensor.h \ - src/sensors/sunsensor.h \ - src/sensors/ocupancysensor.h + src/sensors/speakersensor.h \ + src/sensors/sunsensor.h \ + src/sensors/ocupancysensor.h HEADERS += \ src/items/relay.h \ - src/items/item.h \ - src/items/itemstore.h \ - src/items/auxitem.h \ - src/items/rgbitem.h + src/items/item.h \ + src/items/itemstore.h \ + src/items/auxitem.h \ + src/items/rgbitem.h HEADERS += \ src/alarmactions.h \ - src/microcontroller.h \ - src/sun.h + src/microcontroller.h \ + src/sun.h FORMS += \ src/ui/actorwidgets/factoractorwidget.ui \ - src/ui/itemcreationdialog.ui \ - src/ui/itemsettingswidgets/messageitemsettingswidget.ui \ - src/ui/actorsettingsdialog.ui \ - src/ui/actorwidgets/polynomalactorwidget.ui \ - src/ui/itemsettingswidgets/relayitemsettingswidget.ui \ - src/ui/itemsettingswidgets/systemitemsettingswidget.ui \ - src/ui/mainwindow.ui \ - src/ui/relayscrollbox.ui \ - src/ui/actorwidgets/sensoractorwidget.ui \ - src/ui/actorwidgets/alarmwidget.ui \ - src/ui/actorwidgets/timeractorwidget.ui \ - src/ui/itemsettingsdialog.ui \ - src/ui/itemwidget.ui \ - src/ui/actorwidgets/regulatorwdiget.ui + src/ui/itemcreationdialog.ui \ + src/ui/itemsettingswidgets/messageitemsettingswidget.ui \ + src/ui/actorsettingsdialog.ui \ + src/ui/actorwidgets/polynomalactorwidget.ui \ + src/ui/itemsettingswidgets/relayitemsettingswidget.ui \ + src/ui/itemsettingswidgets/systemitemsettingswidget.ui \ + src/ui/mainwindow.ui \ + src/ui/relayscrollbox.ui \ + src/ui/actorwidgets/sensoractorwidget.ui \ + src/ui/actorwidgets/alarmwidget.ui \ + src/ui/actorwidgets/timeractorwidget.ui \ + src/ui/itemsettingsdialog.ui \ + src/ui/itemwidget.ui \ + src/ui/actorwidgets/regulatorwdiget.ui android:FORMS += src/ui/mainwindow-android.ui diff --git a/src/actors/actor.cpp b/src/actors/actor.cpp index 5c3c326..41688d7 100644 --- a/src/actors/actor.cpp +++ b/src/actors/actor.cpp @@ -88,7 +88,7 @@ uint8_t Actor::getTriggerValue() void Actor::onValueChanged(uint8_t value) { - + (void)value; } std::shared_ptr Actor::createActor(const QString& type) diff --git a/src/broadcast.cpp b/src/broadcast.cpp index c446f7e..ed42f16 100644 --- a/src/broadcast.cpp +++ b/src/broadcast.cpp @@ -41,20 +41,23 @@ void BroadCast::sendJson(const QJsonObject& json) void BroadCast::sendSensors() { - if(iodevice_)for(auto& sensor: *globalSensors.getSensors()) - { + if(iodevice_) + { + for(auto& sensor: *globalSensors.getSensors()) iodevice_->write("bcst: "+sensor.toString().toLatin1()+'\n'); - } + } } void BroadCast::requestSensors() { - if(iodevice_)iodevice_->write("bcst: GETSENSORS\n"); + if(iodevice_) + iodevice_->write("bcst: GETSENSORS\n"); } void BroadCast::requestJson() { - if(iodevice_)iodevice_->write("bcst: GETJSN\n"); + if(iodevice_) + iodevice_->write("bcst: GETJSN\n"); } void BroadCast::decodeMaster(const QByteArray& buffer) diff --git a/src/main.cpp b/src/main.cpp index f67d160..529202d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,9 @@ #include #include +//Currently pipewire support is disabled +//#include + #ifndef Q_OS_ANDROID #include @@ -11,18 +14,9 @@ #include #endif -#include "actors/alarmtime.h" #include "microcontroller.h" #include "ui/mainwindow.h" -#include "sensors/speakersensor.h" -#include "sensors/sunsensor.h" -#include "sensors/ocupancysensor.h" -#include "alarmactions.h" -#include "sensors/sensor.h" #include "items/itemstore.h" -#include "items/auxitem.h" -#include "items/rgbitem.h" -#include "items/poweritem.h" #include "mainobject.h" @@ -32,6 +26,8 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); + //pw_init(&argc, &argv); + //set info QCoreApplication::setOrganizationName("UVOS"); QCoreApplication::setOrganizationDomain("uvos.xyz"); @@ -128,7 +124,8 @@ int main(int argc, char *argv[]) QObject::connect(&w, &MainWindow::sigBrodcast, &mainObject, &MainObject::sendJson); QObject::connect(&w, &MainWindow::sigSave, &mainObject, &MainObject::storeToDisk); QObject::connect(&w, &MainWindow::createdItem, &mainObject.items, &ItemStore::addItem); - if(!mainObject.micro.connected()) w.changeHeaderLableText("No io debug only!"); + if(!mainObject.micro.connected()) + w.changeHeaderLableText("No io debug only!"); w.show(); diff --git a/src/mainobject.cpp b/src/mainobject.cpp index c94e350..d474d87 100644 --- a/src/mainobject.cpp +++ b/src/mainobject.cpp @@ -23,6 +23,7 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const QObject::connect(&ocupancySensor, &OcupancySensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState); sunSensorSource.run(); + //pwHandler.startLoop(); //connect item store QObject::connect(µ, &Microcontroller::gotRelayList, &items, &ItemStore::addItems); @@ -35,14 +36,17 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const items.addItem(auxItem); MessageItem::broadCast = &broadCast; - Relay::setMicrocontroller(µ); connect(&broadCast, &BroadCast::gotJson, this, &MainObject::recivedJson); QObject::connect(&broadCast, &BroadCast::gotSensorState, &globalSensors, &SensorStore::sensorGotState); - if(master)connect(&broadCast, &BroadCast::jsonRequested, this, &MainObject::sendJson); + if(master) + connect(&broadCast, &BroadCast::jsonRequested, this, &MainObject::sendJson); - if(master) load(getJsonObjectFromDisk(settingsPath, &noSave)); + if(master) + { + load(getJsonObjectFromDisk(settingsPath, &noSave)); + } else { broadCast.requestJson(); diff --git a/src/mainobject.h b/src/mainobject.h index fc32831..cfa5fff 100644 --- a/src/mainobject.h +++ b/src/mainobject.h @@ -32,6 +32,7 @@ #include "items/poweritem.h" #include "iomuliplexer.h" #include "broadcast.h" +//#include "pipewire.h" class MainObject : public QObject { @@ -47,7 +48,8 @@ public: IoMuliplexer ioMultiplexer; Microcontroller micro; - BroadCast broadCast; + BroadCast broadCast; + const QString settingsPath; @@ -62,6 +64,8 @@ public: std::shared_ptr rgbItem; std::shared_ptr auxItem; + //PipeWireHandler pwHandler; + private: static QJsonObject getJsonObjectFromDisk(const QString& filePath = "", bool* error = nullptr); diff --git a/src/pipewire.cpp b/src/pipewire.cpp new file mode 100644 index 0000000..2c789d5 --- /dev/null +++ b/src/pipewire.cpp @@ -0,0 +1,72 @@ +#include "pipewire.h" +#include +#include + +static const struct pw_registry_events registry_events = { + .version = PW_VERSION_REGISTRY_EVENTS, + .global = &PipeWireHandler::registryEventHandler, + .global_remove = nullptr +}; + +PipeWireHandler::PipeWireHandler() +{ + loop = pw_thread_loop_new("SHinterface", nullptr); + if(!loop) + throw std::runtime_error("Could not create pipewire main loop"); + + context = pw_context_new(pw_thread_loop_get_loop(loop), nullptr, 0); + if(!context) + throw std::runtime_error("Could not create pipewire context"); + + core = pw_context_connect(context, NULL, 0); + if(!core) + throw std::runtime_error("Could not connect to pipewire"); + + registry = pw_core_get_registry(core, PW_VERSION_REGISTRY, 0); + if(!registry) + throw std::runtime_error("Could not get pipewire registry"); + + spa_zero(registryListener); + pw_registry_add_listener(registry, ®istryListener, ®istry_events, this); +} + +bool PipeWireHandler::startLoop() +{ + if(!loop || !context || !core || !registry) + return false; + int ret = pw_thread_loop_start(loop); + return ret == 0; +} + +struct pw_registry* PipeWireHandler::getRegistry() +{ + return registry; +} + +void PipeWireHandler::registryEventHandler(void *data, uint32_t id, + uint32_t permissions, const char *type, uint32_t version, + const struct spa_dict *props) +{ + (void)permissions; + (void)version; + + PipeWireHandler* handler = static_cast(data); + + if(std::string(type) == PW_TYPE_INTERFACE_Node) + { + const struct spa_dict_item *item = spa_dict_lookup_item(props, "node.name"); + if(item) + { + qDebug()<<"got new pipewire node:"<value; + handler->nodeAdded({id, item->value}); + } + } +} + +PipeWireHandler::~PipeWireHandler() +{ + pw_core_disconnect(core); + pw_context_destroy(context); + pw_thread_loop_stop(loop); +} + diff --git a/src/pipewire.h b/src/pipewire.h new file mode 100644 index 0000000..5f2135a --- /dev/null +++ b/src/pipewire.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +class PipeWireHandler: public QObject +{ + Q_OBJECT + +public: + struct PwNode + { + uint32_t id; + std::string name; + }; + +private: + + struct pw_thread_loop* loop; + struct pw_context* context; + struct pw_core* core; + struct pw_registry* registry; + struct spa_hook registryListener; + + void write(const char * const buffer, const size_t length); + void write(const QByteArray& buffer); + + void decode(QByteArray buffer); + void decodeMaster(const QByteArray& buffer); + +public: + + static void registryEventHandler(void *data, uint32_t id, + uint32_t permissions, const char *type, uint32_t version, + const struct spa_dict *props); + +signals: + + void nodeAdded(PwNode node); + void nodeRemoved(PwNode node); + +public: + + PipeWireHandler(); + PipeWireHandler(const PipeWireHandler&) = delete; + PipeWireHandler operator=(const PipeWireHandler&) = delete; + bool startLoop(); + struct pw_registry* getRegistry(); + + ~PipeWireHandler(); +}; + diff --git a/src/sensors/pipewiresensor.cpp b/src/sensors/pipewiresensor.cpp new file mode 100644 index 0000000..89ee7e4 --- /dev/null +++ b/src/sensors/pipewiresensor.cpp @@ -0,0 +1,74 @@ +#include "pipewiresensor.h" +#include + +static const struct pw_node_events node_events = { + .version = PW_VERSION_NODE_EVENTS, + .info = &PipeWireSensorSource::nodeEventHandler, + .param = nullptr +}; + +PipeWireSensorSource::PipeWireSensorSource(PipeWireHandler* handler, const std::string& nodeName, uint8_t id, QObject *parent) + : QObject{parent}, handler_(handler), nodeName_(nodeName), id_(id) +{ + connect(handler_, &PipeWireHandler::nodeAdded, this, &PipeWireSensorSource::nodeAdded); + connect(&timer, &QTimer::timeout, this, &PipeWireSensorSource::offTimeout); + timer.setSingleShot(true); +} + +void PipeWireSensorSource::offTimeout() +{ + if(state == false) + return; + state = false; + stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, id_, state)); +} + +void PipeWireSensorSource::nodeEventHandler(void* data, const struct pw_node_info *info) +{ + PipeWireSensorSource* source = static_cast(data); + + if(info->state == source->prevState) + return; + + source->prevState = info->state; + + switch (info->state) + { + case PW_NODE_STATE_ERROR: + case PW_NODE_STATE_CREATING: + source->state = false; + source->stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, source->id_, 0)); + break; + case PW_NODE_STATE_SUSPENDED: + case PW_NODE_STATE_IDLE: + if(source->state == true) + source->timer.start(10000); + break; + case PW_NODE_STATE_RUNNING: + if(source->state == false) + { + source->state = true; + source->stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, source->id_, source->state)); + } + break; + default: + break; + } +} + +void PipeWireSensorSource::nodeAdded(PipeWireHandler::PwNode node) +{ + if(node.name == nodeName_) + { + + sinkNode = static_cast(pw_registry_bind(handler_->getRegistry(), node.id, PW_TYPE_INTERFACE_Node, PW_VERSION_CLIENT, 0)); + if(sinkNode) + { + qDebug()<<"Failed to register to required pipewire node"< +#include +#include +#include +#include + +#include "sensor.h" +#include "../pipewire.h" + +class PipeWireSensorSource : public QObject +{ + Q_OBJECT + + PipeWireHandler* handler_; + std::string nodeName_; + struct pw_node* sinkNode = nullptr; + struct spa_hook sinkListener; + pw_node_state prevState = PW_NODE_STATE_SUSPENDED; + QTimer timer; + uint8_t id_; + bool state = false; + +private slots: + void offTimeout(); + +public: + explicit PipeWireSensorSource(PipeWireHandler* handler, const std::string& nodeName, uint8_t id, QObject *parent = nullptr); + static void nodeEventHandler(void* data, const struct pw_node_info *info); + +signals: + void stateChanged(Sensor sensor); + +private slots: + void nodeAdded(PipeWireHandler::PwNode node); +}; + +#endif // PIPEWIRESENSOR_H diff --git a/src/sensors/sensor.h b/src/sensors/sensor.h index e651054..e64498e 100644 --- a/src/sensors/sensor.h +++ b/src/sensors/sensor.h @@ -34,7 +34,8 @@ public: id(idIn), field(fieldIn), name(nameIn), hidden(hiddenIn) { lastSeen = QDateTime::currentDateTime(); - if(nameIn == "") generateName(); + if(nameIn == "") + generateName(); } Sensor(QString nameIn = "dummy"): type(TYPE_DUMMY), id(0), field(0), name(nameIn), hidden(false) { @@ -58,15 +59,23 @@ public: if(bufferList.size() >= 7) { Sensor sensor(bufferList[2].toUInt(), bufferList[4].toUInt(), bufferList[6].toUInt()); - if(sensor.type == Sensor::TYPE_HUMIDITY || sensor.type == Sensor::TYPE_TEMPERATURE) sensor.field = sensor.field/10; + if(sensor.type == Sensor::TYPE_HUMIDITY || sensor.type == Sensor::TYPE_TEMPERATURE) + sensor.field = sensor.field/10; + + if(bufferList.size() >= 9) + sensor.lastSeen = QDateTime::fromSecsSinceEpoch(bufferList[8].toLongLong()); return sensor; } - else return Sensor(TYPE_DUMMY, 0, 0, "", true); + else + { + return Sensor(TYPE_DUMMY, 0, 0, "", true); + } } QString toString() { return QString("SENSOR TYPE: ")+QString::number(type)+" ID: "+QString::number(id)+" FIELD: "+ - QString::number((type == Sensor::TYPE_HUMIDITY || type == Sensor::TYPE_TEMPERATURE) ? field*10 : field); + QString::number((type == Sensor::TYPE_HUMIDITY || type == Sensor::TYPE_TEMPERATURE) ? field*10 : field) + + " TIME: " + QString::number(lastSeen.toSecsSinceEpoch()); } inline void generateName() { diff --git a/src/ui/itemsettingsdialog.cpp b/src/ui/itemsettingsdialog.cpp index 6df8be7..1bf371c 100644 --- a/src/ui/itemsettingsdialog.cpp +++ b/src/ui/itemsettingsdialog.cpp @@ -144,7 +144,7 @@ void ItemSettingsDialog::addActor() void ItemSettingsDialog::removeActor() { - if(item_->getActors().size() > ui->tableWidget->currentRow()) + if(item_->getActors().size() > static_cast(ui->tableWidget->currentRow())) { item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); loadActorList(); @@ -153,7 +153,7 @@ void ItemSettingsDialog::removeActor() void ItemSettingsDialog::editActor() { - if(item_->getActors().size() > ui->tableWidget->currentRow()) + if(item_->getActors().size() > static_cast(ui->tableWidget->currentRow())) { std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; @@ -177,7 +177,7 @@ void ItemSettingsDialog::editActor() dialog->show(); dialog->exec(); - for(int i = 0; i < ui->tableWidget->rowCount() && i < item_->getActors().size(); ++i) + for(int i = 0; i < ui->tableWidget->rowCount() && i < static_cast(item_->getActors().size()); ++i) { ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName()); ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName()); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 864acbf..b3e317e 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -54,6 +54,8 @@ MainWindow::MainWindow(MainObject * const mainObject, QWidget *parent) : connect(ui->pushButton_addItem, &QPushButton::clicked, this, &MainWindow::showItemCreationDialog); connect(ui->relayList, &ItemScrollBox::deleteRequest, &mainObject->items, &ItemStore::removeItem); + + ui->splitter->setStretchFactor(1, 1); } MainWindow::~MainWindow() diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui index de1eca1..c44b0e9 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -42,178 +42,200 @@ false - + - - - - - - 0 - 0 - - - - QFrame::Box - - - SHinterface - - - Qt::AutoText - - - - - - - Sensors - - - - 2 - - - 2 - - - - - QAbstractItemView::NoSelection - - - false - - - - - - - - - - 0 - + + + Qt::Horizontal + + + false + + + - + - + 0 0 - - - 0 - 0 - - - - - 16777215 - 48 - - - - - 0 - 128 - + + QFrame::Box - Color + SHinterface + + + Qt::AutoText - - - Config Shutdown + + + Sensors + + + 2 + + + 2 + + + + + + 0 + 0 + + + + + 300 + 0 + + + + QAbstractItemView::NoSelection + + + false + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 48 + + + + + 0 + 128 + + + + Color + + + + + + + Config Shutdown + + + + + - - - - - - - - - - 0 - 0 - - - - Items - - - - 2 - - - 2 - - - - - - 0 - 0 - - - - - - - - - - - 0 - + + + - - - Refesh - - - - - - - Save - - - - - - - Add Item - - - - - + - + 0 0 - - Qt::RightToLeft - - - Quit + + Items + + + 2 + + + 2 + + + + + + 0 + 0 + + + + + + + + + 0 + + + + + Refesh + + + + + + + Save + + + + + + + Add Item + + + + + + + + 0 + 0 + + + + Qt::RightToLeft + + + Quit + + + + + - - + + diff --git a/src/ui/sensorlistwidget.cpp b/src/ui/sensorlistwidget.cpp index 2c5c490..b069c7f 100644 --- a/src/ui/sensorlistwidget.cpp +++ b/src/ui/sensorlistwidget.cpp @@ -7,14 +7,14 @@ SensorListWidget::SensorListWidget(const bool showHidden, QWidget *parent): QTableWidget(parent), showHidden_(showHidden) { - setColumnCount(2); + setColumnCount(3); setSelectionBehavior(QAbstractItemView::SelectRows); horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture); setAutoScroll(true); setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor")); - setHorizontalHeaderItem(1, new QTableWidgetItem("Value")); + sensorsChanged(std::vector()); + verticalHeader()->hide(); } SensorListWidget::SensorListWidget(SensorStore& sensorStore, const bool showHidden, @@ -28,8 +28,11 @@ void SensorListWidget::sensorsChanged(std::vector sensors) clear(); setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor")); setHorizontalHeaderItem(1, new QTableWidgetItem("Value")); + setHorizontalHeaderItem(2, new QTableWidgetItem("Time")); size_t listLen = 0; - for(size_t i = 0; i < sensors.size(); ++i) if(showHidden_ || !sensors[i].hidden) ++listLen; + for(size_t i = 0; i < sensors.size(); ++i) + if(showHidden_ || !sensors[i].hidden) + ++listLen; setRowCount(static_cast(listLen)); size_t row = 0; for(size_t i = 0; i < sensors.size(); ++i) @@ -42,20 +45,25 @@ void SensorListWidget::sensorsChanged(std::vector sensors) if(sensors[i].type == Sensor::TYPE_DOOR) { - if(static_cast(sensors[i].field)) itemString.append("\"Open\""); + if(static_cast(sensors[i].field)) + itemString.append("\"Open\""); else itemString.append("\"Closed\""); } else if(sensors[i].type == Sensor::TYPE_AUDIO_OUTPUT) { - if(static_cast(sensors[i].field)) itemString.append("\"Playing\""); + if(static_cast(sensors[i].field)) + itemString.append("\"Playing\""); else itemString.append("\"Silent\""); } - setItem(static_cast(row), 0, new QTableWidgetItem(sensors[i].name + (sensors[i].hidden ? "(H)" : ""))); + setItem(static_cast(row), 0, new QTableWidgetItem(sensors[i].name + (sensors[i].hidden ? " (H)" : ""))); setItem(static_cast(row), 1, new QTableWidgetItem(itemString)); + setItem(static_cast(row), 2, new QTableWidgetItem(sensors[i].lastSeen.time().toString("hh:mm"))); ++row; } } + sortItems(0, Qt::AscendingOrder); + resizeColumnsToContents(); } void SensorListWidget::setShowHidden(const bool showHidden)