From 75fdfaa095c57ac9188895804ddac44cd56c71a8 Mon Sep 17 00:00:00 2001 From: Hane Date: Thu, 2 May 2024 19:59:41 +0200 Subject: [PATCH 1/2] wip: peak meter visual ratio --- src/back/backsessionclasses.cpp | 1 - src/qt/qtclasses.cpp | 15 ++++++++++----- src/qtestmain.cpp | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/back/backsessionclasses.cpp b/src/back/backsessionclasses.cpp index fd33728..80eeac8 100644 --- a/src/back/backsessionclasses.cpp +++ b/src/back/backsessionclasses.cpp @@ -104,7 +104,6 @@ Session::Session(Endpoint* ep, IAudioSessionControl2* sessionControl, size_t idx if (FAILED(sessionControl->QueryInterface(__uuidof(IAudioMeterInformation), (void**)&meterInformation))) { log_wdebugcpp(L"sPeakbros......"); }; //meterInformation = (IAudioMeterInformation*)sessionControl; - AudioSessionState msState; sessionControl->GetState(&msState); switch (msState) { diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 4cfbcb1..64a09df 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -1,4 +1,5 @@ #include "qtclasses.h" +#define POLLING_RATE 2 template CustomWidgetEvent::CustomWidgetEvent(QEvent::Type type, T payload) : QEvent(type){ @@ -32,10 +33,14 @@ void MeterSlider::paintEvent(QPaintEvent *event) { painter.setClipping(false); painter.setCompositionMode(QPainter::CompositionMode::CompositionMode_Source); float peakLength = (this->width() * (this->peakValue)); + double stepWidth = (double)this->width() * ((double)this->singleStep() / (this->maximum() - this->minimum())); + //Fusion seems to fuck around with bar's height and width //const qreal dpr = painter->device()->devicePixelRatio(); - QStyleOptionSlider slider = QStyleOptionSlider(); - QRect test = QApplication::style()->subControlRect(QStyle::CC_Slider, (QStyleOptionComplex*)&slider, QStyle::SC_SliderHandle); - painter.fillRect(0, (this->height() / 2) - 3, (this->width() * (this->peakValue)), 4, Qt::green); + QStyleOptionSlider slider = QStyleOptionSlider(); //slider.initFrom(this); + QRect test = style->subControlRect(QStyle::CC_Slider, (QStyleOptionComplex*)&slider, QStyle::SC_SliderHandle); + //QApplication::style()->subControlRect(QStyle::CC_Slider, (QStyleOptionComplex*)&slider, QStyle::SC_SliderHandle); + painter.fillRect(0, (this->height() / 2) - 3, (this->width() - ((this->maximum() - this->value()) * stepWidth)) * this->peakValue, + 4, Qt::green); } void ExtendedCheckBox::customEvent(QEvent* ev) { @@ -260,7 +265,7 @@ SessionWidget::SessionWidget(uint64_t idx, SessionHandler* sh, QWidget *parent) mainSlider->blockSignals(false); muteButton->blockSignals(false); }); - volumePoller->start(2); + volumePoller->start(POLLING_RATE); } void SessionWidget::calculateSize(uint64_t width, uint64_t height) { @@ -507,7 +512,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent, uint64_t i mainSlider->blockSignals(false); muteButton->blockSignals(false); }); - timer->start(2); + timer->start(POLLING_RATE); /* First Widget batch */ for (size_t i = 0; i < eph->getSessionCount(); i++) { diff --git a/src/qtestmain.cpp b/src/qtestmain.cpp index 075b992..1d421cc 100644 --- a/src/qtestmain.cpp +++ b/src/qtestmain.cpp @@ -52,7 +52,7 @@ int main (int argc, char* argv[]) { * log_debugcpp(a.toStdString()); * } */ - QApplication::setStyle("Fusion"); + //QApplication::setStyle("Fusion"); //Check if running //https://stackoverflow.com/questions/48060989/qt-show-application-if-currently-running initialize_file_log(); From c7d77c30ab4afe40ea287cd99120de374b8cbdcf Mon Sep 17 00:00:00 2001 From: Hane Date: Thu, 2 May 2024 23:25:06 +0200 Subject: [PATCH 2/2] wip: slider draw algo --- src/qt/qtclasses.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index 64a09df..12355d7 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -11,6 +11,69 @@ void MeterSlider::setPeakValue(float peakValue) { } void MeterSlider::paintEvent(QPaintEvent *event) { + QStyleOptionSlider sliderComplex = QStyleOptionSlider(); + sliderComplex.initFrom(this); + /* + * sliderComplex.initFrom(this); + * sliderComplex.subControls = QStyle::SC_None; + * sliderComplex.activeSubControls = QStyle::SC_None; + * sliderComplex.orientation = this->orientation(); + * sliderComplex.maximum = this->maximum(); + * sliderComplex.minimum = this->minimum(); + * sliderComplex.tickPosition = (QSlider::TickPosition)this->tickPosition(); + * sliderComplex.tickInterval = this->tickInterval(); + * sliderComplex.upsideDown = (this->orientation() == Qt::Horizontal) ? + * (this->invertedAppearance() != (sliderComplex.direction == Qt::RightToLeft)) + * : (!this->invertedAppearance()); + * sliderComplex.direction = Qt::LeftToRight; // we use the upsideDown option instead + * sliderComplex.sliderPosition = this->sliderPosition(); + * sliderComplex.sliderValue = this->value(); + * sliderComplex.singleStep = this->singleStep(); + * sliderComplex.pageStep = this->pageStep(); + * if (this->orientation() == Qt::Horizontal) + * sliderComplex.state |= QStyle::State_Horizontal; + * + * if (this->isSliderDown()) { + * sliderComplex.activeSubControls = QStyle::SC_SliderHandle; + * sliderComplex.state |= QStyle::State_Sunken; + * } else { + * sliderComplex.activeSubControls = QStyle::SC_SliderHandle; + * } + * + * //sliderComplex.subControls = QStyle::SC_SliderGroove; + * if (this->tickPosition() != NoTicks) sliderComplex.subControls |= QStyle::SC_SliderTickmarks; + * QStylePainter p(this); + * p.drawComplexControl(QStyle::CC_Slider, sliderComplex); + */ + + /* + * QStyleOptionSlider sliderComplex2 = QStyleOptionSlider(); + * sliderComplex2.initFrom(this); + * sliderComplex2.orientation = this->orientation(); + * sliderComplex2.maximum = this->maximum(); + * sliderComplex2.minimum = this->minimum(); + * sliderComplex2.tickPosition = (QSlider::TickPosition)this->tickPosition(); + * sliderComplex2.tickInterval = this->tickInterval(); + * sliderComplex2.upsideDown = (this->orientation() == Qt::Horizontal) ? + * (this->invertedAppearance() != (sliderComplex2.direction == Qt::RightToLeft)) + * : (!this->invertedAppearance()); + * sliderComplex2.subControls = QStyle::SC_SliderHandle; + * sliderComplex2.direction = Qt::LeftToRight; // we use the upsideDown option instead + * sliderComplex2.sliderPosition = this->sliderPosition(); + * sliderComplex2.sliderValue = this->value(); + * sliderComplex2.singleStep = this->singleStep(); + * sliderComplex2.pageStep = this->pageStep(); + * if (this->orientation() == Qt::Horizontal) + * sliderComplex2.state |= QStyle::State_Horizontal; + * + * if (this->isSliderDown()) { + * sliderComplex2.activeSubControls = QStyle::SC_SliderHandle; + * sliderComplex2.state |= QStyle::State_Sunken; + * } else { + * sliderComplex2.activeSubControls = QStyle::SC_SliderHandle; + * } + */ + //Q_D(QSlider); /* * QStylePainter p(this); @@ -23,7 +86,9 @@ void MeterSlider::paintEvent(QPaintEvent *event) { * * //p.drawComplexControl(QStyle::CC_Slider, opt); */ - QSlider::paintEvent(event); + //QSlider::paintEvent(event); + int left = 0, top = 0, right = 0, bottom = 0; + ((QWidget*)parent())->layout()->getContentsMargins(&left, &top, &right, &bottom); QStyle *style = QApplication::style(); int lol = style->pixelMetric(QStyle::PM_SliderSpaceAvailable); @@ -36,11 +101,26 @@ void MeterSlider::paintEvent(QPaintEvent *event) { double stepWidth = (double)this->width() * ((double)this->singleStep() / (this->maximum() - this->minimum())); //Fusion seems to fuck around with bar's height and width //const qreal dpr = painter->device()->devicePixelRatio(); - QStyleOptionSlider slider = QStyleOptionSlider(); //slider.initFrom(this); - QRect test = style->subControlRect(QStyle::CC_Slider, (QStyleOptionComplex*)&slider, QStyle::SC_SliderHandle); + //QStyleOptionSlider sliderComplex = QStyleOptionSlider(); //slider.initFrom(this); + QRect sliderSize = style->subControlRect(QStyle::CC_Slider, (QStyleOptionComplex*)&sliderComplex, QStyle::SC_SliderHandle); + int handleCenterPos = QStyle::sliderPositionFromValue(this->minimum(), this->maximum(), this->value(), this->width()); + int unattenuatedPeakMeter = ((this->width() * this->peakValue) >= handleCenterPos - (sliderSize.width() / 2)) + ? this->width() - (sliderSize.width() / 2) + : this->width() * this->peakValue; //QApplication::style()->subControlRect(QStyle::CC_Slider, (QStyleOptionComplex*)&slider, QStyle::SC_SliderHandle); + painter.fillRect(0, (this->height() / 2) - 3, this->width(), + 4, Qt::white); + painter.fillRect(0, (this->height() / 2) - 3, this->width() * this->peakValue, + 4, Qt::gray); painter.fillRect(0, (this->height() / 2) - 3, (this->width() - ((this->maximum() - this->value()) * stepWidth)) * this->peakValue, 4, Qt::green); + // - ((this->maximum() - this->value()) * stepWidth)) + //double ratio = ; + double handleShift = (double)((sliderSize.width() * ((double)(this->maximum() - this->value()) / 100))); + painter.fillRect((this->width() - ((this->maximum() - this->value()) * stepWidth)) - (sliderSize.width()) + handleShift, + top / 2, sliderSize.width(), sliderSize.height() - bottom, Qt::magenta); + //sliderComplex.subControls = QStyle::SC_SliderHandle; + //p.drawComplexControl(QStyle::CC_Slider, sliderComplex); } void ExtendedCheckBox::customEvent(QEvent* ev) {