Fix cursor repaint.
This commit is contained in:
parent
fab0002a56
commit
a00d1ff65c
@ -75,6 +75,7 @@ pub fn render(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if row == cursor_row && col == cursor_col {
|
if row == cursor_row && col == cursor_col {
|
||||||
|
ctx.move_to(line_x, line_y);
|
||||||
cursor.draw(
|
cursor.draw(
|
||||||
ctx,
|
ctx,
|
||||||
font_ctx,
|
font_ctx,
|
||||||
|
@ -176,6 +176,7 @@ impl State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn queue_draw_area<M: AsRef<ModelRect>>(&mut self, rect_list: &[M]) {
|
fn queue_draw_area<M: AsRef<ModelRect>>(&mut self, rect_list: &[M]) {
|
||||||
|
//FIXME: extends by items before, then after
|
||||||
self.update_dirty_glyphs();
|
self.update_dirty_glyphs();
|
||||||
|
|
||||||
for rect in rect_list {
|
for rect in rect_list {
|
||||||
|
@ -29,6 +29,7 @@ impl Item {
|
|||||||
|
|
||||||
pub fn set_glyphs(&mut self, glyphs: pango::GlyphString) {
|
pub fn set_glyphs(&mut self, glyphs: pango::GlyphString) {
|
||||||
let mut glyphs = glyphs;
|
let mut glyphs = glyphs;
|
||||||
|
// FIXME: pango units
|
||||||
let (ink_rect, _) = glyphs.extents(&self.font);
|
let (ink_rect, _) = glyphs.extents(&self.font);
|
||||||
self.ink_rect = Some(ink_rect);
|
self.ink_rect = Some(ink_rect);
|
||||||
self.glyphs = Some(glyphs);
|
self.glyphs = Some(glyphs);
|
||||||
|
@ -109,6 +109,9 @@ impl ModelRect {
|
|||||||
right = self.right + len_since_right;
|
right = self.right + len_since_right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.left = left;
|
||||||
|
self.right = right;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_area_extend_ink(
|
pub fn to_area_extend_ink(
|
||||||
@ -124,58 +127,60 @@ impl ModelRect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn extend_left_right_area(&self, model: &UiModel, cell_metrics: &CellMetrics) -> (i32, i32) {
|
fn extend_left_right_area(&self, model: &UiModel, cell_metrics: &CellMetrics) -> (i32, i32) {
|
||||||
|
let x = self.left as i32 * cell_metrics.char_width as i32;
|
||||||
let mut x = self.left as i32 * cell_metrics.char_width as i32;
|
|
||||||
let mut x2 = (self.right + 1) as i32 * cell_metrics.char_width as i32;
|
let mut x2 = (self.right + 1) as i32 * cell_metrics.char_width as i32;
|
||||||
|
let mut min_x_offset = 0;
|
||||||
|
|
||||||
for row in self.top..self.bot + 1 {
|
for row in self.top..self.bot + 1 {
|
||||||
|
|
||||||
|
// FIXME: use original, not extended rect here
|
||||||
// left
|
// left
|
||||||
let line = &model.model[row];
|
let line = &model.model[row];
|
||||||
if let Some(&Item { ink_rect: Some(ink_rect), .. }) = line.get_item(self.left) {
|
if let Some(&Item { ink_rect: Some(ref ink_rect), .. }) = line.get_item(self.left) {
|
||||||
if x > ink_rect.x {
|
if ink_rect.x < min_x_offset {
|
||||||
x = ink_rect.x;
|
min_x_offset = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// right
|
// right
|
||||||
let line = &model.model[row];
|
let line = &model.model[row];
|
||||||
if let Some(&Item { ink_rect: Some(ink_rect), .. }) = line.get_item(self.right) {
|
if let Some(&Item { ink_rect: Some(ref ink_rect), .. }) = line.get_item(self.right) {
|
||||||
let ink_x = ink_rect.x + ink_rect.width;
|
let ink_x = x + ink_rect.x + ink_rect.width;
|
||||||
if x2 > ink_x {
|
if x2 < ink_x {
|
||||||
x2 = ink_x;
|
x2 = ink_x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(x, x2)
|
(x + min_x_offset, x2)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn extend_top_bottom_area(&self, model: &UiModel, cell_metrics: &CellMetrics) -> (i32, i32) {
|
fn extend_top_bottom_area(&self, model: &UiModel, cell_metrics: &CellMetrics) -> (i32, i32) {
|
||||||
let mut y = self.top as i32 * cell_metrics.line_height as i32;
|
let y = self.top as i32 * cell_metrics.line_height as i32;
|
||||||
let mut y2 = (self.bot + 1) as i32 * cell_metrics.line_height as i32;
|
let mut y2 = (self.bot + 1) as i32 * cell_metrics.line_height as i32;
|
||||||
|
let mut min_y_offset = 0;
|
||||||
|
|
||||||
for col in self.left..self.right + 1 {
|
for col in self.left..self.right + 1 {
|
||||||
|
|
||||||
// top
|
// top
|
||||||
let line = &model.model[self.top];
|
let line = &model.model[self.top];
|
||||||
if let Some(&Item { ink_rect: Some(ink_rect), .. }) = line.get_item(col) {
|
if let Some(&Item { ink_rect: Some(ref ink_rect), .. }) = line.get_item(col) {
|
||||||
if y > ink_rect.y {
|
if ink_rect.y < min_y_offset {
|
||||||
y = ink_rect.y;
|
min_y_offset = ink_rect.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// bottom
|
// bottom
|
||||||
let line = &model.model[self.bot];
|
let line = &model.model[self.bot];
|
||||||
if let Some(&Item { ink_rect: Some(ink_rect), .. }) = line.get_item(col) {
|
if let Some(&Item { ink_rect: Some(ref ink_rect), .. }) = line.get_item(col) {
|
||||||
let ink_y = ink_rect.y + ink_rect.height;
|
let ink_y = y + ink_rect.y + ink_rect.height;
|
||||||
if y2 < ink_y {
|
if y2 < ink_y {
|
||||||
y2 = ink_y;
|
y2 = ink_y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(y, y2)
|
(y + min_y_offset, y2)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn join(&mut self, rect: &ModelRect) {
|
pub fn join(&mut self, rect: &ModelRect) {
|
||||||
|
Loading…
Reference in New Issue
Block a user