Search results list rigged to add cheats when double-clicked. UI for side panels is vastly improved and ready for use.

This commit is contained in:
Brendan Robert 2015-08-23 23:55:56 -05:00
parent 926485ac38
commit 8ff0987801
3 changed files with 194 additions and 186 deletions

View File

@ -49,6 +49,10 @@ public class MetaCheat extends Cheats {
public String toString() { public String toString() {
return Integer.toHexString(address) + ": " + lastObservedValue + " (" + Integer.toHexString(lastObservedValue) + ")"; return Integer.toHexString(address) + ": " + lastObservedValue + " (" + Integer.toHexString(lastObservedValue) + ")";
} }
public int getAddress() {
return address;
}
} }
MetacheatUI ui; MetacheatUI ui;

View File

@ -6,6 +6,7 @@ import jace.cheat.DynamicCheat;
import jace.cheat.MemoryCell; import jace.cheat.MemoryCell;
import jace.cheat.MetaCheat; import jace.cheat.MetaCheat;
import jace.cheat.MetaCheat.SearchChangeType; import jace.cheat.MetaCheat.SearchChangeType;
import jace.cheat.MetaCheat.SearchResult;
import jace.cheat.MetaCheat.SearchType; import jace.cheat.MetaCheat.SearchType;
import jace.core.RAMListener; import jace.core.RAMListener;
import jace.state.State; import jace.state.State;
@ -125,21 +126,11 @@ public class MetacheatUI {
@FXML @FXML
private TableView<DynamicCheat> cheatsTableView; private TableView<DynamicCheat> cheatsTableView;
@FXML
void addCheat(ActionEvent event) {
cheatEngine.addCheat(new DynamicCheat(0, "?"));
}
@FXML @FXML
void createSnapshot(ActionEvent event) { void createSnapshot(ActionEvent event) {
} }
@FXML
void deleteCheat(ActionEvent event) {
cheatsTableView.getSelectionModel().getSelectedItems().forEach(cheatEngine::removeCheat);
}
@FXML @FXML
void deleteSnapshot(ActionEvent event) { void deleteSnapshot(ActionEvent event) {
@ -150,11 +141,26 @@ public class MetacheatUI {
} }
@FXML
void addCheat(ActionEvent event) {
cheatEngine.addCheat(new DynamicCheat(0, "?"));
}
@FXML
void deleteCheat(ActionEvent event) {
cheatsTableView.getSelectionModel().getSelectedItems().forEach(cheatEngine::removeCheat);
}
@FXML @FXML
void loadCheats(ActionEvent event) { void loadCheats(ActionEvent event) {
} }
@FXML
void saveCheats(ActionEvent event) {
}
@FXML @FXML
void newSearch(ActionEvent event) { void newSearch(ActionEvent event) {
Platform.runLater(() -> { Platform.runLater(() -> {
@ -174,11 +180,6 @@ public class MetacheatUI {
}); });
} }
@FXML
void saveCheats(ActionEvent event) {
}
@FXML @FXML
void search(ActionEvent event) { void search(ActionEvent event) {
Platform.runLater(() -> { Platform.runLater(() -> {
@ -252,6 +253,13 @@ public class MetacheatUI {
} }
}); });
searchResultsListView.setEditable(true);
searchResultsListView.setOnEditStart((editEvent) -> {
editEvent.consume();
SearchResult result = cheatEngine.getSearchResults().get(editEvent.getIndex());
addWatch(result.getAddress());
});
memoryViewCanvas.setMouseTransparent(false); memoryViewCanvas.setMouseTransparent(false);
memoryViewCanvas.addEventFilter(MouseEvent.MOUSE_CLICKED, this::memoryViewClicked); memoryViewCanvas.addEventFilter(MouseEvent.MOUSE_CLICKED, this::memoryViewClicked);
showValuesCheckbox.selectedProperty().addListener((prop, oldVal, newVal) -> { showValuesCheckbox.selectedProperty().addListener((prop, oldVal, newVal) -> {
@ -268,8 +276,6 @@ public class MetacheatUI {
searchStartAddressField.textProperty().addListener(addressRangeListener); searchStartAddressField.textProperty().addListener(addressRangeListener);
searchEndAddressField.textProperty().addListener(addressRangeListener); searchEndAddressField.textProperty().addListener(addressRangeListener);
RAMListener l;
TableColumn<DynamicCheat, Boolean> activeColumn = (TableColumn<DynamicCheat, Boolean>) cheatsTableView.getColumns().get(0); TableColumn<DynamicCheat, Boolean> activeColumn = (TableColumn<DynamicCheat, Boolean>) cheatsTableView.getColumns().get(0);
activeColumn.setCellValueFactory(new PropertyValueFactory<>("active")); activeColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
activeColumn.setCellFactory((TableColumn<DynamicCheat, Boolean> param) -> new CheckBoxTableCell<>()); activeColumn.setCellFactory((TableColumn<DynamicCheat, Boolean> param) -> new CheckBoxTableCell<>());
@ -326,8 +332,6 @@ public class MetacheatUI {
public static Set<MemoryCell> redrawNodes = new ConcurrentSkipListSet<>(); public static Set<MemoryCell> redrawNodes = new ConcurrentSkipListSet<>();
ScheduledExecutorService animationTimer = null; ScheduledExecutorService animationTimer = null;
ScheduledFuture animationFuture = null; ScheduledFuture animationFuture = null;
StackPane pane = new StackPane();
Tooltip memoryWatchTooltip = new Tooltip(); Tooltip memoryWatchTooltip = new Tooltip();
private void memoryViewClicked(MouseEvent e) { private void memoryViewClicked(MouseEvent e) {
@ -356,7 +360,7 @@ public class MetacheatUI {
Label addCheat = new Label("Cheat >>"); Label addCheat = new Label("Cheat >>");
addCheat.setOnMouseClicked((mouseEvent) -> { addCheat.setOnMouseClicked((mouseEvent) -> {
addCheat(addr, watch.getValue()); Platform.runLater(() -> addCheat(addr, watch.getValue()));
}); });
watch.getChildren().add(addCheat); watch.getChildren().add(addCheat);
@ -406,7 +410,7 @@ public class MetacheatUI {
animationFuture.cancel(false); animationFuture.cancel(false);
} }
animationFuture = animationTimer.scheduleAtFixedRate(this::processMemoryViewUpdates, FRAME_RATE, 1000 / 60, TimeUnit.MILLISECONDS); animationFuture = animationTimer.scheduleAtFixedRate(this::processMemoryViewUpdates, FRAME_RATE, FRAME_RATE, TimeUnit.MILLISECONDS);
cheatEngine.initMemoryView(); cheatEngine.initMemoryView();
int pixelsPerBlock = 16 * MEMORY_BOX_TOTAL_SIZE; int pixelsPerBlock = 16 * MEMORY_BOX_TOTAL_SIZE;
@ -492,5 +496,4 @@ public class MetacheatUI {
private void addCheat(int addr, int val) { private void addCheat(int addr, int val) {
cheatEngine.addCheat(new DynamicCheat(addr, String.valueOf(val))); cheatEngine.addCheat(new DynamicCheat(addr, String.valueOf(val)));
} }
} }

View File

@ -7,7 +7,7 @@
<?import java.lang.*?> <?import java.lang.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="492.0" prefWidth="702.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="jace.ui.MetacheatUI"> <VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="520.0" prefWidth="710.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="jace.ui.MetacheatUI">
<children> <children>
<ToolBar prefHeight="40.0" prefWidth="200.0" VBox.vgrow="NEVER"> <ToolBar prefHeight="40.0" prefWidth="200.0" VBox.vgrow="NEVER">
<items> <items>
@ -31,17 +31,19 @@
</children> </children>
</StackPane> </StackPane>
</content></ScrollPane> </content></ScrollPane>
<Accordion centerShape="false" scaleShape="false"> <ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="200.0" prefWidth="200.0">
<panes>
<TitledPane prefHeight="200.0" prefWidth="200.0" text="Search">
<content> <content>
<VBox prefHeight="200.0" prefWidth="100.0"> <VBox>
<children> <children>
<TabPane fx:id="searchTypesTabPane" prefHeight="147.0" prefWidth="233.0" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="NEVER"> <TitledPane expanded="false" minHeight="-Infinity" prefWidth="200.0" text="Search" VBox.vgrow="NEVER">
<content>
<VBox>
<children>
<TabPane fx:id="searchTypesTabPane" prefWidth="233.0" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="NEVER">
<tabs> <tabs>
<Tab text="Value"> <Tab text="Value">
<content> <content>
<VBox prefHeight="200.0" prefWidth="100.0"> <VBox prefWidth="100.0">
<children> <children>
<FlowPane prefHeight="43.0" prefWidth="233.0"> <FlowPane prefHeight="43.0" prefWidth="233.0">
<children> <children>
@ -65,7 +67,7 @@
<Font name="System Italic" size="13.0" /> <Font name="System Italic" size="13.0" />
</font> </font>
</Label> </Label>
<HBox prefHeight="100.0" prefWidth="200.0"> <HBox prefWidth="200.0" VBox.vgrow="NEVER">
<children> <children>
<RadioButton fx:id="searchTypeByte" mnemonicParsing="false" selected="true" text="Byte"> <RadioButton fx:id="searchTypeByte" mnemonicParsing="false" selected="true" text="Byte">
<HBox.margin> <HBox.margin>
@ -101,7 +103,7 @@
</Tab> </Tab>
<Tab text="Change"> <Tab text="Change">
<content> <content>
<VBox nodeOrientation="LEFT_TO_RIGHT" prefHeight="200.0" prefWidth="100.0"> <VBox nodeOrientation="LEFT_TO_RIGHT" prefHeight="112.0" prefWidth="217.0">
<children> <children>
<RadioButton fx:id="searchChangeNoneOption" mnemonicParsing="false" text="No changes since last search"> <RadioButton fx:id="searchChangeNoneOption" mnemonicParsing="false" text="No changes since last search">
<opaqueInsets> <opaqueInsets>
@ -125,7 +127,7 @@
</padding> </padding>
</RadioButton> </RadioButton>
<RadioButton fx:id="searchChangeGreaterOption" mnemonicParsing="false" text="Greater than last search" toggleGroup="$changeSearchType" /> <RadioButton fx:id="searchChangeGreaterOption" mnemonicParsing="false" text="Greater than last search" toggleGroup="$changeSearchType" />
<FlowPane prefHeight="200.0" prefWidth="200.0"> <FlowPane prefWidth="200.0">
<children> <children>
<RadioButton fx:id="searchChangeByOption" mnemonicParsing="false" text="Change by: " toggleGroup="$changeSearchType" /> <RadioButton fx:id="searchChangeByOption" mnemonicParsing="false" text="Change by: " toggleGroup="$changeSearchType" />
<TextField fx:id="searchChangeByField" prefHeight="26.0" prefWidth="76.0" /> <TextField fx:id="searchChangeByField" prefHeight="26.0" prefWidth="76.0" />
@ -152,21 +154,47 @@
</ToolBar> </ToolBar>
<HBox prefHeight="19.0" prefWidth="235.0"> <HBox prefHeight="19.0" prefWidth="235.0">
<children> <children>
<Label text="Results:" HBox.hgrow="NEVER" /> <Label prefWidth="80.0" text="Results:" HBox.hgrow="NEVER" />
<Label fx:id="searchStatusLabel" prefHeight="16.0" prefWidth="181.0" textAlignment="RIGHT" wrapText="true" HBox.hgrow="ALWAYS" /> <Label fx:id="searchStatusLabel" prefHeight="16.0" prefWidth="181.0" textAlignment="RIGHT" wrapText="true" HBox.hgrow="ALWAYS" />
</children> </children>
</HBox> </HBox>
<ListView fx:id="searchResultsListView" prefHeight="125.0" prefWidth="233.0" VBox.vgrow="ALWAYS" /> <ListView fx:id="searchResultsListView" minHeight="25.0" prefHeight="75.0" VBox.vgrow="ALWAYS" />
</children> </children>
</VBox> </VBox>
</content> </content>
</TitledPane> </TitledPane>
<TitledPane animated="false" text="Watches"> <TitledPane text="Watches" VBox.vgrow="NEVER">
<content> <content>
<TilePane fx:id="watchesPane" prefHeight="200.0" prefWidth="200.0" /> <TilePane fx:id="watchesPane" alignment="TOP_CENTER" hgap="5.0" prefTileHeight="120.0" prefTileWidth="65.0" prefWidth="200.0" tileAlignment="TOP_CENTER" vgap="5.0" />
</content> </content>
</TitledPane> </TitledPane>
<TitledPane animated="false" text="Snapshots"> <TitledPane text="Cheats" VBox.vgrow="NEVER">
<content>
<BorderPane>
<bottom>
<ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<items>
<Button mnemonicParsing="false" onAction="#addCheat" text="Add" />
<Button mnemonicParsing="false" onAction="#deleteCheat" text="Delete" />
<Button mnemonicParsing="false" onAction="#loadCheats" text="Load" />
<Button mnemonicParsing="false" onAction="#saveCheats" text="Save" />
</items>
</ToolBar>
</bottom>
<center>
<TableView fx:id="cheatsTableView" editable="true" minHeight="75.0" BorderPane.alignment="CENTER">
<columns>
<TableColumn prefWidth="28.0" sortable="false" text="On" />
<TableColumn prefWidth="77.0" text="Name" />
<TableColumn minWidth="9.0" prefWidth="42.0" text="Addr" />
<TableColumn prefWidth="88.0" text="Effect" />
</columns>
</TableView>
</center>
</BorderPane>
</content>
</TitledPane>
<TitledPane expanded="false" text="Snapshots" VBox.vgrow="NEVER">
<content> <content>
<BorderPane minWidth="-Infinity"> <BorderPane minWidth="-Infinity">
<bottom> <bottom>
@ -179,42 +207,15 @@
</ToolBar> </ToolBar>
</bottom> </bottom>
<center> <center>
<ListView fx:id="snapshotsListView" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> <ListView fx:id="snapshotsListView" minHeight="25.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</center> </center>
</BorderPane> </BorderPane>
</content> </content>
</TitledPane> </TitledPane>
<TitledPane animated="false" text="Cheats"> </children>
<content> </VBox>
<BorderPane prefHeight="200.0" prefWidth="200.0">
<bottom>
<ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<items>
<Button mnemonicParsing="false" onAction="#addCheat" text="Add" />
<Button mnemonicParsing="false" onAction="#deleteCheat" text="Delete" />
<Button mnemonicParsing="false" onAction="#loadCheats" text="Load" />
<Button mnemonicParsing="false" onAction="#saveCheats" text="Save" />
</items>
</ToolBar>
</bottom>
<center>
<TableView fx:id="cheatsTableView" editable="true" prefHeight="321.0" prefWidth="207.0" BorderPane.alignment="CENTER">
<columns>
<TableColumn prefWidth="26.0" sortable="false" text="On" />
<TableColumn prefWidth="74.0" text="Name" />
<TableColumn prefWidth="50.0" text="Addr" />
<TableColumn prefWidth="84.0" text="Effect" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
</center>
</BorderPane>
</content> </content>
</TitledPane> </ScrollPane>
</panes>
</Accordion>
</items> </items>
</SplitPane> </SplitPane>
</children> </children>