mirror of
https://github.com/openeggbert/sprite-utils.git
synced 2025-03-25 15:37:50 +01:00
Refactoring III
This commit is contained in:
parent
4f52556390
commit
675dca59b5
@ -21,17 +21,22 @@ package org.nanoboot.spriteutils.core;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* Represents a row in a sprite sheet.
|
||||||
|
* This class is responsible for parsing and serializing sprite sheet rows from/to CSV format.
|
||||||
|
*
|
||||||
* @author robertvokac
|
* @author robertvokac
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@ToString
|
@ToString
|
||||||
public class SpriteSheetRow {
|
public class SpriteSheetRow {
|
||||||
|
private static final String DELIMITER = ";";
|
||||||
|
private static final String ID_DELIMITER = "__";
|
||||||
|
private static final int MINIMUM_COLUMNS = 10;
|
||||||
String file;
|
String file;
|
||||||
String group;
|
String group;
|
||||||
int numberInGroup;
|
int numberInGroup;
|
||||||
@ -44,51 +49,73 @@ public class SpriteSheetRow {
|
|||||||
String notes;
|
String notes;
|
||||||
String tags;
|
String tags;
|
||||||
int numberPerSheet;
|
int numberPerSheet;
|
||||||
|
/**
|
||||||
|
* Constructor to create a SpriteSheetRow from a CSV line.
|
||||||
|
*
|
||||||
|
* @param csvLine the CSV line containing the sprite sheet row data
|
||||||
|
@throws IllegalArgumentException if the CSV line does not contain enough columns or contains invalid data
|
||||||
|
*/
|
||||||
public SpriteSheetRow(String csvLine) {
|
public SpriteSheetRow(String csvLine) {
|
||||||
String[] csvColumn = csvLine.split(";");
|
String[] csvColumns = csvLine.split(DELIMITER);
|
||||||
if (csvColumn.length < 10) {
|
if (csvColumns.length < MINIMUM_COLUMNS) {
|
||||||
throw new IllegalArgumentException("CSV line does not contain enough (10) columns.");
|
throw new IllegalArgumentException("CSV line does not contain enough columns.");
|
||||||
}
|
}
|
||||||
int i = 0;
|
try {
|
||||||
file = csvColumn[i++];
|
int i = 0;
|
||||||
group = csvColumn[i++];
|
file = csvColumns[i++];
|
||||||
numberInGroup = Integer.parseInt(csvColumn[i++]);
|
group = csvColumns[i++];
|
||||||
row = Integer.parseInt(csvColumn[i++]);
|
numberInGroup = Integer.parseInt(csvColumns[i++]);
|
||||||
column = Integer.parseInt(csvColumn[i++]);
|
row = Integer.parseInt(csvColumns[i++]);
|
||||||
x = csvColumn[i++].isBlank() ? -1 : Integer.parseInt(csvColumn[i - 1]);
|
column = Integer.parseInt(csvColumns[i++]);
|
||||||
y = Integer.parseInt(csvColumn[i++]);
|
x = parseOptionalInt(csvColumns[i++]).orElse(-1);
|
||||||
width = Integer.parseInt(csvColumn[i++]);
|
y = Integer.parseInt(csvColumns[i++]);
|
||||||
height = Integer.parseInt(csvColumn[i++]);
|
width = Integer.parseInt(csvColumns[i++]);
|
||||||
if (column > 1) {
|
height = Integer.parseInt(csvColumns[i++]);
|
||||||
height = -height;
|
notes = i < csvColumns.length ? csvColumns[i++] : "";
|
||||||
}
|
tags = i < csvColumns.length ? csvColumns[i++] : "";
|
||||||
notes = csvColumn.length >= 10 ? csvColumn[i++] : "";
|
numberPerSheet = i < csvColumns.length ? Integer.parseInt(csvColumns[i]) : 0;
|
||||||
tags = csvColumn.length > 11 ? csvColumn[i++] : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Adjust height if the column is greater than 1
|
||||||
|
if (column > 1) {
|
||||||
|
height = -height;
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new IllegalArgumentException("CSV line contains invalid number format.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Creates an ID for the sprite sheet row.
|
||||||
|
*
|
||||||
|
* @return the generated ID
|
||||||
|
*/
|
||||||
public String createId() {
|
public String createId() {
|
||||||
return file + __ + group + __ + numberInGroup;
|
return String.join(ID_DELIMITER, file, group, String.valueOf(numberInGroup));
|
||||||
}
|
}
|
||||||
private static final String __ = "__";
|
/**
|
||||||
private static final String DELIMITER = ";";
|
* Converts the sprite sheet row to a CSV line.
|
||||||
|
*
|
||||||
|
* @return the CSV line representation of the sprite sheet row
|
||||||
|
*/
|
||||||
public String toCsvLine() {
|
public String toCsvLine() {
|
||||||
List<String> fields = Arrays.asList(
|
List<String> fields = Arrays.asList(
|
||||||
file,
|
file, group, String.valueOf(numberInGroup), String.valueOf(row),
|
||||||
group,
|
String.valueOf(column), String.valueOf(x), String.valueOf(y),
|
||||||
String.valueOf(numberInGroup),
|
String.valueOf(width), String.valueOf(height), notes, tags,
|
||||||
String.valueOf(row),
|
String.valueOf(numberPerSheet)
|
||||||
String.valueOf(column),
|
|
||||||
String.valueOf(x),
|
|
||||||
String.valueOf(y),
|
|
||||||
String.valueOf(width),
|
|
||||||
String.valueOf(height),
|
|
||||||
notes,
|
|
||||||
tags,
|
|
||||||
String.valueOf(numberPerSheet)
|
|
||||||
);
|
);
|
||||||
return String.join(DELIMITER, fields);
|
return String.join(DELIMITER, fields);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Parses an optional integer from a string.
|
||||||
|
*
|
||||||
|
* @param value the string to parse
|
||||||
|
* @return an Optional containing the parsed integer, or empty if the string is blank
|
||||||
|
*/
|
||||||
|
private Optional<Integer> parseOptionalInt(String value) {
|
||||||
|
try {
|
||||||
|
return value.isBlank() ? Optional.empty() : Optional.of(Integer.parseInt(value));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new IllegalArgumentException("Invalid integer format: " + value, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user