aboutsummaryrefslogtreecommitdiff
path: root/src/ui_implementation.odin
diff options
context:
space:
mode:
authorSan Jacobs2023-10-14 16:19:16 +0200
committerSan Jacobs2023-10-14 16:19:16 +0200
commit44d408583ab8811f2b89d8fcb9e21b98f1409b7d (patch)
tree7cf4751661269cf7d65c74246e7feb1745e4e585 /src/ui_implementation.odin
parentfca6955979f4791acb016ef5da86fed1013b524e (diff)
downloadsatscalc-44d408583ab8811f2b89d8fcb9e21b98f1409b7d.tar.gz
satscalc-44d408583ab8811f2b89d8fcb9e21b98f1409b7d.tar.bz2
satscalc-44d408583ab8811f2b89d8fcb9e21b98f1409b7d.zip
There is a theme editor now???
Diffstat (limited to 'src/ui_implementation.odin')
-rw-r--r--src/ui_implementation.odin139
1 files changed, 102 insertions, 37 deletions
diff --git a/src/ui_implementation.odin b/src/ui_implementation.odin
index 3e9b913..6b0947d 100644
--- a/src/ui_implementation.odin
+++ b/src/ui_implementation.odin
@@ -8,32 +8,43 @@ import rl "vendor:raylib"
Theme :: struct {
background: rl.Color,
- background_top: rl.Color,
- background_bottom: rl.Color,
+ background_bar: rl.Color,
button: rl.Color,
+ base: rl.Color,
+ slider_bar: rl.Color,
text: rl.Color,
}
-theme : Theme = {
+/*theme : Theme = {
background = {20, 25, 25, 255},
background_top = {30, 35, 35, 255},
background_bottom = {40, 40, 40, 255},
button = {80, 80, 80, 255},
+ base = {60, 60, 60, 255},
+ slider_bar = {170, 170, 170, 255},
text = rl.RAYWHITE,
+}*/
+
+theme : Theme = {
+ background = {25 , 27 , 29 , 255,},
+ background_bar = {43 , 43 , 48 , 255,},
+ button = {91 , 91 , 204, 255,},
+ base = {60 , 60 , 60 , 255,},
+ slider_bar = {91 , 91 , 204, 255,},
+ text = {255, 255, 255, 252,},
}
DAY_HEIGHT :: 35
TIMELINE_START :: 175
TIMELINE_END :: -85
-
-
Item :: oui.Item
Call :: oui.Call
Data_Element :: enum int {
Panel,
Button,
+ Slider,
Label,
Text_Input,
Timeblock,
@@ -55,6 +66,12 @@ Data_Button :: struct {
selected: bool,
}
+Data_Slider :: struct {
+ using _: Data_Head,
+ text: string,
+ value: ^u8,
+}
+
Data_Label :: struct {
using _: Data_Head,
text: string,
@@ -63,17 +80,6 @@ Data_Label :: struct {
alignment: Text_Alignment,
}
-button_callback :: proc(ctxt: ^oui.Context, item: ^Item, event: Call) -> int {
- data := cast(^Data_Button) item.handle
-
- #partial switch event {
- case .Cursor_Handle:
- //return int(Cursor_Type.Hand)
- }
-
- return -1
-}
-
panel :: proc(color : rl.Color = rl.RED) -> ^Item {
item := oui.item_make(c0)
@@ -105,6 +111,7 @@ button :: proc(text: string, width: int, selected := false) -> ^Item {
item := oui.item_make(c0)
item.layout_size = {width, 35}
item.callback = button_callback
+ item.id = oui.gen_id(c0, text)
data := oui.alloc_typed(c0, item, Data_Button)
data.subtype = .Button
@@ -113,6 +120,50 @@ button :: proc(text: string, width: int, selected := false) -> ^Item {
return item
}
+button_callback :: proc(ctxt: ^oui.Context, item: ^Item, event: Call) -> int {
+ data := cast(^Data_Button) item.handle
+
+ #partial switch event {
+ case .Cursor_Handle:
+ //return int(Cursor_Type.Hand)
+ }
+
+ return -1
+}
+
+slider :: proc(id: string, text: string, width: int, value: ^u8) -> ^Item {
+ item := oui.item_make(c0)
+ item.layout_size = {width, 25}
+ item.id = oui.gen_id(c0, id)
+ item.callback = slider_callback
+
+ data := oui.alloc_typed(c0, item, Data_Slider)
+ data.subtype = .Slider
+ data.text = text
+ data.value = value
+
+ return item
+}
+slider_callback :: proc(ctxt: ^oui.Context, item: ^Item, event: Call) -> int {
+ data := cast(^Data_Slider) item.handle
+ rect := item.bounds
+
+ #partial switch event {
+ case .Left_Capture:
+ cursor_position := clamp(oui.get_cursor(c0).x, rect.l, rect.r)
+
+ data.value^ = u8(255*(f32(cursor_position - rect.l) / f32(rect.r - rect.l)))
+ }
+
+ return -1
+}
+color_sliders :: proc(parent: ^Item, color: ^rl.Color) {
+ width :: 167
+ oui.item_insert(parent, slider("slider_r", fmt.tprintf("%d", color.r), width, &color.r))
+ oui.item_insert(parent, slider("slider_g", fmt.tprintf("%d", color.g), width, &color.g))
+ oui.item_insert(parent, slider("slider_b", fmt.tprintf("%d", color.b), width, &color.b))
+ oui.item_insert(parent, slider("slider_a", fmt.tprintf("%d", color.a), width, &color.a))
+}
Text_Alignment :: enum int {
// Techically called justification, but text_alignment is more self-explanatory.
@@ -122,6 +173,7 @@ Text_Alignment :: enum int {
}
label :: proc(text: string, font: rl.Font, alignment: Text_Alignment = .Left) -> ^Item {
item := oui.item_make(c0)
+ item.layout_size = {150, 25}
data := oui.alloc_typed(c0, item, Data_Label)
data.subtype = .Label
@@ -175,26 +227,39 @@ ui_draw :: proc(item: ^oui.Item) {
}
#partial switch head.subtype {
- //case .Panel_Root:
- // ... render any type of item
- case .Button:
- data := cast(^Data_Button) item.handle
- rl.DrawRectangle(i32(rect.l), i32(rect.t), i32(rect.r-rect.l), i32(rect.b-rect.t), theme.button)
-
- text := strings.clone_to_cstring(data.text, context.temp_allocator)
- position := calculate_text_alignment(text, font, .Center, rect)
-
- rl.DrawTextEx(font, text, i2f(position), f32(font.baseSize), 0.0, theme.text);
-
- case .Panel:
- data := cast(^Data_Panel) head
- rl.DrawRectangle(i32(rect.l), i32(rect.t), i32(rect.r-rect.l), i32(rect.b-rect.t), data.color)
- ui_draw_children(item)
- case .Label:
- data := cast(^Data_Label) item.handle
- text := strings.clone_to_cstring(data.text, context.temp_allocator)
- position := calculate_text_alignment(text, data.font, data.alignment, rect)
-
- rl.DrawTextEx(data.font, text, i2f(position), f32(data.font.baseSize), 0.0, theme.text);
+ //case .Panel_Root:
+ // ... render any type of item
+ case .Button:
+ data := cast(^Data_Button) item.handle
+ rl.DrawRectangle(i32(rect.l), i32(rect.t), i32(rect.r-rect.l), i32(rect.b-rect.t), theme.button)
+
+ text := strings.clone_to_cstring(data.text, context.temp_allocator)
+ position := calculate_text_alignment(text, font, .Center, rect)
+
+ rl.DrawTextEx(font, text, i2f(position), f32(font.baseSize), 0.0, theme.text);
+
+ //fmt.println(item.anim)
+
+ case .Slider:
+ data := cast(^Data_Slider) head
+ rl.DrawRectangle(i32(rect.l), i32(rect.t), i32(rect.r-rect.l), i32(rect.b-rect.t), theme.base)
+ rl.DrawRectangle(i32(rect.l+1), i32(rect.t+1), i32(f32(rect.r-rect.l)*(f32(data.value^)/255)-2), i32(rect.b-rect.t-2), theme.slider_bar)
+
+ text := strings.clone_to_cstring(data.text, context.temp_allocator)
+ position := calculate_text_alignment(text, font, .Center, rect)
+
+ rl.DrawTextEx(font, text, i2f(position), f32(font.baseSize), 0.0, theme.text);
+
+ case .Panel:
+ data := cast(^Data_Panel) head
+ rl.DrawRectangle(i32(rect.l), i32(rect.t), i32(rect.r-rect.l), i32(rect.b-rect.t), data.color)
+ ui_draw_children(item)
+
+ case .Label:
+ data := cast(^Data_Label) item.handle
+ text := strings.clone_to_cstring(data.text, context.temp_allocator)
+ position := calculate_text_alignment(text, data.font, data.alignment, rect)
+
+ rl.DrawTextEx(data.font, text, i2f(position), f32(data.font.baseSize), 0.0, theme.text);
}
} \ No newline at end of file