OSDN Git Service

open
[eliscolors/main.git] / ElisPropertyTableController.m
1 //  Copyright (c) 2009 Yanagi Asakura
2 //
3 //  This software is provided 'as-is', without any express or implied
4 //  warranty. In no event will the authors be held liable for any damages
5 //  arising from the use of this software.
6 //
7 //  Permission is granted to anyone to use this software for any purpose,
8 //  including commercial applications, and to alter it and redistribute it
9 //  freely, subject to the following restrictions:
10 //
11 //  1. The origin of this software must not be misrepresented; you must not
12 //  claim that you wrote the original software. If you use this software
13 //  in a product, an acknowledgment in the product documentation would be
14 //  appreciated but is not required.
15 //
16 //  2. Altered source versions must be plainly marked as such, and must not be
17 //  misrepresented as being the original software.
18 //
19 //  3. This notice may not be removed or altered from any source
20 //  distribution.
21
22 //
23 //  ElisPropertyTableController.m
24 //  Elis Colors
25 //
26 //  Created by 柳 on 09/09/15.
27 //  Copyright 2009 __MyCompanyName__. All rights reserved.
28 //
29
30 #import "ElisPropertyTableController.h"
31
32
33 @implementation ElisPropertyTableController
34
35 - (void)awakeFromNib
36 {
37     effects = [[NSMutableArray alloc] init];
38     propertyNames = [[NSMutableArray alloc] init];
39     valueNames = [[NSMutableArray alloc] init];
40 }
41
42 - (void)createPropertyTable:(ElisLayer*)layer
43 {
44     interestLayer = layer;
45     
46     [effects removeAllObjects];
47     [propertyNames removeAllObjects];
48     [valueNames removeAllObjects];
49     
50     [layer createPropertyTableDataSource:effects property:propertyNames value:valueNames];
51 }
52
53 - (int)numberOfRowsInTableView:(NSTableView*)aTableView
54 {
55     return [effects count];
56 }
57
58 - (id)tableView:(NSTableView *)tableView 
59         objectValueForTableColumn:(NSTableColumn*)aTableColumn
60         row:(int)rowIndex
61 {
62     NSPoint p;
63     NSString* propertyName = [propertyNames objectAtIndex:rowIndex];
64     QTTime localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
65     
66     // スライダーのカラム
67     if([[aTableColumn identifier] isEqualToString:@"slider"]){
68         if([propertyName isEqualToString:@"Position X"]){
69             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
70             return [NSNumber numberWithFloat:0.5 + (float)p.x/(2.0*ProjectMovieSize.size.width)];
71         } else if([propertyName isEqualToString:@"Position Y"]){
72             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
73             return [NSNumber numberWithFloat:0.5 + (float)p.y/(2.0*ProjectMovieSize.size.height)];
74         } else {
75             return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex] 
76                                               getEffectValue:[valueNames objectAtIndex:rowIndex] 
77                                               forTime:localCurrentTime]];
78         }
79     }        
80
81     // 数字を表示するラベルのカラム
82     if([[aTableColumn identifier] isEqualToString:@"number"]){
83         if([propertyName isEqualToString:@"Position X"]){
84             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
85             return [NSNumber numberWithFloat:p.x];
86         } else if([propertyName isEqualToString:@"Position Y"]){
87             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
88             return [NSNumber numberWithFloat:p.y];
89         } else {
90             return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex]
91                                               getEffectTrueValue:[valueNames objectAtIndex:rowIndex]
92                                               forTime:localCurrentTime]];
93         }
94     }
95     
96     // 項目名のカラム
97     return propertyName;
98 }
99
100 // slider cellの変更通知を受け取るところ。一括処理。
101 - (IBAction)sliderChanged:(id)sender
102 {
103     NSString* propertyName;
104     QTTime localCurrentTime;
105     float x, y;
106     int i = [_propertyView selectedRow];
107     NSString* name = [propertyNames objectAtIndex:i];
108     
109     if(recording)
110         localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
111     else 
112         localCurrentTime = QTZeroTime;
113
114     
115     if([name isEqualToString:@"Position X"]){
116 //        p = [[effects objectAtIndex:i] getPositionForTime:localCurrentTime];
117         x = [sender floatValue] * 2.0 * ProjectMovieSize.size.width - ProjectMovieSize.size.width;
118 //        [[effects objectAtIndex:i] setPosition:p forTime:localCurrentTime];
119         [[effects objectAtIndex:i] setPositionX:x forTime:localCurrentTime];
120     } else if([name isEqualToString:@"Position Y"]){
121 //        p = [[effects objectAtIndex:i] getPositionForTime:localCurrentTime];
122         y = [sender floatValue] * 2.0 * ProjectMovieSize.size.height - ProjectMovieSize.size.height;
123         [[effects objectAtIndex:i] setPositionY:y forTime:localCurrentTime];
124     } else {
125         [[effects objectAtIndex:i] setEffectValueForTime:[valueNames objectAtIndex:i] 
126                                                    value:[sender floatValue] time:localCurrentTime];
127     }
128     
129     [_mainController refresh];
130     [_timeLineController updateKeyframeLayer];
131 //    [_propertyView reloadData];
132 }
133
134 - (void)reload
135 {
136     [_propertyView reloadData];
137 }
138
139 - (float)getSelectedValueForTime:(float)time
140 {
141 //    QTTime now = QTMakeTime(time*DEFAULT_FPS/timeLineScale, DEFAULT_FPS);
142     QTTime now = [interestLayer plusOffsetTime:QTMakeTime(time*DEFAULT_FPS/timeLineScale, DEFAULT_FPS)];
143 //    int _rowIndex = [_propertyView selectedRow];
144     NSPoint p;
145
146     if([[propertyNames objectAtIndex:_rowIndex] isEqualToString:@"Position X"]){
147         p = [[effects objectAtIndex:_rowIndex] getPositionForTime:now];
148         return 0.5 + (float)p.x/(2.0*ProjectMovieSize.size.width);
149     }
150
151     if([[propertyNames objectAtIndex:_rowIndex] isEqualToString:@"Position Y"]){
152         p = [[effects objectAtIndex:_rowIndex] getPositionForTime:now];
153         return 0.5 + (float)p.y/(2.0*ProjectMovieSize.size.height);
154     }
155     
156     return [[effects objectAtIndex:_rowIndex] getEffectValue:[valueNames objectAtIndex:_rowIndex] forTime:now];
157 }
158
159 - (BOOL)isSelected
160 {
161     return [_propertyView selectedRow] != -1;
162 }
163
164
165 -(BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex
166 {
167     _rowIndex = rowIndex;
168     [_timeLineController updateKeyframeLayer];
169     if(interestLayer) [_undoManager pushOperation:interestLayer];
170     return YES;
171 }
172
173 - (void)removeAllKeyframe
174 {
175     int index = [_propertyView selectedRow];
176
177     if(interestLayer){
178         [_undoManager pushOperation:interestLayer];
179         if(index == 0)
180             [interestLayer removePositionXKeyframe];
181         else if(index == 1)
182             [interestLayer removePositionYKerframe];
183         else if(index == -1)
184             return;
185         else {
186             [[effects objectAtIndex:index] removeKeyframe:[valueNames objectAtIndex:index]];
187         }
188         [_timeLineController updateKeyframeLayer];
189     }
190 }
191
192 - (void)removeEffect
193 {
194     int index = [_propertyView selectedRow];
195     
196     if(interestLayer){
197         [_undoManager pushOperation:interestLayer];
198         if(index <= 2) return;
199         [interestLayer removeEffect:[effects objectAtIndex:index]];
200         [self createPropertyTable:interestLayer];
201         [self reload];
202         [_timeLineController updateKeyframeLayer];
203     }
204 }
205
206 - (BOOL)canRemoveAllKeyframe
207 {
208     return [_propertyView selectedRow] > 2;
209 }
210
211 - (BOOL)canRemoveEffect
212 {
213     return [_propertyView selectedRow] >= 5;
214 }
215
216 - (void)selectDefault
217 {
218     _rowIndex = 0;
219 }
220
221 - (void)tableViewSelectionIsChanging:(NSNotification*)n
222 {
223
224 }
225
226 - (void)controlTextDidEndEditing:(NSNotification*)n
227 {
228     int rowIndex = [_propertyView selectedRow];
229     float x, y;
230     NSString* name = [propertyNames objectAtIndex:rowIndex];
231     QTTime localCurrentTime;
232     float value = [[n object] floatValue];
233     
234     if(recording)
235         localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
236     else 
237         localCurrentTime = QTZeroTime;
238     
239     if([name isEqualToString:@"Position X"]){
240 //        x = [sender floatValue] * 2.0 * ProjectMovieSize.size.width - ProjectMovieSize.size.width;
241         [[effects objectAtIndex:rowIndex] setPositionX:value forTime:localCurrentTime];
242     } else if([name isEqualToString:@"Position Y"]){
243 //        y = [sender floatValue] * 2.0 * ProjectMovieSize.size.height - ProjectMovieSize.size.height;
244         [[effects objectAtIndex:rowIndex] setPositionY:value forTime:localCurrentTime];
245     } else {
246         [[effects objectAtIndex:rowIndex] setEffectTrueValueForTime:[valueNames objectAtIndex:rowIndex] 
247                                                               value:value time:localCurrentTime];
248     }
249     [self reload];
250     [_mainController refresh];
251 }
252
253 @end