From 85b2fe24a257b1c3371e90a514b380f12f817da5 Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 20 Dec 2025 19:50:28 +0200 Subject: [PATCH] SearchReplaceBar QoL: * Shifted text editor viewport appropriately when opening/closing bar * Bar is now maintained across multiple script tabs with its focus * Can open bar without having main editor viewport focused --- .../client/gui/util/GuiScriptTextArea.java | 28 +++++++++++++++---- .../gui/util/script/SearchReplaceBar.java | 22 +++++++++++---- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java index 45a9888bd..7befbf6d3 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -161,6 +161,14 @@ public class GuiScriptTextArea extends GuiNpcTextField { public void onMatchesUpdated() { // Called when matches change - could be used for UI updates } + + // Shift text editor viewport up or down bar + public void resizeEditor(boolean open) { + int scrollHeight = searchBar.getTotalHeight(); + GuiScriptTextArea.this.y += open ? scrollHeight : -scrollHeight; + GuiScriptTextArea.this.height += open ? -scrollHeight : scrollHeight; + container.visibleLines = Math.max(GuiScriptTextArea.this.height / container.lineHeight - 1, 1); + } }); // Initialize Go To Line dialog with callback this.goToLineDialog = new GoToLineDialog(new GoToLineDialog.GoToLineCallback() { @@ -247,6 +255,12 @@ public class GuiScriptTextArea extends GuiNpcTextField { // Initialize search bar (preserves state across initGui calls) searchBar.initGui(x, y, width); + if (searchBar.isVisible()) { // If open + // Shift viewport down again + searchBar.callback.resizeEditor(true); + if (!active) // Focus search if opening another script tab & bar is open + searchBar.focus(false); + } // Initialize Go To Line dialog goToLineDialog.initGui(x, y, width); @@ -587,8 +601,6 @@ public class GuiScriptTextArea extends GuiNpcTextField { goToLineDialog.draw(xMouse, yMouse); KEYS_OVERLAY.draw(xMouse, yMouse, wheelDelta); - // y -= searchHeight; - // height += searchHeight; } private void scissorViewport() { @@ -855,11 +867,15 @@ public class GuiScriptTextArea extends GuiNpcTextField { } } }); - + + + // Check if can open just for SearchReplaceBar and GoToLine + Supplier openBoxes = () -> !KEYS_OVERLAY.showOverlay; + // SEARCH: Open search bar (Ctrl+R) // Works in search bar. KEYS.SEARCH.setTask(e -> { - if (!e.isPress() || !isActive.get() && !searchBar.isVisible()) + if (!e.isPress() || !openBoxes.get()) return; unfocusAll(); @@ -869,7 +885,7 @@ public class GuiScriptTextArea extends GuiNpcTextField { // SEARCH_REPLACE: Open search+replace bar (Ctrl+Shift+R) // Works in search bar. KEYS.SEARCH_REPLACE.setTask(e -> { - if (!e.isPress() || !isActive.get() && !searchBar.isVisible()) + if (!e.isPress() || !openBoxes.get()) return; unfocusAll(); @@ -879,7 +895,7 @@ public class GuiScriptTextArea extends GuiNpcTextField { // GO_TO_LINE: Open go to line dialog (Ctrl+G) // Works in search bar. KEYS.GO_TO_LINE.setTask(e -> { - if (!e.isPress() || !isActive.get() && !searchBar.isVisible()) + if (!e.isPress() || !openBoxes.get()) return; unfocusAll(); diff --git a/src/main/java/noppes/npcs/client/gui/util/script/SearchReplaceBar.java b/src/main/java/noppes/npcs/client/gui/util/script/SearchReplaceBar.java index da0eacde4..b85efe52d 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/SearchReplaceBar.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/SearchReplaceBar.java @@ -98,7 +98,7 @@ public class SearchReplaceBar { private boolean lastClickWasSearch = true; // ==================== CALLBACK ==================== - private SearchCallback callback; + public SearchCallback callback; private final FontRenderer font = Minecraft.getMinecraft().fontRenderer; @@ -116,6 +116,7 @@ public class SearchReplaceBar { void unfocusMainEditor(); void focusMainEditor(); void onMatchesUpdated(); // Called when matches change (for undo/redo sync) + void resizeEditor(boolean open); } public SearchReplaceBar() { @@ -140,16 +141,18 @@ public class SearchReplaceBar { * Open search bar (Ctrl+R) */ public void openSearch() { + boolean oldVisible = this.visible; visible = true; showReplace = false; searchFieldFocused = true; replaceFieldFocused = false; if (callback != null) { + if (!oldVisible) //if wasnt open before, do it once. + callback.resizeEditor(true); callback.unfocusMainEditor(); String highlight = callback.getHighlightedWord(); - if (highlight != null) { + if (highlight != null) searchText = highlight; - } } searchSelectionStart = 0; searchSelectionEnd = searchText.length(); @@ -170,12 +173,21 @@ public class SearchReplaceBar { * Close the search bar and restore focus to main editor */ public void close() { + if (callback != null) { + callback.resizeEditor(false); + callback.focusMainEditor(); + } visible = false; searchFieldFocused = false; replaceFieldFocused = false; - if (callback != null) callback.focusMainEditor(); } - + + public void focus(boolean replace) { + if (replace) + replaceFieldFocused = true; + else + searchFieldFocused = true; + } /** * Unfocus the search bar (when clicking main editor) */