From fc63875851737b0d22ef514248b26adca0794749 Mon Sep 17 00:00:00 2001 From: Hane Date: Tue, 5 Sep 2023 19:42:30 +0200 Subject: [PATCH] defaults working as expected. bruh --- src/back/backlasses.cpp | 8 +++- src/qt/qtclasses.cpp | 84 +++++++++++++++++++++++++---------------- src/qt/qtclasses.h | 13 ++++++- 3 files changed, 70 insertions(+), 35 deletions(-) diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 083d60c..13ae38e 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -295,7 +295,13 @@ void Endpoint::setRoles(Roles role){ std::wstring command = L"SoundVolumeView.exe /SetDefault " + endpointId + L" "; switch (role) { case Roles::ROLE_ALL: - command += L"all"; + /* + * one sends both, at least for now; + * either cos of ms or dis guy, no choice + * but to treat them as one for now + * command += L"all"; + */ + command += L"0 1"; break; case Roles::ROLE_CONSOLE: command += std::to_wstring(0); diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 2543e1e..0bb0f08 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -1,5 +1,24 @@ #include "qtclasses.h" + +bool ExtendedCheckBox::event(QEvent* ev) { + if (ev->type() == QEvent::User) { + this->blockSignals(true); + if (this->isEnabled()) { + this->setCheckState(Qt::Checked); + this->setDisabled(true); + } else { + this->setDisabled(false); + this->setCheckState(Qt::Unchecked); + } + this->blockSignals(false); + return true; + } + // Make sure the rest of events are handled + return QCheckBox::event(ev); +} + + EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *parent) : QWidget(parent){ this->idx = idx; this->eph = eph; @@ -9,10 +28,10 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare if (parent == nullptr) { log_debugcpp("owo?"); } defaultRolesCheckBoxes = { - {Roles::ROLE_ALL, new QCheckBox()}, - {Roles::ROLE_CONSOLE, new QCheckBox()}, - {Roles::ROLE_MULTIMEDIA, new QCheckBox()}, - {Roles::ROLE_COMMUNICATIONS, new QCheckBox()} + {Roles::ROLE_ALL, new ExtendedCheckBox()}, + {Roles::ROLE_CONSOLE, new ExtendedCheckBox()}, + {Roles::ROLE_MULTIMEDIA, new ExtendedCheckBox()}, + {Roles::ROLE_COMMUNICATIONS, new ExtendedCheckBox()} }; muteButton = new QCheckBox(); @@ -32,11 +51,12 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare mainSlider->setValue((int)volume); log_debugcpp("ENDPOINT SET WITH VOLUME " << volume); + //todo: parent mainMuteLayout = new QGridLayout(); - layout->addLayout(mainMuteLayout, 0, 0); + layout->addLayout(mainMuteLayout, 0, 0, 2, 1, Qt::AlignLeft | Qt::AlignBottom); mainMuteLayout->addWidget(mainLabel, 0, 0); mainMuteLayout->addWidget(muteButton, 0, 1); - layout->addWidget(mainSlider, 0, 1); + layout->addWidget(mainSlider, 0, 2, 1, 2, Qt::AlignLeft | Qt::AlignBottom); //TODO:0 = mute and muted, change volume = unmuted are client side tricks = 2 callbacks, one for volume, one for mute state. Implement as an user selectable option? connect(mainSlider, &QSlider::valueChanged, this,&EndpointWidget::updateMainVolume); @@ -55,8 +75,8 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare tmpLb->setText(QString::number(volume)); this->channelSliders.push_back(tmp); this->channelLabels.push_back(tmpLb); - layout->addWidget(tmp, 1, i); - layout->addWidget(tmpLb, 2, i); + layout->addWidget(tmp, 2, i, 1, 2, Qt::AlignLeft | Qt::AlignTop); + layout->addWidget(tmpLb, 3, i, 1, 2, Qt::AlignLeft | Qt::AlignTop); //TODO: check if there's a need to prevent deadlocks; probably this will eventually turn into its own func //this causes channel bar desync when back -> front. blocksignals below fix it. huh. connect(tmp, &QSlider::valueChanged, [this, i](int newValue){ @@ -95,19 +115,20 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare this->eph->setRoles(Roles::ROLE_MULTIMEDIA); //todo: bloquiar pto }); + connect(defaultRolesCheckBoxes.at(Roles::ROLE_COMMUNICATIONS), &QCheckBox::stateChanged,[this] { this->eph->setRoles(Roles::ROLE_COMMUNICATIONS); //todo: bloquiar pto - }); + }); - layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_ALL), 3, 0); - layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_CONSOLE), 3, 1); - layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_MULTIMEDIA), 3, 2); - layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_COMMUNICATIONS), 3, 3); + layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_ALL), 5, 0); + layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_CONSOLE), 5, 1); + layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_MULTIMEDIA), 5, 2); + layout->addWidget(defaultRolesCheckBoxes.at(Roles::ROLE_COMMUNICATIONS), 5, 3); //Polling time - timer = new QTimer(this); + timer = new QTimer(); connect(timer, &QTimer::timeout, [this, eph](){ //if (memcmp(osh->callbackInfo[idx]->caller, osh->getGuid(), sizeof(NGuid)) == 0) return; CHECK IF THIS PROGRAM GENERATED THE FUNSIES IS NO LONGER IN USE FOR NOW. const float roundingFactor = 0.005; @@ -130,9 +151,11 @@ EndpointWidget::EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *pare muteButton->blockSignals(false); }); timer->start(10); - - layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 4, 0); - layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 4, 1); + //todo parent? + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Minimum), 1, 0); + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Minimum), 4, 0); + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 6, 0); + layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 6, 1); log_debugcpp("ENDPOINT_WIDGETED"); } @@ -212,6 +235,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { trayIcon = new QSystemTrayIcon(); trayIconMenu = new QMenu(); trayIconMenuQuit = new QAction(STRING_QUIT); + changeDefaultCheckboxEnablement = new QEvent(QEvent::User); + changeDefaultCheckboxEnablement->setAccepted(true); widget->setLayout(layout); setCentralWidget(widget); @@ -244,15 +269,12 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { //not necessary to keep endpointState flags up to date right now, but updating it will allow for later config files / profiles epw->defaultRolesCheckBoxes.at(role)->blockSignals(true); epw->getEndpointHandler()->assignRoles(role); - epw->defaultRolesCheckBoxes.at(role)->setCheckState(Qt::Checked); - //epw->defaultRolesCheckBoxes.at(role)->setDisabled(true); - epw->defaultRolesCheckBoxes.at(role)->blockSignals(false); + epw->defaultRolesCheckBoxes.at(role)->blockSignals(false); + QCoreApplication::instance()->postEvent(epw->defaultRolesCheckBoxes.at(role), changeDefaultCheckboxEnablement); + //epw->defaultRolesCheckBoxes.at(role)->postEnableChange(); if (epw->getEndpointHandler()->getRoles() == Roles::ROLE_ALL) { - epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->blockSignals(true); - epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->setCheckState(Qt::Checked); - //epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->setDisabled(true); - epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->blockSignals(false); + QCoreApplication::instance()->postEvent(epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL), changeDefaultCheckboxEnablement); } /* @@ -269,19 +291,15 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { */ } else { if (epw->getEndpointHandler()->getRoles() & role) { + if (epw->getEndpointHandler()->getRoles() == Roles::ROLE_ALL) { + QCoreApplication::instance()->postEvent(epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL), changeDefaultCheckboxEnablement); + } + epw->defaultRolesCheckBoxes.at(role)->blockSignals(true); epw->getEndpointHandler()->removeRoles(role); - epw->defaultRolesCheckBoxes.at(role)->setCheckState(Qt::Unchecked); //epw->defaultRolesCheckBoxes.at(role)->setDisabled(false); epw->defaultRolesCheckBoxes.at(role)->blockSignals(false); - - if (!epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->isEnabled()) { - epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->blockSignals(true); - //epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->setDisabled(false); - epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->setCheckState(Qt::Unchecked); - epw->defaultRolesCheckBoxes.at(Roles::ROLE_ALL)->blockSignals(false); - - } + QCoreApplication::instance()->postEvent(epw->defaultRolesCheckBoxes.at(role), changeDefaultCheckboxEnablement); } } diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 062c308..df21c9b 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -57,6 +57,16 @@ * }; */ + +class ExtendedCheckBox : public QCheckBox { + Q_OBJECT + + +public: + bool event(QEvent* ev) override; + +}; + class EndpointWidget : public QWidget { Q_OBJECT @@ -76,7 +86,7 @@ public: std::vector channelLabels; QGridLayout *layout = nullptr; QGridLayout *mainMuteLayout = nullptr; - std::map defaultRolesCheckBoxes; + std::map defaultRolesCheckBoxes; //void updateMainVolume(float newValue); //void updateVolume(uint32_t channel, float newValue); @@ -127,6 +137,7 @@ private: QSystemTrayIcon *trayIcon; QMenu *trayIconMenu; QAction *trayIconMenuQuit; + QEvent* changeDefaultCheckboxEnablement; //public slots: // void setEndpointHandlers(std::vector *ephs);