removed dependency in IndicatorsWindow from DropIndicators

This commit is contained in:
Roman Pudashkin 2021-05-07 19:19:53 +02:00 committed by Igor Korsukov
parent f6f15611b1
commit 6a7fdbab6b
4 changed files with 168 additions and 159 deletions

View file

@ -93,14 +93,25 @@ DropIndicators::~DropIndicators()
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation DropIndicators::hover_impl(QPoint globalPos)
{
showDropAreaIfNeed(globalPos);
DropLocation dropLocation = DropLocation_None;
QRect dropRect = QRect();
return m_indicatorsWindow->hover(globalPos);
if (isToolBar()) {
dropLocation = dropLocationForToolBar(globalPos);
dropRect = dropAreaRectForToolBar(dropLocation);
} else {
dropLocation = m_indicatorsWindow->dropLocationForPosition(globalPos);
dropRect = dropAreaRectForPanel(dropLocation);
}
showDropAreaIfNeed(dropRect, dropLocation);
return dropLocation;
}
QPoint DropIndicators::posForIndicator(DropLocation loc) const
{
return m_indicatorsWindow->posForIndicator(loc);
return m_indicatorsWindow->positionForIndicator(loc);
}
bool DropIndicators::outterLeftIndicatorVisible() const
@ -157,6 +168,29 @@ bool DropIndicators::isIndicatorVisible(DropLocation location) const
return isDropAllowed(location);
}
bool DropIndicators::onResize(QSize)
{
m_indicatorsWindow->resize(window()->size());
return false;
}
void DropIndicators::updateVisibility()
{
if (isHovered()) {
m_indicatorsWindow->setVisible(true);
updateWindowPosition();
m_indicatorsWindow->raise();
} else {
m_rubberBand->setVisible(false);
m_indicatorsWindow->setVisible(false);
mainWindow()->setDockingHelperVisible(false);
}
m_draggedDockProperties = readPropertiesFromObject(draggedDock());
emit indicatorsVisibilityChanged();
}
bool DropIndicators::isDropAllowed(DropLocation location) const
{
if (location == DropLocation_None) {
@ -194,6 +228,11 @@ bool DropIndicators::isDropAllowed(DropLocation location) const
return false;
}
bool DropIndicators::isToolBar() const
{
return m_draggedDockProperties.type == DockType::ToolBar;
}
const KDDockWidgets::DockWidgetBase* DropIndicators::draggedDock() const
{
auto windowBeingDragged = KDDockWidgets::DragController::instance()->windowBeingDragged();
@ -219,60 +258,11 @@ const KDDockWidgets::DockWidgetBase* DropIndicators::hoveredDock() const
return docks.first();
}
bool DropIndicators::isToolBar() const
DropIndicators::DropLocation DropIndicators::dropLocationForToolBar(const QPoint& hoveredGlobalPos) const
{
return m_draggedDockProperties.type == DockType::ToolBar;
}
const KDDockWidgets::DockWidgetBase* DropIndicators::draggedDock() const
{
auto windowBeingDragged = KDDockWidgets::DragController::instance()->windowBeingDragged();
if (!windowBeingDragged || windowBeingDragged->dockWidgets().isEmpty()) {
return nullptr;
}
return windowBeingDragged->dockWidgets().first();
}
bool DropIndicators::onResize(QSize)
{
m_indicatorsWindow->resize(window()->size());
return false;
}
void DropIndicators::updateVisibility()
{
if (isHovered() && m_hoveredFrame) {
m_indicatorsWindow->setVisible(true);
updateWindowPosition();
m_indicatorsWindow->raise();
} else {
m_rubberBand->setVisible(false);
m_indicatorsWindow->setVisible(false);
mainWindow()->setDockingHelperVisible(false);
}
m_draggedDockProperties = readPropertiesFromObject(draggedDock());
emit indicatorsVisibilityChanged();
}
void DropIndicators::showDropAreaIfNeed(const QPoint& hoveredGlobalPos)
{
if (!isToolBar()) {
return;
}
const KDDockWidgets::DockWidgetBase* draggedDock = this->draggedDock();
const KDDockWidgets::DockWidgetBase* hoveredDock = this->hoveredDock();
if (!draggedDock || !hoveredDock) {
return;
}
DockType hoveredDockType = readPropertiesFromObject(hoveredDock).type;
DockType hoveredDockType = readPropertiesFromObject(hoveredDock()).type;
if (hoveredDockType != DockType::ToolBar) {
return;
return DropLocation_None;
}
QRect dropAreaRect = hoveredFrameRect();
@ -280,41 +270,48 @@ void DropIndicators::showDropAreaIfNeed(const QPoint& hoveredGlobalPos)
int distanceToLeftCorner = std::abs(dropAreaRect.x() - hoveredGlobalPos.x());
int distanceToRightCorner = std::abs(dropAreaRect.x() + dropAreaRect.width() - hoveredGlobalPos.x());
DropLocation dropLocation = DropLocation_Left;
if (distanceToRightCorner < distanceToLeftCorner) {
return DropLocation_Right;
}
return DropLocation_Left;
}
QRect DropIndicators::dropAreaRectForToolBar(DropLocation location) const
{
const KDDockWidgets::DockWidgetBase* draggedDock = this->draggedDock();
const KDDockWidgets::DockWidgetBase* hoveredDock = this->hoveredDock();
if (!draggedDock || !hoveredDock) {
return QRect();
}
DockType hoveredDockType = readPropertiesFromObject(hoveredDock).type;
if (hoveredDockType != DockType::ToolBar) {
return QRect();
}
QRect dropAreaRect = hoveredFrameRect();
if (location == DropLocation_Right) {
dropAreaRect.setX(dropAreaRect.x() + dropAreaRect.width() - draggedDock->width());
dropLocation = DropLocation_Right;
}
if (draggedDock->width() <= hoveredDock->width() / 2) {
dropAreaRect.setWidth(draggedDock->width());
}
mainWindow()->setDockingHelperVisible(true);
m_rubberBand->setGeometry(dropAreaRect);
m_rubberBand->setVisible(true);
setCurrentDropLocation(dropLocation);
return dropAreaRect;
}
void DropIndicators::setDropLocation(DropLocation location)
QRect DropIndicators::dropAreaRectForPanel(DropLocation location) const
{
if (!isDropAllowed(location)) {
return;
}
setCurrentDropLocation(location);
if (location == DropLocation_Center) {
m_rubberBand->setGeometry(m_hoveredFrame ? m_hoveredFrame->QWidgetAdapter::geometry() : rect());
m_rubberBand->setVisible(true);
return;
return m_hoveredFrame ? m_hoveredFrame->QWidgetAdapter::geometry() : rect();
}
KDDockWidgets::Location multisplitterLocation = locationToMultisplitterLocation(location);
KDDockWidgets::Frame* relativeToFrame = nullptr;
const KDDockWidgets::Frame* relativeToFrame = nullptr;
switch (location) {
case DropLocation_Left:
@ -322,7 +319,7 @@ void DropIndicators::setDropLocation(DropLocation location)
case DropLocation_Right:
case DropLocation_Bottom:
if (!m_hoveredFrame) {
return;
return QRect();
}
relativeToFrame = m_hoveredFrame;
break;
@ -336,10 +333,6 @@ void DropIndicators::setDropLocation(DropLocation location)
}
auto windowBeingDragged = KDDockWidgets::DragController::instance()->windowBeingDragged();
QRect rect = m_dropArea->rectForDrop(windowBeingDragged, multisplitterLocation,
m_dropArea->itemForFrame(relativeToFrame));
auto draggedDock = this->draggedDock();
if (m_hoveredFrame && isToolBar() && draggedDock) {
@ -352,6 +345,26 @@ void DropIndicators::setDropLocation(DropLocation location)
}
}
return m_dropArea->rectForDrop(windowBeingDragged, multisplitterLocation,
m_dropArea->itemForFrame(relativeToFrame));
}
void DropIndicators::showDropAreaIfNeed(const QRect& rect, DropLocation location)
{
if (rect.isNull()) {
return;
}
if (!isDropAllowed(location)) {
return;
}
if (isToolBar()) {
mainWindow()->setDockingHelperVisible(true);
}
setCurrentDropLocation(location);
m_rubberBand->setGeometry(rect);
m_rubberBand->setVisible(true);
}

View file

@ -75,11 +75,11 @@ signals:
void indicatorsVisibilityChanged();
private:
friend class IndicatorsWindow;
bool onResize(QSize newSize) override;
void updateVisibility() override;
bool isIndicatorVisible(DropLocation location) const;
bool isDropAllowed(DropLocation location) const;
bool isToolBar() const;
bool hoveringOverDock(DockType type) const;
@ -87,14 +87,14 @@ private:
const KDDockWidgets::DockWidgetBase* hoveredDock() const;
const KDDockWidgets::DockWidgetBase* draggedDock() const;
void setDropLocation(DropLocation);
DropLocation dropLocationForToolBar(const QPoint& hoveredGlobalPos) const;
QRect dropAreaRectForToolBar(DropLocation location) const;
QRect dropAreaRectForPanel(DropLocation location) const;
void showDropAreaIfNeed(const QRect& rect, DropLocation location);
void updateWindowPosition();
bool onResize(QSize newSize) override;
void updateVisibility() override;
void showDropAreaIfNeed(const QPoint& hoveredGlobalPos);
KDDockWidgets::QWidgetOrQuick* m_rubberBand = nullptr;
IndicatorsWindow* m_indicatorsWindow = nullptr;
DockProperties m_draggedDockProperties;

View file

@ -30,7 +30,9 @@
using namespace mu::dock;
IndicatorsWindow::IndicatorsWindow(DropIndicators* dropIndicators)
static constexpr int INDICATORS_COUNT = 9;
IndicatorsWindow::IndicatorsWindow(QQuickItem* dropIndicators)
: QQuickView(),
m_dropIndicators(dropIndicators)
{
@ -52,71 +54,43 @@ IndicatorsWindow::IndicatorsWindow(DropIndicators* dropIndicators)
}
}
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation IndicatorsWindow::hover(QPoint pos)
QQuickItem* IndicatorsWindow::dropIndicators() const
{
QQuickItem* item = indicatorForPos(pos);
auto location = item ? locationForIndicator(item) : KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_None;
dropIndicators()->setDropLocation(location);
return location;
return m_dropIndicators;
}
QQuickItem* IndicatorsWindow::indicatorForPos(QPoint pos) const
QString IndicatorsWindow::iconName(int dropLocation, bool active) const
{
const QVector<QQuickItem*> indicators = indicatorItems();
Q_ASSERT(indicators.size() == 9);
for (QQuickItem* item : indicators) {
if (item->isVisible()) {
QRect rect(0, 0, int(item->width()), int(item->height()));
rect.moveTopLeft(item->mapToGlobal(QPointF(0, 0)).toPoint());
if (rect.contains(pos)) {
return item;
}
}
}
return nullptr;
}
QPoint IndicatorsWindow::posForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const
{
QQuickItem* indicator = IndicatorsWindow::indicatorForLocation(loc);
return indicator->mapToGlobal(indicator->boundingRect().center()).toPoint();
}
QString IndicatorsWindow::iconName(int loc, bool active) const
{
QString suffix = active ? QStringLiteral("_active")
: QString();
QString suffix = active ? "_active" : QString();
QString name;
switch (loc) {
switch (dropLocation) {
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Center:
name = QStringLiteral("center");
name = "center";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Left:
name = QStringLiteral("inner_left");
name = "inner_left";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Right:
name = QStringLiteral("inner_right");
name = "inner_right";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Bottom:
name = QStringLiteral("inner_bottom");
name = "inner_bottom";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_Top:
name = QStringLiteral("inner_top");
name = "inner_top";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterLeft:
name = QStringLiteral("outter_left");
name = "outter_left";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterBottom:
name = QStringLiteral("outter_bottom");
name = "outter_bottom";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterRight:
name = QStringLiteral("outter_right");
name = "outter_right";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_OutterTop:
name = QStringLiteral("outter_top");
name = "outter_top";
break;
case KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_None:
return QString();
@ -125,43 +99,65 @@ QString IndicatorsWindow::iconName(int loc, bool active) const
return name + suffix;
}
DropIndicators* IndicatorsWindow::dropIndicators() const
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation IndicatorsWindow::dropLocationForPosition(const QPoint& pos) const
{
return m_dropIndicators;
const QQuickItem* item = indicatorForPos(pos);
return item ? locationForIndicator(item) : KDDockWidgets::DropIndicatorOverlayInterface::DropLocation_None;
}
QQuickItem* IndicatorsWindow::indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const
const QQuickItem* IndicatorsWindow::indicatorForPos(QPoint pos) const
{
const QVector<QQuickItem*> indicators = indicatorItems();
Q_ASSERT(indicators.size() == 9);
for (const QQuickItem* item : indicatorItems()) {
if (!item->isVisible()) {
continue;
}
for (QQuickItem* item : indicators) {
if (locationForIndicator(item) == loc) {
QRect rect(0, 0, int(item->width()), int(item->height()));
rect.moveTopLeft(item->mapToGlobal(QPointF(0, 0)).toPoint());
if (rect.contains(pos)) {
return item;
}
}
qWarning() << Q_FUNC_INFO << "Couldn't find indicator for location" << loc;
return nullptr;
}
QPoint IndicatorsWindow::positionForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const
{
const QQuickItem* indicator = IndicatorsWindow::indicatorForLocation(dropLocation);
return indicator->mapToGlobal(indicator->boundingRect().center()).toPoint();
}
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation IndicatorsWindow::locationForIndicator(const QQuickItem* indicator) const
{
return KDDockWidgets::DropIndicatorOverlayInterface::DropLocation(indicator->property("indicatorType").toInt());
}
QVector<QQuickItem*> IndicatorsWindow::indicatorItems() const
const QQuickItem* IndicatorsWindow::indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const
{
QVector<QQuickItem*> indicators;
indicators.reserve(9);
for (const QQuickItem* item : indicatorItems()) {
if (locationForIndicator(item) == dropLocation) {
return item;
}
}
QQuickItem* root = rootObject();
const QList<QQuickItem*> items = root->childItems();
for (QQuickItem* item : items) {
return nullptr;
}
QList<const QQuickItem*> IndicatorsWindow::indicatorItems() const
{
QList<const QQuickItem*> indicators;
indicators.reserve(INDICATORS_COUNT);
QList<QQuickItem*> items = rootObject()->childItems();
for (const QQuickItem* item : items) {
if (QString::fromLatin1(item->metaObject()->className()).startsWith(QLatin1String("DropIndicator_QMLTYPE"))) {
indicators.push_back(item);
} else if (item->objectName() == QLatin1String("innerIndicators")) {
} else if (item->objectName() == "innerIndicators") {
const QList<QQuickItem*> innerIndicators = item->childItems();
for (QQuickItem* innerItem : innerIndicators) {
if (QString::fromLatin1(innerItem->metaObject()->className()).startsWith(QLatin1String("DropIndicator_QMLTYPE"))) {
indicators.push_back(innerItem);
@ -170,5 +166,7 @@ QVector<QQuickItem*> IndicatorsWindow::indicatorItems() const
}
}
Q_ASSERT(indicators.size() == INDICATORS_COUNT);
return indicators;
}

View file

@ -28,31 +28,29 @@
#include "thirdparty/KDDockWidgets/src/private/DropIndicatorOverlayInterface_p.h"
namespace mu::dock {
class DropIndicators;
class IndicatorsWindow : public QQuickView
{
Q_OBJECT
Q_PROPERTY(mu::dock::DropIndicators* dropIndicators READ dropIndicators CONSTANT)
Q_PROPERTY(QQuickItem* dropIndicators READ dropIndicators CONSTANT)
public:
explicit IndicatorsWindow(DropIndicators* dropIndicators);
explicit IndicatorsWindow(QQuickItem* dropIndicators);
DropIndicators* dropIndicators() const;
QQuickItem* dropIndicators() const;
Q_INVOKABLE QString iconName(int dropLocation, bool active) const;
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation hover(QPoint pos);
QPoint posForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const;
QQuickItem* indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation loc) const;
Q_INVOKABLE QString iconName(int loc, bool active) const;
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocationForPosition(const QPoint& pos) const;
QPoint positionForIndicator(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const;
private:
KDDockWidgets::DropIndicatorOverlayInterface::DropLocation locationForIndicator(const QQuickItem* indicator) const;
const QQuickItem* indicatorForLocation(KDDockWidgets::DropIndicatorOverlayInterface::DropLocation dropLocation) const;
QQuickItem* indicatorForPos(QPoint) const;
QVector<QQuickItem*> indicatorItems() const;
const QQuickItem* indicatorForPos(QPoint) const;
QList<const QQuickItem *> indicatorItems() const;
DropIndicators* m_dropIndicators = nullptr;
QQuickItem* m_dropIndicators = nullptr;
};
}