Serenity Operating System
at master 101 lines 3.6 kB view raw
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}