mirror of https://github.com/buggins/dlangui.git
popup menu support for tree items
This commit is contained in:
parent
7a53faa63f
commit
888859835c
|
@ -72,6 +72,8 @@ module dlangui.widgets.tree;
|
||||||
import dlangui.widgets.widget;
|
import dlangui.widgets.widget;
|
||||||
import dlangui.widgets.controls;
|
import dlangui.widgets.controls;
|
||||||
import dlangui.widgets.scroll;
|
import dlangui.widgets.scroll;
|
||||||
|
import dlangui.widgets.menu;
|
||||||
|
import dlangui.widgets.popup;
|
||||||
import dlangui.widgets.layouts;
|
import dlangui.widgets.layouts;
|
||||||
import std.conv;
|
import std.conv;
|
||||||
import std.algorithm;
|
import std.algorithm;
|
||||||
|
@ -496,6 +498,10 @@ enum TreeActions : int {
|
||||||
|
|
||||||
const int DOUBLE_CLICK_TIME_MS = 250;
|
const int DOUBLE_CLICK_TIME_MS = 250;
|
||||||
|
|
||||||
|
interface OnTreePopupMenuListener {
|
||||||
|
MenuItem onTreeItemPopupMenu(TreeItems source, TreeItem selectedItem);
|
||||||
|
}
|
||||||
|
|
||||||
/// Item widget for displaying in trees
|
/// Item widget for displaying in trees
|
||||||
class TreeItemWidget : HorizontalLayout {
|
class TreeItemWidget : HorizontalLayout {
|
||||||
TreeItem _item;
|
TreeItem _item;
|
||||||
|
@ -506,6 +512,8 @@ class TreeItemWidget : HorizontalLayout {
|
||||||
HorizontalLayout _body;
|
HorizontalLayout _body;
|
||||||
long lastClickTime;
|
long lastClickTime;
|
||||||
|
|
||||||
|
Listener!OnTreePopupMenuListener popupMenuListener;
|
||||||
|
|
||||||
@property TreeItem item() { return _item; }
|
@property TreeItem item() { return _item; }
|
||||||
|
|
||||||
|
|
||||||
|
@ -600,6 +608,22 @@ class TreeItemWidget : HorizontalLayout {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// process mouse event; return true if event is processed by widget.
|
||||||
|
override bool onMouseEvent(MouseEvent event) {
|
||||||
|
if (event.action == MouseAction.ButtonDown && event.button == MouseButton.Right) {
|
||||||
|
if (popupMenuListener.assigned) {
|
||||||
|
MenuItem menu = popupMenuListener(_item.root, _item);
|
||||||
|
if (menu) {
|
||||||
|
PopupMenu popupMenu = new PopupMenu(menu);
|
||||||
|
PopupWidget popup = window.showPopup(popupMenu, this, PopupAlign.Point | PopupAlign.Right, event.x, event.y);
|
||||||
|
popup.flags = PopupFlags.CloseOnClickOutside;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.onMouseEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
void updateWidget() {
|
void updateWidget() {
|
||||||
if (_expander) {
|
if (_expander) {
|
||||||
_expander.drawable = _item.expanded ? "arrow_right_down_black" : "arrow_right_hollow";
|
_expander.drawable = _item.expanded ? "arrow_right_down_black" : "arrow_right_hollow";
|
||||||
|
@ -616,6 +640,7 @@ class TreeItemWidget : HorizontalLayout {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Abstract tree widget
|
/// Abstract tree widget
|
||||||
class TreeWidgetBase : ScrollWidget, OnTreeContentChangeListener, OnTreeStateChangeListener, OnTreeSelectionChangeListener, OnKeyHandler {
|
class TreeWidgetBase : ScrollWidget, OnTreeContentChangeListener, OnTreeStateChangeListener, OnTreeSelectionChangeListener, OnKeyHandler {
|
||||||
|
|
||||||
|
@ -624,6 +649,8 @@ class TreeWidgetBase : ScrollWidget, OnTreeContentChangeListener, OnTreeStateCh
|
||||||
@property ref TreeItems items() { return _tree; }
|
@property ref TreeItems items() { return _tree; }
|
||||||
|
|
||||||
Signal!OnTreeSelectionChangeListener selectionListener;
|
Signal!OnTreeSelectionChangeListener selectionListener;
|
||||||
|
/// allows to provide individual popup menu for items
|
||||||
|
Listener!OnTreePopupMenuListener popupMenuListener;
|
||||||
|
|
||||||
protected bool _needUpdateWidgets;
|
protected bool _needUpdateWidgets;
|
||||||
protected bool _needUpdateWidgetStates;
|
protected bool _needUpdateWidgetStates;
|
||||||
|
@ -639,6 +666,12 @@ class TreeWidgetBase : ScrollWidget, OnTreeContentChangeListener, OnTreeStateCh
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected MenuItem onTreeItemPopupMenu(TreeItems source, TreeItem selectedItem) {
|
||||||
|
if (popupMenuListener)
|
||||||
|
return popupMenuListener(source, selectedItem);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/// empty parameter list constructor - for usage by factory
|
/// empty parameter list constructor - for usage by factory
|
||||||
this() {
|
this() {
|
||||||
this(null);
|
this(null);
|
||||||
|
@ -684,8 +717,9 @@ class TreeWidgetBase : ScrollWidget, OnTreeContentChangeListener, OnTreeStateCh
|
||||||
|
|
||||||
/** Override to use custom tree item widgets. */
|
/** Override to use custom tree item widgets. */
|
||||||
protected Widget createItemWidget(TreeItem item) {
|
protected Widget createItemWidget(TreeItem item) {
|
||||||
Widget res = new TreeItemWidget(item);
|
TreeItemWidget res = new TreeItemWidget(item);
|
||||||
res.onKeyListener = this;
|
res.onKeyListener = this;
|
||||||
|
res.popupMenuListener = &onTreeItemPopupMenu;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue