OSDN Git Service

first commit
[eliscolors/main.git] / ElisPropertyTableController.m
1 //
2 //  ElisPropertyTableController.m
3 //  Elis Colors
4 //
5 //  Created by 柳 on 09/09/15.
6 //  Copyright 2009 __MyCompanyName__. All rights reserved.
7 //
8
9 #import "ElisPropertyTableController.h"
10
11
12 @implementation ElisPropertyTableController
13
14 - (void)awakeFromNib
15 {
16     effects = [[NSMutableArray alloc] init];
17     propertyNames = [[NSMutableArray alloc] init];
18     valueNames = [[NSMutableArray alloc] init];
19 }
20
21 - (void)createPropertyTable:(ElisLayer*)layer
22 {
23     interestLayer = layer;
24     
25     [effects removeAllObjects];
26     [propertyNames removeAllObjects];
27     [valueNames removeAllObjects];
28     
29     [layer createPropertyTableDataSource:effects property:propertyNames value:valueNames];
30 }
31
32 - (int)numberOfRowsInTableView:(NSTableView*)aTableView
33 {
34     return [effects count];
35 }
36
37 - (id)tableView:(NSTableView *)tableView 
38         objectValueForTableColumn:(NSTableColumn*)aTableColumn
39         row:(int)rowIndex
40 {
41     NSPoint p;
42     NSString* propertyName = [propertyNames objectAtIndex:rowIndex];
43     QTTime localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
44     
45     // スライダーのカラム
46     if([[aTableColumn identifier] isEqualToString:@"slider"]){
47         if([propertyName isEqualToString:@"Position X"]){
48             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
49             return [NSNumber numberWithFloat:0.5 + (float)p.x/(2.0*ProjectMovieSize.size.width)];
50         } else if([propertyName isEqualToString:@"Position Y"]){
51             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
52             return [NSNumber numberWithFloat:0.5 + (float)p.y/(2.0*ProjectMovieSize.size.height)];
53         } else {
54             return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex] 
55                                               getEffectValue:[valueNames objectAtIndex:rowIndex] 
56                                               forTime:localCurrentTime]];
57         }
58     }        
59
60     // 数字を表示するラベルのカラム
61     if([[aTableColumn identifier] isEqualToString:@"number"]){
62         if([propertyName isEqualToString:@"Position X"]){
63             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
64             return [NSNumber numberWithFloat:p.x];
65         } else if([propertyName isEqualToString:@"Position Y"]){
66             p = [[effects objectAtIndex:rowIndex] getPositionForTime:localCurrentTime];
67             return [NSNumber numberWithFloat:p.y];
68         } else {
69             return [NSNumber numberWithFloat:[[effects objectAtIndex:rowIndex]
70                                               getEffectTrueValue:[valueNames objectAtIndex:rowIndex]
71                                               forTime:localCurrentTime]];
72         }
73     }
74     
75     // 項目名のカラム
76     return propertyName;
77 }
78
79 // slider cellの変更通知を受け取るところ。一括処理。
80 - (IBAction)sliderChanged:(id)sender
81 {
82     NSString* propertyName;
83     QTTime localCurrentTime;
84     float x, y;
85     int i = [_propertyView selectedRow];
86     NSString* name = [propertyNames objectAtIndex:i];
87     
88     if(recording)
89         localCurrentTime = [interestLayer convertToInnnerTime:globalCurrentTime];
90     else 
91         localCurrentTime = QTZeroTime;
92
93     
94     if([name isEqualToString:@"Position X"]){
95 //        p = [[effects objectAtIndex:i] getPositionForTime:localCurrentTime];
96         x = [sender floatValue] * 2.0 * ProjectMovieSize.size.width - ProjectMovieSize.size.width;
97 //        [[effects objectAtIndex:i] setPosition:p forTime:localCurrentTime];
98         [[effects objectAtIndex:i] setPositionX:x forTime:localCurrentTime];
99     } else if([name isEqualToString:@"Position Y"]){
100 //        p = [[effects objectAtIndex:i] getPositionForTime:localCurrentTime];
101         y = [sender floatValue] * 2.0 * ProjectMovieSize.size.height - ProjectMovieSize.size.height;
102         [[effects objectAtIndex:i] setPositionY:y forTime:localCurrentTime];
103     } else {
104         [[effects objectAtIndex:i] setEffectValueForTime:[valueNames objectAtIndex:i] 
105                                                    value:[sender floatValue] time:localCurrentTime];
106     }
107     
108     [_mainController refresh];
109     [_timeLineController updateKeyframeLayer];
110 //    [_propertyView reloadData];
111 }
112
113 - (void)reload
114 {
115     [_propertyView reloadData];
116 }
117
118 - (float)getSelectedValueForTime:(float)time
119 {
120 //    QTTime now = QTMakeTime(time*DEFAULT_FPS/timeLineScale, DEFAULT_FPS);
121     QTTime now = [interestLayer plusOffsetTime:QTMakeTime(time*DEFAULT_FPS/timeLineScale, DEFAULT_FPS)];
122 //    int _rowIndex = [_propertyView selectedRow];
123     NSPoint p;
124
125     if([[propertyNames objectAtIndex:_rowIndex] isEqualToString:@"Position X"]){
126         p = [[effects objectAtIndex:_rowIndex] getPositionForTime:now];
127         return 0.5 + (float)p.x/(2.0*ProjectMovieSize.size.width);
128     }
129
130     if([[propertyNames objectAtIndex:_rowIndex] isEqualToString:@"Position Y"]){
131         p = [[effects objectAtIndex:_rowIndex] getPositionForTime:now];
132         return 0.5 + (float)p.y/(2.0*ProjectMovieSize.size.height);
133     }
134     
135     return [[effects objectAtIndex:_rowIndex] getEffectValue:[valueNames objectAtIndex:_rowIndex] forTime:now];
136 }
137
138 - (BOOL)isSelected
139 {
140     return [_propertyView selectedRow] != -1;
141 }
142
143
144 -(BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex
145 {
146     _rowIndex = rowIndex;
147     [_timeLineController updateKeyframeLayer];
148     return YES;
149 }
150
151 - (void)removeAllKeyframe
152 {
153     int index = [_propertyView selectedRow];
154
155     if(interestLayer){
156         if(index == 0)
157             [interestLayer removePositionXKeyframe];
158         else if(index == 1)
159             [interestLayer removePositionYKerframe];
160         else if(index == -1)
161             return;
162         else {
163             [[effects objectAtIndex:index] removeKeyframe:[valueNames objectAtIndex:index]];
164         }
165         [_timeLineController updateKeyframeLayer];
166     }
167 }
168
169 - (void)removeEffect
170 {
171     int index = [_propertyView selectedRow];
172     
173     if(interestLayer){
174         if(index <= 2) return;
175         [interestLayer removeEffect:[effects objectAtIndex:index]];
176         [self createPropertyTable:interestLayer];
177         [self reload];
178         [_timeLineController updateKeyframeLayer];
179     }
180 }
181
182 @end