import React, { PropTypes } from 'react' import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import Track from './Track' import * as mopidyActions from '../services/mopidy/actions' import * as uiActions from '../services/ui/actions' class TrackList extends React.Component{ constructor(props) { super(props); this.state = { tracks: this.props.tracks, lastSelectedTrack: false } this.handleKeyUp = this.handleKeyUp.bind(this) } componentWillMount(){ window.addEventListener("keyup", this.handleKeyUp, false); } componentWillUnmount(){ window.removeEventListener("keyup", this.handleKeyUp, false); } handleKeyUp(e){ if( this.selectedTracks().length <= 0 ) return; switch(e.keyCode){ case 13: // enter this.playTracks(); break; case 46: // delete this.removeTracks(); break; } } componentWillReceiveProps( nextProps ){ this.setState({ tracks: nextProps.tracks }); } handleClick( e, index ){ if( this.props.context_menu.show ) this.props.uiActions.hideContextMenu(); var tracks = this.state.tracks; if( e.ctrlKey ){ tracks[index].selected = !tracks[index].selected; }else if( e.shiftKey ){ if( this.state.lastSelectedTrack < index ){ var start = this.state.lastSelectedTrack; var end = index; }else{ var start = index; var end = this.state.lastSelectedTrack; } for( var i = start; i <= end; i++ ){ tracks[i].selected = true; } }else{ for( var i = 0; i < tracks.length; i++ ){ tracks[i].selected = false; } tracks[index].selected = !tracks[index].selected; } this.setState({ tracks: tracks, lastSelectedTrack: index }); } handleDoubleClick(e, index){ if( this.props.context_menu.show ) this.props.uiActions.hideContextMenu(); this.playTracks() } handleDragStart(e, index){ this.props.uiActions.dragStart( e, 'tltracks', this.selectedTracks() ) } handleContextMenu(e, index){ var selected_tracks = this.selectedTracks() var data = { selected_tracks: selected_tracks, selected_tracks_indexes: this.tracksIndexes( selected_tracks ) } this.props.uiActions.showContextMenu( e, this.props.context, data ) } selectedTracks(){ function isSelected( track ){ return ( typeof(track.selected) !== 'undefined' && track.selected ); } return this.state.tracks.filter(isSelected) } tracksIndexes(tracks){ var indexes = [] for( var i = 0; i < tracks.length; i++ ){ indexes.push( this.props.tracks.indexOf(tracks[i])) } return indexes } playTracks(){ var tracks = this.selectedTracks(); // if we've got a specific action, run it if( typeof(this.props.playTracks) !== 'undefined' ){ return this.props.playTracks( tracks ); } // default to playing a bunch of uris var uris = []; for( var i = 0; i < tracks.length; i++ ){ uris.push( tracks[i].uri ) } return this.props.mopidyActions.playTracks( uris ) } removeTracks(){ // if this tracklist handles removal, handle it if( typeof(this.props.removeTracks) !== 'undefined' ){ var tracks = this.selectedTracks(); var tracks_indexes = this.tracksIndexes(tracks); return this.props.removeTracks( tracks_indexes ); } // by default, do nothing } render(){ if( !this.state.tracks ) return null let self = this; return (