11// Copyright 2025 System76 <[email protected] > 22// SPDX-License-Identifier: GPL-3.0-only
33
4- use cosmic:: widget;
4+ use cosmic:: { Apply , widget} ;
55use cosmic_settings_page:: { self as page, Section , section} ;
66use cosmic_settings_sound_subscription:: { self as subscription, pipewire} ;
77use itertools:: Itertools ;
88use slotmap:: SlotMap ;
99
1010#[ derive( Clone , Debug ) ]
1111pub enum Message {
12- /// Messages handled by the sound module in cosmic-settings-subscriptions
13- Subscription ( subscription:: Message ) ,
12+ Surface ( cosmic:: surface:: Action ) ,
1413}
1514
1615impl From < Message > for crate :: pages:: Message {
@@ -59,8 +58,12 @@ impl page::Page<crate::pages::Message> for Page {
5958}
6059
6160impl Page {
62- pub fn update ( & mut self , _message : Message ) -> cosmic:: Task < crate :: app:: Message > {
63- cosmic:: Task :: none ( )
61+ pub fn update ( & mut self , message : Message ) -> cosmic:: Task < crate :: app:: Message > {
62+ match message {
63+ Message :: Surface ( a) => {
64+ return cosmic:: Task :: done ( crate :: app:: Message :: Surface ( a) ) ;
65+ }
66+ }
6467 }
6568}
6669
@@ -75,15 +78,15 @@ pub fn view() -> Section<crate::pages::Message> {
7578 . model
7679 . device_profiles
7780 . iter ( )
78- . filter_map ( |( object_id , profiles) | {
79- let name = sound_page. model . device_names . get ( object_id ) ?. as_str ( ) ;
81+ . filter_map ( |( device_id , profiles) | {
82+ let name = sound_page. model . device_names . get ( device_id ) ?. as_str ( ) ;
8083
8184 // TODO: cache
8285 let active_profile =
8386 sound_page
8487 . model
8588 . active_profiles
86- . get ( object_id )
89+ . get ( device_id )
8790 . and_then ( |profile| {
8891 profiles
8992 . iter ( )
@@ -103,10 +106,17 @@ pub fn view() -> Section<crate::pages::Message> {
103106 } )
104107 . map ( |p| p. description . clone ( ) ) ;
105108
106- let dropdown =
107- widget:: dropdown ( Vec :: from_iter ( profiles) , active_profile, move |pos| {
108- super :: Message :: SetProfile ( object_id, pos) . into ( )
109- } ) ;
109+ let dropdown = widget:: dropdown:: popup_dropdown (
110+ Vec :: from_iter ( profiles) ,
111+ active_profile,
112+ move |id| super :: Message :: SetProfile ( device_id, id) ,
113+ cosmic:: iced:: window:: Id :: RESERVED ,
114+ super :: Message :: Surface ,
115+ crate :: Message :: from,
116+ )
117+ . apply ( cosmic:: Element :: from)
118+ . map ( crate :: pages:: Message :: from) ;
119+
110120 Some ( (
111121 name,
112122 widget:: settings:: item:: builder ( name) . control ( dropdown) ,
0 commit comments