Merge branch 'master' of github.com:buggins/dlangui

This commit is contained in:
Vadim Lopatin 2014-05-05 09:35:34 +04:00
commit b553a7e1d0
11 changed files with 238 additions and 64 deletions

View File

@ -188,8 +188,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

View File

@ -66,7 +66,7 @@
<debuglevel>0</debuglevel>
<debugids />
<versionlevel>0</versionlevel>
<versionids>Unicode USE_OPENGL USE_SDL</versionids>
<versionids>Unicode USE_SDL</versionids>
<dump_source>0</dump_source>
<mapverbosity>0</mapverbosity>
<createImplib>1</createImplib>
@ -217,14 +217,6 @@
<File path="..\DerelictGL3\source\derelict\opengl3\wgl.d" />
<File path="..\DerelictGL3\source\derelict\opengl3\wglext.d" />
</Folder>
<Folder name="DerelictUtil">
<File path="..\DerelictUtil\source\derelict\util\exception.d" />
<File path="..\DerelictUtil\source\derelict\util\loader.d" />
<File path="..\DerelictUtil\source\derelict\util\sharedlib.d" />
<File path="..\DerelictUtil\source\derelict\util\system.d" />
<File path="..\DerelictUtil\source\derelict\util\wintypes.d" />
<File path="..\DerelictUtil\source\derelict\util\xtypes.d" />
</Folder>
<Folder name="DerelictSDL2">
<File path="..\DerelictSDL2\source\derelict\sdl2\functions.d" />
<File path="..\DerelictSDL2\source\derelict\sdl2\image.d" />
@ -234,6 +226,14 @@
<File path="..\DerelictSDL2\source\derelict\sdl2\ttf.d" />
<File path="..\DerelictSDL2\source\derelict\sdl2\types.d" />
</Folder>
<Folder name="DerelictUtil">
<File path="..\DerelictUtil\source\derelict\util\exception.d" />
<File path="..\DerelictUtil\source\derelict\util\loader.d" />
<File path="..\DerelictUtil\source\derelict\util\sharedlib.d" />
<File path="..\DerelictUtil\source\derelict\util\system.d" />
<File path="..\DerelictUtil\source\derelict\util\wintypes.d" />
<File path="..\DerelictUtil\source\derelict\util\xtypes.d" />
</Folder>
<Folder name="gl3n">
<File path="..\gl3n\gl3n\aabb.d" />
<File path="..\gl3n\gl3n\frustum.d" />

View File

@ -66,7 +66,7 @@
<debuglevel>0</debuglevel>
<debugids />
<versionlevel>0</versionlevel>
<versionids>Unicode USE_OPENGL USE_SDL</versionids>
<versionids>Unicode USE_SDL</versionids>
<dump_source>0</dump_source>
<mapverbosity>3</mapverbosity>
<createImplib>0</createImplib>

View File

@ -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;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 469 B

View File

@ -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");
@ -49,22 +48,67 @@ version(USE_SDL) {
debug Log.d("Destroying SDL window");
if (_renderer)
SDL_DestroyRenderer(_renderer);
version(USE_OPENGL) {
if (_context)
SDL_GL_DeleteContext(_context);
}
if (_win)
SDL_DestroyWindow(_win);
}
version(USE_OPENGL) {
static private bool _gl3Reloaded = false;
private 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;
version(USE_OPENGL) {
if (_enableOpengl)
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;
}
_renderer = SDL_CreateRenderer(_win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (!_renderer) {
Log.e("SDL2: Failed to create renderer");
return false;
}
//windowCaption = _caption;
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 (!_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;
}
@ -75,7 +119,6 @@ version(USE_SDL) {
}
bool _derelictgl3Reloaded;
override void show() {
Log.d("SDLWindow.show()");
SDL_ShowWindow(_win);
@ -127,20 +170,35 @@ 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);
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.
//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);
@ -446,12 +504,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 +750,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 +766,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 +779,40 @@ 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;
}
version(USE_OPENGL) {
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);
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()) {
return 1;

View File

@ -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();