Jamstash/app/common/main-controller.js
Hyzual 8b3a12f052 Moves drag & drop support from main-controller.js to queue.js
Adds a indexOfSong method to player-service. It is used in play, nextTrack and previousTrack so the player can adapt to changes to the queue order. Previously it wasn't taken into account and when we changed the order of the queue (through drag & drop or shuffle), the next song wasn't what we expected it to be.
2015-01-17 19:15:10 +01:00

410 lines
15 KiB
JavaScript

angular.module('JamStash')
.controller('AppController', ['$scope', '$rootScope', '$document', '$window', '$location', '$cookieStore', '$http', 'utils', 'globals', 'model', 'notifications', 'player', 'persistence', 'Page',
function($scope, $rootScope, $document, $window, $location, $cookieStore, $http, utils, globals, model, notifications, player, persistence, Page) {
'use strict';
$rootScope.settings = globals.settings;
$rootScope.song = [];
$rootScope.playingSong = null;
$rootScope.MusicFolders = [];
$rootScope.Genres = [];
$rootScope.Messages = [];
$rootScope.SelectedMusicFolder = "";
$rootScope.unity = null;
$scope.Page = Page;
$rootScope.loggedIn = function () {
if (globals.settings.Server !== '' && globals.settings.Username !== '' && globals.settings.Password !== '') {
return true;
} else {
return false;
}
};
$rootScope.totalDisplayed = 50;
$rootScope.loadMore = function () {
$scope.totalDisplayed += 50;
};
$rootScope.go = function (path) {
$location.path(path);
};
// Reads cookies and sets globals.settings values
$scope.loadSettings = function () {
// Temporary Code to Convert Cookies added 2/2/2014
if ($cookieStore.get('Settings')) {
utils.setValue('Settings', $cookieStore.get('Settings'), false);
$cookieStore.remove('Settings');
}
if (utils.getValue('Settings')) {
$.each(utils.getValue('Settings'), function (k, v) {
if (v == 'false') { v = false; }
if (v == 'true') { v = true; }
var exclude = ['Url'];
var idx = exclude.indexOf(k);
if (idx === -1) {
globals.settings[k] = v;
}
});
}
if (utils.getValue("SavedCollections")) { globals.SavedCollections = utils.getValue("SavedCollections").split(","); }
if (utils.getValue("DefaultCollection")) { globals.DefaultCollection = utils.getValue("DefaultCollection"); }
if (utils.getValue("SavedGenres")) { globals.SavedGenres = utils.getValue("SavedGenres").split(","); }
if (globals.settings.Debug) { console.log('Loaded Settings: ' + JSON.stringify(globals.settings, null, 2)); }
};
$scope.toggleSetting = function (setting) {
var id = setting;
if (globals.settings[id]) {
globals.settings[id] = false;
} else {
globals.settings[id] = true;
}
notifications.updateMessage(setting + ' : ' + globals.settings[id], true);
};
$.ajaxSetup({
'beforeSend': function () {
$("#loading").show();
},
'complete': function () {
$("#loading").hide();
}
});
var submenu_active = false;
$('div.submenu').mouseenter(function () {
submenu_active = true;
});
$('div.submenu').mouseleave(function () {
submenu_active = false;
$('div.submenu').hide();
//setTimeout(function () { if (submenu_active == false) $('div.submenu').stop().fadeOut(); }, 400);
});
$scope.toggleSubmenu = function (menu, pl, pos, margin) {
var submenu = $(menu);
if (submenu.css('display') !== 'none') {
submenu.fadeOut();
} else {
var el = $(pl);
var off = el.offset();
var width = el.width();
var height = el.height();
switch (pos) {
case 'right':
//show the menu to the right of placeholder
submenu.css({ "left": (off.left + margin) + "px", "top": (off.top) + "px" }).fadeIn(400);
break;
case 'left':
//show the menu to the right of placeholder
submenu.css({ "left": (off.left - margin) + "px", "top": (off.top) + "px" }).fadeIn(400);
break;
}
setTimeout(function () { if (submenu_active === false) $('div.submenu').stop().fadeOut(); }, 10000);
}
};
$scope.$watchCollection(function () {
return player.queue;
}, function(newQueue) {
if (newQueue !== undefined && newQueue.length > 0 && globals.settings.ShowQueue) {
$scope.showQueue();
}
});
$rootScope.showQueue = function () {
$('#SideBar').css('display', 'block');
$('#right-component').removeClass('lgcolumn_expanded');
};
$rootScope.hideQueue = function () {
$('#SideBar').css('display', 'none');
$('#right-component').addClass('lgcolumn_expanded');
};
$scope.toggleQueue = function () {
if ($('#SideBar').css('display') === 'none') {
$rootScope.showQueue();
} else {
$rootScope.hideQueue();
}
};
$rootScope.showArtists = function () {
$('#left-component').css('display', '');
$('#right-component').removeClass('lgcolumn_expandedleft');
};
$rootScope.hideArtists = function () {
$('#left-component').css('display', 'none');
$('#right-component').addClass('lgcolumn_expandedleft');
};
$scope.toggleArtists = function () {
if ($('#left-component').css('display') == 'none') {
$rootScope.showArtists();
} else {
$rootScope.hideArtists();
}
};
$scope.fancyboxOpenImage = function (url) {
$.fancybox.open({
helpers : {
overlay : {
css : {
'background' : 'rgba(0, 0, 0, 0.15)'
}
}
},
hideOnContentClick: true,
type: 'image',
openEffect: 'none',
closeEffect: 'none',
href: url
});
};
$(document).on("click", ".message", function(){
$(this).remove();
});
// Global Functions
window.onbeforeunload = function () {
if (!globals.settings.Debug) {
if (player.queue.length > 0) {
return "You're about to end your session, are you sure?";
}
}
};
$rootScope.showIndex = false;
$(document).on( 'click', 'message', function() {
$(this).fadeOut(function () { $(this).remove(); });
return false;
})
$document.keydown(function (e) {
$scope.scrollToIndex(e);
});
$scope.scrollToIndex = function (e) {
var source = e.target.id;
if (e.target.tagName.toUpperCase() != 'INPUT') {
var unicode = e.charCode ? e.charCode : e.keyCode;
if (globals.settings.Debug) { console.log('Keycode Triggered: ' + unicode); }
if (unicode == 49) { // 1
$('#action_Queue').click();
} else if (unicode == 50) {
$('#action_Library').click();
} else if (unicode == 51) {
$('#action_Archive').click();
} else if (unicode == 52) {
$('#action_Settings').click();
} else if (unicode == 53) {
} else if (unicode == 54) { // 6
}
if (unicode >= 65 && unicode <= 90 && $('#tabLibrary').is(':visible')) { // a-z
var key = utils.findKeyForCode(unicode);
if (key == 'x' || key == 'y' || key == 'z') {
key = 'x-z';
}
var el = '#' + key.toUpperCase();
if ($(el).length > 0) {
$('#left-component').stop().scrollTo(el, 400);
}
} else if (unicode == 39 || unicode == 176) { // right arrow
player.nextTrack();
} else if (unicode == 37 || unicode == 177) { // back arrow
player.previousTrack();
} else if (unicode == 32 || unicode == 179 || unicode.toString() == '0179') { // spacebar
player.playPauseSong();
return false;
} else if (unicode == 36 && $('#tabLibrary').is(':visible')) { // home
$('#left-component').stop().scrollTo('#MusicFolders', 400);
}
if (unicode == 189) { // dash - volume down
var volume = utils.getValue('Volume') ? parseFloat(utils.getValue('Volume')) : 1;
if (volume <= 1 && volume > 0 && source === '') {
volume += -0.1;
$(globals.Player1).jPlayer({
volume: volume
});
utils.setValue('Volume', volume, true);
if (globals.settings.Debug) { console.log('Volume: ' + Math.round(volume * 100) + '%'); }
}
}
if (unicode == 187) { // equals - volume up
var volume = utils.getValue('Volume') ? parseFloat(utils.getValue('Volume')) : 1;
if (volume < 1 && volume >= 0 && source ==- '') {
volume += 0.1;
$(globals.Player1).jPlayer({
volume: volume
});
utils.setValue('Volume', volume, true);
if (globals.settings.Debug) { console.log('Volume: ' + Math.round(volume * 100) + '%'); }
}
}
}
return true;
};
$scope.scrollToIndexName = function (index) {
var el = '#' + index;
if ($(el).length > 0) {
$('#left-component').stop().scrollTo(el, 400);
}
};
$scope.scrollToTop = function () {
$('#left-component').stop().scrollTo('#MusicFolders', 400);
};
$rootScope.selectAll = function (songs) {
angular.forEach(songs, function (item, key) {
$scope.selectedSongs.push(item);
item.selected = true;
});
};
$rootScope.selectNone = function (songs) {
angular.forEach(songs, function (item, key) {
$scope.selectedSongs = [];
item.selected = false;
});
};
$rootScope.playAll = function (songs) {
// TODO: Hyz: Replace
player.queue = [];
$rootScope.selectAll(songs);
$rootScope.addSongsToQueue();
var next = player.queue[0];
player.play(next);
};
$rootScope.playFrom = function (index, songs) {
// TODO: Hyz: Replace
var from = songs.slice(index,songs.length);
$scope.selectedSongs = [];
angular.forEach(from, function (item, key) {
$scope.selectedSongs.push(item);
item.selected = true;
});
if ($scope.selectedSongs.length > 0) {
player.queue = [];
$rootScope.addSongsToQueue();
var next = player.queue[0];
player.play(next);
}
};
$rootScope.addSongsToQueue = function () {
// TODO: Hyz: Replace
if ($scope.selectedSongs.length !== 0) {
angular.forEach($scope.selectedSongs, function (item, key) {
player.queue.push(item);
item.selected = false;
});
notifications.updateMessage($scope.selectedSongs.length + ' Song(s) Added to Queue', true);
$scope.selectedSongs.length = 0;
}
};
$rootScope.removeSong = function (item, songs) {
// TODO: Hyz: Replace
var index = songs.indexOf(item);
songs.splice(index, 1);
};
$scope.isActive = function (route) {
return route === $location.path();
};
$rootScope.reloadRoute = function (reload) {
utils.reloadRoute(reload);
};
$rootScope.getSplitPosition = function (scope, elm) {
window.alert(elm.getBoundingClientRect().left);
};
$scope.download = function (id) {
$.ajax({
url: globals.BaseURL() + '/getUser.view?' + globals.BaseParams() + '&username=' + globals.settings.Username,
method: 'GET',
dataType: globals.settings.Protocol,
timeout: globals.settings.Timeout,
success: function (data) {
if (typeof data["subsonic-response"].error != 'undefined') {
notifications.updateMessage('Error: ' + data["subsonic-response"].error.message, true);
} else {
if (data["subsonic-response"].user.downloadRole === true) {
$window.location.href = globals.BaseURL() + '/download.view?' + globals.BaseParams() + '&id=' + id;
} else {
notifications.updateMessage('You do not have permission to Download', true);
}
}
}
});
};
$scope.selectedSongs = [];
$scope.selectSong = function (data) {
var i = $scope.selectedSongs.indexOf(data);
if (i >= 0) {
$scope.selectedSongs.splice(i, 1);
data.selected = false;
} else {
$scope.selectedSongs.push(data);
data.selected = true;
}
};
$rootScope.addToJukebox = function (id) {
if (globals.settings.Debug) { console.log("LOAD JUKEBOX"); }
$.ajax({
url: globals.BaseURL() + '/jukeboxControl.view?' + globals.BaseParams() + '&action=set&id=' + id,
method: 'GET',
dataType: globals.settings.Protocol,
timeout: globals.settings.Timeout,
success: function (data) {
/*
if (data["subsonic-response"].podcasts.channel !== undefined) {
}
deferred.resolve(podcasts);
*/
$.get(globals.BaseURL() + '/jukeboxControl.view?' + globals.BaseParams() + '&action=start');
}
});
};
$rootScope.sendToJukebox = function (action) {
if (globals.settings.Debug) { console.log("SEND JUKEBOX " + action); }
$.ajax({
url: globals.BaseURL() + '/jukeboxControl.view?' + globals.BaseParams() + '&action=' + action,
method: 'GET',
dataType: globals.settings.Protocol,
timeout: globals.settings.Timeout,
success: function (data) {
}
});
};
$scope.updateFavorite = function (item) {
var id = item.id;
var starred = item.starred;
var url;
if (starred) {
url = globals.BaseURL() + '/unstar.view?' + globals.BaseParams() + '&id=' + id;
item.starred = undefined;
} else {
url = globals.BaseURL() + '/star.view?' + globals.BaseParams() + '&id=' + id;
item.starred = true;
}
$.ajax({
url: url,
method: 'GET',
dataType: globals.settings.Protocol,
timeout: globals.settings.Timeout,
success: function () {
notifications.updateMessage('Favorite Updated!', true);
}
});
};
$scope.toTrusted = function (html) {
return $sce.trustAsHtml(html);
};
/* Launch on Startup */
$scope.loadSettings();
utils.switchTheme(globals.settings.Theme);
if(!globals.settings.ShowQueue) {
$rootScope.hideQueue();
}
if ($scope.loggedIn()) {
//$scope.ping();
if (globals.settings.SaveTrackPosition) {
persistence.loadQueue();
persistence.loadTrackPosition();
}
}
/* End Startup */
}]);