volume-osd: add example
This commit is contained in:
		
							parent
							
								
									0cf5fff6ea
								
							
						
					
					
						commit
						955bd1f8c1
					
				
					 3 changed files with 99 additions and 0 deletions
				
			
		
							
								
								
									
										7
									
								
								volume-osd/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								volume-osd/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
# Volume OSD
 | 
			
		||||
 | 
			
		||||
This is a simple overlay that shows the system volume when it changes using pipewire.
 | 
			
		||||
 | 
			
		||||
You can run the overlay with `qs -p shell.qml`.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								volume-osd/image.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								volume-osd/image.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 9.2 KiB  | 
							
								
								
									
										92
									
								
								volume-osd/shell.qml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								volume-osd/shell.qml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
import QtQuick
 | 
			
		||||
import QtQuick.Layouts
 | 
			
		||||
import Quickshell
 | 
			
		||||
import Quickshell.Services.Pipewire
 | 
			
		||||
import Quickshell.Widgets
 | 
			
		||||
 | 
			
		||||
Scope {
 | 
			
		||||
	id: root
 | 
			
		||||
 | 
			
		||||
	// Bind the pipewire node so its volume will be tracked
 | 
			
		||||
	PwObjectTracker {
 | 
			
		||||
		objects: [ Pipewire.defaultAudioSink ]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Connections {
 | 
			
		||||
		target: Pipewire.defaultAudioSink?.audio
 | 
			
		||||
 | 
			
		||||
		function onVolumeChanged() {
 | 
			
		||||
			root.shouldShowOsd = true;
 | 
			
		||||
			hideTimer.restart();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	property bool shouldShowOsd: false
 | 
			
		||||
 | 
			
		||||
	Timer {
 | 
			
		||||
		id: hideTimer
 | 
			
		||||
		interval: 1000
 | 
			
		||||
		onTriggered: root.shouldShowOsd = false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// The OSD window will be created and destroyed based on shouldShowOsd.
 | 
			
		||||
	// PanelWindow.visible could be set instead of using a loader, but using
 | 
			
		||||
	// a loader will reduce the memory overhead when the window isn't open.
 | 
			
		||||
	LazyLoader {
 | 
			
		||||
		active: root.shouldShowOsd
 | 
			
		||||
 | 
			
		||||
		PanelWindow {
 | 
			
		||||
			// Since the panel's screen is unset, it will be picked by the compositor
 | 
			
		||||
			// when the window is created. Most compositors pick the current active monitor.
 | 
			
		||||
 | 
			
		||||
			anchors.bottom: true
 | 
			
		||||
			margins.bottom: screen.height / 5
 | 
			
		||||
 | 
			
		||||
			implicitWidth: 400
 | 
			
		||||
			implicitHeight: 50
 | 
			
		||||
			color: "transparent"
 | 
			
		||||
 | 
			
		||||
			// An empty click mask prevents the window from blocking mouse events.
 | 
			
		||||
			mask: Region {}
 | 
			
		||||
 | 
			
		||||
			Rectangle {
 | 
			
		||||
				anchors.fill: parent
 | 
			
		||||
				radius: height / 2
 | 
			
		||||
				color: "#80000000"
 | 
			
		||||
 | 
			
		||||
				RowLayout {
 | 
			
		||||
					anchors {
 | 
			
		||||
						fill: parent
 | 
			
		||||
						leftMargin: 10
 | 
			
		||||
						rightMargin: 15
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					IconImage {
 | 
			
		||||
						implicitSize: 30
 | 
			
		||||
						source: Quickshell.iconPath("audio-volume-high-symbolic")
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					Rectangle {
 | 
			
		||||
						// Stretches to fill all left-over space
 | 
			
		||||
						Layout.fillWidth: true
 | 
			
		||||
 | 
			
		||||
						implicitHeight: 10
 | 
			
		||||
						radius: 20
 | 
			
		||||
						color: "#50ffffff"
 | 
			
		||||
 | 
			
		||||
						Rectangle {
 | 
			
		||||
							anchors {
 | 
			
		||||
								left: parent.left
 | 
			
		||||
								top: parent.top
 | 
			
		||||
								bottom: parent.bottom
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							implicitWidth: parent.width * (Pipewire.defaultAudioSink?.audio.volume ?? 0)
 | 
			
		||||
							radius: parent.radius
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue