mirror of https://github.com/buggins/dlangui.git
menu is working
This commit is contained in:
parent
a8ddcd9c4f
commit
fb0e1b6c6b
|
@ -134,6 +134,7 @@ class MouseEvent {
|
||||||
protected ButtonDetails _lbutton;
|
protected ButtonDetails _lbutton;
|
||||||
protected ButtonDetails _mbutton;
|
protected ButtonDetails _mbutton;
|
||||||
protected ButtonDetails _rbutton;
|
protected ButtonDetails _rbutton;
|
||||||
|
protected bool _doNotTrackButtonDown;
|
||||||
@property ref ButtonDetails lbutton() { return _lbutton; }
|
@property ref ButtonDetails lbutton() { return _lbutton; }
|
||||||
@property ref ButtonDetails rbutton() { return _rbutton; }
|
@property ref ButtonDetails rbutton() { return _rbutton; }
|
||||||
@property ref ButtonDetails mbutton() { return _mbutton; }
|
@property ref ButtonDetails mbutton() { return _mbutton; }
|
||||||
|
@ -146,6 +147,8 @@ class MouseEvent {
|
||||||
@property short y() { return _y; }
|
@property short y() { return _y; }
|
||||||
/// get event tracking widget to override
|
/// get event tracking widget to override
|
||||||
@property Widget trackingWidget() { return _trackingWidget; }
|
@property Widget trackingWidget() { return _trackingWidget; }
|
||||||
|
@property bool doNotTrackButtonDown() { return _doNotTrackButtonDown; }
|
||||||
|
@property void doNotTrackButtonDown(bool flg) { _doNotTrackButtonDown = flg; }
|
||||||
/// override mouse tracking widget
|
/// override mouse tracking widget
|
||||||
void track(Widget w) {
|
void track(Widget w) {
|
||||||
_trackingWidget = w;
|
_trackingWidget = w;
|
||||||
|
|
|
@ -191,7 +191,7 @@ class Window {
|
||||||
// if not processed by children, offer event to root
|
// if not processed by children, offer event to root
|
||||||
if (sendAndCheckOverride(root, event)) {
|
if (sendAndCheckOverride(root, event)) {
|
||||||
Log.d("MouseEvent is processed");
|
Log.d("MouseEvent is processed");
|
||||||
if (event.action == MouseAction.ButtonDown && _mouseCaptureWidget is null) {
|
if (event.action == MouseAction.ButtonDown && _mouseCaptureWidget is null && !event.doNotTrackButtonDown) {
|
||||||
Log.d("Setting active widget");
|
Log.d("Setting active widget");
|
||||||
setCaptureWidget(root, event);
|
setCaptureWidget(root, event);
|
||||||
} else if (event.action == MouseAction.Move) {
|
} else if (event.action == MouseAction.Move) {
|
||||||
|
@ -263,6 +263,8 @@ class Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected bool sendAndCheckOverride(Widget widget, MouseEvent event) {
|
protected bool sendAndCheckOverride(Widget widget, MouseEvent event) {
|
||||||
|
if (!isChild(widget))
|
||||||
|
return false;
|
||||||
bool res = widget.onMouseEvent(event);
|
bool res = widget.onMouseEvent(event);
|
||||||
if (event.trackingWidget !is null && _mouseCaptureWidget !is event.trackingWidget) {
|
if (event.trackingWidget !is null && _mouseCaptureWidget !is event.trackingWidget) {
|
||||||
setCaptureWidget(event.trackingWidget, event);
|
setCaptureWidget(event.trackingWidget, event);
|
||||||
|
|
|
@ -87,6 +87,9 @@ class ListWidget : WidgetGroup, OnScrollHandler {
|
||||||
/// when true, mouse hover selects underlying item
|
/// when true, mouse hover selects underlying item
|
||||||
@property ListWidget selectOnHover(bool select) { _selectOnHover = select; return this; }
|
@property ListWidget selectOnHover(bool select) { _selectOnHover = select; return this; }
|
||||||
|
|
||||||
|
/// if true, generate itemClicked on mouse down instead mouse up event
|
||||||
|
protected bool _clickOnButtonDown;
|
||||||
|
|
||||||
/// returns rectangle for item (not scrolled, first item starts at 0,0)
|
/// returns rectangle for item (not scrolled, first item starts at 0,0)
|
||||||
Rect itemRectNoScroll(int index) {
|
Rect itemRectNoScroll(int index) {
|
||||||
Rect res;
|
Rect res;
|
||||||
|
@ -183,6 +186,9 @@ class ListWidget : WidgetGroup, OnScrollHandler {
|
||||||
/// override to handle change of selection
|
/// override to handle change of selection
|
||||||
protected void selectionChanged(int index, int previouslySelectedItem = -1, MouseEvent event = null) {
|
protected void selectionChanged(int index, int previouslySelectedItem = -1, MouseEvent event = null) {
|
||||||
}
|
}
|
||||||
|
/// override to handle mouse up on item
|
||||||
|
protected void itemClicked(int index) {
|
||||||
|
}
|
||||||
|
|
||||||
protected void selectItem(int index) {
|
protected void selectItem(int index) {
|
||||||
if (_selectedItemIndex == index)
|
if (_selectedItemIndex == index)
|
||||||
|
@ -487,14 +493,22 @@ class ListWidget : WidgetGroup, OnScrollHandler {
|
||||||
itemrc.bottom += rc.top - scrollOffset.y;
|
itemrc.bottom += rc.top - scrollOffset.y;
|
||||||
if (itemrc.isPointInside(Point(event.x, event.y))) {
|
if (itemrc.isPointInside(Point(event.x, event.y))) {
|
||||||
if ((event.flags & (MouseFlag.LButton || MouseFlag.RButton)) || _selectOnHover) {
|
if ((event.flags & (MouseFlag.LButton || MouseFlag.RButton)) || _selectOnHover) {
|
||||||
if (_selectedItemIndex == i)
|
if (_selectedItemIndex != i) {
|
||||||
return true;
|
|
||||||
int prevSelection = _selectedItemIndex;
|
int prevSelection = _selectedItemIndex;
|
||||||
selectItem(i);
|
selectItem(i);
|
||||||
setHoverItem(-1);
|
setHoverItem(-1);
|
||||||
selectionChanged(_selectedItemIndex, prevSelection, event);
|
selectionChanged(_selectedItemIndex, prevSelection, event);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
setHoverItem(i);
|
setHoverItem(i);
|
||||||
|
if ((event.button == MouseFlag.LButton || event.button == MouseFlag.RButton)) {
|
||||||
|
if ((_clickOnButtonDown && event.action == MouseAction.ButtonDown) || (!_clickOnButtonDown && event.action == MouseAction.ButtonUp)) {
|
||||||
|
itemClicked(i);
|
||||||
|
if (_clickOnButtonDown)
|
||||||
|
event.doNotTrackButtonDown = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -80,11 +80,13 @@ class MenuItemWidget : HorizontalLayout {
|
||||||
}
|
}
|
||||||
|
|
||||||
class MenuWidgetBase : ListWidget {
|
class MenuWidgetBase : ListWidget {
|
||||||
|
protected MenuWidgetBase _parentMenu;
|
||||||
protected MenuItem _item;
|
protected MenuItem _item;
|
||||||
protected PopupMenu _openedMenu;
|
protected PopupMenu _openedMenu;
|
||||||
protected PopupWidget _openedPopup;
|
protected PopupWidget _openedPopup;
|
||||||
|
|
||||||
this(MenuItem item, Orientation orientation) {
|
this(MenuWidgetBase parentMenu, MenuItem item, Orientation orientation) {
|
||||||
|
_parentMenu = parentMenu;
|
||||||
_item = item;
|
_item = item;
|
||||||
this.orientation = orientation;
|
this.orientation = orientation;
|
||||||
id = "popup_menu";
|
id = "popup_menu";
|
||||||
|
@ -99,39 +101,98 @@ class MenuWidgetBase : ListWidget {
|
||||||
ownAdapter = adapter;
|
ownAdapter = adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void openSubmenu(MenuItemWidget itemWidget) {
|
||||||
|
if (_openedPopup !is null)
|
||||||
|
_openedPopup.close();
|
||||||
|
PopupMenu popupMenu = new PopupMenu(itemWidget.item, this);
|
||||||
|
PopupWidget popup = window.showPopup(popupMenu, itemWidget, PopupAlign.Below);
|
||||||
|
//if (event !is null && (event.flags & (MouseFlag.LButton || MouseFlag.RButton)))
|
||||||
|
// event.track(popupMenu);
|
||||||
|
_openedPopup = popup;
|
||||||
|
_openedMenu = popupMenu;
|
||||||
|
}
|
||||||
|
|
||||||
/// override to handle change of selection
|
/// override to handle change of selection
|
||||||
override protected void selectionChanged(int index, int previouslySelectedItem = -1, MouseEvent event = null) {
|
override protected void selectionChanged(int index, int previouslySelectedItem = -1, MouseEvent event = null) {
|
||||||
MenuItemWidget itemWidget = index >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(index) : null;
|
MenuItemWidget itemWidget = index >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(index) : null;
|
||||||
|
if (itemWidget !is null) {
|
||||||
if (itemWidget.item.isSubmenu()) {
|
if (itemWidget.item.isSubmenu()) {
|
||||||
if (_openedPopup !is null)
|
if (_selectOnHover) {
|
||||||
_openedPopup.close();
|
openSubmenu(itemWidget);
|
||||||
PopupMenu popupMenu = new PopupMenu(itemWidget.item);
|
}
|
||||||
PopupWidget popup = window.showPopup(popupMenu, itemWidget, PopupAlign.Below);
|
|
||||||
if (event !is null && (event.flags & (MouseFlag.LButton || MouseFlag.RButton)))
|
|
||||||
event.track(popupMenu);
|
|
||||||
_openedPopup = popup;
|
|
||||||
_openedMenu = popupMenu;
|
|
||||||
selectOnHover = true;
|
|
||||||
} else {
|
} else {
|
||||||
// normal item
|
// normal item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected bool delegate(MenuItem item) _onMenuItemClickListener;
|
||||||
|
@property bool delegate(MenuItem item) onMenuItemListener() { return _onMenuItemClickListener; }
|
||||||
|
@property MenuWidgetBase onMenuItemListener(bool delegate(MenuItem item) listener) { _onMenuItemClickListener = listener; return this; }
|
||||||
|
|
||||||
|
protected void onMenuItem(MenuItem item) {
|
||||||
|
if (_openedPopup !is null) {
|
||||||
|
_openedPopup.close();
|
||||||
|
_openedPopup = null;
|
||||||
|
}
|
||||||
|
if (_parentMenu !is null)
|
||||||
|
_parentMenu.onMenuItem(item);
|
||||||
|
else {
|
||||||
|
// top level handling
|
||||||
|
Log.d("onMenuItem ", item.id);
|
||||||
|
selectItem(-1);
|
||||||
|
selectOnHover = false;
|
||||||
|
bool delegate(MenuItem item) listener = _onMenuItemClickListener;
|
||||||
|
PopupWidget popup = cast(PopupWidget)parent;
|
||||||
|
if (popup)
|
||||||
|
popup.close();
|
||||||
|
// this pointer now can be invalid - if popup removed
|
||||||
|
if (listener !is null)
|
||||||
|
listener(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// override to handle mouse up on item
|
||||||
|
override protected void itemClicked(int index) {
|
||||||
|
MenuItemWidget itemWidget = index >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(index) : null;
|
||||||
|
if (itemWidget !is null) {
|
||||||
|
Log.d("Menu Item clicked ", itemWidget.item.action.id);
|
||||||
|
if (itemWidget.item.isSubmenu()) {
|
||||||
|
// submenu clicked
|
||||||
|
if (_clickOnButtonDown && _openedPopup !is null && _openedMenu._item is itemWidget.item) {
|
||||||
|
// second click on main menu opened item
|
||||||
|
_openedPopup.close();
|
||||||
|
_openedPopup = null;
|
||||||
|
selectItem(-1);
|
||||||
|
selectOnHover = false;
|
||||||
|
} else {
|
||||||
|
openSubmenu(itemWidget);
|
||||||
|
selectOnHover = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// normal item
|
||||||
|
onMenuItem(itemWidget.item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MainMenu : MenuWidgetBase {
|
class MainMenu : MenuWidgetBase {
|
||||||
|
|
||||||
this(MenuItem item) {
|
this(MenuItem item) {
|
||||||
super(item, Orientation.Horizontal);
|
super(null, item, Orientation.Horizontal);
|
||||||
id = "MAIN_MENU";
|
id = "MAIN_MENU";
|
||||||
styleId = "MAIN_MENU";
|
styleId = "MAIN_MENU";
|
||||||
|
_clickOnButtonDown = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class PopupMenu : MenuWidgetBase {
|
class PopupMenu : MenuWidgetBase {
|
||||||
|
|
||||||
this(MenuItem item) {
|
this(MenuItem item, MenuWidgetBase parentMenu = null) {
|
||||||
super(item, Orientation.Vertical);
|
super(parentMenu, item, Orientation.Vertical);
|
||||||
id = "POPUP_MENU";
|
id = "POPUP_MENU";
|
||||||
styleId = "POPUP_MENU";
|
styleId = "POPUP_MENU";
|
||||||
selectOnHover = true;
|
selectOnHover = true;
|
||||||
|
|
Loading…
Reference in New Issue