Serenity Operating System
at master 153 lines 5.8 kB view raw
1/* 2 * Copyright (c) 2020, Ben Jilks <benjyjilks@gmail.com> 3 * Copyright (c) 2022, MacDue <macdue@dueutil.tech> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include "CreateNewImageDialog.h" 9#include <AK/Array.h> 10#include <LibConfig/Client.h> 11#include <LibGUI/BoxLayout.h> 12#include <LibGUI/Button.h> 13#include <LibGUI/CheckBox.h> 14#include <LibGUI/ColorInput.h> 15#include <LibGUI/ComboBox.h> 16#include <LibGUI/ItemListModel.h> 17#include <LibGUI/Label.h> 18#include <LibGUI/SpinBox.h> 19#include <LibGUI/TextBox.h> 20 21namespace PixelPaint { 22 23CreateNewImageDialog::CreateNewImageDialog(GUI::Window* parent_window) 24 : Dialog(parent_window) 25{ 26 set_title("Create new image"); 27 set_icon(parent_window->icon()); 28 resize(200, 220); 29 30 auto main_widget = set_main_widget<GUI::Widget>().release_value_but_fixme_should_propagate_errors(); 31 main_widget->set_fill_with_background_color(true); 32 33 main_widget->set_layout<GUI::VerticalBoxLayout>(4); 34 35 auto& name_label = main_widget->add<GUI::Label>("Name:"); 36 name_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); 37 38 m_name_textbox = main_widget->add<GUI::TextBox>(); 39 m_name_textbox->on_change = [this] { 40 m_image_name = m_name_textbox->text(); 41 }; 42 auto default_name = Config::read_string("PixelPaint"sv, "NewImage"sv, "Name"sv); 43 m_name_textbox->set_text(default_name); 44 45 auto& width_label = main_widget->add<GUI::Label>("Width:"); 46 width_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); 47 48 auto& width_spinbox = main_widget->add<GUI::SpinBox>(); 49 50 auto& height_label = main_widget->add<GUI::Label>("Height:"); 51 height_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); 52 53 auto& height_spinbox = main_widget->add<GUI::SpinBox>(); 54 55 enum class BackgroundIndex { 56 Transparent = 0, 57 White, 58 Black, 59 Custom 60 }; 61 62 static constexpr AK::Array suggested_backgrounds = { 63 "Transparent"sv, 64 "White"sv, 65 "Black"sv, 66 "Custom"sv 67 }; 68 69 m_background_color = Color::from_string( 70 Config::read_string("PixelPaint"sv, "NewImage"sv, "Background"sv)) 71 .value_or(Color::Transparent); 72 73 auto selected_background_index = [&] { 74 if (m_background_color == Gfx::Color::Transparent) 75 return BackgroundIndex::Transparent; 76 if (m_background_color == Gfx::Color::White) 77 return BackgroundIndex::White; 78 if (m_background_color == Gfx::Color::Black) 79 return BackgroundIndex::Black; 80 return BackgroundIndex::Custom; 81 }(); 82 83 auto& background_label = main_widget->add<GUI::Label>("Background:"); 84 background_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); 85 auto& background_color_combo = main_widget->add<GUI::ComboBox>(); 86 auto& background_color_input = main_widget->add<GUI::ColorInput>(); 87 background_color_input.set_visible(false); 88 background_color_combo.set_only_allow_values_from_model(true); 89 background_color_combo.set_model(*GUI::ItemListModel<StringView, decltype(suggested_backgrounds)>::create(suggested_backgrounds)); 90 background_color_combo.on_change = [&](auto&, const GUI::ModelIndex& index) { 91 auto background_index = static_cast<BackgroundIndex>(index.row()); 92 m_background_color = [&]() -> Gfx::Color { 93 switch (background_index) { 94 case BackgroundIndex::Transparent: 95 return Gfx::Color::Transparent; 96 case BackgroundIndex::White: 97 return Gfx::Color::White; 98 case BackgroundIndex::Black: 99 return Gfx::Color::Black; 100 default: 101 return m_background_color; 102 } 103 }(); 104 background_color_input.set_color(m_background_color); 105 background_color_input.set_visible(background_index == BackgroundIndex::Custom); 106 }; 107 background_color_combo.set_selected_index(to_underlying(selected_background_index)); 108 background_color_input.on_change = [&] { 109 m_background_color = background_color_input.color(); 110 }; 111 112 auto& set_defaults_checkbox = main_widget->add<GUI::CheckBox>(); 113 set_defaults_checkbox.set_text("Use these settings as default"_string.release_value_but_fixme_should_propagate_errors()); 114 115 auto& button_container = main_widget->add<GUI::Widget>(); 116 button_container.set_layout<GUI::HorizontalBoxLayout>(); 117 118 auto& ok_button = button_container.add<GUI::Button>("OK"_short_string); 119 ok_button.on_click = [&](auto) { 120 if (set_defaults_checkbox.is_checked()) { 121 Config::write_string("PixelPaint"sv, "NewImage"sv, "Name"sv, m_image_name); 122 Config::write_i32("PixelPaint"sv, "NewImage"sv, "Width"sv, m_image_size.width()); 123 Config::write_i32("PixelPaint"sv, "NewImage"sv, "Height"sv, m_image_size.height()); 124 Config::write_string("PixelPaint"sv, "NewImage"sv, "Background"sv, m_background_color.to_deprecated_string()); 125 } 126 127 done(ExecResult::OK); 128 }; 129 ok_button.set_default(true); 130 131 auto& cancel_button = button_container.add<GUI::Button>("Cancel"_short_string); 132 cancel_button.on_click = [this](auto) { 133 done(ExecResult::Cancel); 134 }; 135 136 width_spinbox.on_change = [this](int value) { 137 m_image_size.set_width(value); 138 }; 139 140 height_spinbox.on_change = [this](int value) { 141 m_image_size.set_height(value); 142 }; 143 144 width_spinbox.set_range(1, 16384); 145 height_spinbox.set_range(1, 16384); 146 147 auto default_width = Config::read_i32("PixelPaint"sv, "NewImage"sv, "Width"sv, 510); 148 auto default_height = Config::read_i32("PixelPaint"sv, "NewImage"sv, "Height"sv, 356); 149 width_spinbox.set_value(default_width); 150 height_spinbox.set_value(default_height); 151} 152 153}