Skip to content

Commit

Permalink
Add pin connector button for all instruments
Browse files Browse the repository at this point in the history
- Add pin connector action to `TrackOperationsWidget`'s menu. The button
is disabled for instruments that don't support the pin connector.
- Revert all changes to `ManageVestigeInstrumentView`
- Minor changes to how the pin connector view is instantiated and closed
  • Loading branch information
messmerd committed Jan 31, 2025
1 parent b96b2f9 commit 15b15cf
Show file tree
Hide file tree
Showing 11 changed files with 88 additions and 53 deletions.
4 changes: 2 additions & 2 deletions include/EffectView.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class EffectView : public PluginView

public slots:
void editControls();
void editPinConnector();
void togglePinConnector();
void moveUp();
void moveDown();
void deletePlugin();
Expand All @@ -98,7 +98,7 @@ public slots:
QMdiSubWindow * m_subWindow;
EffectControlDialog * m_controlView;
QPushButton* m_pinConnectorButton = nullptr;
PluginPinConnectorView* m_pinConnectorView = nullptr;
std::unique_ptr<PluginPinConnectorView> m_pinConnectorView;

bool m_dragging;
QGraphicsOpacityEffect* m_opacityEffect;
Expand Down
4 changes: 4 additions & 0 deletions include/InstrumentTrackView.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ namespace lmms::gui
class InstrumentTrackWindow;
class Knob;
class MidiCCRackView;
class PluginPinConnectorView;
class TrackContainerView;
class TrackLabelButton;

Expand Down Expand Up @@ -71,6 +72,7 @@ class InstrumentTrackView : public TrackView
// Create a menu for assigning/creating channels for this track
QMenu * createMixerMenu( QString title, QString newMixerLabel ) override;

void addPinConnectorAction(QMenu* menu);

protected:
void modelChanged() override;
Expand All @@ -81,6 +83,7 @@ class InstrumentTrackView : public TrackView
private slots:
void toggleInstrumentWindow( bool _on );
void toggleMidiCCRack();
void togglePinConnector();
void activityIndicatorPressed();
void activityIndicatorReleased();

Expand Down Expand Up @@ -112,6 +115,7 @@ private slots:
QAction * m_midiOutputAction;

std::unique_ptr<MidiCCRackView> m_midiCCRackView;
std::unique_ptr<PluginPinConnectorView> m_pinConnectorView;

QPoint m_lastPos;

Expand Down
2 changes: 1 addition & 1 deletion include/PluginPinConnector.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ class LMMS_EXPORT PluginPinConnector
void loadSettings(const QDomElement& elem) override;
auto nodeName() const -> QString override { return "pins"; }

virtual auto instantiateView(QWidget* parent) const -> gui::PluginPinConnectorView*;
virtual auto instantiateView() const -> std::unique_ptr<gui::PluginPinConnectorView>;

auto getChannelCountText() const -> QString;

Expand Down
3 changes: 2 additions & 1 deletion include/PluginPinConnectorView.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ class LMMS_EXPORT PluginPinConnectorView
Q_OBJECT

public:
PluginPinConnectorView(PluginPinConnector* model, QWidget* parent);
PluginPinConnectorView(PluginPinConnector* model);
~PluginPinConnectorView() override;

auto sizeHint() const -> QSize override;
auto minimumSizeHint() const -> QSize override;
Expand Down
36 changes: 4 additions & 32 deletions plugins/Vestige/Vestige.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@
#include "MainWindow.h"
#include "PathUtil.h"
#include "PixmapButton.h"
#include "PluginPinConnectorView.h"
#include "Song.h"
#include "StringPairDrag.h"
#include "SubWindow.h"
Expand Down Expand Up @@ -963,16 +962,11 @@ ManageVestigeInstrumentView::ManageVestigeInstrumentView( VestigeInstrument * _i
l->addWidget( m_displayAutomatedOnly, 0, 1, 1, 2, Qt::AlignLeft );


m_pinConnectorButton = new QPushButton{m_vi->pinConnector()->getChannelCountText(), this};
m_pinConnectorButton->setToolTip(tr("Plugin Pin Connector"));
m_closeButton = new QPushButton( tr( " Close " ), widget );
connect( m_closeButton, SIGNAL( clicked() ), this,
SLOT( closeWindow() ) );

connect(m_pinConnectorButton, &QPushButton::clicked, this, &ManageVestigeInstrumentView::togglePinConnector);

connect(m_vi->pinConnector(), &PluginPinConnector::propertiesChanged, this, [&]() {
m_pinConnectorButton->setText(m_vi->pinConnector()->getChannelCountText());
});

l->addWidget(m_pinConnectorButton, 0, 2, 1, 2, Qt::AlignLeft);
l->addWidget( m_closeButton, 0, 2, 1, 7, Qt::AlignLeft );


for( int i = 0; i < 10; i++ )
Expand Down Expand Up @@ -1048,21 +1042,6 @@ ManageVestigeInstrumentView::ManageVestigeInstrumentView( VestigeInstrument * _i



void ManageVestigeInstrumentView::togglePinConnector()
{
if (!m_pinConnector)
{
m_pinConnector = m_vi->pinConnector()->instantiateView(m_vi->m_subWindow);
}
else
{
m_pinConnector->toggleVisibility();
}
}




void ManageVestigeInstrumentView::closeWindow()
{
m_vi->m_subWindow->hide();
Expand Down Expand Up @@ -1145,13 +1124,6 @@ ManageVestigeInstrumentView::~ManageVestigeInstrumentView()
m_vi->m_scrollArea = nullptr;
}

if (m_pinConnector != nullptr)
{
m_pinConnector->closeWindow();
delete m_pinConnector;
m_pinConnector = nullptr;
}

if ( m_vi->m_subWindow != nullptr ) {
m_vi->m_subWindow->setAttribute(Qt::WA_DeleteOnClose);
m_vi->m_subWindow->close();
Expand Down
5 changes: 1 addition & 4 deletions plugins/Vestige/Vestige.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ namespace gui
class CustomTextKnob;
class ManageVestigeInstrumentView;
class PixmapButton;
class PluginPinConnectorView;
class VestigeInstrumentView;
} // namespace gui

Expand Down Expand Up @@ -123,7 +122,6 @@ protected slots:
void displayAutomatedOnly();
void setParameter( lmms::Model * action );
void syncParameterText();
void togglePinConnector();
void closeWindow();


Expand All @@ -140,8 +138,7 @@ protected slots:
QGridLayout * l;
QPushButton * m_syncButton;
QPushButton * m_displayAutomatedOnly;
QPushButton* m_pinConnectorButton;
PluginPinConnectorView* m_pinConnector = nullptr;
QPushButton * m_closeButton;
CustomTextKnob ** vstKnobs;

} ;
Expand Down
4 changes: 2 additions & 2 deletions src/core/PluginPinConnector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,11 +198,11 @@ void PluginPinConnector::updateAllRoutedChannels()
}
}

auto PluginPinConnector::instantiateView(QWidget* parent) const -> gui::PluginPinConnectorView*
auto PluginPinConnector::instantiateView() const -> std::unique_ptr<gui::PluginPinConnectorView>
{
// This method does not modify the pin connector, but it needs the view to store
// a mutable pointer to the pin connector, hence the const_cast.
return new gui::PluginPinConnectorView{const_cast<PluginPinConnector*>(this), parent};
return std::make_unique<gui::PluginPinConnectorView>(const_cast<PluginPinConnector*>(this));
}

auto PluginPinConnector::getChannelCountText() const -> QString
Expand Down
16 changes: 7 additions & 9 deletions src/gui/EffectView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ EffectView::EffectView( Effect * _model, QWidget * _parent ) :
});

m_pinConnectorButton->setGeometry(144 + 32, 12, 28, 28);
connect(m_pinConnectorButton, &QPushButton::clicked, this, &EffectView::editPinConnector);
connect(m_pinConnectorButton, &QPushButton::clicked, this, &EffectView::togglePinConnector);
}

m_opacityEffect = new QGraphicsOpacityEffect(this);
Expand All @@ -150,12 +150,7 @@ EffectView::EffectView( Effect * _model, QWidget * _parent ) :

EffectView::~EffectView()
{
if (m_pinConnectorView != nullptr)
{
m_pinConnectorView->closeWindow();
delete m_pinConnectorView;
m_pinConnectorView = nullptr;
}
m_pinConnectorView.reset();
delete m_subWindow;
}

Expand Down Expand Up @@ -183,14 +178,17 @@ void EffectView::editControls()



void EffectView::editPinConnector()
void EffectView::togglePinConnector()
{
auto pc = effect()->pinConnector();
if (!pc) { return; }

if (!m_pinConnectorView)
{
m_pinConnectorView = pc->instantiateView(this);
m_pinConnectorView = pc->instantiateView();
connect(pc, &PluginPinConnector::destroyed, [this]() {
m_pinConnectorView.reset();
});
}
else
{
Expand Down
9 changes: 7 additions & 2 deletions src/gui/PluginPinConnectorView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ class PluginPinConnectorView::MatrixView : public QWidget
};


PluginPinConnectorView::PluginPinConnectorView(PluginPinConnector* model, QWidget* parent)
: QWidget{parent}
PluginPinConnectorView::PluginPinConnectorView(PluginPinConnector* model)
: QWidget{}
, ModelView{model, this}
, m_inView{new MatrixView{this, model->in(), true}}
, m_outView{new MatrixView{this, model->out(), false}}
Expand Down Expand Up @@ -145,6 +145,11 @@ PluginPinConnectorView::PluginPinConnectorView(PluginPinConnector* model, QWidge
show();
}

PluginPinConnectorView::~PluginPinConnectorView()
{
closeWindow();
}

auto PluginPinConnectorView::sizeHint() const -> QSize
{
const auto inSize = m_inView->size();
Expand Down
57 changes: 57 additions & 0 deletions src/gui/tracks/InstrumentTrackView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
#include "MainWindow.h"
#include "MidiClient.h"
#include "MidiPortMenu.h"
#include "PluginPinConnector.h"
#include "PluginPinConnectorView.h"
#include "TrackLabelButton.h"


Expand Down Expand Up @@ -205,6 +207,33 @@ void InstrumentTrackView::toggleMidiCCRack()



void InstrumentTrackView::togglePinConnector()
{
const auto it = this->model();
if (!it) { return; }

const auto inst = it->instrument();
if (!inst) { return; }

auto pc = inst->pinConnector();
if (!pc) { return; }

if (!m_pinConnectorView)
{
m_pinConnectorView = pc->instantiateView();
connect(pc, &PluginPinConnector::destroyed, [this]() {
m_pinConnectorView.reset();
});
}
else
{
m_pinConnectorView->toggleVisibility();
}
}




InstrumentTrackWindow * InstrumentTrackView::topLevelInstrumentTrackWindow()
{
InstrumentTrackWindow * w = nullptr;
Expand Down Expand Up @@ -396,6 +425,34 @@ QMenu * InstrumentTrackView::createMixerMenu(QString title, QString newMixerLabe
return mixerMenu;
}

void InstrumentTrackView::addPinConnectorAction(QMenu* menu)
{
assert(menu != nullptr);
const auto addAction = [=, this](const PluginPinConnector* pc = nullptr) {
if (pc)
{
auto pcAction = menu->addAction(embed::getIconPixmap("tool"), tr("Pin connector"),
this, &InstrumentTrackView::togglePinConnector);

pcAction->setToolTip(pc->getChannelCountText());
}
else
{
auto pcAction = menu->addAction(embed::getIconPixmap("tool"), tr("Pin connector"));
pcAction->setDisabled(true);
}
};

const auto it = this->model();
if (!it) { addAction(); return; }

const auto inst = it->instrument();
if (!inst) { addAction(); return; }

const auto pc = inst->pinConnector();
addAction(pc);
}

QPixmap InstrumentTrackView::determinePixmap(InstrumentTrack* instrumentTrack)
{
if (instrumentTrack)
Expand Down
1 change: 1 addition & 0 deletions src/gui/tracks/TrackOperationsWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ void TrackOperationsWidget::updateMenu()
{
toMenu->addSeparator();
toMenu->addMenu(trackView->midiMenu());
trackView->addPinConnectorAction(toMenu);
}
if( dynamic_cast<AutomationTrackView *>( m_trackView ) )
{
Expand Down

0 comments on commit 15b15cf

Please sign in to comment.