/*!
@~chinese
@file darrowrectangle.h
@ingroup tooltip
@class Dtk::Widget::DArrowRectangle
@brief DArrowRectangle 提供了可以在四个边中的任意一个边显示箭头的矩形控件.
@details 通常用于作为其他控件的容器，将其显示在矩形内作为内容控件
@sa DArrowRectangle::setContent()

## DArrowRectangle 用法示例
通过简单的程序来了解 DArrowRectangle的用法。
项目目录结构在同一目录下。

### CMakeLists.txt
```cmake
cmake_minimum_required(VERSION 3.1.0) # 指定cmake最低版本

project(example1 VERSION 1.0.0 LANGUAGES CXX) # 指定项目名称, 版本, 语言 cxx就是c++

set(CMAKE_CXX_STANDARD 11) # 指定c++标准
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 指定c++标准要求,至少为11以上
set(target example1) # 指定目标名称

set(CMAKE_AUTOMOC ON) # support qt moc # 支持qt moc
set(CMAKE_AUTORCC ON) # support qt resource file # 支持qt资源文件
set(CMAKE_AUTOUIC ON) # support qt ui file # 支持qt ui文件(非必须)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # support clangd 支持 clangd

if (CMAKE_VERSION VERSION_LESS "3.7.0") # 如果cmake版本小于3.7.0
    set(CMAKE_INCLUDE_CURRENT_DIR ON) # 设置包含当前目录
endif()

find_package(Qt5 COMPONENTS Widgets REQUIRED) # 寻找Qt5组件Widgets
find_package(Qt5 COMPONENTS Gui  REQUIRED) # 寻找Qt5组件Gui
find_package(Dtk COMPONENTS Widget REQUIRED) # 寻找Dtk组件Widget
find_package(Dtk COMPONENTS Core REQUIRED) # 寻找Dtk组件Core
find_package(Dtk COMPONENTS Gui) # 寻找Dtk组件Gui

add_executable(example1     # 添加可执行文件
        main.cpp
)

target_link_libraries(example1 PRIVATE
    Qt5::Widgets
    Qt5::Gui
    dtkgui
    dtkcore
    dtkwidget
) # 链接库
```

### main.cpp (浮动方式为 FloatWidget)

```cpp

#include <DArrowRectangle> //导入DArrowRectangle依赖包
#include <DApplication>
#include <DMainWindow>
#include <DWidget>
#include <DPushButton>
DWIDGET_USE_NAMESPACE //使用DTK widget命名空间

int main(int argc, char *argv[]){
    DApplication app(argc, argv);
    DMainWindow win; //实例化一个 mainwindow 作为主窗口
    win.resize(400,250); //设置窗口大小

    //实例化一个 DArrowRectangle 控件， 第一个参数指定方向，第二个参数指定浮动方式，第三个参数指定父控件地址
    DArrowRectangle *arrRec = new DArrowRectangle(DArrowRectangle::ArrowTop, DArrowRectangle::FloatWidget, &win);
    DWidget widget; //新建一个 widget 作为DArrowRectangle中的显示内容
    DPushButton *btn = new DPushButton("按钮", &widget); //新建一个按钮放到上面新建的widget中
    btn->move(20,25);

    widget.resize(100,70); //设置 widget 大小，注意 DArrowRectangle 会根据其内容 widget 的大小改变其本身大小
    arrRec->setContent(&widget); //将 widget 放置到 DArrowRectangle 里
    arrRec->setArrowX(50); //设置 DArrowRectangle 的箭头位置
    arrRec->setRadiusArrowStyleEnable(true); //可通过此函数设置 DArrowRectangle 箭头是否为圆角风格
    arrRec->setRadius(8); //设置 DArrowRectangle 圆角值
    arrRec->move(200, 50); //移动 DArrowRectangle 的位置

    win.show(); //展示主窗口
    return app.exec(); //运行程序并等待响应
}

```

运行程序效果如下：</br>

![darrowrectangle_example1](/docs/images/darrowrectangle_example1.png)

### main.cpp (浮动方式为 FloatWindow)

```cpp

#include <DArrowRectangle> //导入DArrowRectangle依赖包
#include <DApplication>
#include <DMainWindow>
#include <DWidget>
#include <DPushButton>
DWIDGET_USE_NAMESPACE //使用DTK widget命名空间

int main(int argc, char *argv[]){
    DApplication app(argc, argv);

    //实例化一个 DArrowRectangle 控件， 第一个参数指定方向，第二个参数指定浮动方式，第三个参数指定父控件地址
    DArrowRectangle *arrRec = new DArrowRectangle(DArrowRectangle::ArrowTop, DArrowRectangle::FloatWindow);
    DWidget widget; //新建一个 widget 作为DArrowRectangle中的显示内容
    DPushButton *btn = new DPushButton("按钮", &widget); //新建一个按钮放到上面新建的widget中
    btn->move(20,25);

    widget.resize(100,60); //设置 widget 大小，注意 DArrowRectangle 会根据其内容 widget 的大小改变其本身大小
    arrRec->setContent(&widget); //将 widget 放置到 DArrowRectangle 里
    arrRec->setArrowX(50); //设置 DArrowRectangle 的箭头位置
    arrRec->setRadiusArrowStyleEnable(true); //可通过此函数设置 DArrowRectangle 的箭头是否为圆角风格
    arrRec->setRadius(8); //设置 DArrowRectangle 圆角值
    arrRec->show(200, 500); //显示 DArrowRectangle

    return app.exec(); //运行程序并等待响应
}

```

运行程序效果如下：</br>

![darrowrectangle_example2](/docs/images/darrowrectangle_example2.png)

@enum Dtk::Widget::DArrowRectangle::ArrowDirection
@brief 箭头方向枚举包含 DArrowRectangle 的箭头可能指向的可能方向.
@var Dtk::Widget::DArrowRectangle::ArrowDirection Dtk::Widget::DArrowRectangle::ArrowLeft
@brief 指示此矩形的箭头将指向左侧
@var Dtk::Widget::DArrowRectangle::ArrowDirection Dtk::Widget::DArrowRectangle::ArrowRight
@brief 指示此矩形的箭头将指向右侧
@var Dtk::Widget::DArrowRectangle::ArrowDirection Dtk::Widget::DArrowRectangle::ArrowTop
@brief 指示此矩形的箭头将指向上方
@var Dtk::Widget::DArrowRectangle::ArrowDirection Dtk::Widget::DArrowRectangle::ArrowBottom
@brief 指示此矩形的箭头将向下指向

@enum Dtk::Widget::DArrowRectangle::FloatMode
@brief FloatMode 表示不同的控件的浮动模式
@details 控件的浮动模式表示控件如何显示在布局中,DArrowRectangle::FloatWindow 表示控件将会以一个单独的窗口显示，而 DArrowRectangle::FloatWidget 则表示控件只能显示在其父控件的布局中，不能超出父控件大小
@var Dtk::Widget::DArrowRectangle::FloatMode Dtk::Widget::DArrowRectangle::FloatWindow
@brief 控件将会以一个单独的窗口显示
@var Dtk::Widget::DArrowRectangle::FloatMode Dtk::Widget::DArrowRectangle::FloatWidget
@brief 控件只能显示在其父控件的布局中，不能超出父控件大小

@fn explicit DArrowRectangle::DArrowRectangle(ArrowDirection direction, QWidget *parent = nullptr)
@brief 获取 DArrowRectangle 实例
@param[in] direction 用于初始化箭头的方向
@param[in] parent 作为其父控件

@fn explicit DArrowRectangle::DArrowRectangle(ArrowDirection direction, FloatMode floatMode, QWidget *parent = nullptr)
@brief 获取 DArrowRectangle 实例，并指定浮动模式.
@param[in] direction 用于初始化箭头的方向
@param[in] floatMode 浮动模式
@param[in] parent 作为其父控件
@sa DArrowRectangle::FloatMode

@fn virtual void DArrowRectangle::show(int x, int y)
@brief 在指定的坐标位置显示本控件
@note 坐标被计算为箭头的位置，所以你不需要自己计算箭头位置
@param[in] x 控件箭头的x轴坐标
@param[in] y 控件箭头的y轴坐标

@fn void DArrowRectangle::setContent(QWidget *content)
@brief 设置要显示在矩形内的内容控件
@param[in] content 要显示内容控件

@fn QWidget *DArrowRectangle::getContent() const
@brief 获取内容控件
@return 正在显示的内容控件

@fn void DArrowRectangle::resizeWithContent()
@brief 根据内容控件的大小自动设置矩形控件的大小

@fn QSize DArrowRectangle::getFixedSize()
@brief 获取整个矩形控件的大小
@return 矩形控件的大小

@fn void DArrowRectangle::move(int x, int y)
@brief 移动到指定的坐标位置
@param[in] x 控件箭头的x轴坐标
@param[in] y 控件箭头的y轴坐标
@sa DArrowRectangle::show(int x, int y)
@sa DArrowRectangle::show

@property qreal DArrowRectangle::shadowYOffset
@brief 这属性表示小部件及其阴影在y轴上的偏移量
@details Getter: DArrowRectangle::shadowYOffset Setter: DArrowRectangle::setShadowYOffset
@sa DArrowRectangle::shadowXOffset

@fn void DArrowRectangle::setLeftRightRadius(bool enable)
@brief 设置左右箭头时的圆角
@param[in] enable 是否开启

@fn void DArrowRectangle::setRadiusArrowStyleEnable(bool enable)
@brief 设置圆角箭头样式
@param[in] enable 是否开启

@fn void DArrowRectangle::setRadiusForceEnable(bool enable)
@brief 设置圆角样式
@details 默认窗管支持特效混成时有圆角，没有特效时没有圆角，如果启用一直都有圆角
@param[in] enable 是否开启

@property qreal DArrowRectangle::shadowXOffset
@brief 这属性表示小部件及其阴影在x轴上的偏移量
@details Getter: DArrowRectangle::shadowXOffset Setter: DArrowRectangle::setShadowXOffset
@sa DArrowRectangle::shadowYOffset

@property qreal DArrowRectangle::shadowBlurRadius
@brief 这个属性保存小部件阴影的模糊半径
@details Getter: DArrowRectangle::shadowBlurRadius Setter: DArrowRectangle::setShadowBlurRadius

@property QColor DArrowRectangle::borderColor
@brief 这个属性表示控件边框的颜色
@details Getter: DArrowRectangle::borderColor , Setter: DArrowRectangle::setBorderColor

@property int DArrowRectangle::borderWidth
@brief 这个属性表示控件边框的宽度
@details Getter: DArrowRectangle::borderWidth , Setter: DArrowRectangle::setBorderWidth

@property QColor DArrowRectangle::backgroundColor
@brief 这个属性表示矩形控件的背景颜色
@details Getter: DArrowRectangle::backgroundColor , Setter: DArrowRectangle::setBackgroundColor

@property DArrowRectangle::ArrowDirection DArrowRectangle::arrowDirection
@brief 这个属性表示箭头的方向
@details Getter: DArrowRectangle::arrowDirection , Setter: DArrowRectangle::setArrowDirection

@fn void DArrowRectangle::setBackgroundColor(DBlurEffectWidget::MaskColorType type)
@brief 是一个重载方法
@details 通过改变 DBlurEffectWidget::MaskColorType 来修改控件矩形的背景
@param[in] type 要设置的蒙版颜色
@sa DArrowRectangle::backgroundColor
@sa DBlurEffectWidget::MaskColorType

@property int DArrowRectangle::radius
@brief 这个属性表示矩形的圆角
@details Getter: DArrowRectangle::radius , Setter: DArrowRectangle::setRadius

@property bool DArrowRectangle::radiusForceEnabled
@brief 是否强制(忽略特效)开启圆角
@details Getter: DArrowRectangle::radiusForceEnabled , Setter: DArrowRectangle::setRadiusForceEnable

@property int DArrowRectangle::arrowHeight
@brief 这个属性表示箭头的高度
@details Getter: DArrowRectangle::arrowHeight , Setter: DArrowRectangle::setArrowHeight
@sa DArrowRectangle::arrowWidth

@property int DArrowRectangle::arrowWidth
@brief 这个属性表示箭头的宽度
@details Getter: DArrowRectangle::arrowWidth , Setter: DArrowRectangle::setArrowWidth
@sa DArrowRectangle::arrowHeight

@property int DArrowRectangle::arrowX
@brief 这个属性表示箭头的x轴坐标
@details Getter: DArrowRectangle::arrowX , Setter: DArrowRectangle::setArrowX
@sa DArrowRectangle::arrowY

@property int DArrowRectangle::arrowY
@brief 这个属性表示箭头的y轴坐标
@details Getter: DArrowRectangle::arrowY , Setter: DArrowRectangle::setArrowY
@sa DArrowRectangle::arrowX

@property int DArrowRectangle::margin
@brief 这个属性表示边距大小
@details 边距是指矩形最里面的像素与其内容最外面的像素之间的距离
@details Getter: DArrowRectangle::margin , Setter: DArrowRectangle::setMargin
@sa DArrowRectangle::setMargin

@fn void DArrowRectangle::setArrowDirection(ArrowDirection value)
@brief 设置箭头方向
@param[in] value 箭头方向
@sa DArrowRectangle::arrowDirection

@fn void DArrowRectangle::setWidth(int value)
@brief 设置整个控件固定的宽度
@param[in] value 宽度大小

@fn void DArrowRectangle::setHeight(int value)
@brief 设置整个控件固定的高度
@param[in] value 高度大小

@fn void DArrowRectangle::setRadius(int value)
@brief 设置圆角大小
@param[in] value 圆角大小
@sa DArrowRectangle::radius

@fn void DArrowRectangle::setArrowHeight(int value)
@brief 设置箭头高度
@param[in] value 箭头高度
@sa DArrowRectangle::arrowHeight

@fn void DArrowRectangle::setArrowWidth(int value)
@brief 设置箭头宽度
@param[in] value 箭头宽度
@sa DArrowRectangle::arrowWidth

@fn void DArrowRectangle::setArrowX(int value)
@brief 设置箭头 x 坐标的值
@param[in] value x 坐标的值
@sa DArrowRectangle::arrowX

@fn void DArrowRectangle::setArrowY(int value)
@brief 设置箭头 y 坐标的值
@param[in] y 坐标的值
@sa DArrowRectangle::arrowY

@fn void DArrowRectangle::setMargin(int value)
@brief 设置边距大小
@param[in] value 边距大小
@sa DArrowRectangle::margin

*/
