/* * This file is part of the Illarion project. * * Copyright © 2015 - Illarion e.V. * * Illarion is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Illarion 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. */ package illarion.mapedit.render; import illarion.common.config.ConfigChangedEvent; import illarion.mapedit.Lang; import illarion.mapedit.data.Map; import illarion.mapedit.gui.MapEditorConfig; import illarion.mapedit.resource.loaders.ImageLoader; import illarion.mapedit.util.SwingLocation; import org.bushe.swing.event.annotation.EventTopicSubscriber; import org.pushingpixels.flamingo.api.common.icon.ResizableIcon; import javax.annotation.Nonnull; import java.awt.*; import java.awt.geom.AffineTransform; /** * This class renders a border around the selected tiles * * @author Fredrik K */ public class SelectedTileRenderer extends AbstractMapRenderer { private boolean showPosition; /** * Creates a new SelectedTileRenderer */ public SelectedTileRenderer(RendererManager manager) { super(manager); showPosition = MapEditorConfig.getInstance().isShowPosition(); } @Override public void renderMap( @Nonnull Map map, Rectangle viewport, int level, @Nonnull Graphics2D g) { int width = map.getWidth(); int height = map.getHeight(); int z = map.getZ() - level; AffineTransform transform = g.getTransform(); g.translate(0, getTileHeight() + 1); g.setColor(Color.ORANGE); for (int x = 0; x < width; ++x) { for (int y = 0; y < height; ++y) { int mapX = x + map.getX(); int mapY = y + map.getY(); if (map.isActiveTile(x, y)) { g.setColor(Color.YELLOW); drawLine(mapX, mapY, mapX, mapY + 1, z, g); drawLine(mapX + 1, mapY, mapX + 1, mapY + 1, z, g); drawLine(mapX, mapY, mapX + 1, mapY, z, g); drawLine(mapX, mapY + 1, mapX + 1, mapY + 1, z, g); g.setColor(Color.ORANGE); } else if (showPosition && map.isPositionAtTile(x, y)) { g.setColor(Color.CYAN); drawLine(mapX, mapY, mapX, mapY + 1, z, g); drawLine(mapX + 1, mapY, mapX + 1, mapY + 1, z, g); drawLine(mapX, mapY, mapX + 1, mapY, z, g); drawLine(mapX, mapY + 1, mapX + 1, mapY + 1, z, g); g.setColor(Color.ORANGE); } else if (map.isSelected(x, y)) { if (!map.isSelected(x - 1, y)) { drawLine(mapX, mapY, mapX, mapY + 1, z, g); } if (!map.isSelected(x + 1, y)) { drawLine(mapX + 1, mapY, mapX + 1, mapY + 1, z, g); } if (!map.isSelected(x, y - 1)) { drawLine(mapX, mapY, mapX + 1, mapY, z, g); } if (!map.isSelected(x, y + 1)) { drawLine(mapX, mapY + 1, mapX + 1, mapY + 1, z, g); } } } } if (map.isFillDragging()) { int startX = Math.min(map.getFillX(), map.getFillStartX()); int startY = Math.min(map.getFillY(), map.getFillStartY()); int endX = Math.max(map.getFillX(), map.getFillStartX()) + 1; int endY = Math.max(map.getFillY(), map.getFillStartY()) + 1; g.setColor(Color.RED); drawLine(startX, startY, startX, endY, z, g); drawLine(endX, startY, endX, endY, z, g); drawLine(startX, startY, endX, startY, z, g); drawLine(startX, endY, endX, endY, z, g); g.setColor(Color.ORANGE); } g.setTransform(transform); } private void drawLine( int fromX, int fromY, int toX, int toY, int z, @Nonnull Graphics2D g) { g.drawLine(SwingLocation.displayCoordinateX(fromX, fromY, z), SwingLocation.displayCoordinateY(fromX, fromY, z), SwingLocation.displayCoordinateX(toX, toY, z), SwingLocation.displayCoordinateY(toX, toY, z)); } @Override protected int getRenderPriority() { return 5; } @Override public String getLocalizedName() { return Lang.getMsg("renderer.SelectedTiles"); } @Override public ResizableIcon getRendererIcon() { return ImageLoader.getResizableIcon("viewGrid"); } @Override public boolean isDefaultOn() { return true; } @EventTopicSubscriber(topic = MapEditorConfig.SHOW_MAP_POSITION) public void onConfigChanged(@Nonnull String topic, ConfigChangedEvent event) { if (topic.equals(MapEditorConfig.SHOW_MAP_POSITION)) { showPosition = MapEditorConfig.getInstance().isShowPosition(); } } }