PaddingWidget creates space around a child widget by applying padding on all four sides with configurable values for each edge.
Basic Usage
#include <fern/fern.hpp>
using namespace Fern;
auto button = Button(ButtonConfig(0, 0, 100, 30, "Click"));
auto padded = Padding(button, 10); // 10px on all sides
Constructor
PaddingWidget(int x, int y, int width, int height,
int left, int top, int right, int bottom)
X position of the padding container
Y position of the padding container
Total width including padding
Total height including padding
Factory Functions
std::shared_ptr<PaddingWidget> Padding(
std::shared_ptr<Widget> child,
int all,
bool addToManager = false
)
Applies the same padding to all sides.
Custom Padding
std::shared_ptr<PaddingWidget> Padding(
std::shared_ptr<Widget> child,
int left, int top, int right, int bottom,
bool addToManager = false
)
Applies different padding to each side.
Methods
Adding Children
void add(std::shared_ptr<Widget> child)
Examples
auto button = Button(ButtonConfig(0, 0, 100, 30, "Click Me"));
auto padded = Padding(button, 10); // 10px on all sides
Custom Padding Per Side
auto text = Text(Point(0, 0), "Padded Text", 2, Colors::White);
auto padded = Padding(text, 20, 10, 20, 10); // left, top, right, bottom
Padding Around a Column
auto column = Column({
Text(Point(0, 0), "Title", 3, Colors::White),
Text(Point(0, 0), "Content", 2, Colors::Gray)
});
auto padded = Padding(column, 20); // Add space around the entire column
Horizontal Padding Only
auto button = Button(ButtonConfig(0, 0, 100, 30, "Button"));
auto padded = Padding(button, 30, 0, 30, 0); // 30px left/right, 0px top/bottom
Vertical Padding Only
auto text = Text(Point(0, 0), "Text", 2, Colors::White);
auto padded = Padding(text, 0, 20, 0, 20); // 0px left/right, 20px top/bottom
Padding in a Row
auto button1 = Button(ButtonConfig(0, 0, 80, 30, "First"));
auto button2 = Button(ButtonConfig(0, 0, 80, 30, "Second"));
auto row = Row({
Padding(button1, 10), // Pad each button individually
Padding(button2, 10)
});
Asymmetric Padding
auto widget = Text(Point(0, 0), "Asymmetric", 2, Colors::White);
auto padded = Padding(widget, 5, 10, 15, 20);
// 5px left, 10px top, 15px right, 20px bottom
Padding for Card-like Layout
auto cardContent = Column({
Text(Point(0, 0), "Card Title", 3, Colors::White),
SizedBox(0, 10),
Text(Point(0, 0), "Card content goes here...", 2, Colors::Gray),
SizedBox(0, 20),
Button(ButtonConfig(0, 0, 100, 30, "Action"))
});
auto card = Padding(cardContent, 25); // Card-like padding
Nested Padding
auto innerContent = Text(Point(0, 0), "Inner", 2, Colors::White);
auto innerPadded = Padding(innerContent, 10);
auto outerPadded = Padding(innerPadded, 15);
// Total: 25px padding on all sides
Padding with Background
Combine with Container for visual padding:
auto content = Column({
Text(Point(0, 0), "Title", 3, Colors::White),
Text(Point(0, 0), "Description", 2, Colors::Gray)
});
auto paddedContent = Padding(content, 20);
auto container = Container(Colors::DarkGray, 0, 0, 300, 150, paddedContent);
Complete Example
#include <fern/fern.hpp>
using namespace Fern;
void setupUI() {
// Create a form with consistent padding
auto title = Text(Point(0, 0), "Settings", 3, Colors::White);
auto input1 = TextInput(TextInputConfig(0, 0, 200, 30)
.placeholder("Name"));
auto input2 = TextInput(TextInputConfig(0, 0, 200, 30)
.placeholder("Email"));
auto saveBtn = Button(ButtonConfig(0, 0, 200, 35, "Save"));
auto form = Column({
title,
SizedBox(0, 20),
input1,
SizedBox(0, 15),
input2,
SizedBox(0, 25),
saveBtn
});
// Add padding around the entire form
auto paddedForm = Padding(form, 30);
auto centered = Center(paddedForm);
addWidget(centered);
}
Common Padding Values
Standard Spacing
- Tight: 5-10px - Minimal spacing
- Normal: 15-20px - Standard spacing
- Loose: 25-40px - Generous spacing
Use Cases
// Tight padding for compact UIs
auto tight = Padding(widget, 8);
// Normal padding for standard layouts
auto normal = Padding(widget, 20);
// Loose padding for spacious designs
auto loose = Padding(widget, 30);
Layout Example
From examples/cpp/new/complete_layout_showcase.cpp:
auto leftColumn = Column({
Text(Point(0, 0), "Left Panel", 2, Colors::Cyan),
SizedBox(0, 20),
volumeSlider,
brightnessSlider
});
auto rightColumn = Column({
Text(Point(0, 0), "Right Panel", 2, Colors::Cyan),
SizedBox(0, 20),
searchBox
});
// Add padding to each column
auto leftPadded = Padding(leftColumn, 20);
auto rightPadded = Padding(rightColumn, 20);
auto mainLayout = Row({
leftPadded,
SizedBox(30, 0),
rightPadded
});
Best Practices
Use Consistent Padding
Maintain consistent padding throughout your UI:
const int STANDARD_PADDING = 20;
auto padded1 = Padding(widget1, STANDARD_PADDING);
auto padded2 = Padding(widget2, STANDARD_PADDING);
Padding works well with Row, Column, and Center:
auto content = Column({widget1, widget2});
auto paddedContent = Padding(content, 20);
auto centered = Center(paddedContent);
Use Padding for outer spacing, SizedBox for inner spacing:
auto column = Column({
widget1,
SizedBox(0, 10), // Space between widgets
widget2
});
auto padded = Padding(column, 20); // Outer padding
See Also