package mindustry.ui; import arc.*; import arc.graphics.g2d.*; import arc.input.*; import arc.math.*; import arc.scene.*; import arc.scene.event.*; import arc.scene.ui.layout.*; import arc.util.*; import mindustry.gen.*; import static mindustry.Vars.*; public class Minimap extends Table{ public Minimap(){ background(Tex.pane); float margin = 5f; this.touchable = Touchable.enabled; add(new Element(){ { setSize(Scl.scl(140f)); addListener(new ClickListener(KeyCode.mouseRight){ @Override public void clicked(InputEvent event, float cx, float cy){ var region = renderer.minimap.getRegion(); if(region == null) return; float sx = (cx - x) / width, sy = (cy - y) / height, scaledX = Mathf.lerp(region.u, region.u2, sx) * world.width() * tilesize, scaledY = Mathf.lerp(1f - region.v2, 1f - region.v, sy) * world.height() * tilesize; control.input.panCamera(Tmp.v1.set(scaledX, scaledY)); } }); } @Override public void act(float delta){ setPosition(Scl.scl(margin), Scl.scl(margin)); super.act(delta); } @Override public void draw(){ if(renderer.minimap.getRegion() == null) return; if(!clipBegin()) return; Draw.rect(renderer.minimap.getRegion(), x + width / 2f, y + height / 2f, width, height); if(renderer.minimap.getTexture() != null){ Draw.alpha(parentAlpha); renderer.minimap.drawEntities(x, y, width, height, false); } clipEnd(); } }).size(140f); margin(margin); addListener(new InputListener(){ @Override public boolean scrolled(InputEvent event, float x, float y, float amountx, float amounty){ renderer.minimap.zoomBy(amounty); return true; } }); addListener(new ClickListener(){ { tapSquareSize = Scl.scl(11f); } @Override public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){ if(inTapSquare()){ super.touchUp(event, x, y, pointer, button); }else{ pressed = false; pressedPointer = -1; pressedButton = null; cancelled = false; } } @Override public void touchDragged(InputEvent event, float x, float y, int pointer){ if(!inTapSquare(x, y)){ invalidateTapSquare(); } super.touchDragged(event, x, y, pointer); if(mobile){ float max = Math.min(world.width(), world.height()) / 16f / 2f; renderer.minimap.setZoom(1f + y / height * (max - 1f)); } } @Override public void clicked(InputEvent event, float x, float y){ ui.minimapfrag.toggle(); } }); update(() -> { Element e = Core.scene.getHoverElement(); if(e != null && e.isDescendantOf(this)){ requestScroll(); }else if(hasScroll()){ Core.scene.setScrollFocus(null); } }); } }