CmHString.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "CmPrerequisitesUtil.h"
  2. #include "CmHString.h"
  3. #include "CmStringTable.h"
  4. namespace CamelotFramework
  5. {
  6. HString::StringData::StringData()
  7. :mParameters(nullptr), mIsDirty(true)
  8. { }
  9. HString::StringData::~StringData()
  10. {
  11. mUpdateConn.disconnect();
  12. if(mParameters != nullptr)
  13. cm_deleteN(mParameters, mStringData->numParameters);
  14. }
  15. HString::HString()
  16. {
  17. mData = cm_shared_ptr<StringData>();
  18. mData->mStringData = &StringTable::instance().getStringData(L"");
  19. mData->mParameters = cm_newN<WString>(mData->mStringData->numParameters);
  20. mData->mUpdateConn = mData->mStringData->commonData->onStringDataModified.connect(boost::bind(&HString::updateString, this));
  21. }
  22. HString::HString(const WString& identifierString)
  23. {
  24. mData = cm_shared_ptr<StringData>();
  25. mData->mStringData = &StringTable::instance().getStringData(identifierString);
  26. mData->mParameters = cm_newN<WString>(mData->mStringData->numParameters);
  27. mData->mUpdateConn = mData->mStringData->commonData->onStringDataModified.connect(boost::bind(&HString::updateString, this));
  28. }
  29. HString::HString(const HString& copy)
  30. {
  31. mData = copy.mData;
  32. }
  33. HString::~HString()
  34. {
  35. }
  36. HString::operator const WString& () const
  37. {
  38. if(mData->mIsDirty)
  39. {
  40. mData->mCachedString = mData->mStringData->concatenateString(mData->mParameters, mData->mStringData->numParameters);
  41. mData->mIsDirty = false;
  42. }
  43. return mData->mCachedString;
  44. }
  45. void HString::setParameter(UINT32 idx, const WString& value)
  46. {
  47. mData->mParameters[idx] = value;
  48. mData->mIsDirty = true;
  49. mData->onStringModified();
  50. }
  51. boost::signals::connection HString::addOnStringModifiedCallback(boost::function<void()> callback) const
  52. {
  53. return mData->onStringModified.connect(callback);
  54. }
  55. void HString::updateString()
  56. {
  57. LocalizedStringData* stringData = &StringTable::instance().getStringData(mData->mStringData->commonData->identifier);
  58. // If common data changed re-apply the connections
  59. if(stringData->commonData != mData->mStringData->commonData)
  60. {
  61. mData->mUpdateConn.disconnect();
  62. mData->mUpdateConn = stringData->commonData->onStringDataModified.connect(boost::bind(&HString::updateString, this));
  63. }
  64. mData->mStringData = stringData;
  65. mData->mIsDirty = true;
  66. mData->onStringModified();
  67. }
  68. }