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

Make the send button and receive arrow occupy the same space #7503

Merged
18 changes: 7 additions & 11 deletions include/MixerChannelView.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include <QLineEdit>
#include <QPixmap>
#include <QWidget>
#include <QStackedWidget>

namespace lmms
{
Expand All @@ -59,11 +60,6 @@ namespace lmms::gui
Q_PROPERTY(QColor strokeInnerActive READ strokeInnerActive WRITE setStrokeInnerActive)
Q_PROPERTY(QColor strokeInnerInactive READ strokeInnerInactive WRITE setStrokeInnerInactive)
public:
enum class SendReceiveState
{
None, SendToThis, ReceiveFromThis
};

MixerChannelView(QWidget* parent, MixerView* mixerView, int channelIndex);
void paintEvent(QPaintEvent* event) override;
void contextMenuEvent(QContextMenuEvent*) override;
Expand All @@ -74,9 +70,6 @@ namespace lmms::gui
int channelIndex() const;
void setChannelIndex(int index);

SendReceiveState sendReceiveState() const;
void setSendReceiveState(const SendReceiveState& state);

QBrush backgroundActive() const;
void setBackgroundActive(const QBrush& c);

Expand Down Expand Up @@ -115,19 +108,22 @@ namespace lmms::gui

private:
SendButtonIndicator* m_sendButton;
QLabel* m_receiveArrow;
QStackedWidget* m_receiveArrowOrSendButton;
int m_receiveArrowStackedIndex = -1;
int m_sendButtonStackedIndex = -1;

Knob* m_sendKnob;
LcdWidget* m_channelNumberLcd;
QLineEdit* m_renameLineEdit;
QGraphicsView* m_renameLineEditView;
QLabel* m_sendArrow;
QLabel* m_receiveArrow;
PixmapButton* m_muteButton;
PixmapButton* m_soloButton;
PeakIndicator* m_peakIndicator = nullptr;
Fader* m_fader;
EffectRackView* m_effectRackView;
MixerView* m_mixerView;
SendReceiveState m_sendReceiveState = SendReceiveState::None;
int m_channelIndex = 0;
bool m_inRename = false;

Expand All @@ -141,4 +137,4 @@ namespace lmms::gui
};
} // namespace lmms::gui

#endif
#endif // MIXER_CHANNEL_VIEW_H
72 changes: 24 additions & 48 deletions src/gui/MixerChannelView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,33 @@ namespace lmms::gui
widget->setSizePolicy(sizePolicy);
};

auto receiveArrowContainer = new QWidget{};
auto receiveArrowLayout = new QVBoxLayout{receiveArrowContainer};
m_receiveArrow = new QLabel{};
m_receiveArrow->setPixmap(embed::getIconPixmap("receive_bg_arrow"));
receiveArrowLayout->setContentsMargins(0, 0, 0, 0);
receiveArrowLayout->setSpacing(0);
receiveArrowLayout->addWidget(m_receiveArrow, 0, Qt::AlignHCenter);

auto sendButtonContainer = new QWidget{};
auto sendButtonLayout = new QVBoxLayout{sendButtonContainer};
m_sendButton = new SendButtonIndicator{this, this, mixerView};
retainSizeWhenHidden(m_sendButton);
sendButtonLayout->setContentsMargins(0, 0, 0, 0);
sendButtonLayout->setSpacing(0);
sendButtonLayout->addWidget(m_sendButton, 0, Qt::AlignHCenter);

m_receiveArrowOrSendButton = new QStackedWidget{this};
m_receiveArrowStackedIndex = m_receiveArrowOrSendButton->addWidget(receiveArrowContainer);
m_sendButtonStackedIndex = m_receiveArrowOrSendButton->addWidget(sendButtonContainer);
retainSizeWhenHidden(m_receiveArrowOrSendButton);

m_sendKnob = new Knob{KnobType::Bright26, this, tr("Channel send amount")};
retainSizeWhenHidden(m_sendKnob);

m_sendArrow = new QLabel{};
m_sendArrow->setPixmap(embed::getIconPixmap("send_bg_arrow"));
retainSizeWhenHidden(m_sendArrow);

m_channelNumberLcd = new LcdWidget{2, this};
m_channelNumberLcd->setValue(channelIndex);
retainSizeWhenHidden(m_channelNumberLcd);
Expand All @@ -89,16 +110,6 @@ namespace lmms::gui
renameLineEditProxy->setRotation(-90);
m_renameLineEditView->setFixedSize(m_renameLineEdit->height() + 5, m_renameLineEdit->width() + 5);

m_sendArrow = new QLabel{};
m_sendArrow->setPixmap(embed::getIconPixmap("send_bg_arrow"));
retainSizeWhenHidden(m_sendArrow);
m_sendArrow->setVisible(m_sendReceiveState == SendReceiveState::SendToThis);

m_receiveArrow = new QLabel{};
m_receiveArrow->setPixmap(embed::getIconPixmap("receive_bg_arrow"));
retainSizeWhenHidden(m_receiveArrow);
m_receiveArrow->setVisible(m_sendReceiveState == SendReceiveState::ReceiveFromThis);

m_muteButton = new PixmapButton(this, tr("Mute"));
m_muteButton->setModel(&mixerChannel->m_muteModel);
m_muteButton->setActiveGraphic(embed::getIconPixmap("led_off"));
Expand Down Expand Up @@ -131,8 +142,7 @@ namespace lmms::gui
mainLayout->setContentsMargins(4, 4, 4, 4);
mainLayout->setSpacing(2);

mainLayout->addWidget(m_receiveArrow, 0, Qt::AlignHCenter);
mainLayout->addWidget(m_sendButton, 0, Qt::AlignHCenter);
mainLayout->addWidget(m_receiveArrowOrSendButton, 0, Qt::AlignHCenter);
mainLayout->addWidget(m_sendKnob, 0, Qt::AlignHCenter);
mainLayout->addWidget(m_sendArrow, 0, Qt::AlignHCenter);
mainLayout->addWidget(m_channelNumberLcd, 0, Qt::AlignHCenter);
Expand Down Expand Up @@ -179,13 +189,11 @@ namespace lmms::gui

void MixerChannelView::paintEvent(QPaintEvent* event)
{
auto * mixer = Engine::mixer();
const auto channel = mixerChannel();
const bool muted = channel->m_muteModel.value();
const auto name = channel->m_name;
const auto elidedName = elideName(name);
const auto * mixerChannelView = m_mixerView->currentMixerChannel();
const auto isActive = mixerChannelView == this;
const auto isActive = m_mixerView->currentMixerChannel() == this;

if (!m_inRename && m_renameLineEdit->text() != elidedName)
{
Expand Down Expand Up @@ -213,26 +221,6 @@ namespace lmms::gui
painter.setPen(isActive ? strokeOuterActive() : strokeOuterInactive());
painter.drawRect(0, 0, width - MIXER_CHANNEL_OUTER_BORDER_SIZE, height - MIXER_CHANNEL_OUTER_BORDER_SIZE);

const auto & currentMixerChannelIndex = mixerChannelView->m_channelIndex;
const auto sendToThis = mixer->channelSendModel(currentMixerChannelIndex, m_channelIndex) != nullptr;
const auto receiveFromThis = mixer->channelSendModel(m_channelIndex, currentMixerChannelIndex) != nullptr;
const auto sendReceiveStateNone = !sendToThis && !receiveFromThis;

// Only one or none of them can be on
assert(sendToThis ^ receiveFromThis || sendReceiveStateNone);

m_sendArrow->setVisible(sendToThis);
m_receiveArrow->setVisible(receiveFromThis);

if (sendReceiveStateNone)
{
setSendReceiveState(SendReceiveState::None);
}
else
{
setSendReceiveState(sendToThis ? SendReceiveState::SendToThis : SendReceiveState::ReceiveFromThis);
}

QWidget::paintEvent(event);
}

Expand Down Expand Up @@ -284,18 +272,6 @@ namespace lmms::gui
m_channelIndex = index;
}

MixerChannelView::SendReceiveState MixerChannelView::sendReceiveState() const
{
return m_sendReceiveState;
}

void MixerChannelView::setSendReceiveState(const SendReceiveState& state)
{
m_sendReceiveState = state;
m_sendArrow->setVisible(state == SendReceiveState::SendToThis);
m_receiveArrow->setVisible(state == SendReceiveState::ReceiveFromThis);
}

QBrush MixerChannelView::backgroundActive() const
{
return m_backgroundActive;
Expand Down
31 changes: 20 additions & 11 deletions src/gui/MixerView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -343,28 +343,37 @@ void MixerView::setCurrentMixerChannel(MixerChannelView* channel)

void MixerView::updateMixerChannel(int index)
{
Mixer * mix = getMixer();
const auto mixer = getMixer();

// does current channel send to this channel?
int selIndex = m_currentMixerChannel->channelIndex();
auto thisLine = m_mixerChannelViews[index];
const auto currentIndex = m_currentMixerChannel->channelIndex();
const auto thisLine = m_mixerChannelViews[index];
thisLine->setToolTip(getMixer()->mixerChannel(index)->m_name);

FloatModel * sendModel = mix->channelSendModel(selIndex, index);
if (sendModel == nullptr)
const auto sendModelCurrentToThis = mixer->channelSendModel(currentIndex, index);
if (sendModelCurrentToThis == nullptr)
{
// does not send, hide send knob
thisLine->m_sendKnob->setVisible(false);
thisLine->m_sendArrow->setVisible(false);
}
else
{
// it does send, show knob and connect
thisLine->m_sendKnob->setVisible(true);
thisLine->m_sendKnob->setModel(sendModel);
thisLine->m_sendKnob->setModel(sendModelCurrentToThis);
thisLine->m_sendArrow->setVisible(true);
}

const auto sendModelThisToCurrent = mixer->channelSendModel(index, currentIndex);
if (sendModelThisToCurrent)
{
thisLine->m_receiveArrowOrSendButton->setVisible(true);
thisLine->m_receiveArrowOrSendButton->setCurrentIndex(thisLine->m_receiveArrowStackedIndex);
}
else
{
thisLine->m_receiveArrowOrSendButton->setVisible(!mixer->isInfiniteLoop(currentIndex, index));
thisLine->m_receiveArrowOrSendButton->setCurrentIndex(thisLine->m_sendButtonStackedIndex);
}

// disable the send button if it would cause an infinite loop
thisLine->m_sendButton->setVisible(!mix->isInfiniteLoop(selIndex, index));
thisLine->m_sendButton->updateLightStatus();
thisLine->update();
}
Expand Down
Loading