This is an automated email from the git hooks/post-receive script. thansen pushed a commit to branch master in repository aseprite.
commit 2ce09c53dde38482c0a270f56da9f155149b7e74 Author: David Capello <[email protected]> Date: Mon Apr 4 18:46:48 2016 -0300 Add customization for square aspect, draw from center, and move origin keys (fix #1028) Some changes: - Now ui::Keys aren't processed in app::tools side, they are processed in Editor side and converted to ToolLoopModifiers flags. - Replace ToolLoop::getSelectionMode -> ToolLoop::getModifiers() --- data/gui.xml | 7 +++ data/pref.xml | 7 ++- src/app/commands/cmd_keyboard_shortcuts.cpp | 5 +- src/app/commands/cmd_select_tile.cpp | 18 +++--- src/app/pref/preferences.h | 1 - src/app/tools/controller.h | 10 +-- src/app/tools/controllers.h | 79 +++-------------------- src/app/tools/inks.h | 17 +++-- src/app/tools/selection_mode.h | 24 ------- src/app/tools/tool_loop.h | 9 +-- src/app/tools/tool_loop_manager.cpp | 28 ++------- src/app/tools/tool_loop_manager.h | 11 ++-- src/app/tools/tool_loop_modifiers.h | 28 +++++++++ src/app/ui/context_bar.cpp | 14 +++-- src/app/ui/context_bar.h | 4 +- src/app/ui/editor/brush_preview.cpp | 1 - src/app/ui/editor/drawing_state.cpp | 14 +++-- src/app/ui/editor/drawing_state.h | 1 + src/app/ui/editor/editor.cpp | 98 ++++++++++++++++++----------- src/app/ui/editor/editor.h | 9 ++- src/app/ui/editor/standby_state.cpp | 12 ++-- src/app/ui/editor/tool_loop_impl.cpp | 4 +- src/app/ui/keyboard_shortcuts.cpp | 23 ++++--- src/app/ui/keyboard_shortcuts.h | 8 ++- 24 files changed, 199 insertions(+), 233 deletions(-) diff --git a/data/gui.xml b/data/gui.xml index a182383..1d1cb01 100644 --- a/data/gui.xml +++ b/data/gui.xml @@ -483,6 +483,13 @@ <!-- Modifiers for freehand tool controller --> <key action="StraightLineFromLastPoint" shortcut="Shift" /> + <!-- Modifiers for two-points tool controller --> + <key action="SquareAspect" shortcut="Shift" /> + <key action="DrawFromCenter" shortcut="Ctrl" /> + + <!-- Modifiers for two-or-more-points tools --> + <key action="MoveOrigin" shortcut="Space" /> + <!-- Without default shortcuts --> <key action="LeftMouseButton" /> <key action="RightMouseButton" /> diff --git a/data/pref.xml b/data/pref.xml index 656de3a..299b18e 100644 --- a/data/pref.xml +++ b/data/pref.xml @@ -52,6 +52,11 @@ <value id="ALL_LAYERS" value="0" /> <value id="CURRENT_LAYER" value="1" /> </enum> + <enum id="SelectionMode"> + <value id="DEFAULT" value="0" /> + <value id="ADD" value="1" /> +! <value id="SUBTRACT" value="2" /> + </enum> <enum id="PivotPosition"> <value id="NORTHWEST" value="0" /> <value id="NORTH" value="1" /> @@ -151,7 +156,7 @@ <option id="pixel_perfect" type="bool" default="false" /> </section> <section id="selection"> - <option id="mode" type="app::tools::SelectionMode" default="app::tools::SelectionMode::DEFAULT" /> + <option id="mode" type="SelectionMode" default="SelectionMode::DEFAULT" /> <option id="pivot_visibility" type="bool" default="false" /> <option id="pivot_position" type="PivotPosition" default="PivotPosition::CENTER" /> <option id="opaque" type="bool" default="false" /> diff --git a/src/app/commands/cmd_keyboard_shortcuts.cpp b/src/app/commands/cmd_keyboard_shortcuts.cpp index acd25cd..4c12943 100644 --- a/src/app/commands/cmd_keyboard_shortcuts.cpp +++ b/src/app/commands/cmd_keyboard_shortcuts.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 @@ -361,6 +361,9 @@ private: case KeyContext::FreehandTool: text = "Freehand Tools: " + text; break; + case KeyContext::ShapeTool: + text = "Shape Tools: " + text; + break; } KeyItem* keyItem = new KeyItem(text, key, NULL, 0); diff --git a/src/app/commands/cmd_select_tile.cpp b/src/app/commands/cmd_select_tile.cpp index 0de6d17..8569b15 100644 --- a/src/app/commands/cmd_select_tile.cpp +++ b/src/app/commands/cmd_select_tile.cpp @@ -38,14 +38,14 @@ protected: std::string onGetFriendlyName() const override; private: - tools::SelectionMode m_mode; + gen::SelectionMode m_mode; }; SelectTileCommand::SelectTileCommand() : Command("SelectTile", "Select Tile", CmdRecordableFlag) - , m_mode(tools::SelectionMode::DEFAULT) + , m_mode(gen::SelectionMode::DEFAULT) { } @@ -53,11 +53,11 @@ void SelectTileCommand::onLoadParams(const Params& params) { std::string mode = params.get("mode"); if (mode == "add") - m_mode = tools::SelectionMode::ADD; + m_mode = gen::SelectionMode::ADD; else if (mode == "subtract") - m_mode = tools::SelectionMode::SUBTRACT; + m_mode = gen::SelectionMode::SUBTRACT; else - m_mode = tools::SelectionMode::DEFAULT; + m_mode = gen::SelectionMode::DEFAULT; } bool SelectTileCommand::onEnabled(Context* ctx) @@ -78,7 +78,7 @@ void SelectTileCommand::onExecute(Context* ctx) base::UniquePtr<Mask> mask(new Mask()); - if (m_mode != tools::SelectionMode::DEFAULT) + if (m_mode != gen::SelectionMode::DEFAULT) mask->copyFrom(doc->mask()); { @@ -87,7 +87,7 @@ void SelectTileCommand::onExecute(Context* ctx) pos = snap_to_grid(gridBounds, pos, PreferSnapTo::BoxOrigin); gridBounds.setOrigin(pos); - if (m_mode != tools::SelectionMode::SUBTRACT) + if (m_mode != gen::SelectionMode::SUBTRACT) mask->add(gridBounds); else mask->subtract(gridBounds); @@ -109,8 +109,8 @@ std::string SelectTileCommand::onGetFriendlyName() const std::string text = "Select Tile"; switch (m_mode) { - case tools::SelectionMode::ADD: text += " (Add)"; break; - case tools::SelectionMode::SUBTRACT: text += " (Subtract)"; break; + case gen::SelectionMode::ADD: text += " (Add)"; break; + case gen::SelectionMode::SUBTRACT: text += " (Subtract)"; break; } return text; diff --git a/src/app/pref/preferences.h b/src/app/pref/preferences.h index 50e267e..944809c 100644 --- a/src/app/pref/preferences.h +++ b/src/app/pref/preferences.h @@ -16,7 +16,6 @@ #include "app/tools/freehand_algorithm.h" #include "app/tools/ink_type.h" #include "app/tools/rotation_algorithm.h" -#include "app/tools/selection_mode.h" #include "app/ui/color_bar.h" #include "doc/anidir.h" #include "doc/brush_pattern.h" diff --git a/src/app/tools/controller.h b/src/app/tools/controller.h index 4206edf..643c0c0 100644 --- a/src/app/tools/controller.h +++ b/src/app/tools/controller.h @@ -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 @@ -10,7 +10,6 @@ #pragma once #include "gfx/point.h" -#include "ui/keys.h" #include <string> #include <vector> @@ -30,13 +29,6 @@ namespace app { virtual bool isFreehand() { return false; } virtual bool isOnePoint() { return false; } - virtual void prepareController(ui::KeyModifiers modifiers) { } - - // Called when the user presses or releases a key. Returns true - // if the key is used (so a new mouse point is generated). - virtual bool pressKey(ui::KeyScancode key) { return false; } - virtual bool releaseKey(ui::KeyScancode key) { return false; } - // Called when the user starts drawing and each time a new button is // pressed. The controller could be sure that this method is called // at least one time. The point is a position relative to sprite diff --git a/src/app/tools/controllers.h b/src/app/tools/controllers.h index 4601b34..35bab4b 100644 --- a/src/app/tools/controllers.h +++ b/src/app/tools/controllers.h @@ -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 @@ -18,29 +18,15 @@ using namespace gfx; // using the space bar. class MoveOriginCapability : public Controller { public: - void prepareController(ui::KeyModifiers modifiers) override { - m_movingOrigin = false; - } - void pressButton(Stroke& stroke, const Point& point) override { m_last = point; } - bool pressKey(ui::KeyScancode key) override { - TRACE("pressKey(%d)\n", key); - return processKey(key, true); - } - - bool releaseKey(ui::KeyScancode key) override { - TRACE("releaseKey(%d)\n", key); - return processKey(key, false); - } - protected: - bool isMovingOrigin(Stroke& stroke, const Point& point) { + bool isMovingOrigin(ToolLoop* loop, Stroke& stroke, const Point& point) { bool used = false; - if (m_movingOrigin) { + if (int(loop->getModifiers()) & int(ToolLoopModifiers::kMoveOrigin)) { Point delta = (point - m_last); stroke.offset(delta); @@ -57,18 +43,6 @@ protected: } private: - bool processKey(ui::KeyScancode key, bool state) { - if (key == ui::kKeySpace) { - m_movingOrigin = state; - return true; - } - return false; - } - - // Flag used to know if the space bar is pressed, i.e., we have - // displace all points. - bool m_movingOrigin; - // Last known mouse position used to calculate delta values (dx, dy) // with the new mouse position to displace all points. Point m_last; @@ -120,13 +94,6 @@ public: // Controls clicks for tools like line class TwoPointsController : public MoveOriginCapability { public: - void prepareController(ui::KeyModifiers modifiers) override { - MoveOriginCapability::prepareController(modifiers); - - m_squareAspect = (modifiers & ui::kKeyShiftModifier) ? true: false; - m_fromCenter = (modifiers & ui::kKeyCtrlModifier) ? true: false; - } - void pressButton(Stroke& stroke, const Point& point) override { MoveOriginCapability::pressButton(stroke, point); @@ -140,31 +107,17 @@ public: return false; } - bool pressKey(ui::KeyScancode key) override { - if (MoveOriginCapability::pressKey(key)) - return true; - - return processKey(key, true); - } - - bool releaseKey(ui::KeyScancode key) override { - if (MoveOriginCapability::releaseKey(key)) - return true; - - return processKey(key, false); - } - void movement(ToolLoop* loop, Stroke& stroke, const Point& point) override { ASSERT(stroke.size() >= 2); if (stroke.size() < 2) return; - if (MoveOriginCapability::isMovingOrigin(stroke, point)) + if (MoveOriginCapability::isMovingOrigin(loop, stroke, point)) return; stroke[1] = point; - if (m_squareAspect) { + if (int(loop->getModifiers()) & int(ToolLoopModifiers::kSquareAspect)) { int dx = stroke[1].x - m_first.x; int dy = stroke[1].y - m_first.y; int minsize = MIN(ABS(dx), ABS(dy)); @@ -209,7 +162,7 @@ public: stroke[0] = m_first; - if (m_fromCenter) { + if (int(loop->getModifiers()) & int(ToolLoopModifiers::kFromCenter)) { int rx = stroke[1].x - m_first.x; int ry = stroke[1].y - m_first.y; stroke[0].x = m_first.x - rx; @@ -264,23 +217,7 @@ private: m_first += delta; } - bool processKey(ui::KeyScancode key, bool state) { - switch (key) { - case ui::kKeyLShift: - case ui::kKeyRShift: - m_squareAspect = state; - return true; - case ui::kKeyLControl: - case ui::kKeyRControl: - m_fromCenter = state; - return true; - } - return false; - } - Point m_first; - bool m_squareAspect; - bool m_fromCenter; }; // Controls clicks for tools like polygon @@ -311,7 +248,7 @@ public: if (stroke.empty()) return; - if (MoveOriginCapability::isMovingOrigin(stroke, point)) + if (MoveOriginCapability::isMovingOrigin(loop, stroke, point)) return; stroke[stroke.size()-1] = point; @@ -392,7 +329,7 @@ public: } void movement(ToolLoop* loop, Stroke& stroke, const Point& point) override { - if (MoveOriginCapability::isMovingOrigin(stroke, point)) + if (MoveOriginCapability::isMovingOrigin(loop, stroke, point)) return; switch (m_clickCounter) { diff --git a/src/app/tools/inks.h b/src/app/tools/inks.h index 21e0922..4d1d61d 100644 --- a/src/app/tools/inks.h +++ b/src/app/tools/inks.h @@ -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 @@ -322,16 +322,15 @@ public: void inkHline(int x1, int y, int x2, ToolLoop* loop) override { if (m_modify_selection) { + int modifiers = int(loop->getModifiers()); Point origin = loop->getCelOrigin(); - switch (loop->getSelectionMode()) { - case SelectionMode::DEFAULT: - case SelectionMode::ADD: - m_mask.add(gfx::Rect(x1+origin.x, y+origin.y, x2-x1+1, 1)); - break; - case SelectionMode::SUBTRACT: - m_mask.subtract(gfx::Rect(x1+origin.x, y+origin.y, x2-x1+1, 1)); - break; + if ((modifiers & (int(ToolLoopModifiers::kReplaceSelection) | + int(ToolLoopModifiers::kAddSelection))) != 0) { + m_mask.add(gfx::Rect(x1+origin.x, y+origin.y, x2-x1+1, 1)); + } + else if ((modifiers & int(ToolLoopModifiers::kSubtractSelection)) != 0) { + m_mask.subtract(gfx::Rect(x1+origin.x, y+origin.y, x2-x1+1, 1)); } m_maxBounds |= gfx::Rect(x1+origin.x, y+origin.y, x2-x1+1, 1); diff --git a/src/app/tools/selection_mode.h b/src/app/tools/selection_mode.h deleted file mode 100644 index 09e829d..0000000 --- a/src/app/tools/selection_mode.h +++ /dev/null @@ -1,24 +0,0 @@ -// Aseprite -// Copyright (C) 2001-2015 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 -// published by the Free Software Foundation. - -#ifndef APP_TOOLS_SELECTION_MODE_H_INCLUDED -#define APP_TOOLS_SELECTION_MODE_H_INCLUDED -#pragma once - -namespace app { -namespace tools { - - enum class SelectionMode { - DEFAULT = 0, - ADD = 1, - SUBTRACT = 2, - }; - -} // namespace tools -} // namespace app - -#endif diff --git a/src/app/tools/tool_loop.h b/src/app/tools/tool_loop.h index 1a5d8f8..ae7ab88 100644 --- a/src/app/tools/tool_loop.h +++ b/src/app/tools/tool_loop.h @@ -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 @@ -9,7 +9,7 @@ #define APP_TOOLS_TOOL_LOOP_H_INCLUDED #pragma once -#include "app/tools/selection_mode.h" +#include "app/tools/tool_loop_modifiers.h" #include "app/tools/trace_policy.h" #include "doc/color.h" #include "doc/frame.h" @@ -159,8 +159,9 @@ namespace app { // contiguous pixels or not. virtual bool getContiguous() = 0; - // Returns the selection mode (if the ink is of selection type). - virtual tools::SelectionMode getSelectionMode() = 0; + // Returns flags/modifiers that change the way each part of the + // tool (ink/controllers/etc.) work. + virtual tools::ToolLoopModifiers getModifiers() = 0; // Returns the preferred "tiled" mode of the document. // See the method PointShape::doInkHline to check how this member is diff --git a/src/app/tools/tool_loop_manager.cpp b/src/app/tools/tool_loop_manager.cpp index eda557d..387f34d 100644 --- a/src/app/tools/tool_loop_manager.cpp +++ b/src/app/tools/tool_loop_manager.cpp @@ -48,8 +48,7 @@ bool ToolLoopManager::isCanceled() const return m_toolLoop->isCanceled(); } -void ToolLoopManager::prepareLoop(const Pointer& pointer, - ui::KeyModifiers modifiers) +void ToolLoopManager::prepareLoop(const Pointer& pointer) { // Start with no points at all m_stroke.reset(); @@ -57,35 +56,16 @@ void ToolLoopManager::prepareLoop(const Pointer& pointer, // Prepare the ink m_toolLoop->getInk()->prepareInk(m_toolLoop); m_toolLoop->getIntertwine()->prepareIntertwine(); - m_toolLoop->getController()->prepareController(modifiers); m_toolLoop->getPointShape()->preparePointShape(m_toolLoop); } -void ToolLoopManager::pressKey(ui::KeyScancode key) +void ToolLoopManager::notifyToolLoopModifiersChange() { if (isCanceled()) return; - if (m_toolLoop->getController()->pressKey(key)) { - if (m_lastPointer.getButton() != Pointer::None) - movement(m_lastPointer); - } -} - -void ToolLoopManager::releaseKey(ui::KeyScancode key) -{ - if (isCanceled()) - return; - - if (key == ui::kKeyEsc) { - m_toolLoop->cancel(); - return; - } - - if (m_toolLoop->getController()->releaseKey(key)) { - if (m_lastPointer.getButton() != Pointer::None) - movement(m_lastPointer); - } + if (m_lastPointer.getButton() != Pointer::None) + movement(m_lastPointer); } void ToolLoopManager::pressButton(const Pointer& pointer) diff --git a/src/app/tools/tool_loop_manager.h b/src/app/tools/tool_loop_manager.h index 063d191..8de1823 100644 --- a/src/app/tools/tool_loop_manager.h +++ b/src/app/tools/tool_loop_manager.h @@ -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 @@ -12,7 +12,6 @@ #include "app/tools/stroke.h" #include "gfx/point.h" #include "gfx/region.h" -#include "ui/keys.h" #include <vector> @@ -69,11 +68,11 @@ namespace app { // Should be called when the user start a tool-trace (pressing the // left or right button for first time in the editor). - void prepareLoop(const Pointer& pointer, - ui::KeyModifiers modifiers); + void prepareLoop(const Pointer& pointer); - void pressKey(ui::KeyScancode key); - void releaseKey(ui::KeyScancode key); + // Should be called when the ToolLoop::getModifiers() + // value was modified (e.g. when the user press/release a key). + void notifyToolLoopModifiersChange(); // Should be called each time the user presses a mouse button. void pressButton(const Pointer& pointer); diff --git a/src/app/tools/tool_loop_modifiers.h b/src/app/tools/tool_loop_modifiers.h new file mode 100644 index 0000000..88bdffa --- /dev/null +++ b/src/app/tools/tool_loop_modifiers.h @@ -0,0 +1,28 @@ +// Aseprite +// Copyright (C) 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 +// published by the Free Software Foundation. + +#ifndef APP_TOOLS_TOOL_LOOP_MODIFIERS_H_INCLUDED +#define APP_TOOLS_TOOL_LOOP_MODIFIERS_H_INCLUDED +#pragma once + +namespace app { +namespace tools { + + enum class ToolLoopModifiers { + kNone = 0x00000000, + kReplaceSelection = 0x00000001, + kAddSelection = 0x00000002, + kSubtractSelection = 0x00000004, + kMoveOrigin = 0x00000008, + kSquareAspect = 0x00000010, + kFromCenter = 0x00000020, + }; + +} // namespace tools +} // namespace app + +#endif diff --git a/src/app/ui/context_bar.cpp b/src/app/ui/context_bar.cpp index 751a680..4b0672b 100644 --- a/src/app/ui/context_bar.cpp +++ b/src/app/ui/context_bar.cpp @@ -27,9 +27,9 @@ #include "app/tools/ink.h" #include "app/tools/ink_type.h" #include "app/tools/point_shape.h" -#include "app/tools/selection_mode.h" #include "app/tools/tool.h" #include "app/tools/tool_box.h" +#include "app/tools/tool_loop_modifiers.h" #include "app/ui/brush_popup.h" #include "app/ui/button_set.h" #include "app/ui/color_button.h" @@ -1110,7 +1110,7 @@ public: tooltipManager->addTooltipFor(at(2), "Subtract from selection\n(Shift+Alt)", BOTTOM); } - void setSelectionMode(SelectionMode mode) { + void setSelectionMode(gen::SelectionMode mode) { setSelectedItem((int)mode); invalidate(); } @@ -1120,7 +1120,7 @@ protected: ButtonSet::onItemChange(item); Preferences::instance().selection.mode( - (tools::SelectionMode)selectedItem()); + (gen::SelectionMode)selectedItem()); } }; @@ -1624,11 +1624,17 @@ void ContextBar::updateForSelectingBox(const std::string& text) layout(); } -void ContextBar::updateSelectionMode(SelectionMode mode) +void ContextBar::updateToolLoopModifiersIndicators(tools::ToolLoopModifiers modifiers) { if (!m_selectionMode->isVisible()) return; + gen::SelectionMode mode = gen::SelectionMode::DEFAULT; + if (int(modifiers) & int(tools::ToolLoopModifiers::kAddSelection)) + mode = gen::SelectionMode::ADD; + else if (int(modifiers) & int(tools::ToolLoopModifiers::kSubtractSelection)) + mode = gen::SelectionMode::SUBTRACT; + m_selectionMode->setSelectionMode(mode); } diff --git a/src/app/ui/context_bar.h b/src/app/ui/context_bar.h index 6424a2c..add5091 100644 --- a/src/app/ui/context_bar.h +++ b/src/app/ui/context_bar.h @@ -12,7 +12,7 @@ #include "app/pref/preferences.h" #include "app/shade.h" #include "app/tools/ink_type.h" -#include "app/tools/selection_mode.h" +#include "app/tools/tool_loop_modifiers.h" #include "app/ui/context_bar_observer.h" #include "base/connection.h" #include "base/observable.h" @@ -48,7 +48,7 @@ namespace app { void updateForTool(tools::Tool* tool); void updateForMovingPixels(); void updateForSelectingBox(const std::string& text); - void updateSelectionMode(app::tools::SelectionMode mode); + void updateToolLoopModifiersIndicators(app::tools::ToolLoopModifiers modifiers); void updateAutoSelectLayer(bool state); void setActiveBrush(const doc::BrushRef& brush); diff --git a/src/app/ui/editor/brush_preview.cpp b/src/app/ui/editor/brush_preview.cpp index fe0c35b..10d6eb3 100644 --- a/src/app/ui/editor/brush_preview.cpp +++ b/src/app/ui/editor/brush_preview.cpp @@ -207,7 +207,6 @@ void BrushPreview::show(const gfx::Point& screenPos) if (loop) { loop->getInk()->prepareInk(loop); loop->getIntertwine()->prepareIntertwine(); - loop->getController()->prepareController(ui::kKeyNoneModifier); loop->getPointShape()->preparePointShape(loop); loop->getPointShape()->transformPoint( loop, -origBrushBounds.x, -origBrushBounds.y); diff --git a/src/app/ui/editor/drawing_state.cpp b/src/app/ui/editor/drawing_state.cpp index b342d59..a6703be 100644 --- a/src/app/ui/editor/drawing_state.cpp +++ b/src/app/ui/editor/drawing_state.cpp @@ -94,7 +94,7 @@ void DrawingState::initToolLoop(Editor* editor, MouseMessage* msg) pointer = pointer_from_msg(editor, msg); } - m_toolLoopManager->prepareLoop(pointer, msg->modifiers()); + m_toolLoopManager->prepareLoop(pointer); m_toolLoopManager->pressButton(pointer); // This first movement is done when the user pressed Shift+click in @@ -108,6 +108,12 @@ void DrawingState::initToolLoop(Editor* editor, MouseMessage* msg) editor->captureMouse(); } +void DrawingState::notifyToolLoopModifiersChange(Editor* editor) +{ + if (!m_toolLoopManager->isCanceled()) + m_toolLoopManager->notifyToolLoopModifiersChange(); +} + bool DrawingState::onMouseDown(Editor* editor, MouseMessage* msg) { // Drawing loop @@ -190,9 +196,6 @@ bool DrawingState::onSetCursor(Editor* editor, const gfx::Point& mouseScreenPos) bool DrawingState::onKeyDown(Editor* editor, KeyMessage* msg) { - if (msg->repeat() == 0) - m_toolLoopManager->pressKey(msg->scancode()); - Command* command = NULL; Params params; if (KeyboardShortcuts::instance() @@ -208,7 +211,8 @@ bool DrawingState::onKeyDown(Editor* editor, KeyMessage* msg) bool DrawingState::onKeyUp(Editor* editor, KeyMessage* msg) { - m_toolLoopManager->releaseKey(msg->scancode()); + if (msg->scancode() == ui::kKeyEsc) + m_toolLoop->cancel(); // The user might have canceled the tool loop pressing the 'Esc' key. destroyLoopIfCanceled(editor); diff --git a/src/app/ui/editor/drawing_state.h b/src/app/ui/editor/drawing_state.h index 7339057..1ff9c5e 100644 --- a/src/app/ui/editor/drawing_state.h +++ b/src/app/ui/editor/drawing_state.h @@ -35,6 +35,7 @@ namespace app { virtual bool requireBrushPreview() override { return false; } void initToolLoop(Editor* editor, ui::MouseMessage* msg); + void notifyToolLoopModifiersChange(Editor* editor); private: void destroyLoopIfCanceled(Editor* editor); diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index 6310924..13030bf 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -30,6 +30,7 @@ #include "app/tools/tool_box.h" #include "app/ui/color_bar.h" #include "app/ui/context_bar.h" +#include "app/ui/editor/drawing_state.h" #include "app/ui/editor/editor_customization_delegate.h" #include "app/ui/editor/editor_decorator.h" #include "app/ui/editor/moving_pixels_state.h" @@ -157,7 +158,7 @@ Editor::Editor(Document* document, EditorFlags flags) , m_brushPreview(this) , m_lastDrawingPosition(-1, -1) , m_quicktool(NULL) - , m_selectionMode(tools::SelectionMode::DEFAULT) + , m_toolLoopModifiers(tools::ToolLoopModifiers::kNone) , m_padding(0, 0) , m_antsTimer(100, this) , m_antsOffset(0) @@ -1110,7 +1111,7 @@ void Editor::updateStatusBar() void Editor::updateQuicktool() { - if (m_customizationDelegate) { + if (m_customizationDelegate && !hasCapture()) { tools::Tool* current_tool = App::instance()->activeTool(); // Don't change quicktools if we are in a selection tool and using @@ -1156,41 +1157,66 @@ void Editor::updateQuicktool() } } -void Editor::updateContextBarFromModifiers() +void Editor::updateToolLoopModifiersIndicators() { - // We update the selection mode only if we're not selecting. - if (hasCapture()) - return; - - ContextBar* ctxBar = App::instance()->getMainWindow()->getContextBar(); - - // Selection mode + int modifiers = int(tools::ToolLoopModifiers::kNone); + bool autoSelectLayer = Preferences::instance().editor.autoSelectLayer(); + KeyAction action; - tools::SelectionMode mode = Preferences::instance().selection.mode(); + if (m_customizationDelegate) { + // When the mouse is captured, is when we are scrolling, or + // drawing, or moving, or selecting, etc. So several + // parameters/tool-loop-modifiers are static. + if (hasCapture()) { + modifiers |= (int(m_toolLoopModifiers) & + (int(tools::ToolLoopModifiers::kReplaceSelection) | + int(tools::ToolLoopModifiers::kAddSelection) | + int(tools::ToolLoopModifiers::kSubtractSelection))); + autoSelectLayer = m_autoSelectLayer; + + // Shape tools (line, curves, rectangles, etc.) + action = m_customizationDelegate->getPressedKeyAction(KeyContext::ShapeTool); + if (int(action & KeyAction::MoveOrigin)) + modifiers |= int(tools::ToolLoopModifiers::kMoveOrigin); + if (int(action & KeyAction::SquareAspect)) + modifiers |= int(tools::ToolLoopModifiers::kSquareAspect); + if (int(action & KeyAction::DrawFromCenter)) + modifiers |= int(tools::ToolLoopModifiers::kFromCenter); + } + else { + // We update the selection mode only if we're not selecting. + action = m_customizationDelegate->getPressedKeyAction(KeyContext::SelectionTool); + + gen::SelectionMode mode = Preferences::instance().selection.mode(); + if (int(action & KeyAction::AddSelection)) + mode = gen::SelectionMode::ADD; + if (int(action & KeyAction::SubtractSelection) || m_secondaryButton) + mode = gen::SelectionMode::SUBTRACT; + switch (mode) { + case gen::SelectionMode::DEFAULT: modifiers |= int(tools::ToolLoopModifiers::kReplaceSelection); break; + case gen::SelectionMode::ADD: modifiers |= int(tools::ToolLoopModifiers::kAddSelection); break; + case gen::SelectionMode::SUBTRACT: modifiers |= int(tools::ToolLoopModifiers::kSubtractSelection); break; + } - KeyAction action = KeyAction::None; - if (m_customizationDelegate) - action = m_customizationDelegate->getPressedKeyAction(KeyContext::SelectionTool); - - if (int(action & KeyAction::AddSelection)) - mode = tools::SelectionMode::ADD; - if (int(action & KeyAction::SubtractSelection)) - mode = tools::SelectionMode::SUBTRACT; - else if (m_secondaryButton) - mode = tools::SelectionMode::SUBTRACT; - - if (mode != m_selectionMode) { - m_selectionMode = mode; - ctxBar->updateSelectionMode(mode); + // For move tool + action = m_customizationDelegate->getPressedKeyAction(KeyContext::MoveTool); + if (int(action & KeyAction::AutoSelectLayer)) + autoSelectLayer = true; + } } - // Move tool options + ContextBar* ctxBar = App::instance()->getMainWindow()->getContextBar(); + + if (int(m_toolLoopModifiers) != modifiers) { + m_toolLoopModifiers = tools::ToolLoopModifiers(modifiers); - bool autoSelectLayer = Preferences::instance().editor.autoSelectLayer(); + // TODO the contextbar should be a observer of the current editor + ctxBar->updateToolLoopModifiersIndicators(m_toolLoopModifiers); - if ((m_customizationDelegate) && - int(m_customizationDelegate->getPressedKeyAction(KeyContext::MoveTool) & KeyAction::AutoSelectLayer)) - autoSelectLayer = true; + if (auto drawingState = dynamic_cast<DrawingState*>(m_state.get())) { + drawingState->notifyToolLoopModifiersChange(this); + } + } if (m_autoSelectLayer != autoSelectLayer) { m_autoSelectLayer = autoSelectLayer; @@ -1238,7 +1264,7 @@ bool Editor::onProcessMessage(Message* msg) case kMouseEnterMessage: updateQuicktool(); - updateContextBarFromModifiers(); + updateToolLoopModifiersIndicators(); break; case kMouseLeaveMessage: @@ -1255,7 +1281,7 @@ bool Editor::onProcessMessage(Message* msg) m_secondaryButton = mouseMsg->right(); updateQuicktool(); - updateContextBarFromModifiers(); + updateToolLoopModifiersIndicators(); setCursor(mouseMsg->position()); } @@ -1281,7 +1307,7 @@ bool Editor::onProcessMessage(Message* msg) m_secondaryButton = false; updateQuicktool(); - updateContextBarFromModifiers(); + updateToolLoopModifiersIndicators(); setCursor(mouseMsg->position()); } @@ -1314,9 +1340,9 @@ bool Editor::onProcessMessage(Message* msg) if (hasMouse()) { updateQuicktool(); - updateContextBarFromModifiers(); setCursor(ui::get_mouse_position()); } + updateToolLoopModifiersIndicators(); if (used) return true; @@ -1330,9 +1356,9 @@ bool Editor::onProcessMessage(Message* msg) if (hasMouse()) { updateQuicktool(); - updateContextBarFromModifiers(); setCursor(ui::get_mouse_position()); } + updateToolLoopModifiersIndicators(); if (used) return true; @@ -1481,7 +1507,7 @@ bool Editor::isInsideSelection() { gfx::Point spritePos = screenToEditor(ui::get_mouse_position()); return - (m_selectionMode != tools::SelectionMode::SUBTRACT) && + ((int(m_toolLoopModifiers) & int(tools::ToolLoopModifiers::kSubtractSelection)) == 0) && m_document != NULL && m_document->isMaskVisible() && m_document->mask()->containsPoint(spritePos.x, spritePos.y); diff --git a/src/app/ui/editor/editor.h b/src/app/ui/editor/editor.h index 7a2e0af..ba04e35 100644 --- a/src/app/ui/editor/editor.h +++ b/src/app/ui/editor/editor.h @@ -13,7 +13,7 @@ #include "app/color.h" #include "app/document.h" #include "app/pref/preferences.h" -#include "app/tools/selection_mode.h" +#include "app/tools/tool_loop_modifiers.h" #include "app/ui/color_source.h" #include "app/ui/editor/brush_preview.h" #include "app/ui/editor/editor_observers.h" @@ -173,9 +173,8 @@ namespace app { tools::Tool* getCurrentEditorTool(); tools::Ink* getCurrentEditorInk(); - tools::SelectionMode getSelectionMode() const { return m_selectionMode; } + tools::ToolLoopModifiers getToolLoopModifiers() const { return m_toolLoopModifiers; } bool isAutoSelectLayer() const { return m_autoSelectLayer; } - bool isSecondaryButton() const { return m_secondaryButton; } gfx::Point lastDrawingPosition() const { return m_lastDrawingPosition; } @@ -241,7 +240,7 @@ namespace app { private: void setStateInternal(const EditorStatePtr& newState); void updateQuicktool(); - void updateContextBarFromModifiers(); + void updateToolLoopModifiersIndicators(); bool isCurrentToolAffectedByRightClickMode(); void drawMaskSafe(); @@ -288,7 +287,7 @@ namespace app { // the user is not pressing any keyboard key). tools::Tool* m_quicktool; - tools::SelectionMode m_selectionMode; + tools::ToolLoopModifiers m_toolLoopModifiers; bool m_autoSelectLayer; // Extra space around the sprite. diff --git a/src/app/ui/editor/standby_state.cpp b/src/app/ui/editor/standby_state.cpp index 7aebb97..1244198 100644 --- a/src/app/ui/editor/standby_state.cpp +++ b/src/app/ui/editor/standby_state.cpp @@ -350,14 +350,10 @@ bool StandbyState::onDoubleClick(Editor* editor, MouseMessage* msg) CommandsModule::instance()->getCommandByName(CommandId::SelectTile); Params params; - switch (editor->getSelectionMode()) { - case tools::SelectionMode::ADD: - params.set("mode", "add"); - break; - case tools::SelectionMode::SUBTRACT: - params.set("mode", "subtract"); - break; - } + if (int(editor->getToolLoopModifiers()) & int(tools::ToolLoopModifiers::kAddSelection)) + params.set("mode", "add"); + else if (int(editor->getToolLoopModifiers()) & int(tools::ToolLoopModifiers::kSubtractSelection)) + params.set("mode", "subtract"); UIContext::instance()->executeCommand(selectTileCmd, params); return true; diff --git a/src/app/ui/editor/tool_loop_impl.cpp b/src/app/ui/editor/tool_loop_impl.cpp index 70a0bee..59be097 100644 --- a/src/app/ui/editor/tool_loop_impl.cpp +++ b/src/app/ui/editor/tool_loop_impl.cpp @@ -203,7 +203,7 @@ public: int getOpacity() override { return m_opacity; } int getTolerance() override { return m_tolerance; } bool getContiguous() override { return m_contiguous; } - tools::SelectionMode getSelectionMode() override { return m_editor->getSelectionMode(); } + tools::ToolLoopModifiers getModifiers() override { return m_editor->getToolLoopModifiers(); } filters::TiledMode getTiledMode() override { return m_docPref.tiled.mode(); } bool getGridVisible() override { return m_docPref.show.grid(); } bool getSnapToGrid() override { return m_docPref.grid.snap(); } @@ -324,7 +324,7 @@ public: // Start with an empty mask if the user is selecting with "default selection mode" if (getInk()->isSelection() && (!m_document->isMaskVisible() || - getSelectionMode() == tools::SelectionMode::DEFAULT)) { + (int(getModifiers()) & int(tools::ToolLoopModifiers::kReplaceSelection)))) { Mask emptyMask; m_transaction.execute(new cmd::SetMask(m_document, &emptyMask)); } diff --git a/src/app/ui/keyboard_shortcuts.cpp b/src/app/ui/keyboard_shortcuts.cpp index 7089f9f..d9f895c 100644 --- a/src/app/ui/keyboard_shortcuts.cpp +++ b/src/app/ui/keyboard_shortcuts.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 @@ -42,8 +42,11 @@ namespace { { "LockAxis" , "Lock Axis" , app::KeyAction::LockAxis }, { "AddSelection" , "Add Selection" , app::KeyAction::AddSelection }, { "SubtractSelection" , "Subtract Selection" , app::KeyAction::SubtractSelection }, - { "AutoSelectLayer" , "Auto Select Layer" , app::KeyAction::AutoSelectLayer }, + { "AutoSelectLayer" , "Auto Select Layer" , app::KeyAction::AutoSelectLayer }, { "StraightLineFromLastPoint", "Straight Line from Last Point", app::KeyAction::StraightLineFromLastPoint }, + { "MoveOrigin" , "Move Origin" , app::KeyAction::MoveOrigin }, + { "SquareAspect" , "Square Aspect" , app::KeyAction::SquareAspect }, + { "DrawFromCenter" , "Draw From Center" , app::KeyAction::DrawFromCenter }, { "LeftMouseButton" , "Trigger Left Mouse Button" , app::KeyAction::LeftMouseButton }, { "RightMouseButton" , "Trigger Right Mouse Button" , app::KeyAction::RightMouseButton }, { NULL , NULL , app::KeyAction::None } @@ -136,9 +139,8 @@ Key::Key(KeyAction action) m_keycontext = KeyContext::Any; break; case KeyAction::CopySelection: - m_keycontext = KeyContext::TranslatingSelection; - break; case KeyAction::SnapToGrid: + case KeyAction::LockAxis: m_keycontext = KeyContext::TranslatingSelection; break; case KeyAction::AngleSnap: @@ -147,12 +149,7 @@ Key::Key(KeyAction action) case KeyAction::MaintainAspectRatio: m_keycontext = KeyContext::ScalingSelection; break; - case KeyAction::LockAxis: - m_keycontext = KeyContext::TranslatingSelection; - break; case KeyAction::AddSelection: - m_keycontext = KeyContext::SelectionTool; - break; case KeyAction::SubtractSelection: m_keycontext = KeyContext::SelectionTool; break; @@ -162,6 +159,11 @@ Key::Key(KeyAction action) case KeyAction::StraightLineFromLastPoint: m_keycontext = KeyContext::FreehandTool; break; + case KeyAction::MoveOrigin: + case KeyAction::SquareAspect: + case KeyAction::DrawFromCenter: + m_keycontext = KeyContext::ShapeTool; + break; case KeyAction::LeftMouseButton: m_keycontext = KeyContext::Any; break; @@ -538,6 +540,9 @@ void KeyboardShortcuts::exportAccel(TiXmlElement& parent, Key* key, const ui::Ac case KeyContext::FreehandTool: keycontextStr = "FreehandTool"; break; + case KeyContext::ShapeTool: + keycontextStr = "ShapeTool"; + break; } if (keycontextStr) diff --git a/src/app/ui/keyboard_shortcuts.h b/src/app/ui/keyboard_shortcuts.h index b82f2dc..bd53a4c 100644 --- a/src/app/ui/keyboard_shortcuts.h +++ b/src/app/ui/keyboard_shortcuts.h @@ -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 @@ -39,6 +39,7 @@ namespace app { RotatingSelection, MoveTool, FreehandTool, + ShapeTool, }; enum class KeySource { @@ -66,7 +67,10 @@ namespace app { AutoSelectLayer = 0x00000080, LeftMouseButton = 0x00000100, RightMouseButton = 0x00000200, - StraightLineFromLastPoint = 0x00000400 + StraightLineFromLastPoint = 0x00000400, + MoveOrigin = 0x00000800, + SquareAspect = 0x00001000, + DrawFromCenter = 0x00002000, }; inline KeyAction operator&(KeyAction a, KeyAction b) { -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

