1
1
// SPDX-License-Identifier: GPL-3.0-or-later
2
2
3
+ use std:: time:: Duration ;
4
+
3
5
use crate :: macros:: * ;
4
6
use crate :: {
5
7
application:: PwvucontrolApplication ,
@@ -11,12 +13,15 @@ use adw::subclass::prelude::*;
11
13
use gettextrs:: gettext;
12
14
use glib:: clone;
13
15
use gtk:: { gio, prelude:: * } ;
16
+ use std:: cell:: Cell ;
17
+ use std:: time;
14
18
15
19
pub enum PwvucontrolWindowView {
16
20
Connected ,
17
21
Disconnected ,
18
22
}
19
23
mod imp {
24
+
20
25
use super :: * ;
21
26
22
27
#[ derive( Debug , gtk:: CompositeTemplate ) ]
@@ -44,6 +49,9 @@ mod imp {
44
49
pub info_banner : TemplateChild < adw:: Banner > ,
45
50
46
51
pub settings : gio:: Settings ,
52
+
53
+ pub beep_elapsed : Cell < time:: Instant > ,
54
+ pub beep_enabled : Cell < bool > ,
47
55
}
48
56
49
57
impl Default for PwvucontrolWindow {
@@ -60,6 +68,8 @@ mod imp {
60
68
reconnectbtn : TemplateChild :: default ( ) ,
61
69
settings : gio:: Settings :: new ( APP_ID ) ,
62
70
info_banner : TemplateChild :: default ( ) ,
71
+ beep_elapsed : Cell :: new ( std:: time:: Instant :: now ( ) ) ,
72
+ beep_enabled : Default :: default ( ) ,
63
73
}
64
74
}
65
75
}
@@ -179,6 +189,13 @@ mod imp {
179
189
self . obj ( ) . add_action ( & overamplification_action) ;
180
190
let use_led_peakmeter_action = self . settings . create_action ( "use-peakmeter-led" ) ;
181
191
self . obj ( ) . add_action ( & use_led_peakmeter_action) ;
192
+ let beep_on_volume_changes_action = self . settings . create_action ( "beep-on-volume-changes" ) ;
193
+ self . obj ( ) . add_action ( & beep_on_volume_changes_action) ;
194
+
195
+ self . settings . connect_changed ( Some ( "beep-on-volume-changes" ) , clone ! ( @weak self as widget => move |settings, _key| {
196
+ widget. beep_enabled. set( settings. boolean( "beep-on-volume-changes" ) ) ;
197
+ } ) ) ;
198
+ self . beep_enabled . set ( self . settings . boolean ( "beep-on-volume-changes" ) ) ;
182
199
183
200
self . obj ( ) . load_window_state ( ) ;
184
201
}
@@ -291,6 +308,16 @@ impl PwvucontrolWindow {
291
308
imp. info_banner . set_title ( & message) ;
292
309
imp. info_banner . set_revealed ( manager. node_model ( ) . n_items ( ) == 0 ) ;
293
310
}
311
+
312
+ pub ( crate ) fn play_beep ( & self ) {
313
+ if !self . imp ( ) . beep_enabled . get ( ) {
314
+ return ;
315
+ }
316
+ if self . imp ( ) . beep_elapsed . get ( ) . elapsed ( ) > Duration :: from_secs ( 1 ) {
317
+ self . display ( ) . beep ( ) ;
318
+ self . imp ( ) . beep_elapsed . set ( time:: Instant :: now ( ) ) ;
319
+ }
320
+ }
294
321
}
295
322
296
323
impl Default for PwvucontrolWindow {
0 commit comments