blob: ce41a70ae8bdb075f95c0726a51def82e480e01f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#include "cru/ui/mapper/style/ConditionMapper.h"
#include "cru/base/ClonePtr.h"
#include "cru/base/xml/XmlNode.h"
#include "cru/ui/mapper/MapperRegistry.h"
namespace cru::ui::mapper::style {
ClonePtr<NoCondition> NoConditionMapper::DoMapFromXml(
xml::XmlElementNode* node) {
return NoCondition::Create();
}
ClonePtr<AndCondition> AndConditionMapper::DoMapFromXml(
xml::XmlElementNode* node) {
std::vector<ClonePtr<Condition>> conditions;
auto condition_mappers =
MapperRegistry::GetInstance()->GetMappersByInterface<IConditionMapper>();
for (auto child : node->GetChildren()) {
if (child->GetType() == xml::XmlNode::Type::Element) {
auto c = child->AsElement();
for (auto mapper : condition_mappers) {
if (mapper->XmlElementIsOfThisType(c)) {
conditions.push_back(mapper->MapConditionFromXml(c));
break;
}
}
}
}
return AndCondition::Create(std::move(conditions));
}
ClonePtr<OrCondition> OrConditionMapper::DoMapFromXml(
xml::XmlElementNode* node) {
std::vector<ClonePtr<Condition>> conditions;
auto condition_mappers =
MapperRegistry::GetInstance()->GetMappersByInterface<IConditionMapper>();
for (auto child : node->GetChildren()) {
if (child->GetType() == xml::XmlNode::Type::Element) {
auto c = child->AsElement();
for (auto mapper : condition_mappers) {
if (mapper->XmlElementIsOfThisType(c)) {
conditions.push_back(mapper->MapConditionFromXml(c));
break;
}
}
}
}
return OrCondition::Create(std::move(conditions));
}
ClonePtr<ClickStateCondition>
ClickStateConditionMapper::DoMapFromXml(xml::XmlElementNode* node) {
auto state = helper::ClickState::None;
auto value_attr = node->GetOptionalAttributeValueCaseInsensitive("value");
if (value_attr) {
if (cru::string::CaseInsensitiveCompare(*value_attr, "none") == 0) {
state = helper::ClickState::None;
} else if (cru::string::CaseInsensitiveCompare(*value_attr, "hover") == 0) {
state = helper::ClickState::Hover;
} else if (cru::string::CaseInsensitiveCompare(*value_attr, "press") == 0) {
state = helper::ClickState::Press;
} else if (cru::string::CaseInsensitiveCompare(*value_attr,
"pressinactive") == 0) {
state = helper::ClickState::PressInactive;
} else {
throw Exception("Unknown click state: " + *value_attr);
}
}
return ClickStateCondition::Create(state);
}
ClonePtr<CheckedCondition> CheckedConditionMapper::DoMapFromXml(
xml::XmlElementNode* node) {
auto value = node->GetAttributeValueCaseInsensitive("value");
if (cru::string::CaseInsensitiveCompare(value, "true") == 0) {
return CheckedCondition::Create(true);
} else if (cru::string::CaseInsensitiveCompare(value, "false") == 0) {
return CheckedCondition::Create(false);
} else {
throw Exception("Invalid value for CheckedCondition: " + value);
}
}
ClonePtr<FocusCondition> FocusConditionMapper::DoMapFromXml(
xml::XmlElementNode* node) {
auto value = node->GetAttributeValueCaseInsensitive("value");
if (cru::string::CaseInsensitiveCompare(value, "true") == 0) {
return FocusCondition::Create(true);
} else if (cru::string::CaseInsensitiveCompare(value, "false") == 0) {
return FocusCondition::Create(false);
} else {
throw Exception("Invalid value for FocusCondition: " + value);
}
}
ClonePtr<HoverCondition> HoverConditionMapper::DoMapFromXml(
xml::XmlElementNode* node) {
auto value = node->GetAttributeValueCaseInsensitive("value");
if (cru::string::CaseInsensitiveCompare(value, "true") == 0) {
return HoverCondition::Create(true);
} else if (cru::string::CaseInsensitiveCompare(value, "false") == 0) {
return HoverCondition::Create(false);
} else {
throw Exception("Invalid value for HoverCondition: " + value);
}
}
} // namespace cru::ui::mapper::style
|