diff --git a/src/app/ui/document_view.cpp b/src/app/ui/document_view.cpp index b8e3a13f8..8926720c9 100644 --- a/src/app/ui/document_view.cpp +++ b/src/app/ui/document_view.cpp @@ -113,6 +113,7 @@ protected: if (lmb->isPressed(msg) || rmb->isPressed(msg)) { MouseMessage mouseMsg( (msg->type() == kKeyDownMessage ? kMouseDownMessage: kMouseUpMessage), + PointerType::Unknown, (lmb->isPressed(msg) ? kButtonLeft: kButtonRight), msg->modifiers(), ui::get_mouse_position()); diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index 13030bf39..ca58bfd26 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -164,6 +164,7 @@ Editor::Editor(Document* document, EditorFlags flags) , m_antsOffset(0) , m_customizationDelegate(NULL) , m_docView(NULL) + , m_lastPointerType(ui::PointerType::Unknown) , m_flags(flags) , m_secondaryButton(false) , m_aniSpeed(1.0) @@ -919,6 +920,12 @@ tools::Tool* Editor::getCurrentEditorTool() if (m_quicktool) return m_quicktool; + // Eraser tip + if (m_lastPointerType == ui::PointerType::Eraser) { + tools::ToolBox* toolbox = App::instance()->getToolBox(); + return toolbox->getToolById(tools::WellKnownTools::Eraser); + } + tools::Tool* tool = App::instance()->activeTool(); if (m_secondaryButton && @@ -1277,6 +1284,8 @@ bool Editor::onProcessMessage(Message* msg) MouseMessage* mouseMsg = static_cast(msg); m_oldPos = mouseMsg->position(); + m_lastPointerType = mouseMsg->pointerType(); + if (!m_secondaryButton && mouseMsg->right()) { m_secondaryButton = mouseMsg->right(); @@ -1293,6 +1302,9 @@ bool Editor::onProcessMessage(Message* msg) case kMouseMoveMessage: if (m_sprite) { EditorStatePtr holdState(m_state); + + m_lastPointerType = static_cast(msg)->pointerType(); + return m_state->onMouseMove(this, static_cast(msg)); } break; @@ -1303,6 +1315,8 @@ bool Editor::onProcessMessage(Message* msg) MouseMessage* mouseMsg = static_cast(msg); bool result = m_state->onMouseUp(this, mouseMsg); + m_lastPointerType = mouseMsg->pointerType(); + if (!hasCapture()) { m_secondaryButton = false; @@ -1320,6 +1334,9 @@ bool Editor::onProcessMessage(Message* msg) if (m_sprite) { MouseMessage* mouseMsg = static_cast(msg); EditorStatePtr holdState(m_state); + + m_lastPointerType = mouseMsg->pointerType(); + bool used = m_state->onDoubleClick(this, mouseMsg); if (used) return true; diff --git a/src/app/ui/editor/editor.h b/src/app/ui/editor/editor.h index ba04e359f..5c20232a2 100644 --- a/src/app/ui/editor/editor.h +++ b/src/app/ui/editor/editor.h @@ -28,6 +28,7 @@ #include "render/zoom.h" #include "ui/base.h" #include "ui/cursor_type.h" +#include "ui/pointer_type.h" #include "ui/timer.h" #include "ui/widget.h" @@ -324,6 +325,7 @@ namespace app { DocumentView* m_docView; gfx::Point m_oldPos; + ui::PointerType m_lastPointerType; EditorFlags m_flags; diff --git a/src/app/ui/toolbar.cpp b/src/app/ui/toolbar.cpp index 68cbd6b7b..ce06e6a4d 100644 --- a/src/app/ui/toolbar.cpp +++ b/src/app/ui/toolbar.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2001-2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -221,6 +221,7 @@ bool ToolBar::onProcessMessage(Message* msg) MouseMessage* mouseMsg2 = new MouseMessage( kMouseDownMessage, + mouseMsg->pointerType(), mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position()); @@ -635,6 +636,7 @@ bool ToolBar::ToolStrip::onProcessMessage(Message* msg) MouseMessage* mouseMsg2 = new MouseMessage( kMouseDownMessage, + mouseMsg->pointerType(), mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position()); diff --git a/src/ui/combobox.cpp b/src/ui/combobox.cpp index ddf508a20..b66d6f9f7 100644 --- a/src/ui/combobox.cpp +++ b/src/ui/combobox.cpp @@ -1,5 +1,5 @@ // Aseprite UI Library -// Copyright (C) 2001-2013, 2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -481,6 +481,7 @@ bool ComboBoxEntry::onProcessMessage(Message* msg) releaseMouse(); MouseMessage mouseMsg2(kMouseDownMessage, + mouseMsg->pointerType(), mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position()); diff --git a/src/ui/int_entry.cpp b/src/ui/int_entry.cpp index a43b8f70b..77ab25d2d 100644 --- a/src/ui/int_entry.cpp +++ b/src/ui/int_entry.cpp @@ -1,5 +1,5 @@ // Aseprite UI Library -// Copyright (C) 2001-2013, 2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -90,6 +90,7 @@ bool IntEntry::onProcessMessage(Message* msg) releaseMouse(); MouseMessage mouseMsg2(kMouseDownMessage, + mouseMsg->pointerType(), mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position()); diff --git a/src/ui/manager.cpp b/src/ui/manager.cpp index bf4c98584..3d0b9bff6 100644 --- a/src/ui/manager.cpp +++ b/src/ui/manager.cpp @@ -247,7 +247,8 @@ bool Manager::generateMessages() } void Manager::generateSetCursorMessage(const gfx::Point& mousePos, - KeyModifiers modifiers) + KeyModifiers modifiers, + PointerType pointerType) { if (get_mouse_cursor() == kOutsideDisplay) return; @@ -257,7 +258,9 @@ void Manager::generateSetCursorMessage(const gfx::Point& mousePos, enqueueMessage( newMouseMessage( kSetCursorMessage, dst, - mousePos, _internal_get_mouse_buttons(), + mousePos, + pointerType, + _internal_get_mouse_buttons(), modifiers)); else set_mouse_cursor(kArrowCursor); @@ -273,6 +276,18 @@ static MouseButtons mouse_buttons_from_she_to_ui(const she::Event& sheEvent) } } +static PointerType pointer_type_from_she_event(const she::Event& sheEvent) +{ + switch (sheEvent.device()) { + case she::Event::MouseDevice: return PointerType::Mouse; break; + case she::Event::MultitouchDevice: return PointerType::Multitouch; break; + case she::Event::StylusDevice: return PointerType::Pen; break; + case she::Event::EraserDevice: return PointerType::Eraser; break; + default: + return PointerType::Unknown; + } +} + void Manager::generateMessagesFromSheEvents() { she::Event lastMouseMoveEvent; @@ -346,8 +361,11 @@ void Manager::generateMessagesFromSheEvents() case she::Event::MouseMove: { _internal_set_mouse_position(sheEvent.position()); - handleMouseMove(sheEvent.position(), m_mouseButtons, - sheEvent.modifiers()); + handleMouseMove( + sheEvent.position(), + m_mouseButtons, + sheEvent.modifiers(), + pointer_type_from_she_event(sheEvent)); lastMouseMoveEvent = sheEvent; break; } @@ -357,8 +375,11 @@ void Manager::generateMessagesFromSheEvents() m_mouseButtons = (MouseButtons)((int)m_mouseButtons | (int)pressedButton); _internal_set_mouse_buttons(m_mouseButtons); - handleMouseDown(sheEvent.position(), pressedButton, - sheEvent.modifiers()); + handleMouseDown( + sheEvent.position(), + pressedButton, + sheEvent.modifiers(), + pointer_type_from_she_event(sheEvent)); break; } @@ -367,21 +388,28 @@ void Manager::generateMessagesFromSheEvents() m_mouseButtons = (MouseButtons)((int)m_mouseButtons & ~(int)releasedButton); _internal_set_mouse_buttons(m_mouseButtons); - handleMouseUp(sheEvent.position(), releasedButton, - sheEvent.modifiers()); + handleMouseUp( + sheEvent.position(), + releasedButton, + sheEvent.modifiers(), + pointer_type_from_she_event(sheEvent)); break; } case she::Event::MouseDoubleClick: { MouseButtons clickedButton = mouse_buttons_from_she_to_ui(sheEvent); - handleMouseDoubleClick(sheEvent.position(), clickedButton, - sheEvent.modifiers()); + handleMouseDoubleClick( + sheEvent.position(), + clickedButton, + sheEvent.modifiers(), + pointer_type_from_she_event(sheEvent)); break; } case she::Event::MouseWheel: { handleMouseWheel(sheEvent.position(), m_mouseButtons, sheEvent.modifiers(), + pointer_type_from_she_event(sheEvent), sheEvent.wheelDelta(), sheEvent.preciseWheel()); break; @@ -403,13 +431,15 @@ void Manager::generateMessagesFromSheEvents() if (lastMouseMoveEvent.type() != she::Event::None) { sheEvent = lastMouseMoveEvent; generateSetCursorMessage(sheEvent.position(), - sheEvent.modifiers()); + sheEvent.modifiers(), + pointer_type_from_she_event(sheEvent)); } } void Manager::handleMouseMove(const gfx::Point& mousePos, MouseButtons mouseButtons, - KeyModifiers modifiers) + KeyModifiers modifiers, + PointerType pointerType) { // Get the list of widgets to send mouse messages. mouse_widgets_list.clear(); @@ -436,12 +466,16 @@ void Manager::handleMouseMove(const gfx::Point& mousePos, enqueueMessage( newMouseMessage( kMouseMoveMessage, dst, - mousePos, mouseButtons, modifiers)); + mousePos, + pointerType, + mouseButtons, + modifiers)); } void Manager::handleMouseDown(const gfx::Point& mousePos, MouseButtons mouseButtons, - KeyModifiers modifiers) + KeyModifiers modifiers, + PointerType pointerType) { handleWindowZOrder(); @@ -449,41 +483,53 @@ void Manager::handleMouseDown(const gfx::Point& mousePos, newMouseMessage( kMouseDownMessage, (capture_widget ? capture_widget: mouse_widget), - mousePos, mouseButtons, modifiers)); + mousePos, + pointerType, + mouseButtons, + modifiers)); } void Manager::handleMouseUp(const gfx::Point& mousePos, MouseButtons mouseButtons, - KeyModifiers modifiers) + KeyModifiers modifiers, + PointerType pointerType) { enqueueMessage( newMouseMessage( kMouseUpMessage, (capture_widget ? capture_widget: mouse_widget), - mousePos, mouseButtons, modifiers)); + mousePos, + pointerType, + mouseButtons, + modifiers)); } void Manager::handleMouseDoubleClick(const gfx::Point& mousePos, MouseButtons mouseButtons, - KeyModifiers modifiers) + KeyModifiers modifiers, + PointerType pointerType) { Widget* dst = (capture_widget ? capture_widget: mouse_widget); if (dst) { enqueueMessage( newMouseMessage( kDoubleClickMessage, - dst, mousePos, mouseButtons, modifiers)); + dst, mousePos, pointerType, + mouseButtons, modifiers)); } } void Manager::handleMouseWheel(const gfx::Point& mousePos, - MouseButtons mouseButtons, KeyModifiers modifiers, - const gfx::Point& wheelDelta, bool preciseWheel) + MouseButtons mouseButtons, + KeyModifiers modifiers, + PointerType pointerType, + const gfx::Point& wheelDelta, + bool preciseWheel) { enqueueMessage(newMouseMessage( kMouseWheelMessage, (capture_widget ? capture_widget: mouse_widget), - mousePos, mouseButtons, modifiers, + mousePos, pointerType, mouseButtons, modifiers, wheelDelta, preciseWheel)); } @@ -776,7 +822,9 @@ void Manager::setMouse(Widget* widget) Message* msg = newMouseMessage( kMouseEnterMessage, NULL, - get_mouse_position(), _internal_get_mouse_buttons(), + get_mouse_position(), + PointerType::Unknown, + _internal_get_mouse_buttons(), kKeyUninitializedModifier); for (; it != widget_parents.end(); ++it) { @@ -786,7 +834,8 @@ void Manager::setMouse(Widget* widget) enqueueMessage(msg); generateSetCursorMessage(get_mouse_position(), - kKeyUninitializedModifier); + kKeyUninitializedModifier, + PointerType::Unknown); } } } @@ -1419,12 +1468,16 @@ Widget* Manager::findMagneticWidget(Widget* widget) // static Message* Manager::newMouseMessage( MessageType type, - Widget* widget, const gfx::Point& mousePos, - MouseButtons buttons, KeyModifiers modifiers, - const gfx::Point& wheelDelta, bool preciseWheel) + Widget* widget, + const gfx::Point& mousePos, + PointerType pointerType, + MouseButtons buttons, + KeyModifiers modifiers, + const gfx::Point& wheelDelta, + bool preciseWheel) { Message* msg = new MouseMessage( - type, buttons, modifiers, mousePos, + type, pointerType, buttons, modifiers, mousePos, wheelDelta, preciseWheel); if (widget != NULL) diff --git a/src/ui/manager.h b/src/ui/manager.h index 0b83646ee..cbc938d4d 100644 --- a/src/ui/manager.h +++ b/src/ui/manager.h @@ -12,6 +12,7 @@ #include "ui/keys.h" #include "ui/message_type.h" #include "ui/mouse_buttons.h" +#include "ui/pointer_type.h" #include "ui/widget.h" namespace she { @@ -115,14 +116,32 @@ namespace ui { virtual void onNewDisplayConfiguration(); private: - void generateSetCursorMessage(const gfx::Point& mousePos, KeyModifiers modifiers); + void generateSetCursorMessage(const gfx::Point& mousePos, + KeyModifiers modifiers, + PointerType pointerType); void generateMessagesFromSheEvents(); - void handleMouseMove(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers); - void handleMouseDown(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers); - void handleMouseUp(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers); - void handleMouseDoubleClick(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers); - void handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers, - const gfx::Point& wheelDelta, bool preciseWheel); + void handleMouseMove(const gfx::Point& mousePos, + MouseButtons mouseButtons, + KeyModifiers modifiers, + PointerType pointerType); + void handleMouseDown(const gfx::Point& mousePos, + MouseButtons mouseButtons, + KeyModifiers modifiers, + PointerType pointerType); + void handleMouseUp(const gfx::Point& mousePos, + MouseButtons mouseButtons, + KeyModifiers modifiers, + PointerType pointerType); + void handleMouseDoubleClick(const gfx::Point& mousePos, + MouseButtons mouseButtons, + KeyModifiers modifiers, + PointerType pointerType); + void handleMouseWheel(const gfx::Point& mousePos, + MouseButtons mouseButtons, + KeyModifiers modifiers, + PointerType pointerType, + const gfx::Point& wheelDelta, + bool preciseWheel); void handleTouchMagnify(const gfx::Point& mousePos, const KeyModifiers modifiers, const double magnification); @@ -135,7 +154,9 @@ namespace ui { static Message* newMouseMessage( MessageType type, Widget* widget, const gfx::Point& mousePos, - MouseButtons buttons, KeyModifiers modifiers, + PointerType pointerType, + MouseButtons buttons, + KeyModifiers modifiers, const gfx::Point& wheelDelta = gfx::Point(0, 0), bool preciseWheel = false); void broadcastKeyMsg(Message* msg); diff --git a/src/ui/message.h b/src/ui/message.h index 01dca2099..01cff4873 100644 --- a/src/ui/message.h +++ b/src/ui/message.h @@ -14,6 +14,7 @@ #include "ui/keys.h" #include "ui/message_type.h" #include "ui/mouse_buttons.h" +#include "ui/pointer_type.h" #include "ui/widgets_list.h" #include @@ -103,18 +104,21 @@ namespace ui { class MouseMessage : public Message { public: MouseMessage(MessageType type, + PointerType pointerType, MouseButtons buttons, KeyModifiers modifiers, const gfx::Point& pos, const gfx::Point& wheelDelta = gfx::Point(0, 0), bool preciseWheel = false) : Message(type, modifiers), + m_pointerType(pointerType), m_buttons(buttons), m_pos(pos), m_wheelDelta(wheelDelta), m_preciseWheel(preciseWheel) { } + PointerType pointerType() const { return m_pointerType; } MouseButtons buttons() const { return m_buttons; } bool left() const { return (m_buttons & kButtonLeft) == kButtonLeft; } bool right() const { return (m_buttons & kButtonRight) == kButtonRight; } @@ -125,6 +129,7 @@ namespace ui { const gfx::Point& position() const { return m_pos; } private: + PointerType m_pointerType; MouseButtons m_buttons; // Pressed buttons gfx::Point m_pos; // Mouse position gfx::Point m_wheelDelta; // Wheel axis variation diff --git a/src/ui/pointer_type.h b/src/ui/pointer_type.h new file mode 100644 index 000000000..8a179288a --- /dev/null +++ b/src/ui/pointer_type.h @@ -0,0 +1,23 @@ +// Aseprite UI Library +// Copyright (C) 2016 David Capello +// +// This file is released under the terms of the MIT license. +// Read LICENSE.txt for more information. + +#ifndef UI_POINTER_TYPE_H_INCLUDED +#define UI_POINTER_TYPE_H_INCLUDED +#pragma once + +namespace ui { + + enum class PointerType { + Unknown, + Mouse, + Multitouch, + Pen, + Eraser + }; + +} // namespace ui + +#endif diff --git a/src/ui/ui.h b/src/ui/ui.h index f9d153b6b..f5b4f9989 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -1,5 +1,5 @@ // Aseprite UI Library -// Copyright (C) 2001-2013, 2015 David Capello +// Copyright (C) 2001-2016 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -43,14 +43,15 @@ #include "ui/overlay_manager.h" #include "ui/paint_event.h" #include "ui/panel.h" +#include "ui/pointer_type.h" #include "ui/popup_window.h" -#include "ui/size_hint_event.h" #include "ui/property.h" #include "ui/register_message.h" #include "ui/resize_event.h" #include "ui/save_layout_event.h" #include "ui/scroll_bar.h" #include "ui/separator.h" +#include "ui/size_hint_event.h" #include "ui/slider.h" #include "ui/splitter.h" #include "ui/system.h" diff --git a/src/ui/widget.cpp b/src/ui/widget.cpp index a20e4ef9b..047dc9922 100644 --- a/src/ui/widget.cpp +++ b/src/ui/widget.cpp @@ -1242,6 +1242,7 @@ bool Widget::offerCapture(ui::MouseMessage* mouseMsg, int widget_type) MouseMessage* mouseMsg2 = new MouseMessage( kMouseDownMessage, + mouseMsg->pointerType(), mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position()); @@ -1328,6 +1329,7 @@ bool Widget::onProcessMessage(Message* msg) if (kMouseDownMessage) { MouseMessage* mouseMsg = static_cast(msg); MouseMessage mouseMsg2(kMouseDownMessage, + mouseMsg->pointerType(), mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position(),