mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-09 18:44:46 +00:00
Fix crash using eyedropper above a (hidden) selection handle
We need to be in a Selection ink to start moving pixels from transform handles.
This commit is contained in:
parent
497f0ffee0
commit
3ba3b48fd7
@ -195,52 +195,51 @@ bool StandbyState::onMouseDown(Editor* editor, MouseMessage* msg)
|
||||
return true;
|
||||
}
|
||||
|
||||
// Transform selected pixels
|
||||
if (document->isMaskVisible() &&
|
||||
m_decorator->getTransformHandles(editor)) {
|
||||
TransformHandles* transfHandles = m_decorator->getTransformHandles(editor);
|
||||
|
||||
// Get the handle covered by the mouse.
|
||||
HandleType handle = transfHandles->getHandleAtPoint(editor,
|
||||
msg->position(),
|
||||
document->getTransformation());
|
||||
|
||||
if (handle != NoHandle) {
|
||||
int x, y, opacity;
|
||||
Image* image = location.image(&x, &y, &opacity);
|
||||
if (image) {
|
||||
if (!layer->isWritable()) {
|
||||
Alert::show(PACKAGE "<<The layer is locked.||&Close");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Change to MovingPixelsState
|
||||
transformSelection(editor, msg, handle);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Move selected pixels
|
||||
if (editor->isInsideSelection() &&
|
||||
currentTool->getInk(0)->isSelection() &&
|
||||
msg->left()) {
|
||||
if (!layer->isWritable()) {
|
||||
Alert::show(PACKAGE "<<The layer is locked.||&Close");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Change to MovingPixelsState
|
||||
transformSelection(editor, msg, MoveHandle);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Call the eyedropper command
|
||||
if (clickedInk->isEyedropper()) {
|
||||
onMouseMove(editor, msg);
|
||||
callEyedropper(editor);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (clickedInk->isSelection()) {
|
||||
// Transform selected pixels
|
||||
if (document->isMaskVisible() && m_decorator->getTransformHandles(editor)) {
|
||||
TransformHandles* transfHandles = m_decorator->getTransformHandles(editor);
|
||||
|
||||
// Get the handle covered by the mouse.
|
||||
HandleType handle = transfHandles->getHandleAtPoint(editor,
|
||||
msg->position(),
|
||||
document->getTransformation());
|
||||
|
||||
if (handle != NoHandle) {
|
||||
int x, y, opacity;
|
||||
Image* image = location.image(&x, &y, &opacity);
|
||||
if (image) {
|
||||
if (!layer->isWritable()) {
|
||||
Alert::show(PACKAGE "<<The layer is locked.||&Close");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Change to MovingPixelsState
|
||||
transformSelection(editor, msg, handle);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Move selected pixels
|
||||
if (editor->isInsideSelection() && msg->left()) {
|
||||
if (!layer->isWritable()) {
|
||||
Alert::show(PACKAGE "<<The layer is locked.||&Close");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Change to MovingPixelsState
|
||||
transformSelection(editor, msg, MoveHandle);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Start the Tool-Loop
|
||||
if (layer) {
|
||||
tools::ToolLoop* toolLoop = create_tool_loop(editor, context);
|
||||
@ -263,16 +262,8 @@ 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<tools::PickInk*>(clickedInk)->target() == tools::PickInk::Fg);
|
||||
|
||||
Params params;
|
||||
params.set("target", fg ? "foreground": "background");
|
||||
|
||||
UIContext::instance()->executeCommand(eyedropper_cmd, ¶ms);
|
||||
}
|
||||
if (clickedInk->isEyedropper())
|
||||
callEyedropper(editor);
|
||||
}
|
||||
|
||||
editor->moveDrawingCursor();
|
||||
@ -561,6 +552,22 @@ void StandbyState::transformSelection(Editor* editor, MouseMessage* msg, HandleT
|
||||
}
|
||||
}
|
||||
|
||||
void StandbyState::callEyedropper(Editor* editor)
|
||||
{
|
||||
tools::Ink* clickedInk = editor->getCurrentEditorInk();
|
||||
if (!clickedInk->isEyedropper())
|
||||
return;
|
||||
|
||||
Command* eyedropper_cmd =
|
||||
CommandsModule::instance()->getCommandByName(CommandId::Eyedropper);
|
||||
bool fg = (static_cast<tools::PickInk*>(clickedInk)->target() == tools::PickInk::Fg);
|
||||
|
||||
Params params;
|
||||
params.set("target", fg ? "foreground": "background");
|
||||
|
||||
UIContext::instance()->executeCommand(eyedropper_cmd, ¶ms);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Decorator
|
||||
|
||||
|
@ -76,6 +76,7 @@ namespace app {
|
||||
|
||||
private:
|
||||
void transformSelection(Editor* editor, ui::MouseMessage* msg, HandleType handle);
|
||||
void callEyedropper(Editor* editor);
|
||||
|
||||
Decorator* m_decorator;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user