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, ByteString 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, 130);
  21. set_resizable(false);
  22. auto main_widget = set_main_widget<GUI::Widget>();
  23. main_widget->load_from_gml(edit_guide_dialog_gml).release_value_but_fixme_should_propagate_errors();
  24. auto horizontal_radio = main_widget->find_descendant_of_type_named<GUI::RadioButton>("orientation_horizontal_radio");
  25. auto vertical_radio = main_widget->find_descendant_of_type_named<GUI::RadioButton>("orientation_vertical_radio");
  26. auto ok_button = main_widget->find_descendant_of_type_named<GUI::Button>("ok_button");
  27. auto cancel_button = main_widget->find_descendant_of_type_named<GUI::Button>("cancel_button");
  28. m_offset_text_box = main_widget->find_descendant_of_type_named<GUI::TextBox>("offset_text_box");
  29. VERIFY(horizontal_radio);
  30. VERIFY(ok_button);
  31. VERIFY(!m_offset_text_box.is_null());
  32. VERIFY(vertical_radio);
  33. VERIFY(cancel_button);
  34. if (orientation == Guide::Orientation::Vertical) {
  35. vertical_radio->set_checked(true);
  36. m_is_vertical_checked = true;
  37. } else if (orientation == Guide::Orientation::Horizontal) {
  38. horizontal_radio->set_checked(true);
  39. m_is_horizontal_checked = true;
  40. }
  41. if (!offset.is_empty())
  42. m_offset_text_box->set_text(offset);
  43. horizontal_radio->on_checked = [this](bool checked) { m_is_horizontal_checked = checked; };
  44. vertical_radio->on_checked = [this](bool checked) { m_is_vertical_checked = checked; };
  45. ok_button->on_click = [this](auto) {
  46. if (m_is_vertical_checked) {
  47. m_orientation = Guide::Orientation::Vertical;
  48. } else if (m_is_horizontal_checked) {
  49. m_orientation = Guide::Orientation::Horizontal;
  50. } else {
  51. done(ExecResult::Aborted);
  52. return;
  53. }
  54. if (m_offset_text_box->text().is_empty())
  55. done(ExecResult::Aborted);
  56. m_offset = m_offset_text_box->text();
  57. done(ExecResult::OK);
  58. };
  59. ok_button->set_default(true);
  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_number<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_number<int>();
  77. if (!parsed_int.has_value())
  78. return {};
  79. offset = parsed_int.value();
  80. }
  81. return offset;
  82. }
  83. }