mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-17 14:16:10 -06:00
161 lines
3.4 KiB
C++
161 lines
3.4 KiB
C++
#include "DockCtrl/DockCtrl.h"
|
|
|
|
|
|
PaneSplitter::PaneSplitter()
|
|
{
|
|
animating = false;
|
|
SetAnimationType(PANEANIMATION); // by default.
|
|
x = 0;
|
|
y = 0;
|
|
}
|
|
|
|
PaneSplitter::~PaneSplitter()
|
|
{
|
|
animating = false;
|
|
}
|
|
|
|
void PaneSplitter::AddChildDock(DockableCtrl& dock)
|
|
{
|
|
Splitter::Add((Ctrl &)dock.SizePos());
|
|
ReposChilds();
|
|
}
|
|
|
|
void PaneSplitter::AddChildDock(DockableCtrl& dock, int position)
|
|
{
|
|
int count = GetCount();
|
|
if(!HasChild() || position > count) AddChildDock(dock);
|
|
else AddChildBefore((Ctrl*) &dock, (Ctrl *) GetChildAt(position));
|
|
ReposChilds();
|
|
}
|
|
|
|
void PaneSplitter::RemoveChildDock(DockableCtrl& dock)
|
|
{
|
|
RemoveChildDock(dock.Position());
|
|
}
|
|
|
|
void PaneSplitter::RemoveChildDock(int position)
|
|
{
|
|
DockableCtrl* ctrl = GetChildAt(position);
|
|
if(ctrl) ctrl->Remove();
|
|
ReposChilds();
|
|
}
|
|
|
|
void PaneSplitter::RemoveChilds()
|
|
{
|
|
if(!HasChild()) return;
|
|
for(int i = 1; i < GetCount(); i++)
|
|
GetChildAt(i)->Shut();
|
|
}
|
|
|
|
void PaneSplitter::ReposChilds()
|
|
{
|
|
if(!HasChild()) return;
|
|
int i = 1;
|
|
DockableCtrl* ctrl = (DockableCtrl*) GetFirstChild();
|
|
ctrl->Posit(i);
|
|
while(ctrl = (DockableCtrl*) ctrl->GetNext())
|
|
ctrl->Posit(++i);
|
|
if(IsOpen())
|
|
Layout();
|
|
}
|
|
|
|
DockableCtrl* PaneSplitter::GetChildAt(int position)
|
|
{
|
|
if(HasChild())
|
|
{
|
|
Ctrl* ctrl = GetFirstChild();
|
|
while(ctrl)
|
|
{
|
|
if(ctrl != &animationctrl)
|
|
if(((DockableCtrl*)ctrl)->Position() == position)
|
|
return (DockableCtrl*) ctrl;
|
|
ctrl = ctrl->GetNext();
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int PaneSplitter::GetChildCount()
|
|
{
|
|
int childcount = GetCount();
|
|
return IsAnimating() ? childcount - 1 : childcount;
|
|
}
|
|
|
|
bool PaneSplitter::HasChild()
|
|
{
|
|
return GetChildCount();
|
|
}
|
|
|
|
void PaneSplitter::StartAnimation(int position)
|
|
{
|
|
if(animationctrl.IsOpen()) return;
|
|
if(!HasChild() || position > GetCount())
|
|
Splitter::Add(animationctrl.SizePos());
|
|
else
|
|
AddChildBefore(&animationctrl.SizePos(), (Ctrl *) GetChildAt(position));
|
|
|
|
animating = true;
|
|
|
|
if(animationtype == TABANIMATION)
|
|
{
|
|
Ctrl* ctrl = GetChildAt(GetZoom() + 1);
|
|
if(ctrl)
|
|
{
|
|
const DockCtrlChStyle::Style& s = DockCtrlChStyle::StyleDefault();
|
|
Size sz = animationctrl.GetSize();
|
|
ImageDraw img(sz.cx, sz.cy);
|
|
ctrl->DrawCtrlWithParent(img, 0, 0);
|
|
img.DrawImage(sz,s.tabhighlight);
|
|
Image i = img;
|
|
animationctrl.SetAnimImage(i);
|
|
}
|
|
}
|
|
Animate(position);
|
|
}
|
|
|
|
void PaneSplitter::StartAnimation(DockableCtrl& dock, int position)
|
|
{
|
|
StartAnimation(position);
|
|
}
|
|
|
|
void PaneSplitter::StopAnimation()
|
|
{
|
|
if(!animationctrl.IsOpen()) return;
|
|
animationctrl.Type(animationtype);
|
|
animationctrl.Remove();
|
|
animating = false;
|
|
}
|
|
|
|
void PaneSplitter::Animate(int position)
|
|
{
|
|
}
|
|
|
|
void PaneSplitter::AnimateCallback()
|
|
{
|
|
}
|
|
|
|
void PaneSplitter::Layout()
|
|
{
|
|
Splitter::Layout();
|
|
}
|
|
|
|
void PaneSplitter::AnimationCtrl::Paint(Draw& d)
|
|
{
|
|
if(ctrltype != PaneSplitter::TABANIMATION)
|
|
d.DrawRect(GetSize(), GUI_GlobalStyle() >= GUISTYLE_XP ? Blend(SColorHighlight, SColorFace) : SColorShadow);
|
|
else
|
|
d.DrawImage(GetSize(), image);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------
|
|
|
|
void PaneSplitter::AnimationCtrl::AnimateHorz()
|
|
{
|
|
if(!IsVisible()) Show();
|
|
Ctrl::LeftPos(0, 0).Layout();
|
|
}
|
|
void PaneSplitter::AnimationCtrl::AnimateVert()
|
|
{
|
|
if(!IsVisible()) Show();
|
|
Ctrl::TopPos(0, 0).Layout();
|
|
}
|