Update: 调整Ampy板卡文件管理

本次更新用以配置Ampy板卡文件管理使其仅支持编辑文本文件
This commit is contained in:
王立帮
2024-08-18 01:52:21 +08:00
parent edce8ed5bc
commit 36428283e7
9 changed files with 219 additions and 44 deletions

View File

@@ -23,7 +23,8 @@ class EditorAce extends EditorBase {
static {
this.CTRL_BTNS = ['resetFontSize', 'increaseFontSize', 'decreaseFontSize'];
this.CTRL_BTN_TEMPLATE = '<div m-id="{{d.mId}}" class="code-editor-btn setFontSize"></div>';
this.MODE_MAP = goog.getJSON(path.join(Env.templatePath, 'json/ace-mode-map.json'));
HTMLTemplate.add(
'html/editor/editor-code.html',
new HTMLTemplate(goog.get(path.join(Env.templatePath, 'html/editor/editor-code.html')))
@@ -279,6 +280,24 @@ class EditorAce extends EditorBase {
this.#editor_.setReadOnly(status);
}
setMode(type) {
this.#editor_.session.setMode(`ace/mode/${type}`);
}
setFileMode(extname) {
const mode = this.getFileMode(extname) ?? 'text';
this.setMode(mode);
}
getFileMode(extname) {
for (const [mode, extensions] of Object.entries(EditorAce.MODE_MAP)) {
if (extensions.includes(extname)) {
return mode;
}
}
return null;
}
cut() {
const { selection, session } = this.#editor_;
const cutLine = selection.isEmpty();

View File

@@ -130,7 +130,7 @@ class FileTree extends Component {
});
this.#jstree_ = this.#$fileTree_.jstree(true);
this.addEventsType([
'selectLeaf', 'afterOpenNode', 'afterCloseNode', 'afterRefreshNode',
'beforeSelectLeaf', 'afterSelectLeaf', 'afterOpenNode', 'afterCloseNode', 'afterRefreshNode',
'afterCreateNode', 'afterDeleteNode', 'afterRenameNode'
]);
this.#addEventsListener_();
@@ -202,8 +202,14 @@ class FileTree extends Component {
if (selected[0].id === this.#selected_) {
return;
}
this.#selected_ = selected[0].id;
this.runEvent('selectLeaf', selected);
const result = this.runEvent('beforeSelectLeaf', selected);
if ((result.length && result[0]) || !result.length) {
this.#selected_ = selected[0].id;
this.runEvent('afterSelectLeaf', selected);
} else {
this.deselect(selected[0].id);
this.reselect();
}
})
.on('refresh.jstree', (e, data) => {
this.runEvent('afterRefreshNode', data.node);

View File

@@ -89,9 +89,20 @@ class StatusBarAmpy extends PageBase {
this.openFS();
});
this.#fileTree_.bind('selectLeaf', async (selected) => {
this.#fileTree_.showProgress();
this.#fileTree_.bind('beforeSelectLeaf', (selected) => {
const filePath = selected[0].id;
const mode = this.#editor_.getFileMode(path.extname(filePath));
if (!mode) {
layer.msg(Msg.Lang['statusbar.ampy.cannotEdit'], { time: 1000 });
return false;
}
this.#editor_.setMode(mode);
return true;
});
this.#fileTree_.bind('afterSelectLeaf', async (selected) => {
const filePath = selected[0].id;
this.#fileTree_.showProgress();
const fs = this.#fileTree_.getFS();
const [error, result] = await fs.readFile(filePath);
if (error) {
@@ -103,9 +114,6 @@ class StatusBarAmpy extends PageBase {
this.#editor_.scrollToTop();
this.#editor_.focus();
this.setStatus(false);
this.#editor_.getEditor().session.setMode(
`ace/mode/${this.getLanguageByExt(path.extname(filePath))}`
);
}
this.#fileTree_.hideProgress();
});
@@ -173,7 +181,7 @@ class StatusBarAmpy extends PageBase {
this.#fileTree_.refreshFolder(id);
} else {
const nodes = this.#fileTree_.getSelectedNodes();
this.#fileTree_.runEvent('selectLeaf', nodes);
this.#fileTree_.runEvent('afterSelectLeaf', nodes);
}
}
}
@@ -439,38 +447,6 @@ class StatusBarAmpy extends PageBase {
}
}
getLanguageByExt(ext) {
let language = 'text';
switch(ext) {
case '.json':
language = 'json';
break;
case '.c':
case '.cpp':
case '.h':
case '.hpp':
case '.ino':
language = 'c_cpp';
break;
case '.js':
language = 'javascript';
break;
case '.py':
language = 'python';
break;
case '.lua':
language = 'lua';
break;
case '.md':
case '.mdx':
language = 'markdown';
break;
default:
language = 'text';
}
return language;
}
dispose() {
this.#editor_.dispose();
this.#fileTree_.dispose();

View File

@@ -103,7 +103,7 @@ class Workspace extends Component {
#addEventsListenerForFileTree_() {
const leftSideBarLocalStorage = this.getLeftSideBarsManager().get('local_storage');
const fileTree = leftSideBarLocalStorage.getFileTree();
fileTree.bind('selectLeaf', (selected) => {
fileTree.bind('afterSelectLeaf', (selected) => {
const tabs = this.#editorsManager_.getTabs();
tabs.addTab({
name: selected[0].text,