diff --git a/src/app/ui/brush_popup.cpp b/src/app/ui/brush_popup.cpp index 313d20d19..40b7e5515 100644 --- a/src/app/ui/brush_popup.cpp +++ b/src/app/ui/brush_popup.cpp @@ -29,6 +29,7 @@ #include "she/system.h" #include "ui/menu.h" #include "ui/message.h" +#include "ui/separator.h" #include "ui/tooltips.h" namespace app { @@ -62,8 +63,12 @@ protected: if (mouseMsg->buttons() == kButtonRight) { Menu menu; AppMenuItem deleteItem("Delete"); + AppMenuItem deleteAllItem("Delete All"); deleteItem.Click.connect(&Item::onDeleteBrush, this); + deleteAllItem.Click.connect(&Item::onDeleteAllBrushes, this); menu.addChild(&deleteItem); + menu.addChild(new Separator("", JI_HORIZONTAL)); + menu.addChild(&deleteAllItem); // Here we make the popup window temporaly floating, so it's // not closed by the popup menu. @@ -81,6 +86,10 @@ private: m_delegate->onDeleteBrushSlot(m_slot); } + void onDeleteAllBrushes() { + m_delegate->onDeleteAllBrushes(); + } + BrushPopup* m_popup; BrushPopupDelegate* m_delegate; BrushRef m_brush; diff --git a/src/app/ui/brush_popup.h b/src/app/ui/brush_popup.h index 6d5fec0de..888b00589 100644 --- a/src/app/ui/brush_popup.h +++ b/src/app/ui/brush_popup.h @@ -30,6 +30,7 @@ namespace app { public: virtual ~BrushPopupDelegate() { } virtual void onDeleteBrushSlot(int slot) = 0; + virtual void onDeleteAllBrushes() = 0; }; class BrushPopup : public ui::PopupWindow { diff --git a/src/app/ui/context_bar.cpp b/src/app/ui/context_bar.cpp index 3e4fb2c29..fb36a6421 100644 --- a/src/app/ui/context_bar.cpp +++ b/src/app/ui/context_bar.cpp @@ -109,6 +109,11 @@ protected: m_owner->removeBrush(slot); } + void onDeleteAllBrushes() override { + while (!m_owner->brushes().empty()) + m_owner->removeBrush(m_owner->brushes().size()); + } + private: // Returns a little rectangle that can be used by the popup as the // first brush position. @@ -1032,8 +1037,14 @@ int ContextBar::addBrush(const doc::BrushRef& brush) void ContextBar::removeBrush(int slot) { --slot; - if (slot >= 0 && slot < (int)m_brushes.size()) + if (slot >= 0 && slot < (int)m_brushes.size()) { m_brushes[slot].reset(); + + // Erase empty trailing slots + while (!m_brushes.empty() && + !m_brushes[m_brushes.size()-1]) + m_brushes.erase(--m_brushes.end()); + } } void ContextBar::setActiveBrushBySlot(int slot)