Enum broot::command::ScrollCommand
source · Variants§
Implementations§
source§impl ScrollCommand
impl ScrollCommand
sourcepub fn is_up(self) -> bool
pub fn is_up(self) -> bool
Examples found in repository?
src/syntactic/syntactic_view.rs (line 283)
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
pub fn try_scroll(
&mut self,
cmd: ScrollCommand,
) -> bool {
let old_scroll = self.scroll;
self.scroll = cmd.apply(self.scroll, self.lines.len(), self.page_height);
if let Some(idx) = self.selection_idx {
if self.scroll == old_scroll {
let old_selection = self.selection_idx;
if cmd.is_up() {
self.selection_idx = Some(0);
} else {
self.selection_idx = Some(self.lines.len() - 1);
}
return self.selection_idx == old_selection;
} else if idx >= old_scroll && idx < old_scroll + self.page_height {
if idx + self.scroll < old_scroll {
self.selection_idx = Some(0);
} else if idx + self.scroll - old_scroll >= self.lines.len() {
self.selection_idx = Some(self.lines.len() - 1);
} else {
self.selection_idx = Some(idx + self.scroll - old_scroll);
}
}
}
self.scroll != old_scroll
}
sourcepub fn apply(
self,
scroll: usize,
content_height: usize,
page_height: usize
) -> usize
pub fn apply(
self,
scroll: usize,
content_height: usize,
page_height: usize
) -> usize
compute the new scroll value
Examples found in repository?
More examples
src/filesystems/filesystems_state.rs (line 110)
105 106 107 108 109 110 111 112 113 114 115 116 117
pub fn try_scroll(
&mut self,
cmd: ScrollCommand,
) -> bool {
let old_scroll = self.scroll;
self.scroll = cmd.apply(self.scroll, self.count(), self.page_height);
if self.selection_idx < self.scroll {
self.selection_idx = self.scroll;
} else if self.selection_idx >= self.scroll + self.page_height {
self.selection_idx = self.scroll + self.page_height - 1;
}
self.scroll != old_scroll
}
src/syntactic/syntactic_view.rs (line 279)
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
pub fn try_scroll(
&mut self,
cmd: ScrollCommand,
) -> bool {
let old_scroll = self.scroll;
self.scroll = cmd.apply(self.scroll, self.lines.len(), self.page_height);
if let Some(idx) = self.selection_idx {
if self.scroll == old_scroll {
let old_selection = self.selection_idx;
if cmd.is_up() {
self.selection_idx = Some(0);
} else {
self.selection_idx = Some(self.lines.len() - 1);
}
return self.selection_idx == old_selection;
} else if idx >= old_scroll && idx < old_scroll + self.page_height {
if idx + self.scroll < old_scroll {
self.selection_idx = Some(0);
} else if idx + self.scroll - old_scroll >= self.lines.len() {
self.selection_idx = Some(self.lines.len() - 1);
} else {
self.selection_idx = Some(idx + self.scroll - old_scroll);
}
}
}
self.scroll != old_scroll
}
sourcepub fn is_thumb(y: u16, scrollbar: Option<(u16, u16)>) -> bool
pub fn is_thumb(y: u16, scrollbar: Option<(u16, u16)>) -> bool
Examples found in repository?
src/stage/stage_state.rs (line 421)
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
fn display(
&mut self,
w: &mut W,
disc: &DisplayContext,
) -> Result<(), ProgramError> {
let stage = &disc.app_state.stage;
self.stage_sum.see_stage(stage); // this may invalidate the sum
if self.filtered_stage.update(stage) {
self.fix_scroll();
}
let area = &disc.state_area;
let styles = &disc.panel_skin.styles;
let width = area.width as usize;
w.queue(cursor::MoveTo(area.left, 0))?;
let mut cw = CropWriter::new(w, width);
self.write_title_line(stage, &mut cw, styles)?;
let list_area = Area::new(area.left, area.top + 1, area.width, area.height - 1);
self.page_height = list_area.height as usize;
let pattern = &self.filtered_stage.pattern().pattern;
let pattern_object = pattern.object();
let scrollbar = list_area.scrollbar(self.scroll, self.filtered_stage.len());
for idx in 0..self.page_height {
let y = list_area.top + idx as u16;
let stage_idx = idx + self.scroll;
w.queue(cursor::MoveTo(area.left, y))?;
let mut cw = CropWriter::new(w, width - 1);
let cw = &mut cw;
if let Some((path, selected)) = self.filtered_stage.path_sel(stage, stage_idx) {
let mut style = if path.is_dir() {
&styles.directory
} else {
&styles.file
};
let mut bg_style;
if selected {
bg_style = style.clone();
if let Some(c) = styles.selected_line.get_bg() {
bg_style.set_bg(c);
}
style = &bg_style;
}
let mut bg_style_match;
let mut style_match = &styles.char_match;
if selected {
bg_style_match = style_match.clone();
if let Some(c) = styles.selected_line.get_bg() {
bg_style_match.set_bg(c);
}
style_match = &bg_style_match;
}
if disc.con.show_selection_mark && self.filtered_stage.has_selection() {
cw.queue_char(style, if selected { '▶' } else { ' ' })?;
}
if pattern_object.subpath {
let label = path.to_string_lossy();
// we must display the matching on the whole path
// (subpath is the path for the staging area)
let name_match = pattern.search_string(&label);
let matched_string = MatchedString::new(
name_match,
&label,
style,
style_match,
);
matched_string.queue_on(cw)?;
} else if let Some(file_name) = path.file_name() {
let label = file_name.to_string_lossy();
let label_cols = label.width();
if label_cols + 2 < cw.allowed {
if let Some(parent_path) = path.parent() {
let mut parent_style = &styles.parent;
let mut bg_style;
if selected {
bg_style = parent_style.clone();
if let Some(c) = styles.selected_line.get_bg() {
bg_style.set_bg(c);
}
parent_style = &bg_style;
}
let cols_max = cw.allowed - label_cols - 3;
let parent_path = parent_path.to_string_lossy();
let parent_cols = parent_path.width();
if parent_cols <= cols_max {
cw.queue_str(
parent_style,
&parent_path,
)?;
} else {
// TODO move to (crop_writer ? termimad ?)
// we'll compute the size of the tail fitting
// the width minus one (for the ellipsis)
let mut bytes_count = 0;
let mut cols_count = 0;
for c in parent_path.chars().rev() {
let char_width = UnicodeWidthChar::width(c).unwrap_or(0);
let next_str_width = cols_count + char_width;
if next_str_width > cols_max {
break;
}
cols_count = next_str_width;
bytes_count += c.len_utf8();
}
cw.queue_char(
parent_style,
ELLIPSIS,
)?;
cw.queue_str(
parent_style,
&parent_path[parent_path.len()-bytes_count..],
)?;
}
cw.queue_char(
parent_style,
'/',
)?;
}
}
let name_match = pattern.search_string(&label);
let matched_string = MatchedString::new(
name_match,
&label,
style,
style_match,
);
matched_string.queue_on(cw)?;
} else {
// this should not happen
warn!("how did we fall on a path without filename?");
}
cw.fill(style, &SPACE_FILLING)?;
}
cw.fill(&styles.default, &SPACE_FILLING)?;
let scrollbar_style = if ScrollCommand::is_thumb(y, scrollbar) {
&styles.scrollbar_thumb
} else {
&styles.scrollbar_track
};
scrollbar_style.queue_str(w, "▐")?;
}
Ok(())
}
More examples
src/filesystems/filesystems_state.rs (line 464)
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
fn display(
&mut self,
w: &mut W,
disc: &DisplayContext,
) -> Result<(), ProgramError> {
let area = &disc.state_area;
let con = &disc.con;
self.page_height = area.height as usize - 2;
let (mounts, selection_idx) = if let Some(filtered) = &self.filtered {
(filtered.mounts.as_slice(), filtered.selection_idx)
} else {
(self.mounts.as_slice(), self.selection_idx)
};
let scrollbar = area.scrollbar(self.scroll, mounts.len());
//- style preparation
let styles = &disc.panel_skin.styles;
let selection_bg = styles.selected_line.get_bg()
.unwrap_or(Color::AnsiValue(240));
let match_style = &styles.char_match;
let mut selected_match_style = styles.char_match.clone();
selected_match_style.set_bg(selection_bg);
let border_style = &styles.help_table_border;
let mut selected_border_style = styles.help_table_border.clone();
selected_border_style.set_bg(selection_bg);
//- width computations and selection of columns to display
let width = area.width as usize;
let w_fs = mounts.iter()
.map(|m| m.info.fs.chars().count())
.max().unwrap_or(0)
.max("filesystem".len());
let mut wc_fs = w_fs; // width of the column (may include selection mark)
if con.show_selection_mark {
wc_fs += 1;
}
let w_dsk = 5; // max width of a lfs-core disk type
let w_type = mounts.iter()
.map(|m| m.info.fs_type.chars().count())
.max().unwrap_or(0)
.max("type".len());
let w_size = 4;
let w_use = 4;
let mut w_use_bar = 1; // min size, may grow if space available
let w_use_share = 4;
let mut wc_use = w_use; // sum of all the parts of the usage column
let w_free = 4;
let w_mount_point = mounts.iter()
.map(|m| m.info.mount_point.to_string_lossy().chars().count())
.max().unwrap_or(0)
.max("mount point".len());
let w_mandatory = wc_fs + 1 + w_size + 1 + w_free + 1 + w_mount_point;
let mut e_dsk = false;
let mut e_type = false;
let mut e_use_bar = false;
let mut e_use_share = false;
let mut e_use = false;
if w_mandatory + 1 < width {
let mut rem = width - w_mandatory - 1;
if rem > w_use {
rem -= w_use + 1;
e_use = true;
}
if e_use && rem > w_use_share {
rem -= w_use_share; // no separation with use
e_use_share = true;
wc_use += w_use_share;
}
if rem > w_dsk {
rem -= w_dsk + 1;
e_dsk = true;
}
if e_use && rem > w_use_bar {
rem -= w_use_bar + 1;
e_use_bar = true;
wc_use += w_use_bar + 1;
}
if rem > w_type {
rem -= w_type + 1;
e_type = true;
}
if e_use_bar && rem > 0 {
let incr = rem.min(9);
w_use_bar += incr;
wc_use += incr;
}
}
//- titles
w.queue(cursor::MoveTo(area.left, area.top))?;
let mut cw = CropWriter::new(w, width);
cw.queue_g_string(&styles.default, format!("{:wc_fs$}", "filesystem"))?;
cw.queue_char(border_style, '│')?;
if e_dsk {
cw.queue_g_string(&styles.default, "disk ".to_string())?;
cw.queue_char(border_style, '│')?;
}
if e_type {
cw.queue_g_string(&styles.default, format!("{:^w_type$}", "type"))?;
cw.queue_char(border_style, '│')?;
}
if e_use {
cw.queue_g_string(&styles.default, format!(
"{:^width$}", if wc_use > 4 { "usage" } else { "use" }, width = wc_use
))?;
cw.queue_char(border_style, '│')?;
}
cw.queue_g_string(&styles.default, "free".to_string())?;
cw.queue_char(border_style, '│')?;
cw.queue_g_string(&styles.default, "size".to_string())?;
cw.queue_char(border_style, '│')?;
cw.queue_g_string(&styles.default, "mount point".to_string())?;
cw.fill(border_style, &SPACE_FILLING)?;
//- horizontal line
w.queue(cursor::MoveTo(area.left, 1 + area.top))?;
let mut cw = CropWriter::new(w, width);
cw.queue_g_string(border_style, format!("{:─>width$}", '┼', width = wc_fs + 1))?;
if e_dsk {
cw.queue_g_string(border_style, format!("{:─>width$}", '┼', width = w_dsk + 1))?;
}
if e_type {
cw.queue_g_string(border_style, format!("{:─>width$}", '┼', width = w_type+1))?;
}
cw.queue_g_string(border_style, format!("{:─>width$}", '┼', width = w_size+1))?;
if e_use {
cw.queue_g_string(border_style, format!("{:─>width$}", '┼', width = wc_use+1))?;
}
cw.queue_g_string(border_style, format!("{:─>width$}", '┼', width = w_free+1))?;
cw.fill(border_style, &BRANCH_FILLING)?;
//- content
let mut idx = self.scroll as usize;
for y in 2..area.height {
w.queue(cursor::MoveTo(area.left, y + area.top))?;
let selected = selection_idx == idx;
let mut cw = CropWriter::new(w, width - 1); // -1 for scrollbar
let txt_style = if selected { &styles.selected_line } else { &styles.default };
if let Some(mount) = mounts.get(idx) {
let match_style = if selected { &selected_match_style } else { match_style };
let border_style = if selected { &selected_border_style } else { border_style };
if con.show_selection_mark {
cw.queue_char(txt_style, if selected { '▶' } else { ' ' })?;
}
// fs
let s = &mount.info.fs;
let mut matched_string = MatchedString::new(
self.filtered.as_ref().and_then(|f| f.pattern.search_string(s)),
s,
txt_style,
match_style,
);
matched_string.fill(w_fs, Alignment::Left);
matched_string.queue_on(&mut cw)?;
cw.queue_char(border_style, '│')?;
// dsk
if e_dsk {
if let Some(disk) = mount.disk.as_ref() {
let s = disk.disk_type();
let mut matched_string = MatchedString::new(
self.filtered.as_ref().and_then(|f| f.pattern.search_string(s)),
s,
txt_style,
match_style,
);
matched_string.fill(5, Alignment::Center);
matched_string.queue_on(&mut cw)?;
} else {
cw.queue_g_string(txt_style, " ".to_string())?;
}
cw.queue_char(border_style, '│')?;
}
// type
if e_type {
let s = &mount.info.fs_type;
let mut matched_string = MatchedString::new(
self.filtered.as_ref().and_then(|f| f.pattern.search_string(s)),
s,
txt_style,
match_style,
);
matched_string.fill(w_type, Alignment::Center);
matched_string.queue_on(&mut cw)?;
cw.queue_char(border_style, '│')?;
}
// size, used, free
if let Some(stats) = mount.stats().filter(|s| s.size() > 0) {
let share_color = super::share_color(stats.use_share());
// used
if e_use {
cw.queue_g_string(txt_style, format!("{:>4}", file_size::fit_4(stats.used())))?;
if e_use_share {
cw.queue_g_string(txt_style, format!("{:>3.0}%", 100.0*stats.use_share()))?;
}
if e_use_bar {
cw.queue_char(txt_style, ' ')?;
let pb = ProgressBar::new(stats.use_share() as f32, w_use_bar);
let mut bar_style = styles.default.clone();
bar_style.set_bg(share_color);
cw.queue_g_string(&bar_style, format!("{:<width$}", pb, width=w_use_bar))?;
}
cw.queue_char(border_style, '│')?;
}
// free
let mut share_style = txt_style.clone();
share_style.set_fg(share_color);
cw.queue_g_string(&share_style, format!("{:>4}", file_size::fit_4(stats.available())))?;
cw.queue_char(border_style, '│')?;
// size
if let Some(stats) = mount.stats() {
cw.queue_g_string(txt_style, format!("{:>4}", file_size::fit_4(stats.size())))?;
} else {
cw.repeat(txt_style, &SPACE_FILLING, 4)?;
}
cw.queue_char(border_style, '│')?;
} else {
// used
if e_use {
cw.repeat(txt_style, &SPACE_FILLING, wc_use)?;
cw.queue_char(border_style, '│')?;
}
// free
cw.repeat(txt_style, &SPACE_FILLING, w_free)?;
cw.queue_char(border_style, '│')?;
// size
cw.repeat(txt_style, &SPACE_FILLING, w_size)?;
cw.queue_char(border_style, '│')?;
}
// mount point
let s = &mount.info.mount_point.to_string_lossy();
let matched_string = MatchedString::new(
self.filtered.as_ref().and_then(|f| f.pattern.search_string(s)),
s,
txt_style,
match_style,
);
matched_string.queue_on(&mut cw)?;
idx += 1;
}
cw.fill(txt_style, &SPACE_FILLING)?;
let scrollbar_style = if ScrollCommand::is_thumb(y, scrollbar) {
&styles.scrollbar_thumb
} else {
&styles.scrollbar_track
};
scrollbar_style.queue_str(w, "▐")?;
}
Ok(())
}
Trait Implementations§
source§impl Clone for ScrollCommand
impl Clone for ScrollCommand
source§fn clone(&self) -> ScrollCommand
fn clone(&self) -> ScrollCommand
Returns a copy of the value. Read more
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read more