Implemented experimental mouse event handling

This commit is contained in:
Uwe Kindler 2022-10-23 16:42:14 +02:00
parent 63fed89f26
commit bc1f12ba93
3 changed files with 120 additions and 66 deletions

View File

@ -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();
} }
} }

View File

@ -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
*/ */

View File

@ -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);