From a33cf6dcec07b110ea543733a1372cbc7b8cff1d Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 14 Apr 2014 12:11:44 +0400 Subject: [PATCH] popup menu, part 1 --- src/dlangui/platforms/common/platform.d | 4 +-- src/dlangui/widgets/lists.d | 2 +- src/dlangui/widgets/menu.d | 43 +++++++++++++++++++++---- src/dlangui/widgets/styles.d | 2 ++ 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/dlangui/platforms/common/platform.d b/src/dlangui/platforms/common/platform.d index cb212961..d252ea12 100644 --- a/src/dlangui/platforms/common/platform.d +++ b/src/dlangui/platforms/common/platform.d @@ -157,7 +157,7 @@ class Window { _mouseTrackingWidgets.length--; continue; } - if (!w.isPointInside(event.x, event.y)) { + if (event.action == MouseAction.Leave || !w.isPointInside(event.x, event.y)) { // send Leave message MouseEvent leaveEvent = new MouseEvent(event); leaveEvent.changeAction(MouseAction.Leave); @@ -254,7 +254,7 @@ class Window { return res; } bool processed = false; - if (event.action == MouseAction.Move) { + if (event.action == MouseAction.Move || event.action == MouseAction.Leave) { processed = checkRemoveTracking(event); } if (!res) { diff --git a/src/dlangui/widgets/lists.d b/src/dlangui/widgets/lists.d index 0a7b94fe..ce4fc0e9 100644 --- a/src/dlangui/widgets/lists.d +++ b/src/dlangui/widgets/lists.d @@ -98,7 +98,7 @@ class ListWidget : WidgetGroup, OnScrollHandler { onAdapterChanged(); return this; } - /// set adapter + /// set adapter, which will be owned by list (destroy will be called for adapter on widget destroy) @property ListWidget ownAdapter(ListAdapter adapter) { if (_adapter !is null && _ownAdapter) destroy(_adapter); diff --git a/src/dlangui/widgets/menu.d b/src/dlangui/widgets/menu.d index 794a9db6..576ce49e 100644 --- a/src/dlangui/widgets/menu.d +++ b/src/dlangui/widgets/menu.d @@ -3,34 +3,45 @@ module dlangui.widgets.menu; import dlangui.core.events; import dlangui.widgets.controls; import dlangui.widgets.layouts; +import dlangui.widgets.lists; class MenuItem { - bool _checkable; - bool _checked; - bool _enabled; + protected bool _checkable; + protected bool _checked; + protected bool _enabled; protected Action _action; - MenuItem[] _subitems; + protected MenuItem[] _subitems; + /// item action id, 0 if no action + @property int id() { return _action is null ? 0 : _action.id; } + /// returns count of submenu items @property int subitemCount() { return cast(int)_subitems.length; } + /// returns submenu item by index MenuItem subitem(int index) { return _subitems[index]; } + /// adds submenu item MenuItem add(MenuItem subitem) { _subitems ~= subitem; return this; } + /// adds submenu item from action MenuItem add(Action subitemAction) { _subitems ~= new MenuItem(subitemAction); return this; } + /// returns true if item is submenu (contains subitems) @property bool isSubmenu() { return _subitems.length > 0; } + /// returns item label @property UIString label() { return _action.labelValue; } + /// returns item action @property const(Action) action() const { return _action; } + /// sets item action @property MenuItem action(Action a) { _action = a; return this; } this() { _enabled = true; @@ -59,16 +70,36 @@ class MenuItemWidget : HorizontalLayout { } class MainMenu : HorizontalLayout { - MenuItem _item; + protected MenuItem _item; + protected bool onItemClick(Widget w) { + Log.d("onItemClick ", w.id); + return true; + } this(MenuItem item) { id = "MAIN_MENU"; styleId = "MAIN_MENU"; _item = item; for (int i = 0; i < item.subitemCount; i++) { MenuItemWidget subitem = new MenuItemWidget(item.subitem(i)); + subitem.onClickListener = &onItemClick; addChild(subitem); - } addChild((new Widget()).layoutWidth(FILL_PARENT)); } } + +class PopupMenu : ListWidget { + protected MenuItem _item; + this(MenuItem item) { + id = "popup_menu"; + styleId = "POPUP_MENU"; + _item = item; + WidgetListAdapter adapter = new WidgetListAdapter(); + for (int i=0; i < _item.subitemCount; i++) { + MenuItem subitem = _item.subitem(i); + MenuItemWidget widget = new MenuItemWidget(subitem); + adapter.widgets.add(widget); + } + ownAdapter = adapter; + } +} diff --git a/src/dlangui/widgets/styles.d b/src/dlangui/widgets/styles.d index d675c70f..173f1046 100644 --- a/src/dlangui/widgets/styles.d +++ b/src/dlangui/widgets/styles.d @@ -670,6 +670,8 @@ Theme createDefaultTheme() { menuItem.createState(State.Pressed, State.Pressed).backgroundColor(0x4080C000); menuItem.createState(State.Hovered, State.Hovered).backgroundColor(0x80FFFF00); + Style poopupMenu = res.createSubstyle("POPUP_MENU").backgroundImageId("btn_default_small"); + return res; }