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