Merge branch 'master' of github.com:badvision/lawless-legends

This commit is contained in:
Martin Haye 2019-06-13 10:08:55 -07:00
commit c588e794b4
17 changed files with 370 additions and 73 deletions

View File

@ -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>

View File

@ -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();
}

View File

@ -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.

View File

@ -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);
}
}

View File

@ -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);
}
/**

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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());

View File

@ -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;

View File

@ -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
));
}
}

View File

@ -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();
}
};
}

View File

@ -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);

View File

@ -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);

View File

@ -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) {

View File

@ -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);