/**************************************************************************** Copyright (C) 2017 Kai Uwe Broulik <kde@privat.broulik.de> ** ** 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) any later version. ** ** 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, write to the ** Free Software Foundation, Inc., ** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . ****************************************************************************/import QtQuick 2.0import org.kde.plasma.core 2.0 as PlasmaCoreMouseArea {id: audioStreamIconBoxhoverEnabled: trueonClicked: toggleMuted()// 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.mutedPropertyChanges {target: audioStreamIconBoxopacity: 1}PropertyChanges {target: audioStreamIconelementId: "audio-volume-high"}},State {name: "muted"when: task.mutedPropertyChanges {target: audioStreamIconBoxopacity: 1}PropertyChanges {target: audioStreamIconelementId: "audio-volume-muted"}}]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: units.longDuration}}},Transition {from: ""to: "muted"SequentialAnimation {NumberAnimation {property: "opacity"duration: units.longDuration}}},Transition {to: ""NumberAnimation {property: "opacity"duration: units.longDuration}}]opacity: 0visible: opacity > 0PlasmaCore.FrameSvgItem {anchors.fill: audioStreamIconvisible: parent.containsMouseimagePath: "widgets/viewitem"prefix: "hover"}PlasmaCore.Svg {id: audioSvgimagePath: "icons/audio"}PlasmaCore.SvgItem {id: audioStreamIconsvg: audioSvgsmooth: falseheight: Math.round(Math.min(parent.height * 1.4, units.iconSizes.smallMedium) / 2) * 2width: heightanchors {verticalCenter: parent.verticalCenterright: parent.right// Avoid overlap to the right.rightMargin: (parent.width - width) / 2 + units.smallSpacing / 4}states: [State {name: "horizontal"// When there is enough space for the audio icon, to fit right of the centered task icon.when: (frame.width > Math.min(iconBox.width, iconBox.height) +Math.min(Math.min(iconBox.width, iconBox.height), units.iconSizes.smallMedium) * 2)AnchorChanges {target: audioStreamIconLoaderanchors.top: undefinedanchors.verticalCenter: frame.verticalCenter}PropertyChanges {target: audioStreamIconLoaderanchors.rightMargin: iconBox.adjustMargin(true, parent.width, taskFrame.margins.right)width: units.roundToIconSize(Math.min(Math.min(iconBox.width, iconBox.height), units.iconSizes.smallMedium))}PropertyChanges {target: audioStreamIconheight: parent.heightwidth: parent.width}},State {name: "vertical"// When audio icon can fit above the centered task icon.when: (frame.height > Math.min(iconBox.width, iconBox.height) +Math.min(Math.min(iconBox.width, iconBox.height), units.iconSizes.smallMedium) * 2)AnchorChanges {target: audioStreamIconLoaderanchors.right: undefinedanchors.horizontalCenter: frame.horizontalCenter}PropertyChanges {target: audioStreamIconLoaderanchors.topMargin: iconBox.adjustMargin(false, frame.height, taskFrame.margins.top)width: units.roundToIconSize(Math.min(Math.min(iconBox.width, iconBox.height), units.iconSizes.smallMedium))}PropertyChanges {target: audioStreamIconheight: parent.heightwidth: parent.width}}]}}