[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:
Martin Gräßlin 2015-09-17 11:48:26 +02:00
parent 239e702f0f
commit efaa5c5233

View file

@ -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();
}
);
} }
); );
} }