From 7bae9cced27696d940aa41da409f607eff7b39e3 Mon Sep 17 00:00:00 2001 From: Robert Daniel Black Date: Mon, 15 Mar 2021 17:19:47 -0600 Subject: [PATCH] Improve LMMS knob graphics --- data/themes/classic/style.css | 10 ++- data/themes/default/style.css | 10 ++- include/Knob.h | 26 ++++++-- src/gui/widgets/Knob.cpp | 119 +++++++++++++++++++++------------- 4 files changed, 112 insertions(+), 53 deletions(-) diff --git a/data/themes/classic/style.css b/data/themes/classic/style.css index 6c1dd861926..c4e13a53c0f 100644 --- a/data/themes/classic/style.css +++ b/data/themes/classic/style.css @@ -12,8 +12,16 @@ QMdiArea { } Knob { + qproperty-lineActiveColor: rgb(171, 177, 189); qproperty-lineInactiveColor: rgb(120, 120, 120); - qproperty-arcInactiveColor: rgba(120, 120, 120, 70); + qproperty-arcTopActiveColor: rgba(29, 226, 118); + qproperty-arcTopInactiveColor: rgba(120, 120, 120); + qproperty-arcBottomActiveColor: rgba(120, 120, 120, 70); + qproperty-arcBottomInactiveColor: rgba(120, 120, 120, 70); + qproperty-centerTopActiveColor: rgba(77, 80, 91); + qproperty-centerTopInactiveColor: rgba(77, 80, 91); + qproperty-centerBottomActiveColor: rgba(37, 38, 43); + qproperty-centerBottomInactiveColor: rgba(37, 38, 43); } AutomationEditor { diff --git a/data/themes/default/style.css b/data/themes/default/style.css index 6c291a2de69..82ad3042c7d 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -47,8 +47,16 @@ FileBrowser QCheckBox } Knob { + qproperty-lineActiveColor: rgb(171, 177, 189); qproperty-lineInactiveColor: rgb(120, 120, 120); - qproperty-arcInactiveColor: rgba(120, 120, 120, 70); + qproperty-arcTopActiveColor: rgba(29, 226, 118); + qproperty-arcTopInactiveColor: rgba(120, 120, 120); + qproperty-arcBottomActiveColor: rgba(120, 120, 120, 70); + qproperty-arcBottomInactiveColor: rgba(120, 120, 120, 70); + qproperty-centerTopActiveColor: rgba(77, 80, 91); + qproperty-centerTopInactiveColor: rgba(77, 80, 91); + qproperty-centerBottomActiveColor: rgba(37, 38, 43); + qproperty-centerBottomInactiveColor: rgba(37, 38, 43); } AutomationEditor { diff --git a/include/Knob.h b/include/Knob.h index 5b3ca902253..8929fe2bedf 100644 --- a/include/Knob.h +++ b/include/Knob.h @@ -65,8 +65,14 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView Q_PROPERTY(QColor lineActiveColor MEMBER m_lineActiveColor) Q_PROPERTY(QColor lineInactiveColor MEMBER m_lineInactiveColor) - Q_PROPERTY(QColor arcActiveColor MEMBER m_arcActiveColor) - Q_PROPERTY(QColor arcInactiveColor MEMBER m_arcInactiveColor) + Q_PROPERTY(QColor arcTopActiveColor MEMBER m_arcTopActiveColor) + Q_PROPERTY(QColor arcTopInactiveColor MEMBER m_arcTopInactiveColor) + Q_PROPERTY(QColor arcBottomActiveColor MEMBER m_arcBottomActiveColor) + Q_PROPERTY(QColor arcBottomInactiveColor MEMBER m_arcBottomInactiveColor) + Q_PROPERTY(QColor centerTopActiveColor MEMBER m_centerTopActiveColor) + Q_PROPERTY(QColor centerTopInactiveColor MEMBER m_centerTopInactiveColor) + Q_PROPERTY(QColor centerBottomActiveColor MEMBER m_centerBottomActiveColor) + Q_PROPERTY(QColor centerBottomInactiveColor MEMBER m_centerBottomInactiveColor) mapPropertyFromModel(bool,isVolumeKnob,setVolumeKnob,m_volumeKnob); mapPropertyFromModel(float,volumeRatio,setVolumeRatio,m_volumeRatio); @@ -120,6 +126,8 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView QColor textColor() const; void setTextColor( const QColor & c ); + void setOrigSize( float knobWidth, float knobHeight ); + signals: void sliderPressed(); @@ -197,13 +205,21 @@ private slots: QColor m_lineActiveColor; QColor m_lineInactiveColor; - QColor m_arcActiveColor; - QColor m_arcInactiveColor; - + QColor m_arcTopActiveColor; + QColor m_arcTopInactiveColor; + QColor m_arcBottomActiveColor; + QColor m_arcBottomInactiveColor; + QColor m_centerTopActiveColor; + QColor m_centerTopInactiveColor; + QColor m_centerBottomActiveColor; + QColor m_centerBottomInactiveColor; + QColor m_textColor; knobTypes m_knobNum; + float m_origWidth; + float m_origHeight; } ; #endif diff --git a/src/gui/widgets/Knob.cpp b/src/gui/widgets/Knob.cpp index 98a2683b198..c5d841d7924 100644 --- a/src/gui/widgets/Knob.cpp +++ b/src/gui/widgets/Knob.cpp @@ -96,32 +96,7 @@ void Knob::initUi( const QString & _name ) setOuterRadius( 10.0f ); setFocusPolicy( Qt::ClickFocus ); - // This is a workaround to enable style sheets for knobs which are not styled knobs. - // - // It works as follows: the palette colors that are assigned as the line color previously - // had been hard coded in the drawKnob method for the different knob types. Now the - // drawKnob method uses the line color to draw the lines. By assigning the palette colors - // as the line colors here the knob lines will be drawn in this color unless the stylesheet - // overrides that color. - switch (knobNum()) - { - case knobSmall_17: - case knobBright_26: - case knobDark_28: - m_lineActiveColor = QApplication::palette().color(QPalette::Active, QPalette::WindowText); - m_arcActiveColor = QColor(QApplication::palette().color( - QPalette::Active, QPalette::WindowText)); - m_arcActiveColor.setAlpha(70); - break; - case knobVintage_32: - m_lineActiveColor = QApplication::palette().color(QPalette::Active, QPalette::Shadow); - m_arcActiveColor = QColor(QApplication::palette().color( - QPalette::Active, QPalette::Shadow)); - m_arcActiveColor.setAlpha(70); - break; - default: - break; - } + doConnections(); } @@ -138,15 +113,19 @@ void Knob::onKnobNumUpdated() { case knobDark_28: knobFilename = "knob01"; + setOrigSize( 28, 28 ); break; case knobBright_26: knobFilename = "knob02"; + setOrigSize( 26, 26 ); break; case knobSmall_17: knobFilename = "knob03"; + setOrigSize( 18, 18 ); break; case knobVintage_32: knobFilename = "knob05"; + setOrigSize( 32, 32 ); break; case knobStyled: // only here to stop the compiler from complaining break; @@ -163,6 +142,13 @@ void Knob::onKnobNumUpdated() } +void Knob::setOrigSize( float knobWidth, float knobHeight ) +{ + setFixedSize(knobWidth, knobHeight); + m_origWidth = knobWidth; + m_origHeight = knobHeight; +} + void Knob::setLabel( const QString & txt ) @@ -194,8 +180,9 @@ void Knob::setHtmlLabel(const QString &htmltxt) if (m_knobPixmap) { - setFixedSize(m_knobPixmap->width(), - m_knobPixmap->height() + 15); + setFixedSize( qMax( m_origWidth, + QFontMetrics( pointSizeF( font(), 6.5) ).width( m_label ) ), + m_origHeight + 10 ); } update(); @@ -380,8 +367,36 @@ bool Knob::updateAngle() void Knob::drawKnob( QPainter * _p ) { bool enabled = this->isEnabled(); - QColor currentArcColor = enabled ? m_arcActiveColor : m_arcInactiveColor; - QColor currentLineColor = enabled ? m_lineActiveColor : m_lineInactiveColor; + QColor currentArcTopColor; + QColor currentArcBottomColor; + QColor currentLineColor; + QColor currentCenterTopColor; + QColor currentCenterBottomColor; + + switch (knobNum()) + { + case knobSmall_17: case knobBright_26: case knobDark_28: + { + currentArcTopColor = enabled ? m_arcTopActiveColor : m_arcTopInactiveColor; + currentArcBottomColor = enabled ? m_arcBottomActiveColor : m_arcBottomInactiveColor; + currentLineColor = enabled ? m_lineActiveColor : m_lineInactiveColor; + currentCenterTopColor = enabled ? m_centerTopActiveColor : m_centerTopInactiveColor; + currentCenterBottomColor = enabled ? m_centerBottomActiveColor : m_centerBottomInactiveColor; + break; + } + case knobVintage_32: + { + currentLineColor = QApplication::palette().color(QPalette::Active, QPalette::Shadow); + currentArcTopColor = QColor(QApplication::palette().color(QPalette::Active, QPalette::Shadow)); + currentArcBottomColor = QColor(QApplication::palette().color(QPalette::Active, QPalette::Shadow)); + currentArcBottomColor.setAlpha(70); + currentCenterTopColor = enabled ? m_centerTopActiveColor : m_centerTopInactiveColor; + currentCenterBottomColor = enabled ? m_centerBottomActiveColor : m_centerBottomInactiveColor; + break; + } + default: + break; + } if( updateAngle() == false && !m_cache.isNull() ) { @@ -394,7 +409,7 @@ void Knob::drawKnob( QPainter * _p ) QPainter p( &m_cache ); - QPoint mid; + QPointF mid; if( m_knobNum == knobStyled ) { @@ -426,22 +441,34 @@ void Knob::drawKnob( QPainter * _p ) } - // Old-skool knobs - const float radius = m_knobPixmap->width() / 2.0f - 1; - mid = QPoint( width() / 2, m_knobPixmap->height() / 2 ); - - p.drawPixmap( static_cast( - width() / 2 - m_knobPixmap->width() / 2 ), 0, - *m_knobPixmap ); + const float radius = m_origWidth / 2.f - 4.5f; + mid = QPointF( width() / 2, ceil(m_origHeight / 2.f) ); p.setRenderHint( QPainter::Antialiasing ); + if (m_knobNum == knobSmall_17 || m_knobNum == knobBright_26 || m_knobNum == knobDark_28) + { + QLinearGradient centerGrad(0, 5, 0.f, m_origHeight - 5.f); + centerGrad.setColorAt(0, QColor(77, 80, 91)); + centerGrad.setColorAt(1, QColor(37, 38, 43)); + //p.setPen(QPen(centerGrad, 0)); + p.setPen( QPen( QColor(11, 12, 17), 1, Qt::SolidLine, Qt::RoundCap ) ); + p.setBrush(centerGrad); + p.drawEllipse(mid, radius, radius); + } + else + { + p.drawPixmap( static_cast( + width() / 2 - m_knobPixmap->width() / 2 ), 0, + *m_knobPixmap ); + } + const int centerAngle = angleFromValue( model()->inverseScaledValue( model()->centerValue() ), model()->minValue(), model()->maxValue(), m_totalAngle ); const int arcLineWidth = 2; - const int arcRectSize = m_knobPixmap->width() - arcLineWidth; + const int arcRectSize = m_origWidth - arcLineWidth; - p.setPen(QPen(currentArcColor, 2)); + p.setPen(QPen(currentArcBottomColor, 2)); p.drawArc( mid.x() - arcRectSize/2, 1, arcRectSize, arcRectSize, 315*16, 16*m_totalAngle ); p.setPen(QPen(currentLineColor, 2)); @@ -449,19 +476,18 @@ void Knob::drawKnob( QPainter * _p ) { case knobSmall_17: { - p.drawLine( calculateLine( mid, radius-2 ) ); + p.drawLine( calculateLine( mid, radius-1.5f, 4 ) ); break; } case knobBright_26: { - p.drawLine( calculateLine( mid, radius-5 ) ); + p.drawLine( calculateLine( mid, radius-1.5f, 4 ) ); break; } case knobDark_28: { - const float rb = qMax( ( radius - 10 ) / 3.0, - 0.0 ); - const float re = qMax( ( radius - 4 ), 0.0 ); + const float rb = qMax( ( radius - 10 ) / 3.0, 0.0 ); + const float re = qMax( ( radius - 1.5f ), 0.0 ); QLineF ln = calculateLine( mid, re, rb ); ln.translate( 1, 1 ); p.drawLine( ln ); @@ -469,13 +495,14 @@ void Knob::drawKnob( QPainter * _p ) } case knobVintage_32: { - p.drawLine( calculateLine( mid, radius-2, 2 ) ); + p.drawLine( calculateLine( mid, radius + 2, 2 ) ); break; } case knobStyled: break; } + p.setPen( QPen( currentArcTopColor, 2 ) ); p.drawArc( mid.x() - arcRectSize/2, 1, arcRectSize, arcRectSize, (90-centerAngle)*16, -16*(m_angle-centerAngle) ); p.end();