Merge branch 'v0.7-dev' of https://github.com/Creepsky/TGUI into v0.7-dev
commit
d4ff94fd04
|
@ -33,17 +33,30 @@
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
namespace tgui
|
namespace tgui
|
||||||
{
|
{
|
||||||
class Texture;
|
class Texture;
|
||||||
|
class ImageLoader;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class TGUI_API TextureManager
|
class TGUI_API TextureManager
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Sets the imageloader.
|
||||||
|
///
|
||||||
|
/// @param imageLoader An instance of the new imageloader.
|
||||||
|
///
|
||||||
|
/// If the new imageloader is a nullptr, nothing is done.
|
||||||
|
///
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
static void setImageLoader(std::shared_ptr<ImageLoader> imageLoader);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -113,9 +126,39 @@ namespace tgui
|
||||||
};
|
};
|
||||||
|
|
||||||
std::map<std::string, ImageMapData> m_imageMap;
|
std::map<std::string, ImageMapData> m_imageMap;
|
||||||
|
static std::shared_ptr<ImageLoader> m_imageLoader;
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Imageloader
|
||||||
|
///
|
||||||
|
/// A virtual class for loading images on different ways.
|
||||||
|
/// It is mainly used by the texturemanager.
|
||||||
|
///
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
class TGUI_API ImageLoader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ImageLoader() = default;
|
||||||
|
virtual ~ImageLoader() = default;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Loads an image.
|
||||||
|
///
|
||||||
|
/// @param filename The name of the filename to load.
|
||||||
|
/// @param image The image instance, which will be loaded.
|
||||||
|
///
|
||||||
|
/// A virtual function to load an desired image.
|
||||||
|
/// How and where the image is loaded fully depends on implementation.
|
||||||
|
/// The standard-implementations simply loads the file from harddrive.
|
||||||
|
///
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
virtual bool load(const std::string& filename, sf::Image& image);
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
|
|
||||||
namespace tgui
|
namespace tgui
|
||||||
{
|
{
|
||||||
|
class ThemeFileLoader;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @internal
|
/// @internal
|
||||||
// Reads the theme files that are used to load widgets.
|
// Reads the theme files that are used to load widgets.
|
||||||
|
@ -42,7 +44,6 @@ namespace tgui
|
||||||
class TGUI_API ThemeFileParser
|
class TGUI_API ThemeFileParser
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Cpen and read the properties inside a section of the given file.
|
// Cpen and read the properties inside a section of the given file.
|
||||||
// An exception will be thrown when the file could not be opened or when the section could not be read.
|
// An exception will be thrown when the file could not be opened or when the section could not be read.
|
||||||
|
@ -72,6 +73,15 @@ namespace tgui
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
static void flushCache();
|
static void flushCache();
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Sets the fileloader.
|
||||||
|
///
|
||||||
|
/// @param imageLoader An instance of the new fileloader.
|
||||||
|
///
|
||||||
|
/// If the new fileloader is a nullptr, nothing is done.
|
||||||
|
///
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
static void setFileLoader(std::shared_ptr<ThemeFileLoader> fileloader);
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
private:
|
private:
|
||||||
|
@ -95,11 +105,40 @@ namespace tgui
|
||||||
std::string m_section;
|
std::string m_section;
|
||||||
std::vector<std::pair<std::string, std::string>> m_properties;
|
std::vector<std::pair<std::string, std::string>> m_properties;
|
||||||
|
|
||||||
|
static std::shared_ptr<ThemeFileLoader> m_themeFileLoader;
|
||||||
static std::map<std::string, std::map<std::string, std::vector<std::pair<std::string, std::string>>>> m_cache;
|
static std::map<std::string, std::map<std::string, std::vector<std::pair<std::string, std::string>>>> m_cache;
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Theme-File-Loader
|
||||||
|
///
|
||||||
|
/// A virtual class for loading theme-files on different ways.
|
||||||
|
/// It is mainly used by the ThemeFileParser.
|
||||||
|
///
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
class TGUI_API ThemeFileLoader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ThemeFileLoader() = default;
|
||||||
|
virtual ~ThemeFileLoader() = default;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Loads a theme-file.
|
||||||
|
///
|
||||||
|
/// @param filename The name of the filename to load.
|
||||||
|
/// @param content The std::stringstream instance, in which the content of the file will be loaded.
|
||||||
|
///
|
||||||
|
/// A virtual function to load an desired theme-file.
|
||||||
|
/// How and where the theme-file is loaded fully depends on implementation.
|
||||||
|
/// The standard-implementations simply loads the file from harddrive.
|
||||||
|
///
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
virtual void load(const std::string& filename, std::stringstream& content);
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -31,6 +31,10 @@
|
||||||
|
|
||||||
namespace tgui
|
namespace tgui
|
||||||
{
|
{
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::shared_ptr<ImageLoader> TextureManager::m_imageLoader = std::make_shared<ImageLoader>();
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void TextureManager::getTexture(Texture& texture, const std::string& filename, const sf::IntRect& partRect, const sf::IntRect& middleRect, bool repeated)
|
void TextureManager::getTexture(Texture& texture, const std::string& filename, const sf::IntRect& partRect, const sf::IntRect& middleRect, bool repeated)
|
||||||
|
@ -70,7 +74,7 @@ namespace tgui
|
||||||
data.image = &imageIt->second.image;
|
data.image = &imageIt->second.image;
|
||||||
|
|
||||||
// Load the image
|
// Load the image
|
||||||
if (data.image->loadFromFile(filename))
|
if (m_imageLoader->load(filename, *data.image))
|
||||||
{
|
{
|
||||||
// Create a texture from the image
|
// Create a texture from the image
|
||||||
bool success;
|
bool success;
|
||||||
|
@ -160,6 +164,20 @@ namespace tgui
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void TextureManager::setImageLoader(std::shared_ptr<ImageLoader> imageLoader)
|
||||||
|
{
|
||||||
|
if (imageLoader != nullptr)
|
||||||
|
m_imageLoader = imageLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool ImageLoader::load(const std::string& filename, sf::Image& image)
|
||||||
|
{
|
||||||
|
return image.loadFromFile(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
namespace tgui
|
namespace tgui
|
||||||
{
|
{
|
||||||
std::map<std::string, std::map<std::string, std::vector<std::pair<std::string, std::string>>>> ThemeFileParser::m_cache;
|
std::map<std::string, std::map<std::string, std::vector<std::pair<std::string, std::string>>>> ThemeFileParser::m_cache;
|
||||||
|
std::shared_ptr<ThemeFileLoader> ThemeFileParser::m_themeFileLoader = std::make_shared<ThemeFileLoader>();
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -67,7 +68,7 @@ namespace tgui
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -81,53 +82,9 @@ namespace tgui
|
||||||
// The file may be cached
|
// The file may be cached
|
||||||
if (m_cache.find(m_filename) == m_cache.end())
|
if (m_cache.find(m_filename) == m_cache.end())
|
||||||
{
|
{
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
m_themeFileLoader->load(filename, fileContents);
|
||||||
// If the file does not start with a slash then load it from the assets
|
|
||||||
if (!filename.empty() && (filename[0] != '/'))
|
|
||||||
{
|
|
||||||
/// TODO: Workaround until SFML makes native activity publically accessible
|
|
||||||
/// When this happens, extra SFML folder in include can be removed as well.
|
|
||||||
ANativeActivity* activity = sf::priv::getActivity(NULL)->activity;
|
|
||||||
|
|
||||||
JNIEnv* env = 0;
|
std::string sectionName;
|
||||||
activity->vm->AttachCurrentThread(&env, NULL);
|
|
||||||
jclass clazz = env->GetObjectClass(activity->clazz);
|
|
||||||
|
|
||||||
jmethodID methodID = env->GetMethodID(clazz, "getAssets", "()Landroid/content/res/AssetManager;");
|
|
||||||
jobject assetManagerObject = env->CallObjectMethod(activity->clazz, methodID);
|
|
||||||
jobject globalAssetManagerRef = env->NewGlobalRef(assetManagerObject);
|
|
||||||
AAssetManager* assetManager = AAssetManager_fromJava(env, globalAssetManagerRef);
|
|
||||||
assert(assetManager);
|
|
||||||
|
|
||||||
AAsset* asset = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_UNKNOWN);
|
|
||||||
if (!asset)
|
|
||||||
throw Exception{"Failed to open theme file '" + filename + "' from assets."};
|
|
||||||
|
|
||||||
off_t assetLength = AAsset_getLength(asset);
|
|
||||||
|
|
||||||
char* buffer = new char[assetLength + 1];
|
|
||||||
AAsset_read(asset, buffer, assetLength);
|
|
||||||
buffer[assetLength] = 0;
|
|
||||||
|
|
||||||
fileContents << buffer;
|
|
||||||
|
|
||||||
AAsset_close(asset);
|
|
||||||
delete[] buffer;
|
|
||||||
|
|
||||||
activity->vm->DetachCurrentThread();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
std::ifstream file{filename};
|
|
||||||
if (!file.is_open())
|
|
||||||
throw Exception{"Failed to open theme file '" + filename + "'."};
|
|
||||||
|
|
||||||
fileContents << file.rdbuf();
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string sectionName;
|
|
||||||
unsigned int lineNumber = 0;
|
unsigned int lineNumber = 0;
|
||||||
|
|
||||||
// Stop reading when we reach the end of the file
|
// Stop reading when we reach the end of the file
|
||||||
|
@ -236,7 +193,66 @@ namespace tgui
|
||||||
m_cache.clear();
|
m_cache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThemeFileParser::setFileLoader(std::shared_ptr<ThemeFileLoader> fileloader)
|
||||||
|
{
|
||||||
|
if (fileloader != nullptr)
|
||||||
|
m_themeFileLoader = fileloader;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void ThemeFileLoader::load(const std::string& filename, std::stringstream& content)
|
||||||
|
{
|
||||||
|
content.clear();
|
||||||
|
|
||||||
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
// If the file does not start with a slash then load it from the assets
|
||||||
|
if (!filename.empty() && (filename[0] != '/'))
|
||||||
|
{
|
||||||
|
/// TODO: Workaround until SFML makes native activity publically accessible
|
||||||
|
/// When this happens, extra SFML folder in include can be removed as well.
|
||||||
|
ANativeActivity* activity = sf::priv::getActivity(NULL)->activity;
|
||||||
|
|
||||||
|
JNIEnv* env = 0;
|
||||||
|
activity->vm->AttachCurrentThread(&env, NULL);
|
||||||
|
jclass clazz = env->GetObjectClass(activity->clazz);
|
||||||
|
|
||||||
|
jmethodID methodID = env->GetMethodID(clazz, "getAssets", "()Landroid/content/res/AssetManager;");
|
||||||
|
jobject assetManagerObject = env->CallObjectMethod(activity->clazz, methodID);
|
||||||
|
jobject globalAssetManagerRef = env->NewGlobalRef(assetManagerObject);
|
||||||
|
AAssetManager* assetManager = AAssetManager_fromJava(env, globalAssetManagerRef);
|
||||||
|
assert(assetManager);
|
||||||
|
|
||||||
|
AAsset* asset = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_UNKNOWN);
|
||||||
|
if (!asset)
|
||||||
|
throw Exception{ "Failed to open theme file '" + filename + "' from assets." };
|
||||||
|
|
||||||
|
off_t assetLength = AAsset_getLength(asset);
|
||||||
|
|
||||||
|
char* buffer = new char[assetLength + 1];
|
||||||
|
AAsset_read(asset, buffer, assetLength);
|
||||||
|
buffer[assetLength] = 0;
|
||||||
|
|
||||||
|
content << buffer;
|
||||||
|
|
||||||
|
AAsset_close(asset);
|
||||||
|
delete[] buffer;
|
||||||
|
|
||||||
|
activity->vm->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
std::ifstream file{ filename };
|
||||||
|
if (!file.is_open())
|
||||||
|
throw Exception{ "Failed to open theme file '" + filename + "'." };
|
||||||
|
|
||||||
|
content << file.rdbuf();
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue