mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 19:58:11 +00:00
LibGUI: Move frame painting from GFrame to StylePainter.
This way it can be used by others who might not have a GFrame object.
This commit is contained in:
parent
e61dd994df
commit
4ab0cd5d4c
16 changed files with 93 additions and 88 deletions
|
@ -65,8 +65,8 @@ int main(int argc, char** argv)
|
||||||
progressbar->set_caption("Generating thumbnails: ");
|
progressbar->set_caption("Generating thumbnails: ");
|
||||||
progressbar->set_format(GProgressBar::Format::ValueSlashMax);
|
progressbar->set_format(GProgressBar::Format::ValueSlashMax);
|
||||||
progressbar->set_visible(false);
|
progressbar->set_visible(false);
|
||||||
progressbar->set_frame_shape(GFrame::Shape::Panel);
|
progressbar->set_frame_shape(FrameShape::Panel);
|
||||||
progressbar->set_frame_shadow(GFrame::Shadow::Sunken);
|
progressbar->set_frame_shadow(FrameShadow::Sunken);
|
||||||
progressbar->set_frame_thickness(1);
|
progressbar->set_frame_thickness(1);
|
||||||
|
|
||||||
location_textbox->on_return_pressed = [directory_view, location_textbox] {
|
location_textbox->on_return_pressed = [directory_view, location_textbox] {
|
||||||
|
|
|
@ -6,8 +6,8 @@ GlyphEditorWidget::GlyphEditorWidget(Font& mutable_font, GWidget* parent)
|
||||||
, m_font(mutable_font)
|
, m_font(mutable_font)
|
||||||
{
|
{
|
||||||
set_frame_thickness(2);
|
set_frame_thickness(2);
|
||||||
set_frame_shadow(GFrame::Shadow::Sunken);
|
set_frame_shadow(FrameShadow::Sunken);
|
||||||
set_frame_shape(GFrame::Shape::Container);
|
set_frame_shape(FrameShape::Container);
|
||||||
set_relative_rect({ 0, 0, preferred_width(), preferred_height() });
|
set_relative_rect({ 0, 0, preferred_width(), preferred_height() });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@ GlyphMapWidget::GlyphMapWidget(Font& mutable_font, GWidget* parent)
|
||||||
, m_font(mutable_font)
|
, m_font(mutable_font)
|
||||||
{
|
{
|
||||||
set_frame_thickness(2);
|
set_frame_thickness(2);
|
||||||
set_frame_shape(GFrame::Shape::Container);
|
set_frame_shape(FrameShape::Container);
|
||||||
set_frame_shadow(GFrame::Shadow::Sunken);
|
set_frame_shadow(FrameShadow::Sunken);
|
||||||
set_relative_rect({ 0, 0, preferred_width(), preferred_height() });
|
set_relative_rect({ 0, 0, preferred_width(), preferred_height() });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,8 @@ TaskbarWindow::TaskbarWindow()
|
||||||
widget->layout()->set_margins({ 3, 2, 3, 2 });
|
widget->layout()->set_margins({ 3, 2, 3, 2 });
|
||||||
widget->layout()->set_spacing(3);
|
widget->layout()->set_spacing(3);
|
||||||
widget->set_frame_thickness(1);
|
widget->set_frame_thickness(1);
|
||||||
widget->set_frame_shape(GFrame::Shape::Panel);
|
widget->set_frame_shape(FrameShape::Panel);
|
||||||
widget->set_frame_shadow(GFrame::Shadow::Raised);
|
widget->set_frame_shadow(FrameShadow::Raised);
|
||||||
set_main_widget(widget);
|
set_main_widget(widget);
|
||||||
|
|
||||||
m_window_list.aid_create_button = [this] {
|
m_window_list.aid_create_button = [this] {
|
||||||
|
|
|
@ -80,8 +80,8 @@ public:
|
||||||
m_label->set_background_color(Color::from_rgb(0xdac7b5));
|
m_label->set_background_color(Color::from_rgb(0xdac7b5));
|
||||||
m_label->set_fill_with_background_color(true);
|
m_label->set_fill_with_background_color(true);
|
||||||
m_label->set_frame_thickness(1);
|
m_label->set_frame_thickness(1);
|
||||||
m_label->set_frame_shape(GFrame::Shape::Container);
|
m_label->set_frame_shape(FrameShape::Container);
|
||||||
m_label->set_frame_shadow(GFrame::Shadow::Plain);
|
m_label->set_frame_shadow(FrameShadow::Plain);
|
||||||
set_main_widget(m_label);
|
set_main_widget(m_label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,57 +13,10 @@ GFrame::~GFrame()
|
||||||
|
|
||||||
void GFrame::paint_event(GPaintEvent& event)
|
void GFrame::paint_event(GPaintEvent& event)
|
||||||
{
|
{
|
||||||
if (m_shape == Shape::NoFrame)
|
if (m_shape == FrameShape::NoFrame)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
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());
|
||||||
Color top_left_color;
|
|
||||||
Color bottom_right_color;
|
|
||||||
Color dark_shade = Color::from_rgb(0x808080);
|
|
||||||
Color light_shade = Color::from_rgb(0xffffff);
|
|
||||||
|
|
||||||
if (m_shadow == Shadow::Raised) {
|
|
||||||
top_left_color = light_shade;
|
|
||||||
bottom_right_color = dark_shade;
|
|
||||||
} else if (m_shadow == Shadow::Sunken) {
|
|
||||||
top_left_color = dark_shade;
|
|
||||||
bottom_right_color = light_shade;
|
|
||||||
} else if (m_shadow == Shadow::Plain) {
|
|
||||||
top_left_color = dark_shade;
|
|
||||||
bottom_right_color = dark_shade;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_thickness >= 1) {
|
|
||||||
painter.draw_line(rect().top_left(), rect().top_right(), top_left_color);
|
|
||||||
painter.draw_line(rect().bottom_left(), rect().bottom_right(), bottom_right_color);
|
|
||||||
|
|
||||||
if (m_shape != Shape::Panel || !spans_entire_window_horizontally()) {
|
|
||||||
painter.draw_line(rect().top_left().translated(0, 1), rect().bottom_left().translated(0, -1), top_left_color);
|
|
||||||
painter.draw_line(rect().top_right(), rect().bottom_right().translated(0, -1), bottom_right_color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_shape == Shape::Container && m_thickness >= 2) {
|
|
||||||
Color top_left_color;
|
|
||||||
Color bottom_right_color;
|
|
||||||
Color dark_shade = Color::from_rgb(0x404040);
|
|
||||||
Color light_shade = Color::from_rgb(0xc0c0c0);
|
|
||||||
if (m_shadow == Shadow::Raised) {
|
|
||||||
top_left_color = light_shade;
|
|
||||||
bottom_right_color = dark_shade;
|
|
||||||
} else if (m_shadow == Shadow::Sunken) {
|
|
||||||
top_left_color = dark_shade;
|
|
||||||
bottom_right_color = light_shade;
|
|
||||||
} else if (m_shadow == Shadow::Plain) {
|
|
||||||
top_left_color = dark_shade;
|
|
||||||
bottom_right_color = dark_shade;
|
|
||||||
}
|
|
||||||
Rect inner_container_frame_rect = rect().shrunken(2, 2);
|
|
||||||
painter.draw_line(inner_container_frame_rect.top_left(), inner_container_frame_rect.top_right(), top_left_color);
|
|
||||||
painter.draw_line(inner_container_frame_rect.bottom_left(), inner_container_frame_rect.bottom_right(), bottom_right_color);
|
|
||||||
painter.draw_line(inner_container_frame_rect.top_left().translated(0, 1), inner_container_frame_rect.bottom_left().translated(0, -1), top_left_color);
|
|
||||||
painter.draw_line(inner_container_frame_rect.top_right(), inner_container_frame_rect.bottom_right().translated(0, -1), bottom_right_color);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +1,21 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <LibGUI/GWidget.h>
|
#include <LibGUI/GWidget.h>
|
||||||
|
#include <SharedGraphics/StylePainter.h>
|
||||||
|
|
||||||
class GFrame : public GWidget {
|
class GFrame : public GWidget {
|
||||||
public:
|
public:
|
||||||
explicit GFrame(GWidget* parent = nullptr);
|
explicit GFrame(GWidget* parent = nullptr);
|
||||||
virtual ~GFrame() override;
|
virtual ~GFrame() override;
|
||||||
|
|
||||||
enum Shadow { Plain, Raised, Sunken };
|
|
||||||
enum Shape { NoFrame, Container, Panel, VerticalLine, HorizontalLine };
|
|
||||||
|
|
||||||
int frame_thickness() const { return m_thickness; }
|
int frame_thickness() const { return m_thickness; }
|
||||||
void set_frame_thickness(int thickness) { m_thickness = thickness; }
|
void set_frame_thickness(int thickness) { m_thickness = thickness; }
|
||||||
|
|
||||||
Shadow frame_shadow() const { return m_shadow; }
|
FrameShadow frame_shadow() const { return m_shadow; }
|
||||||
void set_frame_shadow(Shadow shadow) { m_shadow = shadow; }
|
void set_frame_shadow(FrameShadow shadow) { m_shadow = shadow; }
|
||||||
|
|
||||||
Shape frame_shape() const { return m_shape; }
|
FrameShape frame_shape() const { return m_shape; }
|
||||||
void set_frame_shape(Shape shape) { m_shape = shape; }
|
void set_frame_shape(FrameShape shape) { m_shape = shape; }
|
||||||
|
|
||||||
Rect frame_inner_rect_for_size(const Size& size) const { return { m_thickness, m_thickness, size.width() - m_thickness * 2, size.height() - m_thickness * 2 }; }
|
Rect frame_inner_rect_for_size(const Size& size) const { return { m_thickness, m_thickness, size.width() - m_thickness * 2, size.height() - m_thickness * 2 }; }
|
||||||
Rect frame_inner_rect() const { return frame_inner_rect_for_size(size()); }
|
Rect frame_inner_rect() const { return frame_inner_rect_for_size(size()); }
|
||||||
|
@ -29,6 +27,6 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_thickness { 0 };
|
int m_thickness { 0 };
|
||||||
Shadow m_shadow { Plain };
|
FrameShadow m_shadow { FrameShadow::Plain };
|
||||||
Shape m_shape { NoFrame };
|
FrameShape m_shape { FrameShape::NoFrame };
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
GItemView::GItemView(GWidget* parent)
|
GItemView::GItemView(GWidget* parent)
|
||||||
: GAbstractView(parent)
|
: GAbstractView(parent)
|
||||||
{
|
{
|
||||||
set_frame_shape(GFrame::Shape::Container);
|
set_frame_shape(FrameShape::Container);
|
||||||
set_frame_shadow(GFrame::Shadow::Sunken);
|
set_frame_shadow(FrameShadow::Sunken);
|
||||||
set_frame_thickness(2);
|
set_frame_thickness(2);
|
||||||
horizontal_scrollbar().set_visible(false);
|
horizontal_scrollbar().set_visible(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
GProgressBar::GProgressBar(GWidget* parent)
|
GProgressBar::GProgressBar(GWidget* parent)
|
||||||
: GFrame(parent)
|
: GFrame(parent)
|
||||||
{
|
{
|
||||||
set_frame_shape(GFrame::Shape::Container);
|
set_frame_shape(FrameShape::Container);
|
||||||
set_frame_shadow(GFrame::Shadow::Sunken);
|
set_frame_shadow(FrameShadow::Sunken);
|
||||||
set_frame_thickness(2);
|
set_frame_thickness(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,8 @@ GStatusBar::GStatusBar(GWidget* parent)
|
||||||
layout()->set_margins({ 2, 2, 2, 2 });
|
layout()->set_margins({ 2, 2, 2, 2 });
|
||||||
layout()->set_spacing(2);
|
layout()->set_spacing(2);
|
||||||
m_label = new GLabel(this);
|
m_label = new GLabel(this);
|
||||||
m_label->set_frame_shadow(GFrame::Shadow::Sunken);
|
m_label->set_frame_shadow(FrameShadow::Sunken);
|
||||||
m_label->set_frame_shape(GFrame::Shape::Panel);
|
m_label->set_frame_shape(FrameShape::Panel);
|
||||||
m_label->set_frame_thickness(1);
|
m_label->set_frame_thickness(1);
|
||||||
m_label->set_text_alignment(TextAlignment::CenterLeft);
|
m_label->set_text_alignment(TextAlignment::CenterLeft);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
GTableView::GTableView(GWidget* parent)
|
GTableView::GTableView(GWidget* parent)
|
||||||
: GAbstractView(parent)
|
: GAbstractView(parent)
|
||||||
{
|
{
|
||||||
set_frame_shape(GFrame::Shape::Container);
|
set_frame_shape(FrameShape::Container);
|
||||||
set_frame_shadow(GFrame::Shadow::Sunken);
|
set_frame_shadow(FrameShadow::Sunken);
|
||||||
set_frame_thickness(2);
|
set_frame_thickness(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ GTextEditor::GTextEditor(Type type, GWidget* parent)
|
||||||
: GScrollableWidget(parent)
|
: GScrollableWidget(parent)
|
||||||
, m_type(type)
|
, m_type(type)
|
||||||
{
|
{
|
||||||
set_frame_shape(GFrame::Shape::Container);
|
set_frame_shape(FrameShape::Container);
|
||||||
set_frame_shadow(GFrame::Shadow::Sunken);
|
set_frame_shadow(FrameShadow::Sunken);
|
||||||
set_frame_thickness(2);
|
set_frame_thickness(2);
|
||||||
set_scrollbars_enabled(is_multi_line());
|
set_scrollbars_enabled(is_multi_line());
|
||||||
m_ruler_visible = is_multi_line();
|
m_ruler_visible = is_multi_line();
|
||||||
|
|
|
@ -23,8 +23,8 @@ GTreeView::MetadataForIndex& GTreeView::ensure_metadata_for_index(const GModelIn
|
||||||
GTreeView::GTreeView(GWidget* parent)
|
GTreeView::GTreeView(GWidget* parent)
|
||||||
: GAbstractView(parent)
|
: GAbstractView(parent)
|
||||||
{
|
{
|
||||||
set_frame_shape(GFrame::Shape::Container);
|
set_frame_shape(FrameShape::Container);
|
||||||
set_frame_shadow(GFrame::Shadow::Sunken);
|
set_frame_shadow(FrameShadow::Sunken);
|
||||||
set_frame_thickness(2);
|
set_frame_thickness(2);
|
||||||
|
|
||||||
m_expand_bitmap = GraphicsBitmap::load_from_file("/res/icons/treeview-expand.png");
|
m_expand_bitmap = GraphicsBitmap::load_from_file("/res/icons/treeview-expand.png");
|
||||||
|
|
|
@ -103,3 +103,54 @@ void StylePainter::paint_surface(Painter& painter, const Rect& rect, bool paint_
|
||||||
painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), Color::MidGray);
|
painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), Color::MidGray);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StylePainter::paint_frame(Painter& painter, const Rect& rect, FrameShape shape, FrameShadow shadow, int thickness, bool skip_vertical_lines)
|
||||||
|
{
|
||||||
|
Color top_left_color;
|
||||||
|
Color bottom_right_color;
|
||||||
|
Color dark_shade = Color::from_rgb(0x808080);
|
||||||
|
Color light_shade = Color::from_rgb(0xffffff);
|
||||||
|
|
||||||
|
if (shadow == FrameShadow::Raised) {
|
||||||
|
top_left_color = light_shade;
|
||||||
|
bottom_right_color = dark_shade;
|
||||||
|
} else if (shadow == FrameShadow::Sunken) {
|
||||||
|
top_left_color = dark_shade;
|
||||||
|
bottom_right_color = light_shade;
|
||||||
|
} else if (shadow == FrameShadow::Plain) {
|
||||||
|
top_left_color = dark_shade;
|
||||||
|
bottom_right_color = dark_shade;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thickness >= 1) {
|
||||||
|
painter.draw_line(rect.top_left(), rect.top_right(), top_left_color);
|
||||||
|
painter.draw_line(rect.bottom_left(), rect.bottom_right(), bottom_right_color);
|
||||||
|
|
||||||
|
if (shape != FrameShape::Panel || !skip_vertical_lines) {
|
||||||
|
painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left().translated(0, -1), top_left_color);
|
||||||
|
painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), bottom_right_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shape == FrameShape::Container && thickness >= 2) {
|
||||||
|
Color top_left_color;
|
||||||
|
Color bottom_right_color;
|
||||||
|
Color dark_shade = Color::from_rgb(0x404040);
|
||||||
|
Color light_shade = Color::from_rgb(0xc0c0c0);
|
||||||
|
if (shadow == FrameShadow::Raised) {
|
||||||
|
top_left_color = light_shade;
|
||||||
|
bottom_right_color = dark_shade;
|
||||||
|
} else if (shadow == FrameShadow::Sunken) {
|
||||||
|
top_left_color = dark_shade;
|
||||||
|
bottom_right_color = light_shade;
|
||||||
|
} else if (shadow == FrameShadow::Plain) {
|
||||||
|
top_left_color = dark_shade;
|
||||||
|
bottom_right_color = dark_shade;
|
||||||
|
}
|
||||||
|
Rect inner_container_frame_rect = rect.shrunken(2, 2);
|
||||||
|
painter.draw_line(inner_container_frame_rect.top_left(), inner_container_frame_rect.top_right(), top_left_color);
|
||||||
|
painter.draw_line(inner_container_frame_rect.bottom_left(), inner_container_frame_rect.bottom_right(), bottom_right_color);
|
||||||
|
painter.draw_line(inner_container_frame_rect.top_left().translated(0, 1), inner_container_frame_rect.bottom_left().translated(0, -1), top_left_color);
|
||||||
|
painter.draw_line(inner_container_frame_rect.top_right(), inner_container_frame_rect.bottom_right().translated(0, -1), bottom_right_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,9 +4,12 @@ class Painter;
|
||||||
class Rect;
|
class Rect;
|
||||||
|
|
||||||
enum class ButtonStyle { Normal, CoolBar, OldNormal };
|
enum class ButtonStyle { Normal, CoolBar, OldNormal };
|
||||||
|
enum class FrameShadow { Plain, Raised, Sunken };
|
||||||
|
enum class FrameShape { NoFrame, Container, Panel, VerticalLine, HorizontalLine };
|
||||||
|
|
||||||
class StylePainter {
|
class StylePainter {
|
||||||
public:
|
public:
|
||||||
static void paint_button(Painter&, const Rect&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false);
|
static void paint_button(Painter&, const Rect&, ButtonStyle, bool pressed, bool hovered = false, bool checked = false);
|
||||||
static void paint_surface(Painter&, const Rect&, bool paint_vertical_lines = true);
|
static void paint_surface(Painter&, const Rect&, bool paint_vertical_lines = true);
|
||||||
|
static void paint_frame(Painter&, const Rect&, FrameShape, FrameShadow, int thickness, bool skip_vertical_lines = false);
|
||||||
};
|
};
|
||||||
|
|
|
@ -169,25 +169,25 @@ static GWindow* make_frames_window()
|
||||||
widget->layout()->set_margins({ 8, 8, 8, 8 });
|
widget->layout()->set_margins({ 8, 8, 8, 8 });
|
||||||
widget->layout()->set_spacing(8);
|
widget->layout()->set_spacing(8);
|
||||||
|
|
||||||
auto add_label = [widget] (const String& text, GFrame::Shape shape, GFrame::Shadow shadow) {
|
auto add_label = [widget] (const String& text, FrameShape shape, FrameShadow shadow) {
|
||||||
auto* label = new GLabel(text, widget);
|
auto* label = new GLabel(text, widget);
|
||||||
label->set_size_policy(SizePolicy::Fill, SizePolicy::Fill);
|
label->set_size_policy(SizePolicy::Fill, SizePolicy::Fill);
|
||||||
label->set_frame_thickness(1);
|
label->set_frame_thickness(1);
|
||||||
label->set_frame_shape(shape);
|
label->set_frame_shape(shape);
|
||||||
label->set_frame_shadow(shadow);
|
label->set_frame_shadow(shadow);
|
||||||
if (shape == GFrame::Shape::Container) {
|
if (shape == FrameShape::Container) {
|
||||||
label->set_frame_thickness(2);
|
label->set_frame_thickness(2);
|
||||||
label->set_fill_with_background_color(true);
|
label->set_fill_with_background_color(true);
|
||||||
label->set_background_color(Color::White);
|
label->set_background_color(Color::White);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
add_label("Panel + Raised", GFrame::Shape::Panel, GFrame::Shadow::Raised);
|
add_label("Panel + Raised", FrameShape::Panel, FrameShadow::Raised);
|
||||||
add_label("Panel + Sunken", GFrame::Shape::Panel, GFrame::Shadow::Sunken);
|
add_label("Panel + Sunken", FrameShape::Panel, FrameShadow::Sunken);
|
||||||
add_label("Panel + Plain", GFrame::Shape::Panel, GFrame::Shadow::Plain);
|
add_label("Panel + Plain", FrameShape::Panel, FrameShadow::Plain);
|
||||||
add_label("Container + Raised", GFrame::Shape::Container, GFrame::Shadow::Raised);
|
add_label("Container + Raised", FrameShape::Container, FrameShadow::Raised);
|
||||||
add_label("Container + Sunken", GFrame::Shape::Container, GFrame::Shadow::Sunken);
|
add_label("Container + Sunken", FrameShape::Container, FrameShadow::Sunken);
|
||||||
add_label("Container + Plain", GFrame::Shape::Container, GFrame::Shadow::Plain);
|
add_label("Container + Plain", FrameShape::Container, FrameShadow::Plain);
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue