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 }