Disable mouse by default and bind `:m` to toggle

- Make mouse disabled by default.
- Add key binding `:m` to toggle mouse.

Closes: https://github.com/sayanarijit/xplr/issues/206
pull/218/head
Arijit Basu 3 years ago committed by Arijit Basu
parent 7de0811eaf
commit 7496f5bf8f

@ -1263,6 +1263,15 @@ pub enum ExternalMsg {
/// Clear all the node sorters.
ClearNodeSorters,
/// Enable mouse
EnableMouse,
/// Disable mouse
DisableMouse,
/// Toggle mouse
ToggleMouse,
/// Log information message.
///
/// **Example:** `LogInfo: launching satellite`
@ -1351,6 +1360,9 @@ pub enum MsgOut {
CallLua(String),
CallLuaSilently(String),
Enque(Task),
EnableMouse,
DisableMouse,
ToggleMouse,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
@ -1520,9 +1532,7 @@ impl App {
.to_owned()
.unwrap_or_else(|| "default".into()),
) {
Some(m) => m
.clone()
.sanitized(config.general().read_only().unwrap_or_default()),
Some(m) => m.clone().sanitized(config.general().read_only()),
None => {
bail!("'default' mode is missing")
}
@ -1551,7 +1561,7 @@ impl App {
.to_string();
let mut explorer_config = ExplorerConfig::default();
if !config.general().show_hidden().unwrap_or_default() {
if !config.general().show_hidden() {
explorer_config.filters.replace(NodeFilterApplicable::new(
NodeFilter::RelativePathDoesNotStartWith,
".".into(),
@ -1623,7 +1633,7 @@ impl App {
}
fn handle_external(self, msg: ExternalMsg, key: Option<Key>) -> Result<Self> {
if self.config().general().read_only().unwrap_or_default() && !msg.is_read_only() {
if self.config().general().read_only() && !msg.is_read_only() {
self.log_error("Cannot call shell command in read-only mode.".into())
} else {
match msg {
@ -1705,6 +1715,9 @@ impl App {
ExternalMsg::ReverseNodeSorters => self.reverse_node_sorters(),
ExternalMsg::ResetNodeSorters => self.reset_node_sorters(),
ExternalMsg::ClearNodeSorters => self.clear_node_sorters(),
ExternalMsg::EnableMouse => self.enable_mouse(),
ExternalMsg::DisableMouse => self.disable_mouse(),
ExternalMsg::ToggleMouse => self.toggle_mouse(),
ExternalMsg::LogInfo(l) => self.log_info(l),
ExternalMsg::LogSuccess(l) => self.log_success(l),
ExternalMsg::LogWarning(l) => self.log_warning(l),
@ -2112,7 +2125,7 @@ impl App {
self.input_buffer = None;
self.mode = mode
.to_owned()
.sanitized(self.config().general().read_only().unwrap_or_default());
.sanitized(self.config().general().read_only());
Ok(self)
} else {
self.log_error(format!("Mode not found: {}", mode))
@ -2125,7 +2138,7 @@ impl App {
self.input_buffer = None;
self.mode = mode
.to_owned()
.sanitized(self.config().general().read_only().unwrap_or_default());
.sanitized(self.config().general().read_only());
Ok(self)
} else {
self.log_error(format!("Builtin mode not found: {}", mode))
@ -2138,7 +2151,7 @@ impl App {
self.input_buffer = None;
self.mode = mode
.to_owned()
.sanitized(self.config().general().read_only().unwrap_or_default());
.sanitized(self.config().general().read_only());
Ok(self)
} else {
self.log_error(format!("Custom mode not found: {}", mode))
@ -2347,7 +2360,7 @@ impl App {
fn reset_node_filters(mut self) -> Result<Self> {
self.explorer_config.filters.clear();
if !self.config().general().show_hidden().unwrap_or_default() {
if !self.config().general().show_hidden() {
self.add_node_filter(NodeFilterApplicable::new(
NodeFilter::RelativePathDoesNotStartWith,
".".into(),
@ -2419,6 +2432,21 @@ impl App {
Ok(self)
}
fn enable_mouse(mut self) -> Result<Self> {
self.msg_out.push_back(MsgOut::EnableMouse);
Ok(self)
}
fn disable_mouse(mut self) -> Result<Self> {
self.msg_out.push_back(MsgOut::DisableMouse);
Ok(self)
}
fn toggle_mouse(mut self) -> Result<Self> {
self.msg_out.push_back(MsgOut::ToggleMouse);
Ok(self)
}
pub fn log_info(mut self, message: String) -> Result<Self> {
self.logs_hidden = false;
self.logs.push(Log::new(LogLevel::Info, message));

@ -437,10 +437,13 @@ impl PanelUi {
#[serde(deny_unknown_fields)]
pub struct GeneralConfig {
#[serde(default)]
pub show_hidden: Option<bool>,
pub enable_mouse: bool,
#[serde(default)]
pub read_only: Option<bool>,
pub show_hidden: bool,
#[serde(default)]
pub read_only: bool,
#[serde(default)]
pub cursor: UiElement,
@ -481,12 +484,12 @@ pub struct GeneralConfig {
impl GeneralConfig {
/// Get a reference to the general config's show hidden.
pub fn show_hidden(&self) -> Option<bool> {
pub fn show_hidden(&self) -> bool {
self.show_hidden
}
/// Get a reference to the general config's read only.
pub fn read_only(&self) -> Option<bool> {
pub fn read_only(&self) -> bool {
self.read_only
}
@ -549,6 +552,11 @@ impl GeneralConfig {
pub fn panel_ui(&self) -> &PanelUi {
&self.panel_ui
}
/// Get a reference to the general config's enable mouse.
pub fn enable_mouse(&self) -> bool {
self.enable_mouse
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]

@ -1334,6 +1334,13 @@ xplr.config.modes.builtin.action = {
},
}
},
["m"] = {
help = "toggle mouse",
messages = {
"PopMode",
"ToggleMouse",
}
},
["q"] = {
help = "quit",
messages = {

@ -124,7 +124,14 @@ pub(crate) fn run(
let mut stdout = get_tty()?;
// let mut stdout = stdout.lock();
execute!(stdout, term::EnterAlternateScreen)?;
execute!(stdout, event::EnableMouseCapture).unwrap_or_default(); // Optional
let mut mouse_enabled = app.config().general().enable_mouse();
if mouse_enabled {
if let Err(e) = execute!(stdout, event::EnableMouseCapture) {
app = app.log_error(e.to_string())?;
}
}
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
terminal.hide_cursor()?;
@ -198,6 +205,42 @@ pub(crate) fn run(
terminal.draw(|f| ui::draw(f, &app, &lua))?;
}
app::MsgOut::EnableMouse => {
if !mouse_enabled {
match execute!(terminal.backend_mut(), event::EnableMouseCapture) {
Ok(_) => {
mouse_enabled = true;
}
Err(e) => {
app = app.log_error(e.to_string())?;
}
}
}
}
app::MsgOut::ToggleMouse => {
let msg = if mouse_enabled {
app::ExternalMsg::DisableMouse
} else {
app::ExternalMsg::EnableMouse
};
app =
app.handle_task(app::Task::new(app::MsgIn::External(msg), None))?;
}
app::MsgOut::DisableMouse => {
if mouse_enabled {
match execute!(terminal.backend_mut(), event::DisableMouseCapture) {
Ok(_) => {
mouse_enabled = false;
}
Err(e) => {
app = app.log_error(e.to_string())?;
}
}
}
}
app::MsgOut::CallLuaSilently(func) => {
tx_event_reader.send(true)?;
@ -258,7 +301,7 @@ pub(crate) fn run(
app::MsgOut::CallLua(func) => {
execute!(terminal.backend_mut(), event::DisableMouseCapture)
.unwrap_or_default(); // Optional
.unwrap_or_default();
tx_event_reader.send(true)?;
@ -287,13 +330,21 @@ pub(crate) fn run(
terminal.hide_cursor()?;
tx_event_reader.send(false)?;
execute!(terminal.backend_mut(), event::EnableMouseCapture)
.unwrap_or_default(); // Optional
if mouse_enabled {
match execute!(terminal.backend_mut(), event::EnableMouseCapture) {
Ok(_) => {
mouse_enabled = true;
}
Err(e) => {
app = app.log_error(e.to_string())?;
}
}
}
}
app::MsgOut::Call(cmd) => {
execute!(terminal.backend_mut(), event::DisableMouseCapture)
.unwrap_or_default(); // Optional
.unwrap_or_default();
tx_event_reader.send(true)?;
@ -338,8 +389,16 @@ pub(crate) fn run(
terminal.hide_cursor()?;
tx_event_reader.send(false)?;
execute!(terminal.backend_mut(), event::EnableMouseCapture)
.unwrap_or_default(); // Optional
if mouse_enabled {
match execute!(terminal.backend_mut(), event::EnableMouseCapture) {
Ok(_) => {
mouse_enabled = true;
}
Err(e) => {
app = app.log_error(e.to_string())?;
}
}
}
}
};
}
@ -355,7 +414,7 @@ pub(crate) fn run(
terminal.clear()?;
terminal.set_cursor(0, 0)?;
execute!(terminal.backend_mut(), term::LeaveAlternateScreen)?;
execute!(terminal.backend_mut(), event::DisableMouseCapture).unwrap_or_default(); // Optional
execute!(terminal.backend_mut(), event::DisableMouseCapture).unwrap_or_default();
term::disable_raw_mode()?;
terminal.show_cursor()?;

@ -28,7 +28,7 @@ lazy_static! {
}
fn read_only_indicator(app: &app::App) -> &str {
if app.config().general().read_only().unwrap_or_default() {
if app.config().general().read_only() {
"(r)"
} else {
""

Loading…
Cancel
Save