diff --git a/wpf/libui.msbuild b/wpf/libui.msbuild index aabf3401..d9147c1a 100755 --- a/wpf/libui.msbuild +++ b/wpf/libui.msbuild @@ -87,6 +87,7 @@ false + diff --git a/wpf/window.cpp b/wpf/window.cpp new file mode 100644 index 00000000..74cb961e --- /dev/null +++ b/wpf/window.cpp @@ -0,0 +1,136 @@ +// 25 november 2015 +#include "uipriv_wpf.hpp" + +ref class libuiWindow : public Window { +public: + uiWindow *w; + void onClosing(Object ^sender, CancelEventArgs ^e); +}; + +struct uiWindow { + uiWindowsControl c; + gcroot *window; + + int margined; + + int (*onClosing)(uiWindow *, void *); + void *onClosingData; +}; + +static void onDestroy(uiWindow *); + +uiWindowsDefineControlWithOnDestroy( + uiWindow, // type name + uiWindowType, // type function + window, // handle + onDestroy(hthis); // on destroy +) + +void libuiWindow::onClosing(Object ^sender, CancelEventArgs ^e) +{ + e->Cancel = (*(this->w->onClosing))(this->w, this->w->onClosingData) == 0; +} + +static int defaultOnClosing(uiWindow *w, void *data) +{ + return 0; +} + +static void onDestroy(uiWindow *w) +{ + // TODO +} + +static void windowCommitShow(uiControl *c) +{ + uiWindow *w = uiWindow(c); + + // TODO does this behave properly in re presentation? + (*(w->window))->Show(); +} + +static void windowCommitHide(uiControl *c) +{ + uiWindow *w = uiWindow(c); + + (*(w->window))->Hide(); +} + +static void windowContainerUpdateState(uiControl *c) +{ +/*TODO + uiWindow *w = uiWindow(c); + + if (w->child != NULL) + childUpdateState(w->child); +*/ +} + +char *uiWindowTitle(uiWindow *w) +{ + return uiWindowsCLRStringToText((*(w->window))->Title); +} + +void uiWindowSetTitle(uiWindow *w, const char *title) +{ + (*(w->window))->Title = fromUTF8(title); +} + +void uiWindowOnClosing(uiWindow *w, int (*f)(uiWindow *, void *), void *data) +{ + w->onClosing = f; + w->onClosingData = data; +} + +void uiWindowSetChild(uiWindow *w, uiControl *child) +{ +/*TODO + if (w->child != NULL) + childRemove(w->child); + w->child = newChild(child, uiControl(w), w->hwnd); + if (w->child != NULL) { + childSetSoleControlID(w->child); + childQueueRelayout(w->child); + } +*/ +} + +int uiWindowMargined(uiWindow *w) +{ + return w->margined; +} + +void uiWindowSetMargined(uiWindow *w, int margined) +{ + w->margined = margined; +//TODO uiWindowsControlQueueRelayout(uiWindowsControl(w)); +} + +uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar) +{ + uiWindow *w; + + w = (uiWindow *) uiNewControl(uiWindowType()); + + w->window = new gcroot(); + *(w->window) = gcnew libuiWindow(); + (*(w->window))->w = w; + + (*(w->window))->Title = fromUTF8(title); + // TODO is this the client size? + (*(w->window))->Width = width; + (*(w->window))->Height = height; + + // TODO background color + + (*(w->window))->Closing += gcnew CancelEventHandler(*(w->window), + &libuiWindow::onClosing); + uiWindowOnClosing(w, defaultOnClosing, NULL); + + uiWindowsFinishNewControl(w, uiWindow, window); + uiControl(w)->CommitShow = windowCommitShow; + uiControl(w)->CommitHide = windowCommitHide; + uiControl(w)->ContainerUpdateState = windowContainerUpdateState; + + return w; +} diff --git a/wpf/wpf.cpp b/wpf/wpf.cpp deleted file mode 100644 index 7271ad23..00000000 --- a/wpf/wpf.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// 24 november 2015 -#include -#define EXPORT __declspec(dllexport) -#include "wpf.h" - -#using -#using -#using -#using -using namespace System; -using namespace System::ComponentModel; -using namespace System::Windows; - -ref class windowEvents { -public: - wpfWindow *w; - // TODO the using namespace above doesn't work? - void closingEvent(Object ^sender, CancelEventArgs ^e); -}; - -struct wpfWindow { - gcroot window; - gcroot events; - void (*onClosing)(wpfWindow *, void *); - void *onClosingData; -}; - -void windowEvents::closingEvent(Object ^sender, CancelEventArgs ^e) -{ - (*(this->w->onClosing))(this->w, this->w->onClosingData); -} - -wpfWindow *wpfNewWindow(const char *title, int width, int height) -{ - wpfWindow *w; - - w = new wpfWindow; - - w->window = gcnew Window(); - w->window->Title = gcnew String(title); - w->window->Width = width; - w->window->Height = height; - - w->events = gcnew windowEvents(); - w->events->w = w; - w->window->Closing += gcnew CancelEventHandler(w->events, &windowEvents::closingEvent); - - w->window->Show(); - - return w; -} - -void wpfWindowOnClosing(wpfWindow *w, void (*f)(wpfWindow *w, void *data), void *data) -{ - w->onClosing = f; - w->onClosingData = data; -}