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:
parent
46a7e1b372
commit
a1eadc755d
Notes:
sideshowbarker
2024-07-18 12:13:40 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/a1eadc755d1
3 changed files with 20 additions and 17 deletions
|
@ -12,7 +12,7 @@
|
|||
|
||||
@GUI::TabWidget {
|
||||
name: "tab_widget"
|
||||
container_padding: 0
|
||||
container_margins: [0, 0, 0, 0]
|
||||
uniform_tabs: true
|
||||
text_alignment: "CenterLeft"
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
|
|
Loading…
Add table
Reference in a new issue