mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 14:16:09 -06:00
371 lines
8.1 KiB
C++
371 lines
8.1 KiB
C++
#include "ExpandFrame.h"
|
|
|
|
void ExpandFrame::ImgButton::Paint(Draw &w)
|
|
{
|
|
Size sz = GetSize();
|
|
Size isz = img.GetSize();
|
|
|
|
const ExpandFrame* p = (ExpandFrame*)GetParent();
|
|
const Style* st = p->St();
|
|
if (HasMouse() || st->buttonstyle == 1)
|
|
w.DrawRect(sz, hl);
|
|
|
|
if (st->buttonstyle == 0 || st->buttonstyle == 1)
|
|
UPP::DrawFrame(w, sz, fg);
|
|
|
|
if (st->buttonstyle == 2)
|
|
{
|
|
Rect r = sz;
|
|
int i = !IsShowEnabled() ? CTRL_DISABLED :
|
|
IsPush() ? CTRL_PRESSED :
|
|
HasMouse() || HasFocus() ? CTRL_HOT :
|
|
CTRL_NORMAL;
|
|
if(p->IsExpanded()) i = CTRL_PRESSED;
|
|
ChPaint(w, sz, Button::StyleNormal().look[i]);
|
|
}
|
|
|
|
int dx = IsPush() * (left ? -1 : 1);
|
|
int dy = IsPush();
|
|
if (st->buttonstyle == 0)
|
|
{
|
|
if (p->hasarrow)
|
|
w.DrawImage((sz.cx - isz.cx) / 2 + dx, (sz.cy - isz.cy) / 2 + dy, img);
|
|
}
|
|
else if (st->buttonstyle == 1 || st->buttonstyle == 2)
|
|
{
|
|
if (p->type == TOP || p->type == BOTTOM)
|
|
{
|
|
if (p->hasarrow)
|
|
w.DrawImage(sz.cx - isz.cx + dx - 5, (sz.cy - isz.cy) / 2 + dy, img);
|
|
w.DrawText(4, 1, p->GetTitle());
|
|
}
|
|
else
|
|
{
|
|
if (p->hasarrow)
|
|
w.DrawImage((sz.cx - isz.cx) / 2, sz.cy - isz.cy + dy - 5, img);
|
|
w.DrawText(p->TitleSz() - 1, 4, 2700, p->GetTitle());
|
|
}
|
|
}
|
|
}
|
|
|
|
void ExpandFrame::FrameAdd(Ctrl& parent)
|
|
{
|
|
parent.Add(*this);
|
|
}
|
|
|
|
void ExpandFrame::FrameRemove()
|
|
{
|
|
this->Ctrl::Remove();
|
|
}
|
|
|
|
void ExpandFrame::FrameAddSize(Size& sz)
|
|
{
|
|
if (!IsSet() || !IsShown()) return;
|
|
bool lr = (type == LEFT || type == RIGHT);
|
|
sz.cx += lr ? TitleSz()+ExpandSz() : 0;
|
|
sz.cy += lr ? 0 : TitleSz()+ExpandSz();
|
|
}
|
|
|
|
void ExpandFrame::FrameLayout(Rect& r)
|
|
{
|
|
if (!IsSet()) return;
|
|
switch (type) {
|
|
case LEFT:
|
|
LayoutFrameLeft(r, this, TitleSz() + ExpandSz());
|
|
break;
|
|
case RIGHT:
|
|
LayoutFrameRight(r, this, TitleSz() + ExpandSz());
|
|
break;
|
|
case TOP:
|
|
LayoutFrameTop(r, this, TitleSz() + ExpandSz());
|
|
break;
|
|
case BOTTOM:
|
|
LayoutFrameBottom(r, this, TitleSz() + ExpandSz());
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ExpandFrame::Paint(Draw& w)
|
|
{
|
|
if (!IsSet() || !IsShown()) return;
|
|
const Style *st = St();
|
|
Rect r = GetSize();
|
|
int focus = (childfocus || ignorefocus) ? 1 : 0;
|
|
bool lr = (type == LEFT || type == RIGHT);
|
|
|
|
if (expand) {
|
|
Rect rr = r;
|
|
switch (type) {
|
|
case LEFT:
|
|
r.right = TitleSz();
|
|
rr.left = r.right;
|
|
break;
|
|
case RIGHT:
|
|
r.left = r.right - TitleSz();
|
|
rr.right = r.left;
|
|
break;
|
|
case TOP:
|
|
r.bottom = TitleSz();
|
|
rr.top = r.bottom;
|
|
break;
|
|
case BOTTOM:
|
|
r.top = r.bottom - TitleSz();
|
|
rr.bottom = r.top;
|
|
break;
|
|
}
|
|
w.DrawRect(rr, SColorFace());
|
|
}
|
|
|
|
ChPaint(w, r, st->background[focus]);
|
|
|
|
PaintBorder(w);
|
|
|
|
if (st->buttonstyle == 0)
|
|
{
|
|
if (!lr) w.Clip(0, 0, r.right - TitleSz() + 2, r.bottom);
|
|
|
|
Point pt;
|
|
if (lr) {
|
|
pt = Point(r.right - 1, r.top + TitleSz());
|
|
if (img) {
|
|
w.DrawImage(r.left + (r.Width() - img.GetWidth())/2, pt.y, img);
|
|
pt.y += img.GetHeight() + 2;
|
|
}
|
|
}
|
|
else {
|
|
pt = Point(r.left + 2, r.top + 1);
|
|
if (img) {
|
|
w.DrawImage(pt.x, pt.y + (r.Height() - img.GetHeight())/2, img);
|
|
pt.x += img.GetWidth() + 2;
|
|
}
|
|
}
|
|
w.DrawText(pt.x, pt.y, lr ? 2700 : 0, title, st->font, st->text[focus]);
|
|
if (!lr) w.End();
|
|
}
|
|
}
|
|
|
|
void ExpandFrame::PaintBorder(Draw& w)
|
|
{
|
|
const Style *st = St();
|
|
int focus = (childfocus || ignorefocus) ? 1 : 0;
|
|
|
|
if (st->buttonstyle == 0)
|
|
{
|
|
if (expand)
|
|
DrawFrame(w, GetSize(), st->border[focus]);
|
|
else
|
|
DrawFrame(w, GetSize(), st->border[focus], Null, st->border[focus], st->border[focus]);
|
|
}
|
|
else
|
|
{
|
|
const int d = 5;
|
|
|
|
Rect r = GetSize();
|
|
r.left++;
|
|
r.top++;
|
|
if (type == TOP)
|
|
{
|
|
r.top += d;
|
|
if (!expand)
|
|
r.bottom -= d - 2;
|
|
}
|
|
else if (type == BOTTOM)
|
|
{
|
|
r.bottom -= d - 1;
|
|
if (!expand)
|
|
r.top += d - 1;
|
|
}
|
|
else if (type == LEFT)
|
|
{
|
|
r.left += d;
|
|
if (!expand)
|
|
r.right -= d - 2;
|
|
}
|
|
else if (type == RIGHT)
|
|
{
|
|
r.right -= d - 2;
|
|
if (!expand)
|
|
r.left += d;
|
|
}
|
|
DrawFrame(w, r, SColorLight);
|
|
r.Offset(-1, -1);
|
|
DrawFrame(w, r, SColorShadow);
|
|
}
|
|
}
|
|
|
|
void ExpandFrame::UpdateButton()
|
|
{
|
|
Image image;
|
|
const Style *st = St();
|
|
|
|
switch (type) {
|
|
case LEFT:
|
|
image = expand ? st->btnimage[0] : st->btnimage[2];
|
|
break;
|
|
case RIGHT:
|
|
image = expand ? st->btnimage[2] : st->btnimage[0];
|
|
break;
|
|
case TOP:
|
|
image = expand ? st->btnimage[1] : st->btnimage[3];
|
|
break;
|
|
case BOTTOM:
|
|
image = expand ? st->btnimage[3] : st->btnimage[1];
|
|
break;
|
|
}
|
|
btn.SetImage(image) <<= THISBACK1(Expand0, !expand);
|
|
if (st->buttoncenter == 0)
|
|
{
|
|
int sz = TitleSz() - 2;
|
|
if (type == LEFT || type == RIGHT) {
|
|
btn.TopPos(1, sz);
|
|
(type == LEFT) ? btn.LeftPos(1, sz) : btn.RightPos(1, sz);
|
|
}
|
|
else {
|
|
btn.RightPos(1, sz);
|
|
(type == TOP) ? btn.TopPos(1, sz) : btn.BottomPos(1, sz);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int sz = TitleSz();
|
|
if (type == LEFT) {
|
|
btn.LeftPos(0, sz);
|
|
btn.VSizePos(5, 5);
|
|
}
|
|
else if (type == RIGHT) {
|
|
btn.RightPos(0, sz);
|
|
btn.VSizePos(5, 5);
|
|
}
|
|
else if (type == TOP) {
|
|
btn.TopPos(0, sz);
|
|
btn.HSizePos(5, 5);
|
|
}
|
|
else if (type == BOTTOM) {
|
|
btn.BottomPos(0, sz);
|
|
btn.HSizePos(5, 5);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ExpandFrame::SetChildPos()
|
|
{
|
|
if (!IsSet()) return;
|
|
Ctrl *c = GetLastChild();
|
|
|
|
const Style *st = St();
|
|
int d = st->borderwidth;
|
|
|
|
switch (type) {
|
|
case LEFT:
|
|
c->VSizePos(d, d).HSizePos(TitleSz(), d);
|
|
break;
|
|
case RIGHT:
|
|
c->VSizePos(d, d).HSizePos(d, TitleSz());
|
|
break;
|
|
case TOP:
|
|
c->HSizePos(d, d).VSizePos(TitleSz(), d);
|
|
break;
|
|
case BOTTOM:
|
|
c->HSizePos(d, d).VSizePos(d, TitleSz());
|
|
break;
|
|
}
|
|
}
|
|
|
|
ExpandFrame& ExpandFrame::Set(Ctrl& c, int size, int _type)
|
|
{
|
|
ASSERT(type >= LEFT && type <= BOTTOM);
|
|
ASSERT(size > 0);
|
|
type = _type;
|
|
bool lr = (type == LEFT || type == RIGHT);
|
|
if (IsSet())
|
|
GetLastChild()->Remove();
|
|
child_size = size;
|
|
UpdateButton();
|
|
Add(c);
|
|
SetChildPos();
|
|
c.Show(expand);
|
|
RefreshParentLayout();
|
|
return *this;
|
|
}
|
|
|
|
ExpandFrame& ExpandFrame::Expand(bool _expand)
|
|
{
|
|
expand = _expand;
|
|
UpdateButton();
|
|
if (!IsSet()) return *this;
|
|
GetLastChild()->Show(expand);
|
|
if (!expand && childfocus)
|
|
Ctrl::IterateFocusForward(GetFocusCtrl(), GetParent());
|
|
else
|
|
GetLastChild()->SetFocus();
|
|
childfocus = expand;
|
|
RefreshParentLayout();
|
|
return *this;
|
|
}
|
|
|
|
ExpandFrame::ExpandFrame()
|
|
{
|
|
style = NULL;
|
|
child_size = 0;
|
|
childfocus = false;
|
|
ignorefocus = false;
|
|
expand = false;
|
|
type = 0;
|
|
hasarrow = true;
|
|
btn.Transparent();
|
|
Add(btn);
|
|
}
|
|
|
|
CH_STYLE(ExpandFrame, Style, StyleDefault)
|
|
{
|
|
btnimage[3] = CtrlsImg::DA(); // DOWN
|
|
btnimage[0] = RotateClockwise(btnimage[3]); // LEFT
|
|
btnimage[1] = RotateClockwise(btnimage[0]); // UP
|
|
btnimage[2] = RotateClockwise(btnimage[1]); // RIGHT
|
|
background[0] = LtGray(); // No focus
|
|
background[1] = Blend(LtBlue(), White(), 60); // Focus
|
|
text[0] = Black(); // No focus
|
|
text[1] = White(); // Focus
|
|
border[0] = Gray(); // No focus
|
|
border[1] = LtBlue(); // Focus
|
|
font = StdFont(12);
|
|
buttonstyle = 0;
|
|
buttoncenter = 0;
|
|
borderwidth = 1;
|
|
}
|
|
|
|
CH_STYLE(ExpandFrame, Style, StyleWide)
|
|
{
|
|
btnimage[3] = CtrlsImg::DA(); // DOWN
|
|
btnimage[0] = RotateClockwise(btnimage[3]); // LEFT
|
|
btnimage[1] = RotateClockwise(btnimage[0]); // UP
|
|
btnimage[2] = RotateClockwise(btnimage[1]); // RIGHT
|
|
background[0] = SColorFace(); // No focus
|
|
background[1] = SColorFace(); // Focus
|
|
text[0] = Black(); // No focus
|
|
text[1] = Black(); // Focus
|
|
border[0] = Gray(); // No focus
|
|
border[1] = LtBlue(); // Focus
|
|
font = StdFont(12);
|
|
buttonstyle = 1;
|
|
buttoncenter = 1;
|
|
borderwidth = 2;
|
|
}
|
|
|
|
CH_STYLE(ExpandFrame, Style, StyleButton)
|
|
{
|
|
btnimage[3] = CtrlsImg::DA(); // DOWN
|
|
btnimage[0] = RotateClockwise(btnimage[3]); // LEFT
|
|
btnimage[1] = RotateClockwise(btnimage[0]); // UP
|
|
btnimage[2] = RotateClockwise(btnimage[1]); // RIGHT
|
|
background[0] = SColorFace(); // No focus
|
|
background[1] = SColorFace(); // Focus
|
|
text[0] = Black(); // No focus
|
|
text[1] = Black(); // Focus
|
|
border[0] = Gray(); // No focus
|
|
border[1] = LtBlue(); // Focus
|
|
font = StdFont(12);
|
|
buttonstyle = 2;
|
|
buttoncenter = 1;
|
|
borderwidth = 2;
|
|
}
|