From e8dbb1a8b25ea7227b2521a406f7dac4a7abcae3 Mon Sep 17 00:00:00 2001 From: MacDue Date: Tue, 13 Dec 2022 23:54:29 +0000 Subject: [PATCH] PixelPaint: Add background color options to "new image" dialog This now allows you to select a background color for your new image, and optionally allows saving that default. You can pick between Transparent, White, Black, or a custom color (similar to other editors). --- .../PixelPaint/CreateNewImageDialog.cpp | 63 +++++++++++++++++++ .../PixelPaint/CreateNewImageDialog.h | 3 + .../Applications/PixelPaint/MainWidget.cpp | 4 +- 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/Userland/Applications/PixelPaint/CreateNewImageDialog.cpp b/Userland/Applications/PixelPaint/CreateNewImageDialog.cpp index cb816cfa1f..da0d2d4870 100644 --- a/Userland/Applications/PixelPaint/CreateNewImageDialog.cpp +++ b/Userland/Applications/PixelPaint/CreateNewImageDialog.cpp @@ -1,14 +1,19 @@ /* * Copyright (c) 2020, Ben Jilks + * Copyright (c) 2022, MacDue * * SPDX-License-Identifier: BSD-2-Clause */ #include "CreateNewImageDialog.h" +#include #include #include #include #include +#include +#include +#include #include #include #include @@ -48,6 +53,63 @@ CreateNewImageDialog::CreateNewImageDialog(GUI::Window* parent_window) auto& height_spinbox = main_widget.add(); + enum class BackgroundIndex { + Transparent = 0, + White, + Black, + Custom + }; + + static constexpr AK::Array suggested_backgrounds = { + "Transparent"sv, + "White"sv, + "Black"sv, + "Custom"sv + }; + + m_background_color = Color::from_string( + Config::read_string("PixelPaint"sv, "NewImage"sv, "Background"sv)) + .value_or(Color::Transparent); + + auto selected_background_index = [&] { + if (m_background_color == Gfx::Color::Transparent) + return BackgroundIndex::Transparent; + if (m_background_color == Gfx::Color::White) + return BackgroundIndex::White; + if (m_background_color == Gfx::Color::Black) + return BackgroundIndex::Black; + return BackgroundIndex::Custom; + }(); + + auto& background_label = main_widget.add("Background:"); + background_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); + auto& background_color_combo = main_widget.add(); + auto& background_color_input = main_widget.add(); + background_color_input.set_visible(false); + background_color_combo.set_only_allow_values_from_model(true); + background_color_combo.set_model(*GUI::ItemListModel::create(suggested_backgrounds)); + background_color_combo.on_change = [&](auto&, const GUI::ModelIndex& index) { + auto background_index = static_cast(index.row()); + m_background_color = [&]() -> Gfx::Color { + switch (background_index) { + case BackgroundIndex::Transparent: + return Gfx::Color::Transparent; + case BackgroundIndex::White: + return Gfx::Color::White; + case BackgroundIndex::Black: + return Gfx::Color::Black; + default: + return m_background_color; + } + }(); + background_color_input.set_color(m_background_color); + background_color_input.set_visible(background_index == BackgroundIndex::Custom); + }; + background_color_combo.set_selected_index(to_underlying(selected_background_index)); + background_color_input.on_change = [&] { + m_background_color = background_color_input.color(); + }; + auto& set_defaults_checkbox = main_widget.add(); set_defaults_checkbox.set_text("Use these settings as default"); @@ -60,6 +122,7 @@ CreateNewImageDialog::CreateNewImageDialog(GUI::Window* parent_window) Config::write_string("PixelPaint"sv, "NewImage"sv, "Name"sv, m_image_name); Config::write_i32("PixelPaint"sv, "NewImage"sv, "Width"sv, m_image_size.width()); Config::write_i32("PixelPaint"sv, "NewImage"sv, "Height"sv, m_image_size.height()); + Config::write_string("PixelPaint"sv, "NewImage"sv, "Background"sv, m_background_color.to_deprecated_string()); } done(ExecResult::OK); diff --git a/Userland/Applications/PixelPaint/CreateNewImageDialog.h b/Userland/Applications/PixelPaint/CreateNewImageDialog.h index 67bf5e0bae..a407a9e9d9 100644 --- a/Userland/Applications/PixelPaint/CreateNewImageDialog.h +++ b/Userland/Applications/PixelPaint/CreateNewImageDialog.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace PixelPaint { @@ -16,12 +17,14 @@ class CreateNewImageDialog final : public GUI::Dialog { public: Gfx::IntSize image_size() const { return m_image_size; } DeprecatedString const& image_name() const { return m_image_name; } + Gfx::Color background_color() const { return m_background_color; } private: CreateNewImageDialog(GUI::Window* parent_window); DeprecatedString m_image_name; Gfx::IntSize m_image_size; + Gfx::Color m_background_color {}; RefPtr m_name_textbox; }; diff --git a/Userland/Applications/PixelPaint/MainWidget.cpp b/Userland/Applications/PixelPaint/MainWidget.cpp index 4999ddeb44..8898d9796b 100644 --- a/Userland/Applications/PixelPaint/MainWidget.cpp +++ b/Userland/Applications/PixelPaint/MainWidget.cpp @@ -159,7 +159,9 @@ void MainWidget::initialize_menubar(GUI::Window& window) auto image = PixelPaint::Image::try_create_with_size(dialog->image_size()).release_value_but_fixme_should_propagate_errors(); auto bg_layer = PixelPaint::Layer::try_create_with_size(*image, image->size(), "Background").release_value_but_fixme_should_propagate_errors(); image->add_layer(*bg_layer); - bg_layer->content_bitmap().fill(Color::White); + auto background_color = dialog->background_color(); + if (background_color != Gfx::Color::Transparent) + bg_layer->content_bitmap().fill(background_color); auto& editor = create_new_editor(*image); auto image_title = dialog->image_name().trim_whitespace();