LibGUI: Allow tweaking each edge of TabWidget's content margins

Instead of having a single uniform margin around the child content of
a TabWidget, use a GUI::Margins to allow individual per-edge margins.
This commit is contained in:
Andreas Kling 2021-06-15 14:28:39 +02:00
parent 46a7e1b372
commit a1eadc755d
Notes: sideshowbarker 2024-07-18 12:13:40 +09:00
3 changed files with 20 additions and 17 deletions

View file

@ -12,7 +12,7 @@
@GUI::TabWidget {
name: "tab_widget"
container_padding: 0
container_margins: [0, 0, 0, 0]
uniform_tabs: true
text_alignment: "CenterLeft"
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -23,7 +23,7 @@ TabWidget::TabWidget()
{
set_focus_policy(FocusPolicy::NoFocus);
REGISTER_INT_PROPERTY("container_padding", container_padding, set_container_padding);
REGISTER_MARGINS_PROPERTY("container_margins", container_margins, set_container_margins);
REGISTER_BOOL_PROPERTY("uniform_tabs", uniform_tabs, set_uniform_tabs);
register_property(
@ -119,10 +119,10 @@ Gfx::IntRect TabWidget::child_rect_for_size(const Gfx::IntSize& size) const
Gfx::IntRect rect;
switch (m_tab_position) {
case TabPosition::Top:
rect = { { container_padding(), bar_height() + container_padding() }, { size.width() - container_padding() * 2, size.height() - bar_height() - container_padding() * 2 } };
rect = { { m_container_margins.left(), bar_height() + m_container_margins.top() }, { size.width() - m_container_margins.left() - m_container_margins.right(), size.height() - bar_height() - m_container_margins.top() - m_container_margins.bottom() } };
break;
case TabPosition::Bottom:
rect = { { container_padding(), container_padding() }, { size.width() - container_padding() * 2, size.height() - bar_height() - container_padding() * 2 } };
rect = { { m_container_margins.left(), m_container_margins.top() }, { size.width() - m_container_margins.left() - m_container_margins.right(), size.height() - bar_height() - m_container_margins.top() - m_container_margins.bottom() } };
break;
}
if (rect.is_empty())
@ -183,15 +183,11 @@ void TabWidget::paint_event(PaintEvent& event)
Painter painter(*this);
painter.add_clip_rect(event.rect());
auto container_rect = this->container_rect();
auto padding_rect = container_rect;
for (int i = 0; i < container_padding(); ++i) {
painter.draw_rect(padding_rect, palette().button());
padding_rect.shrink(2, 2);
}
painter.fill_rect(event.rect(), palette().button());
if (container_padding() > 0)
Gfx::StylePainter::paint_frame(painter, container_rect, palette(), Gfx::FrameShape::Container, Gfx::FrameShadow::Raised, 2);
if (!m_container_margins.is_null()) {
Gfx::StylePainter::paint_frame(painter, container_rect(), palette(), Gfx::FrameShape::Container, Gfx::FrameShadow::Raised, 2);
}
auto paint_tab_icon_if_needed = [&](auto& icon, auto& button_rect, auto& text_rect) {
if (!icon)
@ -452,4 +448,10 @@ void TabWidget::context_menu_event(ContextMenuEvent& context_menu_event)
}
}
void TabWidget::set_container_margins(GUI::Margins const& margins)
{
m_container_margins = margins;
update();
}
}

View file

@ -1,11 +1,12 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibGUI/Margins.h>
#include <LibGUI/Widget.h>
namespace GUI {
@ -32,8 +33,8 @@ public:
int bar_height() const { return m_bar_visible ? 21 : 0; }
int container_padding() const { return m_container_padding; }
void set_container_padding(int padding) { m_container_padding = padding; }
GUI::Margins const& container_margins() const { return m_container_margins; }
void set_container_margins(GUI::Margins const&);
void add_widget(const StringView&, Widget&);
void remove_widget(Widget&);
@ -101,7 +102,7 @@ private:
Vector<TabData> m_tabs;
TabPosition m_tab_position { TabPosition::Top };
int m_hovered_tab_index { -1 };
int m_container_padding { 2 };
GUI::Margins m_container_margins { 2, 2, 2, 2 };
Gfx::TextAlignment m_text_alignment { Gfx::TextAlignment::Center };
bool m_uniform_tabs { false };
bool m_bar_visible { true };