bool ofxTLKeyframes::mousePressed(ofMouseEventArgs& args, long millis){ ofVec2f screenpoint = ofVec2f(args.x, args.y); keysAreDraggable = !ofGetModifierShiftPressed(); keysDidDrag = false; selectedKeyframe = keyframeAtScreenpoint(screenpoint); //if we clicked OFF of a keyframe OR... //if we clicked on a keyframe outside of the current selection and we aren't holding down shift, clear all if(!ofGetModifierSelection() && (isActive() || selectedKeyframe != NULL) ){ bool didJustDeselect = false; if( selectedKeyframe == NULL || !isKeyframeSelected(selectedKeyframe)){ //settings this to true causes the first click off of the timeline to deselct rather than create a new keyframe didJustDeselect = timeline->getTotalSelectedItems() > 1; timeline->unselectAll(); } //if we didn't just deselect everything and clicked in an empty space add a new keyframe there if(selectedKeyframe == NULL && !didJustDeselect){ createNewOnMouseup = args.button == 0 && !ofGetModifierControlPressed(); } } if(selectedKeyframe != NULL){ //add the keyframe to the selection, whether it was just generated or not if(!isKeyframeSelected(selectedKeyframe)){ selectedKeyframes.push_back(selectedKeyframe); } //unselect it if it's selected and we clicked the key with shift pressed else if(ofGetModifierSelection()){ deselectKeyframe(selectedKeyframe); selectedKeyframe = NULL; } } // if(isActive()){ // cout << "MOUSE PRESSED args button " << args.button << " control pressed? " << (ofGetModifierControlPressed() ? "YES":"NO") << " shift/cmd pressed? " << (ofGetModifierSelection() ? "YES":"NO") << endl; // } //if we have any keyframes selected update the grab offsets and check for showing the modal window if(selectedKeyframes.size() != 0){ updateDragOffsets(screenpoint, millis); if(selectedKeyframe != NULL){ if(args.button == 0 && !ofGetModifierSelection() && !ofGetModifierControlPressed()){ timeline->setDragTimeOffset(selectedKeyframe->grabTimeOffset); //move the playhead if(timeline->getMovePlayheadOnDrag()){ timeline->setCurrentTimeMillis(selectedKeyframe->time); } } if(args.button == 2 || ofGetModifierControlPressed()){ selectedKeySecondaryClick(args); } } } return selectedKeyframe != NULL; }
void ofxTLPage::mousePressed(ofMouseEventArgs& args, long millis){ draggingInside = trackContainerRect.inside(args.x, args.y); draggingSelectionRectangle = false; ofxTLTrack* newFocus = NULL; if(draggingInside){ headerHasFocus = false; footerIsDragging = false; for(int i = 0; i < headers.size(); i++){ bool clickIsInHeader = headers[i]->getDrawRect().inside(args.x,args.y); bool clickIsInTrack = tracks[headers[i]->name]->getDrawRect().inside(args.x,args.y); bool clickIsInFooter = headers[i]->getFooterRect().inside(args.x,args.y); bool justMadeSelection = tracks[headers[i]->name]->_mousePressed(args, millis); headerHasFocus |= (clickIsInFooter || clickIsInHeader) && !justMadeSelection; footerIsDragging |= clickIsInFooter; if(headerHasFocus){ headers[i]->mousePressed(args); } if(clickIsInTrack || clickIsInHeader || justMadeSelection){ newFocus = tracks[ headers[i]->name ]; } } refreshSnapPoints(); if(!footerIsDragging && (headerHasFocus || timeline->getTotalSelectedItems() == 0 || ofGetModifierShiftPressed()) ){ draggingSelectionRectangle = true; selectionRectangleAnchor = ofVec2f(args.x,args.y); selectionRectangle = ofRectangle(args.x,args.y,0,0); } } //TODO: explore multi-focus tracks for pasting into many tracks at once //paste events get sent to the focus track if(newFocus != NULL && newFocus != focusedTrack){ if(focusedTrack != NULL){ focusedTrack->lostFocus(); } newFocus->gainedFocus(); focusedTrack = newFocus; //is set to NULL when the whole timeline loses focus } }
bool ofxTLKeyframes::mousePressed(ofMouseEventArgs& args, long millis){ ofVec2f screenpoint = ofVec2f(args.x, args.y); keysAreStretchable = ofGetModifierShiftPressed() && ofGetModifierControlPressed(); keysDidDrag = false; if(keysAreStretchable && timeline->getTotalSelectedItems() > 1){ unsigned long long minSelected = timeline->getEarliestSelectedTime(); unsigned long long maxSelected = timeline->getLatestSelectedTime(); if(minSelected == maxSelected){ keysAreStretchable = false; } else { unsigned long long midSelection = (maxSelected-minSelected)/2 + minSelected; //the anchor is the selected key opposite to where we are stretching stretchAnchor = midSelection <= millis ? minSelected : maxSelected; // cout << "Min selected " << ofxTimecode::timecodeForMillis(minSelected) << " Mid Selected " << ofxTimecode::timecodeForMillis(midSelection) << " Max selected " << ofxTimecode::timecodeForMillis(maxSelected) << " anchor " << ofxTimecode::timecodeForMillis(stretchAnchor) << " millis down " << ofxTimecode::timecodeForMillis(millis) << endl; stretchSelectPoint = millis; //don't do anything else, like create or deselect keyframes updateStretchOffsets(screenpoint, millis); } return true; } keysAreDraggable = !ofGetModifierShiftPressed(); selectedKeyframe = keyframeAtScreenpoint(screenpoint); //if we clicked OFF of a keyframe OR... //if we clicked on a keyframe outside of the current selection and we aren't holding down shift, clear all if(!ofGetModifierSelection() && (isActive() || selectedKeyframe != NULL) ){ bool didJustDeselect = false; if( selectedKeyframe == NULL || !isKeyframeSelected(selectedKeyframe)){ //settings this to true causes the first click off of the timeline to deselct rather than create a new keyframe didJustDeselect = timeline->getTotalSelectedItems() > 1; timeline->unselectAll(); } //if we didn't just deselect everything and clicked in an empty space add a new keyframe there if(selectedKeyframe == NULL && !didJustDeselect){ createNewOnMouseup = args.button == 0 && !ofGetModifierControlPressed(); } } if(selectedKeyframe != NULL){ //add the keyframe to the selection, whether it was just generated or not if(!isKeyframeSelected(selectedKeyframe)){ selectedKeyframes.push_back(selectedKeyframe); updateKeyframeSort(); // selectKeyframe(selectedKeyframe); } //unselect it if it's selected and we clicked the key with shift pressed else if(ofGetModifierSelection()){ deselectKeyframe(selectedKeyframe); selectedKeyframe = NULL; } } //if we have any keyframes selected update the grab offsets and check for showing the modal window if(selectedKeyframes.size() != 0){ updateDragOffsets(screenpoint, millis); if(selectedKeyframe != NULL){ if(args.button == 0 && !ofGetModifierSelection() && !ofGetModifierControlPressed()){ timeline->setDragTimeOffset(selectedKeyframe->grabTimeOffset); //move the playhead if(timeline->getMovePlayheadOnDrag()){ timeline->setCurrentTimeMillis(selectedKeyframe->time); } } if(args.button == 2 || ofGetModifierControlPressed()){ selectedKeySecondaryClick(args); } } } return selectedKeyframe != NULL; }
bool ofGetModifierSelection(){ return ofGetModifierShiftPressed(); }