using Adw; namespace Keychain.UI; public class AddShortcutWindow { public Dialog Dialog { get; } private Gtk.Button? closeButton; private Gtk.Button? iconPickerButton; private Gtk.Button? browseButton; private Gtk.Button? clearSelectedFolderButton; private Gtk.Button? saveButton; public AddShortcutWindow() { var builder = new Gtk.Builder("Keychain.UI.AddShortcutWindow.AddShortcutWindow.xml"); Dialog = builder.GetObject("add_shortcut_dialog") as Dialog; if (Dialog == null) { throw new Exception("Failed to load embedded resource AddShortcutWindow.xml"); } closeButton = builder.GetObject("close_button") as Gtk.Button; if (closeButton == null) { throw new Exception("Failed to load UI element with ID: close_button"); } closeButton.OnClicked += Close; iconPickerButton = builder.GetObject("icon_picker_button") as Gtk.Button; if (iconPickerButton == null) { throw new Exception("Failed to load UI element with ID: icon_picker_button"); } iconPickerButton.OnClicked += OpenIconPicker; clearSelectedFolderButton = builder.GetObject("clear_selected_folder_button") as Gtk.Button; if (clearSelectedFolderButton == null) { throw new Exception("Failed to load UI element with ID: icon_picker_button"); } clearSelectedFolderButton.OnClicked += ClearSelectedFolder; browseButton = builder.GetObject("folder_browse_button") as Gtk.Button; if (browseButton == null) { throw new Exception("Failed to load UI element with ID: folder_browse_button"); } browseButton.OnClicked += BrowseFolder; saveButton = builder.GetObject("save_button") as Gtk.Button; if (saveButton == null) { throw new Exception("Failed to load UI element with ID: save_button"); } } private void OpenIconPicker(object sender, EventArgs e) { var chooser = new Gtk.EmojiChooser(); chooser.SetParent(iconPickerButton); chooser.OnEmojiPicked += (s, e) => { iconPickerButton.Label = e.Text; }; chooser.Show(); } private void Close(object sender, EventArgs e) { Dialog.Close(); } private void ClearSelectedFolder(object sender, EventArgs e) { var buttonContent = (ButtonContent)browseButton.Child; buttonContent.Label = "Browse"; clearSelectedFolderButton.Sensitive = false; } private async void BrowseFolder(object sender, EventArgs e) { var fileDialog = new Gtk.FileDialog(); var selectedFolder = await fileDialog.SelectFolderAsync((Window)Dialog.Parent.Parent); if (selectedFolder != null) { var buttonContent = (ButtonContent)browseButton.Child; buttonContent.Label = selectedFolder.GetPath(); clearSelectedFolderButton.Sensitive = true; } } }