From 0c4cc3f052608b2410bf71787b14c2149e14c72b Mon Sep 17 00:00:00 2001 From: San Jacobs Date: Mon, 5 Feb 2024 15:36:44 +0100 Subject: Adding custom layout stuff to OUI for the timeline display --- lib/oui/oui.odin | 7 +++++ src/main.odin | 31 +++++++++++++++------ src/ui_implementation.odin | 69 +++++++++++++++++++++++++--------------------- 3 files changed, 67 insertions(+), 40 deletions(-) diff --git a/lib/oui/oui.odin b/lib/oui/oui.odin index a1fbbf8..a0098ca 100644 --- a/lib/oui/oui.odin +++ b/lib/oui/oui.odin @@ -146,6 +146,7 @@ Layout :: enum { Cut, Absolute, Relative, + Fractional, // Custom, } @@ -883,6 +884,9 @@ compute_size :: proc(item: ^Item) #no_bounds_check { kid := item.first_item for kid != nil { compute_size(kid) + if kid.layout == .Fractional { + kid.bounds.r = item.layout_size.x * kid.bounds.r + } kid = kid.next_item } } @@ -932,6 +936,9 @@ arrange :: proc(item: ^Item, layout: ^RectI, gap: int) #no_bounds_check { case .Relative: rect.sized(&item.bounds, [2]int { layout.l, layout.t } + item.layout_offset, item.layout_size) + + case .Fractional: + rect.sized(&item.bounds, item.layout_offset, item.layout_size) } // layout children with this resultant rect for LAYOUT_CUT diff --git a/src/main.odin b/src/main.odin index 1f2d46f..e0232c7 100644 --- a/src/main.odin +++ b/src/main.odin @@ -158,6 +158,13 @@ main :: proc() { fmt.println("Resized to:", width, 'x', height) } + pre_sos_price : f64 = 0 + + for each_day in workdays { + pre_sos_price += f64(each_day.price) + } + + post_sos_price : f64 = pre_sos_price * 1.26 // TODO: Find a good way to calculate the size and location // of all the timeblocks in every day. @@ -235,13 +242,13 @@ when true { bottom_bar.layout_cut_children = .Right oui.item_insert(bottom_bar, totals) - pre_sos_price := label("120 000 kr", small_font, 0, .Right) - pre_sos_price.layout_size.y = 11 - oui.item_insert(totals, pre_sos_price) + pre_sos_price_label := label(fmt.tprintf("%.2f Kr", pre_sos_price), small_font, 0, .Right) + pre_sos_price_label.layout_size.y = 11 + oui.item_insert(totals, pre_sos_price_label) - post_sos_price := label("160 000 kr", big_font, 300, .Right) - post_sos_price.layout_size.y = 27 - oui.item_insert(totals, post_sos_price) + post_sos_price_label := label(fmt.tprintf("%.2f Kr", post_sos_price), big_font, 300, .Right) + post_sos_price_label.layout_size.y = 27 + oui.item_insert(totals, post_sos_price_label) } { @@ -267,11 +274,19 @@ when true { oui.item_insert(line, label(clockprint(day.call), font, sizings.call, .Center)) line.layout_cut_children = .Right - oui.item_insert(line, label(fmt.tprintf("%.2f kr", day.price), font, sizings.price, .Center)) + oui.item_insert(line, label(fmt.tprintf("%.2f Kr", day.price), font, sizings.price, .Center)) oui.item_insert(line, label(clockprint(day.wrap), font, sizings.wrap, .Center)) line.layout_cut_children = .Fill - timeline(line, &day) + { + a_timeline := timeline(line, &day) + + /*x_offset := i32(int(f32(width)*fracts.start) - int(f32(width)*FRACT_MIN)) + i32(rect.t), + i32(f32(width) * (fracts.end - fracts.start)+0.99), + i32(rect.b - rect.t), + color)*/ + } } new_workday := button("+", 100) middle_section.layout_cut_children = .Top diff --git a/src/ui_implementation.odin b/src/ui_implementation.odin index 71f0e94..3a2ddc0 100644 --- a/src/ui_implementation.odin +++ b/src/ui_implementation.odin @@ -71,6 +71,7 @@ Data_Element :: enum int { Text_Input, Timeblock, Timeline, + Timeline_Block, // ... } @@ -115,6 +116,10 @@ Data_Timeline :: struct { using _: Data_Head, day: ^Workday, } +Data_Timeline_Block :: struct { + using _: Data_Head, + timeblock: ^Timeblock, +} panel :: proc(color : rl.Color = rl.RED) -> ^Item { item := oui.item_make(c0) @@ -237,9 +242,23 @@ timeline :: proc(parent: ^Item, day: ^Workday) -> ^Item { data.subtype = .Timeline data.day = day + for block in &day.blocks { + oui.item_insert(item, timeline_block(&block)) + } + oui.item_insert(parent, item) return item } +timeline_block :: proc(timeblock: ^Timeblock) -> ^Item { + item := oui.item_make(c0) + item.layout = .Fractional + + data := oui.alloc_typed(c0, item, Data_Timeline_Block) + data.subtype = .Timeline_Block + data.timeblock = timeblock + + return item +} Text_Alignment :: enum int { // Techically called justification, but text_alignment is more self-explanatory. @@ -350,40 +369,26 @@ ui_draw :: proc(item: ^oui.Item) { rl.DrawTextEx(data.font, text, i2f(position), f32(data.font.baseSize), 0.0, theme.text); case .Timeline: - data := cast(^Data_Timeline) item.handle + rl.DrawRectangle(i32(rect.l), + i32(rect.t), + i32(rect.r - rect.l), + i32(rect.b - rect.t), + theme.background_bar) + case .Timeline_Block: + data := cast(^Data_Timeline_Block) item.handle - width := int(f32(rect.r - rect.l)/(FRACT_MAX - FRACT_MIN)) + color := theme.price_100 + value := data.timeblock.value - for fracts, i in data.day.fractions { - - color := theme.price_100 - value := data.day.blocks[i].value - - switch { - case value>2.1: - color = theme.price_300 - case value>1.6: - color = theme.price_200 - case value>1.1: - color = theme.price_150 - } - - - - rl.DrawRectangle(i32(rect.l + int(f32(width)*fracts.start) - int(f32(width)*FRACT_MIN)), - i32(rect.t), - i32(f32(width) * (fracts.end - fracts.start)+0.99), - i32(rect.b - rect.t), - color) - // Dark middle of blocks, glowing edge. Disabled for now. - /*rl.DrawRectangle(i32(rect.l + int(f32(width)*fracts.start) - int(f32(width)*FRACT_MIN) + 1), - i32(rect.t) + 1, - i32(f32(width+1) * (fracts.end - fracts.start)-1.01), - i32(rect.b - rect.t)-2, - {0,0,0,100})*/ - if i+1 == data.day.total_timeblocks { - break - } + switch { + case value>2.1: + color = theme.price_300 + case value>1.6: + color = theme.price_200 + case value>1.1: + color = theme.price_150 } + + rl.DrawRectangle(i32(rect.l), i32(rect.t), i32(rect.r-rect.l), i32(rect.b-rect.t), color) } } \ No newline at end of file -- cgit v1.2.1