Update dependencies, use new clone syntax

This commit is contained in:
Elias Projahn 2024-07-18 15:01:30 +02:00
parent c70abf9594
commit 36b2f1097e
12 changed files with 603 additions and 490 deletions

727
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -4,15 +4,15 @@ version = "0.1.0"
edition = "2021"
[dependencies]
adw = { package = "libadwaita", version = "0.6", features = ["v1_5"] }
adw = { package = "libadwaita", version = "0.7", features = ["v1_5"] }
anyhow = "1"
chrono = "0.4"
diesel = { version = "2.2", features = ["chrono", "sqlite"] }
diesel_migrations = "2.2"
fragile = "2"
gettext-rs = { version = "0.7", features = ["gettext-system"] }
gstreamer-play = "0.22"
gtk = { package = "gtk4", version = "0.8", features = ["v4_12", "blueprint"] }
gstreamer-play = "0.23"
gtk = { package = "gtk4", version = "0.9", features = ["v4_12", "blueprint"] }
lazy_static = "1"
log = "0.4"
mpris-player = "0.6"

View file

@ -28,24 +28,37 @@ mod imp {
self.parent_constructed();
let obj = self.obj();
obj.connect_parent_notify(clone!(@weak obj => move |_: &super::MusicusActivatableRow| {
let previous_parent = obj.imp().previous_parent.borrow_mut().take();
let previous_signal_handler_id = obj.imp().previous_signal_handler_id.borrow_mut().take();
if let (Some(previous_parent), Some(previous_signal_handler_id)) = (previous_parent, previous_signal_handler_id) {
previous_parent.disconnect(previous_signal_handler_id);
}
obj.connect_parent_notify(clone!(
#[weak]
obj,
move |_: &super::MusicusActivatableRow| {
let previous_parent = obj.imp().previous_parent.borrow_mut().take();
let previous_signal_handler_id =
obj.imp().previous_signal_handler_id.borrow_mut().take();
if let (Some(previous_parent), Some(previous_signal_handler_id)) =
(previous_parent, previous_signal_handler_id)
{
previous_parent.disconnect(previous_signal_handler_id);
}
if let Some(parent) = obj.parent().and_downcast::<gtk::ListBox>() {
let signal_handler_id = parent.connect_row_activated(clone!(@weak obj => move |_: &gtk::ListBox, row: &gtk::ListBoxRow| {
if *row == obj {
obj.activate();
}
}));
if let Some(parent) = obj.parent().and_downcast::<gtk::ListBox>() {
let signal_handler_id = parent.connect_row_activated(clone!(
#[weak]
obj,
move |_: &gtk::ListBox, row: &gtk::ListBoxRow| {
if *row == obj {
obj.activate();
}
}
));
obj.imp().previous_parent.replace(Some(parent));
obj.imp().previous_signal_handler_id.replace(Some(signal_handler_id));
obj.imp().previous_parent.replace(Some(parent));
obj.imp()
.previous_signal_handler_id
.replace(Some(signal_handler_id));
}
}
}));
));
}
fn signals() -> &'static [Signal] {

View file

@ -88,9 +88,13 @@ mod imp {
persons_popover.connect_create(move |_| {
let editor = MusicusPersonEditor::new(&obj.navigation(), &obj.library(), None);
editor.connect_created(clone!(@weak obj => move |_, person| {
obj.add_composer(person);
}));
editor.connect_created(clone!(
#[weak]
obj,
move |_, person| {
obj.add_composer(person);
}
));
obj.navigation().push(&editor);
});
@ -114,12 +118,21 @@ mod imp {
.css_classes(["flat"])
.build();
remove_button.connect_clicked(
clone!(@weak obj, @weak row, @strong instrument => move |_| {
remove_button.connect_clicked(clone!(
#[weak]
obj,
#[weak]
row,
#[strong]
instrument,
move |_| {
obj.imp().instrument_list.remove(&row);
obj.imp().instruments.borrow_mut().retain(|i| *i != instrument);
}),
);
obj.imp()
.instruments
.borrow_mut()
.retain(|i| *i != instrument);
}
));
row.add_suffix(&remove_button);
@ -184,12 +197,18 @@ impl MusicusWorkEditor {
.css_classes(["flat"])
.build();
remove_button.connect_clicked(
clone!(@weak self as obj, @weak row, @strong part => move |_| {
obj.imp().part_list.remove(&row);
obj.imp().parts.borrow_mut().retain(|p| *p != part);
}),
);
remove_button.connect_clicked(clone!(
#[weak(rename_to = this)]
self,
#[weak]
row,
#[strong]
part,
move |_| {
this.imp().part_list.remove(&row);
this.imp().parts.borrow_mut().retain(|p| *p != part);
}
));
row.add_suffix(&remove_button);
@ -210,12 +229,16 @@ impl MusicusWorkEditor {
fn add_composer(&self, person: Person) {
let role = self.library().composer_default_role().unwrap();
let composer = Composer { person, role };
let row = MusicusWorkEditorComposerRow::new(&self.library(), composer);
let row = MusicusWorkEditorComposerRow::new(&self.navigation(), &self.library(), composer);
row.connect_remove(clone!(@weak self as obj => move |row| {
obj.imp().composer_list.remove(row);
obj.imp().composer_rows.borrow_mut().retain(|c| c != row);
}));
row.connect_remove(clone!(
#[weak(rename_to = this)]
self,
move |row| {
this.imp().composer_list.remove(row);
this.imp().composer_rows.borrow_mut().retain(|c| c != row);
}
));
self.imp()
.composer_list

View file

@ -1,14 +1,14 @@
use crate::{
db::models::{Composer, Role},
editor::role_selector_popover::MusicusRoleSelectorPopover,
library::MusicusLibrary,
};
use std::cell::{OnceCell, RefCell};
use adw::{prelude::*, subclass::prelude::*};
use gtk::glib::{self, subclass::Signal, Properties};
use gtk::glib::{self, clone, subclass::Signal, Properties};
use once_cell::sync::Lazy;
use std::cell::{OnceCell, RefCell};
use crate::{
db::models::{Composer, Role},
editor::{role_editor::MusicusRoleEditor, role_selector_popover::MusicusRoleSelectorPopover},
library::MusicusLibrary,
};
mod imp {
use super::*;
@ -17,6 +17,9 @@ mod imp {
#[properties(wrapper_type = super::MusicusWorkEditorComposerRow)]
#[template(file = "data/ui/work_editor_composer_row.blp")]
pub struct MusicusWorkEditorComposerRow {
#[property(get, construct_only)]
pub navigation: OnceCell<adw::NavigationView>,
#[property(get, construct_only)]
pub library: OnceCell<MusicusLibrary>,
@ -67,6 +70,24 @@ mod imp {
}
});
let obj = self.obj().to_owned();
role_popover.connect_create(move |_| {
let editor = MusicusRoleEditor::new(&obj.navigation(), &obj.library(), None);
editor.connect_created(clone!(
#[weak]
obj,
move |_, role| {
if let Some(composer) = &mut *obj.imp().composer.borrow_mut() {
obj.imp().role_label.set_label(&role.to_string());
composer.role = role;
};
}
));
obj.navigation().push(&editor);
});
self.role_box.append(&role_popover);
self.role_popover.set(role_popover).unwrap();
}
@ -85,8 +106,15 @@ glib::wrapper! {
#[gtk::template_callbacks]
impl MusicusWorkEditorComposerRow {
pub fn new(library: &MusicusLibrary, composer: Composer) -> Self {
let obj: Self = glib::Object::builder().property("library", library).build();
pub fn new(
navigation: &adw::NavigationView,
library: &MusicusLibrary,
composer: Composer,
) -> Self {
let obj: Self = glib::Object::builder()
.property("navigation", navigation)
.property("library", library)
.build();
obj.set_composer(composer);
obj
}

View file

@ -3,7 +3,7 @@ use std::cell::{OnceCell, RefCell};
use adw::subclass::{navigation_page::NavigationPageImpl, prelude::*};
use gtk::{
gio,
glib::{self, clone, Properties},
glib::{self, Properties},
prelude::*,
};
@ -97,10 +97,10 @@ mod imp {
self.search_entry.set_key_capture_widget(&*self.obj());
self.search_entry
.connect_query_changed(clone!(@weak self as _self => move |entry| {
_self.obj().query(&entry.query());
}));
let obj = self.obj().to_owned();
self.search_entry.connect_query_changed(move |entry| {
obj.query(&entry.query());
});
self.player
.get()
@ -333,8 +333,11 @@ impl MusicusHomePage {
}
for recording in &results.recordings {
imp.recordings_flow_box
.append(&MusicusRecordingTile::new(recording));
imp.recordings_flow_box.append(&MusicusRecordingTile::new(
&self.navigation(),
&self.library(),
recording,
));
}
for album in &results.albums {

View file

@ -137,12 +137,36 @@ mod imp {
mpris.set_can_set_fullscreen(false);
let obj = self.obj();
mpris.connect_raise(clone!(@weak obj => move || obj.emit_by_name::<()>("raise", &[])));
mpris.connect_play(clone!(@weak obj => move || obj.play()));
mpris.connect_pause(clone!(@weak obj => move || obj.pause()));
mpris.connect_play_pause(clone!(@weak obj => move || obj.play_pause()));
mpris.connect_previous(clone!(@weak obj => move || obj.previous()));
mpris.connect_next(clone!(@weak obj => move || obj.next()));
mpris.connect_raise(clone!(
#[weak]
obj,
move || obj.emit_by_name::<()>("raise", &[])
));
mpris.connect_play(clone!(
#[weak]
obj,
move || obj.play()
));
mpris.connect_pause(clone!(
#[weak]
obj,
move || obj.pause()
));
mpris.connect_play_pause(clone!(
#[weak]
obj,
move || obj.play_pause()
));
mpris.connect_previous(clone!(
#[weak]
obj,
move || obj.previous()
));
mpris.connect_next(clone!(
#[weak]
obj,
move || obj.next()
));
self.mpris.set(mpris).expect("mpris should not be set");

View file

@ -70,8 +70,7 @@ mod imp {
.set_label(&format_time(current_time_ms));
self.remaining_time_label.set_label(&format_time(
player
.duration_ms().saturating_sub(current_time_ms),
player.duration_ms().saturating_sub(current_time_ms),
));
}
}
@ -121,24 +120,38 @@ mod imp {
.sync_create()
.build();
let obj = self.obj().clone();
let obj = self.obj();
player.connect_current_index_notify(
clone!(@weak obj => move |_| obj.imp().update_item()),
);
player.playlist().connect_items_changed(
clone!(@weak obj => move |_, _, _, _| obj.imp().update_item()),
);
player.connect_current_index_notify(clone!(
#[weak]
obj,
move |_| obj.imp().update_item()
));
player.playlist().connect_items_changed(clone!(
#[weak]
obj,
move |_, _, _, _| obj.imp().update_item()
));
player
.connect_position_ms_notify(clone!(@weak obj => move |_| obj.imp().update_time()));
player
.connect_duration_ms_notify(clone!(@weak obj => move |_| obj.imp().update_time()));
player.connect_position_ms_notify(clone!(
#[weak]
obj,
move |_| obj.imp().update_time()
));
player.connect_duration_ms_notify(clone!(
#[weak]
obj,
move |_| obj.imp().update_time()
));
let seeking_controller = gtk::EventControllerLegacy::new();
seeking_controller.connect_event(
clone!(@weak obj => @default-return glib::Propagation::Proceed, move |_, event| {
seeking_controller.connect_event(clone!(
#[weak]
obj,
#[upgrade_or]
glib::Propagation::Proceed,
move |_, event| {
if let Some(event) = event.downcast_ref::<gdk::ButtonEvent>() {
let imp = obj.imp();
if event.button() == gdk::BUTTON_PRIMARY {
@ -148,23 +161,27 @@ mod imp {
}
gdk::EventType::ButtonRelease => {
let player = obj.player();
player.seek_to((imp.slider.value() * player.duration_ms() as f64) as u64);
player.seek_to(
(imp.slider.value() * player.duration_ms() as f64) as u64,
);
imp.seeking.set(false);
}
_ => (),
}
}
}
glib::Propagation::Proceed
}),
);
}
));
self.slider.add_controller(seeking_controller);
self.slider
.connect_value_changed(clone!(@weak obj => move |_| obj.imp().update_time()));
self.slider.connect_value_changed(clone!(
#[weak]
obj,
move |_| obj.imp().update_time()
));
}
}

View file

@ -100,9 +100,11 @@ impl MusicusPlaylistPage {
}
pub fn scroll_to_current(&self) {
self.imp().playlist.scroll_to(self.player().current_index(), ListScrollFlags::NONE, None);
self.imp()
.playlist
.scroll_to(self.player().current_index(), ListScrollFlags::NONE, None);
}
#[template_callback]
fn select_item(&self, index: u32, _: &gtk::ListView) {
self.player().set_current_index(index);

View file

@ -88,7 +88,10 @@ impl Program {
.property("description", &*data.description.borrow())
.property("design", data.design.get())
.property("prefer-recently-added", data.prefer_recently_added.get())
.property("prefer-least-recently-played", data.prefer_least_recently_played.get())
.property(
"prefer-least-recently-played",
data.prefer_least_recently_played.get(),
)
.property("play-full-recordings", data.play_full_recordings.get())
.build();

View file

@ -70,9 +70,10 @@ mod imp {
gesture.set_state(gtk::EventSequenceState::Claimed);
});
controller.connect_released(clone!(@weak self as _self => move |_, _, _, _| {
_self.obj().reset();
}));
let obj = self.obj().to_owned();
controller.connect_released(move |_, _, _, _| {
obj.reset();
});
self.clear_icon.add_controller(controller);
}
@ -120,19 +121,29 @@ impl MusicusSearchEntry {
pub fn set_key_capture_widget(&self, widget: &impl IsA<gtk::Widget>) {
let controller = gtk::EventControllerKey::new();
controller.connect_key_pressed(clone!(@weak self as _self => @default-return glib::Propagation::Proceed, move |controller, _, _, _| {
match controller.forward(&_self.imp().text.get()) {
true => {
_self.grab_focus();
glib::Propagation::Stop
},
false => glib::Propagation::Proceed,
controller.connect_key_pressed(clone!(
#[weak(rename_to = this)]
self,
#[upgrade_or]
glib::Propagation::Proceed,
move |controller, _, _, _| {
match controller.forward(&this.imp().text.get()) {
true => {
this.grab_focus();
glib::Propagation::Stop
}
false => glib::Propagation::Proceed,
}
}
}));
));
controller.connect_key_released(clone!(@weak self as _self => move |controller, _, _, _| {
controller.forward(&_self.imp().text.get());
}));
controller.connect_key_released(clone!(
#[weak(rename_to = this)]
self,
move |controller, _, _, _| {
controller.forward(&this.imp().text.get());
}
));
widget.add_controller(controller);
}
@ -157,17 +168,21 @@ impl MusicusSearchEntry {
let tag = MusicusSearchTag::new(tag);
tag.connect_remove(clone!(@weak self as self_ => move |tag| {
let imp = self_.imp();
tag.connect_remove(clone!(
#[weak(rename_to = this)]
self,
move |tag| {
let imp = this.imp();
imp.tags_box.remove(tag);
imp.tags_box.remove(tag);
{
imp.tags.borrow_mut().retain(|t| t.tag() != tag.tag());
{
imp.tags.borrow_mut().retain(|t| t.tag() != tag.tag());
}
this.emit_by_name::<()>("query-changed", &[]);
}
self_.emit_by_name::<()>("query-changed", &[]);
}));
));
imp.tags_box.append(&tag);
imp.tags.borrow_mut().push(tag);
@ -208,7 +223,7 @@ impl MusicusSearchEntry {
#[template_callback]
fn backspace(&self, text: &gtk::Text) {
if text.cursor_position() == 0 {
if text.position() == 0 {
let changed = if let Some(tag) = self.imp().tags.borrow_mut().pop() {
self.imp().tags_box.remove(&tag);
true

View file

@ -67,21 +67,31 @@ mod imp {
self.stack.add_named(&playlist_page, Some("playlist"));
let stack = self.stack.get();
playlist_page.connect_close(clone!(@weak player_bar, @weak stack => move |_| {
stack.set_visible_child_name("navigation");
player_bar.playlist_hidden();
}));
playlist_page.connect_close(clone!(
#[weak]
player_bar,
#[weak]
stack,
move |_| {
stack.set_visible_child_name("navigation");
player_bar.playlist_hidden();
}
));
player_bar.connect_show_playlist(
clone!(@weak playlist_page, @weak stack => move |_, show| {
player_bar.connect_show_playlist(clone!(
#[weak]
playlist_page,
#[weak]
stack,
move |_, show| {
if show {
playlist_page.scroll_to_current();
stack.set_visible_child_name("playlist");
} else {
stack.set_visible_child_name("navigation");
};
}),
);
}
));
self.player
.bind_property("active", &self.player_bar_revealer.get(), "reveal-child")