1
0
mirror of https://github.com/openeggbert/sprite-utils.git synced 2025-03-14 23:33:28 +01:00

Refactoring III

This commit is contained in:
Robert Vokac 2024-07-30 19:16:04 +02:00
parent 4f52556390
commit 675dca59b5
No known key found for this signature in database
GPG Key ID: C459E1E4B4A986BB

View File

@ -21,17 +21,22 @@ package org.nanoboot.spriteutils.core;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import lombok.Data;
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
*/
@Data
@ToString
public class SpriteSheetRow {
private static final String DELIMITER = ";";
private static final String ID_DELIMITER = "__";
private static final int MINIMUM_COLUMNS = 10;
String file;
String group;
int numberInGroup;
@ -44,51 +49,73 @@ public class SpriteSheetRow {
String notes;
String tags;
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) {
String[] csvColumn = csvLine.split(";");
if (csvColumn.length < 10) {
throw new IllegalArgumentException("CSV line does not contain enough (10) columns.");
String[] csvColumns = csvLine.split(DELIMITER);
if (csvColumns.length < MINIMUM_COLUMNS) {
throw new IllegalArgumentException("CSV line does not contain enough columns.");
}
int i = 0;
file = csvColumn[i++];
group = csvColumn[i++];
numberInGroup = Integer.parseInt(csvColumn[i++]);
row = Integer.parseInt(csvColumn[i++]);
column = Integer.parseInt(csvColumn[i++]);
x = csvColumn[i++].isBlank() ? -1 : Integer.parseInt(csvColumn[i - 1]);
y = Integer.parseInt(csvColumn[i++]);
width = Integer.parseInt(csvColumn[i++]);
height = Integer.parseInt(csvColumn[i++]);
if (column > 1) {
height = -height;
}
notes = csvColumn.length >= 10 ? csvColumn[i++] : "";
tags = csvColumn.length > 11 ? csvColumn[i++] : "";
}
try {
int i = 0;
file = csvColumns[i++];
group = csvColumns[i++];
numberInGroup = Integer.parseInt(csvColumns[i++]);
row = Integer.parseInt(csvColumns[i++]);
column = Integer.parseInt(csvColumns[i++]);
x = parseOptionalInt(csvColumns[i++]).orElse(-1);
y = Integer.parseInt(csvColumns[i++]);
width = Integer.parseInt(csvColumns[i++]);
height = Integer.parseInt(csvColumns[i++]);
notes = i < csvColumns.length ? csvColumns[i++] : "";
tags = i < csvColumns.length ? csvColumns[i++] : "";
numberPerSheet = i < csvColumns.length ? Integer.parseInt(csvColumns[i]) : 0;
// 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() {
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() {
List<String> fields = Arrays.asList(
file,
group,
String.valueOf(numberInGroup),
String.valueOf(row),
String.valueOf(column),
String.valueOf(x),
String.valueOf(y),
String.valueOf(width),
String.valueOf(height),
notes,
tags,
String.valueOf(numberPerSheet)
file, group, String.valueOf(numberInGroup), String.valueOf(row),
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);
}
/**
* 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);
}
}
}