/* * SPDX-License-Identifier: LGPL-2.0-or-later * * The Ollie command-palette plugin for Kate / KTextEditor. * * OlliePlugin is the KTextEditor::Plugin entry point. For every MainWindow the * host creates an OllieView, which registers the "Command Palette (M-x)" action * (Alt+X) and, when triggered, gathers every QAction currently exposed by the * window's GUI clients into a PaletteWidget for orderless fuzzy selection. */ #ifndef KATECUSTOM_OLLIEPLUGIN_H #define KATECUSTOM_OLLIEPLUGIN_H #include #include #include #include #include class QAction; namespace KTextEditor { class MainWindow; } namespace katecustom { class PaletteWidget; class RadialMenu; struct RadialDef; class OlliePlugin : public KTextEditor::Plugin { Q_OBJECT public: explicit OlliePlugin(QObject *parent, const QVariantList &args = {}); ~OlliePlugin() override; QObject *createView(KTextEditor::MainWindow *mainWindow) override; }; class OllieView : public QObject { Q_OBJECT public: OllieView(OlliePlugin *plugin, KTextEditor::MainWindow *mainWindow); ~OllieView() override; private Q_SLOTS: void showCommandPalette(); void runAction(const QString &actionId); private: // One harvested, runnable action with the provenance needed to build a // unique id and to disambiguate labels shared by several commands. struct ActionEntry { QPointer action; QString label; // visible text, ampersands stripped QString component; // owning collection's display name (provenance) QString shortcut; // current shortcut, native text QString id; // unique, stable key used on activation }; // Collect every unique, enabled, visible QAction reachable from the // window's GUI factory clients, deduplicated by pointer identity. QList collectActions() const; // Find a Kate action by its raw objectName across all GUI clients. Used to // resolve radial-menu slice ids (which reference Kate action names). QAction *findActionByName(const QString &objectName) const; // Build the configured radials and bind each to its trigger key. void setupRadials(); void showRadial(int defIndex); // centre on the caret void showRadialAt(int defIndex, const QPoint &globalPos); // centre on a point void onRadialActivated(const QString &actionId); // Catches configured mouse-button gestures inside the active view. bool eventFilter(QObject *obj, QEvent *event) override; KTextEditor::MainWindow *m_mainWindow; PaletteWidget *m_palette = nullptr; RadialMenu *m_radial = nullptr; QList m_radialDefs; QHash m_buttonToRadial; // Qt::MouseButton (int) -> def index bool m_gestureActive = false; // an RMB drag gesture is in progress bool m_leftDownInView = false; // LMB held inside the view (Acme chord anchor) QHash> m_actionsById; }; } // namespace katecustom #endif