popup menu, part 1

This commit is contained in:
Vadim Lopatin 2014-04-14 12:11:44 +04:00
parent cb9b46719c
commit a33cf6dcec
4 changed files with 42 additions and 9 deletions

View File

@ -157,7 +157,7 @@ class Window {
_mouseTrackingWidgets.length--; _mouseTrackingWidgets.length--;
continue; continue;
} }
if (!w.isPointInside(event.x, event.y)) { if (event.action == MouseAction.Leave || !w.isPointInside(event.x, event.y)) {
// send Leave message // send Leave message
MouseEvent leaveEvent = new MouseEvent(event); MouseEvent leaveEvent = new MouseEvent(event);
leaveEvent.changeAction(MouseAction.Leave); leaveEvent.changeAction(MouseAction.Leave);
@ -254,7 +254,7 @@ class Window {
return res; return res;
} }
bool processed = false; bool processed = false;
if (event.action == MouseAction.Move) { if (event.action == MouseAction.Move || event.action == MouseAction.Leave) {
processed = checkRemoveTracking(event); processed = checkRemoveTracking(event);
} }
if (!res) { if (!res) {

View File

@ -98,7 +98,7 @@ class ListWidget : WidgetGroup, OnScrollHandler {
onAdapterChanged(); onAdapterChanged();
return this; 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) { @property ListWidget ownAdapter(ListAdapter adapter) {
if (_adapter !is null && _ownAdapter) if (_adapter !is null && _ownAdapter)
destroy(_adapter); destroy(_adapter);

View File

@ -3,34 +3,45 @@ module dlangui.widgets.menu;
import dlangui.core.events; import dlangui.core.events;
import dlangui.widgets.controls; import dlangui.widgets.controls;
import dlangui.widgets.layouts; import dlangui.widgets.layouts;
import dlangui.widgets.lists;
class MenuItem { class MenuItem {
bool _checkable; protected bool _checkable;
bool _checked; protected bool _checked;
bool _enabled; protected bool _enabled;
protected Action _action; 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() { @property int subitemCount() {
return cast(int)_subitems.length; return cast(int)_subitems.length;
} }
/// returns submenu item by index
MenuItem subitem(int index) { MenuItem subitem(int index) {
return _subitems[index]; return _subitems[index];
} }
/// adds submenu item
MenuItem add(MenuItem subitem) { MenuItem add(MenuItem subitem) {
_subitems ~= subitem; _subitems ~= subitem;
return this; return this;
} }
/// adds submenu item from action
MenuItem add(Action subitemAction) { MenuItem add(Action subitemAction) {
_subitems ~= new MenuItem(subitemAction); _subitems ~= new MenuItem(subitemAction);
return this; return this;
} }
/// returns true if item is submenu (contains subitems)
@property bool isSubmenu() { @property bool isSubmenu() {
return _subitems.length > 0; return _subitems.length > 0;
} }
/// returns item label
@property UIString label() { @property UIString label() {
return _action.labelValue; return _action.labelValue;
} }
/// returns item action
@property const(Action) action() const { return _action; } @property const(Action) action() const { return _action; }
/// sets item action
@property MenuItem action(Action a) { _action = a; return this; } @property MenuItem action(Action a) { _action = a; return this; }
this() { this() {
_enabled = true; _enabled = true;
@ -59,16 +70,36 @@ class MenuItemWidget : HorizontalLayout {
} }
class MainMenu : HorizontalLayout { class MainMenu : HorizontalLayout {
MenuItem _item; protected MenuItem _item;
protected bool onItemClick(Widget w) {
Log.d("onItemClick ", w.id);
return true;
}
this(MenuItem item) { this(MenuItem item) {
id = "MAIN_MENU"; id = "MAIN_MENU";
styleId = "MAIN_MENU"; styleId = "MAIN_MENU";
_item = item; _item = item;
for (int i = 0; i < item.subitemCount; i++) { for (int i = 0; i < item.subitemCount; i++) {
MenuItemWidget subitem = new MenuItemWidget(item.subitem(i)); MenuItemWidget subitem = new MenuItemWidget(item.subitem(i));
subitem.onClickListener = &onItemClick;
addChild(subitem); addChild(subitem);
} }
addChild((new Widget()).layoutWidth(FILL_PARENT)); 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;
}
}

View File

@ -670,6 +670,8 @@ Theme createDefaultTheme() {
menuItem.createState(State.Pressed, State.Pressed).backgroundColor(0x4080C000); menuItem.createState(State.Pressed, State.Pressed).backgroundColor(0x4080C000);
menuItem.createState(State.Hovered, State.Hovered).backgroundColor(0x80FFFF00); menuItem.createState(State.Hovered, State.Hovered).backgroundColor(0x80FFFF00);
Style poopupMenu = res.createSubstyle("POPUP_MENU").backgroundImageId("btn_default_small");
return res; return res;
} }