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

429 lines
7.5 KiB
C++
Raw Permalink Blame History

#include "StdAfx.h"
namespace ui
{
PlaceHolder::PlaceHolder() :
m_pWindow(nullptr),
m_sName(),
m_cxyFixed(DUI_LENGTH_STRETCH, DUI_LENGTH_STRETCH),
m_cxyMin(-1, -1),
m_cxyMax(9999999, 9999999),
m_pParent(nullptr),
m_rcItem(),
m_horAlignType(kHorAlignLeft),
m_verAlignType(kVerAlignTop),
m_bFloat(false),
m_bReEstimateSize(true),
m_bVisible(true),
m_bInternVisible(true),
m_bIsArranged(true),
m_bUseCache(false),
m_bCacheDirty(false)
{
}
PlaceHolder::PlaceHolder(const PlaceHolder& r) :
m_pWindow(nullptr),
m_sName(r.m_sName),
m_cxyFixed(r.m_cxyFixed),
m_cxyMin(r.m_cxyMin),
m_cxyMax(r.m_cxyMax),
m_pParent(nullptr),
m_rcItem(r.m_rcItem),
m_horAlignType(r.m_horAlignType),
m_verAlignType(r.m_verAlignType),
m_bFloat(r.m_bFloat),
m_bReEstimateSize(r.m_bReEstimateSize),
m_bVisible(r.m_bVisible),
m_bInternVisible(r.m_bInternVisible),
m_bIsArranged(r.m_bIsArranged),
m_bUseCache(r.m_bUseCache),
m_bCacheDirty(r.m_bCacheDirty)
{
m_renderContext.reset();
}
PlaceHolder::~PlaceHolder()
{
}
ui::Box* PlaceHolder::GetAncestor(const std::wstring& strName)
{
Box* pAncestor = this->GetParent();
while (pAncestor && pAncestor->GetName() != strName)
{
pAncestor = pAncestor->GetParent();
}
return pAncestor;
}
std::wstring PlaceHolder::GetName() const
{
return m_sName;
}
std::string PlaceHolder::GetUTF8Name() const
{
std::string strOut;
StringHelper::UnicodeToMBCS(m_sName, strOut, CP_UTF8);
return strOut;
}
void PlaceHolder::SetName(const std::wstring& strName)
{
m_sName = strName;
}
void PlaceHolder::SetUTF8Name(const std::string& strName)
{
std::wstring strOut;
StringHelper::MBCSToUnicode(strName, strOut, CP_UTF8);
m_sName = strOut;
}
Window* PlaceHolder::GetWindow() const
{
return m_pWindow;
}
void PlaceHolder::SetWindow(Window* pManager, Box* pParent, bool bInit)
{
m_pWindow = pManager;
m_pParent = pParent;
if (bInit && m_pParent) Init();
}
void PlaceHolder::SetWindow(Window* pManager)
{
m_pWindow = pManager;
}
void PlaceHolder::Init()
{
DoInit();
}
void PlaceHolder::DoInit()
{
}
bool PlaceHolder::IsVisible() const
{
return m_bVisible && m_bInternVisible;
}
bool PlaceHolder::IsInternVisible() const
{
return m_bInternVisible;
}
bool PlaceHolder::IsFloat() const
{
return m_bFloat;
}
void PlaceHolder::SetFloat(bool bFloat)
{
if (m_bFloat == bFloat) return;
m_bFloat = bFloat;
ArrangeAncestor();
}
int PlaceHolder::GetFixedWidth() const
{
return m_cxyFixed.cx;
}
void PlaceHolder::SetFixedWidth(int cx, bool bArrange, bool bNeedDpiScale)
{
if (cx < 0 && cx != DUI_LENGTH_STRETCH && cx != DUI_LENGTH_AUTO) {
ASSERT(FALSE);
return;
}
if (bNeedDpiScale && cx > 0)
DpiManager::GetInstance()->ScaleInt(cx);
if (m_cxyFixed.cx != cx)
{
m_cxyFixed.cx = cx;
if (bArrange) {
ArrangeAncestor();
}
else {
m_bReEstimateSize = true;
}
}
//if( !m_bFloat ) ArrangeAncestor();
//else Arrange();
}
int PlaceHolder::GetFixedHeight() const
{
return m_cxyFixed.cy;
}
void PlaceHolder::SetFixedHeight(int cy, bool bNeedDpiScale)
{
if (cy < 0 && cy != DUI_LENGTH_STRETCH && cy != DUI_LENGTH_AUTO) {
ASSERT(FALSE);
return;
}
if (bNeedDpiScale && cy > 0)
DpiManager::GetInstance()->ScaleInt(cy);
if (m_cxyFixed.cy != cy)
{
m_cxyFixed.cy = cy;
ArrangeAncestor();
}
//if( !m_bFloat ) ArrangeAncestor();
//else Arrange();
}
int PlaceHolder::GetMinWidth() const
{
return m_cxyMin.cx;
}
void PlaceHolder::SetMinWidth(int cx)
{
DpiManager::GetInstance()->ScaleInt(cx);
if (m_cxyMin.cx == cx) return;
if (cx < 0) return;
m_cxyMin.cx = cx;
if (!m_bFloat) ArrangeAncestor();
else Arrange();
}
int PlaceHolder::GetMaxWidth() const
{
return m_cxyMax.cx;
}
void PlaceHolder::SetMaxWidth(int cx)
{
DpiManager::GetInstance()->ScaleInt(cx);
if (m_cxyMax.cx == cx) return;
m_cxyMax.cx = cx;
if (!m_bFloat) ArrangeAncestor();
else Arrange();
}
int PlaceHolder::GetMinHeight() const
{
return m_cxyMin.cy;
}
void PlaceHolder::SetMinHeight(int cy)
{
DpiManager::GetInstance()->ScaleInt(cy);
if (m_cxyMin.cy == cy) return;
if (cy < 0) return;
m_cxyMin.cy = cy;
if (!m_bFloat) ArrangeAncestor();
else Arrange();
}
int PlaceHolder::GetMaxHeight() const
{
return m_cxyMax.cy;
}
void PlaceHolder::SetMaxHeight(int cy)
{
DpiManager::GetInstance()->ScaleInt(cy);
if (m_cxyMax.cy == cy) return;
m_cxyMax.cy = cy;
if (!m_bFloat) ArrangeAncestor();
else Arrange();
}
int PlaceHolder::GetWidth() const
{
return m_rcItem.right - m_rcItem.left;
}
int PlaceHolder::GetHeight() const
{
return m_rcItem.bottom - m_rcItem.top;
}
ui::HorAlignType PlaceHolder::GetHorAlignType() const
{
return m_horAlignType;
}
void PlaceHolder::SetHorAlignType(HorAlignType horAlignType)
{
m_horAlignType = horAlignType;
}
ui::VerAlignType PlaceHolder::GetVerAlignType() const
{
return m_verAlignType;
}
void PlaceHolder::SetVerAlignType(VerAlignType verAlignType)
{
m_verAlignType = verAlignType;
}
bool PlaceHolder::IsReEstimateSize() const
{
return m_bReEstimateSize;
}
void PlaceHolder::SetReEstimateSize(bool bReEstimateSize)
{
m_bReEstimateSize = bReEstimateSize;
}
CSize PlaceHolder::EstimateSize(CSize szAvailable)
{
return m_cxyFixed;
}
UiRect PlaceHolder::GetPos(bool bContainShadow) const
{
return m_rcItem;
}
void PlaceHolder::SetPos(UiRect rc)
{
m_rcItem = rc;
}
void PlaceHolder::Arrange()
{
if (GetFixedWidth() == DUI_LENGTH_AUTO || GetFixedHeight() == DUI_LENGTH_AUTO)
{
ArrangeAncestor();
}
else
{
ArrangeSelf();
}
}
void PlaceHolder::ArrangeAncestor()
{
m_bReEstimateSize = true;
if (!m_pWindow || !m_pWindow->GetRoot())
{
if (GetParent()) {
GetParent()->ArrangeSelf();
}
else {
ArrangeSelf();
}
}
else
{
Control* parent = GetParent();
while (parent && (parent->GetFixedWidth() == DUI_LENGTH_AUTO || parent->GetFixedHeight() == DUI_LENGTH_AUTO))
{
parent->SetReEstimateSize(true);
parent = parent->GetParent();
}
if (parent)
{
parent->ArrangeSelf();
}
else //˵<><CBB5>root<6F><74><EFBFBD><EFBFBD>AutoAdjustSize<7A><65><EFBFBD><EFBFBD>
{
m_pWindow->GetRoot()->ArrangeSelf();
}
}
}
bool PlaceHolder::IsArranged() const
{
return m_bIsArranged;
}
void PlaceHolder::ArrangeSelf()
{
if (!IsVisible()) return;
m_bReEstimateSize = true;
m_bIsArranged = true;
Invalidate();
if (m_pWindow != NULL) m_pWindow->SetArrange(true);
}
void PlaceHolder::SetUseCache(bool cache)
{
m_bUseCache = cache;
}
void PlaceHolder::SetCacheDirty(bool dirty)
{
m_bCacheDirty = dirty;
}
void PlaceHolder::Invalidate()
{
if (!IsVisible()) return;
SetCacheDirty(true);
UiRect rcInvalidate = GetPosWithScrollOffset();
if (m_pWindow != NULL) m_pWindow->Invalidate(rcInvalidate);
}
UiRect PlaceHolder::GetPosWithScrollOffset() const
{
UiRect pos = GetPos();
CPoint offset = GetScrollOffset();
pos.Offset(-offset.x, -offset.y);
return pos;
}
CPoint PlaceHolder::GetScrollOffset() const
{
CPoint scrollPos;
Control* parent = GetParent();
ScrollableBox* lbParent = dynamic_cast<ScrollableBox*>(parent);
if (lbParent && lbParent->IsVScrollBarValid() && IsFloat()) {
return scrollPos;
}
while (parent && (!dynamic_cast<ScrollableBox*>(parent) || (!dynamic_cast<ScrollableBox*>(parent)->IsVScrollBarValid() && !dynamic_cast<ScrollableBox*>(parent)->IsHScrollBarValid())))
{
parent = parent->GetParent();
}
if (parent) {
//˵<><CBB5><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>Listbox<6F>ڲ<EFBFBD>
ScrollableBox* listbox = (ScrollableBox*)parent;
scrollPos.x = listbox->GetScrollPos().cx;
scrollPos.y = listbox->GetScrollPos().cy;
}
return scrollPos;
}
bool PlaceHolder::IsChild(PlaceHolder* pAncestor, PlaceHolder* pControl)
{
while (pControl && pControl != pAncestor)
{
pControl = pControl->GetParent();
}
return pControl != nullptr;
}
}