//-------------------------------------------------------------- void ofxMuiKnob::onPress() { registerMousePosition(mousePosition); float nv = getNormalizedKnobPosition(); if(getBounds().isBounded()) { if(isRangeEnabled() && isShiftPressed()) { if(isCtrlPressed()) { setRightOrLeftRangeLimit(nv); } else { setClosestRangeLimit(nv); } } else if(isRangeEnabled() && isCtrlPressed()) { normCtrlDragStartMin = getNormalizedRangeMin(); normCtrlDragStartMax = getNormalizedRangeMax(); } else { setNormalizedValue(nv); } } else { //setNormalizedValue(nv); ofVec2f v = screenToHitBox(mousePosition); float d = v.distance(getHitBoxCenter()); float ds = ofNormalize(d,0,getHitBoxWidth()*2.0f) * 10.0f; add(ds*dKnobScaler*dKnobAngle); } }
//-------------------------------------------------------------- void ofxMuiNumberData::setClosestRangeLimit(float norm) { float dMin = fabs(norm - getNormalizedRangeMin()); float dMax = fabs(norm - getNormalizedRangeMax()); if(dMin > dMax) { setNormalizedRangeMax(norm); } else { setNormalizedRangeMin(norm); } }
//-------------------------------------------------------------- void ofxMuiKnob::update() { // tooltip = toString(); // valueLabel->setText(tooltip); // valueLabel->setTooltip(tooltip); // if(needsRedraw) { // dial shape needs update due to data change cout << "here" << endl; if(getBounds().isBounded()) { innerRadiusW = getHitBoxHalfWidth() * innerRadiusPct; outerRadiusW = getHitBoxHalfWidth() * outerRadiusPct; innerRadiusH = getHitBoxHalfHeight() * innerRadiusPct; outerRadiusH = getHitBoxHalfHeight() * outerRadiusPct; angleBounds0 = ofRadToDeg(normalizedValueToAngle(0.0f)); angleBounds1 = ofRadToDeg(normalizedValueToAngle(1.0f)); angleValue0 = angleBounds0; angleValue1 = ofRadToDeg(normalizedValueToAngle(getNormalizedValue())); dialShape.clear(); dialShape.arc(0,0,outerRadiusW,outerRadiusH,angleBounds0,angleBounds1); dialShape.arcNegative(0,0,innerRadiusW,innerRadiusH,angleBounds1,angleBounds0); dialShape.close(); if(getRange().isBounded()) { angleRange0 = ofRadToDeg(normalizedValueToAngle(getNormalizedRangeMin())); angleRange1 = ofRadToDeg(normalizedValueToAngle(getNormalizedRangeMax())); angleValue0 = angleRange0; // reset it if this is active dialRangeShape.clear(); dialRangeShape.arc(0,0,outerRadiusW,outerRadiusH,angleRange0,angleRange1); dialRangeShape.arcNegative(0,0,innerRadiusW,innerRadiusH,angleRange1,angleRange0); dialRangeShape.close(); } // dialValueShape.clear(); dialValueShape.arc(0,0,outerRadiusW,outerRadiusH,angleValue0,angleValue1); dialValueShape.arcNegative(0,0,innerRadiusW,innerRadiusH,angleValue1,angleValue0); dialValueShape.close(); } else { // nothing to draw } needsRedraw = false; } }
//-------------------------------------------------------------- void ofxMuiKnob::onDrag() { registerMousePosition(mousePosition); float nv = getNormalizedKnobPosition(); cout << "nv=" << nv << endl; if(getBounds().isBounded()) { if(isRangeEnabled() && isShiftPressed()) { if(isCtrlPressed()) { setRightOrLeftRangeLimit(nv); } else { setClosestRangeLimit(nv); } } else if(isRangeEnabled() && isCtrlPressed()) { normCtrlDragStartMin = getNormalizedRangeMin(); normCtrlDragStartMax = getNormalizedRangeMax(); } else { setNormalizedValue(nv); } /* if(isRangeEnabled() && isShiftPressed()) { setClosestRangeLimit(nv); } else if(isRangeEnabled() && isCtrlPressed()) { // TODO -- fix this // TODO -- quick angle change problem float normDx = fabs(smallestAngleDelta(normCtrlDragStartMin, normCtrlDragStartMax) )/ (2 * PI - boundaryWedgeAngle); setNormalizedRangeMin(ofClamp(normCtrlDragStartMin + normDx,0,1)); setNormalizedRangeMax(ofClamp(normCtrlDragStartMax + normDx,0,1)); } else { //setNormalizedValue(nv); ofVec2f v = screenToHitBox(mousePosition); float d = v.distance(getHitBoxCenter()); float ds = ofNormalize(d,0,getHitBoxWidth()*2.0f) * 10.0f; add(ds*dKnobScaler*getBounds().delta()*dKnobAngle); } */ } else { //setNormalizedValue(nv); //ofVec2f v = screenToHitBox(mousePosition); //float d = v.distance(ofVec2f(getHitBoxWidth()*0.5f,getHitBoxHeight()*0.5f)); float ds = 1;//ofNormalize(d,0,getHitBoxWidth()*2.0f) * 10.0f; add(ds*dKnobScaler*dKnobAngle); cout << getValue() << endl; } }