2020-10-31 23:07:25 +01:00
|
|
|
use crate::database::*;
|
|
|
|
|
use glib::clone;
|
|
|
|
|
use gtk::prelude::*;
|
|
|
|
|
use gtk_macros::get_widget;
|
|
|
|
|
use std::cell::RefCell;
|
|
|
|
|
use std::convert::TryInto;
|
|
|
|
|
use std::rc::Rc;
|
|
|
|
|
|
|
|
|
|
pub struct TrackEditor {
|
2020-11-03 17:53:13 +01:00
|
|
|
window: libhandy::Window,
|
2020-10-31 23:07:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl TrackEditor {
|
2020-11-01 11:04:31 +01:00
|
|
|
pub fn new<W, F>(parent: &W, track: TrackDescription, work: WorkDescription, callback: F) -> Self
|
2020-10-31 23:07:25 +01:00
|
|
|
where
|
|
|
|
|
W: IsA<gtk::Window>,
|
2020-11-01 11:04:31 +01:00
|
|
|
F: Fn(TrackDescription) -> () + 'static,
|
2020-10-31 23:07:25 +01:00
|
|
|
{
|
2020-11-01 12:49:10 +01:00
|
|
|
let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/track_editor.ui");
|
2020-10-31 23:07:25 +01:00
|
|
|
|
2020-11-03 17:53:13 +01:00
|
|
|
get_widget!(builder, libhandy::Window, window);
|
2020-10-31 23:07:25 +01:00
|
|
|
get_widget!(builder, gtk::Button, cancel_button);
|
|
|
|
|
get_widget!(builder, gtk::Button, save_button);
|
|
|
|
|
get_widget!(builder, gtk::ListBox, list);
|
|
|
|
|
|
|
|
|
|
window.set_transient_for(Some(parent));
|
|
|
|
|
|
|
|
|
|
cancel_button.connect_clicked(clone!(@strong window => move |_| {
|
|
|
|
|
window.close();
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
let work = Rc::new(work);
|
|
|
|
|
let work_parts = Rc::new(RefCell::new(track.work_parts));
|
|
|
|
|
let file_name = track.file_name;
|
|
|
|
|
|
|
|
|
|
save_button.connect_clicked(clone!(@strong work_parts, @strong window => move |_| {
|
|
|
|
|
let mut work_parts = work_parts.borrow_mut();
|
|
|
|
|
work_parts.sort();
|
|
|
|
|
|
2020-11-01 11:04:31 +01:00
|
|
|
callback(TrackDescription {
|
2020-10-31 23:07:25 +01:00
|
|
|
work_parts: work_parts.clone(),
|
|
|
|
|
file_name: file_name.clone(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
window.close();
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
for (index, part) in work.parts.iter().enumerate() {
|
|
|
|
|
let check = gtk::CheckButton::new();
|
|
|
|
|
check.set_active(work_parts.borrow().contains(&index));
|
|
|
|
|
check.connect_toggled(clone!(@strong check, @strong work_parts => move |_| {
|
|
|
|
|
if check.get_active() {
|
|
|
|
|
let mut work_parts = work_parts.borrow_mut();
|
|
|
|
|
work_parts.push(index);
|
|
|
|
|
} else {
|
|
|
|
|
let mut work_parts = work_parts.borrow_mut();
|
|
|
|
|
if let Some(pos) = work_parts.iter().position(|part| *part == index) {
|
|
|
|
|
work_parts.remove(pos);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
let label = gtk::Label::new(Some(&part.title));
|
|
|
|
|
label.set_halign(gtk::Align::Start);
|
|
|
|
|
label.set_ellipsize(pango::EllipsizeMode::End);
|
|
|
|
|
|
|
|
|
|
let hbox = gtk::Box::new(gtk::Orientation::Horizontal, 6);
|
|
|
|
|
hbox.set_border_width(6);
|
|
|
|
|
hbox.add(&check);
|
|
|
|
|
hbox.add(&label);
|
|
|
|
|
|
|
|
|
|
let row = gtk::ListBoxRow::new();
|
|
|
|
|
row.add(&hbox);
|
|
|
|
|
row.show_all();
|
|
|
|
|
|
|
|
|
|
list.add(&row);
|
|
|
|
|
list.connect_row_activated(
|
|
|
|
|
clone!(@strong row, @strong check => move |_, activated_row| {
|
|
|
|
|
if *activated_row == row {
|
|
|
|
|
check.activate();
|
|
|
|
|
}
|
|
|
|
|
}),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let mut section_count = 0;
|
|
|
|
|
for section in &work.sections {
|
|
|
|
|
let attributes = pango::AttrList::new();
|
|
|
|
|
attributes.insert(pango::Attribute::new_weight(pango::Weight::Bold).unwrap());
|
|
|
|
|
|
|
|
|
|
let label = gtk::Label::new(Some(§ion.title));
|
|
|
|
|
label.set_halign(gtk::Align::Start);
|
|
|
|
|
label.set_ellipsize(pango::EllipsizeMode::End);
|
|
|
|
|
label.set_attributes(Some(&attributes));
|
|
|
|
|
let wrap = gtk::Box::new(gtk::Orientation::Vertical, 0);
|
|
|
|
|
wrap.set_border_width(6);
|
|
|
|
|
wrap.add(&label);
|
|
|
|
|
|
|
|
|
|
let row = gtk::ListBoxRow::new();
|
|
|
|
|
row.set_activatable(false);
|
|
|
|
|
row.add(&wrap);
|
|
|
|
|
row.show_all();
|
|
|
|
|
|
|
|
|
|
list.insert(
|
|
|
|
|
&row,
|
|
|
|
|
(section.before_index + section_count).try_into().unwrap(),
|
|
|
|
|
);
|
|
|
|
|
section_count += 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Self { window }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn show(&self) {
|
|
|
|
|
self.window.show();
|
|
|
|
|
}
|
|
|
|
|
}
|