···120 });
121122 self.row.add_controller(click);
123+124+ let self_weak = self.downgrade();
125+ let gesture = gtk::GestureClick::new();
126+ let is_dir = self.is_dir.get();
127+ gesture.connect_pressed(move |gestrure, n_press, _, _| {
128+ if n_press == 2 && !is_dir {
129+ if let Some(self_) = self_weak.upgrade() {
130+ let obj = self_.obj();
131+ obj.play(false);
132+ }
133+ }
134+ });
135 }
136 }
137
+3-3
gtk/src/ui/pages/artist_details.rs
···351 if let Some(main_stack) = self.imp().main_stack.borrow().as_ref() {
352 main_stack.set_visible_child_name("artist-tracks-page");
353354- let title = artist_name.clone();
355356 if let Some(library_page) = self.imp().library_page.borrow().as_ref() {
357- library_page.set_title(&title);
358 }
359 let state = self.imp().state.upgrade().unwrap();
360- state.push_navigation(&title, "artist-tracks-page");
361 let artist_tracks = self.imp().artist_tracks.borrow();
362 let artist_tracks_ref = artist_tracks.as_ref();
363 let artist_tracks_ref = artist_tracks_ref.unwrap();
···351 if let Some(main_stack) = self.imp().main_stack.borrow().as_ref() {
352 main_stack.set_visible_child_name("artist-tracks-page");
353354+ let title = artist_name;
355356 if let Some(library_page) = self.imp().library_page.borrow().as_ref() {
357+ library_page.set_title(title);
358 }
359 let state = self.imp().state.upgrade().unwrap();
360+ state.push_navigation(title, "artist-tracks-page");
361 let artist_tracks = self.imp().artist_tracks.borrow();
362 let artist_tracks_ref = artist_tracks.as_ref();
363 let artist_tracks_ref = artist_tracks_ref.unwrap();
+46-27
gtk/src/ui/pages/current_playlist.rs
···10use anyhow::Error;
11use glib::subclass;
12use gtk::glib;
13-use gtk::pango::EllipsizeMode;
14use gtk::{CompositeTemplate, Image, Label, ListBox, ScrolledWindow};
15use std::cell::{Cell, RefCell};
16use std::env;
···92 }
9394 self_.size.set(size + next_tracks.len());
95-96 for track in next_tracks {
97- let song = create_song_widget(Track {
98- title: track.title.clone(),
99- artist: track.artist.clone(),
100- album_art: track.album_art.clone(),
101- ..Default::default()
102- });
000103104 self_.next_tracks.append(&song);
0105 }
106 }
107 });
···159 obj.imp().now_playing.append(&label);
160161 if let Some(track) = state.current_track() {
162- let song = create_song_widget(track);
163 obj.imp().now_playing.append(&song);
164 }
165···171 true => 10,
172 false => next_tracks.len(),
173 };
0174 for track in next_tracks.into_iter().take(limit) {
175- let song = create_song_widget(Track {
176- title: track.title.clone(),
177- artist: track.artist.clone(),
178- album_art: track.album_art.clone(),
179- ..Default::default()
180- });
000181182 song.imp().album_art_container.set_visible(true);
183 obj.imp().next_tracks.append(&song);
0184 }
185 }
186 });
···218 match state.current_track() {
219 Some(track) => {
220 self.imp().track_title.set_text(&track.title);
221- self.imp().track_title.set_ellipsize(EllipsizeMode::End);
222- self.imp().track_title.set_max_width_chars(80);
0223 self.imp().track_artist.set_text(&track.artist);
224- self.imp().track_artist.set_ellipsize(EllipsizeMode::End);
225- self.imp().track_artist.set_max_width_chars(80);
0226 self.imp().track_index.set_text(&format!(
227 "{} of {}",
228 self.imp().current_index.get() + 1,
···270 let state = self.imp().state.upgrade().unwrap();
271272 if let Some(track) = state.current_track() {
273- let song = create_song_widget(track);
274 self.imp().now_playing.append(&song);
275 }
276···283 false => next_tracks.len(),
284 };
2850286 for track in next_tracks.into_iter().take(limit) {
287- let song = create_song_widget(Track {
288- title: track.title.clone(),
289- artist: track.artist.clone(),
290- album_art: track.album_art.clone(),
291- ..Default::default()
292- });
000293 self.imp().next_tracks.append(&song);
0294 }
295 }
296···315 }
316}
317318-fn create_song_widget(track: Track) -> Song {
319 let song = Song::new();
320 song.imp().track_number.set_visible(false);
321 song.imp().track_title.set_text(&track.title);
···327 song.imp().track_duration.set_visible(false);
328 song.imp().heart_button.set_visible(false);
329 song.imp().more_button.set_visible(false);
000330331 match track.album_art {
332 Some(filename) => {
···10use anyhow::Error;
11use glib::subclass;
12use gtk::glib;
13+use gtk::pango::{EllipsizeMode, WrapMode};
14use gtk::{CompositeTemplate, Image, Label, ListBox, ScrolledWindow};
15use std::cell::{Cell, RefCell};
16use std::env;
···92 }
9394 self_.size.set(size + next_tracks.len());
95+ let mut i = index + size;
96 for track in next_tracks {
97+ let song = create_song_widget(
98+ Track {
99+ title: track.title.clone(),
100+ artist: track.artist.clone(),
101+ album_art: track.album_art.clone(),
102+ ..Default::default()
103+ },
104+ i as i32,
105+ );
106107 self_.next_tracks.append(&song);
108+ i += 1;
109 }
110 }
111 });
···163 obj.imp().now_playing.append(&label);
164165 if let Some(track) = state.current_track() {
166+ let song = create_song_widget(track, playlist.index as i32);
167 obj.imp().now_playing.append(&song);
168 }
169···175 true => 10,
176 false => next_tracks.len(),
177 };
178+ let mut i = index;
179 for track in next_tracks.into_iter().take(limit) {
180+ let song = create_song_widget(
181+ Track {
182+ title: track.title.clone(),
183+ artist: track.artist.clone(),
184+ album_art: track.album_art.clone(),
185+ ..Default::default()
186+ },
187+ i as i32,
188+ );
189190 song.imp().album_art_container.set_visible(true);
191 obj.imp().next_tracks.append(&song);
192+ i += 1;
193 }
194 }
195 });
···227 match state.current_track() {
228 Some(track) => {
229 self.imp().track_title.set_text(&track.title);
230+ self.imp().track_title.set_wrap_mode(WrapMode::WordChar);
231+ self.imp().track_title.set_max_width_chars(20);
232+ self.imp().track_title.set_wrap(true);
233 self.imp().track_artist.set_text(&track.artist);
234+ self.imp().track_artist.set_wrap_mode(WrapMode::WordChar);
235+ self.imp().track_artist.set_max_width_chars(20);
236+ self.imp().track_artist.set_wrap(true);
237 self.imp().track_index.set_text(&format!(
238 "{} of {}",
239 self.imp().current_index.get() + 1,
···281 let state = self.imp().state.upgrade().unwrap();
282283 if let Some(track) = state.current_track() {
284+ let song = create_song_widget(track, index as i32 - 1);
285 self.imp().now_playing.append(&song);
286 }
287···294 false => next_tracks.len(),
295 };
296297+ let mut i = index;
298 for track in next_tracks.into_iter().take(limit) {
299+ let song = create_song_widget(
300+ Track {
301+ title: track.title.clone(),
302+ artist: track.artist.clone(),
303+ album_art: track.album_art.clone(),
304+ ..Default::default()
305+ },
306+ i as i32,
307+ );
308 self.imp().next_tracks.append(&song);
309+ i += 1;
310 }
311 }
312···331 }
332}
333334+fn create_song_widget(track: Track, index: i32) -> Song {
335 let song = Song::new();
336 song.imp().track_number.set_visible(false);
337 song.imp().track_title.set_text(&track.title);
···343 song.imp().track_duration.set_visible(false);
344 song.imp().heart_button.set_visible(false);
345 song.imp().more_button.set_visible(false);
346+ song.imp().index.set(index);
347+ song.imp().is_playlist.set(true);
348+ song.imp().track.replace(Some(track.clone().into()));
349350 match track.album_art {
351 Some(filename) => {