diff --git a/data/themes/classic/style.css b/data/themes/classic/style.css index cf609066a81..3aa3d6674d2 100644 --- a/data/themes/classic/style.css +++ b/data/themes/classic/style.css @@ -11,6 +11,11 @@ QMdiArea { background-image: url(resources:background_artwork.png); } +Knob { + qproperty-lineInactiveColor: rgb(120, 120, 120); + qproperty-arcInactiveColor: rgba(120, 120, 120, 70); +} + AutomationEditor { background-color: rgb(0, 0, 0); color: #e0e0e0; diff --git a/data/themes/default/style.css b/data/themes/default/style.css index feb85a612b0..fcf9d4361f4 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -40,6 +40,11 @@ QMdiArea { background-color: #111314; } +Knob { + qproperty-lineInactiveColor: rgb(120, 120, 120); + qproperty-arcInactiveColor: rgba(120, 120, 120, 70); +} + AutomationEditor { color: #ffffff; background-color: #141616; diff --git a/include/Knob.h b/include/Knob.h index b129bc8d690..3c730e3dd60 100644 --- a/include/Knob.h +++ b/include/Knob.h @@ -26,6 +26,8 @@ #ifndef KNOB_H #define KNOB_H +#include +#include #include #include @@ -41,6 +43,7 @@ enum knobTypes } ; +void convertPixmapToGrayScale(QPixmap &pixMap); class LMMS_EXPORT Knob : public QWidget, public FloatModelView { @@ -58,8 +61,12 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView // Unfortunately, the gradient syntax doesn't create our gradient // correctly so we need to do this: Q_PROPERTY(QColor outerColor READ outerColor WRITE setOuterColor) - Q_PROPERTY(QColor lineColor READ lineColor WRITE setlineColor) - Q_PROPERTY(QColor arcColor READ arcColor WRITE setarcColor) + + 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) + mapPropertyFromModel(bool,isVolumeKnob,setVolumeKnob,m_volumeKnob); mapPropertyFromModel(float,volumeRatio,setVolumeRatio,m_volumeRatio); @@ -74,7 +81,6 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView Knob( knobTypes _knob_num, QWidget * _parent = NULL, const QString & _name = QString() ); Knob( QWidget * _parent = NULL, const QString & _name = QString() ); //!< default ctor Knob( const Knob& other ) = delete; - virtual ~Knob(); // TODO: remove inline void setHintText( const QString & _txt_before, @@ -108,10 +114,6 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView QColor outerColor() const; void setOuterColor( const QColor & c ); - QColor lineColor() const; - void setlineColor( const QColor & c ); - QColor arcColor() const; - void setarcColor( const QColor & c ); QColor textColor() const; void setTextColor( const QColor & c ); @@ -134,6 +136,7 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView void mouseDoubleClickEvent( QMouseEvent * _me ) override; void paintEvent( QPaintEvent * _me ) override; void wheelEvent( QWheelEvent * _me ) override; + void changeEvent(QEvent * ev) override; virtual float getValue( const QPoint & _p ); @@ -169,7 +172,7 @@ private slots: QString m_label; - QPixmap * m_knobPixmap; + std::unique_ptr m_knobPixmap; BoolModel m_volumeKnob; FloatModel m_volumeRatio; @@ -187,8 +190,11 @@ private slots: float m_outerRadius; float m_lineWidth; QColor m_outerColor; - QColor m_lineColor; //!< unused yet - QColor m_arcColor; //!< unused yet + + QColor m_lineActiveColor; + QColor m_lineInactiveColor; + QColor m_arcActiveColor; + QColor m_arcInactiveColor; QColor m_textColor; diff --git a/src/gui/widgets/Knob.cpp b/src/gui/widgets/Knob.cpp index 920c9765ddb..60b671556a2 100644 --- a/src/gui/widgets/Knob.cpp +++ b/src/gui/widgets/Knob.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -45,6 +46,7 @@ #include "MainWindow.h" #include "ProjectJournal.h" #include "Song.h" +#include "stdshims.h" #include "StringPairDrag.h" #include "TextFloat.h" @@ -57,7 +59,6 @@ Knob::Knob( knobTypes _knob_num, QWidget * _parent, const QString & _name ) : QWidget( _parent ), FloatModelView( new FloatModel( 0, 0, 0, 1, NULL, _name, true ), this ), m_label( "" ), - m_knobPixmap( NULL ), m_volumeKnob( false ), m_volumeRatio( 100.0, 0.0, 1000000.0 ), m_buttonPressed( false ), @@ -104,10 +105,16 @@ void Knob::initUi( const QString & _name ) case knobSmall_17: case knobBright_26: case knobDark_28: - setlineColor(QApplication::palette().color( QPalette::Active, QPalette::WindowText )); + 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: - setlineColor(QApplication::palette().color( QPalette::Active, QPalette::Shadow )); + 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; @@ -143,8 +150,11 @@ void Knob::onKnobNumUpdated() } // If knobFilename is still empty here we should get the fallback pixmap of size 1x1 - m_knobPixmap = new QPixmap( embed::getIconPixmap( knobFilename.toUtf8().constData() ) ); - + m_knobPixmap = make_unique(QPixmap(embed::getIconPixmap(knobFilename.toUtf8().constData()))); + if (!this->isEnabled()) + { + convertPixmapToGrayScale(*m_knobPixmap.get()); + } setFixedSize( m_knobPixmap->width(), m_knobPixmap->height() ); } } @@ -152,17 +162,6 @@ void Knob::onKnobNumUpdated() -Knob::~Knob() -{ - if( m_knobPixmap ) - { - delete m_knobPixmap; - } -} - - - - void Knob::setLabel( const QString & txt ) { m_label = txt; @@ -307,35 +306,6 @@ void Knob::setOuterColor( const QColor & c ) -QColor Knob::lineColor() const -{ - return m_lineColor; -} - - - -void Knob::setlineColor( const QColor & c ) -{ - m_lineColor = c; -} - - - -QColor Knob::arcColor() const -{ - return m_arcColor; -} - - - -void Knob::setarcColor( const QColor & c ) -{ - m_arcColor = c; -} - - - - QColor Knob::textColor() const { return m_textColor; @@ -382,6 +352,10 @@ 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; + if( updateAngle() == false && !m_cache.isNull() ) { _p->drawImage( 0, 0, m_cache ); @@ -440,33 +414,24 @@ void Knob::drawKnob( QPainter * _p ) const int arcLineWidth = 2; const int arcRectSize = m_knobPixmap->width() - arcLineWidth; - QColor col; - if( m_knobNum == knobVintage_32 ) - { col = QApplication::palette().color( QPalette::Active, QPalette::Shadow ); } - else - { col = QApplication::palette().color( QPalette::Active, QPalette::WindowText ); } - col.setAlpha( 70 ); - - p.setPen( QPen( col, 2 ) ); + p.setPen(QPen(currentArcColor, 2)); p.drawArc( mid.x() - arcRectSize/2, 1, arcRectSize, arcRectSize, 315*16, 16*m_totalAngle ); + p.setPen(QPen(currentLineColor, 2)); switch( m_knobNum ) { case knobSmall_17: { - p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-2 ) ); break; } case knobBright_26: { - p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-5 ) ); break; } case knobDark_28: { - p.setPen( QPen( lineColor(), 2 ) ); const float rb = qMax( ( radius - 10 ) / 3.0, 0.0 ); const float re = qMax( ( radius - 4 ), 0.0 ); @@ -477,7 +442,6 @@ void Knob::drawKnob( QPainter * _p ) } case knobVintage_32: { - p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-2, 2 ) ); break; } @@ -839,3 +803,35 @@ void Knob::doConnections() this, SLOT( update() ) ); } } + + +void Knob::changeEvent(QEvent * ev) +{ + if (ev->type() == QEvent::EnabledChange) + { + onKnobNumUpdated(); + if (!m_label.isEmpty()) + { + setLabel(m_label); + } + m_cache = QImage(); + update(); + } +} + + +void convertPixmapToGrayScale(QPixmap& pixMap) +{ + QImage temp = pixMap.toImage().convertToFormat(QImage::Format_ARGB32); + for (int i = 0; i < temp.height(); ++i) + { + for (int j = 0; j < temp.width(); ++j) + { + const auto pix = temp.pixelColor(i, j); + const auto gscale = 0.2126 * pix.redF() + 0.7152 * pix.greenF() + 0.0722 * pix.blueF(); + const auto pixGray = QColor::fromRgbF(gscale, gscale, gscale, pix.alphaF()); + temp.setPixelColor(i, j, pixGray); + } + } + pixMap.convertFromImage(temp); +}