From 6233c5b9e4ec64d40bba39d1f448ad74020148f4 Mon Sep 17 00:00:00 2001 From: Fawn Date: Tue, 11 Mar 2025 12:30:04 -0600 Subject: [PATCH] Update mute and solo buttons, add them to instrument windows (#7708) * Add mute and solo buttons to instrument windows * Change mute and solo buttons to optimized CC0 SVG assets * Icons provided by @StakeoutPunch, button backgrounds provided by @RebeccaDeField --------- Co-authored-by: Sotonye Atemie Co-authored-by: Rebecca Noel Ati Co-authored-by: Stakeout Punch --- data/themes/CMakeLists.txt | 3 +- data/themes/default/mute_active.svg | 37 ++++++++++++ data/themes/default/mute_inactive.svg | 37 ++++++++++++ data/themes/default/solo_active.svg | 37 ++++++++++++ data/themes/default/solo_inactive.svg | 37 ++++++++++++ include/InstrumentTrackWindow.h | 3 + include/SampleTrackWindow.h | 3 + include/Track.h | 2 +- include/TrackView.h | 6 +- src/gui/MixerChannelView.cpp | 12 ++-- src/gui/SampleTrackWindow.cpp | 41 +++++++++---- src/gui/instrument/InstrumentTrackWindow.cpp | 62 ++++++++++++-------- src/gui/tracks/TrackOperationsWidget.cpp | 33 +++-------- 13 files changed, 242 insertions(+), 71 deletions(-) create mode 100644 data/themes/default/mute_active.svg create mode 100644 data/themes/default/mute_inactive.svg create mode 100644 data/themes/default/solo_active.svg create mode 100644 data/themes/default/solo_inactive.svg diff --git a/data/themes/CMakeLists.txt b/data/themes/CMakeLists.txt index 10d8df727..e288329f3 100644 --- a/data/themes/CMakeLists.txt +++ b/data/themes/CMakeLists.txt @@ -1,4 +1,3 @@ INCLUDE(InstallHelpers) -INSTALL_DATA_SUBDIRS("themes" "*.png;*.css") - +INSTALL_DATA_SUBDIRS("themes" "*.png;*.svg;*.css") diff --git a/data/themes/default/mute_active.svg b/data/themes/default/mute_active.svg new file mode 100644 index 000000000..600144697 --- /dev/null +++ b/data/themes/default/mute_active.svg @@ -0,0 +1,37 @@ + + + LMMS mute button (active) + + + + + LMMS mute button (active) + + + Rebecca Noel Ati, Stakeout Punch + + + + + + + + + + + + + + + diff --git a/data/themes/default/mute_inactive.svg b/data/themes/default/mute_inactive.svg new file mode 100644 index 000000000..6042cc767 --- /dev/null +++ b/data/themes/default/mute_inactive.svg @@ -0,0 +1,37 @@ + + + LMMS mute button (inactive) + + + + + LMMS mute button (inactive) + + + Rebecca Noel Ati, Stakeout Punch + + + + + + + + + + + + + + + diff --git a/data/themes/default/solo_active.svg b/data/themes/default/solo_active.svg new file mode 100644 index 000000000..d5c151be3 --- /dev/null +++ b/data/themes/default/solo_active.svg @@ -0,0 +1,37 @@ + + + LMMS solo button (active) + + + + + LMMS solo button (active) + + + Rebecca Noel Ati, Stakeout Punch + + + + + + + + + + + + + + + diff --git a/data/themes/default/solo_inactive.svg b/data/themes/default/solo_inactive.svg new file mode 100644 index 000000000..57788c607 --- /dev/null +++ b/data/themes/default/solo_inactive.svg @@ -0,0 +1,37 @@ + + + LMMS solo button (inactive) + + + + + LMMS solo button (inactive) + + + Rebecca Noel Ati, Stakeout Punch + + + + + + + + + + + + + + + diff --git a/include/InstrumentTrackWindow.h b/include/InstrumentTrackWindow.h index d4b285ccd..5d26ba9a2 100644 --- a/include/InstrumentTrackWindow.h +++ b/include/InstrumentTrackWindow.h @@ -28,6 +28,7 @@ #include #include "ModelView.h" +#include "PixmapButton.h" #include "SerializingObject.h" #include "PluginView.h" @@ -147,6 +148,8 @@ private: Knob * m_volumeKnob; Knob * m_panningKnob; Knob * m_pitchKnob; + PixmapButton *m_muteBtn; + PixmapButton *m_soloBtn; QLabel * m_pitchLabel; LcdSpinBox* m_pitchRangeSpinBox; QLabel * m_pitchRangeLabel; diff --git a/include/SampleTrackWindow.h b/include/SampleTrackWindow.h index 4d535bfe5..01adb0080 100644 --- a/include/SampleTrackWindow.h +++ b/include/SampleTrackWindow.h @@ -28,6 +28,7 @@ #include #include "ModelView.h" +#include "PixmapButton.h" #include "SampleTrack.h" #include "SerializingObject.h" @@ -90,6 +91,8 @@ private: QLineEdit * m_nameLineEdit; Knob * m_volumeKnob; Knob * m_panningKnob; + PixmapButton *m_muteBtn; + PixmapButton *m_soloBtn; MixerChannelLcdSpinBox * m_mixerChannelNumber; EffectRackView * m_effectRack; diff --git a/include/Track.h b/include/Track.h index 52d43f6e1..a152640e1 100644 --- a/include/Track.h +++ b/include/Track.h @@ -219,9 +219,9 @@ private: protected: BoolModel m_mutedModel; + BoolModel m_soloModel; private: - BoolModel m_soloModel; bool m_mutedBeforeSolo; clipVector m_clips; diff --git a/include/TrackView.h b/include/TrackView.h index c13ba1e87..495407192 100644 --- a/include/TrackView.h +++ b/include/TrackView.h @@ -48,12 +48,12 @@ class FadeButton; class TrackContainerView; -const int DEFAULT_SETTINGS_WIDGET_WIDTH = 256; +const int DEFAULT_SETTINGS_WIDGET_WIDTH = 260; const int TRACK_OP_WIDTH = 78; // This shaves 150-ish pixels off track buttons, // ruled from config: ui.compacttrackbuttons -const int DEFAULT_SETTINGS_WIDGET_WIDTH_COMPACT = 128; -const int TRACK_OP_WIDTH_COMPACT = 62; +const int DEFAULT_SETTINGS_WIDGET_WIDTH_COMPACT = 136; +const int TRACK_OP_WIDTH_COMPACT = TRACK_OP_WIDTH; class TrackView : public QWidget, public ModelView, public JournallingObject diff --git a/src/gui/MixerChannelView.cpp b/src/gui/MixerChannelView.cpp index 315dd8bf0..1eb2fd1bb 100644 --- a/src/gui/MixerChannelView.cpp +++ b/src/gui/MixerChannelView.cpp @@ -109,21 +109,21 @@ MixerChannelView::MixerChannelView(QWidget* parent, MixerView* mixerView, int ch m_muteButton = new PixmapButton(this, tr("Mute")); m_muteButton->setModel(&mixerChannel->m_muteModel); - m_muteButton->setActiveGraphic(embed::getIconPixmap("led_off")); - m_muteButton->setInactiveGraphic(embed::getIconPixmap("led_green")); + m_muteButton->setActiveGraphic(embed::getIconPixmap("mute_active")); + m_muteButton->setInactiveGraphic(embed::getIconPixmap("mute_inactive")); m_muteButton->setCheckable(true); m_muteButton->setToolTip(tr("Mute this channel")); m_soloButton = new PixmapButton(this, tr("Solo")); m_soloButton->setModel(&mixerChannel->m_soloModel); - m_soloButton->setActiveGraphic(embed::getIconPixmap("led_red")); - m_soloButton->setInactiveGraphic(embed::getIconPixmap("led_off")); + m_soloButton->setActiveGraphic(embed::getIconPixmap("solo_active")); + m_soloButton->setInactiveGraphic(embed::getIconPixmap("solo_inactive")); m_soloButton->setCheckable(true); m_soloButton->setToolTip(tr("Solo this channel")); auto soloMuteLayout = new QVBoxLayout(); - soloMuteLayout->setContentsMargins(0, 0, 0, 0); - soloMuteLayout->setSpacing(0); + soloMuteLayout->setContentsMargins(0, 2, 0, 2); + soloMuteLayout->setSpacing(2); soloMuteLayout->addWidget(m_soloButton, 0, Qt::AlignHCenter); soloMuteLayout->addWidget(m_muteButton, 0, Qt::AlignHCenter); diff --git a/src/gui/SampleTrackWindow.cpp b/src/gui/SampleTrackWindow.cpp index 644ad291d..e8bd5970d 100644 --- a/src/gui/SampleTrackWindow.cpp +++ b/src/gui/SampleTrackWindow.cpp @@ -32,6 +32,7 @@ #include #include "EffectRackView.h" +#include "PixmapButton.h" #include "embed.h" #include "GuiApplication.h" #include "Knob.h" @@ -95,46 +96,66 @@ SampleTrackWindow::SampleTrackWindow(SampleTrackView * tv) : QString labelStyleSheet = "font-size: 10px;"; Qt::Alignment labelAlignment = Qt::AlignHCenter | Qt::AlignTop; Qt::Alignment widgetAlignment = Qt::AlignHCenter | Qt::AlignCenter; + + auto soloMuteLayout = new QVBoxLayout(); + soloMuteLayout->setContentsMargins(0, 0, 2, 0); + soloMuteLayout->setSpacing(2); + + m_muteBtn = new PixmapButton(this, tr("Mute")); + m_muteBtn->setModel(&m_track->m_mutedModel); + m_muteBtn->setActiveGraphic(embed::getIconPixmap("mute_active")); + m_muteBtn->setInactiveGraphic(embed::getIconPixmap("mute_inactive")); + m_muteBtn->setCheckable(true); + m_muteBtn->setToolTip(tr("Mute this sample track")); + soloMuteLayout->addWidget(m_muteBtn, 0, widgetAlignment); + + m_soloBtn = new PixmapButton(this, tr("Solo")); + m_soloBtn->setModel(&m_track->m_soloModel); + m_soloBtn->setActiveGraphic(embed::getIconPixmap("solo_active")); + m_soloBtn->setInactiveGraphic(embed::getIconPixmap("solo_inactive")); + m_soloBtn->setCheckable(true); + m_soloBtn->setToolTip(tr("Solo this sample track")); + soloMuteLayout->addWidget(m_soloBtn, 0, widgetAlignment); + + basicControlsLayout->addLayout(soloMuteLayout, 0, 0, 2, 1, widgetAlignment); // set up volume knob m_volumeKnob = new Knob(KnobType::Bright26, nullptr, tr("Sample volume")); m_volumeKnob->setVolumeKnob(true); m_volumeKnob->setHintText(tr("Volume:"), "%"); - basicControlsLayout->addWidget(m_volumeKnob, 0, 0); + basicControlsLayout->addWidget(m_volumeKnob, 0, 1); basicControlsLayout->setAlignment(m_volumeKnob, widgetAlignment); auto label = new QLabel(tr("VOL"), this); label->setStyleSheet(labelStyleSheet); - basicControlsLayout->addWidget(label, 1, 0); + basicControlsLayout->addWidget(label, 1, 1); basicControlsLayout->setAlignment(label, labelAlignment); - // set up panning knob m_panningKnob = new Knob(KnobType::Bright26, nullptr, tr("Panning")); m_panningKnob->setHintText(tr("Panning:"), ""); - basicControlsLayout->addWidget(m_panningKnob, 0, 1); + basicControlsLayout->addWidget(m_panningKnob, 0, 2); basicControlsLayout->setAlignment(m_panningKnob, widgetAlignment); label = new QLabel(tr("PAN"),this); label->setStyleSheet(labelStyleSheet); - basicControlsLayout->addWidget(label, 1, 1); + basicControlsLayout->addWidget(label, 1, 2); basicControlsLayout->setAlignment(label, labelAlignment); - - basicControlsLayout->setColumnStretch(2, 1); + basicControlsLayout->setColumnStretch(3, 1); // setup spinbox for selecting Mixer-channel m_mixerChannelNumber = new MixerChannelLcdSpinBox(2, nullptr, tr("Mixer channel"), m_stv); - basicControlsLayout->addWidget(m_mixerChannelNumber, 0, 3); + basicControlsLayout->addWidget(m_mixerChannelNumber, 0, 4); basicControlsLayout->setAlignment(m_mixerChannelNumber, widgetAlignment); - label = new QLabel(tr("CHANNEL"), this); + label = new QLabel(tr("CHAN"), this); label->setStyleSheet(labelStyleSheet); - basicControlsLayout->addWidget(label, 1, 3); + basicControlsLayout->addWidget(label, 1, 4); basicControlsLayout->setAlignment(label, labelAlignment); generalSettingsLayout->addLayout(basicControlsLayout); diff --git a/src/gui/instrument/InstrumentTrackWindow.cpp b/src/gui/instrument/InstrumentTrackWindow.cpp index 4df043041..d6c32a205 100644 --- a/src/gui/instrument/InstrumentTrackWindow.cpp +++ b/src/gui/instrument/InstrumentTrackWindow.cpp @@ -139,74 +139,90 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) : QString labelStyleSheet = "font-size: 10px;"; Qt::Alignment labelAlignment = Qt::AlignHCenter | Qt::AlignTop; Qt::Alignment widgetAlignment = Qt::AlignHCenter | Qt::AlignCenter; + + auto soloMuteLayout = new QVBoxLayout(); + soloMuteLayout->setContentsMargins(0, 0, 2, 0); + soloMuteLayout->setSpacing(2); + + m_muteBtn = new PixmapButton(this, tr("Mute")); + m_muteBtn->setModel(&m_track->m_mutedModel); + m_muteBtn->setActiveGraphic(embed::getIconPixmap("mute_active")); + m_muteBtn->setInactiveGraphic(embed::getIconPixmap("mute_inactive")); + m_muteBtn->setCheckable(true); + m_muteBtn->setToolTip(tr("Mute this instrument")); + soloMuteLayout->addWidget(m_muteBtn, 0, widgetAlignment); + + m_soloBtn = new PixmapButton(this, tr("Solo")); + m_soloBtn->setModel(&m_track->m_soloModel); + m_soloBtn->setActiveGraphic(embed::getIconPixmap("solo_active")); + m_soloBtn->setInactiveGraphic(embed::getIconPixmap("solo_inactive")); + m_soloBtn->setCheckable(true); + m_soloBtn->setToolTip(tr("Solo this instrument")); + soloMuteLayout->addWidget(m_soloBtn, 0, widgetAlignment); + + basicControlsLayout->addLayout(soloMuteLayout, 0, 0, 2, 1, widgetAlignment); // set up volume knob m_volumeKnob = new Knob( KnobType::Bright26, nullptr, tr( "Volume" ) ); m_volumeKnob->setVolumeKnob( true ); m_volumeKnob->setHintText( tr( "Volume:" ), "%" ); - basicControlsLayout->addWidget( m_volumeKnob, 0, 0 ); + basicControlsLayout->addWidget(m_volumeKnob, 0, 1); basicControlsLayout->setAlignment( m_volumeKnob, widgetAlignment ); auto label = new QLabel(tr("VOL"), this); - label->setStyleSheet( labelStyleSheet ); - basicControlsLayout->addWidget( label, 1, 0); - basicControlsLayout->setAlignment( label, labelAlignment ); - + label->setStyleSheet(labelStyleSheet); + basicControlsLayout->addWidget(label, 1, 1); + basicControlsLayout->setAlignment(label, labelAlignment); // set up panning knob m_panningKnob = new Knob( KnobType::Bright26, nullptr, tr( "Panning" ) ); m_panningKnob->setHintText( tr( "Panning:" ), "" ); - basicControlsLayout->addWidget( m_panningKnob, 0, 1 ); + basicControlsLayout->addWidget(m_panningKnob, 0, 2); basicControlsLayout->setAlignment( m_panningKnob, widgetAlignment ); label = new QLabel( tr( "PAN" ), this ); label->setStyleSheet( labelStyleSheet ); - basicControlsLayout->addWidget( label, 1, 1); + basicControlsLayout->addWidget(label, 1, 2); basicControlsLayout->setAlignment( label, labelAlignment ); - - basicControlsLayout->setColumnStretch(2, 1); - + basicControlsLayout->setColumnStretch(3, 1); // set up pitch knob m_pitchKnob = new Knob( KnobType::Bright26, nullptr, tr( "Pitch" ) ); m_pitchKnob->setHintText( tr( "Pitch:" ), " " + tr( "cents" ) ); - basicControlsLayout->addWidget( m_pitchKnob, 0, 3 ); + basicControlsLayout->addWidget(m_pitchKnob, 0, 4); basicControlsLayout->setAlignment( m_pitchKnob, widgetAlignment ); m_pitchLabel = new QLabel( tr( "PITCH" ), this ); m_pitchLabel->setStyleSheet( labelStyleSheet ); - basicControlsLayout->addWidget( m_pitchLabel, 1, 3); + basicControlsLayout->addWidget(m_pitchLabel, 1, 4); basicControlsLayout->setAlignment( m_pitchLabel, labelAlignment ); - // set up pitch range knob m_pitchRangeSpinBox= new LcdSpinBox( 2, nullptr, tr( "Pitch range (semitones)" ) ); - basicControlsLayout->addWidget( m_pitchRangeSpinBox, 0, 4 ); + basicControlsLayout->addWidget(m_pitchRangeSpinBox, 0, 5); basicControlsLayout->setAlignment( m_pitchRangeSpinBox, widgetAlignment ); m_pitchRangeLabel = new QLabel( tr( "RANGE" ), this ); m_pitchRangeLabel->setStyleSheet( labelStyleSheet ); - basicControlsLayout->addWidget( m_pitchRangeLabel, 1, 4); + basicControlsLayout->addWidget(m_pitchRangeLabel, 1, 5); basicControlsLayout->setAlignment( m_pitchRangeLabel, labelAlignment ); - - basicControlsLayout->setColumnStretch(5, 1); - + basicControlsLayout->setColumnStretch(6, 1); // setup spinbox for selecting Mixer-channel m_mixerChannelNumber = new MixerChannelLcdSpinBox(2, nullptr, tr("Mixer channel"), m_itv); - basicControlsLayout->addWidget( m_mixerChannelNumber, 0, 6 ); + basicControlsLayout->addWidget(m_mixerChannelNumber, 0, 7); basicControlsLayout->setAlignment( m_mixerChannelNumber, widgetAlignment ); - label = new QLabel( tr( "CHANNEL" ), this ); + label = new QLabel(tr("CHAN"), this); label->setStyleSheet( labelStyleSheet ); - basicControlsLayout->addWidget( label, 1, 6); + basicControlsLayout->addWidget(label, 1, 7); basicControlsLayout->setAlignment( label, labelAlignment ); auto saveSettingsBtn = new QPushButton(embed::getIconPixmap("project_save"), QString()); @@ -216,11 +232,11 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) : saveSettingsBtn->setToolTip(tr("Save current instrument track settings in a preset file")); - basicControlsLayout->addWidget( saveSettingsBtn, 0, 7 ); + basicControlsLayout->addWidget(saveSettingsBtn, 0, 8); label = new QLabel( tr( "SAVE" ), this ); label->setStyleSheet( labelStyleSheet ); - basicControlsLayout->addWidget( label, 1, 7); + basicControlsLayout->addWidget(label, 1, 8); basicControlsLayout->setAlignment( label, labelAlignment ); generalSettingsLayout->addLayout( basicControlsLayout ); diff --git a/src/gui/tracks/TrackOperationsWidget.cpp b/src/gui/tracks/TrackOperationsWidget.cpp index 06e434674..04b171a41 100644 --- a/src/gui/tracks/TrackOperationsWidget.cpp +++ b/src/gui/tracks/TrackOperationsWidget.cpp @@ -84,7 +84,7 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : auto operationsWidget = new QWidget(this); auto operationsLayout = new QHBoxLayout(operationsWidget); operationsLayout->setContentsMargins(0, 0, 0, 0); - operationsLayout->setSpacing(0); + operationsLayout->setSpacing(2); m_trackOps = new QPushButton(operationsWidget); m_trackOps->setFocusPolicy( Qt::NoFocus ); @@ -124,33 +124,14 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : return wrapperWidget; }; - auto muteWidget = buildPixmapButtonWrappedInWidget(operationsWidget, tr("Mute"), "led_off", "led_green", m_muteBtn); - auto soloWidget = buildPixmapButtonWrappedInWidget(operationsWidget, tr("Solo"), "led_red", "led_off", m_soloBtn); + auto muteWidget = buildPixmapButtonWrappedInWidget(operationsWidget, tr("Mute"), "mute_active", "mute_inactive", m_muteBtn); + auto soloWidget = buildPixmapButtonWrappedInWidget(operationsWidget, tr("Solo"), "solo_active", "solo_inactive", m_soloBtn); - operationsLayout->addWidget(m_trackOps, Qt::AlignCenter); - operationsLayout->addSpacing(5); + operationsLayout->addWidget(m_trackOps); + operationsLayout->addWidget(muteWidget); + operationsLayout->addWidget(soloWidget); - if( ConfigManager::inst()->value( "ui", - "compacttrackbuttons" ).toInt() ) - { - auto vlayout = new QVBoxLayout(); - vlayout->setContentsMargins(0, 0, 0, 0); - vlayout->setSpacing(0); - vlayout->addStretch(1); - vlayout->addWidget(muteWidget); - vlayout->addWidget(soloWidget); - vlayout->addStretch(1); - operationsLayout->addLayout(vlayout); - } - else - { - operationsLayout->addWidget(muteWidget, Qt::AlignCenter); - operationsLayout->addWidget(soloWidget, Qt::AlignCenter); - } - - operationsLayout->addStretch(1); - - layout->addWidget(operationsWidget, 0, Qt::AlignTop); + layout->addWidget(operationsWidget, 0, Qt::AlignCenter | Qt::AlignLeading); connect( this, SIGNAL(trackRemovalScheduled(lmms::gui::TrackView*)), m_trackView->trackContainerView(),