Skip to content

Commit

Permalink
Extend Audio settings widget with footer and custom property
Browse files Browse the repository at this point in the history
Signed-off-by: dmitry-erin <[email protected]>
  • Loading branch information
dmitry-erin committed Sep 3, 2024
1 parent 81f8926 commit 9735e95
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 5 deletions.
42 changes: 39 additions & 3 deletions src/audio_settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ use std::cell::RefCell;
use std::sync::OnceLock;
use gtk::prelude::*;
use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate, DropDown, Scale};
use gtk::{glib, CompositeTemplate, Box, DropDown, Scale};
use glib::{Binding, Properties};
use glib::subclass::Signal;

mod imp {
use super::*;

#[derive(Default, CompositeTemplate)]
#[derive(Default, CompositeTemplate, Properties)]
#[properties(wrapper_type = super::AudioSettings)]
#[template(resource = "/org/gnome/controlpanelgui/ui/audio_settings.ui")]
pub struct AudioSettings {
pub name: String,
Expand All @@ -22,6 +23,11 @@ mod imp {
pub speaker_switch: TemplateChild<DropDown>,
#[template_child]
pub speaker_volume: TemplateChild<Scale>,
#[template_child]
pub footer: TemplateChild<Box>,

#[property(name = "footer-visible", get, set, type = bool)]
footer_visible: RefCell<bool>,

// Vector holding the bindings to properties of `Object`
pub bindings: RefCell<Vec<Binding>>,
Expand Down Expand Up @@ -68,9 +74,34 @@ mod imp {
let value = scale.value();
self.obj().emit_by_name::<()>("speaker-volume-changed", &[&value]);
}
#[template_callback]
fn on_reset_clicked(&self) {
println!("Reset to defaults!");
self.obj().emit_by_name::<()>("set-defaults", &[]);
}
#[template_callback]
fn on_save_clicked(&self) {
println!("Apply new!");
let mic = self.mic_switch.selected();
let speaker = self.speaker_switch.selected();
let mic_volume = self.mic_volume.value();
let speaker_volume = self.speaker_volume.value();
self.obj().emit_by_name::<()>("apply-new", &[&mic, &speaker, &mic_volume, &speaker_volume]);
}
}//end #[gtk::template_callbacks]

#[glib::derived_properties]
impl ObjectImpl for AudioSettings {
fn constructed(&self) {
self.parent_constructed();

// After the object is constructed, bind the footer visibilty property
let obj = self.obj();
obj.bind_property("footer-visible", &self.footer.get(), "visible")
.flags(glib::BindingFlags::DEFAULT)
.build();
}

fn signals() -> &'static [Signal] {
static SIGNALS: OnceLock<Vec<Signal>> = OnceLock::new();
SIGNALS.get_or_init(|| {
Expand All @@ -86,7 +117,12 @@ mod imp {
.build(),
Signal::builder("speaker-volume-changed")
.param_types([f64::static_type()])
.build()
.build(),
Signal::builder("set-defaults")
.build(),
Signal::builder("apply-new")
.param_types([u32::static_type(), u32::static_type(), f64::static_type(), f64::static_type()])
.build(),
]
})
}
Expand Down
43 changes: 43 additions & 0 deletions src/ui/audio_settings.ui
Original file line number Diff line number Diff line change
Expand Up @@ -115,5 +115,48 @@
<property name="draw_value">true</property>
</object>
</child>
<child>
<object class="GtkBox">
<property name="vexpand">true</property>
</object>
</child>
<child>
<object class="GtkBox" id="footer">
<property name="orientation">vertical</property>
<property name="valign">end</property>
<child>
<object class="GtkSeparator">
</object>
</child>
<child>
<object class="GtkBox">
<property name="orientation">horizontal</property>
<child>
<object class="GtkButton">
<property name="label">Reset to defaults</property>
<signal name="clicked" handler="on_reset_clicked" swapped="true"/>
<style><class name="settings-button"/></style>
<property name="width-request">140</property>
<property name="height-request">30</property>
</object>
</child>
<child>
<object class="GtkBox">
<property name="hexpand">true</property>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label">Save</property>
<signal name="clicked" handler="on_save_clicked" swapped="true"/>
<style><class name="settings-button"/></style>
<property name="width-request">60</property>
<property name="height-request">30</property>
</object>
</child>
</object>
</child>
</object>
</child>
</template>
</interface>
4 changes: 3 additions & 1 deletion src/ui/settings.ui
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,9 @@
<object class="GtkStackPage">
<property name="name">audio</property>
<property name="child">
<object class="AudioSettings" id="audio_settings_page"></object>
<object class="AudioSettings" id="audio_settings_page">
<property name="footer-visible">true</property>
</object>
</property>
</object>
</child>
Expand Down
1 change: 1 addition & 0 deletions src/ui/vm_settings.ui
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@
<signal name="speaker-changed" handler="on_speaker_changed" swapped="true"/>
<signal name="mic-volume-changed" handler="on_mic_volume_changed" swapped="true"/>
<signal name="speaker-volume-changed" handler="on_speaker_volume_changed" swapped="true"/>
<property name="footer-visible">false</property>
</object>
</child>
</template>
Expand Down
2 changes: 1 addition & 1 deletion src/vm_settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::sync::OnceLock;
use gtk::prelude::*;
use gtk::subclass::prelude::*;
use gtk::{glib, CompositeTemplate, Label, Image, MenuButton, Popover};
use glib::{Binding, ToValue};
use glib::Binding;
use glib::subclass::Signal;

use crate::vm_gobject::VMGObject;
Expand Down

0 comments on commit 9735e95

Please sign in to comment.