/* Scrollbar class */ class HScrollbar { int swidth, sheight; // width and height of bar float xpos, ypos; // x and y position of bar float spos, newspos; // x position of slider float sposMin, sposMax; // max and min values of slider int loose; // how loose/heavy boolean over; // is the mouse over the slider? boolean locked; float ratio; HScrollbar (float xp, float yp, int sw, int sh, int l) { swidth = sw; sheight = sh; int widthtoheight = sw - sh; ratio = (float)sw / (float)widthtoheight; xpos = xp; ypos = yp-sheight/2; spos = xpos + swidth/2 - sheight/2; newspos = spos; sposMin = xpos; sposMax = xpos + swidth - sheight; loose = l; } boolean update(boolean scroll_lock) { if (mousePressed && overEvent() && ! scroll_lock) { locked = true; scroll_lock=true; } if (!mousePressed) { locked = false; scroll_lock=false; } if (locked) { newspos = constrain(mouseX-sheight/2, sposMin, sposMax); if (abs(newspos - spos) > 1) { spos = newspos; } } return scroll_lock; } float constrain(float val, float minv, float maxv) { return min(max(val, minv), maxv); } boolean overEvent() { return (mouseX > xpos && mouseX < xpos+swidth && mouseY > ypos && mouseY < ypos+sheight); } void display() { noStroke(); fill(204); rect(xpos, ypos, swidth, sheight); if (over || locked) { fill(0, 0, 0); } else { fill(102, 102, 102); } rect(spos, ypos, sheight, sheight); } float getPos() { // Convert spos to be values between // 0 and the total width of the scrollbar return spos * ratio; } }