f680bfe3a31ef63c61826814f1d971e39fa6b9f1
New file app/ui/sql_completer.py:
- SqlCompleter (QObject) owns a _CompletionPopup (QListWidget) that
floats above the editor as a ToolTip-style frameless window styled
to match the Catppuccin Mocha theme.
- SQL keyword pool sourced directly from syntax_highlighter._KEYWORDS,
_TYPES, _FUNCTIONS so the two features stay in sync.
- Schema data (tables, views, columns) loaded asynchronously via
SchemaWorker; a generation counter discards stale results when the
database changes rapidly.
- Column loading is lazy: fires only when the user types "table."
(dot-qualified prefix), avoiding upfront cost for wide schemas.
- _extract_prefix() uses a regex to detect both bare words and
"table.col" dot notation; guards against completing inside string
literals by counting unescaped quotes to the left of the cursor.
- _accept_completion() replaces only the typed prefix, preserving any
qualifier already in the document (e.g. "orders.cu" → "orders.customer_id").
Changes to app/ui/sql_editor.py:
- CodeEditor.set_completer() attaches the completer and stores it.
- keyPressEvent priority order:
1. Popup visible → Esc hides, Enter/Tab accepts, Up/Down navigates.
2. Ctrl+Space → force-show completions (1-char minimum).
3. Tab (no popup) → existing 4-space insert behaviour preserved.
4. Ctrl+/ → existing comment-toggle preserved.
5. All other keys → super() then auto-trigger (2-char minimum).
- focusOutEvent hides the popup when the editor loses focus.
- EditorTab._build_ui() creates SqlCompleter, attaches it, and calls
set_context() if a driver is already present.
- EditorTab.set_context() updates driver/database and reloads schema.
- _maybe_invalidate_schema() re-fetches schema after CREATE/DROP/ALTER
so newly created tables appear in completions immediately.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Description
DB Client application
175 KiB
Languages
Python
100%