[ui, logging]

- Changed workings of ui_panel() and scrolling to make it easier for usage code to control scrolling.
- Renamed logging functions
This commit is contained in:
Martin Fouilleul 2023-04-20 15:40:00 +02:00
parent bb6b68ad73
commit 7c273f494b
7 changed files with 84 additions and 113 deletions

View File

@ -1990,47 +1990,6 @@ void mp_pump_events(f64 timeout)
} }
} }
/*
void mp_run_loop()
{@autoreleasepool {
//CVDisplayLinkStart(__mpApp.displayLink);
while(!__mpApp.shouldQuit)
{
mp_event event;
while(mp_next_event(&event))
{
//send pending event that might have accumulated before we started run loop
if(__mpApp.eventCallback)
{
__mpApp.eventCallback(event, __mpApp.eventData);
}
}
NSEvent* nsEvent = [NSApp nextEventMatchingMask: NSEventMaskAny
untilDate:[NSDate distantFuture]
inMode: NSDefaultRunLoopMode
dequeue: YES];
if(nsEvent != nil)
{
[NSApp sendEvent:nsEvent];
}
}
//CVDisplayLinkStop(__mpApp.displayLink);
}}
*/
void mp_end_input_frame()
{
//////////////////////////////////////////////////////////////////////////////////////////////
//TODO: make sure we call arena clear once per event frame, even when using runloop etc...
//////////////////////////////////////////////////////////////////////////////////////////////
mem_arena_clear(&__mpApp.eventArena);
}
//-------------------------------------------------------------------- //--------------------------------------------------------------------
// app resources // app resources
//-------------------------------------------------------------------- //--------------------------------------------------------------------

View File

@ -24,14 +24,14 @@ typedef struct log_output
static log_output _logDefaultOutput = {.kind = ORCA_LOG_OUTPUT_CONSOLE}; static log_output _logDefaultOutput = {.kind = ORCA_LOG_OUTPUT_CONSOLE};
log_output* LOG_DEFAULT_OUTPUT = &_logDefaultOutput; log_output* LOG_DEFAULT_OUTPUT = &_logDefaultOutput;
extern void orca_log_entry(log_level level, extern void orca_log(log_level level,
int fileLen, int fileLen,
const char* file, const char* file,
int functionLen, int functionLen,
const char* function, const char* function,
int line, int line,
int msgLen, int msgLen,
const char* msg); const char* msg);
typedef struct orca_log_context typedef struct orca_log_context
{ {
@ -49,13 +49,13 @@ char* log_stbsp_callback(char const* buf, void* user, int len)
return((char*)buf); return((char*)buf);
} }
void platform_log_entry(log_output* output, void platform_log_push(log_output* output,
log_level level, log_level level,
str8 function, str8 function,
str8 file, str8 file,
int line, int line,
const char* fmt, const char* fmt,
va_list ap) va_list ap)
{ {
mem_arena* scratch = mem_scratch(); mem_arena* scratch = mem_scratch();
mem_arena_marker marker = mem_arena_mark(scratch); mem_arena_marker marker = mem_arena_mark(scratch);
@ -68,7 +68,7 @@ void platform_log_entry(log_output* output,
str8 string = str8_list_join(scratch, ctx.list); str8 string = str8_list_join(scratch, ctx.list);
orca_log_entry(level, str8_ip(function), str8_ip(file), line, str8_ip(string)); orca_log(level, str8_ip(function), str8_ip(file), line, str8_ip(string));
mem_arena_clear_to(scratch, marker); mem_arena_clear_to(scratch, marker);
} }

View File

@ -13,7 +13,7 @@ typedef struct log_config
log_level level; log_level level;
} log_config; } log_config;
//TODO: make default output a compile-time constant to avoid check in log_entry()? //TODO: make default output a compile-time constant to avoid check in log_push()?
static log_config __logConfig = {0, LOG_LEVEL_INFO}; static log_config __logConfig = {0, LOG_LEVEL_INFO};
void log_set_output(log_output* output) void log_set_output(log_output* output)
@ -26,15 +26,15 @@ void log_set_level(log_level level)
__logConfig.level = level; __logConfig.level = level;
} }
void platform_log_entry(log_output* output, void platform_log_push(log_output* output,
log_level level, log_level level,
str8 function, str8 function,
str8 file, str8 file,
int line, int line,
const char* fmt, const char* fmt,
va_list ap); va_list ap);
void log_entry(log_level level, void log_push(log_level level,
str8 function, str8 function,
str8 file, str8 file,
int line, int line,
@ -50,7 +50,7 @@ void log_entry(log_level level,
{ {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
platform_log_entry(__logConfig.output, level, function, file, line, fmt, ap); platform_log_push(__logConfig.output, level, function, file, line, fmt, ap);
va_end(ap); va_end(ap);
} }
} }

View File

@ -22,14 +22,14 @@ extern log_output* LOG_DEFAULT_OUTPUT;
MP_API void log_set_level(log_level level); MP_API void log_set_level(log_level level);
MP_API void log_set_output(log_output* output); MP_API void log_set_output(log_output* output);
MP_API void log_entry(log_level level, MP_API void log_push(log_level level,
str8 function, str8 function,
str8 file, str8 file,
int line, int line,
const char* fmt, const char* fmt,
...); ...);
#define log_generic(level, msg, ...) log_entry(level, STR8(__FUNCTION__), STR8(__FILE__), __LINE__, msg, ##__VA_ARGS__) #define log_generic(level, msg, ...) log_push(level, STR8(__FUNCTION__), STR8(__FILE__), __LINE__, msg, ##__VA_ARGS__)
#define log_error(msg, ...) log_generic(LOG_LEVEL_ERROR, msg, ##__VA_ARGS__) #define log_error(msg, ...) log_generic(LOG_LEVEL_ERROR, msg, ##__VA_ARGS__)

View File

@ -36,13 +36,13 @@ typedef struct log_output
static log_output _logDefaultOutput = {0}; static log_output _logDefaultOutput = {0};
log_output* LOG_DEFAULT_OUTPUT = &_logDefaultOutput; log_output* LOG_DEFAULT_OUTPUT = &_logDefaultOutput;
void platform_log_entry(log_output* output, void platform_log_push(log_output* output,
log_level level, log_level level,
str8 function, str8 function,
str8 file, str8 file,
int line, int line,
const char* fmt, const char* fmt,
va_list ap) va_list ap)
{ {
if(output == LOG_DEFAULT_OUTPUT && output->f == 0) if(output == LOG_DEFAULT_OUTPUT && output->f == 0)
{ {

View File

@ -447,6 +447,18 @@ ui_box* ui_box_make_str8(str8 string, ui_flags flags)
} }
ui->nextBoxAfterRules = (list_info){0}; ui->nextBoxAfterRules = (list_info){0};
//NOTE: set scroll
vec2 wheel = ui_mouse_wheel();
if(box->flags & UI_FLAG_SCROLL_WHEEL_X)
{
box->scroll.x += wheel.x;
}
if(box->flags & UI_FLAG_SCROLL_WHEEL_Y)
{
box->scroll.y += wheel.y;
}
return(box); return(box);
} }
@ -1155,6 +1167,9 @@ void ui_layout_compute_rect(ui_context* ui, ui_box* box, vec2 pos)
- (box->childrenSum[layoutAxis] + box->spacing[layoutAxis])); - (box->childrenSum[layoutAxis] + box->spacing[layoutAxis]));
} }
currentPos.x -= box->scroll.x;
currentPos.y -= box->scroll.y;
for_list(&box->children, child, ui_box, listElt) for_list(&box->children, child, ui_box, listElt)
{ {
if(align[secondAxis] == UI_ALIGN_CENTER) if(align[secondAxis] == UI_ALIGN_CENTER)
@ -1796,29 +1811,22 @@ ui_box* ui_slider(const char* label, f32 thumbRatio, f32* scrollValue)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void ui_panel_begin(const char* str, ui_flags flags) void ui_panel_begin(const char* str, ui_flags flags)
{ {
ui_box* box = ui_box_begin(str, flags | UI_FLAG_CLIP | UI_FLAG_BLOCK_MOUSE); flags = flags
| UI_FLAG_CLIP
| UI_FLAG_BLOCK_MOUSE
| UI_FLAG_ALLOW_OVERFLOW_X
| UI_FLAG_ALLOW_OVERFLOW_Y;
ui_style contentsStyle = { ui_box_begin(str, flags);
.size.width = {UI_SIZE_CHILDREN},
.size.height = {UI_SIZE_CHILDREN},
.floating.x = true,
.floating.y = true,
.floatTarget = {-box->scroll.x, -box->scroll.y}};
ui_style_next(&contentsStyle, UI_STYLE_FLOAT);
ui_box_begin("contents", 0);
} }
void ui_panel_end(void) void ui_panel_end(void)
{ {
ui_box* contents = ui_box_top();
ui_box_end();
ui_box* panel = ui_box_top(); ui_box* panel = ui_box_top();
ui_sig sig = ui_box_sig(panel); ui_sig sig = ui_box_sig(panel);
f32 contentsW = ClampLowBound(contents->rect.w, panel->rect.w); f32 contentsW = ClampLowBound(panel->childrenSum[0], panel->rect.w);
f32 contentsH = ClampLowBound(contents->rect.h, panel->rect.h); f32 contentsH = ClampLowBound(panel->childrenSum[1], panel->rect.h);
contentsW = ClampLowBound(contentsW, 1); contentsW = ClampLowBound(contentsW, 1);
contentsH = ClampLowBound(contentsH, 1); contentsH = ClampLowBound(contentsH, 1);
@ -1847,7 +1855,6 @@ void ui_panel_end(void)
panel->scroll.x = sliderX * (contentsW - panel->rect.w); panel->scroll.x = sliderX * (contentsW - panel->rect.w);
if(sig.hovering) if(sig.hovering)
{ {
panel->scroll.x += sig.wheel.x;
ui_box_activate(scrollBarX); ui_box_activate(scrollBarX);
} }
} }
@ -1872,7 +1879,6 @@ void ui_panel_end(void)
panel->scroll.y = sliderY * (contentsH - panel->rect.h); panel->scroll.y = sliderY * (contentsH - panel->rect.h);
if(sig.hovering) if(sig.hovering)
{ {
panel->scroll.y += sig.wheel.y;
ui_box_activate(scrollBarY); ui_box_activate(scrollBarY);
} }
} }
@ -2645,8 +2651,7 @@ ui_text_box_result ui_text_box(const char* name, mem_arena* arena, str8 text)
| UI_FLAG_DRAW_BACKGROUND | UI_FLAG_DRAW_BACKGROUND
| UI_FLAG_DRAW_BORDER | UI_FLAG_DRAW_BORDER
| UI_FLAG_CLIP | UI_FLAG_CLIP
| UI_FLAG_DRAW_PROC | UI_FLAG_DRAW_PROC;
| UI_FLAG_SCROLLABLE;
ui_box* frame = ui_box_make(name, frameFlags); ui_box* frame = ui_box_make(name, frameFlags);
ui_style* style = &frame->style; ui_style* style = &frame->style;

View File

@ -131,6 +131,9 @@ enum
UI_STYLE_SIZE = UI_STYLE_SIZE_WIDTH UI_STYLE_SIZE = UI_STYLE_SIZE_WIDTH
| UI_STYLE_SIZE_HEIGHT, | UI_STYLE_SIZE_HEIGHT,
UI_STYLE_LAYOUT_MARGINS = UI_STYLE_LAYOUT_MARGIN_X
| UI_STYLE_LAYOUT_MARGIN_Y,
UI_STYLE_LAYOUT = UI_STYLE_LAYOUT_AXIS UI_STYLE_LAYOUT = UI_STYLE_LAYOUT_AXIS
| UI_STYLE_LAYOUT_ALIGN_X | UI_STYLE_LAYOUT_ALIGN_X
| UI_STYLE_LAYOUT_ALIGN_Y | UI_STYLE_LAYOUT_ALIGN_Y
@ -249,22 +252,23 @@ typedef void(*ui_box_draw_proc)(ui_box* box, void* data);
typedef enum typedef enum
{ {
UI_FLAG_CLICKABLE = (1<<0), UI_FLAG_CLICKABLE = (1<<0),
UI_FLAG_SCROLLABLE = (1<<1), UI_FLAG_SCROLL_WHEEL_X = (1<<1),
UI_FLAG_BLOCK_MOUSE = (1<<2), UI_FLAG_SCROLL_WHEEL_Y = (1<<2),
UI_FLAG_HOT_ANIMATION = (1<<3), UI_FLAG_BLOCK_MOUSE = (1<<3),
UI_FLAG_ACTIVE_ANIMATION = (1<<4), UI_FLAG_HOT_ANIMATION = (1<<4),
UI_FLAG_ACTIVE_ANIMATION = (1<<5),
//WARN: these two following flags need to be kept as consecutive bits to //WARN: these two following flags need to be kept as consecutive bits to
// play well with axis-agnostic functions // play well with axis-agnostic functions
UI_FLAG_ALLOW_OVERFLOW_X = (1<<5), UI_FLAG_ALLOW_OVERFLOW_X = (1<<6),
UI_FLAG_ALLOW_OVERFLOW_Y = (1<<6), UI_FLAG_ALLOW_OVERFLOW_Y = (1<<7),
UI_FLAG_CLIP = (1<<7), UI_FLAG_CLIP = (1<<8),
UI_FLAG_DRAW_BACKGROUND = (1<<8), UI_FLAG_DRAW_BACKGROUND = (1<<9),
UI_FLAG_DRAW_FOREGROUND = (1<<9), UI_FLAG_DRAW_FOREGROUND = (1<<10),
UI_FLAG_DRAW_BORDER = (1<<10), UI_FLAG_DRAW_BORDER = (1<<11),
UI_FLAG_DRAW_TEXT = (1<<11), UI_FLAG_DRAW_TEXT = (1<<12),
UI_FLAG_DRAW_PROC = (1<<12), UI_FLAG_DRAW_PROC = (1<<13),
UI_FLAG_OVERLAY = (1<<13), UI_FLAG_OVERLAY = (1<<14),
} ui_flags; } ui_flags;
struct ui_box struct ui_box
@ -423,6 +427,7 @@ MP_API ui_box* ui_box_begin_str8(str8 string, ui_flags flags);
MP_API ui_box* ui_box_end(void); MP_API ui_box* ui_box_end(void);
#define ui_container(name, flags) defer_loop(ui_box_begin(name, flags), ui_box_end()) #define ui_container(name, flags) defer_loop(ui_box_begin(name, flags), ui_box_end())
#define ui_container_str8(name, flags) defer_loop(ui_box_begin_str8(name, flags), ui_box_end())
MP_API void ui_box_push(ui_box* box); MP_API void ui_box_push(ui_box* box);
MP_API void ui_box_pop(void); MP_API void ui_box_pop(void);
@ -492,6 +497,8 @@ enum {
}; };
MP_API ui_sig ui_label(const char* label); MP_API ui_sig ui_label(const char* label);
MP_API ui_sig ui_label_str8(str8 label);
MP_API ui_sig ui_button(const char* label); MP_API ui_sig ui_button(const char* label);
MP_API ui_sig ui_checkbox(const char* name, bool* checked); MP_API ui_sig ui_checkbox(const char* name, bool* checked);
MP_API ui_box* ui_slider(const char* label, f32 thumbRatio, f32* scrollValue); MP_API ui_box* ui_slider(const char* label, f32 thumbRatio, f32* scrollValue);