53 const QVariant value = engine->property(managerPropertyName);
54 if (
auto *manager = qobject_cast<PlainToolTipManager *>(value.value<QObject *>()))
60 engine->setProperty(managerPropertyName, QVariant::fromValue<QObject *>(manager));
66 if (m_toolTip || !create)
69 QQmlComponent component(m_engine, QUrl(QString::fromLatin1(plainToolTipUrl)));
70 if (!component.isReady()) {
71 reportErrors(component);
75 QObject *
toolTip = component.create();
77 reportErrors(component);
83 connect(
toolTip, SIGNAL(visibleChanged()),
this, SLOT(toolTipVisibleChanged()));
89 return attached && attached == m_current && m_toolTip
90 && m_toolTip->property(
"visible").toBool();
95 QQuickItem *owner = attached ? attached->target() :
nullptr;
100 if (m_current && m_current != attached)
103 m_current = attached;
105 resetProperty(
toolTip,
"width");
106 resetProperty(
toolTip,
"height");
107 toolTip->setProperty(
"parent", QVariant::fromValue(owner));
108 toolTip->setProperty(
"text", text);
111 m_requestedText = text;
112 m_requestedTimeout = timeout;
113 m_showRequested =
true;
121 if (!attached || attached != m_current || !m_toolTip)
124 m_showRequested =
false;
125 if (!QMetaObject::invokeMethod(m_toolTip,
"hide"))
126 qmlWarning(attached->target()) <<
"Failed to invoke PlainToolTip.hide()";
131 if (!attached || attached != m_current)
134 m_showRequested =
false;
136 QMetaObject::invokeMethod(m_toolTip,
"hide");
143 if (!attached || attached != m_current || !m_toolTip
144 || (!m_showRequested && !
isVisible(attached))) {
148 m_toolTip->setProperty(property, value);
149 if (std::strcmp(property,
"text") == 0)
150 m_requestedText = value.toString();
151 else if (std::strcmp(property,
"timeout") == 0)
152 m_requestedTimeout = -1;
153 else if (std::strcmp(property,
"delay") == 0 && m_showRequested
154 && !m_toolTip->property(
"visible").toBool() && m_owner && m_owner->window())
159 void toolTipVisibleChanged()
161 if (m_toolTip && !m_toolTip->property(
"visible").toBool())
162 m_showRequested =
false;
164 m_current->notifyVisibleChanged();
168 void setOwner(QQuickItem *owner)
170 if (m_owner == owner)
173 disconnect(m_owner,
nullptr,
this,
nullptr);
177 connect(m_owner, &QQuickItem::windowChanged,
this, [
this](QQuickWindow *window) {
178 if (window && m_showRequested)
186 if (!m_toolTip || !m_owner || !m_showRequested)
189 if (!QMetaObject::invokeMethod(m_toolTip,
"show", Q_ARG(QString, m_requestedText),
190 Q_ARG(
int, m_requestedTimeout))) {
191 m_showRequested =
false;
192 qmlWarning(m_owner) <<
"Failed to invoke PlainToolTip.show()";
196 void reportErrors(
const QQmlComponent &component)
const
198 const auto errors = component.errors();
199 if (errors.isEmpty()) {
200 qmlWarning(m_engine) <<
"Failed to create PlainToolTip";
203 for (
const auto &error : errors)
204 qmlWarning(m_engine) << error.toString();
207 QPointer<QQmlEngine> m_engine;
208 QPointer<QObject> m_toolTip;
209 QPointer<PlainToolTipAttached> m_current;
210 QPointer<QQuickItem> m_owner;
211 QString m_requestedText;
212 int m_requestedTimeout = -1;
213 bool m_showRequested =
false;