diff --git a/TrafficMonitor/SkinFile.cpp b/TrafficMonitor/SkinFile.cpp index 9a014f7d2..ccedaeca4 100644 --- a/TrafficMonitor/SkinFile.cpp +++ b/TrafficMonitor/SkinFile.cpp @@ -127,17 +127,18 @@ void CSkinFile::LoadFromXml(const wstring& file_path) m_skin_info = SkinInfo(); m_layout_info = LayoutInfo(); m_preview_info = PreviewInfo(); + std::map<std::string, std::wstring> display_text_map; //显示项目的文本和xml节点的映射关系。key是xml节点,value是显示文本 tinyxml2::XMLDocument doc; if (CTinyXml2Helper::LoadXmlFile(doc, file_path.c_str())) { - CTinyXml2Helper::IterateChildNode(doc.FirstChildElement(), [this](tinyxml2::XMLElement* child) + CTinyXml2Helper::IterateChildNode(doc.FirstChildElement(), [&](tinyxml2::XMLElement* child) { string ele_name = CTinyXml2Helper::ElementName(child); //读取皮肤信息 if (ele_name == "skin") { - CTinyXml2Helper::IterateChildNode(child, [this](tinyxml2::XMLElement* skin_item) + CTinyXml2Helper::IterateChildNode(child, [&](tinyxml2::XMLElement* skin_item) { string skin_item_name = CTinyXml2Helper::ElementName(skin_item); //文本颜色 @@ -182,18 +183,12 @@ void CSkinFile::LoadFromXml(const wstring& file_path) } else if (skin_item_name == "display_text") { - CTinyXml2Helper::IterateChildNode(skin_item, [this](tinyxml2::XMLElement* display_text_item) + //这里先保存所有显示文本到display_text_map + CTinyXml2Helper::IterateChildNode(skin_item, [&](tinyxml2::XMLElement* display_text_item) { string item_name = CTinyXml2Helper::ElementName(display_text_item); wstring item_text = CCommon::StrToUnicode(CTinyXml2Helper::ElementText(display_text_item), true); - for (auto display_item : AllDisplayItems) - { - if (item_name == CSkinFile::GetDisplayItemXmlNodeName(display_item)) - { - m_skin_info.display_text.Get(display_item) = item_text; - break; - } - } + display_text_map[item_name] = item_text; }); } }); @@ -245,6 +240,33 @@ void CSkinFile::LoadFromXml(const wstring& file_path) }); } + //载入显示文本 + for (const auto& display_text_item : display_text_map) + { + std::string node_name = display_text_item.first; + std::wstring item_text = display_text_item.second; + //查找内建显示项目 + for (auto display_item : AllDisplayItems) + { + if (node_name == CSkinFile::GetDisplayItemXmlNodeName(display_item)) + { + m_skin_info.display_text.Get(display_item) = item_text; + break; + } + } + //查找插件项目 + for (const auto& item : m_plugin_map) + { + if (node_name == item.first && !item.second.empty()) + { + std::wstring plugin_id = CCommon::StrToUnicode(item.second.c_str(), true); + IPluginItem* plugin_item = theApp.m_plugins.GetItemById(plugin_id); + if (plugin_item != nullptr) + m_skin_info.display_text.Get(plugin_item) = item_text; + } + } + } + } void CSkinFile::LoadFromIni(const wstring& file_path)