CreateNewImageDialog.cpp 5.5 KB

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