diff --git a/examples/example1/dub.json b/examples/example1/dub.json
index aa590aa6..9f9b6495 100644
--- a/examples/example1/dub.json
+++ b/examples/example1/dub.json
@@ -9,7 +9,7 @@
"targetType": "executable",
"targetName": "example1",
- "copyFiles": ["res"],
+ "stringImportPaths": ["views", "views/res", "views/res/i18n", "views/res/mdpi"],
"dependencies": {
"dlangui:dlanguilib": "*"
diff --git a/examples/example1/example1.visualdproj b/examples/example1/example1.visualdproj
index 88c93a22..5d641638 100644
--- a/examples/example1/example1.visualdproj
+++ b/examples/example1/example1.visualdproj
@@ -48,7 +48,7 @@
0
$(DMDInstallDir)windows\bin\dmd.exe
$(SolutionDir)/src $(SolutionDir)/3rdparty $(SolutionDir)/3rdparty/libpng/source $(SolutionDir)/../DerelictGL3/source $(SolutionDir)/../DerelictUtil/source $(SolutionDir)/../DerelictFT/source $(SolutionDir)/../DerelictSDL2/source $(SolutionDir)/../de_image/source/interfaces $(SolutionDir)/../de_image/source/png $(SolutionDir)/../dlib
-
+ views views/res views/res/i18n views/res/mdpi
$(ConfigurationName)
$(OutDir)
diff --git a/examples/example1/src/example1.d b/examples/example1/src/example1.d
index 38f62ada..1b1db13a 100644
--- a/examples/example1/src/example1.d
+++ b/examples/example1/src/example1.d
@@ -169,21 +169,25 @@ enum : int {
/// entry point for dlangui based application
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/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
- ];
-
+ // not required if only embedded resources are used
+ //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/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
- Platform.instance.resourceDirs = resourceDirs;
+ //Platform.instance.resourceDirs = resourceDirs;
+
+ // embed resources listed in views/resources.list into executable
+ embeddedResourceList.addResources(embedResourcesFromList!("resources.list")());
+
// select translation file - for english language
Platform.instance.uiLanguage = "en";
// load theme from file "theme_default.xml"
diff --git a/examples/example1/res/hdpi/document-close.png b/examples/example1/views/res/hdpi/document-close.png
similarity index 100%
rename from examples/example1/res/hdpi/document-close.png
rename to examples/example1/views/res/hdpi/document-close.png
diff --git a/examples/example1/res/hdpi/document-open-recent.png b/examples/example1/views/res/hdpi/document-open-recent.png
similarity index 100%
rename from examples/example1/res/hdpi/document-open-recent.png
rename to examples/example1/views/res/hdpi/document-open-recent.png
diff --git a/examples/example1/res/hdpi/document-open.png b/examples/example1/views/res/hdpi/document-open.png
similarity index 100%
rename from examples/example1/res/hdpi/document-open.png
rename to examples/example1/views/res/hdpi/document-open.png
diff --git a/examples/example1/res/hdpi/document-save-as.png b/examples/example1/views/res/hdpi/document-save-as.png
similarity index 100%
rename from examples/example1/res/hdpi/document-save-as.png
rename to examples/example1/views/res/hdpi/document-save-as.png
diff --git a/examples/example1/res/hdpi/document-save.png b/examples/example1/views/res/hdpi/document-save.png
similarity index 100%
rename from examples/example1/res/hdpi/document-save.png
rename to examples/example1/views/res/hdpi/document-save.png
diff --git a/examples/example1/res/hdpi/edit-clear.png b/examples/example1/views/res/hdpi/edit-clear.png
similarity index 100%
rename from examples/example1/res/hdpi/edit-clear.png
rename to examples/example1/views/res/hdpi/edit-clear.png
diff --git a/examples/example1/res/hdpi/edit-copy.png b/examples/example1/views/res/hdpi/edit-copy.png
similarity index 100%
rename from examples/example1/res/hdpi/edit-copy.png
rename to examples/example1/views/res/hdpi/edit-copy.png
diff --git a/examples/example1/res/hdpi/edit-cut.png b/examples/example1/views/res/hdpi/edit-cut.png
similarity index 100%
rename from examples/example1/res/hdpi/edit-cut.png
rename to examples/example1/views/res/hdpi/edit-cut.png
diff --git a/examples/example1/res/hdpi/edit-delete.png b/examples/example1/views/res/hdpi/edit-delete.png
similarity index 100%
rename from examples/example1/res/hdpi/edit-delete.png
rename to examples/example1/views/res/hdpi/edit-delete.png
diff --git a/examples/example1/res/hdpi/edit-paste.png b/examples/example1/views/res/hdpi/edit-paste.png
similarity index 100%
rename from examples/example1/res/hdpi/edit-paste.png
rename to examples/example1/views/res/hdpi/edit-paste.png
diff --git a/examples/example1/res/hdpi/edit-redo.png b/examples/example1/views/res/hdpi/edit-redo.png
similarity index 100%
rename from examples/example1/res/hdpi/edit-redo.png
rename to examples/example1/views/res/hdpi/edit-redo.png
diff --git a/examples/example1/res/hdpi/edit-undo.png b/examples/example1/views/res/hdpi/edit-undo.png
similarity index 100%
rename from examples/example1/res/hdpi/edit-undo.png
rename to examples/example1/views/res/hdpi/edit-undo.png
diff --git a/examples/example1/res/i18n/en.ini b/examples/example1/views/res/i18n/en.ini
similarity index 100%
rename from examples/example1/res/i18n/en.ini
rename to examples/example1/views/res/i18n/en.ini
diff --git a/examples/example1/res/i18n/ru.ini b/examples/example1/views/res/i18n/ru.ini
similarity index 100%
rename from examples/example1/res/i18n/ru.ini
rename to examples/example1/views/res/i18n/ru.ini
diff --git a/examples/example1/res/mdpi/cr3_logo.png b/examples/example1/views/res/mdpi/cr3_logo.png
similarity index 100%
rename from examples/example1/res/mdpi/cr3_logo.png
rename to examples/example1/views/res/mdpi/cr3_logo.png
diff --git a/examples/example1/res/mdpi/document-close.png b/examples/example1/views/res/mdpi/document-close.png
similarity index 100%
rename from examples/example1/res/mdpi/document-close.png
rename to examples/example1/views/res/mdpi/document-close.png
diff --git a/examples/example1/res/mdpi/document-open-recent.png b/examples/example1/views/res/mdpi/document-open-recent.png
similarity index 100%
rename from examples/example1/res/mdpi/document-open-recent.png
rename to examples/example1/views/res/mdpi/document-open-recent.png
diff --git a/examples/example1/res/mdpi/document-open.png b/examples/example1/views/res/mdpi/document-open.png
similarity index 100%
rename from examples/example1/res/mdpi/document-open.png
rename to examples/example1/views/res/mdpi/document-open.png
diff --git a/examples/example1/res/mdpi/document-properties.png b/examples/example1/views/res/mdpi/document-properties.png
similarity index 100%
rename from examples/example1/res/mdpi/document-properties.png
rename to examples/example1/views/res/mdpi/document-properties.png
diff --git a/examples/example1/res/mdpi/document-save-as.png b/examples/example1/views/res/mdpi/document-save-as.png
similarity index 100%
rename from examples/example1/res/mdpi/document-save-as.png
rename to examples/example1/views/res/mdpi/document-save-as.png
diff --git a/examples/example1/res/mdpi/document-save.png b/examples/example1/views/res/mdpi/document-save.png
similarity index 100%
rename from examples/example1/res/mdpi/document-save.png
rename to examples/example1/views/res/mdpi/document-save.png
diff --git a/examples/example1/res/mdpi/edit-copy.png b/examples/example1/views/res/mdpi/edit-copy.png
similarity index 100%
rename from examples/example1/res/mdpi/edit-copy.png
rename to examples/example1/views/res/mdpi/edit-copy.png
diff --git a/examples/example1/res/mdpi/edit-cut.png b/examples/example1/views/res/mdpi/edit-cut.png
similarity index 100%
rename from examples/example1/res/mdpi/edit-cut.png
rename to examples/example1/views/res/mdpi/edit-cut.png
diff --git a/examples/example1/res/mdpi/edit-paste.png b/examples/example1/views/res/mdpi/edit-paste.png
similarity index 100%
rename from examples/example1/res/mdpi/edit-paste.png
rename to examples/example1/views/res/mdpi/edit-paste.png
diff --git a/examples/example1/res/mdpi/edit-redo.png b/examples/example1/views/res/mdpi/edit-redo.png
similarity index 100%
rename from examples/example1/res/mdpi/edit-redo.png
rename to examples/example1/views/res/mdpi/edit-redo.png
diff --git a/examples/example1/res/mdpi/edit-undo.png b/examples/example1/views/res/mdpi/edit-undo.png
similarity index 100%
rename from examples/example1/res/mdpi/edit-undo.png
rename to examples/example1/views/res/mdpi/edit-undo.png
diff --git a/examples/example1/res/mdpi/tx_fabric.jpg b/examples/example1/views/res/mdpi/tx_fabric.jpg
similarity index 100%
rename from examples/example1/res/mdpi/tx_fabric.jpg
rename to examples/example1/views/res/mdpi/tx_fabric.jpg
diff --git a/examples/example1/res/theme_custom1.xml b/examples/example1/views/res/theme_custom1.xml
similarity index 100%
rename from examples/example1/res/theme_custom1.xml
rename to examples/example1/views/res/theme_custom1.xml
diff --git a/examples/example1/views/resources.list b/examples/example1/views/resources.list
new file mode 100644
index 00000000..a1ea75c8
--- /dev/null
+++ b/examples/example1/views/resources.list
@@ -0,0 +1,16 @@
+res/i18n/en.ini
+res/i18n/ru.ini
+res/mdpi/cr3_logo.png
+res/mdpi/document-close.png
+res/mdpi/document-open-recent.png
+res/mdpi/document-open.png
+res/mdpi/document-properties.png
+res/mdpi/document-save-as.png
+res/mdpi/document-save.png
+res/mdpi/edit-copy.png
+res/mdpi/edit-cut.png
+res/mdpi/edit-paste.png
+res/mdpi/edit-redo.png
+res/mdpi/edit-undo.png
+res/mdpi/tx_fabric.jpg
+res/theme_custom1.xml
diff --git a/examples/tetris/src/tetris.d b/examples/tetris/src/tetris.d
index 1a0a1ce7..564fc27a 100644
--- a/examples/tetris/src/tetris.d
+++ b/examples/tetris/src/tetris.d
@@ -28,22 +28,9 @@ extern (C) int UIAppMain(string[] args) {
//auto power2 = delegate(int X) { return X * X; };
auto power2 = (int X) => X * X;
- // 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/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
- ];
+ // embed resources listed in views/resources.list into executable
+ embeddedResourceList.addResources(embedResourcesFromList!("resources.list")());
- // setup resource directories - will use only existing directories
- Platform.instance.resourceDirs = resourceDirs;
// select translation file - for english language
Platform.instance.uiLanguage = "en";
// load theme from file "theme_default.xml"
diff --git a/examples/tetris/tetris.visualdproj b/examples/tetris/tetris.visualdproj
index 2f140968..924f10f9 100644
--- a/examples/tetris/tetris.visualdproj
+++ b/examples/tetris/tetris.visualdproj
@@ -48,7 +48,7 @@
0
$(DMDInstallDir)windows\bin\dmd.exe
$(SolutionDir)/src $(SolutionDir)/3rdparty $(SolutionDir)/3rdparty/libpng/source $(SolutionDir)/../DerelictGL3/source $(SolutionDir)/../DerelictUtil/source $(SolutionDir)/../DerelictFT/source $(SolutionDir)/../DerelictSDL2/source $(SolutionDir)/../de_image/source/interfaces $(SolutionDir)/../de_image/source/png $(SolutionDir)/../dlib
-
+ views views/res views/mdpi views/i18n
$(ConfigurationName)
$(OutDir)
@@ -89,7 +89,6 @@
$(OutDir)\$(ProjectName).exe
1
- 2
-profile
@@ -184,7 +183,6 @@
$(OutDir)\$(ProjectName).exe
1
- 1
@@ -192,7 +190,7 @@
-
+
diff --git a/examples/tetris/res/arrow-down.png b/examples/tetris/views/res/arrow-down.png
similarity index 100%
rename from examples/tetris/res/arrow-down.png
rename to examples/tetris/views/res/arrow-down.png
diff --git a/examples/tetris/res/arrow-left.png b/examples/tetris/views/res/arrow-left.png
similarity index 100%
rename from examples/tetris/res/arrow-left.png
rename to examples/tetris/views/res/arrow-left.png
diff --git a/examples/tetris/res/arrow-right.png b/examples/tetris/views/res/arrow-right.png
similarity index 100%
rename from examples/tetris/res/arrow-right.png
rename to examples/tetris/views/res/arrow-right.png
diff --git a/examples/tetris/res/dtetris-logo1.png b/examples/tetris/views/res/dtetris-logo1.png
similarity index 100%
rename from examples/tetris/res/dtetris-logo1.png
rename to examples/tetris/views/res/dtetris-logo1.png
diff --git a/examples/tetris/res/levelup.png b/examples/tetris/views/res/levelup.png
similarity index 100%
rename from examples/tetris/res/levelup.png
rename to examples/tetris/views/res/levelup.png
diff --git a/examples/tetris/res/pause.png b/examples/tetris/views/res/pause.png
similarity index 100%
rename from examples/tetris/res/pause.png
rename to examples/tetris/views/res/pause.png
diff --git a/examples/tetris/res/popup_background.9.png b/examples/tetris/views/res/popup_background.9.png
similarity index 100%
rename from examples/tetris/res/popup_background.9.png
rename to examples/tetris/views/res/popup_background.9.png
diff --git a/examples/tetris/res/rotate.png b/examples/tetris/views/res/rotate.png
similarity index 100%
rename from examples/tetris/res/rotate.png
rename to examples/tetris/views/res/rotate.png
diff --git a/examples/tetris/res/tetris_logo_big.png b/examples/tetris/views/res/tetris_logo_big.png
similarity index 100%
rename from examples/tetris/res/tetris_logo_big.png
rename to examples/tetris/views/res/tetris_logo_big.png
diff --git a/examples/tetris/res/tx_fabric.jpg b/examples/tetris/views/res/tx_fabric.jpg
similarity index 100%
rename from examples/tetris/res/tx_fabric.jpg
rename to examples/tetris/views/res/tx_fabric.jpg
diff --git a/examples/tetris/views/resources.list b/examples/tetris/views/resources.list
new file mode 100644
index 00000000..03c36c37
--- /dev/null
+++ b/examples/tetris/views/resources.list
@@ -0,0 +1,10 @@
+res/arrow-down.png
+res/arrow-left.png
+res/arrow-right.png
+res/dtetris-logo1.png
+res/levelup.png
+res/pause.png
+res/popup_background.9.png
+res/rotate.png
+res/tetris_logo_big.png
+res/tx_fabric.jpg
diff --git a/src/dlangui/core/i18n.d b/src/dlangui/core/i18n.d
index 239bbf0e..1ee09d57 100644
--- a/src/dlangui/core/i18n.d
+++ b/src/dlangui/core/i18n.d
@@ -63,9 +63,12 @@ module dlangui.core.i18n;
import dlangui.core.types;
import dlangui.core.logger;
import dlangui.core.files;
+import dlangui.graphics.resources;
private import dlangui.core.linestream;
private import std.utf;
private import std.algorithm;
+private import std.string;
+private import std.file;
/**
Container for UI string - either raw value or string resource ID
@@ -290,10 +293,22 @@ synchronized class UIStringTranslator {
if (ch == '/' || ch == '\\')
hasPathDelimiters = true;
string[] res;
- if (!hasPathDelimiters && _resourceDirs.length) {
- foreach (dir; _resourceDirs)
- res ~= dir ~ filename;
+ if (!hasPathDelimiters) {
+ string fn = EMBEDDED_RESOURCE_PREFIX ~ "std_" ~ filename;
+ string s = cast(string)loadResourceBytes(fn);
+ if (s)
+ res ~= fn;
+ fn = EMBEDDED_RESOURCE_PREFIX ~ filename;
+ s = cast(string)loadResourceBytes(fn);
+ if (s)
+ res ~= fn;
+ foreach (dir; _resourceDirs) {
+ fn = dir ~ filename;
+ if (exists(fn) && isFile(fn))
+ res ~= fn;
+ }
} else {
+ // full path
res ~= filename;
}
return res;
@@ -350,13 +365,9 @@ private shared class UIStringList {
return null;
}
/// load strings from stream
- bool load(std.stream.InputStream stream) {
- dlangui.core.linestream.LineStream lines = dlangui.core.linestream.LineStream.create(stream, "");
+ bool load(dstring[] lines) {
int count = 0;
- for (;;) {
- dchar[] s = lines.readLine();
- if (s is null)
- break;
+ foreach (s; lines) {
int eqpos = -1;
int firstNonspace = -1;
int lastNonspace = -1;
@@ -379,23 +390,33 @@ private shared class UIStringList {
return count > 0;
}
+ /// convert to utf32 and split by lines (detecting line endings)
+ static dstring[] splitLines(string src) {
+ dstring dsrc = toUTF32(src);
+ dstring[] split1 = split(dsrc, "\r\n");
+ dstring[] split2 = split(dsrc, "\r");
+ dstring[] split3 = split(dsrc, "\n");
+ if (split1.length >= split2.length && split1.length >= split3.length)
+ return split1;
+ if (split2.length > split3.length)
+ return split2;
+ return split3;
+ }
+
/// load strings from file (utf8, id=value lines)
bool load(string[] filenames) {
clear();
bool res = false;
foreach(filename; filenames) {
- import std.stream;
- import std.file;
try {
debug Log.d("Loading string resources from file ", filename);
- if (!exists(filename) || !isFile(filename)) {
- Log.e("File does not exist: ", filename);
+ string s = cast(string)loadResourceBytes(filename);
+ if (!s) {
+ Log.e("Cannot load i18n resource from file ", filename);
continue;
}
- std.stream.File f = new std.stream.File(filename);
- scope(exit) { f.close(); }
- res = load(f) || res;
- } catch (StreamFileException e) {
+ res = load(splitLines(s)) || res;
+ } catch (Exception e) {
Log.e("Cannot read string resources from file ", filename);
}
}
diff --git a/views/res/i18n/en.ini b/views/res/i18n/std_en.ini
similarity index 100%
rename from views/res/i18n/en.ini
rename to views/res/i18n/std_en.ini
diff --git a/views/res/i18n/ru.ini b/views/res/i18n/std_ru.ini
similarity index 100%
rename from views/res/i18n/ru.ini
rename to views/res/i18n/std_ru.ini
diff --git a/views/standard_resources.list b/views/standard_resources.list
index ca61059a..55abed7a 100644
--- a/views/standard_resources.list
+++ b/views/standard_resources.list
@@ -15,8 +15,8 @@ res/exit.png
res/fileclose.png
res/fileopen.png
res/frame_blue.9.png
-res/i18n/en.ini
-res/i18n/ru.ini
+res/i18n/std_en.ini
+res/i18n/std_ru.ini
res/list_item_background.xml
res/list_item_background_solid.xml
res/main_menu_item_background.xml