diff --git a/Applications/IRCClient/IRCChannelMemberListModel.cpp b/Applications/IRCClient/IRCChannelMemberListModel.cpp index aca79040c8..ff25503fd8 100644 --- a/Applications/IRCClient/IRCChannelMemberListModel.cpp +++ b/Applications/IRCClient/IRCChannelMemberListModel.cpp @@ -81,3 +81,8 @@ void IRCChannelMemberListModel::update() { did_update(); } + +String IRCChannelMemberListModel::nick_at(const GUI::ModelIndex& index) const +{ + return data(index, IRCChannelMemberListModel::Role::Display).to_string(); +} diff --git a/Applications/IRCClient/IRCChannelMemberListModel.h b/Applications/IRCClient/IRCChannelMemberListModel.h index 95acee0ce5..2bc62b795e 100644 --- a/Applications/IRCClient/IRCChannelMemberListModel.h +++ b/Applications/IRCClient/IRCChannelMemberListModel.h @@ -45,6 +45,7 @@ public: virtual ColumnMetadata column_metadata(int column) const override; virtual GUI::Variant data(const GUI::ModelIndex&, Role = Role::Display) const override; virtual void update() override; + virtual String nick_at(const GUI::ModelIndex& index) const; private: explicit IRCChannelMemberListModel(IRCChannel&); diff --git a/Applications/IRCClient/IRCClient.cpp b/Applications/IRCClient/IRCClient.cpp index 83314e3555..c00d814654 100644 --- a/Applications/IRCClient/IRCClient.cpp +++ b/Applications/IRCClient/IRCClient.cpp @@ -423,6 +423,14 @@ void IRCClient::handle_user_input_in_server(const String& input) return handle_user_command(input); } +String IRCClient::nick_without_prefix(const String& nick) +{ + assert(!nick.is_empty()); + if (IRCClient::is_nick_prefix(nick[0])) + return nick.substring(1, nick.length() - 1); + return nick; +} + bool IRCClient::is_nick_prefix(char ch) { switch (ch) { diff --git a/Applications/IRCClient/IRCClient.h b/Applications/IRCClient/IRCClient.h index c116e14797..a9a3b81e22 100644 --- a/Applications/IRCClient/IRCClient.h +++ b/Applications/IRCClient/IRCClient.h @@ -66,6 +66,7 @@ public: static bool is_nick_prefix(char); static bool is_channel_prefix(char); + String nick_without_prefix(const String& nick); IRCWindow* current_window() { return aid_get_active_window(); } const IRCWindow* current_window() const { return aid_get_active_window(); } diff --git a/Applications/IRCClient/IRCWindow.cpp b/Applications/IRCClient/IRCWindow.cpp index c3dc4e2e4e..b00d031d60 100644 --- a/Applications/IRCClient/IRCWindow.cpp +++ b/Applications/IRCClient/IRCWindow.cpp @@ -69,80 +69,61 @@ IRCWindow::IRCWindow(IRCClient& client, void* owner, Type type, const String& na m_context_menu = GUI::Menu::construct(); m_context_menu->add_action(GUI::Action::create("Open query", Gfx::Bitmap::load_from_file("/res/icons/16x16/irc-open-query.png"), [&](const GUI::Action&) { - GUI::ModelIndex new_index = member_view.selection().first(); - auto nick = member_view.model()->data(new_index, IRCChannelMemberListModel::Role::Display).to_string(); + auto nick = channel().member_model()->nick_at(member_view.selection().first()); if (nick.is_empty()) return; - if (IRCClient::is_nick_prefix(nick[0])) - nick = nick.substring(1, nick.length() - 1); - m_client.handle_open_query_action(nick.characters()); + m_client.handle_open_query_action(m_client.nick_without_prefix(nick.characters())); })); m_context_menu->add_action(GUI::Action::create("Whois", Gfx::Bitmap::load_from_file("/res/icons/16x16/irc-whois.png"), [&](const GUI::Action&) { - GUI::ModelIndex new_index = member_view.selection().first(); - auto nick = member_view.model()->data(new_index, IRCChannelMemberListModel::Role::Display).to_string(); + auto nick = channel().member_model()->nick_at(member_view.selection().first()); if (nick.is_empty()) return; - if (IRCClient::is_nick_prefix(nick[0])) - nick = nick.substring(1, nick.length() - 1); - m_client.handle_whois_action(nick.characters()); + m_client.handle_whois_action(m_client.nick_without_prefix(nick.characters())); })); m_context_menu->add_separator(); m_context_menu->add_action(GUI::Action::create("Voice", [&](const GUI::Action&) { - GUI::ModelIndex new_index = member_view.selection().first(); - auto nick = member_view.model()->data(new_index, IRCChannelMemberListModel::Role::Display).to_string(); + auto nick = channel().member_model()->nick_at(member_view.selection().first()); if (nick.is_empty()) return; - if (IRCClient::is_nick_prefix(nick[0])) - nick = nick.substring(1, nick.length() - 1); auto input_box = GUI::InputBox::construct("Enter reason:", "Reason"); - m_client.handle_voice_user_action(m_name.characters(), nick.characters()); + m_client.handle_voice_user_action(m_name.characters(), m_client.nick_without_prefix(nick.characters())); })); m_context_menu->add_action(GUI::Action::create("DeVoice", [&](const GUI::Action&) { - GUI::ModelIndex new_index = member_view.selection().first(); - auto nick = member_view.model()->data(new_index, IRCChannelMemberListModel::Role::Display).to_string(); + auto nick = channel().member_model()->nick_at(member_view.selection().first()); if (nick.is_empty()) return; - if (IRCClient::is_nick_prefix(nick[0])) - nick = nick.substring(1, nick.length() - 1); - m_client.handle_devoice_user_action(m_name.characters(), nick.characters()); + m_client.handle_devoice_user_action(m_name.characters(), m_client.nick_without_prefix(nick.characters())); })); m_context_menu->add_action(GUI::Action::create("Op", [&](const GUI::Action&) { - GUI::ModelIndex new_index = member_view.selection().first(); - auto nick = member_view.model()->data(new_index, IRCChannelMemberListModel::Role::Display).to_string(); + auto nick = channel().member_model()->nick_at(member_view.selection().first()); if (nick.is_empty()) return; - if (IRCClient::is_nick_prefix(nick[0])) - nick = nick.substring(1, nick.length() - 1); - m_client.handle_op_user_action(m_name.characters(), nick.characters()); + m_client.handle_op_user_action(m_name.characters(), m_client.nick_without_prefix(nick.characters())); })); m_context_menu->add_action(GUI::Action::create("DeOp", [&](const GUI::Action&) { - GUI::ModelIndex new_index = member_view.selection().first(); - auto nick = member_view.model()->data(new_index, IRCChannelMemberListModel::Role::Display).to_string(); + auto nick = channel().member_model()->nick_at(member_view.selection().first()); if (nick.is_empty()) return; - if (IRCClient::is_nick_prefix(nick[0])) - nick = nick.substring(1, nick.length() - 1); - m_client.handle_deop_user_action(m_name.characters(), nick.characters()); + m_client.handle_deop_user_action(m_name.characters(), m_client.nick_without_prefix(nick.characters())); })); m_context_menu->add_separator(); m_context_menu->add_action(GUI::Action::create("Kick", [&](const GUI::Action&) { - GUI::ModelIndex new_index = member_view.selection().first(); - auto nick = member_view.model()->data(new_index, IRCChannelMemberListModel::Role::Display).to_string(); + auto nick = channel().member_model()->nick_at(member_view.selection().first()); if (nick.is_empty()) return; if (IRCClient::is_nick_prefix(nick[0])) nick = nick.substring(1, nick.length() - 1); auto input_box = GUI::InputBox::construct("Enter reason:", "Reason"); if (input_box->exec() == GUI::InputBox::ExecOK) - m_client.handle_kick_user_action(m_name.characters(), nick.characters(), input_box->text_value()); + m_client.handle_kick_user_action(m_name.characters(), m_client.nick_without_prefix(nick.characters()), input_box->text_value()); })); m_context_menu->popup(event.screen_position());