client: support editing multiple tags at once

This commit is contained in:
Andrew Kelley 2014-04-13 16:12:52 -07:00
parent cc8f0abea4
commit 2b3aff220f
2 changed files with 140 additions and 38 deletions

View file

@ -1552,9 +1552,6 @@ function setUpGenericUi(){
selection.type = null;
refreshSelection();
});
$editTagsDialog.find("input").on("keydown", function(event) {
event.stopPropagation();
});
$document.on('keydown', function(event){
var handler = keyboardHandlers[event.which];
if (handler == null) return true;
@ -1693,44 +1690,121 @@ function onDeleteContextMenu() {
handleDeletePressed(true);
return false;
}
var editTagsTrackKeys = null;
function onEditTagsContextMenu() {
if (!permissions.admin) return false;
removeContextMenu();
showEditTags(selection.toTrackKeys());
editTagsTrackKeys = selection.toTrackKeys();
showEditTags();
return false;
}
function showEditTags(trackKeys) {
var EDITABLE_PROPS = {
name: 'string',
artistName: 'string',
albumArtistName: 'string',
albumName: 'string',
compilation: 'boolean',
track: 'integer',
trackCount: 'integer',
disc: 'integer',
discCount: 'integer',
year: 'integer',
genre: 'string',
composerName: 'string',
performerName: 'string',
};
var EDIT_TAG_TYPES = {
'string': {
get: function(domItem) {
return domItem.value;
},
set: function(domItem, value) {
domItem.value = value || "";
},
},
'integer': {
get: function(domItem) {
var n = parseInt(domItem.value, 10);
if (isNaN(n)) return null;
return n;
},
set: function(domItem, value) {
domItem.value = value == null ? "" : value;
},
},
'boolean': {
get: function(domItem) {
return domItem.checked;
},
set: function(domItem, value) {
domItem.checked = !!value;
},
},
};
function showEditTags() {
$editTagsDialog.dialog({
modal: true,
title: "Edit Tags",
minWidth: 800,
height: $document.height() - 40,
close: function() {
$editTagsDialog.remove();
});
for (var propName in EDITABLE_PROPS) {
var type = EDITABLE_PROPS[propName];
var setter = EDIT_TAG_TYPES[type].set;
var domItem = document.getElementById('edit-tag-' + propName);
var multiCheckBoxDom = document.getElementById('edit-tag-multi-' + propName);
var commonValue = null;
var consistent = true;
for (var i = 0; i < editTagsTrackKeys.length; i += 1) {
var key = editTagsTrackKeys[i];
var track = player.library.trackTable[key];
var value = track[propName];
if (propName === 'genre') {
console.log("genre", JSON.stringify(value));
}
if (commonValue == null) {
commonValue = value;
} else if (commonValue !== value) {
consistent = false;
break;
}
}
multiCheckBoxDom.checked = consistent;
setter(domItem, consistent ? commonValue : null);
}
}
function setUpEditTagsUi() {
$editTagsDialog.find("input").on("keydown", function(event) {
event.stopPropagation();
if (event.which === 27) {
$editTagsDialog.dialog('close');
} else if (event.which === 13) {
onTagsOk();
}
});
var track = player.library.trackTable[trackKeys[0]];
EDITABLE_PROPS.forEach(function(prop) {
$("#edit-tag-" + prop).val(track[prop]);
});
$("#edit-tags-ok").on('click', function() {
$("#edit-tags-ok").on('click', onTagsOk);
function onTagsOk() {
var cmd = {};
var props = cmd[track.key] = {};
EDITABLE_PROPS.forEach(function(prop) {
props[prop] = $("#edit-tag-" + prop).val();
});
for (var i = 0; i < editTagsTrackKeys.length; i += 1) {
var key = editTagsTrackKeys[i];
var track = player.library.trackTable[key];
var props = cmd[track.key] = {};
for (var propName in EDITABLE_PROPS) {
var type = EDITABLE_PROPS[propName];
var getter = EDIT_TAG_TYPES[type].get;
var domItem = document.getElementById('edit-tag-' + propName);
var multiCheckBoxDom = document.getElementById('edit-tag-multi-' + propName);
if (multiCheckBoxDom.checked) {
props[propName] = getter(domItem);
}
}
}
player.sendCommand('updateTags', cmd);
$editTagsDialog.remove();
});
$editTagsDialog.dialog('close');
}
}
var EDITABLE_PROPS = [
'name', 'artistName', 'albumArtistName',
'albumName', 'compilation', 'track', 'trackCount',
'disc', 'discCount', 'year', 'genre',
'composerName', 'performerName'
];
function updateSliderUi(value){
var percent = value * 100;
@ -2262,6 +2336,7 @@ function setUpUi(){
setUpTabsUi();
setUpUploadUi();
setUpSettingsUi();
setUpEditTagsUi();
}
function toAlbumId(s) {

View file

@ -290,21 +290,48 @@
</dl>
</div>
<div id="edit-tags" style="display: none">
<label>Title: <input id="edit-tag-name" style="width: 300px"></label><br>
<label>Track Number: <input id="edit-tag-track" style="width: 30px"></label><br>
<input type="checkbox" id="edit-tag-multi-name">
<label>Title: <input id="edit-tag-name"></label><br>
<input type="checkbox" id="edit-tag-multi-track">
<label>Track Number: <input id="edit-tag-track"></label><br>
<hr>
<label>Artist: <input id="edit-tag-artistName" style="width: 300px"></label><br>
<label>Composer: <input id="edit-tag-composerName" style="width: 300px"></label><br>
<label>Performer: <input id="edit-tag-performerName" style="width: 300px"></label><br>
<label>Genre: <input id="edit-tag-genre" style="width: 300px"></label><br>
<input type="checkbox" id="edit-tag-multi-artistName">
<label>Artist: <input id="edit-tag-artistName"></label><br>
<input type="checkbox" id="edit-tag-multi-composerName">
<label>Composer: <input id="edit-tag-composerName"></label><br>
<input type="checkbox" id="edit-tag-multi-performerName">
<label>Performer: <input id="edit-tag-performerName"></label><br>
<input type="checkbox" id="edit-tag-multi-genre">
<label>Genre: <input id="edit-tag-genre"></label><br>
<hr>
<label>Album: <input id="edit-tag-albumName" style="width: 400px"></label><br>
<label>Album Artist: <input id="edit-tag-albumArtistName" style="width: 300px"></label><br>
<label>Track Count: <input id="edit-tag-trackCount" style="width: 30px"></label><br>
<label>Year: <input id="edit-tag-year" style="width: 60px"></label><br>
<label>Disc Number: <input id="edit-tag-year" style="width: 30px"></label><br>
<label>Disc Count: <input id="edit-tag-year" style="width: 30px"></label><br>
<input type="checkbox" id="edit-tag-multi-albumName">
<label>Album: <input id="edit-tag-albumName"></label><br>
<input type="checkbox" id="edit-tag-multi-albumArtistName">
<label>Album Artist: <input id="edit-tag-albumArtistName"></label><br>
<input type="checkbox" id="edit-tag-multi-trackCount">
<label>Track Count: <input id="edit-tag-trackCount"</label><br>
<input type="checkbox" id="edit-tag-multi-year">
<label>Year: <input id="edit-tag-year"</label><br>
<input type="checkbox" id="edit-tag-multi-disc">
<label>Disc Number: <input id="edit-tag-disc"</label><br>
<input type="checkbox" id="edit-tag-multi-discCount">
<label>Disc Count: <input id="edit-tag-discCount"</label><br>
<input type="checkbox" id="edit-tag-multi-compilation">
<label>Compilation: <input type="checkbox" id="edit-tag-compilation"></label><br>
<hr>
<input id="edit-tags-ok" type="button" value="OK">
</div>
<ul id="menu-playlist" style="display: none">