Skip to content
This repository was archived by the owner on Sep 12, 2024. It is now read-only.

Commit 365f2e7

Browse files
committed
Event listeners but still facing async issues
# TODO - fix broken async logic - improve event listeners - Many buggy features to fix Signed-off-by: zhaoxinn <[email protected]>
1 parent 06663e2 commit 365f2e7

File tree

4 files changed

+69
-21
lines changed

4 files changed

+69
-21
lines changed

src/main/java/com/zxzinn/novelai/gui/MainGUI.java

+17-11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.zxzinn.novelai.config.ConfigManager;
88
import com.zxzinn.novelai.event.ImageReceivedEvent;
99
import com.zxzinn.novelai.event.ImageReceivedListener;
10+
import com.zxzinn.novelai.event.PromptUpdateEvent;
11+
import com.zxzinn.novelai.event.PromptUpdateListener;
1012
import com.zxzinn.novelai.gui.common.ImagePreviewPanel;
1113
import com.zxzinn.novelai.gui.filewindow.FileManagerTab;
1214
import com.zxzinn.novelai.gui.generation.*;
@@ -29,7 +31,7 @@
2931
@Log4j2
3032
@Getter
3133
@Setter
32-
public class MainGUI extends JFrame implements UIComponent , ImageReceivedListener {
34+
public class MainGUI extends JFrame implements UIComponent , ImageReceivedListener , PromptUpdateListener {
3335
private static final ConfigManager config = ConfigManager.getInstance();
3436
public static final int WINDOW_WIDTH = config.getInteger("ui.window.width");
3537
public static final int WINDOW_HEIGHT = config.getInteger("ui.window.height");
@@ -83,6 +85,7 @@ public void initializeComponents() {
8385
mainTabbedPane = new JTabbedPane();
8486

8587
promptPanel = new PromptPanel();
88+
promptPanel.addPromptUpdateListener(this);
8689

8790
generationParametersPanel = new GenerationParametersPanel();
8891
img2ImgParametersPanel = new Img2ImgParametersPanel();
@@ -141,7 +144,7 @@ public void bindEvents() {
141144

142145
private void startImageGeneration() {
143146
if (isGenerating) {
144-
log.info("已經在生成圖像中忽略新的請求");
147+
log.info("已經在生成圖像中,忽略新的請求");
145148
return;
146149
}
147150

@@ -151,6 +154,10 @@ private void startImageGeneration() {
151154
CompletableFuture.runAsync(() -> {
152155
try {
153156
currentPromptResult = promptPanel.preparePromptForGeneration().get();
157+
String countSelection = (String) generationControlPanel.getGenerationCountComboBox().getSelectedItem();
158+
assert countSelection != null;
159+
int count = countSelection.equals(I18nManager.getString("option.infinite")) ? Integer.MAX_VALUE : Integer.parseInt(countSelection);
160+
generationControlPanel.setLastingCount(count);
154161
generateNextImage();
155162
} catch (Exception e) {
156163
log.error("準備提示詞時出錯", e);
@@ -162,9 +169,7 @@ private void startImageGeneration() {
162169
}
163170

164171
private void generateNextImage() {
165-
if (!generationControlPanel.shouldContinueGenerating() || !isGenerating) {
166-
isGenerating = false;
167-
generationControlPanel.updateState(GenerationState.IDLE);
172+
if (!isGenerating) {
168173
return;
169174
}
170175

@@ -198,9 +203,7 @@ private void refreshPromptPreview() {
198203
CompletableFuture.runAsync(() -> {
199204
try {
200205
PromptPanel.PromptResult nextPromptResult = promptPanel.reprocessEmbed().get();
201-
SwingUtilities.invokeLater(() -> {
202-
promptPanel.updatePreviewAreas(nextPromptResult.positivePrompt, nextPromptResult.negativePrompt);
203-
});
206+
SwingUtilities.invokeLater(() -> promptPanel.updatePreviewAreas(nextPromptResult.positivePrompt, nextPromptResult.negativePrompt));
204207
} catch (Exception e) {
205208
log.error("刷新提示詞預覽時出錯", e);
206209
}
@@ -241,9 +244,7 @@ public void onImageReceived(ImageReceivedEvent event) {
241244

242245
private void handleError(String errorMessage) {
243246
log.error(errorMessage);
244-
SwingUtilities.invokeLater(() -> {
245-
JOptionPane.showMessageDialog(this, errorMessage, "錯誤", JOptionPane.ERROR_MESSAGE);
246-
});
247+
SwingUtilities.invokeLater(() -> JOptionPane.showMessageDialog(this, errorMessage, "錯誤", JOptionPane.ERROR_MESSAGE));
247248
}
248249

249250
private void styleActionComboBox() {
@@ -293,4 +294,9 @@ private void saveAllCache() {
293294
cache.saveCache();
294295
log.info("Cache saved");
295296
}
297+
298+
@Override
299+
public void onPromptUpdate(PromptUpdateEvent event) {
300+
currentPromptResult = new PromptPanel.PromptResult(event.getPositivePrompt(), event.getNegativePrompt());
301+
}
296302
}

src/main/java/com/zxzinn/novelai/gui/generation/AbstractParametersPanel.java

+18
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import com.zxzinn.novelai.api.NAIConstants;
44
import com.zxzinn.novelai.config.ConfigManager;
5+
import com.zxzinn.novelai.event.ParameterChangeEvent;
6+
import com.zxzinn.novelai.event.ParameterChangeListener;
57
import com.zxzinn.novelai.utils.Cache;
68
import com.zxzinn.novelai.utils.I18nManager;
79
import com.zxzinn.novelai.utils.UIComponent;
810
import lombok.extern.log4j.Log4j2;
911

1012
import javax.swing.*;
1113
import java.awt.*;
14+
import java.util.ArrayList;
15+
import java.util.List;
1216
import java.util.Map;
1317

1418
@Log4j2
@@ -28,6 +32,8 @@ public abstract class AbstractParametersPanel extends JPanel implements UICompon
2832
public abstract JTextField getOutputDirField();
2933
public abstract Map<String, Object> getParameters();
3034

35+
private final List<ParameterChangeListener> parameterChangeListeners = new ArrayList<>();
36+
3137
public AbstractParametersPanel() {
3238
setLayout(new GridBagLayout());
3339
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
@@ -118,9 +124,21 @@ protected GridBagConstraints createGridBagConstraints() {
118124
@Override
119125
public void bindEvents() {
120126
// Common event bindings can be added here
127+
modelComboBox.addActionListener(e -> fireParameterChangeEvent(new ParameterChangeEvent(this, "model", modelComboBox.getSelectedItem())));
128+
129+
apiKeyField.getDocument().addDocumentListener((SimpleDocumentListener) () -> fireParameterChangeEvent(new ParameterChangeEvent(this, "apiKey", apiKeyField.getText())));
130+
131+
outputDirField.getDocument().addDocumentListener((SimpleDocumentListener) () -> fireParameterChangeEvent(new ParameterChangeEvent(this, "outputDir", outputDirField.getText())));
132+
121133
bindSpecificEvents();
122134
}
123135

136+
protected void fireParameterChangeEvent(ParameterChangeEvent event) {
137+
for (ParameterChangeListener listener : parameterChangeListeners) {
138+
listener.onParameterChange(event);
139+
}
140+
}
141+
124142
protected abstract void bindSpecificEvents();
125143

126144
public void loadCachedValues() {

src/main/java/com/zxzinn/novelai/gui/generation/GenerationControlPanel.java

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.zxzinn.novelai.gui.generation;
22

33
import com.zxzinn.novelai.GenerationState;
4+
import com.zxzinn.novelai.event.GenerationStateChangeEvent;
5+
import com.zxzinn.novelai.event.GenerationStateChangeListener;
46
import com.zxzinn.novelai.event.ImageReceivedEvent;
57
import com.zxzinn.novelai.event.ImageReceivedListener;
68
import com.zxzinn.novelai.utils.I18nManager;
@@ -23,6 +25,7 @@ public class GenerationControlPanel extends JPanel {
2325
private final JButton controlButton;
2426
private final JComboBox<String> generationCountComboBox;
2527
private final List<ImageReceivedListener> imageReceivedListeners = new ArrayList<>();
28+
private final List<GenerationStateChangeListener> generationStateChangeListeners = new ArrayList<>();
2629

2730
private GenerationState currentState;
2831
private final AtomicInteger lastingCount = new AtomicInteger();
@@ -59,10 +62,6 @@ private void handleControlButtonClick() {
5962
}
6063
}
6164

62-
public boolean shouldContinueGenerating() {
63-
return currentState == GenerationState.GENERATING && lastingCount.get() > 0;
64-
}
65-
6665
public boolean decrementLastingCount() {
6766
int newCount = lastingCount.decrementAndGet();
6867
log.info("剩餘生成次數: {}", newCount);
@@ -104,21 +103,27 @@ public void updateState(GenerationState newState) {
104103
controlButton.setEnabled(false);
105104
break;
106105
}
106+
fireGenerationStateChangeEvent(new GenerationStateChangeEvent(this, newState));
107107
});
108108
}
109109

110110
public void addImageReceivedListener(ImageReceivedListener listener) {
111111
imageReceivedListeners.add(listener);
112112
}
113113

114-
public void removeImageReceivedListener(ImageReceivedListener listener) {
115-
imageReceivedListeners.remove(listener);
116-
}
117-
118114
public void onImageReceived(BufferedImage image) {
119115
ImageReceivedEvent event = new ImageReceivedEvent(this, image);
120116
for (ImageReceivedListener listener : imageReceivedListeners) {
121117
listener.onImageReceived(event);
122118
}
123119
}
120+
121+
private void fireGenerationStateChangeEvent(GenerationStateChangeEvent event) {
122+
for (GenerationStateChangeListener listener : generationStateChangeListeners) {
123+
listener.onGenerationStateChange(event);
124+
}
125+
}
126+
127+
public void setLastingCount(int count) {
128+
}
124129
}

src/main/java/com/zxzinn/novelai/gui/generation/PromptPanel.java

+21-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.zxzinn.novelai.gui.generation;
22

3+
import com.zxzinn.novelai.event.PromptUpdateEvent;
4+
import com.zxzinn.novelai.event.PromptUpdateListener;
35
import com.zxzinn.novelai.generation.prompt.PromptProcessor;
46
import com.zxzinn.novelai.generation.prompt.EmbedPromptProcessor;
57
import com.zxzinn.novelai.utils.Cache;
@@ -12,6 +14,8 @@
1214
import java.awt.*;
1315
import java.awt.event.ComponentAdapter;
1416
import java.awt.event.ComponentEvent;
17+
import java.util.ArrayList;
18+
import java.util.List;
1519
import java.util.concurrent.CompletableFuture;
1620

1721
@Log4j2
@@ -34,6 +38,8 @@ public class PromptPanel extends JPanel implements UIComponent {
3438

3539
private boolean isLocked = false;
3640

41+
private final List<PromptUpdateListener> promptUpdateListeners = new ArrayList<>();
42+
3743
public PromptPanel() {
3844
this.promptProcessor = new EmbedPromptProcessor();
3945
this.cache = Cache.getInstance();
@@ -150,9 +156,22 @@ private void schedulePreviewUpdate() {
150156
updateTimer.restart();
151157
}
152158

159+
public void addPromptUpdateListener(PromptUpdateListener listener) {
160+
promptUpdateListeners.add(listener);
161+
}
162+
163+
private void firePromptUpdateEvent(PromptUpdateEvent event) {
164+
for (PromptUpdateListener listener : promptUpdateListeners) {
165+
listener.onPromptUpdate(event);
166+
}
167+
}
168+
153169
private void updatePreviews() {
154-
previewManager.updatePreview(true, positivePromptArea.getText());
155-
previewManager.updatePreview(false, negativePromptArea.getText());
170+
String positivePrompt = positivePromptArea.getText();
171+
String negativePrompt = negativePromptArea.getText();
172+
previewManager.updatePreview(true, positivePrompt);
173+
previewManager.updatePreview(false, negativePrompt);
174+
firePromptUpdateEvent(new PromptUpdateEvent(this, positivePrompt, negativePrompt));
156175
}
157176

158177
private void loadCachedPrompts() {

0 commit comments

Comments
 (0)