added scrollable_region
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 15 Jul 2021 23:30:32 +0000 (18:30 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 15 Jul 2021 23:30:32 +0000 (18:30 -0500)
modules/immediate_mode/immediate_renderer.onyx
modules/ui/components/scrollable_region.onyx [new file with mode: 0644]
modules/ui/module.onyx
modules/ui/ui.onyx
modules/wasm_utils/parser.onyx

index 5b4b60f7d39c9208b8017670cb72d396f775bf12..4f7e3ccadf67c83f27dc5e45da0593e7c9ec9b62 100644 (file)
@@ -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 (file)
index 0000000..41ff29e
--- /dev/null
@@ -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
index 2b63d20ee183e94f362f31ea9d7bae8a878174a3..a492917b7fc05f13ddc8fe53af88b630b954abc6 100644 (file)
@@ -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
index 0291c785af6defb466b2ecec7f3eb8763a7c6efe..1cdb99f872e622384b1b4317550cb297c950ef9f 100644 (file)
@@ -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");
index de69c65277557bcea4b6431f74e044ba6277aec0..1e6fb5a799dd1a1d0e337e773ff8f52953e4c9f2 100644 (file)
@@ -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);