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() {
return Integer.toHexString(address) + ": " + lastObservedValue + " (" + Integer.toHexString(lastObservedValue) + ")";
}
public int getAddress() {
return address;
}
}
MetacheatUI ui;

View File

@ -6,6 +6,7 @@ import jace.cheat.DynamicCheat;
import jace.cheat.MemoryCell;
import jace.cheat.MetaCheat;
import jace.cheat.MetaCheat.SearchChangeType;
import jace.cheat.MetaCheat.SearchResult;
import jace.cheat.MetaCheat.SearchType;
import jace.core.RAMListener;
import jace.state.State;
@ -125,21 +126,11 @@ public class MetacheatUI {
@FXML
private TableView<DynamicCheat> cheatsTableView;
@FXML
void addCheat(ActionEvent event) {
cheatEngine.addCheat(new DynamicCheat(0, "?"));
}
@FXML
void createSnapshot(ActionEvent event) {
}
@FXML
void deleteCheat(ActionEvent event) {
cheatsTableView.getSelectionModel().getSelectedItems().forEach(cheatEngine::removeCheat);
}
@FXML
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
void loadCheats(ActionEvent event) {
}
@FXML
void saveCheats(ActionEvent event) {
}
@FXML
void newSearch(ActionEvent event) {
Platform.runLater(() -> {
@ -174,11 +180,6 @@ public class MetacheatUI {
});
}
@FXML
void saveCheats(ActionEvent event) {
}
@FXML
void search(ActionEvent event) {
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.addEventFilter(MouseEvent.MOUSE_CLICKED, this::memoryViewClicked);
showValuesCheckbox.selectedProperty().addListener((prop, oldVal, newVal) -> {
@ -268,8 +276,6 @@ public class MetacheatUI {
searchStartAddressField.textProperty().addListener(addressRangeListener);
searchEndAddressField.textProperty().addListener(addressRangeListener);
RAMListener l;
TableColumn<DynamicCheat, Boolean> activeColumn = (TableColumn<DynamicCheat, Boolean>) cheatsTableView.getColumns().get(0);
activeColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
activeColumn.setCellFactory((TableColumn<DynamicCheat, Boolean> param) -> new CheckBoxTableCell<>());
@ -326,8 +332,6 @@ public class MetacheatUI {
public static Set<MemoryCell> redrawNodes = new ConcurrentSkipListSet<>();
ScheduledExecutorService animationTimer = null;
ScheduledFuture animationFuture = null;
StackPane pane = new StackPane();
Tooltip memoryWatchTooltip = new Tooltip();
private void memoryViewClicked(MouseEvent e) {
@ -356,7 +360,7 @@ public class MetacheatUI {
Label addCheat = new Label("Cheat >>");
addCheat.setOnMouseClicked((mouseEvent) -> {
addCheat(addr, watch.getValue());
Platform.runLater(() -> addCheat(addr, watch.getValue()));
});
watch.getChildren().add(addCheat);
@ -406,7 +410,7 @@ public class MetacheatUI {
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();
int pixelsPerBlock = 16 * MEMORY_BOX_TOTAL_SIZE;
@ -492,5 +496,4 @@ public class MetacheatUI {
private void addCheat(int addr, int val) {
cheatEngine.addCheat(new DynamicCheat(addr, String.valueOf(val)));
}
}

View File

@ -7,7 +7,7 @@
<?import java.lang.*?>
<?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>
<ToolBar prefHeight="40.0" prefWidth="200.0" VBox.vgrow="NEVER">
<items>
@ -31,190 +31,191 @@
</children>
</StackPane>
</content></ScrollPane>
<Accordion centerShape="false" scaleShape="false">
<panes>
<TitledPane prefHeight="200.0" prefWidth="200.0" text="Search">
<content>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<TabPane fx:id="searchTypesTabPane" prefHeight="147.0" prefWidth="233.0" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="NEVER">
<tabs>
<Tab text="Value">
<content>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<FlowPane prefHeight="43.0" prefWidth="233.0">
<ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="200.0" prefWidth="200.0">
<content>
<VBox>
<children>
<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>
<Tab text="Value">
<content>
<VBox prefWidth="100.0">
<children>
<Label text="Search for value:">
<FlowPane prefHeight="43.0" prefWidth="233.0">
<children>
<Label text="Search for value:">
<padding>
<Insets right="3.0" />
</padding>
</Label>
<TextField fx:id="searchValueField" prefHeight="26.0" prefWidth="75.0" />
</children>
<padding>
<Insets right="3.0" />
<Insets top="3.0" />
</padding>
<VBox.margin>
<Insets bottom="4.0" />
</VBox.margin>
</FlowPane>
<Separator prefWidth="200.0" />
<Label text="These affect Change searches also.">
<font>
<Font name="System Italic" size="13.0" />
</font>
</Label>
<TextField fx:id="searchValueField" prefHeight="26.0" prefWidth="75.0" />
<HBox prefWidth="200.0" VBox.vgrow="NEVER">
<children>
<RadioButton fx:id="searchTypeByte" mnemonicParsing="false" selected="true" text="Byte">
<HBox.margin>
<Insets left="2.0" />
</HBox.margin>
<toggleGroup>
<ToggleGroup fx:id="searchSize" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="searchTypeWord" mnemonicParsing="false" text="Word" toggleGroup="$searchSize">
<HBox.margin>
<Insets />
</HBox.margin>
<padding>
<Insets left="2.0" right="2.0" />
</padding>
</RadioButton>
<CheckBox fx:id="searchTypeSigned" mnemonicParsing="false" text="Signed" />
</children>
<opaqueInsets>
<Insets />
</opaqueInsets>
<padding>
<Insets bottom="3.0" top="3.0" />
</padding>
</HBox>
</children>
<padding>
<Insets top="3.0" />
<Insets left="5.0" />
</padding>
<VBox.margin>
<Insets bottom="4.0" />
</VBox.margin>
</FlowPane>
<Separator prefWidth="200.0" />
<Label text="These affect Change searches also.">
<font>
<Font name="System Italic" size="13.0" />
</font>
</Label>
<HBox prefHeight="100.0" prefWidth="200.0">
</VBox>
</content>
</Tab>
<Tab text="Change">
<content>
<VBox nodeOrientation="LEFT_TO_RIGHT" prefHeight="112.0" prefWidth="217.0">
<children>
<RadioButton fx:id="searchTypeByte" mnemonicParsing="false" selected="true" text="Byte">
<HBox.margin>
<Insets left="2.0" />
</HBox.margin>
<RadioButton fx:id="searchChangeNoneOption" mnemonicParsing="false" text="No changes since last search">
<opaqueInsets>
<Insets />
</opaqueInsets>
<padding>
<Insets bottom="3.0" top="2.0" />
</padding>
<toggleGroup>
<ToggleGroup fx:id="searchSize" />
<ToggleGroup fx:id="changeSearchType" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="searchTypeWord" mnemonicParsing="false" text="Word" toggleGroup="$searchSize">
<HBox.margin>
<Insets />
</HBox.margin>
<RadioButton fx:id="searchChangeAnyOption" mnemonicParsing="false" text="Any changes since last search" toggleGroup="$changeSearchType">
<padding>
<Insets left="2.0" right="2.0" />
<Insets bottom="3.0" />
</padding>
</RadioButton>
<CheckBox fx:id="searchTypeSigned" mnemonicParsing="false" text="Signed" />
<RadioButton fx:id="searchChangeLessOption" mnemonicParsing="false" text="Less than last search" toggleGroup="$changeSearchType">
<padding>
<Insets bottom="3.0" />
</padding>
</RadioButton>
<RadioButton fx:id="searchChangeGreaterOption" mnemonicParsing="false" text="Greater than last search" toggleGroup="$changeSearchType" />
<FlowPane prefWidth="200.0">
<children>
<RadioButton fx:id="searchChangeByOption" mnemonicParsing="false" text="Change by: " toggleGroup="$changeSearchType" />
<TextField fx:id="searchChangeByField" prefHeight="26.0" prefWidth="76.0" />
</children>
</FlowPane>
</children>
<opaqueInsets>
<Insets />
</opaqueInsets>
<padding>
<Insets bottom="3.0" top="3.0" />
<Insets left="2.0" />
</padding>
</HBox>
</children>
<padding>
<Insets left="5.0" />
</padding>
</VBox>
</content>
</Tab>
<Tab text="Change">
<content>
<VBox nodeOrientation="LEFT_TO_RIGHT" prefHeight="200.0" prefWidth="100.0">
<children>
<RadioButton fx:id="searchChangeNoneOption" mnemonicParsing="false" text="No changes since last search">
<opaqueInsets>
<Insets />
</opaqueInsets>
<padding>
<Insets bottom="3.0" top="2.0" />
</padding>
<toggleGroup>
<ToggleGroup fx:id="changeSearchType" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="searchChangeAnyOption" mnemonicParsing="false" text="Any changes since last search" toggleGroup="$changeSearchType">
<padding>
<Insets bottom="3.0" />
</padding>
</RadioButton>
<RadioButton fx:id="searchChangeLessOption" mnemonicParsing="false" text="Less than last search" toggleGroup="$changeSearchType">
<padding>
<Insets bottom="3.0" />
</padding>
</RadioButton>
<RadioButton fx:id="searchChangeGreaterOption" mnemonicParsing="false" text="Greater than last search" toggleGroup="$changeSearchType" />
<FlowPane prefHeight="200.0" prefWidth="200.0">
<children>
<RadioButton fx:id="searchChangeByOption" mnemonicParsing="false" text="Change by: " toggleGroup="$changeSearchType" />
<TextField fx:id="searchChangeByField" prefHeight="26.0" prefWidth="76.0" />
</children>
</FlowPane>
</children>
<opaqueInsets>
<Insets />
</opaqueInsets>
<padding>
<Insets left="2.0" />
</padding>
</VBox>
</content>
</Tab>
<Tab text="Text" />
</tabs>
</TabPane>
<ToolBar prefHeight="40.0" prefWidth="200.0" VBox.vgrow="NEVER">
<items>
<Button mnemonicParsing="false" onAction="#newSearch" text="New Search" />
<Button mnemonicParsing="false" onAction="#search" text="Search" />
</items>
</ToolBar>
<HBox prefHeight="19.0" prefWidth="235.0">
<children>
<Label text="Results:" HBox.hgrow="NEVER" />
<Label fx:id="searchStatusLabel" prefHeight="16.0" prefWidth="181.0" textAlignment="RIGHT" wrapText="true" HBox.hgrow="ALWAYS" />
</VBox>
</content>
</Tab>
<Tab text="Text" />
</tabs>
</TabPane>
<ToolBar prefHeight="40.0" prefWidth="200.0" VBox.vgrow="NEVER">
<items>
<Button mnemonicParsing="false" onAction="#newSearch" text="New Search" />
<Button mnemonicParsing="false" onAction="#search" text="Search" />
</items>
</ToolBar>
<HBox prefHeight="19.0" prefWidth="235.0">
<children>
<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" />
</children>
</HBox>
<ListView fx:id="searchResultsListView" minHeight="25.0" prefHeight="75.0" VBox.vgrow="ALWAYS" />
</children>
</HBox>
<ListView fx:id="searchResultsListView" prefHeight="125.0" prefWidth="233.0" VBox.vgrow="ALWAYS" />
</children>
</VBox>
</content>
</TitledPane>
<TitledPane animated="false" text="Watches">
<content>
<TilePane fx:id="watchesPane" prefHeight="200.0" prefWidth="200.0" />
</content>
</TitledPane>
<TitledPane animated="false" text="Snapshots">
<content>
<BorderPane minWidth="-Infinity">
<bottom>
<ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<items>
<Button mnemonicParsing="false" onAction="#createSnapshot" text="Create" />
<Button mnemonicParsing="false" onAction="#deleteSnapshot" text="Delete" />
<Button mnemonicParsing="false" onAction="#diffSnapshots" text="Diff" />
</items>
</ToolBar>
</bottom>
<center>
<ListView fx:id="snapshotsListView" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
</content>
</TitledPane>
<TitledPane animated="false" text="Cheats">
<content>
<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>
</TitledPane>
</panes>
</Accordion>
</VBox>
</content>
</TitledPane>
<TitledPane text="Watches" VBox.vgrow="NEVER">
<content>
<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>
</TitledPane>
<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>
<BorderPane minWidth="-Infinity">
<bottom>
<ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<items>
<Button mnemonicParsing="false" onAction="#createSnapshot" text="Create" />
<Button mnemonicParsing="false" onAction="#deleteSnapshot" text="Delete" />
<Button mnemonicParsing="false" onAction="#diffSnapshots" text="Diff" />
</items>
</ToolBar>
</bottom>
<center>
<ListView fx:id="snapshotsListView" minHeight="25.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
</content>
</TitledPane>
</children>
</VBox>
</content>
</ScrollPane>
</items>
</SplitPane>
</children>