gui: make resources type safe

- add string, int, color and resource loading helpers
- use typed resource classes, and some cleanup in loading code
- remove abstract GetResource() to enforce type safe access
- add height and width query methods to resources and use them
- minor cleanup
- simplify LoadPlacement

Change-Id: I9b81785109a80b3806ad6b50cba4d893b87b0db1
This commit is contained in:
that
2015-02-14 20:23:16 +01:00
parent cfd6509027
commit f6ed8fc1f5
21 changed files with 254 additions and 407 deletions
+3 -5
View File
@@ -43,9 +43,7 @@ GUIAnimation::GUIAnimation(xml_node<>* node) : GUIObject(node)
child = node->first_node("resource");
if (child)
{
attr = child->first_attribute("name");
if (attr)
mAnimation = (AnimationResource*) PageManager::FindResource(attr->value());
mAnimation = LoadAttrAnimation(child, "name");
}
// Load the placement
@@ -77,8 +75,8 @@ GUIAnimation::GUIAnimation(xml_node<>* node) : GUIObject(node)
// Fetch the render sizes
if (mAnimation && mAnimation->GetResource())
{
mRenderW = gr_get_width(mAnimation->GetResource());
mRenderH = gr_get_height(mAnimation->GetResource());
mRenderW = mAnimation->GetWidth();
mRenderH = mAnimation->GetHeight();
// Adjust for placement
if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
+6 -13
View File
@@ -98,9 +98,7 @@ GUIButton::GUIButton(xml_node<>* node)
child = node->first_node("icon");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mButtonIcon = PageManager::FindResource(attr->value());
mButtonIcon = LoadAttrImage(child, "resource");
}
memset(&mHighlightColor, 0, sizeof(COLOR));
@@ -122,14 +120,13 @@ GUIButton::GUIButton(xml_node<>* node)
LoadPlacement(node->first_node("placement"), &x, &y, &w, &h, &TextPlacement);
}
SetRenderPos(x, y, w, h);
return;
}
GUIButton::~GUIButton()
{
if (mButtonImg) delete mButtonImg;
if (mButtonLabel) delete mButtonLabel;
if (mAction) delete mAction;
delete mButtonImg;
delete mButtonLabel;
delete mAction;
}
int GUIButton::Render(void)
@@ -221,12 +218,8 @@ int GUIButton::SetRenderPos(int x, int y, int w, int h)
mRenderH = h;
}
mIconW = 0; mIconH = 0;
if (mButtonIcon && mButtonIcon->GetResource())
{
mIconW = gr_get_width(mButtonIcon->GetResource());
mIconH = gr_get_height(mButtonIcon->GetResource());
}
mIconW = mButtonIcon->GetWidth();
mIconH = mButtonIcon->GetHeight();
mTextH = 0;
mTextW = 0;
+7 -16
View File
@@ -48,12 +48,8 @@ GUICheckbox::GUICheckbox(xml_node<>* node)
child = node->first_node("image");
if (child)
{
attr = child->first_attribute("checked");
if (attr)
mChecked = PageManager::FindResource(attr->value());
attr = child->first_attribute("unchecked");
if (attr)
mUnchecked = PageManager::FindResource(attr->value());
mChecked = LoadAttrImage(child, "checked");
mUnchecked = LoadAttrImage(child, "unchecked");
}
// Get the variable data
@@ -68,22 +64,17 @@ GUICheckbox::GUICheckbox(xml_node<>* node)
DataManager::SetValue(mVarName, attr->value());
}
mCheckW = 0; mCheckH = 0;
if (mChecked && mChecked->GetResource())
mCheckW = mChecked->GetWidth();
mCheckH = mChecked->GetHeight();
if (mCheckW == 0)
{
mCheckW = gr_get_width(mChecked->GetResource());
mCheckH = gr_get_height(mChecked->GetResource());
}
else if (mUnchecked && mUnchecked->GetResource())
{
mCheckW = gr_get_width(mUnchecked->GetResource());
mCheckH = gr_get_height(mUnchecked->GetResource());
mCheckW = mUnchecked->GetWidth();
mCheckH = mUnchecked->GetHeight();
}
int x, y, w, h;
mLabel->GetRenderPos(x, y, w, h);
SetRenderPos(x, y, 0, 0);
return;
}
GUICheckbox::~GUICheckbox()
+8 -27
View File
@@ -129,32 +129,15 @@ GUIConsole::GUIConsole(xml_node<>* node) : GUIObject(node)
child = node->first_node("font");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mFont = PageManager::FindResource(attr->value());
mFont = LoadAttrFont(child, "resource");
}
child = node->first_node("color");
if (child)
{
attr = child->first_attribute("foreground");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mForegroundColor);
}
attr = child->first_attribute("background");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mBackgroundColor);
}
attr = child->first_attribute("scroll");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mScrollColor);
}
mForegroundColor = LoadAttrColor(child, "foreground", mForegroundColor);
mBackgroundColor = LoadAttrColor(child, "background", mBackgroundColor);
mScrollColor = LoadAttrColor(child, "scroll", mScrollColor);
}
// Load the placement
@@ -166,21 +149,19 @@ GUIConsole::GUIConsole(xml_node<>* node) : GUIObject(node)
mSlideout = 1;
LoadPlacement(child, &mSlideoutX, &mSlideoutY);
attr = child->first_attribute("resource");
if (attr) mSlideoutImage = PageManager::FindResource(attr->value());
mSlideoutImage = LoadAttrImage(child, "resource");
if (mSlideoutImage && mSlideoutImage->GetResource())
{
mSlideoutW = gr_get_width(mSlideoutImage->GetResource());
mSlideoutH = gr_get_height(mSlideoutImage->GetResource());
mSlideoutW = mSlideoutImage->GetWidth();
mSlideoutH = mSlideoutImage->GetHeight();
}
}
}
mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
mFontHeight = mFont->GetHeight();
SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
SetRenderPos(mConsoleX, mConsoleY);
return;
}
int GUIConsole::RenderSlideout(void)
+6 -24
View File
@@ -40,7 +40,6 @@ GUIFileSelector::GUIFileSelector(xml_node<>* node) : GUIScrollList(node)
xml_attribute<>* attr;
xml_node<>* child;
int mIconWidth = 0, mIconHeight = 0, mFolderIconHeight = 0, mFileIconHeight = 0, mFolderIconWidth = 0, mFileIconWidth = 0;
mFolderIcon = mFileIcon = NULL;
mShowFolders = mShowFiles = mShowNavFolders = 1;
mUpdate = 0;
@@ -109,29 +108,12 @@ GUIFileSelector::GUIFileSelector(xml_node<>* node) : GUIScrollList(node)
// Get folder and file icons if present
child = node->first_node("icon");
if (child) {
attr = child->first_attribute("folder");
if (attr)
mFolderIcon = PageManager::FindResource(attr->value());
attr = child->first_attribute("file");
if (attr)
mFileIcon = PageManager::FindResource(attr->value());
mFolderIcon = LoadAttrImage(child, "folder");
mFileIcon = LoadAttrImage(child, "file");
}
if (mFolderIcon && mFolderIcon->GetResource()) {
mFolderIconWidth = gr_get_width(mFolderIcon->GetResource());
mFolderIconHeight = gr_get_height(mFolderIcon->GetResource());
if (mFolderIconHeight > mIconHeight)
mIconHeight = mFolderIconHeight;
mIconWidth = mFolderIconWidth;
}
if (mFileIcon && mFileIcon->GetResource()) {
mFileIconWidth = gr_get_width(mFileIcon->GetResource());
mFileIconHeight = gr_get_height(mFileIcon->GetResource());
if (mFileIconHeight > mIconHeight)
mIconHeight = mFileIconHeight;
if (mFileIconWidth > mIconWidth)
mIconWidth = mFileIconWidth;
}
SetMaxIconSize(mIconWidth, mIconHeight);
int iconWidth = std::max(mFolderIcon->GetWidth(), mFileIcon->GetWidth());
int iconHeight = std::max(mFolderIcon->GetHeight(), mFileIcon->GetHeight());
SetMaxIconSize(iconWidth, iconHeight);
// Fetch the file/folder list
std::string value;
@@ -318,7 +300,7 @@ size_t GUIFileSelector::GetItemCount()
return folderSize + fileSize;
}
int GUIFileSelector::GetListItem(size_t item_index, Resource*& icon, std::string &text)
int GUIFileSelector::GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
{
size_t folderSize = mShowFolders ? mFolderList.size() : 0;
size_t fileSize = mShowFiles ? mFileList.size() : 0;
+4 -10
View File
@@ -40,12 +40,8 @@ GUIImage::GUIImage(xml_node<>* node) : GUIObject(node)
child = node->first_node("image");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mImage = PageManager::FindResource(attr->value());
attr = child->first_attribute("highlightresource");
if (attr)
mHighlightImage = PageManager::FindResource(attr->value());
mImage = LoadAttrImage(child, "resource");
mHighlightImage = LoadAttrImage(child, "highlightresource");
}
// Load the placement
@@ -53,8 +49,8 @@ GUIImage::GUIImage(xml_node<>* node) : GUIObject(node)
if (mImage && mImage->GetResource())
{
mRenderW = gr_get_width(mImage->GetResource());
mRenderH = gr_get_height(mImage->GetResource());
mRenderW = mImage->GetWidth();
mRenderH = mImage->GetHeight();
// Adjust for placement
if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
@@ -73,8 +69,6 @@ GUIImage::GUIImage(xml_node<>* node) : GUIObject(node)
}
SetPlacement(TOP_LEFT);
}
return;
}
int GUIImage::Render(void)
+11 -28
View File
@@ -88,35 +88,21 @@ GUIInput::GUIInput(xml_node<>* node)
child = node->first_node("background");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mBackground = PageManager::FindResource(attr->value());
attr = child->first_attribute("color");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mBackgroundColor);
}
mBackground = LoadAttrImage(child, "resource");
mBackgroundColor = LoadAttrColor(child, "color", mBackgroundColor);
}
if (mBackground && mBackground->GetResource())
{
mBackgroundW = gr_get_width(mBackground->GetResource());
mBackgroundH = gr_get_height(mBackground->GetResource());
mBackgroundW = mBackground->GetWidth();
mBackgroundH = mBackground->GetHeight();
}
// Load the cursor color
child = node->first_node("cursor");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mCursor = PageManager::FindResource(attr->value());
attr = child->first_attribute("color");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mCursorColor);
}
mCursor = LoadAttrImage(child, "resource");
mCursorColor = LoadAttrColor(child, "color", mCursorColor);
attr = child->first_attribute("hasfocus");
if (attr)
{
@@ -132,15 +118,12 @@ GUIInput::GUIInput(xml_node<>* node)
}
DrawCursor = HasInputFocus;
// Load the font, and possibly override the color
// Load the font
child = node->first_node("font");
if (child)
{
attr = child->first_attribute("resource");
if (attr) {
mFont = PageManager::FindResource(attr->value());
mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
}
mFont = LoadAttrFont(child, "resource");
mFontHeight = mFont->GetHeight();
}
child = node->first_node("text");
@@ -213,8 +196,8 @@ GUIInput::GUIInput(xml_node<>* node)
GUIInput::~GUIInput()
{
if (mInputText) delete mInputText;
if (mAction) delete mAction;
delete mInputText;
delete mAction;
}
int GUIInput::HandleTextLocation(int x)
+3 -3
View File
@@ -102,7 +102,7 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node)
strcpy(resource, "resource1");
attr = child->first_attribute(resource);
while (attr && layoutindex < (MAX_KEYBOARD_LAYOUTS + 1)) {
keyboardImg[layoutindex - 1] = PageManager::FindResource(attr->value());
keyboardImg[layoutindex - 1] = LoadAttrImage(child, resource);
layoutindex++;
resource[8] = (char)(layoutindex + 48);
@@ -113,8 +113,8 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node)
// Check the first image to get height and width
if (keyboardImg[0] && keyboardImg[0]->GetResource())
{
KeyboardWidth = gr_get_width(keyboardImg[0]->GetResource());
KeyboardHeight = gr_get_height(keyboardImg[0]->GetResource());
KeyboardWidth = keyboardImg[0]->GetWidth();
KeyboardHeight = keyboardImg[0]->GetHeight();
}
// Load all of the layout maps
+6 -25
View File
@@ -34,36 +34,17 @@ GUIListBox::GUIListBox(xml_node<>* node) : GUIScrollList(node)
xml_attribute<>* attr;
xml_node<>* child;
mIconSelected = mIconUnselected = NULL;
int mSelectedIconWidth = 0, mSelectedIconHeight = 0, mUnselectedIconWidth = 0, mUnselectedIconHeight = 0, mIconWidth = 0, mIconHeight = 0;
mUpdate = 0;
// Get the icons, if any
child = node->first_node("icon");
if (child) {
attr = child->first_attribute("selected");
if (attr)
mIconSelected = PageManager::FindResource(attr->value());
attr = child->first_attribute("unselected");
if (attr)
mIconUnselected = PageManager::FindResource(attr->value());
mIconSelected = LoadAttrImage(child, "selected");
mIconUnselected = LoadAttrImage(child, "unselected");
}
if (mIconSelected && mIconSelected->GetResource()) {
mSelectedIconWidth = gr_get_width(mIconSelected->GetResource());
mSelectedIconHeight = gr_get_height(mIconSelected->GetResource());
if (mSelectedIconHeight > mIconHeight)
mIconHeight = mSelectedIconHeight;
mIconWidth = mSelectedIconWidth;
}
if (mIconUnselected && mIconUnselected->GetResource()) {
mUnselectedIconWidth = gr_get_width(mIconUnselected->GetResource());
mUnselectedIconHeight = gr_get_height(mIconUnselected->GetResource());
if (mUnselectedIconHeight > mIconHeight)
mIconHeight = mUnselectedIconHeight;
if (mUnselectedIconWidth > mIconWidth)
mIconWidth = mUnselectedIconWidth;
}
SetMaxIconSize(mIconWidth, mIconHeight);
int iconWidth = std::max(mIconSelected->GetWidth(), mIconUnselected->GetWidth());
int iconHeight = std::max(mIconSelected->GetHeight(), mIconUnselected->GetHeight());
SetMaxIconSize(iconWidth, iconHeight);
// Handle the result variable
child = node->first_node("data");
@@ -160,7 +141,7 @@ size_t GUIListBox::GetItemCount()
return mList.size();
}
int GUIListBox::GetListItem(size_t item_index, Resource*& icon, std::string &text)
int GUIListBox::GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
{
text = mList.at(item_index).displayName;
if (mList.at(item_index).selected)
+5 -12
View File
@@ -58,19 +58,12 @@ void MouseCursor::LoadData(xml_node<>* node)
child = node->first_node("background");
if(child)
{
attr = child->first_attribute("color");
if(attr)
ConvertStrToColor(attr->value(), &m_color);
attr = child->first_attribute("resource");
if(attr)
m_color = LoadAttrColor(child, "color", m_color);
m_image = LoadAttrImage(child, "resource");
if(m_image)
{
m_image = PageManager::FindResource(attr->value());
if(m_image)
{
mRenderW = gr_get_width(m_image->GetResource());
mRenderH = gr_get_height(m_image->GetResource());
}
mRenderW = m_image->GetWidth();
mRenderH = m_image->GetHeight();
}
}
+44 -42
View File
@@ -211,13 +211,12 @@ protected:
std::string mLastValue;
COLOR mColor;
COLOR mHighlightColor;
Resource* mFont;
FontResource* mFont;
int mIsStatic;
int mVarChanged;
int mFontHeight;
unsigned maxWidth;
unsigned charSkip;
bool hasHighlightColor;
protected:
std::string parseText(void);
@@ -242,8 +241,8 @@ public:
bool isHighlighted;
protected:
Resource* mImage;
Resource* mHighlightImage;
ImageResource* mImage;
ImageResource* mHighlightImage;
};
// GUIFill - Used for fill colors
@@ -402,8 +401,8 @@ protected:
request_show
};
Resource* mFont;
Resource* mSlideoutImage;
FontResource* mFont;
ImageResource* mSlideoutImage;
COLOR mForegroundColor;
COLOR mBackgroundColor;
COLOR mScrollColor;
@@ -453,7 +452,7 @@ public:
protected:
GUIImage* mButtonImg;
Resource* mButtonIcon;
ImageResource* mButtonIcon;
GUIText* mButtonLabel;
GUIAction* mAction;
int mTextX, mTextY, mTextW, mTextH;
@@ -491,8 +490,8 @@ public:
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
protected:
Resource* mChecked;
Resource* mUnchecked;
ImageResource* mChecked;
ImageResource* mUnchecked;
GUIText* mLabel;
int mTextX, mTextY;
int mCheckX, mCheckY, mCheckW, mCheckH;
@@ -501,12 +500,6 @@ protected:
std::string mVarName;
};
struct ScrollListData {
Resource* displayResource;
std::string displayName;
int list_index;
};
class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
{
public:
@@ -541,7 +534,7 @@ protected:
// get number of items
virtual size_t GetItemCount() { return 0; }
// get data for one item
virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text)
virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
{ icon = NULL; text = ""; return -1; }
// an item was selected
virtual void NotifySelect(size_t item_selected) {}
@@ -568,7 +561,7 @@ protected:
protected:
// Background
COLOR mBackgroundColor;
Resource* mBackground; // background image, if any, automatically centered
ImageResource* mBackground; // background image, if any, automatically centered
int mBackgroundW, mBackgroundH; // background width and height if using an image for the background
// Header
@@ -578,13 +571,13 @@ protected:
std::string mLastHeaderValue; // Header text after parsing variables
int mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
int mHeaderH; // actual header height including font, icon, padding, and separator heights
Resource* mHeaderIcon;
ImageResource* mHeaderIcon;
int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
int mHeaderSeparatorH; // Height of the separator between header and list items
COLOR mHeaderSeparatorColor; // color of the header separator
// Per-item layout
Resource* mFont;
FontResource* mFont;
COLOR mFontColor;
bool hasHighlightColor; // indicates if a hightlight color was set
bool hasFontHighlightColor; // indicates if the font hightlight color is set
@@ -633,7 +626,7 @@ public:
virtual void SetPageFocus(int inFocus);
virtual size_t GetItemCount();
virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text);
virtual void NotifySelect(size_t item_selected);
protected:
@@ -664,8 +657,8 @@ protected:
int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
int mShowNavFolders; // indicates if the list should include the "up a level" item and allow you to traverse folders (nav folders are disabled for the restore list, for instance)
static int mSortOrder; // must be static because it is used by the static function fileSort
Resource* mFolderIcon;
Resource* mFileIcon;
ImageResource* mFolderIcon;
ImageResource* mFileIcon;
bool updateFileList;
};
@@ -687,7 +680,7 @@ public:
virtual void SetPageFocus(int inFocus);
virtual size_t GetItemCount();
virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text);
virtual void NotifySelect(size_t item_selected);
protected:
@@ -701,8 +694,8 @@ protected:
std::vector<ListData> mList;
std::string mVariable;
std::string currentValue;
Resource* mIconSelected;
Resource* mIconUnselected;
ImageResource* mIconSelected;
ImageResource* mIconUnselected;
};
class GUIPartitionList : public GUIScrollList
@@ -723,7 +716,7 @@ public:
virtual void SetPageFocus(int inFocus);
virtual size_t GetItemCount();
virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
virtual int GetListItem(size_t item_index, ImageResource*& icon, std::string &text);
virtual void NotifySelect(size_t item_selected);
protected:
@@ -737,8 +730,8 @@ protected:
std::string selectedList;
std::string currentValue;
std::string mLastValue;
Resource* mIconSelected;
Resource* mIconUnselected;
ImageResource* mIconSelected;
ImageResource* mIconUnselected;
bool updateList;
};
@@ -785,8 +778,8 @@ public:
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
protected:
Resource* mEmptyBar;
Resource* mFullBar;
ImageResource* mEmptyBar;
ImageResource* mFullBar;
std::string mMinValVar;
std::string mMaxValVar;
std::string mCurValVar;
@@ -820,9 +813,9 @@ public:
protected:
GUIAction* sAction;
Resource* sSlider;
Resource* sSliderUsed;
Resource* sTouch;
ImageResource* sSlider;
ImageResource* sSliderUsed;
ImageResource* sTouch;
int sTouchW, sTouchH;
int sCurTouchX;
int sUpdate;
@@ -875,7 +868,7 @@ protected:
int revert_layout;
};
Resource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
ImageResource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
struct capslock_tracking_struct caps_tracking[MAX_KEYBOARD_LAYOUTS];
bool mRendered;
@@ -924,9 +917,9 @@ protected:
protected:
GUIText* mInputText;
GUIAction* mAction;
Resource* mBackground;
Resource* mCursor;
Resource* mFont;
ImageResource* mBackground;
ImageResource* mCursor;
FontResource* mFont;
std::string mText;
std::string mLastValue;
std::string mVariable;
@@ -1019,7 +1012,7 @@ protected:
float mValuePct;
std::string mMaxStr;
std::string mMinStr;
Resource *mFont;
FontResource *mFont;
GUIText* mLabel;
int mLabelW;
COLOR mTextColor;
@@ -1041,9 +1034,9 @@ protected:
bool mChangeOnDrag;
int mLineW;
bool mDragging;
Resource *mBackgroundImage;
Resource *mHandleImage;
Resource *mHandleHoverImage;
ImageResource *mBackgroundImage;
ImageResource *mHandleImage;
ImageResource *mHandleHoverImage;
};
class MouseCursor : public RenderObject
@@ -1067,11 +1060,20 @@ private:
bool m_moved;
float m_speedMultiplier;
COLOR m_color;
Resource *m_image;
ImageResource *m_image;
bool m_present;
};
// Helper APIs
std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
#endif // _OBJECTS_HEADER
+75 -33
View File
@@ -70,7 +70,7 @@ int ConvertStrToColor(std::string str, COLOR* color)
DataManager::GetValue(str, str);
// Look for some defaults
if (str == "black") return 0;
if (str == "black") return 0;
else if (str == "white") { color->red = color->green = color->blue = 255; return 0; }
else if (str == "red") { color->red = 255; return 0; }
else if (str == "green") { color->green = 255; return 0; }
@@ -103,52 +103,94 @@ int ConvertStrToColor(std::string str, COLOR* color)
}
// Helper APIs
std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue)
{
if (!element)
return defaultvalue;
xml_attribute<>* attr = element->first_attribute(attrname);
return attr ? attr->value() : defaultvalue;
}
int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue)
{
string value = LoadAttrString(element, attrname);
// resolve variables
DataManager::GetValue(value, value);
return value.empty() ? defaultvalue : atoi(value.c_str());
}
int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue)
{
return scale_theme_x(LoadAttrInt(element, attrname, defaultvalue));
}
int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue)
{
return scale_theme_y(LoadAttrInt(element, attrname, defaultvalue));
}
COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue)
{
string value = LoadAttrString(element, attrname);
// resolve variables
DataManager::GetValue(value, value);
COLOR ret = defaultvalue;
if (ConvertStrToColor(value, &ret) == 0)
return ret;
else
return defaultvalue;
}
FontResource* LoadAttrFont(xml_node<>* element, const char* attrname)
{
std::string name = LoadAttrString(element, attrname, "");
if (name.empty())
return NULL;
else
return (FontResource*) PageManager::FindResource(name);
// TODO: make resource lookup type-safe
}
ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname)
{
std::string name = LoadAttrString(element, attrname, "");
if (name.empty())
return NULL;
else
return (ImageResource*) PageManager::FindResource(name);
// TODO: make resource lookup type-safe
}
AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname)
{
std::string name = LoadAttrString(element, attrname, "");
if (name.empty())
return NULL;
else
return (AnimationResource*) PageManager::FindResource(name);
// TODO: make resource lookup type-safe
}
bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h /* = NULL */, RenderObject::Placement* placement /* = NULL */)
{
if (!node)
return false;
std::string value;
if (node->first_attribute("x"))
{
value = node->first_attribute("x")->value();
DataManager::GetValue(value, value);
*x = atol(value.c_str());
*x = scale_theme_x(*x);
*x += tw_x_offset;
}
*x = LoadAttrIntScaleX(node, "x") + tw_x_offset;
if (node->first_attribute("y"))
{
value = node->first_attribute("y")->value();
DataManager::GetValue(value, value);
*y = atol(value.c_str());
*y = scale_theme_y(*y);
*y += tw_y_offset;
}
*y = LoadAttrIntScaleY(node, "y") + tw_y_offset;
if (w && node->first_attribute("w"))
{
value = node->first_attribute("w")->value();
DataManager::GetValue(value, value);
*w = atol(value.c_str());
*w = scale_theme_x(*w);
}
*w = LoadAttrIntScaleX(node, "w");
if (h && node->first_attribute("h"))
{
value = node->first_attribute("h")->value();
DataManager::GetValue(value, value);
*h = atol(value.c_str());
*h = scale_theme_y(*h);
}
*h = LoadAttrIntScaleY(node, "h");
if (placement && node->first_attribute("placement"))
{
value = node->first_attribute("placement")->value();
DataManager::GetValue(value, value);
*placement = (RenderObject::Placement) atol(value.c_str());
}
*placement = (RenderObject::Placement) LoadAttrInt(node, "placement");
return true;
}
+5 -2
View File
@@ -17,12 +17,15 @@ enum TOUCH_STATE {
TOUCH_REPEAT = 4
};
typedef struct {
struct COLOR {
unsigned char red;
unsigned char green;
unsigned char blue;
unsigned char alpha;
} COLOR;
COLOR() : red(0), green(0), blue(0), alpha(0) {}
COLOR(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255)
: red(r), green(g), blue(b), alpha(a) {}
};
// Utility Functions
int ConvertStrToColor(std::string str, COLOR* color);
+6 -27
View File
@@ -35,7 +35,6 @@ GUIPartitionList::GUIPartitionList(xml_node<>* node) : GUIScrollList(node)
xml_attribute<>* attr;
xml_node<>* child;
int mIconWidth = 0, mIconHeight = 0, mSelectedIconHeight = 0, mSelectedIconWidth = 0, mUnselectedIconHeight = 0, mUnselectedIconWidth = 0;
mIconSelected = mIconUnselected = NULL;
mUpdate = 0;
updateList = false;
@@ -43,12 +42,8 @@ GUIPartitionList::GUIPartitionList(xml_node<>* node) : GUIScrollList(node)
child = node->first_node("icon");
if (child)
{
attr = child->first_attribute("selected");
if (attr)
mIconSelected = PageManager::FindResource(attr->value());
attr = child->first_attribute("unselected");
if (attr)
mIconUnselected = PageManager::FindResource(attr->value());
mIconSelected = LoadAttrImage(child, "selected");
mIconUnselected = LoadAttrImage(child, "unselected");
}
// Handle the result variable
@@ -63,25 +58,9 @@ GUIPartitionList::GUIPartitionList(xml_node<>* node) : GUIScrollList(node)
selectedList = attr->value();
}
if (mIconSelected && mIconSelected->GetResource())
{
mSelectedIconWidth = gr_get_width(mIconSelected->GetResource());
mSelectedIconHeight = gr_get_height(mIconSelected->GetResource());
if (mSelectedIconHeight > mIconHeight)
mIconHeight = mSelectedIconHeight;
mIconWidth = mSelectedIconWidth;
}
if (mIconUnselected && mIconUnselected->GetResource())
{
mUnselectedIconWidth = gr_get_width(mIconUnselected->GetResource());
mUnselectedIconHeight = gr_get_height(mIconUnselected->GetResource());
if (mUnselectedIconHeight > mIconHeight)
mIconHeight = mUnselectedIconHeight;
if (mUnselectedIconWidth > mIconWidth)
mIconWidth = mUnselectedIconWidth;
}
SetMaxIconSize(mIconWidth, mIconHeight);
int iconWidth = std::max(mIconSelected->GetWidth(), mIconUnselected->GetWidth());
int iconHeight = std::max(mIconSelected->GetHeight(), mIconUnselected->GetHeight());
SetMaxIconSize(iconWidth, iconHeight);
child = node->first_node("listtype");
if (child && (attr = child->first_attribute("name"))) {
@@ -218,7 +197,7 @@ size_t GUIPartitionList::GetItemCount()
return mList.size();
}
int GUIPartitionList::GetListItem(size_t item_index, Resource*& icon, std::string &text)
int GUIPartitionList::GetListItem(size_t item_index, ImageResource*& icon, std::string &text)
{
text = mList.at(item_index).Display_Name;
if (mList.at(item_index).selected)
+7 -22
View File
@@ -45,13 +45,8 @@ GUIProgressBar::GUIProgressBar(xml_node<>* node) : GUIObject(node)
child = node->first_node("resource");
if (child)
{
attr = child->first_attribute("empty");
if (attr)
mEmptyBar = PageManager::FindResource(attr->value());
attr = child->first_attribute("full");
if (attr)
mFullBar = PageManager::FindResource(attr->value());
mEmptyBar = LoadAttrImage(child, "empty");
mFullBar = LoadAttrImage(child, "full");
}
// Load the placement
@@ -61,23 +56,13 @@ GUIProgressBar::GUIProgressBar(xml_node<>* node) : GUIObject(node)
child = node->first_node("data");
if (child)
{
attr = child->first_attribute("min");
if (attr) mMinValVar = attr->value();
attr = child->first_attribute("max");
if (attr) mMaxValVar = attr->value();
attr = child->first_attribute("name");
if (attr) mCurValVar = attr->value();
mMinValVar = LoadAttrString(child, "min");
mMaxValVar = LoadAttrString(child, "max");
mCurValVar = LoadAttrString(child, "name");
}
if (mEmptyBar && mEmptyBar->GetResource())
{
mRenderW = gr_get_width(mEmptyBar->GetResource());
mRenderH = gr_get_height(mEmptyBar->GetResource());
}
return;
mRenderW = mEmptyBar->GetWidth();
mRenderH = mEmptyBar->GetHeight();
}
int GUIProgressBar::Render(void)
+2 -1
View File
@@ -314,7 +314,8 @@ void ResourceManager::LoadResources(xml_node<>* resList, ZipArchive* pZip)
{
LOGERR("Resource type (%s) not supported.\n", type.c_str());
}
if (res == NULL || res->GetResource() == NULL)
if (res == NULL || !res->loadedOK())
{
std::string res_name;
if (child->first_attribute("name"))
+17 -7
View File
@@ -17,8 +17,8 @@ public:
virtual ~Resource() {}
public:
virtual void* GetResource(void) = 0;
std::string GetName(void) { return mName; }
std::string GetName() { return mName; }
virtual bool loadedOK() = 0;
private:
std::string mName;
@@ -44,7 +44,10 @@ public:
virtual ~FontResource();
public:
virtual void* GetResource(void) { return mFont; }
void* GetResource() { return this ? mFont : NULL; }
int GetHeight() { return gr_getMaxFontHeight(this ? mFont : NULL); }
virtual bool loadedOK() { return mFont != NULL; }
protected:
void* mFont;
@@ -58,7 +61,11 @@ public:
virtual ~ImageResource();
public:
virtual void* GetResource(void) { return mSurface; }
gr_surface GetResource() { return this ? mSurface : NULL; }
int GetWidth() { return gr_get_width(this ? mSurface : NULL); }
int GetHeight() { return gr_get_height(this ? mSurface : NULL); }
virtual bool loadedOK() { return mSurface != NULL; }
protected:
gr_surface mSurface;
@@ -71,9 +78,12 @@ public:
virtual ~AnimationResource();
public:
virtual void* GetResource(void) { return mSurfaces.empty() ? NULL : mSurfaces.at(0); }
virtual void* GetResource(int entry) { return mSurfaces.empty() ? NULL : mSurfaces.at(entry); }
virtual int GetResourceCount(void) { return mSurfaces.size(); }
gr_surface GetResource() { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(0); }
gr_surface GetResource(int entry) { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(entry); }
int GetWidth() { return gr_get_width(this ? GetResource() : NULL); }
int GetHeight() { return gr_get_height(this ? GetResource() : NULL); }
int GetResourceCount() { return mSurfaces.size(); }
virtual bool loadedOK() { return !mSurfaces.empty(); }
protected:
std::vector<gr_surface> mSurfaces;
+14 -20
View File
@@ -41,7 +41,8 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
firstDisplayedItem = mItemSpacing = mFontHeight = mSeparatorH = y_offset = scrollingSpeed = 0;
maxIconWidth = maxIconHeight = mHeaderIconHeight = mHeaderIconWidth = 0;
mHeaderSeparatorH = mHeaderIsStatic = mHeaderH = actualItemHeight = 0;
mBackground = mFont = mHeaderIcon = NULL;
mBackground = mHeaderIcon = NULL;
mFont = NULL;
mBackgroundW = mBackgroundH = 0;
mFastScrollW = mFastScrollLineW = mFastScrollRectW = mFastScrollRectH = 0;
lastY = last2Y = fastScroll = 0;
@@ -63,9 +64,7 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
child = node->first_node("header");
if (child)
{
attr = child->first_attribute("icon");
if (attr)
mHeaderIcon = PageManager::FindResource(attr->value());
mHeaderIcon = LoadAttrImage(child, "icon");
attr = child->first_attribute("background");
if (attr)
@@ -119,9 +118,7 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
child = node->first_node("background");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mBackground = PageManager::FindResource(attr->value());
mBackground = LoadAttrImage(child, "resource");
attr = child->first_attribute("color");
if (attr)
{
@@ -140,9 +137,7 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
child = node->first_node("font");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mFont = PageManager::FindResource(attr->value());
mFont = LoadAttrFont(child, "resource");
attr = child->first_attribute("color");
if (attr)
@@ -229,13 +224,13 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
}
// Retrieve the line height
mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
mFontHeight = mFont->GetHeight();
mHeaderH = mFontHeight;
if (mHeaderIcon && mHeaderIcon->GetResource())
{
mHeaderIconWidth = gr_get_width(mHeaderIcon->GetResource());
mHeaderIconHeight = gr_get_height(mHeaderIcon->GetResource());
mHeaderIconWidth = mHeaderIcon->GetWidth();
mHeaderIconHeight = mHeaderIcon->GetHeight();
if (mHeaderIconHeight > mHeaderH)
mHeaderH = mHeaderIconHeight;
if (mHeaderIconWidth > maxIconWidth)
@@ -252,8 +247,8 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
if (mBackground && mBackground->GetResource())
{
mBackgroundW = gr_get_width(mBackground->GetResource());
mBackgroundH = gr_get_height(mBackground->GetResource());
mBackgroundW = mBackground->GetWidth();
mBackgroundH = mBackground->GetHeight();
}
}
@@ -349,7 +344,7 @@ int GUIScrollList::Render(void)
break;
// get item data
Resource* icon;
ImageResource* icon;
std::string label;
if (GetListItem(itemindex, icon, label))
break;
@@ -373,8 +368,8 @@ int GUIScrollList::Render(void)
}
if (icon && icon->GetResource()) {
int currentIconHeight = gr_get_height(icon->GetResource());
int currentIconWidth = gr_get_width(icon->GetResource());
int currentIconHeight = icon->GetHeight();
int currentIconWidth = icon->GetWidth();
int currentIconOffsetY = (int)((actualItemHeight - currentIconHeight) / 2);
int currentIconOffsetX = (maxIconWidth - currentIconWidth) / 2;
int rect_y = 0, image_y = (yPos + currentIconOffsetY);
@@ -405,11 +400,10 @@ int GUIScrollList::Render(void)
// Now, we need the header (icon + text)
yPos = mRenderY;
{
Resource* headerIcon;
int mIconOffsetX = 0;
// render the icon if it exists
headerIcon = mHeaderIcon;
ImageResource* headerIcon = mHeaderIcon;
if (headerIcon && headerIcon->GetResource())
{
gr_blit(headerIcon->GetResource(), 0, 0, mHeaderIconWidth, mHeaderIconHeight, mRenderX + ((mHeaderIconWidth - maxIconWidth) / 2), (yPos + (int)((mHeaderH - mHeaderIconHeight) / 2)));
+7 -18
View File
@@ -47,31 +47,20 @@ GUISlider::GUISlider(xml_node<>* node) : GUIObject(node)
child = node->first_node("resource");
if (child)
{
attr = child->first_attribute("base");
if (attr)
sSlider = PageManager::FindResource(attr->value());
attr = child->first_attribute("used");
if (attr)
sSliderUsed = PageManager::FindResource(attr->value());
attr = child->first_attribute("touch");
if (attr)
sTouch = PageManager::FindResource(attr->value());
sSlider = LoadAttrImage(child, "base");
sSliderUsed = LoadAttrImage(child, "used");
sTouch = LoadAttrImage(child, "touch");
}
// Load the placement
LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY);
if (sSlider && sSlider->GetResource())
{
mRenderW = gr_get_width(sSlider->GetResource());
mRenderH = gr_get_height(sSlider->GetResource());
}
mRenderW = sSlider->GetWidth();
mRenderH = sSlider->GetHeight();
if (sTouch && sTouch->GetResource())
{
sTouchW = gr_get_width(sTouch->GetResource()); // Width of the "touch image" that follows the touch (arrow)
sTouchH = gr_get_height(sTouch->GetResource()); // Height of the "touch image" that follows the touch (arrow)
sTouchW = sTouch->GetWidth(); // Width of the "touch image" that follows the touch (arrow)
sTouchH = sTouch->GetHeight(); // Height of the "touch image" that follows the touch (arrow)
}
//LOGINFO("mRenderW: %i mTouchW: %i\n", mRenderW, mTouchW);
+8 -24
View File
@@ -73,16 +73,8 @@ GUISliderValue::GUISliderValue(xml_node<>* node) : GUIObject(node)
child = node->first_node("font");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mFont = PageManager::FindResource(attr->value());
attr = child->first_attribute("color");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mTextColor);
}
mFont = LoadAttrFont(child, "resource");
mTextColor = LoadAttrColor(child, "color", mTextColor);
}
// Load the placement
@@ -103,17 +95,9 @@ GUISliderValue::GUISliderValue(xml_node<>* node) : GUIObject(node)
child = node->first_node("resource");
if (child)
{
attr = child->first_attribute("background");
if(attr)
mBackgroundImage = PageManager::FindResource(attr->value());
attr = child->first_attribute("handle");
if(attr)
mHandleImage = PageManager::FindResource(attr->value());
attr = child->first_attribute("handlehover");
if(attr)
mHandleHoverImage = PageManager::FindResource(attr->value());
mBackgroundImage = LoadAttrImage(child, "background");
mHandleImage = LoadAttrImage(child, "handle");
mHandleHoverImage = LoadAttrImage(child, "handlehover");
}
child = node->first_node("data");
@@ -199,7 +183,7 @@ GUISliderValue::GUISliderValue(xml_node<>* node) : GUIObject(node)
}
}
mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
mFontHeight = mFont->GetHeight();
if(mShowCurr)
{
@@ -277,8 +261,8 @@ int GUISliderValue::SetRenderPos(int x, int y, int w, int h)
if(mBackgroundImage && mBackgroundImage->GetResource())
{
mLineW = gr_get_width(mBackgroundImage->GetResource());
mLineH = gr_get_height(mBackgroundImage->GetResource());
mLineW = mBackgroundImage->GetWidth();
mLineH = mBackgroundImage->GetHeight();
}
else
mLineW = mRenderW - (mLinePadding * 2);
+10 -48
View File
@@ -28,9 +28,6 @@ extern "C" {
GUIText::GUIText(xml_node<>* node)
: GUIObject(node)
{
xml_attribute<>* attr;
xml_node<>* child;
mFont = NULL;
mIsStatic = 1;
mVarChanged = 0;
@@ -38,53 +35,21 @@ GUIText::GUIText(xml_node<>* node)
maxWidth = 0;
charSkip = 0;
isHighlighted = false;
hasHighlightColor = false;
if (!node)
return;
// Initialize color to solid black
memset(&mColor, 0, sizeof(COLOR));
mColor.alpha = 255;
memset(&mHighlightColor, 0, sizeof(COLOR));
mHighlightColor.alpha = 255;
attr = node->first_attribute("color");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mColor);
}
attr = node->first_attribute("highlightcolor");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mHighlightColor);
hasHighlightColor = true;
}
// Load colors
mColor = LoadAttrColor(node, "color", COLOR(0,0,0,255));
mHighlightColor = LoadAttrColor(node, "highlightcolor", mColor);
// Load the font, and possibly override the color
child = node->first_node("font");
xml_node<>* child = node->first_node("font");
if (child)
{
attr = child->first_attribute("resource");
if (attr)
mFont = PageManager::FindResource(attr->value());
attr = child->first_attribute("color");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mColor);
}
attr = child->first_attribute("highlightcolor");
if (attr)
{
std::string color = attr->value();
ConvertStrToColor(color, &mHighlightColor);
hasHighlightColor = true;
}
mFont = LoadAttrFont(child, "resource");
mColor = LoadAttrColor(child, "color", mColor);
mHighlightColor = LoadAttrColor(child, "highlightcolor", mColor);
}
// Load the placement
@@ -97,8 +62,7 @@ GUIText::GUIText(xml_node<>* node)
mLastValue = parseText();
if (mLastValue != mText) mIsStatic = 0;
mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL);
return;
mFontHeight = mFont->GetHeight();
}
int GUIText::Render(void)
@@ -107,13 +71,11 @@ int GUIText::Render(void)
return 0;
void* fontResource = NULL;
string displayValue;
if (mFont)
fontResource = mFont->GetResource();
mLastValue = parseText();
displayValue = mLastValue;
string displayValue = mLastValue;
if (charSkip)
displayValue.erase(0, charSkip);
@@ -138,7 +100,7 @@ int GUIText::Render(void)
y -= mFontHeight;
}
if (hasHighlightColor && isHighlighted)
if (isHighlighted)
gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha);
else
gr_color(mColor.red, mColor.green, mColor.blue, mColor.alpha);