Index: source/gui/CGUISetting.h =================================================================== --- source/gui/CGUISetting.h +++ source/gui/CGUISetting.h @@ -55,7 +55,11 @@ public: NONCOPYABLE(CGUISetting); - CGUISetting(IGUIObject& pObject, const CStr& Name); + template + CGUISetting(IGUIObject& pObject, const CStr& Name, Args&&... args) + : m_pSetting(T(std::move(args)...)), m_Name(Name), m_pObject(pObject) + { + } /** * Parses the given string and assigns to the setting value. Used for parsing XML attributes. Index: source/gui/CGUISetting.cpp =================================================================== --- source/gui/CGUISetting.cpp +++ source/gui/CGUISetting.cpp @@ -22,12 +22,6 @@ #include "gui/GUI.h" template -CGUISetting::CGUISetting(IGUIObject& pObject, const CStr& Name) - : m_pSetting(T()), m_Name(Name), m_pObject(pObject) -{ -} - -template bool CGUISetting::FromString(const CStrW& Value, const bool SendMessage) { T settingValue; Index: source/gui/CList.cpp =================================================================== --- source/gui/CList.cpp +++ source/gui/CList.cpp @@ -42,9 +42,9 @@ AddSetting("text_align"); AddSetting("textcolor"); AddSetting("textcolor_selected"); - AddSetting("selected"); // Index selected. -1 is none. + AddSetting("selected", -1); // Index selected. -1 is none. AddSetting("auto_scroll"); - AddSetting("hovered"); + AddSetting("hovered", -1); AddSetting("tooltip"); AddSetting("tooltip_style"); @@ -52,11 +52,6 @@ AddSetting("list"); AddSetting("list_data"); - SetSetting("scrollbar", false, true); - SetSetting("selected", -1, true); - SetSetting("hovered", -1, true); - SetSetting("auto_scroll", false, true); - // Add scroll-bar CGUIScrollBarVertical* bar = new CGUIScrollBarVertical(pGUI); bar->SetRightAligned(true); Index: source/gui/COList.cpp =================================================================== --- source/gui/COList.cpp +++ source/gui/COList.cpp @@ -270,8 +270,7 @@ } AddSetting("list_" + column.m_Id); - AddSetting("hidden_" + column.m_Id); - SetSetting("hidden_" + column.m_Id, hidden, true); + AddSetting("hidden_" + column.m_Id, hidden); m_Columns.emplace_back(std::move(column)); Index: source/gui/CText.cpp =================================================================== --- source/gui/CText.cpp +++ source/gui/CText.cpp @@ -29,7 +29,7 @@ AddSetting("buffer_zone"); AddSetting("caption"); AddSetting("cell_id"); - AddSetting("clip"); + AddSetting("clip", true); AddSetting("font"); AddSetting("scrollbar"); AddSetting("scrollbar_style"); @@ -48,8 +48,6 @@ AddSetting("_icon_tooltip_style"); //SetSetting("ghost", true, true); - SetSetting("scrollbar", false, true); - SetSetting("clip", true, true); // Add scroll-bar CGUIScrollBarVertical* bar = new CGUIScrollBarVertical(pGUI); Index: source/gui/CTooltip.cpp =================================================================== --- source/gui/CTooltip.cpp +++ source/gui/CTooltip.cpp @@ -30,12 +30,12 @@ AddSetting("caption"); AddSetting("font"); AddSetting("sprite"); - AddSetting("delay"); // in milliseconds + AddSetting("delay", 500); // in milliseconds AddSetting("textcolor"); AddSetting("maxwidth"); AddSetting("offset"); - AddSetting("anchor"); - AddSetting("text_align"); + AddSetting("anchor", EVAlign_Bottom); + AddSetting("text_align", EAlign_Left); // This is used for tooltips that are hidden/revealed manually by scripts, rather than through the standard tooltip display mechanism AddSetting("independent"); @@ -47,11 +47,6 @@ // This is set by GUITooltip AddSetting("_mousepos"); - // Defaults - SetSetting("delay", 500, true); - SetSetting("anchor", EVAlign_Bottom, true); - SetSetting("text_align", EAlign_Left, true); - // Set up a blank piece of text, to be replaced with a more // interesting message later AddText(); Index: source/gui/IGUIObject.h =================================================================== --- source/gui/IGUIObject.h +++ source/gui/IGUIObject.h @@ -240,10 +240,11 @@ /** * Add a setting to m_Settings * - * @param Type Setting type * @param Name Setting reference name + * @param args Arguments forwarded to the constructor of T */ - template void AddSetting(const CStr& Name); + template + void AddSetting(const CStr& Name, Args&& ...args); /** * Calls Destroy on all children, and deallocates all memory. Index: source/gui/IGUIObject.cpp =================================================================== --- source/gui/IGUIObject.cpp +++ source/gui/IGUIObject.cpp @@ -31,23 +31,17 @@ IGUIObject::IGUIObject(CGUI& pGUI) : m_pGUI(pGUI), m_pParent(NULL), m_MouseHovering(false), m_LastClickTime() { - AddSetting("enabled"); + AddSetting("enabled", true); AddSetting("hidden"); AddSetting("size"); AddSetting("style"); AddSetting("hotkey"); AddSetting("z"); - AddSetting("absolute"); + AddSetting("absolute", true); AddSetting("ghost"); AddSetting("aspectratio"); AddSetting("tooltip"); AddSetting("tooltip_style"); - - // Setup important defaults - SetSetting("hidden", false, true); - SetSetting("ghost", false, true); - SetSetting("enabled", true, true); - SetSetting("absolute", true, true); } IGUIObject::~IGUIObject() @@ -119,14 +113,14 @@ // Is there anything besides the children to destroy? } -template -void IGUIObject::AddSetting(const CStr& Name) +template +void IGUIObject::AddSetting(const CStr& Name, Args&& ...args) { // This can happen due to inheritance if (SettingExists(Name)) return; - m_Settings[Name] = new CGUISetting(*this, Name); + m_Settings[Name] = new CGUISetting(*this, Name, std::forward(args)...); } bool IGUIObject::SettingExists(const CStr& Setting) const @@ -516,6 +510,7 @@ // These functions avoid copies by working with a reference and move semantics. #define TYPE(T) \ template void IGUIObject::AddSetting(const CStr& Name); \ + template void IGUIObject::AddSetting(const CStr& Name, T&& initialValue); \ template T& IGUIObject::GetSetting(const CStr& Setting); \ template const T& IGUIObject::GetSetting(const CStr& Setting) const; \ template void IGUIObject::SetSetting(const CStr& Setting, T& Value, const bool SendMessage); \