closes #836, closes #832, bug fixes for #776

This commit is contained in:
Anton-4 2020-12-29 11:59:39 +01:00
parent 12990d293c
commit cf7c816123
2 changed files with 44 additions and 18 deletions

View file

@ -23,6 +23,7 @@ use std::path::Path;
use winit::event; use winit::event;
use winit::event::{Event, ModifiersState}; use winit::event::{Event, ModifiersState};
use winit::event_loop::ControlFlow; use winit::event_loop::ControlFlow;
use wgpu::{TextureView, CommandEncoder, RenderPass};
pub mod ast; pub mod ast;
@ -137,7 +138,7 @@ fn run_event_loop() -> Result<(), Box<dyn Error>> {
Event::WindowEvent { Event::WindowEvent {
event: event::WindowEvent::CloseRequested, event: event::WindowEvent::CloseRequested,
.. ..
} => *control_flow = winit::event_loop::ControlFlow::Exit, } => *control_flow = ControlFlow::Exit,
//Resize //Resize
Event::WindowEvent { Event::WindowEvent {
event: event::WindowEvent::Resized(new_size), event: event::WindowEvent::Resized(new_size),
@ -214,6 +215,7 @@ fn run_event_loop() -> Result<(), Box<dyn Error>> {
); );
if let Some(selection) = ed_model.selection_opt { if let Some(selection) = ed_model.selection_opt {
let selection_rects_res = create_selection_rects(selection, &glyph_bounds_rects); let selection_rects_res = create_selection_rects(selection, &glyph_bounds_rects);
match selection_rects_res { match selection_rects_res {
@ -225,26 +227,22 @@ fn run_event_loop() -> Result<(), Box<dyn Error>> {
&selection_rects, &selection_rects,
); );
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { let mut render_pass = begin_render_pass(&mut encoder, &frame.view);
color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor {
attachment: &frame.view,
resolve_target: None,
ops: wgpu::Operations::default(),
}],
depth_stencil_attachment: None,
});
render_pass.set_pipeline(&rect_pipeline); render_pass.set_pipeline(&rect_pipeline);
render_pass.set_bind_group(0, &ortho.bind_group, &[]); render_pass.set_bind_group(0, &ortho.bind_group, &[]);
render_pass.set_vertex_buffer(0, rect_buffers.vertex_buffer.slice(..)); render_pass.set_vertex_buffer(0, rect_buffers.vertex_buffer.slice(..));
render_pass.set_index_buffer(rect_buffers.index_buffer.slice(..)); render_pass.set_index_buffer(rect_buffers.index_buffer.slice(..));
render_pass.draw_indexed(0..rect_buffers.num_rects, 0, 0..1); render_pass.draw_indexed(0..rect_buffers.num_rects, 0, 0..1);
drop(render_pass);
}, },
Err(e) => print_err(&e) //TODO draw error text on screen Err(e) => {
begin_render_pass(&mut encoder, &frame.view);
print_err(&e) //TODO draw error text on screen
} }
} }
} else {
begin_render_pass(&mut encoder, &frame.view);
}
// draw all text // draw all text
glyph_brush glyph_brush
@ -278,6 +276,28 @@ fn run_event_loop() -> Result<(), Box<dyn Error>> {
} }
fn begin_render_pass<'a>(
encoder: &'a mut CommandEncoder,
texture_view: &'a TextureView
) -> RenderPass<'a> {
encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor {
attachment: texture_view,
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Clear(wgpu::Color {
r: 0.0,
g: 0.0,
b: 0.0,
a: 1.0,
}),
store: true,
},
}],
depth_stencil_attachment: None,
})
}
fn make_rect_pipeline( fn make_rect_pipeline(
gpu_device: &wgpu::Device, gpu_device: &wgpu::Device,
swap_chain_descr: &wgpu::SwapChainDescriptor, swap_chain_descr: &wgpu::SwapChainDescriptor,
@ -414,17 +434,23 @@ fn update_text_state(ed_model: &mut model::Model, received_char: &char) {
Position { Position {
line: ed_model.caret_pos.line + 1, line: ed_model.caret_pos.line + 1,
column: 0 column: 0
} };
ed_model.selection_opt = None;
} }
_ => { _ => {
let nr_lines = ed_model.lines.len();
if let Some(last_line) = ed_model.lines.last_mut() { if let Some(last_line) = ed_model.lines.last_mut() {
last_line.push(*received_char); last_line.push(*received_char);
ed_model.caret_pos = ed_model.caret_pos =
Position { Position {
line: ed_model.caret_pos.line, line: nr_lines - 1,
column: ed_model.caret_pos.column + 1 column: last_line.len()
} };
ed_model.selection_opt = None;
} }
} }
} }

View file

@ -10,7 +10,7 @@ pub fn move_caret_left(old_caret_pos: Position, old_selection_opt: Option<RawSel
if old_caret_pos.line == 0 { if old_caret_pos.line == 0 {
(0, 0) (0, 0)
} else if let Some(curr_line) = lines.get(old_line_nr - 1) { } else if let Some(curr_line) = lines.get(old_line_nr - 1) {
(old_line_nr - 1, curr_line.len()) (old_line_nr - 1, curr_line.len()-2)
} else { } else {
(0, 0) // this should never happen, should this method return Result? (0, 0) // this should never happen, should this method return Result?
} }