diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ClockTool.cc | 88 | ||||
-rw-r--r-- | src/FbTk/StringUtil.cc | 18 | ||||
-rw-r--r-- | src/FbTk/StringUtil.hh | 12 |
3 files changed, 64 insertions, 54 deletions
diff --git a/src/ClockTool.cc b/src/ClockTool.cc index 91fea93..c2d029f 100644 --- a/src/ClockTool.cc +++ b/src/ClockTool.cc | |||
@@ -50,6 +50,11 @@ | |||
50 | 50 | ||
51 | namespace { | 51 | namespace { |
52 | 52 | ||
53 | static const char SWITCHES_SECONDS[] = "crsSTX+"; | ||
54 | static const char SWITCHES_12_24H[] = "lIrkHT"; | ||
55 | static const char SWITCHES_24_12H[] = "kHTlIr"; | ||
56 | static const char SWITCH_AM_PM[] = "pP"; | ||
57 | |||
53 | /** | 58 | /** |
54 | * return true if clock shows seconds. If clock doesn't show seconds then | 59 | * return true if clock shows seconds. If clock doesn't show seconds then |
55 | * there is no need to wake up every second to redraw the clock. | 60 | * there is no need to wake up every second to redraw the clock. |
@@ -57,15 +62,11 @@ namespace { | |||
57 | 62 | ||
58 | int showSeconds(const std::string& fmt_string) { | 63 | int showSeconds(const std::string& fmt_string) { |
59 | 64 | ||
60 | return fmt_string.find("%c") != std::string::npos | 65 | return FbTk::StringUtil::findCharFromAlphabetAfterTrigger( |
61 | || fmt_string.find("%r") != std::string::npos | 66 | fmt_string, '%', SWITCHES_SECONDS, sizeof(SWITCHES_SECONDS), 0) != std::string::npos; |
62 | || fmt_string.find("%s") != std::string::npos | ||
63 | || fmt_string.find("%S") != std::string::npos | ||
64 | || fmt_string.find("%T") != std::string::npos | ||
65 | || fmt_string.find("%X") != std::string::npos | ||
66 | || fmt_string.find("%+") != std::string::npos; | ||
67 | } | 67 | } |
68 | 68 | ||
69 | |||
69 | timeval calcNextTimeout(const std::string& fmt_string) { | 70 | timeval calcNextTimeout(const std::string& fmt_string) { |
70 | timeval now; | 71 | timeval now; |
71 | timeval next; | 72 | timeval next; |
@@ -93,69 +94,48 @@ class ClockMenuItem: public FbTk::MenuItem { | |||
93 | public: | 94 | public: |
94 | explicit ClockMenuItem(ClockTool &tool): | 95 | explicit ClockMenuItem(ClockTool &tool): |
95 | FbTk::MenuItem(""), m_tool(tool) { | 96 | FbTk::MenuItem(""), m_tool(tool) { |
96 | // determine 12/24 hour format | 97 | |
97 | _FB_USES_NLS; | 98 | setClockModeLabel(); |
98 | if (m_tool.timeFormat().find("%k") != std::string::npos || | ||
99 | m_tool.timeFormat().find("%H") != std::string::npos || | ||
100 | m_tool.timeFormat().find("%T") != std::string::npos) | ||
101 | setLabel( _FB_XTEXT(Toolbar, Clock24, "Clock: 24h", "set Clockmode to 24h") ); | ||
102 | else | ||
103 | setLabel( _FB_XTEXT(Toolbar, Clock12, "Clock: 12h", "set Clockmode to 12h") ); | ||
104 | setCloseOnClick(false); | 99 | setCloseOnClick(false); |
105 | } | 100 | } |
106 | 101 | ||
107 | void click(int button, int time, unsigned int mods) { | 102 | void click(int button, int time, unsigned int mods) { |
108 | std::string newformat = m_tool.timeFormat(); | ||
109 | size_t pos = newformat.find("%k"); | ||
110 | std::string newstr; | ||
111 | bool clock24hour = true; | ||
112 | |||
113 | _FB_USES_NLS; | ||
114 | 103 | ||
115 | if (pos != std::string::npos) | 104 | // does the current format string contain something with 24/12h? |
116 | newstr = "%l"; | 105 | size_t found; |
117 | else if ((pos = newformat.find("%H")) != std::string::npos) | 106 | size_t pos = FbTk::StringUtil::findCharFromAlphabetAfterTrigger( |
118 | newstr = "%I"; | 107 | m_tool.timeFormat(), '%', SWITCHES_24_12H, sizeof(SWITCHES_24_12H), &found); |
119 | else if ((pos = newformat.find("%T")) != std::string::npos) | ||
120 | newstr = "%r"; | ||
121 | |||
122 | // 12 hour | ||
123 | if (newstr.empty()) { | ||
124 | clock24hour = false; | ||
125 | if ((pos = newformat.find("%l")) != std::string::npos) | ||
126 | newstr = "%k"; | ||
127 | else if ((pos = newformat.find("%I")) != std::string::npos) | ||
128 | newstr = "%H"; | ||
129 | else if ((pos = newformat.find("%r")) != std::string::npos) | ||
130 | newstr = "%T"; | ||
131 | |||
132 | } | ||
133 | 108 | ||
134 | if (!newstr.empty()) { | 109 | if (pos != std::string::npos) { // if so, exchange it with 12/24h |
110 | std::string newformat = m_tool.timeFormat(); | ||
111 | newformat[pos+1] = SWITCHES_12_24H[found]; | ||
135 | 112 | ||
136 | newformat.replace(pos, 2, newstr); | 113 | if (found < 3) { // 24h? erase %P/%p (AM|PM / am|pm) |
137 | if (!clock24hour) { // erase %P/%p (AM|PM / am|pm) | 114 | pos = FbTk::StringUtil::findCharFromAlphabetAfterTrigger( |
138 | pos = newformat.find("%p"); | 115 | newformat, '%', SWITCH_AM_PM, sizeof(SWITCH_AM_PM), 0); |
139 | if (pos != std::string::npos) | 116 | if (pos != std::string::npos) { |
140 | newformat.erase(pos, 2); | ||
141 | else if ((pos = newformat.find("%P")) != std::string::npos) | ||
142 | newformat.erase(pos, 2); | 117 | newformat.erase(pos, 2); |
118 | } | ||
143 | } | 119 | } |
144 | 120 | ||
145 | |||
146 | m_tool.setTimeFormat(newformat); | 121 | m_tool.setTimeFormat(newformat); |
147 | 122 | setClockModeLabel(); | |
148 | if (m_tool.timeFormat().find("%k") != std::string::npos || | ||
149 | m_tool.timeFormat().find("%H") != std::string::npos || | ||
150 | m_tool.timeFormat().find("%T") != std::string::npos) | ||
151 | setLabel( _FB_XTEXT(Toolbar, Clock24, "Clock: 24h", "set Clockmode to 24h") ); | ||
152 | else | ||
153 | setLabel( _FB_XTEXT(Toolbar, Clock12, "Clock: 12h", "set Clockmode to 12h") ); | ||
154 | 123 | ||
155 | } // else some other strange format...so we don't do anything | 124 | } // else some other strange format...so we don't do anything |
156 | FbTk::MenuItem::click(button, time, mods); | 125 | FbTk::MenuItem::click(button, time, mods); |
157 | } | 126 | } |
158 | private: | 127 | private: |
128 | |||
129 | void setClockModeLabel() { | ||
130 | _FB_USES_NLS; | ||
131 | if (FbTk::StringUtil::findCharFromAlphabetAfterTrigger( | ||
132 | m_tool.timeFormat(), '%', SWITCHES_24_12H, 3, 0) != std::string::npos) { | ||
133 | setLabel( _FB_XTEXT(Toolbar, Clock24, "Clock: 24h", "set Clockmode to 24h") ); | ||
134 | } else { | ||
135 | setLabel( _FB_XTEXT(Toolbar, Clock12, "Clock: 12h", "set Clockmode to 12h") ); | ||
136 | } | ||
137 | } | ||
138 | |||
159 | ClockTool &m_tool; | 139 | ClockTool &m_tool; |
160 | }; | 140 | }; |
161 | 141 | ||
diff --git a/src/FbTk/StringUtil.cc b/src/FbTk/StringUtil.cc index 602211e..4678f03 100644 --- a/src/FbTk/StringUtil.cc +++ b/src/FbTk/StringUtil.cc | |||
@@ -164,6 +164,24 @@ string findExtension(const string &filename) { | |||
164 | return filename.substr(start_pos + 1); | 164 | return filename.substr(start_pos + 1); |
165 | } | 165 | } |
166 | 166 | ||
167 | string::size_type findCharFromAlphabetAfterTrigger(const std::string& in, char trigger, const char alphabet[], size_t len_alphabet, size_t* found) { | ||
168 | for (const char* s = in.c_str(); *s != '\0'; ) { | ||
169 | if (*s++ == trigger && *s != '\0') { | ||
170 | for (const char* a = alphabet; (a - alphabet) < len_alphabet; ++a) { | ||
171 | if (*s == *a) { | ||
172 | if (found) { | ||
173 | *found = a - alphabet; | ||
174 | } | ||
175 | return s - in.c_str() - 1; | ||
176 | } | ||
177 | } | ||
178 | s++; | ||
179 | } | ||
180 | } | ||
181 | return string::npos; | ||
182 | } | ||
183 | |||
184 | |||
167 | string replaceString(const string &original, | 185 | string replaceString(const string &original, |
168 | const char *findthis, | 186 | const char *findthis, |
169 | const char *replace) { | 187 | const char *replace) { |
diff --git a/src/FbTk/StringUtil.hh b/src/FbTk/StringUtil.hh index 7bc8f80..a16e709 100644 --- a/src/FbTk/StringUtil.hh +++ b/src/FbTk/StringUtil.hh | |||
@@ -50,6 +50,18 @@ std::string expandFilename(const std::string &filename); | |||
50 | /// @return extension of filename (ex: filename.txt will return txt) | 50 | /// @return extension of filename (ex: filename.txt will return txt) |
51 | std::string findExtension(const std::string &filename); | 51 | std::string findExtension(const std::string &filename); |
52 | 52 | ||
53 | /// is the char after a 'trigger' part of an alphabet? | ||
54 | /// @param in - string to analyze | ||
55 | /// @param trigger - check for char after trigger | ||
56 | /// @param alphabet - contains chars to search for | ||
57 | /// @param len_alphabet - length of alphabet | ||
58 | /// @param found - position of found char in alphabet (optional) | ||
59 | /// @return position of trigger if found | ||
60 | /// @return std::string::npos if nothing found | ||
61 | std::string::size_type findCharFromAlphabetAfterTrigger(const std::string& in, | ||
62 | char trigger, | ||
63 | const char alphabet[], size_t len_alphabet, size_t* found); | ||
64 | |||
53 | /// @return copy of original with find_string replaced with "replace" | 65 | /// @return copy of original with find_string replaced with "replace" |
54 | std::string replaceString(const std::string &original, | 66 | std::string replaceString(const std::string &original, |
55 | const char *find_string, | 67 | const char *find_string, |