TabBar: Tab Stacking and sorting added

Docking: Minor bug-fix, PopUpDockWindow confirmed as working, more complex dynamic allocation supported
QuickTabsTest: Modified to use TabBar-derived QuickTabs

git-svn-id: svn://ultimatepp.org/upp/trunk@1104 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
mrjt 2009-04-27 13:21:38 +00:00
parent 4ef96829f1
commit ffb0b9d653
15 changed files with 712 additions and 314 deletions

View file

@ -382,6 +382,7 @@ void DockCont::TabClosed(Value v)
DockableCtrl *c = DockCast(v);
base->SaveDockerPos(*c);
c->Remove();
c->WhenState();
}
waitsync = true;
Layout();
@ -442,9 +443,29 @@ void DockCont::AddFrom(DockCont& cont, int except)
void DockCont::Clear()
{
for (int i = 0; i < tabbar.GetCount(); i++)
CtrlCast(tabbar.Get(i))->Close();
tabbar.Clear();
if (tabbar.GetCount()) {
// Copy tabbar values and clear to prevent this being called multple times if child
// if destroyed on closing. pfft
Vector<Value> v;
v.SetCount(tabbar.GetCount());
for (int i = 0; i < tabbar.GetCount(); i++)
v[i] = tabbar.Get(i);
tabbar.Clear();
// Remove ctrls and signal correct state change
for (int i = 0; i < v.GetCount(); i++) {
if (IsDockCont(v[i])) {
DockCont *dc = ContCast(v[i]);
dc->Remove();
dc->State(*base, STATE_NONE);
}
else {
DockableCtrl *dc = DockCast(v[i]);
dc->Remove();
dc->WhenState();
}
}
}
handle.dc = NULL;
}
@ -455,6 +476,17 @@ void DockCont::State(DockWindow& dock, DockCont::DockState state)
SyncFrames();
SyncButtons();
Show();
SignalStateChange();
}
void DockCont::SignalStateChange()
{
for (int i = tabbar.GetCount()-1; i >= 0; i--) {
if (IsDockCont(tabbar.Get(i)))
ContCast(tabbar.Get(i))->SignalStateChange();
else
DockCast(tabbar.Get(i))->WhenState();
}
}
void DockCont::SyncButtons(DockableCtrl& dc)
@ -803,7 +835,7 @@ DockCont::DockCont()
NoCenter().Sizeable(true).MaximizeBox(false).MinimizeBox(false);
tabbar.AutoHideMin(1);
tabbar.WhenCursor = THISBACK(TabSelected);
tabbar<<= THISBACK(TabSelected);
tabbar.WhenClose = THISBACK(TabClosed);
tabbar.WhenCloseAll = THISBACK(RefreshLayout);
tabbar.SetBottom();

View file

@ -181,6 +181,7 @@ public:
void Lock(bool lock);
void SyncFrames();
void SyncFrames(bool lock);
void SignalStateChange();
void Grouping(bool grouping) { tabbar.Grouping(grouping); GroupRefresh(); }
void GroupRefresh();

View file

@ -20,10 +20,12 @@ void DockTabBar::FrameAddSize(Size& sz)
TabBar::FrameAddSize(sz);
}
void DockTabBar::PaintTabData(Draw& w, Point p, const Size& sz, const Value& q, const Font& font, Color ink, dword style)
void DockTabBar::PaintTabData(Draw& w, const Rect &r, const Tab& tab, const Font &font, Color ink, dword style, int bl)
{
DockableCtrl *d;
WString txt;
const Value &q = tab.data;
ink = (style == CTRL_DISABLED) ? SColorDisabled : ink;
if (IsTypeRaw<DockCont *>(q)) {
@ -37,31 +39,40 @@ void DockTabBar::PaintTabData(Draw& w, Point p, const Size& sz, const Value& q,
txt = d->GetTitle();
}
TabCenterText(p, sz, font);
Point p = GetTextPosition(r, GetTextSize(txt, font).cy, bl);
if(icons)
{
const Image& icon = (style == CTRL_DISABLED) ? DisabledImage(d->GetIcon()) : d->GetIcon();
int al = GetAlign();
Point ip = p;
Size isz = icon.GetSize();
if (al == RIGHT)
ip.x -= isz.cx-1;
else if (al == LEFT)
ip.y -= isz.cy;
if (IsVert()) {
w.DrawImage(ip.x-1, ip.y, icon);
p.y += (isz.cy + TB_SPACEICON) * ((al == LEFT) ? -1 : 1);
if (!icon.IsEmpty()) {
int al = GetAlign();
Size isz = icon.GetSize();
Point ip;
switch (al) {
case LEFT:
ip = Point(r.left + (r.Width() - isz.cy) / 2, p.y - isz.cy);
p.y -= isz.cy + TB_SPACEICON;
break;
case TOP:
ip = Point(p.x, r.top + (r.Height() - isz.cy) / 2);
p.x += isz.cx + TB_SPACEICON;
break;
case RIGHT:
ip = Point(r.left + (r.Width() - isz.cy) / 2, p.y);
p.y += isz.cy + TB_SPACEICON;
break;
case BOTTOM:
ip = Point(p.x, r.top + (r.Height() - isz.cy) / 2);
p.x += isz.cx + TB_SPACEICON;
break;
};
w.DrawImage(ip.x, ip.y, icon);
}
else {
w.DrawImage(ip.x, ip.y-2, icon);
p.x += isz.cx + TB_SPACEICON;
}
}
if (showtext)
w.DrawText(p.x, p.y, GetTextAngle(), txt, font, ink);
}
Size DockTabBar::GetStdSize(Value& q)
Size DockTabBar::GetStdSize(const Value& q)
{
DockableCtrl *d;
Value v;
@ -123,6 +134,8 @@ void AutoHideBar::AddCtrl(DockCont& c, const String& group)
TabBar::Add(RawToValue<DockCont *>(&c), group);
if (GetCount() == autohide+1)
RefreshParentLayout();
else
Refresh();
}
void AutoHideBar::RemoveCtrl(DockCont& c, int ix)
@ -182,7 +195,10 @@ void AutoHideBar::TabHighlight()
void AutoHideBar::TabClose(Value v)
{
RemoveCtrl(*(ValueTo<DockCont *>(v)), -1);
DockCont &dc = *(ValueTo<DockCont *>(v));
RemoveCtrl(dc, -1);
dc.StateNotDocked();
dc.SignalStateChange();
if (GetCount() == autohide-1)
RefreshParentLayout();
}
@ -242,7 +258,7 @@ void AutoHideBar::HideAnimate(Ctrl *c)
return;
}
}
DockTabBar::KillCursor();
#ifdef PLATFORM_WIN32
Rect r = popup.GetRect();
AdjustSize(r, -r.GetSize());
@ -251,7 +267,6 @@ void AutoHideBar::HideAnimate(Ctrl *c)
popup.Close();
ctrl->Remove();
ctrl = NULL;
DockTabBar::SetCursor(-1);
}
void AutoHideBar::AdjustSize(Rect& r, const Size& sz)

View file

@ -30,18 +30,15 @@ protected:
int autohide;
bool icons:1;
bool showtext:1;
// PasteClip *clip;
virtual void PaintTabData(Draw& w, Point p, const Size& sz, const Value& q, const Font& font,
Color ink, dword style);
virtual Size GetStdSize(Value& q);
virtual void PaintTabData(Draw& w, const Rect &t, const Tab& tab, const Font &font,
Color ink, dword style, int bl);
virtual Size GetStdSize(const Value &q);
virtual void RightDown(Point p, dword keyflags);
virtual void LeftDown(Point p, dword keyflags) { TabBar::LeftDown(p, keyflags &= ~K_SHIFT); }
virtual void LeftUp(Point p, dword keyflags) { TabBar::LeftUp(p, keyflags &= ~K_SHIFT); }
virtual void LeftDrag(Point p, dword keyflags);
// virtual void DragAndDrop(Point p, PasteClip& d);
// virtual void DragLeave();
};
class DockCont;

View file

@ -63,10 +63,10 @@ void DockWindow::AutoHide(int align, DockableCtrl& dc)
Register(dc);
DockCont *c = GetReleasedContainer(dc);
c->StateAutoHide(*this);
hideframe[align].AddCtrl(*c, dc.GetGroup());
hideframe[align].AddCtrl(*c, dc.GetGroup());
}
int DockWindow::FindDocker(Ctrl *dc)
int DockWindow::FindDocker(const Ctrl *dc)
{
for (int i = 0; i < dockers.GetCount(); i++)
if (dc == (Ctrl *) dockers[i])
@ -85,14 +85,21 @@ DockableCtrl& DockWindow::Register(DockableCtrl& dc)
return *dockers[ix];
}
void DockWindow::Deregister(DockableCtrl& dc)
void DockWindow::Deregister(const DockableCtrl& dc)
{
int ix = FindDocker(&dc);
Close(dc);
if (ix >= 0) {
DockableCtrl &dc = *dockers[ix];
dockers.Remove(ix);
Close(dc);
dockerpos.Remove(ix);
}
for (int i = 0; i < ctrls.GetCount(); i++) {
if (&dc == &ctrls[i]) {
ctrls.Remove(i);
break;
}
}
}
void DockWindow::Close(DockableCtrl& dc)
@ -1494,6 +1501,7 @@ void PopUpDockWindow::ContainerDragMove(DockCont& dc)
Highlight(align, dc, target);
}
else {
PopUpHighlight(hide, 4);
StopHighlight(IsAnimatedHighlight());
last_popup = NULL;
}
@ -1501,8 +1509,14 @@ void PopUpDockWindow::ContainerDragMove(DockCont& dc)
void PopUpDockWindow::ContainerDragEnd(DockCont& dc)
{
int align = DOCK_NONE;
if (IsAutoHide() && showhide)
align = PopUpHighlight(hide, 4);
HidePopUps(true, true);
DockWindow::ContainerDragEnd(dc);
if (align != DOCK_NONE)
AutoHideContainer(align, dc);
else
DockWindow::ContainerDragEnd(dc);
last_target = NULL;
last_popup = NULL;
}
@ -1542,6 +1556,13 @@ void PopUpDockWindow::ShowOuterPopUps(DockCont& dc)
if (dc.IsDockAllowed(DOCK_TOP)) ShowPopUp(outer[DOCK_TOP], prect.Offseted(cp.x - psz.cx, wrect.top + POPUP_SPACING));
if (dc.IsDockAllowed(DOCK_RIGHT)) ShowPopUp(outer[DOCK_RIGHT], prect.Offseted(wrect.right - POPUP_SPACING - psz.cx*2, cp.y - psz.cy));
if (dc.IsDockAllowed(DOCK_BOTTOM)) ShowPopUp(outer[DOCK_BOTTOM], prect.Offseted(cp.x - psz.cx, wrect.bottom - POPUP_SPACING - psz.cy*2));
if (IsAutoHide() && showhide) {
ShowPopUp(hide[DOCK_LEFT], prect.Offseted(wrect.left + POPUP_SPACING + style->outersize, cp.y - psz.cy));
ShowPopUp(hide[DOCK_TOP], prect.Offseted(cp.x - psz.cx, wrect.top + POPUP_SPACING + style->outersize));
ShowPopUp(hide[DOCK_RIGHT], prect.Offseted(wrect.right - POPUP_SPACING - psz.cx*2 - style->outersize, cp.y - psz.cy));
ShowPopUp(hide[DOCK_BOTTOM], prect.Offseted(cp.x - psz.cx, wrect.bottom - POPUP_SPACING - psz.cy*2 - style->outersize));
}
}
void PopUpDockWindow::ShowInnerPopUps(DockCont& dc, DockCont *target)
@ -1591,9 +1612,12 @@ void PopUpDockWindow::HidePopUps(bool _inner, bool _outer)
if (_inner)
for (int i = 0; i < 5; i++)
inner[i].Close();
if (_outer)
if (_outer) {
for (int i = 0; i < 4; i++)
outer[i].Close();
outer[i].Close();
for (int i = 0; i < 4; i++)
hide[i].Close();
}
}
PopUpDockWindow& PopUpDockWindow::SetStyle(const Style& s)
@ -1603,10 +1627,13 @@ PopUpDockWindow& PopUpDockWindow::SetStyle(const Style& s)
inner[i].icon = &s.inner[i];
for (int i = 0; i < 4; i++)
outer[i].icon = &s.outer[i];
for (int i = 0; i < 4; i++)
hide[i].icon = &s.hide[i];
return *this;
}
PopUpDockWindow::PopUpDockWindow()
: showhide(true)
{
SetStyle(StyleDefault());
AnimateDelay(0);
@ -1614,16 +1641,21 @@ PopUpDockWindow::PopUpDockWindow()
CH_STYLE(PopUpDockWindow, Style, StyleDefault)
{
outer[0] = DockingImg::DockLeft();
outer[1] = DockingImg::DockTop();
outer[2] = DockingImg::DockRight();
outer[3] = DockingImg::DockBottom();
inner[0] = DockingImg::DockLeft();
inner[1] = DockingImg::DockTop();
inner[2] = DockingImg::DockRight();
inner[3] = DockingImg::DockBottom();
inner[4] = DockingImg::DockTab();
inner[4] = DockingImg::DockTab();
outer[0] = DockingImg::DockLeft();
outer[1] = DockingImg::DockTop();
outer[2] = DockingImg::DockRight();
outer[3] = DockingImg::DockBottom();
hide[0] = DockingImg::HideLeft();
hide[1] = DockingImg::HideTop();
hide[2] = DockingImg::HideRight();
hide[3] = DockingImg::HideBottom();
highlight = DockingImg::DockHL();

View file

@ -45,6 +45,7 @@ private:
void StopHighlight() { Refresh(); }
public:
Callback1<Bar&> WhenMenuBar;
Callback WhenState;
virtual void WindowMenu(Bar& bar) { WhenMenuBar(bar); }

View file

@ -79,7 +79,7 @@ protected:
// For finding drag-drop targets and computing boundary rect
DockCont *GetMouseDockTarget();
DockCont *FindDockTarget(DockCont& dc, int& al);
int FindDocker(Ctrl *dc);
int FindDocker(const Ctrl *dc);
Rect GetAlignBounds(int al, Rect r, bool center, bool allow_lr = true, bool allow_tb = true);
int GetPointAlign(const Point p, Rect r, bool center, bool allow_lr = true, bool allow_tb = true);
int GetQuad(Point p, Rect r);
@ -147,6 +147,12 @@ public:
DockableCtrl& Dockable(Ctrl& ctrl, WString title);
DockableCtrl& Dockable(Ctrl& ctrl, const char *title = 0) { return Dockable(ctrl, (WString)title); }
template<class T>
DockableCtrl& CreateDockable(WString title) { return Register(ctrls.Create<T>().Title(title)); }
template<class T>
DockableCtrl& CreateDockable(const char *title = 0) { return CreateDockable<T>((WString)title); }
void DockLeft(DockableCtrl& dc, int pos = -1) { Dock(DOCK_LEFT, dc, pos); }
void DockTop(DockableCtrl& dc, int pos = -1) { Dock(DOCK_TOP, dc, pos); }
@ -237,7 +243,7 @@ public:
bool HasToolWindows() const { return childtoolwindows; }
DockableCtrl& Register(DockableCtrl& dc);
void Deregister(DockableCtrl& dc);
void Deregister(const DockableCtrl& dc);
const Vector<DockableCtrl *>& GetDockableCtrls() const { return dockers; }
void DockManager();
@ -263,7 +269,6 @@ public:
void SetHighlightStyle(DockableCtrl::Style& s) { GetHighlightCtrl().SetStyle(s); }
DockWindow();
private:
// Container management
DockCont *GetContainer(Ctrl& dc) { return dynamic_cast<DockCont *>(dc.GetParent()); }
@ -291,19 +296,17 @@ private:
void ClearLayout();
};
// WARNING!
// PopUpDockWindow is currently unstable, but will be supported in future revisions
class PopUpDockWindow : public DockWindow {
public:
struct Style : ChStyle<Style> {
Value inner[5];
Value outer[4];
Value hide[4];
Value highlight;
int innersize;
int outersize;
};
static const Style& StyleDefault();
protected:
virtual void ContainerDragStart(DockCont& dc);
virtual void ContainerDragMove(DockCont& dc);
@ -321,7 +324,9 @@ private:
DockCont *last_target;
PopUpButton *last_popup;
PopUpButton inner[5];
PopUpButton outer[4];
PopUpButton outer[4];
PopUpButton hide[4];
bool showhide;
int PopUpHighlight(PopUpButton *pb, int cnt);
void ShowOuterPopUps(DockCont& dc);
@ -331,6 +336,9 @@ private:
public:
PopUpDockWindow& SetStyle(const Style& s);
PopUpDockWindow();
PopUpDockWindow& AutoHidePopUps(bool v = true) { showhide = v; return *this; }
};

View file

@ -3,6 +3,10 @@ IMAGE_ID(DockLeft)
IMAGE_ID(DockRight)
IMAGE_ID(DockTop)
IMAGE_ID(DockBottom)
IMAGE_ID(HideLeft)
IMAGE_ID(HideTop)
IMAGE_ID(HideRight)
IMAGE_ID(HideBottom)
IMAGE_ID(DockTab)
IMAGE_ID(DockHL)
IMAGE_ID(DBackground)
@ -36,195 +40,241 @@ IMAGE_ID(CMenuh)
IMAGE_ID(CMenup)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,237,155,91,108,20,85,24,199,7,141,38,196,187,49,26,176,79,162,15,86,94,52,6,199,91,196,168,128,148,34)
IMAGE_DATA(202,165,8,244,222,82,218,210,11,219,27,165,55,88,160,165,45,148,75,65,161,165,92,108,23,90,98,34,190,160,196,68)
IMAGE_DATA(241,205,196,190,155,104,76,90,73,107,155,166,13,105,159,12,161,199,239,155,249,206,246,236,238,220,118,247,204,144,144,153)
IMAGE_DATA(228,199,210,206,233,255,63,223,153,115,190,243,205,233,84,89,162,44,81,248,49,60,60,204,188,32,37,245,55,215,136,240)
IMAGE_DATA(104,97,11,52,221,99,41,245,255,177,148,170,57,150,82,58,197,150,230,253,195,94,200,248,131,61,155,246,59,123,98,229)
IMAGE_DATA(45,182,120,197,13,246,232,242,111,217,195,203,250,217,162,23,123,153,242,220,105,166,60,217,197,148,197,237,76,121,228,48)
IMAGE_DATA(83,30,10,50,69,217,175,225,185,135,7,125,165,94,99,11,12,1,131,192,21,96,0,184,204,180,54,119,239,254,27,55)
IMAGE_DATA(166,30,168,127,21,8,1,223,0,23,89,66,250,166,30,60,6,212,239,7,46,1,231,37,198,17,221,71,168,223,7,156)
IMAGE_DATA(179,143,227,72,231,173,249,155,63,253,61,111,233,97,112,15,212,11,186,190,122,198,58,142,53,235,191,159,79,73,101,172)
IMAGE_DATA(253,232,175,214,30,70,250,61,192,87,192,73,243,56,184,190,35,15,51,253,83,64,151,113,28,175,44,63,31,214,119,228)
IMAGE_DATA(97,161,175,118,196,198,17,173,239,200,195,66,95,109,141,140,195,72,223,145,71,159,185,190,26,148,20,199,89,125,252,68)
IMAGE_DATA(232,183,1,7,129,22,73,247,163,27,180,78,0,199,132,235,71,253,253,64,163,164,113,133,215,222,9,28,1,14,235,253)
IMAGE_DATA(131,215,143,250,106,189,164,249,193,251,230,16,112,0,104,6,26,128,189,64,141,164,121,46,246,77,19,176,15,168,3,170)
IMAGE_DATA(129,61,146,242,85,84,223,168,181,64,21,80,9,148,73,202,187,22,250,106,137,164,56,74,152,37,50,226,112,66,50,30)
IMAGE_DATA(110,163,60,176,5,157,88,104,185,85,108,121,225,225,65,95,197,59,56,195,11,220,0,21,4,131,84,224,92,139,36,25)
IMAGE_DATA(15,4,139,60,173,216,11,81,241,55,40,215,67,139,227,60,21,99,253,228,99,16,139,153,199,15,55,255,154,111,235,248)
IMAGE_DATA(37,38,97,199,196,113,142,138,189,75,230,125,102,230,129,250,184,248,172,78,191,110,234,163,197,113,134,138,189,11,204,248)
IMAGE_DATA(222,12,217,123,216,249,96,145,167,21,27,61,38,62,131,206,60,144,151,95,235,141,241,9,47,212,167,44,124,174,56,247)
IMAGE_DATA(48,243,209,22,106,43,159,129,248,60,162,125,194,11,181,149,207,101,9,113,4,153,185,79,159,78,210,247,163,133,10,142)
IMAGE_DATA(182,40,31,28,111,103,117,146,30,87,141,84,208,28,20,226,193,98,16,139,194,110,157,164,231,71,61,21,28,24,15,246)
IMAGE_DATA(27,22,129,88,12,118,82,76,93,18,230,57,20,121,90,177,135,69,31,22,127,88,4,30,18,250,174,67,66,190,130,34)
IMAGE_DATA(79,43,246,176,232,195,226,175,41,170,239,90,37,228,93,44,194,176,24,195,162,12,139,179,232,190,11,74,136,3,139,48)
IMAGE_DATA(43,159,22,9,113,184,236,145,200,90,235,23,116,126,65,231,126,95,165,218,239,164,132,159,180,15,208,132,216,75,147,164)
IMAGE_DATA(28,40,6,10,128,28,32,19,216,174,115,95,60,172,118,157,184,79,59,37,218,22,74,138,53,52,233,75,129,157,64,30)
IMAGE_DATA(144,77,62,153,6,30,102,187,103,194,238,150,122,148,18,121,144,146,46,143,5,19,204,46,138,37,151,124,178,13,60,76)
IMAGE_DATA(118,74,197,93,58,109,193,235,164,62,195,164,222,64,177,84,48,61,153,97,44,249,228,147,107,226,97,179,219,168,158,6)
IMAGE_DATA(142,83,159,29,164,88,112,49,193,133,101,55,197,82,72,62,249,22,30,22,187,166,90,97,128,11,247,49,33,150,122,225)
IMAGE_DATA(222,99,44,69,228,83,104,227,97,178,251,171,246,210,189,57,65,177,4,133,254,170,164,88,138,201,167,40,54,209,227,215)
IMAGE_DATA(178,63,147,93,176,156,146,136,199,75,175,246,216,22,48,201,120,44,75,237,209,10,49,252,116,195,131,235,115,156,250,56)
IMAGE_DATA(245,88,181,238,59,195,194,30,191,47,195,195,76,223,169,143,157,71,107,251,207,150,250,28,108,151,168,199,141,31,255,156)
IMAGE_DATA(199,159,183,3,219,201,28,187,241,226,165,135,95,208,249,5,157,235,125,117,63,39,11,127,250,181,3,219,37,234,97,182)
IMAGE_DATA(171,18,141,213,83,184,147,190,194,93,2,43,125,171,93,132,120,18,139,153,143,157,126,188,201,11,119,109,236,118,113,100)
IMAGE_DATA(36,72,238,227,84,63,17,15,238,35,115,236,202,192,203,162,209,139,226,215,243,34,222,237,135,17,183,31,170,188,120,56)
IMAGE_DATA(244,226,33,247,1,217,16,112,123,173,245,11,186,68,11,58,163,228,37,38,1,49,137,241,9,218,77,147,7,183,227,155)
IMAGE_DATA(133,1,81,65,9,160,196,193,238,128,89,18,192,36,115,150,6,95,39,77,30,158,96,2,52,232,74,245,129,231,200,35)
IMAGE_DATA(201,68,108,235,33,33,17,59,74,244,73,38,98,199,137,62,137,68,28,87,162,79,48,17,199,157,232,19,72,196,49,30)
IMAGE_DATA(87,29,232,199,153,36,99,60,6,104,252,216,233,99,31,53,211,88,170,17,238,117,17,197,144,165,235,171,95,26,120,224)
IMAGE_DATA(216,185,200,108,223,65,211,244,177,143,240,87,47,124,206,149,208,88,194,24,118,232,250,106,134,129,71,47,105,219,188,131)
IMAGE_DATA(166,141,163,58,182,144,55,74,41,134,124,138,97,155,174,175,110,54,240,248,154,180,109,222,65,211,238,65,53,91,152,211)
IMAGE_DATA(124,44,241,24,182,234,250,234,70,3,15,212,62,201,108,223,65,11,223,3,122,7,42,60,150,120,12,91,116,125,245,115)
IMAGE_DATA(3,143,227,194,181,91,188,131,22,113,15,120,31,101,211,125,206,32,253,13,192,122,3,15,188,246,118,102,251,14,90,56)
IMAGE_DATA(175,22,25,244,209,38,210,79,7,210,12,60,218,76,250,198,224,29,177,176,62,206,231,76,26,71,155,245,254,209,244,215)
IMAGE_DATA(2,171,189,47,32,248,131,3,122,39,66,32,16,48,69,244,208,218,139,249,221,238,235,168,115,168,23,10,133,98,144,226)
IMAGE_DATA(49,20,233,97,247,224,150,76,95,25,233,139,30,158,22,116,252,24,8,60,29,146,77,164,254,83,161,123,215,151,50,217)
IMAGE_DATA(160,46,191,126,237,235,110,240,150,140,238,163,199,196,61,114,50,22,231,201,194,202,35,230,70,37,112,248,30,190,135,239)
IMAGE_DATA(225,123,248,30,190,135,27,30,110,175,131,110,173,231,24,155,219,117,9,63,92,173,175,22,41,207,192,191,143,105,255,155)
IMAGE_DATA(155,155,99,179,179,179,236,206,157,59,26,51,51,51,108,122,122,154,77,77,77,105,76,78,78,178,137,137,9,141,241,241)
IMAGE_DATA(113,54,54,54,198,110,223,190,173,49,58,58,202,70,70,70,24,9,234,135,20,193,199,149,231,101,140,68,255,240,15,255)
IMAGE_DATA(120,208,15,49,89,196,188,17,145,12,205,6,88,181,107,2,26,129,6,1,171,118,251,0,252,227,204,189,68,157,77,59)
IMAGE_DATA(60,95,11,212,0,213,64,149,129,47,111,87,67,231,3,0,254,225,100,37,80,33,180,219,71,158,181,212,110,15,157,47)
IMAGE_DATA(7,202,128,221,64,169,112,125,92,51,64,237,202,232,60,254,2,3,127,193,176,11,40,18,174,143,107,150,83,187,98,58)
IMAGE_DATA(191,19,192,141,252,2,32,95,184,190,10,242,44,161,118,133,116,62,15,192,13,243,28,32,91,184,182,232,118,185,116,62)
IMAGE_DATA(11,192,141,233,29,192,118,193,179,128,180,184,78,38,157,223,6,224,6,240,86,32,67,240,202,50,104,131,231,183,0,184)
IMAGE_DATA(209,186,9,216,104,240,243,209,231,191,0,112,67,115,3,240,25,125,143,127,95,60,199,207,227,198,100,58,176,14,72,163)
IMAGE_DATA(207,104,210,4,214,2,159,2,107,0,220,12,92,229,128,79,128,143,129,143,128,15,29,178,18,248,0,120,223,33,239,1)
IMAGE_DATA(239,2,239,56,224,109,64,5,222,162,79,59,86,0,111,2,111,208,207,88,193,219,190,14,164,50,246,63,173,100,171,224)
IMAGE_END_DATA(1792, 10)
IMAGE_DATA(120,156,237,154,57,108,20,73,20,134,155,93,129,68,192,6,43,36,4,59,145,129,0,67,140,58,36,89,64,226,72,55)
IMAGE_DATA(64,136,251,62,87,192,46,6,204,152,49,190,193,176,92,194,23,96,108,192,32,196,145,112,8,45,11,25,18,142,72,144)
IMAGE_DATA(64,36,36,4,132,68,43,180,83,251,94,207,171,161,167,167,171,186,186,231,85,99,134,70,250,53,194,106,222,55,255,235)
IMAGE_DATA(58,254,42,236,204,116,102,58,242,207,248,248,184,72,67,185,198,23,214,84,193,200,139,47,106,254,79,228,154,254,21,185)
IMAGE_DATA(125,159,68,110,199,71,49,107,253,123,49,227,183,215,226,231,101,47,197,180,69,207,196,212,133,15,196,148,5,183,197,143)
IMAGE_DATA(179,71,196,164,95,6,132,51,253,156,112,126,234,21,206,212,46,225,76,110,19,206,15,5,225,56,45,158,82,103,164,208)
IMAGE_DATA(43,247,150,248,162,155,160,49,208,117,208,40,104,88,120,207,124,254,252,33,182,148,12,172,127,3,116,13,116,21,116,89)
IMAGE_DATA(36,170,175,100,72,15,88,127,4,116,5,52,200,232,35,216,35,172,63,4,234,139,246,209,217,243,172,248,248,201,187,162)
IMAGE_DATA(150,17,242,14,220,75,165,250,238,121,189,143,165,43,239,23,115,141,66,116,157,120,174,103,132,213,239,7,93,0,253,165)
IMAGE_DATA(246,33,235,27,49,84,245,207,128,122,195,125,204,93,48,88,174,111,196,208,212,119,187,171,125,4,235,27,49,52,245,221)
IMAGE_DATA(246,74,31,97,245,141,24,67,234,250,110,129,201,199,197,210,248,169,168,223,1,106,5,229,153,222,199,89,168,117,26,116)
IMAGE_DATA(210,247,253,177,126,11,232,8,211,184,194,239,222,3,234,4,181,149,250,131,223,31,235,187,77,76,243,67,246,230,56,232)
IMAGE_DATA(24,232,40,232,48,232,32,232,0,211,60,247,247,166,25,116,8,244,39,104,63,232,119,166,245,42,208,27,247,15,208,62)
IMAGE_DATA(208,94,208,46,166,117,87,83,223,221,206,228,99,187,208,138,195,135,137,106,97,216,150,83,183,129,206,31,180,108,133,173)
IMAGE_DATA(52,24,41,244,42,238,224,44,111,112,163,20,8,198,40,224,220,170,84,45,12,20,134,60,47,236,93,163,240,55,198,203)
IMAGE_DATA(240,124,12,82,24,27,33,78,136,23,21,227,225,227,183,197,142,238,127,170,22,236,42,31,125,20,246,174,168,123,166,98)
IMAGE_DATA(96,125,220,124,150,172,184,167,228,120,62,206,83,216,187,36,194,223,205,205,104,70,20,7,67,158,23,54,250,21,156,49)
IMAGE_DATA(51,6,106,206,252,129,42,78,121,163,62,163,225,92,55,103,168,56,222,70,173,227,140,198,99,4,57,229,141,90,199,25)
IMAGE_DATA(102,240,81,16,106,206,80,73,53,191,143,60,5,142,142,0,7,199,219,197,146,106,30,87,71,40,208,180,250,252,96,24)
IMAGE_DATA(196,80,120,182,164,154,231,71,19,5,14,244,131,125,195,16,136,97,176,135,60,245,50,204,115,8,121,94,216,195,208,135)
IMAGE_DATA(225,15,67,224,113,95,239,186,25,214,43,8,121,94,216,195,208,135,225,175,57,208,187,118,134,117,23,67,24,134,49,12)
IMAGE_DATA(101,24,206,130,189,43,48,248,192,16,166,227,228,25,124,88,102,36,217,107,179,64,151,5,58,251,189,106,140,190,73,41)
IMAGE_DATA(159,180,143,209,132,56,72,147,100,55,104,27,104,35,104,45,104,53,104,85,73,95,133,161,187,117,146,156,46,90,104,243)
IMAGE_DATA(180,40,30,160,73,191,3,180,25,180,30,180,134,56,171,67,24,170,219,51,223,237,150,123,130,22,242,2,45,186,210,11)
IMAGE_DATA(46,48,91,201,203,58,226,172,9,97,40,110,74,253,183,116,222,134,215,67,61,195,69,253,48,121,217,35,74,139,25,122)
IMAGE_DATA(217,64,156,117,10,70,196,109,163,123,14,116,138,122,214,74,94,112,51,193,141,101,39,121,217,68,156,13,26,134,230,214)
IMAGE_DATA(212,11,6,184,113,159,244,121,105,242,189,123,244,178,133,56,155,34,24,138,219,95,119,128,222,205,105,242,82,240,245,107)
IMAGE_DATA(47,121,217,70,156,45,213,11,61,254,157,251,179,214,13,203,84,73,24,13,243,250,35,3,76,45,140,217,141,253,94,16)
IMAGE_DATA(195,79,27,12,89,95,202,148,99,202,88,188,252,110,104,176,199,159,115,48,84,245,77,57,81,140,246,174,167,218,250,82)
IMAGE_DATA(248,92,82,198,131,71,111,138,248,239,163,132,207,113,142,221,184,74,147,145,5,186,44,208,89,239,213,215,156,44,242,244)
IMAGE_DATA(27,37,124,46,41,67,117,171,18,148,238,20,110,210,43,188,37,208,213,215,221,34,196,89,88,84,156,168,250,113,23,47)
IMAGE_DATA(188,181,137,186,197,225,88,32,37,199,180,126,18,134,228,112,142,93,14,165,25,26,211,8,191,169,135,120,219,135,17,219)
IMAGE_DATA(135,170,52,14,135,105,28,114,235,228,66,192,246,94,91,183,129,78,78,72,91,11,164,100,200,197,205,38,35,243,49,113)
IMAGE_DATA(124,72,233,158,111,235,252,91,123,42,212,49,134,95,9,79,24,224,85,207,254,186,236,78,49,234,116,91,11,67,214,183)
IMAGE_DATA(197,104,152,215,87,17,228,184,25,193,250,220,140,176,250,223,162,143,180,222,71,90,227,42,173,249,33,101,123,158,39,85)
IMAGE_DATA(198,248,126,25,117,25,232,100,227,146,202,36,9,115,48,170,78,179,164,114,128,8,222,208,197,21,125,103,25,116,252,159)
IMAGE_DATA(146,193,61,176,194,6,217,68,99,224,6,102,147,33,55,200,56,156,56,140,224,6,108,202,49,101,248,55,94,191,240,231)
IMAGE_DATA(28,12,85,125,83,78,20,3,55,90,147,27,83,124,46,41,35,251,239,158,140,145,49,50,198,68,99,212,101,160,227,110)
IMAGE_DATA(22,134,35,25,196,50,70,198,48,17,110,228,186,192,192,193,144,191,167,162,11,64,92,12,29,135,147,161,10,168,220,140)
IMAGE_DATA(48,142,13,70,144,243,45,250,176,253,62,108,143,43,155,243,195,104,158,167,240,107,40,254,3,187,45,134,188,112,200,124)
IMAGE_DATA(76,92,31,182,245,63,224,77,164,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(1312, 7)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,237,154,11,84,21,215,189,198,207,106,90,99,140,154,164,38,113,101,229,166,205,205,186,89,185,55,93,183,43,185)
IMAGE_DATA(230,118,53,173,53,5,65,1,5,68,222,42,209,98,84,212,168,9,166,70,107,147,24,77,149,168,164,141,15,64,68,144)
IMAGE_DATA(247,43,60,4,65,5,5,17,159,248,68,69,1,17,225,0,42,122,69,140,74,170,173,247,187,255,255,62,179,201,112,56)
IMAGE_DATA(51,103,14,113,245,198,38,227,250,173,217,179,247,247,157,61,123,102,207,227,99,52,13,54,13,54,201,101,238,156,217,75)
IMAGE_DATA(214,175,93,83,184,187,124,23,118,150,238,208,165,124,87,41,88,43,61,123,42,202,81,87,123,6,141,231,207,225,124,67)
IMAGE_DATA(189,77,184,237,92,125,45,88,107,233,103,39,78,28,63,130,147,213,199,80,125,226,168,46,82,179,107,231,14,1,251,142)
IMAGE_DATA(31,59,44,56,122,228,144,104,59,118,180,170,187,78,13,107,247,84,148,245,240,177,182,233,66,3,46,93,108,233,246,182)
IMAGE_DATA(181,54,11,88,35,169,216,189,11,197,197,133,56,74,237,71,168,159,99,228,109,37,205,69,242,241,186,185,185,81,148,153)
IMAGE_DATA(170,170,3,168,160,126,14,31,62,136,157,212,87,94,78,54,14,31,58,128,67,7,246,225,224,254,189,98,109,110,106,68)
IMAGE_DATA(171,185,169,27,62,142,91,11,242,177,173,168,80,80,144,159,139,236,172,116,28,58,184,15,7,246,87,10,246,239,219,67)
IMAGE_DATA(199,175,14,102,234,139,225,253,46,45,217,134,29,219,139,196,122,103,233,118,228,229,102,35,45,53,73,232,247,237,173,16)
IMAGE_DATA(158,115,245,103,233,152,215,11,100,153,127,71,30,139,242,178,82,228,124,145,137,228,164,4,161,223,91,185,91,180,157,58)
IMAGE_DATA(121,92,232,249,119,183,22,230,211,121,173,17,240,249,98,15,175,121,31,147,19,19,176,119,207,110,84,210,249,44,221,177)
IMAGE_DATA(77,140,151,215,60,14,94,23,111,45,64,225,150,60,236,44,217,142,221,101,59,81,65,243,234,139,172,12,100,164,167,136)
IMAGE_DATA(254,203,118,149,96,27,29,219,162,173,91,80,92,84,32,198,195,125,114,61,183,203,254,248,28,164,166,36,138,57,147,153)
IMAGE_DATA(145,42,182,213,251,194,219,188,223,149,123,202,123,176,37,63,167,199,28,205,72,75,17,227,181,69,110,78,150,32,61,45)
IMAGE_DATA(185,219,99,82,95,28,188,68,205,15,79,59,244,175,207,163,194,100,210,101,223,83,79,129,181,210,83,53,240,73,92,78)
IMAGE_DATA(203,71,199,158,195,232,40,175,178,13,181,93,205,223,129,170,1,67,132,247,224,243,207,163,97,254,50,156,255,224,51,156)
IMAGE_DATA(255,195,42,11,11,87,126,93,94,164,192,229,63,70,210,58,18,149,3,6,96,15,245,223,48,127,5,234,102,254,81,112)
IMAGE_DATA(118,242,123,164,91,137,218,105,139,80,27,182,24,117,179,62,16,136,50,181,215,191,187,12,7,251,63,137,74,233,163,182)
IMAGE_DATA(179,83,222,199,205,234,179,248,223,59,119,197,239,159,157,178,0,119,59,174,11,234,231,46,65,253,188,143,81,31,190,28)
IMAGE_DATA(85,15,13,65,14,249,206,211,111,212,205,88,132,134,133,43,240,247,59,119,192,11,123,239,92,190,2,185,156,124,107,1)
IMAGE_DATA(78,12,253,37,206,79,158,143,29,63,122,28,127,38,95,227,204,63,160,110,74,56,206,134,204,193,190,5,139,186,189,114)
IMAGE_DATA(201,112,27,135,18,210,29,39,170,137,4,98,1,209,52,113,26,234,124,223,68,221,248,16,212,186,251,226,90,115,19,254)
IMAGE_DATA(246,183,191,11,110,94,191,129,3,166,254,56,207,191,79,180,17,127,33,38,16,102,247,241,168,115,246,64,221,40,79,92)
IMAGE_DATA(172,167,139,255,202,53,92,161,49,153,155,91,112,153,202,151,91,47,162,189,255,139,184,78,218,155,196,199,132,19,209,242)
IMAGE_DATA(234,47,81,255,179,87,113,234,197,159,99,223,174,10,212,147,62,238,23,206,88,71,109,167,107,235,81,77,212,12,248,41)
IMAGE_DATA(190,164,237,219,196,60,98,56,247,61,244,39,104,24,242,12,14,82,121,41,241,249,43,175,139,249,193,251,182,222,52,8)
IMAGE_DATA(203,76,3,69,89,237,27,243,228,16,156,166,117,61,81,70,20,19,242,24,240,120,174,42,99,98,207,117,197,55,138,224)
IMAGE_DATA(57,243,38,173,47,19,173,63,38,237,179,164,251,41,233,95,32,237,191,153,240,215,151,76,184,35,121,209,132,8,197,35)
IMAGE_DATA(231,232,8,154,59,179,168,110,6,17,70,204,36,222,38,230,42,251,21,78,184,170,60,189,46,142,105,94,158,215,215,62)
IMAGE_DATA(246,152,56,216,122,176,134,181,210,19,253,240,96,228,127,178,18,5,159,199,160,224,207,209,182,161,54,214,176,150,61,107)
IMAGE_DATA(30,126,24,169,19,103,34,53,132,152,24,134,212,9,10,19,195,122,111,11,205,76,176,39,170,223,99,72,246,11,69,146)
IMAGE_DATA(87,8,49,9,73,222,33,22,184,220,107,59,68,104,217,19,253,131,193,72,246,127,11,201,190,83,144,60,126,10,74,11)
IMAGE_DATA(10,5,137,110,65,2,185,205,109,66,67,90,246,172,124,104,32,82,71,7,32,238,137,151,177,105,76,16,202,203,203,5)
IMAGE_DATA(37,185,121,2,185,205,109,172,97,45,123,222,167,227,20,71,108,36,86,17,31,254,98,120,183,86,194,117,171,20,13,107)
IMAGE_DATA(223,87,78,88,54,65,103,8,169,98,146,245,67,113,225,86,122,26,237,18,112,153,235,82,21,77,182,226,153,162,76,180)
IMAGE_DATA(66,34,183,223,179,200,205,254,2,185,121,91,144,153,145,37,224,178,168,163,182,66,69,203,30,95,98,27,81,196,23,231)
IMAGE_DATA(195,67,17,151,148,140,4,98,158,50,105,184,44,234,168,173,72,209,250,90,249,120,95,66,77,143,144,254,17,81,78,21)
IMAGE_DATA(222,71,68,93,170,162,145,190,215,148,114,161,82,207,251,159,175,140,37,77,41,103,43,109,133,138,150,61,60,103,166,243)
IMAGE_DATA(133,68,23,69,201,115,95,83,244,172,5,117,29,107,166,43,30,57,71,135,209,182,191,178,15,227,9,31,133,241,74,29)
IMAGE_DATA(183,13,83,121,122,92,28,79,12,30,60,100,113,72,72,196,201,176,217,93,103,131,66,112,54,112,162,109,130,38,161,58)
IMAGE_DATA(116,90,215,226,144,73,17,210,115,244,221,247,174,181,23,149,220,235,216,71,79,14,29,174,236,40,187,199,218,197,147,38)
IMAGE_DATA(69,84,207,152,213,101,142,77,190,119,49,179,16,23,179,182,66,172,69,89,110,43,100,89,234,205,155,210,239,157,152,20)
IMAGE_DATA(218,85,19,56,9,45,113,233,104,137,207,68,203,38,34,62,75,104,44,219,25,104,75,201,37,242,44,109,12,105,107,103)
IMAGE_DATA(189,131,211,1,19,208,178,49,77,104,88,123,227,76,61,190,186,114,21,151,242,183,163,149,60,183,232,174,202,180,166,228)
IMAGE_DATA(8,143,153,180,181,51,231,225,128,175,63,154,99,146,104,59,21,173,233,121,184,213,222,142,59,95,125,133,191,118,118,226)
IMAGE_DATA(246,101,46,119,225,214,149,43,104,140,74,64,67,248,82,52,125,186,30,199,166,207,70,145,247,56,52,173,137,67,243,186)
IMAGE_DATA(120,92,32,206,101,126,129,91,29,29,194,203,220,190,222,137,195,145,235,112,130,46,204,122,39,98,100,48,202,199,248,34)
IMAGE_DATA(205,99,44,154,86,254,5,230,213,107,209,188,122,13,154,215,199,226,90,83,51,110,223,186,45,184,222,118,17,181,115,23)
IMAGE_DATA(162,121,100,16,90,93,152,64,20,187,121,33,102,244,104,92,88,178,28,230,165,43,208,188,242,51,92,58,85,131,246,75)
IMAGE_DATA(237,226,105,209,218,208,104,41,159,58,131,246,176,5,232,24,29,136,171,110,129,200,27,237,129,85,206,78,104,156,255,62)
IMAGE_DATA(154,127,191,144,158,140,31,224,244,238,74,156,35,111,197,39,171,80,62,43,28,117,71,143,11,46,132,133,227,186,226,75)
IMAGE_DATA(117,25,133,136,145,191,197,133,233,51,209,76,99,61,229,251,59,20,250,76,66,201,123,139,113,220,53,16,231,70,6,162)
IMAGE_DATA(108,234,219,216,22,58,27,205,163,253,113,221,205,226,75,34,223,106,111,175,174,83,62,19,238,53,249,132,224,164,115,16)
IMAGE_DATA(170,70,4,226,152,115,0,29,131,64,49,150,203,116,115,105,35,216,195,180,185,7,220,251,204,197,165,235,221,224,192,136)
IMAGE_DATA(13,30,163,175,53,248,122,223,187,16,234,137,243,211,61,209,20,230,137,214,89,158,104,159,237,137,107,115,198,10,58,136)
IMAGE_DATA(203,179,60,239,229,248,185,95,11,15,10,20,115,244,29,90,175,28,51,186,43,97,172,43,18,60,93,176,217,219,5,137)
IMAGE_DATA(94,46,72,30,231,140,20,137,183,51,62,27,229,210,21,30,108,241,152,190,139,153,163,160,160,192,16,214,153,131,235,56)
IMAGE_DATA(115,212,214,214,106,194,26,235,204,33,127,143,51,135,150,71,43,115,72,239,145,35,71,132,150,215,140,172,215,203,28,106)
IMAGE_DATA(175,218,99,47,115,104,29,143,239,51,199,119,40,115,152,63,138,210,68,43,115,216,91,244,50,135,214,98,126,217,126,230)
IMAGE_DATA(176,229,177,151,57,178,72,195,200,229,93,101,219,94,230,144,62,107,236,101,142,253,47,107,243,192,103,14,190,90,222,244)
IMAGE_DATA(243,109,93,61,244,105,44,39,145,30,172,97,173,244,68,246,31,132,36,122,164,166,173,136,68,218,159,52,160,54,214,176)
IMAGE_DATA(150,61,171,158,126,26,27,198,77,68,108,224,84,196,250,255,206,2,189,235,219,44,147,134,181,236,89,65,253,111,24,247)
IMAGE_DATA(38,162,221,3,4,81,206,62,136,245,155,130,232,81,126,2,46,115,157,108,103,45,123,34,164,207,35,16,81,35,125,17)
IMAGE_DATA(31,20,102,19,110,99,13,107,217,179,144,136,245,158,136,104,55,63,187,79,27,214,176,150,61,83,137,141,238,254,136,30)
IMAGE_DATA(233,141,40,167,177,154,30,110,99,13,107,167,42,239,192,113,111,140,66,244,175,156,16,253,58,49,236,87,189,251,161,58)
IMAGE_DATA(209,70,26,214,178,103,4,17,63,236,117,68,255,124,24,162,95,249,111,44,160,119,111,70,122,228,54,183,177,134,181,236)
IMAGE_DATA(249,79,246,189,240,18,98,126,242,2,214,62,243,124,183,206,26,110,99,13,107,217,243,31,196,230,199,159,196,134,65,79)
IMAGE_DATA(136,220,180,242,57,219,112,27,107,88,203,158,215,6,13,18,65,63,134,248,132,248,200,100,9,243,50,207,46,85,234,62)
IMAGE_DATA(81,52,235,20,15,207,25,190,144,147,248,38,50,144,142,45,93,32,155,159,50,33,101,168,5,46,115,29,183,37,41,23)
IMAGE_DATA(189,122,142,254,172,95,63,120,80,157,155,130,187,130,220,230,54,214,72,79,175,39,199,130,183,166,46,169,155,58,3,53)
IMAGE_DATA(158,62,186,156,157,56,25,172,149,158,250,89,115,208,177,247,16,190,172,57,135,47,79,215,217,134,218,58,171,142,163,126)
IMAGE_DATA(230,219,194,91,59,45,12,23,147,115,112,137,243,69,70,129,133,180,45,95,151,211,21,168,124,137,179,72,70,33,206,248)
IMAGE_DATA(79,192,233,113,254,104,75,206,71,43,229,9,198,28,157,66,186,45,148,39,40,135,196,101,160,149,50,8,35,202,172,73)
IMAGE_DATA(204,161,167,200,28,212,140,243,35,95,30,181,145,39,38,5,230,172,40,77,90,55,103,163,53,41,23,117,211,102,99,191)
IMAGE_DATA(151,183,216,110,161,204,97,111,105,152,243,33,90,163,18,41,115,204,68,129,187,7,218,98,83,97,94,159,64,217,99,147)
IMAGE_DATA(166,135,239,172,245,191,9,64,195,112,63,236,242,240,65,146,235,40,92,252,60,6,230,200,181,4,101,14,186,169,216,242)
IMAGE_DATA(180,140,160,241,184,6,163,157,40,116,247,194,26,103,103,92,34,173,121,89,4,204,127,250,180,251,41,168,246,240,246,255)
IMAGE_DATA(76,155,143,78,87,127,124,233,30,140,44,55,15,44,27,49,28,151,22,125,0,243,130,69,148,61,22,118,251,228,93,95)
IMAGE_DATA(110,55,78,155,135,27,174,1,184,73,190,120,23,87,44,121,99,56,189,235,207,69,11,157,207,51,62,83,144,229,234,133)
IMAGE_DATA(173,139,62,196,201,225,222,98,223,138,39,207,64,118,200,116,180,210,141,234,134,123,144,197,231,234,138,79,189,61,209,72)
IMAGE_DATA(121,195,236,51,25,39,126,19,140,170,215,131,113,236,215,254,116,12,130,209,230,20,140,107,148,63,218,137,27,52,174,78)
IMAGE_DATA(226,166,251,4,44,119,114,18,115,102,221,40,39,92,245,243,161,76,225,133,182,185,94,104,127,199,11,215,194,189,112,99)
IMAGE_DATA(190,23,110,255,222,19,93,146,247,188,145,235,235,218,99,142,46,117,119,69,220,24,87,196,142,113,65,44,229,142,141,180)
IMAGE_DATA(222,228,229,140,120,79,11,155,169,188,252,13,167,110,207,119,50,115,200,239,28,214,127,57,146,216,251,206,161,229,179,247)
IMAGE_DATA(157,67,43,167,164,166,166,234,126,231,208,243,233,101,14,110,215,194,72,230,144,223,57,190,207,28,223,103,142,175,243,134)
IMAGE_DATA(157,239,28,122,89,165,47,153,35,210,78,230,208,243,105,101,14,206,36,76,164,6,122,153,195,104,118,208,202,28,242,59)
IMAGE_DATA(135,220,254,167,249,206,49,242,181,97,105,70,50,199,167,131,7,131,181,210,99,52,115,164,44,254,24,145,253,6,9,175)
IMAGE_DATA(221,204,225,167,192,229,128,80,90,135,34,130,222,9,117,51,135,91,128,200,11,2,55,75,123,12,101,128,85,63,26,100)
IMAGE_DATA(56,115,196,140,13,70,140,231,4,242,133,32,242,7,131,122,100,142,13,52,97,181,124,204,231,143,191,132,88,231,113,248)
IMAGE_DATA(248,161,71,13,103,142,208,231,44,147,123,141,114,146,172,51,135,158,143,191,143,108,38,222,178,202,28,241,212,198,132,106)
IMAGE_DATA(144,78,218,76,229,130,178,206,28,90,217,129,97,15,127,131,240,212,201,28,60,63,98,85,219,177,166,158,62,189,204,193)
IMAGE_DATA(227,73,81,198,196,158,116,197,247,10,193,115,70,43,115,100,62,99,66,14,93,44,185,18,218,158,172,120,228,28,181,149)
IMAGE_DATA(57,198,16,99,149,253,242,86,245,99,243,226,120,80,51,7,223,181,29,206,28,58,79,0,173,204,161,231,97,250,146,57)
IMAGE_DATA(34,237,100,14,61,159,102,230,176,243,228,208,202,28,122,99,179,149,57,236,29,15,113,44,255,25,50,7,47,25,25,25)
IMAGE_DATA(119,115,115,115,65,107,93,178,179,179,121,125,87,122,178,178,178,232,125,252,24,106,106,106,112,250,244,105,155,112,91,117)
IMAGE_DATA(117,53,88,43,251,217,179,135,222,117,247,238,237,166,178,178,178,199,182,53,153,153,153,162,127,246,85,84,84,8,202,202)
IMAGE_DATA(202,208,217,209,209,3,174,231,28,192,107,214,42,125,118,251,216,163,246,85,31,63,46,214,220,174,134,251,227,119,116,46)
IMAGE_DATA(243,239,241,254,49,214,190,253,251,247,11,120,76,172,227,190,146,146,146,122,244,101,171,63,222,47,134,251,97,146,147,147)
IMAGE_DATA(145,152,152,40,180,165,165,165,189,198,101,141,244,115,95,241,241,241,40,41,41,193,246,237,219,187,235,25,107,45,195,231)
IMAGE_DATA(143,225,190,54,110,220,136,162,162,162,238,39,18,143,129,81,251,100,157,244,37,36,36,8,95,126,126,62,228,124,209,242)
IMAGE_DATA(241,184,212,62,238,83,142,55,45,45,173,27,245,254,169,247,145,225,190,120,206,240,24,185,45,39,39,71,252,54,247,175)
IMAGE_DATA(245,100,229,99,162,158,163,113,113,113,162,127,254,13,94,219,66,246,99,243,226,88,58,109,234,5,163,153,131,181,210,227)
IMAGE_DATA(104,230,96,207,253,204,28,214,139,145,204,193,168,239,194,188,136,188,97,39,115,48,214,62,35,153,67,157,59,164,79,222)
IMAGE_DATA(201,181,50,135,189,69,60,61,108,100,14,245,83,130,143,189,186,47,163,153,67,237,115,36,115,88,251,140,102,14,185,111)
IMAGE_DATA(90,153,131,231,140,163,153,67,61,71,141,102,14,233,233,117,113,4,141,116,190,107,52,115,176,86,122,28,205,28,236,185)
IMAGE_DATA(159,153,163,215,119,0,3,153,131,81,191,191,243,90,228,13,59,153,131,177,246,25,201,28,234,220,33,125,50,3,104,101)
IMAGE_DATA(14,123,223,85,216,107,43,115,168,243,5,31,123,117,95,70,51,135,218,231,72,230,176,246,25,205,28,114,223,180,50,7)
IMAGE_DATA(207,25,71,51,135,122,142,26,205,28,210,211,235,226,248,245,127,189,106,56,115,176,86,122,28,205,28,236,185,159,153,195)
IMAGE_DATA(122,49,154,57,180,158,0,246,50,135,150,79,47,115,168,115,135,245,147,67,43,115,24,121,114,216,202,28,246,158,28,70)
IMAGE_DATA(50,135,218,231,72,230,176,246,25,205,28,114,223,180,50,7,207,25,71,51,135,122,142,26,205,28,210,211,235,226,120,0)
IMAGE_DATA(23,40,24,173,183,110,135,157,58,123,94,163,30,45,175,209,229,126,244,229,232,216,244,234,180,124,70,235,191,253,139,245)
IMAGE_DATA(197,177,122,245,106,56,130,244,56,218,175,218,255,13,125,134,78,138,142,79,183,78,99,63,237,78,58,157,241,233,78,212)
IMAGE_DATA(251,236,235,203,126,246,245,184,244,245,60,24,90,190,137,79,237,119,100,94,247,184,56,6,62,58,240,183,41,137,233,157)
IMAGE_DATA(197,5,59,161,70,190,223,90,215,179,86,122,254,229,35,192,17,100,63,142,250,100,223,114,91,46,214,58,235,122,45,159)
IMAGE_DATA(90,99,171,206,218,103,173,179,229,209,242,217,242,218,27,223,55,241,245,101,63,109,233,108,213,221,175,243,96,148,196,77)
IMAGE_DATA(105,157,125,153,103,143,246,31,240,134,214,188,214,34,46,38,254,202,15,31,250,225,191,155,6,210,191,251,184,56,244,248)
IMAGE_DATA(230,63,145,74,173,170,172,171,151,24,232,195,17,189,214,29,214,238,56,12,236,247,63,84,255,255,186,124,11,95,67,250)
IMAGE_DATA(244,184,181,55,49,245,124,122,19,238,1,246,25,186,64,244,30,239,122,19,249,219,228,211,91,190,241,107,200,143,77,79)
IMAGE_DATA(57,218,231,183,113,233,235,221,200,225,187,171,244,217,250,15,112,182,188,214,237,26,30,187,55,10,7,124,186,227,51,120)
IMAGE_DATA(247,238,243,113,49,160,121,32,150,255,3,132,103,156,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(3904, 22)
IMAGE_DATA(120,156,237,154,9,80,85,103,150,199,95,79,215,152,101,212,36,99,18,43,147,233,238,116,170,83,93,157,174,233,234,140)
IMAGE_DATA(153,12,166,141,105,16,84,64,54,1,1,1,37,42,202,34,160,160,8,110,49,106,20,215,196,13,16,81,20,120,136,24)
IMAGE_DATA(1,65,220,21,247,5,247,29,158,136,240,216,117,88,220,72,219,105,243,159,115,190,247,93,188,224,91,72,68,187,186,195)
IMAGE_DATA(165,126,117,191,251,157,255,57,231,219,238,189,239,123,15,205,91,154,183,52,202,113,250,244,105,60,15,190,251,174,246,153)
IMAGE_DATA(209,149,163,43,71,87,142,174,28,219,119,234,190,159,183,96,191,69,88,247,99,115,124,25,183,239,251,255,124,31,176,4)
IMAGE_DATA(235,158,102,172,236,28,179,205,230,97,123,103,204,135,169,60,150,226,255,208,57,127,247,119,171,219,228,225,235,103,177,174)
IMAGE_DATA(148,60,29,141,255,99,215,238,15,137,255,99,115,252,80,158,103,14,171,44,158,199,19,79,156,5,159,227,169,80,231,48)
IMAGE_DATA(6,231,216,112,17,79,133,146,163,181,205,70,232,172,28,207,26,205,223,227,3,157,185,129,123,90,212,57,76,45,2,171)
IMAGE_DATA(77,196,70,66,75,164,18,235,136,213,196,10,98,49,241,37,49,147,136,33,162,136,8,98,60,17,130,142,229,224,248,153)
IMAGE_DATA(68,6,145,78,108,32,214,18,137,196,114,98,17,49,151,152,65,76,33,34,137,112,34,148,8,238,96,142,204,118,125,72)
IMAGE_DATA(33,214,16,241,196,215,196,2,98,54,49,141,152,76,76,144,125,160,248,86,227,58,144,67,233,3,199,79,35,214,19,201)
IMAGE_DATA(178,15,60,78,75,136,121,196,44,34,86,142,83,184,97,140,56,190,85,160,133,28,237,199,104,189,28,35,158,135,149,196)
IMAGE_DATA(87,178,15,115,84,227,52,81,246,33,200,16,223,106,180,153,28,198,230,64,153,231,85,114,140,22,169,250,160,140,83,132)
IMAGE_DATA(236,195,88,67,124,171,207,76,228,48,21,63,73,206,193,50,185,150,230,203,121,152,161,90,79,97,178,15,99,12,241,173)
IMAGE_DATA(70,26,201,97,41,62,175,163,165,114,140,120,45,209,195,207,106,170,106,174,67,101,31,70,25,226,91,249,27,201,177,177)
IMAGE_DATA(3,241,23,202,49,250,130,152,174,234,67,184,92,75,220,135,0,67,124,43,95,35,57,210,229,250,177,20,159,199,104,166)
IMAGE_DATA(92,75,147,85,115,61,78,246,97,132,33,190,149,143,145,28,188,118,82,228,250,177,20,159,199,40,26,143,239,185,16,185)
IMAGE_DATA(150,184,15,126,134,248,86,94,70,114,172,145,177,19,229,250,81,199,231,57,158,35,231,128,215,209,20,60,126,110,132,202)
IMAGE_DATA(62,140,150,125,24,110,136,111,229,105,36,71,130,140,205,247,23,175,207,37,170,246,115,252,89,170,57,152,132,199,247,180)
IMAGE_DATA(178,150,148,62,120,27,226,91,185,27,201,193,177,151,201,182,243,250,143,131,225,121,55,91,182,127,122,187,57,8,195,227)
IMAGE_DATA(251,65,153,7,238,195,48,67,124,43,55,35,57,190,82,181,157,199,102,174,92,63,51,229,248,196,200,248,234,57,80,198)
IMAGE_DATA(104,164,156,103,47,25,223,149,112,54,146,131,219,190,160,221,216,204,144,243,59,69,142,207,68,60,126,174,142,51,50,70)
IMAGE_DATA(30,50,190,19,225,104,36,199,124,19,99,19,45,231,119,130,106,124,148,248,124,63,251,203,117,228,105,24,31,17,223,129)
IMAGE_DATA(24,244,100,142,103,253,30,84,62,124,113,238,31,67,100,100,164,73,212,57,132,94,253,124,183,116,221,206,198,241,180,90)
IMAGE_DATA(237,19,116,74,142,77,109,115,88,250,240,251,52,99,101,44,190,58,199,115,253,64,7,121,164,71,190,170,237,108,160,58)
IMAGE_DATA(210,35,95,209,62,202,253,15,116,54,28,87,105,191,184,94,65,185,59,25,67,30,67,159,148,28,1,94,47,141,234,44)
IMAGE_DATA(204,229,208,116,194,209,149,163,43,71,87,142,174,28,93,57,186,114,60,139,28,207,250,61,248,172,222,231,207,227,115,201)
IMAGE_DATA(243,248,124,165,249,153,230,53,154,166,127,35,126,166,185,119,239,30,238,222,189,139,230,230,102,65,99,99,35,26,26,26)
IMAGE_DATA(112,251,246,109,65,125,125,61,234,234,234,4,53,53,53,168,174,174,70,101,101,165,160,162,162,2,229,229,229,74,64,195)
IMAGE_DATA(209,41,1,187,107,222,236,140,149,216,117,116,29,93,199,63,251,161,126,88,60,237,175,61,109,152,105,4,115,186,25,196)
IMAGE_DATA(116,98,154,10,115,186,169,68,44,17,35,153,98,65,199,246,104,98,50,49,137,136,50,146,87,209,77,150,246,72,98,34)
IMAGE_DATA(49,129,136,80,233,166,202,156,209,82,55,81,218,195,137,48,98,60,17,170,106,159,18,51,82,234,194,164,157,127,192,224)
IMAGE_DATA(31,24,130,136,113,170,246,41,49,195,165,46,88,218,199,18,252,69,254,24,98,180,170,125,17,50,103,136,212,5,74,251)
IMAGE_DATA(40,130,191,48,15,32,70,170,218,214,94,247,153,180,143,32,248,139,105,63,194,87,149,115,140,140,165,196,241,151,246,225)
IMAGE_DATA(4,127,1,236,77,120,169,114,141,48,162,97,251,48,130,191,104,245,32,220,141,248,183,183,15,37,248,11,77,87,194,69)
IMAGE_DATA(214,41,245,106,155,98,231,47,38,157,136,33,132,163,60,183,199,81,133,3,97,79,12,38,248,203,192,129,29,192,142,176)
IMAGE_DATA(37,6,16,214,29,228,207,196,167,196,39,29,164,31,241,39,226,227,14,208,151,176,34,254,87,158,45,241,17,241,33,241)
IMAGE_DATA(223,210,199,28,138,246,3,136,95,250,53,61,233,79,57,194,195,66,103,173,90,177,60,255,64,225,62,236,221,179,203,44)
IMAGE_DATA(133,251,246,128,181,138,207,161,131,133,40,41,190,138,178,27,215,113,163,84,103,20,182,93,215,21,131,181,134,60,123,113)
IMAGE_DATA(254,220,105,92,188,112,22,23,206,159,49,139,162,217,183,119,151,128,253,206,157,61,37,56,115,250,164,176,157,61,83,212)
IMAGE_DATA(90,167,134,181,135,14,238,111,227,199,218,242,155,165,168,173,169,108,245,173,174,170,16,176,70,225,224,129,125,216,190,61)
IMAGE_DATA(31,103,200,126,154,242,156,37,223,42,210,212,144,31,159,43,42,202,68,153,41,42,58,142,131,148,231,212,169,19,216,75)
IMAGE_DATA(185,114,182,108,198,169,147,199,113,242,248,81,156,56,118,68,156,245,229,101,168,210,151,183,194,227,184,45,47,23,59,10)
IMAGE_DATA(242,5,121,185,217,216,156,181,17,39,79,28,197,241,99,135,5,199,142,30,162,241,43,129,158,114,49,220,238,61,187,119)
IMAGE_DATA(96,215,206,2,113,222,187,103,39,114,178,55,35,67,155,42,244,71,143,28,20,62,215,117,215,104,204,117,2,165,204,113)
IMAGE_DATA(148,177,40,220,191,7,91,190,217,132,180,212,20,161,63,114,248,128,176,93,186,120,78,232,57,238,182,252,92,154,215,43)
IMAGE_DATA(2,158,47,246,225,51,183,49,109,67,10,142,28,58,128,195,52,159,123,118,237,16,253,229,51,247,131,207,219,183,229,33)
IMAGE_DATA(127,107,14,246,238,222,137,3,251,247,226,32,173,171,111,178,50,145,185,49,93,228,223,191,111,55,118,208,216,22,108,219)
IMAGE_DATA(138,237,5,121,162,63,156,147,235,217,174,228,227,57,208,166,111,16,107,102,83,166,86,92,171,219,194,215,220,238,195,135)
IMAGE_DATA(10,219,176,53,119,75,155,53,154,153,145,46,250,107,140,236,45,89,130,141,25,105,173,62,109,110,14,62,226,163,34,51)
IMAGE_DATA(78,254,250,29,28,212,104,204,114,244,141,55,192,90,197,167,168,251,235,168,203,200,69,227,161,83,104,44,44,50,14,217)
IMAGE_DATA(110,231,238,66,209,203,189,132,239,137,119,222,65,105,212,28,220,152,177,20,55,166,46,50,16,179,240,113,57,86,194,229)
IMAGE_DATA(233,75,232,188,4,135,95,126,25,135,40,127,105,212,124,148,4,79,23,92,27,57,137,116,11,81,28,24,139,226,160,105)
IMAGE_DATA(40,9,153,33,16,101,178,235,38,206,193,137,23,95,199,97,197,143,108,215,2,166,224,222,133,107,248,254,225,95,69,252)
IMAGE_DATA(107,1,209,248,107,99,147,64,23,62,11,186,136,47,160,139,156,135,162,159,247,194,22,242,187,65,49,74,198,197,162,52)
IMAGE_DATA(102,62,254,246,240,161,216,85,177,239,195,186,91,173,59,184,139,99,162,113,190,183,21,110,140,140,194,174,127,125,21,95)
IMAGE_DATA(145,95,89,240,84,148,4,68,226,154,127,24,142,70,199,182,250,42,71,230,96,87,236,38,221,57,226,2,145,66,68,19)
IMAGE_DATA(229,190,129,40,113,31,129,146,161,254,40,182,119,71,67,69,57,190,251,238,111,130,123,77,119,112,92,243,34,110,112,124)
IMAGE_DATA(162,154,248,154,24,78,232,237,135,162,196,198,1,37,3,157,80,163,163,155,255,86,3,110,81,159,244,21,149,168,163,114)
IMAGE_DATA(93,85,13,234,95,124,15,77,164,189,71,124,65,88,19,149,31,88,65,247,251,15,112,233,189,63,224,232,190,131,208,145)
IMAGE_DATA(62,249,35,27,172,36,219,229,98,29,46,16,87,94,254,21,238,210,245,3,34,130,232,199,185,123,255,18,165,189,222,194)
IMAGE_DATA(9,42,207,38,150,253,177,175,88,31,220,182,85,154,30,152,163,233,46,202,106,63,199,215,123,225,50,157,117,196,126,98)
IMAGE_DATA(59,161,140,1,247,231,182,236,19,251,52,73,191,129,4,175,153,17,116,174,35,170,254,157,180,111,147,238,87,164,127,151)
IMAGE_DATA(180,191,209,224,47,191,213,224,161,194,123,26,196,73,31,101,141,246,167,181,19,66,117,227,136,32,34,152,24,79,132,203)
IMAGE_DATA(118,69,18,118,42,159,39,110,142,64,103,167,166,21,175,188,34,6,219,28,172,97,173,226,147,240,66,79,228,206,93,136)
IMAGE_DATA(188,101,137,200,251,42,193,56,100,99,13,107,217,103,249,11,47,64,235,27,12,173,63,225,27,4,237,112,137,111,208,147)
IMAGE_DATA(215,66,19,12,246,137,239,246,10,210,60,70,33,213,217,159,240,67,170,139,191,1,46,63,113,237,47,180,236,147,240,47)
IMAGE_DATA(61,145,230,57,6,105,238,1,72,27,26,128,61,121,249,130,13,131,189,5,202,53,219,132,134,180,236,179,240,231,221,161)
IMAGE_DATA(29,52,12,201,175,189,143,181,142,222,40,44,44,20,236,206,206,17,40,215,108,99,13,107,217,103,10,141,83,50,177,134)
IMAGE_DATA(88,68,204,252,168,95,171,86,129,235,22,73,13,107,167,200,9,219,76,208,12,65,43,22,89,55,108,207,223,70,111,163)
IMAGE_DATA(125,2,46,115,157,86,106,54,75,159,0,185,208,242,137,236,110,111,35,123,243,55,200,206,217,138,77,153,89,2,46,139)
IMAGE_DATA(58,178,229,75,45,251,184,19,59,136,2,190,57,95,232,141,228,212,52,164,16,17,114,209,112,89,212,145,173,64,106,221)
IMAGE_DATA(219,249,113,91,70,105,94,34,253,75,162,172,21,190,47,137,58,173,212,40,126,31,202,114,190,172,231,246,231,202,190,100)
IMAGE_DATA(200,242,102,105,203,151,90,246,225,53,51,150,111,36,186,41,118,255,226,49,5,111,27,80,215,177,102,172,244,81,214,104)
IMAGE_DATA(31,186,246,148,109,24,74,184,73,134,202,58,182,245,81,249,180,185,57,94,235,217,179,215,52,127,255,184,139,65,161,45)
IMAGE_DATA(215,188,253,113,205,203,215,56,222,126,184,48,42,176,101,154,191,95,156,226,115,102,226,164,134,250,130,221,143,26,143,210)
IMAGE_DATA(155,195,12,183,118,237,127,196,218,105,126,126,113,23,198,133,180,232,147,210,30,213,108,202,71,77,214,54,136,179,40,43)
IMAGE_DATA(215,146,44,67,189,126,237,198,71,231,253,70,181,92,241,242,67,101,242,70,84,174,219,132,202,181,196,186,44,161,49,92)
IMAGE_DATA(103,162,58,61,155,200,49,216,24,210,22,135,76,192,229,97,195,81,185,38,67,104,88,123,231,170,14,223,222,186,141,218)
IMAGE_DATA(220,157,168,34,159,251,244,84,101,170,210,183,8,31,61,105,139,131,35,112,220,221,19,21,137,169,116,173,69,213,198,28)
IMAGE_DATA(220,175,175,199,195,111,191,197,95,154,155,241,160,142,203,45,184,127,235,22,202,226,83,80,26,57,27,229,11,86,225,236)
IMAGE_DATA(216,80,20,184,184,162,124,121,50,42,86,174,195,77,226,250,166,111,112,191,177,81,248,50,15,154,154,113,106,201,74,156)
IMAGE_DATA(167,27,83,103,77,12,240,65,161,163,59,50,28,134,160,124,225,215,208,47,94,129,138,197,203,81,177,42,9,13,229,21)
IMAGE_DATA(120,112,255,129,160,169,186,6,197,225,49,168,24,224,141,42,91,198,11,219,7,59,35,113,208,32,220,156,53,15,250,217)
IMAGE_DATA(243,81,177,112,41,106,47,93,65,125,109,189,120,91,84,149,150,25,202,151,174,162,62,40,26,141,131,188,112,123,176,23)
IMAGE_DATA(114,6,57,96,145,141,53,202,162,166,160,98,114,12,189,25,103,224,242,129,195,184,78,190,7,231,46,66,97,72,36,74)
IMAGE_DATA(206,156,19,220,12,138,68,147,244,211,218,14,68,220,128,63,227,230,216,96,84,80,95,47,185,127,134,124,55,63,236,158)
IMAGE_DATA(52,13,231,236,188,112,125,128,23,246,143,30,143,29,163,66,81,49,200,19,77,131,13,126,169,228,183,216,197,185,229,146)
IMAGE_DATA(219,240,71,229,110,254,184,104,227,141,162,254,94,56,107,51,140,198,192,75,244,165,142,30,46,213,4,251,48,213,246,195)
IMAGE_DATA(30,45,181,181,109,153,232,227,21,183,218,97,80,67,169,187,203,163,155,163,156,112,99,172,19,202,131,156,80,21,226,132)
IMAGE_DATA(250,80,39,52,132,13,17,52,18,117,33,78,143,182,120,216,55,68,122,123,137,53,58,129,206,11,29,7,181,164,12,177)
IMAGE_DATA(67,138,147,45,214,187,216,98,131,179,45,210,92,109,144,174,224,98,131,165,3,109,91,34,125,12,62,63,201,61,71,94)
IMAGE_DATA(94,94,135,104,191,231,224,58,222,115,20,23,23,155,132,53,237,247,28,74,60,222,115,152,242,49,181,231,80,124,249,191)
IMAGE_DATA(29,88,171,252,231,131,82,111,110,207,161,246,85,251,88,218,115,152,26,143,174,61,199,79,104,207,161,255,60,222,36,166)
IMAGE_DATA(246,28,150,14,115,123,14,83,135,254,125,203,123,14,99,62,150,246,28,89,164,97,148,99,162,188,182,180,231,80,252,218)
IMAGE_DATA(99,105,207,113,236,125,211,252,195,239,57,248,110,25,225,225,94,181,184,247,155,152,71,34,115,176,134,181,138,207,146,23)
IMAGE_DATA(123,32,149,94,169,25,243,151,32,227,75,19,144,141,53,172,101,159,69,111,190,137,213,174,190,72,242,26,141,36,207,207)
IMAGE_DATA(12,208,103,125,163,101,210,176,150,125,230,83,254,213,174,35,144,96,63,76,16,111,227,134,36,143,0,36,12,244,16,112)
IMAGE_DATA(153,235,20,59,107,217,39,78,241,115,240,66,252,0,119,172,243,14,50,10,219,88,195,90,246,137,33,146,92,124,145,48)
IMAGE_DATA(216,195,226,219,134,53,172,101,159,209,196,26,123,79,36,12,112,65,188,245,16,147,62,108,99,13,107,71,203,207,192,201)
IMAGE_DATA(159,14,68,194,199,214,72,232,75,244,249,248,201,60,84,39,108,164,97,45,251,244,39,214,245,233,139,132,63,244,65,194)
IMAGE_DATA(31,255,7,209,244,217,155,81,124,148,107,182,177,134,181,236,243,95,236,247,238,111,145,248,203,119,177,226,173,119,90,117)
IMAGE_DATA(237,97,27,107,88,203,62,191,35,214,191,250,58,86,247,120,77,236,155,22,254,194,56,108,99,13,107,217,231,195,30,61)
IMAGE_DATA(196,70,63,145,152,75,124,174,49,108,230,149,253,236,108,89,55,87,106,86,74,31,94,51,124,35,167,242,67,164,59,141)
IMAGE_DATA(45,221,32,235,223,208,32,189,183,1,46,115,29,219,82,229,77,175,94,163,191,239,214,13,14,84,55,88,98,47,81,174)
IMAGE_DATA(217,198,26,197,231,137,55,71,244,152,209,179,74,70,143,195,21,39,55,179,92,243,29,9,214,42,62,186,144,48,52,30)
IMAGE_DATA(57,137,187,87,174,227,238,229,18,227,144,173,185,232,28,116,193,227,133,111,113,96,16,106,210,182,160,150,247,23,153,121)
IMAGE_DATA(6,50,182,62,46,111,148,80,185,150,247,34,153,249,184,234,57,28,151,93,61,81,157,150,139,42,218,79,48,250,132,116)
IMAGE_DATA(210,109,165,253,4,237,67,146,51,81,69,123,16,70,148,89,179,97,11,189,69,194,112,197,213,131,252,114,200,70,62,137)
IMAGE_DATA(233,208,103,197,155,164,106,253,102,84,165,102,163,36,48,20,199,156,93,196,117,229,26,237,19,79,240,246,71,105,216,76)
IMAGE_DATA(84,197,111,160,61,71,48,242,236,29,80,157,164,133,126,85,10,237,61,214,154,244,225,39,171,238,147,97,40,237,231,129)
IMAGE_DATA(125,14,110,72,181,27,136,154,101,137,208,47,89,65,208,158,131,30,42,198,124,42,251,83,127,236,124,80,79,228,219,59)
IMAGE_DATA(99,185,141,13,106,73,171,159,19,7,253,151,11,90,223,130,106,31,190,254,191,192,40,52,219,121,226,174,189,15,178,6)
IMAGE_DATA(59,96,78,255,126,168,141,157,1,125,116,44,237,61,98,90,253,148,167,190,114,93,22,24,129,59,118,195,112,143,252,214)
IMAGE_DATA(217,218,97,214,167,253,232,179,126,56,42,105,62,175,186,5,32,203,206,25,219,98,103,226,98,63,23,209,182,237,35,199)
IMAGE_DATA(97,179,255,88,84,209,131,234,142,189,183,193,207,206,14,11,92,156,80,70,251,13,189,219,72,156,255,196,7,69,125,125)
IMAGE_DATA(112,246,79,158,52,6,62,168,182,246,65,3,237,63,234,137,59,212,175,102,226,158,253,112,204,179,182,22,107,102,229,64)
IMAGE_DATA(107,220,246,112,163,61,133,51,170,195,157,81,63,193,25,13,145,206,184,19,229,140,7,147,157,208,162,48,201,5,217,238)
IMAGE_DATA(118,109,214,232,108,123,59,36,59,218,33,201,209,22,73,180,239,88,67,231,181,206,54,88,231,100,96,61,149,231,125,106)
IMAGE_DATA(221,234,243,147,220,115,40,191,115,180,255,230,72,193,210,239,28,166,252,44,253,206,97,106,159,194,255,185,109,238,119,14)
IMAGE_DATA(115,126,230,246,28,198,254,171,93,161,35,123,14,229,119,142,159,234,158,227,255,1,109,103,87,251,0,0,0,0,0,0)
IMAGE_END_DATA(3872, 16)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,99,224,99,224,99,24,4,224,63,1,140,83,223,131,7,15,176,98,90,234,35,195,189,112,125,13,13,13,88,49)
IMAGE_DATA(181,245,193,48,137,250,224,250,233,173,143,0,30,24,128,158,57,122,122,122,254,147,130,97,122,72,181,23,89,63,3,9)
IMAGE_DATA(129,131,174,143,216,68,78,77,125,196,184,23,151,62,66,137,135,90,250,96,152,68,125,48,64,119,125,36,134,39,209,0)
IMAGE_DATA(57,141,146,154,174,81,50,135,137,190,113,203,182,205,59,255,110,219,180,231,63,50,222,180,105,19,24,163,139,131,212,194)
IMAGE_DATA(244,200,212,255,255,79,10,134,217,3,98,19,10,28,20,125,80,187,97,250,240,69,6,173,244,17,227,94,92,250,240,101)
IMAGE_DATA(74,106,234,131,97,82,244,193,240,64,232,35,20,158,155,215,238,248,75,78,58,211,83,210,106,196,149,174,113,225,205,235)
IMAGE_DATA(183,255,22,19,18,137,4,0,152,7,189,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(224, 3)
IMAGE_DATA(120,156,213,152,123,80,212,215,21,199,119,106,226,56,10,142,85,212,113,218,166,214,105,198,54,153,218,90,253,35,54,70)
IMAGE_DATA(11,186,12,139,242,82,32,162,163,88,9,85,108,212,22,172,149,24,43,104,170,70,165,109,76,202,34,224,34,15,151,215)
IMAGE_DATA(64,40,84,235,163,213,17,44,99,232,12,134,41,84,151,130,101,16,124,212,9,65,157,116,90,59,153,111,207,249,177,23)
IMAGE_DATA(126,252,248,61,215,141,226,221,249,206,253,237,189,231,179,231,222,187,231,222,187,103,109,19,109,19,109,242,146,157,150,234)
IMAGE_DATA(254,232,27,51,113,201,102,211,213,95,166,78,5,219,10,166,41,32,8,119,220,53,232,171,255,43,250,46,54,169,139,250)
IMAGE_DATA(238,213,156,69,211,248,41,18,123,101,230,76,116,164,237,67,231,238,95,163,243,173,195,3,218,121,104,232,57,221,43,126)
IMAGE_DATA(126,59,139,234,44,52,140,31,143,122,242,223,145,118,0,158,148,183,37,93,75,220,78,118,135,112,61,57,29,215,55,237)
IMAGE_DATA(130,103,243,110,73,210,51,245,183,255,108,31,174,140,11,66,131,224,168,239,218,250,95,160,123,79,182,170,218,183,102,160)
IMAGE_DATA(125,91,38,218,83,247,163,105,204,20,84,17,215,73,159,225,217,152,142,142,157,7,52,57,214,199,211,95,65,103,98,26)
IMAGE_DATA(206,62,63,9,191,33,238,70,202,91,240,172,79,197,181,181,91,160,85,178,94,178,225,42,217,182,144,10,72,59,72,93)
IMAGE_DATA(107,146,225,89,185,14,158,21,107,117,185,27,100,219,75,250,45,105,53,169,219,177,2,158,144,112,116,83,31,43,75,67)
IMAGE_DATA(159,146,237,67,82,38,41,152,116,115,238,43,104,127,121,46,254,246,226,28,52,82,191,150,30,144,237,103,164,109,164,133)
IMAGE_DATA(236,123,250,11,232,152,50,3,87,108,67,54,28,31,157,178,247,252,44,231,150,5,77,65,43,213,237,164,11,164,211,164)
IMAGE_DATA(115,182,129,53,224,249,220,243,206,137,153,79,189,92,40,137,99,102,29,213,119,72,61,147,201,246,43,100,247,117,178,159)
IMAGE_DATA(69,182,223,180,225,63,179,109,248,175,208,139,54,28,244,50,34,70,23,81,236,108,166,182,141,164,77,164,20,210,155,164)
IMAGE_DATA(173,222,113,165,146,236,50,198,166,220,28,75,230,207,115,31,153,62,13,251,201,72,79,239,78,156,8,182,21,76,214,184)
IMAGE_DATA(64,20,109,223,5,247,129,44,184,127,165,33,234,43,217,149,137,172,177,129,18,123,120,218,52,28,139,94,131,220,215,147)
IMAGE_DATA(144,27,247,163,1,173,92,63,244,28,235,21,63,199,111,160,122,3,14,142,29,139,3,228,255,88,244,58,56,29,241,146)
IMAGE_DATA(178,67,98,200,110,61,156,161,177,112,134,81,91,248,235,3,10,27,232,207,137,90,131,195,207,7,74,139,37,113,212,151)
IMAGE_DATA(189,100,37,92,171,54,169,42,103,121,2,114,34,86,19,183,22,89,95,10,196,78,226,114,233,51,156,97,177,56,70,1)
IMAGE_DATA(171,197,177,222,155,52,27,185,33,209,200,28,51,1,73,196,229,57,226,224,92,18,133,236,224,229,168,173,173,85,213,134)
IMAGE_DATA(175,13,4,247,81,239,151,180,130,148,191,56,20,206,31,4,195,185,32,88,151,203,35,219,19,164,55,72,139,72,174,121)
IMAGE_DATA(11,224,156,51,15,46,234,99,109,208,80,41,217,150,123,55,212,119,152,155,53,27,57,47,204,194,251,51,102,226,16,245)
IMAGE_DATA(107,137,153,74,82,4,233,219,236,123,82,16,142,5,126,25,135,109,67,54,28,31,185,178,247,185,182,225,220,252,192,64)
IMAGE_DATA(124,64,117,14,233,29,210,30,210,94,239,6,231,249,148,120,231,196,76,169,151,251,30,137,99,134,55,114,17,31,34,1)
IMAGE_DATA(100,75,27,228,196,84,178,159,78,182,51,108,168,162,205,82,45,68,239,19,189,140,136,209,151,41,118,194,169,45,204,43)
IMAGE_DATA(7,111,84,210,114,239,184,162,100,126,84,55,199,142,55,146,50,60,73,27,209,22,17,163,171,107,107,18,193,182,130,105)
IMAGE_DATA(223,188,5,125,151,63,194,131,182,127,224,65,171,71,93,212,215,223,116,21,237,41,111,74,236,245,228,77,184,85,92,133)
IMAGE_DATA(219,21,127,192,173,178,218,1,185,127,63,244,92,234,21,61,223,46,175,163,186,14,127,143,91,141,214,232,56,244,22,215)
IMAGE_DATA(160,231,120,185,164,110,103,137,116,106,223,204,43,197,205,252,50,244,184,42,36,73,207,108,83,88,69,183,200,22,180,69)
IMAGE_DATA(199,18,247,33,245,17,147,83,162,123,3,244,156,168,68,79,81,53,60,201,63,65,99,100,148,244,254,102,222,73,93,134)
IMAGE_DATA(213,177,229,151,232,201,46,68,243,143,83,80,235,8,71,111,46,49,191,43,64,215,209,227,186,55,64,251,107,241,232,88)
IMAGE_DATA(24,139,63,135,199,160,200,30,138,91,239,229,160,59,235,125,210,81,93,174,215,158,128,187,164,58,71,36,142,134,132,224)
IMAGE_DATA(54,29,64,221,251,14,26,222,28,253,246,56,60,112,36,160,34,44,28,251,22,45,196,237,244,221,232,222,145,174,59,183)
IMAGE_DATA(27,201,219,112,223,30,143,135,196,185,150,218,145,177,120,161,225,122,72,107,73,135,215,125,199,170,1,206,110,199,187,81)
IMAGE_DATA(17,184,17,179,22,221,49,137,248,248,181,4,52,45,72,64,243,171,113,180,6,9,232,13,78,192,39,33,241,184,75,186)
IMAGE_DATA(79,243,234,39,61,116,172,198,254,224,96,41,102,62,8,13,198,189,216,24,220,217,28,137,222,173,145,184,251,211,72,124)
IMAGE_DATA(146,26,137,251,105,145,248,236,231,17,248,183,208,246,40,84,175,180,15,139,209,189,14,59,242,151,217,145,187,108,41,114)
IMAGE_DATA(35,150,34,143,234,227,145,33,112,69,12,232,4,61,239,95,28,60,200,140,216,28,101,101,101,143,170,171,171,65,181,174)
IMAGE_DATA(42,43,43,185,126,36,152,138,138,10,52,55,55,163,173,173,13,173,173,173,170,226,190,150,150,22,176,173,240,83,95,95)
IMAGE_DATA(143,203,151,47,15,170,161,161,97,216,123,165,202,203,203,37,255,204,93,186,116,73,210,133,11,23,208,223,215,55,76,220)
IMAGE_DATA(126,241,226,69,169,102,91,175,207,65,142,25,57,215,114,245,170,84,115,191,92,236,239,228,201,147,210,51,127,30,143,143)
IMAGE_DATA(165,228,26,27,27,37,241,156,216,142,125,21,21,21,13,243,165,230,143,199,197,98,63,172,226,226,98,20,22,22,74,182)
IMAGE_DATA(231,207,159,31,49,47,165,4,207,190,92,46,23,206,157,59,135,51,103,206,12,182,179,148,182,44,254,254,88,236,43,47)
IMAGE_DATA(47,15,167,78,157,26,188,145,120,14,44,57,39,218,4,87,80,80,32,113,53,53,53,16,241,162,197,241,188,228,28,251)
IMAGE_DATA(20,243,117,187,221,131,146,143,79,62,70,22,251,226,152,225,57,114,95,85,85,149,244,217,236,95,235,102,229,53,145,199)
IMAGE_DATA(104,126,126,190,228,159,63,131,107,53,9,63,170,155,99,111,114,210,63,205,230,28,108,43,24,171,57,7,51,254,204,57)
IMAGE_DATA(148,197,76,206,193,146,159,194,92,164,124,195,32,231,96,41,57,51,57,135,60,239,16,156,56,201,181,114,14,163,34,221)
IMAGE_DATA(30,42,57,135,252,150,224,181,151,251,50,155,115,200,57,43,57,135,146,51,155,115,136,177,105,229,28,28,51,86,115,14)
IMAGE_DATA(121,140,154,205,57,4,51,98,115,172,90,18,242,200,108,206,193,182,130,177,154,115,48,227,207,156,67,121,106,152,201,57)
IMAGE_DATA(88,242,223,239,92,75,249,134,65,206,193,82,114,102,114,14,121,222,33,56,145,3,104,229,28,90,167,162,252,115,212,114)
IMAGE_DATA(14,121,126,193,107,47,247,101,54,231,144,115,86,114,14,37,103,54,231,16,99,211,202,57,56,102,172,230,28,242,24,53)
IMAGE_DATA(155,115,8,102,196,230,120,245,251,115,77,231,28,108,43,24,171,57,7,51,254,204,57,148,197,108,206,161,117,3,24,229)
IMAGE_DATA(28,90,156,94,206,33,207,59,148,55,135,86,206,97,230,230,80,203,57,140,110,14,51,57,135,156,179,146,115,40,57,179)
IMAGE_DATA(57,135,24,155,86,206,193,49,99,53,231,144,199,168,217,156,67,48,35,54,199,51,88,224,149,217,118,101,63,12,218,140)
IMAGE_DATA(88,179,140,22,107,182,248,195,151,213,185,233,181,105,113,102,219,71,127,81,110,142,35,71,142,192,138,4,99,213,175,156)
IMAGE_DATA(127,76,206,212,151,162,195,233,182,105,140,211,48,232,116,230,167,27,168,126,230,124,25,167,175,235,226,235,247,96,170,60)
IMAGE_DATA(14,39,231,173,196,245,176,205,17,48,33,224,135,37,133,165,253,167,107,255,4,185,196,239,91,101,59,219,10,230,171,123)
IMAGE_DATA(0,43,18,126,172,114,194,183,120,47,138,210,78,217,174,197,201,109,212,218,148,156,210,78,141,209,226,212,88,163,249,61)
IMAGE_DATA(14,231,203,56,213,236,212,218,252,245,61,152,85,225,113,119,191,47,113,54,97,220,248,197,90,113,173,165,252,28,215,191)
IMAGE_DATA(158,27,243,220,183,108,1,244,242,99,177,116,125,243,95,164,194,86,246,172,107,47,100,194,135,21,123,173,19,214,112,30)
IMAGE_DATA(38,198,253,68,237,159,106,25,133,63,67,124,186,110,141,2,83,143,211,11,184,103,152,51,181,65,244,174,119,189,64,30)
IMAGE_DATA(77,156,94,121,236,159,33,147,109,83,173,250,28,141,197,215,211,200,242,233,42,56,121,192,42,2,119,88,81,246,107,48)
IMAGE_DATA(134,7,133,5,78,119,126,38,79,111,159,215,197,132,205,179,81,70,201,191,59,190,254,12,64,87,87,151,170,190,72,206)
IMAGE_DATA(135,241,14,114,25,25,25,170,242,55,39,100,145,27,228,159,52,103,160,167,83,70,201,207,42,211,139,163,228,204,6,185)
IMAGE_DATA(63,57,51,227,213,226,140,130,199,95,156,144,69,78,148,39,206,89,92,79,211,197,111,255,238,204,255,238,188,119,78,215)
IMAGE_DATA(157,253,220,236,191,59,108,43,24,203,255,210,120,253,240,179,209,226,104,253,27,97,244,101,124,81,156,153,241,106,113,122)
IMAGE_DATA(155,210,159,156,144,21,78,232,105,112,70,235,89,87,117,230,115,95,226,108,206,172,151,50,181,226,90,75,117,31,254,241)
IMAGE_DATA(127,211,38,7,37,252,31,153,251,33,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(2208, 16)

View file

@ -7,20 +7,19 @@ Image IdeFileImage(const String& t, bool a)
App::App()
{
l_tabs.SetLayout(FloatFrame::LAYOUT_LEFT);
t_tabs.SetLayout(FloatFrame::LAYOUT_TOP);
r_tabs.SetLayout(FloatFrame::LAYOUT_RIGHT);
b_tabs.SetLayout(FloatFrame::LAYOUT_BOTTOM);
CtrlLayout(*this, "Window title");
t_tabs.SetTop();
/* l_tabs.SetLeft();
r_tabs.SetRight();
b_tabs.SetBottom();
*/ CtrlLayout(*this, "Window title");
Sizeable().Zoomable();
golastvis <<= THISBACK(GoLastVis);
// AddFrame(t_tabs);
/* AddFrame(r_tabs);
AddFrame(l_tabs);
AddFrame(r_tabs);
AddFrame(t_tabs);
AddFrame(b_tabs);
AddFrame(ViewFrame());
*/ AddFrame(ViewFrame());
/*
l_tabs.Crosses(true);
l_tabs.Add("/ala/Test.cpp");
l_tabs.Add("/ala/Test.h");
@ -53,18 +52,41 @@ App::App()
b_tabs.Add("/test/Test.cpp");
b_tabs.Add("/test/Test.h");
b_tabs.Grouping(true);
*/
AddFrame(t_tabs);
t_tabs.Stacking(true);
t_tabs.Crosses(true);
t_tabs.Add("/ala/Test.cpp");
t_tabs.Add("/ala/Test.h");
t_tabs.Add("/ala/SuperProgram.cpp", true);
t_tabs.Add("/kasia/SuperProgram.h");
t_tabs.Add("/ala/Test.h");
t_tabs.Add("/ala/SuperProgram.h");
t_tabs.Add("/MyApp/MyApp.cpp");
t_tabs.Add("/MyApp/MyApp.h");
t_tabs.Add("/MyApp/MyApp.lay");
t_tabs.Add("/MyApp/MyApp.iml");
t_tabs.Add("/MyApp/main.cpp");
t_tabs.Add("/kasia/Synchronize.cpp");
t_tabs.Add("/kasia/Synchronize.h");
t_tabs.Add("/test/Test.cpp");
t_tabs.Add("/test/Test.h");
t_tabs.Add("/CtrlLib/LabelBase.h");
t_tabs.Add("/CtrlLib/LabelBase.cpp");
t_tabs.Add("/CtrlLib/ScrollBar.h");
t_tabs.Add("/CtrlLib/ScrollBar.cpp");
t_tabs.Grouping(true);
t_tabs <<= THISBACK(OnFileCursor);
stacking <<= t_tabs.IsStacking();
stacking <<= THISBACK(OnStacking);
}
void App::OnFileCursor()
{
file <<= ~t_tabs;
}
void App::OnStacking()
{
t_tabs.Stacking(stacking);
}
void App::GoLastVis()

View file

@ -3,7 +3,7 @@
#define QUICKTABS_TEST
#include <CtrlLib/CtrlLib.h>
#include <QuickTabs/QuickTabs.h>
#include "QuickTabs.h"
using namespace Upp;
@ -16,13 +16,15 @@ class App : public WithQuickTabsLayout<TopWindow>
{
private:
QuickTabs l_tabs;
QuickTabs t_tabs;
FileTabs t_tabs;
QuickTabs r_tabs;
QuickTabs b_tabs;
public:
typedef App CLASSNAME;
App();
void Drag();
void OnFileCursor();
void OnStacking();
void GoLastVis();
};

View file

@ -1,5 +1,5 @@
LAYOUT(QuickTabsLayout, 516, 388)
ITEM(DocEdit, dv___0, HSizePosZ(20, 28).TopPosZ(84, 292))
ITEM(Button, golastvis, LeftPosZ(20, 56).TopPosZ(44, 24))
LAYOUT(QuickTabsLayout, 516, 419)
ITEM(EditString, file, HSizePosZ(3, 3).TopPosZ(4, 19))
ITEM(Option, stacking, SetLabel(t_("Stacking")).LeftPosZ(3, 96).TopPosZ(25, 16))
END_LAYOUT

View file

@ -5,9 +5,12 @@ flags
uses
CtrlLib,
QuickTabs;
TabBar;
file
QuickTabs.h,
QuickTabs.cpp,
FileTabs.cpp,
QuickTabsTest.h,
QuickTabsTest.cpp,
QuickTabsTest.lay;

View file

@ -1,5 +1,5 @@
#ifndef _QuickTabsTest_icpp_init_stub
#define _QuickTabsTest_icpp_init_stub
#include "CtrlLib/init"
#include "QuickTabs/init"
#include "TabBar/init"
#endif

View file

@ -281,6 +281,8 @@ TabBar::TabBar()
isdrag = false;
inactivedisabled = false;
autoscrollhide = true;
stacking = true;
groupsort = true;
neverempty = 1;
style[0] = style[1] = style[2] = style[3] = NULL;
@ -358,12 +360,81 @@ int TabBar::FindGroup(const String& g) const
return -1;
}
void TabBar::DoStacking()
{
Value v = GetData();
for (int i = 0; i < tabs.GetCount(); i++) {
Tab &base = tabs[i];
for (int j = i+1; j < tabs.GetCount(); j++) {
Tab &t = tabs[j];
if ((!grouping || base.group == t.group) && stackfunc(base.data, t.data)) {
base.stack.AddTail(t.data);
tabs.Remove(j);
j--;
}
}
}
highlight = -1;
MakeGroups();
Repos();
int c = active;
SetData(v);
if (active < 0 || c != active)
Refresh();
}
void TabBar::DoUnstacking()
{
for (int i = 0; i < tabs.GetCount(); i++) {
for (int j = tabs[i].stack.GetCount()-1; j >= 0; j--) {
Tab &t = tabs.Insert(i+1);
t.id = GetNextId();
t.data = tabs[i].stack[j];
t.group = tabs[i].group;
}
tabs[i].stack.Clear();
}
highlight = -1;
MakeGroups();
Repos();
if (HasCursor())
SetCursor(-1);
else
Refresh();
}
void TabBar::StackRemove(BiVector<Value> &stack, int ix)
{
int cnt = stack.GetCount() >> 1;
if (ix <= cnt) {
int i = ix-1;
while (i >= 0) {
Swap(stack[i], stack[ix]);
ix = i;
i--;
}
stack.DropHead();
}
else {
int i = ix+1;
while (i < stack.GetCount()) {
Swap(stack[i], stack[ix]);
ix = i;
i++;
}
stack.DropTail();
}
}
void TabBar::MakeGroups()
{
groups[0].count = tabs.GetCount();
groups[0].first = 0;
groups[0].last = tabs.GetCount() - 1;
if (groupsort)
Sort(tabs, TabGroupSort());
for(int i = 1; i < groups.GetCount(); i++)
{
groups[i].count = 0;
@ -376,7 +447,7 @@ void TabBar::MakeGroups()
Tab &tab = tabs[i];
int n = FindGroup(tab.group);
ASSERT(n >= 0);
if (n != 0) {
if (n > 0) {
if(groups[n].active < 0)
groups[n].active = tab.id;
groups[n].count++;
@ -431,7 +502,6 @@ void TabBar::DoCloseGroup(int n)
MakeGroups();
Repos();
SetCursor(-1);
WhenCursor();
}
void TabBar::NewGroup(const String &name, const Value &data)
@ -492,11 +562,12 @@ WString TabBar::ParseLabel(const WString& s)
return s;
}
void TabBar::PaintTabData(Draw& w, const Rect& r, const Value& q, const Font &font, Color ink, dword style, int bl)
void TabBar::PaintTabData(Draw& w, const Rect& r, const Tab& tab, const Font &font, Color ink, dword style, int bl)
{
WString txt;
Font f = font;
Color i = ink;
const Value &q = tab.data;
if(IsType<AttrText>(q)) {
const AttrText& t = ValueTo<AttrText>(q);
@ -507,13 +578,17 @@ void TabBar::PaintTabData(Draw& w, const Rect& r, const Value& q, const Font &fo
}
else
txt = IsString(q) ? q : StdConvert().Format(q);
Point p = GetTextPosition(r, GetTextSize(txt, font).cy, bl);
w.DrawText(p.x, p.y, GetTextAngle(), ParseLabel(txt), f, i);
}
Point TabBar::GetTextPosition(const Rect& r, int fy, int bl) const
{
Point p;
int align = GetAlign();
Point p;
int fy = GetTextSize(txt, f).cy / 2;
fy /= 2;
if(align == LEFT)
{
p = r.BottomLeft();
@ -529,8 +604,7 @@ void TabBar::PaintTabData(Draw& w, const Rect& r, const Value& q, const Font &fo
p = r.TopLeft();
p.y = bl - fy;
}
w.DrawText(p.x, p.y, GetTextAngle(), ParseLabel(txt), f, i);
return p;
}
void TabBar::PaintTab(Draw &w, const Style &s, const Size &sz, int n, bool enable, bool dragsample)
@ -583,7 +657,7 @@ void TabBar::PaintTab(Draw &w, const Style &s, const Size &sz, int n, bool enabl
int cly = (fsz.cy - s.sel.top - s.sel.bottom * ac) / 2 + s.sel.top;
if(crosses && cnt > neverempty) {
if(crosses && (cnt > neverempty || t.stack.GetCount())) {
const Image &cimg = TabBarImg::CR0();
isz = cimg.GetSize();
@ -653,7 +727,7 @@ void TabBar::PaintTab(Draw &w, const Style &s, const Size &sz, int n, bool enabl
if (display)
display->Paint(w, r, t.data, s.text_color[ndx], SColorDisabled(), ndx);
else
PaintTabData(w, r, t.data, s.font, s.text_color[ndx], ndx, cly);
PaintTabData(w, r, t, s.font, s.text_color[ndx], ndx, cly);
#ifdef TABBAR_DEBUG
Point pp(p.x, cly);
@ -697,7 +771,7 @@ void TabBar::Paint(Draw &w)
}
// Find last visible tab
for(int i = first + 1; i < tabs.GetCount(); i++) {
if (tabs[i].pos.x > limt) {
if (tabs[i].visible && tabs[i].pos.x > limt) {
last = i;
break;
}
@ -707,6 +781,11 @@ void TabBar::Paint(Draw &w)
if(tabs[i].visible && i != active)
PaintTab(w, st, sz, i, IsEnabled());
}
// Clear real_size for non-visible tabs to prevent mouse handling bugs
for (int i = 0; i < first; i++)
tabs[i].real_size = Size(0, 0);
for (int i = last+1; i < tabs.GetCount(); i++)
tabs[i].real_size = Size(0, 0);
// Draw inactive groups
if (inactivedisabled)
for (int i = first; i <= last; i++) {
@ -795,11 +874,11 @@ void TabBar::Scroll()
int TabBar::GetWidth(int n)
{
Tab &t = tabs[n];
Size tsz = GetStdSize(t.data);
Size tsz = GetStdSize(t);
return TB_MARGIN * 2 + tsz.cx + (TB_SPACE + TabBarImg::CR0().GetSize().cx) * crosses;
}
Size TabBar::GetStdSize(Value &q)
Size TabBar::GetStdSize(const Value &q)
{
if (display)
return display->GetStdSize(q);
@ -809,6 +888,11 @@ Size TabBar::GetStdSize(Value &q)
return GetTextSize("A Tab", StdFont());
}
Size TabBar::GetStdSize(const Tab &t)
{
return GetStdSize(t.data);
}
TabBar& TabBar::Add(const Value &data, String group, bool make_active)
{
return Insert(tabs.GetCount(), data, group, make_active);
@ -816,12 +900,7 @@ TabBar& TabBar::Add(const Value &data, String group, bool make_active)
TabBar& TabBar::Insert(int ix, const Value &data, String group, bool make_active)
{
Tab &t = tabs.Insert(ix);
int cnt = tabs.GetCount() - 1;
t.data = data;
t.id = GetNextId();
ASSERT(ix >= 0);
int g = 0;
if (!group.IsEmpty()) {
g = FindGroup(group);
@ -829,15 +908,37 @@ TabBar& TabBar::Insert(int ix, const Value &data, String group, bool make_active
NewGroup(group);
g = groups.GetCount() - 1;
}
}
t.group = groups[g].name;
MakeGroups();
}
group = groups[g].name;
bool stacked = false;
if (stacking) {
for (int i = 0; i < tabs.GetCount(); i++) {
Tab &t = tabs[i];
if (t.group == group && stackfunc(t.data, data)) {
if (make_active) {
t.stack.AddHead(t.data);
t.data = data;
}
else
t.stack.AddTail(data);
stacked = true;
}
}
}
if (!stacked) {
Tab &t = tabs.Insert(ix);
t.data = data;
t.id = GetNextId();
t.group = group;
MakeGroups();
}
Repos();
active = -1;
SetCursor(minmax(ix, 0, cnt));
if (make_active)
SetCursor(minmax(ix, 0, tabs.GetCount() - 1));
return *this;
}
int TabBar::GetWidth() const
{
if (!tabs.GetCount()) return 0;
@ -879,6 +980,11 @@ int TabBar::TabPos(const String &g, bool &first, int i, int j, bool inactive)
if(v)
{
tabs[i].pos.x = first ? 0 : tabs[j].Right();
/* Separators
if (showseps && !first && tabs[i].group != tabs[j].group) {
seperators.Add(tabs[i].pos.x);
tabs[i].pos.x += TB_SEPARATOR;
} */
j = i;
first = false;
}
@ -966,6 +1072,21 @@ TabBar& TabBar::Grouping(bool b)
return *this;
}
TabBar& TabBar::GroupSort(bool b)
{
groupsort = b;
if (b)
MakeGroups();
return *this;
}
/* Separators
TabBar& TabBar::Seperators(bool b)
{
showseps = b;
Repos();
return *this;
}
*/
TabBar& TabBar::AutoScrollHide(bool b)
{
autoscrollhide = b;
@ -1027,6 +1148,48 @@ int TabBar::Find(const Value &v) const
return -1;
}
int TabBar::FindInStack(const Value &v, int &stackix) const
{
stackix = -1;
for (int i = 0; i < tabs.GetCount(); i++) {
if (tabs[i].data == v)
return i;
for (int j = 0; j < tabs[i].stack.GetCount(); j++)
if (tabs[i].stack[j] == v) {
stackix = j;
return i;
}
}
return -1;
}
void TabBar::CycleTabStack(int n)
{
if (tabs[n].stack.GetCount()) {
Tab &t = tabs[n];
Value v = t.data;
t.data = t.stack.Head();
t.stack.DropHead();
t.stack.AddTail(v);
}
}
void TabBar::SetData(const Value &data)
{
int stackix = -1;
int n = FindInStack(data, stackix);
if (n >= 0) {
if (stackix >= 0) {
Tab &t = tabs[n];
Value v = t.stack[stackix];
StackRemove(t.stack, stackix);
t.stack.AddTail(t.data);
t.data = v;
}
SetCursor(n);
}
}
void TabBar::Set(int n, const Value &data, const String &group)
{
ASSERT(n >= 0 && n < tabs.GetCount());
@ -1059,8 +1222,13 @@ void TabBar::LeftDown(Point p, dword keyflags)
WhenClose(v);
}
else if(highlight >= 0) {
SetCursor(highlight);
WhenCursor();
if (highlight == active) {
CycleTabStack(active);
Repos();
UpdateActionRefresh();
}
else
SetCursor(highlight);
}
}
@ -1188,7 +1356,8 @@ void TabBar::DragAndDrop(Point p, PasteClip& d)
{
int id = tabs[active].id;
Tab t = tabs[tab];
tabs.Insert(c, t);
Tab &n = tabs.Insert(c);
n = t;
tabs.Remove(tab + int(c < tab));
active = FindId(id);
isdrag = false;
@ -1251,7 +1420,7 @@ void TabBar::DragRepeat(Point p)
}
}
void TabBar::SetCursor(int n, bool scroll)
void TabBar::SetCursor(int n)
{
if(tabs.GetCount() == 0)
return;
@ -1278,19 +1447,16 @@ void TabBar::SetCursor(int n, bool scroll)
SetGroupActive(tabs[n].id);
if(scroll)
int cx = tabs[n].pos.x - sc.GetPos();
if(cx < 0)
sc.AddPos(cx - 10);
else
{
int cx = tabs[n].pos.x - sc.GetPos();
if(cx < 0)
sc.AddPos(cx - 10);
else
{
Size sz = Ctrl::GetSize();
Fix(sz);
cx = tabs[n].pos.x + tabs[n].size.cx - sz.cx - sc.GetPos();
if(cx > 0)
sc.AddPos(cx + 10);
}
Size sz = Ctrl::GetSize();
Fix(sz);
cx = tabs[n].pos.x + tabs[n].size.cx - sz.cx - sc.GetPos();
if(cx > 0)
sc.AddPos(cx + 10);
}
Refresh();
@ -1317,8 +1483,36 @@ void TabBar::SetTabGroup(int n, const String &group)
Repos();
}
TabBar & TabBar::StackingFunc(Gate2<Value, Value> func)
{
if (stacking)
DoUnstacking();
stackfunc = func;
DoStacking();
stacking = true;
return *this;
}
TabBar & TabBar::NoStacking()
{
if (stacking) {
stacking = false;
DoUnstacking();
}
return *this;
}
void TabBar::Close(int n)
{
if (stacking && tabs[n].stack.GetCount()) {
CycleTabStack(n);
tabs[n].stack.DropTail();
Repos();
SetCursor(-1);
return;
}
if(tabs.GetCount() <= neverempty)
return;
@ -1330,12 +1524,29 @@ void TabBar::Close(int n)
nc = max(0, GetPrev(c));
SetGroupActive(tabs[nc].id);
}
sc.AddTotal(-tabs[n].size.cx);
tabs.Remove(n);
MakeGroups();
Repos();
SetCursor(-1, false);
SetCursor(-1);
}
void TabBar::CloseData(const Value &data)
{
int stackix = -1;
int tabix = FindInStack(data, stackix);
if (tabix < 0) return;
Tab &t = tabs[tabix];
if (!stacking || t.stack.GetCount() == 0) return Close(tabix);
if (stackix)
StackRemove(t.stack, stackix);
else {
CycleTabStack(tabix);
t.stack.DropTail();
}
Repos();
}
const TabBar::Style& TabBar::AlignStyle(int align, Style &s)
@ -1374,6 +1585,7 @@ const TabBar::Style& TabBar::StyleBottom()
void TabBar::Serialize(Stream& s)
{
// Note: doens't work with stacking
int version = 0x00;
int cnt;
if (s.IsLoading()) Clear();

View file

@ -117,9 +117,9 @@ protected:
Value data;
String group;
BiVector<Value> stack;
bool visible;
bool frozen;
Point pos;
Size size;
@ -168,6 +168,9 @@ private:
bool nosel:1;
bool nohl:1;
bool inactivedisabled:1;
bool stacking:1;
bool groupsort:1;
Gate2<Value, Value> stackfunc;
int neverempty;
Point mouse, oldp;
int group;
@ -190,6 +193,12 @@ private:
int GetWidth(int n);
int GetWidth() const;
int GetHeight(bool scrollbar = true) const;
void DoStacking();
void DoUnstacking();
void StackRemove(BiVector<Value> &stack, int ix);
int FindInStack(const Value &data, int &stackix) const;
void CycleTabStack(int n);
static int GetStyleHeight(const Style& s);
@ -230,11 +239,13 @@ protected:
virtual WString ParseLabel(const WString& s);
// Sub-class display overide & helpers
virtual void PaintTabData(Draw& w, const Rect &t, const Value& q, const Font &font,
virtual void PaintTabData(Draw& w, const Rect &t, const Tab& tab, const Font &font,
Color ink, dword style, int bl);
virtual Size GetStdSize(Value &q);
virtual Size GetStdSize(const Tab &t);
Size GetStdSize(const Value &v);
int GetTextAngle() { return AlignedFrame::IsVert() ? (GetAlign() == LEFT ? 900 : 2700) : 0; }
Point GetTextPosition(const Rect& r, int cy, int bl) const;
int GetTargetTab(Point p);
const Style &GetStyle() { return *style[GetAlign()]; }
@ -242,11 +253,14 @@ protected:
// Sub-class menu overrides
virtual void ContextMenu(Bar& bar);
virtual void GroupMenu(Bar &bar, int n);
struct TabGroupSort {
bool operator () (const Tab& a, const Tab& b) const { return a.group < b.group; }
};
public:
typedef TabBar CLASSNAME;
Callback WhenHighlight;
Callback WhenCursor;
Callback1<Value> WhenClose;
Callback WhenCloseAll;
Callback WhenLeftDouble;
@ -260,10 +274,12 @@ public:
TabBar& Insert(int ix, const Value &data, bool make_active = false) { return Insert(ix, data, Null, make_active); }
TabBar& Insert(int ix, const Value &data, String group = Null, bool make_active = false);
void Close(int n);
void CloseData(const Value &data);
void Clear();
TabBar& Crosses(bool b = true);
TabBar& Grouping(bool b = true);
TabBar& Grouping(bool b = true);
TabBar& GroupSort(bool b = true);
TabBar& AutoScrollHide(bool b = true);
TabBar& InactiveDisabled(bool b = true);
@ -274,17 +290,19 @@ public:
Value Get(int n) const { ASSERT(n >= 0 && n < tabs.GetCount()); return tabs[n].data;}
void Set(int n, const Value &data, const String &group = Null);
virtual Value GetData() const { return HasCursor() ? Get(active) : Value(); }
virtual void SetData(const Value &data) { int n = Find(data); if (n >= 0) SetCursor(n); }
virtual void SetData(const Value &data);
Value GetGroupData(const String &s) const { return GetGroupData(FindGroup(s)); }
void SetGroupData(const String &s, const Value &data) { SetGroupData(FindGroup(s), data); }
Value GetGroupData(int n) const { ASSERT(n >= 0 && n < groups.GetCount()); return groups[n].data; }
void SetGroupData(int n, const Value &data) { ASSERT(n >= 0 && n < groups.GetCount()); groups[n].data = data;}
String GetGroupName() const { return group == 0 ? Null : groups[group].name; }
int SetGroup(const String &s) { group = max(0, FindGroup(s)); return group; }
int SetGroup(int c) { group = c; return group; }
String GetGroupName() const { return (group == 0) ? Null : groups[group].name; }
String GetGroupName(int i) const { return groups[i].name; }
int SetGroup(const String &s) { DoGrouping(max(0, FindGroup(s))); return group; }
int SetGroup(int c) { DoGrouping(c); return group; }
int GetGroup() const { return group; }
int GetGroupCount() const { return groups.GetCount(); }
void SetGroupActive(int id) { groups[group].active = id; }
int GetGroupActive() const { return groups[group].active; }
int GetFirst() const { return groups[group].first; }
@ -293,12 +311,17 @@ public:
int GetCount() const { return tabs.GetCount(); }
int GetCursor() const { return active; }
int GetHighlight() const { return highlight; }
void SetCursor(int n, bool scroll = true);
void SetCursor(int n);
void KillCursor() { active = -1; Refresh(); }
void SetTabGroup(int n, const String &group);
bool HasCursor() const { return active >= 0; }
bool HasHighlight() const { return highlight >= 0; }
TabBar& StackingFunc(Gate2<Value, Value> func);
TabBar& NoStacking();
bool IsStacking() { return stacking; }
TabBar& NeverEmpty(int limit = 1) { neverempty = max(limit, 1); Refresh(); return *this; }
TabBar& CanEmpty() { neverempty = 0; Refresh(); return *this; }