package com.codefixia.ui; import com.codefixia.drumcloud.DrumCloud; class Draggable { private boolean dragging = false; // Is the object being dragged? boolean rollover = false; // Is the mouse over the ellipse? private float x; // Location and size private float y; private float w; private float h; float offsetX, offsetY; // Mouseclick offset float minX,minY,maxX,maxY; boolean limitedX=false,limitedY=false; float expandedFactor=1.0f; boolean slideOnClick=false; float minXZone,minYZone,maxXZone,maxYZone; Draggable(float tempX, float tempY, float tempW, float tempH) { setX(tempX); setY(tempY); setW(tempW); setH(tempH); offsetX = 0; offsetY = 0; calculateClickZone(); } public void limitY(float min,float max){ limitedY=true; minY=min; maxY=max; calculateClickZone(); } public void limitX(float min,float max){ limitedX=true; minX=min; maxX=max; calculateClickZone(); } public void calculateClickZone(){ float xExp=(expandedFactor-1.0f)*getW(); float yExp=(expandedFactor-1.0f)*getH(); if(limitedX){ minXZone=minX-(xExp*0.5f); maxXZone=maxX+(xExp*0.5f)+getW(); }else{ minXZone=getX()-(xExp*0.5f); maxXZone=getX()+getW()+(xExp*0.5f); } if(limitedY){ minYZone=minY-(yExp*0.5f); maxYZone=getH()+maxY+(yExp*0.5f); }else{ minYZone=getY()-(yExp*0.5f); maxYZone=getH()+getY()+(yExp*0.5f); } } // Method to display public void debugDisplay() { DrumCloud.X.stroke(255); //if(expandedFactor!=1.0){ DrumCloud.X.fill(255,0,0); DrumCloud.X.rect(minXZone,minYZone,maxXZone-minXZone,maxYZone-minYZone); //} if (isDragging()) DrumCloud.X.fill (50); else if (rollover) DrumCloud.X.fill(100); else DrumCloud.X.fill(175,200); DrumCloud.X.rect(getX(),getY(),getW(),getH()); } public void draw() { DrumCloud.X.strokeWeight(3); DrumCloud.X.fill(0,0,0,0.5f); DrumCloud.X.rect(minXZone,minYZone,maxXZone-minXZone,maxYZone-minYZone); DrumCloud.X.stroke(200); if (isDragging()) DrumCloud.X.fill (50); else if (rollover) DrumCloud.X.fill(100); else DrumCloud.X.fill(175,200); DrumCloud.X.rect(getX(),getY(),getW(),getH()); } // Is a point inside the rectangle (for click)? public void clicked(int mx, int my) { calculateClickZone(); //println("zone (X:"+minXZone+" to "+maxXZone+" Y:"+minYZone+" to "+maxYZone+",) mouse:("+mx+","+my+")"); if (mx > minXZone && mx < maxXZone && my > minYZone && my < maxYZone) { //if (mx > x && mx < x + w && my > y && my < y + h) { setDragging(true); // If so, keep track of relative location of click to corner of rectangle offsetX = getX()-mx; offsetY = getY()-my; if(slideOnClick){ if(limitedY)setY(my-getH()*0.5f); if(limitedX)setX(mx-getW()*0.5f); intoLimits(); //println("moved to x:"+x+" y:"+y); } } } public void intoLimits(){ if(limitedY){ if(getY()<minY) setY(minY); else if(getY()>maxY) setY(maxY); } if(limitedX){ if(getY()<minX) setX(minX); else if(getY()>maxX) setX(maxX); } } // Is a point inside the rectangle (for rollover) public void rollover(int mx, int my) { if (mx > minXZone && mx < maxXZone && my > minYZone && my < maxYZone) { //if (mx > x && mx < x + w && my > y && my < y + h) { rollover = true; } else { rollover = false; } } // Stop dragging public void stopDragging() { setDragging(false); } // Drag the rectangle public void drag(int mx, int my) { if (isDragging()) { if(!limitedX || (mx + offsetX>=minX && mx + offsetX<=maxX)) setX(mx + offsetX); if(!limitedY || (my + offsetY>=minY && my + offsetY<=maxY)) setY(my + offsetY); } } public void dragVertically(int my) { if (isDragging()) { if(!limitedY) setY(my + offsetY); else if(my + offsetY<minY) setY(minY); else if(my + offsetY>maxY) setY(maxY); else setY(my + offsetY); } } public void dragHorizontally(int mx) { if (isDragging()) { if(!limitedX) setX(mx + offsetX); else if(mx + offsetX<minX) setX(minX); else if(mx + offsetX>maxX) setX(maxX); else setX(mx + offsetX); } } public float getY() { return y; } public void setY(float y) { this.y = y; } public float getW() { return w; } public void setW(float w) { this.w = w; } public float getX() { return x; } public void setX(float x) { this.x = x; } public boolean isDragging() { return dragging; } public void setDragging(boolean dragging) { this.dragging = dragging; } public float getH() { return h; } public void setH(float h) { this.h = h; } }