fix: assorted UX improvements

This commit is contained in:
zaaarf 2024-10-10 00:35:26 +02:00
parent 7507544fcb
commit 70aeca3d17
No known key found for this signature in database
GPG key ID: C91CFF9E2262BBA1
5 changed files with 65 additions and 107 deletions

View file

@ -1,85 +0,0 @@
package mp.code.intellij.actions.buffer;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import mp.code.BufferController;
import mp.code.data.TextChange;
import mp.code.exceptions.ControllerException;
import mp.code.intellij.CodeMP;
import mp.code.intellij.util.FileUtil;
import mp.code.intellij.util.InteractionUtil;
import mp.code.intellij.util.cb.BufferCallback;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.Optional;
import java.util.OptionalLong;
public class BufferShareAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
Project proj = e.getProject();
FileEditor currentEditor = FileEditorManager.getInstance(proj).getSelectedEditor();
if(currentEditor == null) {
Messages.showErrorDialog(
"No file is currently open!",
"CodeMP Buffer Share"
);
return;
}
String path = FileUtil.getRelativePath(proj, currentEditor.getFile());
if(path == null) {
Messages.showErrorDialog(
"File must belong to project!",
"CodeMP Buffer Share"
);
return;
}
InteractionUtil.createBuffer(proj, path);
Optional<BufferController> controller = InteractionUtil.bufferAttach(proj, CodeMP.getActiveWorkspace(), path);
if(controller.isEmpty()) {
Messages.showErrorDialog(
"An unknown error has occurred!",
"CodeMP Buffer Share"
);
return;
}
try {
controller.get().send(new TextChange(
0,
0,
new String(currentEditor.getFile().contentsToByteArray()),
OptionalLong.empty()
));
ApplicationManager.getApplication().runWriteAction(() -> {
try {
FileUtil.getAndRegisterBufferEquivalent(this, proj, controller.get());
} catch(ControllerException | IOException ex) {
throw new RuntimeException(ex);
} catch(UnsupportedOperationException ignored) {}
});
controller.get().callback(buf -> new BufferCallback(proj).accept(buf));
} catch(ControllerException | IOException ex) {
throw new RuntimeException(ex);
}
}
@Override
public void update(@NotNull AnActionEvent e) {
e.getPresentation().setEnabled(CodeMP.isInWorkspace());
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
}

View file

@ -21,15 +21,15 @@ public class BufferSyncAction extends AnAction {
public void actionPerformed(@NotNull AnActionEvent e) { public void actionPerformed(@NotNull AnActionEvent e) {
// TODO if current buffer is managed, sync that instead of making user choose // TODO if current buffer is managed, sync that instead of making user choose
String[] active_buffers = CodeMP.getActiveWorkspace().activeBuffers(); String[] activeBuffers = CodeMP.getActiveWorkspace().activeBuffers();
int choice = Messages.showChooseDialog( int choice = Messages.showChooseDialog(
"Sync which buffer?", "Sync which buffer?",
"CodeMP Buffer Detach", "CodeMP Buffer Detach",
active_buffers, activeBuffers,
"", "",
Messages.getQuestionIcon() Messages.getQuestionIcon()
); );
String path = active_buffers[choice]; String path = activeBuffers[choice];
Optional<BufferController> controller = CodeMP.getActiveWorkspace().getBuffer(path); Optional<BufferController> controller = CodeMP.getActiveWorkspace().getBuffer(path);
if (controller.isEmpty()) { if (controller.isEmpty()) {

View file

@ -3,20 +3,17 @@ package mp.code.intellij.actions.workspace;
import com.intellij.openapi.actionSystem.ActionUpdateThread; import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ui.Messages;
import mp.code.intellij.CodeMP; import mp.code.intellij.CodeMP;
import mp.code.intellij.util.InteractionUtil; import mp.code.intellij.util.InteractionUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Objects;
public class WorkspaceLeaveAction extends AnAction { public class WorkspaceLeaveAction extends AnAction {
@Override @Override
public void actionPerformed(@NotNull AnActionEvent e) { public void actionPerformed(@NotNull AnActionEvent e) {
String workspaceId = Messages.showInputDialog( String workspaceId = CodeMP.getActiveWorkspace().getWorkspaceId();
"Workspace to leave:", InteractionUtil.leaveWorkspace(Objects.requireNonNull(e.getProject()), workspaceId, null);
"CodeMP Workspace Leave",
Messages.getQuestionIcon());
InteractionUtil.leaveWorkspace(e.getProject(), workspaceId, null);
} }
@Override @Override

View file

@ -1,11 +1,17 @@
package mp.code.intellij.ui; package mp.code.intellij.ui;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.Messages;
import com.intellij.ui.components.JBList; import com.intellij.ui.components.JBList;
import com.intellij.ui.treeStructure.Tree; import com.intellij.ui.treeStructure.Tree;
import mp.code.BufferController;
import mp.code.Workspace; import mp.code.Workspace;
import mp.code.data.TextChange;
import mp.code.exceptions.ControllerException; import mp.code.exceptions.ControllerException;
import mp.code.intellij.CodeMP; import mp.code.intellij.CodeMP;
import mp.code.intellij.util.FileUtil; import mp.code.intellij.util.FileUtil;
@ -19,7 +25,10 @@ import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.OptionalLong;
public class CodeMPToolPanel extends JPanel { public class CodeMPToolPanel extends JPanel {
public CodeMPToolPanel(Project project) { public CodeMPToolPanel(Project project) {
@ -64,21 +73,60 @@ public class CodeMPToolPanel extends JPanel {
} }
case JOINED -> { case JOINED -> {
this.setLayout(new BorderLayout(1, 0)); this.setLayout(new BorderLayout(1, 0));
JButton createButton = new JButton(new AbstractAction("Create buffer") { this.add(new JButton(new AbstractAction("Share buffer") {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
String bufferPath = Messages.showInputDialog( Project proj = Objects.requireNonNull(project);
"Name of buffer:", FileEditor currentEditor = FileEditorManager.getInstance(proj).getSelectedEditor();
"CodeMP Buffer Create", if(currentEditor == null) {
Messages.getQuestionIcon() Messages.showErrorDialog(
"No file is currently open!",
"CodeMP Buffer Share"
); );
return;
InteractionUtil.createBuffer(project, bufferPath);
CodeMPToolPanel.this.redraw(project);
} }
String path = FileUtil.getRelativePath(proj, currentEditor.getFile());
if(path == null) {
Messages.showErrorDialog(
"File must belong to project!",
"CodeMP Buffer Share"
);
return;
}
InteractionUtil.createBuffer(proj, path);
CodeMPToolPanel.this.redraw(project);
Optional<BufferController> controller = InteractionUtil.bufferAttach(proj, CodeMP.getActiveWorkspace(), path);
if(controller.isEmpty()) {
Messages.showErrorDialog(
"An unknown error has occurred!",
"CodeMP Buffer Share"
);
return;
}
try {
Editor ed = ((TextEditor) currentEditor).getEditor();
controller.get().send(new TextChange(
0,
0,
ed.getDocument().getText(),
OptionalLong.empty()
));
ApplicationManager.getApplication().runWriteAction(() -> {
try {
FileUtil.getAndRegisterBufferEquivalent(this, proj, controller.get());
} catch(ControllerException | IOException ex) {
throw new RuntimeException(ex);
} catch(UnsupportedOperationException ignored) {}
}); });
// createButton.setSize(createButton.getPreferredSize()); controller.get().callback(buf -> new BufferCallback(proj).accept(buf));
this.add(createButton, BorderLayout.NORTH); } catch(ControllerException ex) {
throw new RuntimeException(ex);
}
}
}), BorderLayout.NORTH);
Workspace ws = CodeMP.getActiveWorkspace(); Workspace ws = CodeMP.getActiveWorkspace();
JTree tree = drawTree(ws.getWorkspaceId(), ws.getFileTree(Optional.empty(), false)); JTree tree = drawTree(ws.getWorkspaceId(), ws.getFileTree(Optional.empty(), false));

View file

@ -25,8 +25,6 @@
text="Leave Workspace"/> text="Leave Workspace"/>
</group> </group>
<group id="codemp.buffer" text="Buffer" popup="true"> <group id="codemp.buffer" text="Buffer" popup="true">
<action id="codemp.buffer.share" class="mp.code.intellij.actions.buffer.BufferShareAction"
text="Share Current Buffer"/>
<action id="codemp.buffer.attach" class="mp.code.intellij.actions.buffer.BufferAttachAction" <action id="codemp.buffer.attach" class="mp.code.intellij.actions.buffer.BufferAttachAction"
text="Attach to Remote Buffer"/> text="Attach to Remote Buffer"/>
<action id="codemp.buffer.detach" class="mp.code.intellij.actions.buffer.BufferDetachAction" <action id="codemp.buffer.detach" class="mp.code.intellij.actions.buffer.BufferDetachAction"