From 3f0282764b4f27e216bb7f85905e96d3bfccd3a8 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 4 Oct 2021 21:09:30 -0500 Subject: [PATCH] fixed interior window clipping --- src/app/debug_log.onyx | 56 +++++++++++++++++-------------------- src/features/wasm/wasm.onyx | 46 +++++++++++++----------------- 2 files changed, 45 insertions(+), 57 deletions(-) diff --git a/src/app/debug_log.onyx b/src/app/debug_log.onyx index fcaba79..47cfacf 100644 --- a/src/app/debug_log.onyx +++ b/src/app/debug_log.onyx @@ -9,7 +9,8 @@ use package core } #private { - y_scroll := 0.0f; + scrollable_region := ui.Scrollable_Region_State.{}; + debug_log_y_offset := 0.0f; debug_log_y_offset_target := 0.0f; } @@ -76,46 +77,39 @@ draw_debug_log :: (window_rectangle: ui.Rectangle, site := #callsite) { r.y0 -= height * (1 - debug_log_y_offset); r.y1 -= height * (1 - debug_log_y_offset); - hash := ui.get_site_hash(site); - - mx, my := ui.get_mouse_position(); - if ui.Rectangle.contains(r, mx, my) { - ui.set_hot_item(hash, false); - } + sh := ui.scrollable_region_start(r, state=^scrollable_region, .{ + minimum_x = 0, maximum_x = 0, + minimum_y = 32.0f * ~~(log_buffer.lines.count - ~~(height / 32)), + maximum_y = 0, + }); + defer ui.scrollable_region_stop(); - line_spacing := 28.0f; - - if ui.is_hot_item(hash) { - if ui.mouse_state.dwheel > 0 do y_scroll -= 20.0f; - if ui.mouse_state.dwheel < 0 do y_scroll += 20.0f; - - if ui.is_key_down(38) do y_scroll -= 20.0f; - if ui.is_key_down(40) do y_scroll += 20.0f; - } - - x, y := ui.Rectangle.bottom_left(r); - w, h := ui.Rectangle.dimensions(r); - - gfx.push_scissor(x, y - h, w, h); - defer gfx.pop_scissor(); + r.y0 -= 32.0f * ~~log_buffer.lines.count; + visible_rectangle := sh->get_visible_rectangle(); background_color := config.Colors.background; background_color.a = 0.8; - ui.draw_rect(r, color=background_color); + ui.draw_rect(visible_rectangle, color=background_color); + + text_theme := ui.default_text_theme; + text_theme.font = config.Fonts.FiraCode.index; + text_theme.text_color = .{ 0.2, 0.5, 0.2 }; - scale :: 0.75f; - y_offset := line_spacing * scale + y_scroll; + text_rect: ui.Rectangle; + while i := cast(i32) log_buffer.lines.count - 1; i >= 0 { + r, text_rect = ui.Flow.split_horizontal(r, bottom_height=32); - while i := log_buffer.lines.count - 1; cast(i32) i >= 0 { - defer i -= 1; + if ui.Rectangle.intersects(text_rect, visible_rectangle) { + ui.draw_text(text_rect, log_buffer.lines[i], theme=^text_theme); + } - ui.draw_text_raw(log_buffer.lines[i], x, y - y_offset, color=.{ 0.2, 0.7, 0.2 }, font=1, size=scale); - y_offset += line_spacing * scale; + i -= 1; } + r = visible_rectangle; clear_button_rect := ui.Rectangle.{ - x0 = r.x0, x1 = r.x0 + 200, - y0 = r.y0, y1 = r.y0 + 50, + x0 = r.x1 - 200, x1 = r.x1, + y0 = r.y0, y1 = r.y0 + 50, }; if ui.button(clear_button_rect, "Clear log") { diff --git a/src/features/wasm/wasm.onyx b/src/features/wasm/wasm.onyx index fbb79cd..d82e49b 100644 --- a/src/features/wasm/wasm.onyx +++ b/src/features/wasm/wasm.onyx @@ -34,59 +34,53 @@ setup :: () { }; } -if_visible :: macro (r: ui.Rectangle, w: ui.Rectangle, draw: Code) { - if ui.Rectangle.intersects(w, r) { - #insert draw; - } -} - info_window_draw :: (_, win) => { if !wasm_analyzed do return; rect := ui.Rectangle.{ 0, 0, win.window_state.size.x, win.window_state.size.y }; #persist scrollable_region := ui.Scrollable_Region_State.{}; - ui.scrollable_region_start(rect, state=^scrollable_region); + handle := ui.scrollable_region_start(rect, state=^scrollable_region); defer ui.scrollable_region_stop(); text_theme := ui.default_text_theme; text_theme.font = config.Fonts.FiraCode.index; - win_rect := rect; + win_rect := handle->get_visible_rectangle(); v := 0x7F7FFFFF; rect.y1 = *cast(^f32)^v; rect.x1 = *cast(^f32)^v; text_rect : ui.Rectangle; msg_buffer: [512] u8; - { - text_rect, rect = ui.Flow.split_horizontal(rect, top_height=40); - if_visible(text_rect, win_rect, - #(ui.draw_text(text_rect, conv.str_format(msg_buffer, "Imports: {}", wasm_sections.import_section.count), theme=^text_theme))); + // Handy macro that will be generalized over-time + element_visible :: macro (r: ui.Rectangle, format: str, value: $T) { + if ui.Rectangle.intersects(r, win_rect) { + msg := conv.str_format(msg_buffer, format, value); + ui.draw_text(text_rect, msg, theme=^text_theme); + } } + text_rect, rect = ui.Flow.split_horizontal(rect, top_height=40); + element_visible(text_rect, "Imports: {}", wasm_sections.import_section.count); + for ^import: wasm_sections.import_section { text_rect, rect = ui.Flow.split_horizontal(rect, top_height=32); - if_visible(text_rect, win_rect, - #(ui.draw_text(text_rect, conv.str_format(msg_buffer, "{*}", import), theme=^text_theme))); + element_visible(text_rect, "{*}", import); } - { - text_rect, rect = ui.Flow.split_horizontal(rect, top_height=40); - if_visible(text_rect, win_rect, - #(ui.draw_text(text_rect, conv.str_format(msg_buffer, "Exports: {}", wasm_sections.export_section.count), theme=^text_theme))); - } + text_rect, rect = ui.Flow.split_horizontal(rect, top_height=40); + element_visible(text_rect, "Exports: {}", wasm_sections.export_section.count); - { - text_rect, rect = ui.Flow.split_horizontal(rect, top_height=40); - if_visible(text_rect, win_rect, - #(ui.draw_text(text_rect, conv.str_format(msg_buffer, "Functions: {}", wasm_sections.code_section.count), theme=^text_theme))); - } + text_rect, rect = ui.Flow.split_horizontal(rect, top_height=40); + element_visible(text_rect, "Functions: {}", wasm_sections.code_section.count); + i := 0; for ^code: wasm_sections.code_section { text_rect, rect = ui.Flow.split_horizontal(rect, top_height=32); - if_visible(text_rect, win_rect, - #(ui.draw_text(text_rect, conv.str_format(msg_buffer, "{*}", code), theme=^text_theme))); + element_visible(text_rect, "{*}", code); + + i += 1; } } -- 2.25.1