public class Longtail{ static final int NONE = 0; static final int MIN_SLIDER = 1; static final int MAX_SLIDER = 2; static final int SLIDER = 3; int grabbed = NONE; int grabPos = 0; float grabMax = 0; float grabMin = 0; PApplet parent; Box b; float intensity; float sliderPosMin; float sliderPosMax; Longtail(PApplet parent, Box b){ this.parent = parent; parent.registerMouseEvent(this); this.b = b; this.intensity = 0.8; sliderPosMin = 0.0; sliderPosMax = 0.5; } Box getBox(){ return b; } float getRangeMax(){ return 1-sliderPosMin; } float getRangeMin(){ return 1-sliderPosMax; } void draw(){ strokeWeight(0.5); stroke(0.8); fill(1,0.4); rect(b); noStroke(); fill(0.6); beginShape(); vertex(b.left, b.top); bezierVertex(b.left, lerp(b.top, b.bottom, intensity), lerp(b.right, b.left, 1), b.bottom, b.right, b.bottom); vertex(b.left, b.bottom); endShape(CLOSE); // draw handles float minPos = lerp(b.left, b.right, sliderPosMin); float maxPos = lerp(b.left, b.right, sliderPosMax); fill(1, 0.1); rect(b.left, b.top, minPos-b.left, b.height); rect(maxPos, b.top, b.right-maxPos, b.height); fill(0.6,0.8,0.8,0.1); rect(minPos, b.top, maxPos-minPos, b.height); if(b.containsMouse() || grabbed != NONE){ fill(0, 0.4); rect( minPos, b.top, 2, b.height ); rect( maxPos, b.top, -2, b.height ); fill(0.6,0.8,0.8,0.3); rect( minPos, b.top, maxPos-minPos, b.height ); } strokeWeight(0.5); stroke(0.6); noFill(); rect(b); textAlign(LEFT); textFont(meta12); fill(0.4); text("Selected popularity range", b.left + textAscent()*.5, b.top + textAscent()*1.5); if(grabbed!=NONE || (b.containsMouse() && mouseX > minPos-4 && mouseX < maxPos+4)) cursor(HAND); else cursor(ARROW); } public void mouseEvent(MouseEvent event) { int x = event.getX(); int y = event.getY(); switch (event.getID()) { case MouseEvent.MOUSE_PRESSED: mousePressed(x,y); break; case MouseEvent.MOUSE_RELEASED: mouseReleased(x,y); break; case MouseEvent.MOUSE_DRAGGED: mouseDragged(x,y); break; } } void mousePressed(int x, int y){ if(b.containsMouse()){ // handles float minPos = lerp(b.left, b.right, sliderPosMin); float maxPos = lerp(b.left, b.right, sliderPosMax); if(abs(x - minPos)<4){ grabbed = MIN_SLIDER; } else if(abs(x - maxPos)<4){ grabbed = MAX_SLIDER; } else if(x > minPos && x < maxPos){ grabbed = SLIDER; grabPos = x; grabMin = sliderPosMin; grabMax = sliderPosMax; } } } void mouseReleased(int x, int y){ if(grabbed != NONE){ grabbed = NONE; } } void mouseDragged(int x, int y){ if(grabbed == MIN_SLIDER){ sliderPosMin = constrain( unlerp(b.left, b.right, x), 0, sliderPosMax - 0.01); } else if(grabbed == MAX_SLIDER){ sliderPosMax = constrain( unlerp(b.left, b.right, x), sliderPosMin + 0.01, 1); } else if(grabbed == SLIDER){ float offset = constrain( unlerp(0, b.width, x-grabPos), -grabMin, 1-grabMax); sliderPosMin = grabMin + offset; sliderPosMax = grabMax + offset; } } }