Simple SFML GUI  0.2a
NumericFilter.hpp
1 #ifndef NUMERICFILTER_HPP
2 #define NUMERICFILTER_HPP
3 
4 #include <SFML/System/String.hpp>
5 #include <string>
6 #include <sstream>
7 #include <cmath>
8 
9 template<class T=double>
11 private:
12  bool clamp;
13  bool eofCheck;
14  bool allowEmpty;
15  T min;
16  T max;
17 
18 public:
19  NumericFilter(T min = -INFINITY, T max = INFINITY, bool clamp = true, bool eofCheck = true, bool allowEmpty = true) :
20  clamp(clamp),
21  eofCheck(eofCheck),
22  allowEmpty(allowEmpty) {
23  if(min > max) {
24  T tmp = min;
25  min = max;
26  max = tmp;
27  }
28  setMin(min);
29  setMax(max);
30  }
31 
32  bool operator()(sf::String& str) {
33  if((allowEmpty && str.isEmpty()) || (str == "-" && min < 0)) {
34  return true;
35  }
36  str.replace(",", ".");
37 
38  T num;
39  std::istringstream ss(str);
40  ss >> num;
41  if(ss.fail() || (eofCheck && !ss.eof())) {
42  return false;
43  } else {
44  if(clamp) {
45  if(num < min) {
46  str = sf::String(std::to_string(min));
47  } else if(num > max) {
48  str = sf::String(std::to_string(max));
49  }
50  return true;
51  } else if(num < min || num > max) {
52  return false;
53  } else {
54  return true;
55  }
56  }
57  }
58  void setClamp(bool value) {
59  clamp = value;
60  }
61  void setMin(const T& value) {
62  T test = 0;
63  test -= 1;
64  if(test > 0 && value < 0) {
65  min = 0;
66  } else {
67  min = value;
68  }
69  }
70  void setMax(const T& value) {
71  T test = 0;
72  test -= 1;
73  if(test > 0 && value < 0) {
74  max = 0;
75  } else {
76  max = value;
77  }
78  }
79 };
80 
81 #endif // NUMERICFILTER_HPP
Definition: NumericFilter.hpp:10