diff --git a/res/musicus.gresource.xml b/res/musicus.gresource.xml
index 9784187..f1dbbbd 100644
--- a/res/musicus.gresource.xml
+++ b/res/musicus.gresource.xml
@@ -2,20 +2,19 @@
ui/ensemble_editor.ui
- ui/ensemble_screen.ui
ui/instrument_editor.ui
ui/login_dialog.ui
ui/medium_editor.ui
ui/performance_editor.ui
ui/person_editor.ui
- ui/person_screen.ui
ui/player_bar.ui
ui/player_screen.ui
ui/poe_list.ui
ui/preferences.ui
ui/recording_editor.ui
- ui/recording_screen.ui
ui/register_dialog.ui
+ ui/screen.ui
+ ui/section.ui
ui/selector.ui
ui/server_dialog.ui
ui/source_selector.ui
@@ -25,7 +24,6 @@
ui/window.ui
ui/work_editor.ui
ui/work_part_editor.ui
- ui/work_screen.ui
ui/work_section_editor.ui
diff --git a/res/ui/ensemble_screen.ui b/res/ui/ensemble_screen.ui
deleted file mode 100644
index 02cde11..0000000
--- a/res/ui/ensemble_screen.ui
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
diff --git a/res/ui/person_screen.ui b/res/ui/person_screen.ui
deleted file mode 100644
index 4a1aeda..0000000
--- a/res/ui/person_screen.ui
+++ /dev/null
@@ -1,155 +0,0 @@
-
-
-
-
-
- vertical
-
-
-
-
-
- False
-
-
- 400
- true
-
-
- Search works and recordings …
-
-
-
-
-
-
-
-
-
-
- loading
-
-
- true
- true
- center
- center
- true
-
-
-
-
-
-
- content
-
-
- true
-
-
- 12
- 12
- 18
- 12
- 800
-
-
- vertical
- 18
-
-
- vertical
- 12
-
-
- start
- Works
-
-
-
-
-
-
-
-
-
-
-
-
-
- vertical
- 12
-
-
- start
- Recordings
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- nothing
-
-
- No works or recordings found.
-
-
-
-
-
-
-
-
-
diff --git a/res/ui/recording_screen.ui b/res/ui/recording_screen.ui
deleted file mode 100644
index 6a0a640..0000000
--- a/res/ui/recording_screen.ui
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
- vertical
-
-
-
-
-
-
-
- loading
-
-
- True
-
-
-
-
-
-
- content
-
-
- true
-
-
- 12
- 12
- 18
- 12
- 800
-
-
- vertical
- 12
-
-
- start
- Tracks
-
-
-
-
-
-
-
-
-
-
-
- Add to playlist
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/ui/screen.ui b/res/ui/screen.ui
new file mode 100644
index 0000000..2027a6c
--- /dev/null
+++ b/res/ui/screen.ui
@@ -0,0 +1,86 @@
+
+
+
+
+
+ vertical
+
+
+
+
+
+ False
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+ loading
+
+
+ true
+ true
+ center
+ center
+ 32
+ 32
+ true
+
+
+
+
+
+
+ content
+
+
+
+
+
+
+ vertical
+ 12
+ 12
+ 36
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/ui/section.ui b/res/ui/section.ui
new file mode 100644
index 0000000..2d354d1
--- /dev/null
+++ b/res/ui/section.ui
@@ -0,0 +1,28 @@
+
+
+
+
+ vertical
+ 6
+
+
+ 12
+
+
+ end
+ 0.0
+ end
+ true
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/ui/work_screen.ui b/res/ui/work_screen.ui
deleted file mode 100644
index 44f4ca0..0000000
--- a/res/ui/work_screen.ui
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
-
- vertical
-
-
-
-
-
- False
-
-
- 400
- true
-
-
- Search recordings …
-
-
-
-
-
-
-
-
-
-
- loading
-
-
- True
-
-
-
-
-
-
- content
-
-
- true
-
-
- 12
- 12
- 18
- 12
- 800
-
-
- vertical
- 12
-
-
- start
- Recordings
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- nothing
-
-
- No recordings found.
-
-
-
-
-
-
-
-
-
diff --git a/src/meson.build b/src/meson.build
index 85c77f1..6c97a64 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -77,12 +77,12 @@ sources = files(
'import/track_editor.rs',
'import/track_selector.rs',
'import/track_set_editor.rs',
- 'screens/ensemble_screen.rs',
+ 'screens/ensemble.rs',
'screens/mod.rs',
- 'screens/person_screen.rs',
+ 'screens/person.rs',
'screens/player_screen.rs',
- 'screens/recording_screen.rs',
- 'screens/work_screen.rs',
+ 'screens/recording.rs',
+ 'screens/work.rs',
'selectors/ensemble.rs',
'selectors/instrument.rs',
'selectors/mod.rs',
@@ -97,6 +97,8 @@ sources = files(
'widgets/navigator_window.rs',
'widgets/player_bar.rs',
'widgets/poe_list.rs',
+ 'widgets/screen.rs',
+ 'widgets/section.rs',
'config.rs',
'config.rs.in',
'main.rs',
diff --git a/src/screens/ensemble_screen.rs b/src/screens/ensemble.rs
similarity index 65%
rename from src/screens/ensemble_screen.rs
rename to src/screens/ensemble.rs
index f63aea1..dcd5d91 100644
--- a/src/screens/ensemble_screen.rs
+++ b/src/screens/ensemble.rs
@@ -1,74 +1,72 @@
-use super::*;
-use crate::backend::*;
-use crate::database::*;
+use super::RecordingScreen;
+
+use crate::backend::Backend;
+use crate::database::{Ensemble, Recording};
use crate::editors::EnsembleEditor;
-use crate::widgets::{List, Navigator, NavigatorScreen, NavigatorWindow};
-use gio::prelude::*;
+use crate::widgets::{List, Navigator, NavigatorScreen, NavigatorWindow, Screen, Section};
+
+use gettextrs::gettext;
use glib::clone;
use gtk::prelude::*;
-use gtk_macros::get_widget;
use libadwaita::prelude::*;
use std::cell::RefCell;
use std::rc::Rc;
+/// A screen for showing recordings with a ensemble.
pub struct EnsembleScreen {
backend: Rc,
ensemble: Ensemble,
- widget: gtk::Box,
- search_entry: gtk::SearchEntry,
- stack: gtk::Stack,
+ widget: Screen,
recording_list: Rc,
recordings: RefCell>,
navigator: RefCell