import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop;
import com.badlogic.gdx.utils.viewport.ExtendViewport;
 
public class DragAndDropTest extends ApplicationAdapter {
 
    private Stage stage;
    private Label.LabelStyle style;
 
    @Override
    public void create() {
        stage = new Stage(new ExtendViewport(1280, 720));
        style = new Label.LabelStyle(new BitmapFont(), Color.WHITE);
 
        Table left = new Table();
        left.top().left();
        left.setBounds(0, 0, stage.getWidth() / 2, stage.getHeight());
        stage.addActor(left);
        left.debug();
 
        Table right = new Table();
        right.left().top();
        right.setBounds(stage.getWidth() / 2, 0, stage.getWidth() / 2, stage.getHeight());
        stage.addActor(right);
        right.debug();
 
        DragAndDrop dragFromLeft = new DragAndDrop();
        // Set right table as target
        dragFromLeft.addTarget(new DragAndDrop.Target(right) {
            @Override
            public boolean drag(DragAndDrop.Source source, DragAndDrop.Payload payload, float x, float y, int pointer) {
                System.out.println(this.toString());
                return true;
            }
 
            @Override
            public void reset(DragAndDrop.Source source, DragAndDrop.Payload payload) {
                System.out.println("Reset");
                super.reset(source, payload);
            }
 
            @Override
            public void drop(DragAndDrop.Source source, DragAndDrop.Payload payload, float x, float y, int pointer) {
                System.out.println("Valid drop");
            }
        });
 
        // Add drag source to left table
        Label draggableLabel = new Label("Drag me!", style);
        // Add to table
        left.add(draggableLabel);
        // Add as source ot DragAndDrop
        dragFromLeft.addSource(new DragAndDrop.Source(draggableLabel) {
            @Override
            public DragAndDrop.Payload dragStart(InputEvent event, float x, float y, int pointer) {System.out.println("Dragstart...");
                DragAndDrop.Payload payload = new DragAndDrop.Payload();
                payload.setObject("Some data");
                payload.setDragActor(new Label("Some payload...", style));
 
                Label validLabel = new Label("Some payload...", style);
                validLabel.setColor(Color.GREEN);
                payload.setValidDragActor(validLabel);
 
                return payload;
            }
        });
 
        Gdx.input.setInputProcessor(stage);
 
    }
 
    @Override
    public void render() {
        Gdx.gl.glClearColor(.2f, .2f, .25f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
 
        stage.act();
        stage.draw();
    }
 
    @Override
    public void resize(int width, int height) {
        super.resize(width, height);
        stage.getViewport().update(width, height);
    }
 
    public static void main (String[] args) throws Exception {
        new LwjglApplication(new DragAndDropTest());
    }
}