MacOSX/VLC_app: Better naming scheme for the different UI elements.
[vlc.git] / extras / MacOSX / VLC_app / Sources / VLCAppBindings.m
1 /*****************************************************************************
2  * VLCAppBindings.m: Helpful addition code related to bindings uses
3  *****************************************************************************
4  * Copyright (C) 2007 Pierre d'Herbemont
5  * Copyright (C) 2007 the VideoLAN team
6  * $Id$
7  *
8  * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #import "VLCAppBindings.h"
26
27 /* This is globally a big hack to ease binding uses */
28
29
30 /******************************************************************************
31  * VLCMediaDiscoverer (CategoriesListBindings)
32  */
33 @implementation VLCMediaDiscoverer (CategoriesListBindings)
34 +(void)initialize
35 {
36     [VLCMediaDiscoverer setKeys:[NSArray arrayWithObject:@"running"] triggerChangeNotificationsForDependentKey:@"currentlyFetchingItems"];
37 }
38
39 + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
40 {
41     /* Thanks to Julien Robert, we'll have some nice auto triggered KVO event from here */
42     static NSDictionary * dict = nil;
43     if( !dict )
44     {
45         dict = [[NSDictionary dictionaryWithObjectsAndKeys:
46             [NSSet setWithObject:@"discoveredMedia.flatAspect"], @"childrenInCategoriesListForDetailView",
47             nil] retain];
48     }
49     return [dict objectForKey: key];
50 }
51
52 /* General shortcuts */
53 - (BOOL)currentlyFetchingItems
54 {
55     return [self isRunning];
56 }
57 - (NSImage *)image
58 {
59     static NSImage * sdImage = nil;
60     if( !sdImage )
61         sdImage = [[NSImage imageNamed:@"applications-internet.png"] retain];
62     return sdImage;
63 }
64
65 /* CategoriesList specific bindings */
66 - (NSArray *)childrenInCategoriesList
67 {
68     return nil;
69 }
70 - (NSString *)descriptionInCategoriesList
71 {
72     return [self localizedName];
73 }
74 - (VLCMediaListAspect *)childrenInCategoriesListForDetailView
75 {
76     return [[self discoveredMedia] flatAspect];
77 }
78 - (BOOL)editableInCategoriesList
79 {
80     return NO;
81 }
82 - (BOOL)selectableInCategoriesList
83 {
84     return YES;
85 }
86
87 /* VideoView specific bindings */
88 - (NSArray *)childrenInVideoView
89 {
90     return [[[self discoveredMedia] flatAspect] valueForKeyPath:@"media"];
91 }
92
93 - (NSString *)descriptionInVideoView
94 {
95     return [self localizedName];
96 }
97 - (BOOL)isLeaf
98 {
99     return YES;
100 }
101
102 @end
103
104 /******************************************************************************
105  * VLCMedia (VLCAppBindings)
106  */
107 @implementation VLCMedia (VLCAppBindings)
108
109 + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
110 {
111     /* Thanks to Julien Robert, we'll have some nice auto triggered KVO event from here */
112     static NSDictionary * dict = nil;
113     if( !dict )
114     {
115         dict = [[NSDictionary dictionaryWithObjectsAndKeys:
116             [NSSet setWithObject:@"subitems.hierarchicalNodeAspect.media"], @"childrenInCategoriesList",
117             [NSSet setWithObject:@"metaDictionary.title"], @"descriptionInCategoriesList",
118             [NSSet setWithObject:@"subitems.flatAspect"], @"childrenInCategoriesListForDetailView",
119             [NSSet setWithObject:@"metaDictionary.title"], @"descriptionInVideoView",
120             [NSSet setWithObject:@"state"], @"stateAsImage",
121             nil] retain];
122     }
123     return [dict objectForKey: key];
124 }
125
126 /* CategoriesList specific bindings */
127 - (NSArray *)childrenInCategoriesList
128 {
129     return [[[self subitems] hierarchicalNodeAspect] valueForKeyPath:@"media"];
130 }
131 - (void)setDescriptionInCategoriesList:(NSString *)description
132 {
133     NSLog(@"unimplemented: meta edition");
134 }
135 - (NSString *)descriptionInCategoriesList
136 {
137     return [[self metaDictionary] objectForKey:@"title"];
138 }
139 - (VLCMediaListAspect *)childrenInCategoriesListForDetailView
140 {
141     return [[self subitems] flatAspect];
142 }
143 - (BOOL)editableInCategoriesList
144 {
145     return YES;
146 }
147 - (BOOL)selectableInCategoriesList
148 {
149     return YES;
150 }
151 - (BOOL)currentlyFetchingItems
152 {
153     return NO;
154 }
155 - (NSImage *)image
156 {
157     static NSImage * playlistImage = nil;
158     if( !playlistImage )
159         playlistImage = [[NSImage imageNamed:@"type_playlist.png"] retain];
160     return playlistImage;
161 }
162
163 /* VideoView specific bindings */
164 - (NSArray *)childrenInVideoView
165 {
166     return [[[self subitems] flatAspect] valueForKeyPath:@"media"];
167 }
168 - (NSString *)descriptionInVideoView
169 {
170     return [[self metaDictionary] objectForKey:@"title"];
171 }
172
173 /* mediaListView specific bindings */
174 - (NSImage *)stateAsImage
175 {
176     static NSImage * playing = nil;
177     static NSImage * error = nil;
178
179     if(!playing)
180         playing = [[NSImage imageNamed:@"volume_high.png"] retain];
181     if(!error)
182         error = [[NSImage imageNamed:@"dialog-error.png"] retain];
183
184     if( [self state] == VLCMediaStatePlaying )
185         return playing;
186     else if( [self state] == VLCMediaStateBuffering )
187         return playing;
188     else if( [self state] == VLCMediaStateError )
189         return error;
190
191     return nil;
192 }
193 @end
194
195 @implementation VLCMediaPlayer (VLCAppBindings)
196 + (void)initialize
197 {
198     [self setKeys:[NSArray arrayWithObjects:@"playing", @"media", nil] triggerChangeNotificationsForDependentKey:@"description"];
199 }
200
201 - (NSString *)description
202 {
203     if([self media])
204         return [self valueForKeyPath:@"media.metaDictionary.title"];
205     else
206         return @"VLC Media Player";
207 }
208 @end