From 83340f95a271909b49335c05feb2499a125b7055 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Tue, 4 Nov 2025 01:52:44 +0000 Subject: [PATCH] smooth movement git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@587 b9cfdab3-6d41-4d17-bbe4-086880011989 --- include/Mw/TypeDefs.h | 5 +++- src/core.c | 5 ++++ src/widget/button.c | 2 +- src/widget/checkbox.c | 2 +- src/widget/entry.c | 2 +- src/widget/frame.c | 2 +- src/widget/image.c | 2 +- src/widget/label.c | 2 +- src/widget/listbox.c | 14 ++++++++-- src/widget/menu.c | 2 +- src/widget/numberentry.c | 2 +- src/widget/opengl.c | 2 +- src/widget/progressbar.c | 2 +- src/widget/radiobox.c | 2 +- src/widget/scrollbar.c | 2 +- src/widget/submenu.c | 2 +- src/widget/viewport.c | 60 ++++++++++++++++++++++++++++------------ src/widget/vulkan.c | 2 +- src/widget/window.c | 2 +- 19 files changed, 79 insertions(+), 35 deletions(-) diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h index d5c986b..8539219 100644 --- a/include/Mw/TypeDefs.h +++ b/include/Mw/TypeDefs.h @@ -109,6 +109,8 @@ struct _MwViewport { MwWidget hscroll; MwWidget frame; MwWidget inframe; + int vchanged; + int hchanged; }; struct _MwListBoxEntry { @@ -124,6 +126,7 @@ struct _MwListBox { unsigned long click_time; int pressed; int* width; + int changed; }; struct _MwDirectoryEntry { @@ -150,7 +153,7 @@ struct _MwClass { MwHandlerMouse mouse_down; MwHandlerKey key; MwHandlerExecute execute; - void* reserved2; + MwHandler tick; void* reserved3; void* reserved4; void* reserved5; diff --git a/src/core.c b/src/core.c index 0370a3f..2e41417 100644 --- a/src/core.c +++ b/src/core.c @@ -166,6 +166,10 @@ MwWidget MwCreateWidget(MwClass widget_class, const char* name, MwWidget parent, } h->prop_event = 1; + if(h->widget_class != NULL && h->widget_class->tick != NULL){ + MwAddTickList(h); + } + return h; } @@ -302,6 +306,7 @@ void MwLoop(MwWidget handle) { if(v != 0) break; for(i = 0; i < arrlen(handle->tick_list); i++) { + MwDispatch(handle->tick_list[i], tick); MwDispatchUserHandler(handle->tick_list[i], MwNtickHandler, NULL); } diff --git a/src/widget/button.c b/src/widget/button.c index f6fe576..49abfe2 100644 --- a/src/widget/button.c +++ b/src/widget/button.c @@ -76,7 +76,7 @@ MwClassRec MwButtonClassRec = { MwForceRender2, /* mouse_down */ NULL, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/checkbox.c b/src/widget/checkbox.c index 9b92345..3b4252e 100644 --- a/src/widget/checkbox.c +++ b/src/widget/checkbox.c @@ -48,7 +48,7 @@ MwClassRec MwCheckBoxClassRec = { MwForceRender2, /* mouse_down */ NULL, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/entry.c b/src/widget/entry.c index ee178f6..5d28397 100644 --- a/src/widget/entry.c +++ b/src/widget/entry.c @@ -139,7 +139,7 @@ MwClassRec MwEntryClassRec = { MwForceRender2, /* mouse_down */ key, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/frame.c b/src/widget/frame.c index 773e1a9..761bb07 100644 --- a/src/widget/frame.c +++ b/src/widget/frame.c @@ -52,7 +52,7 @@ MwClassRec MwFrameClassRec = { NULL, /* mouse_down */ NULL, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/image.c b/src/widget/image.c index 207f3c6..befee79 100644 --- a/src/widget/image.c +++ b/src/widget/image.c @@ -40,7 +40,7 @@ MwClassRec MwImageClassRec = { NULL, /* mouse_down */ NULL, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/label.c b/src/widget/label.c index 8c6d21b..95994e9 100644 --- a/src/widget/label.c +++ b/src/widget/label.c @@ -57,7 +57,7 @@ MwClassRec MwLabelClassRec = { NULL, /* mouse_down */ NULL, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/listbox.c b/src/widget/listbox.c index 068cc15..56f3796 100644 --- a/src/widget/listbox.c +++ b/src/widget/listbox.c @@ -112,7 +112,7 @@ static void vscroll_changed(MwWidget handle, void* user, void* call) { (void)user; (void)call; - MwForceRender(lb->frame); + lb->changed = 1; } static void frame_mouse_down(MwWidget handle, void* user, void* call) { @@ -312,6 +312,7 @@ static int create(MwWidget handle) { lb->selected = -1; lb->click_time = 0; lb->width = NULL; + lb->changed = 0; MwSetInteger(handle, MwNleftPadding, 0); MwSetInteger(handle, MwNhasHeading, 0); @@ -505,6 +506,15 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v } } +static void tick(MwWidget handle){ + MwListBox lb = handle->internal; + + if(lb->changed){ + lb->changed = 0; + MwForceRender(lb->frame); + } +} + MwClassRec MwListBoxClassRec = { create, /* create */ destroy, /* destroy */ @@ -517,7 +527,7 @@ MwClassRec MwListBoxClassRec = { NULL, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + tick, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/menu.c b/src/widget/menu.c index e0eeac6..6b1911d 100644 --- a/src/widget/menu.c +++ b/src/widget/menu.c @@ -209,7 +209,7 @@ MwClassRec MwMenuClassRec = { mouse_down, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/numberentry.c b/src/widget/numberentry.c index 18a1a2c..f8f137f 100644 --- a/src/widget/numberentry.c +++ b/src/widget/numberentry.c @@ -140,7 +140,7 @@ MwClassRec MwNumberEntryClassRec = { mouse_down, /* mouse_down */ key, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/opengl.c b/src/widget/opengl.c index a8ba232..6521cf2 100644 --- a/src/widget/opengl.c +++ b/src/widget/opengl.c @@ -180,7 +180,7 @@ MwClassRec MwOpenGLClassRec = { NULL, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/progressbar.c b/src/widget/progressbar.c index 3f8c47b..dd85267 100644 --- a/src/widget/progressbar.c +++ b/src/widget/progressbar.c @@ -56,7 +56,7 @@ MwClassRec MwProgressBarClassRec = { NULL, /* mouse_down */ NULL, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/radiobox.c b/src/widget/radiobox.c index 764b615..9dfcfb8 100644 --- a/src/widget/radiobox.c +++ b/src/widget/radiobox.c @@ -57,7 +57,7 @@ MwClassRec MwRadioBoxClassRec = { MwForceRender2, /* mouse_down */ NULL, /* key */ NULL, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/scrollbar.c b/src/widget/scrollbar.c index 59fbf49..6dcbde6 100644 --- a/src/widget/scrollbar.c +++ b/src/widget/scrollbar.c @@ -254,7 +254,7 @@ MwClassRec MwScrollBarClassRec = { mouse_down, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/submenu.c b/src/widget/submenu.c index 85ccb54..89a80f1 100644 --- a/src/widget/submenu.c +++ b/src/widget/submenu.c @@ -208,7 +208,7 @@ MwClassRec MwSubMenuClassRec = { MwForceRender2, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/viewport.c b/src/widget/viewport.c index 121e2e8..f4b23a3 100644 --- a/src/widget/viewport.c +++ b/src/widget/viewport.c @@ -3,28 +3,20 @@ static void vscroll_changed(MwWidget handle, void* user, void* call) { MwViewport vp = user; - int v = MwGetInteger(handle, MwNvalue); - int mv = MwGetInteger(handle, MwNmaxValue); - int l = MwGetInteger(vp->frame, MwNheight); - v = (mv - l) * (double)v / mv; + + (void)handle; (void)call; - if(v < 0) v = 0; - MwVaApply(vp->inframe, - MwNy, -v, - NULL); + + vp->vchanged = 1; } static void hscroll_changed(MwWidget handle, void* user, void* call) { MwViewport vp = user; - int v = MwGetInteger(handle, MwNvalue); - int mv = MwGetInteger(handle, MwNmaxValue); - int l = MwGetInteger(vp->frame, MwNwidth); - v = (mv - l) * (double)v / mv; + + (void)handle; (void)call; - if(v < 0) v = 0; - MwVaApply(vp->inframe, - MwNx, -v, - NULL); + + vp->hchanged = 1; } static void resize(MwWidget handle) { @@ -91,6 +83,9 @@ static int create(MwWidget handle) { MwSetDefault(handle); + vp->vchanged = 0; + vp->hchanged = 0; + resize(handle); return 0; @@ -146,6 +141,37 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v } } +static void tick(MwWidget handle){ + MwViewport vp = handle->internal; + + if(vp->vchanged){ + vp->vchanged = 0; + + int v = MwGetInteger(vp->vscroll, MwNvalue); + int mv = MwGetInteger(vp->vscroll, MwNmaxValue); + int l = MwGetInteger(vp->frame, MwNheight); + v = (mv - l) * (double)v / mv; + + if(v < 0) v = 0; + MwVaApply(vp->inframe, + MwNy, -v, + NULL); + } + if(vp->hchanged){ + vp->vchanged = 0; + + int v = MwGetInteger(vp->hscroll, MwNvalue); + int mv = MwGetInteger(vp->hscroll, MwNmaxValue); + int l = MwGetInteger(vp->frame, MwNwidth); + v = (mv - l) * (double)v / mv; + + if(v < 0) v = 0; + MwVaApply(vp->inframe, + MwNx, -v, + NULL); + } +} + MwClassRec MwViewportClassRec = { create, /* create */ destroy, /* destroy */ @@ -158,7 +184,7 @@ MwClassRec MwViewportClassRec = { NULL, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + tick, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/vulkan.c b/src/widget/vulkan.c index f60e5ed..cf4dfcd 100644 --- a/src/widget/vulkan.c +++ b/src/widget/vulkan.c @@ -524,7 +524,7 @@ MwClassRec MwVulkanClassRec = { NULL, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL}; diff --git a/src/widget/window.c b/src/widget/window.c index d124ac3..c7c54c5 100644 --- a/src/widget/window.c +++ b/src/widget/window.c @@ -44,7 +44,7 @@ MwClassRec MwWindowClassRec = { NULL, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, + NULL, /* tick */ NULL, NULL, NULL};