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--;
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) {

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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;
}