diff --git a/res/ui/window.ui b/res/ui/window.ui index 2985cd4..f10f45f 100644 --- a/res/ui/window.ui +++ b/res/ui/window.ui @@ -380,36 +380,67 @@ - + True - True + False + vertical - + True - False - none + True - + True False - 18 - vertical - 18 + none - + True False + 18 vertical - 12 + 18 - + True False - start - Works - - - + vertical + 12 + + + True + False + start + Works + + + + + + False + True + 0 + + + + + True + False + 0 + in + + + True + False + + + + + False + True + 1 + + False @@ -418,16 +449,45 @@ - + True False - 0 - in + vertical + 12 - + True False + start + Recordings + + + + + False + True + 0 + + + + + True + False + 0 + in + + + True + False + + + + + False + True + 1 + @@ -437,63 +497,73 @@ + + + + + + True + True + 0 + + + + + True + False + slide-up + False + + + True + False + + + True + True + True + + + True + False + document-edit-symbolic + + + - False - True + start 0 - + True - False - vertical - 12 + True + True + - + True False - start - Recordings - - - + user-trash-symbolic - - False - True - 0 - - - - - True - False - 0 - in - - - True - False - - - - - False - True - 1 - - False - True - 1 + end + 0 + + False + True + 1 + diff --git a/src/window.rs b/src/window.rs index 66a2e28..9d24a94 100644 --- a/src/window.rs +++ b/src/window.rs @@ -33,7 +33,14 @@ pub struct Window { work_list: gtk::ListBox, recording_box: gtk::Box, recording_list: gtk::ListBox, + actions_revealer: gtk::Revealer, + edit_button: gtk::Button, + delete_button: gtk::Button, person_list_row_activated_handler_id: Cell>, + work_list_row_activated_handler_id: Cell>, + recording_list_row_activated_handler_id: Cell>, + edit_button_clicked_handler_id: Cell>, + delete_button_clicked_handler_id: Cell>, } impl Window { @@ -55,6 +62,9 @@ impl Window { get_widget!(builder, gtk::ListBox, work_list); get_widget!(builder, gtk::Box, recording_box); get_widget!(builder, gtk::ListBox, recording_list); + get_widget!(builder, gtk::Revealer, actions_revealer); + get_widget!(builder, gtk::Button, edit_button); + get_widget!(builder, gtk::Button, delete_button); let backend = Backend::new("test.sqlite"); @@ -73,7 +83,14 @@ impl Window { work_list: work_list, recording_box: recording_box, recording_list: recording_list, + actions_revealer: actions_revealer, + edit_button: edit_button, + delete_button: delete_button, person_list_row_activated_handler_id: Cell::new(None), + work_list_row_activated_handler_id: Cell::new(None), + recording_list_row_activated_handler_id: Cell::new(None), + edit_button_clicked_handler_id: Cell::new(None), + delete_button_clicked_handler_id: Cell::new(None), }); action!( @@ -184,7 +201,8 @@ impl Window { .get_persons(clone!(@strong self as self_ => move |persons| { self_.clone().set_state(Persons(persons)); })); - + + self.actions_revealer.set_reveal_child(false); self.sidebar_stack.set_visible_child_name("loading"); self.stack.set_visible_child_name("empty_screen"); self.leaflet.set_visible_child_name("sidebar"); @@ -233,6 +251,8 @@ impl Window { }), ))); + + self.actions_revealer.set_reveal_child(false); self.sidebar_stack.set_visible_child_name("persons_list"); self.stack.set_visible_child_name("empty_screen"); self.leaflet.set_visible_child_name("sidebar"); @@ -270,6 +290,7 @@ impl Window { }), ); + self.actions_revealer.set_reveal_child(false); self.content_stack.set_visible_child_name("loading"); self.stack.set_visible_child_name("person_screen"); self.leaflet.set_visible_child_name("content"); @@ -298,6 +319,56 @@ impl Window { self.work_list.insert(&row, -1); } + match self.work_list_row_activated_handler_id.take() { + Some(id) => self.work_list.disconnect(id), + None => (), + } + + let handler_id = self.work_list.connect_row_activated( + clone!(@strong self as self_, @strong works => move |_, row| { + self_.recording_list.unselect_all(); + + let row = row.get_child().unwrap().downcast::().unwrap(); + let index: usize = row.get_index().try_into().unwrap(); + let work = works[index].clone(); + + match self_.edit_button_clicked_handler_id.take() { + Some(id) => self_.edit_button.disconnect(id), + None => (), + } + + let handler_id = self_.edit_button.connect_clicked( + clone!(@strong self_ => move |_| { + WorkEditor::new(self_.backend.clone(), &self_.window, Some(work.clone()), clone!(@strong self_ => move |_| { + self_.clone().set_state(Loading); + })).show(); + }), + ); + + self_.edit_button_clicked_handler_id + .set(Some(handler_id)); + + match self_.delete_button_clicked_handler_id.take() { + Some(id) => self_.delete_button.disconnect(id), + None => (), + } + + let handler_id = self_.delete_button.connect_clicked( + clone!(@strong self_ => move |_| { + // self_.backend.delete_work(work.id); + }), + ); + + self_.delete_button_clicked_handler_id + .set(Some(handler_id)); + + self_.actions_revealer.set_reveal_child(true); + }), + ); + + self.work_list_row_activated_handler_id + .set(Some(handler_id)); + if recordings.is_empty() { self.recording_box.hide(); } else { @@ -328,6 +399,56 @@ impl Window { self.recording_list.insert(&row, -1); } + match self.recording_list_row_activated_handler_id.take() { + Some(id) => self.recording_list.disconnect(id), + None => (), + } + + let handler_id = self.recording_list.connect_row_activated( + clone!(@strong self as self_, @strong recordings => move |_, row| { + self_.work_list.unselect_all(); + + let row = row.get_child().unwrap().downcast::().unwrap(); + let index: usize = row.get_index().try_into().unwrap(); + let recording = recordings[index].clone(); + + match self_.edit_button_clicked_handler_id.take() { + Some(id) => self_.edit_button.disconnect(id), + None => (), + } + + let handler_id = self_.edit_button.connect_clicked( + clone!(@strong self_ => move |_| { + RecordingEditor::new(self_.backend.clone(), &self_.window, Some(recording.clone()), clone!(@strong self_ => move |_| { + self_.clone().set_state(Loading); + })).show(); + }), + ); + + self_.edit_button_clicked_handler_id + .set(Some(handler_id)); + + match self_.delete_button_clicked_handler_id.take() { + Some(id) => self_.delete_button.disconnect(id), + None => (), + } + + let handler_id = self_.delete_button.connect_clicked( + clone!(@strong self_ => move |_| { + // self_.backend.delete_recording(recording.id); + }), + ); + + self_.delete_button_clicked_handler_id + .set(Some(handler_id)); + + self_.actions_revealer.set_reveal_child(true); + }), + ); + + self.recording_list_row_activated_handler_id + .set(Some(handler_id)); + self.content_stack.set_visible_child_name("content"); self.stack.set_visible_child_name("person_screen"); self.leaflet.set_visible_child_name("content"); @@ -336,6 +457,7 @@ impl Window { } fn back(&self) { + self.actions_revealer.set_reveal_child(false); self.stack.set_visible_child_name("empty_screen"); self.leaflet.set_visible_child_name("sidebar"); }