···120120 });
121121122122 self.row.add_controller(click);
123123+124124+ let self_weak = self.downgrade();
125125+ let gesture = gtk::GestureClick::new();
126126+ let is_dir = self.is_dir.get();
127127+ gesture.connect_pressed(move |gestrure, n_press, _, _| {
128128+ if n_press == 2 && !is_dir {
129129+ if let Some(self_) = self_weak.upgrade() {
130130+ let obj = self_.obj();
131131+ obj.play(false);
132132+ }
133133+ }
134134+ });
123135 }
124136 }
125137
+3-3
gtk/src/ui/pages/artist_details.rs
···351351 if let Some(main_stack) = self.imp().main_stack.borrow().as_ref() {
352352 main_stack.set_visible_child_name("artist-tracks-page");
353353354354- let title = artist_name.clone();
354354+ let title = artist_name;
355355356356 if let Some(library_page) = self.imp().library_page.borrow().as_ref() {
357357- library_page.set_title(&title);
357357+ library_page.set_title(title);
358358 }
359359 let state = self.imp().state.upgrade().unwrap();
360360- state.push_navigation(&title, "artist-tracks-page");
360360+ state.push_navigation(title, "artist-tracks-page");
361361 let artist_tracks = self.imp().artist_tracks.borrow();
362362 let artist_tracks_ref = artist_tracks.as_ref();
363363 let artist_tracks_ref = artist_tracks_ref.unwrap();
+46-27
gtk/src/ui/pages/current_playlist.rs
···1010use anyhow::Error;
1111use glib::subclass;
1212use gtk::glib;
1313-use gtk::pango::EllipsizeMode;
1313+use gtk::pango::{EllipsizeMode, WrapMode};
1414use gtk::{CompositeTemplate, Image, Label, ListBox, ScrolledWindow};
1515use std::cell::{Cell, RefCell};
1616use std::env;
···9292 }
93939494 self_.size.set(size + next_tracks.len());
9595-9595+ let mut i = index + size;
9696 for track in next_tracks {
9797- let song = create_song_widget(Track {
9898- title: track.title.clone(),
9999- artist: track.artist.clone(),
100100- album_art: track.album_art.clone(),
101101- ..Default::default()
102102- });
9797+ let song = create_song_widget(
9898+ Track {
9999+ title: track.title.clone(),
100100+ artist: track.artist.clone(),
101101+ album_art: track.album_art.clone(),
102102+ ..Default::default()
103103+ },
104104+ i as i32,
105105+ );
103106104107 self_.next_tracks.append(&song);
108108+ i += 1;
105109 }
106110 }
107111 });
···159163 obj.imp().now_playing.append(&label);
160164161165 if let Some(track) = state.current_track() {
162162- let song = create_song_widget(track);
166166+ let song = create_song_widget(track, playlist.index as i32);
163167 obj.imp().now_playing.append(&song);
164168 }
165169···171175 true => 10,
172176 false => next_tracks.len(),
173177 };
178178+ let mut i = index;
174179 for track in next_tracks.into_iter().take(limit) {
175175- let song = create_song_widget(Track {
176176- title: track.title.clone(),
177177- artist: track.artist.clone(),
178178- album_art: track.album_art.clone(),
179179- ..Default::default()
180180- });
180180+ let song = create_song_widget(
181181+ Track {
182182+ title: track.title.clone(),
183183+ artist: track.artist.clone(),
184184+ album_art: track.album_art.clone(),
185185+ ..Default::default()
186186+ },
187187+ i as i32,
188188+ );
181189182190 song.imp().album_art_container.set_visible(true);
183191 obj.imp().next_tracks.append(&song);
192192+ i += 1;
184193 }
185194 }
186195 });
···218227 match state.current_track() {
219228 Some(track) => {
220229 self.imp().track_title.set_text(&track.title);
221221- self.imp().track_title.set_ellipsize(EllipsizeMode::End);
222222- self.imp().track_title.set_max_width_chars(80);
230230+ self.imp().track_title.set_wrap_mode(WrapMode::WordChar);
231231+ self.imp().track_title.set_max_width_chars(20);
232232+ self.imp().track_title.set_wrap(true);
223233 self.imp().track_artist.set_text(&track.artist);
224224- self.imp().track_artist.set_ellipsize(EllipsizeMode::End);
225225- self.imp().track_artist.set_max_width_chars(80);
234234+ self.imp().track_artist.set_wrap_mode(WrapMode::WordChar);
235235+ self.imp().track_artist.set_max_width_chars(20);
236236+ self.imp().track_artist.set_wrap(true);
226237 self.imp().track_index.set_text(&format!(
227238 "{} of {}",
228239 self.imp().current_index.get() + 1,
···270281 let state = self.imp().state.upgrade().unwrap();
271282272283 if let Some(track) = state.current_track() {
273273- let song = create_song_widget(track);
284284+ let song = create_song_widget(track, index as i32 - 1);
274285 self.imp().now_playing.append(&song);
275286 }
276287···283294 false => next_tracks.len(),
284295 };
285296297297+ let mut i = index;
286298 for track in next_tracks.into_iter().take(limit) {
287287- let song = create_song_widget(Track {
288288- title: track.title.clone(),
289289- artist: track.artist.clone(),
290290- album_art: track.album_art.clone(),
291291- ..Default::default()
292292- });
299299+ let song = create_song_widget(
300300+ Track {
301301+ title: track.title.clone(),
302302+ artist: track.artist.clone(),
303303+ album_art: track.album_art.clone(),
304304+ ..Default::default()
305305+ },
306306+ i as i32,
307307+ );
293308 self.imp().next_tracks.append(&song);
309309+ i += 1;
294310 }
295311 }
296312···315331 }
316332}
317333318318-fn create_song_widget(track: Track) -> Song {
334334+fn create_song_widget(track: Track, index: i32) -> Song {
319335 let song = Song::new();
320336 song.imp().track_number.set_visible(false);
321337 song.imp().track_title.set_text(&track.title);
···327343 song.imp().track_duration.set_visible(false);
328344 song.imp().heart_button.set_visible(false);
329345 song.imp().more_button.set_visible(false);
346346+ song.imp().index.set(index);
347347+ song.imp().is_playlist.set(true);
348348+ song.imp().track.replace(Some(track.clone().into()));
330349331350 match track.album_art {
332351 Some(filename) => {