// // ElisPropertyTableController.m // Elis Colors // // Created by 柳 on 09/09/15. // Copyright 2009 __MyCompanyName__. All rights reserved. // #import "ElisPropertyTableController.h" @implementation ElisPropertyTableController - (void)awakeFromNib { effects = [[NSMutableArray alloc] init]; propertyNames = [[NSMutableArray alloc] init]; valueNames = [[NSMutableArray alloc] init]; } - (void)createPropertyTable:(ElisLayer*)layer { interestLayer = layer; [effects removeAllObjects]; [propertyNames removeAllObjects]; [valueNames removeAllObjects]; [layer createPropertyTableDataSource:effects property:propertyNames value:valueNames]; } - (int)numberOfRowsInTableView:(NSTableView*)aTableView { return [effects count]; } - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn*)aTableColumn row:(int)rowIndex { NSPoint p; NSString* propertyName = [propertyNames objectAtIndex:rowIndex]; QTTime localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime]; // スライダーのカラム if([[aTableColumn identifier] isEqualToString:@"slider"]){ if([propertyName isEqualToString:@"Position X"]){ p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime]; return [NSNumber numberWithFloat:0.5 + (float)p.x/(2.0*ProjectMovieSize.size.width)]; } else if([propertyName isEqualToString:@"Position Y"]){ p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime]; return [NSNumber numberWithFloat:0.5 + (float)p.y/(2.0*ProjectMovieSize.size.height)]; } else { return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex] getEffectValue:[valueNames objectAtIndex:rowIndex] forTime:localCurrentTime]]; } } // 数字を表示するラベルのカラム if([[aTableColumn identifier] isEqualToString:@"number"]){ if([propertyName isEqualToString:@"Position X"]){ p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime]; return [NSNumber numberWithFloat:p.x]; } else if([propertyName isEqualToString:@"Position Y"]){ p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime]; return [NSNumber numberWithFloat:p.y]; } else { return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex] getEffectTrueValue:[valueNames objectAtIndex:rowIndex] forTime:localCurrentTime]]; } } // 項目名のカラム return propertyName; } // slider cellの変更通知を受け取るところ。一括処理。 - (IBAction)sliderChanged:(id)sender { NSString* propertyName; QTTime localCurrentTime; float x, y; int i = [_propertyView selectedRow]; NSString* name = [propertyNames objectAtIndex:i]; if(recording) localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime]; else localCurrentTime = QTZeroTime; if([name isEqualToString:@"Position X"]){ // p = [[effects objectAtIndex:i] getPositionForTime:localCurrentTime]; x = [sender floatValue] * 2.0 * ProjectMovieSize.size.width - ProjectMovieSize.size.width; // [[effects objectAtIndex:i] setPosition:p forTime:localCurrentTime]; [[effects objectAtIndex:i] setPositionX:x forTime:localCurrentTime]; } else if([name isEqualToString:@"Position Y"]){ // p = [[effects objectAtIndex:i] getPositionForTime:localCurrentTime]; y = [sender floatValue] * 2.0 * ProjectMovieSize.size.height - ProjectMovieSize.size.height; [[effects objectAtIndex:i] setPositionY:y forTime:localCurrentTime]; } else { [[effects objectAtIndex:i] setEffectValueForTime:[valueNames objectAtIndex:i] value:[sender floatValue] time:localCurrentTime]; } [_mainController refresh]; [_timeLineController updateKeyframeLayer]; // [_propertyView reloadData]; } - (void)reload { [_propertyView reloadData]; } - (float)getSelectedValueForTime:(float)time { // QTTime now = QTMakeTime(time*DEFAULT_FPS/timeLineScale, DEFAULT_FPS); QTTime now = [interestLayer plusOffsetTime:QTMakeTime(time*DEFAULT_FPS/timeLineScale, DEFAULT_FPS)]; // int _rowIndex = [_propertyView selectedRow]; NSPoint p; if([[propertyNames objectAtIndex:_rowIndex] isEqualToString:@"Position X"]){ p = [[effects objectAtIndex:_rowIndex] getPositionForTime:now]; return 0.5 + (float)p.x/(2.0*ProjectMovieSize.size.width); } if([[propertyNames objectAtIndex:_rowIndex] isEqualToString:@"Position Y"]){ p = [[effects objectAtIndex:_rowIndex] getPositionForTime:now]; return 0.5 + (float)p.y/(2.0*ProjectMovieSize.size.height); } return [[effects objectAtIndex:_rowIndex] getEffectValue:[valueNames objectAtIndex:_rowIndex] forTime:now]; } - (BOOL)isSelected { return [_propertyView selectedRow] != -1; } -(BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex { _rowIndex = rowIndex; [_timeLineController updateKeyframeLayer]; return YES; } - (void)removeAllKeyframe { int index = [_propertyView selectedRow]; if(interestLayer){ if(index == 0) [interestLayer removePositionXKeyframe]; else if(index == 1) [interestLayer removePositionYKerframe]; else if(index == -1) return; else { [[effects objectAtIndex:index] removeKeyframe:[valueNames objectAtIndex:index]]; } [_timeLineController updateKeyframeLayer]; } } - (void)removeEffect { int index = [_propertyView selectedRow]; if(interestLayer){ if(index <= 2) return; [interestLayer removeEffect:[effects objectAtIndex:index]]; [self createPropertyTable:interestLayer]; [self reload]; [_timeLineController updateKeyframeLayer]; } } @end