Skip to content

Commit c5ea5c8

Browse files
author
Uwe Kindler
committed
Fixed display of drop overlay
1 parent 1b1c636 commit c5ea5c8

File tree

5 files changed

+52
-59
lines changed

5 files changed

+52
-59
lines changed

demo/mainwindow.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ void MainWindow::createContent()
105105
DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false));
106106
m_DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
107107
m_DockManager->addDockWidget(ads::LeftDockWidgetArea, createLongTextLabelDockWidget(ViewMenu));
108-
/*m_DockManager->addDockWidget(ads::BottomDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
109-
auto TopDockArea = m_DockManager->addDockWidget(ads::TopDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
108+
m_DockManager->addDockWidget(ads::BottomDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
109+
/*auto TopDockArea = m_DockManager->addDockWidget(ads::TopDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
110110
DockWidget = createCalendarDockWidget(ViewMenu);
111111
DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false));
112112
m_DockManager->addDockWidget(ads::CenterDockWidgetArea, DockWidget, TopDockArea);

src/DockContainerWidget.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ struct DockContainerWidgetPrivate
124124
/**
125125
* Restore state of child nodes.
126126
* \param[in] Stream The data stream that contains the serialized state
127-
* \param[out] CreatedWidget The widget created from parsed data
127+
* \param[out] CreatedWidget The widget created from parsed data or 0 if
128+
* the parsed widget was an empty splitter
128129
* \param[in] Testing If Testing is true, only the stream data is
129130
* parsed without modifiying anything.
130131
*/
@@ -828,10 +829,18 @@ bool CDockContainerWidget::restoreState(QDataStream& stream, bool Testing)
828829
return true;
829830
}
830831

832+
// If the root splitter is empty, rostoreChildNodes returns a 0 pointer
833+
// and we need to create a new empty root splitter
834+
if (!NewRootSplitter)
835+
{
836+
NewRootSplitter = internal::newSplitter(Qt::Horizontal);
837+
}
838+
831839
d->Layout->replaceWidget(d->RootSplitter, NewRootSplitter);
832840
QSplitter* OldRoot = d->RootSplitter;
833841
d->RootSplitter = dynamic_cast<QSplitter*>(NewRootSplitter);
834842
OldRoot->deleteLater();
843+
835844
return true;
836845
}
837846

src/DockOverlay.cpp

Lines changed: 28 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ struct DockOverlayPrivate
148148
QPointer<QWidget> TargetWidget;
149149
QRect TargetRect;
150150
DockWidgetArea LastLocation = InvalidDockWidgetArea;
151+
bool DropPreviewEnabled = true;
151152

152153
/**
153154
* Private data constructor
@@ -187,14 +188,16 @@ CDockOverlay::CDockOverlay(QWidget* parent, eMode Mode) :
187188
{
188189
d->Cross = new CDockOverlayCross(this);
189190
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
190-
setWindowOpacity(0.2);
191+
setWindowOpacity(1);
191192
setWindowTitle("DockOverlay");
192193
setAttribute(Qt::WA_NoSystemBackground);
193194
setAttribute(Qt::WA_TranslucentBackground);
194195

195196
QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom);
196197
l->setSpacing(0);
197198
setLayout(l);
199+
l->setContentsMargins(QMargins(0, 0, 0, 0));
200+
l->addWidget(d->Cross);
198201

199202
d->Cross->setupOverlayCross(Mode);
200203
d->Cross->setVisible(false);
@@ -253,7 +256,6 @@ DockWidgetArea CDockOverlay::dropAreaUnderCursor() const
253256
//============================================================================
254257
DockWidgetArea CDockOverlay::showOverlay(QWidget* target)
255258
{
256-
//std::cout << "CDockOverlay::showDockOverlay(QWidget* target)" << std::endl;
257259
if (d->TargetWidget == target)
258260
{
259261
qInfo() << "_target == target";
@@ -274,33 +276,15 @@ DockWidgetArea CDockOverlay::showOverlay(QWidget* target)
274276

275277
// Move it over the target.
276278
resize(target->size());
277-
move(target->mapToGlobal(target->rect().topLeft()));
279+
QPoint TopLeft = target->mapToGlobal(target->rect().topLeft());
280+
move(TopLeft);
281+
std::cout << "Overlay top: " << TopLeft.x() << " left: " << TopLeft.y()
282+
<< std::endl;
278283
show();
279284
return dropAreaUnderCursor();
280285
}
281286

282287

283-
//============================================================================
284-
void CDockOverlay::showOverlay(QWidget* target, const QRect& targetAreaRect)
285-
{
286-
qInfo() << "CDockOverlay::showDockOverlay(QWidget* target, const QRect& targetAreaRect)";
287-
if (d->TargetWidget == target && d->TargetRect == targetAreaRect)
288-
{
289-
return;
290-
}
291-
//hideDockOverlay();
292-
d->TargetWidget = target;
293-
d->TargetRect = targetAreaRect;
294-
d->LastLocation = InvalidDockWidgetArea;
295-
296-
// Move it over the target's area.
297-
resize(targetAreaRect.size());
298-
move(target->mapToGlobal(QPoint(targetAreaRect.x(), targetAreaRect.y())));
299-
show();
300-
return;
301-
}
302-
303-
304288
//============================================================================
305289
void CDockOverlay::hideOverlay()
306290
{
@@ -313,12 +297,25 @@ void CDockOverlay::hideOverlay()
313297

314298

315299
//============================================================================
316-
void CDockOverlay::paintEvent(QPaintEvent*)
300+
void CDockOverlay::enableDropPreview(bool Enable)
301+
{
302+
d->DropPreviewEnabled = Enable;
303+
update();
304+
}
305+
306+
307+
//============================================================================
308+
void CDockOverlay::paintEvent(QPaintEvent* event)
317309
{
318310
// Draw rect based on location
311+
if (!d->DropPreviewEnabled)
312+
{
313+
return;
314+
}
315+
319316
QRect r = rect();
320317
const DockWidgetArea da = dropAreaUnderCursor();
321-
std::cout << "CursorLocation: " << dropAreaUnderCursor() << std::endl;
318+
//std::cout << "CursorLocation: " << dropAreaUnderCursor() << std::endl;
322319
switch (da)
323320
{
324321
case TopDockWidgetArea: r.setHeight(r.height() / 2); break;
@@ -330,9 +327,9 @@ void CDockOverlay::paintEvent(QPaintEvent*)
330327
}
331328
QPainter painter(this);
332329
QColor Color = palette().color(QPalette::Active, QPalette::Highlight);
333-
painter.fillRect(r, QBrush(Color, Qt::Dense4Pattern));
334-
painter.setBrush(QBrush(Color));
335-
painter.drawRect(r);
330+
Color.setAlpha(64);
331+
painter.setPen(Qt::NoPen);
332+
painter.fillRect(r, Color);
336333
}
337334

338335

@@ -353,23 +350,6 @@ void CDockOverlay::hideEvent(QHideEvent*)
353350
}
354351

355352

356-
357-
//============================================================================
358-
void CDockOverlay::resizeEvent(QResizeEvent* e)
359-
{
360-
qInfo() << "CDockOverlay::resizeEvent" << e->size();
361-
d->Cross->resize(e->size());
362-
}
363-
364-
365-
//============================================================================
366-
void CDockOverlay::moveEvent(QMoveEvent* e)
367-
{
368-
qInfo() << "CDockOverlay::moveEvent" << e->pos();
369-
d->Cross->move(e->pos());
370-
}
371-
372-
373353
//============================================================================
374354
static int areaAlignment(const DockWidgetArea area)
375355
{
@@ -568,6 +548,8 @@ void CDockOverlayCross::reset()
568548
}
569549
}
570550

551+
552+
571553
} // namespace ads
572554
//----------------------------------------------------------------------------
573555

src/DockOverlay.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,21 +85,20 @@ class CDockOverlay : public QFrame
8585
DockWidgetArea showOverlay(QWidget* target);
8686

8787
/**
88-
* Show drop overlay for the given target widget and the given rectangle
88+
* Hides the overlay
8989
*/
90-
void showOverlay(QWidget* target, const QRect& targetAreaRect);
90+
void hideOverlay();
9191

9292
/**
93-
* Hides the overlay
93+
* Enables / disables the semi transparent overlay rectangle that represents
94+
* the future area of the dropped widget
9495
*/
95-
void hideOverlay();
96+
void enableDropPreview(bool Enable);
9697

9798
protected:
9899
virtual void paintEvent(QPaintEvent *e) override;
99100
virtual void showEvent(QShowEvent* e) override;
100101
virtual void hideEvent(QHideEvent* e) override;
101-
virtual void resizeEvent(QResizeEvent* e) override;
102-
virtual void moveEvent(QMoveEvent* e) override;
103102
};
104103

105104

src/FloatingDockContainer.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos)
133133
}
134134

135135
DropContainer = TopContainer;
136+
//std::cout << "TopContainer " << TopContainer << std::endl;
136137
auto ContainerOverlay = DockManager->containerOverlay();
137138
auto DockAreaOverlay = DockManager->dockAreaOverlay();
138139

@@ -146,13 +147,15 @@ void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos)
146147
ContainerOverlay->setAllowedAreas(TopContainer->dockAreaCount() > 1 ?
147148
OuterDockAreas : AllDockAreas);
148149
ContainerOverlay->showOverlay(TopContainer);
149-
ContainerOverlay->raise();
150+
//ContainerOverlay->raise();
150151

151152
auto DockArea = TopContainer->dockAreaAt(GlobalPos);
152-
if (DockArea && TopContainer->dockAreaCount() > 1)
153+
if (DockArea && TopContainer->dockAreaCount() > 0)
153154
{
154-
DockAreaOverlay->setAllowedAreas(AllDockAreas);
155-
DockAreaOverlay->showOverlay(DockArea);
155+
DockAreaOverlay->setAllowedAreas((TopContainer->dockAreaCount() == 1) ?
156+
NoDockWidgetArea : AllDockAreas);
157+
DockWidgetArea Area = DockAreaOverlay->showOverlay(DockArea);
158+
ContainerOverlay->enableDropPreview(InvalidDockWidgetArea == Area);
156159
}
157160
else
158161
{

0 commit comments

Comments
 (0)