fixed interior window clipping
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 5 Oct 2021 02:09:30 +0000 (21:09 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 5 Oct 2021 02:09:30 +0000 (21:09 -0500)
src/app/debug_log.onyx
src/features/wasm/wasm.onyx

index fcaba79a5f1ec248cd94fc36284a1eeed058a89a..47cfacf85733db1ab7fe0b5ea8de5114eab2e06d 100644 (file)
@@ -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") {
index fbb79cdcc5b2df3cf9f313dda70d3ae425130d34..d82e49b12c1aa3b743d1480e8c265cb971cf9852 100644 (file)
@@ -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;
     }
 }