From 725d2b056d73dd87ef656f41f9ed4b2043658342 Mon Sep 17 00:00:00 2001 From: Duncan Robertson Date: Tue, 19 Jan 2016 11:01:56 +0000 Subject: [PATCH] Add upcoming tracks to status bar --- Gemfile | 2 +- Gemfile.lock | 6 +- Rakefile | 1 + app/_views/upcoming_table_view.rb | 24 ++++++ app/_views/upcoming_view.rb | 81 -------------------- app/controllers/upcoming_controller.rb | 100 ++++++++++++++++++++++--- 6 files changed, 119 insertions(+), 95 deletions(-) create mode 100644 app/_views/upcoming_table_view.rb delete mode 100644 app/_views/upcoming_view.rb diff --git a/Gemfile b/Gemfile index 090142a..c78769e 100644 --- a/Gemfile +++ b/Gemfile @@ -9,5 +9,5 @@ gem 'sugarcube', :require => [ 'sugarcube-attributedstring', ] gem "ib" -#gem "kyan_jukebox_websocket_lib", :path => "/Users/duncan/_dev/kyan/gems/kyan_jukebox_websocket_lib" +#gem "kyan_jukebox", :path => "/Users/duncan/_dev/kyan/gems/kyan_jukebox_websocket_lib" gem "kyan_jukebox", :git => 'git@github.com:kyan/kyan_jukebox_websocket_lib.git' diff --git a/Gemfile.lock b/Gemfile.lock index bd5e20b..8fb615a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GIT remote: git@github.com:kyan/kyan_jukebox_websocket_lib.git - revision: 60178464e15c2465357326aa40906c1e71377de5 + revision: 8bfe8b70b4ed6fefb491591d9e62279c262ade7d specs: - kyan_jukebox (0.2.0) + kyan_jukebox (0.2.3) GEM remote: https://rubygems.org/ @@ -85,4 +85,4 @@ DEPENDENCIES sugarcube BUNDLED WITH - 1.10.6 + 1.11.2 diff --git a/Rakefile b/Rakefile index 0b885be..feb5d51 100644 --- a/Rakefile +++ b/Rakefile @@ -17,6 +17,7 @@ Motion::Project::App.setup do |app| app.info_plist['NSUIElement'] = 1 app.info_plist['NSHumanReadableCopyright'] = 'Copyright © 2016, Kyan Ltd' + app.info_plist['NSAppTransportSecurity'] = { 'NSAllowsArbitraryLoads' => true } app.pods do pod 'SocketRocket' diff --git a/app/_views/upcoming_table_view.rb b/app/_views/upcoming_table_view.rb new file mode 100644 index 0000000..9f44f82 --- /dev/null +++ b/app/_views/upcoming_table_view.rb @@ -0,0 +1,24 @@ +class UpcomingTableView < NSTableView + + def init + super.tap do |v| + v.translatesAutoresizingMaskIntoConstraints = false + + col2 = NSTableColumn.alloc.initWithIdentifier "col2" + col2.setWidth 20 + col2.identifier = :thumb + v.addTableColumn col2 + + col3 = NSTableColumn.alloc.initWithIdentifier "col3" + col3.setWidth 220 + col3.identifier = :title + v.addTableColumn col3 + + col4 = NSTableColumn.alloc.initWithIdentifier "col4" + col4.setWidth 40 + col4.identifier = :duration + v.addTableColumn col4 + end + end + +end diff --git a/app/_views/upcoming_view.rb b/app/_views/upcoming_view.rb deleted file mode 100644 index 59f92b7..0000000 --- a/app/_views/upcoming_view.rb +++ /dev/null @@ -1,81 +0,0 @@ -class UpcomingView < NSView - - attr_accessor :table - - def initWithFrame(frame) - super(frame).tap do |cell| - cell.translatesAutoresizingMaskIntoConstraints = false - - @table ||= draw_table - - views_dict = { - "table" => @table - } - - metrics_dict = { - "h_spacing" => 5, - "h_padding" => 10, - "v_padding" => 10 - } - - views_dict.each do |key, view| - cell.addSubview(view) - end - - constraints = [] - constraints += NSLayoutConstraint.constraintsWithVisualFormat( - "V:|[table]|", - options:NSLayoutFormatAlignAllLeft, - metrics:metrics_dict, - views:views_dict - ) - constraints += NSLayoutConstraint.constraintsWithVisualFormat( - "H:|[table]|", - options:0, - metrics:metrics_dict, - views:views_dict - ) - cell.addConstraints(constraints) - end - end - - def refresh(jukebox) - @jukebox = jukebox - update_data! - end - - def track - @jukebox.track unless @jukebox.nil? - end - - def rating - @jukebox.rating unless @jukebox.nil? - end - - private - - def valid_jb_data?(key) - @jukebox.whats_changed.include?(key) - end - - def should_update? - valid_jb_data?(:track) || valid_jb_data?(:rating) - end - - def update_data! - if @jukebox && should_update? - update_table - end - - invalidateIntrinsicContentSize - setNeedsDisplay(true) - end - - def draw_table - NSTableView.new - end - - def update_table - end - -end \ No newline at end of file diff --git a/app/controllers/upcoming_controller.rb b/app/controllers/upcoming_controller.rb index f7ff00a..52166d2 100644 --- a/app/controllers/upcoming_controller.rb +++ b/app/controllers/upcoming_controller.rb @@ -2,28 +2,108 @@ class UpcomingController < NSViewController def init super.tap do |c| + c.init_data c.build_view @update_observer = App.notification_center.observe JB_UPDATED do |n| - view.refresh(n.userInfo[:jukebox]) + refresh(n.userInfo[:jukebox]) end end end + def refresh(jukebox) + @jukebox = jukebox + refresh_tracks + @table_view.reloadData + end + + def init_data + @upcoming_tracks = [] + end + def build_view - @main_view = UpcomingView.alloc.initWithFrame([[0, 0], [50, 50]]) - @main_view.table.setDelegate(self) - @main_view.table.setDataSource(self) - self.setView(@main_view) + @table_view = UpcomingTableView.alloc.init + @table_view.setBoundsOrigin([-10,0]); + @table_view.setBoundsSize([@table_view.bounds.size.width+20, @table_view.bounds.size.height]); + @table_view.delegate = self + @table_view.dataSource = self + self.setView(@table_view) + end + + def numberOfRowsInTableView(table_view) + @upcoming_tracks.count + end + + def tableView(table_view, objectValueForTableColumn:table_column, row:row) + case table_column.identifier.to_sym + when :thumb + if @upcoming_tracks[row].artwork_url.nil? + NSImage.imageNamed("missing_artwork.png") + else + url = NSURL.URLWithString(@upcoming_tracks[row].artwork_url) + NSImage.alloc.initWithContentsOfURL(url) + end + when :title + str = "#{@upcoming_tracks[row].heading} (#{@upcoming_tracks[row].added_by})" + paragraph = NSMutableParagraphStyle.new + paragraph.setLineBreakMode(NSLineBreakByTruncatingTail) + + str.attrd({ + 'NSParagraphStyle' => paragraph + }) + when :duration + @upcoming_tracks[row].eta + end + end + + def tableView(table_view, heightOfRow:row) + 20 end + def tableView(table_view, viewForTableColumn:table_column, row:row) + tview = table_view.makeViewWithIdentifier(table_column.identifier, owner:self) + + case table_column.identifier.to_sym + when :thumb + tview = NSImageView.new.tap do |v| + v.setTranslatesAutoresizingMaskIntoConstraints(false) + v.setEditable(false) + v.setImageScaling(NSImageScaleAxesIndependently) + v.identifier = 'thumbid' + end + when :title + tview = NSTextField.new.tap do |v| + v.frame = CGRectZero + v.font = NSFont.systemFontOfSize(12.0) + v.setEditable(false) + v.setBezeled(false) + v.setDrawsBackground(false) + v.setSelectable(false) + v.identifier = 'titleid' + end + else + tview = NSTextField.new.tap do |v| + v.frame = CGRectZero + v.setEditable(false) + v.setBezeled(false) + v.setAlignment(NSRightTextAlignment) + v.setDrawsBackground(false) + v.setSelectable(false) + v.identifier = 'defaultid' + end + end - def numberOfRowsInTableView - 3 + tview end - def tableView(tableView, objectValueForTableColumn:objVal, row:row) - 'Hello' + private + + def refresh_tracks + @upcoming_tracks = @jukebox.playlist.upcoming_tracks(current_track)[0...5] end -end \ No newline at end of file + def current_track + return @jukebox.track.file if @jukebox.last_change?(:track) + nil + end +end