}
#private {
- y_scroll := 0.0f;
+ scrollable_region := ui.Scrollable_Region_State.{};
+
debug_log_y_offset := 0.0f;
debug_log_y_offset_target := 0.0f;
}
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") {
};
}
-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;
}
}