From 3ec19ae4b6de72a7725668e281b1130d09654959 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 27 Oct 2020 21:17:50 +0100 Subject: [PATCH] LibGUI+LibGfx+WindowServer: Auto-generate disabled action icons :^) This patch adds a simple filter that makes button and menu item icons have that "'90s disabled" look when disabled. It's pretty awesome. --- Libraries/LibGUI/Button.cpp | 2 +- Libraries/LibGfx/Painter.cpp | 16 ++++++++++++++++ Libraries/LibGfx/Painter.h | 1 + Services/Taskbar/TaskbarButton.cpp | 2 +- Services/WindowServer/Menu.cpp | 5 ++++- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Libraries/LibGUI/Button.cpp b/Libraries/LibGUI/Button.cpp index 93539907b5..ea57a27c62 100644 --- a/Libraries/LibGUI/Button.cpp +++ b/Libraries/LibGUI/Button.cpp @@ -78,7 +78,7 @@ void Button::paint_event(PaintEvent& event) else painter.blit(icon_location, *m_icon, m_icon->rect()); } else { - painter.blit_dimmed(icon_location, *m_icon, m_icon->rect()); + painter.blit_disabled(icon_location, *m_icon, m_icon->rect(), palette()); } } auto& font = is_checked() ? Gfx::Font::default_bold_font() : this->font(); diff --git a/Libraries/LibGfx/Painter.cpp b/Libraries/LibGfx/Painter.cpp index 38655da1ec..63015774ad 100644 --- a/Libraries/LibGfx/Painter.cpp +++ b/Libraries/LibGfx/Painter.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -1612,4 +1613,19 @@ void Painter::fill_path(Path& path, Color color, WindingRule winding_rule) #endif } +void Painter::blit_disabled(const IntPoint& location, const Gfx::Bitmap& bitmap, const IntRect& rect, const Palette& palette) +{ + auto bright_color = palette.threed_highlight(); + auto dark_color = palette.threed_shadow1(); + blit_filtered(location.translated(1, 1), bitmap, rect, [&](auto) { + return bright_color; + }); + blit_filtered(location, bitmap, rect, [&](Color src) { + int gray = src.to_grayscale().red(); + if (gray > 160) + return bright_color; + return dark_color; + }); +} + } diff --git a/Libraries/LibGfx/Painter.h b/Libraries/LibGfx/Painter.h index d2b71cb74a..8ae33fc207 100644 --- a/Libraries/LibGfx/Painter.h +++ b/Libraries/LibGfx/Painter.h @@ -76,6 +76,7 @@ public: void draw_tiled_bitmap(const IntRect& dst_rect, const Gfx::Bitmap&); void blit_offset(const IntPoint&, const Gfx::Bitmap&, const IntRect& src_rect, const IntPoint&); void blit_scaled(const IntRect&, const Gfx::Bitmap&, const IntRect&, float, float); + void blit_disabled(const IntPoint&, const Gfx::Bitmap&, const IntRect&, const Palette&); void draw_text(const IntRect&, const StringView&, const Font&, TextAlignment = TextAlignment::TopLeft, Color = Color::Black, TextElision = TextElision::None); void draw_text(const IntRect&, const StringView&, TextAlignment = TextAlignment::TopLeft, Color = Color::Black, TextElision = TextElision::None); void draw_text(const IntRect&, const Utf32View&, const Font&, TextAlignment = TextAlignment::TopLeft, Color = Color::Black, TextElision = TextElision::None); diff --git a/Services/Taskbar/TaskbarButton.cpp b/Services/Taskbar/TaskbarButton.cpp index b1501ed6c7..d1ad0c61b2 100644 --- a/Services/Taskbar/TaskbarButton.cpp +++ b/Services/Taskbar/TaskbarButton.cpp @@ -153,7 +153,7 @@ void TaskbarButton::paint_event(GUI::PaintEvent& event) else painter.blit(icon_location, icon, icon.rect()); } else { - painter.blit_dimmed(icon_location, icon, icon.rect()); + painter.blit_disabled(icon_location, icon, icon.rect(), palette()); } if (!has_progress) diff --git a/Services/WindowServer/Menu.cpp b/Services/WindowServer/Menu.cpp index 5f1ae2eb01..1d4120c2d7 100644 --- a/Services/WindowServer/Menu.cpp +++ b/Services/WindowServer/Menu.cpp @@ -255,7 +255,10 @@ void Menu::draw() }); icon_rect.move_by(-1, -1); } - painter.blit(icon_rect.location(), *item.icon(), item.icon()->rect()); + if (item.is_enabled()) + painter.blit(icon_rect.location(), *item.icon(), item.icon()->rect()); + else + painter.blit_disabled(icon_rect.location(), *item.icon(), item.icon()->rect(), palette); } auto& previous_font = painter.font(); if (item.is_default())