[tools] Simulate a panel tooltip
On entered on the panel window we show a tooltip at the entered position and make it follow the mouse.
This commit is contained in:
parent
239e702f0f
commit
efaa5c5233
1 changed files with 71 additions and 0 deletions
|
@ -58,6 +58,9 @@ public:
|
||||||
private:
|
private:
|
||||||
void setupRegistry(Registry *registry);
|
void setupRegistry(Registry *registry);
|
||||||
void render();
|
void render();
|
||||||
|
void showTooltip(const QPointF &pos);
|
||||||
|
void hideTooltip();
|
||||||
|
void moveTooltip(const QPointF &pos);
|
||||||
QThread *m_connectionThread;
|
QThread *m_connectionThread;
|
||||||
ConnectionThread *m_connectionThreadObject;
|
ConnectionThread *m_connectionThreadObject;
|
||||||
EventQueue *m_eventQueue = nullptr;
|
EventQueue *m_eventQueue = nullptr;
|
||||||
|
@ -70,6 +73,12 @@ private:
|
||||||
PlasmaShell *m_plasmaShell = nullptr;
|
PlasmaShell *m_plasmaShell = nullptr;
|
||||||
PlasmaShellSurface *m_plasmaShellSurface = nullptr;
|
PlasmaShellSurface *m_plasmaShellSurface = nullptr;
|
||||||
PlasmaWindowManagement *m_windowManagement = nullptr;
|
PlasmaWindowManagement *m_windowManagement = nullptr;
|
||||||
|
struct {
|
||||||
|
Surface *surface = nullptr;
|
||||||
|
ShellSurface *shellSurface = nullptr;
|
||||||
|
PlasmaShellSurface *plasmaSurface = nullptr;
|
||||||
|
bool visible = false;
|
||||||
|
} m_tooltip;
|
||||||
};
|
};
|
||||||
|
|
||||||
PanelTest::PanelTest(QObject *parent)
|
PanelTest::PanelTest(QObject *parent)
|
||||||
|
@ -104,6 +113,48 @@ void PanelTest::init()
|
||||||
m_connectionThreadObject->initConnection();
|
m_connectionThreadObject->initConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PanelTest::showTooltip(const QPointF &pos)
|
||||||
|
{
|
||||||
|
if (!m_tooltip.surface) {
|
||||||
|
m_tooltip.surface = m_compositor->createSurface(this);
|
||||||
|
m_tooltip.shellSurface = m_shell->createSurface(m_tooltip.surface, this);
|
||||||
|
if (m_plasmaShell) {
|
||||||
|
m_tooltip.plasmaSurface = m_plasmaShell->createSurface(m_tooltip.surface, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_tooltip.shellSurface->setTransient(m_surface, pos.toPoint());
|
||||||
|
|
||||||
|
if (!m_tooltip.visible) {
|
||||||
|
const QSize size(100, 50);
|
||||||
|
auto buffer = m_shm->getBuffer(size, size.width() * 4).toStrongRef();
|
||||||
|
buffer->setUsed(true);
|
||||||
|
QImage image(buffer->address(), size.width(), size.height(), QImage::Format_ARGB32_Premultiplied);
|
||||||
|
image.fill(Qt::red);
|
||||||
|
|
||||||
|
m_tooltip.surface->attachBuffer(*buffer);
|
||||||
|
m_tooltip.surface->damage(QRect(QPoint(0, 0), size));
|
||||||
|
m_tooltip.surface->commit(Surface::CommitFlag::None);
|
||||||
|
m_tooltip.visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PanelTest::hideTooltip()
|
||||||
|
{
|
||||||
|
if (!m_tooltip.visible) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_tooltip.surface->attachBuffer(Buffer::Ptr());
|
||||||
|
m_tooltip.surface->commit(Surface::CommitFlag::None);
|
||||||
|
m_tooltip.visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PanelTest::moveTooltip(const QPointF &pos)
|
||||||
|
{
|
||||||
|
if (m_tooltip.plasmaSurface) {
|
||||||
|
m_tooltip.plasmaSurface->setPosition(QPoint(10, 0) + pos.toPoint());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PanelTest::setupRegistry(Registry *registry)
|
void PanelTest::setupRegistry(Registry *registry)
|
||||||
{
|
{
|
||||||
connect(registry, &Registry::compositorAnnounced, this,
|
connect(registry, &Registry::compositorAnnounced, this,
|
||||||
|
@ -147,6 +198,26 @@ void PanelTest::setupRegistry(Registry *registry)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
connect(p, &Pointer::entered, this,
|
||||||
|
[this, p] (quint32 serial, const QPointF &relativeToSurface) {
|
||||||
|
Q_UNUSED(serial)
|
||||||
|
if (p->enteredSurface() == m_surface) {
|
||||||
|
showTooltip(relativeToSurface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
connect(p, &Pointer::motion, this,
|
||||||
|
[this, p] (const QPointF &relativeToSurface) {
|
||||||
|
if (p->enteredSurface() == m_surface) {
|
||||||
|
moveTooltip(relativeToSurface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
connect(p, &Pointer::left, this,
|
||||||
|
[this] {
|
||||||
|
hideTooltip();
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue