1 // Copyright (c) 2009 Yanagi Asakura
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.
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:
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.
16 // 2. Altered source versions must be plainly marked as such, and must not be
17 // misrepresented as being the original software.
19 // 3. This notice may not be removed or altered from any source
23 // ElisPropertyTableController.m
26 // Created by 柳 on 09/09/15.
27 // Copyright 2009 __MyCompanyName__. All rights reserved.
30 #import "ElisPropertyTableController.h"
33 @implementation ElisPropertyTableController
37 effects = [[NSMutableArray alloc] init];
38 propertyNames = [[NSMutableArray alloc] init];
39 valueNames = [[NSMutableArray alloc] init];
42 - (void)createPropertyTable:(ElisLayer*)layer
44 interestLayer = layer;
46 [effects removeAllObjects];
47 [propertyNames removeAllObjects];
48 [valueNames removeAllObjects];
50 [layer createPropertyTableDataSource:effects property:propertyNames value:valueNames];
53 - (int)numberOfRowsInTableView:(NSTableView*)aTableView
55 return [effects count];
58 - (id)tableView:(NSTableView *)tableView
59 objectValueForTableColumn:(NSTableColumn*)aTableColumn
63 NSString* propertyName = [propertyNames objectAtIndex:rowIndex];
64 QTTime localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
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)];
75 return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex]
76 getEffectValue:[valueNames objectAtIndex:rowIndex]
77 forTime:localCurrentTime]];
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];
90 return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex]
91 getEffectTrueValue:[valueNames objectAtIndex:rowIndex]
92 forTime:localCurrentTime]];
100 // slider cellの変更通知を受け取るところ。一括処理。
101 - (IBAction)sliderChanged:(id)sender
103 NSString* propertyName;
104 QTTime localCurrentTime;
106 int i = [_propertyView selectedRow];
107 NSString* name = [propertyNames objectAtIndex:i];
110 localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
112 localCurrentTime = QTZeroTime;
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];
125 [[effects objectAtIndex:i] setEffectValueForTime:[valueNames objectAtIndex:i]
126 value:[sender floatValue] time:localCurrentTime];
129 [_mainController refresh];
130 [_timeLineController updateKeyframeLayer];
131 // [_propertyView reloadData];
136 [_propertyView reloadData];
139 - (float)getSelectedValueForTime:(float)time
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];
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);
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);
156 return [[effects objectAtIndex:_rowIndex] getEffectValue:[valueNames objectAtIndex:_rowIndex] forTime:now];
161 return [_propertyView selectedRow] != -1;
165 -(BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex
167 _rowIndex = rowIndex;
168 [_timeLineController updateKeyframeLayer];
169 if(interestLayer) [_undoManager pushOperation:interestLayer];
173 - (void)removeAllKeyframe
175 int index = [_propertyView selectedRow];
178 [_undoManager pushOperation:interestLayer];
180 [interestLayer removePositionXKeyframe];
182 [interestLayer removePositionYKerframe];
186 [[effects objectAtIndex:index] removeKeyframe:[valueNames objectAtIndex:index]];
188 [_timeLineController updateKeyframeLayer];
194 int index = [_propertyView selectedRow];
197 [_undoManager pushOperation:interestLayer];
198 if(index <= 2) return;
199 [interestLayer removeEffect:[effects objectAtIndex:index]];
200 [self createPropertyTable:interestLayer];
202 [_timeLineController updateKeyframeLayer];
206 - (BOOL)canRemoveAllKeyframe
208 return [_propertyView selectedRow] > 2;
211 - (BOOL)canRemoveEffect
213 return [_propertyView selectedRow] >= 5;
216 - (void)selectDefault
221 - (void)tableViewSelectionIsChanging:(NSNotification*)n
226 - (void)controlTextDidEndEditing:(NSNotification*)n
228 int rowIndex = [_propertyView selectedRow];
230 NSString* name = [propertyNames objectAtIndex:rowIndex];
231 QTTime localCurrentTime;
232 float value = [[n object] floatValue];
235 localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
237 localCurrentTime = QTZeroTime;
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];
246 [[effects objectAtIndex:rowIndex] setEffectTrueValueForTime:[valueNames objectAtIndex:rowIndex]
247 value:value time:localCurrentTime];
250 [_mainController refresh];