/* * Copyright (C) 2015-2017 たんらる */ package fourthline.mabiicco.fx; import java.util.OptionalInt; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; import javafx.scene.paint.Color; import fourthline.mabiicco.MabiIccoProperties; import fourthline.mabiicco.ui.IMMLManager; import fourthline.mabiicco.ui.IViewTargetMarker; import fourthline.mmlTools.MMLScore; import fourthline.mmlTools.MMLTempoEvent; import fourthline.mmlTools.Marker; public final class ColumnView implements IViewTargetMarker { private static final Color BEAT_BORDER_COLOR = Color.color(0.4f, 0.4f, 0.4f); private static final Color TARGET_MAKER_FILL_COLOR = Color.color(0.9f, 0.7f, 0.0f, 0.6f); private final PianoRollView pianoRollView; private final IMMLManager mmlManager; private OptionalInt targetMarker = OptionalInt.empty(); private Canvas canvas; private final Image markerT = new Image("/img/markerT.png"); public ColumnView(Canvas canvas, PianoRollView pianoRollView, IMMLManager mmlManager) { this.canvas = canvas; this.pianoRollView = pianoRollView; this.mmlManager = mmlManager; paint(); } private void paint() { GraphicsContext gc = canvas.getGraphicsContext2D(); paintComponent(gc); } private void paintComponent(GraphicsContext gc) { paintRuler(gc); paintMarker(gc); paintTempoEvents(gc); pianoRollView.paintSequenceLine(gc, getHeight()); paintTargetMarker(gc); } private int getHeight() { return (int) canvas.getHeight(); } private int getWidth() { return (int) canvas.getWidth(); } /** * ルーラを表示します。 */ private void paintRuler(GraphicsContext gc) { long measure = mmlManager.getMMLScore().getMeasureTick(); long length = pianoRollView.convertXtoTick( getWidth() ); gc.setFill(BEAT_BORDER_COLOR); int count = 0; for (long i = 0; i < length; i += measure) { int x = pianoRollView.convertTicktoX(i); int y1 = 0; int y2 = getHeight(); gc.fillRect(x, y1, 1, y2); String s = "" + (count++); gc.fillText(s, x+2, y1+10); } } /** * テンポを表示します. */ private void paintTempoEvents(GraphicsContext gc) { MMLScore score = mmlManager.getMMLScore(); for (MMLTempoEvent tempoEvent : score.getTempoEventList()) { int tick = tempoEvent.getTickOffset(); String s = "t" + tempoEvent.getTempo(); int x = pianoRollView.convertTicktoX(tick); drawMarker(gc, markerT, s, x, 0); } } private void paintMarker(GraphicsContext gc) { if (MabiIccoProperties.getInstance().enableViewMarker.get()) { MMLScore score = mmlManager.getMMLScore(); for (Marker marker : score.getMarkerList()) { int tick = marker.getTickOffset(); int x = pianoRollView.convertTicktoX(tick); drawMarker(gc, markerT, marker.getName(), x, -5); } } } private void drawMarker(GraphicsContext gc, Image image, String s, int x, int dy) { double y = 24 + dy; // label gc.setFill(Color.BLACK); gc.fillText(s, x+6, y); // icon gc.drawImage(image, x-(int)(image.getWidth()/2), y-image.getHeight()+2); } private void paintTargetMarker(GraphicsContext gc) { if (!targetMarker.isPresent()) { return; } int x = pianoRollView.convertTicktoX( targetMarker.getAsInt() ); double xPoints[] = { x-5, x+5, x+5, x, x-5 }; double yPoints[] = { 8, 8, 20, 25, 20 }; // icon gc.setFill(TARGET_MAKER_FILL_COLOR); gc.fillPolygon(xPoints, yPoints, xPoints.length); } @Override public void PaintOnTarget(int tickOffset) {} @Override public void PaintOff() {} }