diff --git a/editor/src/BufferOps.h b/editor/src/BufferOps.h index 2f6a43d..f51c7d5 100644 --- a/editor/src/BufferOps.h +++ b/editor/src/BufferOps.h @@ -305,6 +305,7 @@ inline void EditorState::applySession(const SessionData& session) { inline void EditorState::applySettingsToState() { ui.showMinimap = settings.getShowMinimap(); + ui.showCompletionHelper = settings.getShowCompletionHelper(); ui.showLineNumbers = settings.getShowLineNumbers(); ui.layoutPreset = LayoutManager::presetFromName(settings.getLayoutPreset()); keys.setProfile(KeybindingManager::profileFromName(settings.getKeybindingProfile())); @@ -320,6 +321,7 @@ inline void EditorState::loadSettingsFromDisk() { inline void EditorState::saveSettingsToDisk() { settings.setShowMinimap(ui.showMinimap); + settings.setShowCompletionHelper(ui.showCompletionHelper); settings.setShowLineNumbers(ui.showLineNumbers); settings.setLayoutPreset(LayoutManager::presetName(ui.layoutPreset)); settings.setKeybindingProfile(KeybindingManager::profileName(keys.getProfile())); diff --git a/editor/src/SettingsManager.h b/editor/src/SettingsManager.h index 76a531a..63f48ff 100644 --- a/editor/src/SettingsManager.h +++ b/editor/src/SettingsManager.h @@ -54,6 +54,8 @@ public: void setAutoSaveSeconds(int seconds) { autoSaveSeconds_ = seconds; } bool getShowMinimap() const { return showMinimap_; } void setShowMinimap(bool value) { showMinimap_ = value; } + bool getShowCompletionHelper() const { return showCompletionHelper_; } + void setShowCompletionHelper(bool value) { showCompletionHelper_ = value; } bool getShowLineNumbers() const { return showLineNumbers_; } void setShowLineNumbers(bool value) { showLineNumbers_ = value; } bool getReduceMotion() const { return reduceMotion_; } @@ -101,6 +103,7 @@ public: updateUrl_ = j.value("updateUrl", updateUrl_); autoSaveSeconds_ = j.value("autoSaveSeconds", autoSaveSeconds_); showMinimap_ = j.value("showMinimap", showMinimap_); + showCompletionHelper_ = j.value("showCompletionHelper", showCompletionHelper_); showLineNumbers_ = j.value("showLineNumbers", showLineNumbers_); reduceMotion_ = j.value("reduceMotion", reduceMotion_); useAnnotationShapes_ = j.value("useAnnotationShapes", useAnnotationShapes_); @@ -149,6 +152,7 @@ public: j["updateUrl"] = updateUrl_; j["autoSaveSeconds"] = autoSaveSeconds_; j["showMinimap"] = showMinimap_; + j["showCompletionHelper"] = showCompletionHelper_; j["showLineNumbers"] = showLineNumbers_; j["reduceMotion"] = reduceMotion_; j["useAnnotationShapes"] = useAnnotationShapes_; @@ -234,6 +238,7 @@ private: std::string updateUrl_ = "https://example.com/whetstone/releases.json"; int autoSaveSeconds_ = 0; bool showMinimap_ = false; + bool showCompletionHelper_ = false; bool showLineNumbers_ = true; bool reduceMotion_ = false; bool useAnnotationShapes_ = true; diff --git a/editor/src/panels/EditorPanel.h b/editor/src/panels/EditorPanel.h index db1ef24..bb0efaa 100644 --- a/editor/src/panels/EditorPanel.h +++ b/editor/src/panels/EditorPanel.h @@ -321,12 +321,19 @@ static void renderEditorPanel(EditorState& state) { } if (res.changed) { state.onTextChanged(); - state.completionPending = true; - state.completionLastChange = ImGui::GetTime(); - state.completionVisible = false; - state.completionDismissed = false; - state.completionSelected = 0; - if (state.lsp) state.lsp->clearCompletionItems(); + if (state.ui.showCompletionHelper) { + state.completionPending = true; + state.completionLastChange = ImGui::GetTime(); + state.completionVisible = false; + state.completionDismissed = false; + state.completionSelected = 0; + if (state.lsp) state.lsp->clearCompletionItems(); + } else { + state.completionPending = false; + state.completionVisible = false; + state.completionDismissed = false; + if (state.lsp) state.lsp->clearCompletionItems(); + } if (state.lsp && state.active() && state.active()->path.rfind("(untitled", 0) != 0) { int cursor = state.active()->widget.getCursor(); if (cursor > 0 && state.active()->editBuf[cursor - 1] == '(') { @@ -356,7 +363,9 @@ static void renderEditorPanel(EditorState& state) { } double now = ImGui::GetTime(); - if (state.completionPending && (now - state.completionLastChange) > 0.2) { + if (state.ui.showCompletionHelper && + state.completionPending && + (now - state.completionLastChange) > 0.2) { if (state.lsp && state.active() && state.active()->path.rfind("(untitled", 0) != 0) { int lineZero = std::max(0, state.active()->cursorLine - 1); int colZero = std::max(0, state.active()->cursorCol - 1); @@ -403,7 +412,7 @@ static void renderEditorPanel(EditorState& state) { state.analysisPending = false; } - if (state.lsp && state.active()) { + if (state.ui.showCompletionHelper && state.lsp && state.active()) { auto items = state.lsp->getCompletionItems(); int cursor = state.active()->widget.getCursor(); std::string prefix = EditorState::wordPrefixAt(state.active()->editBuf, cursor); @@ -525,6 +534,11 @@ static void renderEditorPanel(EditorState& state) { } } } + if (!state.ui.showCompletionHelper) { + state.completionPending = false; + state.completionVisible = false; + state.completionDismissed = false; + } if (state.showSuggestionPopup) { if (ImGui::BeginPopupModal("SuggestionPopup", &state.showSuggestionPopup, ImGuiWindowFlags_AlwaysAutoResize)) { diff --git a/editor/src/panels/MenuBarPanel.h b/editor/src/panels/MenuBarPanel.h index 647c6d3..a85dabc 100644 --- a/editor/src/panels/MenuBarPanel.h +++ b/editor/src/panels/MenuBarPanel.h @@ -90,6 +90,7 @@ static void renderMenuBar(EditorState& state) { if (ImGui::BeginMenu("View")) { ImGui::MenuItem("Show Whitespace", nullptr, &state.ui.showWhitespace); ImGui::MenuItem("Show Minimap", nullptr, &state.ui.showMinimap); + ImGui::MenuItem("Inline Completion Helper", nullptr, &state.ui.showCompletionHelper); ImGui::MenuItem("Show Annotations", nullptr, &state.ui.showAnnotations); ImGui::MenuItem("Show Outline", nullptr, &state.ui.showOutline); ImGui::MenuItem("Terminal", state.keys.getBinding("view.toggleTerminal").toString().c_str(), diff --git a/editor/src/panels/SettingsPanel.h b/editor/src/panels/SettingsPanel.h index 5af7065..f77c303 100644 --- a/editor/src/panels/SettingsPanel.h +++ b/editor/src/panels/SettingsPanel.h @@ -339,6 +339,17 @@ static void renderSettingsPanel(EditorState& state) { state.ui.showMinimap = showMinimap; settingsChanged = true; } + bool showCompletionHelper = state.ui.showCompletionHelper; + if (ImGui::Checkbox("Inline Completion Helper", &showCompletionHelper)) { + state.ui.showCompletionHelper = showCompletionHelper; + if (!showCompletionHelper) { + state.completionPending = false; + state.completionVisible = false; + state.completionDismissed = false; + if (state.lsp) state.lsp->clearCompletionItems(); + } + settingsChanged = true; + } bool showLineNumbers = state.ui.showLineNumbers; if (ImGui::Checkbox("Show Line Numbers", &showLineNumbers)) { state.ui.showLineNumbers = showLineNumbers; diff --git a/editor/src/state/UIFlags.h b/editor/src/state/UIFlags.h index 1f36259..5b4a081 100644 --- a/editor/src/state/UIFlags.h +++ b/editor/src/state/UIFlags.h @@ -12,6 +12,7 @@ enum class FocusRegion { struct UIFlags { bool showWhitespace = false; bool showMinimap = false; + bool showCompletionHelper = false; bool showAnnotations = false; bool showOutline = true; bool showLineNumbers = true; diff --git a/progress.md b/progress.md index a38ddef..c8010cc 100644 --- a/progress.md +++ b/progress.md @@ -5318,6 +5318,25 @@ confirming with Enter/Tab). - `step54_test` — PASS (10/10) regression coverage - `step437_test` — PASS (8/8) regression coverage +### Hotfix E: inline completion helper default-off + toggle +**Status:** PASS (helper now opt-in) + +Changed inline completion helper to default OFF and only appear when explicitly +enabled by the user. + +**Files modified:** +- `editor/src/state/UIFlags.h` — added `showCompletionHelper` UI flag (default `false`) +- `editor/src/SettingsManager.h` — added persisted `showCompletionHelper` setting +- `editor/src/BufferOps.h` — synced `showCompletionHelper` with settings load/save +- `editor/src/panels/MenuBarPanel.h` — View toggle: `Inline Completion Helper` +- `editor/src/panels/SettingsPanel.h` — Settings checkbox and cleanup on disable +- `editor/src/panels/EditorPanel.h` — gated completion requests/rendering behind toggle + +**Verification run:** +- `cmake --build editor/build-native --target whetstone_editor` — PASS +- `step54_test` — PASS (10/10) regression coverage +- `step437_test` — PASS (8/8) regression coverage + # Roadmap Planning — Sprints 12-25+ ## Status: Planning Complete (Sprints 12-19 detailed, 20-25 in roadmap.md)