wasm: Fix tooltip visible
Fixes a problem where tooltips only worked for the first instance activated. (cherry picked from commit d69348ed4d659f9408ce74f3b08ee7e9104dde00) Fixes: QTBUG-129234 Change-Id: I45619b1ca8001b74b148b98a8795000630dcacf7 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
parent
9e22cd089e
commit
2bd01602dc
@ -42,9 +42,13 @@ void QWasmWindowTreeNode::onSubtreeChanged(QWasmWindowTreeNodeChangeType changeT
|
|||||||
&& m_childStack.topWindow()
|
&& m_childStack.topWindow()
|
||||||
&& m_childStack.topWindow()->window()) {
|
&& m_childStack.topWindow()->window()) {
|
||||||
|
|
||||||
|
const auto flags = m_childStack.topWindow()->window()->flags();
|
||||||
|
const bool notToolOrPopup = ((flags & Qt::ToolTip) != Qt::ToolTip) && ((flags & Qt::Popup) != Qt::Popup);
|
||||||
const QVariant showWithoutActivating = m_childStack.topWindow()->window()->property("_q_showWithoutActivating");
|
const QVariant showWithoutActivating = m_childStack.topWindow()->window()->property("_q_showWithoutActivating");
|
||||||
if (!showWithoutActivating.isValid() || !showWithoutActivating.toBool())
|
if (!showWithoutActivating.isValid() || !showWithoutActivating.toBool()) {
|
||||||
m_childStack.topWindow()->requestActivateWindow();
|
if (notToolOrPopup)
|
||||||
|
m_childStack.topWindow()->requestActivateWindow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parentNode())
|
if (parentNode())
|
||||||
|
@ -34,6 +34,13 @@ class WidgetTestCase(unittest.TestCase):
|
|||||||
|
|
||||||
w0 = Widget(self._driver, "w0")
|
w0 = Widget(self._driver, "w0")
|
||||||
w0.show()
|
w0.show()
|
||||||
|
w0.showToolTip()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Wait for tooltip to disappear
|
||||||
|
#
|
||||||
|
time.sleep(60)
|
||||||
|
#time.sleep(3600)
|
||||||
self.assertEqual(w0.hasFocus(), True)
|
self.assertEqual(w0.hasFocus(), True)
|
||||||
|
|
||||||
w1 = Widget(self._driver, "w1")
|
w1 = Widget(self._driver, "w1")
|
||||||
@ -63,6 +70,35 @@ class WidgetTestCase(unittest.TestCase):
|
|||||||
|
|
||||||
clearWidgets(self._driver)
|
clearWidgets(self._driver)
|
||||||
|
|
||||||
|
#Looks weird, no asserts, the test is that
|
||||||
|
#the test itself finishes
|
||||||
|
def test_showContextMenu_doesNotDeadlock(self):
|
||||||
|
screen = Screen(self._driver, ScreenPosition.FIXED,
|
||||||
|
x=0, y=0, width=600, height=1200)
|
||||||
|
|
||||||
|
w0 = Widget(self._driver, "w0")
|
||||||
|
w0.show()
|
||||||
|
w0.showToolTip()
|
||||||
|
|
||||||
|
w1 = Widget(self._driver, "w1")
|
||||||
|
w1.setNoFocusShow()
|
||||||
|
w1.show()
|
||||||
|
w1.showToolTip()
|
||||||
|
|
||||||
|
w2 = Widget(self._driver, "w2")
|
||||||
|
w2.show()
|
||||||
|
w2.showToolTip()
|
||||||
|
|
||||||
|
w3 = Widget(self._driver, "w3")
|
||||||
|
w3.setNoFocusShow()
|
||||||
|
w3.show()
|
||||||
|
w3.showToolTip()
|
||||||
|
|
||||||
|
w3.activate();
|
||||||
|
w3.showToolTip();
|
||||||
|
|
||||||
|
clearWidgets(self._driver)
|
||||||
|
|
||||||
def test_window_resizing(self):
|
def test_window_resizing(self):
|
||||||
screen = Screen(self._driver, ScreenPosition.FIXED,
|
screen = Screen(self._driver, ScreenPosition.FIXED,
|
||||||
x=0, y=0, width=600, height=600)
|
x=0, y=0, width=600, height=600)
|
||||||
@ -641,6 +677,19 @@ class Widget:
|
|||||||
'''
|
'''
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def showContextMenu(self):
|
||||||
|
self.driver.execute_script(
|
||||||
|
f'''
|
||||||
|
instance.showContextMenuWidget('{self.name}');
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
def showToolTip(self):
|
||||||
|
self.driver.execute_script(
|
||||||
|
f'''
|
||||||
|
instance.showToolTipWidget('{self.name}');
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
class Window:
|
class Window:
|
||||||
def __init__(self, parent=None, rect=None, title=None, element=None, visible=True, opengl=0):
|
def __init__(self, parent=None, rect=None, title=None, element=None, visible=True, opengl=0):
|
||||||
|
@ -16,6 +16,12 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QSysInfo>
|
#include <QSysInfo>
|
||||||
|
#include <QTreeView>
|
||||||
|
#include <QFileSystemModel>
|
||||||
|
#include <QScrollArea>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QToolTip>
|
||||||
|
|
||||||
#include <QOpenGLWindow>
|
#include <QOpenGLWindow>
|
||||||
#include <QOpenGLFunctions>
|
#include <QOpenGLFunctions>
|
||||||
@ -46,6 +52,25 @@ class TestWidget : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// We override to be able to test that the contextMenu
|
||||||
|
// calls popup and not exec. Calling exec locks the
|
||||||
|
// test.
|
||||||
|
class TestSpinBox : public QSpinBox
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
TestSpinBox(QWidget *parent = nullptr) : QSpinBox(parent) { }
|
||||||
|
|
||||||
|
void ShowContextMenu()
|
||||||
|
{
|
||||||
|
QContextMenuEvent event(QContextMenuEvent::Reason::Mouse, QPoint(0, geometry().bottom()),
|
||||||
|
mapToGlobal(QPoint(0, geometry().bottom())), Qt::NoModifier);
|
||||||
|
|
||||||
|
contextMenuEvent(&event);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class TestWindow : public QRasterWindow, public TestWindowBase
|
class TestWindow : public QRasterWindow, public TestWindowBase
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -378,10 +403,10 @@ public:
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QLineEdit *findEdit(const std::string &name)
|
TestSpinBox *findSpinBox(const std::string &name)
|
||||||
{
|
{
|
||||||
auto it = m_lineEdits.find(name);
|
auto it = m_spinBoxes.find(name);
|
||||||
if (it != m_lineEdits.end())
|
if (it != m_spinBoxes.end())
|
||||||
return it->second;
|
return it->second;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -389,17 +414,45 @@ public:
|
|||||||
void make(const std::string &name)
|
void make(const std::string &name)
|
||||||
{
|
{
|
||||||
auto widget = std::make_shared<TestWidget>();
|
auto widget = std::make_shared<TestWidget>();
|
||||||
auto *lineEdit = new QLineEdit(widget.get());
|
|
||||||
|
widget->setWindowTitle("Dialog");
|
||||||
|
auto spinBox = new TestSpinBox(widget.get());
|
||||||
|
spinBox->setToolTip(QString(u"A ToolTip"));
|
||||||
|
|
||||||
widget->setMinimumSize(200, 200);
|
widget->setMinimumSize(200, 200);
|
||||||
widget->setMaximumSize(200, 200);
|
widget->setMaximumSize(200, 200);
|
||||||
widget->setGeometry(0, m_widgetY, 200, 200);
|
widget->setGeometry(0, m_widgetY, 200, 200);
|
||||||
m_widgetY += 200;
|
m_widgetY += 200;
|
||||||
|
|
||||||
lineEdit->setText("Hello world");
|
m_widgets[name] = widget;
|
||||||
|
m_spinBoxes[name] = spinBox;
|
||||||
|
}
|
||||||
|
void showContextMenu(const std::string &name)
|
||||||
|
{
|
||||||
|
TestSpinBox *spinBox = findSpinBox(name);
|
||||||
|
if (spinBox)
|
||||||
|
spinBox->ShowContextMenu();
|
||||||
|
}
|
||||||
|
void showToolTip(const std::string &name)
|
||||||
|
{
|
||||||
|
TestSpinBox *spinBox = findSpinBox(name);
|
||||||
|
if (spinBox)
|
||||||
|
QToolTip::showText(spinBox->mapToGlobal(QPoint(0, 0)), spinBox->toolTip());
|
||||||
|
}
|
||||||
|
void makeNative(const std::string &name)
|
||||||
|
{
|
||||||
|
auto widget = std::make_shared<TestWidget>();
|
||||||
|
widget->setWindowTitle("Dialog");
|
||||||
|
auto spinBox = new TestSpinBox(widget.get());
|
||||||
|
spinBox->setToolTip(QString(u"A ToolTip"));
|
||||||
|
|
||||||
|
widget->setMinimumSize(200, 200);
|
||||||
|
widget->setMaximumSize(200, 200);
|
||||||
|
widget->setGeometry(0, m_widgetY, 200, 200);
|
||||||
|
m_widgetY += 200;
|
||||||
|
|
||||||
m_widgets[name] = widget;
|
m_widgets[name] = widget;
|
||||||
m_lineEdits[name] = lineEdit;
|
m_spinBoxes[name] = spinBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -407,7 +460,7 @@ private:
|
|||||||
|
|
||||||
static WidgetStorage * s_instance;
|
static WidgetStorage * s_instance;
|
||||||
std::map<std::string, TestWidgetPtr> m_widgets;
|
std::map<std::string, TestWidgetPtr> m_widgets;
|
||||||
std::map<std::string, QLineEdit *> m_lineEdits;
|
std::map<std::string, TestSpinBox *> m_spinBoxes;
|
||||||
int m_widgetY = 0;
|
int m_widgetY = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -503,6 +556,21 @@ void createWidget(const std::string &name)
|
|||||||
WidgetStorage::getInstance()->make(name);
|
WidgetStorage::getInstance()->make(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void createNativeWidget(const std::string &name)
|
||||||
|
{
|
||||||
|
WidgetStorage::getInstance()->makeNative(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void showContextMenuWidget(const std::string &name)
|
||||||
|
{
|
||||||
|
WidgetStorage::getInstance()->showContextMenu(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void showToolTipWidget(const std::string &name)
|
||||||
|
{
|
||||||
|
WidgetStorage::getInstance()->showToolTip(name);
|
||||||
|
}
|
||||||
|
|
||||||
void setWidgetNoFocusShow(const std::string &name)
|
void setWidgetNoFocusShow(const std::string &name)
|
||||||
{
|
{
|
||||||
auto w = WidgetStorage::getInstance()->findWidget(name);
|
auto w = WidgetStorage::getInstance()->findWidget(name);
|
||||||
@ -520,9 +588,9 @@ void showWidget(const std::string &name)
|
|||||||
void hasWidgetFocus(const std::string &name)
|
void hasWidgetFocus(const std::string &name)
|
||||||
{
|
{
|
||||||
bool focus = false;
|
bool focus = false;
|
||||||
auto le = WidgetStorage::getInstance()->findEdit(name);
|
auto spinBox = WidgetStorage::getInstance()->findSpinBox(name);
|
||||||
if (le)
|
if (spinBox)
|
||||||
focus = le->hasFocus();
|
focus = spinBox->hasFocus();
|
||||||
|
|
||||||
emscripten::val::global("window").call<void>("hasWidgetFocusCallback",
|
emscripten::val::global("window").call<void>("hasWidgetFocusCallback",
|
||||||
emscripten::val(focus));
|
emscripten::val(focus));
|
||||||
@ -678,6 +746,9 @@ EMSCRIPTEN_BINDINGS(qwasmwindow)
|
|||||||
emscripten::function("getOpenGLColorAt_0_0", &getOpenGLColorAt_0_0);
|
emscripten::function("getOpenGLColorAt_0_0", &getOpenGLColorAt_0_0);
|
||||||
|
|
||||||
emscripten::function("createWidget", &createWidget);
|
emscripten::function("createWidget", &createWidget);
|
||||||
|
emscripten::function("createNativeWidget", &createNativeWidget);
|
||||||
|
emscripten::function("showContextMenuWidget", &showContextMenuWidget);
|
||||||
|
emscripten::function("showToolTipWidget", &showToolTipWidget);
|
||||||
emscripten::function("setWidgetNoFocusShow", &setWidgetNoFocusShow);
|
emscripten::function("setWidgetNoFocusShow", &setWidgetNoFocusShow);
|
||||||
emscripten::function("showWidget", &showWidget);
|
emscripten::function("showWidget", &showWidget);
|
||||||
emscripten::function("activateWidget", &activateWidget);
|
emscripten::function("activateWidget", &activateWidget);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user