#pragma once
/**
 * @file mborder.h
 * @brief 定义具有边距的边框组件
 *
 * 此文件定义了mborder组件，它是一个复合组件，可以在其包含的单个子组件周围
 * 添加可自定义的边距(margin)。
 */

#include "widget/mcompound_widget.h"
#include "geometry/margin.h"

/**
 * @struct mborder_slot
 * @brief 边框组件的插槽结构，继承自mcompound_widget_slot
 *
 * 扩展了基本的复合组件插槽，添加了margin属性以控制内容周围的边距。
 * 默认配置为水平和垂直方向都拉伸填充。
 */
struct mborder_slot : mcompound_widget_slot<mborder_slot> {
	/**
	 * @brief 构造函数，设置默认对齐方式
	 *
	 * 初始化插槽，默认将子组件在水平和垂直方向上都设为拉伸填充模式
	 */
	mborder_slot() {
		h_alignment(horizontal_alignment_t::stretch);
		v_alignment(vertical_alignment_t::stretch);
	}

	/**
	 * 定义margin属性，用于控制子组件周围的边距
	 */
	SLOT_ATTRIBUTE(margin_t, margin)
};

/**
 * @class mborder
 * @brief 边框组件，提供对单个子组件的边距控制
 *
 * mborder是一个容器组件，只能包含一个子组件，并在其周围添加可配置的边距。
 * 通过调整margin属性可以控制子组件与边框之间的距离。
 */
class mborder : public mcompound_widget<mborder_slot> {
public:
	/**
	 * @brief 排列子组件
	 * @param in_allotted_geometry 分配给组件的几何区域
	 *
	 * 重写基类方法，在排列子组件时考虑margin属性。
	 * 子组件将根据对齐方式和设置的边距进行布局。
	 */
	virtual void arrange_children(const geometry_t& in_allotted_geometry) override {
		const auto& slot = get_child_slot();
		if (const auto child_widget = slot.get())
			arrange_single_child(in_allotted_geometry,
							   child_widget,
							   slot.h_alignment(),
							   slot.v_alignment(),
							   slot.margin());
	}
};
