Rework client name change
This commit is contained in:
parent
000af8e206
commit
27a1e70b01
|
@ -73,12 +73,12 @@ public:
|
||||||
|
|
||||||
Context& context() { return m_context; }
|
Context& context() { return m_context; }
|
||||||
const String& name() const { return m_name; }
|
const String& name() const { return m_name; }
|
||||||
|
void set_name(String name) { m_name = std::move(name); }
|
||||||
|
|
||||||
UserInterface& ui() const { return *m_ui; }
|
UserInterface& ui() const { return *m_ui; }
|
||||||
private:
|
private:
|
||||||
Context m_context;
|
Context m_context;
|
||||||
friend class InputMode;
|
friend class InputMode;
|
||||||
friend class ClientManager;
|
|
||||||
std::unique_ptr<UserInterface> m_ui;
|
std::unique_ptr<UserInterface> m_ui;
|
||||||
std::unique_ptr<InputMode> m_mode;
|
std::unique_ptr<InputMode> m_mode;
|
||||||
std::vector<std::unique_ptr<InputMode>> m_mode_trash;
|
std::vector<std::unique_ptr<InputMode>> m_mode_trash;
|
||||||
|
|
|
@ -19,16 +19,7 @@ String ClientManager::generate_name() const
|
||||||
for (int i = 0; true; ++i)
|
for (int i = 0; true; ++i)
|
||||||
{
|
{
|
||||||
String name = "unnamed" + to_string(i);
|
String name = "unnamed" + to_string(i);
|
||||||
bool found = false;
|
if (validate_client_name(name))
|
||||||
for (auto& client : m_clients)
|
|
||||||
{
|
|
||||||
if (client->m_name == name)
|
|
||||||
{
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (not found)
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,7 +114,7 @@ void ClientManager::ensure_no_client_uses_buffer(Buffer& buffer)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (client->context().editor().is_editing())
|
if (client->context().editor().is_editing())
|
||||||
throw runtime_error("client '" + client->m_name + "' is inserting in '" +
|
throw runtime_error("client '" + client->name() + "' is inserting in '" +
|
||||||
buffer.display_name() + '\'');
|
buffer.display_name() + '\'');
|
||||||
|
|
||||||
// change client context to edit the first buffer which is not the
|
// change client context to edit the first buffer which is not the
|
||||||
|
@ -145,30 +136,18 @@ void ClientManager::ensure_no_client_uses_buffer(Buffer& buffer)
|
||||||
m_windows.erase(end, m_windows.end());
|
m_windows.erase(end, m_windows.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientManager::set_client_name(Client& client, String name)
|
bool ClientManager::validate_client_name(const String& name) const
|
||||||
{
|
{
|
||||||
auto it = find_if(m_clients, [&name](std::unique_ptr<Client>& client)
|
auto it = find_if(m_clients, [&](const std::unique_ptr<Client>& client)
|
||||||
{ return client->m_name == name; });
|
{ return client->name() == name; });
|
||||||
if (it != m_clients.end() and it->get() != &client)
|
return it == m_clients.end();
|
||||||
throw runtime_error("name not unique: " + name);
|
|
||||||
client.m_name = std::move(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
Client& ClientManager::get_client(const Context& context)
|
|
||||||
{
|
|
||||||
for (auto& client : m_clients)
|
|
||||||
{
|
|
||||||
if (&client->context() == &context)
|
|
||||||
return *client;
|
|
||||||
}
|
|
||||||
throw runtime_error("no client for current context");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Client& ClientManager::get_client(const String& name)
|
Client& ClientManager::get_client(const String& name)
|
||||||
{
|
{
|
||||||
for (auto& client : m_clients)
|
for (auto& client : m_clients)
|
||||||
{
|
{
|
||||||
if (client->m_name == name)
|
if (client->name() == name)
|
||||||
return *client;
|
return *client;
|
||||||
}
|
}
|
||||||
throw runtime_error("no client named: " + name);
|
throw runtime_error("no client named: " + name);
|
||||||
|
|
|
@ -26,9 +26,8 @@ public:
|
||||||
|
|
||||||
void redraw_clients() const;
|
void redraw_clients() const;
|
||||||
|
|
||||||
Client& get_client(const Context& context);
|
|
||||||
Client& get_client(const String& name);
|
Client& get_client(const String& name);
|
||||||
void set_client_name(Client& client, String name);
|
bool validate_client_name(const String& name) const;
|
||||||
void remove_client(Client& client);
|
void remove_client(Client& client);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -777,8 +777,10 @@ void set_client_name(CommandParameters params, Context& context)
|
||||||
{
|
{
|
||||||
ParametersParser parser(params, OptionMap{},
|
ParametersParser parser(params, OptionMap{},
|
||||||
ParametersParser::Flags::None, 1, 1);
|
ParametersParser::Flags::None, 1, 1);
|
||||||
auto& manager = ClientManager::instance();
|
if (ClientManager::instance().validate_client_name(params[0]))
|
||||||
manager.set_client_name(manager.get_client(context), params[0]);
|
context.client().set_name(params[0]);
|
||||||
|
else if (context.client().name() != params[0])
|
||||||
|
throw runtime_error("client name '" + params[0] + "' is not unique");
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_register(CommandParameters params, Context& context)
|
void set_register(CommandParameters params, Context& context)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user