use package core
use package event as event
-// @Cleanup: Move this elsewhere
-draw_centered_text :: (text: str, y_baseline: f32) {
- use Canvas
-
- width, height := cast(f32) get_width(canvas), cast(f32) get_height(canvas);
-
- font_metrics: TextMetrics;
- measure_text(canvas, text, ^font_metrics);
-
- x := (width - font_metrics.width) / 2;
-
- fill_text(canvas, text, x, y_baseline * height);
-}
-
// 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
poll_events :: () {
use event.DomEventKind
+ redraw = 2;
+
ev: event.Event;
while event.poll(^ev) do switch ev.kind {
case Resize {
printf("New window size: %i, %i\n", ev.resize.width, ev.resize.height);
- redraw = 2;
use Canvas
set_size(canvas, ev.resize.width, ev.resize.height);
case Right do slideshow_advance_slide(^the_slideshow, -1);
case #default do slideshow_advance_slide(^the_slideshow, 1);
}
+ }
+
+ case KeyDown {
+ printf("Keydown: %i\n", ev.keyboard.keycode);
- redraw = 2;
+ switch ev.keyboard.keycode {
+ case 0x25 do slideshow_advance_slide(^the_slideshow, -1);
+ case 0x27 do slideshow_advance_slide(^the_slideshow, 1);
+ }
}
+
+ } else {
+ redraw = 0;
}
}
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[0].text.font_name = "Arail";
+ slide.items[0].text.font_size = 72;
+ slide.items[0].text.font_attr = Slide_Item_Text.FontAttributes.Bold;
+ slide.items[0].text.justify = Slide_Item_Text.Justify.Center;
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";
+ slide.items[1].text.font_name = "Arail";
+ slide.items[1].text.font_size = 36;
+ slide.items[1].text.font_attr = Slide_Item_Text.FontAttributes.Italic;
+ slide.items[1].text.padding = .07;
+ slide.items[1].text.justify = Slide_Item_Text.Justify.Right;
}
{ // Slide 2
slide.items[0].kind = Slide_Item.Kind.Text;
slide.items[0].text.text = "The Second Slide! Duh duh duhhhh";
slide.items[0].text.y_pos = .2;
- slide.items[0].text.font_name = "bold 72px Arail";
+ slide.items[0].text.font_name = "Arail";
+ slide.items[0].text.font_size = 72;
+ slide.items[0].text.font_attr = Slide_Item_Text.FontAttributes.Bold;
+ slide.items[0].text.justify = Slide_Item_Text.Justify.Center;
slide.items[1] = slideshow_make_item(^the_slideshow);
slide.items[1].kind = Slide_Item.Kind.Text;
slide.items[1].text.text = "Here is some monospace text.";
slide.items[1].text.y_pos = .4;
- slide.items[1].text.font_name = "36px monospace";
+ slide.items[1].text.font_name = "monospace";
+ slide.items[1].text.font_size = 36;
+ slide.items[1].text.padding = .07;
+ slide.items[1].text.justify = Slide_Item_Text.Justify.Left;
slide.items[2] = slideshow_make_item(^the_slideshow);
slide.items[2].kind = Slide_Item.Kind.Text;
slide.items[2].text.text = "Here is a block of much longer text that will not wrap correctly, which is annoying but I think the best thing to do is... I don't know yet.";
- slide.items[2].text.y_pos = .7;
- slide.items[2].text.font_name = "36px Calibri";
+ slide.items[2].text.y_pos = .45;
+ slide.items[2].text.font_name = "Calibri";
+ slide.items[2].text.font_size = 36;
+ slide.items[2].text.padding = .07;
+ slide.items[2].text.justify = Slide_Item_Text.Justify.Left;
}
}
FontAttributes :: enum #flags { Bold; Italic; Underline; }
- Justify :: enum { Left; Center; Right; }
-
text : str;
y_pos : f32; // Between 0 and 1
+ padding : f32; // Between 0 and 1
justify : Justify;
+
+ Justify :: enum { Left; Center; Right; }
}
switch kind {
case Text {
- set_font(canvas, text.font_name);
- draw_centered_text(text.text, text.y_pos);
+ set_font_for_text(slide_item);
+
+ use Slide_Item_Text.Justify
+ switch text.justify {
+ case Center do draw_centered_text(text.text, text.y_pos);
+
+ case Left {
+ use Canvas
+
+ width, height := cast(f32) get_width(canvas), cast(f32) get_height(canvas);
+ x, y := text.padding * width, text.y_pos * height;
+ fill_text(canvas, text.text, x, y);
+ }
+
+ case Right {
+ use Canvas
+
+ width, height := cast(f32) get_width(canvas), cast(f32) get_height(canvas);
+
+ font_metrics: TextMetrics;
+ measure_text(canvas, text.text, ^font_metrics);
+
+ x, y := width - font_metrics.width - text.padding * width, text.y_pos * height;
+ fill_text(canvas, text.text, x, y);
+ }
+ }
}
}
+
+
+ set_font_for_text :: (use slide_item: ^Slide_Item) {
+ use Slide_Item_Text.FontAttributes
+ use Canvas
+
+ bold_str := "";
+ italic_str := "";
+ underline_str := "";
+
+ if text.font_attr & Bold != ~~ 0 do bold_str = "bold";
+ if text.font_attr & Italic != ~~ 0 do italic_str = "italic";
+ if text.font_attr & Underline != ~~ 0 do underline_str = "underline";
+
+ formatted_name := aprintf(
+ context.allocator,
+ "%s %s %s %ipx %s",
+ bold_str, italic_str, underline_str,
+ text.font_size, text.font_name);
+ defer cfree(formatted_name.data);
+
+ set_font(canvas, formatted_name);
+ }
+}
+
+// @Cleanup: this should be part of the standard library.
+aprintf :: (allocator: Allocator, format: str, va: ...) -> str {
+ // @Robustness: Same potential overflow bug.
+ buffer: [2048] u8;
+ formatted := conv.str_format_va(format, ~~buffer, va);
+
+ output := string.alloc_copy(formatted, allocator = allocator);
+ return output;
}