Archived
1

Replaced much too complicated class based system with simple data structs.

This commit is contained in:
Kim Wittenburg
2016-03-03 23:08:26 +01:00
parent f3669932df
commit ba472864df
6 changed files with 0 additions and 1671 deletions

View File

@@ -1,148 +0,0 @@
//
// Album.swift
// Tag for iTunes
//
// Created by Kim Wittenburg on 29.05.15.
// Copyright (c) 2015 Kim Wittenburg. All rights reserved.
//
import Cocoa
/// Represents an album of the
/// [Search API](https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
public class Album: iTunesType {
// MARK: Properties
public let id: iTunesId
public let name: String
public let censoredName: String
public let viewURL: NSURL
public let artwork: Artwork
public let trackCount: Int
public let releaseDate: NSDate
public let genre: String
public let artistName: String
public private(set) var tracks = [Track]()
// MARK: Initializers
internal init(id: iTunesId, name: String, censoredName: String, viewURL: NSURL, artwork: Artwork, trackCount: Int, releaseDate: NSDate, genre: String, artistName: String) {
self.id = id
self.name = name
self.censoredName = censoredName
self.viewURL = viewURL
self.artwork = artwork
self.trackCount = trackCount
self.releaseDate = releaseDate
self.genre = genre
self.artistName = artistName
}
public required init(data: [iTunesAPI.Field : AnyObject]) {
id = data[.CollectionId] as! UInt
name = data[.CollectionName] as! String
censoredName = data[.CollectionCensoredName] as! String
viewURL = NSURL(string: data[.CollectionViewUrl] as! String)!
artwork = Artwork(data: data)
trackCount = data[.TrackCount] as! Int
releaseDate = iTunesAPI.sharedDateFormatter.dateFromString(data[.ReleaseDate] as! String)!
genre = data[.PrimaryGenreName] as! String
if let artistName = data[.CollectionArtistName] as? String {
self.artistName = artistName
} else {
artistName = data[.ArtistName] as! String
}
}
public static var requiredFields: [iTunesAPI.Field] {
return [.CollectionId, .CollectionName, .CollectionCensoredName, .CollectionViewUrl, .TrackCount, .ReleaseDate, .PrimaryGenreName, .ArtistName]
}
// MARK: Methods
/// Adds a track to the album.
internal func addTrack(newTrack: Track) {
newTrack.album = self
var index = 0
for track in tracks {
if newTrack.discNumber < track.discNumber {
break
} else if newTrack.discNumber == track.discNumber {
if newTrack.trackNumber <= track.trackNumber {
break
}
}
++index
}
tracks.insert(newTrack, atIndex: index)
}
/// Returns wether all tracks in the album have the same artist name as the
/// album itself.
public var hasSameArtistNameAsTracks: Bool {
for track in tracks {
if artistName != track.artistName {
return false
}
}
return true
}
/// Saves the album to iTunes.
public func save() {
for track in tracks {
track.save()
}
}
/// Saves the album's artwork to the directory specified in the user's
/// preferences (See `Preferences` for details).
public func saveArtwork() throws {
if let url = Preferences.sharedPreferences.artworkTarget {
try artwork.saveToURL(url, filename: name)
}
}
/// Returns `true` if all tracks of the album are saved.
public var saved: Bool {
for track in tracks {
if !track.saved {
return false
}
}
return true
}
}
extension Album: CustomStringConvertible {
public var description: String {
return "\"\(name)\" (\(tracks.count) tracks)"
}
}
extension Album: Hashable {
public var hashValue: Int {
return Int(id)
}
}
public func ==(lhs: Album, rhs: Album) -> Bool {
return lhs === rhs
}

View File

@@ -1,209 +0,0 @@
//
// AlbumCollection.swift
// TagTunes
//
// Created by Kim Wittenburg on 08.09.15.
// Copyright © 2015 Kim Wittenburg. All rights reserved.
//
import Foundation
/// Manages a collection of albums. Managing includes support for deferred
/// loading of an album's tracks as well as error support.
public class AlbumCollection: CollectionType {
// MARK: Types
private enum AlbumState {
case Normal
case Error(NSError)
case Loading(NSURLSessionTask)
}
/// Notifications posted by an album collection. The `userInfo` of these
/// notifications contains all keys specified in `Keys`.
public struct Notifications {
/// Posted when an album is added to a collection. This notification is
/// only posted if the album collection actually changed.
public static let albumAdded = "AlbumAddedNotificationName"
/// Posted when an album is removed from a collection. This notification
/// is only posted if the album collection actually changed.
public static let albumRemoved = "AlbumRemovedNotificationName"
/// Posted when the album collection started a network request for an
/// album's tracks.
///
/// Note that the values for the keys `Album` and `AlbumIndex` for the
/// corresponding `AlbumFinishedLoading` notification may both be
/// different.
public static let albumStartedLoading = "AlbumStartedLoadingNotificationName"
/// Posted when an album collection finished loading the tracks for an
/// album. Receiving this notification does not mean that the tracks were
/// actually loaded successfully. It just means that the networ
/// connection terminated. Use `errorForAlbum` to determine if an error
/// occured while the tracks have been loaded.
///
/// - note: Since the actual `Album` instance in the album collection may
/// change during loading its tracks it is preferred that you use the
/// `AlbumIndexKey` of the notification to determine which album finished
/// loading its tracks. You can however use the `AlbumKey` as well to
/// access the `Album` instance that is currently present in the
/// collection at the respective index.
public static let albumFinishedLoading = "AlbumFinishedLoadingNotificationName"
/// These constants are available as keys in the `userInfo` dictionary
/// for any notification an album collection may post.
public struct Keys {
/// The `Album` instance affected by the notification.
public static let album = "AlbumKey"
/// The index of the album affected by the notification.
public static let albumIndex = "AlbumIndexKey"
}
}
// MARK: Properties
/// Access the userlying array of albums.
public private(set) var albums = [Album]()
private var albumStates = [Album: AlbumState]()
/// The URL session used to load tracks for albums.
private let urlSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: NSOperationQueue.mainQueue())
// MARK: Collection Type
public init() {}
public var startIndex: Int {
return albums.startIndex
}
public var endIndex: Int {
return albums.endIndex
}
public subscript (position: Int) -> Album {
return albums[position]
}
// MARK: Album Collection
/// Adds the specified album, if not already present, and begins to load its
/// tracks.
///
/// - parameters:
/// - album: The album to be added.
/// - flag: Specify `false` if the album collection should not begin to
/// load the album's tracks immediately.
public func addAlbum(album: Album, beginLoading flag: Bool = true) {
if !albums.contains(album) {
albums.append(album)
let userInfo: [NSObject: AnyObject] = [AlbumCollection.Notifications.Keys.album: album, AlbumCollection.Notifications.Keys.albumIndex: albums.count-1]
NSNotificationCenter.defaultCenter().postNotificationName(AlbumCollection.Notifications.albumAdded, object: self, userInfo: userInfo)
if flag {
beginLoadingTracksForAlbum(album)
}
}
}
/// Removes the specified album from the collection if it is present.
public func removeAlbum(album: Album) {
if let index = albums.indexOf(album) {
removeAlbumAtIndex(index)
}
}
/// Removes the album at the specified index from the collection.
///
/// - requires: The specified index must be in the collection's range.
public func removeAlbumAtIndex(index: Int) {
let album = self[index]
setAlbumState(nil, forAlbum: album)
albums.removeAtIndex(index)
let userInfo: [NSObject: AnyObject] = [AlbumCollection.Notifications.Keys.album: album, AlbumCollection.Notifications.Keys.albumIndex: index]
NSNotificationCenter.defaultCenter().postNotificationName(AlbumCollection.Notifications.albumRemoved, object: self, userInfo: userInfo)
}
/// Begins to load the tracks for the specified album. If there is already a
/// request for the specified album it is cancelled. When the tracks for the
/// specified album have been loaded or an error occured, a
/// `AlbumFinishedLoadingNotification` is posted.
public func beginLoadingTracksForAlbum(album: Album) {
guard let albumIndex = albums.indexOf(album) else {
return
}
let url = iTunesAPI.createAlbumLookupURLForId(album.id)
let task = urlSession.dataTaskWithURL(url) { (data, response, error) -> Void in
var newAlbumIndex = self.albums.indexOf(album)!
defer {
let userInfo: [NSObject: AnyObject] = [AlbumCollection.Notifications.Keys.album: self.albums[albumIndex], AlbumCollection.Notifications.Keys.albumIndex: albumIndex]
NSNotificationCenter.defaultCenter().postNotificationName(AlbumCollection.Notifications.albumFinishedLoading, object: self, userInfo: userInfo)
}
guard error == nil else {
if error!.code != NSUserCancelledError {
self.albumStates[album] = .Error(error!)
}
return
}
do {
let newAlbum = try iTunesAPI.parseAPIData(data!)[0]
self.albums.removeAtIndex(newAlbumIndex)
self.albums.insert(newAlbum, atIndex: newAlbumIndex)
self.setAlbumState(.Normal, forAlbum: album)
} catch let error as NSError {
self.setAlbumState(.Error(error), forAlbum: album)
} catch _ {
// Will never happen
}
}
setAlbumState(.Loading(task), forAlbum: album)
task.resume()
let userInfo: [NSObject: AnyObject] = [AlbumCollection.Notifications.Keys.album: album, AlbumCollection.Notifications.Keys.albumIndex: albumIndex]
NSNotificationCenter.defaultCenter().postNotificationName(AlbumCollection.Notifications.albumStartedLoading, object: self, userInfo: userInfo)
}
/// Cancels the request to load the tracks for the specified album and sets
/// the error for the album to a `NSUserCancelledError` in the
/// `NSCocoaErrorDomain`.
public func cancelLoadingTracksForAlbum(album: Album) {
let error = NSError(domain: NSCocoaErrorDomain, code: NSUserCancelledError, userInfo: nil)
setAlbumState(.Error(error), forAlbum: album)
}
/// Sets the state for the specified album. If the previous state was
/// `Loading` the associated task is cancelled.
private func setAlbumState(state: AlbumState?, forAlbum album: Album) {
if case let .Some(.Loading(task)) = albumStates[album] {
task.cancel()
}
albumStates[album] = state
}
public func isAlbumLoading(album: Album) -> Bool {
if case .Some(.Loading) = albumStates[album] {
return true
}
return false
}
public func errorForAlbum(album: Album) -> NSError? {
if case let .Some(.Error(error)) = albumStates[album] {
return error
}
return nil
}
}

View File

@@ -1,65 +0,0 @@
//
// SearchResult.swift
// TagTunes
//
// Created by Kim Wittenburg on 31.08.15.
// Copyright © 2015 Kim Wittenburg. All rights reserved.
//
import Cocoa
/// Represents an `Album` returned fromm the
/// [Search API](https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
public class SearchResult {
public let id: iTunesId
public let name: String
public let censoredName: String
public let viewURL: NSURL
public let artwork: Artwork
public let trackCount: Int
public let releaseDate: NSDate
public let genre: String
public let artistName: String
public init(representedAlbum: Album) {
id = representedAlbum.id
name = representedAlbum.name
censoredName = representedAlbum.censoredName
viewURL = representedAlbum.viewURL
artwork = representedAlbum.artwork
trackCount = representedAlbum.trackCount
releaseDate = representedAlbum.releaseDate
genre = representedAlbum.genre
artistName = representedAlbum.artistName
}
}
extension SearchResult: Hashable {
public var hashValue: Int {
return Int(id)
}
}
extension Album {
public convenience init(searchResult: SearchResult) {
self.init(id: searchResult.id, name: searchResult.name, censoredName: searchResult.censoredName, viewURL: searchResult.viewURL, artwork: searchResult.artwork, trackCount: searchResult.trackCount, releaseDate: searchResult.releaseDate, genre: searchResult.genre, artistName: searchResult.artistName)
}
}
public func ==(lhs: SearchResult, rhs: SearchResult) -> Bool {
return lhs.id == rhs.id
}

View File

@@ -1,193 +0,0 @@
//
// Track.swift
// Tag for iTunes
//
// Created by Kim Wittenburg on 30.05.15.
// Copyright (c) 2015 Kim Wittenburg. All rights reserved.
//
import Cocoa
/// Represents a track of the
/// [Search API](https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
public class Track: iTunesType {
// MARK: Types
public enum Tag: String {
case Name = "name", Artist = "artist", Year = "year", TrackNumber = "trackNumber", TrackCount = "trackCount", DiscNumber = "discNumber", DiscCount = "discCount", Genre = "genre", AlbumName = "album", AlbumArtist = "albumArtist"
case SortName = "sortName", SortArtist = "sortArtist", SortAlbumName = "sortAlbum", SortAlbumArtist = "sortAlbumArtist", Composer = "composer", SortComposer = "sortComposer", Comment = "comment"
/// Returns `true` for tags that are returned from the
/// [Search API](https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
public var isReturnedBySearchAPI: Bool {
switch self {
case .Name, .Artist, .Year, .TrackNumber, .TrackCount, .DiscNumber, .DiscCount, .Genre, .AlbumName, .AlbumArtist:
return true
default:
return false
}
}
public var clearable: Bool {
switch self {
case .Year, .TrackNumber, .TrackCount, .DiscNumber, .DiscCount:
return false
default:
return true
}
}
/// Returns a string identifying the respective tag that can be displayed
/// to the user.
public var localizedName: String {
return NSLocalizedString("Tag: \(self.rawValue)", comment: "")
}
/// Returns an array of all tags.
public static var allTags: [Tag] {
return [.Name, .Artist, .Year, .TrackNumber, .TrackCount, .DiscNumber, .DiscCount, .Genre, .AlbumName, .AlbumArtist, .SortName, .SortArtist, .SortAlbumName, .SortAlbumArtist, .Composer, .SortComposer, .Comment]
}
}
// MARK: Properties
public let id: iTunesId
public let name: String
public let censoredName: String
public let artistName: String
public let releaseDate: NSDate
public let trackNumber: Int
public let trackCount: Int
public let discNumber: Int
public let discCount: Int
public let genre: String
public internal(set) weak var album: Album!
/// These tracks will be changed, if `save()` is called.
public var associatedTracks = [iTunesTrack]()
// MARK: Initializers
public required init(data: [iTunesAPI.Field: AnyObject]) {
id = data[.TrackId] as! UInt
name = data[.TrackName] as! String
censoredName = data[.TrackCensoredName] as! String
artistName = data[.ArtistName] as! String
releaseDate = iTunesAPI.sharedDateFormatter.dateFromString(data[.ReleaseDate] as! String)!
trackNumber = data[.TrackNumber] as! Int
trackCount = data[.TrackCount] as! Int
discNumber = data[.DiscNumber] as! Int
discCount = data[.DiscCount] as! Int
genre = data[.PrimaryGenreName] as! String
}
public static var requiredFields: [iTunesAPI.Field] {
return [.TrackId, .TrackName, .TrackCensoredName, .ArtistName, .ReleaseDate, .TrackNumber, .TrackCount, .DiscNumber, .DiscCount, .PrimaryGenreName]
}
// MARK: Methods
/// Saves the track. This means that its properties are applied to every
/// `iTunesTrack` in its `associatedTracks`.
///
/// This method respects the user's preferences (See `Preferences` class).
public func save() {
saveToTracks(associatedTracks)
}
/// Applies the receiver's properties to the specified tracks.
///
/// This method respects the user's preferences (See `Preferences` class).
public func saveToTracks(tracks: [iTunesTrack]) {
for track in tracks {
saveToTrack(track)
}
}
/// Applies the receiver's properties to the specified `track`.
///
/// This method respects the user's preferences (See `Preferences` class).
public func saveToTrack(track: iTunesTrack) {
let components = NSCalendar.currentCalendar().components(.Year, fromDate: releaseDate)
let trackName = Preferences.sharedPreferences.useCensoredNames ? censoredName : name
saveTag(.Name, toTrack: track, value: trackName)
saveTag(.Artist, toTrack: track, value: artistName)
saveTag(.Year, toTrack: track, value: components.year)
saveTag(.TrackNumber, toTrack: track, value: trackNumber)
saveTag(.TrackCount, toTrack: track, value: trackCount)
saveTag(.DiscNumber, toTrack: track, value: discNumber)
saveTag(.DiscCount, toTrack: track, value: discCount)
saveTag(.Genre, toTrack: track, value: genre)
let albumName = Preferences.sharedPreferences.useCensoredNames ? album.censoredName : album.name
saveTag(.AlbumName, toTrack: track, value: albumName)
saveTag(.AlbumArtist, toTrack: track, value: album.artistName)
saveTag(.SortName, toTrack: track, value: nil)
saveTag(.SortArtist, toTrack: track, value: nil)
saveTag(.SortAlbumName, toTrack: track, value: nil)
saveTag(.SortAlbumArtist, toTrack: track, value: nil)
saveTag(.Composer, toTrack: track, value: nil)
saveTag(.SortComposer, toTrack: track, value: nil)
saveTag(.Comment, toTrack: track, value: nil)
if Preferences.sharedPreferences.clearArtworks {
track.artworks().removeAllObjects()
}
}
private func saveTag(tag: Tag, toTrack track: iTunesTrack, value: AnyObject?) {
switch Preferences.sharedPreferences.tagSavingBehaviors[tag]! {
case .Save:
track.setValue(value, forKey: tag.rawValue)
case .Clear:
track.setValue("", forKey: tag.rawValue)
case .Ignore:
break
}
}
/// Returns `true` if all `associatedTrack`s contain the same values as the
/// `Track` instance.
public var saved: Bool {
let components = NSCalendar.currentCalendar().components(.Year, fromDate: releaseDate)
for track in associatedTracks {
let trackName = Preferences.sharedPreferences.useCensoredNames ? censoredName : name
let albumName = Preferences.sharedPreferences.useCensoredNames ? album.censoredName : album.name
let options = Preferences.sharedPreferences.caseSensitive ? [] : NSStringCompareOptions.CaseInsensitiveSearch
guard track.name.compare(trackName, options: options, range: nil, locale: nil) == .OrderedSame else {
return false
}
guard track.album.compare(albumName, options: options, range: nil, locale: nil) == .OrderedSame else {
return false
}
guard track.artist == artistName && track.year == components.year && track.trackNumber == trackNumber && track.trackCount == trackCount && track.discNumber == discNumber && track.discCount == discCount && track.genre == genre && track.albumArtist == album.artistName && track.composer == "" else {
return false
}
}
return true
}
}
extension Track: Hashable {
public var hashValue: Int {
return Int(id)
}
}
public func ==(lhs: Track, rhs: Track) -> Bool {
return lhs.id == rhs.id
}

View File

@@ -1,141 +0,0 @@
//
// TrackTableCellView.swift
// Harmony
//
// Created by Kim Wittenburg on 21.01.15.
// Copyright (c) 2015 Das Code Kollektiv. All rights reserved.
//
import Cocoa
import AppKitPlus
/// A table cell view to display information for a `Track`. This class should
/// only be initialized from a nib or storyboard.
public class TrackTableCellView: AdvancedTableCellView {
// MARK: Types
private struct Images {
/// Caches the tick image for track cells so that it does not need to be
/// reloaded every time a cell is configured.
static let tickImage = NSImage(named: "Tick")?.imageByMaskingWithColor(NSColor.clearColor())
/// Caches the gray tick image for track cells so that it does not need to be
/// reloaded every time a cell is configured.
static let grayTickImage = NSImage(named: "Tick")?.imageByMaskingWithColor(NSColor.lightGrayColor())
}
// MARK: Properties
/// An outlet do display the track number. This acts as a secondary label.
/// The text color is automatically adjusted based on the `backgroundStyle`
/// of the receiver.
///
/// Intended to be used as accessory view
@IBOutlet public lazy var trackNumberTextField: NSTextField? = {
let trackNumberTextField = NSTextField()
trackNumberTextField.bordered = false
trackNumberTextField.drawsBackground = false
trackNumberTextField.selectable = false
trackNumberTextField.lineBreakMode = .ByTruncatingTail
trackNumberTextField.font = NSFont.systemFontOfSize(0)
trackNumberTextField.textColor = NSColor.secondaryLabelColor()
trackNumberTextField.translatesAutoresizingMaskIntoConstraints = false
return trackNumberTextField
}()
/// Intended to be used as accessory view.
///
/// This property replaces `imageView`.
@IBOutlet public lazy var savedImageView: NSImageView! = {
let secondaryImageView = NSImageView()
secondaryImageView.imageScaling = .ScaleProportionallyDown
secondaryImageView.translatesAutoresizingMaskIntoConstraints = false
return secondaryImageView
}()
// MARK: Intitializers
override public func setupView() {
leftAccessoryView = trackNumberTextField
super.setupView()
}
// MARK: Overrides
override public var backgroundStyle: NSBackgroundStyle {
get {
return super.backgroundStyle
}
set {
super.backgroundStyle = newValue
let trackNumberCell = self.trackNumberTextField?.cell as? NSTextFieldCell
trackNumberCell?.backgroundStyle = newValue
switch newValue {
case .Light:
trackNumberTextField?.textColor = NSColor.secondaryLabelColor()
case .Dark:
trackNumberTextField?.textColor = NSColor.secondarySelectedControlColor()
default:
break
}
}
}
override public var imageView: NSImageView? {
set {
savedImageView = newValue
}
get {
return savedImageView
}
}
// MARK: Methods
/// Sets up the receiver to display `track`.
public func setupForTrack(track: Track) {
style = track.album.hasSameArtistNameAsTracks ? .Simple : .CompactSubtitle
textField?.stringValue = Preferences.sharedPreferences.useCensoredNames ? track.censoredName : track.name
if track.associatedTracks.isEmpty {
textField?.textColor = NSColor.disabledControlTextColor()
} else if track.associatedTracks.count > 1 || track.associatedTracks[0].name.compare(track.name, options: Preferences.sharedPreferences.caseSensitive ? [] : .CaseInsensitiveSearch, range: nil, locale: nil) != .OrderedSame {
textField?.textColor = NSColor.redColor()
} else {
textField?.textColor = NSColor.controlTextColor()
}
secondaryTextField?.stringValue = track.artistName
trackNumberTextField?.stringValue = "\(track.trackNumber)"
if track.associatedTracks.isEmpty {
imageView?.image = TrackTableCellView.Images.grayTickImage
} else {
imageView?.image = TrackTableCellView.Images.tickImage
}
if track.saved {
let aspectRatioConstraint = NSLayoutConstraint(
item: savedImageView,
attribute: .Width,
relatedBy: .Equal,
toItem: savedImageView,
attribute: .Height,
multiplier: 1,
constant: 0)
let widthConstraint = NSLayoutConstraint(
item: savedImageView,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .Width,
multiplier: 1,
constant: 17)
setRightAccessoryView(savedImageView, withConstraints: [aspectRatioConstraint, widthConstraint])
} else {
rightAccessoryView = nil
}
}
}

View File

@@ -1,915 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="8191" systemVersion="15B38b" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8191"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="TagTunes" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="TagTunes" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="Über TagTunes" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Einstellungen…" keyEquivalent="," id="BOF-NM-1cW">
<connections>
<segue destination="d4o-tN-8wc" kind="show" id="Sol-gW-DTe"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Dienste" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Dienste" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="TagTunes ausblenden" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Andere ausblenden" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Alle einblenden" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="TagTunes beenden" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ablage" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ablage" id="bib-Uj-vzu">
<items>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="Ady-hI-5gd" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="Ady-hI-5gd" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Bearbeiten" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Bearbeiten" id="W48-6f-4Dl">
<items>
<menuItem title="Widerrufen" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="Ady-hI-5gd" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Wiederholen" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="Ady-hI-5gd" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Ausschneiden" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="Ady-hI-5gd" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Kopieren" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="Ady-hI-5gd" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Einsetzen" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="Ady-hI-5gd" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Löschen" id="pa3-QI-u2k">
<string key="keyEquivalent" base64-UTF8="YES">
CA
</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="removeSelectedItems:" target="Ady-hI-5gd" id="Q55-Ch-yfL"/>
</connections>
</menuItem>
<menuItem title="Alles auswählen" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="Ady-hI-5gd" id="VNm-Mi-diN"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ansicht" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ansicht" id="HyV-fh-RgO">
<items>
<menuItem title="Symbolleiste einblenden" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="Ady-hI-5gd" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Symbolleiste anpassen…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="Ady-hI-5gd" id="pQI-g3-MTW"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Fenster" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Fenster" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Im Dock ablegen" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoomen" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Alle nach vorne bringen" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="Ady-hI-5gd" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Hilfe" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Hilfe" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="TagTunes Hilfe" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="TagTunes" customModuleProvider="target"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="-81"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="TagTunes" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="480" height="270"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<toolbar key="toolbar" implicitIdentifier="77DCE6FB-61CD-40EE-B6F9-02081D2DE8BE" autosavesConfiguration="NO" displayMode="iconAndLabel" sizeMode="regular" id="jCk-5k-5x7">
<allowedToolbarItems>
<toolbarItem implicitItemIdentifier="694E800B-64CF-416A-A82D-2E13BB23AEC4" label="Auswahl einfügen" paletteLabel="Auswahl aus iTunes einfügen" tag="-1" image="Note" id="vfK-go-3oR">
<connections>
<action selector="addITunesSelection:" target="Oky-zY-oP4" id="G9h-yp-J9e"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="573468FC-979E-4370-A98C-49CB9C00BE09" label="Speichern" paletteLabel="In iTunes speichern" tag="-1" image="Save" id="ax1-DR-t4v">
<connections>
<action selector="performSave:" target="Oky-zY-oP4" id="9BZ-UY-ffJ"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="0BAA5124-A8B4-49FB-8522-C426773E90C7" label="Cover sichern" paletteLabel="Cover sichern" tag="-1" image="SaveArtwork" id="PKp-tG-6Fu">
<connections>
<action selector="saveArtworks:" target="Oky-zY-oP4" id="Sdk-EP-Qhk"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="E49F1F29-A83B-4580-B02C-D394E2FE36E6" label="Entfernen" paletteLabel="Entfernen" tag="-1" image="Cross" id="Fst-WO-GlQ">
<connections>
<action selector="removeSelectedItems:" target="Oky-zY-oP4" id="Uui-oo-jyX"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" id="Wck-Nn-UcZ"/>
<toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="HCz-XZ-F4F"/>
</allowedToolbarItems>
<defaultToolbarItems>
<toolbarItem reference="vfK-go-3oR"/>
<toolbarItem reference="Wck-Nn-UcZ"/>
<toolbarItem reference="ax1-DR-t4v"/>
<toolbarItem reference="PKp-tG-6Fu"/>
<toolbarItem reference="Wck-Nn-UcZ"/>
<toolbarItem reference="Fst-WO-GlQ"/>
</defaultToolbarItems>
</toolbar>
</window>
<connections>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="250"/>
</scene>
<!--Window Controller-->
<scene sceneID="dU3-ef-E5X">
<objects>
<windowController showSeguePresentationStyle="single" id="d4o-tN-8wc" sceneMemberID="viewController">
<window key="window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="7rU-ut-IAI">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="294" y="362" width="480" height="270"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/>
<connections>
<binding destination="d4o-tN-8wc" name="title" keyPath="window.contentViewController.title" id="Iko-NW-ghs"/>
</connections>
</window>
<connections>
<segue destination="qfM-ma-lyn" kind="relationship" relationship="window.shadowedContentViewController" id="gBt-Dq-ctT"/>
</connections>
</windowController>
<customObject id="qtI-W6-JfI" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-767" y="250"/>
</scene>
<!--Preferences View Controller-->
<scene sceneID="9ZM-fo-zrI">
<objects>
<tabViewController tabStyle="toolbar" id="qfM-ma-lyn" customClass="PreferencesViewController" customModule="AppKitPlus" sceneMemberID="viewController">
<tabViewItems>
<tabViewItem image="NSPreferencesGeneral" id="CfO-ir-iZG"/>
<tabViewItem image="PreferenceStore" id="bd1-kG-znW"/>
<tabViewItem image="PreferenceTags" id="b4Q-Io-OCl"/>
</tabViewItems>
<viewControllerTransitionOptions key="transitionOptions" allowUserInteraction="YES"/>
<tabView key="tabView" type="noTabsNoBorder" id="UTE-Sb-ieY">
<rect key="frame" x="0.0" y="0.0" width="450" height="300"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
<font key="font" metaFont="message"/>
<tabViewItems/>
<connections>
<outlet property="delegate" destination="qfM-ma-lyn" id="IHd-U1-spO"/>
</connections>
</tabView>
<connections>
<segue destination="tzd-4a-CRb" kind="relationship" relationship="tabItems" id="nK1-6z-0uq"/>
<segue destination="eFs-7W-C1H" kind="relationship" relationship="tabItems" id="INP-Yo-Kge"/>
<segue destination="qlM-h3-Tfw" kind="relationship" relationship="tabItems" id="sfW-cu-zoE"/>
</connections>
</tabViewController>
<customObject id="5zh-wl-nwU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-767" y="687"/>
</scene>
<!--Allgemein-->
<scene sceneID="RQU-Wx-xKw">
<objects>
<viewController title="Allgemein" id="tzd-4a-CRb" customClass="GeneralPreferencesViewController" customModule="TagTunes" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="pOc-Vr-IET" customClass="PreferenceView" customModule="AppKitPlus">
<rect key="frame" x="0.0" y="0.0" width="450" height="204"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="kl3-n8-T9b">
<rect key="frame" x="18" y="168" width="184" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Cover automatisch sichern" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="q2l-4t-mL0">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="saveArtworkStateChanged:" target="tzd-4a-CRb" id="qQu-K2-wWk"/>
<binding destination="aSx-iH-PLA" name="value" keyPath="sharedPreferences.saveArtwork" id="Pif-70-Zto"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1fj-p7-sMs">
<rect key="frame" x="320" y="134" width="116" height="32"/>
<animations/>
<buttonCell key="cell" type="push" title="Auswählen…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="A5S-ps-EYW">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="chooseArtworkPath:" target="tzd-4a-CRb" id="v67-Ay-ckG"/>
</connections>
</button>
<pathControl horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" mirrorLayoutDirectionWhenInternationalizing="always" translatesAutoresizingMaskIntoConstraints="NO" id="pT8-NA-x3W">
<rect key="frame" x="20" y="140" width="298" height="22"/>
<animations/>
<pathCell key="cell" selectable="YES" alignment="left" id="Sgq-Mk-WnH">
<font key="font" metaFont="system"/>
<url key="url" string="file:///Applications/"/>
</pathCell>
<connections>
<binding destination="aSx-iH-PLA" name="value" keyPath="sharedPreferences.artworkTarget" id="IIq-Ja-OZl">
<dictionary key="options">
<string key="NSNullPlaceholder">Wählen Sie einen Ordner…</string>
</dictionary>
</binding>
</connections>
</pathControl>
<button translatesAutoresizingMaskIntoConstraints="NO" id="iE4-HP-hS8">
<rect key="frame" x="18" y="116" width="258" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Existierende Bilddateien überschreiben" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="WQN-Bj-me1">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="aSx-iH-PLA" name="value" keyPath="sharedPreferences.overwriteExistingFiles" id="X5P-ch-dPk"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="MSr-08-ucR">
<rect key="frame" x="18" y="96" width="244" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Suchergebnisse eingeblendet lassen" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="uED-ee-Oc7">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="aSx-iH-PLA" name="value" keyPath="sharedPreferences.keepSearchResults" id="52h-XX-KDr"/>
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QNf-Uy-bMT">
<rect key="frame" x="30" y="62" width="338" height="28"/>
<animations/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Wenn ausgewählt, werden Suchergebnisse nicht ausgeblendet, wenn eins ausgewählt wird." id="Lnf-PQ-PX4">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="R6h-LJ-31t">
<rect key="frame" x="18" y="38" width="298" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Gespeicherte Objekte aus der Liste entfernen" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="heo-fa-eoL">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="aSx-iH-PLA" name="value" keyPath="sharedPreferences.removeSavedItems" id="4jF-Yd-im9"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="3Fb-Bt-hfa">
<rect key="frame" x="30" y="18" width="238" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Gespeicherte Alben nicht entfernen" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="yih-Me-SPj">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="aSx-iH-PLA" name="value" keyPath="sharedPreferences.keepSavedAlbums" id="F8U-8C-mw6"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="3Fb-Bt-hfa" firstAttribute="top" secondItem="R6h-LJ-31t" secondAttribute="bottom" constant="6" symbolic="YES" id="6Wr-xS-UbL"/>
<constraint firstItem="iE4-HP-hS8" firstAttribute="top" secondItem="pT8-NA-x3W" secondAttribute="bottom" constant="8" symbolic="YES" id="6bw-if-uzQ"/>
<constraint firstItem="QNf-Uy-bMT" firstAttribute="leading" secondItem="MSr-08-ucR" secondAttribute="leading" constant="12" id="CMf-fg-xwn"/>
<constraint firstItem="1fj-p7-sMs" firstAttribute="baseline" secondItem="pT8-NA-x3W" secondAttribute="baseline" id="Cbb-Md-hLt"/>
<constraint firstItem="1fj-p7-sMs" firstAttribute="leading" secondItem="pT8-NA-x3W" secondAttribute="trailing" constant="8" symbolic="YES" id="EBN-ov-eyz"/>
<constraint firstItem="MSr-08-ucR" firstAttribute="top" secondItem="iE4-HP-hS8" secondAttribute="bottom" constant="6" symbolic="YES" id="JSO-qU-fYO"/>
<constraint firstItem="pT8-NA-x3W" firstAttribute="leading" secondItem="kl3-n8-T9b" secondAttribute="leading" id="RTj-aH-O8R"/>
<constraint firstItem="R6h-LJ-31t" firstAttribute="top" secondItem="QNf-Uy-bMT" secondAttribute="bottom" constant="8" symbolic="YES" id="Tec-W6-UjU"/>
<constraint firstItem="QNf-Uy-bMT" firstAttribute="top" secondItem="MSr-08-ucR" secondAttribute="bottom" constant="8" symbolic="YES" id="VWX-7I-Z3L"/>
<constraint firstItem="R6h-LJ-31t" firstAttribute="leading" secondItem="kl3-n8-T9b" secondAttribute="leading" id="a4y-1P-siP"/>
<constraint firstAttribute="trailing" secondItem="1fj-p7-sMs" secondAttribute="trailing" constant="20" symbolic="YES" id="ePv-QH-p9T"/>
<constraint firstItem="pT8-NA-x3W" firstAttribute="top" secondItem="kl3-n8-T9b" secondAttribute="bottom" constant="8" symbolic="YES" id="hUh-aB-iwg"/>
<constraint firstItem="kl3-n8-T9b" firstAttribute="leading" secondItem="pOc-Vr-IET" secondAttribute="leading" constant="20" symbolic="YES" id="kt7-6h-DFt"/>
<constraint firstItem="3Fb-Bt-hfa" firstAttribute="leading" secondItem="R6h-LJ-31t" secondAttribute="leading" constant="12" id="ld4-dc-YQ1"/>
<constraint firstItem="iE4-HP-hS8" firstAttribute="leading" secondItem="kl3-n8-T9b" secondAttribute="leading" id="mFQ-g8-Z2O"/>
<constraint firstItem="kl3-n8-T9b" firstAttribute="top" secondItem="pOc-Vr-IET" secondAttribute="top" constant="20" symbolic="YES" id="mW3-jS-00k"/>
<constraint firstItem="MSr-08-ucR" firstAttribute="leading" secondItem="kl3-n8-T9b" secondAttribute="leading" id="pIO-CH-97G"/>
</constraints>
<animations/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="width">
<real key="value" value="450"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="height">
<real key="value" value="204"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<connections>
<outlet property="artworkPathControl" destination="pT8-NA-x3W" id="qQf-u8-VJb"/>
<outlet property="chooseArtworkButton" destination="1fj-p7-sMs" id="pA6-5i-JZI"/>
</connections>
</viewController>
<customObject id="RtZ-4O-Pgk" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<customObject id="aSx-iH-PLA" userLabel="Preferences" customClass="PreferencesSingleton" customModule="TagTunes" customModuleProvider="target"/>
</objects>
<point key="canvasLocation" x="-1285" y="1088"/>
</scene>
<!--iTunes Store-->
<scene sceneID="PjF-If-Ni1">
<objects>
<viewController title="iTunes Store" id="eFs-7W-C1H" customClass="StorePreferencesViewController" customModule="TagTunes" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="Xpd-Fo-HYN" customClass="PreferenceView" customModule="AppKitPlus">
<rect key="frame" x="0.0" y="0.0" width="450" height="212"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="HT2-V6-Vrs">
<rect key="frame" x="18" y="54" width="273" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Keine hochauflösenden Cover verwenden" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="pp5-kZ-w5f">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="AI4-XW-81o" name="value" keyPath="sharedPreferences.useLowResolutionArtwork" id="gDP-XP-49T"/>
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ODz-LZ-Acs">
<rect key="frame" x="30" y="20" width="402" height="28"/>
<animations/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" id="NMm-Jw-bon">
<font key="font" metaFont="smallSystem"/>
<string key="title">Diese Option betrifft nur Cover, die in TagTunes angezeigt werden. Beim Speichern wird immer die höchste Auflösung für Cover verwendet.</string>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dA4-F6-y0G">
<rect key="frame" x="227" y="169" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" alignment="left" minValue="1" maxValue="200" doubleValue="1" id="qF2-IP-GuD"/>
<connections>
<binding destination="AI4-XW-81o" name="value" keyPath="sharedPreferences.numberOfSearchResults" id="P28-QL-9dO"/>
</connections>
</stepper>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tZ6-50-jBC">
<rect key="frame" x="18" y="175" width="105" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Suchergebnisse:" id="aTC-x8-iNw">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Fxp-Bf-M0J">
<rect key="frame" x="122" y="172" width="100" height="22"/>
<constraints>
<constraint firstAttribute="width" constant="100" id="Slg-G8-db4"/>
</constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="0F2-h7-a02">
<numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="pJw-0u-LVa">
<real key="minimum" value="1"/>
<real key="maximum" value="200"/>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="AI4-XW-81o" name="value" keyPath="sharedPreferences.numberOfSearchResults" id="XnR-2a-hZe"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="QpH-uA-EUO">
<rect key="frame" x="18" y="147" width="84" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="iTunes Store:" id="M6p-MI-JS7">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k1x-7X-WP5">
<rect key="frame" x="106" y="140" width="105" height="26"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="100" id="FjM-26-Vzy"/>
</constraints>
<animations/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="0ry-cV-J7h">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Snk-Ps-hdB"/>
</popUpButtonCell>
<connections>
<binding destination="eFs-7W-C1H" name="selectedIndex" keyPath="currentITunesStoreIndex" previousBinding="tGj-cU-CGC" id="Hdo-09-3JW"/>
<binding destination="eFs-7W-C1H" name="content" keyPath="iTunesStores" id="tGj-cU-CGC"/>
</connections>
</popUpButton>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gzG-qy-YYr">
<rect key="frame" x="30" y="107" width="402" height="28"/>
<animations/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Manche Songs sind nicht in allen Ländern verfügbar. TagTunes verwendet den iTunes Store des ausgewählten Landes." id="xMj-9f-8N6">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Mtw-lO-h9I">
<rect key="frame" x="138" y="75" width="168" height="26"/>
<animations/>
<popUpButtonCell key="cell" type="push" title="Englisch" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="1" imageScaling="proportionallyDown" inset="2" selectedItem="1wo-cb-tWj" id="wUi-qM-3kU">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="hrO-S2-gum">
<items>
<menuItem title="Wie iTunes Store" id="Y63-oI-goT"/>
<menuItem title="Englisch" state="on" tag="1" id="1wo-cb-tWj"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<binding destination="AI4-XW-81o" name="selectedTag" keyPath="sharedPreferences.useEnglishTags" id="J89-Uj-yog"/>
</connections>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="LdU-fV-yc9">
<rect key="frame" x="18" y="81" width="115" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Sprache der Tags:" id="dxA-BL-XqG">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="Mtw-lO-h9I" firstAttribute="baseline" secondItem="LdU-fV-yc9" secondAttribute="baseline" id="5ft-Rx-T6s"/>
<constraint firstItem="k1x-7X-WP5" firstAttribute="top" secondItem="Fxp-Bf-M0J" secondAttribute="bottom" constant="8" id="7qz-7n-M4x"/>
<constraint firstItem="Fxp-Bf-M0J" firstAttribute="leading" secondItem="tZ6-50-jBC" secondAttribute="trailing" constant="8" symbolic="YES" id="8FR-UJ-8XC"/>
<constraint firstItem="Mtw-lO-h9I" firstAttribute="leading" secondItem="LdU-fV-yc9" secondAttribute="trailing" constant="8" symbolic="YES" id="8YH-x8-DSd"/>
<constraint firstItem="tZ6-50-jBC" firstAttribute="top" secondItem="Xpd-Fo-HYN" secondAttribute="top" constant="20" symbolic="YES" id="8oj-aa-nCm"/>
<constraint firstItem="LdU-fV-yc9" firstAttribute="leading" secondItem="tZ6-50-jBC" secondAttribute="leading" id="CUz-yq-0Fm"/>
<constraint firstItem="Fxp-Bf-M0J" firstAttribute="baseline" secondItem="tZ6-50-jBC" secondAttribute="baseline" id="FX1-xH-vOa"/>
<constraint firstItem="k1x-7X-WP5" firstAttribute="baseline" secondItem="QpH-uA-EUO" secondAttribute="baseline" id="GfC-VO-PQS"/>
<constraint firstItem="Mtw-lO-h9I" firstAttribute="top" secondItem="gzG-qy-YYr" secondAttribute="bottom" constant="8" id="HOh-z8-KD3"/>
<constraint firstAttribute="trailing" secondItem="gzG-qy-YYr" secondAttribute="trailing" constant="20" symbolic="YES" id="HrQ-7O-26V"/>
<constraint firstItem="tZ6-50-jBC" firstAttribute="leading" secondItem="Xpd-Fo-HYN" secondAttribute="leading" constant="20" symbolic="YES" id="L67-ta-ag1"/>
<constraint firstItem="HT2-V6-Vrs" firstAttribute="top" secondItem="Mtw-lO-h9I" secondAttribute="bottom" constant="8" symbolic="YES" id="NAR-TU-FBm"/>
<constraint firstItem="dA4-F6-y0G" firstAttribute="centerY" secondItem="Fxp-Bf-M0J" secondAttribute="centerY" id="QP4-nn-4oz"/>
<constraint firstItem="dA4-F6-y0G" firstAttribute="leading" secondItem="Fxp-Bf-M0J" secondAttribute="trailing" constant="8" symbolic="YES" id="QmR-Np-Qqg"/>
<constraint firstItem="gzG-qy-YYr" firstAttribute="leading" secondItem="QpH-uA-EUO" secondAttribute="leading" constant="12" id="Uym-vB-f2X"/>
<constraint firstItem="ODz-LZ-Acs" firstAttribute="leading" secondItem="HT2-V6-Vrs" secondAttribute="leading" constant="12" id="WuH-9K-Rdb"/>
<constraint firstItem="gzG-qy-YYr" firstAttribute="top" secondItem="k1x-7X-WP5" secondAttribute="bottom" constant="8" symbolic="YES" id="amB-Je-R7A"/>
<constraint firstAttribute="trailing" secondItem="ODz-LZ-Acs" secondAttribute="trailing" constant="20" symbolic="YES" id="cdY-Lu-hG4"/>
<constraint firstItem="QpH-uA-EUO" firstAttribute="leading" secondItem="tZ6-50-jBC" secondAttribute="leading" id="dyb-6z-MWP"/>
<constraint firstItem="HT2-V6-Vrs" firstAttribute="leading" secondItem="tZ6-50-jBC" secondAttribute="leading" id="gtz-u4-bBe"/>
<constraint firstItem="ODz-LZ-Acs" firstAttribute="top" secondItem="HT2-V6-Vrs" secondAttribute="bottom" constant="8" symbolic="YES" id="tlc-yV-nZb"/>
<constraint firstItem="k1x-7X-WP5" firstAttribute="leading" secondItem="QpH-uA-EUO" secondAttribute="trailing" constant="8" symbolic="YES" id="uG3-te-Y6Y"/>
</constraints>
<animations/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="width">
<real key="value" value="450"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="height">
<real key="value" value="212"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</viewController>
<customObject id="8Lt-AO-VZl" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<customObject id="AI4-XW-81o" customClass="PreferencesSingleton" customModule="TagTunes" customModuleProvider="target"/>
</objects>
<point key="canvasLocation" x="-767" y="1092"/>
</scene>
<!--Tags-->
<scene sceneID="oNy-iK-NsG">
<objects>
<viewController title="Tags" id="qlM-h3-Tfw" customClass="TagsPreferencesViewController" customModule="TagTunes" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="caz-ze-bnI" customClass="PreferenceView" customModule="AppKitPlus">
<rect key="frame" x="0.0" y="0.0" width="450" height="365"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="0Za-Q2-FET">
<rect key="frame" x="18" y="329" width="196" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Zensierte Namen verwenden" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="UOJ-Ol-UjW">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="7Ts-a9-Cpv" name="value" keyPath="sharedPreferences.useCensoredNames" id="oYs-AD-vbO">
<dictionary key="options">
<bool key="NSConditionallySetsEnabled" value="NO"/>
</dictionary>
</binding>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="Rru-2X-J52">
<rect key="frame" x="18" y="309" width="286" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Groß- und Kleinschreibung berücksichtigen" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Ttb-GR-JAy">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="7Ts-a9-Cpv" name="value" keyPath="sharedPreferences.caseSensitive" id="lFI-W5-ve4"/>
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wkM-Sb-z0R">
<rect key="frame" x="18" y="213" width="414" height="34"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Manche Tags werden nicht von der iTunes API zur Verfügung gestellt. Diese Tags können nicht gespeichert werden." id="8L8-Nr-zgu">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<scrollView autohidesScrollers="YES" horizontalLineScroll="23" horizontalPageScroll="10" verticalLineScroll="23" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cTv-EP-MQX">
<rect key="frame" x="20" y="20" width="410" height="185"/>
<clipView key="contentView" id="awx-Qa-0a0">
<rect key="frame" x="1" y="1" width="408" height="183"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="21" rowSizeStyle="automatic" viewBased="YES" id="WCb-HH-YPh">
<rect key="frame" x="0.0" y="0.0" width="408" height="183"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="tagColumn" editable="NO" width="292" minWidth="40" maxWidth="1000" id="GgR-1E-8ur">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="QH5-6N-kJ8">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView identifier="textCell" id="Zbr-i2-c1G">
<rect key="frame" x="1" y="1" width="292" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="vww-dF-uIe">
<rect key="frame" x="0.0" y="0.0" width="211" height="17"/>
<animations/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="hxe-jr-7rI">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="vww-dF-uIe" firstAttribute="centerY" secondItem="Zbr-i2-c1G" secondAttribute="centerY" id="GmY-MF-H9J"/>
<constraint firstAttribute="trailing" secondItem="vww-dF-uIe" secondAttribute="trailing" constant="83" id="Zem-p3-9DR"/>
<constraint firstItem="vww-dF-uIe" firstAttribute="leading" secondItem="Zbr-i2-c1G" secondAttribute="leading" constant="2" id="ib0-Lg-5Ts"/>
</constraints>
<animations/>
<connections>
<outlet property="textField" destination="vww-dF-uIe" id="a8W-tw-hGo"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn identifier="savingBehaviorColumn" width="110" minWidth="40" maxWidth="1000" id="IPU-Kp-l3A">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<popUpButtonCell key="dataCell" type="bevel" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="bezel" imageScaling="proportionallyDown" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="1Sz-1n-thR">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="3zQ-Pc-Wgf">
<connections>
<outlet property="delegate" destination="qlM-h3-Tfw" id="dAa-aM-qIx"/>
</connections>
</menu>
</popUpButtonCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<popUpButton identifier="popupCell" id="Cxj-hO-zFk">
<rect key="frame" x="296" y="1" width="110" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<animations/>
<popUpButtonCell key="cell" type="bevel" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" imageScaling="proportionallyDown" inset="2" id="Och-nm-1Kl">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="E1q-CP-zfN"/>
</popUpButtonCell>
<connections>
<action selector="savingBehaviorChanged:" target="qlM-h3-Tfw" id="B4Y-w0-fay"/>
</connections>
</popUpButton>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="qlM-h3-Tfw" id="QYi-UE-Crv"/>
<outlet property="delegate" destination="qlM-h3-Tfw" id="yBy-gW-UJu"/>
</connections>
</tableView>
</subviews>
<animations/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<animations/>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="Q38-Np-JBF">
<rect key="frame" x="1" y="157" width="408" height="16"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="255-EG-UwP">
<rect key="frame" x="-15" y="17" width="16" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
</scroller>
</scrollView>
<button translatesAutoresizingMaskIntoConstraints="NO" id="TQ1-zY-V5i">
<rect key="frame" x="18" y="289" width="109" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Cover löschen" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Upq-Aq-AbA">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="7Ts-a9-Cpv" name="value" keyPath="sharedPreferences.clearArtworks" id="bmf-Jz-MbE"/>
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="SC1-rF-IBT">
<rect key="frame" x="30" y="255" width="402" height="28"/>
<animations/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Wenn aktiviert, löscht TagTunes beim Speichern das aktuelle Cover aus iTunes." id="Wg2-d3-xkK">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="Rru-2X-J52" firstAttribute="leading" secondItem="0Za-Q2-FET" secondAttribute="leading" id="3LQ-xG-Kah"/>
<constraint firstItem="0Za-Q2-FET" firstAttribute="top" secondItem="caz-ze-bnI" secondAttribute="top" constant="20" symbolic="YES" id="4hi-D6-aIL"/>
<constraint firstItem="cTv-EP-MQX" firstAttribute="leading" secondItem="caz-ze-bnI" secondAttribute="leading" constant="20" symbolic="YES" id="7Ck-cS-n92"/>
<constraint firstAttribute="bottom" secondItem="cTv-EP-MQX" secondAttribute="bottom" constant="20" symbolic="YES" id="Lvm-eR-ruw"/>
<constraint firstAttribute="trailing" secondItem="wkM-Sb-z0R" secondAttribute="trailing" constant="20" symbolic="YES" id="PzL-bB-J8O"/>
<constraint firstItem="SC1-rF-IBT" firstAttribute="top" secondItem="TQ1-zY-V5i" secondAttribute="bottom" constant="8" symbolic="YES" id="TJe-Ve-c8M"/>
<constraint firstItem="SC1-rF-IBT" firstAttribute="leading" secondItem="TQ1-zY-V5i" secondAttribute="leading" constant="12" id="XLc-jZ-y2v"/>
<constraint firstAttribute="trailing" secondItem="SC1-rF-IBT" secondAttribute="trailing" constant="20" symbolic="YES" id="YB7-zz-FUJ"/>
<constraint firstItem="0Za-Q2-FET" firstAttribute="leading" secondItem="wkM-Sb-z0R" secondAttribute="leading" id="bGY-79-Gc5"/>
<constraint firstItem="cTv-EP-MQX" firstAttribute="top" secondItem="wkM-Sb-z0R" secondAttribute="bottom" constant="8" symbolic="YES" id="cWo-Xz-1Al"/>
<constraint firstAttribute="trailing" secondItem="cTv-EP-MQX" secondAttribute="trailing" constant="20" symbolic="YES" id="dMs-jm-ikl"/>
<constraint firstItem="TQ1-zY-V5i" firstAttribute="top" secondItem="Rru-2X-J52" secondAttribute="bottom" constant="6" symbolic="YES" id="i7K-Hi-0SC"/>
<constraint firstItem="wkM-Sb-z0R" firstAttribute="top" secondItem="SC1-rF-IBT" secondAttribute="bottom" constant="8" symbolic="YES" id="nio-Qc-p1E"/>
<constraint firstItem="Rru-2X-J52" firstAttribute="top" secondItem="0Za-Q2-FET" secondAttribute="bottom" constant="6" symbolic="YES" id="w50-BO-5gG"/>
<constraint firstItem="TQ1-zY-V5i" firstAttribute="leading" secondItem="caz-ze-bnI" secondAttribute="leading" constant="20" symbolic="YES" id="yFD-W0-CuJ"/>
<constraint firstItem="0Za-Q2-FET" firstAttribute="leading" secondItem="caz-ze-bnI" secondAttribute="leading" constant="20" symbolic="YES" id="zoK-yx-jUT"/>
</constraints>
<animations/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="width">
<real key="value" value="450"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="height">
<real key="value" value="365"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<connections>
<outlet property="tableView" destination="WCb-HH-YPh" id="Jje-KL-XOf"/>
</connections>
</viewController>
<customObject id="w7s-ZN-87L" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<customObject id="7Ts-a9-Cpv" userLabel="Preferences" customClass="PreferencesSingleton" customModule="TagTunes" customModuleProvider="target"/>
</objects>
<point key="canvasLocation" x="-248" y="1168.5"/>
</scene>
<!--Main View Controller-->
<scene sceneID="hIz-AP-VOD">
<objects>
<viewController id="XfG-lQ-9wD" customClass="MainViewController" customModule="TagTunes" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="m2S-Jp-Qdl">
<rect key="frame" x="0.0" y="0.0" width="692" height="390"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<searchField wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="JF0-Xb-DqY">
<rect key="frame" x="20" y="348" width="652" height="22"/>
<animations/>
<searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" usesSingleLineMode="YES" bezelStyle="round" sendsWholeSearchString="YES" id="iQi-K0-yFr">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</searchFieldCell>
<connections>
<action selector="performSearch:" target="XfG-lQ-9wD" id="zNC-V3-DNP"/>
</connections>
</searchField>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zXR-px-hjg">
<rect key="frame" x="20" y="20" width="652" height="320"/>
<clipView key="contentView" id="CyK-XI-Ggy">
<rect key="frame" x="1" y="1" width="650" height="318"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="p3C-E5-sdk" id="1Vy-Gq-TWU">
<rect key="frame" x="0.0" y="0.0" width="650" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="647" minWidth="40" maxWidth="10000" id="p3C-E5-sdk">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="D7Q-Pc-p9W">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="XfG-lQ-9wD" id="z99-eh-ktB"/>
<outlet property="delegate" destination="XfG-lQ-9wD" id="a5p-EA-EBG"/>
</connections>
</outlineView>
</subviews>
<animations/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<animations/>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="vEh-oN-xXy">
<rect key="frame" x="1" y="303" width="650" height="16"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="iqM-dh-v73">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="zXR-px-hjg" firstAttribute="leading" secondItem="JF0-Xb-DqY" secondAttribute="leading" id="7Ue-RX-gnl"/>
<constraint firstAttribute="trailing" secondItem="JF0-Xb-DqY" secondAttribute="trailing" constant="20" symbolic="YES" id="KHs-FT-bYo"/>
<constraint firstAttribute="bottom" secondItem="zXR-px-hjg" secondAttribute="bottom" constant="20" symbolic="YES" id="QjD-YK-8tD"/>
<constraint firstItem="JF0-Xb-DqY" firstAttribute="leading" secondItem="m2S-Jp-Qdl" secondAttribute="leading" constant="20" symbolic="YES" id="aNE-yT-Pj9"/>
<constraint firstItem="JF0-Xb-DqY" firstAttribute="top" secondItem="m2S-Jp-Qdl" secondAttribute="top" constant="20" symbolic="YES" id="l3D-mn-F0D"/>
<constraint firstItem="zXR-px-hjg" firstAttribute="top" secondItem="JF0-Xb-DqY" secondAttribute="bottom" constant="8" symbolic="YES" id="pKp-Ad-Sr5"/>
<constraint firstItem="zXR-px-hjg" firstAttribute="trailing" secondItem="JF0-Xb-DqY" secondAttribute="trailing" id="r36-CQ-K22"/>
</constraints>
<animations/>
</view>
<connections>
<outlet property="outlineView" destination="1Vy-Gq-TWU" id="vRG-b2-ocW"/>
</connections>
</viewController>
<customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="715"/>
</scene>
</scenes>
<resources>
<image name="Cross" width="1024" height="1024"/>
<image name="NSPreferencesGeneral" width="32" height="32"/>
<image name="Note" width="1024" height="1024"/>
<image name="PreferenceStore" width="32" height="32"/>
<image name="PreferenceTags" width="730" height="730"/>
<image name="Save" width="1024" height="1024"/>
<image name="SaveArtwork" width="1024" height="1024"/>
</resources>
</document>