Search in sources :

Example 1 with ResizeFourArrowListener

use of com.ray3k.skincomposer.ResizeFourArrowListener in project skin-composer by raeleus.

the class DialogTenPatch method populate.

private void populate() {
    setSize(stage.getWidth(), stage.getHeight());
    var root = getContentTable();
    root.pad(10);
    root.clear();
    var top = new Table();
    top.setTouchable(Touchable.enabled);
    var bottom = new Table();
    bottom.setBackground(skin.getDrawable("white"));
    bottom.setTouchable(Touchable.enabled);
    var splitPane = new SplitPane(top, bottom, true, skin);
    splitPane.setSplitAmount(splitValue);
    root.add(splitPane).grow();
    splitPane.addListener(verticalResizeArrowListener);
    splitPane.addListener(new DragListener() {

        {
            setTapSquareSize(0f);
        }

        @Override
        public void drag(InputEvent event, float x, float y, int pointer) {
            super.drag(event, x, y, pointer);
            if (event.getListenerActor().equals(event.getTarget())) {
                tenPatchWidget.center();
            }
            splitValue = splitPane.getSplitAmount();
        }
    });
    var label = new Label("Ten Patch Editor", skin, "title-no-line");
    top.add(label);
    top.row();
    var table = new Table();
    top.add(table).growX().space(5);
    table.defaults().space(5);
    label = new Label("Name:", skin, "white");
    label.setName("nameLabel");
    table.add(label);
    var textField = new TextField(drawableData.name, skin);
    textField.setName("nameField");
    table.add(textField).growX();
    textField.addListener(ibeamListener);
    textField.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            drawableData.name = textField.getText();
            validateName();
        }
    });
    table.defaults().uniform().fill();
    var textButton = new TextButton("Save to File", skin);
    table.add(textButton);
    textButton.addListener(handListener);
    textButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            Runnable runnable = () -> {
                String[] filterPatterns = null;
                if (!Utils.isMac()) {
                    filterPatterns = new String[] { "*.png" };
                }
                var file = desktopWorker.saveDialog("Save as 9patch...", projectData.getLastDrawablePath(), filterPatterns, "Image files");
                if (file != null) {
                    Gdx.app.postRunnable(() -> {
                        var fileHandle = new FileHandle(file);
                        if (!fileHandle.name().toLowerCase(Locale.ROOT).endsWith(".9.png")) {
                            fileHandle = fileHandle.sibling(fileHandle.nameWithoutExtension() + ".9.png");
                        }
                        saveToImageFile(fileHandle);
                    });
                }
            };
            dialogFactory.showDialogLoading(runnable);
        }
    });
    textButton = new TextButton("Clear", skin);
    table.add(textButton);
    textButton.addListener(handListener);
    textButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            drawableData.tenPatchData.clear();
        }
    });
    textButton = new TextButton("More info...", skin);
    table.add(textButton);
    textButton.addListener(handListener);
    textButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            showAboutDialog();
        }
    });
    top.row();
    tenPatchWidget = new TenPatchWidget(skin);
    tenPatchWidget.setTenPatchData(drawableData.tenPatchData);
    tenPatchWidget.setTextureRegion(loadTextureFile(drawableData.file));
    top.add(tenPatchWidget).grow();
    tenPatchWidget.getStretchSwitchButton().addListener(handListener);
    tenPatchWidget.getModeSwitchButton().addListener(handListener);
    tenPatchWidget.addListener(new InputListener() {

        @Override
        public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
            getStage().setScrollFocus(tenPatchWidget);
        }

        @Override
        public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) {
            zoomToMouse = false;
            if (pointer == -1) {
                if (getStage() != null) {
                    getStage().setScrollFocus(null);
                }
            }
        }

        @Override
        public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY) {
            zoomToMouse = true;
            Slider slider = findActor("ten-patch-zoom");
            slider.setValue(slider.getValue() - SCROLL_AMOUNT * amountY);
            return true;
        }
    });
    tenPatchWidget.addListener(new TenPatchWidget.TenPatchListener() {

        @Override
        public void valueChanged(TenPatchData tenPatchData) {
            updatePreview();
        }
    });
    top.row();
    table = new Table();
    table.pad(5);
    top.add(table).growX();
    table.defaults().space(5);
    var imageButton = new ImageButton(skin, "grid-light");
    imageButton.setName("grid-light");
    imageButton.setProgrammaticChangeEvents(false);
    table.add(imageButton);
    imageButton.addListener(handListener);
    imageButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            var imageButton = (ImageButton) actor;
            if (imageButton.isChecked()) {
                tenPatchWidget.setGridMode(TenPatchWidget.GridMode.LIGHT);
            } else {
                tenPatchWidget.setGridMode(TenPatchWidget.GridMode.NONE);
            }
            imageButton = findActor("grid-dark");
            imageButton.setChecked(false);
        }
    });
    imageButton = new ImageButton(skin, "grid-dark");
    imageButton.setName("grid-dark");
    imageButton.setProgrammaticChangeEvents(false);
    table.add(imageButton);
    imageButton.addListener(handListener);
    imageButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            var imageButton = (ImageButton) actor;
            if (imageButton.isChecked()) {
                tenPatchWidget.setGridMode(TenPatchWidget.GridMode.DARK);
            } else {
                tenPatchWidget.setGridMode(TenPatchWidget.GridMode.NONE);
            }
            imageButton = findActor("grid-light");
            imageButton.setChecked(false);
        }
    });
    imageButton = new ImageButton(skin, "resize");
    table.add(imageButton).expandX().right();
    imageButton.addListener(handListener);
    imageButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeListener.ChangeEvent event, Actor actor) {
            tenPatchWidget.zoomAndCenter();
            Slider slider = findActor("ten-patch-zoom");
            slider.setValue(tenPatchWidget.getZoomScale());
        }
    });
    var slider = new Slider(1, 100, 1f, false, skin, "zoom-horizontal");
    slider.setName("ten-patch-zoom");
    slider.setValue(1);
    table.add(slider);
    slider.addListener(handListener);
    slider.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeListener.ChangeEvent event, Actor actor) {
            var slider = (Slider) actor;
            if (!zoomToMouse) {
                tenPatchWidget.setZoomScale(slider.getValue());
            } else {
                temp.set(Gdx.input.getX(), Gdx.input.getY());
                tenPatchWidget.screenToLocalCoordinates(temp);
                tenPatchWidget.setZoomScale(temp.x, temp.y, slider.getValue());
            }
        }
    });
    top.row();
    table = new Table();
    top.add(table).growX();
    table.defaults().space(3);
    table.pad(5);
    var imageTextButton = new ImageTextButton("Animation...", skin, "ten-patch-animation");
    table.add(imageTextButton);
    imageTextButton.addListener(handListener);
    imageTextButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            var dialog = new DialogTenPatchAnimation(drawableData);
            dialog.addListener(new DialogTenPatchAnimation.DialogTenPatchAnimationListener() {

                @Override
                public void animationUpdated(DialogTenPatchAnimation.DialogTenPatchAnimationEvent event) {
                    updatePreview();
                }
            });
            dialog.show(getStage());
        }
    });
    textButton = new TextButton("Load Patches", skin);
    table.add(textButton);
    textButton.addListener(handListener);
    textButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            Runnable runnable = () -> {
                String[] filterPatterns = null;
                if (!Utils.isMac()) {
                    filterPatterns = new String[] { "*.9.png" };
                }
                var file = desktopWorker.openDialog("Load patches from file...", projectData.getLastDrawablePath(), filterPatterns, "Nine patch files");
                if (file != null) {
                    Gdx.app.postRunnable(() -> {
                        var fileHandle = new FileHandle(file);
                        if (fileHandle.name().toLowerCase(Locale.ROOT).endsWith(".9.png")) {
                            loadPatchesFromFile(fileHandle);
                        }
                    });
                }
            };
            dialogFactory.showDialogLoading(runnable);
        }
    });
    textButton = new TextButton("Auto Patches", skin);
    table.add(textButton);
    textButton.addListener(handListener);
    textButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            var pixmap = new Pixmap(fileHandle);
            if (fileHandle.path().toLowerCase(Locale.ROOT).endsWith(".9.png")) {
                var cropped = new Pixmap(pixmap.getWidth() - 2, pixmap.getHeight() - 2, Pixmap.Format.RGBA8888);
                cropped.setBlending(Pixmap.Blending.None);
                cropped.drawPixmap(pixmap, 0, 0, 1, 1, pixmap.getWidth() - 2, pixmap.getHeight() - 2);
                pixmap.dispose();
                pixmap = cropped;
            }
            var patches = Utils.calculatePatches(pixmap);
            drawableData.tenPatchData.horizontalStretchAreas.clear();
            drawableData.tenPatchData.horizontalStretchAreas.add(patches.left);
            drawableData.tenPatchData.horizontalStretchAreas.add(pixmap.getWidth() - patches.right - 1);
            drawableData.tenPatchData.verticalStretchAreas.clear();
            drawableData.tenPatchData.verticalStretchAreas.add(patches.bottom);
            drawableData.tenPatchData.verticalStretchAreas.add(pixmap.getHeight() - patches.top - 1);
            drawableData.tenPatchData.combineContiguousSretchAreas(true);
            drawableData.tenPatchData.removeInvalidStretchAreas(true);
            drawableData.tenPatchData.combineContiguousSretchAreas(false);
            drawableData.tenPatchData.removeInvalidStretchAreas(false);
            updatePreview();
            pixmap.dispose();
        }
    });
    imageTextButton = new ImageTextButton("More settings...", skin, "ten-patch-scrolling");
    table.add(imageTextButton);
    imageTextButton.addListener(handListener);
    imageTextButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            var dialog = new DialogTenPatchSettings(drawableData, tenPatchDrawable);
            dialog.addListener(new DialogTenPatchSettings.DialogTenPatchSettingsListener() {

                @Override
                public void settingsUpdated(DialogTenPatchSettings.DialogTenPatchSettingsEvent event) {
                    updatePreview();
                }
            });
            dialog.show(getStage());
        }
    });
    label = new Label("Preview", skin, "title-no-line");
    bottom.add(label);
    bottom.row();
    table = new Table();
    bottom.add(table).grow();
    var resizer = new ResizeWidget(null, skin);
    resizer.setName("resizer");
    resizer.setTouchable(Touchable.enabled);
    resizer.setResizingFromCenter(true);
    resizer.setAllowDragging(false);
    var cursor = Utils.textureRegionToCursor(skin.getRegion("cursor_resize_ne"), 16, 16);
    var resizeFourArrowListener = new ResizeFourArrowListener(cursor);
    resizer.getBottomLeftHandle().addListener(resizeFourArrowListener);
    resizer.getTopRightHandle().addListener(resizeFourArrowListener);
    cursor = Utils.textureRegionToCursor(skin.getRegion("cursor_resize_nw"), 16, 16);
    resizeFourArrowListener = new ResizeFourArrowListener(cursor);
    resizer.getTopLeftHandle().addListener(resizeFourArrowListener);
    resizer.getBottomRightHandle().addListener(resizeFourArrowListener);
    cursor = Utils.textureRegionToCursor(skin.getRegion("cursor_resize_vertical"), 16, 16);
    resizeFourArrowListener = new ResizeFourArrowListener(cursor);
    resizer.getBottomHandle().addListener(resizeFourArrowListener);
    resizer.getTopHandle().addListener(resizeFourArrowListener);
    cursor = Utils.textureRegionToCursor(skin.getRegion("cursor_resize_horizontal"), 16, 16);
    resizeFourArrowListener = new ResizeFourArrowListener(cursor);
    resizer.getLeftHandle().addListener(resizeFourArrowListener);
    resizer.getRightHandle().addListener(resizeFourArrowListener);
    table.add(resizer).grow();
    String name = drawableData.file.nameWithoutExtension();
    var matcher = Pattern.compile(".*(?=\\.9$)").matcher(name);
    if (matcher.find()) {
        name = matcher.group();
    }
    originalRegion = atlasData.getAtlas().findRegion(name);
    tenPatchDrawable = new TenPatchDrawable(new int[0], new int[0], false, originalRegion);
    if (drawableData.tenPatchData.colorName != null) {
        tenPatchDrawable.getColor().set(jsonData.getColorByName(drawableData.tenPatchData.colorName).color);
    }
    tenPatchDrawable.setTiling(drawableData.tenPatchData.tile);
    table = new Table();
    table.setName("tenPatchTable");
    table.setBackground(tenPatchDrawable);
    resizer.setActor(table);
    layout();
    resizer.getStack().setSize(100, 100);
    bottom.row();
    table = new Table();
    table.setBackground(skin.getDrawable("white"));
    table.pad(5);
    bottom.add(table).growX();
    table.defaults().space(5);
    label = new Label("Content:", skin);
    table.add(label).right();
    var selectBox = new SelectBox<String>(skin);
    selectBox.setName("contentSelectBox");
    selectBox.setItems("None", "Text", "Color", "Drawable");
    table.add(selectBox);
    selectBox.addListener(handListener);
    selectBox.getList().addListener(handListener);
    selectBox.getList().addListener(new ClickListener() {

        @Override
        public void clicked(InputEvent event, float x, float y) {
            selectBox.fire(new ChangeListener.ChangeEvent());
        }
    });
    selectBox.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            createPreview();
        }
    });
    imageButton = new ImageButton(skin, "color");
    table.add(imageButton);
    imageButton.addListener(handListener);
    imageButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            dialogFactory.showDialogColors(new StyleProperty(), (colorData, pressedCancel) -> {
                if (colorData == null) {
                    previewColor.set(DEFAULT_PREVIEW_COLOR);
                } else {
                    previewColor.set(colorData.color);
                }
                updatePreview();
            }, null);
        }
    });
    label = new Label("Background:", skin);
    table.add(label).padLeft(15);
    imageButton = new ImageButton(skin, "color");
    table.add(imageButton);
    imageButton.addListener(handListener);
    imageButton.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            dialogFactory.showDialogColors(new StyleProperty(), (colorData, pressedCancel) -> {
                if (colorData == null) {
                    bottom.setColor(Color.WHITE);
                } else {
                    bottom.setColor(colorData.color);
                }
                updatePreview();
            }, null);
        }
    });
    table.add().expandX();
    root = getButtonTable();
    root.pad(10);
    root.clearChildren();
    root.defaults().uniform().fill();
    textButton = new TextButton("OK", skin);
    textButton.setName("okayButton");
    button(textButton, true);
    validateName();
    textButton.addListener(handListener);
    textButton = new TextButton("Cancel", skin);
    button(textButton, false);
    textButton.addListener(handListener);
    updatePreview();
    layout();
    tenPatchWidget.zoomAndCenter();
}
Also used : FileHandle(com.badlogic.gdx.files.FileHandle) Array(com.badlogic.gdx.utils.Array) Scaling(com.badlogic.gdx.utils.Scaling) Utils(com.ray3k.skincomposer.utils.Utils) Gdx(com.badlogic.gdx.Gdx) Texture(com.badlogic.gdx.graphics.Texture) TenPatchDrawable(com.ray3k.tenpatch.TenPatchDrawable) ChangeListener(com.badlogic.gdx.scenes.scene2d.utils.ChangeListener) ResizeWidget(com.ray3k.stripe.ResizeWidget) Vector2(com.badlogic.gdx.math.Vector2) Locale(java.util.Locale) IntArray(com.badlogic.gdx.utils.IntArray) TenPatchWidget(com.ray3k.skincomposer.TenPatchWidget) Actions(com.badlogic.gdx.scenes.scene2d.actions.Actions) TextureRegion(com.badlogic.gdx.graphics.g2d.TextureRegion) Input(com.badlogic.gdx.Input) PixmapIO(com.badlogic.gdx.graphics.PixmapIO) CrushMode(com.ray3k.tenpatch.TenPatchDrawable.CrushMode) com.badlogic.gdx.scenes.scene2d(com.badlogic.gdx.scenes.scene2d) ClickListener(com.badlogic.gdx.scenes.scene2d.utils.ClickListener) DrawableData(com.ray3k.skincomposer.data.DrawableData) com.badlogic.gdx.scenes.scene2d.ui(com.badlogic.gdx.scenes.scene2d.ui) Pixmap(com.badlogic.gdx.graphics.Pixmap) FilesDroppedListener(com.ray3k.skincomposer.FilesDroppedListener) Align(com.badlogic.gdx.utils.Align) Color(com.badlogic.gdx.graphics.Color) PopTable(com.ray3k.stripe.PopTable) DragListener(com.badlogic.gdx.scenes.scene2d.utils.DragListener) Keys(com.badlogic.gdx.Input.Keys) ResizeFourArrowListener(com.ray3k.skincomposer.ResizeFourArrowListener) Main(com.ray3k.skincomposer.Main) Pattern(java.util.regex.Pattern) LabelStyle(com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle) StageResizeListener(com.ray3k.skincomposer.StageResizeListener) StyleProperty(com.ray3k.skincomposer.data.StyleProperty) FileHandle(com.badlogic.gdx.files.FileHandle) TenPatchWidget(com.ray3k.skincomposer.TenPatchWidget) ResizeFourArrowListener(com.ray3k.skincomposer.ResizeFourArrowListener) DragListener(com.badlogic.gdx.scenes.scene2d.utils.DragListener) ChangeListener(com.badlogic.gdx.scenes.scene2d.utils.ChangeListener) ClickListener(com.badlogic.gdx.scenes.scene2d.utils.ClickListener) PopTable(com.ray3k.stripe.PopTable) TenPatchDrawable(com.ray3k.tenpatch.TenPatchDrawable) StyleProperty(com.ray3k.skincomposer.data.StyleProperty) ResizeWidget(com.ray3k.stripe.ResizeWidget) Pixmap(com.badlogic.gdx.graphics.Pixmap)

Aggregations

Gdx (com.badlogic.gdx.Gdx)1 Input (com.badlogic.gdx.Input)1 Keys (com.badlogic.gdx.Input.Keys)1 FileHandle (com.badlogic.gdx.files.FileHandle)1 Color (com.badlogic.gdx.graphics.Color)1 Pixmap (com.badlogic.gdx.graphics.Pixmap)1 PixmapIO (com.badlogic.gdx.graphics.PixmapIO)1 Texture (com.badlogic.gdx.graphics.Texture)1 TextureRegion (com.badlogic.gdx.graphics.g2d.TextureRegion)1 Vector2 (com.badlogic.gdx.math.Vector2)1 com.badlogic.gdx.scenes.scene2d (com.badlogic.gdx.scenes.scene2d)1 Actions (com.badlogic.gdx.scenes.scene2d.actions.Actions)1 com.badlogic.gdx.scenes.scene2d.ui (com.badlogic.gdx.scenes.scene2d.ui)1 LabelStyle (com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle)1 ChangeListener (com.badlogic.gdx.scenes.scene2d.utils.ChangeListener)1 ClickListener (com.badlogic.gdx.scenes.scene2d.utils.ClickListener)1 DragListener (com.badlogic.gdx.scenes.scene2d.utils.DragListener)1 Align (com.badlogic.gdx.utils.Align)1 Array (com.badlogic.gdx.utils.Array)1 IntArray (com.badlogic.gdx.utils.IntArray)1