diff --git a/examples/helloworld/src/app.d b/examples/helloworld/src/app.d index f60a5202..82746c04 100644 --- a/examples/helloworld/src/app.d +++ b/examples/helloworld/src/app.d @@ -12,21 +12,29 @@ extern (C) int UIAppMain(string[] args) { // resource directory search paths string[] resourceDirs = [ appendPath(exePath, "../../../res/"), // for Visual D and DUB builds + appendPath(exePath, "../../../res/mdpi/"), // for Visual D and DUB builds appendPath(exePath, "../../../../res/"),// for Mono-D builds - appendPath(exePath, "res/") // when res dir is located at the same directory as executable - ]; + appendPath(exePath, "../../../../res/mdpi/"),// for Mono-D builds + appendPath(exePath, "res/"), // when res dir is located at the same directory as executable + appendPath(exePath, "../res/"), // when res dir is located at project directory + appendPath(exePath, "../../res/"), // when res dir is located at the same directory as executable + appendPath(exePath, "res/mdpi/"), // when res dir is located at the same directory as executable + appendPath(exePath, "../res/mdpi/"), // when res dir is located at project directory + appendPath(exePath, "../../res/mdpi/") // when res dir is located at the same directory as executable + ]; + // setup resource directories - will use only existing directories - drawableCache.setResourcePaths(resourceDirs); - // setup i18n - look for i18n directory inside one of passed directories - i18n.findTranslationsDir(resourceDirs); + Platform.instance.resourceDirs = resourceDirs; // select translation file - for english language - i18n.load("en.ini"); //"ru.ini", "en.ini" + Platform.instance.uiLanguage = "en"; + // load theme from file "theme_default.xml" + Platform.instance.uiTheme = "theme_default"; // create window Window window = Platform.instance.createWindow("My Window", null); // create some widget to show in window - window.mainWidget = (new Button()).text("Hello world"d); + window.mainWidget = (new Button()).text("Hello world"d).margins(Rect(20,20,20,20)); // show window window.show(); diff --git a/src/dlangui/platforms/windows/winapp.d b/src/dlangui/platforms/windows/winapp.d index 7232ee02..0663f964 100644 --- a/src/dlangui/platforms/windows/winapp.d +++ b/src/dlangui/platforms/windows/winapp.d @@ -134,10 +134,10 @@ class Win32Window : Window { HGLRC _hGLRC; // opengl context HPALETTE _hPalette; } - string _caption; + dstring _caption; Win32ColorDrawBuf _drawbuf; bool useOpengl; - this(Win32Platform platform, string windowCaption, Window parent) { + this(Win32Platform platform, dstring windowCaption, Window parent, uint flags) { _platform = platform; _caption = windowCaption; _hwnd = CreateWindow(toUTF16z(WIN_CLASS_NAME), // window class name @@ -277,13 +277,16 @@ class Win32Window : Window { ShowWindow(_hwnd, _cmdShow); //UpdateWindow(_hwnd); } - override @property string windowCaption() { - return _caption; - } - override @property void windowCaption(string caption) { - _caption = caption; - SetWindowTextW(_hwnd, toUTF16z(_caption)); - } + + override @property dstring windowCaption() { + return _caption; + } + + override @property void windowCaption(dstring caption) { + _caption = caption; + if (_hwnd) + SetWindowTextW(_hwnd, toUTF16z(_caption)); + } void onCreate() { Log.d("Window onCreate"); _platform.onWindowCreated(_hwnd, this); @@ -293,6 +296,24 @@ class Win32Window : Window { _platform.onWindowDestroyed(_hwnd, this); } + /// close window + override void close() { + Log.d("Window.close()"); + _platform.closeWindow(this); + } + + /// sets window icon + @property override void windowIcon(DrawBufRef buf) { + ColorDrawBuf icon = cast(ColorDrawBuf)buf.get; + if (!icon) { + Log.e("Trying to set null icon for window"); + return; + } + //icon = new ColorDrawBuf(icon); + //icon.invertAlpha(); + //destroy(icon); + } + private void paintUsingGDI() { PAINTSTRUCT ps; HDC hdc = BeginPaint(_hwnd, &ps); @@ -528,10 +549,26 @@ class Win32Platform : Platform { return _windowMap[cast(ulong)hwnd]; return null; } - override Window createWindow(string windowCaption, Window parent) { - return new Win32Window(this, windowCaption, parent); + override Window createWindow(dstring windowCaption, Window parent, uint flags = WindowFlag.Resizable) { + return new Win32Window(this, windowCaption, parent, flags); } + /// calls request layout for all windows + override void requestLayout() { + foreach(w; _windowMap) { + w.requestLayout(); + w.invalidate(); + } + } + + Win32Window _windowToClose; + + /// close window + override void closeWindow(Window w) { + Win32Window window = cast(Win32Window)w; + _windowToClose = window; + } + /// retrieves text from clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux) override dstring getClipboardText(bool mouseBuffer = false) { dstring res = null; @@ -634,7 +671,7 @@ string[] splitCmdLine(string line) { return res; } -private __gshared Win32Platform platform; +private __gshared Win32Platform w32platform; int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { @@ -651,12 +688,12 @@ int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int _cmdShow = iCmdShow; _hInstance = hInstance; - platform = new Win32Platform(); - if (!platform.registerWndClass()) { + w32platform = new Win32Platform(); + if (!w32platform.registerWndClass()) { MessageBoxA(null, "This program requires Windows NT!", "DLANGUI App".toStringz, MB_ICONERROR); return 0; } - Platform.setInstance(platform); + Platform.setInstance(w32platform); /// testing freetype font manager @@ -734,7 +771,7 @@ LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) void * p = cast(void*)GetWindowLongPtr(hwnd, GWLP_USERDATA); Win32Window windowParam = p is null ? null : cast(Win32Window)(p); - Win32Window window = platform.getWindow(hwnd); + Win32Window window = w32platform.getWindow(hwnd); if (windowParam !is null && window !is null) assert(window is windowParam); if (window is null && windowParam !is null) { @@ -756,7 +793,7 @@ LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_DESTROY: if (window !is null) window.onDestroy(); - if (platform.windowCount == 0) + if (w32platform.windowCount == 0) PostQuitMessage(0); return 0; case WM_WINDOWPOSCHANGED: