1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-19 04:05:07 +00:00
serenity/LibGUI/GToolBar.cpp
Andreas Kling d48f486634 LibGUI: Don't draw left and right side of surfaces that span entire window.
In other words, if a surface stretches from the left side of the window
all the way to the right side, skip shading and highlighting the sides.
This makes widgets blend together just slightly with the window. :^)
2019-03-29 02:20:22 +01:00

83 lines
2.4 KiB
C++

#include <LibGUI/GToolBar.h>
#include <LibGUI/GBoxLayout.h>
#include <LibGUI/GButton.h>
#include <LibGUI/GAction.h>
#include <LibGUI/GPainter.h>
GToolBar::GToolBar(GWidget* parent)
: GWidget(parent)
{
set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
set_preferred_size({ 0, 28 });
set_layout(make<GBoxLayout>(Orientation::Horizontal));
layout()->set_spacing(0);
layout()->set_margins({ 2, 2, 2, 2 });
}
GToolBar::~GToolBar()
{
}
void GToolBar::add_action(Retained<GAction>&& action)
{
GAction* raw_action_ptr = action.ptr();
auto item = make<Item>();
item->type = Item::Action;
item->action = move(action);
auto* button = new GButton(this);
if (item->action->icon())
button->set_icon(item->action->icon());
else
button->set_caption(item->action->text());
button->on_click = [raw_action_ptr] (const GButton&) {
raw_action_ptr->activate();
};
button->set_button_style(ButtonStyle::CoolBar);
button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed);
ASSERT(button->size_policy(Orientation::Horizontal) == SizePolicy::Fixed);
ASSERT(button->size_policy(Orientation::Vertical) == SizePolicy::Fixed);
button->set_preferred_size({ 24, 24 });
m_items.append(move(item));
}
class SeparatorWidget final : public GWidget {
public:
SeparatorWidget(GWidget* parent)
: GWidget(parent)
{
set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed);
set_background_color(Color::White);
set_preferred_size({ 8, 22 });
}
virtual ~SeparatorWidget() override { }
virtual void paint_event(GPaintEvent& event) override
{
GPainter painter(*this);
painter.set_clip_rect(event.rect());
painter.translate(rect().center().x() - 1, 0);
painter.draw_line({ 0, 0 }, { 0, rect().bottom() }, Color::MidGray);
painter.draw_line({ 1, 0 }, { 1, rect().bottom() }, Color::White);
}
private:
virtual const char* class_name() const override { return "SeparatorWidget"; }
};
void GToolBar::add_separator()
{
auto item = make<Item>();
item->type = Item::Separator;
new SeparatorWidget(this);
m_items.append(move(item));
}
void GToolBar::paint_event(GPaintEvent& event)
{
GPainter painter(*this);
painter.set_clip_rect(event.rect());
StylePainter::the().paint_surface(painter, rect(), !spans_entire_window_horizontally());
}