Improved import sprite sheet dialog (from #1987)

This commit is contained in:
Gaspar Capello 2019-02-11 18:41:38 -03:00 committed by David Capello
parent 29a4c6f744
commit 855c7d8ee3
5 changed files with 74 additions and 15 deletions

View File

@ -443,6 +443,7 @@
<section id="import_sprite_sheet"> <section id="import_sprite_sheet">
<option id="type" type="app::SpriteSheetType" default="app::SpriteSheetType::Rows" /> <option id="type" type="app::SpriteSheetType" default="app::SpriteSheetType::Rows" />
<option id="bounds" type="gfx::Rect" default="gfx::Rect(0, 0, 0, 0)" /> <option id="bounds" type="gfx::Rect" default="gfx::Rect(0, 0, 0, 0)" />
<option id="padding_enabled" type="bool" default="false" />
<option id="padding_bounds" type="gfx::Size" default="gfx::Size(0, 0)" /> <option id="padding_bounds" type="gfx::Size" default="gfx::Size(0, 0)" />
<option id="partial_tiles" type="bool" default="false" /> <option id="partial_tiles" type="bool" default="false" />
</section> </section>

View File

@ -630,7 +630,7 @@ x = X:
y = Y: y = Y:
width = Width: width = Width:
height = Height: height = Height:
padding = Padding: padding = Padding
horizontal_padding = Horizontal: horizontal_padding = Horizontal:
vertical_padding = Vertical: vertical_padding = Vertical:
partial_tiles = Include partial tiles at bottom/right edges partial_tiles = Include partial tiles at bottom/right edges

View File

@ -24,15 +24,12 @@
<label text="@.height" /> <label text="@.height" />
<expr id="height" text="16" /> <expr id="height" text="16" />
<separator text="@.padding" horizontal="true" cell_hspan="4" /> <check id="padding_enabled" text="@.padding" cell_hspan="4" />
<label text="@.horizontal_padding" /> <label text="@.horizontal_padding" id="horizontal_padding_label" />
<expr id="horizontal_padding" text="0" /> <expr id="horizontal_padding" text="0" />
<label text="" cell_hspan="2" /> <label text="@.vertical_padding" id="vertical_padding_label" />
<label text="@.vertical_padding" />
<expr id="vertical_padding" text="0" /> <expr id="vertical_padding" text="0" />
<label text="" cell_hspan="2" />
<check id="partial_tiles" text="@.partial_tiles" cell_hspan="4" /> <check id="partial_tiles" text="@.partial_tiles" cell_hspan="4" />

View File

@ -74,6 +74,7 @@ public:
y()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this)); y()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this));
width()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this)); width()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this));
height()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this)); height()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this));
paddingEnabled()->Click.connect(base::Bind<void>(&ImportSpriteSheetWindow::onPaddingEnabledChange, this));
horizontalPadding()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this)); horizontalPadding()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this));
verticalPadding()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this)); verticalPadding()->Change.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this));
partialTiles()->Click.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this)); partialTiles()->Click.connect(base::Bind<void>(&ImportSpriteSheetWindow::onEntriesChange, this));
@ -87,6 +88,8 @@ public:
selectActiveDocument(); selectActiveDocument();
m_fileOpened = false; m_fileOpened = false;
} }
onPaddingEnabledChange();
} }
~ImportSpriteSheetWindow() { ~ImportSpriteSheetWindow() {
@ -101,6 +104,10 @@ public:
return partialTiles()->isSelected(); return partialTiles()->isSelected();
} }
bool paddingEnabledValue() const {
return paddingEnabled()->isSelected();
}
bool ok() const { bool ok() const {
return closer() == import(); return closer() == import();
} }
@ -208,13 +215,20 @@ protected:
} }
void onChangePadding(const gfx::Size& padding) override { void onChangePadding(const gfx::Size& padding) override {
m_padding = padding; if (paddingEnabled()->isSelected()) {
if (padding.w < 0) m_padding = padding;
m_padding.w = 0; if (padding.w < 0)
if (padding.h < 0) m_padding.w = 0;
m_padding.h = 0; if (padding.h < 0)
horizontalPadding()->setTextf("%d", m_padding.w); m_padding.h = 0;
verticalPadding()->setTextf("%d", m_padding.h); horizontalPadding()->setTextf("%d", m_padding.w);
verticalPadding()->setTextf("%d", m_padding.h);
}
else {
m_padding = gfx::Size(0, 0);
horizontalPadding()->setTextf("%d", 0);
verticalPadding()->setTextf("%d", 0);
}
} }
std::string onGetContextBarHelp() override { std::string onGetContextBarHelp() override {
@ -251,14 +265,19 @@ private:
sheetType()->setSelectedItemIndex((int)app::SpriteSheetType::Rows-1); sheetType()->setSelectedItemIndex((int)app::SpriteSheetType::Rows-1);
gfx::Rect defBounds = m_docPref->importSpriteSheet.bounds(); gfx::Rect defBounds = m_docPref->importSpriteSheet.bounds();
gfx::Size defPaddingBounds = m_docPref->importSpriteSheet.paddingBounds();
if (defBounds.isEmpty()) if (defBounds.isEmpty())
defBounds = m_docPref->grid.bounds(); defBounds = m_docPref->grid.bounds();
onChangeRectangle(defBounds); onChangeRectangle(defBounds);
gfx::Size defPaddingBounds = m_docPref->importSpriteSheet.paddingBounds();
if (defPaddingBounds.w < 0 || defPaddingBounds.h < 0)
defPaddingBounds = gfx::Size(0, 0);
onChangePadding(defPaddingBounds); onChangePadding(defPaddingBounds);
paddingEnabled()->setSelected(m_docPref->importSpriteSheet.paddingEnabled());
partialTiles()->setSelected(m_docPref->importSpriteSheet.partialTiles()); partialTiles()->setSelected(m_docPref->importSpriteSheet.partialTiles());
onEntriesChange(); onEntriesChange();
onPaddingEnabledChange();
} }
} }
@ -314,6 +333,32 @@ private:
} }
} }
void onPaddingEnabledChange() {
const bool state = paddingEnabled()->isSelected();
horizontalPaddingLabel()->setVisible(state);
horizontalPadding()->setVisible(state);
verticalPaddingLabel()->setVisible(state);
verticalPadding()->setVisible(state);
if (m_docPref) {
if (state)
onChangePadding(m_docPref->importSpriteSheet.paddingBounds());
else {
m_docPref->importSpriteSheet.paddingBounds(m_padding);
onChangePadding(gfx::Size(0, 0));
}
}
onEntriesChange();
resize();
}
void resize() {
gfx::Size reqSize = sizeHint();
moveWindow(gfx::Rect(origin(), reqSize));
layout();
invalidate();
}
Context* m_context; Context* m_context;
Doc* m_document; Doc* m_document;
Editor* m_editor; Editor* m_editor;
@ -354,6 +399,7 @@ void ImportSpriteSheetCommand::onExecute(Context* context)
gfx::Rect frameBounds = window.frameBounds(); gfx::Rect frameBounds = window.frameBounds();
gfx::Size padThickness = window.paddingThickness(); gfx::Size padThickness = window.paddingThickness();
bool partialTiles = window.partialTilesValue(); bool partialTiles = window.partialTilesValue();
bool paddingEnable = window.paddingEnabledValue();
auto sheetType = window.sheetTypeValue(); auto sheetType = window.sheetTypeValue();
ASSERT(document); ASSERT(document);
@ -466,6 +512,7 @@ void ImportSpriteSheetCommand::onExecute(Context* context)
docPref->importSpriteSheet.bounds(frameBounds); docPref->importSpriteSheet.bounds(frameBounds);
docPref->importSpriteSheet.partialTiles(partialTiles); docPref->importSpriteSheet.partialTiles(partialTiles);
docPref->importSpriteSheet.paddingBounds(padThickness); docPref->importSpriteSheet.paddingBounds(padThickness);
docPref->importSpriteSheet.paddingEnabled(paddingEnable);
} }
} }
catch (...) { catch (...) {

View File

@ -79,6 +79,12 @@ gfx::Rect SelectBoxState::getBoxBounds() const
void SelectBoxState::setBoxBounds(const gfx::Rect& box) void SelectBoxState::setBoxBounds(const gfx::Rect& box)
{ {
if (hasFlag(Flags::PaddingRulers)) {
int w = m_rulers[PV].position() - m_rulers[V2].position();
int h = m_rulers[PH].position() - m_rulers[H2].position();
m_rulers[PH] = Ruler(Ruler::Horizontal, m_rulers[H2].position() + h);
m_rulers[PV] = Ruler(Ruler::Vertical, m_rulers[V2].position() + w);
}
m_rulers[H1] = Ruler(Ruler::Horizontal, box.y); m_rulers[H1] = Ruler(Ruler::Horizontal, box.y);
m_rulers[H2] = Ruler(Ruler::Horizontal, box.y+box.h); m_rulers[H2] = Ruler(Ruler::Horizontal, box.y+box.h);
m_rulers[V1] = Ruler(Ruler::Vertical, box.x); m_rulers[V1] = Ruler(Ruler::Vertical, box.x);
@ -186,12 +192,20 @@ bool SelectBoxState::onMouseMove(Editor* editor, MouseMessage* msg)
switch (ruler.orientation()) { switch (ruler.orientation()) {
case Ruler::Horizontal: case Ruler::Horizontal:
if (hasFlag(Flags::PaddingRulers) && (i == H2)) {
int pad = m_rulers[PH].position() - m_rulers[H2].position();
m_rulers[PH].setPosition(start.position() + delta.y + pad);
}
ruler.setPosition(start.position() + delta.y); ruler.setPosition(start.position() + delta.y);
if (msg->modifiers() == os::kKeyShiftModifier) if (msg->modifiers() == os::kKeyShiftModifier)
oppRuler.setPosition(editor->sprite()->height() oppRuler.setPosition(editor->sprite()->height()
- start.position() - delta.y); - start.position() - delta.y);
break; break;
case Ruler::Vertical: case Ruler::Vertical:
if (hasFlag(Flags::PaddingRulers) && (i == V2)) {
int pad = m_rulers[PV].position() - m_rulers[V2].position();
m_rulers[PV].setPosition(start.position() + delta.x + pad);
}
ruler.setPosition(start.position() + delta.x); ruler.setPosition(start.position() + delta.x);
if (msg->modifiers() == os::kKeyShiftModifier) if (msg->modifiers() == os::kKeyShiftModifier)
oppRuler.setPosition(editor->sprite()->width() oppRuler.setPosition(editor->sprite()->width()