package com.codefixia.ui;
import processing.core.PApplet;
import processing.core.PConstants;
import com.codefixia.drumcloud.DrumCloud;
import com.codefixia.utils.FontAdjuster;
public class AnimatedBeatKnob extends BeatKnob{
private DrumCloud drumCloud;
private int startGrid=0;
private final int maxGrids=32;
private final float gridAngle=360/maxGrids;
private float angleOffset=0;
private float colorIntensity=0;
private int stateColor=0;
private float angleWidth=0;
private boolean showTextIndicators=false;
private boolean animating=false;
public AnimatedBeatKnob(float x, float y, float w, float h,DrumCloud dCloud) {
super(x, y, w, h);DrumCloud.X.millis();
this.drumCloud=dCloud;
}
public boolean isAnimating() {
return animating;
}
public void setAnimating(boolean animating) {
this.animating = animating;
}
public void setStartGrid(int startGrid) {
this.startGrid = startGrid;
}
public int getStartGrid() {
return startGrid;
}
public void draw() {
if(animating){
angleOffset=PApplet.map((drumCloud.getPlayedMS())%drumCloud.getTempoMS(), 0.0f, drumCloud.getTempoMS(), 450,90);
angleOffset+=startGrid*gridAngle;
}
angleWidth=(360.0f/(float)maxGrids)*(beatValue()/2.0f);
DrumCloud.X.stroke(150,255);
DrumCloud.X.fill(150,255);
DrumCloud.X.strokeWeight(outStroke);
DrumCloud.X.ellipse(x,y,w,h);
DrumCloud.X.stroke(200);
int times=maxGrids/beatValue();
//PApplet.println("startGrid:"+startGrid+" angleWidth:"+angleWidth);
for(int i=0;i<times;i++){
float currentOffset=angleOffset+(i*angleWidth*2);
colorIntensity=PApplet.map(currentOffset,90,450,256,0);
DrumCloud.X.fill(fillColor,colorIntensity);
DrumCloud.X.arc(x,y,w,h,PApplet.radians(currentOffset),PApplet.radians(currentOffset+angleWidth),PConstants.PIE);
}
angleValue=PApplet.map(normalizedValue(),0,1,0,360);
if (dragging) stateColor=DrumCloud.X.color(50,180);
else if (overed) stateColor=DrumCloud.X.color(140,180);
else stateColor=DrumCloud.X.color(100,180);
DrumCloud.X.fill(stateColor);
DrumCloud.X.ellipse(x,y,w*0.7f,h*0.7f);
DrumCloud.X.fill(fillColor);
DrumCloud.X.line(x, y+h*0.35f, x, y+h*0.5f);
//stroke(100,255);
DrumCloud.X.arc(x,y,w*0.7f,h*0.7f,PApplet.radians(360-angleValue),PApplet.radians(360),PConstants.PIE);
if(innerRadius>0){
DrumCloud.X.fill(backColor);
DrumCloud.X.ellipse(x,y,w*innerRadius,h*innerRadius);
}
drawCenterText();
if(showTextIndicators){
drawTextIndicators();
}
DrumCloud.X.stroke(fillColor);
DrumCloud.X.strokeWeight(3);
DrumCloud.X.line(x, y+h*0.35f, x, y+h*0.5f);
DrumCloud.X.noFill();
DrumCloud.X.arc(x,y,w*0.69f,h*0.69f,PApplet.radians(80),PApplet.radians(100));
DrumCloud.X.arc(x,y,w*1.08f,h*1.08f,PApplet.radians(80),PApplet.radians(100));
}
public void drawCenterText(){
DrumCloud.X.fill(50);
DrumCloud.X.textSize(FontAdjuster.getSize(20));
DrumCloud.X.textSize(FontAdjuster.getSize(15));
DrumCloud.X.textAlign(PConstants.CENTER);
if(textOnCenter){
DrumCloud.X.textSize(FontAdjuster.getSize(18));
DrumCloud.X.text(PApplet.round(beatValue()),x,y+h*0.11f);
}else{
DrumCloud.X.text(PApplet.round(beatValue()),x,y-h*0.29f);
}
}
public void drawTextIndicators(){
float posY=h*.1f;
DrumCloud.X.textSize(FontAdjuster.getSize(12));
DrumCloud.X.textAlign(PConstants.LEFT);
DrumCloud.X.text(PApplet.round(minValue),x+w*.56f,y-posY);
DrumCloud.X.textAlign(PConstants.LEFT);
DrumCloud.X.text(PApplet.round(maxValue),x+w*.56f,y+posY);
DrumCloud.X.text(text,x+w*.5f,y+h*.5f);
}
}