Socialify

Folder ..

Viewing VolumeSlider.qml
106 lines (89 loc) • 3.5 KB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
/*
    Copyright 2014-2015 Harald Sitter <[email protected]>

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of
    the License or (at your option) version 3 or any later version
    accepted by the membership of KDE e.V. (or its successor approved
    by the membership of KDE e.V.), which shall act as a proxy
    defined in Section 14 of version 3 of the license.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

import QtQuick 2.4
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.0

import org.kde.plasma.private.volume 0.1

RowLayout {
    Layout.bottomMargin: hundredPercentLabel.height

    Slider {
        id: slider

        // Helper properties to allow async slider updates.
        // While we are sliding we must not react to value updates
        // as otherwise we can easily end up in a loop where value
        // changes trigger volume changes trigger value changes.
        property int volume: Volume
        property bool ignoreValueChange: false

        Layout.fillWidth: true
        minimumValue: PulseAudio.MinimalVolume
        maximumValue: PulseAudio.MaximalVolume
        visible: HasVolume
        enabled: VolumeWritable
        opacity: Muted ? 0.5 : 1

        onVolumeChanged: {
            ignoreValueChange = true;
            value = Volume;
            ignoreValueChange = false;
        }

        onValueChanged: {
            if (!ignoreValueChange) {
                Volume = value;
                Muted = false;

                if (!pressed) {
                    updateTimer.restart();
                }
            }
        }

        onPressedChanged: {
            if (!pressed) {
                // Make sure to sync the volume once the button was
                // released.
                // Otherwise it might be that the slider is at v10
                // whereas PA rejected the volume change and is
                // still at v15 (e.g.).
                updateTimer.restart();
            }
        }

        Label {
            id: hundredPercentLabel
            z: slider.z - 1
            x: (slider.width / slider.maximumValue) * PulseAudio.NormalVolume - width / 2
            y: slider.height / 1.2
            opacity: 0.5
            font.pixelSize: slider.height / 2.2
            text: i18n("100%")
        }

        Timer {
            id: updateTimer
            interval: 200
            onTriggered: slider.value = Volume
        }
    }

    Label {
        id: percentText
        readonly property real value: PulseObject.volume > slider.maximumValue ? PulseObject.volume : slider.value
        Layout.alignment: Qt.AlignHCenter
        Layout.minimumWidth: percentMetrics.advanceWidth
        horizontalAlignment: Qt.AlignRight
        text: i18nc("volume percentage", "%1%", Math.round(value / PulseAudio.NormalVolume * 100.0))
    }

    TextMetrics {
        id: percentMetrics
        font: percentText.font
        text: i18nc("only used for sizing, should be widest possible string", "100%")
    }
}