use std::collections::HashMap; use adw::gdk::pango; use adw::ResponseAppearance; use crate::state_manager::structs::DeviceConfig; use crate::window::subpages; use super::*; pub(in crate::window) async fn new_device_config_name( main_window: &AudioDeviceManagerWindow, name_suggestion: Option, properties: HashMap, profiles: Vec, selected_profile: Option, ) { let entry = gtk::Entry::builder() .placeholder_text("Name") .activates_default(true) .build(); let cancel_response = "cancel"; let create_response = "create"; // Create new dialog let dialog = adw::AlertDialog::builder() .heading("Device Configuration Name") .close_response(cancel_response) .default_response(create_response) .extra_child(&entry) .build(); dialog.add_responses(&[(cancel_response, "Cancel"), (create_response, "Create")]); // Make the dialog button insensitive initially dialog.set_response_enabled(create_response, false); dialog.set_response_appearance(create_response, ResponseAppearance::Suggested); let config_names = main_window.imp().state_manager.borrow_mut().get_device_config_names(); if let Some(init_name) = name_suggestion { entry.set_text(&init_name); if init_name.is_empty() || config_names.contains(&init_name) { entry.add_css_class("error") } else { dialog.set_response_enabled(create_response, true) } } // Set entry's css class to "error", when there is no text in it entry.connect_changed(clone!( #[weak] dialog, move |entry| { let text = entry.text(); let empty = text.is_empty(); let exists = config_names.contains(&String::from(text)); let err = empty || exists; dialog.set_response_enabled(create_response, !err); if err { entry.add_css_class("error"); } else { entry.remove_css_class("error"); } } )); let response = dialog.choose_future(main_window).await; // Return if the user chose 'cancel_response' if response == cancel_response { println!("Cancel"); return; }; if response == create_response { let device_config_name = entry.text().to_string(); main_window.imp().state_manager.borrow_mut().create_new_device_config( device_config_name.clone(), properties, profiles, selected_profile ); main_window.add_device_config(&device_config_name); subpages::device_config::switch_to_device_config_window(main_window, device_config_name); return; }; }