1
0
Fork 0

Control: Rename "control" to "ctrl" and pretty things

master
Marrub 2016-10-17 19:30:28 -04:00
parent 44ae7d93e7
commit d4faa148ee
6 changed files with 94 additions and 63 deletions

Binary file not shown.

Binary file not shown.

View File

@ -131,11 +131,11 @@ void Lth_ContextClipPop(Lth_Context *ctx);
void Lth_DrawRectAndClip(Lth_Context *ctx, int x, int y, int w, int h, __fixed alpha); void Lth_DrawRectAndClip(Lth_Context *ctx, int x, int y, int w, int h, __fixed alpha);
void Lth_DrawRect(Lth_Context *ctx, int x, int y, int w, int h, __fixed alpha); void Lth_DrawRect(Lth_Context *ctx, int x, int y, int w, int h, __fixed alpha);
void Lth_ControlRun(Lth_Context *ctx, void *control_); void Lth_ControlRun(Lth_Context *ctx, void *ctrl_);
void Lth_ControlConnect(void *control_, Lth_Signal signal, Lth_Callback_t cb); void Lth_ControlConnect(void *ctrl_, Lth_Signal signal, Lth_Callback_t cb);
void Lth_ControlDestroy(void *control_); void Lth_ControlDestroy(void *ctrl_);
Lth_Window *Lth_WindowNew(char const *title, int w, int h, int x, int y); Lth_Window *Lth_WindowNew(char const *title, int w, int h, int x, int y);
void Lth_WindowSetTitle(Lth_Window *control, char const *title); void Lth_WindowSetTitle(Lth_Window *ctrl, char const *title);
#endif//lithos3__Lth_control_h #endif//lithos3__Lth_control_h

View File

@ -40,21 +40,20 @@ Lth_Context *Lth_ContextNew(int w, int h, Lth_HID hidBase, Lth_HID hidEnd)
// //
// Lth_ContextMap // Lth_ContextMap
// //
void Lth_ContextMap(Lth_Context *ctx, Lth_Window *window) void Lth_ContextMap(Lth_Context *ctx, Lth_Window *ctrl)
{ {
Lth_assert(ctx != NULL); Lth_assert(ctx != NULL);
Lth_assert(window != NULL); Lth_assert(ctrl != NULL);
// TODO: should use last window's position + some divisor of screenspace if(ctrl->x == -1) ctrl->x = ctx->w / 2;
if(window->x == -1) window->x = ctx->w / 2; if(ctrl->y == -1) ctrl->y = ctx->h / 2;
if(window->y == -1) window->y = ctx->h / 2;
if(ctx->map) if(ctx->map)
Lth_LinkListInsert(&window->desclink, window, &ctx->map); Lth_LinkListInsert(&ctrl->desclink, ctrl, &ctx->map);
else else
{ {
ctx->map = &window->desclink; ctx->map = &ctrl->desclink;
ctx->map->owner = window; ctx->map->owner = ctrl;
} }
} }
@ -68,10 +67,8 @@ void Lth_ContextDestroy(Lth_Context *ctx)
if(ctx->map) if(ctx->map)
{ {
for(Lth_LinkList *list = ctx->map; list;) Lth_ListFor(Lth_Control *owner, ctx->map)
{ {
Lth_LinkList *next = list->next;
Lth_Control *owner = list->owner;
Lth_LinkListRemove(list); Lth_LinkListRemove(list);
if(owner) Lth_ControlDestroy(owner); if(owner) Lth_ControlDestroy(owner);
list = next; list = next;
@ -92,8 +89,8 @@ void Lth_ContextRun(Lth_Context *ctx)
ctx->hid.cur = ctx->hid.base; ctx->hid.cur = ctx->hid.base;
if(ctx->map) if(ctx->map)
for(Lth_LinkList *list = ctx->map; list; list = list->next) Lth_ListForEach(Lth_Control *owner, ctx->map)
Lth_ControlRun(ctx, list->owner); Lth_ControlRun(ctx, owner);
} }
// //
@ -103,8 +100,25 @@ void Lth_ContextClipPush(Lth_Context *ctx, int x, int y, int w, int h)
{ {
Lth_assert(ctx != NULL); Lth_assert(ctx != NULL);
ctx->clip.rects[++ctx->clip.num] = (Lth_Rect){ x, y, w, h }; Lth_Rect rect = ctx->clip.rects[ctx->clip.num++];
ACS_SetHudClipRect(x, y, w, h);
if(!(rect.x == 0 && rect.y == 0 && rect.w == 0 && rect.h == 0))
{
if(rect.x < x) rect.x = x;
if(rect.y < y) rect.y = y;
if(rect.x + rect.w > x + w) rect.w = w;
if(rect.y + rect.h > y + h) rect.h = h;
}
else
{
rect.x = x;
rect.y = y;
rect.h = h;
rect.w = w;
}
ctx->clip.rects[ctx->clip.num] = rect;
ACS_SetHudClipRect(rect.x, rect.y, rect.w, rect.h);
} }
// //

View File

@ -8,7 +8,7 @@
// //
// Control functions. // Control functions.
// //
// # of rewrites because of DavidPH: 1 // # of rewrites because of DavidPH: 2
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -24,66 +24,64 @@
// //
// Lth_ControlRun // Lth_ControlRun
// //
void Lth_ControlRun(Lth_Context *ctx, void *control_) void Lth_ControlRun(Lth_Context *ctx, void *ctrl_)
{ {
Lth_assert(ctx != NULL); Lth_assert(ctx != NULL);
Lth_assert(control_ != NULL); Lth_assert(ctrl_ != NULL);
Lth_Control *control = control_; Lth_Control *ctrl = ctrl_;
Lth_Call(control->cb.update, ctx, control); Lth_ControlCall(ctrl, update, ctx, ctrl);
Lth_Call(control->cb.draw, ctx, control); Lth_ControlCall(ctrl, draw, ctx, ctrl);
Lth_ControlCall(ctrl, postdraw, ctx, ctrl);
} }
// //
// Lth_ControlConnect // Lth_ControlConnect
// //
void Lth_ControlConnect(void *control_, Lth_Signal signal, Lth_Callback_t cb) void Lth_ControlConnect(void *ctrl_, Lth_Signal signal, Lth_Callback_t cb)
{ {
Lth_assert(control_ != NULL); Lth_assert(ctrl_ != NULL);
Lth_assert(signal < Lth_SIGMAX && signal >= 0); Lth_assert(signal < Lth_SIGMAX && signal >= 0);
Lth_assert(cb != NULL); Lth_assert(cb != NULL);
Lth_Control *control = control_; Lth_Control *ctrl = ctrl_;
switch(signal) switch(signal)
{ {
#define vec(name) control->cb.name
#define Lth_X(sig, name, ret, ...) \ #define Lth_X(sig, name, ret, ...) \
case Lth_##sig: \ case Lth_##sig: \
vec(name).data = \ ctrl->cb.name.data = realloc(ctrl->cb.name.data, \
realloc(vec(name).data, \ sizeof(Lth_##sig##_t) * (ctrl->cb.name.size + 1)); \
sizeof(Lth_##sig##_t) * (vec(name).size + 1)); \ ctrl->cb.name.data[ctrl->cb.name.size++] = (Lth_##sig##_t)cb; \
vec(name).data[vec(name).size++] = (Lth_##sig##_t)cb; \
break; break;
#include "Lth_callback.h" #include "Lth_callback.h"
#undef vec
} }
} }
// //
// Lth_ControlDestroy // Lth_ControlDestroy
// //
void Lth_ControlDestroy(void *control_) void Lth_ControlDestroy(void *ctrl_)
{ {
Lth_assert(control_ != NULL); if(ctrl_ == NULL) return;
Lth_Control *control = control_; Lth_Control *ctrl = ctrl_;
for(Lth_LinkList *list = control->descendants; list;) Lth_ListFor(Lth_Control *owner, ctrl->descendants)
{ {
Lth_LinkList *next = list->next;
Lth_Control *owner = list->owner;
Lth_ControlDestroy(owner); Lth_ControlDestroy(owner);
list = next; list = next;
} }
Lth_CallReverse(control->cb.destroy, control); Lth_CallReverse(ctrl->cb.destroy, ctrl);
Lth_LinkListRemove(&control->desclink); Lth_LinkListRemove(&ctrl->desclink);
free(control); #define Lth_X(sig, name, ret, ...) \
free(ctrl->cb.name.data);
#include "Lth_callback.h"
free(ctrl);
} }

View File

@ -22,13 +22,30 @@
// //
// Lth_WindowDraw // Lth_WindowDraw
// //
static void Lth_WindowDraw(Lth_Context *ctx, Lth_Window *window) static void Lth_WindowDraw(Lth_Context *ctx, Lth_Window *ctrl)
{ {
Lth_DrawRect(ctx, window->x, window->y, window->w, window->h, 0.5k);
ACS_SetFont(s"CONFONT"); ACS_SetFont(s"CONFONT");
Lth_PrintString(window->title); Lth_PrintString(ctrl->title);
Lth_HudMessagePlain(ctx->hid.cur--, window->x - 8 + Lth_A_Lef, Lth_HudMessagePlain(ctx->hid.cur--, ctrl->x - 8 + Lth_A_Lef,
window->y - 8 + Lth_A_Top); ctrl->y - 8 + Lth_A_Top);
Lth_DrawRectAndClip(ctx, ctrl->x, ctrl->y, ctrl->w, ctrl->h, 0.5k);
}
//
// Lth_WindowPostDraw
//
static void Lth_WindowPostDraw(Lth_Context *ctx, Lth_Window *ctrl)
{
Lth_ContextClipPop(ctx);
}
//
// Lth_WindowDestroy
//
static void Lth_WindowDestroy(Lth_Window *ctrl)
{
if(ctrl->title)
free(ctrl->title);
} }
@ -41,31 +58,33 @@ static void Lth_WindowDraw(Lth_Context *ctx, Lth_Window *window)
// //
Lth_Window *Lth_WindowNew(char const *title, int w, int h, int x, int y) Lth_Window *Lth_WindowNew(char const *title, int w, int h, int x, int y)
{ {
Lth_Window *control = calloc(1, sizeof(Lth_Window)); Lth_Window *ctrl = calloc(1, sizeof(Lth_Window));
Lth_assert(control != NULL); Lth_assert(ctrl != NULL);
control->w = w; ctrl->w = w;
control->h = h; ctrl->h = h;
control->x = x; ctrl->x = x;
control->y = y; ctrl->y = y;
Lth_WindowSetTitle(control, title); Lth_WindowSetTitle(ctrl, title);
Lth_ControlConnect(control, Lth_SIGDRAW, Lth_Callback(Lth_WindowDraw)); Lth_ControlConnect(ctrl, Lth_SIGDRAW, Lth_Callback(Lth_WindowDraw));
Lth_ControlConnect(ctrl, Lth_SIGPSTDRAW, Lth_Callback(Lth_WindowPostDraw));
Lth_ControlConnect(ctrl, Lth_SIGDESTROY, Lth_Callback(Lth_WindowDestroy));
return control; return ctrl;
} }
// //
// Lth_WindowSetTitle // Lth_WindowSetTitle
// //
void Lth_WindowSetTitle(Lth_Window *control, char const *title) void Lth_WindowSetTitle(Lth_Window *ctrl, char const *title)
{ {
Lth_assert(control != NULL); Lth_assert(ctrl != NULL);
if(title != NULL) if(title != NULL)
control->title = Lth_strdup(title); ctrl->title = Lth_strdup(title);
else else
control->title = Lth_strdup("<untitled>"); ctrl->title = Lth_strdup("<untitled>");
} }
// EOF // EOF