diff --git a/OutlawEditor/pom.xml b/OutlawEditor/pom.xml index b960a762..e1c4e456 100644 --- a/OutlawEditor/pom.xml +++ b/OutlawEditor/pom.xml @@ -170,7 +170,7 @@ org.controlsfx controlsfx - 8.40.14 + 8.40.15 \ No newline at end of file diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java index 3b2e5d35..406b93a9 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java @@ -13,6 +13,8 @@ package org.badvision.outlaweditor; import java.util.LinkedList; import java.util.logging.Level; import java.util.logging.Logger; + +import javafx.scene.layout.FlowPane; import javafx.scene.layout.Pane; import javax.xml.bind.JAXBException; import org.badvision.outlaweditor.data.DataObserver; @@ -117,4 +119,6 @@ public abstract class Editor implements DataObserver { protected void onEntityUpdated() { } + + public abstract void showSelectorModal(); } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java index bd125112..ccb4145f 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java @@ -81,6 +81,11 @@ public class GlobalEditor extends Editor{ throw new UnsupportedOperationException("Not supported."); //To change body of generated methods, choose Tools | Templates. } + @Override + public void showSelectorModal() { + // There is no modal selector for this editor + } + @Override public void observedObjectChanged(Global object) { throw new UnsupportedOperationException("Not supported."); //To change body of generated methods, choose Tools | Templates. diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java index 2d814db2..09f48fd3 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java @@ -10,6 +10,11 @@ package org.badvision.outlaweditor; +import javafx.event.EventHandler; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.layout.Pane; +import org.badvision.outlaweditor.api.ApplicationState; import org.badvision.outlaweditor.api.Platform; import java.util.EnumMap; import javafx.beans.property.SimpleStringProperty; @@ -17,6 +22,7 @@ import javafx.beans.property.StringProperty; import javafx.scene.control.Menu; import org.badvision.outlaweditor.data.xml.Image; import org.badvision.outlaweditor.data.xml.PlatformData; +import org.badvision.outlaweditor.ui.PatternSelectModal; /** * @@ -60,4 +66,17 @@ public abstract class ImageEditor extends Editor { public StringProperty cursorInfoProperty() { return cursorInfo; } + + private Pane targetPane; + private PatternSelectModal patternSelectModal; + + public void registerPatternSelectorModal(Pane pane, PatternSelectModal modal) { + this.targetPane = pane; + patternSelectModal = modal; + } + + @Override + public void showSelectorModal() { + patternSelectModal.showPatternSelectModal(targetPane); + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java index 3c79e914..64830506 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java @@ -138,21 +138,18 @@ public class MapEditor extends Editor implements EventH @Override public void buildEditorUI(Pane tileEditorAnchorPane) { anchorPane = tileEditorAnchorPane; - ApplicationState.getInstance().getPrimaryStage().getScene().addEventHandler(KeyEvent.KEY_PRESSED, this::keyPressed); initCanvas(); redraw(); } - private void keyPressed(KeyEvent e) { - if (e.isControlDown() && e.getCode() == KeyCode.SPACE) { - e.consume(); - String category = null; - if (currentTile != null) { - category = currentTile.getCategory(); - } - if (this.equals(ApplicationState.getInstance().getController().getVisibleEditor())) { - TileSelectModal.showTileSelectModal(anchorPane, category, this::setCurrentTile); - } + @Override + public void showSelectorModal() { + String category = null; + if (currentTile != null) { + category = currentTile.getCategory(); + } + if (this.equals(ApplicationState.getInstance().getController().getVisibleEditor())) { + TileSelectModal.showTileSelectModal(anchorPane, category, this::setCurrentTile); } } @@ -466,7 +463,6 @@ public class MapEditor extends Editor implements EventH drawCanvas.heightProperty().unbind(); anchorPane.getChildren().remove(drawCanvas); currentMap.updateBackingMap(); - ApplicationState.getInstance().getPrimaryStage().getScene().removeEventHandler(KeyEvent.KEY_PRESSED, this::keyPressed); } /** diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java index a3f50c8a..d1eceefe 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java @@ -14,15 +14,35 @@ package org.badvision.outlaweditor; * * @author brobert */ +import javafx.event.EventHandler; import javafx.scene.control.Menu; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.Pane; +import org.badvision.outlaweditor.api.ApplicationState; import org.badvision.outlaweditor.data.xml.Tile; +import org.badvision.outlaweditor.ui.PatternSelectModal; +import org.badvision.outlaweditor.ui.TileSelectModal; public abstract class TileEditor extends Editor { - abstract public void buildPatternSelector(Menu tilePatternMenu); public static enum DrawMode { Pencil1px, Pencil3px, Toggle } + + private Pane targetPane; + private PatternSelectModal patternSelectModal; + + public void registerPatternSelectorModal(Pane pane, PatternSelectModal modal) { + this.targetPane = pane; + patternSelectModal = modal; + } + + @Override + public void showSelectorModal() { + patternSelectModal.showPatternSelectModal(targetPane); + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleImageEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleImageEditor.java index 6d7701d4..5fd11260 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleImageEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleImageEditor.java @@ -12,10 +12,7 @@ package org.badvision.outlaweditor.apple; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.util.Arrays; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import javafx.event.EventHandler; @@ -36,6 +33,7 @@ import org.badvision.outlaweditor.api.Platform; import org.badvision.outlaweditor.data.TileMap; import org.badvision.outlaweditor.data.xml.Image; import org.badvision.outlaweditor.data.xml.PlatformData; +import org.badvision.outlaweditor.ui.PatternSelectModal; import org.badvision.outlaweditor.ui.UIAction; /** @@ -44,7 +42,7 @@ import org.badvision.outlaweditor.ui.UIAction; */ public class AppleImageEditor extends ImageEditor implements EventHandler { - public int[] currentFillPattern = FillPattern.White_PC.bytePattern; + public int[] currentFillPattern = (Optional.ofNullable(lastSelectedPattern).orElse(FillPattern.White_PC)).bytePattern; public boolean hiBitMatters = true; protected DrawMode currentDrawMode = DrawMode.Pencil1px; protected WritableImage currentImage; @@ -82,20 +80,32 @@ public class AppleImageEditor extends ImageEditor implements EventHandler { - changeCurrentPattern(object); - state.put(StateVars.PATTERN, object); - }); + FillPattern.buildMenu(tilePatternMenu, this::changeCurrentPattern); } + public PatternSelectModal buildPatternSelectorModal() { + return new PatternSelectModal<>( + FillPattern::getMapOfValues, + p -> new ImageView(p.getPreview()), + this::changeCurrentPattern + ); + } + + static FillPattern lastSelectedPattern = null; public void changeCurrentPattern(FillPattern pattern) { if (pattern == null) { return; } + state.put(StateVars.PATTERN, pattern); + lastSelectedPattern = pattern; currentFillPattern = pattern.getBytePattern(); hiBitMatters = pattern.hiBitMatters; lastActionX = -1; diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleTileEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleTileEditor.java index 27e1c7aa..b55ba239 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleTileEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/AppleTileEditor.java @@ -9,10 +9,10 @@ */ package org.badvision.outlaweditor.apple; -import java.util.Arrays; import java.util.HashMap; import javafx.scene.Group; import javafx.scene.control.Menu; +import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.input.Clipboard; import javafx.scene.input.DataFormat; @@ -27,13 +27,13 @@ import org.badvision.outlaweditor.TileEditor; import org.badvision.outlaweditor.data.DataUtilities; import org.badvision.outlaweditor.data.TileUtils; import org.badvision.outlaweditor.data.xml.Tile; +import org.badvision.outlaweditor.ui.PatternSelectModal; /** * * @author brobert */ public class AppleTileEditor extends TileEditor { - FillPattern currentPattern = FillPattern.DarkViolet1; DrawMode drawMode = DrawMode.Toggle; public static final long SAFE_WAIT_TIME = 100; @@ -76,6 +76,15 @@ public class AppleTileEditor extends TileEditor { tileEditorAnchorPane.getChildren().add(mainGroup); TileUtils.redrawTile(getEntity()); observedObjectChanged(getEntity()); + registerPatternSelectorModal(tileEditorAnchorPane, buildPatternSelectorModal()); + if (lastSelectedPattern != null) { + changeCurrentPattern(lastSelectedPattern); + } + } + + @Override + public void unregister() { + // Nothing to do for this editor } private void handleMouse(MouseEvent t, int x, int y) { @@ -161,15 +170,23 @@ public class AppleTileEditor extends TileEditor { }); } + + public PatternSelectModal buildPatternSelectorModal() { + return new PatternSelectModal( + FillPattern::getMapOfValues, + p -> new ImageView(p.getPreview()), + this::changeCurrentPattern + ); + } + + static FillPattern lastSelectedPattern = null; public void changeCurrentPattern(FillPattern pat) { currentPattern = pat; + lastSelectedPattern = pat; lastActionX = -1; lastActionY = -1; } - @Override - public void unregister() { - } int zoom = 25; Group gridGroup; Rectangle[][] grid; diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/FillPattern.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/FillPattern.java index 3fe54312..afc7d8a0 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/FillPattern.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/FillPattern.java @@ -10,15 +10,17 @@ package org.badvision.outlaweditor.apple; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; + import javafx.event.ActionEvent; import javafx.event.EventHandler; +import javafx.scene.control.Button; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; +import javafx.scene.layout.Pane; import org.badvision.outlaweditor.api.Platform; import static org.badvision.outlaweditor.apple.AppleNTSCGraphics.hgrToDhgr; import org.badvision.outlaweditor.data.DataObserver; @@ -176,22 +178,28 @@ public enum FillPattern { target.getItems().clear(); for (final FillPattern fill : FillPattern.values()) { MenuItem i = new MenuItem(fill.name(), new ImageView(fill.getPreview())); - i.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent t) { - dataObserver.observedObjectChanged(fill); - } - }); + i.setOnAction(t -> dataObserver.observedObjectChanged(fill)); target.getItems().add(i); } } + + public static Map getMapOfValues() { + return Arrays.stream(values()) + .collect(Collectors.toMap( + v -> v.name(), + v -> v, + (a,b) -> a, + LinkedHashMap::new + )); + } + Integer[] pattern; int[] bytePattern; int width; boolean hiBitMatters; WritableImage preview; - private FillPattern(boolean hiBitMatters, int width, boolean hiBit, String... pattern) { + FillPattern(boolean hiBitMatters, int width, boolean hiBit, String... pattern) { this.pattern = buildPattern(hiBit, pattern); this.width = width; this.hiBitMatters = hiBitMatters; diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRImageEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRImageEditor.java index d39f95c4..2af025e0 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRImageEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRImageEditor.java @@ -11,6 +11,8 @@ package org.badvision.outlaweditor.apple.dhgr; import java.util.HashMap; + +import javafx.scene.image.ImageView; import org.badvision.outlaweditor.apple.*; import javafx.event.EventHandler; import javafx.scene.control.Menu; @@ -19,6 +21,7 @@ import javafx.scene.input.DataFormat; import javafx.scene.input.MouseEvent; import org.badvision.outlaweditor.api.Platform; import org.badvision.outlaweditor.data.DataObserver; +import org.badvision.outlaweditor.ui.PatternSelectModal; /** * @@ -29,7 +32,11 @@ public class AppleDHGRImageEditor extends AppleImageEditor implements EventHandl public AppleDHGRImageEditor() { xScale = 1; yScale = 2; - changeCurrentPattern(FillPattern.Magenta); + if (lastSelectedPattern != null) { + changeCurrentPattern(lastSelectedPattern); + } else { + changeCurrentPattern(FillPattern.Magenta); + } } @Override @@ -48,13 +55,23 @@ public class AppleDHGRImageEditor extends AppleImageEditor implements EventHandl }); } + static FillPattern lastSelectedPattern = null; public void changeCurrentPattern(FillPattern pattern) { currentFillPattern = pattern.getBytePattern(); + lastSelectedPattern = pattern; hiBitMatters = pattern.hiBitMatters; lastActionX = -1; lastActionY = -1; } + public PatternSelectModal buildPatternSelectorModal() { + return new PatternSelectModal<>( + FillPattern::getMapOfValues, + p -> new ImageView(p.getPreview()), + this::changeCurrentPattern + ); + } + @Override public void redrawScanline(int y) { currentImage = Platform.AppleII_DHGR.imageRenderer.renderScanline(currentImage, y, getWidth(), getImageData()); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRTileEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRTileEditor.java index 41e46866..8d7fa604 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRTileEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/AppleDHGRTileEditor.java @@ -12,6 +12,7 @@ package org.badvision.outlaweditor.apple.dhgr; import javafx.scene.Group; import javafx.scene.control.Menu; +import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; @@ -23,6 +24,7 @@ import org.badvision.outlaweditor.api.Platform; import org.badvision.outlaweditor.TileEditor; import org.badvision.outlaweditor.data.xml.Tile; import org.badvision.outlaweditor.data.TileUtils; +import org.badvision.outlaweditor.ui.PatternSelectModal; /** * @@ -73,8 +75,24 @@ public class AppleDHGRTileEditor extends TileEditor { tileEditorAnchorPane.getChildren().add(mainGroup); TileUtils.redrawTile(getEntity()); observedObjectChanged(getEntity()); + registerPatternSelectorModal(tileEditorAnchorPane, buildPatternSelectorModal()); + if (lastSelectedPattern != null) { + changeCurrentPattern(lastSelectedPattern); + } } + @Override + public void unregister() { + // Nothing to do for this editor + } + + public PatternSelectModal buildPatternSelectorModal() { + return new PatternSelectModal<>( + FillPattern::getMapOfValues, + p -> new ImageView(p.getPreview()), + this::changeCurrentPattern + ); + } private void handleMouse(MouseEvent t, int x, int y) { t.consume(); if (t.getButton() == null || t.getButton() == MouseButton.NONE) { @@ -147,20 +165,17 @@ public class AppleDHGRTileEditor extends TileEditor { @Override public void buildPatternSelector(Menu tilePatternMenu) { - FillPattern.buildMenu(tilePatternMenu, (FillPattern object) -> { - changeCurrentPattern(object); - }); + FillPattern.buildMenu(tilePatternMenu, this::changeCurrentPattern); } + FillPattern lastSelectedPattern = null; public void changeCurrentPattern(FillPattern pat) { currentPattern = pat; + lastSelectedPattern = pat; lastActionX = -1; lastActionY = -1; } - @Override - public void unregister() { - } int zoom = 25; Group gridGroup; Rectangle[][] grid; diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/FillPattern.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/FillPattern.java index f98d8e3a..70348846 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/FillPattern.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/apple/dhgr/FillPattern.java @@ -10,9 +10,9 @@ package org.badvision.outlaweditor.apple.dhgr; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; + import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Menu; @@ -176,4 +176,14 @@ public enum FillPattern { } return Platform.AppleII_DHGR.tileRenderer.redrawSprite(b, null, true); } + + public static Map getMapOfValues() { + return Arrays.stream(values()) + .collect(Collectors.toMap( + v -> v.name(), + v -> v, + (a,b) -> a, + LinkedHashMap::new + )); + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/PatternSelectModal.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/PatternSelectModal.java new file mode 100644 index 00000000..defd9f40 --- /dev/null +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/PatternSelectModal.java @@ -0,0 +1,153 @@ +/* + * Copyright 2016 org.badvision. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.badvision.outlaweditor.ui; + +import javafx.animation.ScaleTransition; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; +import javafx.scene.effect.BlurType; +import javafx.scene.effect.DropShadow; +import javafx.scene.image.ImageView; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.scene.text.TextAlignment; +import javafx.util.Callback; +import javafx.util.Duration; +import org.badvision.outlaweditor.api.ApplicationState; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import static org.badvision.outlaweditor.ui.UIAction.fadeOut; + +/** + * Create and manage a pattern selection modal + * @author blurry + */ +public class PatternSelectModal

{ + public static final int GRID_SPACING = 7; + public static final int MAX_TILES_PER_ROW = 16; + public static AnchorPane currentPatternSelector; + Supplier> patternSupplier; + Function imageViewGenerator; + Consumer

selectionCallback; + + public PatternSelectModal(Supplier> patternSupplier, + Function imageViewGenerator, + Consumer

selectionCallback) { + this.patternSupplier = patternSupplier; + this.imageViewGenerator = imageViewGenerator; + this.selectionCallback = selectionCallback; + } + + public void showPatternSelectModal(Pane anchorPane) { + if (currentPatternSelector != null) { + return; + } + currentPatternSelector = new AnchorPane(); + Map selections = patternSupplier.get(); + ImageView firstSelection = imageViewGenerator.apply(selections.values().iterator().next()); + + int TILE_WIDTH = 100; + int TILE_HEIGHT = (int) firstSelection.getImage().getHeight() + 18; + + int tilesPerRow = (int) Math.min(selections.size(), Math.min(MAX_TILES_PER_ROW, anchorPane.getWidth() / (TILE_WIDTH + GRID_SPACING))); + int numRows = (selections.size() + tilesPerRow - 1) / tilesPerRow; + int prefWidth = tilesPerRow * (TILE_WIDTH + GRID_SPACING) + GRID_SPACING; + currentPatternSelector.setPrefWidth(prefWidth); + currentPatternSelector.setPrefHeight(Math.min(numRows * (TILE_HEIGHT + GRID_SPACING) + GRID_SPACING, prefWidth)); + AtomicInteger i = new AtomicInteger(0); + selections.forEach((name, selection) -> { + Button tileIcon = new Button(name, imageViewGenerator.apply(selection)); + tileIcon.setPrefWidth(TILE_WIDTH); + tileIcon.setBackground(Background.EMPTY); + tileIcon.setTextAlignment(TextAlignment.CENTER); + tileIcon.setContentDisplay(ContentDisplay.TOP); + currentPatternSelector.getChildren().add(tileIcon); + tileIcon.setOnMouseClicked((e) -> { + e.consume(); + selectionCallback.accept(selection); + closeCurrentPatternSelector(); + }); + tileIcon.setOnMouseEntered((e) -> { + tileIcon.setEffect(new DropShadow(BlurType.GAUSSIAN, Color.CORNSILK, 5.0, 0.5, 0, 0)); + ScaleTransition st = new ScaleTransition(Duration.millis(150), tileIcon); + st.setAutoReverse(false); + st.setToX(1.25); + st.setToY(1.25); + st.play(); + }); + tileIcon.setOnMouseExited((e) -> { + tileIcon.setEffect(null); + ScaleTransition st = new ScaleTransition(Duration.millis(150), tileIcon); + st.setAutoReverse(false); + st.setToX(1); + st.setToY(1); + st.play(); + }); + tileIcon.setLayoutX(GRID_SPACING + (i.get() % tilesPerRow) * (TILE_WIDTH + GRID_SPACING)); + tileIcon.setLayoutY(GRID_SPACING + (i.get() / tilesPerRow) * (TILE_HEIGHT + GRID_SPACING)); + i.incrementAndGet(); + }); + currentPatternSelector.setLayoutX((anchorPane.getWidth() - currentPatternSelector.getPrefWidth()) / 2); + currentPatternSelector.setLayoutY((anchorPane.getHeight() - currentPatternSelector.getPrefHeight()) / 2); + currentPatternSelector.setBackground( + new Background( + new BackgroundFill( + new Color(0.7, 0.7, 0.9, 0.75), + new CornerRadii(10.0), + null))); + currentPatternSelector.setEffect(new DropShadow(5.0, 1.0, 1.0, Color.BLACK)); + anchorPane.getChildren().add(currentPatternSelector); + ApplicationState.getInstance().getPrimaryStage().getScene().addEventHandler(KeyEvent.KEY_PRESSED, cancelPatternSelectKeyHandler); + ApplicationState.getInstance().getPrimaryStage().getScene().addEventFilter(MouseEvent.MOUSE_PRESSED, cancelPatternSelectMouseHandler); + } + + public void closeCurrentPatternSelector() { + ApplicationState.getInstance().getPrimaryStage().getScene().removeEventHandler(KeyEvent.KEY_PRESSED, cancelPatternSelectKeyHandler); + ApplicationState.getInstance().getPrimaryStage().getScene().removeEventFilter(MouseEvent.MOUSE_PRESSED, cancelPatternSelectMouseHandler); + + fadeOut(currentPatternSelector, (ActionEvent ev) -> { + if (currentPatternSelector != null) { + Pane parent = (Pane) currentPatternSelector.getParent(); + parent.getChildren().remove(currentPatternSelector); + currentPatternSelector = null; + } + }); + } + + private final EventHandler cancelPatternSelectMouseHandler = (MouseEvent e) -> { + if (!(e.getSource() instanceof ImageView)) { + e.consume(); + } + closeCurrentPatternSelector(); + }; + + private final EventHandler cancelPatternSelectKeyHandler = (KeyEvent e) -> { + if (e.getCode() == KeyCode.ESCAPE) { + closeCurrentPatternSelector(); + } + }; +} diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ApplicationUIControllerImpl.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ApplicationUIControllerImpl.java index 26258ae1..1a9c24f8 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ApplicationUIControllerImpl.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ApplicationUIControllerImpl.java @@ -10,8 +10,11 @@ package org.badvision.outlaweditor.ui.impl; +import javafx.application.Platform; import javafx.event.Event; import javafx.scene.input.DataFormat; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; import org.badvision.outlaweditor.Editor; import org.badvision.outlaweditor.api.ApplicationState; import org.badvision.outlaweditor.data.TileUtils; @@ -38,13 +41,22 @@ public class ApplicationUIControllerImpl extends ApplicationUIController { imageController.initalize(); globalController.initialize(); menuController.initalize(); + Platform.runLater(()-> { + ApplicationState.getInstance().getPrimaryStage().getScene().addEventHandler(KeyEvent.KEY_PRESSED, this::keyPressed); + }); + } + private void keyPressed(KeyEvent e) { + if (e.isControlDown() && e.getCode() == KeyCode.SPACE) { + e.consume(); + if (getVisibleEditor() != null) { + getVisibleEditor().showSelectorModal(); + } + } } @Override public void platformChange() { - ApplicationState.getInstance().getGameData().getTile().stream().forEach((t) -> { - TileUtils.redrawTile(t); - }); + ApplicationState.getInstance().getGameData().getTile().stream().forEach(TileUtils::redrawTile); Tile tile = tileController.getCurrentTile(); rebuildTileSelectors(); tileController.setCurrentTile(tile); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ImageEditorTabControllerImpl.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ImageEditorTabControllerImpl.java index 3b0fb6b4..d163f182 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ImageEditorTabControllerImpl.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/ImageEditorTabControllerImpl.java @@ -9,6 +9,7 @@ */ package org.badvision.outlaweditor.ui.impl; +import java.util.Comparator; import java.util.EnumMap; import java.util.List; import java.util.logging.Level; @@ -263,13 +264,9 @@ public class ImageEditorTabControllerImpl extends ImageEditorTabController { Image i = getCurrentImage(); imageSelector.getItems().clear(); List allImages = ApplicationState.getInstance().getGameData().getImage(); - allImages.sort((Image o1, Image o2) -> { - int c1 = String.valueOf(o1.getCategory()).compareTo(String.valueOf(o2.getCategory())); - if (c1 != 0) { - return c1; - } - return String.valueOf(o1.getName()).compareTo(String.valueOf(o2.getName())); - }); + allImages.sort(Comparator + .comparing((Image o) -> String.valueOf(o.getCategory())) + .thenComparing(o -> String.valueOf(o.getName()))); imageSelector.getItems().addAll(allImages); imageSelector.getSelectionModel().select(i); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/SheetEditorControllerImpl.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/SheetEditorControllerImpl.java index 991f7ebb..f0148a7d 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/SheetEditorControllerImpl.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/SheetEditorControllerImpl.java @@ -23,20 +23,16 @@ import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.scene.control.MenuItem; -import javafx.scene.control.TableColumn; import javafx.stage.FileChooser; import javax.xml.bind.JAXBException; import org.badvision.outlaweditor.SheetEditor; import org.badvision.outlaweditor.TransferHelper; import org.badvision.outlaweditor.data.DataUtilities; -import static org.badvision.outlaweditor.data.DataUtilities.getValue; -import static org.badvision.outlaweditor.data.DataUtilities.setValue; import org.badvision.outlaweditor.data.xml.Columns; import org.badvision.outlaweditor.data.xml.Rows; import org.badvision.outlaweditor.data.xml.Rows.Row; @@ -48,6 +44,9 @@ import org.controlsfx.control.spreadsheet.GridBase; import org.controlsfx.control.spreadsheet.SpreadsheetCell; import org.controlsfx.control.spreadsheet.SpreadsheetCellBase; +import static org.badvision.outlaweditor.data.DataUtilities.getValue; +import static org.badvision.outlaweditor.data.DataUtilities.setValue; + public class SheetEditorControllerImpl extends SheetEditorController { private SheetEditor editor; @@ -66,10 +65,26 @@ public class SheetEditorControllerImpl extends SheetEditorController { table.getContextMenu().getItems().addAll( createMenuItem("Insert Row", () -> insertRow(new Row(), getSelectedRow())), createMenuItem("Clone Row", () -> cloneRow(editor.getSheet().getRows().getRow().get(getSelectedRow()))), - createMenuItem("Delete Row", () -> deleteRowWithConfirmation(editor.getSheet().getRows().getRow().get(getSelectedRow()))) + createMenuItem("Delete Row", () -> deleteRowWithConfirmation(editor.getSheet().getRows().getRow().get(getSelectedRow()))), + createMenuItem("Sort by", () -> { + int sortCol = table.getSelectionModel().getFocusedCell().getColumn(); + table.setComparator((a,b)->compare(a.get(sortCol).getItem(), b.get(sortCol).getItem())); + }) ); } - + + public int compare(Object a, Object b) { + if (a == null) return -1; + if (b == null) return 1; + String aStr = String.valueOf(a); + String bStr = String.valueOf(b); + try { + return (Double.compare(Double.parseDouble(aStr), Double.parseDouble(bStr))); + } catch (NumberFormatException ex) { + return aStr.compareTo(bStr); + } + } + private int getSelectedRow() { return table.getSelectionModel().getFocusedCell().getRow(); } @@ -218,7 +233,7 @@ public class SheetEditorControllerImpl extends SheetEditorController { private void cloneRow(Row row) { try { - Row newRow = TransferHelper.cloneObject(row, Row.class, "row"); + Row newRow = TransferHelper.cloneObject(row, Row.class, "row"); int pos = editor.getSheet().getRows().getRow().indexOf(row); insertRow(newRow, pos); } catch (JAXBException ex) { diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/TileEditorTabControllerImpl.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/TileEditorTabControllerImpl.java index 9621b2d7..cb147492 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/TileEditorTabControllerImpl.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/impl/TileEditorTabControllerImpl.java @@ -11,6 +11,7 @@ package org.badvision.outlaweditor.ui.impl; import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -19,6 +20,7 @@ import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.scene.control.ListView; import javafx.scene.image.ImageView; +import javafx.scene.layout.FlowPane; import javafx.util.StringConverter; import org.badvision.outlaweditor.TileEditor; import org.badvision.outlaweditor.api.ApplicationState; @@ -41,7 +43,7 @@ import static org.badvision.outlaweditor.ui.UIAction.confirm; * @author blurry */ public class TileEditorTabControllerImpl extends TileEditorTabController { - + FlowPane quickMenu = new FlowPane(); ChangeListener rebuildListener = (ObservableValue value, Object oldValue, Object newValue) -> rebuildTileSelectors(); @Override @@ -187,6 +189,9 @@ public class TileEditorTabControllerImpl extends TileEditorTabController { return; } tileEditorAnchorPane.getChildren().clear(); + if (getCurrentTileEditor() != null) { + getCurrentTileEditor().unregister(); + } if (t == null) { bind(tileIdField.textProperty(), null); bind(tileCategoryField.textProperty(), null); @@ -244,13 +249,7 @@ public class TileEditorTabControllerImpl extends TileEditorTabController { Tile t = getCurrentTile(); tileSelector.getItems().clear(); List allTiles = ApplicationState.getInstance().getGameData().getTile(); - allTiles.sort((Tile o1, Tile o2) -> { - int c1 = String.valueOf(o1.getCategory()).compareTo(String.valueOf(o2.getCategory())); - if (c1 != 0) { - return c1; - } - return String.valueOf(o1.getName()).compareTo(String.valueOf(o2.getName())); - }); + allTiles.sort(Comparator.comparing((Tile o) -> String.valueOf(o.getCategory())).thenComparing(o -> String.valueOf(o.getName()))); tileSelector.getItems().addAll(allTiles); tileSelector.getSelectionModel().select(allTiles.indexOf(getCurrentTile())); setCurrentTile(t);