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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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(),