URI: 
       Implemented scrolling. - icy_draw - icy_draw is the successor to mystic draw. fork / mirror
  HTML git clone https://git.drkhsh.at/icy_draw.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 906be91c3e212815d54e66f676a13e3a2c1ba996
   DIR parent a0ca960f85018a903b51feb0443c9c877edc1f03
  HTML Author: Mike Krüger <mkrueger@posteo.de>
       Date:   Sat, 17 Dec 2022 10:03:09 +0100
       
       Implemented scrolling.
       
       Diffstat:
         M src/ui/ansi_editor/buffer_view.rs   |       8 ++++----
         M src/ui/ansi_editor/mod.rs           |      42 ++++++++++++++++----------------
         M src/ui/ansi_editor/render.rs        |      27 +++++++++++++--------------
       
       3 files changed, 38 insertions(+), 39 deletions(-)
       ---
   DIR diff --git a/src/ui/ansi_editor/buffer_view.rs b/src/ui/ansi_editor/buffer_view.rs
       @@ -46,7 +46,7 @@ pub struct BufferView {
            pub character_blink: Blink,
        
            pub scale: f32,
       -    pub scroll_back_line: i32,
       +    pub scroll_first_line: i32,
        
            pub button_pressed: bool,
        
       @@ -331,7 +331,7 @@ void main() {
                    let render_texture = gl.create_texture().unwrap();
                    let render_buffer_size = Vec2::new(
                        buf.get_font_dimensions().width as f32 * buf.get_buffer_width() as f32,
       -                buf.get_font_dimensions().height as f32 * buf.get_real_buffer_height() as f32,
       +                buf.get_font_dimensions().height as f32 * buf.get_buffer_height() as f32,
                    );
        
                    let filter = glow::NEAREST as i32; /*match options.scaling {
       @@ -389,7 +389,7 @@ void main() {
                    let sixel_render_texture = gl.create_texture().unwrap();
                    let render_buffer_size = Vec2::new(
                        buf.get_font_dimensions().width as f32 * buf.get_buffer_width() as f32,
       -                buf.get_font_dimensions().height as f32 * buf.get_real_buffer_height() as f32,
       +                buf.get_font_dimensions().height as f32 * buf.get_buffer_height() as f32,
                    );
        
                    gl.bind_texture(glow::TEXTURE_2D, Some(sixel_render_texture));
       @@ -450,7 +450,7 @@ void main() {
                        redraw_view: false,
                        redraw_palette: false,
                        redraw_font: false,
       -                scroll_back_line: 0,
       +                scroll_first_line: 0,
                        selection_opt: None,
                        colors,
                        fonts,
   DIR diff --git a/src/ui/ansi_editor/mod.rs b/src/ui/ansi_editor/mod.rs
       @@ -81,28 +81,31 @@ impl Document for AnsiEditor {
        
            fn show_ui(&mut self, ui: &mut eframe::egui::Ui) {
                let size = ui.max_rect().size();
       -        let buf_w = self.buffer_view.lock().unwrap().editor.buf.get_buffer_width();
       -        let buf_h = self.buffer_view.lock().unwrap().editor.buf.get_real_buffer_height();
       -        let scale = self.buffer_view.lock().unwrap().scale;
       -        // let h = max(buf_h, buffer_view.lock().unwrap().buf.get_real_buffer_height());
       -        let font_dimensions = self.buffer_view.lock().unwrap().editor.buf.get_font_dimensions();
       -
       -        let char_size = Vec2::new(
       -            font_dimensions.width as f32 * scale,
       -            font_dimensions.height as f32 * scale,
       -        );
       -
       -        let rect_w = buf_w as f32 * char_size.x;
       -        let rect_h = buf_h as f32 * char_size.y;
       -        let top_margin_height = ui.min_rect().top();
       -        let available_rect = ui.available_rect_before_wrap();
       +
        
                let _output = ScrollArea::both()
                    .auto_shrink([false; 2])
       -            .stick_to_bottom(true)
                    .show_viewport(ui, |ui, viewport| {
                        let (id, draw_area) = ui.allocate_space(size);
                        let mut response = ui.interact(draw_area, id, egui::Sense::click());
       +                let font_dimensions = self.buffer_view.lock().unwrap().editor.buf.get_font_dimensions();
       +                let scale = self.buffer_view.lock().unwrap().scale;
       +                let real_height = self.buffer_view.lock().unwrap().editor.buf.get_real_buffer_height();
       +
       +                self.buffer_view.lock().unwrap().editor.buf.terminal_state.height = min(real_height, (draw_area.height() / (font_dimensions.height as f32 * scale)).ceil() as i32);
       +
       +                let buf_w = self.buffer_view.lock().unwrap().editor.buf.get_buffer_width();
       +                let buf_h = self.buffer_view.lock().unwrap().editor.buf.get_buffer_height();
       +        
       +                let char_size = Vec2::new(
       +                    font_dimensions.width as f32 * scale,
       +                    font_dimensions.height as f32 * scale,
       +                );
       +        
       +                let rect_w = buf_w as f32 * char_size.x;
       +                let rect_h = buf_h as f32 * char_size.y;
       +                let top_margin_height = ui.min_rect().top();
       +                let available_rect = ui.available_rect_before_wrap();
        
                        let rect_h = min(rect_h as i32, draw_area.height() as i32) as f32;
        
       @@ -116,15 +119,13 @@ impl Document for AnsiEditor {
                            Vec2::new(rect_w, rect_h),
                        );
        
       -                let real_height = self.buffer_view.lock().unwrap().editor.buf.get_real_buffer_height();
                        let max_lines = max(0, real_height - buf_h);
                        ui.set_height(scale * max_lines as f32 * font_dimensions.height as f32);
                        ui.set_width(rect_w);
                        let first_line = (viewport.top() / char_size.y) as i32;
       -                let scroll_back_line = max(0, max_lines - first_line);
        
       -                if scroll_back_line != self.buffer_view.lock().unwrap().scroll_back_line {
       -                    self.buffer_view.lock().unwrap().scroll_back_line = scroll_back_line;
       +                if first_line != self.buffer_view.lock().unwrap().scroll_first_line {
       +                    self.buffer_view.lock().unwrap().scroll_first_line = first_line;
                            self.buffer_view.lock().unwrap().redraw_view();
                        }
                        
       @@ -139,7 +140,6 @@ impl Document for AnsiEditor {
                            )),
                        };
        
       -
                        ui.painter().add(callback);
                        response = response.context_menu(terminal_context_menu);
        
   DIR diff --git a/src/ui/ansi_editor/render.rs b/src/ui/ansi_editor/render.rs
       @@ -60,7 +60,7 @@ impl BufferView {
                        0.0,
                    );
        
       -            let sbl = (self.editor.buf.get_first_visible_line() - self.scroll_back_line) as f32;
       +            let sbl = (self.editor.buf.get_first_visible_line() - self.scroll_first_line) as f32;
                    gl.uniform_4_f32(
                        gl.get_uniform_location(self.program, "u_caret_position")
                            .as_ref(),
       @@ -87,7 +87,7 @@ impl BufferView {
                        gl.get_uniform_location(self.program, "u_terminal_size")
                            .as_ref(),
                        self.editor.buf.get_buffer_width() as f32 - 0.0001,
       -                self.editor.buf.get_real_buffer_height() as f32 - 0.0001,
       +                self.editor.buf.get_buffer_height() as f32 - 0.0001,
                    );
        
                    gl.uniform_1_i32(gl.get_uniform_location(self.program, "u_fonts").as_ref(), 0);
       @@ -332,7 +332,7 @@ impl BufferView {
        
                if self.redraw_view {
                    self.redraw_view = false;
       -            create_buffer_texture(gl, &self.editor.buf, self.scroll_back_line, self.buffer_texture);
       +            create_buffer_texture(gl, &self.editor.buf, self.scroll_first_line, self.buffer_texture);
                }
        
                if self.redraw_palette || self.colors != self.editor.buf.palette.colors.len() {
       @@ -349,7 +349,7 @@ impl BufferView {
                let editor = &self.editor;
                let render_buffer_size = Vec2::new(
                    editor.buf.get_font_dimensions().width as f32 * editor.buf.get_buffer_width() as f32,
       -            editor.buf.get_font_dimensions().height as f32 * editor.buf.get_real_buffer_height() as f32,
       +            editor.buf.get_font_dimensions().height as f32 * editor.buf.get_buffer_height() as f32,
                );
        
                if render_buffer_size != self.render_buffer_size {
       @@ -544,22 +544,21 @@ pub fn create_font_texture(gl: &Arc<glow::Context>, buf: &Buffer, font_texture: 
        pub fn create_buffer_texture(
            gl: &Arc<glow::Context>,
            buf: &Buffer,
       -    scroll_back_line: i32,
       +    scroll_first_line: i32,
            buffer_texture: NativeTexture,
        ) {
            let first_line = 0;
            let mut buffer_data = Vec::with_capacity(
       -        2 * buf.get_buffer_width() as usize * 4 * buf.get_real_buffer_height() as usize,
       +        2 * buf.get_buffer_width() as usize * 4 * buf.get_buffer_height() as usize,
            );
            let colors = buf.palette.colors.len() as u32 - 1;
            let mut y = 0;
       -
       -    while y < buf.get_real_buffer_height() {
       +    while y < buf.get_buffer_height() {
                let mut is_double_height = false;
        
                for x in 0..buf.get_buffer_width() {
                    let ch = buf
       -                .get_char_xy(x, first_line - scroll_back_line + y)
       +                .get_char_xy(x, first_line + scroll_first_line + y)
                        .unwrap_or_default();
        
                    if ch.attribute.is_double_height() {
       @@ -588,7 +587,7 @@ pub fn create_buffer_texture(
                if is_double_height {
                    for x in 0..buf.get_buffer_width() {
                        let ch = buf
       -                    .get_char_xy(x, first_line - scroll_back_line + y)
       +                    .get_char_xy(x, first_line - scroll_first_line + y)
                            .unwrap_or_default();
        
                        if !ch.attribute.is_double_height() {
       @@ -623,12 +622,12 @@ pub fn create_buffer_texture(
                }
            }
            y = 0;
       -    while y < buf.get_real_buffer_height() {
       +    while y < buf.get_buffer_height() {
                let mut is_double_height = false;
        
                for x in 0..buf.get_buffer_width() {
                    let ch = buf
       -                .get_char_xy(x, first_line - scroll_back_line + y)
       +                .get_char_xy(x, first_line - scroll_first_line + y)
                        .unwrap_or_default();
        
                    let mut attr = if ch.attribute.is_double_underlined() {
       @@ -656,7 +655,7 @@ pub fn create_buffer_texture(
                if is_double_height {
                    for x in 0..buf.get_buffer_width() {
                        let ch = buf
       -                    .get_char_xy(x, first_line - scroll_back_line + y)
       +                    .get_char_xy(x, first_line - scroll_first_line + y)
                            .unwrap_or_default();
                        let mut attr = if ch.attribute.is_double_underlined() {
                            3
       @@ -698,7 +697,7 @@ pub fn create_buffer_texture(
                    0,
                    glow::RGBA32F as i32,
                    buf.get_buffer_width(),
       -            buf.get_real_buffer_height(),
       +            buf.get_buffer_height(),
                    2,
                    0,
                    glow::RGBA,