diff --git a/src/chat_events.hpp b/src/chat_events.hpp index 3479e0ff65e..d92ee6be1c2 100644 --- a/src/chat_events.hpp +++ b/src/chat_events.hpp @@ -43,7 +43,6 @@ protected: virtual void send_whisper(const std::string& receiver, const std::string& message); - virtual void add_whisper_sent(const std::string& receiver, const std::string& message); virtual void add_whisper_received(const std::string& sender, const std::string& message); @@ -55,6 +54,12 @@ protected: virtual void add_chat_room_message_received(const std::string& room, const std::string& speaker, const std::string& message); + /** + * Called when a processed command results in a relation (friend/ignore) change + * for a user whose name is passed as the 'name' arg + */ + virtual void user_relation_changed(const std::string& name); + void change_logging(const std::string& data); friend class chat_command_handler; diff --git a/src/gui/dialogs/lobby_main.cpp b/src/gui/dialogs/lobby_main.cpp index 7b834a8d8b0..e90b171939c 100644 --- a/src/gui/dialogs/lobby_main.cpp +++ b/src/gui/dialogs/lobby_main.cpp @@ -124,6 +124,11 @@ void tlobby_main::send_chat_message(const std::string& message, bool /*allies_on network::send_data(data, 0, true); } +void tlobby_main::user_relation_changed(const std::string& /*name*/) +{ + player_list_dirty_ = true; +} + void tlobby_main::add_chat_message(const time_t& /*time*/, const std::string& speaker, int /*side*/, const std::string& message, events::chat_handler::MESSAGE_TYPE /*type*/) { @@ -247,7 +252,7 @@ tlobby_main::tlobby_main(const config& game_config, lobby_info& info) , chat_input_(NULL), window_(NULL) , lobby_info_(info), preferences_callback_(NULL) , open_windows_(), active_window_(0), selected_game_id_() -, player_list_() +, player_list_(), player_list_dirty_(false) { } @@ -369,7 +374,10 @@ void tlobby_main::update_gamelist() } } update_selected_game(); +} +void tlobby_main::update_playerlist() +{ lobby_info_.update_user_statuses(selected_game_id_, active_window_room()); lobby_info_.sort_users(player_list_.sort_by_name->get_value(), player_list_.sort_by_relation->get_value()); @@ -452,6 +460,7 @@ void tlobby_main::update_gamelist() player_list_.other_games.auto_hide(); window_->invalidate_layout(); + player_list_dirty_ = false; } void tlobby_main::update_selected_game() @@ -468,6 +477,7 @@ void tlobby_main::update_selected_game() } window_->get_widget("observe_global", false).set_active(can_observe); window_->get_widget("join_global", false).set_active(can_join); + update_playerlist(); } void tlobby_main::pre_show(CVideo& /*video*/, twindow& window) @@ -683,7 +693,7 @@ void tlobby_main::active_window_changed() << header.label() << " vs " << t.name << "\n"; } } - window_->invalidate_layout(); + update_playerlist(); } @@ -924,6 +934,7 @@ void tlobby_main::send_message_button_callback(gui2::twindow &/*window*/) // opened window, so e.g. /ignore in a whisper session ignores // the other party without having to specify it's nick. chat_handler::do_speak(input); + if (player_list_dirty_) update_gamelist(); } else { config msg; send_message_to_active_window(input); @@ -1060,6 +1071,7 @@ void tlobby_main::user_dialog_callback(user_info* info) tlobby_chat_window* t = whisper_window_open(info->name, true); switch_to_window(t); } + update_gamelist(); } } // namespace gui2 diff --git a/src/gui/dialogs/lobby_main.hpp b/src/gui/dialogs/lobby_main.hpp index 0a955367fe2..0c7afb987c6 100644 --- a/src/gui/dialogs/lobby_main.hpp +++ b/src/gui/dialogs/lobby_main.hpp @@ -83,6 +83,8 @@ public: void update_gamelist(); + void update_playerlist(); + enum legacy_result { QUIT, JOIN, OBSERVE, CREATE, PREFERENCES }; legacy_result get_legacy_result() const { return legacy_result_; } @@ -105,6 +107,8 @@ protected: /** inherited form chat_handler */ virtual void send_chat_message(const std::string& message, bool /*allies_only*/); + virtual void user_relation_changed(const std::string& name); + /** inherited form chat_handler */ virtual void add_chat_message(const time_t& time, const std::string& speaker, int side, const std::string& message, @@ -341,6 +345,8 @@ private: int selected_game_id_; tplayer_list player_list_; + + bool player_list_dirty_; }; } // namespace gui2 diff --git a/src/lobby_data.cpp b/src/lobby_data.cpp index ce05616160b..497fef5879f 100644 --- a/src/lobby_data.cpp +++ b/src/lobby_data.cpp @@ -108,15 +108,6 @@ user_info::user_info(const config& c) , registered(utils::string_bool(c["registered"])) , observing(c["status"] == "observing") { - if (name == preferences::login()) { - relation = ME; - } else if (preferences::is_ignored(name)) { - relation = IGNORED; - } else if (preferences::is_friend(name)) { - relation = FRIEND; - } else { - relation = NEUTRAL; - } } void user_info::update_state(int selected_game_id, const room_info* current_room /*= NULL*/) @@ -134,6 +125,15 @@ void user_info::update_state(int selected_game_id, const room_info* current_room state = LOBBY; } } + if (name == preferences::login()) { + relation = ME; + } else if (preferences::is_ignored(name)) { + relation = IGNORED; + } else if (preferences::is_friend(name)) { + relation = FRIEND; + } else { + relation = NEUTRAL; + } } diff --git a/src/menu_events.cpp b/src/menu_events.cpp index ee364f020b4..e34339e1174 100644 --- a/src/menu_events.cpp +++ b/src/menu_events.cpp @@ -2439,6 +2439,10 @@ private: cch.dispatch(cmd); } + void chat_handler::user_relation_changed(const std::string& name) + { + } + void chat_handler::send_whisper(const std::string& receiver, const std::string& message) { config cwhisper, data; @@ -2546,6 +2550,7 @@ private: for(int i = 1; !get_arg(i).empty(); i++){ if (preferences::add_ignore(get_arg(i))) { print("ignore", _("Added to ignore list: ") + get_arg(i)); + chat_handler_.user_relation_changed(get_arg(i)); } else { command_failed(_("Invalid username: ") + get_arg(i)); } @@ -2561,6 +2566,7 @@ private: } else { for(int i = 1;!get_arg(i).empty();i++){ if (preferences::add_friend(get_arg(i))) { + chat_handler_.user_relation_changed(get_arg(i)); print("friend", _("Added to friends list: ") + get_arg(i)); } else { command_failed(_("Invalid username: ") + get_arg(i)); @@ -2574,6 +2580,7 @@ private: for(int i = 1;!get_arg(i).empty();i++){ preferences::remove_friend(get_arg(i)); preferences::remove_ignore(get_arg(i)); + chat_handler_.user_relation_changed(get_arg(i)); print("list", _("Removed from list: ") + get_arg(i)); } }