package com.codefixia.ui;
import processing.core.PApplet;
import processing.core.PConstants;
import com.codefixia.drumcloud.DrumCloud;
import com.codefixia.utils.FontAdjuster;
class Knob{
int outStroke=3;
String text="";
boolean dragging = false; // Is the object being dragged?
boolean overed = false; // Is the mouse over the ellipse?
float x,y,w,h; // Location and size
float clickX, clickY,clickValue; // Mouseclick offset
float minX,minY,maxX,maxY;
boolean limitedX=false,limitedY=false;
float expandedFactor=1.0f;
float minValue=0,maxValue=100,angleValue=0;
float fakeValue=0;
int fillColor=DrumCloud.X.redColor;
int backColor=DrumCloud.X.color(150);
float innerRadius=0.5f;
boolean textOnCenter=true;
Knob(float x, float y, float w, float h) {
this.x=x;
this.y=y;
this.w=w;
this.h=h;
expandedFactor=1.2f;
DrumCloud.X.ellipseMode(PConstants.CENTER);
limitY(y-h,y+h);
}
public void setFillColor(int c){
fillColor=c;
}
void limitY(float min,float max){
limitedY=true;
minY=min;
maxY=max;
fakeValue=max;
}
void limitX(float min,float max){
limitedX=true;
minX=min;
maxX=max;
fakeValue=max;
}
float normalizedValue(){
return PApplet.map(fakeValue, minY, maxY, 1.0f, 0.0f);
}
float value(){
return PApplet.map(fakeValue, minY, maxY, maxValue, minValue);
}
public boolean isOvered(int mX,int mY){
if(PApplet.dist(x,y,mX,mY)<PApplet.min(w,h)*expandedFactor*0.5){
overed=true;
}else{
overed=false;
}
return overed;
}
public boolean startDragging(int mX,int mY){
if(isOvered(mX,mY)){
if(!dragging){
dragging=true;
clickX=mX;
clickY=mY;
clickValue=fakeValue;
return true;
}
return false;
}else{
dragging=false;
return false;
}
}
void intoLimits(){
if(limitedY){
if(fakeValue<minY)
fakeValue=minY;
else if(fakeValue>maxY)
fakeValue=maxY;
}
if(limitedX){
if(fakeValue<minX)
fakeValue=minX;
else if(fakeValue>maxX)
fakeValue=maxX;
}
}
public boolean stopDragging() {
if(dragging){
dragging = false;
return true;
}else{
dragging = false;
return false;
}
}
public void dragVertically(int my) {
float offset=my-clickY;
if (dragging) {
if(!limitedY)
fakeValue = clickValue+offset;
else if(clickValue + offset<minY)
fakeValue = minY;
else if(clickValue + offset>maxY)
fakeValue = maxY;
else fakeValue = clickValue + offset;
}
}
void dragHorizontally(int mx) {
float offset=mx-clickX;
if (dragging) {
if(!limitedX)
fakeValue = clickValue + offset;
else if(clickValue + offset<minX)
fakeValue = minX;
else if(clickValue + offset>maxX)
fakeValue = maxX;
else fakeValue = clickValue + offset;
}
}
void draw() {
DrumCloud.X.stroke(150,255);
DrumCloud.X.fill(150,255);
DrumCloud.X.strokeWeight(outStroke);
DrumCloud.X.arc(x,y,w,h,PApplet.radians(75),PApplet.radians(105),PConstants.PIE);
DrumCloud.X.stroke(200);
if (dragging) DrumCloud.X.fill (50,180);
else if (overed) DrumCloud.X.fill(140,180);
else DrumCloud.X.fill(100,180);
DrumCloud.X.arc(x,y,w,h,PApplet.radians(115),PApplet.radians(425),PConstants.PIE);
angleValue=PApplet.map(normalizedValue(),0,1,0,310);
DrumCloud.X.fill(fillColor);
//stroke(100,255);
DrumCloud.X.arc(x,y,w,h,PApplet.radians(65-angleValue),PApplet.radians(65),PConstants.PIE);
float posY;
if(DrumCloud.isAndroidDevice)
posY=y+h*.55f;
else
posY=y+h*.63f;
if(innerRadius>0){
DrumCloud.X.fill(backColor);
DrumCloud.X.arc(x,y,w*innerRadius,h*innerRadius,PApplet.radians(115),PApplet.radians(425),PConstants.OPEN);
}
DrumCloud.X.fill(200);
DrumCloud.X.textSize(FontAdjuster.getSize(20));
DrumCloud.X.textSize(FontAdjuster.getSize(15));
DrumCloud.X.textAlign(PConstants.CENTER);
if(textOnCenter){
DrumCloud.X.fill(100);
DrumCloud.X.textSize(FontAdjuster.getSize(18));
DrumCloud.X.text(PApplet.round(value()),x,y+h*0.11f);
DrumCloud.X.fill(200);
}else{
DrumCloud.X.text(PApplet.round(value()),x,y-h*0.29f);
}
DrumCloud.X.textSize(FontAdjuster.getSize(12));
DrumCloud.X.textAlign(PConstants.LEFT);
DrumCloud.X.text(PApplet.round(minValue),x+w*.2f,posY);
DrumCloud.X.textAlign(PConstants.RIGHT);
DrumCloud.X.text(PApplet.round(maxValue),x-w*.2f,posY);
DrumCloud.X.text(text,x+w*.5f,y+h*.5f);
}
}