diff --git a/src/Gui/TaskView/TaskView.cpp b/src/Gui/TaskView/TaskView.cpp index 760e41351..e7496d9ff 100644 --- a/src/Gui/TaskView/TaskView.cpp +++ b/src/Gui/TaskView/TaskView.cpp @@ -28,6 +28,7 @@ # include # include # include +# include # include #endif @@ -586,6 +587,23 @@ void TaskView::removeDialog(void) void TaskView::updateWatcher(void) { + // In case a child of the TaskView has the focus and get hidden we have + // to make sure that set the focus on a widget that won't be hidden or + // deleted because otherwise Qt may forward the focus via focusNextPrevChild() + // to the mdi area which may switch to another mdi view which is not an + // acceptable behaviour. + QWidget *fw = QApplication::focusWidget(); + if (!fw) + this->setFocus(); + QPointer fwp = fw; + while (fw && !fw->isWindow()) { + if (fw == this) { + this->setFocus(); + break; + } + fw = fw->parentWidget(); + } + // add all widgets for all watcher to the task view for (std::vector::iterator it=ActiveWatcher.begin();it!=ActiveWatcher.end();++it) { bool match = (*it)->shouldShow(); @@ -597,6 +615,11 @@ void TaskView::updateWatcher(void) (*it2)->hide(); } } + + // In case the previous widget that had the focus is still visible + // give it the focus back. + if (fwp && fwp->isVisible()) + fwp->setFocus(); } void TaskView::addTaskWatcher(const std::vector &Watcher) @@ -639,6 +662,22 @@ void TaskView::addTaskWatcher(void) void TaskView::removeTaskWatcher(void) { + // In case a child of the TaskView has the focus and get hidden we have + // to make sure that set the focus on a widget that won't be hidden or + // deleted because otherwise Qt may forward the focus via focusNextPrevChild() + // to the mdi area which may switch to another mdi view which is not an + // acceptable behaviour. + QWidget *fw = QApplication::focusWidget(); + if (!fw) + this->setFocus(); + while (fw && !fw->isWindow()) { + if (fw == this) { + this->setFocus(); + break; + } + fw = fw->parentWidget(); + } + // remove all widgets for (std::vector::iterator it=ActiveWatcher.begin();it!=ActiveWatcher.end();++it) { std::vector &cont = (*it)->getWatcherContent();