diff --git a/include/Mw/Widget/SubMenu.h b/include/Mw/Widget/SubMenu.h index bf26fa8..126a73b 100644 --- a/include/Mw/Widget/SubMenu.h +++ b/include/Mw/Widget/SubMenu.h @@ -18,8 +18,15 @@ extern "C" { */ MWDECL MwClass MwSubMenuClass; -MwInline void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point) { - MwVaWidgetExecute(handle, "mwSubMenuAppear", NULL, menu, point); +/*! + * @brief Makes submenu appear + * @param handle Handle + * @param menu Menu + * @param point Point + * @param diff_calc Toggles different way to calculate positiion + */ +MwInline void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point, int diff_calc) { + MwVaWidgetExecute(handle, "mwSubMenuAppear", NULL, menu, point, diff_calc); } #ifdef __cplusplus diff --git a/src/widget/menu.c b/src/widget/menu.c index ffb8bb6..327d6f5 100644 --- a/src/widget/menu.c +++ b/src/widget/menu.c @@ -129,7 +129,7 @@ static void mouse_down(MwWidget handle, void* ptr) { p2.y = p.y + th / 2 + 5; m->sub[i]->wsub = MwCreateWidget(MwSubMenuClass, "submenu", handle, 0, 0, 0, 0); - MwSubMenuAppear(m->sub[i]->wsub, m->sub[i], &p2); + MwSubMenuAppear(m->sub[i]->wsub, m->sub[i], &p2, 0); } else if(m->sub[i]->wsub != NULL && m->sub[i]->keep) { MwDestroyWidget(m->sub[i]->wsub); m->sub[i]->wsub = NULL; diff --git a/src/widget/submenu.c b/src/widget/submenu.c index 3172084..ea51f02 100644 --- a/src/widget/submenu.c +++ b/src/widget/submenu.c @@ -130,7 +130,7 @@ static void click(MwWidget handle) { p.y = rc.y - 3; menu->sub[i]->wsub = MwCreateWidget(MwSubMenuClass, "submenu", handle, 0, 0, 0, 0); - MwSubMenuAppear(menu->sub[i]->wsub, menu->sub[i], &p); + MwSubMenuAppear(menu->sub[i]->wsub, menu->sub[i], &p, 0); i = -1; } else if(menu->sub[i]->wsub != NULL && arrlen(menu->sub[i]->sub) > 0) { while(w->parent->widget_class != MwMenuClass) w = w->parent; @@ -159,7 +159,7 @@ static void click(MwWidget handle) { } } -static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point) { +static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point, int diff_calc) { int i, w = 0, h = 0; MwRect rc; MwPoint p = *point; @@ -183,6 +183,10 @@ static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point) { w += 10 + 15; h += 3; + if(diff_calc) { + p.y = rc.height - p.y - h; + } + MwLLMakeToolWindow(handle->lowlevel); MwLLDetach(handle->lowlevel, &p); @@ -203,9 +207,10 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v (void)out; if(strcmp(name, "mwSubMenuAppear") == 0) { - MwMenu menu = va_arg(va, MwMenu); - MwPoint* point = va_arg(va, MwPoint*); - mwSubMenuAppearImpl(handle, menu, point); + MwMenu menu = va_arg(va, MwMenu); + MwPoint* point = va_arg(va, MwPoint*); + int diff_calc = va_arg(va, int); + mwSubMenuAppearImpl(handle, menu, point, diff_calc); } }