sessions dynamically removed

This commit is contained in:
Hane 2024-02-03 20:32:49 +01:00
commit 5211b70669
9 changed files with 114 additions and 73 deletions

View file

@ -95,6 +95,11 @@ void SessionWidget::updateMainVolume(int newValue){
this->sh->setVolume(osh->getGuid(), AudioChannel::CHANNEL_MAIN, newValue);
}
SessionWidget::~SessionWidget() {
volumePoller->stop();
delete volumePoller;
}
EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *parent) : QWidget(parent){
//todo: based on qgridlayout, name+mute should be its own widget, same with channels
row = 0;
@ -261,12 +266,17 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare
layout->addWidget(sessionWidget, row, 4);
row++;
sessionWidgets.push_back(sessionWidget);
eph->getSessionHandlers().at(i)->setFrontIndex(i);
}
/* New SessionWidget callback */
/* Add/Remove SessionWidget callback */
eph->setAddSessionWidgetFunction([this](SessionHandler* sessionHandler) {
QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent<SessionHandler*>((QEvent::Type)CustomQEvent::SessionWidgetCreated, sessionHandler));
});
eph->setRemoveSessionWidgetFunction([this](SessionHandler* sessionHandler) {
QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent<SessionHandler*>((QEvent::Type)CustomQEvent::SessionWidgetObsolete, sessionHandler));
});
//todo parent?
layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Minimum), 1, 0);
@ -277,23 +287,34 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare
}
void EndpointWidget::addSessionWidget(CustomWidgetEvent<SessionHandler*>* ev){
SessionWidget* sw = new SessionWidget(this->sessionWidgets.size(), ev->payload, this);
uint64_t index = this->sessionWidgets.size();
SessionWidget* sw = new SessionWidget(index, ev->payload, this);
ev->payload->setFrontIndex(index);
this->layout->addWidget(sw, row, 4);
row++;
sessionWidgets.push_back(sw);
return;
}
void EndpointWidget::removeSessionWidget(CustomWidgetEvent<SessionHandler*>* ev){
uint64_t i = ev->payload->getFrontIndex();
this->sessionWidgets.at(i)->setParent(nullptr);
this->layout->removeWidget(sessionWidgets.at(i));
delete sessionWidgets.at(i);
sessionWidgets.at(i) = nullptr;
ev->payload->setFrontIndex(INT_MAX);
//this->sessionWidgetsUpdateTimer->start();
return;
}
void EndpointWidget::customEvent(QEvent* ev) {
if (ev->type() == (QEvent::Type)CustomQEvent::SessionWidgetCreated) {
ev->setAccepted(true);
this->addSessionWidget((CustomWidgetEvent<SessionHandler*>*) ev);
return;
} else if (ev->type() == (QEvent::Type)CustomQEvent::SessionWidgetObsolete) {
ev->setAccepted(true);
//this->addEndpointWidget((CustomWidgetEvent<EndpointHandler*>*)ev);
this->removeSessionWidget((CustomWidgetEvent<SessionHandler*>*) ev);
}
// Make sure the rest of events are handled
QWidget::customEvent(ev);
}
@ -308,12 +329,10 @@ void MainWindow::customEvent(QEvent* ev) {
if (ev->type() == CustomQEvent::EndpointWidgetObsolete) {
ev->setAccepted(true);
this->removeEndpointWidget((CustomWidgetEvent<uint64_t>*)ev);
return;
} else if (ev->type() == (QEvent::Type)CustomQEvent::EndpointWidgetCreated) {
ev->setAccepted(true);
this->addEndpointWidget((CustomWidgetEvent<EndpointHandler*>*)ev);
}
// Make sure the rest of events are handled
QMainWindow::customEvent(ev);
}
@ -326,15 +345,6 @@ void MainWindow::removeEndpointWidget(CustomWidgetEvent<uint64_t>* ev){
delete ews.at(i);
ews.at(i) = nullptr;
this->ewsUpdateTimer->start();
/*
* while ((i + 1) < ews.size()) {
* ews.at(i) = ews.at(i + 1);
* ews.at(i)->setIndex(i);
* i++;
* }
* ews.pop_back();
*/
return;
}
@ -346,6 +356,7 @@ void MainWindow::addEndpointWidget(CustomWidgetEvent<EndpointHandler*>* ev){
}
void MainWindow::reorderEndpointWidgetCollection() {
/* Flatten */
size_t firstNullPosition = 0;
size_t ewsSize = ews.size();
bool breakSorting = false;