From 8fd49469c948438d07d18eb6ce5d9734766bbd26 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 5 Dec 2019 02:07:03 -0600 Subject: [PATCH] [nostalgia/core/studio] Fix bad PixelUpdate merging code that could keep wrong duplicate --- src/nostalgia/core/studio/tilesheeteditor.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/nostalgia/core/studio/tilesheeteditor.cpp b/src/nostalgia/core/studio/tilesheeteditor.cpp index d23f86c2..dcf7c1d0 100644 --- a/src/nostalgia/core/studio/tilesheeteditor.cpp +++ b/src/nostalgia/core/studio/tilesheeteditor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -43,13 +44,17 @@ class UpdatePixelsCommand: public QUndoCommand { bool operator<(const PixelUpdate &o) const { return item < o.item; } + + operator auto() const { + return reinterpret_cast(item.data()); + } }; uint64_t cmdIdx = 0; int m_newColorId = 0; const QStringList &m_palette; QVector &m_pixels; - QVector m_pixelUpdates; + QSet m_pixelUpdates; public: UpdatePixelsCommand(QVector &pixels, const QStringList &palette, const QVariantList &pixelItems, int newColorId, uint64_t cmdIdx): m_palette(palette), m_pixels(pixels) { @@ -60,7 +65,7 @@ class UpdatePixelsCommand: public QUndoCommand { auto p = qobject_cast(pi.value()); pu.item = p; pu.oldColorId = m_palette.indexOf(p->property("color").toString()); - m_pixelUpdates.push_back(std::move(pu)); + m_pixelUpdates.insert(pu); } } @@ -73,11 +78,7 @@ class UpdatePixelsCommand: public QUndoCommand { bool mergeWith(const QUndoCommand *cmd) override { auto other = static_cast(cmd); if (cmdIdx == other->cmdIdx) { - m_pixelUpdates.append(other->m_pixelUpdates); - // inefficient, but probably not worth optimizing, but something to - // look at if this operation becomes a performace problem - std::sort(m_pixelUpdates.begin(), m_pixelUpdates.end()); - m_pixelUpdates.erase(std::unique(m_pixelUpdates.begin(), m_pixelUpdates.end()), m_pixelUpdates.end()); + m_pixelUpdates.unite(other->m_pixelUpdates); return true; } return false;