diff --git a/src/app/ui/color_bar.cpp b/src/app/ui/color_bar.cpp index 0665b4c69..e5bf1acd7 100644 --- a/src/app/ui/color_bar.cpp +++ b/src/app/ui/color_bar.cpp @@ -21,6 +21,7 @@ #include "app/commands/params.h" #include "app/console.h" #include "app/context_access.h" +#include "app/document_api.h" #include "app/ini_file.h" #include "app/modules/gui.h" #include "app/modules/palettes.h" @@ -376,8 +377,10 @@ void ColorBar::onPaletteViewIndexChange(int index, ui::MouseButtons buttons) if ((buttons & kButtonRight) == kButtonRight) setBgColor(color); - else + else if ((buttons & kButtonLeft) == kButtonLeft) setFgColor(color); + else if ((buttons & kButtonMiddle) == kButtonMiddle) + setTransparentIndex(index); m_lock = false; } @@ -421,6 +424,29 @@ void ColorBar::setPalette(const doc::Palette* newPalette, const std::string& act getManager()->invalidate(); } +void ColorBar::setTransparentIndex(int index) +{ + try { + ContextWriter writer(UIContext::instance(), 500); + Sprite* sprite = writer.sprite(); + frame_t frame = writer.frame(); + if (sprite && + sprite->pixelFormat() == IMAGE_INDEXED && + sprite->transparentColor() != index) { + // TODO merge this code with SpritePropertiesCommand + Transaction transaction(writer.context(), "Set Transparent Color"); + DocumentApi api = writer.document()->getApi(transaction); + api.setSpriteTransparentColor(sprite, index); + transaction.commit(); + + update_screen_for_document(writer.document()); + } + } + catch (base::Exception& e) { + Console::showException(e); + } +} + void ColorBar::onPaletteViewChangeSize(int boxsize) { Preferences::instance().colorBar.boxSize(boxsize); diff --git a/src/app/ui/color_bar.h b/src/app/ui/color_bar.h index f2ce7cffa..c807cb525 100644 --- a/src/app/ui/color_bar.h +++ b/src/app/ui/color_bar.h @@ -99,6 +99,7 @@ namespace app { void destroyRemap(); void applyRemap(const doc::Remap& remap, const doc::Palette* newPalette, const std::string& actionText); void setPalette(const doc::Palette* newPalette, const std::string& actionText); + void setTransparentIndex(int index); class ScrollableView : public ui::View { public: diff --git a/src/app/ui/palette_view.cpp b/src/app/ui/palette_view.cpp index 160fed591..0b3ab5786 100644 --- a/src/app/ui/palette_view.cpp +++ b/src/app/ui/palette_view.cpp @@ -318,19 +318,23 @@ bool PaletteView::onProcessMessage(Message* msg) app::Color::fromIndex(idx), 255); if (hasCapture() && (idx != m_currentEntry || msg->type() == kMouseDownMessage)) { - if (!msg->ctrlPressed()) - deselect(); + MouseButtons buttons = mouseMsg->buttons(); - if (msg->type() == kMouseMoveMessage) - selectRange(m_rangeAnchor, idx); - else { - selectColor(idx); - m_selectedEntries[idx] = true; + if ((buttons & kButtonMiddle) == 0) { + if (!msg->ctrlPressed()) + deselect(); + + if (msg->type() == kMouseMoveMessage) + selectRange(m_rangeAnchor, idx); + else { + selectColor(idx); + m_selectedEntries[idx] = true; + } } // Emit signal if (m_delegate) - m_delegate->onPaletteViewIndexChange(idx, mouseMsg->buttons()); + m_delegate->onPaletteViewIndexChange(idx, buttons); } } }