mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:57:45 +00:00
LibGUI+LibGfx: Let Desktop::the() set widget effects
Scrolling can now be set Coarse or Smooth system-wide, Splitter knurls and Tab accents toggled on and off, and Menu flashing disabled.
This commit is contained in:
parent
1d445356b6
commit
5917545633
8 changed files with 28 additions and 19 deletions
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <LibCore/Timer.h>
|
#include <LibCore/Timer.h>
|
||||||
|
#include <LibGUI/Desktop.h>
|
||||||
#include <LibGUI/Painter.h>
|
#include <LibGUI/Painter.h>
|
||||||
#include <LibGUI/Scrollbar.h>
|
#include <LibGUI/Scrollbar.h>
|
||||||
#include <LibGfx/CharacterBitmap.h>
|
#include <LibGfx/CharacterBitmap.h>
|
||||||
|
@ -98,15 +99,15 @@ void Scrollbar::set_value(int value, AllowCallback allow_callback, DoClamp do_cl
|
||||||
|
|
||||||
void Scrollbar::set_target_value(int new_target_value)
|
void Scrollbar::set_target_value(int new_target_value)
|
||||||
{
|
{
|
||||||
if (m_scroll_animation == Animation::CoarseScroll)
|
|
||||||
return set_value(new_target_value);
|
|
||||||
|
|
||||||
new_target_value = clamp(new_target_value, min(), max());
|
new_target_value = clamp(new_target_value, min(), max());
|
||||||
|
|
||||||
// If we are already at or scrolling to the new target then don't touch anything
|
// If we are already at or scrolling to the new target then don't touch anything
|
||||||
if (m_target_value == new_target_value)
|
if (m_target_value == new_target_value)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (m_scroll_animation == Animation::CoarseScroll || !Desktop::the().system_effects().smooth_scrolling())
|
||||||
|
return set_value(new_target_value);
|
||||||
|
|
||||||
m_animation_time_elapsed = 0;
|
m_animation_time_elapsed = 0;
|
||||||
m_start_value = value();
|
m_start_value = value();
|
||||||
m_target_value = new_target_value;
|
m_target_value = new_target_value;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <LibGUI/BoxLayout.h>
|
#include <LibGUI/BoxLayout.h>
|
||||||
|
#include <LibGUI/Desktop.h>
|
||||||
#include <LibGUI/Painter.h>
|
#include <LibGUI/Painter.h>
|
||||||
#include <LibGUI/Splitter.h>
|
#include <LibGUI/Splitter.h>
|
||||||
#include <LibGUI/UIDimensions.h>
|
#include <LibGUI/UIDimensions.h>
|
||||||
|
@ -60,6 +61,7 @@ void Splitter::paint_event(PaintEvent& event)
|
||||||
auto& rect = grabbable.paint_rect;
|
auto& rect = grabbable.paint_rect;
|
||||||
int primary = rect.center().primary_offset_for_orientation(m_orientation) - 1;
|
int primary = rect.center().primary_offset_for_orientation(m_orientation) - 1;
|
||||||
int secondary = rect.center().secondary_offset_for_orientation(m_orientation) - (total_knurling_width / 2) + (i * (knurl_width + knurl_spacing));
|
int secondary = rect.center().secondary_offset_for_orientation(m_orientation) - (total_knurling_width / 2) + (i * (knurl_width + knurl_spacing));
|
||||||
|
if (Desktop::the().system_effects().splitter_knurls()) {
|
||||||
if (m_orientation == Gfx::Orientation::Vertical)
|
if (m_orientation == Gfx::Orientation::Vertical)
|
||||||
paint_knurl(secondary, primary);
|
paint_knurl(secondary, primary);
|
||||||
else
|
else
|
||||||
|
@ -67,6 +69,7 @@ void Splitter::paint_event(PaintEvent& event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Splitter::resize_event(ResizeEvent& event)
|
void Splitter::resize_event(ResizeEvent& event)
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <AK/GenericShorthands.h>
|
#include <AK/GenericShorthands.h>
|
||||||
#include <AK/JsonValue.h>
|
#include <AK/JsonValue.h>
|
||||||
#include <LibGUI/BoxLayout.h>
|
#include <LibGUI/BoxLayout.h>
|
||||||
|
#include <LibGUI/Desktop.h>
|
||||||
#include <LibGUI/Painter.h>
|
#include <LibGUI/Painter.h>
|
||||||
#include <LibGUI/TabWidget.h>
|
#include <LibGUI/TabWidget.h>
|
||||||
#include <LibGUI/Window.h>
|
#include <LibGUI/Window.h>
|
||||||
|
@ -256,12 +257,14 @@ void TabWidget::paint_event(PaintEvent& event)
|
||||||
text_rect.intersect(button_rect);
|
text_rect.intersect(button_rect);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool accented = Desktop::the().system_effects().tab_accents();
|
||||||
|
|
||||||
for (size_t i = 0; i < m_tabs.size(); ++i) {
|
for (size_t i = 0; i < m_tabs.size(); ++i) {
|
||||||
if (m_tabs[i].widget == m_active_widget)
|
if (m_tabs[i].widget == m_active_widget)
|
||||||
continue;
|
continue;
|
||||||
bool hovered = i == m_hovered_tab_index;
|
bool hovered = i == m_hovered_tab_index;
|
||||||
auto button_rect = this->button_rect(i);
|
auto button_rect = this->button_rect(i);
|
||||||
Gfx::StylePainter::paint_tab_button(painter, button_rect, palette(), false, hovered, m_tabs[i].widget->is_enabled(), m_tab_position, window()->is_active());
|
Gfx::StylePainter::paint_tab_button(painter, button_rect, palette(), false, hovered, m_tabs[i].widget->is_enabled(), m_tab_position, window()->is_active(), accented);
|
||||||
|
|
||||||
auto tab_button_content_rect = button_rect.shrunken(8, 0);
|
auto tab_button_content_rect = button_rect.shrunken(8, 0);
|
||||||
|
|
||||||
|
@ -304,7 +307,7 @@ void TabWidget::paint_event(PaintEvent& event)
|
||||||
}
|
}
|
||||||
|
|
||||||
auto tab_button_content_rect = button_rect.shrunken(8, 0);
|
auto tab_button_content_rect = button_rect.shrunken(8, 0);
|
||||||
Gfx::StylePainter::paint_tab_button(painter, button_rect, palette(), true, hovered, m_tabs[i].widget->is_enabled(), m_tab_position, window()->is_active());
|
Gfx::StylePainter::paint_tab_button(painter, button_rect, palette(), true, hovered, m_tabs[i].widget->is_enabled(), m_tab_position, window()->is_active(), accented);
|
||||||
|
|
||||||
paint_tab_icon_if_needed(m_tabs[i].icon, button_rect, tab_button_content_rect);
|
paint_tab_icon_if_needed(m_tabs[i].icon, button_rect, tab_button_content_rect);
|
||||||
tab_button_content_rect.set_width(tab_button_content_rect.width() - (m_close_button_enabled ? 16 : 0));
|
tab_button_content_rect.set_width(tab_button_content_rect.width() - (m_close_button_enabled ? 16 : 0));
|
||||||
|
|
|
@ -1234,6 +1234,8 @@ Menu& Window::add_menu(String name)
|
||||||
|
|
||||||
void Window::flash_menubar_menu_for(MenuItem const& menu_item)
|
void Window::flash_menubar_menu_for(MenuItem const& menu_item)
|
||||||
{
|
{
|
||||||
|
if (!Desktop::the().system_effects().flash_menus())
|
||||||
|
return;
|
||||||
auto menu_id = menu_item.menu_id();
|
auto menu_id = menu_item.menu_id();
|
||||||
if (menu_id < 0)
|
if (menu_id < 0)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
void ClassicStylePainter::paint_tab_button(Painter& painter, IntRect const& rect, Palette const& palette, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window)
|
void ClassicStylePainter::paint_tab_button(Painter& painter, IntRect const& rect, Palette const& palette, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window, bool accented)
|
||||||
{
|
{
|
||||||
Color base_color = palette.button();
|
Color base_color = palette.button();
|
||||||
Color highlight_color2 = palette.threed_highlight();
|
Color highlight_color2 = palette.threed_highlight();
|
||||||
|
@ -41,7 +41,7 @@ void ClassicStylePainter::paint_tab_button(Painter& painter, IntRect const& rect
|
||||||
painter.fill_rect({ 1, 1, rect.width() - 2, rect.height() - 1 }, base_color);
|
painter.fill_rect({ 1, 1, rect.width() - 2, rect.height() - 1 }, base_color);
|
||||||
|
|
||||||
// Top line
|
// Top line
|
||||||
if (active) {
|
if (active && accented) {
|
||||||
painter.draw_line({ 3, 0 }, { rect.width() - 3, 0 }, accent.darkened());
|
painter.draw_line({ 3, 0 }, { rect.width() - 3, 0 }, accent.darkened());
|
||||||
painter.fill_rect_with_gradient({ 1, 1, rect.width() - 2, 2 }, accent, accent.lightened(1.5f));
|
painter.fill_rect_with_gradient({ 1, 1, rect.width() - 2, 2 }, accent, accent.lightened(1.5f));
|
||||||
painter.set_pixel({ 2, 0 }, highlight_color2);
|
painter.set_pixel({ 2, 0 }, highlight_color2);
|
||||||
|
@ -63,7 +63,7 @@ void ClassicStylePainter::paint_tab_button(Painter& painter, IntRect const& rect
|
||||||
painter.fill_rect({ 0, 0, rect.width() - 1, rect.height() }, base_color);
|
painter.fill_rect({ 0, 0, rect.width() - 1, rect.height() }, base_color);
|
||||||
|
|
||||||
// Bottom line
|
// Bottom line
|
||||||
if (active) {
|
if (active && accented) {
|
||||||
painter.fill_rect_with_gradient({ 1, rect.height() - 3, rect.width() - 2, 2 }, accent, accent.lightened(1.5f));
|
painter.fill_rect_with_gradient({ 1, rect.height() - 3, rect.width() - 2, 2 }, accent, accent.lightened(1.5f));
|
||||||
painter.draw_line({ 2, rect.height() - 1 }, { rect.width() - 3, rect.height() - 1 }, accent.darkened());
|
painter.draw_line({ 2, rect.height() - 1 }, { rect.width() - 3, rect.height() - 1 }, accent.darkened());
|
||||||
} else {
|
} else {
|
||||||
|
@ -86,7 +86,7 @@ void ClassicStylePainter::paint_tab_button(Painter& painter, IntRect const& rect
|
||||||
painter.draw_line({ 2, rect.height() - 1 }, { rect.width(), rect.height() - 1 }, shadow_color2);
|
painter.draw_line({ 2, rect.height() - 1 }, { rect.width(), rect.height() - 1 }, shadow_color2);
|
||||||
|
|
||||||
// If the tab is active, draw the accent line
|
// If the tab is active, draw the accent line
|
||||||
if (active) {
|
if (active && accented) {
|
||||||
painter.fill_rect_with_gradient({ 1, 1, 2, rect.height() - 2 }, accent, accent.lightened(1.5f));
|
painter.fill_rect_with_gradient({ 1, 1, 2, rect.height() - 2 }, accent, accent.lightened(1.5f));
|
||||||
painter.draw_line({ 0, 2 }, { 0, rect.height() - 3 }, accent.darkened());
|
painter.draw_line({ 0, 2 }, { 0, rect.height() - 3 }, accent.darkened());
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,7 +105,7 @@ void ClassicStylePainter::paint_tab_button(Painter& painter, IntRect const& rect
|
||||||
painter.draw_line({ 0, rect.height() - 1 }, { rect.width() - 2, rect.height() - 1 }, shadow_color2);
|
painter.draw_line({ 0, rect.height() - 1 }, { rect.width() - 2, rect.height() - 1 }, shadow_color2);
|
||||||
|
|
||||||
// If the tab is active, draw the accent line
|
// If the tab is active, draw the accent line
|
||||||
if (active) {
|
if (active && accented) {
|
||||||
painter.fill_rect_with_gradient({ rect.width() - 2, 1, 2, rect.height() - 2 }, accent.lightened(1.5f), accent);
|
painter.fill_rect_with_gradient({ rect.width() - 2, 1, 2, rect.height() - 2 }, accent.lightened(1.5f), accent);
|
||||||
painter.draw_line({ rect.width(), 2 }, { rect.width(), rect.height() - 3 }, accent.darkened());
|
painter.draw_line({ rect.width(), 2 }, { rect.width(), rect.height() - 3 }, accent.darkened());
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace Gfx {
|
||||||
class ClassicStylePainter : public BaseStylePainter {
|
class ClassicStylePainter : public BaseStylePainter {
|
||||||
public:
|
public:
|
||||||
virtual void paint_button(Painter&, IntRect const&, Palette const&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true, bool focused = false, bool default_button = false) override;
|
virtual void paint_button(Painter&, IntRect const&, Palette const&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true, bool focused = false, bool default_button = false) override;
|
||||||
virtual void paint_tab_button(Painter&, IntRect const&, Palette const&, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window) override;
|
virtual void paint_tab_button(Painter&, IntRect const&, Palette const&, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window, bool accented) override;
|
||||||
virtual void paint_frame(Painter&, IntRect const&, Palette const&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false) override;
|
virtual void paint_frame(Painter&, IntRect const&, Palette const&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false) override;
|
||||||
virtual void paint_window_frame(Painter&, IntRect const&, Palette const&) override;
|
virtual void paint_window_frame(Painter&, IntRect const&, Palette const&) override;
|
||||||
virtual void paint_progressbar(Painter&, IntRect const&, Palette const&, int min, int max, int value, StringView text, Orientation = Orientation::Horizontal) override;
|
virtual void paint_progressbar(Painter&, IntRect const&, Palette const&, int min, int max, int value, StringView text, Orientation = Orientation::Horizontal) override;
|
||||||
|
|
|
@ -18,9 +18,9 @@ BaseStylePainter& StylePainter::current()
|
||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StylePainter::paint_tab_button(Painter& painter, IntRect const& rect, Palette const& palette, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window)
|
void StylePainter::paint_tab_button(Painter& painter, IntRect const& rect, Palette const& palette, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window, bool accented)
|
||||||
{
|
{
|
||||||
current().paint_tab_button(painter, rect, palette, active, hovered, enabled, position, in_active_window);
|
current().paint_tab_button(painter, rect, palette, active, hovered, enabled, position, in_active_window, accented);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StylePainter::paint_button(Painter& painter, IntRect const& rect, Palette const& palette, ButtonStyle button_style, bool pressed, bool hovered, bool checked, bool enabled, bool focused, bool default_button)
|
void StylePainter::paint_button(Painter& painter, IntRect const& rect, Palette const& palette, ButtonStyle button_style, bool pressed, bool hovered, bool checked, bool enabled, bool focused, bool default_button)
|
||||||
|
|
|
@ -38,7 +38,7 @@ public:
|
||||||
virtual ~BaseStylePainter() = default;
|
virtual ~BaseStylePainter() = default;
|
||||||
|
|
||||||
virtual void paint_button(Painter&, IntRect const&, Palette const&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true, bool focused = false, bool default_button = false) = 0;
|
virtual void paint_button(Painter&, IntRect const&, Palette const&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true, bool focused = false, bool default_button = false) = 0;
|
||||||
virtual void paint_tab_button(Painter&, IntRect const&, Palette const&, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window) = 0;
|
virtual void paint_tab_button(Painter&, IntRect const&, Palette const&, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window, bool accented) = 0;
|
||||||
virtual void paint_frame(Painter&, IntRect const&, Palette const&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false) = 0;
|
virtual void paint_frame(Painter&, IntRect const&, Palette const&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false) = 0;
|
||||||
virtual void paint_window_frame(Painter&, IntRect const&, Palette const&) = 0;
|
virtual void paint_window_frame(Painter&, IntRect const&, Palette const&) = 0;
|
||||||
virtual void paint_progressbar(Painter&, IntRect const&, Palette const&, int min, int max, int value, StringView text, Orientation = Orientation::Horizontal) = 0;
|
virtual void paint_progressbar(Painter&, IntRect const&, Palette const&, int min, int max, int value, StringView text, Orientation = Orientation::Horizontal) = 0;
|
||||||
|
@ -57,7 +57,7 @@ public:
|
||||||
|
|
||||||
// FIXME: These are here for API compatibility, we should probably remove them and move BaseStylePainter into here
|
// FIXME: These are here for API compatibility, we should probably remove them and move BaseStylePainter into here
|
||||||
static void paint_button(Painter&, IntRect const&, Palette const&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true, bool focused = false, bool default_button = false);
|
static void paint_button(Painter&, IntRect const&, Palette const&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true, bool focused = false, bool default_button = false);
|
||||||
static void paint_tab_button(Painter&, IntRect const&, Palette const&, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window);
|
static void paint_tab_button(Painter&, IntRect const&, Palette const&, bool active, bool hovered, bool enabled, GUI::TabWidget::TabPosition position, bool in_active_window, bool accented);
|
||||||
static void paint_frame(Painter&, IntRect const&, Palette const&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false);
|
static void paint_frame(Painter&, IntRect const&, Palette const&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false);
|
||||||
static void paint_window_frame(Painter&, IntRect const&, Palette const&);
|
static void paint_window_frame(Painter&, IntRect const&, Palette const&);
|
||||||
static void paint_progressbar(Painter&, IntRect const&, Palette const&, int min, int max, int value, StringView text, Orientation = Orientation::Horizontal);
|
static void paint_progressbar(Painter&, IntRect const&, Palette const&, int min, int max, int value, StringView text, Orientation = Orientation::Horizontal);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue