// // AlbumTableCellView.swift // TagTunes // // Created by Kim Wittenburg on 28.08.15. // Copyright © 2015 Kim Wittenburg. All rights reserved. // import Cocoa import AppKitPlus /// A table cell view to represent an `Album`. This view can be initialized using /// `initWithFrame`. public class AlbumTableCellView: AdvancedTableCellView { // MARK: Types private struct Constants { static let secondaryImageViewWidth: CGFloat = 17 } // MARK: Properties /// Returns the receiver's `imageView` as an `AsyncImageView`. This property /// replaces the `imageView` property. /// /// Intended to be used as accessory view. @IBOutlet public var asyncImageView: AsyncImageView! = { let imageView = AsyncImageView() imageView.imageScaling = .ScaleProportionallyUpOrDown imageView.translatesAutoresizingMaskIntoConstraints = false return imageView }() /// Intended to be used as accessory view. /// /// Contains the *tick* image for saved albums. @IBOutlet public lazy var secondaryImageView: NSImageView! = { let secondaryImageView = NSImageView() secondaryImageView.image = NSImage(named: "Tick")?.imageByMaskingWithColor(NSColor.clearColor()) secondaryImageView.imageScaling = .ScaleProportionallyDown secondaryImageView.translatesAutoresizingMaskIntoConstraints = false return secondaryImageView }() /// Intended to be used as accessory view. /// /// Displayed for loading albums. @IBOutlet public lazy var loadingIndicator: NSProgressIndicator! = { let loadingIndicator = NSProgressIndicator() loadingIndicator.style = .SpinningStyle loadingIndicator.indeterminate = true loadingIndicator.controlSize = .SmallControlSize loadingIndicator.translatesAutoresizingMaskIntoConstraints = false return loadingIndicator }() /// Intended to be used as accessory view. /// /// Displayed for search results. @IBOutlet public lazy var button: NSButton! = { let button = NSButton() button.setButtonType(NSButtonType.MomentaryPushInButton) button.bezelStyle = NSBezelStyle.RoundedBezelStyle button.controlSize = .SmallControlSize button.setContentHuggingPriority(NSLayoutPriorityDefaultHigh, forOrientation: .Horizontal) button.translatesAutoresizingMaskIntoConstraints = false return button }() @IBOutlet public lazy var errorButton: NSButton! = { let errorButton = NSButton() errorButton.setButtonType(NSButtonType.MomentaryChangeButton) errorButton.bezelStyle = NSBezelStyle.ShadowlessSquareBezelStyle errorButton.bordered = false errorButton.imagePosition = .ImageOnly errorButton.image = NSImage(named: NSImageNameCaution) errorButton.translatesAutoresizingMaskIntoConstraints = false return errorButton }() // MARK: Initializers override public func setupView() { style = .Subtitle primaryTextField?.font = NSFont.boldSystemFontOfSize(0) setLeftAccessoryView(asyncImageView, withConstraints: [NSLayoutConstraint( item: asyncImageView, attribute: .Width, relatedBy: .Equal, toItem: asyncImageView, attribute: .Height, multiplier: 1, constant: 0)]) super.setupView() } // MARK: Overrides /// The receiver's imageView. /// /// - attention: Use `asyncImageView` instead. override public var imageView: NSImageView? { set { asyncImageView = newValue as? AsyncImageView } get { return asyncImageView } } // MARK: Methods /// Configures the receiver to display the specified `album`. /// /// - parameters: /// - album: The album to be displayed. /// - loading: `true` if a loading indicator should be displayed at the /// album view. public func setupForAlbum(album: Album, loading: Bool, error: NSError?) { textField?.stringValue = Preferences.sharedPreferences.useCensoredNames ? album.censoredName : album.name secondaryTextField?.stringValue = album.artistName asyncImageView.downloadImageFromURL(album.artwork.hiResURL) if loading { textField?.textColor = NSColor.disabledControlTextColor() rightAccessoryView = loadingIndicator } else if error != nil { textField?.textColor = NSColor.redColor() rightAccessoryView = errorButton } else { textField?.textColor = NSColor.controlTextColor() if album.saved { let aspectRatioConstraint = NSLayoutConstraint( item: secondaryImageView, attribute: .Width, relatedBy: .Equal, toItem: secondaryImageView, attribute: .Height, multiplier: 1, constant: 0) let widthConstraint = NSLayoutConstraint( item: secondaryImageView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: 17) setRightAccessoryView(secondaryImageView, withConstraints: [aspectRatioConstraint, widthConstraint]) } else { rightAccessoryView = nil } } } /// Configures the receiver to display the specified `searchResult`. /// /// - parameters: /// - searchResult: The search result to be displayed. /// - selectable: `true` if the search result can be selected, `false` /// otherwise. public func setupForSearchResult(searchResult: SearchResult, selectable: Bool) { textField?.stringValue = Preferences.sharedPreferences.useCensoredNames ? searchResult.censoredName : searchResult.name textField?.textColor = NSColor.controlTextColor() secondaryTextField?.stringValue = searchResult.artistName asyncImageView.downloadImageFromURL(searchResult.artwork.hiResURL) if selectable { button.title = NSLocalizedString("Select", comment: "Button title for 'selecting a search result'") button.enabled = true } else { button.title = NSLocalizedString("Added", comment: "Button title for a search result that is already present") button.enabled = false } rightAccessoryView = button } }