瀏覽代碼

Popup widget position recalculated if parent widget resized

The ctkPopupWidget resides in its own window that should follow the
application window while it is being moved or resized. (This matters
only if the pop-up widget is pinned to the application window,
otherwise it is not visible during moving or resizing.)

This commit corrects the calculation of the new window position.

Fixes #411.
Miklos Espak 11 年之前
父節點
當前提交
3bb81c7705
共有 1 個文件被更改,包括 22 次插入27 次删除
  1. 22 27
      Libs/Widgets/ctkPopupWidget.cpp

+ 22 - 27
Libs/Widgets/ctkPopupWidget.cpp

@@ -20,7 +20,6 @@
 
 // Qt includes
 #include <QApplication>
-#include <QDebug>
 #include <QDesktopWidget>
 #include <QDir>
 #include <QEvent>
@@ -99,14 +98,7 @@ bool ctkPopupWidgetPrivate::eventFilter(QObject* obj, QEvent* event)
     {
     if (widget->isAncestorOf(this->BaseWidget))
       {
-      QMoveEvent* moveEvent = dynamic_cast<QMoveEvent*>(event);
-      QPoint topLeft = widget->parentWidget() ? widget->parentWidget()->mapToGlobal(moveEvent->pos()) : moveEvent->pos();
-      topLeft += this->BaseWidget->mapTo(widget, QPoint(0,0));
-      //q->move(q->pos() + moveEvent->pos() - moveEvent->oldPos());
-      QRect newBaseGeometry = this->baseGeometry();
-	    newBaseGeometry.moveTopLeft(topLeft);
-	    QRect desiredGeometry = this->desiredOpenGeometry(newBaseGeometry);
-	    q->move(desiredGeometry.topLeft());
+      q->setGeometry(this->desiredOpenGeometry());
       }
     else if (widget->isWindow() &&
              widget->windowType() != Qt::ToolTip &&
@@ -117,8 +109,11 @@ bool ctkPopupWidgetPrivate::eventFilter(QObject* obj, QEvent* event)
     }
   else if (event->type() == QEvent::Resize)
     {
-    if (widget->isWindow() &&
-        widget != this->BaseWidget->window() &&
+    if (widget->isAncestorOf(this->BaseWidget))
+      {
+      q->setGeometry(this->desiredOpenGeometry());
+      }
+    else if (widget->isWindow() &&
         widget->windowType() != Qt::ToolTip &&
         widget->windowType() != Qt::Popup)
       {
@@ -446,22 +441,22 @@ bool ctkPopupWidget::eventFilter(QObject* obj, QEvent* event)
     case QEvent::Show:
       if (obj != d->BaseWidget)
         {
-	      break;
-	      }
-	    this->setGeometry(d->desiredOpenGeometry());
-	    d->temporarilyHiddenOff();
-	    break;
-	  case QEvent::Resize:
-	    if (obj != d->BaseWidget ||
-	        !(d->Alignment & Qt::AlignJustify ||
-	         (d->Alignment & Qt::AlignTop && d->Alignment & Qt::AlignBottom)) ||
-	         !(d->isOpening() || this->isVisible()))
-	      {
-	      break;
-	      }
-	    // TODO: bug when the effect is WindowOpacityFadeEffect
-	    this->setGeometry(d->desiredOpenGeometry());
-	    break;
+        break;
+        }
+      this->setGeometry(d->desiredOpenGeometry());
+      d->temporarilyHiddenOff();
+      break;
+    case QEvent::Resize:
+      if (obj != d->BaseWidget ||
+          !(d->Alignment & Qt::AlignJustify ||
+           (d->Alignment & Qt::AlignTop && d->Alignment & Qt::AlignBottom)) ||
+           !(d->isOpening() || this->isVisible()))
+        {
+        break;
+        }
+      // TODO: bug when the effect is WindowOpacityFadeEffect
+      this->setGeometry(d->desiredOpenGeometry());
+      break;
     case QEvent::Enter:
       if ( d->currentAnimation()->state() == QAbstractAnimation::Stopped )
         {