nim_duilib/duilib/Utils/Shadow.cpp
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

141 lines
3.0 KiB
C++

#include "StdAfx.h"
namespace ui
{
class ShadowBox : public Box
{
public:
virtual void Paint(IRenderContext* pRender, const UiRect& rcPaint) override
{
auto rcPos = GetPaddingPos();
if (rcPaint.left >= rcPos.left && rcPaint.top >= rcPos.top && rcPaint.right <= rcPos.right && rcPaint.bottom <= rcPos.bottom) {
return;
}
__super::Paint(pRender, rcPaint);
};
};
Shadow::Shadow() :
m_rcCurShadowCorner(14, 14, 14, 14),
m_rcDefaultShadowCorner(14, 14, 14, 14),
m_bShadowAttached(true),
m_bUseDefaultImage(true),
m_strImage(L"file='../public/bk/bk_shadow.png' corner='30,30,30,30'"),
m_pRoot(nullptr)
{
DpiManager::GetInstance()->ScaleRect(m_rcCurShadowCorner);
m_rcShadowCornerBackup = m_rcCurShadowCorner;
}
void Shadow::SetShadowImage(const std::wstring &image)
{
m_strImage = image;
m_bUseDefaultImage = false;
}
std::wstring Shadow::GetShadowImage() const
{
return m_strImage;
}
void Shadow::SetShadowCorner(const UiRect &rect)
{
m_rcDefaultShadowCorner = m_rcCurShadowCorner = rect;
DpiManager::GetInstance()->ScaleRect(m_rcCurShadowCorner);
m_rcShadowCornerBackup = m_rcCurShadowCorner;
}
UiRect Shadow::GetShadowCorner() const
{
if (m_bShadowAttached) {
return m_rcCurShadowCorner;
}
else {
return UiRect(0, 0, 0, 0);
}
}
void Shadow::ResetShadowBox()
{
if (m_bShadowAttached && m_pRoot) {
auto rcTempShadowCorner = m_rcDefaultShadowCorner;
DpiManager::GetInstance()->ScaleRect(rcTempShadowCorner);
m_rcShadowCornerBackup = m_rcCurShadowCorner = rcTempShadowCorner;
m_pRoot->GetLayout()->SetPadding(m_rcDefaultShadowCorner);
}
}
Box*Shadow::AttachShadow(Box* pRoot)
{
if (!m_bShadowAttached)
return pRoot;
m_pRoot = new ShadowBox();
m_pRoot->GetLayout()->SetPadding(m_rcCurShadowCorner, false);
int rootWidth = pRoot->GetFixedWidth();
if (rootWidth > 0) {
rootWidth += m_rcCurShadowCorner.left + m_rcCurShadowCorner.right;
}
m_pRoot->SetFixedWidth(rootWidth, true, false);
int rootHeight = pRoot->GetFixedHeight();
if (rootHeight > 0) {
rootHeight += m_rcCurShadowCorner.top + m_rcCurShadowCorner.bottom;
}
m_pRoot->SetFixedHeight(rootHeight, false);
if (m_bUseDefaultImage)
{
CSize size(3, 3);
pRoot->SetBorderRound(size);
}
m_pRoot->Add(pRoot);
m_pRoot->SetBkImage(m_strImage);
return m_pRoot;
}
void Shadow::MaximizedOrRestored(bool isMaximized)
{
if (!m_bShadowAttached)
return;
if (isMaximized && m_pRoot) {
m_rcCurShadowCorner = UiRect(0, 0, 0, 0);
m_pRoot->GetLayout()->SetPadding(m_rcCurShadowCorner, false);
if (m_bUseDefaultImage)
{
Control* control = m_pRoot->GetItemAt(0);
CSize size(0, 0);
control->SetBorderRound(size);
}
}
else if (!isMaximized && m_pRoot) {
m_rcCurShadowCorner = m_rcShadowCornerBackup;
m_pRoot->GetLayout()->SetPadding(m_rcCurShadowCorner, false);
if (m_bUseDefaultImage)
{
Control* control = m_pRoot->GetItemAt(0);
CSize size(3, 3);
control->SetBorderRound(size);
}
}
}
ui::Control* Shadow::GetRoot()
{
return m_pRoot;
}
void Shadow::ClearImageCache()
{
m_pRoot->ClearImageCache();
}
}