[aseprite] 37/308: Show preview correctly when moving multiple cels

Tobias Hansen thansen at moszumanska.debian.org
Tue Mar 8 02:44:49 UTC 2016


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit 7e09f792852c57ee7b4acf78df2149497a501c75
Author: Ying Ruei Liang (KK) <thumbd03803 at gmail.com>
Date:   Fri Dec 4 01:05:28 2015 +0800

    Show preview correctly when moving multiple cels
    
    Now you can see all the selected cels move synchronously while you drag
    them with moving tool.
---
 src/app/ui/editor/moving_cel_state.cpp | 91 +++++++++++++++++++---------------
 src/app/ui/editor/moving_cel_state.h   | 12 +++--
 src/app/ui/editor/standby_state.cpp    | 16 +++++-
 3 files changed, 72 insertions(+), 47 deletions(-)

diff --git a/src/app/ui/editor/moving_cel_state.cpp b/src/app/ui/editor/moving_cel_state.cpp
index 57145fc..410ddd2 100644
--- a/src/app/ui/editor/moving_cel_state.cpp
+++ b/src/app/ui/editor/moving_cel_state.cpp
@@ -36,21 +36,31 @@ using namespace ui;
 MovingCelState::MovingCelState(Editor* editor, MouseMessage* msg)
   : m_canceled(false)
 {
+  ContextWriter writer(UIContext::instance(), 500);
   Document* document = editor->document();
+  DocumentRange range = App::instance()->getMainWindow()->getTimeline()->range();
   LayerImage* layer = static_cast<LayerImage*>(editor->layer());
   ASSERT(layer->isImage());
 
-  m_cel = layer->cel(editor->frame());
-  ASSERT(m_cel); // The cel cannot be null
-  if (m_cel) {
-    m_celStart = m_cel->position();
-  }
-  else {
-    m_celStart = gfx::Point(0, 0);
+  Cel* currentCel = layer->cel(editor->frame());
+  ASSERT(currentCel); // The cel cannot be null
+
+  if (!range.enabled())
+    range = DocumentRange(currentCel);
+
+  // Record start positions of all cels in selected range
+  for (Cel* cel : get_unique_cels(writer.sprite(), range)) {
+    Layer* layer = cel->layer();
+    ASSERT(layer);
+
+    if (layer && layer->isMovable() && !layer->isBackground()) {
+      m_celList.push_back(cel);
+      m_celStarts.push_back(cel->position());
+    }
   }
-  m_celNew = m_celStart;
 
-  m_mouseStart = editor->screenToEditor(msg->position());
+  m_cursorStart = editor->screenToEditor(msg->position());
+  m_celOffset = gfx::Point(0, 0);
   editor->captureMouse();
 
   // Hide the mask (temporarily, until mouse-up event)
@@ -71,10 +81,14 @@ bool MovingCelState::onMouseUp(Editor* editor, MouseMessage* msg)
 
   // Here we put back the cel into its original coordinate (so we can
   // add an undoer before).
-  if (m_celStart != m_celNew) {
-    // Put the cel in the original position.
-    if (m_cel)
-      m_cel->setPosition(m_celStart);
+  if (m_celOffset != gfx::Point(0, 0)) {
+    // Put the cels in the original position.
+    for (unsigned int i = 0; i < m_celList.size(); i++) {
+      Cel* cel = m_celList[i];
+      gfx::Point* celStart = &m_celStarts[i];
+
+      cel->setPosition(*celStart);
+    }
 
     // If the user didn't cancel the operation...
     if (!m_canceled) {
@@ -83,33 +97,24 @@ bool MovingCelState::onMouseUp(Editor* editor, MouseMessage* msg)
       DocumentApi api = document->getApi(transaction);
 
       // And now we move the cel (or all selected range) to the new position.
-      gfx::Point delta = m_celNew - m_celStart;
-
-      DocumentRange range = App::instance()->getMainWindow()->getTimeline()->range();
-      if (!range.enabled())
-        range = DocumentRange(m_cel);
-
-      for (Cel* cel : get_unique_cels(writer.sprite(), range)) {
-        Layer* layer = cel->layer();
-        ASSERT(layer);
-        if (layer && layer->isMovable() && !layer->isBackground()) {
-          api.setCelPosition(writer.sprite(), cel, cel->x()+delta.x, cel->y()+delta.y);
-        }
+      for (Cel* cel : m_celList) {
+        api.setCelPosition(writer.sprite(), cel,
+                           cel->x() + m_celOffset.x,
+                           cel->y() + m_celOffset.y);
       }
 
       // Move selection if it was visible
       if (m_maskVisible)
-        api.setMaskPosition(document->mask()->bounds().x + delta.x,
-                            document->mask()->bounds().y + delta.y);
+        api.setMaskPosition(document->mask()->bounds().x + m_celOffset.x,
+                            document->mask()->bounds().y + m_celOffset.y);
 
       transaction.commit();
     }
 
     // Redraw all editors. We've to notify all views about this
     // general update because MovingCelState::onMouseMove() redraws
-    // only the current cel in the current editor. And at this point
-    // we might have moved several cels (and we've to update all the
-    // editors).
+    // only the cels in the current editor. And at this point we'd
+    // like to update all the editors.
     document->notifyGeneralUpdate();
   }
 
@@ -127,21 +132,25 @@ bool MovingCelState::onMouseUp(Editor* editor, MouseMessage* msg)
 bool MovingCelState::onMouseMove(Editor* editor, MouseMessage* msg)
 {
   gfx::Point newCursorPos = editor->screenToEditor(msg->position());
-  gfx::Point delta = newCursorPos - m_mouseStart;
+
+  m_celOffset = newCursorPos - m_cursorStart;
 
   if (int(editor->getCustomizationDelegate()
           ->getPressedKeyAction(KeyContext::TranslatingSelection) & KeyAction::LockAxis)) {
-    if (ABS(delta.x) < ABS(delta.y)) {
-      delta.x = 0;
+    if (ABS(m_celOffset.x) < ABS(m_celOffset.y)) {
+      m_celOffset.x = 0;
     }
     else {
-      delta.y = 0;
+      m_celOffset.y = 0;
     }
   }
 
-  m_celNew = m_celStart + delta;
-  if (m_cel)
-    m_cel->setPosition(m_celNew);
+  for (unsigned int i = 0; i < m_celList.size(); i++) {
+    Cel* cel = m_celList[i];
+    gfx::Point* celStart = &m_celStarts[i];
+
+    cel->setPosition(*celStart + m_celOffset);
+  }
 
   // Redraw the new cel position.
   editor->invalidate();
@@ -155,10 +164,10 @@ bool MovingCelState::onUpdateStatusBar(Editor* editor)
   StatusBar::instance()->setStatusText
     (0,
      "Pos %3d %3d Offset %3d %3d",
-     (int)m_celNew.x,
-     (int)m_celNew.y,
-     (int)(m_celNew.x - m_celStart.x),
-     (int)(m_celNew.y - m_celStart.y));
+     (int)m_cursorStart.x,
+     (int)m_cursorStart.y,
+     (int)m_celOffset.x,
+     (int)m_celOffset.y);
 
   return true;
 }
diff --git a/src/app/ui/editor/moving_cel_state.h b/src/app/ui/editor/moving_cel_state.h
index aa38586..b96cda3 100644
--- a/src/app/ui/editor/moving_cel_state.h
+++ b/src/app/ui/editor/moving_cel_state.h
@@ -11,6 +11,10 @@
 
 #include "app/ui/editor/standby_state.h"
 
+#include "doc/cel_list.h"
+
+#include <vector>
+
 namespace doc {
   class Cel;
 }
@@ -30,10 +34,10 @@ namespace app {
     virtual bool requireBrushPreview() override { return false; }
 
   private:
-    Cel* m_cel;
-    gfx::Point m_celStart;
-    gfx::Point m_mouseStart;
-    gfx::Point m_celNew;
+    CelList m_celList;
+    std::vector<gfx::Point> m_celStarts;
+    gfx::Point m_celOffset;
+    gfx::Point m_cursorStart;
     bool m_canceled;
     bool m_maskVisible;
   };
diff --git a/src/app/ui/editor/standby_state.cpp b/src/app/ui/editor/standby_state.cpp
index 545cd51..4368414 100644
--- a/src/app/ui/editor/standby_state.cpp
+++ b/src/app/ui/editor/standby_state.cpp
@@ -16,6 +16,7 @@
 #include "app/commands/cmd_eyedropper.h"
 #include "app/commands/commands.h"
 #include "app/commands/params.h"
+#include "app/document_range.h"
 #include "app/ini_file.h"
 #include "app/pref/preferences.h"
 #include "app/tools/ink.h"
@@ -27,16 +28,18 @@
 #include "app/ui/editor/editor_customization_delegate.h"
 #include "app/ui/editor/handle_type.h"
 #include "app/ui/editor/moving_cel_state.h"
-#include "app/ui/editor/moving_symmetry_state.h"
 #include "app/ui/editor/moving_pixels_state.h"
+#include "app/ui/editor/moving_symmetry_state.h"
 #include "app/ui/editor/pivot_helpers.h"
 #include "app/ui/editor/pixels_movement.h"
 #include "app/ui/editor/scrolling_state.h"
 #include "app/ui/editor/tool_loop_impl.h"
 #include "app/ui/editor/transform_handles.h"
 #include "app/ui/editor/zooming_state.h"
+#include "app/ui/main_window.h"
 #include "app/ui/skin/skin_theme.h"
 #include "app/ui/status_bar.h"
+#include "app/ui/timeline.h"
 #include "app/ui_context.h"
 #include "app/util/new_image_from_mask.h"
 #include "base/bind.h"
@@ -182,7 +185,16 @@ bool StandbyState::onMouseDown(Editor* editor, MouseMessage* msg)
       ColorPicker picker;
       picker.pickColor(site, cursor, ColorPicker::FromComposition);
 
-      if (layer != picker.layer()) {
+      DocumentRange range = App::instance()->getMainWindow()->getTimeline()->range();
+
+      // Change layer only when the layer is diffrent from current one, and
+      // the range we selected is not with multiple cels.
+      bool layerChanged = (layer != picker.layer());
+      bool rangeEnabled = range.enabled();
+      bool rangeSingleCel = ((range.type() == DocumentRange::kCels) &&
+                             (range.layers() == 1) && (range.frames() == 1));
+
+      if (layerChanged && (!rangeEnabled || rangeSingleCel)) {
         layer = picker.layer();
         if (layer) {
           editor->setLayer(layer);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list