feat(core): micropython 板卡文件管理 右键菜单添加 剪切 、复制 和 粘贴 选项
This commit is contained in:
@@ -869,16 +869,18 @@ class FileTree extends Component {
|
||||
let startPath = oldNode.id;
|
||||
let endPath = path.join(folderPath, oldNode.text);
|
||||
if (mode === 'move_node') {
|
||||
if (type === 'file') {
|
||||
pastePromise = this.#fs_.moveFile(startPath, endPath);
|
||||
const relativePath = path.relative(startPath, endPath);
|
||||
if (relativePath.indexOf('..') === -1) {
|
||||
pastePromise = Promise.resolve();
|
||||
} else {
|
||||
pastePromise = this.#fs_.createDirectory(endPath)
|
||||
.then(() => {
|
||||
return this.#fs_.moveDirectory(startPath, endPath);
|
||||
})
|
||||
.then(() => {
|
||||
return this.#fs_.deleteDirectory(startPath);
|
||||
});
|
||||
if (type === 'file') {
|
||||
pastePromise = this.#fs_.moveFile(startPath, endPath);
|
||||
} else {
|
||||
pastePromise = this.#fs_.createDirectory(endPath)
|
||||
.then(() => {
|
||||
return this.#fs_.moveDirectory(startPath, endPath);
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if (mode === 'copy_node') {
|
||||
if (type === 'file') {
|
||||
@@ -891,21 +893,62 @@ class FileTree extends Component {
|
||||
}
|
||||
}
|
||||
pastePromise
|
||||
.catch(Debug.error)
|
||||
.finally(() => {
|
||||
this.clearFolderTemp(folderPath);
|
||||
this.#jstree_.refresh_node(folderPath);
|
||||
this.openNode(folderPath);
|
||||
this.hideProgress();
|
||||
.then(async () => {
|
||||
if (mode === 'move_node') {
|
||||
const temp = path.join(startPath, '..');
|
||||
const relativePath = path.relative(temp, endPath);
|
||||
if (relativePath.indexOf('..') === -1) {
|
||||
this.clearFolderTemp(temp);
|
||||
await this.loadNode(temp);
|
||||
await this.openNode(temp);
|
||||
this.clearFolderTemp(folderPath);
|
||||
await this.loadNode(folderPath);
|
||||
await this.openNode(folderPath);
|
||||
} else {
|
||||
this.clearFolderTemp(folderPath);
|
||||
await this.loadNode(folderPath);
|
||||
await this.openNode(folderPath);
|
||||
this.clearFolderTemp(temp);
|
||||
await this.loadNode(temp);
|
||||
await this.openNode(temp);
|
||||
}
|
||||
} else {
|
||||
this.clearFolderTemp(folderPath);
|
||||
this.#jstree_.refresh_node(folderPath);
|
||||
this.openNode(folderPath);
|
||||
}
|
||||
})
|
||||
.catch(Debug.error)
|
||||
.finally(() => {
|
||||
this.hideProgress();
|
||||
});
|
||||
}
|
||||
|
||||
loadNode(inPath) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (inPath === '/') {
|
||||
inPath = '#';
|
||||
}
|
||||
const node = this.#jstree_.get_node(inPath);
|
||||
if (!node) {
|
||||
resolve();
|
||||
}
|
||||
this.#jstree_.load_node(node, () => {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
openNode(folderPath) {
|
||||
const node = this.#jstree_.get_node(folderPath);
|
||||
if (!node) {
|
||||
return;
|
||||
}
|
||||
this.#jstree_.open_node(node);
|
||||
return new Promise((resolve, reject) => {
|
||||
const node = this.#jstree_.get_node(folderPath);
|
||||
if (!node) {
|
||||
resolve();
|
||||
}
|
||||
this.#jstree_.open_node(node, () => {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
dispose() {
|
||||
|
||||
@@ -351,11 +351,6 @@ class StatusBarAmpy extends PageBase {
|
||||
}
|
||||
});
|
||||
|
||||
fileTreeMenu.remove('copy');
|
||||
fileTreeMenu.remove('cut');
|
||||
fileTreeMenu.remove('paste');
|
||||
fileTreeMenu.remove('sep2');
|
||||
|
||||
const editorContextMenu = this.#editor_.getContextMenu();
|
||||
const editorMenu = editorContextMenu.getItem('code');
|
||||
|
||||
|
||||
@@ -106,9 +106,21 @@ class AmpyFS extends FS {
|
||||
return this.rename(oldFilePath, newFilePath);
|
||||
}
|
||||
|
||||
// async moveFile(oldFilePath, newFilePath) {}
|
||||
async moveFile(oldFilePath, newFilePath) {
|
||||
return this.rename(oldFilePath, newFilePath);
|
||||
}
|
||||
|
||||
// async copyFile(oldFilePath, newFilePath) {}
|
||||
async copyFile(oldFilePath, newFilePath) {
|
||||
let stdout = '', error = null;
|
||||
try {
|
||||
const output = await this.#ampy_.cpfile(this.#port_, this.#baud_, oldFilePath, newFilePath);
|
||||
stdout = output.stdout;
|
||||
} catch (e) {
|
||||
error = e;
|
||||
Debug.error(error);
|
||||
}
|
||||
return [error, stdout];
|
||||
}
|
||||
|
||||
async deleteFile(filePath) {
|
||||
let stdout = '', error = null;
|
||||
@@ -179,9 +191,21 @@ class AmpyFS extends FS {
|
||||
return this.rename(oldFolderPath, newFolderPath);
|
||||
}
|
||||
|
||||
// async moveDirectory(oldFolderPath, newFolderPath) {}
|
||||
async moveDirectory(oldFolderPath, newFolderPath) {
|
||||
return this.rename(oldFolderPath, newFolderPath);
|
||||
}
|
||||
|
||||
// async copyDirectory(oldFolderPath, newFolderPath) {}
|
||||
async copyDirectory(oldFolderPath, newFolderPath) {
|
||||
let stdout = '', error = null;
|
||||
try {
|
||||
const output = await this.#ampy_.cpdir(this.#port_, this.#baud_, oldFolderPath, newFolderPath);
|
||||
stdout = output.stdout;
|
||||
} catch (e) {
|
||||
error = e;
|
||||
Debug.error(error);
|
||||
}
|
||||
return [error, stdout];
|
||||
}
|
||||
|
||||
async deleteDirectory(folderPath) {
|
||||
let stdout = '', error = null;
|
||||
|
||||
@@ -33,6 +33,8 @@ class AmpyExt extends Ampy {
|
||||
rm: '{{&y}} -p {{&port}} -b {{&baud}} -i 0 rm "{{&filePath}}"',
|
||||
rmdir: '{{&y}} -p {{&port}} -b {{&baud}} -i 0 rmdir "{{&folderPath}}"',
|
||||
rename: '{{&y}} -p {{&port}} -b {{&baud}} -i 0 rename "{{&oldPath}}" "{{&newPath}}"',
|
||||
cpdir: '{{&y}} -p {{&port}} -b {{&baud}} -i 0 cpdir "{{&startPath}}" "{{&endPath}}"',
|
||||
cpfile: '{{&y}} -p {{&port}} -b {{&baud}} -i 0 cpfile "{{&startPath}}" "{{&endPath}}"',
|
||||
run: '{{&y}} -p {{&port}} -b {{&baud}} -i 0 run "{{&filePath}}"'
|
||||
}
|
||||
|
||||
@@ -90,6 +92,14 @@ class AmpyExt extends Ampy {
|
||||
return this.exec(port, this.render('rename', { port, baud, oldPath, newPath }));
|
||||
}
|
||||
|
||||
async cpdir(port, baud, startPath, endPath) {
|
||||
return this.exec(port, this.render('cpdir', { port, baud, startPath, endPath }));
|
||||
}
|
||||
|
||||
async cpfile(port, baud, startPath, endPath) {
|
||||
return this.exec(port, this.render('cpfile', { port, baud, startPath, endPath }));
|
||||
}
|
||||
|
||||
async run(port, baud, filePath) {
|
||||
return this.exec(port, this.render('run', { port, baud, filePath }));
|
||||
}
|
||||
|
||||
@@ -125,9 +125,29 @@ class AmpyFS extends FS {
|
||||
return this.rename(oldFilePath, newFilePath);
|
||||
}
|
||||
|
||||
// async moveFile(oldFilePath, newFilePath) {}
|
||||
async moveFile(oldFilePath, newFilePath) {
|
||||
return this.rename(oldFilePath, newFilePath);
|
||||
}
|
||||
|
||||
// async copyFile(oldFilePath, newFilePath) {}
|
||||
async copyFile(oldFilePath, newFilePath) {
|
||||
let stdout = '', error = null, ampy = null;
|
||||
try {
|
||||
ampy = await this.getAmpy();
|
||||
await ampy.enter();
|
||||
stdout = await ampy.cpfile(oldFilePath, newFilePath);
|
||||
} catch (e) {
|
||||
error = e;
|
||||
Debug.error(error);
|
||||
}
|
||||
try {
|
||||
await ampy.exit();
|
||||
await ampy.dispose();
|
||||
} catch (e) {
|
||||
error = e;
|
||||
Debug.error(error);
|
||||
}
|
||||
return [error, stdout];
|
||||
}
|
||||
|
||||
async deleteFile(filePath) {
|
||||
let stdout = '', error = null, ampy = null;
|
||||
@@ -206,9 +226,29 @@ class AmpyFS extends FS {
|
||||
return this.rename(oldFolderPath, newFolderPath);
|
||||
}
|
||||
|
||||
// async moveDirectory(oldFolderPath, newFolderPath) {}
|
||||
async moveDirectory(oldFolderPath, newFolderPath) {
|
||||
return this.rename(oldFolderPath, newFolderPath);
|
||||
}
|
||||
|
||||
// async copyDirectory(oldFolderPath, newFolderPath) {}
|
||||
async copyDirectory(oldFolderPath, newFolderPath) {
|
||||
let stdout = '', error = null, ampy = null;
|
||||
try {
|
||||
ampy = await this.getAmpy();
|
||||
await ampy.enter();
|
||||
stdout = await ampy.cpdir(oldFolderPath, newFolderPath);
|
||||
} catch (e) {
|
||||
error = e;
|
||||
Debug.error(error);
|
||||
}
|
||||
try {
|
||||
await ampy.exit();
|
||||
await ampy.dispose();
|
||||
} catch (e) {
|
||||
error = e;
|
||||
Debug.error(error);
|
||||
}
|
||||
return [error, stdout];
|
||||
}
|
||||
|
||||
async deleteDirectory(folderPath) {
|
||||
let stdout = '', error = null, ampy = null;
|
||||
|
||||
@@ -28,6 +28,8 @@ class AmpyExt extends Ampy {
|
||||
this.RMDIR = goog.readFileSync(path.join(Env.templatePath, 'python/rmdir.py'));
|
||||
this.GET = goog.readFileSync(path.join(Env.templatePath, 'python/get.py'));
|
||||
this.CWD = goog.readFileSync(path.join(Env.templatePath, 'python/cwd.py'));
|
||||
this.CPDIR = goog.readFileSync(path.join(Env.templatePath, 'python/cpdir.py'));
|
||||
this.CPFILE = goog.readFileSync(path.join(Env.templatePath, 'python/cpfile.py'));
|
||||
}
|
||||
|
||||
#device_ = null;
|
||||
@@ -338,6 +340,31 @@ class AmpyExt extends Ampy {
|
||||
return !dataError;
|
||||
}
|
||||
|
||||
async cpdir(oldname, newname, timeout = 5000) {
|
||||
if (!this.isActive()) {
|
||||
throw new Error(Msg.Lang['ampy.portIsNotOpen']);
|
||||
}
|
||||
const code = Mustache.render(AmpyExt.CPDIR, {
|
||||
oldPath: oldname,
|
||||
newPath: newname
|
||||
});
|
||||
const { data, dataError } = await this.exec(code, timeout);
|
||||
console.log(data, dataError)
|
||||
return !dataError;
|
||||
}
|
||||
|
||||
async cpfile(oldname, newname, timeout = 5000) {
|
||||
if (!this.isActive()) {
|
||||
throw new Error(Msg.Lang['ampy.portIsNotOpen']);
|
||||
}
|
||||
const code = Mustache.render(AmpyExt.CPFILE, {
|
||||
oldPath: oldname,
|
||||
newPath: newname
|
||||
});
|
||||
const { dataError } = await this.exec(code, timeout);
|
||||
return !dataError;
|
||||
}
|
||||
|
||||
async cwd(timeout = 5000) {
|
||||
if (!this.isActive()) {
|
||||
throw new Error(Msg.Lang['ampy.portIsNotOpen']);
|
||||
|
||||
Reference in New Issue
Block a user