summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthat <github@that.at>2015-03-05 20:25:39 +0100
committerEthan Yonker <dees_troy@teamw.in>2015-03-11 13:38:37 +0100
commitb2e8f672f310276e7009895c0ac4e58fcfeb35ac (patch)
tree44efb3ac558764f7faa95e509d6e4f19477ea505
parentgui: allow specifying resource type in element name (diff)
downloadandroid_bootable_recovery-b2e8f672f310276e7009895c0ac4e58fcfeb35ac.tar
android_bootable_recovery-b2e8f672f310276e7009895c0ac4e58fcfeb35ac.tar.gz
android_bootable_recovery-b2e8f672f310276e7009895c0ac4e58fcfeb35ac.tar.bz2
android_bootable_recovery-b2e8f672f310276e7009895c0ac4e58fcfeb35ac.tar.lz
android_bootable_recovery-b2e8f672f310276e7009895c0ac4e58fcfeb35ac.tar.xz
android_bootable_recovery-b2e8f672f310276e7009895c0ac4e58fcfeb35ac.tar.zst
android_bootable_recovery-b2e8f672f310276e7009895c0ac4e58fcfeb35ac.zip
-rw-r--r--gui/gui.cpp22
-rw-r--r--gui/objects.hpp3
-rw-r--r--gui/resources.cpp25
-rw-r--r--gui/resources.hpp8
-rw-r--r--gui/text.cpp41
5 files changed, 39 insertions, 60 deletions
diff --git a/gui/gui.cpp b/gui/gui.cpp
index f3d31d7b3..cd6f45d08 100644
--- a/gui/gui.cpp
+++ b/gui/gui.cpp
@@ -729,35 +729,37 @@ int gui_changePackage(std::string newPackage)
return 0;
}
-std::string gui_parse_text(string inText)
+std::string gui_parse_text(std::string str)
{
- // Copied from std::string GUIText::parseText(void)
// This function parses text for DataManager values encompassed by %value% in the XML
- static int counter = 0;
- std::string str = inText;
+ // and string resources (%@resource_name%)
size_t pos = 0;
- size_t next = 0, end = 0;
while (1)
{
- next = str.find('%', pos);
+ size_t next = str.find('%', pos);
if (next == std::string::npos)
return str;
- end = str.find('%', next + 1);
+ size_t end = str.find('%', next + 1);
if (end == std::string::npos)
return str;
// We have a block of data
- std::string var = str.substr(next + 1,(end - next) - 1);
- str.erase(next,(end - next) + 1);
+ std::string var = str.substr(next + 1, (end - next) - 1);
+ str.erase(next, (end - next) + 1);
if (next + 1 == end)
str.insert(next, 1, '%');
else
{
std::string value;
- if (DataManager::GetValue(var, value) == 0)
+ if (var.size() > 0 && var[0] == '@') {
+ // this is a string resource ("%@string_name%")
+ value = PageManager::GetResources()->FindString(var.substr(1));
+ str.insert(next, value);
+ }
+ else if (DataManager::GetValue(var, value) == 0)
str.insert(next, value);
}
diff --git a/gui/objects.hpp b/gui/objects.hpp
index a86747afb..261141134 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -217,9 +217,6 @@ protected:
int mFontHeight;
unsigned maxWidth;
unsigned charSkip;
-
-protected:
- std::string parseText(void);
};
// GUIImage - Used for static image
diff --git a/gui/resources.cpp b/gui/resources.cpp
index 563dcc45c..dcd4ca8b0 100644
--- a/gui/resources.cpp
+++ b/gui/resources.cpp
@@ -4,22 +4,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <fcntl.h>
-#include <sys/reboot.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <time.h>
#include <unistd.h>
-#include <stdlib.h>
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
+#include "../minzip/Zip.h"
extern "C" {
#include "../twcommon.h"
#include "../minuitwrp/minui.h"
@@ -282,6 +274,14 @@ AnimationResource* ResourceManager::FindAnimation(const std::string& name) const
return NULL;
}
+std::string ResourceManager::FindString(const std::string& name) const
+{
+ std::map<std::string, std::string>::const_iterator it = mStrings.find(name);
+ if (it != mStrings.end())
+ return it->second;
+ return "[" + name + ("]");
+}
+
ResourceManager::ResourceManager()
{
}
@@ -339,6 +339,13 @@ void ResourceManager::LoadResources(xml_node<>* resList, ZipArchive* pZip)
delete res;
}
}
+ else if (type == "string")
+ {
+ if (xml_attribute<>* attr = child->first_attribute("name"))
+ mStrings[attr->value()] = child->value();
+ else
+ error = true;
+ }
else
{
LOGERR("Resource type (%s) not supported.\n", type.c_str());
diff --git a/gui/resources.hpp b/gui/resources.hpp
index 83fc7a537..0ce968427 100644
--- a/gui/resources.hpp
+++ b/gui/resources.hpp
@@ -3,7 +3,11 @@
#ifndef _RESOURCE_HEADER
#define _RESOURCE_HEADER
-#include "../minzip/Zip.h"
+#include <string>
+#include <vector>
+#include <map>
+
+struct ZipArchive;
extern "C" {
#include "../minuitwrp/minui.h"
@@ -94,11 +98,13 @@ public:
FontResource* FindFont(const std::string& name) const;
ImageResource* FindImage(const std::string& name) const;
AnimationResource* FindAnimation(const std::string& name) const;
+ std::string FindString(const std::string& name) const;
private:
std::vector<FontResource*> mFonts;
std::vector<ImageResource*> mImages;
std::vector<AnimationResource*> mAnimations;
+ std::map<std::string, std::string> mStrings;
};
#endif // _RESOURCE_HEADER
diff --git a/gui/text.cpp b/gui/text.cpp
index 3487f7a82..effb9359b 100644
--- a/gui/text.cpp
+++ b/gui/text.cpp
@@ -55,7 +55,7 @@ GUIText::GUIText(xml_node<>* node)
if (child) mText = child->value();
// Simple way to check for static state
- mLastValue = parseText();
+ mLastValue = gui_parse_text(mText);
if (mLastValue != mText) mIsStatic = 0;
mFontHeight = mFont->GetHeight();
@@ -70,7 +70,7 @@ int GUIText::Render(void)
if (mFont)
fontResource = mFont->GetResource();
- mLastValue = parseText();
+ mLastValue = gui_parse_text(mText);
string displayValue = mLastValue;
if (charSkip)
@@ -126,7 +126,7 @@ int GUIText::Update(void)
if (mIsStatic || !mVarChanged)
return 0;
- std::string newValue = parseText();
+ std::string newValue = gui_parse_text(mText);
if (mLastValue == newValue)
return 0;
else
@@ -142,44 +142,11 @@ int GUIText::GetCurrentBounds(int& w, int& h)
fontResource = mFont->GetResource();
h = mFontHeight;
- mLastValue = parseText();
+ mLastValue = gui_parse_text(mText);
w = gr_measureEx(mLastValue.c_str(), fontResource);
return 0;
}
-std::string GUIText::parseText(void)
-{
- static int counter = 0;
- std::string str = mText;
- size_t pos = 0;
- size_t next = 0, end = 0;
-
- while (1)
- {
- next = str.find('%', pos);
- if (next == std::string::npos) return str;
- end = str.find('%', next + 1);
- if (end == std::string::npos) return str;
-
- // We have a block of data
- std::string var = str.substr(next + 1, (end - next) - 1);
- str.erase(next, (end - next) + 1);
-
- if (next + 1 == end)
- {
- str.insert(next, 1, '%');
- }
- else
- {
- std::string value;
- if (DataManager::GetValue(var, value) == 0)
- str.insert(next, value);
- }
-
- pos = next + 1;
- }
-}
-
int GUIText::NotifyVarChange(const std::string& varName, const std::string& value)
{
GUIObject::NotifyVarChange(varName, value);