Skip to content

Commit

Permalink
Add bar controller with tempo sync option
Browse files Browse the repository at this point in the history
Add `TempoSyncBarModelEditor` which adds a tempo sync option to a `BarModelEditor`. Please note that the code was mostly copied and adjusted from the `TempoSyncKnob` class. It was not attempted yet to unify some of the code because with the current design it seems to be a road to "inheritance hell". A better solution might be to refactor the code so that it is more composable.

Another option might be to move the tempo sync functionality into a class like `FloatModelEditorBase`. Although this would not be a 100% right place either because `TempoSyncKnobModel` inherits from `FloatModel`. In that case we'd have specialized code in a generic base class.

Adjust `LadspaWidgetFactory` so that it now returns an instance of a `TempoSyncBarModelEditor` instead of a `TempoSyncKnob`.

Remove the extra layout code from `LadspaMatrixControlDialog.cpp` as most things are bar editors now.

Adjust `TempoSyncKnobModel` so we do not have to make `TempoSyncBarModelEditor` a friend of it.
  • Loading branch information
michaelgregorius committed Sep 7, 2023
1 parent add834e commit b79a8dc
Show file tree
Hide file tree
Showing 6 changed files with 410 additions and 18 deletions.
88 changes: 88 additions & 0 deletions include/TempoSyncBarModelEditor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* TempoSyncBarModelEditor.h - adds bpm to ms conversion for the bar editor class
*
* Copyright (c) 2005-2008 Danny McRae <khjklujn/at/yahoo.com>
* Copyright (c) 2009-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2023 Michael Gregorius
*
* 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.
*
*/

#ifndef LMMS_GUI_TEMPO_SYNC_BAR_MODEL_EDITOR_H
#define LMMS_GUI_TEMPO_SYNC_BAR_MODEL_EDITOR_H

#include <QPixmap>
#include <QPointer>

#include "BarModelEditor.h"
#include "TempoSyncKnobModel.h"

namespace lmms::gui
{

class MeterDialog;

class LMMS_EXPORT TempoSyncBarModelEditor : public BarModelEditor
{
Q_OBJECT
public:
TempoSyncBarModelEditor(QString text, FloatModel * floatModel, QWidget * parent = nullptr);
~TempoSyncBarModelEditor() override;

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

const QPixmap & syncIcon();
void setSyncIcon( const QPixmap & _new_pix );

TempoSyncKnobModel * model()
{
return castModel<TempoSyncKnobModel>();
}

void modelChanged() override;


signals:
void syncDescriptionChanged( const QString & _new_description );
void syncIconChanged();


protected:
void contextMenuEvent( QContextMenuEvent * _me ) override;


protected slots:
void updateDescAndIcon();
void showCustom();


private:
QPixmap m_tempoSyncIcon;
QString m_tempoSyncDescription;

QPointer<MeterDialog> m_custom;

} ;



} // namespace lmms::gui

#endif // LMMS_GUI_TEMPO_SYNC_BAR_MODEL_EDITOR_H
3 changes: 3 additions & 0 deletions include/TempoSyncKnobModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ class LMMS_EXPORT TempoSyncKnobModel : public FloatModel

void setScale( float _new_scale );

MeterModel & getCustomMeterModel() { return m_custom; }
MeterModel const & getCustomMeterModel() const { return m_custom; }

signals:
void syncModeChanged( lmms::TempoSyncKnobModel::SyncMode _new_mode );
void scaleChanged( float _new_scale );
Expand Down
6 changes: 1 addition & 5 deletions plugins/LadspaEffect/LadspaMatrixControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,11 +166,7 @@ void LadspaMatrixControlDialog::arrangeControls(QWidget * parent, QGridLayout* g
QWidget * controlWidget = LadspaWidgetFactory::createWidget(ladspaControl, this);
if (controlWidget)
{
// Align time based controls, i.e. knobs, in the center.
// This defeats the purpose of the widget factory a bit but it makes the design look nicer.
auto alignment = ladspaControl->port()->data_type == BufferDataType::Time ? Qt::AlignCenter : Qt::Alignment();

gridLayout->addWidget(controlWidget, currentRow, currentChannelColumn, alignment);
gridLayout->addWidget(controlWidget, currentRow, currentChannelColumn);
}

// Record the maximum row so that we add a vertical spacer after that row
Expand Down
15 changes: 2 additions & 13 deletions plugins/LadspaEffect/LadspaWidgetFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
// TODO Only for testing! Remove!
#include "FloatModelEditorBase.h"
#include "LedCheckBox.h"
#include "TempoSyncKnob.h"
#include "TempoSyncBarModelEditor.h"

#include <QLabel>

Expand All @@ -44,8 +44,6 @@ namespace lmms::gui

QWidget * LadspaWidgetFactory::createWidget(LadspaControl * ladspaControl, QWidget * parent)
{
Knob * knob = nullptr;

auto const * port = ladspaControl->port();

QString const name = port->name;
Expand All @@ -66,21 +64,12 @@ QWidget * LadspaWidgetFactory::createWidget(LadspaControl * ladspaControl, QWidg
return new BarModelEditor(name, ladspaControl->knobModel(), parent);

case BufferDataType::Time:
knob = new TempoSyncKnob(KnobType::Bright26, parent, name);
knob->setModel(ladspaControl->tempoSyncKnobModel());
knob->setLabel(name);
break;
return new TempoSyncBarModelEditor(name, ladspaControl->tempoSyncKnobModel(), parent);

default:
return new QLabel(QObject::tr("%1 (unsupported)").arg(name), parent);
}

if (knob != nullptr)
{
knob->setHintText(QObject::tr("Value:"), "");
return knob;
}

return nullptr;
}

Expand Down
1 change: 1 addition & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ SET(LMMS_SRCS
gui/widgets/SimpleTextFloat.cpp
gui/widgets/TabBar.cpp
gui/widgets/TabWidget.cpp
gui/widgets/TempoSyncBarModelEditor.cpp
gui/widgets/TempoSyncKnob.cpp
gui/widgets/TextFloat.cpp
gui/widgets/TimeDisplayWidget.cpp
Expand Down
Loading

0 comments on commit b79a8dc

Please sign in to comment.