You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.7 KiB
71 lines
1.7 KiB
/* 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;
|
|
}
|
|
}
|