ability to show any dialog in popup

This commit is contained in:
Vadim Lopatin 2015-01-27 14:51:37 +03:00
parent da821bcefc
commit 71e3ba0f62
6 changed files with 142 additions and 55 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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 */

View File

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