mirror of https://github.com/buggins/dlangui.git
ability to show any dialog in popup
This commit is contained in:
parent
da821bcefc
commit
71e3ba0f62
|
@ -391,6 +391,7 @@
|
||||||
<File path="src\dlangui\widgets\toolbars.d" />
|
<File path="src\dlangui\widgets\toolbars.d" />
|
||||||
<File path="src\dlangui\widgets\tree.d" />
|
<File path="src\dlangui\widgets\tree.d" />
|
||||||
<File path="src\dlangui\widgets\widget.d" />
|
<File path="src\dlangui\widgets\widget.d" />
|
||||||
|
<File path="src\dlangui\widgets\winframe.d" />
|
||||||
</Folder>
|
</Folder>
|
||||||
<File path="src\dlangui\all.d" />
|
<File path="src\dlangui\all.d" />
|
||||||
</Folder>
|
</Folder>
|
||||||
|
|
|
@ -24,6 +24,8 @@ import dlangui.core.signals;
|
||||||
import dlangui.core.stdaction;
|
import dlangui.core.stdaction;
|
||||||
import dlangui.widgets.layouts;
|
import dlangui.widgets.layouts;
|
||||||
import dlangui.widgets.controls;
|
import dlangui.widgets.controls;
|
||||||
|
import dlangui.widgets.winframe;
|
||||||
|
import dlangui.widgets.popup;
|
||||||
import dlangui.platforms.common.platform;
|
import dlangui.platforms.common.platform;
|
||||||
|
|
||||||
import std.conv;
|
import std.conv;
|
||||||
|
@ -34,6 +36,8 @@ enum DialogFlag : uint {
|
||||||
Modal = 1,
|
Modal = 1,
|
||||||
/// dialog can be resized
|
/// dialog can be resized
|
||||||
Resizable = 2,
|
Resizable = 2,
|
||||||
|
/// dialog is show in popup widget inside current window instead of separate window
|
||||||
|
Popup = 4,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// slot to pass dialog result
|
/// slot to pass dialog result
|
||||||
|
@ -45,6 +49,7 @@ interface DialogResultHandler {
|
||||||
class Dialog : VerticalLayout {
|
class Dialog : VerticalLayout {
|
||||||
protected Window _window;
|
protected Window _window;
|
||||||
protected Window _parentWindow;
|
protected Window _parentWindow;
|
||||||
|
protected PopupWidget _popup;
|
||||||
protected UIString _caption;
|
protected UIString _caption;
|
||||||
protected uint _flags;
|
protected uint _flags;
|
||||||
protected string _icon;
|
protected string _icon;
|
||||||
|
@ -95,6 +100,7 @@ class Dialog : VerticalLayout {
|
||||||
protected const(Action) [] _buttonActions;
|
protected const(Action) [] _buttonActions;
|
||||||
|
|
||||||
protected ImageTextButton _defaultButton;
|
protected ImageTextButton _defaultButton;
|
||||||
|
protected ImageTextButton _cancelButton;
|
||||||
/// create panel with buttons based on list of actions
|
/// create panel with buttons based on list of actions
|
||||||
Widget createButtonsPanel(const(Action) [] actions, int defaultActionIndex, int splitBeforeIndex) {
|
Widget createButtonsPanel(const(Action) [] actions, int defaultActionIndex, int splitBeforeIndex) {
|
||||||
_buttonActions = actions;
|
_buttonActions = actions;
|
||||||
|
@ -111,6 +117,8 @@ class Dialog : VerticalLayout {
|
||||||
btn.setState(State.Default);
|
btn.setState(State.Default);
|
||||||
_defaultButton = btn;
|
_defaultButton = btn;
|
||||||
}
|
}
|
||||||
|
if (a.id == StandardAction.Cancel || a.id == StandardAction.No)
|
||||||
|
_cancelButton = btn;
|
||||||
btn.action = a.clone();
|
btn.action = a.clone();
|
||||||
res.addChild(btn);
|
res.addChild(btn);
|
||||||
}
|
}
|
||||||
|
@ -146,6 +154,9 @@ class Dialog : VerticalLayout {
|
||||||
else if (_parentWindow)
|
else if (_parentWindow)
|
||||||
_parentWindow.dispatchAction(action);
|
_parentWindow.dispatchAction(action);
|
||||||
}
|
}
|
||||||
|
if (_popup)
|
||||||
|
_parentWindow.removePopup(_popup);
|
||||||
|
else
|
||||||
window.close();
|
window.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,11 +171,23 @@ class Dialog : VerticalLayout {
|
||||||
layoutWidth = FILL_PARENT;
|
layoutWidth = FILL_PARENT;
|
||||||
layoutHeight = FILL_PARENT;
|
layoutHeight = FILL_PARENT;
|
||||||
}
|
}
|
||||||
|
if (_flags & DialogFlag.Popup) {
|
||||||
|
DialogFrame _frame = new DialogFrame(this, _cancelButton !is null);
|
||||||
|
if (_cancelButton) {
|
||||||
|
_frame.onCloseButtonClickListener = delegate(Widget w) {
|
||||||
|
close(_cancelButton.action);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
_popup = _parentWindow.showPopup(_frame);
|
||||||
|
_popup.flags(PopupFlags.Modal);
|
||||||
|
} else {
|
||||||
_window = Platform.instance.createWindow(_caption, _parentWindow, wflags);
|
_window = Platform.instance.createWindow(_caption, _parentWindow, wflags);
|
||||||
if (_window && _icon)
|
if (_window && _icon)
|
||||||
_window.windowIcon = drawableCache.getImage(_icon);
|
_window.windowIcon = drawableCache.getImage(_icon);
|
||||||
_window.mainWidget = this;
|
_window.mainWidget = this;
|
||||||
_window.show();
|
_window.show();
|
||||||
|
}
|
||||||
onShow();
|
onShow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,3 +199,14 @@ class Dialog : VerticalLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// frame with caption for dialog
|
||||||
|
class DialogFrame : WindowFrame {
|
||||||
|
protected Dialog _dialog;
|
||||||
|
this(Dialog dialog, bool enableCloseButton) {
|
||||||
|
super(dialog.id ~ "_frame", enableCloseButton);
|
||||||
|
_dialog = dialog;
|
||||||
|
_caption.text = _dialog.windowCaption.value;
|
||||||
|
bodyWidget = _dialog;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ class MessageBox : Dialog {
|
||||||
protected const(Action)[] _actions;
|
protected const(Action)[] _actions;
|
||||||
protected int _defaultButtonIndex;
|
protected int _defaultButtonIndex;
|
||||||
this(UIString caption, UIString message, Window parentWindow = null, const(Action) [] buttons = [ACTION_OK], int defaultButtonIndex = 0, bool delegate(const Action result) handler = null) {
|
this(UIString caption, UIString message, Window parentWindow = null, const(Action) [] buttons = [ACTION_OK], int defaultButtonIndex = 0, bool delegate(const Action result) handler = null) {
|
||||||
super(caption, parentWindow, DialogFlag.Modal);
|
super(caption, parentWindow, DialogFlag.Modal | DialogFlag.Popup);
|
||||||
_message = message;
|
_message = message;
|
||||||
_actions = buttons;
|
_actions = buttons;
|
||||||
_defaultButtonIndex = defaultButtonIndex;
|
_defaultButtonIndex = defaultButtonIndex;
|
||||||
|
|
|
@ -23,6 +23,7 @@ module dlangui.widgets.docks;
|
||||||
|
|
||||||
import dlangui.widgets.layouts;
|
import dlangui.widgets.layouts;
|
||||||
import dlangui.widgets.controls;
|
import dlangui.widgets.controls;
|
||||||
|
import dlangui.widgets.winframe;
|
||||||
|
|
||||||
/// dock alignment types
|
/// dock alignment types
|
||||||
enum DockAlignment {
|
enum DockAlignment {
|
||||||
|
@ -272,17 +273,7 @@ class DockHost : WidgetGroupDefaultDrawing {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// docked window
|
/// docked window
|
||||||
class DockWindow : VerticalLayout {
|
class DockWindow : WindowFrame {
|
||||||
|
|
||||||
protected Widget _bodyWidget;
|
|
||||||
@property Widget bodyWidget() { return _bodyWidget; }
|
|
||||||
@property void bodyWidget(Widget widget) {
|
|
||||||
_children.replace(widget, _bodyWidget);
|
|
||||||
_bodyWidget = widget;
|
|
||||||
_bodyWidget.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT);
|
|
||||||
_bodyWidget.parent = this;
|
|
||||||
requestLayout();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected DockAlignment _dockAlignment;
|
protected DockAlignment _dockAlignment;
|
||||||
|
|
||||||
|
@ -295,46 +286,16 @@ class DockWindow : VerticalLayout {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected HorizontalLayout _captionLayout;
|
|
||||||
protected TextWidget _caption;
|
|
||||||
protected ImageButton _closeButton;
|
|
||||||
|
|
||||||
this(string ID) {
|
this(string ID) {
|
||||||
super(ID);
|
super(ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
override protected void init() {
|
||||||
|
super.init();
|
||||||
_dockAlignment = DockAlignment.Right; // default alignment is right
|
_dockAlignment = DockAlignment.Right; // default alignment is right
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected bool onCloseButtonClick(Widget source) {
|
//protected Widget createBodyWidget() {
|
||||||
return true;
|
// return new Widget("DOCK_WINDOW_BODY");
|
||||||
}
|
//}
|
||||||
protected void init() {
|
|
||||||
|
|
||||||
styleId = STYLE_DOCK_WINDOW;
|
|
||||||
|
|
||||||
_captionLayout = new HorizontalLayout("DOCK_WINDOW_CAPTION_PANEL");
|
|
||||||
_captionLayout.layoutWidth(FILL_PARENT).layoutHeight(WRAP_CONTENT);
|
|
||||||
_captionLayout.styleId = STYLE_DOCK_WINDOW_CAPTION;
|
|
||||||
|
|
||||||
_caption = new TextWidget("DOCK_WINDOW_CAPTION");
|
|
||||||
_caption.styleId = STYLE_DOCK_WINDOW_CAPTION_LABEL;
|
|
||||||
|
|
||||||
_closeButton = new ImageButton("DOCK_WINDOW_CAPTION_CLOSE_BUTTON");
|
|
||||||
_closeButton.styleId = STYLE_BUTTON_TRANSPARENT;
|
|
||||||
_closeButton.drawableId = "close";
|
|
||||||
_closeButton.trackHover = true;
|
|
||||||
_closeButton.onClickListener = &onCloseButtonClick;
|
|
||||||
|
|
||||||
_captionLayout.addChild(_caption);
|
|
||||||
_captionLayout.addChild(_closeButton);
|
|
||||||
|
|
||||||
_bodyWidget = createBodyWidget();
|
|
||||||
_bodyWidget.styleId = STYLE_DOCK_WINDOW_BODY;
|
|
||||||
|
|
||||||
addChild(_captionLayout);
|
|
||||||
addChild(_bodyWidget);
|
|
||||||
}
|
|
||||||
protected Widget createBodyWidget() {
|
|
||||||
return new Widget("DOCK_WINDOW_BODY");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,8 @@ struct PopupAnchor {
|
||||||
enum PopupFlags : uint {
|
enum PopupFlags : uint {
|
||||||
/// close popup when mouse button clicked outside of its bounds
|
/// close popup when mouse button clicked outside of its bounds
|
||||||
CloseOnClickOutside = 1,
|
CloseOnClickOutside = 1,
|
||||||
|
/// modal popup - keypresses and mouse events can be routed to this popup only
|
||||||
|
Modal = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** interface - slot for onPopupCloseListener */
|
/** interface - slot for onPopupCloseListener */
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Written in the D programming language.
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
This module implements window frame widget.
|
||||||
|
|
||||||
|
|
||||||
|
Synopsis:
|
||||||
|
|
||||||
|
----
|
||||||
|
import dlangui.widgets.docks;
|
||||||
|
----
|
||||||
|
|
||||||
|
|
||||||
|
Copyright: Vadim Lopatin, 2015
|
||||||
|
License: Boost License 1.0
|
||||||
|
Authors: Vadim Lopatin, coolreader.org@gmail.com
|
||||||
|
*/
|
||||||
|
module dlangui.widgets.winframe;
|
||||||
|
|
||||||
|
import dlangui.widgets.layouts;
|
||||||
|
import dlangui.widgets.controls;
|
||||||
|
|
||||||
|
/// window frame with caption widget
|
||||||
|
class WindowFrame : VerticalLayout {
|
||||||
|
|
||||||
|
protected Widget _bodyWidget;
|
||||||
|
@property Widget bodyWidget() { return _bodyWidget; }
|
||||||
|
@property void bodyWidget(Widget widget) {
|
||||||
|
_children.replace(widget, _bodyWidget);
|
||||||
|
_bodyWidget = widget;
|
||||||
|
_bodyWidget.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT);
|
||||||
|
_bodyWidget.parent = this;
|
||||||
|
requestLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HorizontalLayout _captionLayout;
|
||||||
|
protected TextWidget _caption;
|
||||||
|
protected ImageButton _closeButton;
|
||||||
|
protected bool _showCloseButton;
|
||||||
|
|
||||||
|
@property TextWidget caption() { return _caption; }
|
||||||
|
|
||||||
|
this(string ID, bool showCloseButton = true) {
|
||||||
|
super(ID);
|
||||||
|
_showCloseButton = showCloseButton;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
Signal!OnClickHandler onCloseButtonClickListener;
|
||||||
|
protected bool onCloseButtonClick(Widget source) {
|
||||||
|
if (onCloseButtonClickListener.assigned)
|
||||||
|
onCloseButtonClickListener(source);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void init() {
|
||||||
|
|
||||||
|
styleId = STYLE_DOCK_WINDOW;
|
||||||
|
|
||||||
|
_captionLayout = new HorizontalLayout("DOCK_WINDOW_CAPTION_PANEL");
|
||||||
|
_captionLayout.layoutWidth(FILL_PARENT).layoutHeight(WRAP_CONTENT);
|
||||||
|
_captionLayout.styleId = STYLE_DOCK_WINDOW_CAPTION;
|
||||||
|
|
||||||
|
_caption = new TextWidget("DOCK_WINDOW_CAPTION");
|
||||||
|
_caption.styleId = STYLE_DOCK_WINDOW_CAPTION_LABEL;
|
||||||
|
|
||||||
|
_closeButton = new ImageButton("DOCK_WINDOW_CAPTION_CLOSE_BUTTON");
|
||||||
|
_closeButton.styleId = STYLE_BUTTON_TRANSPARENT;
|
||||||
|
_closeButton.drawableId = "close";
|
||||||
|
_closeButton.trackHover = true;
|
||||||
|
_closeButton.onClickListener = &onCloseButtonClick;
|
||||||
|
if (!_showCloseButton)
|
||||||
|
_closeButton.visibility = Visibility.Gone;
|
||||||
|
|
||||||
|
_captionLayout.addChild(_caption);
|
||||||
|
_captionLayout.addChild(_closeButton);
|
||||||
|
|
||||||
|
_bodyWidget = createBodyWidget();
|
||||||
|
_bodyWidget.styleId = STYLE_DOCK_WINDOW_BODY;
|
||||||
|
|
||||||
|
addChild(_captionLayout);
|
||||||
|
addChild(_bodyWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Widget createBodyWidget() {
|
||||||
|
return new Widget("DOCK_WINDOW_BODY");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue