Fix empty block selection detection

Fixes #2789.
This commit is contained in:
Christian Duerr 2019-09-13 23:51:14 +00:00 committed by GitHub
parent 1067fa609b
commit fb37a9cb55
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 4 deletions

View File

@ -132,7 +132,7 @@ impl Selection {
pub fn is_empty(&self) -> bool {
match *self {
Selection::Simple { ref region } | Selection::Block { ref region } => {
Selection::Simple { ref region } => {
let (start, end) =
if Selection::points_need_swap(region.start.point, region.end.point) {
(&region.end, &region.start)
@ -140,13 +140,26 @@ impl Selection {
(&region.start, &region.end)
};
// Empty when single cell with identical sides or two cell with right+left sides
// Simple selection is empty when the points are identical
// or two adjacent cells have the sides right -> left
start == end
|| (start.side == Side::Left
&& end.side == Side::Right
&& start.point.line == end.point.line
&& (start.point.line == end.point.line)
&& start.point.col == end.point.col + 1)
},
Selection::Block { region: Range { ref start, ref end } } => {
// Block selection is empty when the points' columns and sides are identical
// or two cells with adjacent columns have the sides right -> left,
// regardless of their lines
(start.point.col == end.point.col && start.side == end.side)
|| (start.point.col == end.point.col + 1
&& start.side == Side::Left
&& end.side == Side::Right)
|| (end.point.col == start.point.col + 1
&& end.side == Side::Left
&& start.side == Side::Right)
},
Selection::Semantic { .. } | Selection::Lines { .. } => false,
}
}
@ -589,4 +602,30 @@ mod test {
is_block: false,
});
}
#[test]
fn simple_is_empty() {
let mut selection = Selection::simple(Point::new(0, Column(0)), Side::Right);
assert!(selection.is_empty());
selection.update(Point::new(0, Column(1)), Side::Left);
assert!(selection.is_empty());
selection.update(Point::new(1, Column(0)), Side::Right);
assert!(!selection.is_empty());
}
#[test]
fn block_is_empty() {
let mut selection = Selection::block(Point::new(0, Column(0)), Side::Right);
assert!(selection.is_empty());
selection.update(Point::new(0, Column(1)), Side::Left);
assert!(selection.is_empty());
selection.update(Point::new(0, Column(1)), Side::Right);
assert!(!selection.is_empty());
selection.update(Point::new(1, Column(0)), Side::Right);
assert!(selection.is_empty());
selection.update(Point::new(1, Column(1)), Side::Left);
assert!(selection.is_empty());
selection.update(Point::new(1, Column(1)), Side::Right);
assert!(!selection.is_empty());
}
}

View File

@ -28,6 +28,7 @@ use mio::unix::EventedFd;
use std::ffi::CStr;
use std::fs::File;
use std::io;
use std::mem::MaybeUninit;
use std::os::unix::{
io::{AsRawFd, FromRawFd, RawFd},
process::CommandExt,
@ -35,7 +36,6 @@ use std::os::unix::{
use std::process::{Child, Command, Stdio};
use std::ptr;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::mem::MaybeUninit;
/// Process ID of child process
///