From 3fbefb82ac87d60a4122cc2fc871682f03f445de Mon Sep 17 00:00:00 2001 From: Ben Maxwell Date: Sat, 2 Apr 2022 02:24:51 +0100 Subject: [PATCH] LibGUI+Applications: Move abstract ThemeEditor preview to LibGUI This allows most of the theme preview code to be reused by similar theme preview widgets. --- .../ThemeEditor/PreviewWidget.cpp | 136 +-------------- .../Applications/ThemeEditor/PreviewWidget.h | 40 +---- .../Libraries/LibGUI/AbstractThemePreview.cpp | 160 ++++++++++++++++++ .../Libraries/LibGUI/AbstractThemePreview.h | 82 +++++++++ Userland/Libraries/LibGUI/CMakeLists.txt | 5 +- 5 files changed, 256 insertions(+), 167 deletions(-) create mode 100644 Userland/Libraries/LibGUI/AbstractThemePreview.cpp create mode 100644 Userland/Libraries/LibGUI/AbstractThemePreview.h diff --git a/Userland/Applications/ThemeEditor/PreviewWidget.cpp b/Userland/Applications/ThemeEditor/PreviewWidget.cpp index a25cb4add0..0e2c693780 100644 --- a/Userland/Applications/ThemeEditor/PreviewWidget.cpp +++ b/Userland/Applications/ThemeEditor/PreviewWidget.cpp @@ -79,149 +79,29 @@ private: RefPtr m_statusbar; }; -PreviewWidget::PreviewWidget(Gfx::Palette const& preview_palette) - : m_preview_palette(preview_palette) +PreviewWidget::PreviewWidget(Gfx::Palette const& initial_preview_palette) + : GUI::AbstractThemePreview(initial_preview_palette) { - m_active_window_icon = Gfx::Bitmap::try_load_from_file("/res/icons/16x16/window.png").release_value_but_fixme_should_propagate_errors(); - m_inactive_window_icon = Gfx::Bitmap::try_load_from_file("/res/icons/16x16/window.png").release_value_but_fixme_should_propagate_errors(); - - m_default_close_bitmap = Gfx::Bitmap::try_load_from_file("/res/icons/16x16/window-close.png").release_value_but_fixme_should_propagate_errors(); - m_default_maximize_bitmap = Gfx::Bitmap::try_load_from_file("/res/icons/16x16/upward-triangle.png").release_value_but_fixme_should_propagate_errors(); - m_default_minimize_bitmap = Gfx::Bitmap::try_load_from_file("/res/icons/16x16/downward-triangle.png").release_value_but_fixme_should_propagate_errors(); - - VERIFY(m_active_window_icon); - VERIFY(m_inactive_window_icon); - VERIFY(m_default_close_bitmap); - VERIFY(m_default_maximize_bitmap); - VERIFY(m_default_minimize_bitmap); - - load_theme_bitmaps(); - + on_palette_change = [&] { + m_gallery->set_preview_palette(preview_palette()); + }; m_gallery = add(); set_greedy_for_hits(true); } -void PreviewWidget::load_theme_bitmaps() -{ - auto load_bitmap = [](String const& path, String& last_path, RefPtr& bitmap) { - bitmap = nullptr; - if (path.is_empty()) { - last_path = String::empty(); - } else if (last_path != path) { - auto bitmap_or_error = Gfx::Bitmap::try_load_from_file(path); - if (bitmap_or_error.is_error()) { - last_path = String::empty(); - } else { - last_path = path; - bitmap = bitmap_or_error.release_value(); - } - } - }; - - auto buttons_path = m_preview_palette.title_button_icons_path(); - - load_bitmap(LexicalPath::absolute_path(buttons_path, "window-close.png"), m_last_close_path, m_close_bitmap); - load_bitmap(LexicalPath::absolute_path(buttons_path, "window-maximize.png"), m_last_maximize_path, m_maximize_bitmap); - load_bitmap(LexicalPath::absolute_path(buttons_path, "window-minimize.png"), m_last_minimize_path, m_minimize_bitmap); - - load_bitmap(m_preview_palette.active_window_shadow_path(), m_last_active_window_shadow_path, m_active_window_shadow); - load_bitmap(m_preview_palette.inactive_window_shadow_path(), m_last_inactive_window_shadow_path, m_inactive_window_shadow); - load_bitmap(m_preview_palette.menu_shadow_path(), m_last_menu_shadow_path, m_menu_shadow); - load_bitmap(m_preview_palette.taskbar_shadow_path(), m_last_taskbar_shadow_path, m_taskbar_shadow); - load_bitmap(m_preview_palette.tooltip_shadow_path(), m_last_tooltip_shadow_path, m_tooltip_shadow); -} - -void PreviewWidget::set_preview_palette(Gfx::Palette const& palette) -{ - m_preview_palette = palette; - m_gallery->set_preview_palette(palette); - load_theme_bitmaps(); - update(); -} - -void PreviewWidget::set_theme_from_file(Core::File& file) -{ - auto config_file = Core::ConfigFile::open(file.filename(), file.leak_fd()).release_value_but_fixme_should_propagate_errors(); - auto theme = Gfx::load_system_theme(config_file); - VERIFY(theme.is_valid()); - - m_preview_palette = Gfx::Palette(Gfx::PaletteImpl::create_with_anonymous_buffer(theme)); - set_preview_palette(m_preview_palette); - if (on_theme_load_from_file) - on_theme_load_from_file(file.filename()); -} - void PreviewWidget::set_color_filter(OwnPtr color_filter) { m_color_filter = move(color_filter); repaint(); } -void PreviewWidget::paint_event(GUI::PaintEvent& event) +void PreviewWidget::paint_preview(GUI::PaintEvent&) { - GUI::Frame::paint_event(event); - GUI::Painter painter(*this); - - painter.add_clip_rect(event.rect()); - painter.add_clip_rect(frame_inner_rect()); - - painter.fill_rect(frame_inner_rect(), m_preview_palette.desktop_background()); - - struct Button { - Gfx::IntRect rect; - RefPtr bitmap; - }; - - auto paint_window = [&](auto& title, Gfx::IntRect const& rect, auto state, Gfx::Bitmap const& icon) { - int window_button_width = m_preview_palette.window_title_button_width(); - int window_button_height = m_preview_palette.window_title_button_height(); - auto titlebar_text_rect = Gfx::WindowTheme::current().titlebar_text_rect(Gfx::WindowTheme::WindowType::Normal, rect, m_preview_palette); - int pos = titlebar_text_rect.right() + 1; - - Vector