19 : settingInfo (commandController.getOpenMSXInfoCommand())
20 , setCompleter (commandController)
21 , incrCompleter (commandController, *this,
"incr")
22 , unsetCompleter(commandController, *this,
"unset")
28 assert(settings.empty());
33 assert(!settings.contains(
setting.getFullNameObj()));
34 settings.emplace_noDuplicateCheck(&
setting);
39 const auto& name =
setting.getFullNameObj();
40 assert(settings.contains(name));
46 if (
auto it = settings.find(name); it !=
end(settings)) {
49 if (name.starts_with(
"::")) {
51 if (
auto it = settings.find(name.substr(2)); it !=
end(settings)) {
56 if (
auto it = settings.find(
tmpStrCat(
"::", name)); it !=
end(settings)) {
65 auto size = prefix.size() + baseName.size();
66 VLA(
char, fullname, size);
69 return findSetting(std::string_view(fullname.data(), size));
74BaseSetting& SettingsManager::getByName(std::string_view cmd, std::string_view name)
const
79 throw CommandException(cmd,
": ", name,
": no such setting");
82std::vector<string> SettingsManager::getTabSettingNames()
const
84 std::vector<string> result;
85 result.reserve(settings.size() * 2);
86 for (
auto* s : settings) {
87 std::string_view name = s->getFullName();
88 result.emplace_back(name);
89 if (name.starts_with(
"::")) {
90 result.emplace_back(name.substr(2));
92 result.push_back(
strCat(
"::", name));
101 for (
auto* s : settings) {
102 if (!s->needLoadSave())
continue;
109 s->setValue(s->getDefaultValue());
112 s->setValue(s->getDefaultValue());
120SettingsManager::SettingInfo::SettingInfo(
InfoCommand& openMSXInfoCommand)
121 :
InfoTopic(openMSXInfoCommand,
"setting")
125void SettingsManager::SettingInfo::execute(
126 std::span<const TclObject> tokens, TclObject& result)
const
128 auto& manager =
OUTER(SettingsManager, settingInfo);
129 switch (tokens.size()) {
133 [](
auto* p) { return p->getFullNameObj(); }));
136 const auto& settingName = tokens[2].getString();
137 auto*
setting = manager.findSetting(settingName);
139 throw CommandException(
"No such setting: ", settingName);
143 }
catch (MSXException& e) {
144 throw CommandException(
e.getMessage());
150 throw CommandException(
"Too many parameters.");
154string SettingsManager::SettingInfo::help(std::span<const TclObject> )
const
156 return "openmsx_info setting : "
157 "returns list of all settings\n"
158 "openmsx_info setting <name> : "
159 "returns info on a specific setting\n";
162void SettingsManager::SettingInfo::tabCompletion(std::vector<string>& tokens)
const
164 if (tokens.size() == 3) {
166 auto& manager =
OUTER(SettingsManager, settingInfo);
167 completeString(tokens, manager.getTabSettingNames());
174SettingsManager::SetCompleter::SetCompleter(
175 CommandController& commandController_)
176 : CommandCompleter(commandController_,
"set")
180string SettingsManager::SetCompleter::help(std::span<const TclObject> tokens)
const
182 if (tokens.size() == 2) {
183 auto& manager =
OUTER(SettingsManager, setCompleter);
184 return string(manager.getByName(
"set", tokens[1].getString()).getDescription());
186 return "Set or query the value of a openMSX setting or Tcl variable\n"
187 " set <setting> shows current value\n"
188 " set <setting> <value> set a new value\n"
189 "Use 'help set <setting>' to get more info on a specific\n"
190 "openMSX setting.\n";
193void SettingsManager::SetCompleter::tabCompletion(std::vector<string>& tokens)
const
195 auto& manager =
OUTER(SettingsManager, setCompleter);
196 switch (tokens.size()) {
199 completeString(tokens, manager.getTabSettingNames(),
false);
204 if (
auto*
setting = manager.findSetting(tokens[1])) {
214SettingsManager::SettingCompleter::SettingCompleter(
215 CommandController& commandController_, SettingsManager& manager_,
217 : CommandCompleter(commandController_, name_)
222string SettingsManager::SettingCompleter::help(std::span<const TclObject> )
const
227void SettingsManager::SettingCompleter::tabCompletion(std::vector<string>& tokens)
const
229 if (tokens.size() == 2) {
231 completeString(tokens, manager.getTabSettingNames());
void info(TclObject &result) const
For SettingInfo.
virtual void tabCompletion(std::vector< std::string > &tokens) const =0
Complete a partly typed value.
const std::string * getValueForSetting(std::string_view setting) const
BaseSetting * findSetting(std::string_view name) const
Find the setting with given name.
SettingsManager(const SettingsManager &)=delete
void unregisterSetting(BaseSetting &setting)
void loadSettings(const SettingsConfig &config)
void registerSetting(BaseSetting &setting)
This file implemented 3 utility functions:
auto copy(InputRange &&range, OutputIter out)
constexpr auto transform(Range &&range, UnaryOp op)
#define OUTER(type, member)
TemporaryString tmpStrCat(Ts &&... ts)
#define VLA(TYPE, NAME, LENGTH)
constexpr auto end(const zstring_view &x)