Clamping of tree views

This commit is contained in:
Anuken
2019-07-13 14:04:01 -04:00
parent ad39a51fe8
commit d64796f32a
2 changed files with 70 additions and 51 deletions

View File

@@ -1,29 +1,25 @@
package io.anuke.mindustry.ui.dialogs; package io.anuke.mindustry.ui.dialogs;
import io.anuke.arc.Core; import io.anuke.arc.*;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.*;
import io.anuke.arc.collection.ObjectSet; import io.anuke.arc.collection.ObjectSet.*;
import io.anuke.arc.collection.ObjectSet.ObjectSetIterator; import io.anuke.arc.graphics.*;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.graphics.Texture; import io.anuke.arc.math.*;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.math.geom.*;
import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.scene.*;
import io.anuke.arc.math.Mathf; import io.anuke.arc.scene.ui.*;
import io.anuke.arc.scene.Group;
import io.anuke.arc.scene.ui.Image;
import io.anuke.arc.scene.ui.TextButton;
import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.*; import io.anuke.arc.util.*;
import io.anuke.mindustry.content.Zones; import io.anuke.mindustry.content.*;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.*;
import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.game.Saves.*;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.io.SaveIO.SaveException; import io.anuke.mindustry.io.SaveIO.*;
import io.anuke.mindustry.type.Zone; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.Zone.ZoneRequirement; import io.anuke.mindustry.type.Zone.*;
import io.anuke.mindustry.ui.ItemsDisplay; import io.anuke.mindustry.ui.*;
import io.anuke.mindustry.ui.TreeLayout; import io.anuke.mindustry.ui.TreeLayout.*;
import io.anuke.mindustry.ui.TreeLayout.TreeNode;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -31,6 +27,7 @@ public class DeployDialog extends FloatingDialog{
private final float nodeSize = Unit.dp.scl(210f); private final float nodeSize = Unit.dp.scl(210f);
private ObjectSet<ZoneNode> nodes = new ObjectSet<>(); private ObjectSet<ZoneNode> nodes = new ObjectSet<>();
private ZoneInfoDialog info = new ZoneInfoDialog(); private ZoneInfoDialog info = new ZoneInfoDialog();
private Rectangle bounds = new Rectangle();
public DeployDialog(){ public DeployDialog(){
super("", "fulldialog"); super("", "fulldialog");
@@ -40,6 +37,8 @@ public class DeployDialog extends FloatingDialog{
TreeLayout layout = new TreeLayout(); TreeLayout layout = new TreeLayout();
layout.gapBetweenLevels = layout.gapBetweenNodes = Unit.dp.scl(50f); layout.gapBetweenLevels = layout.gapBetweenNodes = Unit.dp.scl(50f);
layout.layout(root); layout.layout(root);
bounds.set(layout.getBounds());
bounds.y += nodeSize*0.4f;
addCloseButton(); addCloseButton();
buttons.addImageTextButton("$techtree", "icon-tree", iconsize, () -> ui.tech.show()).size(230f, 64f); buttons.addImageTextButton("$techtree", "icon-tree", iconsize, () -> ui.tech.show()).size(230f, 64f);
@@ -187,11 +186,25 @@ public class DeployDialog extends FloatingDialog{
dragged((x, y) -> { dragged((x, y) -> {
panX += x; panX += x;
panY += y; panY += y;
clamp();
}); });
} }
void clamp(){
float pad = nodeSize;
float ox = width/2f, oy = height/2f;
float rx = bounds.x + panX + ox, ry = panY + oy + bounds.y;
float rw = bounds.width, rh = bounds.height;
rx = Mathf.clamp(rx, -rw + pad, Core.graphics.getWidth() - pad);
ry = Mathf.clamp(ry, pad, Core.graphics.getHeight() - rh - pad);
panX = rx - bounds.x - ox;
panY = ry - bounds.y - oy;
}
@Override @Override
public void draw(){ public void draw(){
clamp();
float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y; float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y;
for(ZoneNode node : nodes){ for(ZoneNode node : nodes){

View File

@@ -1,32 +1,25 @@
package io.anuke.mindustry.ui.dialogs; package io.anuke.mindustry.ui.dialogs;
import io.anuke.arc.Core; import io.anuke.arc.*;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.*;
import io.anuke.arc.collection.ObjectSet; import io.anuke.arc.graphics.*;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.math.*;
import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.math.geom.*;
import io.anuke.arc.math.Interpolation; import io.anuke.arc.scene.*;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.scene.actions.*;
import io.anuke.arc.scene.Element; import io.anuke.arc.scene.event.*;
import io.anuke.arc.scene.Group; import io.anuke.arc.scene.style.*;
import io.anuke.arc.scene.actions.Actions; import io.anuke.arc.scene.ui.*;
import io.anuke.arc.scene.actions.RelativeTemporalAction; import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.scene.event.Touchable; import io.anuke.arc.util.*;
import io.anuke.arc.scene.style.TextureRegionDrawable; import io.anuke.mindustry.content.*;
import io.anuke.arc.scene.ui.ImageButton; import io.anuke.mindustry.content.TechTree.*;
import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.graphics.*;
import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.mindustry.type.*;
import io.anuke.arc.util.Align; import io.anuke.mindustry.ui.*;
import io.anuke.mindustry.content.TechTree; import io.anuke.mindustry.ui.TreeLayout.*;
import io.anuke.mindustry.content.TechTree.TechNode; import io.anuke.mindustry.world.Block.*;
import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.ui.ItemsDisplay;
import io.anuke.mindustry.ui.TreeLayout;
import io.anuke.mindustry.ui.TreeLayout.TreeNode;
import io.anuke.mindustry.world.Block.Icon;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -71,6 +64,7 @@ public class TechTreeDialog extends FloatingDialog{
LayoutNode node = new LayoutNode(root, null); LayoutNode node = new LayoutNode(root, null);
layout.layout(node); layout.layout(node);
bounds.set(layout.getBounds()); bounds.set(layout.getBounds());
bounds.y += nodeSize*1.5f;
copyInfo(node); copyInfo(node);
} }
@@ -218,9 +212,22 @@ public class TechTreeDialog extends FloatingDialog{
moved = true; moved = true;
panX += x; panX += x;
panY += y; panY += y;
clamp();
}); });
} }
void clamp(){
float pad = nodeSize;
float ox = width/2f, oy = height/2f;
float rx = bounds.x + panX + ox, ry = panY + oy + bounds.y;
float rw = bounds.width, rh = bounds.height;
rx = Mathf.clamp(rx, -rw + pad, Core.graphics.getWidth() - pad);
ry = Mathf.clamp(ry, pad, Core.graphics.getHeight() - rh - pad);
panX = rx - bounds.x - ox;
panY = ry - bounds.y - oy;
}
void unlock(TechNode node){ void unlock(TechNode node){
data.unlockContent(node.block); data.unlockContent(node.block);
data.removeItems(node.requirements); data.removeItems(node.requirements);
@@ -303,6 +310,7 @@ public class TechTreeDialog extends FloatingDialog{
@Override @Override
public void draw(){ public void draw(){
clamp();
float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y; float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y;
for(TechTreeNode node : nodes){ for(TechTreeNode node : nodes){
@@ -315,8 +323,6 @@ public class TechTreeDialog extends FloatingDialog{
} }
} }
Lines.rect(bounds.x + Core.graphics.getWidth()/2f, bounds.y + Core.graphics.getHeight()/2f, bounds.width, bounds.height);
Draw.reset(); Draw.reset();
super.draw(); super.draw();
} }