diff --git a/applet/contents/code/icon.js b/applet/contents/code/icon.js --- a/applet/contents/code/icon.js +++ b/applet/contents/code/icon.js @@ -23,7 +23,7 @@ prefix = "audio-volume"; } var icon = null; - var percent = volume / maxVolumeValue; + var percent = volume / currentMaxVolumeValue; if (percent <= 0.0 || muted) { icon = prefix + "-muted"; } else if (percent <= 0.25) { 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 @@ -159,12 +159,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: (raiseMaximumVolumeCheckbox.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 @@ -281,29 +281,16 @@ 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" && sourceView.model.count > 1) { + if (type == "source") { menuItem = newMenuItem(); menuItem.text = i18n("Record all audio via this device"); menuItem.icon = "mic-on" // or "mic-ready" // or "audio-input-microphone-symbolic" menuItem.clicked.connect(function() { PulseObject.switchStreams(); }); contextMenu.addMenuItem(menuItem); - } else if (type == "sink" && sinkView.model.count > 1) { + } else if (type == "sink") { menuItem = newMenuItem(); menuItem.text = i18n("Play all audio via this device"); menuItem.icon = "audio-on" // or "audio-ready" // or "audio-speakers-symbolic" 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 @@ -35,7 +35,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 @@ -80,7 +82,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) { @@ -95,7 +97,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); @@ -107,7 +109,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); @@ -120,7 +122,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(); } @@ -536,6 +538,27 @@ RowLayout { + PlasmaComponents3.CheckBox { + id: raiseMaximumVolumeCheckbox + // Align center, with the devices mute icon. Calculating the size based on SmallToolButton.qml. '4' is margin in ListItem. + Layout.leftMargin: LayoutMirroring.enabled ? 0 : Math.round((Math.ceil(units.iconSizes.small + units.smallSpacing * 2) - raiseMaximumVolumeCheckbox.indicator.width) / 2) + 4 + Layout.rightMargin: !LayoutMirroring.enabled ? 0 : Math.round((Math.ceil(units.iconSizes.small + units.smallSpacing * 2) - raiseMaximumVolumeCheckbox.indicator.width) / 2) + 4 + spacing: Math.round((Math.ceil(units.iconSizes.small + units.smallSpacing * 2) - raiseMaximumVolumeCheckbox.indicator.width) / 2) + units.smallSpacing + checked: plasmoid.configuration.raiseMaximumVolume + onToggled: { + plasmoid.configuration.raiseMaximumVolume = checked + if (!checked) { + for (var i = 0; i < paSinkModel.rowCount(); i++) { + if (paSinkModel.data(paSinkModel.index(i, 0), paSinkModel.role("Volume")) > PulseAudio.NormalVolume) { + paSinkModel.setData(paSinkModel.index(i, 0), PulseAudio.NormalVolume, paSinkModel.role("Volume")); + } + } + } + } + text: i18n("Raise maximum volume") + enabled: false // Intentionally disabled, see D26256 + } + Item { Layout.fillWidth: true }