fixed lots of edge cases revolving role changes

This commit is contained in:
Hane 2025-01-16 22:11:10 +01:00
commit 109330dbbd
2 changed files with 28 additions and 22 deletions

View file

@ -204,15 +204,6 @@ HRESULT EndpointSituationCallback::OnDefaultDeviceChanged(EDataFlow flow, ERole
} }
std::wstring wstringEndpointId = pwstrDeviceId; std::wstring wstringEndpointId = pwstrDeviceId;
log_wdebugcpp(L"we got za defol 4 " + wstringEndpointId); log_wdebugcpp(L"we got za defol 4 " + wstringEndpointId);
//APTTYPE aptType;
//APTTYPEQUALIFIER aptQualifier;
//CoGetApartmentType(
// &aptType,
// &aptQualifier
// );
//std::thread roleChangeThread(&OverseerHandler::roleBucketEntryCallback, this,
// nRole, wstringEndpointId);
//roleChangeThread.detach();
osh->roleBucketEntryCallback(nRole, wstringEndpointId); osh->roleBucketEntryCallback(nRole, wstringEndpointId);
return S_OK; return S_OK;
} }

View file

@ -626,6 +626,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent, uint64_t i
defaultRolesCheckBoxes.at(role)->setDisabled(assignedRoles optor role ? true : false); \ defaultRolesCheckBoxes.at(role)->setDisabled(assignedRoles optor role ? true : false); \
defaultRolesCheckBoxes.at(role)->setText(STRING_##role); \ defaultRolesCheckBoxes.at(role)->setText(STRING_##role); \
connect(defaultRolesCheckBoxes.at(role), &QCheckBox::stateChanged,[this] { \ connect(defaultRolesCheckBoxes.at(role), &QCheckBox::stateChanged,[this] { \
defaultRolesCheckBoxes.at(role)->setChecked(!(defaultRolesCheckBoxes.at(role)->isChecked())); \
this->eph->setRoles(role); \ this->eph->setRoles(role); \
}); \ }); \
widgetLayout->addWidget(defaultRolesCheckBoxes.at(role), row, col++); \ widgetLayout->addWidget(defaultRolesCheckBoxes.at(role), row, col++); \
@ -1200,6 +1201,7 @@ void MainWindow::flushRoleChanges() {
EndpointWidget *newDef = nullptr, *oldDef = nullptr; EndpointWidget *newDef = nullptr, *oldDef = nullptr;
for (uint64_t i = 0; i < ews.size(); i++) { for (uint64_t i = 0; i < ews.size(); i++) {
if(newDef && oldDef) break;
auto epw = this->ews.at(i); auto epw = this->ews.at(i);
if (!epw) continue; if (!epw) continue;
if (epw->getEndpointHandler()->getId() == change.second) { if (epw->getEndpointHandler()->getId() == change.second) {
@ -1218,20 +1220,28 @@ void MainWindow::flushRoleChanges() {
} }
void MainWindow::changeFrontDefaults(Roles role, EndpointWidget* newDef, EndpointWidget* oldDef) { void MainWindow::changeFrontDefaults(Roles role, EndpointWidget* newDef, EndpointWidget* oldDef) {
//Sigh... I hope to get this right when librole is done... //Sigh... MS's naive (non)API didn't help, but...
//todo: STILL BORKED. THEY'RE NOT FORFEITING THEIR OLD POSITION //Since widgets are removed previously, they must be added back.
//debug if (role != Roles::ROLE_COMMUNICATIONS) return; //This produces unneeded vector size increases.
//Also, there's no freaking way this must be this illegible.
//TODO: Rewrite this method. Seriously. You'll have to get to, someday.
if (newDef && !oldDef) { if (newDef && !oldDef) {
newDef->getDefaultRolesWidgets().at(role)->blockSignals(true); newDef->getDefaultRolesWidgets().at(role)->blockSignals(true);
newDef->getEndpointHandler()->assignRoles(role); uint8_t newDefCurRolesReversed = ~(newDef->getEndpointHandler()->getRoles());
QCoreApplication::instance()->postEvent(newDef->getDefaultRolesWidgets().at(role), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange)); if(newDefCurRolesReversed & role) {
newDef->getEndpointHandler()->assignRoles(role);
QCoreApplication::instance()->sendEvent(newDef->getDefaultRolesWidgets().at(role), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange));
}
uint8_t newDefIdx = newDef->getIndex(); uint8_t newDefIdx = newDef->getIndex();
uint8_t newDefRoles = newDef->getEndpointHandler()->getRoles(); uint8_t newDefRoles = newDef->getEndpointHandler()->getRoles();
if (newDefRoles == Roles::ROLE_ALL) { if (newDefRoles == Roles::ROLE_ALL) {
newDef->setIndex(0); newDef->setIndex(0);
this->ews[0] = newDef; this->ews[0] = newDef;
//if (this->ews[1] && newDef->getEndpointHandler()->getId() == endpointId) this->ews[1] = nullptr; if(newDefCurRolesReversed & role) {
QCoreApplication::instance()->postEvent(newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange)); newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL)->blockSignals(true);
QCoreApplication::instance()->sendEvent(newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange));
newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL)->blockSignals(false);
}
} else if ((newDefRoles & Roles::ROLE_MULTIMEDIA) || } else if ((newDefRoles & Roles::ROLE_MULTIMEDIA) ||
(newDefRoles & Roles::ROLE_CONSOLE)){ (newDefRoles & Roles::ROLE_CONSOLE)){
newDef->setIndex(0); newDef->setIndex(0);
@ -1246,14 +1256,15 @@ void MainWindow::changeFrontDefaults(Roles role, EndpointWidget* newDef, Endpoin
else if (oldDef && newDef) { else if (oldDef && newDef) {
newDef->getDefaultRolesWidgets().at(role)->blockSignals(true); newDef->getDefaultRolesWidgets().at(role)->blockSignals(true);
newDef->getEndpointHandler()->assignRoles(role); newDef->getEndpointHandler()->assignRoles(role);
QCoreApplication::instance()->postEvent(newDef->getDefaultRolesWidgets().at(role), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange)); QCoreApplication::instance()->sendEvent(newDef->getDefaultRolesWidgets().at(role), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange));
uint8_t newDefIdx = newDef->getIndex(); uint8_t newDefIdx = newDef->getIndex();
uint8_t newDefRoles = newDef->getEndpointHandler()->getRoles(); uint8_t newDefRoles = newDef->getEndpointHandler()->getRoles();
if (newDefRoles == Roles::ROLE_ALL) { if (newDefRoles == Roles::ROLE_ALL) {
newDef->setIndex(0); newDef->setIndex(0);
this->ews[0] = newDef; this->ews[0] = newDef;
//if (this->ews[1] && newDef->getEndpointHandler()->getId() == endpointId) this->ews[1] = nullptr; newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL)->blockSignals(true);
QCoreApplication::instance()->postEvent(newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange)); QCoreApplication::instance()->sendEvent(newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange));
newDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL)->blockSignals(false);
} else if ((newDefRoles & Roles::ROLE_MULTIMEDIA) || } else if ((newDefRoles & Roles::ROLE_MULTIMEDIA) ||
(newDefRoles & Roles::ROLE_CONSOLE)){ (newDefRoles & Roles::ROLE_CONSOLE)){
newDef->setIndex(0); newDef->setIndex(0);
@ -1267,9 +1278,13 @@ void MainWindow::changeFrontDefaults(Roles role, EndpointWidget* newDef, Endpoin
oldDef->getDefaultRolesWidgets().at(role)->blockSignals(true); oldDef->getDefaultRolesWidgets().at(role)->blockSignals(true);
uint8_t oldDefRoles = oldDef->getEndpointHandler()->getRoles(); uint8_t oldDefRoles = oldDef->getEndpointHandler()->getRoles();
if (oldDefRoles == Roles::ROLE_ALL) QCoreApplication::instance()->postEvent(oldDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange)); if (oldDefRoles == Roles::ROLE_ALL) {
oldDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL)->blockSignals(true);
QCoreApplication::instance()->sendEvent(oldDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange));
oldDef->getDefaultRolesWidgets().at(Roles::ROLE_ALL)->blockSignals(false);
}
oldDef->getEndpointHandler()->removeRoles(role); oldDef->getEndpointHandler()->removeRoles(role);
QCoreApplication::instance()->postEvent(oldDef->getDefaultRolesWidgets().at(role), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange)); QCoreApplication::instance()->sendEvent(oldDef->getDefaultRolesWidgets().at(role), new QEvent((QEvent::Type)CustomQEvent::EndpointDefaultChange));
oldDefRoles = oldDef->getEndpointHandler()->getRoles(); oldDefRoles = oldDef->getEndpointHandler()->getRoles();
//this->ews[oldDef->getIndex()] = nullptr; //this->ews[oldDef->getIndex()] = nullptr;
if ((oldDefRoles & Roles::ROLE_MULTIMEDIA) && if ((oldDefRoles & Roles::ROLE_MULTIMEDIA) &&
@ -1291,7 +1306,7 @@ void MainWindow::changeFrontDefaults(Roles role, EndpointWidget* newDef, Endpoin
log_debugcpp("oldDef new idx: " + std::to_string(oldDef->getIndex())); log_debugcpp("oldDef new idx: " + std::to_string(oldDef->getIndex()));
oldDef->getDefaultRolesWidgets().at(role)->blockSignals(false); oldDef->getDefaultRolesWidgets().at(role)->blockSignals(false);
} }
QCoreApplication::instance()->postEvent QCoreApplication::instance()->sendEvent
(this, new QEvent((QEvent::Type)CustomQEvent::RecomposeMainWindow)); (this, new QEvent((QEvent::Type)CustomQEvent::RecomposeMainWindow));
} }