diff --git a/res/resources.xml b/res/resources.xml
index 222bb34..85360bf 100644
--- a/res/resources.xml
+++ b/res/resources.xml
@@ -1,6 +1,7 @@
+ ui/person_editor.ui
ui/window.ui
diff --git a/res/ui/person_editor.ui b/res/ui/person_editor.ui
new file mode 100644
index 0000000..e99de6e
--- /dev/null
+++ b/res/ui/person_editor.ui
@@ -0,0 +1,96 @@
+
+
+
+
+
+
diff --git a/src/dialogs/mod.rs b/src/dialogs/mod.rs
new file mode 100644
index 0000000..76b4d04
--- /dev/null
+++ b/src/dialogs/mod.rs
@@ -0,0 +1,2 @@
+pub mod person_editor;
+pub use person_editor::*;
\ No newline at end of file
diff --git a/src/dialogs/person_editor.rs b/src/dialogs/person_editor.rs
new file mode 100644
index 0000000..c48bd08
--- /dev/null
+++ b/src/dialogs/person_editor.rs
@@ -0,0 +1,70 @@
+use crate::database::*;
+use glib::clone;
+use gtk::prelude::*;
+use gtk_macros::get_widget;
+use std::rc::Rc;
+
+pub struct PersonEditor {
+ window: gtk::Window,
+ id: i64,
+ first_name_entry: gtk::Entry,
+ last_name_entry: gtk::Entry,
+}
+
+impl PersonEditor {
+ pub fn new () + 'static, P: IsA>(
+ db: Rc,
+ parent: &P,
+ person: Option,
+ callback: F,
+ ) -> Rc {
+ let builder = gtk::Builder::from_resource("/de/johrpan/musicus_editor/ui/person_editor.ui");
+
+ get_widget!(builder, gtk::Window, window);
+ get_widget!(builder, gtk::Button, cancel_button);
+ get_widget!(builder, gtk::Button, save_button);
+ get_widget!(builder, gtk::Entry, first_name_entry);
+ get_widget!(builder, gtk::Entry, last_name_entry);
+
+ let id = match person {
+ Some(person) => {
+ first_name_entry.set_text(&person.first_name);
+ last_name_entry.set_text(&person.last_name);
+ person.id
+ }
+ None => rand::random::().into(),
+ };
+
+ let result = Rc::new(PersonEditor {
+ id: id,
+ window: window,
+ first_name_entry: first_name_entry,
+ last_name_entry: last_name_entry,
+ });
+
+ cancel_button.connect_clicked(clone!(@strong result => move |_| {
+ result.window.close();
+ }));
+
+ save_button.connect_clicked(clone!(@strong result => move |_| {
+ result.window.close();
+
+ let person = Person {
+ id: result.id,
+ first_name: result.first_name_entry.get_text().to_string(),
+ last_name: result.last_name_entry.get_text().to_string(),
+ };
+
+ db.update_person(person.clone());
+ callback(person);
+ }));
+
+ result.window.set_transient_for(Some(parent));
+
+ result
+ }
+
+ pub fn show(&self) {
+ self.window.show();
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index b225e47..7d8203e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,8 +9,10 @@ extern crate diesel_migrations;
use gio::prelude::*;
use glib::clone;
use std::cell::RefCell;
+use std::rc::Rc;
mod database;
+mod dialogs;
mod window;
use window::Window;
@@ -26,7 +28,7 @@ fn main() {
)
.expect("Failed to initialize GTK application!");
- let window = RefCell::new(None::);
+ let window: RefCell