comet-cpp 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/comet-html +69 -0
- data/bin/comet-make +53 -0
- data/bin/comet-new +62 -0
- data/bin/comet-web +14 -0
- data/lib/comet-html/generator.rb +220 -0
- data/lib/comet-html/header-generator.rb +145 -0
- data/lib/comet-html/parser-binding.rb +42 -0
- data/lib/comet-html/parser-class.rb +168 -0
- data/lib/comet-html/parser-context.rb +61 -0
- data/lib/comet-html/parser-reference.rb +98 -0
- data/lib/comet-html/parser-repeater.rb +58 -0
- data/lib/comet-html/parser-slot.rb +108 -0
- data/lib/comet-html/source-generator.rb +285 -0
- data/lib/comet-html/utils.rb +88 -0
- data/lib/guard/comet-html.rb +32 -0
- data/lib/guard/comet.rb +36 -0
- data/vendor/project/Gemfile +4 -0
- data/vendor/project/Guardfile +5 -0
- data/vendor/project/app/application.hpp +29 -0
- data/vendor/project/app/collections/.gitkeep +0 -0
- data/vendor/project/app/controllers/.gitkeep +0 -0
- data/vendor/project/app/main.cpp +6 -0
- data/vendor/project/app/models/.gitkeep +0 -0
- data/vendor/project/app/routes.cpp +7 -0
- data/vendor/project/app/views/layouts/.gitkeep +0 -0
- data/vendor/project/public/index.html +7 -0
- data/vendor/src/anchorable_element.hpp +79 -0
- data/vendor/src/append_semantics.hpp +73 -0
- data/vendor/src/bindable.cpp +99 -0
- data/vendor/src/bindable.hpp +106 -0
- data/vendor/src/cheerp_parse_cookie_values.cpp +58 -0
- data/vendor/src/comment_element.cpp +11 -0
- data/vendor/src/comment_element.hpp +17 -0
- data/vendor/src/cookies.cpp +94 -0
- data/vendor/src/cookies.hpp +60 -0
- data/vendor/src/custom_element.hpp +61 -0
- data/vendor/src/datatree.cpp +198 -0
- data/vendor/src/datatree.hpp +233 -0
- data/vendor/src/document.cpp +62 -0
- data/vendor/src/document.hpp +31 -0
- data/vendor/src/element.cpp +358 -0
- data/vendor/src/element.hpp +138 -0
- data/vendor/src/events.hpp +76 -0
- data/vendor/src/exception.cpp +13 -0
- data/vendor/src/exception.hpp +11 -0
- data/vendor/src/from_string.cpp +99 -0
- data/vendor/src/from_string.hpp +37 -0
- data/vendor/src/globals.cpp +6 -0
- data/vendor/src/globals.hpp +15 -0
- data/vendor/src/http.cpp +93 -0
- data/vendor/src/http.hpp +72 -0
- data/vendor/src/lexical_cast.hpp +51 -0
- data/vendor/src/local_storage.cpp +75 -0
- data/vendor/src/local_storage.hpp +53 -0
- data/vendor/src/mvc/collection.hpp +154 -0
- data/vendor/src/mvc/controller.hpp +59 -0
- data/vendor/src/mvc/id_type.hpp +9 -0
- data/vendor/src/mvc/layout.hpp +44 -0
- data/vendor/src/mvc/model.cpp +89 -0
- data/vendor/src/mvc/model.hpp +50 -0
- data/vendor/src/object.cpp +71 -0
- data/vendor/src/object.hpp +298 -0
- data/vendor/src/parse_cookie_values.hpp +12 -0
- data/vendor/src/promise.cpp +50 -0
- data/vendor/src/promise.hpp +43 -0
- data/vendor/src/repeater.hpp +116 -0
- data/vendor/src/router.cpp +62 -0
- data/vendor/src/router.hpp +34 -0
- data/vendor/src/router_base.hpp +107 -0
- data/vendor/src/signal.hpp +150 -0
- data/vendor/src/slot_element.hpp +61 -0
- data/vendor/src/url.cpp +19 -0
- data/vendor/src/url.hpp +15 -0
- data/vendor/src/window.cpp +22 -0
- data/vendor/src/window.hpp +24 -0
- metadata +134 -0
@@ -0,0 +1,298 @@
|
|
1
|
+
#ifndef CRAILS_FRONT_OBJECT_HPP
|
2
|
+
# define CRAILS_FRONT_OBJECT_HPP
|
3
|
+
|
4
|
+
# include <cheerp/client.h>
|
5
|
+
# include <cheerp/clientlib.h>
|
6
|
+
# include <map>
|
7
|
+
# include <vector>
|
8
|
+
# include <string>
|
9
|
+
# include <sstream>
|
10
|
+
|
11
|
+
#define js_object(...) \
|
12
|
+
Comet::Object(std::map<std::string, Comet::Object>({__VA_ARGS__}))
|
13
|
+
#define js_array(...) \
|
14
|
+
Comet::Object(std::vector<Comet::Object>({__VA_ARGS__}))
|
15
|
+
|
16
|
+
namespace Comet
|
17
|
+
{
|
18
|
+
template<typename CLIENT_TYPE>
|
19
|
+
class ObjectImpl;
|
20
|
+
|
21
|
+
template<typename ARG>
|
22
|
+
struct ApplyParamsToString;
|
23
|
+
|
24
|
+
std::wstring to_wstring(client::String*);
|
25
|
+
|
26
|
+
class Object
|
27
|
+
{
|
28
|
+
protected:
|
29
|
+
client::Object* ptr;
|
30
|
+
public:
|
31
|
+
Object() { ptr = new client::Object; }
|
32
|
+
Object(client::Object* ptr) : ptr(ptr) {}
|
33
|
+
Object(client::String* ptr) : ptr((client::Object*)ptr) {}
|
34
|
+
Object(const char* str) { ptr = new client::String(str); }
|
35
|
+
Object(const wchar_t* str) { ptr = new client::String(str); }
|
36
|
+
Object(const std::string& str) { ptr = new client::String(str.c_str()); }
|
37
|
+
Object(const std::wstring& str) { ptr = new client::String(str.c_str()); }
|
38
|
+
Object(unsigned long number) { ptr = new client::String(number); }
|
39
|
+
Object(unsigned int number) { ptr = new client::String(number); }
|
40
|
+
Object(long number) { ptr = new client::String(number); }
|
41
|
+
Object(int number) { ptr = new client::String(number); }
|
42
|
+
Object(double number) { ptr = new client::String(number); }
|
43
|
+
Object(bool boolean) { ptr = new client::String((int)boolean); }
|
44
|
+
Object(const std::map<std::string, Object>& items) { ptr = new client::Object; set(items); }
|
45
|
+
|
46
|
+
Object(const std::vector<Object>& items)
|
47
|
+
{
|
48
|
+
auto* array = new client::Array;
|
49
|
+
|
50
|
+
for (auto item : items)
|
51
|
+
array->push(*item);
|
52
|
+
ptr = array;
|
53
|
+
}
|
54
|
+
|
55
|
+
template<typename FUNCTYPE>
|
56
|
+
Object(std::function<FUNCTYPE> func) { ptr = cheerp::Callback(func); }
|
57
|
+
|
58
|
+
static Object from_json(client::String* str)
|
59
|
+
{
|
60
|
+
return client::JSON.parse(str);
|
61
|
+
}
|
62
|
+
|
63
|
+
static Object from_json(const std::string& str)
|
64
|
+
{
|
65
|
+
return from_json(new client::String(str.c_str()));
|
66
|
+
}
|
67
|
+
|
68
|
+
static Object from_json(const std::wstring& str)
|
69
|
+
{
|
70
|
+
return from_json(new client::String(str.c_str()));
|
71
|
+
}
|
72
|
+
|
73
|
+
template<typename RETURN_TYPE = std::string>
|
74
|
+
RETURN_TYPE to_json() const
|
75
|
+
{
|
76
|
+
return (RETURN_TYPE)(*static_cast<client::String*>(client::JSON.stringify(ptr)));
|
77
|
+
}
|
78
|
+
|
79
|
+
template<>
|
80
|
+
std::wstring to_json<std::wstring>() const
|
81
|
+
{
|
82
|
+
return to_wstring(static_cast<client::String*>(client::JSON.stringify(ptr)));
|
83
|
+
}
|
84
|
+
|
85
|
+
Object operator[](const char* key)
|
86
|
+
{
|
87
|
+
return Object(ptr->operator[](key));
|
88
|
+
}
|
89
|
+
|
90
|
+
template<typename CLIENT_TYPE>
|
91
|
+
ObjectImpl<CLIENT_TYPE> get(const char* key)
|
92
|
+
{
|
93
|
+
return ObjectImpl<CLIENT_TYPE>(*(this->operator[](key)));
|
94
|
+
}
|
95
|
+
|
96
|
+
client::Object* operator*() const { return ptr; }
|
97
|
+
client::Object* operator->() const { return ptr; }
|
98
|
+
|
99
|
+
operator std::string() const
|
100
|
+
{
|
101
|
+
if (!is_of_type("String"))
|
102
|
+
__asm__("throw 'Comet::Object cast to std::string, but type is not String'");
|
103
|
+
return (std::string)(*static_cast<client::String*>(ptr));
|
104
|
+
}
|
105
|
+
|
106
|
+
operator std::wstring() const
|
107
|
+
{
|
108
|
+
if (!is_of_type("String"))
|
109
|
+
__asm__("throw 'Comet::Object cast to std::wstring, but type is not String'");
|
110
|
+
return to_wstring(static_cast<client::String*>(ptr));
|
111
|
+
}
|
112
|
+
|
113
|
+
operator double() const { return (double)(*ptr); }
|
114
|
+
|
115
|
+
template<typename T>
|
116
|
+
operator std::vector<T>() const
|
117
|
+
{
|
118
|
+
return to_vector<T>();
|
119
|
+
}
|
120
|
+
|
121
|
+
template<typename T>
|
122
|
+
std::vector<T> to_vector() const
|
123
|
+
{
|
124
|
+
std::vector<T> result;
|
125
|
+
|
126
|
+
if (is_of_type("Array"))
|
127
|
+
{
|
128
|
+
const client::Array& array = *(static_cast<client::Array*>(ptr));
|
129
|
+
result.resize(array.get_length());
|
130
|
+
for (int i = 0 ; i < array.get_length() ; ++i)
|
131
|
+
result[i] = (T)(Object(array[i]));
|
132
|
+
}
|
133
|
+
return result;
|
134
|
+
}
|
135
|
+
|
136
|
+
bool is_of_type(const std::string& type) const { return is_of_type(type.c_str()); }
|
137
|
+
bool is_of_type(const char* type) const;
|
138
|
+
|
139
|
+
void set(const std::string& str, Object object)
|
140
|
+
{
|
141
|
+
ptr->set_(str.c_str(), object.ptr);
|
142
|
+
}
|
143
|
+
|
144
|
+
void set(const std::map<std::string, Object>& items)
|
145
|
+
{
|
146
|
+
for (auto item : items)
|
147
|
+
set(item.first, item.second);
|
148
|
+
}
|
149
|
+
|
150
|
+
void unset(const std::string& str)
|
151
|
+
{
|
152
|
+
ptr->set_(str.c_str(), nullptr);
|
153
|
+
}
|
154
|
+
|
155
|
+
template<typename ...ARGS>
|
156
|
+
Object apply(const std::string& name, ARGS... args)
|
157
|
+
{
|
158
|
+
std::string str = "_comet_." + name + '(';
|
159
|
+
std::string str_args = _apply_params('a', args...);
|
160
|
+
|
161
|
+
str = str + str_args;
|
162
|
+
str = str + ')';
|
163
|
+
set_global("_comet_", *this);
|
164
|
+
return client::eval(str.c_str());
|
165
|
+
}
|
166
|
+
|
167
|
+
bool is_undefined() const;
|
168
|
+
|
169
|
+
static void set_global(const std::string&, Comet::Object);
|
170
|
+
|
171
|
+
private:
|
172
|
+
std::string _apply_params(char) { return ""; }
|
173
|
+
|
174
|
+
template<typename ARG>
|
175
|
+
std::string _apply_params(char i, ARG arg)
|
176
|
+
{
|
177
|
+
return ApplyParamsToString<ARG>::func(arg, i);
|
178
|
+
}
|
179
|
+
|
180
|
+
template<typename ARG, typename ...ARGS>
|
181
|
+
std::string _apply_params(char i, ARG arg, ARGS... args)
|
182
|
+
{
|
183
|
+
return ApplyParamsToString<ARG>::func(arg, i)
|
184
|
+
+ ',' + _apply_params<ARGS...>(i + 1, args...);
|
185
|
+
}
|
186
|
+
};
|
187
|
+
template<>
|
188
|
+
std::vector<std::wstring> Object::to_vector() const;
|
189
|
+
|
190
|
+
template<typename ARG>
|
191
|
+
struct ApplyParamsToString
|
192
|
+
{
|
193
|
+
static std::string func(ARG arg, char)
|
194
|
+
{
|
195
|
+
std::stringstream stream;
|
196
|
+
|
197
|
+
stream << arg;
|
198
|
+
return stream.str();
|
199
|
+
}
|
200
|
+
};
|
201
|
+
|
202
|
+
template<>
|
203
|
+
struct ApplyParamsToString<Object>
|
204
|
+
{
|
205
|
+
static std::string func(Object object, char i)
|
206
|
+
{
|
207
|
+
std::string varname = "_comet_arg_0_";
|
208
|
+
|
209
|
+
varname[11] = i;
|
210
|
+
Object::set_global(varname.c_str(), object);
|
211
|
+
return varname;
|
212
|
+
}
|
213
|
+
};
|
214
|
+
|
215
|
+
template<typename ARG>
|
216
|
+
struct ApplyParamsToString<ObjectImpl<ARG> >
|
217
|
+
{
|
218
|
+
static std::string func(ObjectImpl<ARG> arg, char i)
|
219
|
+
{
|
220
|
+
return ApplyParamsToString<Object>::func(Object((client::Object*)(*arg)), i);
|
221
|
+
}
|
222
|
+
};
|
223
|
+
|
224
|
+
template<>
|
225
|
+
struct ApplyParamsToString<client::Object*>
|
226
|
+
{
|
227
|
+
static std::string func(client::Object* arg, char i)
|
228
|
+
{
|
229
|
+
return ApplyParamsToString<Object>::func(Object(arg), i);
|
230
|
+
}
|
231
|
+
};
|
232
|
+
|
233
|
+
template<>
|
234
|
+
struct ApplyParamsToString<client::String*>
|
235
|
+
{
|
236
|
+
static std::string func(client::String* arg, char i)
|
237
|
+
{
|
238
|
+
return ApplyParamsToString<Object>::func(Object((client::Object*)arg), i);
|
239
|
+
}
|
240
|
+
};
|
241
|
+
|
242
|
+
template<>
|
243
|
+
struct ApplyParamsToString<const char*>
|
244
|
+
{
|
245
|
+
static std::string func(const char* arg, char i)
|
246
|
+
{
|
247
|
+
std::string varval("\"");
|
248
|
+
|
249
|
+
varval = varval + arg;
|
250
|
+
varval = varval + "\"";
|
251
|
+
return varval;
|
252
|
+
}
|
253
|
+
};
|
254
|
+
|
255
|
+
template<>
|
256
|
+
struct ApplyParamsToString<std::string>
|
257
|
+
{
|
258
|
+
static std::string func(std::string arg, char i)
|
259
|
+
{
|
260
|
+
return '"' + arg + '"';
|
261
|
+
}
|
262
|
+
};
|
263
|
+
|
264
|
+
template<typename CLIENT_TYPE>
|
265
|
+
class ObjectImpl : public Object
|
266
|
+
{
|
267
|
+
public:
|
268
|
+
ObjectImpl() { ptr = new CLIENT_TYPE; }
|
269
|
+
ObjectImpl(CLIENT_TYPE* ptr) { this->ptr = ptr; }
|
270
|
+
ObjectImpl(client::Object* ptr) { this->ptr = ptr; }
|
271
|
+
|
272
|
+
CLIENT_TYPE* operator*() const { return static_cast<CLIENT_TYPE*>(ptr); }
|
273
|
+
CLIENT_TYPE* operator->() const { return static_cast<CLIENT_TYPE*>(ptr); }
|
274
|
+
};
|
275
|
+
|
276
|
+
class String : public ObjectImpl<client::String>
|
277
|
+
{
|
278
|
+
public:
|
279
|
+
String() { ptr = new client::String; }
|
280
|
+
String(client::String* ptr) { this->ptr = ptr; }
|
281
|
+
String(client::Object* ptr) { this->ptr = ptr; }
|
282
|
+
String(const char* str) { ptr = new client::String(str); }
|
283
|
+
String(const wchar_t* str) { ptr = new client::String(str); }
|
284
|
+
String(const std::string& str) { ptr = new client::String(str.c_str()); }
|
285
|
+
String(const std::wstring& str) { ptr = new client::String(str.c_str()); }
|
286
|
+
};
|
287
|
+
|
288
|
+
template<>
|
289
|
+
struct ApplyParamsToString<String>
|
290
|
+
{
|
291
|
+
static std::string func(String arg, char i)
|
292
|
+
{
|
293
|
+
return ApplyParamsToString<Object>::func(Object((client::Object*)(*arg)), i);
|
294
|
+
}
|
295
|
+
};
|
296
|
+
}
|
297
|
+
|
298
|
+
#endif
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#ifndef PARSE_COOKIE_VALUES_HPP
|
2
|
+
# define PARSE_COOKIE_VALUES_HPP
|
3
|
+
|
4
|
+
# include <string>
|
5
|
+
# include <functional>
|
6
|
+
|
7
|
+
namespace Comet
|
8
|
+
{
|
9
|
+
void parse_cookie_values(const std::string&, std::function<bool (const std::string&, const std::string&)> callback);
|
10
|
+
}
|
11
|
+
|
12
|
+
#endif
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#include "promise.hpp"
|
2
|
+
#include "globals.hpp"
|
3
|
+
|
4
|
+
using namespace std;
|
5
|
+
using namespace Comet;
|
6
|
+
|
7
|
+
Promise::Promise(std::function<void (std::function<void ()>, std::function<void ()>)> resolver)
|
8
|
+
{
|
9
|
+
client::Object* func = cheerp::Callback([resolver](client::Object* callbacks_ptr)
|
10
|
+
{
|
11
|
+
Comet::Object callbacks(callbacks_ptr);
|
12
|
+
|
13
|
+
resolver(
|
14
|
+
[callbacks]() mutable { callbacks.apply("resolve"); },
|
15
|
+
[callbacks]() mutable { callbacks.apply("reject"); }
|
16
|
+
);
|
17
|
+
});
|
18
|
+
new_promise(func);
|
19
|
+
}
|
20
|
+
|
21
|
+
void Promise::new_promise(client::Object* resolver)
|
22
|
+
{
|
23
|
+
prepare_promise_constructor();
|
24
|
+
ptr = *(window.apply("_comet_new_promise", resolver));
|
25
|
+
}
|
26
|
+
|
27
|
+
void Promise::prepare_promise_constructor()
|
28
|
+
{
|
29
|
+
static bool is_prepared = false;
|
30
|
+
|
31
|
+
if (!is_prepared)
|
32
|
+
{
|
33
|
+
client::eval("window._comet_new_promise = function(r) { return new Promise(function(resolve, reject) { return r({ resolve: resolve, reject: reject }); }); }");
|
34
|
+
is_prepared = true;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
Promise Promise::all(const std::vector<Promise>& promises)
|
39
|
+
{
|
40
|
+
Comet::ObjectImpl<client::Array> array;
|
41
|
+
|
42
|
+
for (auto promise : promises)
|
43
|
+
array->push(*promise);
|
44
|
+
return *(window["Promise"].apply("all", array));
|
45
|
+
}
|
46
|
+
|
47
|
+
Promise Promise::solved_promise()
|
48
|
+
{
|
49
|
+
return Promise([](function<void()> resolve, function<void()>) { resolve(); });
|
50
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#ifndef CRAILS_FRONT_PROMISE_HPP
|
2
|
+
# define CRAILS_FRONT_PROMISE_HPP
|
3
|
+
|
4
|
+
# include "object.hpp"
|
5
|
+
# include <vector>
|
6
|
+
|
7
|
+
namespace Comet
|
8
|
+
{
|
9
|
+
class Promise : public ObjectImpl<client::Promise>
|
10
|
+
{
|
11
|
+
public:
|
12
|
+
static Promise solved_promise();
|
13
|
+
static Promise all(const std::vector<Promise>& promises);
|
14
|
+
|
15
|
+
Promise(std::function<void (std::function<void ()>, std::function<void ()>)> resolver);
|
16
|
+
Promise(client::Promise* ptr) : ObjectImpl(ptr) {}
|
17
|
+
Promise(client::Object* ptr) : ObjectImpl(ptr) {}
|
18
|
+
|
19
|
+
template<typename T>
|
20
|
+
Promise then(T callback)
|
21
|
+
{
|
22
|
+
client::EventListener* func = cheerp::Callback(callback);
|
23
|
+
(*this)->then(func);
|
24
|
+
return *this;
|
25
|
+
}
|
26
|
+
|
27
|
+
template<typename T>
|
28
|
+
Promise _catch(T callback)
|
29
|
+
{
|
30
|
+
client::EventListener* func = cheerp::Callback(callback);
|
31
|
+
|
32
|
+
this->apply("catch", Comet::Object(func));
|
33
|
+
return *this;
|
34
|
+
}
|
35
|
+
|
36
|
+
protected:
|
37
|
+
void new_promise(client::Object* resolver);
|
38
|
+
|
39
|
+
static void prepare_promise_constructor();
|
40
|
+
};
|
41
|
+
}
|
42
|
+
|
43
|
+
#endif
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#ifndef CRAILS_FRONT_REPEATER_HPP
|
2
|
+
# define CRAILS_FRONT_REPEATER_HPP
|
3
|
+
|
4
|
+
# include "anchorable_element.hpp"
|
5
|
+
|
6
|
+
namespace Comet
|
7
|
+
{
|
8
|
+
template<typename ARRAY, typename ELEMENT>
|
9
|
+
struct Repeater : public AnchorableElement
|
10
|
+
{
|
11
|
+
typedef typename ARRAY::const_iterator Iterator;
|
12
|
+
typedef std::pair<Iterator, std::shared_ptr<ELEMENT> > ElementPair;
|
13
|
+
typedef std::vector<ElementPair> Elements;
|
14
|
+
Elements elements;
|
15
|
+
bool use_element_cache = false;
|
16
|
+
|
17
|
+
template<typename PARENT>
|
18
|
+
void refresh(PARENT* parent, const ARRAY& array)
|
19
|
+
{
|
20
|
+
if (use_element_cache)
|
21
|
+
purge_removed_elements(array);
|
22
|
+
else
|
23
|
+
clear();
|
24
|
+
update_elements(parent, array);
|
25
|
+
attach_elements();
|
26
|
+
trigger_binding_updates();
|
27
|
+
}
|
28
|
+
|
29
|
+
void bind_attributes()
|
30
|
+
{
|
31
|
+
for (const auto pair : elements)
|
32
|
+
pair.second->bind_attributes();
|
33
|
+
}
|
34
|
+
|
35
|
+
void trigger_binding_updates()
|
36
|
+
{
|
37
|
+
for (const auto pair : elements)
|
38
|
+
pair.second->trigger_binding_updates();
|
39
|
+
}
|
40
|
+
|
41
|
+
void clear()
|
42
|
+
{
|
43
|
+
for (auto element : elements)
|
44
|
+
element.second->destroy();
|
45
|
+
elements.clear();
|
46
|
+
}
|
47
|
+
|
48
|
+
private:
|
49
|
+
void attach_elements()
|
50
|
+
{
|
51
|
+
std::vector< std::shared_ptr<ELEMENT> > element_vector;
|
52
|
+
|
53
|
+
element_vector.reserve(elements.size());
|
54
|
+
for (const auto& pair : elements)
|
55
|
+
element_vector.push_back(pair.second);
|
56
|
+
AnchorableElement::attach_elements(element_vector);
|
57
|
+
}
|
58
|
+
|
59
|
+
void purge_removed_elements(const ARRAY& array)
|
60
|
+
{
|
61
|
+
auto it = elements.begin();
|
62
|
+
|
63
|
+
while (it != elements.end())
|
64
|
+
{
|
65
|
+
bool exists = false;
|
66
|
+
for (auto subit = array.begin() ; subit != array.end() ; ++subit)
|
67
|
+
{
|
68
|
+
if (subit == it->first)
|
69
|
+
{
|
70
|
+
exists = true;
|
71
|
+
break ;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
if (!exists)
|
75
|
+
{
|
76
|
+
it->second->destroy();
|
77
|
+
it = elements.erase(it);
|
78
|
+
}
|
79
|
+
else
|
80
|
+
++it;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
template<typename PARENT>
|
85
|
+
void update_elements(PARENT* parent, const ARRAY& array)
|
86
|
+
{
|
87
|
+
Elements new_elements;
|
88
|
+
|
89
|
+
new_elements.reserve(array.size());
|
90
|
+
for (Iterator it = array.begin() ; it != array.end() ; ++it)
|
91
|
+
{
|
92
|
+
bool exists = false;
|
93
|
+
|
94
|
+
for (auto subit = elements.begin() ; subit != elements.end() ; ++subit)
|
95
|
+
{
|
96
|
+
if (subit->first == it)
|
97
|
+
{
|
98
|
+
new_elements.push_back(ElementPair(it, subit->second));
|
99
|
+
exists = true;
|
100
|
+
break ;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
if (!exists)
|
104
|
+
{
|
105
|
+
auto ptr = std::make_shared<ELEMENT>(parent, *it);
|
106
|
+
|
107
|
+
ptr->bind_attributes();
|
108
|
+
new_elements.push_back(ElementPair(it, ptr));
|
109
|
+
}
|
110
|
+
}
|
111
|
+
elements = new_elements;
|
112
|
+
}
|
113
|
+
};
|
114
|
+
}
|
115
|
+
|
116
|
+
#endif
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#include "router.hpp"
|
2
|
+
#include "object.hpp"
|
3
|
+
#include "globals.hpp"
|
4
|
+
|
5
|
+
using namespace Comet;
|
6
|
+
using namespace std;
|
7
|
+
|
8
|
+
Router::Router()
|
9
|
+
{
|
10
|
+
window->addEventListener("hashchange", cheerp::Callback([this](client::Event* e) {
|
11
|
+
on_hash_changed();
|
12
|
+
}));
|
13
|
+
initialize();
|
14
|
+
}
|
15
|
+
|
16
|
+
void Router::start()
|
17
|
+
{
|
18
|
+
document.on_ready([this]() { navigate(get_current_path(), true); });
|
19
|
+
}
|
20
|
+
|
21
|
+
void Router::on_hash_changed()
|
22
|
+
{
|
23
|
+
string hash = (string)(*window->get_location()->get_hash());
|
24
|
+
|
25
|
+
if (hash != last_hash)
|
26
|
+
{
|
27
|
+
last_hash = hash;
|
28
|
+
if (hash[0] == '#')
|
29
|
+
hash = hash.substr(1, hash.size() - 1);
|
30
|
+
navigate(hash);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
bool Router::navigate(const string& path, bool trigger)
|
35
|
+
{
|
36
|
+
if ((string)(*window->get_location()->get_hash()) != path)
|
37
|
+
window->get_location()->set_hash(path.c_str());
|
38
|
+
if (trigger)
|
39
|
+
{
|
40
|
+
Params params;
|
41
|
+
const Action* action = get_action("", path, params);
|
42
|
+
|
43
|
+
if (action)
|
44
|
+
{
|
45
|
+
(*action)(params);
|
46
|
+
on_route_executed.trigger(path);
|
47
|
+
return true;
|
48
|
+
}
|
49
|
+
else
|
50
|
+
on_route_not_found.trigger(path);
|
51
|
+
}
|
52
|
+
return false;
|
53
|
+
}
|
54
|
+
|
55
|
+
string Router::get_current_path() const
|
56
|
+
{
|
57
|
+
Comet::Object location_hash = window->get_location()->get_hash();
|
58
|
+
string result = location_hash;
|
59
|
+
|
60
|
+
result.erase(result.begin()); // remove the sharp character
|
61
|
+
return result;
|
62
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#ifndef CRAILS_FRONT_ROUTER_HPP
|
2
|
+
# define CRAILS_FRONT_ROUTER_HPP
|
3
|
+
|
4
|
+
# include "router_base.hpp"
|
5
|
+
# include "signal.hpp"
|
6
|
+
# include <cheerp/client.h>
|
7
|
+
# include <map>
|
8
|
+
|
9
|
+
namespace Comet
|
10
|
+
{
|
11
|
+
typedef std::map<std::string, std::string> Params;
|
12
|
+
|
13
|
+
class Router : public RouterBase<Params, std::function<void (const Params&)> >
|
14
|
+
{
|
15
|
+
public:
|
16
|
+
Router();
|
17
|
+
|
18
|
+
Signal<const std::string&> on_route_executed;
|
19
|
+
Signal<const std::string&> on_route_not_found;
|
20
|
+
|
21
|
+
bool navigate(const std::string& path, bool trigger = true);
|
22
|
+
|
23
|
+
void initialize();
|
24
|
+
void start();
|
25
|
+
std::string get_current_path() const;
|
26
|
+
|
27
|
+
private:
|
28
|
+
void on_hash_changed();
|
29
|
+
|
30
|
+
std::string last_hash;
|
31
|
+
};
|
32
|
+
}
|
33
|
+
|
34
|
+
#endif
|