Rename the C++ namespace katecustom -> deft and include guards
KATECUSTOM_* -> DEFT_* across all sources. Rename the plugin artifact
olliepalette.so -> deft.so (CMake target 'deft') and set the plugin
display name to 'Deft'. Update README title/install paths.
File names, class names (Ollie*), and the src/ directory grouping are
left for the follow-up stages that split features into per-plugin .so's
([deft:nineify] / [deft:util]).
The opening RMB press leaves an implicit mouse grab on the editor view, so
move/release events during the hold were delivered there, never to the
popup's grabMouse(). Hover froze and the release resolved at a stale
position (always landing on 'More').
Drive the whole gesture from the plugin's application event filter instead,
which reliably sees those events: on press show the radial and set
m_gestureActive; forward each MouseMove to driveHoverGlobal() and the
MouseButtonRelease to driveReleaseGlobal(), both in global coordinates
mapped locally by the widget. The widget's own mouse handlers are gated off
during this external drive (m_externalDrive) to avoid double-handling, and
the manual grabMouse()/releaseMouse() is removed. Key-triggered radials keep
using the widget's local click handling. All 5 ctest suites green.
The radial now supports both intended interactions from one widget:
- Hold-and-drag: opened with a button held, drag toward a slice and release
to trigger the slice under the cursor (far flicks allowed).
- Release-and-click: a quick press/release that never leaves the centre dead
zone switches to click mode and keeps the menu open; then hover and click a
slice to trigger. A click outside the ring cancels instead of snapping.
Armed state is detected from QApplication::mouseButtons() at popup time, so
key-triggered radials start directly in click mode. mousePressEvent is
accepted to stop a Qt::Popup from self-dismissing on an in-widget press. The
menu opens centred on the given point; the RMB press is consumed upstream so
the caret does not move. All 5 ctest suites green.
- RadialModel: pure tree + geometry (angle hit-test, dead zone, far-flick
snap, descend/ascend). 14 tests.
- RadialMenu: frameless translucent widget painting the current ring with
wedges, labels, branch markers and a central back/cancel hub; mouse hover
highlights, release/click activates a leaf, descends a branch, or
ascends/cancels from the hub; Esc ascends/cancels.
- RadialConfig: JSON -> radial tree parser with a built-in default, so
multiple radials can bind to different triggers. 8 tests.
- Plugin wiring: one trigger action per configured radial (default Alt+R ->
editing radial), popped at the caret via cursorPositionCoordinates().
Slices reference Kate actions by objectName (resolved via findActionByName);
the special ollie_command_palette slice opens the palette.
Honours the agreed model (keys/weapon-wheel triggers now; config carries a
per-radial trigger for mouse-button/gesture triggers later). All 5 ctest
suites green (36 tests).