fix: tab text is not updated when an opened file is renamed

This commit is contained in:
Akash Yadav
2023-03-13 15:41:31 +05:30
parent 461bd7debe
commit 852955959c
7 changed files with 71 additions and 42 deletions
+5
View File
@@ -169,6 +169,11 @@
</map>
</option>
</component>
<component name="EntryPointsManager">
<list size="1">
<item index="0" class="java.lang.String" itemvalue="org.greenrobot.eventbus.Subscribe" />
</list>
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="androidx.annotation.Nullable" />
@@ -75,10 +75,10 @@ class RenameAction(context: Context) :
return@setPositiveButton
}
notifyFileRenamed(file, context)
notifyFileRenamed(file, name, context)
if (lastHeld != null) {
val parent = lastHeld!!.parent
val parent = lastHeld.parent
parent.deleteChild(lastHeld)
val node = TreeNode(File(file.parentFile, name))
node.viewHolder = FileTreeViewHolder(context)
@@ -91,7 +91,7 @@ class RenameAction(context: Context) :
builder.create().show()
}
private fun notifyFileRenamed(file: File, context: Context) {
EventBus.getDefault().post(FileRenameEvent(file).apply { putData(context) })
private fun notifyFileRenamed(file: File, name: String, context: Context) {
EventBus.getDefault().post(FileRenameEvent(file, File(file.parent, name)).apply { putData(context) })
}
}
@@ -38,6 +38,7 @@ import com.itsaky.androidide.editor.language.treesitter.TSLanguageRegistry
import com.itsaky.androidide.editor.language.xml.XMLLanguage
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
import com.itsaky.androidide.editor.ui.IDEEditor
import com.itsaky.androidide.eventbus.events.file.FileRenameEvent
import com.itsaky.androidide.interfaces.IEditorHandler
import com.itsaky.androidide.models.OpenedFile
import com.itsaky.androidide.models.OpenedFilesCache
@@ -51,6 +52,8 @@ import com.itsaky.androidide.utils.IntentUtils.openImage
import com.itsaky.androidide.utils.flashSuccess
import io.github.rosemoe.sora.event.ContentChangeEvent
import java.io.File
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Base class for EditorActivity. Handles logic for working with file editors.
@@ -500,4 +503,19 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler {
}
builder.show()
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onFileRenamed(event: FileRenameEvent) {
val index = findIndexOfEditorByFile(event.file)
if (index < 0 || index >= binding.tabs.tabCount) {
return
}
val editor = getEditorAtIndex(index) ?: return
viewModel.updateFile(index, event.newFile)
editor.updateFile(event.newFile)
val tab = binding.tabs.getTabAt(index) ?: return
tab.text = event.newFile.name
}
}
@@ -44,21 +44,13 @@ import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.SizeUtils;
import com.itsaky.androidide.app.BaseApplication;
import com.itsaky.androidide.editor.databinding.LayoutCodeEditorBinding;
import com.itsaky.androidide.editor.language.treesitter.TreeSitterLanguage;
import com.itsaky.androidide.editor.language.cpp.CppLanguage;
import com.itsaky.androidide.editor.language.groovy.GroovyLanguage;
import com.itsaky.androidide.editor.language.treesitter.TreeSitterLanguageProvider;
import com.itsaky.androidide.editor.schemes.IDEColorScheme;
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider;
import com.itsaky.androidide.editor.ui.EditorSearchLayout;
import com.itsaky.androidide.editor.ui.IDEEditor;
import com.itsaky.androidide.eventbus.events.preferences.PreferenceChangeEvent;
@@ -69,25 +61,19 @@ import com.itsaky.androidide.lsp.java.JavaLanguageServer;
import com.itsaky.androidide.lsp.xml.XMLLanguageServer;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.syntax.colorschemes.DynamicColorScheme;
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE;
import com.itsaky.androidide.utils.FileUtil;
import com.itsaky.androidide.utils.ILogger;
import com.itsaky.androidide.utils.TypefaceUtilsKt;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import io.github.rosemoe.sora.text.LineSeparator;
import io.github.rosemoe.sora.widget.component.Magnifier;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
import io.github.rosemoe.sora.lang.EmptyLanguage;
import io.github.rosemoe.sora.lang.Language;
import io.github.rosemoe.sora.text.LineSeparator;
import io.github.rosemoe.sora.widget.component.Magnifier;
import kotlin.io.FilesKt;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.jetbrains.annotations.NotNull;
/**
* A view that handles opened code editors.
@@ -103,7 +89,7 @@ public class CodeEditorView extends LinearLayout {
private final EditorSearchLayout searchLayout;
public CodeEditorView(
@NonNull Context context, @NonNull File file, final @NonNull Range selection) {
@NonNull Context context, @NonNull File file, final @NonNull Range selection) {
super(context);
this.file = file;
@@ -124,21 +110,21 @@ public class CodeEditorView extends LinearLayout {
addView(this.binding.getRoot(), new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1f));
addView(
this.searchLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
this.searchLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
CompletableFuture.runAsync(
() -> {
final var contents = FileIOUtils.readFile2String(file);
final var editor = getEditor();
editor.post(() -> {
editor.setText(contents, createEditorArgs());
postRead();
selection.validate();
editor.validateRange(selection);
editor.setSelection(selection);
});
() -> {
final var contents = FileIOUtils.readFile2String(file);
final var editor = getEditor();
editor.post(() -> {
editor.setText(contents, createEditorArgs());
postRead();
selection.validate();
editor.validateRange(selection);
editor.setSelection(selection);
});
});
configureEditorIfNeeded();
}
@@ -165,7 +151,7 @@ public class CodeEditorView extends LinearLayout {
protected void postRead() {
binding.editor.setupLanguage(getFile());
binding.editor.setLanguageServer(createLanguageServer(file));
if (IDELanguageClientImpl.isInitialized()) {
@@ -180,7 +166,7 @@ public class CodeEditorView extends LinearLayout {
((Activity) getContext()).invalidateOptionsMenu();
}
}
private ILanguageServer createLanguageServer(File file) {
if (!file.isFile()) {
return null;
@@ -390,7 +376,9 @@ public class CodeEditorView extends LinearLayout {
searchLayout.beginSearchMode();
}
/** Mark this files as saved. Even if it not saved. */
/**
* Mark this files as saved. Even if it not saved.
*/
public void markAsSaved() {
notifySaved();
}
@@ -408,4 +396,13 @@ public class CodeEditorView extends LinearLayout {
super.onDetachedFromWindow();
EventBus.getDefault().unregister(this);
}
public void updateFile(@NotNull File file) {
final var editor = getEditor();
if (editor == null) {
return;
}
editor.updateFile(file);
}
}
@@ -137,6 +137,11 @@ class EditorViewModel : ViewModel() {
mCurrentFile.value = index to file
}
fun updateFile(index: Int, newFile: File) {
val files = files.value ?: return
files[index] = newFile
}
/**
* Get the opened file at the given index.
*
@@ -191,13 +191,17 @@ public class IDEEditor extends CodeEditor implements IEditor, ILspEditor {
* @param file The file to set.
*/
public void setFile(File file) {
this.file = file;
updateFile(file);
if (file != null) {
dispatchDocumentOpenEvent();
}
}
public void updateFile(File file) {
this.file = file;
}
@NonNull
@Override
public Bundle getExtraArguments() {
@@ -44,4 +44,4 @@ data class FileDeletionEvent(override val file: File) : FileEvent()
*
* @author Akash Yadav
*/
class FileRenameEvent(override val file: File) : FileEvent()
class FileRenameEvent(override val file: File, val newFile: File) : FileEvent()