Fix issues with PopupHelpWidget on Linux and macOS

* Clean up parent alignment code
* Don't hide widget if it currently has focus
* Use Qt::Tool window type on macOS as well. This prevents the popup help from hiding to the background if the main window has focus.
* Fixes #2814
This commit is contained in:
Jonathan White 2020-01-25 09:22:13 -05:00
parent e26063a872
commit 50e52df04b
4 changed files with 18 additions and 84 deletions

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>487</width> <width>397</width>
<height>326</height> <height>264</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -20,28 +20,10 @@
<enum>QFrame::StyledPanel</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
@ -63,7 +45,7 @@
<item> <item>
<widget class="QLabel" name="label_24"> <widget class="QLabel" name="label_24">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
@ -96,24 +78,6 @@
<string>Modifiers</string> <string>Modifiers</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<property name="horizontalSpacing">
<number>8</number>
</property>
<property name="verticalSpacing">
<number>8</number>
</property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="minimumSize"> <property name="minimumSize">
@ -222,21 +186,6 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>15</number>
</property>
<property name="topMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>15</number>
</property>
<property name="horizontalSpacing">
<number>8</number>
</property>
<property name="verticalSpacing">
<number>5</number>
</property>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
@ -299,12 +248,6 @@
<string>Term Wildcards</string> <string>Term Wildcards</string>
</property> </property>
<layout class="QFormLayout" name="formLayout_2"> <layout class="QFormLayout" name="formLayout_2">
<property name="horizontalSpacing">
<number>8</number>
</property>
<property name="verticalSpacing">
<number>8</number>
</property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_18"> <widget class="QLabel" name="label_18">
<property name="minimumSize"> <property name="minimumSize">
@ -404,9 +347,6 @@
<string>Examples</string> <string>Examples</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>8</number>
</property>
<item> <item>
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="sizePolicy"> <property name="sizePolicy">

View file

@ -38,7 +38,6 @@ SearchWidget::SearchWidget(QWidget* parent)
setFocusProxy(m_ui->searchEdit); setFocusProxy(m_ui->searchEdit);
m_helpWidget = new PopupHelpWidget(m_ui->searchEdit); m_helpWidget = new PopupHelpWidget(m_ui->searchEdit);
m_helpWidget->setOffset(QPoint(0, 1));
Ui::SearchHelpWidget helpUi; Ui::SearchHelpWidget helpUi;
helpUi.setupUi(m_helpWidget); helpUi.setupUi(m_helpWidget);

View file

@ -23,27 +23,22 @@
PopupHelpWidget::PopupHelpWidget(QWidget* parent) PopupHelpWidget::PopupHelpWidget(QWidget* parent)
: QFrame(parent) : QFrame(parent)
, m_parentWindow(parent->window())
, m_appWindow(getMainWindow()) , m_appWindow(getMainWindow())
, m_offset({0, 0}) , m_offset({0, 0})
, m_corner(Qt::BottomLeftCorner) , m_corner(Qt::BottomLeftCorner)
{ {
Q_ASSERT(parent); Q_ASSERT(parent);
#ifdef Q_OS_MACOS
setWindowFlags(Qt::FramelessWindowHint | Qt::Drawer);
#else
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
#endif
hide(); hide();
m_appWindow->installEventFilter(this); m_appWindow->installEventFilter(this);
parent->installEventFilter(this); parentWidget()->installEventFilter(this);
} }
PopupHelpWidget::~PopupHelpWidget() PopupHelpWidget::~PopupHelpWidget()
{ {
m_parentWindow->removeEventFilter(this); m_appWindow->removeEventFilter(this);
parentWidget()->removeEventFilter(this); parentWidget()->removeEventFilter(this);
} }
@ -65,10 +60,10 @@ void PopupHelpWidget::setPosition(Qt::Corner corner)
bool PopupHelpWidget::eventFilter(QObject* obj, QEvent* event) bool PopupHelpWidget::eventFilter(QObject* obj, QEvent* event)
{ {
if (obj == parentWidget() && event->type() == QEvent::FocusOut) { if (isVisible()) {
if (obj == parentWidget() && event->type() == QEvent::FocusOut && qApp->focusWindow() != windowHandle()) {
hide(); hide();
} else if (obj == m_appWindow && (event->type() == QEvent::Move || event->type() == QEvent::Resize)) { } else if (obj == m_appWindow && (event->type() == QEvent::Move || event->type() == QEvent::Resize)) {
if (isVisible()) {
alignWithParent(); alignWithParent();
} }
} }
@ -83,21 +78,22 @@ void PopupHelpWidget::showEvent(QShowEvent* event)
void PopupHelpWidget::alignWithParent() void PopupHelpWidget::alignWithParent()
{ {
QPoint pos; QPoint pos = m_offset;
switch (m_corner) { switch (m_corner) {
case Qt::TopLeftCorner: case Qt::TopLeftCorner:
pos = parentWidget()->geometry().topLeft() + m_offset - QPoint(0, height()); pos += QPoint(0, -height());
break; break;
case Qt::TopRightCorner: case Qt::TopRightCorner:
pos = parentWidget()->geometry().topRight() + m_offset - QPoint(width(), height()); pos += QPoint(parentWidget()->width(), -height());
break; break;
case Qt::BottomRightCorner: case Qt::BottomRightCorner:
pos = parentWidget()->geometry().bottomRight() + m_offset - QPoint(width(), 0); pos += QPoint(parentWidget()->width(), parentWidget()->height());
break; break;
case Qt::BottomLeftCorner:
default: default:
pos = parentWidget()->geometry().bottomLeft() + m_offset; pos += QPoint(0, parentWidget()->height());
break; break;
} }
move(m_parentWindow->mapToGlobal(pos)); move(parentWidget()->mapToGlobal(pos));
} }

View file

@ -37,7 +37,6 @@ protected:
private: private:
void alignWithParent(); void alignWithParent();
QPointer<QWidget> m_parentWindow;
QPointer<QWidget> m_appWindow; QPointer<QWidget> m_appWindow;
QPoint m_offset; QPoint m_offset;