void tchatbox::add_room_window_message(const std::string& room, const std::string& sender, const std::string& message) { tlobby_chat_window* t = room_window_open(room, false); if(!t) { ERR_LB << "Room window not open in add_room_window_message for " << room << "\n"; return; } const std::string text = formatter() << "<b>" << sender << ":</b> " << font::escape_text(message); append_to_chatbox(text, t - &open_windows_[0], false); }
void tlobby_main::add_room_window_message(const std::string& room, const std::string& sender, const std::string& message) { std::stringstream ss; ss << "<b>" << sender << ":</b> " << font::escape_text(message); tlobby_chat_window* t = room_window_open(room, false); if(!t) { ERR_LB << "Room window not open in add_room_window_message for " << room << "\n"; return; } append_to_chatbox(ss.str(), t - &open_windows_[0], false); }
void tchatbox::increment_waiting_messages(const std::string& room) { if(tlobby_chat_window* t = room_window_open(room, false)) { t->pending_messages++; if(t->pending_messages == 1) { int idx = t - &open_windows_[0]; DBG_LB << "do room pending mark row " << idx << " with " << t->name << "\n"; tgrid* grid = roomlistbox_->get_row_grid(idx); // this breaks for some reason // tlabel& label = grid->get_widget<tlabel>("room", false); // label.set_use_markup(true); // label.set_label(colorize(t->name, "red")); find_widget<timage>(grid, "pending_messages", false).set_visible(twidget::tvisible::visible); } } }
void tlobby_main::process_room_join(const config& data) { const std::string& room = data["room"]; const std::string& player = data["player"]; room_info* r = lobby_info_.get_room(room); DBG_LB << "room join: " << room << " " << player << " " << static_cast<void*>(r) << "\n"; if(r) { if(player == preferences::login()) { if(const config& members = data.child("members")) { r->process_room_members(members); } } else { r->add_member(player); /* TODO: add/use preference */ utils::string_map symbols; symbols["player"] = player; add_room_window_message( room, "server", VGETTEXT("$player has entered the room", symbols)); } if(r == active_window_room()) { player_list_dirty_ = true; } } else { if(player == preferences::login()) { tlobby_chat_window* t = room_window_open(room, true); lobby_info_.open_room(room); r = lobby_info_.get_room(room); assert(r); if(const config& members = data.child("members")) { r->process_room_members(members); } switch_to_window(t); const std::string& topic = data["topic"]; if(!topic.empty()) { add_chat_room_message_received( "room", "server", room + ": " + topic); } } else { LOG_LB << "Discarding join info for a room the player is not in\n"; } } }
void tlobby_main::add_chat_room_message_sent(const std::string& room, const std::string& message) { // do not open room window here, player should be in the room before sending // messages yo it should be allowed to happen if(tlobby_chat_window* t = room_window_open(room, false)) { room_info* ri = lobby_info_.get_room(room); assert(ri); if(!room_window_active(room)) { switch_to_window(t); } ri->log().add_message(preferences::login(), message); add_active_window_message(preferences::login(), message, true); } else { LOG_LB << "Cannot add sent message to ui for room " << room << ", player not in the room\n"; } }
void tchatbox::process_room_query_response(const ::config& data) { const std::string& room = data["room"]; const std::string& message = data["message"]; DBG_LB << "room query response: " << room << " " << message << "\n"; if(room.empty()) { if(!message.empty()) { add_active_window_message("server", message); } if(const ::config& rooms = data.child("rooms")) { // TODO: this should really open a nice join room dialog instead std::stringstream ss; ss << "Rooms:"; for(const auto & r : rooms.child_range("room")) { ss << " " << r["name"]; } add_active_window_message("server", ss.str()); } } else { if(room_window_open(room, false)) { if(!message.empty()) { add_chat_room_message_received(room, "server", message); } if(const ::config& members = data.child("members")) { room_info* r = lobby_info().get_room(room); assert(r); r->process_room_members(members); if(r == active_window_room()) { active_window_changed_callback_(); } } } else { if(!message.empty()) { add_active_window_message("server", room + ": " + message); } } } }
void tchatbox::process_room_join(const ::config& data) { const std::string& room = data["room"]; const std::string& player = data["player"]; DBG_LB << "room join: " << room << " " << player << "\n"; room_info* r = lobby_info().get_room(room); if(r) { if(player == preferences::login()) { if(const auto& members = data.child("members")) { r->process_room_members(members); } } else { r->add_member(player); /* TODO: add/use preference */ add_room_window_message(room, "server", vgettext("$player has entered the room", {{"player", player}})); } if(r == active_window_room()) { active_window_changed_callback_(); } } else { if(player == preferences::login()) { tlobby_chat_window* t = room_window_open(room, true); lobby_info().open_room(room); r = lobby_info().get_room(room); assert(r); if(const auto& members = data.child("members")) { r->process_room_members(members); } switch_to_window(t); const std::string& topic = data["topic"]; if(!topic.empty()) { add_chat_room_message_received("room", "server", room + ": " + topic); } } else { LOG_LB << "Discarding join info for a room the player is not in\n"; } } }
void tchatbox::add_chat_room_message_sent(const std::string& room, const std::string& message) { tlobby_chat_window* t = room_window_open(room, false); if(!t) { LOG_LB << "Cannot add sent message to ui for room " << room << ", player not in the room\n"; return; } // Do not open room window here. The player should be in the room before sending messages room_info* ri = lobby_info().get_room(room); assert(ri); if(!room_window_active(room)) { switch_to_window(t); } ri->log().add_message(preferences::login(), message); add_active_window_message(preferences::login(), message, true); }
void tlobby_main::pre_show(twindow& window) { SCOPE_LB; roomlistbox_ = find_widget<tlistbox>(&window, "room_list", false, true); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( *roomlistbox_, std::bind(&tlobby_main::room_switch_callback, *this, std::ref(window))); #else roomlistbox_->set_callback_value_change( dialog_callback<tlobby_main, &tlobby_main::room_switch_callback>); #endif gamelistbox_ = find_widget<tlistbox>(&window, "game_list", false, true); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( *gamelistbox_, std::bind(&tlobby_main::gamelist_change_callback, *this, std::ref(window))); #else gamelistbox_->set_callback_value_change( dialog_callback<tlobby_main, &tlobby_main::gamelist_change_callback>); #endif window.keyboard_capture(gamelistbox_); player_list_.init(window); player_list_.sort_by_name->set_value(preferences::playerlist_sort_name()); player_list_.sort_by_relation->set_value(preferences::playerlist_sort_relation()); player_list_.update_sort_icons(); player_list_.sort_by_name->set_callback_state_change( std::bind(&tlobby_main::player_filter_callback, this, _1)); player_list_.sort_by_relation->set_callback_state_change( std::bind(&tlobby_main::player_filter_callback, this, _1)); chat_log_container_ = find_widget<tmulti_page>(&window, "chat_log_container", false, true); window.set_enter_disabled(true); window_ = &window; chat_input_ = find_widget<ttext_box>(&window, "chat_input", false, true); assert(chat_input_); connect_signal_pre_key_press( *chat_input_, std::bind(&tlobby_main::chat_input_keypress_callback, this, _3, _4, _5, std::ref(window))); connect_signal_mouse_left_click( find_widget<tbutton>(&window, "create", false), std::bind(&tlobby_main::create_button_callback, this, std::ref(window))); connect_signal_mouse_left_click( find_widget<tbutton>(&window, "refresh", false), std::bind(&tlobby_main::refresh_button_callback, this, std::ref(window))); connect_signal_mouse_left_click( find_widget<tbutton>(&window, "show_preferences", false), std::bind(&tlobby_main::show_preferences_button_callback, this, std::ref(window))); connect_signal_mouse_left_click( find_widget<tbutton>(&window, "join_global", false), std::bind(&tlobby_main::join_global_button_callback, this, std::ref(window))); find_widget<tbutton>(&window, "join_global", false).set_active(false); connect_signal_mouse_left_click( find_widget<tbutton>(&window, "observe_global", false), std::bind(&tlobby_main::observe_global_button_callback, this, std::ref(window))); find_widget<tbutton>(&window, "observe_global", false).set_active(false); ttoggle_button& skip_replay = find_widget<ttoggle_button>(&window, "skip_replay", false); skip_replay.set_value(preferences::skip_mp_replay()); skip_replay.set_callback_state_change( std::bind(&tlobby_main::skip_replay_changed_callback, this, _1)); filter_friends_ = find_widget<ttoggle_button>(&window, "filter_with_friends", false, true); filter_ignored_ = find_widget<ttoggle_button>(&window, "filter_without_ignored", false, true); filter_slots_ = find_widget<ttoggle_button>(&window, "filter_vacant_slots", false, true); filter_invert_ = find_widget<ttoggle_button>(&window, "filter_invert", false, true); filter_text_ = find_widget<ttext_box>(&window, "filter_text", false, true); filter_friends_->set_callback_state_change( std::bind(&tlobby_main::game_filter_change_callback, this, _1)); filter_ignored_->set_callback_state_change( std::bind(&tlobby_main::game_filter_change_callback, this, _1)); filter_slots_->set_callback_state_change( std::bind(&tlobby_main::game_filter_change_callback, this, _1)); filter_invert_->set_callback_state_change( std::bind(&tlobby_main::game_filter_change_callback, this, _1)); connect_signal_pre_key_press( *filter_text_, std::bind(&tlobby_main::game_filter_keypress_callback, this, _5)); room_window_open("lobby", true); active_window_changed(); game_filter_reload(); // Force first update to be directly. tlobby_main::network_handler(); lobby_update_timer_ = add_timer( game_config::lobby_network_timer, std::bind(&tlobby_main::network_handler, this), true); }