载入中...
搜索中...
未找到
ObjectRegistry.cpp
浏览该文件的文档.
1#include "ui/ObjectRegistry.h"
2
3#include "common/Module.h"
4#include "common/Runtime.h"
5
6#include <algorithm>
7
8namespace eve::ui {
9
11 static ObjectRegistry registry;
12 return registry;
13}
14
15uint64_t ObjectRegistry::create(const std::string& className) {
16 if (className.empty()) return 0;
18 if (!rt) return 0;
19 try {
20 return registerObject(className, rt->createInstance(className));
21 } catch (...) {
22 return 0;
23 }
24}
25
26uint64_t ObjectRegistry::registerObject(const std::string& className,
27 const ssq::Object& object,
28 const std::string& label) {
29 if (object.getType() != ssq::Type::INSTANCE) return 0;
30 std::string group = className;
31 if (group.empty()) {
33 if (!rt) return 0;
34 group = rt->classNameOf(object);
35 if (group.empty()) return 0;
36 }
37 const uint64_t id = nextId_++;
39 entry.id = id;
41 entry.object = object;
42 entry.label = label.empty() ? group + " #" + std::to_string(count(group) + 1)
43 : label;
44 byClass_[group].push_back(std::move(entry));
45 return id;
46}
47
48bool ObjectRegistry::unregister(uint64_t id) {
49 for (auto& pair : byClass_) {
50 auto& entries = pair.second;
51 const auto it = std::find_if(entries.begin(), entries.end(),
52 [&](const ObjectEntry& e) { return e.id == id; });
53 if (it == entries.end()) continue;
54 entries.erase(it);
55 if (entries.empty()) byClass_.erase(pair.first);
56 return true;
57 }
58 return false;
59}
60
61void ObjectRegistry::clear(const std::string& className) {
62 byClass_.erase(className);
63}
64
66 byClass_.clear();
67}
68
69std::vector<std::string> ObjectRegistry::classNames() const {
70 std::vector<std::string> names;
71 names.reserve(byClass_.size());
72 for (const auto& pair : byClass_) names.push_back(pair.first);
73 return names;
74}
75
76std::vector<ObjectEntry> ObjectRegistry::entries(const std::string& className) const {
77 const auto found = byClass_.find(className);
78 return found == byClass_.end() ? std::vector<ObjectEntry>()
79 : found->second;
80}
81
82const ObjectEntry* ObjectRegistry::entry(uint64_t id) const {
83 for (const auto& pair : byClass_) {
84 for (const ObjectEntry& e : pair.second) {
85 if (e.id == id) return &e;
86 }
87 }
88 return nullptr;
89}
90
91size_t ObjectRegistry::count(const std::string& className) const {
92 const auto found = byClass_.find(className);
93 return found == byClass_.end() ? 0 : found->second.size();
94}
95
96} // namespace eve::ui
std::string id
const FusedGroup & group
static Runtime * runtime()
Active runtime associated with the last expose() call, or nullptr.
Definition Module.cpp:68
ssq::Object createInstance(const std::string &name, const std::string &source={})
Creates a live instance of a script class (default constructor).
Definition Runtime.cpp:593
std::string classNameOf(const ssq::Object &instance) const
Name of the script class of a live instance ("" when unknown).
Definition Runtime.cpp:1169
Reflectable script-object registry backing the database panel.
void clearAll()
Removes every entry.
uint64_t registerObject(const std::string &className, const ssq::Object &object, const std::string &label={})
Registers an existing live script instance.
uint64_t create(const std::string &className)
Creates a class instance through the active Runtime and registers it.
size_t count(const std::string &className) const
Number of entries of a class.
bool unregister(uint64_t id)
Removes an entry by id (the object itself stays alive).
static ObjectRegistry & instance()
std::vector< std::string > classNames() const
Class names with at least one entry, sorted.
void clear(const std::string &className)
Removes every entry of a class.
std::vector< ObjectEntry > entries(const std::string &className) const
Entries of a class, in registration order.
const ObjectEntry * entry(uint64_t id) const
Look up one entry by id; nullptr when unknown.
One registered live script instance.