diff --git a/build_file.c b/build_file.c index 3776326..544b433 100644 --- a/build_file.c +++ b/build_file.c @@ -41,7 +41,7 @@ int main(int argc, char **argv) { b32 core_test_target = false; b32 win32_target = true; b32 standalone_w32_target = false; - b32 wasm_target = true; + b32 wasm_target = false; if (run_server) { os_systemf("start /D ..\\package ..\\package\\run_server.bat"); diff --git a/package/index.html b/package/index.html index e90ed68..7bd78a6 100644 --- a/package/index.html +++ b/package/index.html @@ -173,6 +173,31 @@ const wasm_app_imports = { window.requestAnimationFrame(wasm_update); } + canvas.addEventListener('dragover', e => { e.preventDefault(); }); + canvas.addEventListener("drop", (e) => { + e.preventDefault(); + if (e.dataTransfer.items) { + [...e.dataTransfer.items].forEach((item, i) => { + if (item.kind === "file") { + let file = item.getAsFile(); + let reader = new FileReader(); + + let blob = file.slice(0, file.size); + reader.onload = (e) => { + if (e.target.error != null) { + console.log("failed to read file: ", e.target.error); + return; + } + let result = e.target.result; + + // console.log(new TextDecoder().decode(result)); + } + reader.readAsArrayBuffer(blob); + } + }); + } + }); + addEventListener("resize", (event) => { wake_up(); }); addEventListener("keydown", (event) => { if (["F1", "F2", "F3", "p"].includes(event.key)) event.preventDefault(); diff --git a/src/app/app_wasm.html b/src/app/app_wasm.html index e90ed68..7bd78a6 100644 --- a/src/app/app_wasm.html +++ b/src/app/app_wasm.html @@ -173,6 +173,31 @@ const wasm_app_imports = { window.requestAnimationFrame(wasm_update); } + canvas.addEventListener('dragover', e => { e.preventDefault(); }); + canvas.addEventListener("drop", (e) => { + e.preventDefault(); + if (e.dataTransfer.items) { + [...e.dataTransfer.items].forEach((item, i) => { + if (item.kind === "file") { + let file = item.getAsFile(); + let reader = new FileReader(); + + let blob = file.slice(0, file.size); + reader.onload = (e) => { + if (e.target.error != null) { + console.log("failed to read file: ", e.target.error); + return; + } + let result = e.target.result; + + // console.log(new TextDecoder().decode(result)); + } + reader.readAsArrayBuffer(blob); + } + }); + } + }); + addEventListener("resize", (event) => { wake_up(); }); addEventListener("keydown", (event) => { if (["F1", "F2", "F3", "p"].includes(event.key)) event.preventDefault(); diff --git a/src/os/os_win32.c b/src/os/os_win32.c index 974ff1d..77b949c 100644 --- a/src/os/os_win32.c +++ b/src/os/os_win32.c @@ -108,6 +108,34 @@ fn os_write_t os_write(s8_t path, s8_t content) { return result; } +// @todo: improve to return error codes +fn s8_t os_read(ma_arena_t *arena, s8_t path) { + s8_t result = {0}; + ma_temp_t scratch = ma_begin_scratch1(arena); + s16_t path16 = s16_from_s8(scratch.arena, path); + HANDLE handle = CreateFileW(path16.str, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (handle != INVALID_HANDLE_VALUE) { + LARGE_INTEGER file_size; + if (GetFileSizeEx(handle, &file_size)) { + if (file_size.QuadPart != 0) { + result.len = file_size.QuadPart; + result.str = ma_push_array(arena, char, result.len + 1); + assert(result.len == (i64)(DWORD)result.len); + DWORD read; + if (ReadFile(handle, result.str, (DWORD)result.len, &read, NULL)) { // @todo: can only read 32 byte size files? + if (read == result.len) { + result.str[result.len] = 0; + } + } + + } + } + CloseHandle(handle); + } + ma_end_scratch(scratch); + return result; +} + typedef struct w32_file_iter_t w32_file_iter_t; struct w32_file_iter_t { HANDLE handle; diff --git a/src/ui/ui.c b/src/ui/ui.c index 2e4aedd..45a0048 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -389,10 +389,10 @@ struct ui_draw_compute_t { fn r2f32_t ui_get_appear_rect(ui_box_t *box) { r2f32_t result = box->rect; - f32 appear_t = f32_ease_out_n(f32_clamp01(box->appear_t * 2), 10); - if (!ui_id_is_null(box->id)) { + if (box->flags.animate_appear && !ui_id_is_null(box->id)) { v2f32_t size = v2f32_muls(r2f32_get_size(result), 0.15f); r2f32_t smaller_rect = r2f32_shrink(result, size); + f32 appear_t = f32_ease_out_n(f32_clamp01(box->appear_t * 2), 10); result = r2f32_lerp(smaller_rect, result, appear_t); } return result; @@ -622,7 +622,7 @@ fn ui_signal_t ui__label_button(ui_code_loc_t loc, char *str, ...) { #define ui_label(...) ui__label(UILOC, __VA_ARGS__) fn ui_box_t *ui__label(ui_code_loc_t loc, char *str, ...) { S8_FMT(tcx->temp, str, string); - ui_box_t *box = ui_box(.loc = loc, .string = string, .flags = {.draw_text = true}); + ui_box_t *box = ui_box(.loc = loc, .string = string, .flags = {.draw_text = true, .animate_appear = true}); return box; } @@ -751,13 +751,13 @@ fn void ui_end_reversal(void) { ui_box_t *first2 = NULL; ui_box_t *last2 = NULL; - for (ui_box_t *it = first, *next = it->next; next; it = next) { + for (ui_box_t *it = first, *next = NULL; it; it = next) { next = it->next; DLLQ_REMOVE(it->parent->first, it->parent->last, it); DLLQ_APPEND(first2, last2, it); } - for (ui_box_t *it = last2, *prev = it->prev; prev; it = prev) { + for (ui_box_t *it = last2, *prev = NULL; it; it = prev) { prev = it->prev; DLLQ_REMOVE(first2, last2, it); DLLQ_APPEND(it->parent->first, it->parent->last, it); @@ -1192,11 +1192,11 @@ fn void ui_begin_frame(app_frame_t *frame) { fn void ui_end_frame(void) { for (ui_box_t *box = ui->hash_first, *next = NULL; box; box = next) { next = box->hash_next; - // if (box->flags.animate_appear) { + if (box->flags.animate_appear) { box->appear_t += (f32)ui->frame->delta; - // } else { - // box->appear_t = 1; - // } + } else { + box->appear_t = 1; + } if (ui_is_hot_box(box)) { box->hot_t += (f32)ui->frame->delta; } else { diff --git a/src/ui/ui.h b/src/ui/ui.h index 2550818..af29593 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -169,7 +169,6 @@ fn b32 ui_is_focused_box(ui_box_t *box) { return !ui_is_null_box(box) && box->id #define ui_dm(V) ((V) * rn->main_font->computed_xchar_size) #define ui_max 200000000.f #define ui_children_sum 0 -#define ui_box_flags(...) (ui_box_flag_t){__VA_ARGS__} fn ui_id_t ui_id(s8_t string); fn ui_id_t ui_idf(char *str, ...);