use std::cell::RefCell;
use std::rc::Rc;
use slate_reactive::Signal;
use crate::event::{EventCtx, KeyCode, KeyEvent, is_command_modifier};
use crate::ime::ImeState;
use super::clipboard;
use super::ops::apply_snapshot;
pub(crate) fn handle_command_shortcut(
ev: &KeyEvent,
cx: &mut EventCtx,
state_rc: &Rc<RefCell<ImeState>>,
value: &Signal<String>,
multiline: bool,
) -> bool {
if !is_command_modifier(&ev.modifiers) || ev.modifiers.alt {
return false;
}
let shift = ev.modifiers.shift;
match ev.code {
KeyCode::KeyC => {
let state = state_rc.borrow();
if state.preedit.is_some() {
return true;
}
if let Some(payload) = clipboard::selected_text(&state) {
drop(state);
slate_platform::clipboard::set_text(&payload);
}
cx.stop_propagation();
true
}
KeyCode::KeyX => {
let payload = {
let state = state_rc.borrow();
if state.preedit.is_some() {
return true;
}
clipboard::selected_text(&state)
};
if let Some(text) = payload {
slate_platform::clipboard::set_text(&text);
let new_text = {
let mut state = state_rc.borrow_mut();
state.desired_x = None;
clipboard::apply_cut(&mut state)
};
value.set(new_text);
}
cx.stop_propagation();
true
}
KeyCode::KeyV => {
let pasted = match slate_platform::clipboard::get_text() {
Some(t) => t,
None => {
cx.stop_propagation();
return true;
}
};
let cleaned = clipboard::clean_paste(&pasted, multiline);
if cleaned.is_empty() {
cx.stop_propagation();
return true;
}
let new_text = {
let mut state = state_rc.borrow_mut();
state.desired_x = None;
clipboard::apply_paste(&mut state, &cleaned)
};
cx.stop_propagation();
value.set(new_text);
true
}
KeyCode::KeyZ => {
#[cfg(target_os = "macos")]
let is_redo = shift;
#[cfg(not(target_os = "macos"))]
let is_redo = false;
let _ = shift; let restored = {
let mut state = state_rc.borrow_mut();
let snap = if is_redo {
state.undo.redo()
} else {
state.undo.undo()
};
if let Some(ref s) = snap {
apply_snapshot(&mut state, s);
state.desired_x = None;
}
snap
};
if let Some(snap) = restored {
value.set(snap.text);
}
cx.stop_propagation();
true
}
#[cfg(not(target_os = "macos"))]
KeyCode::KeyY if !shift => {
let restored = {
let mut state = state_rc.borrow_mut();
let snap = state.undo.redo();
if let Some(ref s) = snap {
apply_snapshot(&mut state, s);
state.desired_x = None;
}
snap
};
if let Some(snap) = restored {
value.set(snap.text);
}
cx.stop_propagation();
true
}
_ => false,
}
}