diff --git a/dlanguilib.visualdproj b/dlanguilib.visualdproj
index 116e67b3..8b3bac5d 100644
--- a/dlanguilib.visualdproj
+++ b/dlanguilib.visualdproj
@@ -328,6 +328,7 @@
+
diff --git a/examples/example1/main.d b/examples/example1/main.d
index 3d2328f5..e3e3190c 100644
--- a/examples/example1/main.d
+++ b/examples/example1/main.d
@@ -48,6 +48,15 @@ extern (C) int UIAppMain(string[] args) {
Window window = Platform.instance().createWindow("My Window", null);
static if (true) {
+ VerticalLayout contentLayout = new VerticalLayout();
+ MenuItem mainMenuItems = new MenuItem();
+ mainMenuItems.add(new Action(1, "File"d));
+ mainMenuItems.add(new Action(2, "Edit"d));
+ mainMenuItems.add(new Action(3, "Window"d));
+ mainMenuItems.add(new Action(4, "Help"d));
+ MainMenu mainMenu = new MainMenu(mainMenuItems);
+ contentLayout.addChild(mainMenu);
+
TabWidget tabs = new TabWidget("TABS");
tabs.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT);
@@ -117,7 +126,8 @@ extern (C) int UIAppMain(string[] args) {
tabs.selectTab("tab1");
- window.mainWidget = tabs;
+ contentLayout.addChild(tabs);
+ window.mainWidget = contentLayout;
} else {
window.mainWidget = (new Button()).text("sample button");
}
diff --git a/src/dlangui/all.d b/src/dlangui/all.d
index 5d271c0b..65550e01 100644
--- a/src/dlangui/all.d
+++ b/src/dlangui/all.d
@@ -9,5 +9,6 @@ public import dlangui.widgets.controls;
public import dlangui.widgets.layouts;
public import dlangui.widgets.lists;
public import dlangui.widgets.tabs;
+public import dlangui.widgets.menu;
public import dlangui.graphics.fonts;
public import dlangui.core.i18n;
diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d
index 50a313b7..5e74adeb 100644
--- a/src/dlangui/core/events.d
+++ b/src/dlangui/core/events.d
@@ -1,7 +1,55 @@
module dlangui.core.events;
+import dlangui.core.i18n;
+
import std.conv;
+/// UI action
+class Action {
+ protected int _id;
+ protected UIString _label;
+ protected string _iconId;
+ this(int id, string labelResourceId, string iconResourceId = null) {
+ _id = id;
+ _label = labelResourceId;
+ _iconId = iconResourceId;
+ }
+ this(int id, dstring label, string iconResourceId = null) {
+ _id = id;
+ _label = label;
+ _iconId = iconResourceId;
+ }
+ @property int id() const {
+ return _id;
+ }
+ @property Action id(int newId) {
+ _id = newId;
+ return this;
+ }
+ @property Action label(string resourceId) {
+ _label = resourceId;
+ return this;
+ }
+ @property Action label(dstring text) {
+ _label = text;
+ return this;
+ }
+ @property dstring label() const {
+ return _label.value;
+ }
+ @property ref const (UIString) labelValue() const {
+ return _label;
+ }
+ @property string iconId() const {
+ return _iconId;
+ }
+ @property Action iconId(string id) {
+ _iconId = id;
+ return this;
+ }
+}
+
+
enum MouseAction : ubyte {
Cancel, // button down handling is cancelled
ButtonDown, // button is down
diff --git a/src/dlangui/widgets/menu.d b/src/dlangui/widgets/menu.d
new file mode 100644
index 00000000..f5ac49a4
--- /dev/null
+++ b/src/dlangui/widgets/menu.d
@@ -0,0 +1,71 @@
+module dlangui.widgets.menu;
+
+import dlangui.core.events;
+import dlangui.widgets.controls;
+import dlangui.widgets.layouts;
+
+class MenuItem {
+ bool _checkable;
+ bool _checked;
+ bool _enabled;
+ protected Action _action;
+ MenuItem[] _subitems;
+ @property int subitemCount() {
+ return cast(int)_subitems.length;
+ }
+ MenuItem subitem(int index) {
+ return _subitems[index];
+ }
+ MenuItem add(MenuItem subitem) {
+ _subitems ~= subitem;
+ return this;
+ }
+ MenuItem add(Action subitemAction) {
+ _subitems ~= new MenuItem(subitemAction);
+ return this;
+ }
+ @property bool isSubmenu() {
+ return _subitems.length > 0;
+ }
+ @property UIString label() {
+ return _action.labelValue;
+ }
+ @property const(Action) action() const { return _action; }
+ @property MenuItem action(Action a) { _action = a; return this; }
+ this() {
+ _enabled = true;
+ }
+ this(Action action) {
+ _action = action;
+ _enabled = true;
+ }
+ ~this() {
+ // TODO
+ }
+}
+
+class MenuItemWidget : HorizontalLayout {
+ protected MenuItem _item;
+ protected TextWidget _label;
+ this(MenuItem item) {
+ _item = item;
+ styleId = "MENU_ITEM";
+ _label = new TextWidget("MENU_LABEL");
+ _label.text = _item.label;
+ addChild(_label);
+ trackHover = true;
+ }
+}
+
+class MainMenu : HorizontalLayout {
+ MenuItem _item;
+ this(MenuItem item) {
+ id = "MAIN_MENU";
+ styleId = "MAIN_MENU";
+ _item = item;
+ for (int i = 0; i < item.subitemCount; i++) {
+ addChild(new MenuItemWidget(item.subitem(i)));
+ }
+ addChild((new Widget()).layoutWidth(FILL_PARENT));
+ }
+}
diff --git a/src/dlangui/widgets/styles.d b/src/dlangui/widgets/styles.d
index 99097585..47eb55f5 100644
--- a/src/dlangui/widgets/styles.d
+++ b/src/dlangui/widgets/styles.d
@@ -662,6 +662,11 @@ Theme createDefaultTheme() {
tabWidget.padding(Rect(3,3,3,3)).backgroundColor(0xEEEEEE);
//tabWidget.backgroundImageId("frame_blue");
//res.dumpStats();
+
+ Style mainMenu = res.createSubstyle("MAIN_MENU").backgroundColor(0xE0E0E0).layoutWidth(FILL_PARENT);
+ Style menuItem = res.createSubstyle("MENU_ITEM").padding(Rect(4,2,4,2)).backgroundColor(0xE0E0E0) ;
+ menuItem.createState(State.Hovered, State.Hovered).backgroundColor(0x80E0E000);
+
return res;
}