1
1
// SPDX-License-Identifier: GPL-3.0-or-later
2
2
3
3
use crate :: {
4
- backend:: { NodeType , PwChannelObject , PwNodeObject , PwvucontrolManager } , ui:: { LevelbarProvider , PwChannelBox , PwVolumeScale }
4
+ backend:: { NodeType , PwChannelObject , PwNodeObject , PwvucontrolManager } , ui:: { LevelbarProvider , PwChannelBox , PwVolumeScale , PeakMeterAbstraction }
5
5
} ;
6
6
use glib:: { clone, closure_local, ControlFlow , SignalHandlerId } ;
7
7
use gtk:: { prelude:: * , subclass:: prelude:: * } ;
@@ -25,6 +25,7 @@ mod imp {
25
25
pub ( super ) level : Cell < f32 > ,
26
26
pub ( super ) default_node : Cell < u32 > ,
27
27
pub ( super ) default_node_changed_handler : RefCell < Option < Box < dyn Fn ( ) > > > ,
28
+ pub peak_meter : RefCell < PeakMeterAbstraction > ,
28
29
29
30
// Template widgets
30
31
#[ template_child]
@@ -36,7 +37,7 @@ mod imp {
36
37
#[ template_child]
37
38
pub volume_scale : TemplateChild < PwVolumeScale > ,
38
39
#[ template_child]
39
- pub level_bar : TemplateChild < gtk:: LevelBar > ,
40
+ pub peakmeterbox : TemplateChild < gtk:: Box > ,
40
41
#[ template_child]
41
42
pub mutebtn : TemplateChild < gtk:: ToggleButton > ,
42
43
#[ template_child]
@@ -156,13 +157,14 @@ mod imp {
156
157
widget. obj( ) . grab_focus( ) ;
157
158
} ) ) ;
158
159
159
- self . level_bar . set_min_value ( 0.0 ) ;
160
- self . level_bar . set_max_value ( 1.0 ) ;
161
-
162
- self . level_bar . add_offset_value ( gtk :: LEVEL_BAR_OFFSET_LOW , 0.0 ) ;
163
- self . level_bar . add_offset_value ( gtk :: LEVEL_BAR_OFFSET_HIGH , 0.0 ) ;
164
- self . level_bar . add_offset_value ( gtk :: LEVEL_BAR_OFFSET_FULL , 1.0 ) ;
160
+ let window = crate :: ui :: PwvucontrolWindow :: default ( ) ;
161
+ window
162
+ . imp ( )
163
+ . settings . connect_changed ( Some ( "use-peakmeter-led" ) , clone ! ( @weak self as widget => move |_settings , _detail| {
164
+ widget . setup_levelbar_widget ( ) ;
165
+ } ) ) ;
165
166
167
+ self . setup_levelbar_widget ( ) ;
166
168
}
167
169
168
170
fn dispose ( & self ) {
@@ -186,14 +188,14 @@ mod imp {
186
188
187
189
fn map ( & self ) {
188
190
self . parent_map ( ) ;
189
-
191
+
190
192
// Monitoring ourselves cause an infinite loop.
191
193
let item = self . node_object . borrow ( ) ;
192
194
let item = item. as_ref ( ) . unwrap ( ) ;
193
195
if item. name ( ) != "pwvucontrol-peak-detect" {
194
196
self . setuplevelbar ( ) ;
195
197
} else {
196
- self . level_bar . set_visible ( false ) ;
198
+ self . peak_meter . borrow ( ) . set_visible ( false ) ;
197
199
}
198
200
}
199
201
}
@@ -218,18 +220,35 @@ mod imp {
218
220
impl PwVolumeBox {
219
221
fn setuplevelbar ( & self ) {
220
222
let item = self . node_object . borrow ( ) ;
221
- let item = item. as_ref ( ) . cloned ( ) . unwrap ( ) ;
223
+ let item = item. as_ref ( ) . unwrap ( ) ;
222
224
223
225
if let Ok ( provider) = LevelbarProvider :: new ( & self . obj ( ) , item. boundid ( ) ) {
224
226
self . levelbarprovider . set ( Some ( provider) ) ;
225
227
226
228
let callbackid = self . obj ( ) . add_tick_callback ( |widget, _fc| {
227
- widget. imp ( ) . level_bar . set_value ( widget. imp ( ) . level . get ( ) as f64 ) ;
229
+
230
+ widget. imp ( ) . peak_meter . borrow ( ) . set_level ( widget. imp ( ) . level . get ( ) ) ;
228
231
ControlFlow :: Continue
229
232
} ) ;
230
233
self . timeoutid . set ( Some ( callbackid) ) ;
231
234
}
232
235
}
236
+
237
+ fn setup_levelbar_widget ( & self ) {
238
+ let window = crate :: ui:: PwvucontrolWindow :: default ( ) ;
239
+ let peak_meter = match window. imp ( ) . settings . boolean ( "use-peakmeter-led" ) {
240
+ true => PeakMeterAbstraction :: new ( crate :: ui:: PeakMeterType :: Led ) ,
241
+ false => PeakMeterAbstraction :: new ( crate :: ui:: PeakMeterType :: Basic )
242
+ } ;
243
+
244
+ if let Some ( widget) = self . peak_meter . borrow ( ) . get_widget ( ) {
245
+ self . peakmeterbox . remove ( widget) ;
246
+ }
247
+ if let Some ( widget) = peak_meter. get_widget ( ) {
248
+ self . peakmeterbox . append ( widget) ;
249
+ }
250
+ self . peak_meter . set ( peak_meter) ;
251
+ }
233
252
}
234
253
}
235
254
0 commit comments