From 8e312aaacd88bc73b0077fc9cd35d4f17d27e8bf Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 30 Apr 2014 11:08:01 +0400 Subject: [PATCH 1/6] SDL2 platform: OpenGL support, part 1 --- src/dlangui/platforms/sdl/sdlapp.d | 118 ++++++++++++++++++++--------- 1 file changed, 82 insertions(+), 36 deletions(-) diff --git a/src/dlangui/platforms/sdl/sdlapp.d b/src/dlangui/platforms/sdl/sdlapp.d index 8181617e..e3b2563b 100644 --- a/src/dlangui/platforms/sdl/sdlapp.d +++ b/src/dlangui/platforms/sdl/sdlapp.d @@ -49,21 +49,62 @@ version(USE_SDL) { debug Log.d("Destroying SDL window"); if (_renderer) SDL_DestroyRenderer(_renderer); + if (_context) + SDL_GL_DeleteContext(_context); if (_win) SDL_DestroyWindow(_win); } - + + static private bool _sdlReloaded = false; + SDL_GLContext _context; + bool create() { - _win = SDL_CreateWindow(_caption.toStringz, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 700, 500, SDL_WINDOW_RESIZABLE); + uint windowFlags = SDL_WINDOW_RESIZABLE; + if (_enableOpengl) + windowFlags |= SDL_WINDOW_OPENGL; + _win = SDL_CreateWindow(_caption.toStringz, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + 700, 500, + windowFlags); + if (!_win) { + if (_enableOpengl) { + Log.e("SDL_CreateWindow failed - cannot create OpenGL window: ", fromStringz(SDL_GetError())); + _enableOpengl = false; + // recreate w/o OpenGL + windowFlags &= ~SDL_WINDOW_OPENGL; + _win = SDL_CreateWindow(_caption.toStringz, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + 700, 500, + windowFlags); + } + } if (!_win) { Log.e("SDL2: Failed to create window"); return false; } - _renderer = SDL_CreateRenderer(_win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - if (!_renderer) { - Log.e("SDL2: Failed to create renderer"); - return false; - } + if (_enableOpengl) { + _context = SDL_GL_CreateContext(_win); // Create the actual context and make it current + if (!_context) { + Log.e("SDL_GL_CreateContext failed: ", fromStringz(SDL_GetError())); + _enableOpengl = false; + } else if (!_sdlReloaded) { + //if (SDL_GL_MakeCurrent(window, context)) { + // Log.e("SDL_GL_MakeCurrent failed: ", fromStringz(SDL_GetError())); + // _enableOpengl = false; + //} + DerelictGL3.reload(); //<-- BOOM SIGSEGV + _sdlReloaded = true; + } + //if (context) + // SDL_GL_DeleteContext(context); + //if (window) + // SDL_DestroyWindow(window); + } + if (!_enableOpengl) { + _renderer = SDL_CreateRenderer(_win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + if (!_renderer) { + Log.e("SDL2: Failed to create renderer"); + return false; + } + } //windowCaption = _caption; return true; } @@ -134,6 +175,10 @@ version(USE_SDL) { if (_enableOpengl) { + // now you can make GL calls. + glClearColor(0,0.3f,0.7f,1); + glClear(GL_COLOR_BUFFER_BIT); + SDL_GL_SwapWindow(_win); version(USE_OPENGL) { } } else { @@ -446,12 +491,6 @@ version(USE_SDL) { } bool connect() { - try { - //DerelictGL3.load(); - _enableOpengl = false; - } catch (Exception e) { - Log.e("Cannot load opengl library", e); - } return true; } @@ -698,13 +737,6 @@ version(USE_SDL) { string[] args = splitCmdLine(cmdline); Log.i("Command line params: ", args); - try { - // Load the SDL 2 library. - DerelictSDL2.load(); - } catch (Exception e) { - Log.e("Cannot load SDL2 library", e); - return 1; - } //_cmdShow = iCmdShow; //_hInstance = hInstance; @@ -721,22 +753,6 @@ version(USE_SDL) { setStderrLogger(); setLogLevel(LogLevel.Trace); - try { - // Load the SDL 2 library. - DerelictSDL2.load(); - } catch (Exception e) { - Log.e("Cannot load SDL2 library", e); - return 1; - } - - SDL_DisplayMode displayMode; - if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_EVENTS) != 0) { - Log.e("Cannot init SDL2"); - return 2; - } - scope(exit)SDL_Quit(); - int request = SDL_GetDesktopDisplayMode(0,&displayMode); - FreeTypeFontManager ft = new FreeTypeFontManager(); // TODO: use FontConfig @@ -750,6 +766,36 @@ version(USE_SDL) { int sdlmain(string[] args) { currentTheme = createDefaultTheme(); + try { + // Load the SDL 2 library. + DerelictSDL2.load(); + } catch (Exception e) { + Log.e("Cannot load SDL2 library", e); + return 1; + } + + try { + DerelictGL3.load(); + _enableOpengl = true; + } catch (Exception e) { + Log.e("Cannot load opengl library", e); + } + + SDL_DisplayMode displayMode; + if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_EVENTS) != 0) { + Log.e("Cannot init SDL2"); + return 2; + } + scope(exit)SDL_Quit(); + int request = SDL_GetDesktopDisplayMode(0,&displayMode); + + // we want OpenGL 3.3 + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2); + // Set OpenGL attributes + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDLPlatform sdl = new SDLPlatform(); if (!sdl.connect()) { return 1; From a2dc1d7c6e05a67860a555ba4b5751e38ba9a434 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 30 Apr 2014 11:23:13 +0400 Subject: [PATCH 2/6] OpenGL is working under SDL2 --- src/dlangui/platforms/sdl/sdlapp.d | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/dlangui/platforms/sdl/sdlapp.d b/src/dlangui/platforms/sdl/sdlapp.d index e3b2563b..54adbf7e 100644 --- a/src/dlangui/platforms/sdl/sdlapp.d +++ b/src/dlangui/platforms/sdl/sdlapp.d @@ -2,7 +2,6 @@ module src.dlangui.platforms.sdl.sdlapp; version(USE_SDL) { import core.runtime; - import std.string; import std.conv; import std.string; import std.utf; @@ -13,7 +12,7 @@ version(USE_SDL) { import dlangui.core.logger; import dlangui.core.events; import dlangui.graphics.drawbuf; - import dlangui.graphics.fonts; + import dlangui.graphics.fonts; import dlangui.graphics.ftfonts; import dlangui.graphics.resources; import dlangui.widgets.styles; @@ -21,13 +20,13 @@ version(USE_SDL) { import dlangui.platforms.common.platform; import derelict.sdl2.sdl; + import derelict.opengl3.gl3; version (USE_OPENGL) { + import dlangui.graphics.gldrawbuf; import dlangui.graphics.glsupport; } - import derelict.opengl3.gl3; - import derelict.opengl3.glx; // pragma(lib, "xcb"); // pragma(lib, "xcb-shm"); @@ -92,6 +91,8 @@ version(USE_SDL) { //} DerelictGL3.reload(); //<-- BOOM SIGSEGV _sdlReloaded = true; + if (!initShaders()) + _enableOpengl = false; } //if (context) // SDL_GL_DeleteContext(context); @@ -175,11 +176,22 @@ version(USE_SDL) { if (_enableOpengl) { - // now you can make GL calls. - glClearColor(0,0.3f,0.7f,1); - glClear(GL_COLOR_BUFFER_BIT); - SDL_GL_SwapWindow(_win); version(USE_OPENGL) { + SDL_GL_MakeCurrent(_win, _context); + glDisable(GL_DEPTH_TEST); + glViewport(0, 0, _dx, _dy); + float a = 1.0f; + float r = ((_backgroundColor >> 16) & 255) / 255.0f; + float g = ((_backgroundColor >> 8) & 255) / 255.0f; + float b = ((_backgroundColor >> 0) & 255) / 255.0f; + glClearColor(r, g, b, a); + glClear(GL_COLOR_BUFFER_BIT); + GLDrawBuf buf = new GLDrawBuf(_dx, _dy, false); + buf.beforeDrawing(); + onDraw(buf); + buf.afterDrawing(); + SDL_GL_SwapWindow(_win); + destroy(buf); } } else { // Select the color for drawing. It is set to red here. From 85aca6f03909ec000e4687348da91a48b8b27927 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 30 Apr 2014 11:48:15 +0400 Subject: [PATCH 3/6] support SDL build w/o OpenGL --- dlanguilib.visualdproj | 18 ++-- examples/example1/example1.visualdproj | 2 +- src/dlangui/platforms/sdl/sdlapp.d | 109 +++++++++++++------------ 3 files changed, 67 insertions(+), 62 deletions(-) diff --git a/dlanguilib.visualdproj b/dlanguilib.visualdproj index 466a77aa..5e780b00 100644 --- a/dlanguilib.visualdproj +++ b/dlanguilib.visualdproj @@ -66,7 +66,7 @@ 0 0 - Unicode USE_OPENGL USE_SDL + Unicode USE_SDL 0 0 1 @@ -217,14 +217,6 @@ - - - - - - - - @@ -234,6 +226,14 @@ + + + + + + + + diff --git a/examples/example1/example1.visualdproj b/examples/example1/example1.visualdproj index 03c3ef63..b04fc227 100644 --- a/examples/example1/example1.visualdproj +++ b/examples/example1/example1.visualdproj @@ -66,7 +66,7 @@ 0 0 - Unicode USE_OPENGL USE_SDL + Unicode USE_SDL 0 3 0 diff --git a/src/dlangui/platforms/sdl/sdlapp.d b/src/dlangui/platforms/sdl/sdlapp.d index 54adbf7e..64f258a0 100644 --- a/src/dlangui/platforms/sdl/sdlapp.d +++ b/src/dlangui/platforms/sdl/sdlapp.d @@ -48,56 +48,58 @@ version(USE_SDL) { debug Log.d("Destroying SDL window"); if (_renderer) SDL_DestroyRenderer(_renderer); - if (_context) - SDL_GL_DeleteContext(_context); + version(USE_OPENGL) { + if (_context) + SDL_GL_DeleteContext(_context); + } if (_win) SDL_DestroyWindow(_win); } - static private bool _sdlReloaded = false; - SDL_GLContext _context; + version(USE_OPENGL) { + static private bool _gl3Reloaded = false; + private SDL_GLContext _context; + } bool create() { uint windowFlags = SDL_WINDOW_RESIZABLE; - if (_enableOpengl) - windowFlags |= SDL_WINDOW_OPENGL; + version(USE_OPENGL) { + if (_enableOpengl) + windowFlags |= SDL_WINDOW_OPENGL; + } _win = SDL_CreateWindow(_caption.toStringz, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 700, 500, windowFlags); - if (!_win) { - if (_enableOpengl) { - Log.e("SDL_CreateWindow failed - cannot create OpenGL window: ", fromStringz(SDL_GetError())); - _enableOpengl = false; - // recreate w/o OpenGL - windowFlags &= ~SDL_WINDOW_OPENGL; - _win = SDL_CreateWindow(_caption.toStringz, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - 700, 500, - windowFlags); + version(USE_OPENGL) { + if (!_win) { + if (_enableOpengl) { + Log.e("SDL_CreateWindow failed - cannot create OpenGL window: ", fromStringz(SDL_GetError())); + _enableOpengl = false; + // recreate w/o OpenGL + windowFlags &= ~SDL_WINDOW_OPENGL; + _win = SDL_CreateWindow(_caption.toStringz, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + 700, 500, + windowFlags); + } } } if (!_win) { Log.e("SDL2: Failed to create window"); return false; } - if (_enableOpengl) { - _context = SDL_GL_CreateContext(_win); // Create the actual context and make it current - if (!_context) { - Log.e("SDL_GL_CreateContext failed: ", fromStringz(SDL_GetError())); - _enableOpengl = false; - } else if (!_sdlReloaded) { - //if (SDL_GL_MakeCurrent(window, context)) { - // Log.e("SDL_GL_MakeCurrent failed: ", fromStringz(SDL_GetError())); - // _enableOpengl = false; - //} - DerelictGL3.reload(); //<-- BOOM SIGSEGV - _sdlReloaded = true; - if (!initShaders()) + version(USE_OPENGL) { + if (_enableOpengl) { + _context = SDL_GL_CreateContext(_win); // Create the actual context and make it current + if (!_context) { + Log.e("SDL_GL_CreateContext failed: ", fromStringz(SDL_GetError())); _enableOpengl = false; + } else if (!_gl3Reloaded) { + DerelictGL3.reload(); + _gl3Reloaded = true; + if (!initShaders()) + _enableOpengl = false; + } } - //if (context) - // SDL_GL_DeleteContext(context); - //if (window) - // SDL_DestroyWindow(window); } if (!_enableOpengl) { _renderer = SDL_CreateRenderer(_win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); @@ -106,7 +108,7 @@ version(USE_SDL) { return false; } } - //windowCaption = _caption; + windowCaption = _caption; return true; } @@ -117,7 +119,6 @@ version(USE_SDL) { } - bool _derelictgl3Reloaded; override void show() { Log.d("SDLWindow.show()"); SDL_ShowWindow(_win); @@ -169,12 +170,9 @@ version(USE_SDL) { //Log.e("Widget instance count in SDLWindow.redraw: ", Widget.instanceCount()); // check if size has been changed int w, h; - SDL_GetWindowSize(_win, - &w, - &h); + SDL_GetWindowSize(_win, &w, &h); onResize(w, h); - if (_enableOpengl) { version(USE_OPENGL) { SDL_GL_MakeCurrent(_win, _context); @@ -194,10 +192,13 @@ version(USE_SDL) { destroy(buf); } } else { - // Select the color for drawing. It is set to red here. - //SDL_SetRenderDrawColor(_renderer, 255, 0, 0, 255); + // Select the color for drawing. + ubyte r = cast(ubyte)((_backgroundColor >> 16) & 255); + ubyte g = cast(ubyte)((_backgroundColor >> 8) & 255); + ubyte b = cast(ubyte)((_backgroundColor >> 0) & 255); + SDL_SetRenderDrawColor(_renderer, r, g, b, 255); // Clear the entire screen to our selected color. - //SDL_RenderClear(_renderer); + SDL_RenderClear(_renderer); if (!_drawbuf) _drawbuf = new ColorDrawBuf(_dx, _dy); @@ -786,11 +787,13 @@ version(USE_SDL) { return 1; } - try { - DerelictGL3.load(); - _enableOpengl = true; - } catch (Exception e) { - Log.e("Cannot load opengl library", e); + version(USE_OPENGL) { + try { + DerelictGL3.load(); + _enableOpengl = true; + } catch (Exception e) { + Log.e("Cannot load opengl library", e); + } } SDL_DisplayMode displayMode; @@ -801,12 +804,14 @@ version(USE_SDL) { scope(exit)SDL_Quit(); int request = SDL_GetDesktopDisplayMode(0,&displayMode); - // we want OpenGL 3.3 - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2); - // Set OpenGL attributes - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + version(USE_OPENGL) { + // we want OpenGL 3.3 + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2); + // Set OpenGL attributes + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + } SDLPlatform sdl = new SDLPlatform(); if (!sdl.connect()) { From d2cbd7c7c389d76b15f136d5fa8d84529198e189 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 30 Apr 2014 14:50:45 +0400 Subject: [PATCH 4/6] tweak button resources --- res/mdpi/btn_default_small_normal.9.png | Bin 1508 -> 582 bytes .../btn_default_small_normal_disable.9.png | Bin 1487 -> 557 bytes ..._default_small_normal_disable_focused.9.png | Bin 1506 -> 466 bytes res/mdpi/btn_default_small_pressed.9.png | Bin 1413 -> 476 bytes res/mdpi/btn_default_small_selected.9.png | Bin 1391 -> 469 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/mdpi/btn_default_small_normal.9.png b/res/mdpi/btn_default_small_normal.9.png index 5dddd4640d9c603443dc3fc2ac3dc01e82a92c91..ca9bfd6f2ae060c69f7498332b87ccad4b1effc7 100644 GIT binary patch literal 582 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 IM6N<$g0@Y>TmS$7 literal 1506 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 I&MBb@0Bgbd7XSbN diff --git a/res/mdpi/btn_default_small_selected.9.png b/res/mdpi/btn_default_small_selected.9.png index 7a376a97f0d695fb8dedaf5f7dc8708276f8a174..ee71e01d9f768137ff8e349aca8e4dd26cd4c371 100644 GIT binary patch literal 469 zcmV;`0V@89P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RZ1Re@7FjcP78UO$RXGugsR7l6o zmQ6|nK@^0)?zBH~VRYpWh#+VdZgPN}Ah+-au5$p_-XOQ|1aklv3c8VipacSg5;Q8) z&qcRmW?W>tCjlQk28MY>O;uNS!~Bv8-=KW214qCC(4bmnz$5SgObwuclfilSqSM~% z5m49n&sS%cNguc|fB}v>?cLsFIK*082}Em6r+wH12Eg49P!qA(EUV1MW*LYDXadG~ zO;$jhT0teaStiE6X-IX0%62yJLOb`w5?pRZ6@dcT%y3e8p&g(I!6J#|WO7ClLCDV( zeoaG!Ms7xz#Ezy^WF!$lGNX|xx~8IC(?!>)<=RWWAQfR;2g=cMH zjC76Ama`VkXi4e+hx<_kBUwh)is@JN(_eREYnfk-B6p)1*DNp|rPFk0Yi&COXq0}W zz!|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>JGIVls zHa9e}FflYTFtac;bTYHFbT)K#a&vYxbv83JgqeX&ucd{Bft#VRsgsMLxuKzpn}w5w znT5Hble3eVo1vkh2~4kNUU5lcUUDkT-b|pqP`xI2^;$U>r6!i-7lq{K=fF}xKt_H^ zesM;Afr4|ese*4}a%LWg4~ia$Z(UN0GRsm^+=}vZ6~N(Zm5IfEXG0@%b2D>eBNHQI z?EZ%6O(7@D^ns4i2PF=q!~zonra%xAp7ennc;-pX1Ll|_VAkmW$CAy!z&PL2#WAGf z)}1hGKW0M#*=lnRjUOc(6WJKK+&f&HXFm=oVmKAk7=7WALLsAygNI4yihw2!j>a|Z z>FXVTpKQwA0Xl^y3LzPfedO6%i8eHwR8`ybSN43se}_Vw*o`Y33wMaB z9*yigv}YQ}rbSndC&|^ur0+hP7BFLZMqEmFIz`}@mA^MJ$8*w+8P@Quyp%FZb(Yrcupez)3igGEfH z@_qyR11IL<> ne0!aRy;o_**zlbCFOb0CD713zv9QicP!Z_q>gTe~DWM4fzpL@p From 67f74980c797f4d76810ae579d0b5bd80d1b77bc Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 30 Apr 2014 14:51:24 +0400 Subject: [PATCH 5/6] update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 885a3fa3..402ba857 100644 --- a/README.md +++ b/README.md @@ -179,8 +179,9 @@ Third party components used * DerelictGL3 - for OpenGL support * DerelictFT + FreeType library support under linux and optionally under Windows. * DerelictFI + FreeImage library support for decoding of images +* DerelictSDL2 + SDL2 for cross platform support * WindowsAPI bindings from http://www.dsource.org/projects/bindings/wiki/WindowsApi (patched) -* XCB and X11 bindings (patched) TODO: provide links +* XCB and X11 bindings (patched) when SDL2 is not used; TODO: provide links Hello World From 78e8982a2fedd8a76d85ee191672328ea8fbfeac Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 30 Apr 2014 15:29:36 +0400 Subject: [PATCH 6/6] example1 improvements: Buttons demo tab --- examples/example1/src/main.d | 92 +++++++++++++++++++++++++++++++++- src/dlangui/widgets/controls.d | 26 +++++++++- 2 files changed, 114 insertions(+), 4 deletions(-) diff --git a/examples/example1/src/main.d b/examples/example1/src/main.d index bb8f316c..0cc34d45 100644 --- a/examples/example1/src/main.d +++ b/examples/example1/src/main.d @@ -158,7 +158,95 @@ extern (C) int UIAppMain(string[] args) { tabs.addTab(list, "Long List"d); } - tabs.addTab((new TextWidget()).id("tab3").textColor(0x00802000).text("Tab 3 contents"), "Tab 3"d); + { + LinearLayout layout3 = new LinearLayout("tab3"); + layout3.addChild(new TextWidget(null, "Buttons in HorizontalLayout"d)); + WidgetGroup buttons1 = new HorizontalLayout(); + buttons1.addChild(new Button("btn1", "Button 1"d)); + buttons1.addChild(new Button("btn2", "Button 2"d)); + buttons1.addChild(new Button("btn3", "Button 3"d)); + buttons1.addChild(new Button("btn4", "Button 4"d)); + layout3.addChild(buttons1); + layout3.addChild(new VSpacer()); + layout3.addChild(new TextWidget(null, "CheckBoxes in HorizontalLayout"d)); + WidgetGroup buttons2 = new HorizontalLayout(); + buttons2.addChild(new CheckBox("btn1", "CheckBox 1"d)); + buttons2.addChild(new CheckBox("btn2", "CheckBox 2"d)); + buttons2.addChild(new CheckBox("btn3", "CheckBox 3"d)); + buttons2.addChild(new CheckBox("btn4", "CheckBox 4"d)); + layout3.addChild(buttons2); + + layout3.addChild(new VSpacer()); + layout3.addChild(new TextWidget(null, "RadioButtons in HorizontalLayout"d)); + WidgetGroup buttons3 = new HorizontalLayout(); + buttons3.addChild(new RadioButton("btn1", "RadioButton 1"d)); + buttons3.addChild(new RadioButton("btn2", "RadioButton 2"d)); + buttons3.addChild(new RadioButton("btn3", "RadioButton 3"d)); + buttons3.addChild(new RadioButton("btn4", "RadioButton 4"d)); + layout3.addChild(buttons3); + + layout3.addChild(new VSpacer()); + layout3.addChild(new TextWidget(null, "ImageButtons HorizontalLayout"d)); + WidgetGroup buttons4 = new HorizontalLayout(); + buttons4.addChild(new ImageButton("btn1", "fileclose")); + buttons4.addChild(new ImageButton("btn2", "fileopen")); + buttons4.addChild(new ImageButton("btn3", "exit")); + layout3.addChild(buttons4); + + layout3.addChild(new VSpacer()); + layout3.addChild(new TextWidget(null, "In vertical layouts:"d)); + HorizontalLayout hlayout2 = new HorizontalLayout(); + hlayout2.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT); + + buttons1 = new VerticalLayout(); + buttons1.addChild(new TextWidget(null, "Buttons"d)); + buttons1.addChild(new Button("btn1", "Button 1"d)); + buttons1.addChild(new Button("btn2", "Button 2"d)); + buttons1.addChild((new Button("btn3", "Button 3 - disabled"d)).enabled(false)); + buttons1.addChild(new Button("btn4", "Button 4"d)); + hlayout2.addChild(buttons1); + hlayout2.addChild(new HSpacer()); + + buttons2 = new VerticalLayout(); + buttons2.addChild(new TextWidget(null, "CheckBoxes"d)); + buttons2.addChild(new CheckBox("btn1", "CheckBox 1"d)); + buttons2.addChild(new CheckBox("btn2", "CheckBox 2"d)); + buttons2.addChild(new CheckBox("btn3", "CheckBox 3"d)); + buttons2.addChild(new CheckBox("btn4", "CheckBox 4"d)); + hlayout2.addChild(buttons2); + hlayout2.addChild(new HSpacer()); + + buttons3 = new VerticalLayout(); + buttons3.addChild(new TextWidget(null, "RadioButtons"d)); + buttons3.addChild(new RadioButton("btn1", "RadioButton 1"d)); + buttons3.addChild(new RadioButton("btn2", "RadioButton 2"d)); + buttons3.addChild(new RadioButton("btn3", "RadioButton 3"d)); + buttons3.addChild(new RadioButton("btn4", "RadioButton 4"d)); + hlayout2.addChild(buttons3); + hlayout2.addChild(new HSpacer()); + + buttons4 = new VerticalLayout(); + buttons4.addChild(new TextWidget(null, "ImageButtons"d)); + buttons4.addChild(new ImageButton("btn1", "fileclose")); + buttons4.addChild(new ImageButton("btn2", "fileopen")); + buttons4.addChild(new ImageButton("btn3", "exit")); + hlayout2.addChild(buttons4); + hlayout2.addChild(new HSpacer()); + + WidgetGroup buttons5 = new VerticalLayout(); + buttons5.addChild(new TextWidget(null, "ImageTextButtons"d)); + buttons5.addChild(new ImageTextButton("btn1", "fileclose", "Close"d)); + buttons5.addChild(new ImageTextButton("btn2", "fileopen", "Open"d)); + buttons5.addChild(new ImageTextButton("btn3", "exit", "Exit"d)); + hlayout2.addChild(buttons5); + + + layout3.addChild(hlayout2); + + layout3.addChild(new VSpacer()); + layout3.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT); + tabs.addTab(layout3, "Buttons"d); + } tabs.addTab((new TextWidget()).id("tab4").textColor(0x00802000).text("Tab 4 contents some long string"), "Tab 4"d); tabs.addTab((new TextWidget()).id("tab5").textColor(0x00802000).text("Tab 5 contents"), "Tab 5"d); @@ -201,7 +289,7 @@ extern (C) int UIAppMain(string[] args) { //========================================================================== - tabs.selectTab("tab1"); + tabs.selectTab("tab3"); contentLayout.addChild(tabs); window.mainWidget = contentLayout; diff --git a/src/dlangui/widgets/controls.d b/src/dlangui/widgets/controls.d index 88d1eadb..730dd198 100644 --- a/src/dlangui/widgets/controls.d +++ b/src/dlangui/widgets/controls.d @@ -35,15 +35,21 @@ import dlangui.widgets.layouts; /// vertical spacer to fill empty space in vertical layouts class VSpacer : Widget { this() { - styleId = "VSpacer"; + styleId = "VSPACER"; } + //override void measure(int parentWidth, int parentHeight) { + // measuredContent(parentWidth, parentHeight, 8, 8); + //} } /// horizontal spacer to fill empty space in horizontal layouts class HSpacer : Widget { this() { - styleId = "HSpacer"; + styleId = "HSPACER"; } + //override void measure(int parentWidth, int parentHeight) { + // measuredContent(parentWidth, parentHeight, 8, 8); + //} } /// static text widget @@ -291,6 +297,22 @@ class Button : Widget { focusable = true; trackHover = true; } + this(string ID, dstring label) { + super(ID); + _text = label; + styleId = "BUTTON"; + clickable = true; + focusable = true; + trackHover = true; + } + this(string ID, string labelResourceId) { + super(ID); + _text = labelResourceId; + styleId = "BUTTON"; + clickable = true; + focusable = true; + trackHover = true; + } override void measure(int parentWidth, int parentHeight) { FontRef font = font();