205 lines
6.2 KiB
QML
205 lines
6.2 KiB
QML
/*
|
|
SPDX-FileCopyrightText: 2017 Kai Uwe Broulik <kde@privat.broulik.de>
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
import QtQuick
|
|
|
|
import org.kde.plasma.plasmoid
|
|
import org.kde.plasma.extras as PlasmaExtras
|
|
import org.kde.kirigami as Kirigami
|
|
import org.kde.ksvg as KSvg
|
|
|
|
Item {
|
|
id: audioStreamIconBox
|
|
|
|
width: Math.round(Math.min(Math.min(iconBox.width, iconBox.height) * 0.4, Kirigami.Units.iconSizes.smallMedium))
|
|
height: width
|
|
anchors {
|
|
top: frame.top
|
|
right: frame.right
|
|
rightMargin: taskFrame.margins.right
|
|
topMargin: Math.round(taskFrame.margins.top * indicatorScale)
|
|
}
|
|
|
|
readonly property real indicatorScale: 1.2
|
|
|
|
activeFocusOnTab: true
|
|
|
|
// Using States rather than a simple Behavior we can apply different transitions,
|
|
// which allows us to delay showing the icon but hide it instantly still.
|
|
states: [
|
|
State {
|
|
name: "playing"
|
|
when: task.playingAudio && !task.muted
|
|
PropertyChanges {
|
|
target: audioStreamIconBox
|
|
opacity: 1
|
|
}
|
|
PropertyChanges {
|
|
target: audioStreamIcon
|
|
source: "audio-volume-high-symbolic"
|
|
}
|
|
},
|
|
State {
|
|
name: "muted"
|
|
when: task.muted
|
|
PropertyChanges {
|
|
target: audioStreamIconBox
|
|
opacity: 1
|
|
}
|
|
PropertyChanges {
|
|
target: audioStreamIcon
|
|
source: "audio-volume-muted-symbolic"
|
|
}
|
|
}
|
|
]
|
|
|
|
transitions: [
|
|
Transition {
|
|
from: ""
|
|
to: "playing"
|
|
SequentialAnimation {
|
|
// Delay showing the play indicator so we don't flash it for brief sounds.
|
|
PauseAnimation {
|
|
duration: !task.delayAudioStreamIndicator || inPopup ? 0 : 2000
|
|
}
|
|
NumberAnimation {
|
|
property: "opacity"
|
|
duration: Kirigami.Units.longDuration
|
|
}
|
|
}
|
|
},
|
|
Transition {
|
|
from: ""
|
|
to: "muted"
|
|
SequentialAnimation {
|
|
NumberAnimation {
|
|
property: "opacity"
|
|
duration: Kirigami.Units.longDuration
|
|
}
|
|
}
|
|
},
|
|
Transition {
|
|
to: ""
|
|
NumberAnimation {
|
|
property: "opacity"
|
|
duration: Kirigami.Units.longDuration
|
|
}
|
|
}
|
|
]
|
|
|
|
opacity: 0
|
|
visible: opacity > 0
|
|
|
|
Keys.onReturnPressed: event => toggleMuted()
|
|
Keys.onEnterPressed: event => Keys.returnPressed(event);
|
|
Keys.onSpacePressed: event => Keys.returnPressed(event);
|
|
|
|
Accessible.checkable: true
|
|
Accessible.checked: task.muted
|
|
Accessible.name: task.muted ? i18nc("@action:button", "Unmute") : i18nc("@action:button", "Mute")
|
|
Accessible.description: task.muted ? i18nc("@info:tooltip %1 is the window title", "Unmute %1", model.display) : i18nc("@info:tooltip %1 is the window title", "Mute %1", model.display)
|
|
Accessible.role: Accessible.Button
|
|
|
|
HoverHandler {
|
|
id: hoverHandler
|
|
enabled: Plasmoid.configuration.interactiveMute
|
|
}
|
|
|
|
TapHandler {
|
|
id: tapHandler
|
|
gesturePolicy: TapHandler.ReleaseWithinBounds // Exclusive grab
|
|
enabled: Plasmoid.configuration.interactiveMute
|
|
onTapped: (eventPoint, button) => toggleMuted()
|
|
}
|
|
|
|
PlasmaExtras.Highlight {
|
|
anchors.fill: audioStreamIcon
|
|
hovered: hoverHandler.hovered || parent.activeFocus
|
|
pressed: tapHandler.pressed
|
|
}
|
|
|
|
Kirigami.Icon {
|
|
id: audioStreamIcon
|
|
|
|
// Need audio indicator twice, to keep iconBox in the center.
|
|
readonly property real requiredSpace: Math.min(iconBox.width, iconBox.height)
|
|
+ Math.min(Math.min(iconBox.width, iconBox.height), Kirigami.Units.iconSizes.smallMedium) * 2
|
|
|
|
source: "audio-volume-high-symbolic"
|
|
selected: tapHandler.pressed
|
|
|
|
height: Math.round(Math.min(parent.height * indicatorScale, Kirigami.Units.iconSizes.smallMedium))
|
|
width: height
|
|
|
|
anchors {
|
|
verticalCenter: parent.verticalCenter
|
|
horizontalCenter: parent.horizontalCenter
|
|
}
|
|
|
|
states: [
|
|
State {
|
|
name: "verticalIconsOnly"
|
|
when: tasks.vertical && frame.width < audioStreamIcon.requiredSpace
|
|
|
|
PropertyChanges {
|
|
target: audioStreamIconBox
|
|
anchors.rightMargin: Math.round(taskFrame.margins.right * indicatorScale)
|
|
}
|
|
},
|
|
|
|
State {
|
|
name: "horizontal"
|
|
when: frame.width > audioStreamIcon.requiredSpace
|
|
|
|
AnchorChanges {
|
|
target: audioStreamIconBox
|
|
|
|
anchors.top: undefined
|
|
anchors.verticalCenter: frame.verticalCenter
|
|
}
|
|
|
|
PropertyChanges {
|
|
target: audioStreamIconBox
|
|
width: Kirigami.Units.iconSizes.roundedIconSize(Math.min(Math.min(iconBox.width, iconBox.height), Kirigami.Units.iconSizes.smallMedium))
|
|
}
|
|
|
|
PropertyChanges {
|
|
target: audioStreamIcon
|
|
|
|
height: parent.height
|
|
width: parent.width
|
|
}
|
|
},
|
|
|
|
State {
|
|
name: "vertical"
|
|
when: frame.height > audioStreamIcon.requiredSpace
|
|
|
|
AnchorChanges {
|
|
target: audioStreamIconBox
|
|
|
|
anchors.right: undefined
|
|
anchors.horizontalCenter: frame.horizontalCenter
|
|
}
|
|
|
|
PropertyChanges {
|
|
target: audioStreamIconBox
|
|
|
|
anchors.topMargin: taskFrame.margins.top
|
|
width: Kirigami.Units.iconSizes.roundedIconSize(Math.min(Math.min(iconBox.width, iconBox.height), Kirigami.Units.iconSizes.smallMedium))
|
|
}
|
|
|
|
PropertyChanges {
|
|
target: audioStreamIcon
|
|
|
|
height: parent.height
|
|
width: parent.width
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|