From 8a8e277201627d905241572541e4c383fd8ff8d4 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Thu, 12 Dec 2013 18:19:40 +0000 Subject: [PATCH] Refactor library code. --- assets/css/includes/button.css.sass | 2 ++ assets/css/library.css.sass | 23 +++++++++++++ assets/js/controls/library.js | 51 +++++++++++++++++++++++++++-- lib/mpd_client/song.rb | 2 +- public/views/library.ejs | 7 ++-- public/views/library/albums.ejs | 12 +++++++ public/views/library/artists.ejs | 11 +++++++ public/views/library/root.ejs | 8 +++-- public/views/library/songs.ejs | 7 ++++ 9 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 public/views/library/albums.ejs create mode 100644 public/views/library/artists.ejs create mode 100644 public/views/library/songs.ejs diff --git a/assets/css/includes/button.css.sass b/assets/css/includes/button.css.sass index 009939a..25e2915 100644 --- a/assets/css/includes/button.css.sass +++ b/assets/css/includes/button.css.sass @@ -3,3 +3,5 @@ background: none color: $highlight font-size: 0.8em + text-decoration: none + padding: 5px diff --git a/assets/css/library.css.sass b/assets/css/library.css.sass index f6174c1..a01ba9b 100644 --- a/assets/css/library.css.sass +++ b/assets/css/library.css.sass @@ -16,3 +16,26 @@ right: 10px top: 8px @include button + .browser + position: absolute + height: 100% + @include transition(left 0.25s ease-in-out) + &[data-pane="2"] + left: -$interface-width + &[data-pane="3"] + left: -$interface-width * 2 + &[data-pane="4"] + left: -$interface-width * 3 + ul, ol + position: absolute + width: $interface-width + @extend .list + height: 100% + &:first-child + left: 0 + &:nth-child(2) + left: $interface-width + &:nth-child(3) + left: $interface-width * 2 + &:nth-child(4) + left: $interface-width * 3 diff --git a/assets/js/controls/library.js b/assets/js/controls/library.js index 0067d52..9f5fb7f 100644 --- a/assets/js/controls/library.js +++ b/assets/js/controls/library.js @@ -1,10 +1,13 @@ var Library = can.Control.extend({ init: function(element, options) { - this.element = element + this.element = element; + this.browser = new can.Model({ pane: 1 }); element.html( - can.view('views/library.ejs') + can.view('views/library.ejs', { browser: this.browser }) ); + var rootControl = new Pane('#library .root', { show: 'root' }) + this.panes = new can.List([rootControl]); }, show: function() { @@ -15,13 +18,55 @@ var Library = can.Control.extend({ $(this.element).removeClass('show'); }, + nextPane: function() { + this.browser.attr('pane', this.browser.attr('pane') + 1); + }, + + previousPane: function() { + this.browser.attr('pane', this.browser.attr('pane') - 1); + }, + 'a.close click': 'hide', ':page route': function(data) { - console.log(data); if (data.page == 'library') { this.show(); } } }); + +var Pane = can.Control.extend({ + + init: function(element, data, pane) { + this.element = element; + this.data = data; + this.renderPane[data.show].call(this, data); + }, + + renderPane: { + root: function() { + this.element.html( + can.view('views/library/root.ejs', {}) + ); + }, + artists: function(data) { + Artist.findAll({}, renderCallback('artists')); + }, + albums: function(data) { + Album.findAll({ artist: data.artist }, renderCallback('albums')); + }, + songs: function(data) { + Song.findAll({ artist: data.artist, album: data.album }, renderCallback('songs')); + } + }, + + renderCallback: function(type) { + return function(items) { + $(this.element).html( + can.view('views/library/' + type + '.ejs', { items: items }) + ); + }.bind(this) + } + +}); diff --git a/lib/mpd_client/song.rb b/lib/mpd_client/song.rb index d50c8df..8af0ed2 100644 --- a/lib/mpd_client/song.rb +++ b/lib/mpd_client/song.rb @@ -24,7 +24,7 @@ module MPDClient end def <=>(other) - [artist, album, title] <=> [other.artist, other.album, other.title] + [artist, album, track] <=> [other.artist, other.album, other.track] end def to_h diff --git a/public/views/library.ejs b/public/views/library.ejs index daa04ed..9770005 100644 --- a/public/views/library.ejs +++ b/public/views/library.ejs @@ -2,6 +2,7 @@ Close

Library

-
    - <%== can.view.render('views/library/root.ejs', {}) %> -
+
+
+ <%# can.view.render('views/library/root.ejs', {}) %> +
diff --git a/public/views/library/albums.ejs b/public/views/library/albums.ejs new file mode 100644 index 0000000..ec995fc --- /dev/null +++ b/public/views/library/albums.ejs @@ -0,0 +1,12 @@ +
    + <% list(albums, function(album) { %> +
  1. + <%== can.route.link(album.attr('title'), { + page: 'library', + show: 'songs', + artist: album.attr('artist'), + album: album.attr('album') + }) %> +
  2. + <% }) %> +
diff --git a/public/views/library/artists.ejs b/public/views/library/artists.ejs new file mode 100644 index 0000000..965a93b --- /dev/null +++ b/public/views/library/artists.ejs @@ -0,0 +1,11 @@ +
    + <% list(artists, function(artist) { %> +
  1. + <%== can.route.link(artist.attr('name'), { + page: 'library', + show: 'albums', + artist: artist.attr('name') + }) %> +
  2. + <% }) %> +
diff --git a/public/views/library/root.ejs b/public/views/library/root.ejs index 118f371..d5c30f2 100644 --- a/public/views/library/root.ejs +++ b/public/views/library/root.ejs @@ -1,3 +1,5 @@ -
  • <%== can.route.link('Artists', { page: 'library', mode: 'artists' }) %>
  • -
  • <%== can.route.link('Albums', { page: 'library', mode: 'albums' }) %>
  • -
  • <%== can.route.link('Songs', { page: 'library', mode: 'songs' }) %>
  • + diff --git a/public/views/library/songs.ejs b/public/views/library/songs.ejs new file mode 100644 index 0000000..344e3bb --- /dev/null +++ b/public/views/library/songs.ejs @@ -0,0 +1,7 @@ +
      + <% list(songs, function(song) { %> +
    1. + <%= song.attr('title') %> +
    2. + <% }) %> +