diff --git a/xulmus/content/player.js b/xulmus/content/player.js index f5de4cef..767eda41 100644 --- a/xulmus/content/player.js +++ b/xulmus/content/player.js @@ -392,28 +392,42 @@ const Player = Module("player", { mediaItem.setProperty(SBProperties.rating, rating); }, - // TODO: add all fields, and ascending arg + // TODO: add more fields, and generate the list dynamically. PT should the + // available fields reflect only the visible view fields or offer others? --djk /** - * Sorts the current media view by field. + * Sorts the current media view by field in the order specified by + * ascending. * * @param {string} field The sort field. + * @param {boolean} ascending If true sort in ascending order, otherwise in + * descending order. */ - sortBy: function sortBy(property) { + sortBy: function sortBy(field, ascending) { + let order = ascending ? "a" : "d"; let properties = services.create("mutablePropertyArray"); + properties.strict = false; - switch (property.string) { - case "#": - case "Title": - properties.appendProperty(SBProperties.trackName, "a"); + switch (field) { + case "title": + properties.appendProperty(SBProperties.trackName, order); break; - case "Rating": - properties.appendProperty(SBProperties.rating, 1); + case "time": + properties.appendProperty(SBProperties.duration, order); break; - case "Album": - properties.appendProperty(SBProperties.albumName, "a"); + case "artist": + properties.appendProperty(SBProperties.artistName, order); + break; + case "album": + properties.appendProperty(SBProperties.albumName, order); + break; + case "genre": + properties.appendProperty(SBProperties.genre, order); + break; + case "rating": + properties.appendProperty(SBProperties.rating, order); break; default: - properties.appendProperty(SBProperties.trackName, "a"); + properties.appendProperty(SBProperties.trackName, order); break; } @@ -427,7 +441,6 @@ const Player = Module("player", { commandline.registerCallback("cancel", modes.SEARCH_VIEW_FORWARD, this.closure.onSearchCancel); }, commands: function () { - // TODO: clear up filter/Filter confusion commands.add(["f[ilter]"], "Filter tracks based on keywords {genre/artist/album/track}", function (args) { @@ -560,10 +573,19 @@ const Player = Module("player", { literal: 0 }); - // TODO: Add a completer and order option commands.add(["sort[view]"], "Sort the current media view", - function (args) { player.sortBy(args, true); }); + function (args) { + let order = args["-order"] || "up"; + player.sortBy(args[0], order == "up"); + }, + { + argCount: "1", + completer: function (context) completion.mediaListSort(context), + options: [[["-order", "-o"], commands.OPTION_STRING, + function (arg) /^(up|down)$/.test(arg), + function () [["up", "Sort in ascending order"], ["down", "Sort in descending order"]]]] + }); // FIXME: use :add -q like cmus? (not very vim-like are it's multi-option commands) --djk commands.add(["qu[eue]"], @@ -645,6 +667,13 @@ const Player = Module("player", { context.keys = { text: "contentTitle", description: "contentUrl" }; context.completions = player.getMediaPages(); }; + + completion.mediaListSort = function mediaListSort(context) { + context.title = ["Media List Sort Field", "Description"]; + context.anchored = false; + context.completions = [["title", "Track name"], ["time", "Duration"], ["artist", "Artist name"], + ["album", "Album name"], ["genre", "Genre"], ["rating", "Rating"]]; // FIXME: generate this list dynamically - see #sortBy + }; }, mappings: function () { mappings.add([modes.PLAYER],