mirror of
https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git
synced 2024-11-15 21:25:44 +08:00
Implemented experimental mouse event handling
This commit is contained in:
parent
63fed89f26
commit
bc1f12ba93
@ -46,6 +46,8 @@
|
|||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
|
static const int ResizeMargin = 4;
|
||||||
|
|
||||||
struct AutoHideDockContainerPrivate
|
struct AutoHideDockContainerPrivate
|
||||||
{
|
{
|
||||||
CAutoHideDockContainer* _this;
|
CAutoHideDockContainer* _this;
|
||||||
@ -122,7 +124,7 @@ struct AutoHideDockContainerPrivate
|
|||||||
{
|
{
|
||||||
const auto rect = DockArea->frameGeometry();
|
const auto rect = DockArea->frameGeometry();
|
||||||
const auto topLeft = rect.topLeft();
|
const auto topLeft = rect.topLeft();
|
||||||
const auto handleSize = _this->handleWidth();
|
const auto handleSize = 0;
|
||||||
|
|
||||||
if (SideTabBarArea == CDockWidgetSideTab::Bottom)
|
if (SideTabBarArea == CDockWidgetSideTab::Bottom)
|
||||||
{
|
{
|
||||||
@ -159,7 +161,7 @@ CDockContainerWidget* CAutoHideDockContainer::parentContainer() const
|
|||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CAutoHideDockContainer::CAutoHideDockContainer(CDockManager* DockManager, CDockWidgetSideTab::SideTabBarArea area, CDockContainerWidget* parent) :
|
CAutoHideDockContainer::CAutoHideDockContainer(CDockManager* DockManager, CDockWidgetSideTab::SideTabBarArea area, CDockContainerWidget* parent) :
|
||||||
QSplitter((area == CDockWidgetSideTab::Bottom || area == CDockWidgetSideTab::Top) ? Qt::Orientation::Vertical : Qt::Orientation::Horizontal, parent),
|
Super(parent),
|
||||||
d(new AutoHideDockContainerPrivate(this))
|
d(new AutoHideDockContainerPrivate(this))
|
||||||
{
|
{
|
||||||
d->DockManager = DockManager;
|
d->DockManager = DockManager;
|
||||||
@ -170,62 +172,19 @@ CAutoHideDockContainer::CAutoHideDockContainer(CDockManager* DockManager, CDockW
|
|||||||
d->DockArea->updateAutoHideButtonCheckState();
|
d->DockArea->updateAutoHideButtonCheckState();
|
||||||
d->DockArea->updateTitleBarButtonToolTip();
|
d->DockArea->updateTitleBarButtonToolTip();
|
||||||
|
|
||||||
setObjectName("autoHideSplitter");
|
setObjectName("autoHideDockContainer");
|
||||||
setChildrenCollapsible(false);
|
QBoxLayout *l = new QBoxLayout(QBoxLayout::TopToBottom);
|
||||||
|
l->setContentsMargins(0, 0, 0, 0);
|
||||||
const auto emptyWidget = new QWidget();
|
l->setSpacing(0);
|
||||||
emptyWidget->setMinimumWidth(50);
|
setLayout(l);
|
||||||
emptyWidget->setMinimumHeight(50); // Prevents you from dragging the splitter too far
|
l->addWidget(d->DockArea);
|
||||||
|
|
||||||
switch (area)
|
|
||||||
{
|
|
||||||
case CDockWidgetSideTab::Top:
|
|
||||||
{
|
|
||||||
addWidget(d->DockArea);
|
|
||||||
addWidget(emptyWidget);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CDockWidgetSideTab::Left:
|
|
||||||
{
|
|
||||||
addWidget(d->DockArea);
|
|
||||||
addWidget(emptyWidget);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CDockWidgetSideTab::Right:
|
|
||||||
{
|
|
||||||
addWidget(emptyWidget);
|
|
||||||
addWidget(d->DockArea);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CDockWidgetSideTab::Bottom:
|
|
||||||
{
|
|
||||||
addWidget(emptyWidget);
|
|
||||||
addWidget(d->DockArea);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateSize();
|
updateSize();
|
||||||
updateMask();
|
|
||||||
|
|
||||||
parent->registerAutoHideWidget(this);
|
parent->registerAutoHideWidget(this);
|
||||||
|
setAutoFillBackground(true);
|
||||||
|
setMouseTracking(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void CAutoHideDockContainer::updateMask()
|
|
||||||
{
|
|
||||||
setMask(d->getDockAreaWithSplitterRect());
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void CAutoHideDockContainer::updateSize()
|
|
||||||
{
|
|
||||||
const auto dockContainerParent = parentContainer();
|
|
||||||
const auto rootSplitter = dockContainerParent->rootSplitter();
|
|
||||||
const auto rect = rootSplitter->frameGeometry();
|
|
||||||
move(rect.topLeft());
|
|
||||||
resize(rect.width(), rect.height());
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, CDockWidgetSideTab::SideTabBarArea area, CDockContainerWidget* parent) :
|
CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, CDockWidgetSideTab::SideTabBarArea area, CDockContainerWidget* parent) :
|
||||||
@ -235,6 +194,60 @@ CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, CDockWid
|
|||||||
setDockSizeProportion(DockWidget->DefaultAutoHideDockProportion());
|
setDockSizeProportion(DockWidget->DefaultAutoHideDockProportion());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideDockContainer::updateMask()
|
||||||
|
{
|
||||||
|
//setMask(d->getDockAreaWithSplitterRect());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideDockContainer::updateSize()
|
||||||
|
{
|
||||||
|
qDebug() << "CAutoHideDockContainer::updateSize()";
|
||||||
|
const auto dockContainerParent = parentContainer();
|
||||||
|
const auto rootSplitter = dockContainerParent->rootSplitter();
|
||||||
|
const auto rect = rootSplitter->frameGeometry();
|
||||||
|
|
||||||
|
switch (sideTabBarArea())
|
||||||
|
{
|
||||||
|
case CDockWidgetSideTab::Top:
|
||||||
|
move(rect.topLeft());
|
||||||
|
resize(rect.width(), height());
|
||||||
|
setContentsMargins(QMargins(0, 0, 0, ResizeMargin));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CDockWidgetSideTab::Left:
|
||||||
|
move(rect.topLeft());
|
||||||
|
resize(width(), rect.height());
|
||||||
|
setContentsMargins(QMargins(0, 0, ResizeMargin, 0));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CDockWidgetSideTab::Right:
|
||||||
|
{
|
||||||
|
QPoint p = rect.topRight();
|
||||||
|
p.rx() -= (width() - 1);
|
||||||
|
move(p);
|
||||||
|
resize(width(), rect.height());
|
||||||
|
setContentsMargins(QMargins(ResizeMargin, 0, 0, 0));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CDockWidgetSideTab::Bottom:
|
||||||
|
{
|
||||||
|
QPoint p = rect.bottomLeft();
|
||||||
|
p.ry() -= (height() - 1);
|
||||||
|
move(p);
|
||||||
|
resize(rect.width(), height());
|
||||||
|
setContentsMargins(QMargins(0, ResizeMargin, 0, 0));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//resize(rect.width(), rect.height());
|
||||||
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CAutoHideDockContainer::~CAutoHideDockContainer()
|
CAutoHideDockContainer::~CAutoHideDockContainer()
|
||||||
{
|
{
|
||||||
@ -280,6 +293,8 @@ void CAutoHideDockContainer::addDockWidget(CDockWidget* DockWidget)
|
|||||||
}
|
}
|
||||||
d->DockArea->addDockWidget(DockWidget);
|
d->DockArea->addDockWidget(DockWidget);
|
||||||
d->DockWidget->sideTabWidget()->updateOrientationAndSpacing(d->SideTabBarArea);
|
d->DockWidget->sideTabWidget()->updateOrientationAndSpacing(d->SideTabBarArea);
|
||||||
|
qDebug() << "DockWidget->size(): " << DockWidget->size();
|
||||||
|
this->resize(OldDockArea ? OldDockArea->size() : d->DockWidget->size());
|
||||||
|
|
||||||
updateSize();
|
updateSize();
|
||||||
updateMask();
|
updateMask();
|
||||||
@ -297,7 +312,7 @@ void CAutoHideDockContainer::setDockSizeProportion(float SplitterProportion)
|
|||||||
|
|
||||||
const auto dockSize = static_cast<int>(static_cast<float>(INT_MAX) * SplitterProportion);
|
const auto dockSize = static_cast<int>(static_cast<float>(INT_MAX) * SplitterProportion);
|
||||||
const auto remainingSize = INT_MAX - dockSize;
|
const auto remainingSize = INT_MAX - dockSize;
|
||||||
switch (d->SideTabBarArea)
|
/* switch (d->SideTabBarArea)
|
||||||
{
|
{
|
||||||
case CDockWidgetSideTab::Left:
|
case CDockWidgetSideTab::Left:
|
||||||
{
|
{
|
||||||
@ -310,7 +325,7 @@ void CAutoHideDockContainer::setDockSizeProportion(float SplitterProportion)
|
|||||||
setSizes({ remainingSize, dockSize });
|
setSizes({ remainingSize, dockSize });
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,10 +375,11 @@ void CAutoHideDockContainer::saveState(QXmlStreamWriter& s)
|
|||||||
{
|
{
|
||||||
s.writeAttribute("SideTabBarArea", QString::number(sideTabBarArea()));
|
s.writeAttribute("SideTabBarArea", QString::number(sideTabBarArea()));
|
||||||
QStringList Sizes;
|
QStringList Sizes;
|
||||||
for (auto Size : sizes())
|
// TODO implement auto hide dock container saving
|
||||||
|
/*for (auto Size : sizes())
|
||||||
{
|
{
|
||||||
Sizes << QString::number(Size);
|
Sizes << QString::number(Size);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
s.writeAttribute("Sizes", Sizes.join(" "));
|
s.writeAttribute("Sizes", Sizes.join(" "));
|
||||||
}
|
}
|
||||||
@ -383,7 +399,8 @@ bool CAutoHideDockContainer::restoreState(CDockingStateReader& s, bool Testing)
|
|||||||
Sizes.append(value);
|
Sizes.append(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Sizes.count() != count())
|
// TODO implement restore state
|
||||||
|
/*if (Sizes.count() != count())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -391,7 +408,7 @@ bool CAutoHideDockContainer::restoreState(CDockingStateReader& s, bool Testing)
|
|||||||
if (!Testing)
|
if (!Testing)
|
||||||
{
|
{
|
||||||
setSizes(Sizes);
|
setSizes(Sizes);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -481,7 +498,7 @@ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event)
|
|||||||
|
|
||||||
if (!IsDockManager)
|
if (!IsDockManager)
|
||||||
{
|
{
|
||||||
return QSplitter::eventFilter(watched, event);
|
return Super::eventFilter(watched, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we check, if the user clicked inside of this auto hide container.
|
// Now we check, if the user clicked inside of this auto hide container.
|
||||||
@ -493,7 +510,7 @@ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event)
|
|||||||
auto rect = d->getDockAreaWithSplitterRect();
|
auto rect = d->getDockAreaWithSplitterRect();
|
||||||
if (rect.contains(pos))
|
if (rect.contains(pos))
|
||||||
{
|
{
|
||||||
return QSplitter::eventFilter(watched, event);
|
return Super::eventFilter(watched, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now check, if the user clicked into the side tab and ignore this event,
|
// Now check, if the user clicked into the side tab and ignore this event,
|
||||||
@ -504,7 +521,7 @@ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event)
|
|||||||
pos = SideTab->mapFromGlobal(me->globalPos());
|
pos = SideTab->mapFromGlobal(me->globalPos());
|
||||||
if (SideTab->rect().contains(pos))
|
if (SideTab->rect().contains(pos))
|
||||||
{
|
{
|
||||||
return QSplitter::eventFilter(watched, event);
|
return Super::eventFilter(watched, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the mouse button down event is in the dock manager but outside
|
// If the mouse button down event is in the dock manager but outside
|
||||||
@ -513,15 +530,47 @@ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event)
|
|||||||
collapseView(true);
|
collapseView(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return QSplitter::eventFilter(watched, event);
|
return Super::eventFilter(watched, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CAutoHideDockContainer::resizeEvent(QResizeEvent* event)
|
void CAutoHideDockContainer::resizeEvent(QResizeEvent* event)
|
||||||
{
|
{
|
||||||
|
std::cout << "ResizeEvent" << std::endl;
|
||||||
updateMask();
|
updateMask();
|
||||||
QSplitter::resizeEvent(event);
|
Super::resizeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
bool CAutoHideDockContainer::event(QEvent *event)
|
||||||
|
{
|
||||||
|
return Super::event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideDockContainer::mouseMoveEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
qDebug() << "mouseMoveEvent: " << event->pos();
|
||||||
|
qDebug() << "height: " << height();
|
||||||
|
auto p = event->pos();
|
||||||
|
if (p.y() > (height() - ResizeMargin - 1) && p.y() < height())
|
||||||
|
{
|
||||||
|
setCursor(Qt::SizeVerCursor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setCursor(Qt::ArrowCursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideDockContainer::mousePressEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
qDebug() << "mousePressEvent: " << event->pos();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ class CDockingStateReader;
|
|||||||
// Note: This widget must be a QSplitter, inheriting from QWidget and keeping an
|
// Note: This widget must be a QSplitter, inheriting from QWidget and keeping an
|
||||||
// internal splitter breaks ActiveX widgets
|
// internal splitter breaks ActiveX widgets
|
||||||
// likely due to layout issues between this widget and the internal splitter
|
// likely due to layout issues between this widget and the internal splitter
|
||||||
class ADS_EXPORT CAutoHideDockContainer : public QSplitter
|
class ADS_EXPORT CAutoHideDockContainer : public QFrame
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(int sideTabBarArea READ sideTabBarArea)
|
Q_PROPERTY(int sideTabBarArea READ sideTabBarArea)
|
||||||
@ -63,10 +63,14 @@ protected:
|
|||||||
void resizeEvent(QResizeEvent* event) override;
|
void resizeEvent(QResizeEvent* event) override;
|
||||||
void updateMask();
|
void updateMask();
|
||||||
void updateSize();
|
void updateSize();
|
||||||
|
virtual bool event(QEvent *event) override;
|
||||||
|
virtual void mouseMoveEvent(QMouseEvent *event) override;
|
||||||
|
virtual void mousePressEvent(QMouseEvent *event) override;
|
||||||
|
|
||||||
CDockContainerWidget* parentContainer() const;
|
CDockContainerWidget* parentContainer() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
using Super = QFrame;
|
||||||
/**
|
/**
|
||||||
* Create Auto Hide widget with a dock manager
|
* Create Auto Hide widget with a dock manager
|
||||||
*/
|
*/
|
||||||
|
@ -187,6 +187,7 @@ ads--CAutoHideDockContainer::handle:horizontal {
|
|||||||
background: white;
|
background: white;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
|
||||||
ads--CAutoHideDockContainer #dockAreaAutoHideButton
|
ads--CAutoHideDockContainer #dockAreaAutoHideButton
|
||||||
{
|
{
|
||||||
qproperty-icon: url(:/ads/images/vs-pin-button-pinned.svg);
|
qproperty-icon: url(:/ads/images/vs-pin-button-pinned.svg);
|
||||||
|
Loading…
Reference in New Issue
Block a user