From 0e123f886dc8874c1e0988620fe9d496f26e44b3 Mon Sep 17 00:00:00 2001 From: Hane Date: Thu, 16 May 2024 17:23:54 +0200 Subject: [PATCH] sliders value set to where clicked --- qtest.pro | 2 +- src/back/backlasses.cpp | 4 +- src/qt/qtclasses.cpp | 25 +++++++++--- src/qt/qtclasses.h | 11 +++--- src/qt/qtvisuals.h | 84 +++++++++++++++++++++++++++++++++++++++++ src/qtestmain.cpp | 4 +- 6 files changed, 115 insertions(+), 15 deletions(-) create mode 100644 src/qt/qtvisuals.h diff --git a/qtest.pro b/qtest.pro index 42b246a..97274fa 100644 --- a/qtest.pro +++ b/qtest.pro @@ -11,7 +11,7 @@ DESTPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\back\reimpl" VPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\back\reimpl" "$$PWD\src\cont" SOURCES += qtestmain.cpp qtclasses.cpp backlasses.cpp backsessionclasses.cpp contclasses.cpp contsessionclasses.cpp -HEADERS += qtclasses.h backlasses.h backsessionclasses.h contclasses.h contsessionclasses.h global.h debug.h backfuncs.h ipolicyconfig.h msinclude.h +HEADERS += qtclasses.h backlasses.h backsessionclasses.h contclasses.h contsessionclasses.h global.h debug.h backfuncs.h ipolicyconfig.h msinclude.h qtvisuals.h RESOURCES = assets.qrc RC_ICONS += assets/logo.ico diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 1f7b442..bfc0e83 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -1,5 +1,5 @@ -#include -#include +#include "backlasses.h" +#include "backfuncs.h" EndpointNewSessionCallback::EndpointNewSessionCallback(EndpointHandler* eph){ this->eph = eph; diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index efac234..2174d7d 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -6,6 +6,19 @@ CustomWidgetEvent::CustomWidgetEvent(QEvent::Type type, T payload) : QEvent(t this->payload = payload; } + +/* + * MeterSlider::MeterSlider(Qt::Orientation orientation, QWidget* parent) { + * //style = new MixerStyle(); + * //this->setStyle(style); + * } + */ + + +MeterSlider::~MeterSlider() { + //delete style; +} + void MeterSlider::setPeakValue(float peakValue) { this->peakValue = peakValue; } @@ -99,7 +112,7 @@ void MeterSlider::paintEvent(QPaintEvent *event) { ((QWidget*)parent())->layout()->getContentsMargins(&left, &top, &right, &bottom); QStyle *style = QApplication::style(); - int lol = style->pixelMetric(QStyle::PM_SliderSpaceAvailable); + //int lol = style->pixelMetric(QStyle::PM_SliderSpaceAvailable); QPainter painter(this); //painter.setPen(Qt::blue); painter.setOpacity(1.0); @@ -125,8 +138,7 @@ void MeterSlider::paintEvent(QPaintEvent *event) { // - ((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); + 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); } @@ -637,7 +649,7 @@ void EndpointWidget::addSessionWidget(CustomWidgetEvent* ev){ //TODO: change mainwindow's widget name and subclass qwidget const QWidgetList topLevelWidgets = QApplication::topLevelWidgets(); for (QWidget *widget : topLevelWidgets) { - if (dynamic_cast(widget)) { + if (qobject_cast(widget)) { double widthRatio = ((MainWindow*)widget)->widthRatio; sw->calculateSize(std::abs(this->screen()->geometry().width()) * widthRatio, std::abs(this->screen()->geometry().height())); @@ -917,8 +929,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //scrollArea->verticalScrollBar()->setSingleStep(1); - - scrollArea->setStyleSheet("QScrollBar:vertical { width: 4px; }"); + + //custom style = no qss + //scrollArea->setStyleSheet("QScrollBar:vertical { width: 4px; }"); //scrollArea->setMinimumWidth(500); setCentralWidget(scrollArea); diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index c85b9ad..fd9f936 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -1,8 +1,5 @@ #pragma once -//#ifndef MAINWINDOW_H -//#define MAINWINDOW_H - #include #include #include @@ -47,6 +44,7 @@ #include "global.h" #include "contclasses.h" +#include "qtvisuals.h" enum SpawnPos { LEFT = (1 << 1), @@ -76,12 +74,17 @@ public: class MeterSlider : public QSlider { Q_OBJECT private: + ~MeterSlider(); float peakValue; + MixerStyle* style; + protected: bool event(QEvent* ev) override; void paintEvent(QPaintEvent *event) override; public: + //MeterSlider(Qt::Orientation orientation, QWidget *parent = nullptr); + //MeterSlider(QWidget* parent = nullptr) : MeterSlider(Qt::Vertical, parent){}; void setPeakValue(float peakValue); using QSlider::QSlider; }; @@ -278,5 +281,3 @@ private: //void valueChanged(int value); }; - -//#endif diff --git a/src/qt/qtvisuals.h b/src/qt/qtvisuals.h new file mode 100644 index 0000000..5aba5ca --- /dev/null +++ b/src/qt/qtvisuals.h @@ -0,0 +1,84 @@ +#pragma once + +#include + +class MixerStyle : public QProxyStyle { + Q_OBJECT + +public: + using QProxyStyle::QProxyStyle; + + //void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, + //QPainter *p, const QWidget *widget) const override; + + int styleHint(QStyle::StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, + QStyleHintReturn* returnData = 0) const { + if (hint == QStyle::SH_Slider_AbsoluteSetButtons) + return (Qt::LeftButton | Qt::MiddleButton | Qt::RightButton); + return QProxyStyle::styleHint(hint, option, widget, returnData); + } +}; + + +/* + * void MixerStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, + * QPainter *p, const QWidget *widget) const { + * #if QT_CONFIG(slider) + * case CC_Slider: + * if (const QStyleOptionSlider *slider = qstyleoption_cast(opt)) { + * if (slider->subControls == SC_SliderTickmarks) { + * int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider, widget); + * int ticks = slider->tickPosition; + * int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider, widget); + * int len = proxy()->pixelMetric(PM_SliderLength, slider, widget); + * int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider, widget); + * int interval = slider->tickInterval; + * if (interval <= 0) { + * interval = slider->singleStep; + * if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval, + * available) + * - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, + * 0, available) < 3) + * interval = slider->pageStep; + * } + * if (!interval) + * interval = 1; + * int fudge = len / 2; + * int pos; + * // Since there is no subrect for tickmarks do a translation here. + * QPainterStateSaver pss(p); + * p->translate(slider->rect.x(), slider->rect.y()); + * p->setPen(slider->palette.windowText().color()); + * int v = slider->minimum; + * while (v <= slider->maximum + 1) { + * if (v == slider->maximum + 1 && interval == 1) + * break; + * const int v_ = qMin(v, slider->maximum); + * pos = QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, + * v_, available) + fudge; + ** + * if (slider->orientation == Qt::Horizontal) { + * if (ticks & QSlider::TicksAbove) + * p->drawLine(pos, 0, pos, tickOffset - 2); + * if (ticks & QSlider::TicksBelow) + * p->drawLine(pos, tickOffset + thickness + 1, pos, + * slider->rect.height()-1); + * } else { + * if (ticks & QSlider::TicksAbove) + * p->drawLine(0, pos, tickOffset - 2, pos); + * if (ticks & QSlider::TicksBelow) + * p->drawLine(tickOffset + thickness + 1, pos, + * slider->rect.width()-1, pos); + * } + * // in the case where maximum is max int + * int nextInterval = v + interval; + * if (nextInterval < v) + * break; + * v = nextInterval; + * } + * } + * } + * break; +*#endif // QT_CONFIG(slider) +*/ +//} diff --git a/src/qtestmain.cpp b/src/qtestmain.cpp index 1d421cc..e4a6aec 100644 --- a/src/qtestmain.cpp +++ b/src/qtestmain.cpp @@ -46,13 +46,15 @@ void closeDebugFileLog() { */ int main (int argc, char* argv[]) { + /* * QStringList styles = QStyleFactory::keys(); * for(QString a : styles) { * log_debugcpp(a.toStdString()); * } */ - //QApplication::setStyle("Fusion"); + + QApplication::setStyle(new MixerStyle(QStyleFactory::create("windowsvista"))); //Check if running //https://stackoverflow.com/questions/48060989/qt-show-application-if-currently-running initialize_file_log();