LineTool.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "LineTool.h"
  2. #include "PaintableWidget.h"
  3. #include <LibGUI/GAction.h>
  4. #include <LibGUI/GMenu.h>
  5. #include <LibGUI/GPainter.h>
  6. LineTool::LineTool()
  7. {
  8. }
  9. LineTool::~LineTool()
  10. {
  11. }
  12. void LineTool::on_mousedown(GMouseEvent& event)
  13. {
  14. if (event.button() != GMouseButton::Left && event.button() != GMouseButton::Right)
  15. return;
  16. if (m_drawing_button != GMouseButton::None)
  17. return;
  18. m_drawing_button = event.button();
  19. m_line_start_position = event.position();
  20. m_line_end_position = event.position();
  21. m_widget->update();
  22. }
  23. void LineTool::on_mouseup(GMouseEvent& event)
  24. {
  25. if (event.button() == m_drawing_button) {
  26. GPainter painter(m_widget->bitmap());
  27. painter.draw_line(m_line_start_position, m_line_end_position, m_widget->color_for(m_drawing_button), m_thickness);
  28. m_drawing_button = GMouseButton::None;
  29. m_widget->update();
  30. }
  31. }
  32. void LineTool::on_mousemove(GMouseEvent& event)
  33. {
  34. if (m_drawing_button == GMouseButton::None)
  35. return;
  36. if (!m_widget->rect().contains(event.position()))
  37. return;
  38. m_line_end_position = event.position();
  39. m_widget->update();
  40. }
  41. void LineTool::on_second_paint(GPaintEvent& event)
  42. {
  43. if (m_drawing_button == GMouseButton::None)
  44. return;
  45. GPainter painter(*m_widget);
  46. painter.add_clip_rect(event.rect());
  47. painter.draw_line(m_line_start_position, m_line_end_position, m_widget->color_for(m_drawing_button), m_thickness);
  48. }
  49. void LineTool::on_keydown(GKeyEvent& event)
  50. {
  51. if (event.key() == Key_Escape && m_drawing_button != GMouseButton::None) {
  52. m_drawing_button = GMouseButton::None;
  53. m_widget->update();
  54. event.accept();
  55. }
  56. }
  57. void LineTool::on_contextmenu(GContextMenuEvent& event)
  58. {
  59. if (!m_context_menu) {
  60. m_context_menu = GMenu::construct();
  61. m_context_menu->add_action(GAction::create("1", [this](auto&) {
  62. m_thickness = 1;
  63. }));
  64. m_context_menu->add_action(GAction::create("2", [this](auto&) {
  65. m_thickness = 2;
  66. }));
  67. m_context_menu->add_action(GAction::create("3", [this](auto&) {
  68. m_thickness = 3;
  69. }));
  70. m_context_menu->add_action(GAction::create("4", [this](auto&) {
  71. m_thickness = 4;
  72. }));
  73. }
  74. m_context_menu->popup(event.screen_position());
  75. }