aboutsummaryrefslogtreecommitdiff
path: root/src/ui/mapper/style/ConditionMapper.cpp
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