/*
* Copyright 2015 Laszlo Balazs-Csiki
*
* This file is part of Pixelitor. Pixelitor is free software: you
* can redistribute it and/or modify it under the terms of the GNU
* General Public License, version 3 as published by the Free
* Software Foundation.
*
* Pixelitor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pixelitor. If not, see <http://www.gnu.org/licenses/>.
*/
package pixelitor.menus.view;
import java.awt.BasicStroke;
import java.awt.Stroke;
import java.util.Random;
/**
* The available zoom levels
*/
public enum ZoomLevel {
Z12("12.5 %") {
@Override
public double getPercentValue() {
return 12.5;
}
@Override
public ZoomLevel zoomIn() {
return Z12plus;
}
@Override
public ZoomLevel zoomOut() {
return Z12;
}
}, Z12plus("17.7 %") { // 12.5 * sqrt(2)
@Override
public double getPercentValue() {
return 17.677669529663688110021109052621;
}
@Override
public ZoomLevel zoomIn() {
return Z25;
}
@Override
public ZoomLevel zoomOut() {
return Z12;
}
}, Z25("25 %") {
@Override
public double getPercentValue() {
return 25;
}
@Override
public ZoomLevel zoomIn() {
return Z25plus;
}
@Override
public ZoomLevel zoomOut() {
return Z12plus;
}
}, Z25plus("35.3 %") {
@Override
public double getPercentValue() {
return 35.355339059327376220042218105242;
}
@Override
public ZoomLevel zoomIn() {
return Z50;
}
@Override
public ZoomLevel zoomOut() {
return Z25;
}
}, Z50("50 %") {
@Override
public double getPercentValue() {
return 50;
}
@Override
public ZoomLevel zoomIn() {
return Z50plus;
}
@Override
public ZoomLevel zoomOut() {
return Z25plus;
}
}, Z50plus("70.7 %") {
@Override
public double getPercentValue() {
return 70.710678118654752440084436210485;
}
@Override
public ZoomLevel zoomIn() {
return Z100;
}
@Override
public ZoomLevel zoomOut() {
return Z50;
}
}, Z100("100 %") {
@Override
public double getPercentValue() {
return 100;
}
@Override
public ZoomLevel zoomIn() {
return Z100plus;
}
@Override
public ZoomLevel zoomOut() {
return Z50plus;
}
}, Z100plus("141.4 %") {
@Override
public double getPercentValue() {
return 141.42135623730950488016887242097;
}
@Override
public ZoomLevel zoomIn() {
return Z200;
}
@Override
public ZoomLevel zoomOut() {
return Z100;
}
}, Z200("200 %") {
@Override
public double getPercentValue() {
return 200;
}
@Override
public ZoomLevel zoomIn() {
return Z200plus;
}
@Override
public ZoomLevel zoomOut() {
return Z100plus;
}
}, Z200plus("282.8 %") {
@Override
public double getPercentValue() {
return 282.84271247461900976033774484194;
}
@Override
public ZoomLevel zoomIn() {
return Z400;
}
@Override
public ZoomLevel zoomOut() {
return Z200;
}
}, Z400("400 %") {
@Override
public double getPercentValue() {
return 400;
}
@Override
public ZoomLevel zoomIn() {
return Z400plus;
}
@Override
public ZoomLevel zoomOut() {
return Z200plus;
}
}, Z400plus("565.7 %") {
@Override
public double getPercentValue() {
return 565.68542494923801952067548968388;
}
@Override
public ZoomLevel zoomIn() {
return Z800;
}
@Override
public ZoomLevel zoomOut() {
return Z400;
}
}, Z800("800 %") {
@Override
public double getPercentValue() {
return 800;
}
@Override
public ZoomLevel zoomIn() {
return Z800plus;
}
@Override
public ZoomLevel zoomOut() {
return Z400plus;
}
}, Z800plus("1131.4 %") {
@Override
public double getPercentValue() {
return 1131.3708498984760390413509793678;
}
@Override
public ZoomLevel zoomIn() {
return Z1600;
}
@Override
public ZoomLevel zoomOut() {
return Z800;
}
}, Z1600("1600 %") {
@Override
public double getPercentValue() {
return 1600;
}
@Override
public ZoomLevel zoomIn() {
return Z1600plus;
}
@Override
public ZoomLevel zoomOut() {
return Z800plus;
}
}, Z1600plus("2262.7 %") {
@Override
public double getPercentValue() {
return 2262.7416997969520780827019587355;
}
@Override
public ZoomLevel zoomIn() {
return Z3200;
}
@Override
public ZoomLevel zoomOut() {
return Z1600;
}
}, Z3200("3200 %") {
@Override
public double getPercentValue() {
return 3200;
}
@Override
public ZoomLevel zoomIn() {
return Z3200plus;
}
@Override
public ZoomLevel zoomOut() {
return Z1600plus;
}
}, Z3200plus("4525.5 %") {
@Override
public double getPercentValue() {
return 4525.483399593904156165403917471;
}
@Override
public ZoomLevel zoomIn() {
return Z6400;
}
@Override
public ZoomLevel zoomOut() {
return Z3200;
}
}, Z6400("6400 %") {
@Override
public double getPercentValue() {
return 6400;
}
@Override
public ZoomLevel zoomIn() {
return Z6400;
}
@Override
public ZoomLevel zoomOut() {
return Z3200plus;
}
};
private BasicStroke outerGeometryStroke;
private BasicStroke innerGeometryStroke;
private final String guiName;
ZoomLevel(String guiName) {
this.guiName = guiName;
}
private ZoomMenuItem menuItem;
@Override
public String toString() {
return guiName;
}
public ZoomMenuItem getMenuItem() {
// The menuItem must be initialized here in order to make sure that
// it runs after the enum constructor, therefore it has a name
if (menuItem == null) {
menuItem = new ZoomMenuItem(this);
}
return menuItem;
}
public Stroke getOuterGeometryStroke() {
if (outerGeometryStroke == null) {
outerGeometryStroke = new BasicStroke((float) (300.0f / getPercentValue()));
}
return outerGeometryStroke;
}
public Stroke getInnerGeometryStroke() {
if (innerGeometryStroke == null) {
innerGeometryStroke = new BasicStroke((float) (100.0f / getPercentValue()));
}
return innerGeometryStroke;
}
public abstract double getPercentValue();
public abstract ZoomLevel zoomIn();
public abstract ZoomLevel zoomOut();
public static ZoomLevel getRandomZoomLevel(Random rand) {
int index = rand.nextInt(values().length);
return values()[index];
}
public double getViewScale() {
return getPercentValue() / 100.0;
}
public boolean drawPixelGrid() {
return getPercentValue() > 1500;
}
}