This is an automated email from the git hooks/post-receive script. thansen pushed a commit to branch master in repository aseprite.
commit 30f4e995a34665141498f7f38b61bc2fe66f3f64 Author: David Capello <[email protected]> Date: Sat Mar 19 11:33:05 2016 -0300 Select a tile by double clicking over it (fix #939) --- data/gui.xml | 1 + src/app/CMakeLists.txt | 1 + src/app/commands/cmd_select_tile.cpp | 87 +++++++++++++++++++++++++++++++++++ src/app/commands/commands_list.h | 1 + src/app/snap_to_grid.cpp | 27 ++++++++--- src/app/snap_to_grid.h | 11 ++++- src/app/tools/tool_loop_manager.cpp | 5 +- src/app/ui/editor/editor.cpp | 10 ++++ src/app/ui/editor/editor_state.h | 3 ++ src/app/ui/editor/pixels_movement.cpp | 5 +- src/app/ui/editor/standby_state.cpp | 18 ++++++++ src/app/ui/editor/standby_state.h | 3 +- 12 files changed, 159 insertions(+), 13 deletions(-) diff --git a/data/gui.xml b/data/gui.xml index 9b71f13..8355df8 100644 --- a/data/gui.xml +++ b/data/gui.xml @@ -398,6 +398,7 @@ <key command="AddColor"> <param name="source" value="bg" /> </key> + <key command="SelectTile" /> </commands> <!-- Keyboard shortcuts to select tools --> diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 694df02..149d59e 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -247,6 +247,7 @@ add_library(app-lib commands/cmd_save_palette.cpp commands/cmd_scroll.cpp commands/cmd_scroll_center.cpp + commands/cmd_select_tile.cpp commands/cmd_set_color_selector.cpp commands/cmd_set_ink_type.cpp commands/cmd_set_loop_section.cpp diff --git a/src/app/commands/cmd_select_tile.cpp b/src/app/commands/cmd_select_tile.cpp new file mode 100644 index 0000000..1c4a419 --- /dev/null +++ b/src/app/commands/cmd_select_tile.cpp @@ -0,0 +1,87 @@ +// Aseprite +// Copyright (C) 2015, 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. + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "app/cmd/set_mask.h" +#include "app/commands/command.h" +#include "app/context_access.h" +#include "app/document.h" +#include "app/modules/editors.h" +#include "app/modules/gui.h" +#include "app/pref/preferences.h" +#include "app/snap_to_grid.h" +#include "app/transaction.h" +#include "app/ui/editor/editor.h" +#include "doc/mask.h" +#include "ui/system.h" + +namespace app { + +using namespace doc; + +class SelectTileCommand : public Command { +public: + SelectTileCommand(); + Command* clone() const override { return new SelectTileCommand(*this); } + +protected: + bool onEnabled(Context* context) override; + void onExecute(Context* context) override; +}; + +SelectTileCommand::SelectTileCommand() + : Command("SelectTile", + "Select Tile", + CmdRecordableFlag) +{ +} + +bool SelectTileCommand::onEnabled(Context* context) +{ + return context->checkFlags(ContextFlags::ActiveDocumentIsWritable); +} + +void SelectTileCommand::onExecute(Context* ctx) +{ + if (!current_editor || + !current_editor->hasMouse()) + return; + + // Lock sprite + ContextWriter writer(ctx); + Document* doc(writer.document()); + auto& docPref = Preferences::instance().document(doc); + + base::UniquePtr<Mask> mask(new Mask()); + { + const gfx::Rect gridBounds = docPref.grid.bounds(); + gfx::Point pos = current_editor->screenToEditor(ui::get_mouse_position()); + pos = snap_to_grid(gridBounds, pos, PreferSnapTo::BoxOrigin); + + mask->add(gfx::Rect(pos, gridBounds.size())); + } + + // Set the new mask + Transaction transaction(writer.context(), + "Select Tile", + DoesntModifyDocument); + transaction.execute(new cmd::SetMask(doc, mask)); + transaction.commit(); + + doc->generateMaskBoundaries(); + update_screen_for_document(doc); +} + +Command* CommandFactory::createSelectTileCommand() +{ + return new SelectTileCommand; +} + +} // namespace app diff --git a/src/app/commands/commands_list.h b/src/app/commands/commands_list.h index 684802e..4fc6516 100644 --- a/src/app/commands/commands_list.h +++ b/src/app/commands/commands_list.h @@ -108,6 +108,7 @@ FOR_EACH_COMMAND(SaveMask) FOR_EACH_COMMAND(SavePalette) FOR_EACH_COMMAND(Scroll) FOR_EACH_COMMAND(ScrollCenter) +FOR_EACH_COMMAND(SelectTile) FOR_EACH_COMMAND(SelectionAsGrid) FOR_EACH_COMMAND(SetColorSelector) FOR_EACH_COMMAND(SetInkType) diff --git a/src/app/snap_to_grid.cpp b/src/app/snap_to_grid.cpp index f9fd31e..9a3989c 100644 --- a/src/app/snap_to_grid.cpp +++ b/src/app/snap_to_grid.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 @@ -18,7 +18,9 @@ namespace app { -gfx::Point snap_to_grid(const gfx::Rect& grid, const gfx::Point& point) +gfx::Point snap_to_grid(const gfx::Rect& grid, + const gfx::Point& point, + const PreferSnapTo prefer) { gfx::Point newPoint; div_t d, dx, dy; @@ -26,11 +28,24 @@ gfx::Point snap_to_grid(const gfx::Rect& grid, const gfx::Point& point) dx = std::div(grid.x, grid.w); dy = std::div(grid.y, grid.h); - d = std::div(point.x-dx.rem, grid.w); - newPoint.x = dx.rem + d.quot*grid.w + ((d.rem > grid.w/2)? grid.w: 0); + switch (prefer) { - d = std::div(point.y-dy.rem, grid.h); - newPoint.y = dy.rem + d.quot*grid.h + ((d.rem > grid.h/2)? grid.h: 0); + case PreferSnapTo::ClosestGridVertex: + d = std::div(point.x-dx.rem, grid.w); + newPoint.x = dx.rem + d.quot*grid.w + ((d.rem > grid.w/2)? grid.w: 0); + + d = std::div(point.y-dy.rem, grid.h); + newPoint.y = dy.rem + d.quot*grid.h + ((d.rem > grid.h/2)? grid.h: 0); + break; + + case PreferSnapTo::BoxOrigin: + d = std::div(point.x-dx.rem, grid.w); + newPoint.x = dx.rem + d.quot*grid.w; + + d = std::div(point.y-dy.rem, grid.h); + newPoint.y = dy.rem + d.quot*grid.h; + break; + } return newPoint; } diff --git a/src/app/snap_to_grid.h b/src/app/snap_to_grid.h index fb05da3..9e9fc0c 100644 --- a/src/app/snap_to_grid.h +++ b/src/app/snap_to_grid.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 @@ -13,7 +13,14 @@ namespace app { - gfx::Point snap_to_grid(const gfx::Rect& grid, const gfx::Point& point); + enum class PreferSnapTo { + ClosestGridVertex, + BoxOrigin + }; + + gfx::Point snap_to_grid(const gfx::Rect& grid, + const gfx::Point& point, + const PreferSnapTo prefer); } // namespace app diff --git a/src/app/tools/tool_loop_manager.cpp b/src/app/tools/tool_loop_manager.cpp index f58b96a..eda557d 100644 --- a/src/app/tools/tool_loop_manager.cpp +++ b/src/app/tools/tool_loop_manager.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 @@ -234,7 +234,8 @@ void ToolLoopManager::snapToGrid(Point& point) !m_toolLoop->getSnapToGrid()) return; - point = snap_to_grid(m_toolLoop->getGridBounds(), point); + point = snap_to_grid(m_toolLoop->getGridBounds(), point, + PreferSnapTo::ClosestGridVertex); } // Strokes are relative to sprite origin. diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index 6bfcaeb..f847633 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -1294,6 +1294,16 @@ bool Editor::onProcessMessage(Message* msg) } break; + case kDoubleClickMessage: + if (m_sprite) { + MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); + EditorStatePtr holdState(m_state); + bool used = m_state->onDoubleClick(this, mouseMsg); + if (used) + return true; + } + break; + case kTouchMagnifyMessage: if (m_sprite) { EditorStatePtr holdState(m_state); diff --git a/src/app/ui/editor/editor_state.h b/src/app/ui/editor/editor_state.h index a3d99ef..a08b3e5 100644 --- a/src/app/ui/editor/editor_state.h +++ b/src/app/ui/editor/editor_state.h @@ -89,6 +89,9 @@ namespace app { // Called when the user wants to zoom in/out using a pinch gesture in the trackpad. virtual bool onTouchMagnify(Editor* editor, ui::TouchMessage* msg) { return false; } + // Called when the user moves the mouse wheel over the editor. + virtual bool onDoubleClick(Editor* editor, ui::MouseMessage* msg) { return false; } + // Called each time the mouse changes its position so we can set an // appropiated cursor depending on the new coordinates of the mouse // pointer. diff --git a/src/app/ui/editor/pixels_movement.cpp b/src/app/ui/editor/pixels_movement.cpp index 711d724..81afc82 100644 --- a/src/app/ui/editor/pixels_movement.cpp +++ b/src/app/ui/editor/pixels_movement.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 @@ -268,7 +268,8 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier) gfx::Rect gridBounds = App::instance() ->preferences().document(m_document).grid.bounds(); gfx::Point gridOffset(x1, y1); - gridOffset = snap_to_grid(gridBounds, gridOffset); + gridOffset = snap_to_grid(gridBounds, gridOffset, + PreferSnapTo::ClosestGridVertex); // Now we calculate the difference from x1,y1 point and we can // use it to adjust all coordinates (x1, y1, x2, y2). diff --git a/src/app/ui/editor/standby_state.cpp b/src/app/ui/editor/standby_state.cpp index 6927290..377a9d1 100644 --- a/src/app/ui/editor/standby_state.cpp +++ b/src/app/ui/editor/standby_state.cpp @@ -337,6 +337,24 @@ bool StandbyState::onMouseMove(Editor* editor, MouseMessage* msg) return true; } +bool StandbyState::onDoubleClick(Editor* editor, MouseMessage* msg) +{ + if (editor->hasCapture()) + return false; + + tools::Ink* ink = editor->getCurrentEditorInk(); + + // Select a tile with double-click + if (ink->isSelection()) { + Command* selectTileCmd = + CommandsModule::instance()->getCommandByName(CommandId::SelectTile); + + UIContext::instance()->executeCommand(selectTileCmd); + } + + return false; +} + bool StandbyState::onSetCursor(Editor* editor, const gfx::Point& mouseScreenPos) { tools::Ink* ink = editor->getCurrentEditorInk(); diff --git a/src/app/ui/editor/standby_state.h b/src/app/ui/editor/standby_state.h index edbfc90..c5954c7 100644 --- a/src/app/ui/editor/standby_state.h +++ b/src/app/ui/editor/standby_state.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 @@ -32,6 +32,7 @@ namespace app { virtual bool onMouseDown(Editor* editor, ui::MouseMessage* msg) override; virtual bool onMouseUp(Editor* editor, ui::MouseMessage* msg) override; virtual bool onMouseMove(Editor* editor, ui::MouseMessage* msg) override; + virtual bool onDoubleClick(Editor* editor, ui::MouseMessage* msg) override; virtual bool onSetCursor(Editor* editor, const gfx::Point& mouseScreenPos) override; virtual bool onKeyDown(Editor* editor, ui::KeyMessage* msg) override; virtual bool onKeyUp(Editor* editor, ui::KeyMessage* msg) override; -- 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

