#include "CCustomMySplitter.h"
#include <QCheckBox>
#include <QVBoxLayout>
#include <QToolButton>
#include <QVariant>
#include <QDebug>
#include <QMouseEvent>
CCustomSplitter::CCustomSplitter(Qt::Orientation o, SplitterHiddenDirection shd, QWidget *parent)
: QSplitter(o, parent)
, m_enHiddenDirection(shd)
{
setHandleWidth(8);
connect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(onSplitterMoved(int, int)));
}
void CCustomSplitter::setHiddenDirection(SplitterHiddenDirection shd)
{
m_enHiddenDirection = shd;
}
QSplitterHandle *CCustomSplitter::createHandle()
{
m_pSplitterHandle = new CCustomSplitterHandle(this->orientation(), m_enHiddenDirection, this);
connect(m_pSplitterHandle, SIGNAL(hideWidget(bool)), this, SLOT(onHideWidget(bool)));
return m_pSplitterHandle;
}
void CCustomSplitter::onHideWidget(bool isHide)
{
if (isHide)
{
m_oOldState = saveState();
}
else
{
if (!m_oOldState.isEmpty())
{
restoreState(m_oOldState);
return;
}
}
QList<int> newLengths(sizes());
switch (m_enHiddenDirection)
{
case SHD_Left:
case SHD_Top:
{
if (isHide)
{
newLengths[1] += newLengths[0];
newLengths[0] = 0;
}
else
{
newLengths[0] = 40;
newLengths[1] = newLengths[1] - 40;
}
break;
}
case SHD_Right:
case SHD_Bottom:
{
if (isHide)
{
newLengths[newLengths.count() - 2] += newLengths[newLengths.count() - 1];
newLengths[newLengths.count() - 1] = 0;
}
else
{
newLengths[newLengths.count() - 1] = 40;
newLengths[newLengths.count() - 2] = newLengths[newLengths.count() - 2] - 40;
}
break;
}
default:
break;
}
this->setSizes(newLengths);
}
void CCustomSplitter::onSplitterMoved(int pos, int index)
{
switch (m_enHiddenDirection)
{
case SHD_Left:
{
if (pos == 0)
{
m_pSplitterHandle->setButtonChecked(true);
}
else
{
m_pSplitterHandle->setButtonChecked(false);
}
break;
}
case SHD_Right:
{
if (pos == this->width() - m_pSplitterHandle->width())
{
m_pSplitterHandle->setButtonChecked(true);
}
else
{
m_pSplitterHandle->setButtonChecked(false);
}
break;
}
case SHD_Top:
{
if (pos == 0)
{
m_pSplitterHandle->setButtonChecked(true);
}
else
{
m_pSplitterHandle->setButtonChecked(false);
}
break;
}
case SHD_Bottom:
{
if (pos == this->height() - m_pSplitterHandle->height())
{
m_pSplitterHandle->setButtonChecked(true);
}
else
{
m_pSplitterHandle->setButtonChecked(false);
}
break;
}
default:
break;
}
}
CCustomSplitterHandle::CCustomSplitterHandle(Qt::Orientation orientation, SplitterHiddenDirection shd, QSplitter *parent)
: QSplitterHandle(orientation, parent)
, m_enHiddenDirection(shd)
{
this->setMouseTracking(false);
m_pButton = new QToolButton(this);
m_pButton->setCursor(Qt::ArrowCursor);
m_pButton->setCheckable(true);
connect(m_pButton, SIGNAL(clicked(bool)), this, SLOT(onButtonclicked(bool)));
m_pButton->setProperty("HiddenDirection", QVariant((int)(m_enHiddenDirection)));
this->setStyleSheet("\
QToolButton\
{\
border: none;\
}\
QToolButton[HiddenDirection=\"1\"]\
{\
background-image: url(:/res/splitterLeft.png);\
}\
QToolButton[HiddenDirection=\"1\"]::checked\
{\
background-image: url(:/res/splitterRight.png);\
}\
QToolButton[HiddenDirection=\"2\"]\
{\
background-image: url(:/res/splitterRight.png);\
}\
QToolButton[HiddenDirection=\"2\"]::checked\
{\
background-image: url(:/res/splitterLeft.png);\
}\
QToolButton[HiddenDirection=\"3\"]\
{\
background-image: url(:/res/splitterTop.png);\
}\
QToolButton[HiddenDirection=\"3\"]::checked\
{\
background-image: url(:/res/splitterBottom.png);\
}\
QToolButton[HiddenDirection=\"4\"]\
{\
background-image: url(:/res/splitterBottom.png);\
}\
QToolButton[HiddenDirection=\"4\"]:checked\
{\
background-image: url(:/res/splitterTop.png);\
}\
");
QLayout *pLayout;
if (orientation == Qt::Horizontal)
{
m_pButton->setFixedSize(8, 68);
pLayout = new QVBoxLayout;
}
else
{
m_pButton->setFixedSize(68, 8);
pLayout = new QHBoxLayout;
}
pLayout->setContentsMargins(0,0,0,0);
pLayout->addWidget(m_pButton);
setLayout(pLayout);
}
CCustomSplitterHandle::~CCustomSplitterHandle()
{
}
void CCustomSplitterHandle::setButtonChecked(bool checked)
{
m_pButton->setChecked(checked);
}
void CCustomSplitterHandle::onButtonclicked(bool checked)
{
emit hideWidget(checked);
}