made a small dummy slide that is customizable
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 17 Feb 2021 18:43:51 +0000 (12:43 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 17 Feb 2021 18:43:51 +0000 (12:43 -0600)
src/build.onyx
src/canvas.onyx [new file with mode: 0644]
src/prez.onyx
src/slides.onyx

index 84315f8c52a2568ce42cc7c4b36bf9c03d6f1064..e5f5cde9ee61cf9cd5f501ddd5929fdd2e326fe0 100644 (file)
@@ -9,3 +9,4 @@ use package build_opts as build_opts
 #load "src/prez"
 #load "src/events"
 #load "src/slides"
+#load "src/canvas"
diff --git a/src/canvas.onyx b/src/canvas.onyx
new file mode 100644 (file)
index 0000000..d0ec3bc
--- /dev/null
@@ -0,0 +1,48 @@
+use package core
+
+Canvas :: struct {
+    Handle :: #type u32
+
+    init  :: (id: str) -> Handle #foreign "canvas" "init" ---
+    clear :: (handle: Handle, r: f32, g: f32, b: f32, a := 1.0f) -> Handle #foreign "canvas" "clear" ---
+
+    get_width  :: (handle: Handle) -> u32 #foreign "canvas" "get_width" ---
+    get_height :: (handle: Handle) -> u32 #foreign "canvas" "get_height" ---
+
+    set_size :: (handle: Handle, width: u32, height: u32) -> void #foreign "canvas" "set_size" ---
+
+    set_font :: (handle: Handle, font_name: str) -> u32 #foreign "canvas" "setFont" ---
+
+    TextMetrics :: struct {
+        width : f32;
+        box   : Box;
+
+        Box :: struct {
+            left, right : f32;
+            top, bottom : f32;
+        }
+    }
+
+    measure_text :: (handle: Handle, text: str, measurements: ^TextMetrics) -> void #foreign "canvas" "measureText" ---
+
+    fill_rect :: (handle: Handle,
+        x: f32, y: f32, w: f32, h: f32,
+        r: f32, g: f32, b: f32, a := 1.0f) -> void #foreign "canvas" "fillRect" ---
+
+    fill_text :: (handle: Handle, text: str, x: f32, y: f32, max_width: f32 = -1.0f) -> void #foreign "canvas" "fillText" ---
+}
+
+// :GlobalVariable
+canvas: Canvas.Handle
+
+setup_canvas :: () {
+    use Canvas
+
+    canvas = init("prez_canvas");
+    assert(canvas != -1, "Failed to set up canvas.");
+
+    clear(canvas, 0.1, 0.1, 0.1);
+
+    set_font(canvas, "bold 72px Arial");
+}
+
index c5b7ec1beed047e561603133ccd919e7876c1636..6f810aa7625c490de4b405416e1aaef2bbb86875 100644 (file)
@@ -1,52 +1,7 @@
 use package core
 use package event as event
 
-Canvas :: struct {
-    Handle :: #type u32
-
-    init  :: (id: str) -> Handle #foreign "canvas" "init" ---
-    clear :: (handle: Handle, r: f32, g: f32, b: f32, a := 1.0f) -> Handle #foreign "canvas" "clear" ---
-
-    get_width  :: (handle: Handle) -> u32 #foreign "canvas" "get_width" ---
-    get_height :: (handle: Handle) -> u32 #foreign "canvas" "get_height" ---
-
-    set_size :: (handle: Handle, width: u32, height: u32) -> void #foreign "canvas" "set_size" ---
-
-    set_font :: (handle: Handle, font_name: str) -> u32 #foreign "canvas" "setFont" ---
-
-    TextMetrics :: struct {
-        width : f32;
-        box   : Box;
-
-        Box :: struct {
-            left, right : f32;
-            top, bottom : f32;
-        }
-    }
-
-    measure_text :: (handle: Handle, text: str, measurements: ^TextMetrics) -> void #foreign "canvas" "measureText" ---
-
-    fill_rect :: (handle: Handle,
-        x: f32, y: f32, w: f32, h: f32,
-        r: f32, g: f32, b: f32, a := 1.0f) -> void #foreign "canvas" "fillRect" ---
-
-    fill_text :: (handle: Handle, text: str, x: f32, y: f32, max_width: f32 = -1.0f) -> void #foreign "canvas" "fillText" ---
-}
-
-// :GlobalVariable
-canvas: Canvas.Handle
-
-setup_canvas :: () {
-    use Canvas
-
-    canvas = init("prez_canvas");
-    assert(canvas != -1, "Failed to set up canvas.");
-
-    clear(canvas, 0.1, 0.1, 0.1);
-
-    set_font(canvas, "bold 72px Arial");
-}
-
+// @Cleanup: Move this elsewhere
 draw_centered_text :: (text: str, y_baseline: f32) {
     use Canvas
 
@@ -60,7 +15,11 @@ draw_centered_text :: (text: str, y_baseline: f32) {
     fill_text(canvas, text, x, y_baseline * height);
 }
 
-dirty_display := true
+// This is an integer, not a boolean, because I was noticing an issue
+// where the slide would redraw, but the screen would still be blank
+// because the window was still resizing. Having it do multiple redraws
+// when needed prevents this issue.
+redraw := 0
 
 poll_events :: () {
     use event.DomEventKind
@@ -69,7 +28,7 @@ poll_events :: () {
     while event.poll(^ev) do switch ev.kind {
         case Resize {
             printf("New window size: %i, %i\n", ev.resize.width, ev.resize.height);
-            dirty_display = true;
+            redraw = 2;
 
             use Canvas
             set_size(canvas, ev.resize.width, ev.resize.height);
@@ -77,9 +36,6 @@ poll_events :: () {
 
         case MouseDown {
             printf("Mouse down: %i, %i\n", ev.mouse.pos_x, ev.mouse.pos_y);
-
-            use Canvas
-            fill_rect(canvas, ~~ ev.mouse.pos_x, ~~ ev.mouse.pos_y, 32, 32, 1, 0, 0);
         }
     }
 }
@@ -87,15 +43,34 @@ poll_events :: () {
 loop :: () -> void #export "loop" {
     poll_events();
 
-    if dirty_display {
-        dirty_display = false;
+    if redraw > 0 {
+        current_slide := slideshow_get_current_slide(^the_slideshow);
+        slide_render(current_slide);
 
-        Canvas.clear(canvas, 0.1, 0.1, 0.1);
-        Canvas.set_font(canvas, "bold 72px Arial");
-        draw_centered_text("Hello, World! This is a long title!", .3);
+        redraw -= 1;
+    }
+}
 
-        Canvas.set_font(canvas, "bold 48px Arial");
-        draw_centered_text("This is some more text.", 170);
+the_slideshow : Slideshow;
+
+create_dummy_show :: () {
+    the_slideshow = slideshow_make();
+    
+    { // Slide 1
+        slide := slideshow_insert_slide(^the_slideshow);
+        slide_init(slide, background_color = Color.{ 0.1, 0.1, 0.2 }, item_count = 2);
+        
+        slide.items[0] = slideshow_make_item(^the_slideshow);
+        slide.items[0].kind = Slide_Item.Kind.Text;
+        slide.items[0].text.text = "Hello, World!";
+        slide.items[0].text.y_pos = .5;
+        slide.items[0].text.font_name = "bold 72px Arail";
+
+        slide.items[1] = slideshow_make_item(^the_slideshow);
+        slide.items[1].kind = Slide_Item.Kind.Text;
+        slide.items[1].text.text = "Another, smaller, line of text below the first!";
+        slide.items[1].text.y_pos = .6;
+        slide.items[1].text.font_name = "italic 36px Arail";
     }
 }
 
@@ -103,6 +78,8 @@ main :: (args: [] cstr) {
     setup_canvas();
     event.init();
 
+    create_dummy_show();
+
     start_loop :: () -> void #foreign "host" "start_loop" ---
     start_loop();
 }
index 28082129cede5383e797a2962977f64899a56b7f..52a3c4fe22de0c42d73a828cd9e654de56b7ee7c 100644 (file)
@@ -1,7 +1,8 @@
 use package core
 
 Color :: struct {
-    r, g, b, a: f32;
+    r, g, b: f32;
+    a: f32 = 1;
 }
 
 Slideshow :: struct {
@@ -16,8 +17,7 @@ Slideshow :: struct {
 }
 
 Slide :: struct {
-    foreground, background: Color;
-    font_name : str;
+    background: Color;
 
     items : [] ^Slide_Item;
 }
@@ -28,7 +28,7 @@ Slide_Item :: struct #union {
         Text;
     }
 
-    base: Slide_Item_Base;
+    use base: Slide_Item_Base;
     text: Slide_Item_Text;
 }
 
@@ -39,6 +39,14 @@ Slide_Item_Base :: struct {
 Slide_Item_Text :: struct {
     use base : Slide_Item_Base;
 
+    color : Color;
+
+    font_name : str;
+    font_size : u32;
+    font_attr : FontAttributes;
+
+    FontAttributes :: enum #flags { Bold; Italic; Underline; }
+
     Justify :: enum { Left; Center; Right; }
 
     text    : str;
@@ -64,3 +72,50 @@ slideshow_get_current_slide :: (use s: ^Slideshow) -> ^Slide {
 
     return ^slides[current_slide];
 }
+
+slideshow_insert_slide :: (use s: ^Slideshow, at := -1) -> ^Slide {
+    // @Robustness: not checking the return values on these calls
+
+    if at > 0 {
+        array.insert_empty(^slides, at);
+        return ^slides[at];
+    }
+
+    array.ensure_capacity(^slides, slides.count + 1);
+    return ^slides[at];
+}
+
+slideshow_make_item :: (use s: ^Slideshow) -> ^Slide_Item {
+    allocator := alloc.arena.make_allocator(^arena);
+    return new(Slide_Item, allocator = allocator);
+}
+
+slide_init :: (use slide: ^Slide, background_color := Color.{0, 0, 0, 1}, item_count := 4) {
+    background = background_color;
+
+    items = memory.make_slice(#type ^Slide_Item, item_count);
+    memory.set(items.data, 0, items.count * sizeof ^Slide_Item);
+}
+
+slide_render :: (use slide: ^Slide) {
+    // I would like to alias Canvas to C here, but right now
+    // this does not work:
+    //
+    //     C :: Canvas
+    //
+    Canvas.clear(canvas, background.r, background.g, background.b, background.a);
+
+    for item: items do if item != null do slide_item_render(item, slide);
+}
+
+slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide) {
+    use Canvas
+    use Slide_Item.Kind
+
+    switch kind {
+        case Text {
+            set_font(canvas, text.font_name);
+            draw_centered_text(text.text, text.y_pos);
+        }
+    }
+}