Commit 87a284dd authored by Tamas Timar's avatar Tamas Timar Committed by Felix Paul Kühne

Use UICollectionView instead of AQGridView, on 6.0 and later

parent c6baee69
//
// VLCPlaylistCollectionViewCell.h
// VLC for iOS
//
// Created by Tamas Timar on 8/30/13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
// Refer to the COPYING file of the official project for license.
//
#import <UIKit/UIKit.h>
#import "VLCLinearProgressIndicator.h"
@interface VLCPlaylistCollectionViewCell : UICollectionViewCell
@property (nonatomic, strong) IBOutlet UILabel *titleLabel;
@property (nonatomic, strong) IBOutlet UILabel *subtitleLabel;
@property (nonatomic, strong) IBOutlet UIImageView *thumbnailView;
@property (nonatomic, strong) IBOutlet VLCLinearProgressIndicator *progressView;
@property (nonatomic, strong) IBOutlet UIButton *removeMediaButton;
@property (nonatomic, strong) IBOutlet UIImageView *mediaIsUnreadView;
@property (nonatomic, strong) IBOutlet UILabel *seriesNameLabel;
@property (nonatomic, strong) IBOutlet UILabel *artistNameLabel;
@property (nonatomic, strong) IBOutlet UILabel *albumNameLabel;
@property (nonatomic, retain) MLFile *mediaObject;
@property (nonatomic, weak) UICollectionView *collectionView;
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;
- (IBAction)removeMedia:(id)sender;
@end
//
// VLCPlaylistCollectionViewCell.m
// VLC for iOS
//
// Created by Tamas Timar on 8/30/13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
// Refer to the COPYING file of the official project for license.
//
#import "VLCPlaylistCollectionViewCell.h"
#import "VLCPlaylistViewController.h"
#define MAX_CACHE_SIZE 27 // three times the number of items shown on iPad
@implementation VLCPlaylistCollectionViewCell
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
self.removeMediaButton.hidden = !editing;
[self _updatedDisplayedInformationForKeyPath:@"editing"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
[self _updatedDisplayedInformationForKeyPath:keyPath];
}
- (void)setMediaObject:(MLFile *)mediaObject
{
if (_mediaObject != mediaObject) {
[_mediaObject removeObserver:self forKeyPath:@"computedThumbnail"];
[_mediaObject removeObserver:self forKeyPath:@"lastPosition"];
[_mediaObject removeObserver:self forKeyPath:@"duration"];
[_mediaObject removeObserver:self forKeyPath:@"fileSizeInBytes"];
[_mediaObject removeObserver:self forKeyPath:@"title"];
[_mediaObject removeObserver:self forKeyPath:@"thumbnailTimeouted"];
[_mediaObject removeObserver:self forKeyPath:@"unread"];
[_mediaObject removeObserver:self forKeyPath:@"albumTrackNumber"];
[_mediaObject removeObserver:self forKeyPath:@"album"];
[_mediaObject removeObserver:self forKeyPath:@"artist"];
[_mediaObject removeObserver:self forKeyPath:@"genre"];
if ([_mediaObject respondsToSelector:@selector(didHide)])
[(MLFile*)_mediaObject didHide];
_mediaObject = mediaObject;
[_mediaObject addObserver:self forKeyPath:@"computedThumbnail" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"lastPosition" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"duration" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"fileSizeInBytes" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"title" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"thumbnailTimeouted" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"unread" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"albumTrackNumber" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"album" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"artist" options:0 context:nil];
[_mediaObject addObserver:self forKeyPath:@"genre" options:0 context:nil];
if ([_mediaObject respondsToSelector:@selector(willDisplay)])
[(MLFile*)_mediaObject willDisplay];
}
[self _updatedDisplayedInformationForKeyPath:nil];
}
- (void)_updatedDisplayedInformationForKeyPath:(NSString *)keyPath
{
self.albumNameLabel.text = self.artistNameLabel.text = self.seriesNameLabel.text = @"";
if ([self.mediaObject isKindOfClass:[MLFile class]]) {
MLFile *mediaObject = self.mediaObject;
[self configureForMLFile:mediaObject];
if (([keyPath isEqualToString:@"computedThumbnail"] || !keyPath) && !mediaObject.isAlbumTrack) {
self.thumbnailView.image = [self thumbnailForMediaFile:mediaObject];
}
} else if ([self.mediaObject isKindOfClass:[MLAlbum class]]) {
MLAlbum *mediaObject = (MLAlbum *)self.mediaObject;
[self configureForAlbum:mediaObject];
} else if ([self.mediaObject isKindOfClass:[MLAlbumTrack class]]) {
MLAlbumTrack *mediaObject = (MLAlbumTrack *)self.mediaObject;
[self configureForAlbumTrack:mediaObject];
} else if ([self.mediaObject isKindOfClass:[MLShow class]]) {
MLShow *mediaObject = (MLShow *)self.mediaObject;
[self configureForShow:mediaObject];
if ([keyPath isEqualToString:@"computedThumbnail"] || !keyPath) {
MLFile *anyFileFromAnyEpisode = [mediaObject.episodes.anyObject files].anyObject;
self.thumbnailView.image = [self thumbnailForMediaFile:anyFileFromAnyEpisode];
}
} else if ([self.mediaObject isKindOfClass:[MLShowEpisode class]]) {
MLShowEpisode *mediaObject = (MLShowEpisode *)self.mediaObject;
[self configureForShowEpisode:mediaObject];
if ([keyPath isEqualToString:@"computedThumbnail"] || !keyPath) {
MLFile *anyFileFromEpisode = mediaObject.files.anyObject;
self.thumbnailView.image = [self thumbnailForMediaFile:anyFileFromEpisode];
}
}
[self setNeedsDisplay];
}
- (IBAction)removeMedia:(id)sender
{
/* ask user if s/he really wants to delete the media file */
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"DELETE_FILE", @"") message:[NSString stringWithFormat:NSLocalizedString(@"DELETE_FILE_LONG", @""), self.mediaObject.title] delegate:self cancelButtonTitle:NSLocalizedString(@"BUTTON_CANCEL", @"") otherButtonTitles:NSLocalizedString(@"BUTTON_DELETE", @""), nil];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
VLCPlaylistViewController *delegate = (VLCPlaylistViewController*)self.collectionView.delegate;
[delegate removeMediaObject:self.mediaObject];
}
}
#pragma mark - presentation
- (void)configureForShow:(MLShow *)show
{
self.titleLabel.text = show.name;
self.artistNameLabel.text = @"";
self.albumNameLabel.text = show.releaseYear;
NSUInteger count = show.episodes.count;
self.subtitleLabel.text = [NSString stringWithFormat:(count > 1) ? NSLocalizedString(@"LIBRARY_EPISODES", @"") : NSLocalizedString(@"LIBRARY_SINGLE_EPISODE", @""), count, show.unreadEpisodes.count];
self.mediaIsUnreadView.hidden = YES;
self.progressView.hidden = YES;
}
- (void)configureForAlbumTrack:(MLAlbumTrack *)albumTrack
{
self.artistNameLabel.text = albumTrack.artist;
self.albumNameLabel.text = [NSString stringWithFormat:NSLocalizedString(@"LIBRARY_SINGLE_TRACK", @""), albumTrack.trackNumber.intValue];
self.titleLabel.text = albumTrack.title;
self.thumbnailView.image = nil;
MLFile *anyFileFromTrack = albumTrack.files.anyObject;
self.subtitleLabel.text = [NSString stringWithFormat:@"%@", [VLCTime timeWithNumber:[anyFileFromTrack duration]]];
CGFloat position = anyFileFromTrack.lastPosition.floatValue;
self.progressView.progress = position;
self.progressView.hidden = ((position < .1f) || (position > .95f)) ? YES : NO;
[self.progressView setNeedsDisplay];
self.mediaIsUnreadView.hidden = !anyFileFromTrack.unread.intValue;
}
- (void)configureForAlbum:(MLAlbum *)album
{
self.titleLabel.text = album.name;
MLAlbumTrack *anyTrack = [album.tracks anyObject];
self.artistNameLabel.text = anyTrack? anyTrack.artist: @"";
self.albumNameLabel.text = album.releaseYear;
self.thumbnailView.image = nil;
NSUInteger count = album.tracks.count;
self.subtitleLabel.text = [NSString stringWithFormat:(count > 1) ? NSLocalizedString(@"LIBRARY_TRACKS", @"") : NSLocalizedString(@"LIBRARY_SINGLE_TRACK", @""), count];
self.mediaIsUnreadView.hidden = YES;
self.progressView.hidden = YES;
}
- (void)configureForShowEpisode:(MLShowEpisode *)showEpisode
{
MLFile *anyFileFromEpisode = showEpisode.files.anyObject;
self.titleLabel.text = showEpisode.name;
if (self.titleLabel.text.length < 1) {
self.titleLabel.text = [NSString stringWithFormat:@"S%02dE%02d", showEpisode.episodeNumber.intValue, showEpisode.seasonNumber.intValue];
self.subtitleLabel.text = [NSString stringWithFormat:@"%@", [VLCTime timeWithNumber:[anyFileFromEpisode duration]]];
} else
self.subtitleLabel.text = [NSString stringWithFormat:@"S%02dE%02d — %@", showEpisode.episodeNumber.intValue, showEpisode.seasonNumber.intValue, [VLCTime timeWithNumber:[anyFileFromEpisode duration]]];
CGFloat position = anyFileFromEpisode.lastPosition.floatValue;
self.progressView.progress = position;
self.progressView.hidden = ((position < .1f) || (position > .95f)) ? YES : NO;
[self.progressView setNeedsDisplay];
self.mediaIsUnreadView.hidden = !showEpisode.unread.intValue;
}
- (void)configureForMLFile:(MLFile *)mediaFile
{
if ([mediaFile isAlbumTrack]) {
self.artistNameLabel.text = mediaFile.albumTrack.artist;
self.albumNameLabel.text = mediaFile.albumTrack.album.name;
self.titleLabel.text = (mediaFile.albumTrack.title.length > 0) ? mediaFile.albumTrack.title : mediaFile.title;
self.thumbnailView.image = nil;
} else if ([mediaFile isShowEpisode]) {
MLShowEpisode *episode = mediaFile.showEpisode;
self.seriesNameLabel.text = episode.show.name;
self.titleLabel.text = (episode.name.length > 0) ? [NSString stringWithFormat:@"%@ - S%02dE%02d", episode.name, mediaFile.showEpisode.seasonNumber.intValue, episode.episodeNumber.intValue] : [NSString stringWithFormat:@"S%02dE%02d", episode.seasonNumber.intValue, episode.episodeNumber.intValue];
} else
self.titleLabel.text = mediaFile.title;
VLCPlaylistViewController *delegate = (VLCPlaylistViewController*)self.collectionView.delegate;
if (delegate.isEditing)
self.subtitleLabel.text = [NSString stringWithFormat:@"%@ — %i MB", [VLCTime timeWithNumber:[mediaFile duration]], (int)([mediaFile fileSizeInBytes] / 1e6)];
else {
self.subtitleLabel.text = [NSString stringWithFormat:@"%@", [VLCTime timeWithNumber:[mediaFile duration]]];
if (mediaFile.videoTrack) {
NSString *width = [[mediaFile videoTrack] valueForKey:@"width"];
NSString *height = [[mediaFile videoTrack] valueForKey:@"height"];
if (width.intValue > 0 && height.intValue > 0)
self.subtitleLabel.text = [self.subtitleLabel.text stringByAppendingFormat:@" — %@x%@", width, height];
}
}
CGFloat position = mediaFile.lastPosition.floatValue;
self.progressView.progress = position;
self.progressView.hidden = ((position < .1f) || (position > .95f)) ? YES : NO;
[self.progressView setNeedsDisplay];
self.mediaIsUnreadView.hidden = !mediaFile.unread.intValue;
}
// Can be extracted outside of VLCPlaylistCollectionViewCell
- (UIImage *)thumbnailForMediaFile:(MLFile *)mediaFile {
if (mediaFile == nil || mediaFile.objectID == nil)
return nil;
static NSMutableArray *_thumbnailCacheIndex;
static NSMutableDictionary *_thumbnailCache;
if (!_thumbnailCache)
_thumbnailCache = [[NSMutableDictionary alloc] initWithCapacity:MAX_CACHE_SIZE];
if (!_thumbnailCacheIndex)
_thumbnailCacheIndex = [[NSMutableArray alloc] initWithCapacity:MAX_CACHE_SIZE];
NSManagedObjectID *objID = mediaFile.objectID;
UIImage *displayedImage = nil;
if ([_thumbnailCacheIndex containsObject:objID]) {
[_thumbnailCacheIndex removeObject:objID];
[_thumbnailCacheIndex insertObject:objID atIndex:0];
displayedImage = [_thumbnailCache objectForKey:objID];
if (!displayedImage && mediaFile.computedThumbnail) {
displayedImage = mediaFile.computedThumbnail;
[_thumbnailCache setObject:displayedImage forKey:objID];
}
} else {
if (_thumbnailCacheIndex.count >= MAX_CACHE_SIZE) {
[_thumbnailCache removeObjectForKey:[_thumbnailCacheIndex lastObject]];
[_thumbnailCacheIndex removeLastObject];
}
displayedImage = mediaFile.computedThumbnail;
if (displayedImage) {
[_thumbnailCache setObject:displayedImage forKey:objID];
[_thumbnailCacheIndex insertObject:objID atIndex:0];
}
}
return displayedImage;
}
@end
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1552</int>
<string key="IBDocument.SystemVersion">12E55</string>
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
<string key="IBDocument.AppKitVersion">1187.39</string>
<string key="IBDocument.HIToolboxVersion">626.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="NS.object.0">2083</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>IBProxyObject</string>
<string>IBUIButton</string>
<string>IBUICollectionViewCell</string>
<string>IBUIImageView</string>
<string>IBUILabel</string>
<string>IBUIView</string>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</array>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
<integer value="1" key="NS.object.0"/>
</object>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="IBProxyObject" id="841351856">
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
</object>
<object class="IBProxyObject" id="371349661">
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
</object>
<object class="IBUICollectionViewCell" id="541525164">
<reference key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUIView" id="343928585">
<reference key="NSNextResponder" ref="541525164"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUILabel" id="457142782">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">264</int>
<string key="NSFrame">{{19, 76}, {257, 20}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="405891686"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">1</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<string key="IBUIText">Artist Name</string>
<object class="NSColor" key="IBUITextColor" id="429073164">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
<nil key="IBUIHighlightedColor"/>
<object class="NSColor" key="IBUIShadowColor" id="453573140">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MCAwIDAAA</bytes>
<string key="IBUIColorCocoaTouchKeyPath">darkTextColor</string>
</object>
<int key="IBUIBaselineAdjustment">0</int>
<float key="IBUIMinimumFontSize">12</float>
<bool key="IBUIAdjustsLetterSpacingToFitWidth">YES</bool>
<int key="IBUITextAlignment">1</int>
<object class="IBUIFontDescription" key="IBUIFontDescription" id="290339558">
<int key="type">1</int>
<double key="pointSize">18</double>
</object>
<object class="NSFont" key="IBUIFont" id="154316482">
<string key="NSName">Helvetica</string>
<double key="NSSize">18</double>
<int key="NSfFlags">16</int>
</object>
</object>
<object class="IBUILabel" id="405891686">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">264</int>
<string key="NSFrame">{{20, 96}, {258, 28}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="99927648"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">7</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<string key="IBUIText">Album Name</string>
<object class="NSColor" key="IBUITextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC43MgA</bytes>
</object>
<nil key="IBUIHighlightedColor"/>
<reference key="IBUIShadowColor" ref="453573140"/>
<int key="IBUIBaselineAdjustment">0</int>
<float key="IBUIMinimumFontSize">10</float>
<bool key="IBUIAdjustsLetterSpacingToFitWidth">YES</bool>
<int key="IBUITextAlignment">1</int>
<object class="IBUIFontDescription" key="IBUIFontDescription" id="106500751">
<int key="type">1</int>
<double key="pointSize">14</double>
</object>
<object class="NSFont" key="IBUIFont" id="939746159">
<string key="NSName">Helvetica</string>
<double key="NSSize">14</double>
<int key="NSfFlags">16</int>
</object>
</object>
<object class="IBUIImageView" id="99927648">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">274</int>
<string key="NSFrame">{{21, 14}, {256, 144}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="501792178"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
</object>
<object class="IBUILabel" id="634412904">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">264</int>
<string key="NSFrame">{{20, 167}, {258, 21}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="288639132"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">1</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<string key="IBUIText">Label</string>
<reference key="IBUITextColor" ref="429073164"/>
<nil key="IBUIHighlightedColor"/>
<reference key="IBUIShadowColor" ref="453573140"/>
<int key="IBUIBaselineAdjustment">0</int>
<float key="IBUIMinimumFontSize">9</float>
<bool key="IBUIAdjustsLetterSpacingToFitWidth">YES</bool>
<int key="IBUITextAlignment">1</int>
<reference key="IBUIFontDescription" ref="290339558"/>
<reference key="IBUIFont" ref="154316482"/>
</object>
<object class="IBUILabel" id="288639132">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">264</int>
<string key="NSFrame">{{20, 190}, {258, 28}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">7</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<string key="IBUIText">Subtitle</string>
<object class="NSColor" key="IBUITextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC43MgA</bytes>
</object>
<nil key="IBUIHighlightedColor"/>
<reference key="IBUIShadowColor" ref="453573140"/>
<int key="IBUIBaselineAdjustment">0</int>
<int key="IBUITextAlignment">1</int>
<reference key="IBUIFontDescription" ref="106500751"/>
<reference key="IBUIFont" ref="939746159"/>
<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
</object>
<object class="IBUILabel" id="22663525">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">264</int>
<string key="NSFrame">{{27, 12}, {230, 28}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="699596644"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">7</int>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<string key="IBUIText">Series Name</string>
<object class="NSColor" key="IBUITextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC43MgA</bytes>
</object>
<nil key="IBUIHighlightedColor"/>
<reference key="IBUIShadowColor" ref="453573140"/>
<string key="IBUIShadowOffset">{0, 1}</string>
<int key="IBUIBaselineAdjustment">0</int>
<float key="IBUIMinimumFontSize">9</float>
<bool key="IBUIAdjustsLetterSpacingToFitWidth">YES</bool>
<reference key="IBUIFontDescription" ref="106500751"/>
<reference key="IBUIFont" ref="939746159"/>
</object>
<object class="IBUIView" id="501792178">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{21, 146}, {256, 12}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="634412904"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor" id="476951524">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwAA</bytes>
</object>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
</object>
<object class="IBUIImageView" id="130196590">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">274</int>
<string key="NSFrame">{{16, 9}, {266, 154}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="22663525"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<object class="NSCustomResource" key="IBUIImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">thumbOverlay.png</string>
</object>
</object>
<object class="IBUIButton" id="657061410">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">-2147483356</int>
<string key="NSFrame">{{260, 2}, {33, 29}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="457142782"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
<reference key="IBUIHighlightedTitleColor" ref="429073164"/>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA</bytes>
</object>
<object class="NSColor" key="IBUINormalTitleShadowColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC41AA</bytes>
</object>
<object class="NSCustomResource" key="IBUINormalImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">DeleteButton.png</string>
</object>
<object class="IBUIFontDescription" key="IBUIFontDescription">
<int key="type">2</int>
<int key="size">2</int>
</object>
<object class="NSFont" key="IBUIFont">
<string key="NSName">Helvetica-Bold</string>
<double key="NSSize">18</double>
<int key="NSfFlags">16</int>
</object>
</object>
<object class="IBUIImageView" id="699596644">
<reference key="NSNextResponder" ref="343928585"/>
<int key="NSvFlags">297</int>
<string key="NSFrame">{{235, 12}, {44, 44}}</string>
<reference key="NSSuperview" ref="343928585"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="657061410"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIUserInteractionEnabled">NO</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<object class="NSCustomResource" key="IBUIImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">badgeUnread~ipad.png</string>
</object>
</object>
</array>
<string key="NSFrameSize">{298, 220}</string>
<reference key="NSSuperview" ref="541525164"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="130196590"/>
<reference key="IBUIBackgroundColor" ref="476951524"/>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">4</int>
<bool key="IBUIMultipleTouchEnabled">YES</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
</object>
</array>
<string key="NSFrameSize">{298, 220}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="343928585"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
<int key="IBUIContentMode">4</int>
<bool key="IBUIMultipleTouchEnabled">YES</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<string key="IBUIReuseIdentifier">PlaylistCell</string>
<reference key="IBUIContentView" ref="343928585"/>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">albumNameLabel</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="405891686"/>
</object>
<int key="connectionID">39</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">artistNameLabel</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="457142782"/>
</object>
<int key="connectionID">40</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">mediaIsUnreadView</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="699596644"/>
</object>
<int key="connectionID">41</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">progressView</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="501792178"/>
</object>
<int key="connectionID">42</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">removeMediaButton</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="657061410"/>
</object>
<int key="connectionID">43</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">seriesNameLabel</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="22663525"/>
</object>
<int key="connectionID">44</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">subtitleLabel</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="288639132"/>
</object>
<int key="connectionID">45</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">thumbnailView</string>
<reference key="source" ref="541525164"/>
<reference key="destination" ref="99927648"/>
</object>
<int key="connectionID">46</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">titleLabel</string>