mirror of
https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git
synced 2024-12-25 23:51:33 +08:00
Update DockAreaTab bar to undock / shwo undock preview as soon as a tab is dragged outside of the tab bar
This commit is contained in:
parent
3f09d5c6ea
commit
fd28f0f751
@ -35,6 +35,7 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QBoxLayout>
|
#include <QBoxLayout>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
#include <QtGlobal>
|
||||||
|
|
||||||
#include "FloatingDockContainer.h"
|
#include "FloatingDockContainer.h"
|
||||||
#include "DockAreaWidget.h"
|
#include "DockAreaWidget.h"
|
||||||
@ -69,6 +70,16 @@ struct DockAreaTabBarPrivate
|
|||||||
* The function reassigns the stylesheet to update the tabs
|
* The function reassigns the stylesheet to update the tabs
|
||||||
*/
|
*/
|
||||||
void updateTabs();
|
void updateTabs();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function to access first tab
|
||||||
|
*/
|
||||||
|
CDockWidgetTab* firstTab() const {return _this->tab(0);}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function to access last tab
|
||||||
|
*/
|
||||||
|
CDockWidgetTab* lastTab() const {return _this->tab(_this->count() - 1);}
|
||||||
};
|
};
|
||||||
// struct DockAreaTabBarPrivate
|
// struct DockAreaTabBarPrivate
|
||||||
|
|
||||||
@ -366,6 +377,8 @@ void CDockAreaTabBar::onTabWidgetMoved(const QPoint& GlobalPos)
|
|||||||
|
|
||||||
int fromIndex = d->TabsLayout->indexOf(MovingTab);
|
int fromIndex = d->TabsLayout->indexOf(MovingTab);
|
||||||
auto MousePos = mapFromGlobal(GlobalPos);
|
auto MousePos = mapFromGlobal(GlobalPos);
|
||||||
|
MousePos.rx() = qMax(d->firstTab()->geometry().left(), MousePos.x());
|
||||||
|
MousePos.rx() = qMin(d->lastTab()->geometry().right(), MousePos.x());
|
||||||
int toIndex = -1;
|
int toIndex = -1;
|
||||||
// Find tab under mouse
|
// Find tab under mouse
|
||||||
for (int i = 0; i < count(); ++i)
|
for (int i = 0; i < count(); ++i)
|
||||||
@ -381,38 +394,23 @@ void CDockAreaTabBar::onTabWidgetMoved(const QPoint& GlobalPos)
|
|||||||
if (toIndex == fromIndex)
|
if (toIndex == fromIndex)
|
||||||
{
|
{
|
||||||
toIndex = -1;
|
toIndex = -1;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (toIndex < 0)
|
|
||||||
{
|
|
||||||
toIndex = 0;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now check if the mouse is behind the last tab
|
if (toIndex > -1)
|
||||||
if (toIndex < 0)
|
|
||||||
{
|
|
||||||
if (MousePos.x() > tab(count() - 1)->geometry().right())
|
|
||||||
{
|
|
||||||
ADS_PRINT("after all tabs");
|
|
||||||
toIndex = count() - 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
toIndex = fromIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
d->TabsLayout->removeWidget(MovingTab);
|
|
||||||
d->TabsLayout->insertWidget(toIndex, MovingTab);
|
|
||||||
if (toIndex >= 0)
|
|
||||||
{
|
{
|
||||||
|
d->TabsLayout->removeWidget(MovingTab);
|
||||||
|
d->TabsLayout->insertWidget(toIndex, MovingTab);
|
||||||
ADS_PRINT("tabMoved from " << fromIndex << " to " << toIndex);
|
ADS_PRINT("tabMoved from " << fromIndex << " to " << toIndex);
|
||||||
emit tabMoved(fromIndex, toIndex);
|
emit tabMoved(fromIndex, toIndex);
|
||||||
setCurrentIndex(toIndex);
|
setCurrentIndex(toIndex);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ensure that the moved tab is reset to its start position
|
||||||
|
d->TabsLayout->update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -357,16 +357,19 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// move tab
|
// move tab
|
||||||
|
bool TabOutsideBar = false;
|
||||||
if (d->isDraggingState(DraggingTab))
|
if (d->isDraggingState(DraggingTab))
|
||||||
{
|
{
|
||||||
// Moving the tab is always allowed because it does not mean moving the
|
// Moving the tab is always allowed because it does not mean moving the
|
||||||
// dock widget around
|
// dock widget around
|
||||||
d->moveTab(ev);
|
d->moveTab(ev);
|
||||||
|
TabOutsideBar = (geometry().right() < 0) || (geometry().left() > parentWidget()->rect().right());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Maybe a fixed drag distance is better here ?
|
// Maybe a fixed drag distance is better here ?
|
||||||
int DragDistanceY = qAbs(d->GlobalDragStartMousePosition.y() - ev->globalPos().y());
|
int DragDistanceY = qAbs(d->GlobalDragStartMousePosition.y() - ev->globalPos().y());
|
||||||
if (DragDistanceY >= CDockManager::startDragDistance())
|
if (DragDistanceY >= CDockManager::startDragDistance() || TabOutsideBar)
|
||||||
{
|
{
|
||||||
// If this is the last dock area in a dock container with only
|
// If this is the last dock area in a dock container with only
|
||||||
// one single dock widget it does not make sense to move it to a new
|
// one single dock widget it does not make sense to move it to a new
|
||||||
@ -390,7 +393,7 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev)
|
|||||||
// tab because it looks strange if it remains on its dragged position
|
// tab because it looks strange if it remains on its dragged position
|
||||||
if (d->isDraggingState(DraggingTab) && !CDockManager::configFlags().testFlag(CDockManager::OpaqueUndocking))
|
if (d->isDraggingState(DraggingTab) && !CDockManager::configFlags().testFlag(CDockManager::OpaqueUndocking))
|
||||||
{
|
{
|
||||||
this->move(d->TabDragStartPosition);
|
parentWidget()->layout()->update();
|
||||||
}
|
}
|
||||||
d->startFloating();
|
d->startFloating();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user