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

237 lines
4.9 KiB
C++

#include "stdafx.h"
#include "TabBox.h"
namespace ui
{
TabBox::TabBox(Layout* pLayout) : Box(pLayout), m_iCurSel(-1), m_bFadeSwith(false)
{
}
bool TabBox::Add(Control* pControl)
{
bool ret = Box::Add(pControl);
if( !ret ) return ret;
if(m_iCurSel == -1 && pControl->IsVisible()) {
m_iCurSel = GetItemIndex(pControl);
}
if (m_iCurSel != GetItemIndex(pControl) || !pControl->IsVisible())
{
if (!IsFadeSwitch()) {
pControl->SetVisible(false);
}
pControl->SetMouseEnabled(false);
if (Box* box = dynamic_cast<Box*>(pControl)) {
box->SetMouseChildEnabled(false);
}
pControl->SetAlpha(0);
}
return ret;
}
bool TabBox::AddAt(Control* pControl, std::size_t iIndex)
{
bool ret = Box::AddAt(pControl, iIndex);
if(!ret)
return ret;
if(m_iCurSel == -1 && pControl->IsVisible()) {
m_iCurSel = GetItemIndex(pControl);
}
else if( m_iCurSel != -1 && iIndex <= (std::size_t)m_iCurSel ) {
m_iCurSel += 1;
}
else {
if (!IsFadeSwitch()) {
pControl->SetVisible(false);
}
pControl->SetMouseEnabled(false);
if (Box* box = dynamic_cast<Box*>(pControl)) {
box->SetMouseChildEnabled(false);
}
pControl->SetAlpha(0);
}
return ret;
}
bool TabBox::Remove(Control* pControl)
{
if( pControl == NULL) return false;
int index = GetItemIndex(pControl);
bool ret = Box::Remove(pControl);
if( !ret ) return false;
if( m_iCurSel == index) {
if( GetCount() > 0 ) {
m_iCurSel=0;
if (!IsFadeSwitch()) {
GetItemAt(m_iCurSel)->SetVisible(true);
}
pControl->SetMouseEnabled(true);
if (Box* box = dynamic_cast<Box*>(pControl)) {
box->SetMouseChildEnabled(true);
}
pControl->SetAlpha(255);
}
else
m_iCurSel=-1;
ArrangeAncestor();
}
else if( m_iCurSel > index ) {
m_iCurSel -= 1;
}
return ret;
}
bool TabBox::RemoveAt(std::size_t iIndex)
{
Control* pControl = GetItemAt(iIndex);
if (pControl == NULL) return false;
return Remove(pControl);
}
void TabBox::RemoveAll()
{
m_iCurSel = -1;
Box::RemoveAll();
ArrangeAncestor();
}
int TabBox::GetCurSel() const
{
return m_iCurSel;
}
bool TabBox::SelectItem(int iIndex)
{
if( iIndex < 0 || (std::size_t)iIndex >= m_items.size() ) return false;
if( iIndex == m_iCurSel ) return true;
int iOldSel = m_iCurSel;
m_iCurSel = iIndex;
for( std::size_t it = 0; it < m_items.size(); it++ ){
if( (int)it == iIndex ) {
ShowTabItem(it);
if (!IsFadeSwitch()) {
m_items[it]->SetVisible();
}
else {
int startValue = 0;
int endValue = 0;
if (m_iCurSel < iOldSel) {
startValue = GetPos().GetWidth();
endValue = 0;
}
else {
startValue = -GetPos().GetWidth();
endValue = 0;
}
auto player = m_items[it]->GetAnimationManager().SetFadeInOutX(true, true);
player->SetStartValue(startValue);
player->SetEndValue(endValue);
player->SetSpeedUpfactorA(0.015);
player->SetCompleteCallback(CompleteCallback());
player->Start();
}
}
else {
if ((int)it != iOldSel) {
HideTabItem(it);
if (!IsFadeSwitch()) {
m_items[it]->SetVisible(false);
}
}
else {
if (!IsFadeSwitch()) {
HideTabItem(it);
m_items[it]->SetVisible(false);
}
else {
int startValue = 0;
int endValue = 0;
if (m_iCurSel < iOldSel) {
startValue = 0;
endValue = -GetPos().GetWidth();
}
else {
startValue = 0;
endValue = GetPos().GetWidth();
}
auto player = m_items[it]->GetAnimationManager().SetFadeInOutX(true, true);
player->SetStartValue(startValue);
player->SetEndValue(endValue);
player->SetSpeedUpfactorA(0.015);
CompleteCallback compelteCallback = nbase::Bind(&TabBox::HideTabItem, this, it);
player->SetCompleteCallback(compelteCallback);
player->Start();
}
}
}
}
if( m_pWindow != NULL ) {
m_pWindow->SetNextTabControl();
m_pWindow->SendNotify(this, kEventSelect, m_iCurSel, iOldSel);
}
return true;
}
void TabBox::HideTabItem(std::size_t it)
{
m_items[it]->SetMouseEnabled(false);
if (Box* box = dynamic_cast<Box*>(this->m_items[it])) {
box->SetMouseChildEnabled(false);
}
m_items[it]->SetAlpha(0);
}
void TabBox::ShowTabItem(std::size_t it)
{
m_items[it]->SetMouseEnabled(true);
if (Box* box = dynamic_cast<Box*>(this->m_items[it])) {
box->SetMouseChildEnabled(true);
}
m_items[it]->SetAlpha(255);
}
bool TabBox::SelectItem( Control* pControl )
{
int iIndex = GetItemIndex(pControl);
if (iIndex==-1)
return false;
else
return SelectItem(iIndex);
}
bool TabBox::SelectItem(const std::wstring& pControlName)
{
Control* pControl = FindSubControl(pControlName);
ASSERT(pControl);
return SelectItem(pControl);
}
void TabBox::SetAttribute(const std::wstring& strName, const std::wstring& strValue)
{
if (strName == _T("selectedid")) m_iCurSel = _ttoi(strValue.c_str());
else if( strName == _T("fadeswitch") ) SetFadeSwitch(strValue == _T("true"));
else Box::SetAttribute(strName, strValue);
}
void TabBox::SetFadeSwitch(bool bFadeSwitch)
{
m_bFadeSwith = bFadeSwitch;
}
}