MoveTool.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "MoveTool.h"
  7. #include "Image.h"
  8. #include "ImageEditor.h"
  9. #include "Layer.h"
  10. #include <LibGUI/Action.h>
  11. #include <LibGUI/Menu.h>
  12. #include <LibGUI/Window.h>
  13. #include <LibGfx/Bitmap.h>
  14. namespace PixelPaint {
  15. MoveTool::MoveTool()
  16. {
  17. }
  18. MoveTool::~MoveTool()
  19. {
  20. }
  21. void MoveTool::on_mousedown(Layer& layer, GUI::MouseEvent& event, GUI::MouseEvent& image_event)
  22. {
  23. if (event.button() != GUI::MouseButton::Left)
  24. return;
  25. if (!layer.rect().contains(event.position()))
  26. return;
  27. m_layer_being_moved = layer;
  28. m_event_origin = image_event.position();
  29. m_layer_origin = layer.location();
  30. }
  31. void MoveTool::on_mousemove(Layer&, GUI::MouseEvent&, GUI::MouseEvent& image_event)
  32. {
  33. if (!m_layer_being_moved)
  34. return;
  35. auto delta = image_event.position() - m_event_origin;
  36. m_layer_being_moved->set_location(m_layer_origin.translated(delta));
  37. m_editor->layers_did_change();
  38. }
  39. void MoveTool::on_mouseup(Layer&, GUI::MouseEvent& event, GUI::MouseEvent&)
  40. {
  41. if (event.button() != GUI::MouseButton::Left)
  42. return;
  43. m_layer_being_moved = nullptr;
  44. m_editor->did_complete_action();
  45. }
  46. void MoveTool::on_keydown(GUI::KeyEvent& event)
  47. {
  48. if (event.modifiers() != 0)
  49. return;
  50. auto* layer = m_editor->active_layer();
  51. if (!layer)
  52. return;
  53. auto new_location = layer->location();
  54. switch (event.key()) {
  55. case Key_Up:
  56. new_location.translate_by(0, -1);
  57. break;
  58. case Key_Down:
  59. new_location.translate_by(0, 1);
  60. break;
  61. case Key_Left:
  62. new_location.translate_by(-1, 0);
  63. break;
  64. case Key_Right:
  65. new_location.translate_by(1, 0);
  66. break;
  67. default:
  68. return;
  69. }
  70. layer->set_location(new_location);
  71. m_editor->layers_did_change();
  72. }
  73. }