EditGuideDialog.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "EditGuideDialog.h"
  7. #include <Applications/PixelPaint/EditGuideDialogGML.h>
  8. #include <LibGUI/Button.h>
  9. #include <LibGUI/RadioButton.h>
  10. #include <LibGUI/TextBox.h>
  11. #include <LibGUI/Widget.h>
  12. namespace PixelPaint {
  13. EditGuideDialog::EditGuideDialog(GUI::Window* parent_window, String const& offset, Guide::Orientation orientation)
  14. : Dialog(parent_window)
  15. , m_offset(offset)
  16. , m_orientation(orientation)
  17. {
  18. set_title("Create new Guide");
  19. set_icon(parent_window->icon());
  20. resize(200, 120);
  21. set_resizable(false);
  22. auto& main_widget = set_main_widget<GUI::Widget>();
  23. if (!main_widget.load_from_gml(edit_guide_dialog_gml))
  24. VERIFY_NOT_REACHED();
  25. auto horizontal_radio = main_widget.find_descendant_of_type_named<GUI::RadioButton>("orientation_horizontal_radio");
  26. auto vertical_radio = main_widget.find_descendant_of_type_named<GUI::RadioButton>("orientation_vertical_radio");
  27. auto ok_button = main_widget.find_descendant_of_type_named<GUI::Button>("ok_button");
  28. auto cancel_button = main_widget.find_descendant_of_type_named<GUI::Button>("cancel_button");
  29. m_offset_text_box = main_widget.find_descendant_of_type_named<GUI::TextBox>("offset_text_box");
  30. VERIFY(horizontal_radio);
  31. VERIFY(ok_button);
  32. VERIFY(!m_offset_text_box.is_null());
  33. VERIFY(vertical_radio);
  34. VERIFY(cancel_button);
  35. if (orientation == Guide::Orientation::Vertical) {
  36. vertical_radio->set_checked(true);
  37. m_is_vertical_checked = true;
  38. } else if (orientation == Guide::Orientation::Horizontal) {
  39. horizontal_radio->set_checked(true);
  40. m_is_horizontal_checked = true;
  41. }
  42. if (!offset.is_empty())
  43. m_offset_text_box->set_text(offset);
  44. horizontal_radio->on_checked = [this](bool checked) { m_is_horizontal_checked = checked; };
  45. vertical_radio->on_checked = [this](bool checked) { m_is_vertical_checked = checked; };
  46. ok_button->on_click = [this](auto) {
  47. if (m_is_vertical_checked) {
  48. m_orientation = Guide::Orientation::Vertical;
  49. } else if (m_is_horizontal_checked) {
  50. m_orientation = Guide::Orientation::Horizontal;
  51. } else {
  52. done(ExecResult::Aborted);
  53. return;
  54. }
  55. if (m_offset_text_box->text().is_empty())
  56. done(ExecResult::Aborted);
  57. m_offset = m_offset_text_box->text();
  58. done(ExecResult::OK);
  59. };
  60. cancel_button->on_click = [this](auto) {
  61. done(ExecResult::Cancel);
  62. };
  63. }
  64. Optional<float> EditGuideDialog::offset_as_pixel(ImageEditor const& editor)
  65. {
  66. float offset = 0;
  67. if (m_offset.ends_with('%')) {
  68. auto percentage = m_offset.substring_view(0, m_offset.length() - 1).to_int();
  69. if (!percentage.has_value())
  70. return {};
  71. if (orientation() == PixelPaint::Guide::Orientation::Horizontal)
  72. offset = editor.image().size().height() * ((double)percentage.value() / 100.0);
  73. else if (orientation() == PixelPaint::Guide::Orientation::Vertical)
  74. offset = editor.image().size().width() * ((double)percentage.value() / 100.0);
  75. } else {
  76. auto parsed_int = m_offset.to_int();
  77. if (!parsed_int.has_value())
  78. return {};
  79. offset = parsed_int.value();
  80. }
  81. return offset;
  82. }
  83. }