mirror of
https://github.com/LMMS/lmms.git
synced 2026-07-27 13:56:36 -04:00
Bugs fixed: 1. Doubled tooltips on some Knobs (see #8358) 2. No dynamic floating text when dragging a Fader (regression from #8253) 3. Volume knobs displaying their units as "dBFS%" rather than just "dBFS" (regression from #8253) 4. Incorrect dBFS value in the dynamic floating text for volume knobs of the Delay and Flanger plugins 5. Incorrect dBFS values in the "Set value" dialog box for volume knobs of the Delay, Dynamics Processor, Flanger, and Wave Shaper plugins 6. Missing "%" unit in the context menu for Vibed's volume knobs 7. Incorrect handling of volume knobs for models that support negative amplitudes (currently only Flanger's feedback amount knob) For (1), I reworked how static tooltips work in FloatModelEditorBase. Rather than use QWidget's tooltips, it shadows the tooltip methods from QWidget and redirects them to the existing SimpleTextFloat-based system. Supporting both "static" and "dynamic" tooltips required some improvements to keep better track of user interactions with the Knobs. There was an existing m_buttonPressed boolean, but this was insufficient, so I converted it into a new InteractionType enum for keeping track of the user interaction state. See the "Expected Behaviour" section of the bug report (#8358) for an explanation of how it works now from the user's perspective.
154 lines
4.6 KiB
C++
154 lines
4.6 KiB
C++
/*
|
|
* delaycontrolsdialog.cpp - definition of DelayControlsDialog class.
|
|
*
|
|
* Copyright (c) 2014 David French <dave/dot/french3/at/googlemail/dot/com>
|
|
*
|
|
* This file is part of LMMS - https://lmms.io
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public
|
|
* License along with this program (see COPYING); if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
#include "AutomatableModel.h"
|
|
#include "DelayControlsDialog.h"
|
|
#include "DelayControls.h"
|
|
#include "DeprecationHelper.h"
|
|
#include "embed.h"
|
|
#include "TempoSyncKnob.h"
|
|
#include "../Eq/EqFader.h"
|
|
#include <QMouseEvent>
|
|
#include <QPainter>
|
|
|
|
namespace lmms::gui
|
|
{
|
|
|
|
|
|
DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) :
|
|
EffectControlDialog( controls )
|
|
{
|
|
setAutoFillBackground( true );
|
|
QPalette pal;
|
|
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
|
|
setPalette( pal );
|
|
setFixedSize( 300, 208 );
|
|
|
|
auto sampleDelayKnob = new TempoSyncKnob(KnobType::Bright26, tr("DELAY"), this, Knob::LabelRendering::LegacyFixedFontSize);
|
|
sampleDelayKnob->move( 10,14 );
|
|
sampleDelayKnob->setModel( &controls->m_delayTimeModel );
|
|
sampleDelayKnob->setHintText(tr("Delay time:"), " s");
|
|
|
|
auto feedbackKnob = new VolumeKnob(KnobType::Bright26, tr("FDBK"), this, Knob::LabelRendering::LegacyFixedFontSize);
|
|
feedbackKnob->move( 11, 58 );
|
|
feedbackKnob->setZeroDbfsPoint(1.f);
|
|
feedbackKnob->setModel( &controls->m_feedbackModel);
|
|
feedbackKnob->setHintText(tr("Feedback amount:"), "");
|
|
|
|
auto lfoFreqKnob = new TempoSyncKnob(KnobType::Bright26, tr("RATE"), this, Knob::LabelRendering::LegacyFixedFontSize);
|
|
lfoFreqKnob->move( 11, 119 );
|
|
lfoFreqKnob->setModel( &controls->m_lfoTimeModel );
|
|
lfoFreqKnob->setHintText(tr("LFO frequency:"), " s");
|
|
|
|
auto lfoAmtKnob = new TempoSyncKnob(KnobType::Bright26, tr("AMNT"), this, Knob::LabelRendering::LegacyFixedFontSize);
|
|
lfoAmtKnob->move( 11, 159 );
|
|
lfoAmtKnob->setModel( &controls->m_lfoAmountModel );
|
|
lfoAmtKnob->setHintText(tr("LFO amount:"), " s");
|
|
|
|
auto outFader
|
|
= new EqFader(&controls->m_outGainModel, tr("Out gain"), this, &controls->m_outPeakL, &controls->m_outPeakR);
|
|
outFader->setMaximumHeight( 196 );
|
|
outFader->move( 263, 45 );
|
|
outFader->setDisplayConversion( false );
|
|
outFader->setHintText(tr("Gain:"), " dBFS");
|
|
|
|
auto pad = new XyPad(this, &controls->m_feedbackModel, &controls->m_delayTimeModel);
|
|
pad->resize( 200, 200 );
|
|
pad->move( 50, 5 );
|
|
}
|
|
|
|
|
|
|
|
|
|
XyPad::XyPad(QWidget *parent, FloatModel *xModel, FloatModel *yModel) :
|
|
QWidget( parent ),
|
|
m_xModel( xModel ),
|
|
m_yModel( yModel ),
|
|
m_acceptInput( false )
|
|
{
|
|
connect( m_xModel, SIGNAL( dataChanged() ) , this, SLOT( update() ) );
|
|
connect( m_yModel, SIGNAL( dataChanged() ) , this, SLOT( update() ) );
|
|
}
|
|
|
|
|
|
|
|
|
|
void XyPad::paintEvent(QPaintEvent *event)
|
|
{
|
|
QPainter painter( this );
|
|
//Draw Frequecy maker lines
|
|
painter.setPen( QPen( QColor( 200, 200, 200, 200 ), 8, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) );
|
|
painter.setRenderHint( QPainter::Antialiasing, true );
|
|
|
|
float xRange = m_xModel->maxValue() - m_xModel->minValue();
|
|
float xInc = xRange / width();
|
|
int xPos = ( m_xModel->value() - m_xModel->minValue() ) / xInc;
|
|
|
|
float yRange = m_yModel->maxValue() - m_yModel->minValue();
|
|
float yInc = yRange / height();
|
|
int yPos = ( m_yModel->value() - m_yModel->minValue() ) / yInc;
|
|
|
|
painter.drawPoint( xPos, yPos );
|
|
}
|
|
|
|
|
|
|
|
|
|
void XyPad::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
m_acceptInput = true;
|
|
}
|
|
|
|
|
|
|
|
|
|
void XyPad::mouseReleaseEvent(QMouseEvent *event)
|
|
{
|
|
m_acceptInput = false;
|
|
}
|
|
|
|
|
|
|
|
|
|
void XyPad::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
const auto pos = position(event);
|
|
|
|
if (m_acceptInput && (pos.x() >= 0) && (pos.x() < width())
|
|
&& (pos.y() >= 0) && (pos.y() < height()))
|
|
{
|
|
//set xmodel
|
|
float xRange = m_xModel->maxValue() - m_xModel->minValue();
|
|
float xInc = xRange / width();
|
|
m_xModel->setValue(m_xModel->minValue() + (pos.x() * xInc));
|
|
|
|
//set ymodel
|
|
float yRange = m_yModel->maxValue() - m_yModel->minValue();
|
|
float yInc = yRange / height();
|
|
m_yModel->setValue(m_yModel->minValue() + (pos.y() * yInc));
|
|
}
|
|
}
|
|
|
|
|
|
} // namespace lmms::gui
|