Fix crash using a theme with an undefined <style>

Related to: https://community.aseprite.org/t/498
This commit is contained in:
David Capello 2017-09-28 15:27:27 -03:00
parent c0fe23999a
commit c3bc7acb4d
2 changed files with 11 additions and 12 deletions

View File

@ -199,7 +199,7 @@ SkinTheme::SkinTheme()
SkinTheme::~SkinTheme()
{
// Delete all cursors.
for (auto it : m_cursors)
for (auto& it : m_cursors)
delete it.second; // Delete cursor
if (m_sheet)
@ -208,7 +208,7 @@ SkinTheme::~SkinTheme()
m_parts_by_id.clear();
// Destroy fonts
for (auto kv : m_fonts)
for (auto& kv : m_fonts)
delete kv.second; // Delete all FontDatas
m_fonts.clear();
}
@ -301,16 +301,14 @@ void SkinTheme::loadSheet()
if (m_sheet)
m_sheet->applyScale(guiscale());
// Change sprite sheet of all layer styles
for (auto it : m_styles) {
for (auto layer : it.second->layers()) {
if (layer.icon())
layer.setIcon(nullptr);
if (layer.spriteSheet())
layer.setSpriteSheet(m_sheet);
// Reset sprite sheet and font of all layer styles (to avoid
// dangling pointers to she::Surface or she::Font).
for (auto& it : m_styles) {
for (auto& layer : it.second->layers()) {
layer.setIcon(nullptr);
layer.setSpriteSheet(nullptr);
}
if (it.second->font())
it.second->setFont(nullptr); // Font must be re-assigned
it.second->setFont(nullptr);
}
}
@ -517,11 +515,11 @@ void SkinTheme::loadXml()
ui::Style* style = m_styles[style_id];
if (!style) {
m_styles[style_id] = style = new ui::Style(base);
style->setId(style_id);
}
else {
*style = ui::Style(base);
}
style->setId(style_id);
// Margin
{

View File

@ -102,6 +102,7 @@ namespace ui {
const gfx::Border& padding() const { return m_padding; }
she::Font* font() const { return m_font; }
const Layers& layers() const { return m_layers; }
Layers& layers() { return m_layers; }
void setId(const std::string& id) { m_id = id; }
void setMargin(const gfx::Border& value) { m_margin = value; }