mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 06:32:44 +00:00 
			
		
		
		
	LibGUI+LibDraw: Add "Palette" concept for scoped color theming
GApplication now has a palette. This palette contains all the system theme colors by default, and is inherited by a new top-level GWidget. New child widgets inherit their parents palette. It is possible to override the GApplication palette, and the palette of any GWidget. The Palette object contains a bunch of colors, each corresponding to a ColorRole. Each role has a convenience getter as well. Each GWidget now has a background_role() and foreground_role(), which are then looked up in their current palette when painting. This means that you no longer alter the background color of a widget by setting it directly, rather you alter either its background role, or the widget's palette.
This commit is contained in:
		
							parent
							
								
									cb4e51a7a5
								
							
						
					
					
						commit
						a79bac428b
					
				
					 62 changed files with 448 additions and 410 deletions
				
			
		|  | @ -1,4 +1,5 @@ | ||||||
| #include "GlyphMapWidget.h" | #include "GlyphMapWidget.h" | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| 
 | 
 | ||||||
| GlyphMapWidget::GlyphMapWidget(Font& mutable_font, GWidget* parent) | GlyphMapWidget::GlyphMapWidget(Font& mutable_font, GWidget* parent) | ||||||
|  | @ -74,7 +75,7 @@ void GlyphMapWidget::paint_event(GPaintEvent& event) | ||||||
|                 font().max_glyph_width(), |                 font().max_glyph_width(), | ||||||
|                 font().glyph_height()); |                 font().glyph_height()); | ||||||
|             if (glyph == m_selected_glyph) { |             if (glyph == m_selected_glyph) { | ||||||
|                 painter.fill_rect(outer_rect, SystemColor::Selection); |                 painter.fill_rect(outer_rect, palette().selection()); | ||||||
|                 painter.draw_glyph(inner_rect.location(), glyph, Color::White); |                 painter.draw_glyph(inner_rect.location(), glyph, Color::White); | ||||||
|             } else { |             } else { | ||||||
|                 painter.draw_glyph(inner_rect.location(), glyph, Color::Black); |                 painter.draw_glyph(inner_rect.location(), glyph, Color::Black); | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| #include "HexEditor.h" | #include "HexEditor.h" | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <Kernel/KeyCode.h> | #include <Kernel/KeyCode.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GClipboard.h> | #include <LibGUI/GClipboard.h> | ||||||
| #include <LibGUI/GFontDatabase.h> | #include <LibGUI/GFontDatabase.h> | ||||||
|  | @ -492,7 +493,7 @@ void HexEditor::paint_event(GPaintEvent& event) | ||||||
|                 text_color = Color::Red; |                 text_color = Color::Red; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             Color highlight_color = SystemColor::Selection; |             Color highlight_color = palette().selection(); | ||||||
|             auto highlight_flag = false; |             auto highlight_flag = false; | ||||||
|             if (m_selection_start > -1 && m_selection_end > -1) { |             if (m_selection_start > -1 && m_selection_end > -1) { | ||||||
|                 if (byte_position >= m_selection_start && byte_position <= m_selection_end) { |                 if (byte_position >= m_selection_start && byte_position <= m_selection_end) { | ||||||
|  |  | ||||||
|  | @ -156,7 +156,6 @@ void IRCAppWindow::setup_widgets() | ||||||
|     auto widget = GWidget::construct(); |     auto widget = GWidget::construct(); | ||||||
|     set_main_widget(widget); |     set_main_widget(widget); | ||||||
|     widget->set_fill_with_background_color(true); |     widget->set_fill_with_background_color(true); | ||||||
|     widget->set_background_color(SystemColor::Window); |  | ||||||
|     widget->set_layout(make<GBoxLayout>(Orientation::Vertical)); |     widget->set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|     widget->layout()->set_spacing(0); |     widget->layout()->set_spacing(0); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -51,7 +51,6 @@ PaletteWidget::PaletteWidget(PaintableWidget& paintable_widget, GWidget* parent) | ||||||
|     set_frame_shadow(FrameShadow::Raised); |     set_frame_shadow(FrameShadow::Raised); | ||||||
|     set_frame_thickness(0); |     set_frame_thickness(0); | ||||||
|     set_fill_with_background_color(true); |     set_fill_with_background_color(true); | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
| 
 | 
 | ||||||
|     set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); |     set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); | ||||||
|     set_preferred_size(0, 34); |     set_preferred_size(0, 34); | ||||||
|  |  | ||||||
|  | @ -35,7 +35,6 @@ private: | ||||||
| ToolboxWidget::ToolboxWidget(GWidget* parent) | ToolboxWidget::ToolboxWidget(GWidget* parent) | ||||||
|     : GFrame(parent) |     : GFrame(parent) | ||||||
| { | { | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
|     set_fill_with_background_color(true); |     set_fill_with_background_color(true); | ||||||
| 
 | 
 | ||||||
|     set_frame_thickness(1); |     set_frame_thickness(1); | ||||||
|  |  | ||||||
|  | @ -11,7 +11,6 @@ NetworkStatisticsWidget::NetworkStatisticsWidget(GWidget* parent) | ||||||
|         set_layout(make<GBoxLayout>(Orientation::Vertical)); |         set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|         layout()->set_margins({ 4, 4, 4, 4 }); |         layout()->set_margins({ 4, 4, 4, 4 }); | ||||||
|         set_fill_with_background_color(true); |         set_fill_with_background_color(true); | ||||||
|         set_background_color(SystemColor::Window); |  | ||||||
| 
 | 
 | ||||||
|         auto adapters_group_box = GGroupBox::construct("Adapters", this); |         auto adapters_group_box = GGroupBox::construct("Adapters", this); | ||||||
|         adapters_group_box->set_layout(make<GBoxLayout>(Orientation::Vertical)); |         adapters_group_box->set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|  |  | ||||||
|  | @ -53,7 +53,6 @@ int main(int argc, char** argv) | ||||||
|     auto keeper = GWidget::construct(); |     auto keeper = GWidget::construct(); | ||||||
|     keeper->set_layout(make<GBoxLayout>(Orientation::Vertical)); |     keeper->set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|     keeper->set_fill_with_background_color(true); |     keeper->set_fill_with_background_color(true); | ||||||
|     keeper->set_background_color(SystemColor::Window); |  | ||||||
|     keeper->layout()->set_margins({ 4, 4, 4, 4 }); |     keeper->layout()->set_margins({ 4, 4, 4, 4 }); | ||||||
| 
 | 
 | ||||||
|     auto tabwidget = GTabWidget::construct(keeper); |     auto tabwidget = GTabWidget::construct(keeper); | ||||||
|  | @ -192,7 +191,7 @@ class ProgressBarPaintingDelegate final : public GTableCellPaintingDelegate { | ||||||
| public: | public: | ||||||
|     virtual ~ProgressBarPaintingDelegate() override {} |     virtual ~ProgressBarPaintingDelegate() override {} | ||||||
| 
 | 
 | ||||||
|     virtual void paint(GPainter& painter, const Rect& a_rect, const GModel& model, const GModelIndex& index) override |     virtual void paint(GPainter& painter, const Rect& a_rect, const Palette& palette, const GModel& model, const GModelIndex& index) override | ||||||
|     { |     { | ||||||
|         auto rect = a_rect.shrunken(2, 2); |         auto rect = a_rect.shrunken(2, 2); | ||||||
|         auto percentage = model.data(index, GModel::Role::Custom).to_int(); |         auto percentage = model.data(index, GModel::Role::Custom).to_int(); | ||||||
|  | @ -201,7 +200,7 @@ public: | ||||||
|         String text; |         String text; | ||||||
|         if (data.is_string()) |         if (data.is_string()) | ||||||
|             text = data.as_string(); |             text = data.as_string(); | ||||||
|         StylePainter::paint_progress_bar(painter, rect, 0, 100, percentage, text); |         StylePainter::paint_progress_bar(painter, rect, palette, 0, 100, percentage, text); | ||||||
|         painter.draw_rect(rect, Color::Black); |         painter.draw_rect(rect, Color::Black); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  | @ -355,7 +354,7 @@ NonnullRefPtr<GWidget> build_graphs_tab() | ||||||
| 
 | 
 | ||||||
|     graphs_container->on_first_show = [](auto& self) { |     graphs_container->on_first_show = [](auto& self) { | ||||||
|         self.set_fill_with_background_color(true); |         self.set_fill_with_background_color(true); | ||||||
|         self.set_background_color(SystemColor::Window); |         self.set_background_role(ColorRole::Button); | ||||||
|         self.set_layout(make<GBoxLayout>(Orientation::Vertical)); |         self.set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|         self.layout()->set_margins({ 4, 4, 4, 4 }); |         self.layout()->set_margins({ 4, 4, 4, 4 }); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -98,13 +98,13 @@ RefPtr<GWindow> create_settings_window(TerminalWidget& terminal, RefPtr<CConfigF | ||||||
|     auto settings = GWidget::construct(); |     auto settings = GWidget::construct(); | ||||||
|     window->set_main_widget(settings); |     window->set_main_widget(settings); | ||||||
|     settings->set_fill_with_background_color(true); |     settings->set_fill_with_background_color(true); | ||||||
|  |     settings->set_background_role(ColorRole::Button); | ||||||
|     settings->set_layout(make<GBoxLayout>(Orientation::Vertical)); |     settings->set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|     settings->layout()->set_margins({ 4, 4, 4, 4 }); |     settings->layout()->set_margins({ 4, 4, 4, 4 }); | ||||||
| 
 | 
 | ||||||
|     auto radio_container = GGroupBox::construct("Bell Mode", settings); |     auto radio_container = GGroupBox::construct("Bell Mode", settings); | ||||||
|     radio_container->set_layout(make<GBoxLayout>(Orientation::Vertical)); |     radio_container->set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|     radio_container->layout()->set_margins({ 6, 16, 6, 6 }); |     radio_container->layout()->set_margins({ 6, 16, 6, 6 }); | ||||||
|     radio_container->set_fill_with_background_color(true); |  | ||||||
|     radio_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); |     radio_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); | ||||||
|     radio_container->set_preferred_size(100, 70); |     radio_container->set_preferred_size(100, 70); | ||||||
| 
 | 
 | ||||||
|  | @ -119,12 +119,9 @@ RefPtr<GWindow> create_settings_window(TerminalWidget& terminal, RefPtr<CConfigF | ||||||
|     auto slider_container = GGroupBox::construct("Background Opacity", settings); |     auto slider_container = GGroupBox::construct("Background Opacity", settings); | ||||||
|     slider_container->set_layout(make<GBoxLayout>(Orientation::Vertical)); |     slider_container->set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|     slider_container->layout()->set_margins({ 6, 16, 6, 6 }); |     slider_container->layout()->set_margins({ 6, 16, 6, 6 }); | ||||||
|     slider_container->set_fill_with_background_color(true); |  | ||||||
|     slider_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); |     slider_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); | ||||||
|     slider_container->set_preferred_size(100, 50); |     slider_container->set_preferred_size(100, 50); | ||||||
|     auto slider = GSlider::construct(Orientation::Horizontal, slider_container); |     auto slider = GSlider::construct(Orientation::Horizontal, slider_container); | ||||||
|     slider->set_fill_with_background_color(true); |  | ||||||
|     slider->set_background_color(SystemColor::Window); |  | ||||||
| 
 | 
 | ||||||
|     slider->on_value_changed = [&terminal, &config](int value) { |     slider->on_value_changed = [&terminal, &config](int value) { | ||||||
|         terminal.set_opacity(value); |         terminal.set_opacity(value); | ||||||
|  |  | ||||||
|  | @ -1,10 +1,10 @@ | ||||||
|  | #include "TextWidget.h" | ||||||
| #include <AK/String.h> | #include <AK/String.h> | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <AK/Vector.h> | #include <AK/Vector.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| 
 | 
 | ||||||
| #include "TextWidget.h" |  | ||||||
| 
 |  | ||||||
| TextWidget::TextWidget(GWidget* parent) | TextWidget::TextWidget(GWidget* parent) | ||||||
|     : GFrame(parent) |     : GFrame(parent) | ||||||
| { | { | ||||||
|  | @ -49,7 +49,7 @@ void TextWidget::paint_event(GPaintEvent& event) | ||||||
|             text_rect.set_width(text_rect.width() - indent * 2); |             text_rect.set_width(text_rect.width() - indent * 2); | ||||||
| 
 | 
 | ||||||
|         if (is_enabled()) { |         if (is_enabled()) { | ||||||
|             painter.draw_text(text_rect, line, m_text_alignment, foreground_color(), TextElision::None); |             painter.draw_text(text_rect, line, m_text_alignment, palette().color(foreground_role()), TextElision::None); | ||||||
|         } else { |         } else { | ||||||
|             painter.draw_text(text_rect.translated(1, 1), line, font(), text_alignment(), Color::White, TextElision::Right); |             painter.draw_text(text_rect.translated(1, 1), line, font(), text_alignment(), Color::White, TextElision::Right); | ||||||
|             painter.draw_text(text_rect, line, font(), text_alignment(), Color::from_rgb(0x808080), TextElision::Right); |             painter.draw_text(text_rect, line, font(), text_alignment(), Color::from_rgb(0x808080), TextElision::Right); | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
| #define FIRE_HEIGHT 168 | #define FIRE_HEIGHT 168 | ||||||
| #define FIRE_MAX 29 | #define FIRE_MAX 29 | ||||||
| 
 | 
 | ||||||
| const Color palette[] = { | static const Color s_palette[] = { | ||||||
|     Color(0x07, 0x07, 0x07), Color(0x1F, 0x07, 0x07), Color(0x2F, 0x0F, 0x07), |     Color(0x07, 0x07, 0x07), Color(0x1F, 0x07, 0x07), Color(0x2F, 0x0F, 0x07), | ||||||
|     Color(0x47, 0x0F, 0x07), Color(0x57, 0x17, 0x07), Color(0x67, 0x1F, 0x07), |     Color(0x47, 0x0F, 0x07), Color(0x57, 0x17, 0x07), Color(0x67, 0x1F, 0x07), | ||||||
|     Color(0x77, 0x1F, 0x07), Color(0x9F, 0x2F, 0x07), Color(0xAF, 0x3F, 0x07), |     Color(0x77, 0x1F, 0x07), Color(0x9F, 0x2F, 0x07), Color(0xAF, 0x3F, 0x07), | ||||||
|  | @ -93,7 +93,7 @@ Fire::Fire(GWidget* parent) | ||||||
| 
 | 
 | ||||||
|     /* Initialize fire palette */ |     /* Initialize fire palette */ | ||||||
|     for (int i = 0; i < 30; i++) |     for (int i = 0; i < 30; i++) | ||||||
|         bitmap->set_palette_color(i, palette[i]); |         bitmap->set_palette_color(i, s_palette[i]); | ||||||
| 
 | 
 | ||||||
|     /* Set remaining entries to white */ |     /* Set remaining entries to white */ | ||||||
|     for (int i = 30; i < 256; i++) |     for (int i = 30; i < 256; i++) | ||||||
|  |  | ||||||
|  | @ -68,7 +68,7 @@ void Editor::paint_event(GPaintEvent& event) | ||||||
|             rect.set_width(rect.width() - vertical_scrollbar().width()); |             rect.set_width(rect.width() - vertical_scrollbar().width()); | ||||||
|         if (horizontal_scrollbar().is_visible()) |         if (horizontal_scrollbar().is_visible()) | ||||||
|             rect.set_height(rect.height() - horizontal_scrollbar().height()); |             rect.set_height(rect.height() - horizontal_scrollbar().height()); | ||||||
|         painter.draw_rect(rect, SystemColor::Selection); |         painter.draw_rect(rect, palette().selection()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,7 +7,6 @@ FormWidget::FormWidget(FormEditorWidget& parent) | ||||||
|     : GWidget(&parent) |     : GWidget(&parent) | ||||||
| { | { | ||||||
|     set_fill_with_background_color(true); |     set_fill_with_background_color(true); | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
|     set_relative_rect(5, 5, 400, 300); |     set_relative_rect(5, 5, 400, 300); | ||||||
| 
 | 
 | ||||||
|     set_greedy_for_hits(true); |     set_greedy_for_hits(true); | ||||||
|  |  | ||||||
|  | @ -25,7 +25,6 @@ VBForm::VBForm(const String& name, GWidget* parent) | ||||||
| { | { | ||||||
|     s_current = this; |     s_current = this; | ||||||
|     set_fill_with_background_color(true); |     set_fill_with_background_color(true); | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
|     set_greedy_for_hits(true); |     set_greedy_for_hits(true); | ||||||
| 
 | 
 | ||||||
|     m_context_menu = GMenu::construct(); |     m_context_menu = GMenu::construct(); | ||||||
|  |  | ||||||
|  | @ -121,7 +121,6 @@ Field::Field(GLabel& flag_label, GLabel& time_label, GButton& face_button, GWidg | ||||||
|         m_number_bitmap[i] = GraphicsBitmap::load_from_file(String::format("/res/icons/minesweeper/%u.png", i + 1)); |         m_number_bitmap[i] = GraphicsBitmap::load_from_file(String::format("/res/icons/minesweeper/%u.png", i + 1)); | ||||||
| 
 | 
 | ||||||
|     set_fill_with_background_color(true); |     set_fill_with_background_color(true); | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
|     reset(); |     reset(); | ||||||
| 
 | 
 | ||||||
|     m_face_button.on_click = [this](auto&) { reset(); }; |     m_face_button.on_click = [this](auto&) { reset(); }; | ||||||
|  |  | ||||||
|  | @ -4,94 +4,6 @@ | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| 
 | 
 | ||||||
| Color::Color(SystemColor system_color) |  | ||||||
| { |  | ||||||
|     auto& theme = current_system_theme(); |  | ||||||
|     switch (system_color) { |  | ||||||
|     case SystemColor::Window: |  | ||||||
|         m_value = theme.window.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::WindowText: |  | ||||||
|         m_value = theme.window_text.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::Base: |  | ||||||
|         m_value = theme.base.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::ThreedShadow1: |  | ||||||
|         m_value = theme.threed_shadow1.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::ThreedShadow2: |  | ||||||
|         m_value = theme.threed_shadow2.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::ThreedHighlight: |  | ||||||
|         m_value = theme.threed_highlight.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::Button: |  | ||||||
|         m_value = theme.button.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::ButtonText: |  | ||||||
|         m_value = theme.button_text.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::HoverHighlight: |  | ||||||
|         m_value = theme.hover_highlight.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::Selection: |  | ||||||
|         m_value = theme.selection.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::SelectionText: |  | ||||||
|         m_value = theme.selection_text.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::DesktopBackground: |  | ||||||
|         m_value = theme.desktop_background.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::ActiveWindowBorder1: |  | ||||||
|         m_value = theme.active_window_border1.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::ActiveWindowBorder2: |  | ||||||
|         m_value = theme.active_window_border2.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::ActiveWindowTitle: |  | ||||||
|         m_value = theme.active_window_title.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::InactiveWindowBorder1: |  | ||||||
|         m_value = theme.inactive_window_border1.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::InactiveWindowBorder2: |  | ||||||
|         m_value = theme.inactive_window_border2.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::InactiveWindowTitle: |  | ||||||
|         m_value = theme.inactive_window_title.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::MovingWindowBorder1: |  | ||||||
|         m_value = theme.moving_window_border1.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::MovingWindowBorder2: |  | ||||||
|         m_value = theme.moving_window_border2.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::MovingWindowTitle: |  | ||||||
|         m_value = theme.moving_window_title.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::HighlightWindowBorder1: |  | ||||||
|         m_value = theme.highlight_window_border1.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::HighlightWindowBorder2: |  | ||||||
|         m_value = theme.highlight_window_border2.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::HighlightWindowTitle: |  | ||||||
|         m_value = theme.highlight_window_title.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::MenuStripe: |  | ||||||
|         m_value = theme.menu_stripe.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::MenuBase: |  | ||||||
|         m_value = theme.menu_base.value(); |  | ||||||
|         break; |  | ||||||
|     case SystemColor::MenuSelection: |  | ||||||
|         m_value = theme.menu_selection.value(); |  | ||||||
|         break; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Color::Color(NamedColor named) | Color::Color(NamedColor named) | ||||||
| { | { | ||||||
|     struct { |     struct { | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| #include <AK/String.h> | #include <AK/String.h> | ||||||
| #include <AK/Types.h> | #include <AK/Types.h> | ||||||
| 
 | 
 | ||||||
|  | enum class ColorRole; | ||||||
| typedef u32 RGBA32; | typedef u32 RGBA32; | ||||||
| 
 | 
 | ||||||
| inline constexpr u32 make_rgb(u8 r, u8 g, u8 b) | inline constexpr u32 make_rgb(u8 r, u8 g, u8 b) | ||||||
|  | @ -11,38 +12,6 @@ inline constexpr u32 make_rgb(u8 r, u8 g, u8 b) | ||||||
|     return ((r << 16) | (g << 8) | b); |     return ((r << 16) | (g << 8) | b); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| enum class SystemColor { |  | ||||||
|     DesktopBackground, |  | ||||||
|     ActiveWindowBorder1, |  | ||||||
|     ActiveWindowBorder2, |  | ||||||
|     ActiveWindowTitle, |  | ||||||
|     InactiveWindowBorder1, |  | ||||||
|     InactiveWindowBorder2, |  | ||||||
|     InactiveWindowTitle, |  | ||||||
|     MovingWindowBorder1, |  | ||||||
|     MovingWindowBorder2, |  | ||||||
|     MovingWindowTitle, |  | ||||||
|     HighlightWindowBorder1, |  | ||||||
|     HighlightWindowBorder2, |  | ||||||
|     HighlightWindowTitle, |  | ||||||
|     MenuStripe, |  | ||||||
|     MenuBase, |  | ||||||
|     MenuSelection, |  | ||||||
|     Window, |  | ||||||
|     WindowText, |  | ||||||
|     Button, |  | ||||||
|     ButtonText, |  | ||||||
|     Base, |  | ||||||
|     ThreedHighlight, |  | ||||||
|     ThreedShadow1, |  | ||||||
|     ThreedShadow2, |  | ||||||
|     HoverHighlight, |  | ||||||
|     Selection, |  | ||||||
|     SelectionText, |  | ||||||
| 
 |  | ||||||
|     DisabledText = ThreedShadow1, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class Color { | class Color { | ||||||
| public: | public: | ||||||
|     enum NamedColor { |     enum NamedColor { | ||||||
|  | @ -71,7 +40,6 @@ public: | ||||||
| 
 | 
 | ||||||
|     Color() {} |     Color() {} | ||||||
|     Color(NamedColor); |     Color(NamedColor); | ||||||
|     Color(SystemColor); |  | ||||||
|     Color(u8 r, u8 g, u8 b) |     Color(u8 r, u8 g, u8 b) | ||||||
|         : m_value(0xff000000 | (r << 16) | (g << 8) | b) |         : m_value(0xff000000 | (r << 16) | (g << 8) | b) | ||||||
|     { |     { | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ OBJS = \ | ||||||
|     Rect.o \
 |     Rect.o \
 | ||||||
|     StylePainter.o \
 |     StylePainter.o \
 | ||||||
|     SystemTheme.o \
 |     SystemTheme.o \
 | ||||||
|  |     Palette.o \
 | ||||||
|     Emoji.o |     Emoji.o | ||||||
| 
 | 
 | ||||||
| LIBRARY = libdraw.a | LIBRARY = libdraw.a | ||||||
|  |  | ||||||
							
								
								
									
										26
									
								
								Libraries/LibDraw/Palette.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Libraries/LibDraw/Palette.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
|  | 
 | ||||||
|  | NonnullRefPtr<Palette> Palette::create_with_shared_buffer(SharedBuffer& buffer) | ||||||
|  | { | ||||||
|  |     return adopt(*new Palette(buffer)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Palette::Palette(SharedBuffer& buffer) | ||||||
|  |     : m_theme_buffer(buffer) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Palette::~Palette() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const SystemTheme& Palette::theme() const | ||||||
|  | { | ||||||
|  |     return *(const SystemTheme*)m_theme_buffer->data(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Color Palette::color(ColorRole role) const | ||||||
|  | { | ||||||
|  |     ASSERT((int)role < (int)ColorRole::__Count); | ||||||
|  |     return theme().color[(int)role]; | ||||||
|  | } | ||||||
							
								
								
									
										51
									
								
								Libraries/LibDraw/Palette.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Libraries/LibDraw/Palette.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <AK/Badge.h> | ||||||
|  | #include <LibDraw/SystemTheme.h> | ||||||
|  | 
 | ||||||
|  | class GApplication; | ||||||
|  | 
 | ||||||
|  | class Palette : public RefCounted<Palette> { | ||||||
|  | public: | ||||||
|  |     static NonnullRefPtr<Palette> create_with_shared_buffer(SharedBuffer&); | ||||||
|  |     ~Palette(); | ||||||
|  | 
 | ||||||
|  |     Color window() const { return color(ColorRole::Window); } | ||||||
|  |     Color window_text() const { return color(ColorRole::WindowText); } | ||||||
|  |     Color selection() const { return color(ColorRole::Selection); } | ||||||
|  |     Color selection_text() const { return color(ColorRole::SelectionText); } | ||||||
|  |     Color desktop_background() const { return color(ColorRole::DesktopBackground); } | ||||||
|  |     Color active_window_border1() const { return color(ColorRole::ActiveWindowBorder1); } | ||||||
|  |     Color active_window_border2() const { return color(ColorRole::ActiveWindowBorder2); } | ||||||
|  |     Color active_window_title() const { return color(ColorRole::ActiveWindowTitle); } | ||||||
|  |     Color inactive_window_border1() const { return color(ColorRole::InactiveWindowBorder1); } | ||||||
|  |     Color inactive_window_border2() const { return color(ColorRole::InactiveWindowBorder2); } | ||||||
|  |     Color inactive_window_title() const { return color(ColorRole::InactiveWindowTitle); } | ||||||
|  |     Color moving_window_border1() const { return color(ColorRole::MovingWindowBorder1); } | ||||||
|  |     Color moving_window_border2() const { return color(ColorRole::MovingWindowBorder2); } | ||||||
|  |     Color moving_window_title() const { return color(ColorRole::MovingWindowTitle); } | ||||||
|  |     Color highlight_window_border1() const { return color(ColorRole::HighlightWindowBorder1); } | ||||||
|  |     Color highlight_window_border2() const { return color(ColorRole::HighlightWindowBorder2); } | ||||||
|  |     Color highlight_window_title() const { return color(ColorRole::HighlightWindowTitle); } | ||||||
|  |     Color menu_stripe() const { return color(ColorRole::MenuStripe); } | ||||||
|  |     Color menu_base() const { return color(ColorRole::MenuBase); } | ||||||
|  |     Color menu_selection() const { return color(ColorRole::MenuSelection); } | ||||||
|  |     Color base() const { return color(ColorRole::Base); } | ||||||
|  |     Color button() const { return color(ColorRole::Button); } | ||||||
|  |     Color button_text() const { return color(ColorRole::ButtonText); } | ||||||
|  |     Color threed_highlight() const { return color(ColorRole::ThreedHighlight); } | ||||||
|  |     Color threed_shadow1() const { return color(ColorRole::ThreedShadow1); } | ||||||
|  |     Color threed_shadow2() const { return color(ColorRole::ThreedShadow2); } | ||||||
|  |     Color hover_highlight() const { return color(ColorRole::ThreedHighlight); } | ||||||
|  | 
 | ||||||
|  |     Color color(ColorRole) const; | ||||||
|  | 
 | ||||||
|  |     const SystemTheme& theme() const; | ||||||
|  | 
 | ||||||
|  |     void replace_internal_buffer(Badge<GApplication>, SharedBuffer& buffer) { m_theme_buffer = buffer; } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     explicit Palette(SharedBuffer&); | ||||||
|  | 
 | ||||||
|  |     RefPtr<SharedBuffer> m_theme_buffer; | ||||||
|  | }; | ||||||
|  | @ -1,15 +1,16 @@ | ||||||
| #include <LibDraw/Painter.h> | #include <LibDraw/Painter.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibDraw/StylePainter.h> | #include <LibDraw/StylePainter.h> | ||||||
| 
 | 
 | ||||||
| void StylePainter::paint_tab_button(Painter& painter, const Rect& rect, bool active, bool hovered, bool enabled) | void StylePainter::paint_tab_button(Painter& painter, const Rect& rect, const Palette& palette, bool active, bool hovered, bool enabled) | ||||||
| { | { | ||||||
|     Color base_color = SystemColor::Button; |     Color base_color = palette.button(); | ||||||
|     Color highlight_color2 = SystemColor::ThreedHighlight; |     Color highlight_color2 = palette.threed_highlight(); | ||||||
|     Color shadow_color1 = SystemColor::ThreedShadow1; |     Color shadow_color1 = palette.threed_shadow1(); | ||||||
|     Color shadow_color2 = SystemColor::ThreedShadow2; |     Color shadow_color2 = palette.threed_shadow2(); | ||||||
| 
 | 
 | ||||||
|     if (hovered && enabled && !active) |     if (hovered && enabled && !active) | ||||||
|         base_color = StylePainter::hover_highlight_color(); |         base_color = palette.hover_highlight(); | ||||||
| 
 | 
 | ||||||
|     PainterStateSaver saver(painter); |     PainterStateSaver saver(painter); | ||||||
|     painter.translate(rect.location()); |     painter.translate(rect.location()); | ||||||
|  | @ -42,20 +43,20 @@ void StylePainter::paint_tab_button(Painter& painter, const Rect& rect, bool act | ||||||
|         shadow_color2); |         shadow_color2); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void paint_button_new(Painter& painter, const Rect& rect, bool pressed, bool checked, bool hovered, bool enabled) | static void paint_button_new(Painter& painter, const Rect& rect, const Palette& palette, bool pressed, bool checked, bool hovered, bool enabled) | ||||||
| { | { | ||||||
|     Color button_color = SystemColor::Button; |     Color button_color = palette.button(); | ||||||
|     Color highlight_color2 = SystemColor::ThreedHighlight; |     Color highlight_color2 = palette.threed_highlight(); | ||||||
|     Color shadow_color1 = SystemColor::ThreedShadow1; |     Color shadow_color1 = palette.threed_shadow1(); | ||||||
|     Color shadow_color2 = SystemColor::ThreedShadow2; |     Color shadow_color2 = palette.threed_shadow2(); | ||||||
| 
 | 
 | ||||||
|     if (checked && enabled) { |     if (checked && enabled) { | ||||||
|         if (hovered) |         if (hovered) | ||||||
|             button_color = SystemColor::HoverHighlight; |             button_color = palette.hover_highlight(); | ||||||
|         else |         else | ||||||
|             button_color = SystemColor::Button; |             button_color = palette.button(); | ||||||
|     } else if (hovered && enabled) |     } else if (hovered && enabled) | ||||||
|         button_color = StylePainter::hover_highlight_color(); |         button_color = palette.hover_highlight(); | ||||||
| 
 | 
 | ||||||
|     PainterStateSaver saver(painter); |     PainterStateSaver saver(painter); | ||||||
|     painter.translate(rect.location()); |     painter.translate(rect.location()); | ||||||
|  | @ -87,14 +88,14 @@ static void paint_button_new(Painter& painter, const Rect& rect, bool pressed, b | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StylePainter::paint_button(Painter& painter, const Rect& rect, ButtonStyle button_style, bool pressed, bool hovered, bool checked, bool enabled) | void StylePainter::paint_button(Painter& painter, const Rect& rect, const Palette& palette, ButtonStyle button_style, bool pressed, bool hovered, bool checked, bool enabled) | ||||||
| { | { | ||||||
|     if (button_style == ButtonStyle::Normal) |     if (button_style == ButtonStyle::Normal) | ||||||
|         return paint_button_new(painter, rect, pressed, checked, hovered, enabled); |         return paint_button_new(painter, rect, palette, pressed, checked, hovered, enabled); | ||||||
| 
 | 
 | ||||||
|     Color button_color = SystemColor::Button; |     Color button_color = palette.button(); | ||||||
|     Color highlight_color = SystemColor::ThreedHighlight; |     Color highlight_color = palette.threed_highlight(); | ||||||
|     Color shadow_color = Color(96, 96, 96); |     Color shadow_color = palette.threed_shadow1(); | ||||||
| 
 | 
 | ||||||
|     if (button_style == ButtonStyle::CoolBar && !enabled) |     if (button_style == ButtonStyle::CoolBar && !enabled) | ||||||
|         return; |         return; | ||||||
|  | @ -127,27 +128,27 @@ void StylePainter::paint_button(Painter& painter, const Rect& rect, ButtonStyle | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StylePainter::paint_surface(Painter& painter, const Rect& rect, bool paint_vertical_lines, bool paint_top_line) | void StylePainter::paint_surface(Painter& painter, const Rect& rect, const Palette& palette, bool paint_vertical_lines, bool paint_top_line) | ||||||
| { | { | ||||||
|     painter.fill_rect({ rect.x(), rect.y() + 1, rect.width(), rect.height() - 2 }, SystemColor::Button); |     painter.fill_rect({ rect.x(), rect.y() + 1, rect.width(), rect.height() - 2 }, palette.button()); | ||||||
|     painter.draw_line(rect.top_left(), rect.top_right(), paint_top_line ? SystemColor::ThreedHighlight : SystemColor::Button); |     painter.draw_line(rect.top_left(), rect.top_right(), paint_top_line ? palette.threed_highlight() : palette.button()); | ||||||
|     painter.draw_line(rect.bottom_left(), rect.bottom_right(), SystemColor::ThreedShadow1); |     painter.draw_line(rect.bottom_left(), rect.bottom_right(), palette.threed_shadow1()); | ||||||
|     if (paint_vertical_lines) { |     if (paint_vertical_lines) { | ||||||
|         painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left().translated(0, -1), SystemColor::ThreedHighlight); |         painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left().translated(0, -1), palette.threed_highlight()); | ||||||
|         painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), SystemColor::ThreedShadow1); |         painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), palette.threed_shadow1()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StylePainter::paint_frame(Painter& painter, const Rect& rect, FrameShape shape, FrameShadow shadow, int thickness, bool skip_vertical_lines) | void StylePainter::paint_frame(Painter& painter, const Rect& rect, const Palette& palette, FrameShape shape, FrameShadow shadow, int thickness, bool skip_vertical_lines) | ||||||
| { | { | ||||||
|     Color top_left_color; |     Color top_left_color; | ||||||
|     Color bottom_right_color; |     Color bottom_right_color; | ||||||
|     Color dark_shade = SystemColor::ThreedShadow1; |     Color dark_shade = palette.threed_shadow1(); | ||||||
|     Color light_shade = SystemColor::ThreedHighlight; |     Color light_shade = palette.threed_highlight(); | ||||||
| 
 | 
 | ||||||
|     if (shape == FrameShape::Container && thickness >= 2) { |     if (shape == FrameShape::Container && thickness >= 2) { | ||||||
|         if (shadow == FrameShadow::Raised) { |         if (shadow == FrameShadow::Raised) { | ||||||
|             dark_shade = SystemColor::ThreedShadow2; |             dark_shade = palette.threed_shadow2(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -175,10 +176,10 @@ void StylePainter::paint_frame(Painter& painter, const Rect& rect, FrameShape sh | ||||||
|     if (shape == FrameShape::Container && thickness >= 2) { |     if (shape == FrameShape::Container && thickness >= 2) { | ||||||
|         Color top_left_color; |         Color top_left_color; | ||||||
|         Color bottom_right_color; |         Color bottom_right_color; | ||||||
|         Color dark_shade = SystemColor::ThreedShadow2; |         Color dark_shade = palette.threed_shadow2(); | ||||||
|         Color light_shade = SystemColor::Button; |         Color light_shade = palette.button(); | ||||||
|         if (shadow == FrameShadow::Raised) { |         if (shadow == FrameShadow::Raised) { | ||||||
|             dark_shade = SystemColor::ThreedShadow1; |             dark_shade = palette.threed_shadow1(); | ||||||
|             top_left_color = light_shade; |             top_left_color = light_shade; | ||||||
|             bottom_right_color = dark_shade; |             bottom_right_color = dark_shade; | ||||||
|         } else if (shadow == FrameShadow::Sunken) { |         } else if (shadow == FrameShadow::Sunken) { | ||||||
|  | @ -205,12 +206,12 @@ void StylePainter::paint_frame(Painter& painter, const Rect& rect, FrameShape sh | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StylePainter::paint_window_frame(Painter& painter, const Rect& rect) | void StylePainter::paint_window_frame(Painter& painter, const Rect& rect, const Palette& palette) | ||||||
| { | { | ||||||
|     Color base_color = SystemColor::Button; |     Color base_color = palette.button(); | ||||||
|     Color dark_shade = SystemColor::ThreedShadow2; |     Color dark_shade = palette.threed_shadow2(); | ||||||
|     Color mid_shade = SystemColor::ThreedShadow1; |     Color mid_shade = palette.threed_shadow1(); | ||||||
|     Color light_shade = SystemColor::ThreedHighlight; |     Color light_shade = palette.threed_highlight(); | ||||||
| 
 | 
 | ||||||
|     painter.draw_line(rect.top_left(), rect.top_right(), base_color); |     painter.draw_line(rect.top_left(), rect.top_right(), base_color); | ||||||
|     painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left(), base_color); |     painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left(), base_color); | ||||||
|  | @ -227,7 +228,7 @@ void StylePainter::paint_window_frame(Painter& painter, const Rect& rect) | ||||||
|     painter.draw_line(rect.bottom_left().translated(2, -2), rect.bottom_right().translated(-2, -2), base_color); |     painter.draw_line(rect.bottom_left().translated(2, -2), rect.bottom_right().translated(-2, -2), base_color); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StylePainter::paint_progress_bar(Painter& painter, const Rect& rect, int min, int max, int value, const StringView& text) | void StylePainter::paint_progress_bar(Painter& painter, const Rect& rect, const Palette& palette, int min, int max, int value, const StringView& text) | ||||||
| { | { | ||||||
|     // First we fill the entire widget with the gradient. This incurs a bit of
 |     // First we fill the entire widget with the gradient. This incurs a bit of
 | ||||||
|     // overdraw but ensures a consistent look throughout the progression.
 |     // overdraw but ensures a consistent look throughout the progression.
 | ||||||
|  | @ -249,7 +250,7 @@ void StylePainter::paint_progress_bar(Painter& painter, const Rect& rect, int mi | ||||||
|     Rect hole_rect { (int)progress_width, 0, (int)(rect.width() - progress_width), rect.height() }; |     Rect hole_rect { (int)progress_width, 0, (int)(rect.width() - progress_width), rect.height() }; | ||||||
|     hole_rect.move_by(rect.location()); |     hole_rect.move_by(rect.location()); | ||||||
|     PainterStateSaver saver(painter); |     PainterStateSaver saver(painter); | ||||||
|     painter.fill_rect(hole_rect, Color::White); |     painter.fill_rect(hole_rect, palette.base()); | ||||||
| 
 | 
 | ||||||
|     painter.add_clip_rect(hole_rect); |     painter.add_clip_rect(hole_rect); | ||||||
|     if (!text.is_null()) |     if (!text.is_null()) | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| #include <LibDraw/Color.h> | #include <LibDraw/Color.h> | ||||||
| 
 | 
 | ||||||
| class Painter; | class Painter; | ||||||
|  | class Palette; | ||||||
| class Rect; | class Rect; | ||||||
| 
 | 
 | ||||||
| enum class ButtonStyle { | enum class ButtonStyle { | ||||||
|  | @ -25,12 +26,10 @@ enum class FrameShape { | ||||||
| 
 | 
 | ||||||
| class StylePainter { | class StylePainter { | ||||||
| public: | public: | ||||||
|     static void paint_button(Painter&, const Rect&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true); |     static void paint_button(Painter&, const Rect&, const Palette&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false, bool enabled = true); | ||||||
|     static void paint_tab_button(Painter&, const Rect&, bool active, bool hovered, bool enabled); |     static void paint_tab_button(Painter&, const Rect&, const Palette&, bool active, bool hovered, bool enabled); | ||||||
|     static void paint_surface(Painter&, const Rect&, bool paint_vertical_lines = true, bool paint_top_line = true); |     static void paint_surface(Painter&, const Rect&, const Palette&, bool paint_vertical_lines = true, bool paint_top_line = true); | ||||||
|     static void paint_frame(Painter&, const Rect&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false); |     static void paint_frame(Painter&, const Rect&, const Palette&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false); | ||||||
|     static void paint_window_frame(Painter&, const Rect&); |     static void paint_window_frame(Painter&, const Rect&, const Palette&); | ||||||
|     static void paint_progress_bar(Painter&, const Rect&, int min, int max, int value, const StringView& text = {}); |     static void paint_progress_bar(Painter&, const Rect&, const Palette&, int min, int max, int value, const StringView& text = {}); | ||||||
| 
 |  | ||||||
|     static Color hover_highlight_color() { return SystemColor::HoverHighlight; } |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -41,34 +41,37 @@ RefPtr<SharedBuffer> load_system_theme(const String& path) | ||||||
|         return color.value(); |         return color.value(); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     data->desktop_background = get("DesktopBackground"); | #define DO_COLOR(x) \ | ||||||
|     data->threed_highlight = get("ThreedHighlight"); |     data->color[(int)ColorRole::x] = get(#x) | ||||||
|     data->threed_shadow1 = get("ThreedShadow1"); | 
 | ||||||
|     data->threed_shadow2 = get("ThreedShadow2"); |     DO_COLOR(DesktopBackground); | ||||||
|     data->hover_highlight = get("HoverHighlight"); |     DO_COLOR(ThreedHighlight); | ||||||
|     data->selection = get("Selection"); |     DO_COLOR(ThreedShadow1); | ||||||
|     data->selection_text = get("SelectionText"); |     DO_COLOR(ThreedShadow2); | ||||||
|     data->window = get("Window"); |     DO_COLOR(HoverHighlight); | ||||||
|     data->window_text = get("WindowText"); |     DO_COLOR(Selection); | ||||||
|     data->base = get("Base"); |     DO_COLOR(SelectionText); | ||||||
|     data->button = get("Button"); |     DO_COLOR(Window); | ||||||
|     data->button_text = get("ButtonText"); |     DO_COLOR(WindowText); | ||||||
|     data->desktop_background = get("DesktopBackground"); |     DO_COLOR(Base); | ||||||
|     data->active_window_border1 = get("ActiveWindowBorder1"); |     DO_COLOR(Button); | ||||||
|     data->active_window_border2 = get("ActiveWindowBorder2"); |     DO_COLOR(ButtonText); | ||||||
|     data->active_window_title = get("ActiveWindowTitle"); |     DO_COLOR(DesktopBackground); | ||||||
|     data->inactive_window_border1 = get("InactiveWindowBorder1"); |     DO_COLOR(ActiveWindowBorder1); | ||||||
|     data->inactive_window_border2 = get("InactiveWindowBorder2"); |     DO_COLOR(ActiveWindowBorder2); | ||||||
|     data->inactive_window_title = get("InactiveWindowTitle"); |     DO_COLOR(ActiveWindowTitle); | ||||||
|     data->moving_window_border1 = get("MovingWindowBorder1"); |     DO_COLOR(InactiveWindowBorder1); | ||||||
|     data->moving_window_border2 = get("MovingWindowBorder2"); |     DO_COLOR(InactiveWindowBorder2); | ||||||
|     data->moving_window_title = get("MovingWindowTitle"); |     DO_COLOR(InactiveWindowTitle); | ||||||
|     data->highlight_window_border1 = get("HighlightWindowBorder1"); |     DO_COLOR(MovingWindowBorder1); | ||||||
|     data->highlight_window_border2 = get("HighlightWindowBorder2"); |     DO_COLOR(MovingWindowBorder2); | ||||||
|     data->highlight_window_title = get("HighlightWindowTitle"); |     DO_COLOR(MovingWindowTitle); | ||||||
|     data->menu_stripe = get("MenuStripe"); |     DO_COLOR(HighlightWindowBorder1); | ||||||
|     data->menu_base = get("MenuBase"); |     DO_COLOR(HighlightWindowBorder2); | ||||||
|     data->menu_selection = get("MenuSelection"); |     DO_COLOR(HighlightWindowTitle); | ||||||
|  |     DO_COLOR(MenuStripe); | ||||||
|  |     DO_COLOR(MenuBase); | ||||||
|  |     DO_COLOR(MenuSelection); | ||||||
| 
 | 
 | ||||||
|     buffer->seal(); |     buffer->seal(); | ||||||
|     buffer->share_globally(); |     buffer->share_globally(); | ||||||
|  |  | ||||||
|  | @ -4,43 +4,43 @@ | ||||||
| #include <LibC/SharedBuffer.h> | #include <LibC/SharedBuffer.h> | ||||||
| #include <LibDraw/Color.h> | #include <LibDraw/Color.h> | ||||||
| 
 | 
 | ||||||
|  | enum class ColorRole { | ||||||
|  |     NoRole, | ||||||
|  |     DesktopBackground, | ||||||
|  |     ActiveWindowBorder1, | ||||||
|  |     ActiveWindowBorder2, | ||||||
|  |     ActiveWindowTitle, | ||||||
|  |     InactiveWindowBorder1, | ||||||
|  |     InactiveWindowBorder2, | ||||||
|  |     InactiveWindowTitle, | ||||||
|  |     MovingWindowBorder1, | ||||||
|  |     MovingWindowBorder2, | ||||||
|  |     MovingWindowTitle, | ||||||
|  |     HighlightWindowBorder1, | ||||||
|  |     HighlightWindowBorder2, | ||||||
|  |     HighlightWindowTitle, | ||||||
|  |     MenuStripe, | ||||||
|  |     MenuBase, | ||||||
|  |     MenuSelection, | ||||||
|  |     Window, | ||||||
|  |     WindowText, | ||||||
|  |     Button, | ||||||
|  |     ButtonText, | ||||||
|  |     Base, | ||||||
|  |     ThreedHighlight, | ||||||
|  |     ThreedShadow1, | ||||||
|  |     ThreedShadow2, | ||||||
|  |     HoverHighlight, | ||||||
|  |     Selection, | ||||||
|  |     SelectionText, | ||||||
|  | 
 | ||||||
|  |     __Count, | ||||||
|  | 
 | ||||||
|  |     DisabledText = ThreedShadow1, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| struct SystemTheme { | struct SystemTheme { | ||||||
|     Color desktop_background; |     Color color[(int)ColorRole::__Count]; | ||||||
| 
 |  | ||||||
|     Color active_window_border1; |  | ||||||
|     Color active_window_border2; |  | ||||||
|     Color active_window_title; |  | ||||||
| 
 |  | ||||||
|     Color inactive_window_border1; |  | ||||||
|     Color inactive_window_border2; |  | ||||||
|     Color inactive_window_title; |  | ||||||
| 
 |  | ||||||
|     Color moving_window_border1; |  | ||||||
|     Color moving_window_border2; |  | ||||||
|     Color moving_window_title; |  | ||||||
| 
 |  | ||||||
|     Color highlight_window_border1; |  | ||||||
|     Color highlight_window_border2; |  | ||||||
|     Color highlight_window_title; |  | ||||||
| 
 |  | ||||||
|     Color menu_stripe; |  | ||||||
|     Color menu_base; |  | ||||||
|     Color menu_selection; |  | ||||||
| 
 |  | ||||||
|     Color window; |  | ||||||
|     Color window_text; |  | ||||||
|     Color base; |  | ||||||
|     Color button; |  | ||||||
|     Color button_text; |  | ||||||
| 
 |  | ||||||
|     Color threed_highlight; |  | ||||||
|     Color threed_shadow1; |  | ||||||
|     Color threed_shadow2; |  | ||||||
| 
 |  | ||||||
|     Color hover_highlight; |  | ||||||
| 
 |  | ||||||
|     Color selection; |  | ||||||
|     Color selection_text; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const SystemTheme& current_system_theme(); | const SystemTheme& current_system_theme(); | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAbstractButton.h> | #include <LibGUI/GAbstractButton.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| 
 | 
 | ||||||
|  | @ -154,7 +155,7 @@ void GAbstractButton::paint_text(GPainter& painter, const Rect& rect, const Font | ||||||
| 
 | 
 | ||||||
|     if (text().is_empty()) |     if (text().is_empty()) | ||||||
|         return; |         return; | ||||||
|     painter.draw_text(clipped_rect, text(), font, text_alignment, SystemColor::ButtonText, TextElision::Right); |     painter.draw_text(clipped_rect, text(), font, text_alignment, palette().button_text(), TextElision::Right); | ||||||
|     if (is_focused()) |     if (is_focused()) | ||||||
|         painter.draw_rect(clipped_rect.inflated(6, 4), Color(140, 140, 140)); |         painter.draw_rect(clipped_rect.inflated(6, 4), Color(140, 140, 140)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAbstractColumnView.h> | #include <LibGUI/GAbstractColumnView.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GMenu.h> | #include <LibGUI/GMenu.h> | ||||||
|  | @ -99,9 +100,9 @@ void GAbstractColumnView::paint_headers(GPainter& painter) | ||||||
|     if (!headers_visible()) |     if (!headers_visible()) | ||||||
|         return; |         return; | ||||||
|     int exposed_width = max(content_size().width(), width()); |     int exposed_width = max(content_size().width(), width()); | ||||||
|     painter.fill_rect({ 0, 0, exposed_width, header_height() }, SystemColor::Window); |     painter.fill_rect({ 0, 0, exposed_width, header_height() }, palette().button()); | ||||||
|     painter.draw_line({ 0, 0 }, { exposed_width - 1, 0 }, SystemColor::ThreedHighlight); |     painter.draw_line({ 0, 0 }, { exposed_width - 1, 0 }, palette().threed_highlight()); | ||||||
|     painter.draw_line({ 0, header_height() - 1 }, { exposed_width - 1, header_height() - 1 }, SystemColor::ThreedShadow1); |     painter.draw_line({ 0, header_height() - 1 }, { exposed_width - 1, header_height() - 1 }, palette().threed_shadow1()); | ||||||
|     int x_offset = 0; |     int x_offset = 0; | ||||||
|     int column_count = model()->column_count(); |     int column_count = model()->column_count(); | ||||||
|     for (int column_index = 0; column_index < column_count; ++column_index) { |     for (int column_index = 0; column_index < column_count; ++column_index) { | ||||||
|  | @ -112,7 +113,7 @@ void GAbstractColumnView::paint_headers(GPainter& painter) | ||||||
|         Rect cell_rect(x_offset, 0, column_width + horizontal_padding() * 2, header_height()); |         Rect cell_rect(x_offset, 0, column_width + horizontal_padding() * 2, header_height()); | ||||||
|         bool pressed = column_index == m_pressed_column_header_index && m_pressed_column_header_is_pressed; |         bool pressed = column_index == m_pressed_column_header_index && m_pressed_column_header_is_pressed; | ||||||
|         bool hovered = column_index == m_hovered_column_header_index && model()->column_metadata(column_index).sortable == GModel::ColumnMetadata::Sortable::True; |         bool hovered = column_index == m_hovered_column_header_index && model()->column_metadata(column_index).sortable == GModel::ColumnMetadata::Sortable::True; | ||||||
|         StylePainter::paint_button(painter, cell_rect, ButtonStyle::Normal, pressed, hovered); |         StylePainter::paint_button(painter, cell_rect, palette(), ButtonStyle::Normal, pressed, hovered); | ||||||
|         String text; |         String text; | ||||||
|         if (is_key_column) { |         if (is_key_column) { | ||||||
|             StringBuilder builder; |             StringBuilder builder; | ||||||
|  | @ -129,7 +130,7 @@ void GAbstractColumnView::paint_headers(GPainter& painter) | ||||||
|         auto text_rect = cell_rect.translated(horizontal_padding(), 0); |         auto text_rect = cell_rect.translated(horizontal_padding(), 0); | ||||||
|         if (pressed) |         if (pressed) | ||||||
|             text_rect.move_by(1, 1); |             text_rect.move_by(1, 1); | ||||||
|         painter.draw_text(text_rect, text, header_font(), TextAlignment::CenterLeft, SystemColor::ButtonText); |         painter.draw_text(text_rect, text, header_font(), TextAlignment::CenterLeft, palette().button_text()); | ||||||
|         x_offset += column_width + horizontal_padding() * 2; |         x_offset += column_width + horizontal_padding() * 2; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ class GTableCellPaintingDelegate { | ||||||
| public: | public: | ||||||
|     virtual ~GTableCellPaintingDelegate() {} |     virtual ~GTableCellPaintingDelegate() {} | ||||||
| 
 | 
 | ||||||
|     virtual void paint(GPainter&, const Rect&, const GModel&, const GModelIndex&) = 0; |     virtual void paint(GPainter&, const Rect&, const Palette&, const GModel&, const GModelIndex&) = 0; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class GAbstractColumnView : public GAbstractView { | class GAbstractColumnView : public GAbstractView { | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GApplication.h> | #include <LibGUI/GApplication.h> | ||||||
| #include <LibGUI/GDesktop.h> | #include <LibGUI/GDesktop.h> | ||||||
|  | @ -142,3 +143,19 @@ void GApplication::did_delete_last_window(Badge<GWindow>) | ||||||
|     if (m_quit_when_last_window_deleted) |     if (m_quit_when_last_window_deleted) | ||||||
|         m_event_loop->quit(0); |         m_event_loop->quit(0); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void GApplication::set_system_palette(SharedBuffer& buffer) | ||||||
|  | { | ||||||
|  |     if (!m_system_palette) | ||||||
|  |         m_system_palette = Palette::create_with_shared_buffer(buffer); | ||||||
|  |     else | ||||||
|  |         m_system_palette->replace_internal_buffer({}, buffer); | ||||||
|  | 
 | ||||||
|  |     if (!m_palette) | ||||||
|  |         m_palette = m_system_palette; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GApplication::set_palette(const Palette& palette) | ||||||
|  | { | ||||||
|  |     m_palette = palette; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -10,7 +10,10 @@ class GAction; | ||||||
| class GKeyEvent; | class GKeyEvent; | ||||||
| class GMenuBar; | class GMenuBar; | ||||||
| class GWindow; | class GWindow; | ||||||
|  | class GWindowServerConnection; | ||||||
|  | class Palette; | ||||||
| class Point; | class Point; | ||||||
|  | class SharedBuffer; | ||||||
| 
 | 
 | ||||||
| class GApplication { | class GApplication { | ||||||
| public: | public: | ||||||
|  | @ -39,9 +42,16 @@ public: | ||||||
|     const String& invoked_as() const { return m_invoked_as; } |     const String& invoked_as() const { return m_invoked_as; } | ||||||
|     const Vector<String>& args() const { return m_args; } |     const Vector<String>& args() const { return m_args; } | ||||||
| 
 | 
 | ||||||
|  |     const Palette& palette() const { return *m_palette; } | ||||||
|  |     void set_palette(const Palette&); | ||||||
|  | 
 | ||||||
|  |     void set_system_palette(SharedBuffer&); | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     OwnPtr<CEventLoop> m_event_loop; |     OwnPtr<CEventLoop> m_event_loop; | ||||||
|     OwnPtr<GMenuBar> m_menubar; |     OwnPtr<GMenuBar> m_menubar; | ||||||
|  |     RefPtr<Palette> m_palette; | ||||||
|  |     RefPtr<Palette> m_system_palette; | ||||||
|     HashMap<GShortcut, GAction*> m_global_shortcut_actions; |     HashMap<GShortcut, GAction*> m_global_shortcut_actions; | ||||||
|     class TooltipWindow; |     class TooltipWindow; | ||||||
|     TooltipWindow* m_tooltip_window { nullptr }; |     TooltipWindow* m_tooltip_window { nullptr }; | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ void GButton::paint_event(GPaintEvent& event) | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
| 
 | 
 | ||||||
|     StylePainter::paint_button(painter, rect(), m_button_style, is_being_pressed(), is_hovered(), is_checked(), is_enabled()); |     StylePainter::paint_button(painter, rect(), palette(), m_button_style, is_being_pressed(), is_hovered(), is_checked(), is_enabled()); | ||||||
| 
 | 
 | ||||||
|     if (text().is_empty() && !m_icon) |     if (text().is_empty() && !m_icon) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|  | @ -1,8 +1,9 @@ | ||||||
| #include <Kernel/KeyCode.h> | #include <Kernel/KeyCode.h> | ||||||
|  | #include <LibDraw/CharacterBitmap.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
|  | #include <LibDraw/StylePainter.h> | ||||||
| #include <LibGUI/GCheckBox.h> | #include <LibGUI/GCheckBox.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| #include <LibDraw/CharacterBitmap.h> |  | ||||||
| #include <LibDraw/StylePainter.h> |  | ||||||
| 
 | 
 | ||||||
| static const char* s_checked_bitmap_data = { | static const char* s_checked_bitmap_data = { | ||||||
|     "         " |     "         " | ||||||
|  | @ -48,14 +49,14 @@ void GCheckBox::paint_event(GPaintEvent& event) | ||||||
|     text_rect.set_height(font().glyph_height()); |     text_rect.set_height(font().glyph_height()); | ||||||
| 
 | 
 | ||||||
|     if (fill_with_background_color()) |     if (fill_with_background_color()) | ||||||
|         painter.fill_rect(rect(), background_color()); |         painter.fill_rect(rect(), palette().window()); | ||||||
| 
 | 
 | ||||||
|     Rect box_rect { |     Rect box_rect { | ||||||
|         0, height() / 2 - s_box_height / 2 - 1, |         0, height() / 2 - s_box_height / 2 - 1, | ||||||
|         s_box_width, s_box_height |         s_box_width, s_box_height | ||||||
|     }; |     }; | ||||||
|     painter.fill_rect(box_rect, SystemColor::Base); |     painter.fill_rect(box_rect, palette().base()); | ||||||
|     StylePainter::paint_frame(painter, box_rect, FrameShape::Container, FrameShadow::Sunken, 2); |     StylePainter::paint_frame(painter, box_rect, palette(), FrameShape::Container, FrameShadow::Sunken, 2); | ||||||
| 
 | 
 | ||||||
|     if (is_being_pressed()) |     if (is_being_pressed()) | ||||||
|         painter.draw_rect(box_rect.shrunken(4, 4), Color::MidGray); |         painter.draw_rect(box_rect.shrunken(4, 4), Color::MidGray); | ||||||
|  | @ -63,7 +64,7 @@ void GCheckBox::paint_event(GPaintEvent& event) | ||||||
|     if (is_checked()) { |     if (is_checked()) { | ||||||
|         if (!s_checked_bitmap) |         if (!s_checked_bitmap) | ||||||
|             s_checked_bitmap = &CharacterBitmap::create_from_ascii(s_checked_bitmap_data, s_checked_bitmap_width, s_checked_bitmap_height).leak_ref(); |             s_checked_bitmap = &CharacterBitmap::create_from_ascii(s_checked_bitmap_data, s_checked_bitmap_width, s_checked_bitmap_height).leak_ref(); | ||||||
|         painter.draw_bitmap(box_rect.shrunken(4, 4).location(), *s_checked_bitmap, SystemColor::ButtonText); |         painter.draw_bitmap(box_rect.shrunken(4, 4).location(), *s_checked_bitmap, palette().button_text()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     paint_text(painter, text_rect, font(), TextAlignment::TopLeft); |     paint_text(painter, text_rect, font(), TextAlignment::TopLeft); | ||||||
|  |  | ||||||
|  | @ -58,7 +58,6 @@ GFilePicker::GFilePicker(Mode mode, const StringView& file_name, const StringVie | ||||||
|     horizontal_container->set_layout(make<GBoxLayout>(Orientation::Horizontal)); |     horizontal_container->set_layout(make<GBoxLayout>(Orientation::Horizontal)); | ||||||
|     horizontal_container->layout()->set_margins({ 4, 4, 4, 4 }); |     horizontal_container->layout()->set_margins({ 4, 4, 4, 4 }); | ||||||
|     horizontal_container->set_fill_with_background_color(true); |     horizontal_container->set_fill_with_background_color(true); | ||||||
|     horizontal_container->set_background_color(SystemColor::Window); |  | ||||||
| 
 | 
 | ||||||
|     auto vertical_container = GWidget::construct(horizontal_container.ptr()); |     auto vertical_container = GWidget::construct(horizontal_container.ptr()); | ||||||
|     vertical_container->set_layout(make<GBoxLayout>(Orientation::Vertical)); |     vertical_container->set_layout(make<GBoxLayout>(Orientation::Vertical)); | ||||||
|  |  | ||||||
|  | @ -18,5 +18,5 @@ void GFrame::paint_event(GPaintEvent& event) | ||||||
| 
 | 
 | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
|     StylePainter::paint_frame(painter, rect(), m_shape, m_shadow, m_thickness, spans_entire_window_horizontally()); |     StylePainter::paint_frame(painter, rect(), palette(), m_shape, m_shadow, m_thickness, spans_entire_window_horizontally()); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
|  | #include <LibDraw/StylePainter.h> | ||||||
| #include <LibGUI/GGroupBox.h> | #include <LibGUI/GGroupBox.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| #include <LibDraw/StylePainter.h> |  | ||||||
| 
 | 
 | ||||||
| GGroupBox::GGroupBox(GWidget* parent) | GGroupBox::GGroupBox(GWidget* parent) | ||||||
|     : GGroupBox({}, parent) |     : GGroupBox({}, parent) | ||||||
|  | @ -11,8 +12,6 @@ GGroupBox::GGroupBox(const StringView& title, GWidget* parent) | ||||||
|     : GWidget(parent) |     : GWidget(parent) | ||||||
|     , m_title(title) |     , m_title(title) | ||||||
| { | { | ||||||
|     set_fill_with_background_color(true); |  | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GGroupBox::~GGroupBox() | GGroupBox::~GGroupBox() | ||||||
|  | @ -28,11 +27,11 @@ void GGroupBox::paint_event(GPaintEvent& event) | ||||||
|         0, font().glyph_height() / 2, |         0, font().glyph_height() / 2, | ||||||
|         width(), height() - font().glyph_height() / 2 |         width(), height() - font().glyph_height() / 2 | ||||||
|     }; |     }; | ||||||
|     StylePainter::paint_frame(painter, frame_rect, FrameShape::Box, FrameShadow::Sunken, 2); |     StylePainter::paint_frame(painter, frame_rect, palette(), FrameShape::Box, FrameShadow::Sunken, 2); | ||||||
| 
 | 
 | ||||||
|     Rect text_rect { 4, 0, font().width(m_title) + 6, font().glyph_height() }; |     Rect text_rect { 4, 0, font().width(m_title) + 6, font().glyph_height() }; | ||||||
|     painter.fill_rect(text_rect, background_color()); |     painter.fill_rect(text_rect, palette().button()); | ||||||
|     painter.draw_text(text_rect, m_title, TextAlignment::Center, foreground_color()); |     painter.draw_text(text_rect, m_title, TextAlignment::Center, palette().button_text()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GGroupBox::set_title(const StringView& title) | void GGroupBox::set_title(const StringView& title) | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <Kernel/KeyCode.h> | #include <Kernel/KeyCode.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GDragOperation.h> | #include <LibGUI/GDragOperation.h> | ||||||
| #include <LibGUI/GItemView.h> | #include <LibGUI/GItemView.h> | ||||||
| #include <LibGUI/GModel.h> | #include <LibGUI/GModel.h> | ||||||
|  | @ -186,12 +187,13 @@ void GItemView::doubleclick_event(GMouseEvent& event) | ||||||
| 
 | 
 | ||||||
| void GItemView::paint_event(GPaintEvent& event) | void GItemView::paint_event(GPaintEvent& event) | ||||||
| { | { | ||||||
|  |     Color widget_background_color = palette().color(background_role()); | ||||||
|     GFrame::paint_event(event); |     GFrame::paint_event(event); | ||||||
| 
 | 
 | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(widget_inner_rect()); |     painter.add_clip_rect(widget_inner_rect()); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
|     painter.fill_rect(event.rect(), SystemColor::Base); |     painter.fill_rect(event.rect(), widget_background_color); | ||||||
|     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); |     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); | ||||||
| 
 | 
 | ||||||
|     auto column_metadata = model()->column_metadata(m_model_column); |     auto column_metadata = model()->column_metadata(m_model_column); | ||||||
|  | @ -201,9 +203,9 @@ void GItemView::paint_event(GPaintEvent& event) | ||||||
|         bool is_selected_item = selection().contains(model()->index(item_index, m_model_column)); |         bool is_selected_item = selection().contains(model()->index(item_index, m_model_column)); | ||||||
|         Color background_color; |         Color background_color; | ||||||
|         if (is_selected_item) { |         if (is_selected_item) { | ||||||
|             background_color = is_focused() ? Color(SystemColor::Selection) : Color::from_rgb(0x606060); |             background_color = is_focused() ? palette().selection() : Color::from_rgb(0x606060); | ||||||
|         } else { |         } else { | ||||||
|             background_color = SystemColor::Base; |             background_color = widget_background_color; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Rect item_rect = this->item_rect(item_index); |         Rect item_rect = this->item_rect(item_index); | ||||||
|  | @ -228,9 +230,9 @@ void GItemView::paint_event(GPaintEvent& event) | ||||||
| 
 | 
 | ||||||
|         Color text_color; |         Color text_color; | ||||||
|         if (is_selected_item) |         if (is_selected_item) | ||||||
|             text_color = SystemColor::SelectionText; |             text_color = palette().selection_text(); | ||||||
|         else |         else | ||||||
|             text_color = model()->data(model_index, GModel::Role::ForegroundColor).to_color(SystemColor::WindowText); |             text_color = model()->data(model_index, GModel::Role::ForegroundColor).to_color(palette().color(foreground_role())); | ||||||
|         painter.fill_rect(text_rect, background_color); |         painter.fill_rect(text_rect, background_color); | ||||||
|         painter.draw_text(text_rect, item_text.to_string(), font, TextAlignment::Center, text_color, TextElision::Right); |         painter.draw_text(text_rect, item_text.to_string(), font, TextAlignment::Center, text_color, TextElision::Right); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| #include "GLabel.h" |  | ||||||
| #include <LibGUI/GPainter.h> |  | ||||||
| #include <LibDraw/GraphicsBitmap.h> | #include <LibDraw/GraphicsBitmap.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
|  | #include <LibGUI/GLabel.h> | ||||||
|  | #include <LibGUI/GPainter.h> | ||||||
| 
 | 
 | ||||||
| GLabel::GLabel(GWidget* parent) | GLabel::GLabel(GWidget* parent) | ||||||
|     : GFrame(parent) |     : GFrame(parent) | ||||||
|  | @ -58,7 +59,7 @@ void GLabel::paint_event(GPaintEvent& event) | ||||||
|     text_rect.set_width(text_rect.width() - indent * 2); |     text_rect.set_width(text_rect.width() - indent * 2); | ||||||
| 
 | 
 | ||||||
|     if (is_enabled()) { |     if (is_enabled()) { | ||||||
|         painter.draw_text(text_rect, text(), m_text_alignment, foreground_color(), TextElision::Right); |         painter.draw_text(text_rect, text(), m_text_alignment, palette().window_text(), TextElision::Right); | ||||||
|     } else { |     } else { | ||||||
|         painter.draw_text(text_rect.translated(1, 1), text(), font(), text_alignment(), Color::White, TextElision::Right); |         painter.draw_text(text_rect.translated(1, 1), text(), font(), text_alignment(), Color::White, TextElision::Right); | ||||||
|         painter.draw_text(text_rect, text(), font(), text_alignment(), Color::from_rgb(0x808080), TextElision::Right); |         painter.draw_text(text_rect, text(), font(), text_alignment(), Color::from_rgb(0x808080), TextElision::Right); | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| #include <Kernel/KeyCode.h> | #include <Kernel/KeyCode.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GListView.h> | #include <LibGUI/GListView.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| #include <LibGUI/GScrollBar.h> | #include <LibGUI/GScrollBar.h> | ||||||
|  | @ -6,6 +7,7 @@ | ||||||
| GListView::GListView(GWidget* parent) | GListView::GListView(GWidget* parent) | ||||||
|     : GAbstractView(parent) |     : GAbstractView(parent) | ||||||
| { | { | ||||||
|  |     set_background_role(ColorRole::Base); | ||||||
|     set_frame_shape(FrameShape::Container); |     set_frame_shape(FrameShape::Container); | ||||||
|     set_frame_shadow(FrameShadow::Sunken); |     set_frame_shadow(FrameShadow::Sunken); | ||||||
|     set_frame_thickness(2); |     set_frame_thickness(2); | ||||||
|  | @ -104,12 +106,12 @@ void GListView::paint_event(GPaintEvent& event) | ||||||
| 
 | 
 | ||||||
|         Color background_color; |         Color background_color; | ||||||
|         if (is_selected_row) { |         if (is_selected_row) { | ||||||
|             background_color = is_focused() ? Color(SystemColor::SelectionText) : Color::from_rgb(0x606060); |             background_color = is_focused() ? palette().selection_text() : Color::from_rgb(0x606060); | ||||||
|         } else { |         } else { | ||||||
|             if (alternating_row_colors() && (painted_item_index % 2)) |             if (alternating_row_colors() && (painted_item_index % 2)) | ||||||
|                 background_color = Color(210, 210, 210); |                 background_color = Color(210, 210, 210); | ||||||
|             else |             else | ||||||
|                 background_color = SystemColor::Base; |                 background_color = palette().color(background_role()); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         auto column_metadata = model()->column_metadata(m_model_column); |         auto column_metadata = model()->column_metadata(m_model_column); | ||||||
|  | @ -129,7 +131,7 @@ void GListView::paint_event(GPaintEvent& event) | ||||||
|             if (is_selected_row) |             if (is_selected_row) | ||||||
|                 text_color = Color::White; |                 text_color = Color::White; | ||||||
|             else |             else | ||||||
|                 text_color = model()->data(index, GModel::Role::ForegroundColor).to_color(SystemColor::WindowText); |                 text_color = model()->data(index, GModel::Role::ForegroundColor).to_color(palette().color(foreground_role())); | ||||||
|             auto text_rect = row_rect; |             auto text_rect = row_rect; | ||||||
|             text_rect.move_by(horizontal_padding(), 0); |             text_rect.move_by(horizontal_padding(), 0); | ||||||
|             text_rect.set_width(text_rect.width() - horizontal_padding() * 2); |             text_rect.set_width(text_rect.width() - horizontal_padding() * 2); | ||||||
|  | @ -140,7 +142,7 @@ void GListView::paint_event(GPaintEvent& event) | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     Rect unpainted_rect(0, painted_item_index * item_height(), exposed_width, height()); |     Rect unpainted_rect(0, painted_item_index * item_height(), exposed_width, height()); | ||||||
|     painter.fill_rect(unpainted_rect, SystemColor::Base); |     painter.fill_rect(unpainted_rect, palette().color(background_role())); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int GListView::item_count() const | int GListView::item_count() const | ||||||
|  |  | ||||||
|  | @ -58,5 +58,5 @@ void GProgressBar::paint_event(GPaintEvent& event) | ||||||
|         progress_text = builder.to_string(); |         progress_text = builder.to_string(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     StylePainter::paint_progress_bar(painter, rect, m_min, m_max, m_value, progress_text); |     StylePainter::paint_progress_bar(painter, rect, palette(), m_min, m_max, m_value, progress_text); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,11 +1,13 @@ | ||||||
|  | #include <LibDraw/GraphicsBitmap.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| #include <LibGUI/GResizeCorner.h> | #include <LibGUI/GResizeCorner.h> | ||||||
| #include <LibGUI/GWindow.h> | #include <LibGUI/GWindow.h> | ||||||
| #include <LibDraw/GraphicsBitmap.h> |  | ||||||
| 
 | 
 | ||||||
| GResizeCorner::GResizeCorner(GWidget* parent) | GResizeCorner::GResizeCorner(GWidget* parent) | ||||||
|     : GWidget(parent) |     : GWidget(parent) | ||||||
| { | { | ||||||
|  |     set_background_role(ColorRole::Button); | ||||||
|     set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed); |     set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed); | ||||||
|     set_preferred_size(16, 16); |     set_preferred_size(16, 16); | ||||||
|     m_bitmap = GraphicsBitmap::load_from_file("/res/icons/resize-corner.png"); |     m_bitmap = GraphicsBitmap::load_from_file("/res/icons/resize-corner.png"); | ||||||
|  | @ -20,7 +22,7 @@ void GResizeCorner::paint_event(GPaintEvent& event) | ||||||
| { | { | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
|     painter.fill_rect(rect(), SystemColor::Button); |     painter.fill_rect(rect(), palette().color(background_role())); | ||||||
|     painter.blit({ 0, 0 }, *m_bitmap, m_bitmap->rect()); |     painter.blit({ 0, 0 }, *m_bitmap, m_bitmap->rect()); | ||||||
|     GWidget::paint_event(event); |     GWidget::paint_event(event); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #include <LibDraw/CharacterBitmap.h> | #include <LibDraw/CharacterBitmap.h> | ||||||
| #include <LibDraw/GraphicsBitmap.h> | #include <LibDraw/GraphicsBitmap.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibDraw/StylePainter.h> | #include <LibDraw/StylePainter.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| #include <LibGUI/GScrollBar.h> | #include <LibGUI/GScrollBar.h> | ||||||
|  | @ -203,18 +204,18 @@ void GScrollBar::paint_event(GPaintEvent& event) | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
| 
 | 
 | ||||||
|     painter.fill_rect(rect(), Color(SystemColor::Button).lightened()); |     painter.fill_rect(rect(), palette().button().lightened()); | ||||||
| 
 | 
 | ||||||
|     StylePainter::paint_button(painter, decrement_button_rect(), ButtonStyle::Normal, false, m_hovered_component == Component::DecrementButton); |     StylePainter::paint_button(painter, decrement_button_rect(), palette(), ButtonStyle::Normal, false, m_hovered_component == Component::DecrementButton); | ||||||
|     StylePainter::paint_button(painter, increment_button_rect(), ButtonStyle::Normal, false, m_hovered_component == Component::IncrementButton); |     StylePainter::paint_button(painter, increment_button_rect(), palette(), ButtonStyle::Normal, false, m_hovered_component == Component::IncrementButton); | ||||||
| 
 | 
 | ||||||
|     if (length(orientation()) > default_button_size()) { |     if (length(orientation()) > default_button_size()) { | ||||||
|         painter.draw_bitmap(decrement_button_rect().location().translated(3, 3), orientation() == Orientation::Vertical ? *s_up_arrow_bitmap : *s_left_arrow_bitmap, has_scrubber() ? SystemColor::ButtonText : SystemColor::DisabledText); |         painter.draw_bitmap(decrement_button_rect().location().translated(3, 3), orientation() == Orientation::Vertical ? *s_up_arrow_bitmap : *s_left_arrow_bitmap, has_scrubber() ? palette().button_text() : palette().threed_shadow1()); | ||||||
|         painter.draw_bitmap(increment_button_rect().location().translated(3, 3), orientation() == Orientation::Vertical ? *s_down_arrow_bitmap : *s_right_arrow_bitmap, has_scrubber() ? SystemColor::ButtonText : SystemColor::DisabledText); |         painter.draw_bitmap(increment_button_rect().location().translated(3, 3), orientation() == Orientation::Vertical ? *s_down_arrow_bitmap : *s_right_arrow_bitmap, has_scrubber() ? palette().button_text() : palette().threed_shadow1()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (has_scrubber()) |     if (has_scrubber()) | ||||||
|         StylePainter::paint_button(painter, scrubber_rect(), ButtonStyle::Normal, false, m_hovered_component == Component::Scrubber || m_scrubber_in_use); |         StylePainter::paint_button(painter, scrubber_rect(), palette(), ButtonStyle::Normal, false, m_hovered_component == Component::Scrubber || m_scrubber_in_use); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GScrollBar::on_automatic_scrolling_timer_fired() | void GScrollBar::on_automatic_scrolling_timer_fired() | ||||||
|  |  | ||||||
|  | @ -62,8 +62,8 @@ void GSlider::paint_event(GPaintEvent& event) | ||||||
|         track_rect.center_horizontally_within(inner_rect()); |         track_rect.center_horizontally_within(inner_rect()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     StylePainter::paint_frame(painter, track_rect, FrameShape::Panel, FrameShadow::Sunken, 1); |     StylePainter::paint_frame(painter, track_rect, palette(), FrameShape::Panel, FrameShadow::Sunken, 1); | ||||||
|     StylePainter::paint_button(painter, knob_rect(), ButtonStyle::Normal, false, m_knob_hovered); |     StylePainter::paint_button(painter, knob_rect(), palette(), ButtonStyle::Normal, false, m_knob_hovered); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Rect GSlider::knob_rect() const | Rect GSlider::knob_rect() const | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GBoxLayout.h> | #include <LibGUI/GBoxLayout.h> | ||||||
| #include <LibGUI/GSplitter.h> | #include <LibGUI/GSplitter.h> | ||||||
| #include <LibGUI/GWindow.h> | #include <LibGUI/GWindow.h> | ||||||
|  | @ -6,9 +7,9 @@ GSplitter::GSplitter(Orientation orientation, GWidget* parent) | ||||||
|     : GFrame(parent) |     : GFrame(parent) | ||||||
|     , m_orientation(orientation) |     , m_orientation(orientation) | ||||||
| { | { | ||||||
|  |     set_background_role(ColorRole::Button); | ||||||
|     set_layout(make<GBoxLayout>(orientation)); |     set_layout(make<GBoxLayout>(orientation)); | ||||||
|     set_fill_with_background_color(true); |     set_fill_with_background_color(true); | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
|     layout()->set_spacing(3); |     layout()->set_spacing(3); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -18,14 +19,14 @@ GSplitter::~GSplitter() | ||||||
| 
 | 
 | ||||||
| void GSplitter::enter_event(CEvent&) | void GSplitter::enter_event(CEvent&) | ||||||
| { | { | ||||||
|     set_background_color(StylePainter::hover_highlight_color()); |     set_background_role(ColorRole::HoverHighlight); | ||||||
|     window()->set_override_cursor(m_orientation == Orientation::Horizontal ? GStandardCursor::ResizeHorizontal : GStandardCursor::ResizeVertical); |     window()->set_override_cursor(m_orientation == Orientation::Horizontal ? GStandardCursor::ResizeHorizontal : GStandardCursor::ResizeVertical); | ||||||
|     update(); |     update(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GSplitter::leave_event(CEvent&) | void GSplitter::leave_event(CEvent&) | ||||||
| { | { | ||||||
|     set_background_color(SystemColor::Window); |     set_background_role(ColorRole::Button); | ||||||
|     if (!m_resizing) |     if (!m_resizing) | ||||||
|         window()->set_override_cursor(GStandardCursor::None); |         window()->set_override_cursor(GStandardCursor::None); | ||||||
|     update(); |     update(); | ||||||
|  |  | ||||||
|  | @ -66,5 +66,5 @@ void GStatusBar::paint_event(GPaintEvent& event) | ||||||
| { | { | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
|     StylePainter::paint_surface(painter, rect(), !spans_entire_window_horizontally()); |     StylePainter::paint_surface(painter, rect(), palette(), !spans_entire_window_horizontally()); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibDraw/StylePainter.h> | #include <LibDraw/StylePainter.h> | ||||||
| #include <LibGUI/GBoxLayout.h> | #include <LibGUI/GBoxLayout.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
|  | @ -6,8 +7,6 @@ | ||||||
| GTabWidget::GTabWidget(GWidget* parent) | GTabWidget::GTabWidget(GWidget* parent) | ||||||
|     : GWidget(parent) |     : GWidget(parent) | ||||||
| { | { | ||||||
|     set_fill_with_background_color(true); |  | ||||||
|     set_background_color(SystemColor::Window); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GTabWidget::~GTabWidget() | GTabWidget::~GTabWidget() | ||||||
|  | @ -112,19 +111,19 @@ void GTabWidget::paint_event(GPaintEvent& event) | ||||||
|     auto container_rect = this->container_rect(); |     auto container_rect = this->container_rect(); | ||||||
|     auto padding_rect = container_rect; |     auto padding_rect = container_rect; | ||||||
|     for (int i = 0; i < container_padding(); ++i) { |     for (int i = 0; i < container_padding(); ++i) { | ||||||
|         painter.draw_rect(padding_rect, background_color()); |         painter.draw_rect(padding_rect, palette().button()); | ||||||
|         padding_rect.shrink(2, 2); |         padding_rect.shrink(2, 2); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     StylePainter::paint_frame(painter, container_rect, FrameShape::Container, FrameShadow::Raised, 2); |     StylePainter::paint_frame(painter, container_rect, palette(), FrameShape::Container, FrameShadow::Raised, 2); | ||||||
| 
 | 
 | ||||||
|     for (int i = 0; i < m_tabs.size(); ++i) { |     for (int 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); | ||||||
|         StylePainter::paint_tab_button(painter, button_rect, false, hovered, m_tabs[i].widget->is_enabled()); |         StylePainter::paint_tab_button(painter, button_rect, palette(), false, hovered, m_tabs[i].widget->is_enabled()); | ||||||
|         painter.draw_text(button_rect.translated(0, 1), m_tabs[i].title, TextAlignment::Center, SystemColor::ButtonText); |         painter.draw_text(button_rect.translated(0, 1), m_tabs[i].title, TextAlignment::Center, palette().button_text()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     for (int i = 0; i < m_tabs.size(); ++i) { |     for (int i = 0; i < m_tabs.size(); ++i) { | ||||||
|  | @ -132,9 +131,9 @@ void GTabWidget::paint_event(GPaintEvent& event) | ||||||
|             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); | ||||||
|         StylePainter::paint_tab_button(painter, button_rect, true, hovered, m_tabs[i].widget->is_enabled()); |         StylePainter::paint_tab_button(painter, button_rect, palette(), true, hovered, m_tabs[i].widget->is_enabled()); | ||||||
|         painter.draw_text(button_rect.translated(0, 1), m_tabs[i].title, TextAlignment::Center, SystemColor::ButtonText); |         painter.draw_text(button_rect.translated(0, 1), m_tabs[i].title, TextAlignment::Center, palette().button_text()); | ||||||
|         painter.draw_line(button_rect.bottom_left().translated(1, 1), button_rect.bottom_right().translated(-1, 1), SystemColor::Button); |         painter.draw_line(button_rect.bottom_left().translated(1, 1), button_rect.bottom_right().translated(-1, 1), palette().button()); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <Kernel/KeyCode.h> | #include <Kernel/KeyCode.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GMenu.h> | #include <LibGUI/GMenu.h> | ||||||
| #include <LibGUI/GModel.h> | #include <LibGUI/GModel.h> | ||||||
|  | @ -12,6 +13,7 @@ | ||||||
| GTableView::GTableView(GWidget* parent) | GTableView::GTableView(GWidget* parent) | ||||||
|     : GAbstractColumnView(parent) |     : GAbstractColumnView(parent) | ||||||
| { | { | ||||||
|  |     set_background_role(ColorRole::Base); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GTableView::~GTableView() | GTableView::~GTableView() | ||||||
|  | @ -20,12 +22,13 @@ GTableView::~GTableView() | ||||||
| 
 | 
 | ||||||
| void GTableView::paint_event(GPaintEvent& event) | void GTableView::paint_event(GPaintEvent& event) | ||||||
| { | { | ||||||
|  |     Color widget_background_color = palette().color(background_role()); | ||||||
|     GFrame::paint_event(event); |     GFrame::paint_event(event); | ||||||
| 
 | 
 | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(frame_inner_rect()); |     painter.add_clip_rect(frame_inner_rect()); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
|     painter.fill_rect(event.rect(), SystemColor::Base); |     painter.fill_rect(event.rect(), widget_background_color); | ||||||
|     painter.translate(frame_thickness(), frame_thickness()); |     painter.translate(frame_thickness(), frame_thickness()); | ||||||
|     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); |     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); | ||||||
| 
 | 
 | ||||||
|  | @ -53,15 +56,15 @@ void GTableView::paint_event(GPaintEvent& event) | ||||||
|         Color background_color; |         Color background_color; | ||||||
|         Color key_column_background_color; |         Color key_column_background_color; | ||||||
|         if (is_selected_row) { |         if (is_selected_row) { | ||||||
|             background_color = is_focused() ? Color(SystemColor::Selection) : Color::from_rgb(0x606060); |             background_color = is_focused() ? palette().selection() : Color::from_rgb(0x606060); | ||||||
|             key_column_background_color = is_focused() ? Color(SystemColor::Selection) : Color::from_rgb(0x606060); |             key_column_background_color = is_focused() ? palette().selection() : Color::from_rgb(0x606060); | ||||||
|         } else { |         } else { | ||||||
|             if (alternating_row_colors() && (painted_item_index % 2)) { |             if (alternating_row_colors() && (painted_item_index % 2)) { | ||||||
|                 background_color = Color(SystemColor::Base).darkened(0.8f); |                 background_color = widget_background_color.darkened(0.8f); | ||||||
|                 key_column_background_color = Color(SystemColor::Base).darkened(0.7f); |                 key_column_background_color = widget_background_color.darkened(0.7f); | ||||||
|             } else { |             } else { | ||||||
|                 background_color = SystemColor::Base; |                 background_color = widget_background_color; | ||||||
|                 key_column_background_color = Color(SystemColor::Base).darkened(0.9f); |                 key_column_background_color = widget_background_color.darkened(0.9f); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         painter.fill_rect(row_rect(painted_item_index), background_color); |         painter.fill_rect(row_rect(painted_item_index), background_color); | ||||||
|  | @ -82,7 +85,7 @@ void GTableView::paint_event(GPaintEvent& event) | ||||||
|             auto cell_index = model()->index(row_index, column_index); |             auto cell_index = model()->index(row_index, column_index); | ||||||
| 
 | 
 | ||||||
|             if (auto* delegate = column_data(column_index).cell_painting_delegate.ptr()) { |             if (auto* delegate = column_data(column_index).cell_painting_delegate.ptr()) { | ||||||
|                 delegate->paint(painter, cell_rect, *model(), cell_index); |                 delegate->paint(painter, cell_rect, palette(), *model(), cell_index); | ||||||
|             } else { |             } else { | ||||||
|                 auto data = model()->data(cell_index); |                 auto data = model()->data(cell_index); | ||||||
|                 if (data.is_bitmap()) { |                 if (data.is_bitmap()) { | ||||||
|  | @ -93,9 +96,9 @@ void GTableView::paint_event(GPaintEvent& event) | ||||||
|                 } else { |                 } else { | ||||||
|                     Color text_color; |                     Color text_color; | ||||||
|                     if (is_selected_row) |                     if (is_selected_row) | ||||||
|                         text_color = SystemColor::SelectionText; |                         text_color = palette().selection_text(); | ||||||
|                     else |                     else | ||||||
|                         text_color = model()->data(cell_index, GModel::Role::ForegroundColor).to_color(SystemColor::WindowText); |                         text_color = model()->data(cell_index, GModel::Role::ForegroundColor).to_color(palette().color(foreground_role())); | ||||||
|                     painter.draw_text(cell_rect, data.to_string(), font, column_metadata.text_alignment, text_color, TextElision::Right); |                     painter.draw_text(cell_rect, data.to_string(), font, column_metadata.text_alignment, text_color, TextElision::Right); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  | @ -105,7 +108,7 @@ void GTableView::paint_event(GPaintEvent& event) | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     Rect unpainted_rect(0, header_height() + painted_item_index * item_height(), exposed_width, height()); |     Rect unpainted_rect(0, header_height() + painted_item_index * item_height(), exposed_width, height()); | ||||||
|     painter.fill_rect(unpainted_rect, SystemColor::Base); |     painter.fill_rect(unpainted_rect, widget_background_color); | ||||||
| 
 | 
 | ||||||
|     // Untranslate the painter vertically and do the column headers.
 |     // Untranslate the painter vertically and do the column headers.
 | ||||||
|     painter.translate(0, vertical_scrollbar().value()); |     painter.translate(0, vertical_scrollbar().value()); | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| #include <AK/QuickSort.h> | #include <AK/QuickSort.h> | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <Kernel/KeyCode.h> | #include <Kernel/KeyCode.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GClipboard.h> | #include <LibGUI/GClipboard.h> | ||||||
| #include <LibGUI/GFontDatabase.h> | #include <LibGUI/GFontDatabase.h> | ||||||
|  | @ -295,6 +296,7 @@ Rect GTextEditor::visible_text_rect_in_inner_coordinates() const | ||||||
| 
 | 
 | ||||||
| void GTextEditor::paint_event(GPaintEvent& event) | void GTextEditor::paint_event(GPaintEvent& event) | ||||||
| { | { | ||||||
|  |     Color widget_background_color = palette().color(background_role()); | ||||||
|     // NOTE: This ensures that spans are updated before we look at them.
 |     // NOTE: This ensures that spans are updated before we look at them.
 | ||||||
|     flush_pending_change_notification_if_needed(); |     flush_pending_change_notification_if_needed(); | ||||||
| 
 | 
 | ||||||
|  | @ -303,15 +305,15 @@ void GTextEditor::paint_event(GPaintEvent& event) | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(widget_inner_rect()); |     painter.add_clip_rect(widget_inner_rect()); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
|     painter.fill_rect(event.rect(), SystemColor::Base); |     painter.fill_rect(event.rect(), widget_background_color); | ||||||
| 
 | 
 | ||||||
|     painter.translate(frame_thickness(), frame_thickness()); |     painter.translate(frame_thickness(), frame_thickness()); | ||||||
| 
 | 
 | ||||||
|     auto ruler_rect = ruler_rect_in_inner_coordinates(); |     auto ruler_rect = ruler_rect_in_inner_coordinates(); | ||||||
| 
 | 
 | ||||||
|     if (m_ruler_visible) { |     if (m_ruler_visible) { | ||||||
|         painter.fill_rect(ruler_rect, Color(SystemColor::Base).darkened(0.85f)); |         painter.fill_rect(ruler_rect, widget_background_color.darkened(0.85f)); | ||||||
|         painter.draw_line(ruler_rect.top_right(), ruler_rect.bottom_right(), Color(SystemColor::Base).darkened(0.5f)); |         painter.draw_line(ruler_rect.top_right(), ruler_rect.bottom_right(), widget_background_color.darkened(0.5f)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); |     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); | ||||||
|  | @ -333,7 +335,7 @@ void GTextEditor::paint_event(GPaintEvent& event) | ||||||
|                 String::number(i + 1), |                 String::number(i + 1), | ||||||
|                 is_current_line ? Font::default_bold_font() : font(), |                 is_current_line ? Font::default_bold_font() : font(), | ||||||
|                 TextAlignment::TopRight, |                 TextAlignment::TopRight, | ||||||
|                 is_current_line ? Color(SystemColor::Base).darkened(0.6f) : Color(SystemColor::Base).darkened(0.7f)); |                 is_current_line ? widget_background_color.darkened(0.6f) : widget_background_color.darkened(0.7f)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -369,13 +371,13 @@ void GTextEditor::paint_event(GPaintEvent& event) | ||||||
|         size_t visual_line_index = 0; |         size_t visual_line_index = 0; | ||||||
|         for_each_visual_line(line_index, [&](const Rect& visual_line_rect, const StringView& visual_line_text, size_t start_of_visual_line) { |         for_each_visual_line(line_index, [&](const Rect& visual_line_rect, const StringView& visual_line_text, size_t start_of_visual_line) { | ||||||
|             if (is_multi_line() && line_index == m_cursor.line()) |             if (is_multi_line() && line_index == m_cursor.line()) | ||||||
|                 painter.fill_rect(visual_line_rect, Color(SystemColor::Base).darkened(0.9f)); |                 painter.fill_rect(visual_line_rect, widget_background_color.darkened(0.9f)); | ||||||
| #ifdef DEBUG_GTEXTEDITOR | #ifdef DEBUG_GTEXTEDITOR | ||||||
|             painter.draw_rect(visual_line_rect, Color::Cyan); |             painter.draw_rect(visual_line_rect, Color::Cyan); | ||||||
| #endif | #endif | ||||||
|             if (!document().has_spans()) { |             if (!document().has_spans()) { | ||||||
|                 // Fast-path for plain text
 |                 // Fast-path for plain text
 | ||||||
|                 painter.draw_text(visual_line_rect, visual_line_text, m_text_alignment, SystemColor::WindowText); |                 painter.draw_text(visual_line_rect, visual_line_text, m_text_alignment, palette().color(foreground_role())); | ||||||
|             } else { |             } else { | ||||||
|                 int advance = font().glyph_width(' ') + font().glyph_spacing(); |                 int advance = font().glyph_width(' ') + font().glyph_spacing(); | ||||||
|                 Rect character_rect = { visual_line_rect.location(), { font().glyph_width(' '), line_height() } }; |                 Rect character_rect = { visual_line_rect.location(), { font().glyph_width(' '), line_height() } }; | ||||||
|  | @ -424,7 +426,7 @@ void GTextEditor::paint_event(GPaintEvent& event) | ||||||
|                         visual_line_rect.height() |                         visual_line_rect.height() | ||||||
|                     }; |                     }; | ||||||
| 
 | 
 | ||||||
|                     painter.fill_rect(selection_rect, SystemColor::Selection); |                     painter.fill_rect(selection_rect, palette().selection()); | ||||||
| 
 | 
 | ||||||
|                     size_t start_of_selection_within_visual_line = (size_t)max(0, (int)selection_start_column_within_line - (int)start_of_visual_line); |                     size_t start_of_selection_within_visual_line = (size_t)max(0, (int)selection_start_column_within_line - (int)start_of_visual_line); | ||||||
|                     size_t end_of_selection_within_visual_line = selection_end_column_within_line - start_of_visual_line; |                     size_t end_of_selection_within_visual_line = selection_end_column_within_line - start_of_visual_line; | ||||||
|  | @ -434,7 +436,7 @@ void GTextEditor::paint_event(GPaintEvent& event) | ||||||
|                         end_of_selection_within_visual_line - start_of_selection_within_visual_line |                         end_of_selection_within_visual_line - start_of_selection_within_visual_line | ||||||
|                     }; |                     }; | ||||||
| 
 | 
 | ||||||
|                     painter.draw_text(selection_rect, visual_selected_text, TextAlignment::CenterLeft, SystemColor::SelectionText); |                     painter.draw_text(selection_rect, visual_selected_text, TextAlignment::CenterLeft, palette().selection_text()); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             ++visual_line_index; |             ++visual_line_index; | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GActionGroup.h> | #include <LibGUI/GActionGroup.h> | ||||||
| #include <LibGUI/GBoxLayout.h> | #include <LibGUI/GBoxLayout.h> | ||||||
|  | @ -71,8 +72,8 @@ public: | ||||||
|         GPainter painter(*this); |         GPainter painter(*this); | ||||||
|         painter.add_clip_rect(event.rect()); |         painter.add_clip_rect(event.rect()); | ||||||
|         painter.translate(rect().center().x() - 1, 0); |         painter.translate(rect().center().x() - 1, 0); | ||||||
|         painter.draw_line({ 0, 0 }, { 0, rect().bottom() }, SystemColor::ThreedShadow1); |         painter.draw_line({ 0, 0 }, { 0, rect().bottom() }, palette().threed_shadow1()); | ||||||
|         painter.draw_line({ 1, 0 }, { 1, rect().bottom() }, SystemColor::ThreedHighlight); |         painter.draw_line({ 1, 0 }, { 1, rect().bottom() }, palette().threed_highlight()); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -90,7 +91,7 @@ void GToolBar::paint_event(GPaintEvent& event) | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
| 
 | 
 | ||||||
|     if (m_has_frame) |     if (m_has_frame) | ||||||
|         StylePainter::paint_surface(painter, rect(), x() != 0, y() != 0); |         StylePainter::paint_surface(painter, rect(), palette(), x() != 0, y() != 0); | ||||||
|     else |     else | ||||||
|         painter.fill_rect(event.rect(), background_color()); |         painter.fill_rect(event.rect(), palette().button()); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| #include <LibGUI/GScrollBar.h> | #include <LibGUI/GScrollBar.h> | ||||||
| #include <LibGUI/GTreeView.h> | #include <LibGUI/GTreeView.h> | ||||||
|  | @ -23,6 +24,7 @@ GTreeView::MetadataForIndex& GTreeView::ensure_metadata_for_index(const GModelIn | ||||||
| GTreeView::GTreeView(GWidget* parent) | GTreeView::GTreeView(GWidget* parent) | ||||||
|     : GAbstractColumnView(parent) |     : GAbstractColumnView(parent) | ||||||
| { | { | ||||||
|  |     set_background_role(ColorRole::Base); | ||||||
|     set_size_columns_to_fit_content(true); |     set_size_columns_to_fit_content(true); | ||||||
|     set_headers_visible(false); |     set_headers_visible(false); | ||||||
|     m_expand_bitmap = GraphicsBitmap::load_from_file("/res/icons/treeview-expand.png"); |     m_expand_bitmap = GraphicsBitmap::load_from_file("/res/icons/treeview-expand.png"); | ||||||
|  | @ -146,7 +148,7 @@ void GTreeView::paint_event(GPaintEvent& event) | ||||||
|     GPainter painter(*this); |     GPainter painter(*this); | ||||||
|     painter.add_clip_rect(frame_inner_rect()); |     painter.add_clip_rect(frame_inner_rect()); | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
|     painter.fill_rect(event.rect(), SystemColor::Base); |     painter.fill_rect(event.rect(), palette().color(background_role())); | ||||||
| 
 | 
 | ||||||
|     if (!model()) |     if (!model()) | ||||||
|         return; |         return; | ||||||
|  | @ -178,21 +180,21 @@ void GTreeView::paint_event(GPaintEvent& event) | ||||||
| 
 | 
 | ||||||
|         bool is_selected_row = selection().contains(index); |         bool is_selected_row = selection().contains(index); | ||||||
| 
 | 
 | ||||||
|         Color text_color = SystemColor::WindowText; |         Color text_color = palette().color(foreground_role()); | ||||||
|         if (is_selected_row) |         if (is_selected_row) | ||||||
|             text_color = Color::White; |             text_color = Color::White; | ||||||
| 
 | 
 | ||||||
|         Color background_color; |         Color background_color; | ||||||
|         Color key_column_background_color; |         Color key_column_background_color; | ||||||
|         if (is_selected_row) { |         if (is_selected_row) { | ||||||
|             background_color = is_focused() ? Color(SystemColor::Selection) : Color::from_rgb(0x606060); |             background_color = is_focused() ? palette().selection() : Color::from_rgb(0x606060); | ||||||
|             key_column_background_color = is_focused() ? Color(SystemColor::Selection) : Color::from_rgb(0x606060); |             key_column_background_color = is_focused() ? palette().selection() : Color::from_rgb(0x606060); | ||||||
|         } else { |         } else { | ||||||
|             if (alternating_row_colors() && (painted_row_index % 2)) { |             if (alternating_row_colors() && (painted_row_index % 2)) { | ||||||
|                 background_color = Color(220, 220, 220); |                 background_color = Color(220, 220, 220); | ||||||
|                 key_column_background_color = Color(200, 200, 200); |                 key_column_background_color = Color(200, 200, 200); | ||||||
|             } else { |             } else { | ||||||
|                 background_color = SystemColor::Base; |                 background_color = palette().color(background_role()); | ||||||
|                 key_column_background_color = Color(220, 220, 220); |                 key_column_background_color = Color(220, 220, 220); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -215,7 +217,7 @@ void GTreeView::paint_event(GPaintEvent& event) | ||||||
|                 auto cell_index = model.sibling(index.row(), column_index, index.parent()); |                 auto cell_index = model.sibling(index.row(), column_index, index.parent()); | ||||||
| 
 | 
 | ||||||
|                 if (auto* delegate = column_data(column_index).cell_painting_delegate.ptr()) { |                 if (auto* delegate = column_data(column_index).cell_painting_delegate.ptr()) { | ||||||
|                     delegate->paint(painter, cell_rect, model, cell_index); |                     delegate->paint(painter, cell_rect, palette(), model, cell_index); | ||||||
|                 } else { |                 } else { | ||||||
|                     auto data = model.data(cell_index); |                     auto data = model.data(cell_index); | ||||||
| 
 | 
 | ||||||
|  | @ -226,7 +228,7 @@ void GTreeView::paint_event(GPaintEvent& event) | ||||||
|                             painter.blit(cell_rect.location(), *bitmap, bitmap->rect()); |                             painter.blit(cell_rect.location(), *bitmap, bitmap->rect()); | ||||||
|                     } else { |                     } else { | ||||||
|                         if (!is_selected_row) |                         if (!is_selected_row) | ||||||
|                             text_color = model.data(cell_index, GModel::Role::ForegroundColor).to_color(SystemColor::WindowText); |                             text_color = model.data(cell_index, GModel::Role::ForegroundColor).to_color(palette().color(foreground_role())); | ||||||
|                         painter.draw_text(cell_rect, data.to_string(), font, column_metadata.text_alignment, text_color, TextElision::Right); |                         painter.draw_text(cell_rect, data.to_string(), font, column_metadata.text_alignment, text_color, TextElision::Right); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|  | @ -1,26 +1,26 @@ | ||||||
| #include <AK/Assertions.h> | #include <AK/Assertions.h> | ||||||
| #include <AK/JsonObject.h> | #include <AK/JsonObject.h> | ||||||
| #include <LibDraw/GraphicsBitmap.h> | #include <LibDraw/GraphicsBitmap.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GApplication.h> | #include <LibGUI/GApplication.h> | ||||||
|  | #include <LibGUI/GButton.h> | ||||||
|  | #include <LibGUI/GCheckBox.h> | ||||||
| #include <LibGUI/GEvent.h> | #include <LibGUI/GEvent.h> | ||||||
|  | #include <LibGUI/GGroupBox.h> | ||||||
|  | #include <LibGUI/GLabel.h> | ||||||
| #include <LibGUI/GLayout.h> | #include <LibGUI/GLayout.h> | ||||||
| #include <LibGUI/GMenu.h> | #include <LibGUI/GMenu.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
| #include <LibGUI/GWidget.h> |  | ||||||
| #include <LibGUI/GWindow.h> |  | ||||||
| #include <LibGUI/GWindowServerConnection.h> |  | ||||||
| #include <unistd.h> |  | ||||||
| 
 |  | ||||||
| #include <LibGUI/GButton.h> |  | ||||||
| #include <LibGUI/GCheckBox.h> |  | ||||||
| #include <LibGUI/GGroupBox.h> |  | ||||||
| #include <LibGUI/GLabel.h> |  | ||||||
| #include <LibGUI/GRadioButton.h> | #include <LibGUI/GRadioButton.h> | ||||||
| #include <LibGUI/GScrollBar.h> | #include <LibGUI/GScrollBar.h> | ||||||
| #include <LibGUI/GSlider.h> | #include <LibGUI/GSlider.h> | ||||||
| #include <LibGUI/GSpinBox.h> | #include <LibGUI/GSpinBox.h> | ||||||
| #include <LibGUI/GTextBox.h> | #include <LibGUI/GTextBox.h> | ||||||
|  | #include <LibGUI/GWidget.h> | ||||||
|  | #include <LibGUI/GWindow.h> | ||||||
|  | #include <LibGUI/GWindowServerConnection.h> | ||||||
|  | #include <unistd.h> | ||||||
| 
 | 
 | ||||||
| REGISTER_GWIDGET(GButton) | REGISTER_GWIDGET(GButton) | ||||||
| REGISTER_GWIDGET(GCheckBox) | REGISTER_GWIDGET(GCheckBox) | ||||||
|  | @ -67,9 +67,8 @@ const GWidgetClassRegistration* GWidgetClassRegistration::find(const String& cla | ||||||
| GWidget::GWidget(GWidget* parent) | GWidget::GWidget(GWidget* parent) | ||||||
|     : CObject(parent, true) |     : CObject(parent, true) | ||||||
|     , m_font(Font::default_font()) |     , m_font(Font::default_font()) | ||||||
|  |     , m_palette(GApplication::the().palette()) | ||||||
| { | { | ||||||
|     m_background_color = SystemColor::Window; |  | ||||||
|     m_foreground_color = SystemColor::WindowText; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GWidget::~GWidget() | GWidget::~GWidget() | ||||||
|  | @ -173,7 +172,7 @@ void GWidget::handle_paint_event(GPaintEvent& event) | ||||||
|     ASSERT(is_visible()); |     ASSERT(is_visible()); | ||||||
|     if (fill_with_background_color()) { |     if (fill_with_background_color()) { | ||||||
|         GPainter painter(*this); |         GPainter painter(*this); | ||||||
|         painter.fill_rect(event.rect(), background_color()); |         painter.fill_rect(event.rect(), palette().color(background_role())); | ||||||
|     } else { |     } else { | ||||||
| #ifdef DEBUG_WIDGET_UNDERDRAW | #ifdef DEBUG_WIDGET_UNDERDRAW | ||||||
|         // FIXME: This is a bit broken.
 |         // FIXME: This is a bit broken.
 | ||||||
|  | @ -693,3 +692,8 @@ Vector<GWidget*> GWidget::child_widgets() const | ||||||
|     } |     } | ||||||
|     return widgets; |     return widgets; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void GWidget::set_palette(const Palette& palette) | ||||||
|  | { | ||||||
|  |     m_palette = palette; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ | ||||||
| #include <LibDraw/Font.h> | #include <LibDraw/Font.h> | ||||||
| #include <LibDraw/Orientation.h> | #include <LibDraw/Orientation.h> | ||||||
| #include <LibDraw/Rect.h> | #include <LibDraw/Rect.h> | ||||||
|  | #include <LibDraw/SystemTheme.h> | ||||||
| #include <LibGUI/GEvent.h> | #include <LibGUI/GEvent.h> | ||||||
| #include <LibGUI/GShortcut.h> | #include <LibGUI/GShortcut.h> | ||||||
| 
 | 
 | ||||||
|  | @ -16,11 +17,12 @@ | ||||||
|     extern GWidgetClassRegistration registration_##class_name; \ |     extern GWidgetClassRegistration registration_##class_name; \ | ||||||
|     GWidgetClassRegistration registration_##class_name(#class_name, [](GWidget* parent) { return class_name::construct(parent); }); |     GWidgetClassRegistration registration_##class_name(#class_name, [](GWidget* parent) { return class_name::construct(parent); }); | ||||||
| 
 | 
 | ||||||
| class GraphicsBitmap; |  | ||||||
| class GAction; | class GAction; | ||||||
| class GLayout; | class GLayout; | ||||||
| class GMenu; | class GMenu; | ||||||
| class GWindow; | class GWindow; | ||||||
|  | class GraphicsBitmap; | ||||||
|  | class Palette; | ||||||
| 
 | 
 | ||||||
| enum class SizePolicy { | enum class SizePolicy { | ||||||
|     Fixed, |     Fixed, | ||||||
|  | @ -149,6 +151,12 @@ public: | ||||||
|     void move_by(int x, int y) { move_by({ x, y }); } |     void move_by(int x, int y) { move_by({ x, y }); } | ||||||
|     void move_by(const Point& delta) { set_relative_rect({ relative_position().translated(delta), size() }); } |     void move_by(const Point& delta) { set_relative_rect({ relative_position().translated(delta), size() }); } | ||||||
| 
 | 
 | ||||||
|  |     ColorRole background_role() const { return m_background_role; } | ||||||
|  |     void set_background_role(ColorRole role) { m_background_role = role; } | ||||||
|  | 
 | ||||||
|  |     ColorRole foreground_role() const { return m_foreground_role; } | ||||||
|  |     void set_foreground_role(ColorRole role) { m_foreground_role = role; } | ||||||
|  | 
 | ||||||
|     Color background_color() const { return m_background_color; } |     Color background_color() const { return m_background_color; } | ||||||
|     Color foreground_color() const { return m_foreground_color; } |     Color foreground_color() const { return m_foreground_color; } | ||||||
| 
 | 
 | ||||||
|  | @ -230,6 +238,9 @@ public: | ||||||
| 
 | 
 | ||||||
|     void do_layout(); |     void do_layout(); | ||||||
| 
 | 
 | ||||||
|  |     const Palette& palette() const { return *m_palette; } | ||||||
|  |     void set_palette(const Palette&); | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
|     explicit GWidget(GWidget* parent = nullptr); |     explicit GWidget(GWidget* parent = nullptr); | ||||||
| 
 | 
 | ||||||
|  | @ -271,6 +282,8 @@ private: | ||||||
|     OwnPtr<GLayout> m_layout; |     OwnPtr<GLayout> m_layout; | ||||||
| 
 | 
 | ||||||
|     Rect m_relative_rect; |     Rect m_relative_rect; | ||||||
|  |     ColorRole m_background_role { ColorRole::Window }; | ||||||
|  |     ColorRole m_foreground_role { ColorRole::WindowText }; | ||||||
|     Color m_background_color; |     Color m_background_color; | ||||||
|     Color m_foreground_color; |     Color m_foreground_color; | ||||||
|     NonnullRefPtr<Font> m_font; |     NonnullRefPtr<Font> m_font; | ||||||
|  | @ -288,6 +301,8 @@ private: | ||||||
|     bool m_updates_enabled { true }; |     bool m_updates_enabled { true }; | ||||||
| 
 | 
 | ||||||
|     HashMap<GShortcut, GAction*> m_local_shortcut_actions; |     HashMap<GShortcut, GAction*> m_local_shortcut_actions; | ||||||
|  | 
 | ||||||
|  |     NonnullRefPtr<Palette> m_palette; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| template<> | template<> | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibDraw/SystemTheme.h> | #include <LibDraw/SystemTheme.h> | ||||||
| #include <LibGUI/GAction.h> | #include <LibGUI/GAction.h> | ||||||
| #include <LibGUI/GApplication.h> | #include <LibGUI/GApplication.h> | ||||||
|  | @ -25,6 +26,7 @@ static void set_system_theme_from_shared_buffer_id(int id) | ||||||
|     auto system_theme = SharedBuffer::create_from_shared_buffer_id(id); |     auto system_theme = SharedBuffer::create_from_shared_buffer_id(id); | ||||||
|     ASSERT(system_theme); |     ASSERT(system_theme); | ||||||
|     set_system_theme(*system_theme); |     set_system_theme(*system_theme); | ||||||
|  |     GApplication::the().set_system_palette(*system_theme); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GWindowServerConnection::handshake() | void GWindowServerConnection::handshake() | ||||||
|  |  | ||||||
|  | @ -118,7 +118,7 @@ void HtmlView::paint_event(GPaintEvent& event) | ||||||
|     painter.add_clip_rect(event.rect()); |     painter.add_clip_rect(event.rect()); | ||||||
| 
 | 
 | ||||||
|     if (!layout_root()) { |     if (!layout_root()) { | ||||||
|         painter.fill_rect(event.rect(), background_color()); |         painter.fill_rect(event.rect(), palette().color(background_role())); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -131,7 +131,7 @@ void HtmlView::paint_event(GPaintEvent& event) | ||||||
|     painter.translate(frame_thickness(), frame_thickness()); |     painter.translate(frame_thickness(), frame_thickness()); | ||||||
|     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); |     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); | ||||||
| 
 | 
 | ||||||
|     RenderingContext context { painter }; |     RenderingContext context(painter, palette()); | ||||||
|     context.set_should_show_line_box_borders(m_should_show_line_box_borders); |     context.set_should_show_line_box_borders(m_should_show_line_box_borders); | ||||||
|     context.set_viewport_rect(visible_content_rect()); |     context.set_viewport_rect(visible_content_rect()); | ||||||
|     layout_root()->render(context); |     layout_root()->render(context); | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ void LayoutImage::render(RenderingContext& context) | ||||||
| 
 | 
 | ||||||
|     if (renders_as_alt_text()) { |     if (renders_as_alt_text()) { | ||||||
|         context.painter().set_font(Font::default_font()); |         context.painter().set_font(Font::default_font()); | ||||||
|         StylePainter::paint_frame(context.painter(), enclosing_int_rect(rect()), FrameShape::Container, FrameShadow::Sunken, 2); |         StylePainter::paint_frame(context.painter(), enclosing_int_rect(rect()), context.palette(), FrameShape::Container, FrameShadow::Sunken, 2); | ||||||
|         auto alt = node().alt(); |         auto alt = node().alt(); | ||||||
|         if (alt.is_empty()) |         if (alt.is_empty()) | ||||||
|             alt = node().src(); |             alt = node().src(); | ||||||
|  |  | ||||||
|  | @ -1,17 +1,20 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibDraw/Rect.h> | #include <LibDraw/Rect.h> | ||||||
| 
 | 
 | ||||||
| class GPainter; | class GPainter; | ||||||
| 
 | 
 | ||||||
| class RenderingContext { | class RenderingContext { | ||||||
| public: | public: | ||||||
|     explicit RenderingContext(GPainter& painter) |     explicit RenderingContext(GPainter& painter, const Palette& palette) | ||||||
|         : m_painter(painter) |         : m_painter(painter) | ||||||
|  |         , m_palette(palette) | ||||||
|     { |     { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     GPainter& painter() const { return m_painter; } |     GPainter& painter() const { return m_painter; } | ||||||
|  |     const Palette& palette() const { return m_palette; } | ||||||
| 
 | 
 | ||||||
|     bool should_show_line_box_borders() const { return m_should_show_line_box_borders; } |     bool should_show_line_box_borders() const { return m_should_show_line_box_borders; } | ||||||
|     void set_should_show_line_box_borders(bool value) { m_should_show_line_box_borders = value; } |     void set_should_show_line_box_borders(bool value) { m_should_show_line_box_borders = value; } | ||||||
|  | @ -21,6 +24,7 @@ public: | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     GPainter& m_painter; |     GPainter& m_painter; | ||||||
|  |     const Palette& m_palette; | ||||||
|     Rect m_viewport_rect; |     Rect m_viewport_rect; | ||||||
|     bool m_should_show_line_box_borders { false }; |     bool m_should_show_line_box_borders { false }; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -18,14 +18,15 @@ WSButton::~WSButton() | ||||||
| 
 | 
 | ||||||
| void WSButton::paint(Painter& painter) | void WSButton::paint(Painter& painter) | ||||||
| { | { | ||||||
|  |     auto& palette = WSWindowManager::the().palette(); | ||||||
|     PainterStateSaver saver(painter); |     PainterStateSaver saver(painter); | ||||||
|     painter.translate(relative_rect().location()); |     painter.translate(relative_rect().location()); | ||||||
|     StylePainter::paint_button(painter, rect(), ButtonStyle::Normal, m_pressed, m_hovered); |     StylePainter::paint_button(painter, rect(), palette, ButtonStyle::Normal, m_pressed, m_hovered); | ||||||
|     auto x_location = rect().center(); |     auto x_location = rect().center(); | ||||||
|     x_location.move_by(-(m_bitmap->width() / 2), -(m_bitmap->height() / 2)); |     x_location.move_by(-(m_bitmap->width() / 2), -(m_bitmap->height() / 2)); | ||||||
|     if (m_pressed) |     if (m_pressed) | ||||||
|         x_location.move_by(1, 1); |         x_location.move_by(1, 1); | ||||||
|     painter.draw_bitmap(x_location, *m_bitmap, SystemColor::ButtonText); |     painter.draw_bitmap(x_location, *m_bitmap, palette.button_text()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void WSButton::on_mouse_event(const WSMouseEvent& event) | void WSButton::on_mouse_event(const WSMouseEvent& event) | ||||||
|  |  | ||||||
|  | @ -113,7 +113,7 @@ void WSCompositor::compose() | ||||||
|         if (wm.any_opaque_window_contains_rect(dirty_rect)) |         if (wm.any_opaque_window_contains_rect(dirty_rect)) | ||||||
|             continue; |             continue; | ||||||
|         // FIXME: If the wallpaper is opaque, no need to fill with color!
 |         // FIXME: If the wallpaper is opaque, no need to fill with color!
 | ||||||
|         m_back_painter->fill_rect(dirty_rect, SystemColor::DesktopBackground); |         m_back_painter->fill_rect(dirty_rect, wm.palette().desktop_background()); | ||||||
|         if (m_wallpaper) { |         if (m_wallpaper) { | ||||||
|             if (m_wallpaper_mode == WallpaperMode::Simple) { |             if (m_wallpaper_mode == WallpaperMode::Simple) { | ||||||
|                 m_back_painter->blit(dirty_rect.location(), *m_wallpaper, dirty_rect); |                 m_back_painter->blit(dirty_rect.location(), *m_wallpaper, dirty_rect); | ||||||
|  |  | ||||||
|  | @ -126,6 +126,7 @@ WSWindow& WSMenu::ensure_menu_window() | ||||||
| 
 | 
 | ||||||
| void WSMenu::draw() | void WSMenu::draw() | ||||||
| { | { | ||||||
|  |     auto& palette = WSWindowManager::the().palette(); | ||||||
|     m_theme_index_at_last_paint = WSWindowManager::the().theme_index(); |     m_theme_index_at_last_paint = WSWindowManager::the().theme_index(); | ||||||
| 
 | 
 | ||||||
|     ASSERT(menu_window()); |     ASSERT(menu_window()); | ||||||
|  | @ -133,8 +134,8 @@ void WSMenu::draw() | ||||||
|     Painter painter(*menu_window()->backing_store()); |     Painter painter(*menu_window()->backing_store()); | ||||||
| 
 | 
 | ||||||
|     Rect rect { {}, menu_window()->size() }; |     Rect rect { {}, menu_window()->size() }; | ||||||
|     painter.fill_rect(rect.shrunken(6, 6), SystemColor::MenuBase); |     painter.fill_rect(rect.shrunken(6, 6), palette.menu_base()); | ||||||
|     StylePainter::paint_window_frame(painter, rect); |     StylePainter::paint_window_frame(painter, rect, palette); | ||||||
|     int width = this->width(); |     int width = this->width(); | ||||||
| 
 | 
 | ||||||
|     if (!s_checked_bitmap) |     if (!s_checked_bitmap) | ||||||
|  | @ -148,15 +149,15 @@ void WSMenu::draw() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Rect stripe_rect { frame_thickness(), frame_thickness(), s_stripe_width, height() - frame_thickness() * 2 }; |     Rect stripe_rect { frame_thickness(), frame_thickness(), s_stripe_width, height() - frame_thickness() * 2 }; | ||||||
|     painter.fill_rect(stripe_rect, SystemColor::MenuStripe); |     painter.fill_rect(stripe_rect, palette.menu_stripe()); | ||||||
|     painter.draw_line(stripe_rect.top_right(), stripe_rect.bottom_right(), Color(SystemColor::MenuStripe).darkened()); |     painter.draw_line(stripe_rect.top_right(), stripe_rect.bottom_right(), palette.menu_stripe().darkened()); | ||||||
| 
 | 
 | ||||||
|     for (auto& item : m_items) { |     for (auto& item : m_items) { | ||||||
|         if (item.type() == WSMenuItem::Text) { |         if (item.type() == WSMenuItem::Text) { | ||||||
|             Color text_color = SystemColor::WindowText; |             Color text_color = palette.window_text(); | ||||||
|             if (&item == m_hovered_item && item.is_enabled()) { |             if (&item == m_hovered_item && item.is_enabled()) { | ||||||
|                 painter.fill_rect(item.rect(), SystemColor::MenuSelection); |                 painter.fill_rect(item.rect(), palette.menu_selection()); | ||||||
|                 painter.draw_rect(item.rect(), Color(SystemColor::MenuSelection).darkened()); |                 painter.draw_rect(item.rect(), palette.menu_selection().darkened()); | ||||||
|                 text_color = Color::White; |                 text_color = Color::White; | ||||||
|             } else if (!item.is_enabled()) { |             } else if (!item.is_enabled()) { | ||||||
|                 text_color = Color::MidGray; |                 text_color = Color::MidGray; | ||||||
|  | @ -166,10 +167,10 @@ void WSMenu::draw() | ||||||
|                 Rect checkmark_rect { item.rect().x() + 7, 0, s_checked_bitmap_width, s_checked_bitmap_height }; |                 Rect checkmark_rect { item.rect().x() + 7, 0, s_checked_bitmap_width, s_checked_bitmap_height }; | ||||||
|                 checkmark_rect.center_vertically_within(text_rect); |                 checkmark_rect.center_vertically_within(text_rect); | ||||||
|                 Rect checkbox_rect = checkmark_rect.inflated(4, 4); |                 Rect checkbox_rect = checkmark_rect.inflated(4, 4); | ||||||
|                 painter.fill_rect(checkbox_rect, SystemColor::Base); |                 painter.fill_rect(checkbox_rect, palette.base()); | ||||||
|                 StylePainter::paint_frame(painter, checkbox_rect, FrameShape::Container, FrameShadow::Sunken, 2); |                 StylePainter::paint_frame(painter, checkbox_rect, palette, FrameShape::Container, FrameShadow::Sunken, 2); | ||||||
|                 if (item.is_checked()) { |                 if (item.is_checked()) { | ||||||
|                     painter.draw_bitmap(checkmark_rect.location(), *s_checked_bitmap, SystemColor::ButtonText); |                     painter.draw_bitmap(checkmark_rect.location(), *s_checked_bitmap, palette.button_text()); | ||||||
|                 } |                 } | ||||||
|             } else if (item.icon()) { |             } else if (item.icon()) { | ||||||
|                 Rect icon_rect { item.rect().x() + 3, 0, s_item_icon_width, s_item_icon_width }; |                 Rect icon_rect { item.rect().x() + 3, 0, s_item_icon_width, s_item_icon_width }; | ||||||
|  | @ -189,13 +190,13 @@ void WSMenu::draw() | ||||||
|                     s_submenu_arrow_bitmap_height |                     s_submenu_arrow_bitmap_height | ||||||
|                 }; |                 }; | ||||||
|                 submenu_arrow_rect.center_vertically_within(item.rect()); |                 submenu_arrow_rect.center_vertically_within(item.rect()); | ||||||
|                 painter.draw_bitmap(submenu_arrow_rect.location(), submenu_arrow_bitmap, SystemColor::WindowText); |                 painter.draw_bitmap(submenu_arrow_rect.location(), submenu_arrow_bitmap, palette.window_text()); | ||||||
|             } |             } | ||||||
|         } else if (item.type() == WSMenuItem::Separator) { |         } else if (item.type() == WSMenuItem::Separator) { | ||||||
|             Point p1(item.rect().translated(stripe_rect.width() + 4, 0).x(), item.rect().center().y() - 1); |             Point p1(item.rect().translated(stripe_rect.width() + 4, 0).x(), item.rect().center().y() - 1); | ||||||
|             Point p2(width - 7, item.rect().center().y() - 1); |             Point p2(width - 7, item.rect().center().y() - 1); | ||||||
|             painter.draw_line(p1, p2, SystemColor::ThreedShadow1); |             painter.draw_line(p1, p2, palette.threed_shadow1()); | ||||||
|             painter.draw_line(p1.translated(0, 1), p2.translated(0, 1), SystemColor::ThreedHighlight); |             painter.draw_line(p1.translated(0, 1), p2.translated(0, 1), palette.threed_highlight()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ bool WSMenuManager::is_open(const WSMenu& menu) const | ||||||
| void WSMenuManager::draw() | void WSMenuManager::draw() | ||||||
| { | { | ||||||
|     auto& wm = WSWindowManager::the(); |     auto& wm = WSWindowManager::the(); | ||||||
|  |     auto& palette = wm.palette(); | ||||||
|     auto menubar_rect = this->menubar_rect(); |     auto menubar_rect = this->menubar_rect(); | ||||||
| 
 | 
 | ||||||
|     if (m_needs_window_resize) { |     if (m_needs_window_resize) { | ||||||
|  | @ -83,14 +84,14 @@ void WSMenuManager::draw() | ||||||
| 
 | 
 | ||||||
|     Painter painter(*window().backing_store()); |     Painter painter(*window().backing_store()); | ||||||
| 
 | 
 | ||||||
|     painter.fill_rect(menubar_rect, SystemColor::Window); |     painter.fill_rect(menubar_rect, palette.window()); | ||||||
|     painter.draw_line({ 0, menubar_rect.bottom() }, { menubar_rect.right(), menubar_rect.bottom() }, SystemColor::ThreedShadow1); |     painter.draw_line({ 0, menubar_rect.bottom() }, { menubar_rect.right(), menubar_rect.bottom() }, palette.threed_shadow1()); | ||||||
|     int index = 0; |     int index = 0; | ||||||
|     wm.for_each_active_menubar_menu([&](WSMenu& menu) { |     wm.for_each_active_menubar_menu([&](WSMenu& menu) { | ||||||
|         Color text_color = SystemColor::WindowText; |         Color text_color = palette.window_text(); | ||||||
|         if (is_open(menu)) { |         if (is_open(menu)) { | ||||||
|             painter.fill_rect(menu.rect_in_menubar(), SystemColor::MenuSelection); |             painter.fill_rect(menu.rect_in_menubar(), palette.menu_selection()); | ||||||
|             painter.draw_rect(menu.rect_in_menubar(), Color(SystemColor::MenuSelection).darkened()); |             painter.draw_rect(menu.rect_in_menubar(), palette.menu_selection().darkened()); | ||||||
|             text_color = Color::White; |             text_color = Color::White; | ||||||
|         } |         } | ||||||
|         painter.draw_text( |         painter.draw_text( | ||||||
|  | @ -103,7 +104,7 @@ void WSMenuManager::draw() | ||||||
|         return IterationDecision::Continue; |         return IterationDecision::Continue; | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     painter.draw_text(m_username_rect, m_username, Font::default_bold_font(), TextAlignment::CenterRight, SystemColor::WindowText); |     painter.draw_text(m_username_rect, m_username, Font::default_bold_font(), TextAlignment::CenterRight, palette.window_text()); | ||||||
| 
 | 
 | ||||||
|     time_t now = time(nullptr); |     time_t now = time(nullptr); | ||||||
|     auto* tm = localtime(&now); |     auto* tm = localtime(&now); | ||||||
|  | @ -115,7 +116,7 @@ void WSMenuManager::draw() | ||||||
|         tm->tm_min, |         tm->tm_min, | ||||||
|         tm->tm_sec); |         tm->tm_sec); | ||||||
| 
 | 
 | ||||||
|     painter.draw_text(m_time_rect, time_text, wm.font(), TextAlignment::CenterRight, SystemColor::WindowText); |     painter.draw_text(m_time_rect, time_text, wm.font(), TextAlignment::CenterRight, palette.window_text()); | ||||||
| 
 | 
 | ||||||
|     for (auto& applet : m_applets) { |     for (auto& applet : m_applets) { | ||||||
|         if (!applet) |         if (!applet) | ||||||
|  |  | ||||||
|  | @ -153,6 +153,7 @@ void WSWindowFrame::paint(Painter& painter) | ||||||
|     if (m_window.type() != WSWindowType::Normal) |     if (m_window.type() != WSWindowType::Normal) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|  |     auto& palette = WSWindowManager::the().palette(); | ||||||
|     auto& window = m_window; |     auto& window = m_window; | ||||||
| 
 | 
 | ||||||
|     auto titlebar_rect = title_bar_rect(); |     auto titlebar_rect = title_bar_rect(); | ||||||
|  | @ -170,29 +171,29 @@ void WSWindowFrame::paint(Painter& painter) | ||||||
|     auto& wm = WSWindowManager::the(); |     auto& wm = WSWindowManager::the(); | ||||||
| 
 | 
 | ||||||
|     if (&window == wm.m_highlight_window) { |     if (&window == wm.m_highlight_window) { | ||||||
|         border_color = SystemColor::HighlightWindowBorder1; |         border_color = palette.highlight_window_border1(); | ||||||
|         border_color2 = SystemColor::HighlightWindowBorder2; |         border_color2 = palette.highlight_window_border2(); | ||||||
|         title_color = SystemColor::HighlightWindowTitle; |         title_color = palette.highlight_window_title(); | ||||||
|     } else if (&window == wm.m_move_window) { |     } else if (&window == wm.m_move_window) { | ||||||
|         border_color = SystemColor::MovingWindowBorder1; |         border_color = palette.moving_window_border1(); | ||||||
|         border_color2 = SystemColor::MovingWindowBorder2; |         border_color2 = palette.moving_window_border2(); | ||||||
|         title_color = SystemColor::MovingWindowTitle; |         title_color = palette.moving_window_title(); | ||||||
|     } else if (&window == wm.m_active_window) { |     } else if (&window == wm.m_active_window) { | ||||||
|         border_color = SystemColor::ActiveWindowBorder1; |         border_color = palette.active_window_border1(); | ||||||
|         border_color2 = SystemColor::ActiveWindowBorder2; |         border_color2 = palette.active_window_border2(); | ||||||
|         title_color = SystemColor::ActiveWindowTitle; |         title_color = palette.active_window_title(); | ||||||
|     } else { |     } else { | ||||||
|         border_color = SystemColor::InactiveWindowBorder1; |         border_color = palette.inactive_window_border1(); | ||||||
|         border_color2 = SystemColor::InactiveWindowBorder2; |         border_color2 = palette.inactive_window_border2(); | ||||||
|         title_color = SystemColor::InactiveWindowTitle; |         title_color = palette.inactive_window_title(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     StylePainter::paint_window_frame(painter, outer_rect); |     StylePainter::paint_window_frame(painter, outer_rect, palette); | ||||||
| 
 | 
 | ||||||
|     if (!window.show_titlebar()) |     if (!window.show_titlebar()) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|     painter.draw_line(titlebar_rect.bottom_left().translated(0, 1), titlebar_rect.bottom_right().translated(0, 1), SystemColor::Button); |     painter.draw_line(titlebar_rect.bottom_left().translated(0, 1), titlebar_rect.bottom_right().translated(0, 1), palette.button()); | ||||||
| 
 | 
 | ||||||
|     auto leftmost_button_rect = m_buttons.is_empty() ? Rect() : m_buttons.last().relative_rect(); |     auto leftmost_button_rect = m_buttons.is_empty() ? Rect() : m_buttons.last().relative_rect(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -42,7 +42,8 @@ WSWindowManager& WSWindowManager::the() | ||||||
|     return *s_the; |     return *s_the; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| WSWindowManager::WSWindowManager() | WSWindowManager::WSWindowManager(const Palette& palette) | ||||||
|  |     : m_palette(palette) | ||||||
| { | { | ||||||
|     s_the = this; |     s_the = this; | ||||||
| 
 | 
 | ||||||
|  | @ -132,6 +133,7 @@ WSWindowManager::WSWindowManager() | ||||||
|         auto new_theme = load_system_theme(theme.path); |         auto new_theme = load_system_theme(theme.path); | ||||||
|         ASSERT(new_theme); |         ASSERT(new_theme); | ||||||
|         set_system_theme(*new_theme); |         set_system_theme(*new_theme); | ||||||
|  |         m_palette = Palette::create_with_shared_buffer(*new_theme); | ||||||
|         HashTable<WSClientConnection*> notified_clients; |         HashTable<WSClientConnection*> notified_clients; | ||||||
|         for_each_window([&](WSWindow& window) { |         for_each_window([&](WSWindow& window) { | ||||||
|             if (window.client()) { |             if (window.client()) { | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ | ||||||
| #include <LibDraw/Color.h> | #include <LibDraw/Color.h> | ||||||
| #include <LibDraw/DisjointRectSet.h> | #include <LibDraw/DisjointRectSet.h> | ||||||
| #include <LibDraw/Painter.h> | #include <LibDraw/Painter.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibDraw/Rect.h> | #include <LibDraw/Rect.h> | ||||||
| #include <WindowServer/WSCursor.h> | #include <WindowServer/WSCursor.h> | ||||||
| #include <WindowServer/WSEvent.h> | #include <WindowServer/WSEvent.h> | ||||||
|  | @ -50,10 +51,15 @@ class WSWindowManager : public CObject { | ||||||
| public: | public: | ||||||
|     static WSWindowManager& the(); |     static WSWindowManager& the(); | ||||||
| 
 | 
 | ||||||
|     WSWindowManager(); |     explicit WSWindowManager(const Palette&); | ||||||
|     virtual ~WSWindowManager() override; |     virtual ~WSWindowManager() override; | ||||||
| 
 | 
 | ||||||
|     RefPtr<CConfigFile> wm_config() const { return m_wm_config; } |     const Palette& palette() const { return *m_palette; } | ||||||
|  | 
 | ||||||
|  |     RefPtr<CConfigFile> wm_config() const | ||||||
|  |     { | ||||||
|  |         return m_wm_config; | ||||||
|  |     } | ||||||
|     void reload_config(bool); |     void reload_config(bool); | ||||||
| 
 | 
 | ||||||
|     void add_window(WSWindow&); |     void add_window(WSWindow&); | ||||||
|  | @ -276,6 +282,8 @@ private: | ||||||
|     WeakPtr<WSButton> m_cursor_tracking_button; |     WeakPtr<WSButton> m_cursor_tracking_button; | ||||||
|     WeakPtr<WSButton> m_hovered_button; |     WeakPtr<WSButton> m_hovered_button; | ||||||
| 
 | 
 | ||||||
|  |     NonnullRefPtr<Palette> m_palette; | ||||||
|  | 
 | ||||||
|     RefPtr<CConfigFile> m_wm_config; |     RefPtr<CConfigFile> m_wm_config; | ||||||
| 
 | 
 | ||||||
|     struct AppMetadata { |     struct AppMetadata { | ||||||
|  |  | ||||||
|  | @ -70,9 +70,10 @@ void WSWindowSwitcher::on_key_event(const WSKeyEvent& event) | ||||||
| 
 | 
 | ||||||
| void WSWindowSwitcher::draw() | void WSWindowSwitcher::draw() | ||||||
| { | { | ||||||
|  |     auto& palette = WSWindowManager::the().palette(); | ||||||
|     Painter painter(*m_switcher_window->backing_store()); |     Painter painter(*m_switcher_window->backing_store()); | ||||||
|     painter.fill_rect({ {}, m_rect.size() }, SystemColor::Window); |     painter.fill_rect({ {}, m_rect.size() }, palette.window()); | ||||||
|     painter.draw_rect({ {}, m_rect.size() }, SystemColor::ThreedShadow2); |     painter.draw_rect({ {}, m_rect.size() }, palette.threed_shadow2()); | ||||||
|     for (int index = 0; index < m_windows.size(); ++index) { |     for (int index = 0; index < m_windows.size(); ++index) { | ||||||
|         auto& window = *m_windows.at(index); |         auto& window = *m_windows.at(index); | ||||||
|         Rect item_rect { |         Rect item_rect { | ||||||
|  | @ -84,21 +85,21 @@ void WSWindowSwitcher::draw() | ||||||
|         Color text_color; |         Color text_color; | ||||||
|         Color rect_text_color; |         Color rect_text_color; | ||||||
|         if (index == m_selected_index) { |         if (index == m_selected_index) { | ||||||
|             painter.fill_rect(item_rect, SystemColor::Selection); |             painter.fill_rect(item_rect, palette.selection()); | ||||||
|             text_color = SystemColor::SelectionText; |             text_color = palette.selection_text(); | ||||||
|             rect_text_color = SystemColor::ThreedShadow1; |             rect_text_color = palette.threed_shadow1(); | ||||||
|         } else { |         } else { | ||||||
|             text_color = SystemColor::WindowText; |             text_color = palette.window_text(); | ||||||
|             rect_text_color = SystemColor::ThreedShadow2; |             rect_text_color = palette.threed_shadow2(); | ||||||
|         } |         } | ||||||
|         item_rect.shrink(item_padding(), 0); |         item_rect.shrink(item_padding(), 0); | ||||||
|         Rect thumbnail_rect = { item_rect.location().translated(0, 5), { thumbnail_width(), thumbnail_height() } }; |         Rect thumbnail_rect = { item_rect.location().translated(0, 5), { thumbnail_width(), thumbnail_height() } }; | ||||||
|         if (window.backing_store()) { |         if (window.backing_store()) { | ||||||
|             painter.draw_scaled_bitmap(thumbnail_rect, *window.backing_store(), window.backing_store()->rect()); |             painter.draw_scaled_bitmap(thumbnail_rect, *window.backing_store(), window.backing_store()->rect()); | ||||||
|             StylePainter::paint_frame(painter, thumbnail_rect.inflated(4, 4), FrameShape::Container, FrameShadow::Sunken, 2); |             StylePainter::paint_frame(painter, thumbnail_rect.inflated(4, 4), palette, FrameShape::Container, FrameShadow::Sunken, 2); | ||||||
|         } |         } | ||||||
|         Rect icon_rect = { thumbnail_rect.bottom_right().translated(-window.icon().width(), -window.icon().height()), { window.icon().width(), window.icon().height() } }; |         Rect icon_rect = { thumbnail_rect.bottom_right().translated(-window.icon().width(), -window.icon().height()), { window.icon().width(), window.icon().height() } }; | ||||||
|         painter.fill_rect(icon_rect, SystemColor::Window); |         painter.fill_rect(icon_rect, palette.window()); | ||||||
|         painter.blit(icon_rect.location(), window.icon(), window.icon().rect()); |         painter.blit(icon_rect.location(), window.icon(), window.icon().rect()); | ||||||
|         painter.draw_text(item_rect.translated(thumbnail_width() + 12, 0), window.title(), WSWindowManager::the().window_title_font(), TextAlignment::CenterLeft, text_color); |         painter.draw_text(item_rect.translated(thumbnail_width() + 12, 0), window.title(), WSWindowManager::the().window_title_font(), TextAlignment::CenterLeft, text_color); | ||||||
|         painter.draw_text(item_rect, window.rect().to_string(), TextAlignment::CenterRight, rect_text_color); |         painter.draw_text(item_rect, window.rect().to_string(), TextAlignment::CenterRight, rect_text_color); | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| #include <LibCore/CConfigFile.h> | #include <LibCore/CConfigFile.h> | ||||||
|  | #include <LibDraw/Palette.h> | ||||||
| #include <LibDraw/SystemTheme.h> | #include <LibDraw/SystemTheme.h> | ||||||
| #include <WindowServer/WSCompositor.h> | #include <WindowServer/WSCompositor.h> | ||||||
| #include <WindowServer/WSEventLoop.h> | #include <WindowServer/WSEventLoop.h> | ||||||
|  | @ -25,13 +26,14 @@ int main(int, char**) | ||||||
|     auto theme = load_system_theme(String::format("/res/themes/%s.ini", theme_name.characters())); |     auto theme = load_system_theme(String::format("/res/themes/%s.ini", theme_name.characters())); | ||||||
|     ASSERT(theme); |     ASSERT(theme); | ||||||
|     set_system_theme(*theme); |     set_system_theme(*theme); | ||||||
|  |     auto palette = Palette::create_with_shared_buffer(*theme); | ||||||
| 
 | 
 | ||||||
|     WSEventLoop loop; |     WSEventLoop loop; | ||||||
| 
 | 
 | ||||||
|     WSScreen screen(wm_config->read_num_entry("Screen", "Width", 1024), |     WSScreen screen(wm_config->read_num_entry("Screen", "Width", 1024), | ||||||
|         wm_config->read_num_entry("Screen", "Height", 768)); |         wm_config->read_num_entry("Screen", "Height", 768)); | ||||||
|     WSCompositor::the(); |     WSCompositor::the(); | ||||||
|     auto wm = WSWindowManager::construct(); |     auto wm = WSWindowManager::construct(*palette); | ||||||
| 
 | 
 | ||||||
|     dbgprintf("Entering WindowServer main loop.\n"); |     dbgprintf("Entering WindowServer main loop.\n"); | ||||||
|     loop.exec(); |     loop.exec(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling