1 module rpui.widgets.drop_list_menu.widget; 2 3 import rpui.events; 4 import rpui.widget_events; 5 import rpui.input; 6 import rpui.math; 7 import rpui.primitives; 8 import rpui.widget; 9 import rpui.widgets.list_menu.widget; 10 import rpui.widgets.list_menu_item.widget; 11 import rpui.widgets.button.widget; 12 import rpui.widgets.drop_list_menu.drop_menu_delegate; 13 14 class DropListMenu : Button, MenuActions { 15 private bool isInVisibilityArea = false; 16 private bool isInMenuArea = false; 17 private DropMenuDelegate dropMenuDelegate; 18 private ListMenu menu = null; 19 20 this(in string style = "DropListMenu", in string iconsGroup = "icons") { 21 super(style, iconsGroup); 22 textAlign = Align.left; 23 } 24 25 protected override void onPostCreate() { 26 super.onPostCreate(); 27 28 if (menu !is null) 29 return; 30 31 menu = cast(ListMenu) children.front; 32 assert(menu !is null); 33 34 menu.isVisible = false; 35 menu.focusable = false; 36 view.moveWidgetToFront(menu); 37 38 dropMenuDelegate.attach(menu, this); 39 } 40 41 override void onProgress(in ProgressEvent event) { 42 super.onProgress(event); 43 dropMenuDelegate.onProgress(vec2(0, size.y)); 44 45 if (menu.isVisible) { 46 isClick = true; 47 } 48 } 49 50 override void onMouseDown(in MouseDownEvent event) { 51 super.onMouseDown(event); 52 53 if (isEnter) { 54 toggleMenu(); 55 focus(); 56 } 57 } 58 59 override void onBlur(in BlurEvent event) { 60 super.onBlur(event); 61 62 if (!isInMenuArea) { 63 hideMenu(); 64 } 65 } 66 67 void toggleMenu() { 68 dropMenuDelegate.toggleMenu(vec2(0, size.y)); 69 } 70 71 void dropMenu() { 72 dropMenuDelegate.dropMenu(vec2(0, size.y)); 73 } 74 75 override void hideMenu() { 76 dropMenuDelegate.hideMenu(); 77 } 78 79 override MenuActions parentActions() { 80 return null; 81 } 82 }