From daa79fc276f6d31a0345b04c8b735d3695df075d Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 15 Jul 2021 18:30:32 -0500 Subject: [PATCH] added scrollable_region --- .../immediate_mode/immediate_renderer.onyx | 4 ++ modules/ui/components/scrollable_region.onyx | 50 +++++++++++++++++++ modules/ui/module.onyx | 1 + modules/ui/ui.onyx | 1 + modules/wasm_utils/parser.onyx | 2 +- 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 modules/ui/components/scrollable_region.onyx diff --git a/modules/immediate_mode/immediate_renderer.onyx b/modules/immediate_mode/immediate_renderer.onyx index 5b4b60f7..4f7e3cca 100644 --- a/modules/immediate_mode/immediate_renderer.onyx +++ b/modules/immediate_mode/immediate_renderer.onyx @@ -507,6 +507,10 @@ set_window_size :: (width: i32, height: i32) { global_renderer->set_window_size(width, height); } +get_window_size :: () -> (width: i32, height: i32) { + return global_renderer.window_width, global_renderer.window_height; +} + push_matrix :: () do global_renderer->push_matrix(); pop_matrix :: () do global_renderer->pop_matrix(); identity :: () do global_renderer->identity(); diff --git a/modules/ui/components/scrollable_region.onyx b/modules/ui/components/scrollable_region.onyx new file mode 100644 index 00000000..41ff29ec --- /dev/null +++ b/modules/ui/components/scrollable_region.onyx @@ -0,0 +1,50 @@ +package ui + +use package core + +#private_file +Scrollable_Region_State :: struct { + transform: gfx.Transform = .{ + translation = .{ 0, 0 }, + scale = .{ 1, 1 }, + }; +} + +#private +scrollable_region_states : map.Map(UI_Id, Scrollable_Region_State); + +scrollable_region_start :: (use r: Rectangle, x_scroll: ^f32, y_scroll: ^f32, site := #callsite) { + hash := get_site_hash(site, 0); + x, y := Rectangle.top_left(r); + width, height := Rectangle.dimensions(r); + + state := map.get(^scrollable_region_states, hash); + + mx, my := get_mouse_position(); + contained := false; + if Rectangle.contains(r, mx, my) { + // if hot_item == 0 do set_hot_item(hash); + contained = true; + } + + if contained { // is_hot_item(hash) { + speed :: 30.0f; @ThemeConfiguration + + if is_key_down(38) do state.transform.translation.y += speed; + if is_key_down(40) do state.transform.translation.y -= speed; + + if mouse_state.dwheel > 0 do state.transform.translation.y += speed; + if mouse_state.dwheel < 0 do state.transform.translation.y -= speed; + } + + map.put(^scrollable_region_states, hash, state); + + gfx.push_scissor(x, y, width, height); + gfx.push_matrix(); + gfx.apply_transform(state.transform); +} + +scrollable_region_stop :: () { + gfx.pop_scissor(); + gfx.pop_matrix(); +} \ No newline at end of file diff --git a/modules/ui/module.onyx b/modules/ui/module.onyx index 2b63d20e..a492917b 100644 --- a/modules/ui/module.onyx +++ b/modules/ui/module.onyx @@ -50,6 +50,7 @@ package ui #load "./components/radio" #load "./components/textbox" #load "./components/workspace" +#load "./components/scrollable_region" // Package inclusions that are part of all files in the "ui" package. #private gfx :: package immediate_mode // The immediate_mode module needs to be accessible diff --git a/modules/ui/ui.onyx b/modules/ui/ui.onyx index 0291c785..1cdb99f8 100644 --- a/modules/ui/ui.onyx +++ b/modules/ui/ui.onyx @@ -19,6 +19,7 @@ init_ui :: () { map.init(^animation_states, default=.{}, hash_count=4); map.init(^workspace_states, default=.{}, hash_count=4); + map.init(^scrollable_region_states, default=.{}, hash_count=4); // Register a default font so things don't break everywhere builtin_font := create_font(#file_contents "./fonts/builtin.fnt", #file_contents "./fonts/builtin.data"); diff --git a/modules/wasm_utils/parser.onyx b/modules/wasm_utils/parser.onyx index de69c652..1e6fb5a7 100644 --- a/modules/wasm_utils/parser.onyx +++ b/modules/wasm_utils/parser.onyx @@ -17,7 +17,7 @@ parse_type_section :: (use bin: ^WasmBinary, allocator := context.allocator) -> wasm_allocator = allocator; @Cleanup @WasmStream // These are going to be needed in many places - stream := io.string_stream_make(data); + stream := io.string_stream_make(data); reader := io.reader_make(^stream); io.stream_seek(^stream, map.get(^sections, .Type).offset, .Start); -- 2.25.1