streamdeck-workspace/streamdeck/src/dialogs/edit_deck_dialog.rs

53 lines
1.5 KiB
Rust

use crate::daemon::Handle;
use gtk::prelude::*;
use marble::widgets::Dialog;
use std::{cell::RefCell, rc::Rc};
pub(crate) fn build(serial_number: String, deck_name: String) -> Dialog {
let dialog = Dialog::new();
let label = gtk::Label::new(Some("Edit deck name"));
let entry = gtk::Entry::new();
entry.set_valign(gtk::Align::Center);
entry
.style_context()
.add_class(marble::STYLE_CLASS_H3_LABEL);
entry.set_text(&deck_name);
let grid = gtk::Grid::new();
grid.set_column_spacing(12);
grid.set_row_spacing(12);
grid.set_halign(gtk::Align::Center);
grid.set_margin(24);
grid.attach(&label, 0, 0, 1, 1);
grid.attach(&entry, 1, 0, 3, 1);
dialog.content_area().add(&grid);
let serial_number = Rc::new(serial_number);
let previous_name = Rc::new(RefCell::new(deck_name));
entry.connect_changed(move |entry| {
let serial_number = Rc::clone(&serial_number);
let previous_name = Rc::clone(&previous_name);
if previous_name.borrow().as_str() == entry.text() {
return;
}
*previous_name.borrow_mut() = entry.text().into();
glib::MainContext::default().spawn_local(async move {
let _ = Handle::current()
.set_deck_name(
String::clone(&serial_number),
String::clone(&previous_name.borrow()),
)
.await;
});
});
dialog.show_all();
dialog
}