From 2fa6f1995e1aead9d9960e43bfe782998bcea766 Mon Sep 17 00:00:00 2001 From: "Ying Ruei Liang (KK)" Date: Sat, 5 Dec 2015 18:10:24 +0800 Subject: [PATCH] Add commands to navigate frames with same tag --- data/gui.xml | 4 +-- src/app/commands/cmd_goto_frame.cpp | 53 +++++++++++++++++++++++++++++ src/app/commands/commands_list.h | 2 ++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/data/gui.xml b/data/gui.xml index db5157ac1..945dc6299 100644 --- a/data/gui.xml +++ b/data/gui.xml @@ -85,8 +85,8 @@ - - + + diff --git a/src/app/commands/cmd_goto_frame.cpp b/src/app/commands/cmd_goto_frame.cpp index 5fc89ccfc..c7a4ca614 100644 --- a/src/app/commands/cmd_goto_frame.cpp +++ b/src/app/commands/cmd_goto_frame.cpp @@ -11,9 +11,11 @@ #include "app/commands/command.h" #include "app/commands/params.h" +#include "app/loop_tag.h" #include "app/modules/editors.h" #include "app/modules/gui.h" #include "app/ui/editor/editor.h" +#include "doc/frame_tag.h" #include "doc/sprite.h" #include "ui/window.h" @@ -22,6 +24,7 @@ namespace app { using namespace ui; +using namespace doc; class GotoCommand : public Command { protected: @@ -88,6 +91,46 @@ protected: } }; +class GotoNextFrameWithSameTagCommand : public GotoCommand { +public: + GotoNextFrameWithSameTagCommand() : GotoCommand("GotoNextFrameWithSameTag", + "Go to Next Frame with same tag") { } + Command* clone() const override { return new GotoNextFrameWithSameTagCommand(*this); } + +protected: + frame_t onGetFrame(Editor* editor) override { + Sprite* sprite = editor->sprite(); + frame_t currentFrame = editor->frame(); + FrameTag* tag = get_animation_tag(sprite, currentFrame); + frame_t frameToGo = currentFrame + frame_t(1); + + if (frameToGo > tag->toFrame()) + frameToGo = tag->fromFrame(); + + return frameToGo; + } +}; + +class GotoPreviousFrameWithSameTagCommand : public GotoCommand { +public: + GotoPreviousFrameWithSameTagCommand() : GotoCommand("GotoPreviousFrameWithSameTag", + "Go to Previous Frame with same tag") { } + Command* clone() const override { return new GotoPreviousFrameWithSameTagCommand(*this); } + +protected: + frame_t onGetFrame(Editor* editor) override { + Sprite* sprite = editor->sprite(); + frame_t currentFrame = editor->frame(); + FrameTag* tag = get_animation_tag(sprite, currentFrame); + frame_t frameToGo = currentFrame - frame_t(1); + + if (frameToGo < tag->fromFrame()) + frameToGo = tag->toFrame(); + + return frameToGo; + } +}; + class GotoLastFrameCommand : public GotoCommand { public: GotoLastFrameCommand() : GotoCommand("GotoLastFrame", @@ -157,6 +200,16 @@ Command* CommandFactory::createGotoLastFrameCommand() return new GotoLastFrameCommand; } +Command* CommandFactory::createGotoNextFrameWithSameTagCommand() +{ + return new GotoNextFrameWithSameTagCommand; +} + +Command* CommandFactory::createGotoPreviousFrameWithSameTagCommand() +{ + return new GotoPreviousFrameWithSameTagCommand; +} + Command* CommandFactory::createGotoFrameCommand() { return new GotoFrameCommand; diff --git a/src/app/commands/commands_list.h b/src/app/commands/commands_list.h index baeddf14c..0cfef5544 100644 --- a/src/app/commands/commands_list.h +++ b/src/app/commands/commands_list.h @@ -45,9 +45,11 @@ FOR_EACH_COMMAND(GotoFirstFrame) FOR_EACH_COMMAND(GotoFrame) FOR_EACH_COMMAND(GotoLastFrame) FOR_EACH_COMMAND(GotoNextFrame) +FOR_EACH_COMMAND(GotoNextFrameWithSameTag) FOR_EACH_COMMAND(GotoNextLayer) FOR_EACH_COMMAND(GotoNextTab) FOR_EACH_COMMAND(GotoPreviousFrame) +FOR_EACH_COMMAND(GotoPreviousFrameWithSameTag) FOR_EACH_COMMAND(GotoPreviousLayer) FOR_EACH_COMMAND(GotoPreviousTab) FOR_EACH_COMMAND(GridSettings)