14 using std::string_view;
22 : settingInfo (commandController.getOpenMSXInfoCommand())
23 , setCompleter (commandController)
24 , incrCompleter (commandController, *this,
"incr")
25 , unsetCompleter(commandController, *this,
"unset")
31 assert(settings.empty());
37 settings.emplace_noDuplicateCheck(&setting);
43 assert(settings.contains(name));
49 if (
auto it = settings.find(name); it !=
end(settings)) {
54 if (
auto it = settings.find(name.substr(2)); it !=
end(settings)) {
59 if (
auto it = settings.find(
tmpStrCat(
"::", name)); it !=
end(settings)) {
68 auto size = prefix.size() + baseName.size();
70 memcpy(&fullname[0], prefix .data(), prefix .
size());
71 memcpy(&fullname[prefix.size()], baseName.data(), baseName.size());
77 BaseSetting& SettingsManager::getByName(string_view cmd, string_view name)
const
82 throw CommandException(cmd,
": ", name,
": no such setting");
85 vector<string> SettingsManager::getTabSettingNames()
const
87 vector<string> result;
88 result.reserve(settings.size() * 2);
89 for (
auto* s : settings) {
90 string_view name = s->getFullName();
91 result.emplace_back(name);
93 result.emplace_back(name.substr(2));
95 result.push_back(
strCat(
"::", name));
104 for (
auto* s : settings) {
105 if (s->needLoadSave()) {
106 s->setValue(s->getRestoreValue());
111 const auto* settingsElem = config.
findChild(
"settings");
112 if (!settingsElem)
return;
113 for (
auto* s : settings) {
114 if (!s->needLoadSave())
continue;
115 if (
const auto* elem = settingsElem->findChildWithAttribute(
116 "setting",
"id", s->getFullName())) {
129 SettingsManager::SettingInfo::SettingInfo(
InfoCommand& openMSXInfoCommand)
130 :
InfoTopic(openMSXInfoCommand,
"setting")
134 void SettingsManager::SettingInfo::execute(
137 auto& manager =
OUTER(SettingsManager, settingInfo);
138 switch (tokens.
size()) {
142 [](
auto* p) { return p->getFullNameObj(); }));
145 const auto& settingName = tokens[2].getString();
146 auto* setting = manager.findSetting(settingName);
148 throw CommandException(
"No such setting: ", settingName);
150 setting->info(result);
154 throw CommandException(
"Too many parameters.");
158 string SettingsManager::SettingInfo::help(
const vector<string>& )
const
160 return "openmsx_info setting : "
161 "returns list of all settings\n"
162 "openmsx_info setting <name> : "
163 "returns info on a specific setting\n";
166 void SettingsManager::SettingInfo::tabCompletion(vector<string>& tokens)
const
168 if (tokens.size() == 3) {
170 auto& manager =
OUTER(SettingsManager, settingInfo);
171 completeString(tokens, manager.getTabSettingNames());
178 SettingsManager::SetCompleter::SetCompleter(
179 CommandController& commandController_)
180 : CommandCompleter(commandController_,
"set")
184 string SettingsManager::SetCompleter::help(
const vector<string>& tokens)
const
186 if (tokens.size() == 2) {
187 auto& manager =
OUTER(SettingsManager, setCompleter);
188 return string(manager.getByName(
"set", tokens[1]).getDescription());
190 return "Set or query the value of a openMSX setting or Tcl variable\n"
191 " set <setting> shows current value\n"
192 " set <setting> <value> set a new value\n"
193 "Use 'help set <setting>' to get more info on a specific\n"
194 "openMSX setting.\n";
197 void SettingsManager::SetCompleter::tabCompletion(vector<string>& tokens)
const
199 auto& manager =
OUTER(SettingsManager, setCompleter);
200 switch (tokens.size()) {
203 completeString(tokens, manager.getTabSettingNames(),
false);
208 if (
auto* setting = manager.findSetting(tokens[1])) {
209 setting->tabCompletion(tokens);
218 SettingsManager::SettingCompleter::SettingCompleter(
219 CommandController& commandController_, SettingsManager& manager_,
221 : CommandCompleter(commandController_, name_)
226 string SettingsManager::SettingCompleter::help(
const vector<string>& )
const
231 void SettingsManager::SettingCompleter::tabCompletion(vector<string>& tokens)
const
233 if (tokens.size() == 2) {
235 completeString(tokens, manager.getTabSettingNames());
const TclObject & getFullNameObj() const
Get the name of this setting.
BaseSetting * findSetting(std::string_view name) const
Find the setting with given name.
SettingsManager(const SettingsManager &)=delete
void unregisterSetting(BaseSetting &setting)
void loadSettings(const XMLElement &config)
void registerSetting(BaseSetting &setting)
const XMLElement * findChild(std::string_view childName) const
constexpr index_type size() const noexcept
bool startsWith(string_view total, string_view part)
This file implemented 3 utility functions:
size_t size(std::string_view utf8)
constexpr auto transform(Range &&range, UnaryOp op)
#define OUTER(type, member)
TemporaryString tmpStrCat(Ts &&... ts)
std::string strCat(Ts &&...ts)
#define VLA(TYPE, NAME, LENGTH)
constexpr auto end(const zstring_view &x)