void ofxTLLFO::regionSelected(ofLongRange timeRange, ofRange valueRange){ for(int i = 0; i < keyframes.size(); i++){ if(timeRange.contains( keyframes[i]->time )){ selectKeyframe(keyframes[i]); } } }
void ofxTLSwitches::regionSelected(ofLongRange timeRange, ofRange valueRange){ for(int i = 0; i < keyframes.size(); i++){ ofxTLSwitch* switchKey = (ofxTLSwitch*)keyframes[i]; if(switchKey->timeRange.intersects(timeRange)){ selectKeyframe(switchKey); } } }
void ofxTLKeyframes::regionSelected(ofLongRange timeRange, ofRange valueRange){ for(int i = 0; i < keyframes.size(); i++){ if(timeRange.contains(keyframes[i]->time) && valueRange.contains(1.-keyframes[i]->value)){ selectKeyframe(keyframes[i]); } } updateKeyframeSort(); }
//main function to get values out of the timeline, operates on the given value range bool ofxTLFlags::mousePressed(ofMouseEventArgs& args, long millis){ //if we aren't entering text and someone has the shift key held down don't let us go into modal // if(!enteringText && ofGetModifierSelection()){ // return ofxTLBangs::mousePressed(args, millis); // } clickedTextField = NULL; //look at each element to see if a text field was clicked for(int i = 0; i < keyframes.size(); i++){ ofxTLFlag* key = (ofxTLFlag*)keyframes[i]; if(key->display.inside(args.x, args.y)){ clickedTextField = key; break; } } // cout << "text field? " << (clickedTextField == NULL ? "NULL" : clickedTextField->textField.text) << endl; //if so, select that text field and key and present modally //so that keyboard input all goes to the text field. //selection model is designed so that you can type into //mulitple fields at once if(clickedTextField != NULL){ timeline->presentedModalContent(this); if(!ofGetModifierSelection()){ timeline->unselectAll(); } if(ofGetModifierSelection() && clickedTextField->textField.isEditing()){ clickedTextField->textField.endEditing(); } else{ clickedTextField->textField.beginEditing(); enteringText = true; //make sure this key is selected selectKeyframe(clickedTextField); } return false; } else{ if(enteringText && !isHovering()){ for(int i = 0; i < selectedKeyframes.size(); i++){ ((ofxTLFlag*)selectedKeyframes[i])->textField.endEditing(); } enteringText = false; timeline->dismissedModalContent(); } } if(!enteringText){ //if we get all the way here we didn't click on a text field and we aren't //currently entering text so proceed as normal return ofxTLBangs::mousePressed(args, millis); } return false; }
bool ofxTLSwitches::mousePressed(ofMouseEventArgs& args, long millis){ if(placingSwitch != NULL){ if(isActive() && args.button == 0){ placingSwitch->timeRange.max = millis; updateTimeRanges(); } else { deleteKeyframe(placingSwitch); } placingSwitch = NULL; return false; } keysAreDraggable = !ofGetModifierSelection(); //check to see if we are close to any edges, if so select them bool startSelected = false; bool endSelected = false; int selectedKeyframeIndex; if(isActive() && args.button == 0){ for(int i = 0; i < keyframes.size(); i++){ ofxTLSwitch* switchKey = (ofxTLSwitch*)keyframes[i]; //unselect everything else if we just clicked this edge without shift held down startSelected = abs(switchKey->display.x - args.x) < 10.0; if (startSelected && !switchKey->startSelected && !ofGetModifierSelection()) { timeline->unselectAll(); } //Deselect the key if we clicked it already selected with shift held down if(ofGetModifierSelection() && ((startSelected && switchKey->startSelected) || isKeyframeSelected(switchKey))){ switchKey->startSelected = false; } else { switchKey->startSelected |= startSelected; } float endEdge = switchKey->display.x+switchKey->display.width; endSelected = abs(endEdge - args.x) < 10.0; //don't let them both be selected in one click! if(!startSelected && endSelected && !switchKey->endSelected && !ofGetModifierSelection()){ timeline->unselectAll(); } //Deselect the key if we clicked it already selected with shift held down if(ofGetModifierSelection() && ((endSelected && switchKey->endSelected) || isKeyframeSelected(switchKey))){ switchKey->endSelected = false; } else{ switchKey->endSelected |= endSelected && !startSelected; } if(startSelected || endSelected){ selectedKeyframeIndex = i; break; } } } //update dragging and snapping if we clicked an edge updateEdgeDragOffsets(millis); if(endSelected || startSelected){ ofxTLSwitch* selectedSwitch = (ofxTLSwitch*)keyframes[selectedKeyframeIndex]; timeline->setDragTimeOffset(selectedSwitch->edgeDragOffset); } if(!endSelected && !startSelected){ //normal selection from above ofxTLKeyframes::mousePressed(args, millis); if(isActive()){ timeline->cancelSnapping(); //don't snap when dragging the whole switch } } //move through the keyframes, if both the start and the end have been selected //count it as completely selected and let the super class take care of it //otherwise if just one of the edges are selected make sure it's unselected for(int i = 0; i < keyframes.size(); i++){ ofxTLSwitch* switchKey = (ofxTLSwitch*)keyframes[i]; if (switchKey->startSelected && switchKey->endSelected) { switchKey->startSelected = switchKey->endSelected = false; selectKeyframe(switchKey); } //make sure that if just one of the edges is clicked that the keyframe is *not* selected //also make sure it wasn't *just* selected in the last click by checking that it's not 'the' selected key else if( (switchKey->startSelected || switchKey->endSelected) && isKeyframeSelected(switchKey)){ if(selectedKeyframe == switchKey){ switchKey->startSelected = switchKey->endSelected = false; } else{ deselectKeyframe(switchKey); } } } return false; }