void ofxTLKeyframes::mouseDragged(ofMouseEventArgs& args, long millis){ if(keysAreStretchable){ //cast the stretch anchor to long so that it can be signed float stretchRatio = 1.0*(millis-long(stretchAnchor)) / (1.0*stretchSelectPoint-stretchAnchor); for(int k = 0; k < selectedKeyframes.size(); k++){ setKeyframeTime(selectedKeyframes[k], ofClamp(stretchAnchor + (selectedKeyframes[k]->grabTimeOffset * stretchRatio), 0, timeline->getDurationInMilliseconds())); selectedKeyframes[k]->screenPosition = screenPositionForKeyframe(selectedKeyframes[k]); } timeline->flagUserChangedValue(); keysDidDrag = true; updateKeyframeSort(); } if(keysAreDraggable && selectedKeyframes.size() != 0){ ofVec2f screenpoint(args.x,args.y); for(int k = 0; k < selectedKeyframes.size(); k++){ ofVec2f newScreenPosition; setKeyframeTime(selectedKeyframes[k], ofClamp(millis - selectedKeyframes[k]->grabTimeOffset, screenXToMillis(bounds.getMinX()), screenXToMillis(bounds.getMaxX()))); selectedKeyframes[k]->value = screenYToValue(args.y - selectedKeyframes[k]->grabValueOffset); selectedKeyframes[k]->screenPosition = screenPositionForKeyframe(selectedKeyframes[k]); } if(selectedKeyframe != NULL && timeline->getMovePlayheadOnDrag()){ timeline->setCurrentTimeMillis(selectedKeyframe->time); } timeline->flagUserChangedValue(); keysDidDrag = true; updateKeyframeSort(); } createNewOnMouseup = false; }
void ofxTLKeyframes::nudgeBy(ofVec2f nudgePercent){ for(int i = 0; i < selectedKeyframes.size(); i++){ setKeyframeTime(selectedKeyframes[i], ofClamp(selectedKeyframes[i]->time + timeline->getDurationInMilliseconds()*nudgePercent.x, 0, timeline->getDurationInMilliseconds())); selectedKeyframes[i]->value = ofClamp(selectedKeyframes[i]->value + nudgePercent.y, 0, 1.0); } updateKeyframeSort(); timeline->flagTrackModified(this); }
void ofxTLFlags::addFlagAtTime(string key, unsigned long long time){ ofxTLKeyframe* keyFrame = newKeyframe(); ofxTLFlag* flag = (ofxTLFlag*)keyFrame; setKeyframeTime(keyFrame, time); flag->textField.text = key; keyframes.push_back(keyFrame); updateKeyframeSort(); timeline->flagTrackModified(this); }
void ofxTLFlags::addFlagAtTime(string key, unsigned long long time){ // cout << "***ADDING FLAG WITH TIME " << time << endl; if(time > 2000000){ cout << "***UNITITED VAR " << time << endl; return; } ofxTLKeyframe* keyFrame = newKeyframe(); ofxTLFlag* flag = (ofxTLFlag*)keyFrame; setKeyframeTime(keyFrame, time); flag->textField.text = key; keyframes.push_back(keyFrame); updateKeyframeSort(); timeline->flagTrackModified(this); }
void ofxTLKeyframes::mouseReleased(ofMouseEventArgs& args, long millis){ keysAreDraggable = false; if(keysDidDrag){ //reset these caches because they may no longer be valid lastKeyframeIndex = 1; lastSampleTime = 0; timeline->flagTrackModified(this); } if(createNewOnMouseup){ //add a new one selectedKeyframe = newKeyframe(); setKeyframeTime(selectedKeyframe,millis); selectedKeyframe->value = screenYToValue(args.y); keyframes.push_back(selectedKeyframe); selectedKeyframes.push_back(selectedKeyframe); updateKeyframeSort(); timeline->flagTrackModified(this); } createNewOnMouseup = false; }
void ofxTLKeyframes::quantizeKeys(int step){ for(int i = 0; i < keyframes.size(); i++){ setKeyframeTime(keyframes[i], getTimeline()->getQuantizedTime(keyframes[i]->time, step)); } }