From 3845d6a31ad08350cc84fcd13a10f1f2e0dabf14 Mon Sep 17 00:00:00 2001 From: David Capello Date: Thu, 17 Dec 2015 13:37:22 -0300 Subject: [PATCH] Fix bugs setting BrushSlot flags from BrushPopup E.g. We cannot set flags in a recently deleted BrushSlot after show_popup_menu(). --- src/app/ui/brush_popup.cpp | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/app/ui/brush_popup.cpp b/src/app/ui/brush_popup.cpp index 582dc175c..830f71f4f 100644 --- a/src/app/ui/brush_popup.cpp +++ b/src/app/ui/brush_popup.cpp @@ -172,7 +172,6 @@ private: // Load preferences BrushSlot brush = m_brushes.getBrushSlot(m_slot); - params.brushType()->setSelected(brush.hasFlag(BrushSlot::Flags::BrushType)); params.brushSize()->setSelected(brush.hasFlag(BrushSlot::Flags::BrushSize)); params.brushAngle()->setSelected(brush.hasFlag(BrushSlot::Flags::BrushAngle)); @@ -183,23 +182,28 @@ private: params.shade()->setSelected(brush.hasFlag(BrushSlot::Flags::Shade)); params.pixelPerfect()->setSelected(brush.hasFlag(BrushSlot::Flags::PixelPerfect)); + m_changeFlags = true; show_popup_menu(m_popup, &menu, gfx::Point(origin().x, origin().y+bounds().h)); - int flags = 0; - if (params.brushType()->isSelected()) flags |= int(BrushSlot::Flags::BrushType); - if (params.brushSize()->isSelected()) flags |= int(BrushSlot::Flags::BrushSize); - if (params.brushAngle()->isSelected()) flags |= int(BrushSlot::Flags::BrushAngle); - if (params.fgColor()->isSelected()) flags |= int(BrushSlot::Flags::FgColor); - if (params.bgColor()->isSelected()) flags |= int(BrushSlot::Flags::BgColor); - if (params.inkType()->isSelected()) flags |= int(BrushSlot::Flags::InkType); - if (params.inkOpacity()->isSelected()) flags |= int(BrushSlot::Flags::InkOpacity); - if (params.shade()->isSelected()) flags |= int(BrushSlot::Flags::Shade); - if (params.pixelPerfect()->isSelected()) flags |= int(BrushSlot::Flags::PixelPerfect); + if (m_changeFlags) { + brush = m_brushes.getBrushSlot(m_slot); - if (brush.flags() != BrushSlot::Flags(flags)) { - brush.setFlags(BrushSlot::Flags(flags)); - m_brushes.setBrushSlot(m_slot, brush); + int flags = (int(brush.flags()) & int(BrushSlot::Flags::Locked)); + if (params.brushType()->isSelected()) flags |= int(BrushSlot::Flags::BrushType); + if (params.brushSize()->isSelected()) flags |= int(BrushSlot::Flags::BrushSize); + if (params.brushAngle()->isSelected()) flags |= int(BrushSlot::Flags::BrushAngle); + if (params.fgColor()->isSelected()) flags |= int(BrushSlot::Flags::FgColor); + if (params.bgColor()->isSelected()) flags |= int(BrushSlot::Flags::BgColor); + if (params.inkType()->isSelected()) flags |= int(BrushSlot::Flags::InkType); + if (params.inkOpacity()->isSelected()) flags |= int(BrushSlot::Flags::InkOpacity); + if (params.shade()->isSelected()) flags |= int(BrushSlot::Flags::Shade); + if (params.pixelPerfect()->isSelected()) flags |= int(BrushSlot::Flags::PixelPerfect); + + if (brush.flags() != BrushSlot::Flags(flags)) { + brush.setFlags(BrushSlot::Flags(flags)); + m_brushes.setBrushSlot(m_slot, brush); + } } } @@ -212,6 +216,8 @@ private: m_brushes.setBrushSlot( m_slot, contextBar->createBrushSlotFromPreferences()); m_brushes.lockBrushSlot(m_slot); + + m_changeFlags = false; } void onLockBrush() { @@ -223,16 +229,19 @@ private: void onDeleteBrush() { m_brushes.removeBrushSlot(m_slot); + m_changeFlags = false; } void onDeleteAllBrushes() { m_brushes.removeAllBrushSlots(); + m_changeFlags = false; } BrushPopup* m_popup; AppBrushes& m_brushes; BrushRef m_brush; int m_slot; + bool m_changeFlags; }; class NewCustomBrushItem : public ButtonSet::Item {