From 9a15126682dea11309f74726d73b98881080e45a Mon Sep 17 00:00:00 2001 From: David Capello Date: Tue, 19 Aug 2014 08:17:57 -0300 Subject: [PATCH] Fix issue 188: Pick foreground color with right mouse button --- data/widgets/options.xml | 18 +-- src/app/commands/cmd_options.cpp | 7 ++ src/app/settings/settings.h | 3 + src/app/settings/ui_settings_impl.cpp | 13 ++ src/app/settings/ui_settings_impl.h | 3 + src/app/tools/ink.h | 3 + src/app/tools/inks.h | 1 + src/app/tools/tool_box.cpp | 2 + src/app/tools/tool_box.h | 2 + src/app/ui/editor/cursor.cpp | 41 +++---- src/app/ui/editor/editor.cpp | 140 ++++++++++++++++++++-- src/app/ui/editor/editor.h | 7 ++ src/app/ui/editor/moving_pixels_state.cpp | 2 +- src/app/ui/editor/standby_state.cpp | 65 +++++----- src/app/ui/editor/tool_loop_impl.cpp | 80 +++---------- src/app/ui/editor/tool_loop_impl.h | 6 +- 16 files changed, 252 insertions(+), 141 deletions(-) diff --git a/data/widgets/options.xml b/data/widgets/options.xml index 34cd6d393..27af3579d 100644 --- a/data/widgets/options.xml +++ b/data/widgets/options.xml @@ -17,23 +17,27 @@ - + - + + + - - + diff --git a/src/app/commands/cmd_options.cpp b/src/app/commands/cmd_options.cpp index 51f502e91..7d9a0dae6 100644 --- a/src/app/commands/cmd_options.cpp +++ b/src/app/commands/cmd_options.cpp @@ -87,6 +87,12 @@ public: screenScale()->addItem("4:1"); screenScale()->setSelectedItemIndex(get_screen_scaling()-1); + // Right-click + rightClickBehavior()->addItem("Paint with background color"); + rightClickBehavior()->addItem("Pick foreground color"); + rightClickBehavior()->addItem("Erase"); + rightClickBehavior()->setSelectedItemIndex((int)m_settings->getRightClickMode()); + // Zoom with Scroll Wheel wheelZoom()->setSelected(m_settings->getZoomWithScrollWheel()); @@ -135,6 +141,7 @@ public: m_settings->setShowSpriteEditorScrollbars(showScrollbars()->isSelected()); m_settings->setZoomWithScrollWheel(wheelZoom()->isSelected()); + m_settings->setRightClickMode(static_cast(rightClickBehavior()->getSelectedItemIndex())); RenderEngine::setCheckedBgType((RenderEngine::CheckedBgType)checkedBgSize()->getSelectedItemIndex()); RenderEngine::setCheckedBgZoom(checkedBgZoom()->isSelected()); diff --git a/src/app/settings/settings.h b/src/app/settings/settings.h index 98e681fd8..ae173d152 100644 --- a/src/app/settings/settings.h +++ b/src/app/settings/settings.h @@ -25,6 +25,7 @@ #include "app/settings/ink_type.h" #include "app/settings/rotation_algorithm.h" #include "app/settings/selection_mode.h" +#include "app/settings/right_click_mode.h" #include "doc/settings.h" #include "gfx/point.h" #include "gfx/rect.h" @@ -62,6 +63,7 @@ namespace app { // General settings virtual bool getZoomWithScrollWheel() = 0; virtual bool getShowSpriteEditorScrollbars() = 0; + virtual RightClickMode getRightClickMode() = 0; virtual bool getGrabAlpha() = 0; virtual app::Color getFgColor() = 0; virtual app::Color getBgColor() = 0; @@ -70,6 +72,7 @@ namespace app { virtual void setZoomWithScrollWheel(bool state) = 0; virtual void setShowSpriteEditorScrollbars(bool state) = 0; + virtual void setRightClickMode(RightClickMode mode) = 0; virtual void setGrabAlpha(bool state) = 0; virtual void setFgColor(const app::Color& color) = 0; virtual void setBgColor(const app::Color& color) = 0; diff --git a/src/app/settings/ui_settings_impl.cpp b/src/app/settings/ui_settings_impl.cpp index 7a1ad57c1..9d410301e 100644 --- a/src/app/settings/ui_settings_impl.cpp +++ b/src/app/settings/ui_settings_impl.cpp @@ -216,6 +216,8 @@ UISettingsImpl::UISettingsImpl() , m_zoomWithScrollWheel(get_config_bool("Options", "ZoomWithMouseWheel", true)) , m_showSpriteEditorScrollbars(get_config_bool("Options", "ShowScrollbars", true)) , m_grabAlpha(get_config_bool("Options", "GrabAlpha", false)) + , m_rightClickMode(static_cast(get_config_int("Options", "RightClickMode", + static_cast(RightClickMode::Default)))) { m_colorSwatches = new app::ColorSwatches("Default"); for (size_t i=0; i<16; ++i) @@ -229,6 +231,7 @@ UISettingsImpl::~UISettingsImpl() set_config_bool("Options", "ZoomWithMouseWheel", m_zoomWithScrollWheel); set_config_bool("Options", "ShowScrollbars", m_showSpriteEditorScrollbars); set_config_bool("Options", "GrabAlpha", m_grabAlpha); + set_config_int("Options", "RightClickMode", static_cast(m_rightClickMode)); // Delete all tool settings. for (std::map::iterator @@ -277,6 +280,11 @@ bool UISettingsImpl::getShowSpriteEditorScrollbars() return m_showSpriteEditorScrollbars; } +RightClickMode UISettingsImpl::getRightClickMode() +{ + return m_rightClickMode; +} + bool UISettingsImpl::getGrabAlpha() { return m_grabAlpha; @@ -317,6 +325,11 @@ void UISettingsImpl::setShowSpriteEditorScrollbars(bool state) notifyObservers(&GlobalSettingsObserver::onSetShowSpriteEditorScrollbars, state); } +void UISettingsImpl::setRightClickMode(RightClickMode mode) +{ + m_rightClickMode = mode; +} + void UISettingsImpl::setGrabAlpha(bool state) { m_grabAlpha = state; diff --git a/src/app/settings/ui_settings_impl.h b/src/app/settings/ui_settings_impl.h index 6b91fa0fe..85a2d9c2c 100644 --- a/src/app/settings/ui_settings_impl.h +++ b/src/app/settings/ui_settings_impl.h @@ -49,6 +49,7 @@ namespace app { // ISettings implementation bool getZoomWithScrollWheel() override; bool getShowSpriteEditorScrollbars() override; + RightClickMode getRightClickMode() override; bool getGrabAlpha() override; app::Color getFgColor() override; app::Color getBgColor() override; @@ -57,6 +58,7 @@ namespace app { void setZoomWithScrollWheel(bool state) override; void setShowSpriteEditorScrollbars(bool state) override; + void setRightClickMode(RightClickMode mode) override; void setGrabAlpha(bool state) override; void setFgColor(const app::Color& color) override; void setBgColor(const app::Color& color) override; @@ -93,6 +95,7 @@ namespace app { bool m_zoomWithScrollWheel; bool m_showSpriteEditorScrollbars; bool m_grabAlpha; + RightClickMode m_rightClickMode; }; } // namespace app diff --git a/src/app/tools/ink.h b/src/app/tools/ink.h index 8f530cfaf..604c10799 100644 --- a/src/app/tools/ink.h +++ b/src/app/tools/ink.h @@ -46,6 +46,9 @@ namespace app { // is a effect so the Editor can display the cursor bounds) virtual bool isEffect() const { return false; } + // Returns true if this ink acts like an eraser + virtual bool isEraser() const { return false; } + // Returns true if this ink picks colors from the image virtual bool isEyedropper() const { return false; } diff --git a/src/app/tools/inks.h b/src/app/tools/inks.h index 9b0063fb3..7f9726d2e 100644 --- a/src/app/tools/inks.h +++ b/src/app/tools/inks.h @@ -173,6 +173,7 @@ public: bool isPaint() const { return true; } bool isEffect() const { return true; } + bool isEraser() const { return true; } void prepareInk(ToolLoop* loop) { diff --git a/src/app/tools/tool_box.cpp b/src/app/tools/tool_box.cpp index 6b2634f7e..9fa037fe7 100644 --- a/src/app/tools/tool_box.cpp +++ b/src/app/tools/tool_box.cpp @@ -51,6 +51,8 @@ namespace tools { using namespace gfx; const char* WellKnownTools::RectangularMarquee = "rectangular_marquee"; +const char* WellKnownTools::Eraser = "eraser"; +const char* WellKnownTools::Eyedropper = "eyedropper"; const char* WellKnownInks::Selection = "selection"; const char* WellKnownInks::Paint = "paint"; diff --git a/src/app/tools/tool_box.h b/src/app/tools/tool_box.h index c61f2229e..c1ecd28b6 100644 --- a/src/app/tools/tool_box.h +++ b/src/app/tools/tool_box.h @@ -33,6 +33,8 @@ namespace app { namespace WellKnownTools { extern const char* RectangularMarquee; + extern const char* Eraser; + extern const char* Eyedropper; }; namespace WellKnownInks { diff --git a/src/app/ui/editor/cursor.cpp b/src/app/ui/editor/cursor.cpp index cf9db7d42..b40b33946 100644 --- a/src/app/ui/editor/cursor.cpp +++ b/src/app/ui/editor/cursor.cpp @@ -85,7 +85,7 @@ static int saved_pixel_n; static gfx::Region clipping_region; static gfx::Region old_clipping_region; -static void generate_cursor_boundaries(); +static void generate_cursor_boundaries(Editor* editor); static void trace_thincross_pixels(ui::Graphics* g, Editor* editor, int x, int y, gfx::Color color, Editor::PixelDelegate pixel); static void trace_thickcross_pixels(ui::Graphics* g, Editor* editor, int x, int y, gfx::Color color, int thickness, Editor::PixelDelegate pixel); @@ -156,16 +156,13 @@ static void on_brush_after_change() } } -static Brush* editor_get_current_brush() +static Brush* editor_get_current_brush(Editor* editor) { // Create the current brush from settings - tools::Tool* current_tool = UIContext::instance() - ->settings() - ->getCurrentTool(); - + tools::Tool* tool = editor->getCurrentEditorTool(); IBrushSettings* brush_settings = UIContext::instance() ->settings() - ->getToolSettings(current_tool) + ->getToolSettings(tool) ->getBrush(); ASSERT(brush_settings != NULL); @@ -235,22 +232,20 @@ void Editor::drawBrushPreview(int x, int y, bool refresh) screenToEditor(x, y, &x, &y); // Get the current tool - tools::Tool* current_tool = UIContext::instance() - ->settings() - ->getCurrentTool(); + tools::Tool* tool = getCurrentEditorTool(); + tools::Ink* ink = getCurrentEditorInk(); // Setup the cursor type debrushding of several factors (current tool, // foreground color, and layer transparency). color_t brush_color = get_brush_color(m_sprite, m_layer); color_t mask_color = m_sprite->transparentColor(); - if (current_tool->getInk(0)->isSelection() || - current_tool->getInk(0)->isSlice()) { + if (ink->isSelection() || ink->isSlice()) { cursor_type = CURSOR_THICKCROSS; } else if ( // Use cursor bounds for inks that are effects (eraser, blur, etc.) - (current_tool->getInk(0)->isEffect()) || + (ink->isEffect()) || // or when the brush color is transparent and we are not in the background layer (m_layer && !m_layer->isBackground() && brush_color == mask_color)) { @@ -262,15 +257,15 @@ void Editor::drawBrushPreview(int x, int y, bool refresh) // For cursor type 'bounds' we have to generate cursor boundaries if (cursor_type & CURSOR_BRUSHBOUNDS) - generate_cursor_boundaries(); + generate_cursor_boundaries(this); // Draw pixel/brush preview if (cursor_type & CURSOR_THINCROSS && m_state->requireBrushPreview()) { IToolSettings* tool_settings = UIContext::instance() ->settings() - ->getToolSettings(current_tool); + ->getToolSettings(tool); - Brush* brush = editor_get_current_brush(); + Brush* brush = editor_get_current_brush(this); gfx::Rect brushBounds = brush->bounds(); // Create the extra cel to show the brush preview @@ -342,7 +337,7 @@ void Editor::moveBrushPreview(int x, int y, bool refresh) } if (cursor_type & CURSOR_THINCROSS && m_state->requireBrushPreview()) { - Brush* brush = editor_get_current_brush(); + Brush* brush = editor_get_current_brush(this); gfx::Rect brushBounds = brush->bounds(); gfx::Rect rc1(old_x+brushBounds.x, old_y+brushBounds.y, brushBounds.w, brushBounds.h); gfx::Rect rc2(new_x+brushBounds.x, new_y+brushBounds.y, brushBounds.w, brushBounds.h); @@ -392,7 +387,7 @@ void Editor::clearBrushPreview(bool refresh) // Clean pixel/brush preview if (cursor_type & CURSOR_THINCROSS && m_state->requireBrushPreview()) { - Brush* brush = editor_get_current_brush(); + Brush* brush = editor_get_current_brush(this); gfx::Rect brushBounds = brush->bounds(); m_document->prepareExtraCel(x+brushBounds.x, y+brushBounds.y, @@ -424,17 +419,15 @@ bool Editor::doesBrushPreviewNeedSubpixel() ////////////////////////////////////////////////////////////////////// -static void generate_cursor_boundaries() +static void generate_cursor_boundaries(Editor* editor) { - tools::Tool* current_tool = UIContext::instance() - ->settings() - ->getCurrentTool(); + tools::Tool* tool = editor->getCurrentEditorTool(); IBrushSettings* brush_settings = NULL; - if (current_tool) + if (tool) brush_settings = UIContext::instance() ->settings() - ->getToolSettings(current_tool) + ->getToolSettings(tool) ->getBrush(); if (cursor_bound.seg == NULL || diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index 3740970f2..579af8f59 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -143,6 +143,7 @@ Editor::Editor(Document* document, EditorFlags flags) , m_customizationDelegate(NULL) , m_docView(NULL) , m_flags(flags) + , m_secondaryButton(false) { // Add the first state into the history. m_statesHistory.push(m_state); @@ -732,14 +733,121 @@ gfx::Point Editor::controlInfiniteScroll(MouseMessage* msg) return mousePos; } +bool Editor::isCurrentToolAffectedByRightClickMode() +{ + Context* context = UIContext::instance(); + tools::Tool* tool = context->settings()->getCurrentTool(); + + return + (tool->getInk(0)->isPaint() || tool->getInk(0)->isEffect()) && + (!tool->getInk(0)->isEraser()); +} + tools::Tool* Editor::getCurrentEditorTool() { if (m_quicktool) return m_quicktool; - else { - UIContext* context = UIContext::instance(); - return context->settings()->getCurrentTool(); + + Context* context = UIContext::instance(); + tools::Tool* tool = context->settings()->getCurrentTool(); + + if (m_secondaryButton && isCurrentToolAffectedByRightClickMode()) { + tools::ToolBox* toolbox = App::instance()->getToolBox(); + + switch (context->settings()->getRightClickMode()) { + case RightClickMode::PaintBgColor: + // Do nothing, use the current tool + break; + case RightClickMode::PickFgColor: + tool = toolbox->getToolById(tools::WellKnownTools::Eyedropper); + break; + case RightClickMode::Erase: + tool = toolbox->getToolById(tools::WellKnownTools::Eraser); + break; + } } + + return tool; +} + +tools::Ink* Editor::getCurrentEditorInk() +{ + Context* context = UIContext::instance(); + tools::Tool* tool = getCurrentEditorTool(); + tools::Ink* ink = tool->getInk(m_secondaryButton ? 1: 0); + + if (m_quicktool) + return ink; + + tools::Tool* selectedTool = context->settings()->getCurrentTool(); + RightClickMode rightClickMode = context->settings()->getRightClickMode(); + + if (m_secondaryButton && + rightClickMode != RightClickMode::Default && + isCurrentToolAffectedByRightClickMode()) { + tools::ToolBox* toolbox = App::instance()->getToolBox(); + + switch (rightClickMode) { + case RightClickMode::Default: + // Do nothing + break; + case RightClickMode::PickFgColor: + ink = toolbox->getInkById(tools::WellKnownInks::PickFg); + break; + case RightClickMode::Erase: + ink = toolbox->getInkById(tools::WellKnownInks::Eraser); + break; + } + } + else { + IToolSettings* toolSettings = context->settings()->getToolSettings(tool); + InkType inkType = toolSettings->getInkType(); + const char* id = NULL; + + switch (inkType) { + case kDefaultInk: + // Do nothing + break; + case kOpaqueInk: + id = tools::WellKnownInks::PaintOpaque; + break; + case kSetAlphaInk: + id = tools::WellKnownInks::PaintSetAlpha; + break; + case kLockAlphaInk: + id = tools::WellKnownInks::PaintLockAlpha; + break; + case kMergeInk: + id = tools::WellKnownInks::Paint; + break; + case kShadingInk: + id = tools::WellKnownInks::Shading; + break; + case kReplaceInk: + if (!m_secondaryButton) + id = tools::WellKnownInks::ReplaceBgWithFg; + else + id = tools::WellKnownInks::ReplaceFgWithBg; + break; + case kEraseInk: + id = tools::WellKnownInks::Eraser; + break; + case kSelectionInk: + id = tools::WellKnownInks::Selection; + break; + case kBlurInk: + id = tools::WellKnownInks::Blur; + break; + case kJumbleInk: + id = tools::WellKnownInks::Jumble; + break; + } + + if (id) + ink = App::instance()->getToolBox()->getInkById(id); + } + + return ink; } void Editor::screenToEditor(int xin, int yin, int* xout, int* yout) @@ -930,10 +1038,18 @@ bool Editor::onProcessMessage(Message* msg) case kMouseDownMessage: if (m_sprite) { - m_oldPos = static_cast(msg)->position(); + MouseMessage* mouseMsg = static_cast(msg); + + m_oldPos = mouseMsg->position(); + if (!m_secondaryButton && mouseMsg->right()) { + m_secondaryButton = mouseMsg->right(); + + editor_update_quicktool(); + editor_setcursor(); + } EditorStatePtr holdState(m_state); - return m_state->onMouseDown(this, static_cast(msg)); + return m_state->onMouseDown(this, mouseMsg); } break; @@ -947,7 +1063,16 @@ bool Editor::onProcessMessage(Message* msg) case kMouseUpMessage: if (m_sprite) { EditorStatePtr holdState(m_state); - if (m_state->onMouseUp(this, static_cast(msg))) + bool result = m_state->onMouseUp(this, static_cast(msg)); + + if (!hasCapture() && m_secondaryButton) { + m_secondaryButton = false; + + editor_update_quicktool(); + editor_setcursor(); + } + + if (result) return true; } break; @@ -1169,8 +1294,7 @@ void Editor::pasteImage(const Image* image, int x, int y) // which will use the extra cel for transformation preview, and is // not compatible with the drawing cursor preview which overwrite // the extra cel. - tools::Tool* currentTool = getCurrentEditorTool(); - if (!currentTool->getInk(0)->isSelection()) { + if (!getCurrentEditorInk()->isSelection()) { tools::Tool* defaultSelectionTool = App::instance()->getToolBox()->getToolById(tools::WellKnownTools::RectangularMarquee); diff --git a/src/app/ui/editor/editor.h b/src/app/ui/editor/editor.h index 75050f903..164066491 100644 --- a/src/app/ui/editor/editor.h +++ b/src/app/ui/editor/editor.h @@ -58,6 +58,7 @@ namespace app { class PixelsMovement; namespace tools { + class Ink; class Tool; } @@ -169,6 +170,9 @@ namespace app { gfx::Point controlInfiniteScroll(ui::MouseMessage* msg); tools::Tool* getCurrentEditorTool(); + tools::Ink* getCurrentEditorInk(); + + bool isSecondaryButton() const { return m_secondaryButton; } // Returns true if we are able to draw in the current doc/sprite/layer/cel. bool canDraw(); @@ -213,6 +217,7 @@ namespace app { void moveBrushPreview(int x, int y, bool refresh = true); void clearBrushPreview(bool refresh = true); bool doesBrushPreviewNeedSubpixel(); + bool isCurrentToolAffectedByRightClickMode(); void drawMaskSafe(); void drawMask(ui::Graphics* g); @@ -286,6 +291,8 @@ namespace app { gfx::Point m_oldPos; EditorFlags m_flags; + + bool m_secondaryButton; }; ui::WidgetType editor_type(); diff --git a/src/app/ui/editor/moving_pixels_state.cpp b/src/app/ui/editor/moving_pixels_state.cpp index f8edd6b8d..b2861c275 100644 --- a/src/app/ui/editor/moving_pixels_state.cpp +++ b/src/app/ui/editor/moving_pixels_state.cpp @@ -63,7 +63,7 @@ MovingPixelsState::MovingPixelsState(Editor* editor, MouseMessage* msg, PixelsMo // MovingPixelsState needs a selection tool to avoid problems // sharing the extra cel between the drawing cursor preview and the // pixels movement/transformation preview. - //ASSERT(!editor->getCurrentEditorTool()->getInk(0)->isSelection()); + //ASSERT(!editor->getCurrentEditorInk()->isSelection()); UIContext* context = UIContext::instance(); diff --git a/src/app/ui/editor/standby_state.cpp b/src/app/ui/editor/standby_state.cpp index fea16f5dc..d92902ddf 100644 --- a/src/app/ui/editor/standby_state.cpp +++ b/src/app/ui/editor/standby_state.cpp @@ -124,8 +124,7 @@ void StandbyState::onCurrentToolChange(Editor* editor) bool StandbyState::checkForScroll(Editor* editor, MouseMessage* msg) { - tools::Tool* currentTool = editor->getCurrentEditorTool(); - tools::Ink* clickedInk = currentTool->getInk(msg->right() ? 1: 0); + tools::Ink* clickedInk = editor->getCurrentEditorInk(); // Start scroll loop if (msg->middle() || clickedInk->isScrollMovement()) { // TODO msg->middle() should be customizable @@ -141,8 +140,7 @@ bool StandbyState::checkForScroll(Editor* editor, MouseMessage* msg) bool StandbyState::checkForZoom(Editor* editor, MouseMessage* msg) { - tools::Tool* currentTool = editor->getCurrentEditorTool(); - tools::Ink* clickedInk = currentTool->getInk(msg->right() ? 1: 0); + tools::Ink* clickedInk = editor->getCurrentEditorInk(); // Start scroll loop if (clickedInk->isZoom()) { @@ -162,8 +160,8 @@ bool StandbyState::onMouseDown(Editor* editor, MouseMessage* msg) return true; UIContext* context = UIContext::instance(); - tools::Tool* current_tool = editor->getCurrentEditorTool(); - tools::Ink* clickedInk = current_tool->getInk(msg->right() ? 1: 0); + tools::Tool* currentTool = editor->getCurrentEditorTool(); + tools::Ink* clickedInk = editor->getCurrentEditorInk(); DocumentLocation location; editor->getDocumentLocation(&location); Document* document = location.document(); @@ -225,7 +223,7 @@ bool StandbyState::onMouseDown(Editor* editor, MouseMessage* msg) // Move selected pixels if (editor->isInsideSelection() && - current_tool->getInk(0)->isSelection() && + currentTool->getInk(0)->isSelection() && msg->left()) { int x, y, opacity; Image* image = location.image(&x, &y, &opacity); @@ -243,20 +241,13 @@ bool StandbyState::onMouseDown(Editor* editor, MouseMessage* msg) // Call the eyedropper command if (clickedInk->isEyedropper()) { - Command* eyedropper_cmd = - CommandsModule::instance()->getCommandByName(CommandId::Eyedropper); - bool fg = (static_cast(clickedInk)->target() == tools::PickInk::Fg); - - Params params; - params.set("target", fg ? "foreground": "background"); - - UIContext::instance()->executeCommand(eyedropper_cmd, ¶ms); + onMouseMove(editor, msg); return true; } // Start the Tool-Loop if (layer) { - tools::ToolLoop* toolLoop = create_tool_loop(editor, context, msg); + tools::ToolLoop* toolLoop = create_tool_loop(editor, context); if (toolLoop) editor->setState(EditorStatePtr(new DrawingState(toolLoop, editor, msg))); return true; @@ -273,6 +264,21 @@ bool StandbyState::onMouseUp(Editor* editor, MouseMessage* msg) bool StandbyState::onMouseMove(Editor* editor, MouseMessage* msg) { + // We control eyedropper tool from here. TODO move this to another place + if (msg->left() || msg->right()) { + tools::Ink* clickedInk = editor->getCurrentEditorInk(); + if (clickedInk->isEyedropper()) { + Command* eyedropper_cmd = + CommandsModule::instance()->getCommandByName(CommandId::Eyedropper); + bool fg = (static_cast(clickedInk)->target() == tools::PickInk::Fg); + + Params params; + params.set("target", fg ? "foreground": "background"); + + UIContext::instance()->executeCommand(eyedropper_cmd, ¶ms); + } + } + editor->moveDrawingCursor(); editor->updateStatusBar(); return true; @@ -397,13 +403,10 @@ bool StandbyState::onMouseWheel(Editor* editor, MouseMessage* msg) bool StandbyState::onSetCursor(Editor* editor) { - tools::Tool* current_tool = editor->getCurrentEditorTool(); - - if (current_tool) { - tools::Ink* current_ink = current_tool->getInk(0); - + tools::Ink* ink = editor->getCurrentEditorInk(); + if (ink) { // If the current tool change selection (e.g. rectangular marquee, etc.) - if (current_ink->isSelection()) { + if (ink->isSelection()) { // See if the cursor is in some selection handle. if (m_decorator->onSetCursor(editor)) return true; @@ -422,27 +425,27 @@ bool StandbyState::onSetCursor(Editor* editor) return true; } } - else if (current_ink->isEyedropper()) { + else if (ink->isEyedropper()) { editor->hideDrawingCursor(); jmouse_set_cursor(kEyedropperCursor); return true; } - else if (current_ink->isZoom()) { + else if (ink->isZoom()) { editor->hideDrawingCursor(); jmouse_set_cursor(kMagnifierCursor); return true; } - else if (current_ink->isScrollMovement()) { + else if (ink->isScrollMovement()) { editor->hideDrawingCursor(); jmouse_set_cursor(kScrollCursor); return true; } - else if (current_ink->isCelMovement()) { + else if (ink->isCelMovement()) { editor->hideDrawingCursor(); jmouse_set_cursor(kMoveCursor); return true; } - else if (current_ink->isSlice()) { + else if (ink->isSlice()) { jmouse_set_cursor(kNoCursor); editor->showDrawingCursor(); return true; @@ -475,7 +478,7 @@ bool StandbyState::onKeyUp(Editor* editor, KeyMessage* msg) bool StandbyState::onUpdateStatusBar(Editor* editor) { - tools::Tool* current_tool = editor->getCurrentEditorTool(); + tools::Ink* ink = editor->getCurrentEditorInk(); const Sprite* sprite = editor->sprite(); int x, y; @@ -485,7 +488,7 @@ bool StandbyState::onUpdateStatusBar(Editor* editor) StatusBar::instance()->clearText(); } // For eye-dropper - else if (current_tool->getInk(0)->isEyedropper()) { + else if (ink->isEyedropper()) { bool grabAlpha = UIContext::instance()->settings()->getGrabAlpha(); ColorPicker picker; picker.pickColor(editor->getDocumentLocation(), x, y, @@ -663,9 +666,9 @@ void StandbyState::Decorator::postRenderDecorator(EditorPostRender* render) editor->document()->isMaskVisible() && !editor->document()->mask()->isFrozen()) { // And draw only when the user has a selection tool as active tool. - tools::Tool* currentTool = editor->getCurrentEditorTool(); + tools::Ink* ink = editor->getCurrentEditorInk(); - if (currentTool->getInk(0)->isSelection()) + if (ink->isSelection()) getTransformHandles(editor)->drawHandles(editor, m_standbyState->getTransformation(editor)); } diff --git a/src/app/ui/editor/tool_loop_impl.cpp b/src/app/ui/editor/tool_loop_impl.cpp index 2caf47c5f..6592a2bb0 100644 --- a/src/app/ui/editor/tool_loop_impl.cpp +++ b/src/app/ui/editor/tool_loop_impl.cpp @@ -92,6 +92,7 @@ public: ToolLoopImpl(Editor* editor, Context* context, tools::Tool* tool, + tools::Ink* ink, Document* document, tools::ToolLoop::Button button, const app::Color& primary_color, @@ -108,7 +109,7 @@ public: , m_toolSettings(m_settings->getToolSettings(m_tool)) , m_canceled(false) , m_button(button) - , m_ink(getInkFromType()) + , m_ink(ink) , m_primary_color(color_utils::color_for_layer(primary_color, m_layer)) , m_secondary_color(color_utils::color_for_layer(secondary_color, m_layer)) , m_selectionMode(m_settings->selection()->getSelectionMode()) @@ -282,61 +283,13 @@ public: return m_shadeTable; } -private: - tools::Ink* getInkFromType() - { - using namespace tools; - - InkType inkType = m_toolSettings->getInkType(); - if (inkType == kDefaultInk) - return m_tool->getInk(m_button); - - const char* id = WellKnownInks::Paint; - switch (inkType) { - case kOpaqueInk: - id = WellKnownInks::PaintOpaque; - break; - case kSetAlphaInk: - id = WellKnownInks::PaintSetAlpha; - break; - case kLockAlphaInk: - id = WellKnownInks::PaintLockAlpha; - break; - case kMergeInk: - id = WellKnownInks::Paint; - break; - case kShadingInk: - id = WellKnownInks::Shading; - break; - case kReplaceInk: - if (m_button == ToolLoop::Left) - id = WellKnownInks::ReplaceBgWithFg; - else - id = WellKnownInks::ReplaceFgWithBg; - break; - case kEraseInk: - id = WellKnownInks::Eraser; - break; - case kSelectionInk: - id = WellKnownInks::Selection; - break; - case kBlurInk: - id = WellKnownInks::Blur; - break; - case kJumbleInk: - id = WellKnownInks::Jumble; - break; - } - - return App::instance()->getToolBox()->getInkById(id); - } - }; -tools::ToolLoop* create_tool_loop(Editor* editor, Context* context, MouseMessage* msg) +tools::ToolLoop* create_tool_loop(Editor* editor, Context* context) { - tools::Tool* current_tool = context->settings()->getCurrentTool(); - if (!current_tool) + tools::Tool* current_tool = editor->getCurrentEditorTool(); + tools::Ink* current_ink = editor->getCurrentEditorInk(); + if (!current_tool || !current_ink) return NULL; Layer* layer = editor->layer(); @@ -376,19 +329,16 @@ tools::ToolLoop* create_tool_loop(Editor* editor, Context* context, MouseMessage } // Create the new tool loop - try - { - return new ToolLoopImpl(editor, - context, - current_tool, - editor->document(), - msg->left() ? tools::ToolLoop::Left: - tools::ToolLoop::Right, - msg->left() ? fg: bg, - msg->left() ? bg: fg); + try { + return new ToolLoopImpl(editor, context, + current_tool, + current_ink, + editor->document(), + !editor->isSecondaryButton() ? tools::ToolLoop::Left: tools::ToolLoop::Right, + !editor->isSecondaryButton() ? fg: bg, + !editor->isSecondaryButton() ? bg: fg); } - catch (const std::exception& ex) - { + catch (const std::exception& ex) { Alert::show(PACKAGE "<