diff --git a/applet/contents/config/main.xml b/applet/contents/config/main.xml --- a/applet/contents/config/main.xml +++ b/applet/contents/config/main.xml @@ -6,8 +6,8 @@ - - 100 + + false 5 diff --git a/applet/contents/ui/ConfigGeneral.qml b/applet/contents/ui/ConfigGeneral.qml --- a/applet/contents/ui/ConfigGeneral.qml +++ b/applet/contents/ui/ConfigGeneral.qml @@ -27,7 +27,6 @@ import org.kde.plasma.private.volume 0.1 Kirigami.FormLayout { - property alias cfg_maximumVolume: maximumVolume.value property alias cfg_volumeStep: volumeStep.value property alias cfg_volumeFeedback: volumeFeedback.checked property alias cfg_outputChangeOsd: outputChangeOsd.checked @@ -37,23 +36,6 @@ } - QQC2.SpinBox { - id: maximumVolume - - Kirigami.FormData.label: i18n("Maximum volume:") - - from: 10 - to: 150 - stepSize: 1 - editable: true - textFromValue: function(value) { - return value + "%"; - } - valueFromText: function(text) { - return parseInt(text); - } - } - QQC2.SpinBox { id: volumeStep implicitWidth: maximumVolume.width diff --git a/applet/contents/ui/ListItemBase.qml b/applet/contents/ui/ListItemBase.qml --- a/applet/contents/ui/ListItemBase.qml +++ b/applet/contents/ui/ListItemBase.qml @@ -184,12 +184,12 @@ // changes trigger volume changes trigger value changes. property int volume: Volume property bool ignoreValueChange: true - property bool forceRaiseMaxVolume: false - readonly property bool raiseMaxVolume: forceRaiseMaxVolume || volume >= PulseAudio.NormalVolume * 1.01 + readonly property bool forceRaiseMaxVolume: (raiseMaximumVolume.checked && (type === "sink" || type === "source")) + || volume >= PulseAudio.NormalVolume * 1.01 Layout.fillWidth: true minimumValue: PulseAudio.MinimalVolume - maximumValue: raiseMaxVolume ? PulseAudio.MaximalVolume : PulseAudio.NormalVolume + maximumValue: forceRaiseMaxVolume ? PulseAudio.MaximalVolume : PulseAudio.NormalVolume stepSize: maximumValue / (maximumValue / PulseAudio.NormalVolume * 100.0) visible: HasVolume enabled: VolumeWritable @@ -201,6 +201,15 @@ ignoreValueChange = false; } + // TODO Should be in raiseMaximumVolume.onCheckChanged + // but have not find a way to access all devices's Volume, from paSinkModel and paSourceModel in main.qml + readonly property bool maxVolumeRaised: raiseMaximumVolume.checked + onMaxVolumeRaisedChanged: { + if (!raiseMaximumVolume.checked && Volume > PulseAudio.NormalVolume && (type === "sink" || type === "source")) { + Volume = PulseAudio.NormalVolume; + } + } + onVolumeChanged: { var oldIgnoreValueChange = ignoreValueChange; ignoreValueChange = true; @@ -306,19 +315,6 @@ function loadDynamicActions() { contextMenu.clearMenuItems(); - // Raise max volume - menuItem = newMenuItem(); - menuItem.text = i18n("Raise maximum volume"); - menuItem.checkable = true; - menuItem.checked = slider.forceRaiseMaxVolume; - menuItem.clicked.connect(function() { - slider.forceRaiseMaxVolume = !slider.forceRaiseMaxVolume; - if (!slider.forceRaiseMaxVolume && Volume > PulseAudio.NormalVolume) { - Volume = PulseAudio.NormalVolume; - } - }); - contextMenu.addMenuItem(menuItem); - // Switch all streams of the relevant kind to this device if (type == "source") { menuItem = newMenuItem(); diff --git a/applet/contents/ui/main.qml b/applet/contents/ui/main.qml --- a/applet/contents/ui/main.qml +++ b/applet/contents/ui/main.qml @@ -34,7 +34,9 @@ id: main property bool volumeFeedback: Plasmoid.configuration.volumeFeedback - property int maxVolumeValue: Math.round(Plasmoid.configuration.maximumVolume * PulseAudio.NormalVolume / 100.0) + property int raiseMaxVolumeValue: 150 + property int maxVolumeValue: Math.round(raiseMaxVolumeValue * PulseAudio.NormalVolume / 100.0) + property int currentMaxVolumeValue: plasmoid.configuration.raiseMaximumVolume ? maxVolumeValue : PulseAudio.NormalVolume property int volumeStep: Math.round(Plasmoid.configuration.volumeStep * PulseAudio.NormalVolume / 100.0) property string displayName: i18n("Audio Volume") property QtObject draggedStream: null @@ -70,7 +72,7 @@ } function boundVolume(volume) { - return Math.max(PulseAudio.MinimalVolume, Math.min(volume, maxVolumeValue)); + return Math.max(PulseAudio.MinimalVolume, Math.min(volume, currentMaxVolumeValue)); } function volumePercent(volume, max) { @@ -85,7 +87,7 @@ return; } var volume = boundVolume(paSinkModel.preferredSink.volume + volumeStep); - var percent = volumePercent(volume, maxVolumeValue); + var percent = volumePercent(volume, currentMaxVolumeValue); paSinkModel.preferredSink.muted = percent == 0; paSinkModel.preferredSink.volume = volume; osd.show(percent); @@ -97,7 +99,7 @@ return; } var volume = boundVolume(paSinkModel.preferredSink.volume - volumeStep); - var percent = volumePercent(volume, maxVolumeValue); + var percent = volumePercent(volume, currentMaxVolumeValue); paSinkModel.preferredSink.muted = percent == 0; paSinkModel.preferredSink.volume = volume; osd.show(percent); @@ -110,7 +112,7 @@ } var toMute = !paSinkModel.preferredSink.muted; paSinkModel.preferredSink.muted = toMute; - osd.show(toMute ? 0 : volumePercent(paSinkModel.preferredSink.volume, maxVolumeValue)); + osd.show(toMute ? 0 : volumePercent(paSinkModel.preferredSink.volume, currentMaxVolumeValue)); if (!toMute) { playFeedback(); } @@ -344,6 +346,14 @@ } } + PlasmaComponents.CheckBox { + id: raiseMaximumVolume + Layout.alignment: Qt.AlignBottom + tooltip: i18n("Raise maximum volume to %1%.\nCan distort sound, if volume is already high.", raiseMaxVolumeValue) + checked: plasmoid.configuration.raiseMaximumVolume + onCheckedChanged: plasmoid.configuration.raiseMaximumVolume = checked + } + PlasmaComponents.ToolButton { Layout.alignment: Qt.AlignBottom tooltip: plasmoid.action("configure").text