From 690c736c3a568ed54d448eb31615496b45016ad3 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 23 Aug 2020 14:02:04 +0200 Subject: [PATCH] ThemeEditor: Add a handful of widgets to the preview This needs to be spruced up a bit, but having a set of common widgets gives you a quick idea of what the theme will look like. :^) --- Applications/ThemeEditor/PreviewWidget.cpp | 84 ++++++++++++++++++---- Applications/ThemeEditor/PreviewWidget.h | 5 ++ 2 files changed, 76 insertions(+), 13 deletions(-) diff --git a/Applications/ThemeEditor/PreviewWidget.cpp b/Applications/ThemeEditor/PreviewWidget.cpp index 82faf6a0ca..88f5efa143 100644 --- a/Applications/ThemeEditor/PreviewWidget.cpp +++ b/Applications/ThemeEditor/PreviewWidget.cpp @@ -25,17 +25,76 @@ */ #include "PreviewWidget.h" +#include +#include +#include +#include #include +#include +#include +#include #include #include namespace ThemeEditor { +class MiniWidgetGallery final : public GUI::Widget { + C_OBJECT(MiniWidgetGallery); + +public: + void set_preview_palette(const Gfx::Palette& palette) + { + set_palette(palette); + Function recurse = [&](GUI::Widget& parent_widget) { + parent_widget.for_each_child_widget([&](auto& widget) { + widget.set_palette(palette); + recurse(widget); + return IterationDecision::Continue; + }); + }; + recurse(*this); + } + +private: + MiniWidgetGallery() + { + set_fill_with_background_color(true); + m_button = add(); + m_button->set_text("Button"); + m_checkbox = add(); + m_checkbox->set_text("Check box"); + m_radio = add(); + m_radio->set_text("Radio button"); + m_statusbar = add(); + m_statusbar->set_text("Status bar"); + m_editor = add(); + m_editor->set_text("Text editor\nwith multiple\nlines."); + } + + virtual void resize_event(GUI::ResizeEvent&) override + { + m_editor->set_relative_rect(10, 70, 200, 140); + m_button->set_relative_rect(10, 10, 200, 20); + m_checkbox->set_relative_rect(10, 30, 200, 20); + m_radio->set_relative_rect(10, 50, 200, 20); + m_statusbar->set_relative_rect(0, height() - 16, width(), 16); + } + + RefPtr m_editor; + RefPtr m_button; + RefPtr m_checkbox; + RefPtr m_radio; + RefPtr m_statusbar; +}; + PreviewWidget::PreviewWidget(const Gfx::Palette& preview_palette) : m_preview_palette(preview_palette) { m_active_window_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/window.png"); m_inactive_window_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/window.png"); + + m_gallery = add(); + set_greedy_for_hits(true); } PreviewWidget::~PreviewWidget() @@ -45,6 +104,7 @@ PreviewWidget::~PreviewWidget() void PreviewWidget::set_preview_palette(const Gfx::Palette& palette) { m_preview_palette = palette; + m_gallery->set_preview_palette(palette); update(); } @@ -60,19 +120,10 @@ void PreviewWidget::paint_event(GUI::PaintEvent& event) auto paint_window = [&](auto& title, const Gfx::IntRect& rect, auto state, const Gfx::Bitmap& icon) { Gfx::IntRect leftmost_button_rect { 300, 4, 16, 16 }; - - { - Gfx::PainterStateSaver saver(painter); - auto frame_rect = Gfx::WindowTheme::current().frame_rect_for_window(Gfx::WindowTheme::WindowType::Normal, rect, m_preview_palette); - painter.translate(frame_rect.location()); - Gfx::WindowTheme::current().paint_normal_frame(painter, state, rect, title, icon, m_preview_palette, leftmost_button_rect); - } - - painter.fill_rect(rect, m_preview_palette.window()); - - Gfx::IntRect button_rect { 0, 0, 100, 20 }; - button_rect.center_within(rect); - Gfx::StylePainter::current().paint_button(painter, button_rect, m_preview_palette, Gfx::ButtonStyle::Normal, false); + Gfx::PainterStateSaver saver(painter); + auto frame_rect = Gfx::WindowTheme::current().frame_rect_for_window(Gfx::WindowTheme::WindowType::Normal, rect, m_preview_palette); + painter.translate(frame_rect.location()); + Gfx::WindowTheme::current().paint_normal_frame(painter, state, rect, title, icon, m_preview_palette, leftmost_button_rect); }; Gfx::IntRect active_rect { 0, 0, 320, 240 }; @@ -83,4 +134,11 @@ void PreviewWidget::paint_event(GUI::PaintEvent& event) paint_window("Active window", active_rect, Gfx::WindowTheme::WindowState::Active, *m_inactive_window_icon); } +void PreviewWidget::resize_event(GUI::ResizeEvent&) +{ + Gfx::IntRect gallery_rect { 0, 0, 320, 240 }; + gallery_rect.center_within(rect()); + m_gallery->set_relative_rect(gallery_rect); +} + } diff --git a/Applications/ThemeEditor/PreviewWidget.h b/Applications/ThemeEditor/PreviewWidget.h index 2c0fe51b29..5cef596824 100644 --- a/Applications/ThemeEditor/PreviewWidget.h +++ b/Applications/ThemeEditor/PreviewWidget.h @@ -31,6 +31,8 @@ namespace ThemeEditor { +class MiniWidgetGallery; + class PreviewWidget final : public GUI::Frame { C_OBJECT(PreviewWidget); @@ -44,11 +46,14 @@ private: explicit PreviewWidget(const Gfx::Palette&); virtual void paint_event(GUI::PaintEvent&) override; + virtual void resize_event(GUI::ResizeEvent&) override; Gfx::Palette m_preview_palette; RefPtr m_active_window_icon; RefPtr m_inactive_window_icon; + + RefPtr m_gallery; }; }