|
|
|
@ -22,6 +22,8 @@
|
|
|
|
|
#include <QVBoxLayout>
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
|
|
#include <nostalgia/core/consts.hpp>
|
|
|
|
|
|
|
|
|
|
#include "consts.hpp"
|
|
|
|
|
#include "tilesheeteditor.hpp"
|
|
|
|
|
|
|
|
|
@ -193,22 +195,26 @@ void SheetData::updatePixel(QVariant pixelItem) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SheetData::columns() {
|
|
|
|
|
int SheetData::columns() const {
|
|
|
|
|
return m_columns;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SheetData::rows() {
|
|
|
|
|
int SheetData::rows() const {
|
|
|
|
|
return m_rows;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const QVector<int> &SheetData::pixels() {
|
|
|
|
|
const QVector<int> &SheetData::pixels() const {
|
|
|
|
|
return m_pixels;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStringList SheetData::palette() {
|
|
|
|
|
QStringList SheetData::palette() const {
|
|
|
|
|
return m_palette;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString SheetData::palettePath() const {
|
|
|
|
|
return m_currentPalettePath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SheetData::load(const studio::Context *ctx, QString ngPath, QString palPath) {
|
|
|
|
|
auto ng = ctx->project->loadObj<NostalgiaGraphic>(ngPath);
|
|
|
|
|
if (palPath == "" && ng->defaultPalette.type() == ox::FileAddressType::Path) {
|
|
|
|
@ -226,7 +232,7 @@ void SheetData::load(const studio::Context *ctx, QString ngPath, QString palPath
|
|
|
|
|
updatePixels(ng.get());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SheetData::save(const studio::Context *ctx, QString ngPath) {
|
|
|
|
|
void SheetData::save(const studio::Context *ctx, QString ngPath) const {
|
|
|
|
|
auto ng = toNostalgiaGraphic();
|
|
|
|
|
ctx->project->writeObj(ngPath, ng.get());
|
|
|
|
|
}
|
|
|
|
@ -239,13 +245,13 @@ void SheetData::setPalette(const NostalgiaPalette *npal) {
|
|
|
|
|
const auto color = c.name(QColor::HexArgb);
|
|
|
|
|
m_palette.append(color);
|
|
|
|
|
}
|
|
|
|
|
emit paletteChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SheetData::setPalette(const studio::Context *ctx, QString palPath) {
|
|
|
|
|
std::unique_ptr<NostalgiaPalette> npal;
|
|
|
|
|
try {
|
|
|
|
|
npal = ctx->project->loadObj<NostalgiaPalette>(palPath);
|
|
|
|
|
qInfo() << "Opened palette" << palPath;
|
|
|
|
|
} catch (ox::Error) {
|
|
|
|
|
qWarning() << "Could not open palette" << palPath;
|
|
|
|
|
}
|
|
|
|
@ -299,10 +305,9 @@ void SheetData::updatePixels(const NostalgiaGraphic *ng) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
emit pixelsChanged();
|
|
|
|
|
emit paletteChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<NostalgiaGraphic> SheetData::toNostalgiaGraphic() {
|
|
|
|
|
std::unique_ptr<NostalgiaGraphic> SheetData::toNostalgiaGraphic() const {
|
|
|
|
|
auto ng = std::make_unique<NostalgiaGraphic>();
|
|
|
|
|
const auto highestColorIdx = static_cast<uint8_t>(*std::max_element(m_pixels.begin(), m_pixels.end()));
|
|
|
|
|
ng->defaultPalette = m_currentPalettePath.toUtf8().data();
|
|
|
|
@ -372,9 +377,11 @@ TileSheetEditor::TileSheetEditor(QString path, const studio::Context *ctx, QWidg
|
|
|
|
|
m_canvas->rootContext()->setContextProperty("sheetData", &m_sheetData);
|
|
|
|
|
m_canvas->setSource(QUrl::fromLocalFile(":/qml/TileSheetEditor.qml"));
|
|
|
|
|
m_canvas->setResizeMode(QQuickWidget::SizeRootObjectToView);
|
|
|
|
|
setColorTable(m_sheetData.palette());
|
|
|
|
|
setPalette();
|
|
|
|
|
setColorTable();
|
|
|
|
|
restoreState();
|
|
|
|
|
connect(&m_sheetData, &SheetData::changeOccurred, [this] { setUnsavedChanges(true); });
|
|
|
|
|
connect(&m_sheetData, &SheetData::paletteChanged, this, &TileSheetEditor::setColorTable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TileSheetEditor::~TileSheetEditor() {
|
|
|
|
@ -405,23 +412,30 @@ QWidget *TileSheetEditor::setupColorPicker(QWidget *parent) {
|
|
|
|
|
m_colorPicker.colorTable->horizontalHeader()->setStretchLastSection(true);
|
|
|
|
|
m_colorPicker.colorTable->verticalHeader()->hide();
|
|
|
|
|
connect(m_colorPicker.colorTable, &QTableWidget::itemSelectionChanged, this, &TileSheetEditor::colorSelected);
|
|
|
|
|
connect(m_colorPicker.palette, &QComboBox::currentTextChanged, this, [this](QString name) {
|
|
|
|
|
m_sheetData.setPalette(m_ctx, palettePath(name));
|
|
|
|
|
});
|
|
|
|
|
lyt->addWidget(m_colorPicker.palette);
|
|
|
|
|
lyt->addWidget(m_colorPicker.colorTable);
|
|
|
|
|
m_ctx->project->subscribe(studio::ProjectEvent::FileRecognized, m_colorPicker.palette, [this](QString path) {
|
|
|
|
|
if (path.startsWith(PaletteDir) && path.endsWith(FileExt_npal)) {
|
|
|
|
|
auto name = paletteName(path);
|
|
|
|
|
m_colorPicker.palette->addItem(name);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
m_ctx->project->subscribe(studio::ProjectEvent::FileDeleted, m_colorPicker.palette, [this](QString path) {
|
|
|
|
|
if (path.startsWith(PaletteDir) && path.endsWith(FileExt_npal)) {
|
|
|
|
|
auto name = paletteName(path);
|
|
|
|
|
auto idx = m_colorPicker.palette->findText(name);
|
|
|
|
|
m_colorPicker.palette->removeItem(idx);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return colorPicker;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TileSheetEditor::setColorTable(QStringList hexColors) {
|
|
|
|
|
auto tbl = m_colorPicker.colorTable;
|
|
|
|
|
tbl->setRowCount(hexColors.size());
|
|
|
|
|
for (int i = 0; i < hexColors.size(); i++) {
|
|
|
|
|
auto hexCode = new QTableWidgetItem;
|
|
|
|
|
hexCode->setText(hexColors[i]);
|
|
|
|
|
hexCode->setFont(QFont("monospace"));
|
|
|
|
|
tbl->setItem(i, 0, hexCode);
|
|
|
|
|
auto color = new QTableWidgetItem;
|
|
|
|
|
color->setBackground(QColor(hexColors[i]));
|
|
|
|
|
tbl->setItem(i, 1, color);
|
|
|
|
|
}
|
|
|
|
|
void TileSheetEditor::setPalette() {
|
|
|
|
|
auto name = paletteName(m_sheetData.palettePath());
|
|
|
|
|
m_colorPicker.palette->setCurrentText(name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TileSheetEditor::saveState() {
|
|
|
|
@ -442,8 +456,33 @@ void TileSheetEditor::restoreState() {
|
|
|
|
|
settings.endGroup();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString TileSheetEditor::paletteName(QString palettePath) const {
|
|
|
|
|
const auto begin = ox_strlen(PaletteDir);
|
|
|
|
|
const auto end = palettePath.size() - (ox_strlen(FileExt_npal) + ox_strlen(PaletteDir));
|
|
|
|
|
return palettePath.mid(begin, end);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString TileSheetEditor::palettePath(QString paletteName) const {
|
|
|
|
|
return PaletteDir + paletteName + FileExt_npal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TileSheetEditor::colorSelected() {
|
|
|
|
|
m_sheetData.setSelectedColor(m_colorPicker.colorTable->currentRow());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TileSheetEditor::setColorTable() {
|
|
|
|
|
auto hexColors = m_sheetData.palette();
|
|
|
|
|
auto tbl = m_colorPicker.colorTable;
|
|
|
|
|
tbl->setRowCount(hexColors.size());
|
|
|
|
|
for (int i = 0; i < hexColors.size(); i++) {
|
|
|
|
|
auto hexCode = new QTableWidgetItem;
|
|
|
|
|
hexCode->setText(hexColors[i]);
|
|
|
|
|
hexCode->setFont(QFont("monospace"));
|
|
|
|
|
tbl->setItem(i, 0, hexCode);
|
|
|
|
|
auto color = new QTableWidgetItem;
|
|
|
|
|
color->setBackground(QColor(hexColors[i]));
|
|
|
|
|
tbl->setItem(i, 1, color);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|