Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Individual knob labels rendered using the widget font #7525

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/CustomTextKnob.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class LMMS_EXPORT CustomTextKnob : public Knob

CustomTextKnob( const Knob& other ) = delete;

static CustomTextKnob* buildKnobWithSmallPixelFont(KnobType knobNum, QWidget* parent, const QString& description, const QString& label);

inline void setValueText(const QString & _value_text)
{
m_value_text = _value_text;
Expand Down
33 changes: 31 additions & 2 deletions include/Knob.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,34 @@ class LMMS_EXPORT Knob : public FloatModelEditorBase
Knob( QWidget * _parent = nullptr, const QString & _name = QString() ); //!< default ctor
Knob( const Knob& other ) = delete;

void setLabel( const QString & txt );
static Knob* buildLegacyKnob(KnobType knobNum, const QString& label, QWidget* parent, const QString& name = QString());
static Knob* buildKnobWithSmallPixelFont(KnobType knobNum, const QString& label, QWidget* parent, const QString& name = QString());

void setLabel(const QString& txt);
void setHtmlLabel( const QString &htmltxt );

/*!
* Legacy mode affects how the label of the knob is rendered.
*
* In non-legacy mode (the default) the height of the label text is taken into account when a new fixed
* size is computed for the Knob. When the label text is painted the descent of the font is used to
* compute the base line.
*
* Enabling legacy mode leads to the following behavior:
* * The height of the label is not taken into account when the new fixed height of the Knob is computed.
* Instead a fixed size of 10 is added for the label.
* * When the knob is painted the baseline of the font is always set to 2 pixels away from the lower side
* of the Knob's rectangle.
*/
bool legacyMode() const { return m_legacyMode; }
michaelgregorius marked this conversation as resolved.
Show resolved Hide resolved

/*!
* Set the button to legacy mode (true) or non-legacy mode (false).
*
* @see legacyMode().
*/
void setLegacyMode(bool legacyMode);

void setTotalAngle( float angle );

// Begin styled knob accessors
Expand Down Expand Up @@ -113,7 +138,7 @@ class LMMS_EXPORT Knob : public FloatModelEditorBase


protected:
void paintEvent( QPaintEvent * _me ) override;
void paintEvent(QPaintEvent*) override;

void changeEvent(QEvent * ev) override;

Expand All @@ -122,14 +147,18 @@ class LMMS_EXPORT Knob : public FloatModelEditorBase
float _innerRadius = 1) const;

void drawKnob( QPainter * _p );
void drawLabel(QPainter& p);
bool updateAngle();

int angleFromValue( float value, float minValue, float maxValue, float totalAngle ) const
{
return static_cast<int>( ( value - 0.5 * ( minValue + maxValue ) ) / ( maxValue - minValue ) * m_totalAngle ) % 360;
}

void updateFixedSize();

QString m_label;
bool m_legacyMode = false;
bool m_isHtmlLabel;
QTextDocument* m_tdRenderer;

Expand Down
3 changes: 3 additions & 0 deletions include/TempoSyncKnob.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ class LMMS_EXPORT TempoSyncKnob : public Knob
TempoSyncKnob( KnobType knobNum, QWidget* parent = nullptr, const QString& name = QString() );
~TempoSyncKnob() override;

static TempoSyncKnob* buildLegacyKnob(KnobType knobNum, const QString& label, QWidget* parent);
static TempoSyncKnob* buildKnobWithSmallPixelFont(KnobType knobNum, const QString& label, QWidget* parent);

const QString & syncDescription();
void setSyncDescription( const QString & _new_description );

Expand Down
21 changes: 12 additions & 9 deletions plugins/Amplifier/AmplifierControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
#include "embed.h"
#include "Knob.h"

#include <QGridLayout>


namespace lmms::gui
{

Expand All @@ -38,23 +41,23 @@ AmplifierControlDialog::AmplifierControlDialog(AmplifierControls* controls) :
QPalette pal;
pal.setBrush(backgroundRole(), PLUGIN_NAME::getIconPixmap("artwork"));
setPalette(pal);
setFixedSize(100, 110);

QGridLayout* gridLayout = new QGridLayout(this);

auto makeKnob = [this](int x, int y, const QString& label, const QString& hintText, const QString& unit, FloatModel* model, bool isVolume)
auto makeKnob = [this](const QString& label, const QString& hintText, const QString& unit, FloatModel* model, bool isVolume)
{
Knob* newKnob = new Knob(KnobType::Bright26, this);
newKnob->move(x, y);
Knob* newKnob = new Knob(KnobType::Bright26, this);
newKnob->setModel(model);
newKnob->setLabel(label);
newKnob->setLabel(label);
newKnob->setHintText(hintText, unit);
newKnob->setVolumeKnob(isVolume);
return newKnob;
};

makeKnob(16, 10, tr("VOL"), tr("Volume:"), "%", &controls->m_volumeModel, true);
makeKnob(57, 10, tr("PAN"), tr("Panning:"), "%", &controls->m_panModel, false);
makeKnob(16, 65, tr("LEFT"), tr("Left gain:"), "%", &controls->m_leftModel, true);
makeKnob(57, 65, tr("RIGHT"), tr("Right gain:"), "%", &controls->m_rightModel, true);
gridLayout->addWidget(makeKnob(tr("VOL"), tr("Volume:"), "%", &controls->m_volumeModel, true), 0, 0, Qt::AlignHCenter);
gridLayout->addWidget(makeKnob(tr("PAN"), tr("Panning:"), "%", &controls->m_panModel, false), 0, 1, Qt::AlignHCenter);
gridLayout->addWidget(makeKnob(tr("LEFT"), tr("Left gain:"), "%", &controls->m_leftModel, true), 1, 0, Qt::AlignHCenter);
gridLayout->addWidget(makeKnob(tr("RIGHT"), tr("Right gain:"), "%", &controls->m_rightModel, true), 1, 1, Qt::AlignHCenter);
}

} // namespace lmms::gui
7 changes: 3 additions & 4 deletions plugins/BassBooster/BassBoosterControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ BassBoosterControlDialog::BassBoosterControlDialog( BassBoosterControls* control
QPalette pal;
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
setPalette( pal );
setFixedSize( 120, 60 );

auto tl = new QVBoxLayout(this);
tl->addSpacing( 4 );
Expand All @@ -52,17 +51,17 @@ BassBoosterControlDialog::BassBoosterControlDialog( BassBoosterControls* control

auto freqKnob = new Knob(KnobType::Bright26, this);
freqKnob->setModel( &controls->m_freqModel );
freqKnob->setLabel( tr( "FREQ" ) );
freqKnob->setLabel(tr("FREQ"));
freqKnob->setHintText( tr( "Frequency:" ) , "Hz" );

auto gainKnob = new Knob(KnobType::Bright26, this);
gainKnob->setModel( &controls->m_gainModel );
gainKnob->setLabel( tr( "GAIN" ) );
gainKnob->setLabel(tr("GAIN"));
gainKnob->setHintText( tr( "Gain:" ) , "" );

auto ratioKnob = new Knob(KnobType::Bright26, this);
ratioKnob->setModel( &controls->m_ratioModel );
ratioKnob->setLabel( tr( "RATIO" ) );
ratioKnob->setLabel(tr("RATIO"));
ratioKnob->setHintText( tr( "Ratio:" ) , "" );

l->addWidget( freqKnob );
Expand Down
26 changes: 12 additions & 14 deletions plugins/Bitcrush/BitcrushControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "embed.h"
#include "BitcrushControlDialog.h"
#include "BitcrushControls.h"
#include "FontHelper.h"
#include "LedCheckBox.h"
#include "Knob.h"

Expand All @@ -46,37 +47,37 @@ BitcrushControlDialog::BitcrushControlDialog( BitcrushControls * controls ) :
setFixedSize( 181, 128 );

// labels
const auto labelFont = adjustedToPixelSize(font(), DEFAULT_FONT_SIZE);

auto inLabel = new QLabel(tr("IN"), this);
inLabel->setFont(labelFont);
inLabel->move( 24, 15 );

auto outLabel = new QLabel(tr("OUT"), this);
outLabel->setFont(labelFont);
outLabel->move( 139, 15 );

// input knobs
auto inGain = new Knob(KnobType::Bright26, this);
auto inGain = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, tr("GAIN"), this);
inGain->move( 16, 32 );
inGain->setModel( & controls->m_inGain );
inGain->setLabel( tr( "GAIN" ) );
inGain->setHintText( tr( "Input gain:" ) , " dBFS" );

auto inNoise = new Knob(KnobType::Bright26, this);
auto inNoise = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, tr("NOISE"), this);
inNoise->move( 14, 76 );
inNoise->setModel( & controls->m_inNoise );
inNoise->setLabel( tr( "NOISE" ) );
inNoise->setHintText( tr( "Input noise:" ) , "%" );


// output knobs
auto outGain = new Knob(KnobType::Bright26, this);
auto outGain = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, tr("GAIN"), this);
outGain->move( 138, 32 );
outGain->setModel( & controls->m_outGain );
outGain->setLabel( tr( "GAIN" ) );
outGain->setHintText( tr( "Output gain:" ) , " dBFS" );

auto outClip = new Knob(KnobType::Bright26, this);
auto outClip = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, tr("CLIP"), this);
outClip->move( 138, 76 );
outClip->setModel( & controls->m_outClip );
outClip->setLabel( tr( "CLIP" ) );
outClip->setHintText( tr( "Output clip:" ) , " dBFS");


Expand All @@ -94,24 +95,21 @@ BitcrushControlDialog::BitcrushControlDialog( BitcrushControls * controls ) :


// rate crushing knobs
auto rate = new Knob(KnobType::Bright26, this);
auto rate = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, tr("FREQ"), this);
rate->move( 59, 32 );
rate->setModel( & controls->m_rate );
rate->setLabel( tr( "FREQ" ) );
rate->setHintText( tr( "Sample rate:" ) , " Hz" );

auto stereoDiff = new Knob(KnobType::Bright26, this);
auto stereoDiff = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, tr("STEREO"), this);
stereoDiff->move( 72, 76 );
stereoDiff->setModel( & controls->m_stereoDiff );
stereoDiff->setLabel( tr( "STEREO" ) );
stereoDiff->setHintText( tr( "Stereo difference:" ) , "%" );


// depth crushing knob
auto levels = new Knob(KnobType::Bright26, this);
auto levels = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, tr("QUANT"), this);
levels->move( 92, 32 );
levels->setModel( & controls->m_levels );
levels->setLabel( tr( "QUANT" ) );
levels->setHintText( tr( "Levels:" ) , "" );
}

Expand Down
17 changes: 9 additions & 8 deletions plugins/CarlaBase/Carla.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1006,28 +1006,29 @@ void CarlaParamsView::refreshKnobs()

for (uint32_t i = 0; i < m_carlaInstrument->m_paramModels.size(); ++i)
{
bool enabled = m_carlaInstrument->m_paramModels[i]->enabled();
m_knobs.push_back(new Knob(KnobType::Dark28, m_inputScrollAreaWidgetContent));
QString name = (*m_carlaInstrument->m_paramModels[i]).displayName();
const auto currentParamModel = m_carlaInstrument->m_paramModels[i];

bool enabled = currentParamModel->enabled();
const QString name = currentParamModel->displayName();
m_knobs.push_back(Knob::buildLegacyKnob(KnobType::Dark28, name, m_inputScrollAreaWidgetContent));
m_knobs[i]->setHintText(name, "");
m_knobs[i]->setLabel(name);
m_knobs[i]->setObjectName(name); // this is being used for filtering the knobs.

// Set the newly created model to the knob.
m_knobs[i]->setModel(m_carlaInstrument->m_paramModels[i]);
m_knobs[i]->setModel(currentParamModel);
m_knobs[i]->setEnabled(enabled);

if (enabled)
{
// Collect group names
if (!groupNameList.contains(m_carlaInstrument->m_paramModels[i]->groupName()))
if (!groupNameList.contains(currentParamModel->groupName()))
{
groupNameList.append(m_carlaInstrument->m_paramModels[i]->groupName());
groupNameList.append(currentParamModel->groupName());
}

// Store biggest knob width per group (so we can calc how many
// knobs we can horizontaly fit)
uint8_t groupId = m_carlaInstrument->m_paramModels[i]->groupId();
uint8_t groupId = currentParamModel->groupId();
if (m_maxKnobWidthPerGroup[groupId] < m_knobs[i]->width())
{
m_maxKnobWidthPerGroup[groupId] = m_knobs[i]->width();
Expand Down
9 changes: 3 additions & 6 deletions plugins/CrossoverEQ/CrossoverEQControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,22 +49,19 @@ CrossoverEQControlDialog::CrossoverEQControlDialog( CrossoverEQControls * contro
setFixedSize( 167, 178 );

// knobs
auto xover12 = new Knob(KnobType::Bright26, this);
auto xover12 = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, "1/2", this);
xover12->move( 29, 11 );
xover12->setModel( & controls->m_xover12 );
xover12->setLabel( "1/2" );
xover12->setHintText( tr( "Band 1/2 crossover:" ), " Hz" );

auto xover23 = new Knob(KnobType::Bright26, this);
auto xover23 = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, "2/3", this);
xover23->move( 69, 11 );
xover23->setModel( & controls->m_xover23 );
xover23->setLabel( "2/3" );
xover23->setHintText( tr( "Band 2/3 crossover:" ), " Hz" );

auto xover34 = new Knob(KnobType::Bright26, this);
auto xover34 = Knob::buildKnobWithSmallPixelFont(KnobType::Bright26, "3/4", this);
xover34->move( 109, 11 );
xover34->setModel( & controls->m_xover34 );
xover34->setLabel( "3/4" );
xover34->setHintText( tr( "Band 3/4 crossover:" ), " Hz" );

QPixmap const fader_knob(PLUGIN_NAME::getIconPixmap("fader_knob2"));
Expand Down
12 changes: 4 additions & 8 deletions plugins/Delay/DelayControlsDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,32 +44,28 @@ DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) :
setPalette( pal );
setFixedSize( 300, 208 );

auto sampleDelayKnob = new TempoSyncKnob(KnobType::Bright26, this);
auto sampleDelayKnob = TempoSyncKnob::buildLegacyKnob(KnobType::Bright26, tr("DELAY"), this);
sampleDelayKnob->move( 10,14 );
sampleDelayKnob->setVolumeKnob( false );
sampleDelayKnob->setModel( &controls->m_delayTimeModel );
sampleDelayKnob->setLabel( tr( "DELAY" ) );
sampleDelayKnob->setHintText( tr( "Delay time" ) + " ", " s" );

auto feedbackKnob = new Knob(KnobType::Bright26, this);
auto feedbackKnob = Knob::buildLegacyKnob(KnobType::Bright26, tr("FDBK"), this);
feedbackKnob->move( 11, 58 );
feedbackKnob->setVolumeKnob( true) ;
feedbackKnob->setModel( &controls->m_feedbackModel);
feedbackKnob->setLabel( tr( "FDBK" ) );
feedbackKnob->setHintText( tr ( "Feedback amount" ) + " " , "" );

auto lfoFreqKnob = new TempoSyncKnob(KnobType::Bright26, this);
auto lfoFreqKnob = TempoSyncKnob::buildLegacyKnob(KnobType::Bright26, tr("RATE"), this);
lfoFreqKnob->move( 11, 119 );
lfoFreqKnob->setVolumeKnob( false );
lfoFreqKnob->setModel( &controls->m_lfoTimeModel );
lfoFreqKnob->setLabel( tr( "RATE" ) );
lfoFreqKnob->setHintText( tr ( "LFO frequency") + " ", " s" );

auto lfoAmtKnob = new TempoSyncKnob(KnobType::Bright26, this);
auto lfoAmtKnob = TempoSyncKnob::buildLegacyKnob(KnobType::Bright26, tr("AMNT"), this);
lfoAmtKnob->move( 11, 159 );
lfoAmtKnob->setVolumeKnob( false );
lfoAmtKnob->setModel( &controls->m_lfoAmountModel );
lfoAmtKnob->setLabel( tr( "AMNT" ) );
lfoAmtKnob->setHintText( tr ( "LFO amount" ) + " " , " s" );

auto outFader
Expand Down
16 changes: 10 additions & 6 deletions plugins/Dispersion/DispersionControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
#include "LcdSpinBox.h"
#include "PixmapButton.h"

#include <QHBoxLayout>


namespace lmms::gui
{
Expand All @@ -43,39 +45,41 @@ DispersionControlDialog::DispersionControlDialog(DispersionControls* controls) :
QPalette pal;
pal.setBrush(backgroundRole(), PLUGIN_NAME::getIconPixmap("artwork"));
setPalette(pal);
setFixedSize(207, 50);

auto layout = new QHBoxLayout(this);

LcdSpinBox * m_amountBox = new LcdSpinBox(3, this, "Amount");
m_amountBox->setModel(&controls->m_amountModel);
m_amountBox->move(5, 10);
m_amountBox->setLabel(tr("AMOUNT"));
m_amountBox->setToolTip(tr("Number of all-pass filters"));

Knob * freqKnob = new Knob(KnobType::Bright26, this);
freqKnob->move(59, 8);
freqKnob->setModel(&controls->m_freqModel);
freqKnob->setLabel(tr("FREQ"));
freqKnob->setHintText(tr("Frequency:") , " Hz");

Knob * resoKnob = new Knob(KnobType::Bright26, this);
resoKnob->move(99, 8);
resoKnob->setModel(&controls->m_resoModel);
resoKnob->setLabel(tr("RESO"));
resoKnob->setHintText(tr("Resonance:") , " octaves");

Knob * feedbackKnob = new Knob(KnobType::Bright26, this);
feedbackKnob->move(139, 8);
feedbackKnob->setModel(&controls->m_feedbackModel);
feedbackKnob->setLabel(tr("FEED"));
feedbackKnob->setHintText(tr("Feedback:") , "");

PixmapButton * dcButton = new PixmapButton(this, tr("DC Offset Removal"));
dcButton->move(176, 16);
dcButton->setActiveGraphic(PLUGIN_NAME::getIconPixmap("dc_active"));
dcButton->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("dc_inactive"));
dcButton->setCheckable(true);
dcButton->setModel(&controls->m_dcModel);
dcButton->setToolTip(tr("Remove DC Offset"));

layout->addWidget(m_amountBox);
layout->addWidget(freqKnob);
layout->addWidget(resoKnob);
layout->addWidget(feedbackKnob);
layout->addWidget(dcButton);
}


Expand Down
Loading
Loading