Add execute hotkey
This commit is contained in:
@@ -40,6 +40,15 @@ mod bindgen {
|
|||||||
#[wasm_bindgen(method, js_name = getSelectedText)]
|
#[wasm_bindgen(method, js_name = getSelectedText)]
|
||||||
pub fn get_selected_text(this: &Editor) -> String;
|
pub fn get_selected_text(this: &Editor) -> String;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
extern "C" {
|
||||||
|
pub type CommandManager;
|
||||||
|
|
||||||
|
#[wasm_bindgen(method, js_name = addCommand)]
|
||||||
|
pub fn add_command(this: &CommandManager, command: JsValue);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Result<T> = std::result::Result<T, EditorError>;
|
type Result<T> = std::result::Result<T, EditorError>;
|
||||||
@@ -113,6 +122,22 @@ pub enum EditorError {
|
|||||||
DefineEx(JsValue),
|
DefineEx(JsValue),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Command {
|
||||||
|
pub name: String,
|
||||||
|
pub bind_key: BindKey,
|
||||||
|
#[serde(with = "serde_wasm_bindgen::preserve")]
|
||||||
|
pub exec: js_sys::Function,
|
||||||
|
pub read_only: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct BindKey {
|
||||||
|
pub win: String,
|
||||||
|
pub mac: String,
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Editor {
|
pub struct Editor {
|
||||||
js: bindgen::Editor,
|
js: bindgen::Editor,
|
||||||
}
|
}
|
||||||
@@ -171,6 +196,14 @@ impl Editor {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_command(&self, command: Command) {
|
||||||
|
let editor = self.js.clone();
|
||||||
|
let manager = bindgen::CommandManager::from(
|
||||||
|
Reflect::get(&editor, &JsValue::from("commands")).unwrap(),
|
||||||
|
);
|
||||||
|
manager.add_command(serde_wasm_bindgen::to_value(&command).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_value(&self) -> String {
|
pub fn get_value(&self) -> String {
|
||||||
self.js.get_value()
|
self.js.get_value()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use aceditor::EditorOptionsBuilder;
|
use aceditor::{BindKey, EditorOptionsBuilder};
|
||||||
use istyles::istyles;
|
use istyles::istyles;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
use reactive_stores::Store;
|
use reactive_stores::Store;
|
||||||
|
use wasm_bindgen::{JsCast, prelude::Closure};
|
||||||
use wasm_bindgen_futures::spawn_local;
|
use wasm_bindgen_futures::spawn_local;
|
||||||
use web_sys::UrlSearchParams;
|
use web_sys::UrlSearchParams;
|
||||||
|
|
||||||
@@ -38,7 +39,21 @@ pub fn Editor() -> impl IntoView {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
match aceditor::Editor::open("ace_editor", Some(&opt)) {
|
match aceditor::Editor::open("ace_editor", Some(&opt)) {
|
||||||
Ok(editor) => state.editor().set(Some(editor)),
|
Ok(editor) => {
|
||||||
|
let exec = Closure::<dyn Fn() + 'static>::new(execute(state));
|
||||||
|
let command = aceditor::Command {
|
||||||
|
name: "executeCode".into(),
|
||||||
|
bind_key: BindKey {
|
||||||
|
win: "Ctrl-Enter".into(),
|
||||||
|
mac: "Ctrl-Enter|Command-Enter".into(),
|
||||||
|
},
|
||||||
|
exec: exec.as_ref().unchecked_ref::<js_sys::Function>().clone(),
|
||||||
|
read_only: true,
|
||||||
|
};
|
||||||
|
exec.forget();
|
||||||
|
editor.add_command(command);
|
||||||
|
state.editor().set(Some(editor));
|
||||||
|
}
|
||||||
Err(err) => state
|
Err(err) => state
|
||||||
.last_error()
|
.last_error()
|
||||||
.set(Some(SQLightError::new_ace_editor(err))),
|
.set(Some(SQLightError::new_ace_editor(err))),
|
||||||
|
|||||||
Reference in New Issue
Block a user