Commit 19c4bfcf authored by Jonathan Marten's avatar Jonathan Marten

Use the configured Volume Step value for slider page steps

This makes all operations which move the volume in steps - hot keys,
mouse wheel over the system tray icon, and slider page steps - use the
same step value.

Improve the interface between the KMix application and the Volume class,
by adding Volume::setVolumeStep() to set the value.  There is no need for
a getter function since a value can be obtained from Volume::volumeStep().
Eliminates some public static variables that looked like constants.

Add an explanatory tool tip to the Volume Step configuration spin box.
parent 60d001b6
...@@ -510,16 +510,9 @@ void KMixWindow::loadBaseConfig() ...@@ -510,16 +510,9 @@ void KMixWindow::loadBaseConfig()
QString mixerIgnoreExpression = config.readEntry("MixerIgnoreExpression", "Modem"); QString mixerIgnoreExpression = config.readEntry("MixerIgnoreExpression", "Modem");
MixerToolBox::setMixerIgnoreExpression(mixerIgnoreExpression); MixerToolBox::setMixerIgnoreExpression(mixerIgnoreExpression);
// --- Advanced options, without GUI: START ------------------------------------- // The global volume step setting.
QString volumePercentageStepString = config.readEntry("VolumePercentageStep"); const int volumePercentageStep = config.readEntry("VolumePercentageStep", -1);
if (!volumePercentageStepString.isNull()) if (volumePercentageStep>0) Volume::setVolumeStep(volumePercentageStep);
{
float volumePercentageStep = volumePercentageStepString.toFloat();
if (volumePercentageStep > 0 && volumePercentageStep <= 100)
Volume::VOLUME_STEP_DIVISOR = (100 / volumePercentageStep);
}
// --- Advanced options, without GUI: END -------------------------------------
// The following log is very helpful in bug reports. Please keep it. // The following log is very helpful in bug reports. Please keep it.
m_backendFilter = config.readEntry<>("Backends", QList<QString>()); m_backendFilter = config.readEntry<>("Backends", QList<QString>());
......
...@@ -27,8 +27,19 @@ ...@@ -27,8 +27,19 @@
#include <klocalizedstring.h> #include <klocalizedstring.h>
float Volume::VOLUME_STEP_DIVISOR = 20;
float Volume::VOLUME_PAGESTEP_DIVISOR = 10; // This value is the number of steps to take the volume from minimum to maximum.
// It applies to changing the volume by hot key, or by the mouse wheel over the
// system tray icon. For consistency, it is also used as the page step for
// volume sliders (clicking in the blank area on each side of the slider, or
// the PgUp/PgDown keys when the slider has focus). The slider single step
// (dragging the slider, or using the arrow keys) is not changed from the default
// of 1, which gives one hardware volume step.
//
// The default set here is 5% which means 20 steps. It can be changed by the
// "Volume Step" option in the KMix settings.
static float s_volumeStepDivisor = (100.0/5);
static Volume::ChannelMask channelMask[] = static Volume::ChannelMask channelMask[] =
...@@ -164,27 +175,35 @@ QMap<Volume::ChannelID, VolumeChannel> Volume::getVolumes() const ...@@ -164,27 +175,35 @@ QMap<Volume::ChannelID, VolumeChannel> Volume::getVolumes() const
} }
/** /**
* Returns the absolute change to do one "step" for this volume. This is similar to a page step in a slider, * Returns the absolute change to do one "step" for this volume.
* namely a fixed percentage of the range.
* One step is the percentage given by 100/VOLUME_STEP_DIVISOR. The
* default VOLUME_STEP_DIVISOR is 20, so default change is 5% of the volumeSpan().
* *
* This method guarantees a minimum absolute change of 1, zero is never returned. * This is similar to a page step in a slider, namely a fixed percentage
* of the range.
* One step is the percentage given by 100/VOLUME_STEP_DIVISOR.
* The default divisor is 20, so the default change is 5% of the volumeSpan().
* *
* It is NOT verified, that such a volume change would actually be possible. You might hit the upper or lower bounds * This method guarantees a minimum absolute change of 1, zero is never returned.
* of the volume range.
* *
* It is NOT verified, that such a volume change would actually be possible.
* You might hit the upper or lower bounds of the volume range.
* *
* @param decrease true, if you want a volume step that decreases the volume by one page step * @param decrease @c true if you want a volume step that decreases the volume by one page step
* @return The volume step. It will be negative if you have used decrease==true * @return The volume step. It will be negative if you have used decrease==true
*
*/ */
long Volume::volumeStep(bool decrease) const long Volume::volumeStep(bool decrease) const
{ {
long inc = volumeSpan() / Volume::VOLUME_STEP_DIVISOR; long inc = qRound(volumeSpan()/s_volumeStepDivisor);
if ( inc == 0 ) inc = 1; if (inc==0) inc = 1;
if ( decrease ) inc *= -1; if (decrease) inc = -inc;
return inc; return (inc);
}
/* static */ void Volume::setVolumeStep(int percent)
{
if (percent<=0 || percent>=100) return;
s_volumeStepDivisor = 100.0/percent;
qDebug() << "percent" << percent << "-> divisor" << s_volumeStepDivisor;
} }
......
...@@ -161,13 +161,13 @@ public: ...@@ -161,13 +161,13 @@ public:
QMap<Volume::ChannelID, VolumeChannel> getVolumesWhenActive() const; QMap<Volume::ChannelID, VolumeChannel> getVolumesWhenActive() const;
long volumeStep(bool decrease) const; long volumeStep(bool decrease) const;
static float VOLUME_STEP_DIVISOR; // The divisor for defining volume control steps (for mouse-wheel, DBUS and Normal step for Sliders ) // Sets the value from the GUI configuration. This affects all volume
static float VOLUME_PAGESTEP_DIVISOR; // The divisor for defining volume control steps (page-step for sliders) // increment or decrement operations.
static void setVolumeStep(int percent);
protected: protected:
long _chmask; long _chmask;
QMap<Volume::ChannelID, VolumeChannel> _volumesL; QMap<Volume::ChannelID, VolumeChannel> _volumesL;
// QMap<Volume::ChannelID, VolumeChannel> _volumesMuted;
long _minVolume; long _minVolume;
long _maxVolume; long _maxVolume;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <qlabel.h> #include <qlabel.h>
#include <qradiobutton.h> #include <qradiobutton.h>
#include <qgroupbox.h> #include <qgroupbox.h>
#include <qguiapplication.h>
#include <kconfig.h> #include <kconfig.h>
#include <klocalizedstring.h> #include <klocalizedstring.h>
...@@ -231,6 +232,14 @@ void KMixPrefDlg::createGeneralTab() ...@@ -231,6 +232,14 @@ void KMixPrefDlg::createGeneralTab()
// Register SpinBox for KConfig // Register SpinBox for KConfig
m_volumeStep->setObjectName("kcfg_VolumePercentageStep"); m_volumeStep->setObjectName("kcfg_VolumePercentageStep");
m_volumeStep->setToolTip(xi18nc("@info:tooltip",
"<para>Set the volume step as a percentage of the volume range.</para>"
"This affects changing the volume via hot keys, "
"with the mouse wheel over the system tray icon, "
"or moving sliders by a page step.</para>"
"<para>%1 must be restarted for this change to take effect.</para>",
QGuiApplication::applicationDisplayName()));
horizontalGrid->addWidget(new QLabel(i18n("Volume step:"), m_generalTab), 0, 0, Qt::AlignLeft); horizontalGrid->addWidget(new QLabel(i18n("Volume step:"), m_generalTab), 0, 0, Qt::AlignLeft);
horizontalGrid->addWidget(m_volumeStep, 0, 1, Qt::AlignLeft); horizontalGrid->addWidget(m_volumeStep, 0, 1, Qt::AlignLeft);
horizontalGrid->addItem(new QSpacerItem(1 ,1 , QSizePolicy::Expanding), 0, 2); horizontalGrid->addItem(new QSpacerItem(1 ,1 , QSizePolicy::Expanding), 0, 2);
...@@ -240,7 +249,8 @@ void KMixPrefDlg::createGeneralTab() ...@@ -240,7 +249,8 @@ void KMixPrefDlg::createGeneralTab()
// Volume Step and Overdrive Warning // Volume Step and Overdrive Warning
volumeOverdriveWarning = new KMessageWidget( volumeOverdriveWarning = new KMessageWidget(
i18n("KMix must be restarted for the Volume Step and Overdrive settings to take effect."), grp); i18n("%1 must be restarted for the Volume Step and Overdrive settings to take effect.",
QGuiApplication::applicationDisplayName()), grp);
volumeOverdriveWarning->setIcon(QIcon::fromTheme("dialog-information")); volumeOverdriveWarning->setIcon(QIcon::fromTheme("dialog-information"));
volumeOverdriveWarning->setMessageType(KMessageWidget::Information); volumeOverdriveWarning->setMessageType(KMessageWidget::Information);
volumeOverdriveWarning->setCloseButtonVisible(false); volumeOverdriveWarning->setCloseButtonVisible(false);
...@@ -340,8 +350,7 @@ void KMixPrefDlg::addWidgetToLayout(QWidget* widget, QBoxLayout* layout, int spa ...@@ -340,8 +350,7 @@ void KMixPrefDlg::addWidgetToLayout(QWidget* widget, QBoxLayout* layout, int spa
*/ */
void KMixPrefDlg::updateWidgets() void KMixPrefDlg::updateWidgets()
{ {
if (dialogConfig.data.debugConfig) if (dialogConfig.data.debugConfig) qCDebug(KMIX_LOG);
qCDebug(KMIX_LOG) << "";
bool toplevelHorizontal = dialogConfig.data.getToplevelOrientation() == Qt::Horizontal; bool toplevelHorizontal = dialogConfig.data.getToplevelOrientation() == Qt::Horizontal;
_rbHorizontal->setChecked(toplevelHorizontal); _rbHorizontal->setChecked(toplevelHorizontal);
_rbVertical->setChecked(!toplevelHorizontal); _rbVertical->setChecked(!toplevelHorizontal);
......
...@@ -605,8 +605,8 @@ void MDWSlider::addSliders( QBoxLayout *volLayout, char type, Volume& vol, ...@@ -605,8 +605,8 @@ void MDWSlider::addSliders( QBoxLayout *volLayout, char type, Volume& vol,
QList<QAbstractSlider *>& ref_sliders, const QString &tooltipText) QList<QAbstractSlider *>& ref_sliders, const QString &tooltipText)
{ {
const int minSliderSize = fontMetrics().height() * 10; const int minSliderSize = fontMetrics().height() * 10;
long minvol = vol.minVolume(); const long minvol = vol.minVolume();
long maxvol = vol.maxVolume(); const long maxvol = vol.maxVolume();
const QMap<Volume::ChannelID, VolumeChannel> vols = vol.getVolumes(); const QMap<Volume::ChannelID, VolumeChannel> vols = vol.getVolumes();
for (const VolumeChannel &vc : vols) for (const VolumeChannel &vc : vols)
...@@ -623,10 +623,18 @@ void MDWSlider::addSliders( QBoxLayout *volLayout, char type, Volume& vol, ...@@ -623,10 +623,18 @@ void MDWSlider::addSliders( QBoxLayout *volLayout, char type, Volume& vol,
VolumeSlider *slider = new VolumeSlider(orientation(), this); VolumeSlider *slider = new VolumeSlider(orientation(), this);
slider->setMinimum(minvol); slider->setMinimum(minvol);
slider->setMaximum(maxvol); slider->setMaximum(maxvol);
slider->setPageStep(maxvol / Volume::VOLUME_PAGESTEP_DIVISOR);
slider->setValue( vol.getVolume( vc.chid ) ); // Set the slider page step to be the same as the configured volume step.
volumeValues.push_back( vol.getVolume( vc.chid ) ); // If that volume step is the minimum possible value (1), then set it
// to 2 so that it is bigger than the single step.
int pageStep = vol.volumeStep(false);
if (pageStep==1) pageStep = 2;
slider->setPageStep(pageStep);
// Don't show too many tick marks if the page step is small.
if (pageStep<10) slider->setTickInterval(qRound((maxvol-minvol)/10.0));
slider->setValue(vol.getVolume(vc.chid));
volumeValues.push_back(vol.getVolume(vc.chid));
if (orientation()==Qt::Vertical) slider->setMinimumHeight(minSliderSize); if (orientation()==Qt::Vertical) slider->setMinimumHeight(minSliderSize);
else slider->setMinimumWidth(minSliderSize); else slider->setMinimumWidth(minSliderSize);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment