summaryrefslogtreecommitdiff
path: root/enigma-swing
diff options
context:
space:
mode:
Diffstat (limited to 'enigma-swing')
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java27
1 files changed, 26 insertions, 1 deletions
diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
index 053adad8..e65b661b 100644
--- a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
+++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
@@ -17,6 +17,7 @@ import java.awt.FlowLayout;
17import java.awt.Font; 17import java.awt.Font;
18import java.awt.event.*; 18import java.awt.event.*;
19import java.util.*; 19import java.util.*;
20import java.util.concurrent.ConcurrentLinkedQueue;
20 21
21import javax.swing.*; 22import javax.swing.*;
22import javax.swing.event.DocumentEvent; 23import javax.swing.event.DocumentEvent;
@@ -207,7 +208,31 @@ public class SearchDialog {
207 this.classListModel = classListModel; 208 this.classListModel = classListModel;
208 classList.setModel(classListModel); 209 classList.setModel(classListModel);
209 210
210 currentSearch = su.asyncSearch(searchField.getText(), (idx, e) -> SwingUtilities.invokeLater(() -> classListModel.insertElementAt(e, idx))); 211 // handle these search result like minecraft scheduled tasks to prevent
212 // flooding swing buttons inputs etc with tons of (possibly outdated) invocations
213 record Order(int idx, SearchEntryImpl e) {}
214 Queue<Order> queue = new ConcurrentLinkedQueue<>();
215 Runnable updater = new Runnable() {
216 @Override
217 public void run() {
218 if (SearchDialog.this.classListModel != classListModel || !SearchDialog.this.dialog.isVisible()) {
219 return;
220 }
221
222 // too large count may increase delay for key and input handling, etc.
223 int count = 100;
224 while (count > 0 && !queue.isEmpty()) {
225 var o = queue.remove();
226 classListModel.insertElementAt(o.e, o.idx);
227 count--;
228 }
229
230 SwingUtilities.invokeLater(this);
231 }
232 };
233
234 currentSearch = su.asyncSearch(searchField.getText(), (idx, e) -> queue.add(new Order(idx, e)));
235 SwingUtilities.invokeLater(updater);
211 } 236 }
212 237
213 public void dispose() { 238 public void dispose() {