Add basic support for editing works and recordings

This commit is contained in:
Elias Projahn 2020-10-10 01:16:21 +02:00
parent efc4c05ed1
commit 78c1c3e540
2 changed files with 253 additions and 61 deletions

View file

@ -380,36 +380,67 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkScrolledWindow"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child> <child>
<object class="GtkViewport"> <object class="GtkScrolledWindow">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">True</property>
<property name="shadow-type">none</property>
<child> <child>
<object class="GtkBox"> <object class="GtkViewport">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="border-width">18</property> <property name="shadow-type">none</property>
<property name="orientation">vertical</property>
<property name="spacing">18</property>
<child> <child>
<object class="GtkBox" id="work_box"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="border-width">18</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">12</property> <property name="spacing">18</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkBox" id="work_box">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="halign">start</property> <property name="orientation">vertical</property>
<property name="label" translatable="yes">Works</property> <property name="spacing">12</property>
<attributes> <child>
<attribute name="size" value="12288" /> <object class="GtkLabel">
</attributes> <property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Works</property>
<attributes>
<attribute name="size" value="12288" />
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkListBox" id="work_list">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -418,16 +449,45 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkFrame"> <object class="GtkBox" id="recording_box">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="label-xalign">0</property> <property name="orientation">vertical</property>
<property name="shadow-type">in</property> <property name="spacing">12</property>
<child> <child>
<object class="GtkListBox" id="work_list"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Recordings</property>
<attributes>
<attribute name="size" value="12288" />
</attributes>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkListBox" id="recording_list">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child> </child>
</object> </object>
<packing> <packing>
@ -437,63 +497,73 @@
</packing> </packing>
</child> </child>
</object> </object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRevealer" id="actions_revealer">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="transition-type">slide-up</property>
<property name="reveal-child">False</property>
<child>
<object class="GtkActionBar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkButton" id="edit_button">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">document-edit-symbolic</property>
</object>
</child>
</object>
<packing> <packing>
<property name="expand">False</property> <property name="pack-type">start</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkBox" id="recording_box"> <object class="GtkButton" id="delete_button">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">True</property>
<property name="orientation">vertical</property> <property name="receives-default">True</property>
<property name="spacing">12</property> <style>
<class name="destructive-action" />
</style>
<child> <child>
<object class="GtkLabel"> <object class="GtkImage">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="halign">start</property> <property name="icon-name">user-trash-symbolic</property>
<property name="label" translatable="yes">Recordings</property>
<attributes>
<attribute name="size" value="12288" />
</attributes>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkListBox" id="recording_list">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="pack-type">end</property>
<property name="fill">True</property> <property name="position">0</property>
<property name="position">1</property>
</packing> </packing>
</child> </child>
</object> </object>
</child> </child>
</object> </object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child> </child>
</object> </object>
<packing> <packing>

View file

@ -33,7 +33,14 @@ pub struct Window {
work_list: gtk::ListBox, work_list: gtk::ListBox,
recording_box: gtk::Box, recording_box: gtk::Box,
recording_list: gtk::ListBox, recording_list: gtk::ListBox,
actions_revealer: gtk::Revealer,
edit_button: gtk::Button,
delete_button: gtk::Button,
person_list_row_activated_handler_id: Cell<Option<glib::SignalHandlerId>>, person_list_row_activated_handler_id: Cell<Option<glib::SignalHandlerId>>,
work_list_row_activated_handler_id: Cell<Option<glib::SignalHandlerId>>,
recording_list_row_activated_handler_id: Cell<Option<glib::SignalHandlerId>>,
edit_button_clicked_handler_id: Cell<Option<glib::SignalHandlerId>>,
delete_button_clicked_handler_id: Cell<Option<glib::SignalHandlerId>>,
} }
impl Window { impl Window {
@ -55,6 +62,9 @@ impl Window {
get_widget!(builder, gtk::ListBox, work_list); get_widget!(builder, gtk::ListBox, work_list);
get_widget!(builder, gtk::Box, recording_box); get_widget!(builder, gtk::Box, recording_box);
get_widget!(builder, gtk::ListBox, recording_list); 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"); let backend = Backend::new("test.sqlite");
@ -73,7 +83,14 @@ impl Window {
work_list: work_list, work_list: work_list,
recording_box: recording_box, recording_box: recording_box,
recording_list: recording_list, 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), 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!( action!(
@ -185,6 +202,7 @@ impl Window {
self_.clone().set_state(Persons(persons)); self_.clone().set_state(Persons(persons));
})); }));
self.actions_revealer.set_reveal_child(false);
self.sidebar_stack.set_visible_child_name("loading"); self.sidebar_stack.set_visible_child_name("loading");
self.stack.set_visible_child_name("empty_screen"); self.stack.set_visible_child_name("empty_screen");
self.leaflet.set_visible_child_name("sidebar"); 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.sidebar_stack.set_visible_child_name("persons_list");
self.stack.set_visible_child_name("empty_screen"); self.stack.set_visible_child_name("empty_screen");
self.leaflet.set_visible_child_name("sidebar"); 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.content_stack.set_visible_child_name("loading");
self.stack.set_visible_child_name("person_screen"); self.stack.set_visible_child_name("person_screen");
self.leaflet.set_visible_child_name("content"); self.leaflet.set_visible_child_name("content");
@ -298,6 +319,56 @@ impl Window {
self.work_list.insert(&row, -1); 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::<SelectorRow>().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() { if recordings.is_empty() {
self.recording_box.hide(); self.recording_box.hide();
} else { } else {
@ -328,6 +399,56 @@ impl Window {
self.recording_list.insert(&row, -1); 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::<SelectorRow>().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.content_stack.set_visible_child_name("content");
self.stack.set_visible_child_name("person_screen"); self.stack.set_visible_child_name("person_screen");
self.leaflet.set_visible_child_name("content"); self.leaflet.set_visible_child_name("content");
@ -336,6 +457,7 @@ impl Window {
} }
fn back(&self) { fn back(&self) {
self.actions_revealer.set_reveal_child(false);
self.stack.set_visible_child_name("empty_screen"); self.stack.set_visible_child_name("empty_screen");
self.leaflet.set_visible_child_name("sidebar"); self.leaflet.set_visible_child_name("sidebar");
} }