From df210367e07406c93848e1629281c49b97d49308 Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 20 Dec 2025 00:57:36 +0200 Subject: [PATCH 1/6] Fixed search bar closing when goToLine pane opens --- .../npcs/client/gui/util/GuiScriptTextArea.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 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 3fe7de850..56cc1d5fc 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -816,26 +816,23 @@ public class GuiScriptTextArea extends GuiNpcTextField { // SEARCH: Open search bar (Ctrl+R) KEYS.SEARCH.setTask(e -> { - if (!e.isPress() || !active || !isEnabled()) + if (!e.isPress() || !isActive.get()) return; searchBar.toggle(); }); // SEARCH_REPLACE: Open search+replace bar (Ctrl+Shift+R) KEYS.SEARCH_REPLACE.setTask(e -> { - if (!e.isPress() || !active || !isEnabled()) + if (!e.isPress() || !isActive.get()) return; searchBar.toggleReplace(); }); // GO_TO_LINE: Open go to line dialog (Ctrl+G) KEYS.GO_TO_LINE.setTask(e -> { - if (!e.isPress() || !active || !isEnabled()) + if (!e.isPress() || !isActive.get()) return; - // Close search bar if open - if (searchBar.isVisible()) { - searchBar.close(); - } + goToLineDialog.toggle(); }); } From 1c7f614c3f224b4151f1a38ec6ca74141771d9b6 Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 20 Dec 2025 01:04:31 +0200 Subject: [PATCH 2/6] Highlighted search match words if search bar is visible --- .../client/gui/util/GuiScriptTextArea.java | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 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 56cc1d5fc..65fc0680a 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -440,31 +440,33 @@ public class GuiScriptTextArea extends GuiNpcTextField { } // Highlight search matches - List searchMatches = searchBar.getMatches(); - int currentMatchIdx = searchBar.getCurrentMatchIndex(); - for (int mi = 0; mi < searchMatches.size(); mi++) { - int[] match = searchMatches.get(mi); - // Check if match overlaps with this line - if (match[1] > data.start && match[0] < data.end) { - int matchStart = Math.max(match[0] - data.start, 0); - int matchEnd = Math.min(match[1] - data.start, line.length()); - if (matchStart < matchEnd) { - int s = ClientProxy.Font.width(line.substring(0, matchStart)); - int e = ClientProxy.Font.width(line.substring(0, matchEnd)) + 1; - boolean isExcluded = searchBar.isMatchExcluded(mi); - // Current match gets brighter highlight, others get dimmer - int highlightColor = (mi == currentMatchIdx) ? 0xBB4488ff : 0x662266aa; - if (isExcluded) { - highlightColor = 0x33666666; // Dimmer for excluded matches - } - int highlightX = x + LINE_NUMBER_GUTTER_WIDTH + 1 + s; - int highlightEndX = x + LINE_NUMBER_GUTTER_WIDTH + 1 + e; - drawRect(highlightX, posY, highlightEndX, posY + container.lineHeight, highlightColor); - - // Draw strikethrough line for excluded matches - if (isExcluded) { - int strikeY = posY + container.lineHeight / 2; - drawRect(highlightX, strikeY, highlightEndX, strikeY + 1, 0xFFaa4444); + if (searchBar.isVisible()) { + List searchMatches = searchBar.getMatches(); + int currentMatchIdx = searchBar.getCurrentMatchIndex(); + for (int mi = 0; mi < searchMatches.size(); mi++) { + int[] match = searchMatches.get(mi); + // Check if match overlaps with this line + if (match[1] > data.start && match[0] < data.end) { + int matchStart = Math.max(match[0] - data.start, 0); + int matchEnd = Math.min(match[1] - data.start, line.length()); + if (matchStart < matchEnd) { + int s = ClientProxy.Font.width(line.substring(0, matchStart)); + int e = ClientProxy.Font.width(line.substring(0, matchEnd)) + 1; + boolean isExcluded = searchBar.isMatchExcluded(mi); + // Current match gets brighter highlight, others get dimmer + int highlightColor = (mi == currentMatchIdx) ? 0xBB4488ff : 0x662266aa; + if (isExcluded) { + highlightColor = 0x33666666; // Dimmer for excluded matches + } + int highlightX = x + LINE_NUMBER_GUTTER_WIDTH + 1 + s; + int highlightEndX = x + LINE_NUMBER_GUTTER_WIDTH + 1 + e; + drawRect(highlightX, posY, highlightEndX, posY + container.lineHeight, highlightColor); + + // Draw strikethrough line for excluded matches + if (isExcluded) { + int strikeY = posY + container.lineHeight / 2; + drawRect(highlightX, strikeY, highlightEndX, strikeY + 1, 0xFFaa4444); + } } } } From cf1afc9fcaa78c13f4413ca3b09a8e1a85d9cf1e Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 20 Dec 2025 02:00:13 +0200 Subject: [PATCH 3/6] Fixed mouse click being on main text area when search bar open (still WIP) --- .../noppes/npcs/client/gui/util/GuiScriptTextArea.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 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 65fc0680a..cf799ca76 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -313,7 +313,8 @@ public class GuiScriptTextArea extends GuiNpcTextField { doubleClicked = false; tripleClicked = false; } - + // y += searchHeight; + // height -= searchHeight; // Calculate braces next to cursor to highlight int startBracket = 0, endBracket = 0; if (selection.getStartSelection() >= 0 && text != null && text.length() > 0 && @@ -557,8 +558,8 @@ public class GuiScriptTextArea extends GuiNpcTextField { goToLineDialog.draw(xMouse, yMouse); KEYS_OVERLAY.draw(xMouse, yMouse, wheelDelta); - y -= searchHeight; - height += searchHeight; + // y -= searchHeight; + // height += searchHeight; } private void scissorViewport() { From abd639438e68514196870d0be2877f0d35c869ae Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 20 Dec 2025 02:00:58 +0200 Subject: [PATCH 4/6] Fixed search bar matches not updating when new text updates happen in main editor --- .../java/noppes/npcs/client/gui/util/GuiScriptTextArea.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 cf799ca76..ba63f5e09 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -86,7 +86,7 @@ public class GuiScriptTextArea extends GuiNpcTextField { searchBar.setCallback(new SearchReplaceBar.SearchCallback() { @Override public String getText() { - return text; + return GuiScriptTextArea.this.text; } @Override @@ -1767,6 +1767,7 @@ public class GuiScriptTextArea extends GuiNpcTextField { // Consider text changes user activity to pause caret blinking briefly selection.markActivity(); + searchBar.updateMatches(); } } From 8514b9f9809856ff2eff1fe8eca65908add2129f Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 20 Dec 2025 02:02:43 +0200 Subject: [PATCH 5/6] Search bar now auto-opens on highlighted word --- .../client/gui/util/GuiScriptTextArea.java | 16 +++++++++------ .../gui/util/script/SearchReplaceBar.java | 20 +++++++++---------- 2 files changed, 20 insertions(+), 16 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 ba63f5e09..f5f79ed0d 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -51,6 +51,7 @@ public class GuiScriptTextArea extends GuiNpcTextField { // ==================== TEXT & CONTAINER ==================== public String text = null; + public String highlightedWord; private JavaTextContainer container = null; private boolean enableCodeHighlighting = false; @@ -89,6 +90,10 @@ public class GuiScriptTextArea extends GuiNpcTextField { return GuiScriptTextArea.this.text; } + public String getHighlightedWord() { + return GuiScriptTextArea.this.highlightedWord; + } + @Override public void setText(String newText) { GuiScriptTextArea.this.setText(newText); @@ -263,8 +268,7 @@ public class GuiScriptTextArea extends GuiNpcTextField { drawRect(x - 1, y - 1, x + width + 1, y + height + 1, 0xffa0a0a0); int searchHeight = searchBar.getTotalHeight(); - y += searchHeight; - height -= searchHeight; + // Draw line number gutter background drawRect(x, y, x + LINE_NUMBER_GUTTER_WIDTH, y + height, 0xff000000); @@ -356,12 +360,12 @@ public class GuiScriptTextArea extends GuiNpcTextField { } } - String wordHightLight = null; + highlightedWord = null; if (selection.hasSelection()) { Matcher m = container.regexWord.matcher(text); while (m.find()) { if (m.start() == selection.getStartSelection() && m.end() == selection.getEndSelection()) { - wordHightLight = text.substring(selection.getStartSelection(), selection.getEndSelection()); + highlightedWord = text.substring(selection.getStartSelection(), selection.getEndSelection()); } } } @@ -429,10 +433,10 @@ public class GuiScriptTextArea extends GuiNpcTextField { } } //Highlight words - if (wordHightLight != null) { + if (highlightedWord != null) { Matcher m = container.regexWord.matcher(line); while (m.find()) { - if (line.substring(m.start(), m.end()).equals(wordHightLight)) { + if (line.substring(m.start(), m.end()).equals(highlightedWord)) { int s = ClientProxy.Font.width(line.substring(0, m.start())); int e = ClientProxy.Font.width(line.substring(0, m.end())) + 1; drawRect(x + LINE_NUMBER_GUTTER_WIDTH + 1 + s, posY, x + LINE_NUMBER_GUTTER_WIDTH + 1 + e, posY + container.lineHeight, 0x99004c00); 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 bab0de897..9308f55d5 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 @@ -99,6 +99,8 @@ public class SearchReplaceBar { */ public interface SearchCallback { String getText(); + + String getHighlightedWord(); void setText(String text); void scrollToPosition(int position); void setSelection(int start, int end); @@ -134,11 +136,17 @@ public class SearchReplaceBar { showReplace = false; searchFieldFocused = true; replaceFieldFocused = false; + if (callback != null) { + callback.unfocusMainEditor(); + String highlight = callback.getHighlightedWord(); + if (highlight != null) { + searchText = highlight; + } + } searchSelectionStart = 0; searchSelectionEnd = searchText.length(); searchCursor = searchText.length(); markActivity(); - if (callback != null) callback.unfocusMainEditor(); updateMatches(); } @@ -146,16 +154,8 @@ public class SearchReplaceBar { * Open search+replace bar (Ctrl+Shift+R) */ public void openSearchReplace() { - visible = true; showReplace = true; - searchFieldFocused = true; - replaceFieldFocused = false; - searchSelectionStart = 0; - searchSelectionEnd = searchText.length(); - searchCursor = searchText.length(); - markActivity(); - if (callback != null) callback.unfocusMainEditor(); - updateMatches(); + openSearch(); } /** From ed15ae861a525c6d27dbd0825ba7d063412412df Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sat, 20 Dec 2025 02:03:02 +0200 Subject: [PATCH 6/6] Ctrl+F now only opens/updates search bar, not close. --- .../java/noppes/npcs/client/gui/util/GuiScriptTextArea.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f5f79ed0d..3978723ac 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -825,7 +825,7 @@ public class GuiScriptTextArea extends GuiNpcTextField { KEYS.SEARCH.setTask(e -> { if (!e.isPress() || !isActive.get()) return; - searchBar.toggle(); + searchBar.openSearch(); }); // SEARCH_REPLACE: Open search+replace bar (Ctrl+Shift+R)