Files
processing4/java/examples/Books/Visualizing Data/ch07-hierarchies/filetreemap_06b/FileItem.pde
2011-01-26 19:35:23 +00:00

119 lines
2.6 KiB
Plaintext

// Code from Visualizing Data, First Edition, Copyright 2008 Ben Fry.
class FileItem extends SimpleMapItem {
FolderItem parent;
File file;
String name;
int level;
color c;
float hue;
float brightness;
float textPadding = 8;
float boxLeft, boxTop;
float boxRight, boxBottom;
FileItem(FolderItem parent, File file, int level, int order) {
this.parent = parent;
this.file = file;
this.order = order;
this.level = level;
name = file.getName();
size = file.length();
modTimes.add(file.lastModified());
}
void updateColors() {
if (parent != null) {
hue = map(order, 0, parent.getItemCount(), 0, 360);
}
brightness = modTimes.percentile(file.lastModified()) * 100;
colorMode(HSB, 360, 100, 100);
if (parent == zoomItem) {
c = color(hue, 80, 80);
} else if (parent != null) {
c = color(parent.hue, 80, brightness);
}
colorMode(RGB, 255);
}
void calcBox() {
boxLeft = zoomBounds.spanX(x, 0, width);
boxRight = zoomBounds.spanX(x+w, 0, width);
boxTop = zoomBounds.spanY(y, 0, height);
boxBottom = zoomBounds.spanY(y+h, 0, height);
}
void draw() {
calcBox();
fill(c);
rect(boxLeft, boxTop, boxRight, boxBottom);
if (textFits()) {
drawTitle();
} else if (mouseInside()) {
rolloverItem = this;
}
}
void drawTitle() {
fill(255, 200);
float middleX = (boxLeft + boxRight) / 2;
float middleY = (boxTop + boxBottom) / 2;
if (middleX > 0 && middleX < width && middleY > 0 && middleY < height) {
if (boxLeft + textWidth(name) + textPadding*2 > width) {
textAlign(RIGHT);
text(name, width - textPadding, boxBottom - textPadding);
} else {
textAlign(LEFT);
text(name, boxLeft + textPadding, boxBottom - textPadding);
}
}
}
boolean textFits() {
float wide = textWidth(name) + textPadding*2;
float high = textAscent() + textDescent() + textPadding*2;
return (boxRight - boxLeft > wide) && (boxBottom - boxTop > high);
}
boolean mouseInside() {
return (mouseX > boxLeft && mouseX < boxRight &&
mouseY > boxTop && mouseY < boxBottom);
}
boolean mousePressed() {
if (mouseInside()) {
if (mouseButton == LEFT) {
parent.zoomIn();
return true;
} else if (mouseButton == RIGHT) {
if (parent == zoomItem) {
parent.zoomOut();
} else {
parent.hideContents();
}
return true;
}
}
return false;
}
}