mirror of
https://github.com/badvision/lawless-legends.git
synced 2025-03-03 16:29:06 +00:00
Merge branch 'master' of github.com:badvision/lawless-legends
This commit is contained in:
commit
c588e794b4
@ -170,7 +170,7 @@
|
||||
<dependency>
|
||||
<groupId>org.controlsfx</groupId>
|
||||
<artifactId>controlsfx</artifactId>
|
||||
<version>8.40.14</version>
|
||||
<version>8.40.15</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
@ -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<T, D> implements DataObserver<T> {
|
||||
protected void onEntityUpdated() {
|
||||
|
||||
}
|
||||
|
||||
public abstract void showSelectorModal();
|
||||
}
|
||||
|
@ -81,6 +81,11 @@ public class GlobalEditor extends Editor<Global, Void>{
|
||||
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.
|
||||
|
@ -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<Image, ImageEditor.DrawMode> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -138,21 +138,18 @@ public class MapEditor extends Editor<Map, MapEditor.DrawMode> 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<Map, MapEditor.DrawMode> implements EventH
|
||||
drawCanvas.heightProperty().unbind();
|
||||
anchorPane.getChildren().remove(drawCanvas);
|
||||
currentMap.updateBackingMap();
|
||||
ApplicationState.getInstance().getPrimaryStage().getScene().removeEventHandler(KeyEvent.KEY_PRESSED, this::keyPressed);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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<Tile, TileEditor.DrawMode> {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -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<MouseEvent> {
|
||||
|
||||
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<MouseE
|
||||
screen.setOnMouseReleased(this);
|
||||
screen.setOnMouseDragged(this);
|
||||
screen.setOnMouseDragReleased(this);
|
||||
if (lastSelectedPattern != null) {
|
||||
changeCurrentPattern(lastSelectedPattern);
|
||||
}
|
||||
registerPatternSelectorModal(editorAnchorPane, buildPatternSelectorModal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildPatternSelector(Menu tilePatternMenu) {
|
||||
FillPattern.buildMenu(tilePatternMenu, (FillPattern object) -> {
|
||||
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;
|
||||
|
@ -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>(
|
||||
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;
|
||||
|
@ -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<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent t) {
|
||||
dataObserver.observedObjectChanged(fill);
|
||||
}
|
||||
});
|
||||
i.setOnAction(t -> dataObserver.observedObjectChanged(fill));
|
||||
target.getItems().add(i);
|
||||
}
|
||||
}
|
||||
|
||||
public static Map<String,FillPattern> 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;
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
@ -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<String, FillPattern> getMapOfValues() {
|
||||
return Arrays.stream(values())
|
||||
.collect(Collectors.toMap(
|
||||
v -> v.name(),
|
||||
v -> v,
|
||||
(a,b) -> a,
|
||||
LinkedHashMap::new
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -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<P> {
|
||||
public static final int GRID_SPACING = 7;
|
||||
public static final int MAX_TILES_PER_ROW = 16;
|
||||
public static AnchorPane currentPatternSelector;
|
||||
Supplier<Map<String, P>> patternSupplier;
|
||||
Function<P, ImageView> imageViewGenerator;
|
||||
Consumer<P> selectionCallback;
|
||||
|
||||
public PatternSelectModal(Supplier<Map<String, P>> patternSupplier,
|
||||
Function<P, ImageView> imageViewGenerator,
|
||||
Consumer<P> selectionCallback) {
|
||||
this.patternSupplier = patternSupplier;
|
||||
this.imageViewGenerator = imageViewGenerator;
|
||||
this.selectionCallback = selectionCallback;
|
||||
}
|
||||
|
||||
public void showPatternSelectModal(Pane anchorPane) {
|
||||
if (currentPatternSelector != null) {
|
||||
return;
|
||||
}
|
||||
currentPatternSelector = new AnchorPane();
|
||||
Map<String, P> 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<MouseEvent> cancelPatternSelectMouseHandler = (MouseEvent e) -> {
|
||||
if (!(e.getSource() instanceof ImageView)) {
|
||||
e.consume();
|
||||
}
|
||||
closeCurrentPatternSelector();
|
||||
};
|
||||
|
||||
private final EventHandler<KeyEvent> cancelPatternSelectKeyHandler = (KeyEvent e) -> {
|
||||
if (e.getCode() == KeyCode.ESCAPE) {
|
||||
closeCurrentPatternSelector();
|
||||
}
|
||||
};
|
||||
}
|
@ -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);
|
||||
|
@ -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<Image> 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);
|
||||
|
@ -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) {
|
||||
|
@ -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<Tile> 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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user