# HG changeset patch # User Olaf Wintermann # Date 1422349172 -3600 # Node ID 0cdb8089a29fbc539284b48c633560180360cb3b # Parent 5eb765a7a7939fefb53aa598f96fe770d91bb4eb added event handler for menus (WPF) diff -r 5eb765a7a793 -r 0cdb8089a29f application/main.c --- a/application/main.c Sun Jan 25 15:01:04 2015 +0100 +++ b/application/main.c Tue Jan 27 09:59:32 2015 +0100 @@ -92,11 +92,24 @@ //ui_select_tab(tabview, 0); } */ + +void action_menu(UiEvent *event, void *data) { + printf("action_menu test: {%s}\n", data); + fflush(stdout); +} + int main(int argc, char** argv) { ui_init("app1", argc, argv); ui_menu("File"); - ui_menuitem("Hello", NULL, NULL); + ui_menuitem("Hello", action_menu, "hello"); + ui_submenu("Submenu1"); + ui_submenu("Submenu2"); + ui_menuitem("item2", NULL, NULL); + ui_submenu_end(); + ui_menuitem("item3", NULL, NULL); + ui_submenu_end(); + ui_menuitem("item4", NULL, NULL); UiObject *obj = ui_window("Test", NULL); ui_show(obj); diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIcore/Menu.cs --- a/ui/wpf/UIcore/Menu.cs Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/UIcore/Menu.cs Tue Jan 27 09:59:32 2015 +0100 @@ -34,12 +34,12 @@ current.Add(menu); } - public void EndMenu() + public void EndSubMenu() { current.Remove(current.Last()); } - public void AddMenuItem(String label, Action action) + public void AddMenuItem(String label, Action action) { if(current.Count != 0) { @@ -48,14 +48,14 @@ } } - public System.Windows.Controls.Menu CreateMenu() + public System.Windows.Controls.Menu CreateMenu(IntPtr uiobj) { System.Windows.Controls.Menu menu = new System.Windows.Controls.Menu(); foreach (Menu m in Menus) { System.Windows.Controls.MenuItem i = new System.Windows.Controls.MenuItem(); i.Header = m.Label; - m.AddItems(i); + m.AddItems(i, uiobj); menu.Items.Add(i); } return menu; @@ -64,7 +64,7 @@ public interface IMenuItem { - void AddTo(System.Windows.Controls.MenuItem menu); + void AddTo(System.Windows.Controls.MenuItem menu, IntPtr uiobj); } public class Menu : IMenuItem @@ -77,19 +77,19 @@ Label = label; } - public void AddItems(System.Windows.Controls.MenuItem i) + public void AddItems(System.Windows.Controls.MenuItem i, IntPtr uiobj) { foreach (IMenuItem item in Items) { - item.AddTo(i); + item.AddTo(i, uiobj); } } - void IMenuItem.AddTo(System.Windows.Controls.MenuItem menu) + void IMenuItem.AddTo(System.Windows.Controls.MenuItem menu, IntPtr uiobj) { System.Windows.Controls.MenuItem i = new System.Windows.Controls.MenuItem(); i.Header = Label; - AddItems(i); + AddItems(i, uiobj); menu.Items.Add(i); } } @@ -97,17 +97,19 @@ public class MenuItem : IMenuItem { String Label; - Action Action; + Action Action; - public MenuItem(String label, Action action) + public MenuItem(String label, Action action) { Label = label; Action = action; } - void IMenuItem.AddTo(System.Windows.Controls.MenuItem menu) + void IMenuItem.AddTo(System.Windows.Controls.MenuItem menu, IntPtr uiobj) { System.Windows.Controls.MenuItem i = new System.Windows.Controls.MenuItem(); + EventCallback cb = new EventCallback(uiobj, Action); + i.Click += cb.Callback; i.Header = Label; menu.Items.Add(i); } diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIcore/Toolkit.cs --- a/ui/wpf/UIcore/Toolkit.cs Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/UIcore/Toolkit.cs Tue Jan 27 09:59:32 2015 +0100 @@ -4,11 +4,24 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Windows; namespace UI { - public class Toolkit + public class EventCallback { - + public IntPtr Object; + public Action Action; + + public EventCallback(IntPtr uiobj, Action action) + { + Object = uiobj; + Action = action; + } + + public void Callback(object sender, RoutedEventArgs a) + { + Action.Invoke(Object); + } } } diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIcore/Window.cs --- a/ui/wpf/UIcore/Window.cs Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/UIcore/Window.cs Tue Jan 27 09:59:32 2015 +0100 @@ -10,10 +10,13 @@ namespace UI { public class MainWindow : Window - { - public MainWindow(String title) + { + public IntPtr Object; + + public MainWindow(String title, IntPtr uiobj) { Title = title; + Object = uiobj; Width = 300; Height = 300; @@ -21,7 +24,7 @@ Application app = Application.GetInstance(); if (!app.AppMenu.IsEmpty()) { - System.Windows.Controls.Menu menu = app.AppMenu.CreateMenu(); + System.Windows.Controls.Menu menu = app.AppMenu.CreateMenu(uiobj); this.AddChild(menu); } @@ -29,9 +32,9 @@ Closed += CloseEvent; } - public static MainWindow CreateMainWindow(String title) + public static MainWindow CreateMainWindow(String title, IntPtr uiobj) { - return Application.GetInstance().Exec(() => new MainWindow(title)); + return Application.GetInstance().Exec(() => new MainWindow(title, uiobj)); } public void ShowWindow() diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIwrapper/UIwrapper.v12.suo Binary file ui/wpf/UIwrapper/UIwrapper.v12.suo has changed diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIwrapper/UIwrapper/menu.cpp --- a/ui/wpf/UIwrapper/UIwrapper/menu.cpp Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/UIwrapper/UIwrapper/menu.cpp Tue Jan 27 09:59:32 2015 +0100 @@ -10,8 +10,17 @@ UI::Application::GetInstance()->AppMenu->AddMenu(gcnew String(label)); } +UI_EXPORT void __stdcall UIsubmenu(char *label) { + UI::Application::GetInstance()->AppMenu->AddSubMenu(gcnew String(label)); +} -UI_EXPORT void __stdcall UImenuitem(char *label, UIcallback f, void *userdata) { - EventWrapper ^e = gcnew EventWrapper(f, userdata); +UI_EXPORT void __stdcall UIsubmenu_end() { + UI::Application::GetInstance()->AppMenu->EndSubMenu(); +} + + +UI_EXPORT void __stdcall UImenuitem(char *label, UIcallback f, void *eventdata) { + EventWrapper ^e = gcnew EventWrapper(f, eventdata); UI::Application::GetInstance()->AppMenu->AddMenuItem(gcnew String(label), e->GetAction()); } + diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIwrapper/UIwrapper/toolkit.cpp --- a/ui/wpf/UIwrapper/UIwrapper/toolkit.cpp Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/UIwrapper/UIwrapper/toolkit.cpp Tue Jan 27 09:59:32 2015 +0100 @@ -23,18 +23,20 @@ // EventWrapper -EventWrapper::EventWrapper(UIcallback callback, void *userdata) { +EventWrapper::EventWrapper(UIcallback callback, void *eventdata) { this->callback = callback; - this->userdata = userdata; - action = gcnew Action(this, &EventWrapper::Callback); + this->userdata = eventdata; + action = gcnew Action(this, &EventWrapper::Callback); } -Action^ EventWrapper::GetAction() { +Action^ EventWrapper::GetAction() { return action; } -void EventWrapper::Callback() { - callback(NULL, NULL); +void EventWrapper::Callback(IntPtr uiobj) { + if (callback) { + callback(uiobj.ToPointer(), userdata); + } } UI_EXPORT void __stdcall UIinit(char *appname) { diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIwrapper/UIwrapper/toolkit.h --- a/ui/wpf/UIwrapper/UIwrapper/toolkit.h Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/UIwrapper/UIwrapper/toolkit.h Tue Jan 27 09:59:32 2015 +0100 @@ -17,12 +17,12 @@ public ref class EventWrapper { UIcallback callback = NULL; void *userdata = NULL; - Action ^action; + Action ^action; public: EventWrapper(UIcallback callback, void *userdata); - Action^ GetAction(); + Action^ GetAction(); - void Callback(); + void Callback(IntPtr uiobj); }; diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/UIwrapper/UIwrapper/window.cpp --- a/ui/wpf/UIwrapper/UIwrapper/window.cpp Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/UIwrapper/UIwrapper/window.cpp Tue Jan 27 09:59:32 2015 +0100 @@ -8,6 +8,6 @@ #using "UIcore.dll" UI_EXPORT void* UIwindow(char *title, void *uiobj) { - UI::MainWindow ^window = UI::MainWindow::CreateMainWindow(gcnew String(title)); + UI::MainWindow ^window = UI::MainWindow::CreateMainWindow(gcnew String(title), IntPtr(uiobj)); return ObjectToPtr(window); } diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/menu.c --- a/ui/wpf/menu.c Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/menu.c Tue Jan 27 09:59:32 2015 +0100 @@ -37,13 +37,36 @@ } void ui_submenu(char *label) { - + UIsubmenu(label); } void ui_submenu_end() { - + UIsubmenu_end(); } void ui_menuitem(char *label, ui_callback f, void *userdata) { - UImenuitem(label, f, userdata); + ui_callback cb = NULL; + void *e = NULL; + if (f) { + UiEventData *event = malloc(sizeof(UiEventData)); + event->obj = NULL; + event->user_data = userdata; + event->callback = f; + event->value = 0; + cb = (ui_callback)ui_menu_callback; + e = event; + } + + UImenuitem(label, cb, e); } + + +void ui_menu_callback(UiObject *obj, UiEventData *e) { + UiEvent event; + event.obj = obj; + event.window = obj->window; + event.intval = 0; + event.eventdata = NULL; + event.document = obj->ctx->document; + e->callback(&event, e->user_data); +} diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/menu.h --- a/ui/wpf/menu.h Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/menu.h Tue Jan 27 09:59:32 2015 +0100 @@ -16,10 +16,14 @@ #endif UI_IMPORT void __stdcall UImenu(char *label); - +UI_IMPORT void __stdcall UIsubmenu(char *label); +UI_IMPORT void __stdcall UIsubmenu_end(); UI_IMPORT void __stdcall UImenuitem(char *label, ui_callback f, void *udata); + +void ui_menu_callback(UiObject *obj, UiEventData *e); + #ifdef __cplusplus } #endif diff -r 5eb765a7a793 -r 0cdb8089a29f ui/wpf/toolkit.h --- a/ui/wpf/toolkit.h Sun Jan 25 15:01:04 2015 +0100 +++ b/ui/wpf/toolkit.h Tue Jan 27 09:59:32 2015 +0100 @@ -41,6 +41,13 @@ #define UI_IMPORT __declspec(dllimport) __declspec(dllimport) int __stdcall myfunc(char *str); +typedef struct UiEventData { + UiObject *obj; + ui_callback callback; + void *user_data; + int value; +} UiEventData; + UI_IMPORT void __stdcall UIinit(char *appname); UI_IMPORT void __stdcall UImain(); UI_IMPORT void __stdcall UIshow(UIWIDGET widget);