mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-27 11:16:03 +00:00
TextView now scrolls content if needed
This commit is contained in:
parent
25e1ca6074
commit
dd4d0692b2
@ -1,9 +1,19 @@
|
|||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean semper risus turpis, a blandit magna scelerisque vitae. Etiam urna dui, ullamcorper ornare libero eu, suscipit lacinia justo. Maecenas lobortis elit vel nibh elementum malesuada. Nam erat lorem, efficitur a tortor eget, mattis tempor nunc. Donec vel fringilla ipsum. Nullam consequat lacus nec feugiat consectetur. Etiam a ante aliquam, aliquet metus id, maximus enim. Maecenas lorem diam, gravida vitae varius suscipit, posuere nec nisl. Nunc non justo est. Ut sagittis est efficitur sapien mollis varius. Sed blandit magna in nibh pellentesque tincidunt. In arcu sem, egestas at odio vel, condimentum placerat lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla venenatis leo eu tellus consectetur tristique. Vestibulum pretium rutrum purus vitae rhoncus. Fusce eros libero, dignissim tristique lobortis et, tincidunt eu ex.
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sit amet porttitor ex. Vivamus ultricies nec massa eget fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis et luctus odio. Phasellus et lacus dolor. Praesent ut nulla quis magna auctor consequat ornare quis orci. Nam quis tempus massa.
|
||||||
|
|
||||||
Quisque in bibendum nisi. Donec venenatis ligula dolor, sed malesuada ex tincidunt a. Vestibulum diam nulla, placerat a nibh non, dignissim mollis tortor. Donec lacinia tellus vel nulla mollis accumsan. Suspendisse vel massa vestibulum, aliquet tellus in, dignissim massa. Praesent feugiat viverra cursus. Maecenas eget urna leo. Nullam dui eros, egestas nec lacus vitae, ultrices vestibulum augue. Morbi vel massa eget lorem elementum dignissim eget sed risus. Curabitur ultricies nisl in erat pulvinar maximus. Donec at enim augue. Curabitur lacinia vestibulum risus, eget vulputate ante rhoncus quis.
|
Mauris cursus interdum risus et vulputate. Nunc et scelerisque tellus, vitae condimentum nulla. Suspendisse tincidunt ipsum sit amet eros auctor ultricies. Vestibulum non diam quam. In sem nunc, gravida sagittis rutrum eget, tincidunt ut mi. Vivamus quam quam, mattis sed rutrum quis, rhoncus ac enim. Aliquam rutrum ac ligula et pellentesque. Donec consequat, nisi eget volutpat gravida, velit sem dapibus libero, vel hendrerit mi lorem et risus. Nunc iaculis convallis bibendum. Morbi sit amet lectus rhoncus, euismod tortor eu, cursus justo. Quisque non sagittis sapien.
|
||||||
|
|
||||||
Praesent iaculis enim id eros consectetur venenatis. Nunc malesuada faucibus luctus. Proin vel malesuada lacus, sed tempus risus. Quisque sagittis arcu dignissim ex pulvinar euismod. Vivamus elementum quis nibh sed rhoncus. Curabitur tristique elit id dolor rhoncus, et facilisis eros dictum. In a vulputate sapien, vitae tincidunt leo. Integer ornare enim elit, a pellentesque ex venenatis at. Pellentesque purus libero, posuere vel magna nec, imperdiet aliquam mi.
|
Fusce ornare scelerisque ante a egestas. Nam quis nulla nunc. Ut lacinia eleifend leo eu accumsan. Aenean et ex quis velit accumsan fringilla. Praesent lobortis nisl augue, non sollicitudin magna tempus a. Donec varius lorem justo, sed fermentum sem tempor non. Sed varius blandit urna, sed sodales est porttitor ac. Nunc sollicitudin consequat sodales. Aliquam et auctor nulla. Fusce sit amet risus gravida, porta eros eget, luctus eros. In eu malesuada metus, eu tempus libero.
|
||||||
|
|
||||||
Sed consectetur imperdiet augue et consectetur. Aliquam rhoncus nisl et mi lobortis ultricies. Fusce pretium mi nibh, in maximus nunc porta et. Morbi maximus elit vel egestas sagittis. Pellentesque egestas vehicula augue. Quisque ornare placerat ante, non vulputate nisl placerat commodo. Nam sit amet eros placerat, varius diam a, bibendum sem. Mauris orci leo, dapibus nec sapien eu, finibus hendrerit erat. Duis et neque diam. Vivamus nec ultrices ipsum. In hac habitasse platea dictumst. Fusce vel eros sit amet velit sollicitudin eleifend vitae et nunc.
|
Phasellus sit amet nibh bibendum, faucibus est in, luctus turpis. Sed lobortis eget massa a facilisis. Cras venenatis, nulla ut tempor ornare, erat velit tempus leo, eget sodales libero nibh non nisl. Mauris eget fringilla mi. Vivamus accumsan non erat ut malesuada. Duis vehicula cursus ex. Nam quis lorem non dolor luctus tristique. Fusce et sapien egestas, fringilla nulla et, ullamcorper quam.
|
||||||
|
|
||||||
Donec elementum pharetra elit, quis finibus ante dictum et. Vivamus tristique dignissim nulla. Ut dignissim tincidunt elementum. Nullam pellentesque turpis sapien, iaculis sagittis arcu mollis nec. Pellentesque quis vehicula urna. Aenean pretium eget ex vitae interdum. Phasellus pharetra magna id vehicula cursus. Vivamus egestas id nulla et lacinia. Donec congue at eros volutpat tristique. Donec mi tortor, commodo a nisl sed, vulputate malesuada velit. Morbi sed sagittis odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia auctor dapibus. Quisque sagittis odio vel urna laoreet ultrices.
|
Etiam vel tellus erat. Vestibulum aliquet vulputate erat in elementum. Sed tempor aliquam sollicitudin. Aenean porttitor justo et lorem pharetra molestie. Ut neque erat, aliquet eget auctor in, congue at augue. Suspendisse eget metus lorem. Mauris ex neque, luctus sed mauris sed, ultricies ultrices tellus.
|
||||||
|
|
||||||
|
Vestibulum sit amet porttitor ante, eu lacinia urna. Nulla nec tristique nisi. Morbi sodales risus eu tincidunt iaculis. Donec fringilla est odio, sit amet aliquet neque finibus non. Pellentesque interdum ante eget orci sagittis, ut pulvinar nulla faucibus. Fusce aliquam id ipsum luctus vehicula. Ut vitae dui a nisi aliquam vestibulum id vitae nunc. Nulla et sodales urna. Curabitur lectus mi, lobortis vitae rhoncus at, blandit eu dui. Maecenas nisl ante, faucibus tristique laoreet sed, blandit at justo. Mauris id elementum ex.
|
||||||
|
|
||||||
|
Donec sit amet volutpat turpis. Phasellus a congue urna. Pellentesque nec commodo libero. Fusce dapibus egestas suscipit. Vivamus sed mattis libero, a tristique nulla. Vivamus nec dui eget nibh eleifend imperdiet. Curabitur efficitur egestas sapien, ut tempus nulla mattis sit amet. Duis molestie aliquam metus et eleifend. Quisque in vestibulum purus. Curabitur maximus lorem a nisl cursus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
|
||||||
|
|
||||||
|
Praesent dui lectus, commodo eget nulla ut, maximus facilisis ligula. Aliquam ultricies augue ac pellentesque pellentesque. Nunc maximus euismod dolor, ac dignissim metus facilisis non. Aliquam feugiat dui sed tortor vehicula, a suscipit odio posuere. In et volutpat mi, non rhoncus diam. Donec interdum sem justo, id aliquet elit ornare at. Nunc vel blandit lectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed posuere ipsum, nec mattis nisl. In risus nunc, volutpat at faucibus id, rhoncus sit amet tortor. Sed porta pellentesque nibh in ornare. Nam porttitor tortor nec risus bibendum, et sodales nibh faucibus. Aliquam erat volutpat. Maecenas laoreet vestibulum purus, pretium tristique velit elementum nec. Sed at nulla sed lorem tincidunt mattis quis ac lorem. Nunc placerat gravida congue.
|
||||||
|
|
||||||
|
Etiam diam neque, dictum in eros ac, lacinia gravida orci. Cras in nisi augue. Fusce condimentum vestibulum nisl convallis lacinia. Mauris ligula diam, facilisis quis nulla ut, luctus feugiat eros. Duis ac consequat nisl. Nulla facilisi. Integer euismod mauris a feugiat gravida. Nulla consectetur est vitae lectus semper porttitor. Cras pellentesque tincidunt lacus, id sagittis lectus tincidunt eu. Mauris pellentesque lobortis aliquet. Mauris nec est bibendum, cursus metus eget, maximus nunc. Donec fermentum eros quis dolor imperdiet accumsan.
|
||||||
|
|
||||||
|
Sed vitae rhoncus velit. Proin eu luctus libero. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean imperdiet diam vitae eros vehicula mattis. Sed auctor erat et sapien mattis, sit amet faucibus risus tempus. Praesent ut commodo dui. Pellentesque et sodales purus. Nullam mollis sed urna eget aliquet.
|
||||||
|
@ -1,15 +1,20 @@
|
|||||||
use std::cmp;
|
use std::cmp::{max,min};
|
||||||
|
|
||||||
|
use ncurses;
|
||||||
|
|
||||||
|
use color;
|
||||||
use vec::Vec2;
|
use vec::Vec2;
|
||||||
use view::{View,DimensionRequest,SizeRequest};
|
use view::{View,DimensionRequest,SizeRequest};
|
||||||
use div::*;
|
use div::*;
|
||||||
use printer::Printer;
|
use printer::Printer;
|
||||||
|
use event::EventResult;
|
||||||
|
|
||||||
/// A simple view showing a fixed text
|
/// A simple view showing a fixed text
|
||||||
pub struct TextView {
|
pub struct TextView {
|
||||||
content: String,
|
content: String,
|
||||||
rows: Vec<Row>,
|
rows: Vec<Row>,
|
||||||
start_line: usize,
|
start_line: usize,
|
||||||
|
view_height: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subset of the main content representing a row on the display.
|
// Subset of the main content representing a row on the display.
|
||||||
@ -53,6 +58,7 @@ impl TextView {
|
|||||||
content: content.to_string(),
|
content: content.to_string(),
|
||||||
start_line: 0,
|
start_line: 0,
|
||||||
rows: Vec::new(),
|
rows: Vec::new(),
|
||||||
|
view_height: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +95,7 @@ impl TextView {
|
|||||||
|
|
||||||
for line in self.content.split("\n") {
|
for line in self.content.split("\n") {
|
||||||
height += 1;
|
height += 1;
|
||||||
max_width = cmp::max(max_width, line.len());
|
max_width = max(max_width, line.len());
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2::new(max_width, height)
|
Vec2::new(max_width, height)
|
||||||
@ -174,6 +180,32 @@ impl View for TextView {
|
|||||||
for (i,line) in self.rows.iter().skip(self.start_line).map(|row| &self.content[row.start..row.end]).enumerate() {
|
for (i,line) in self.rows.iter().skip(self.start_line).map(|row| &self.content[row.start..row.end]).enumerate() {
|
||||||
printer.print((0,i), line);
|
printer.print((0,i), line);
|
||||||
}
|
}
|
||||||
|
if self.view_height < self.rows.len() {
|
||||||
|
// We directly compute the size of the scrollbar (this allow use to avoid using floats).
|
||||||
|
// (ratio) * max_height
|
||||||
|
// Where ratio is ({start or end} / content.height)
|
||||||
|
let start = self.view_height * self.start_line / self.rows.len();
|
||||||
|
let end = self.view_height * (self.start_line + self.view_height) / self.rows.len();
|
||||||
|
printer.with_style(color::HIGHLIGHT, |printer| {
|
||||||
|
printer.print_vline((printer.size.x-1, start), end-start, ' ' as u64);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_key_event(&mut self, ch: i32) -> EventResult {
|
||||||
|
if self.view_height >= self.rows.len() {
|
||||||
|
return EventResult::Ignored;
|
||||||
|
}
|
||||||
|
|
||||||
|
match ch {
|
||||||
|
ncurses::KEY_UP if self.start_line > 0 => self.start_line -= 1,
|
||||||
|
ncurses::KEY_DOWN if self.start_line+self.view_height < self.rows.len() => self.start_line += 1,
|
||||||
|
ncurses::KEY_NPAGE => self.start_line = min(self.start_line+10, self.rows.len()-self.view_height),
|
||||||
|
ncurses::KEY_PPAGE => self.start_line -= min(self.start_line, 10),
|
||||||
|
_ => return EventResult::Ignored,
|
||||||
|
}
|
||||||
|
|
||||||
|
return EventResult::Consumed(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_min_size(&self, size: SizeRequest) -> Vec2 {
|
fn get_min_size(&self, size: SizeRequest) -> Vec2 {
|
||||||
@ -206,6 +238,13 @@ impl View for TextView {
|
|||||||
|
|
||||||
fn layout(&mut self, size: Vec2) {
|
fn layout(&mut self, size: Vec2) {
|
||||||
// Compute the text rows.
|
// Compute the text rows.
|
||||||
self.rows = LinesIterator::new(&self.content, size.x as usize).collect();
|
self.view_height = size.y;
|
||||||
|
self.rows = LinesIterator::new(&self.content, size.x ).collect();
|
||||||
|
if self.rows.len() > size.y {
|
||||||
|
self.rows = LinesIterator::new(&self.content, size.x - 1).collect();
|
||||||
|
self.start_line = min(self.start_line, self.rows.len() - size.y);
|
||||||
|
} else {
|
||||||
|
self.start_line = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user