39 QStringList player_widget_list;
41 ui.chat_line->setProperty(
"doomchat",
true);
43 player_widget_list <<
_(
"Name") <<
_(
"Ready") <<
Q_(
"?player:Leader")
44 <<
_(
"Flag") <<
_(
"Border") <<
_(
"Nation") <<
_(
"Team")
46 ui.start_players_tree->setColumnCount(player_widget_list.count());
47 ui.start_players_tree->setHeaderLabels(player_widget_list);
48 connect(
ui.start_players_tree, &QWidget::customContextMenuRequested,
this,
50 ui.bdisc->setText(
_(
"Disconnect"));
51 ui.bdisc->setIcon(style()->standardPixmap(QStyle::SP_DialogCancelButton));
52 connect(
ui.bdisc, &QAbstractButton::clicked,
gui,
54 ui.bops->setText(
_(
"Observe"));
57 connect(
ui.bops, &QAbstractButton::clicked,
this,
59 ui.bstart->setText(
_(
"Start"));
60 ui.bstart->setIcon(style()->standardPixmap(QStyle::SP_DialogOkButton));
61 connect(
ui.bstart, &QAbstractButton::clicked,
this,
65 setLayout(
ui.gridLayout);
72 ui.pr_options->set_rulesets(num_rulesets, rulesets);
85 QString host, nation, leader,
team, str;
86 QTreeWidgetItem *
item;
87 QTreeWidgetItem *item_r;
88 QList<QTreeWidgetItem *> items;
89 QList<QTreeWidgetItem *> recursed_items;
90 QTreeWidgetItem *player_item;
91 QTreeWidgetItem *global_item;
92 QTreeWidgetItem *detach_item;
100 ui.start_players_tree->clear();
103 player_item =
new QTreeWidgetItem();
104 player_item->setText(0,
Q_(
"?header:Players"));
105 player_item->setData(0, Qt::UserRole, qvar2);
110 ui.pr_options->set_aifill(i);
117 host = QLatin1String(
"");
122 if (pconn->playing == pplayer && !pconn->observer) {
132 if (
is_ai(pplayer)) {
135 is_ready = pplayer->is_ready;
139 nation =
_(
"Random");
141 if (pplayer->was_created) {
144 leader = QLatin1String(
"");
154 team = QLatin1String(
"");
157 item =
new QTreeWidgetItem();
158 for (
int col = 0; col < 8; col++) {
161 str = pplayer->username;
163 if (
is_ai(pplayer)) {
166 + (ai_level_translated_name(pplayer->ai_common.skill_level))
175 item->setText(col, str);
176 qvar = QVariant::fromValue((
void *) pplayer);
178 item->setData(0, Qt::UserRole, qvar2);
179 item->setData(1, Qt::UserRole, qvar);
183 item->setText(col,
_(
"Yes"));
185 item->setText(col,
_(
"No"));
189 item->setText(col, leader);
192 if (!pplayer->nation) {
196 item->setData(col, Qt::DecorationRole, *pixmap);
202 auto pixmap = std::make_unique<QPixmap>(
203 ui.start_players_tree->header()->sectionSizeHint(col), 16);
204 pixmap->fill(Qt::transparent);
207 p.begin(pixmap.get());
208 p.fillRect(pixmap->width() / 2 - 8, 0, 16, 16, Qt::black);
209 p.fillRect(pixmap->width() / 2 - 7, 1, 14, 14,
212 item->setData(col, Qt::DecorationRole, *pixmap);
215 item->setText(col, nation);
221 item->setText(col, host);
231 recursed_items.clear();
234 if (pconn->id == conn_id) {
237 item_r =
new QTreeWidgetItem();
238 item_r->setText(0, pconn->username);
239 item_r->setText(5,
_(
"Observer"));
240 item_r->setText(7, pconn->addr);
241 recursed_items.append(item_r);
242 item->addChildren(recursed_items);
250 player_item->addChildren(items);
251 ui.start_players_tree->insertTopLevelItem(0, player_item);
257 global_item =
new QTreeWidgetItem();
258 global_item->setText(0,
_(
"Global observers"));
260 global_item->setData(0, Qt::UserRole, qvar2);
264 if (
nullptr != pconn->playing || !pconn->observer) {
267 item =
new QTreeWidgetItem();
268 for (
int col = 0; col < 8; col++) {
271 item->setText(col, pconn->username);
274 item->setText(col,
_(
"Observer"));
277 item->setText(col, pconn->addr);
287 global_item->addChildren(items);
288 ui.start_players_tree->insertTopLevelItem(1, global_item);
294 detach_item =
new QTreeWidgetItem();
295 detach_item->setText(0,
_(
"Detached"));
297 detach_item->setData(0, Qt::UserRole, qvar2);
301 if (
nullptr != pconn->playing || pconn->observer) {
304 item =
new QTreeWidgetItem();
305 item->setText(0, pconn->username);
306 item->setText(7, pconn->addr);
311 detach_item->addChildren(items);
312 ui.start_players_tree->insertTopLevelItem(2, detach_item);
313 ui.start_players_tree->header()->setSectionResizeMode(
314 QHeaderView::ResizeToContents);
315 ui.start_players_tree->expandAll();
329 ui.bops->setText(
_(
"Don't Observe"));
331 ui.bops->setText(
_(
"Observe"));
338 text =
_(
"Not ready");
344 if (
is_human(pplayer) && !pplayer->is_ready) {
350 if (num_unready > 1) {
376 ui.bstart->setEnabled(sensitive);
377 ui.bstart->setText(text);
380 ui.pr_options->setEnabled(sensitive);
381 ui.pr_options->update_buttons();
382 ui.pr_options->update_ai_level();
391 QMenu *menu, *submenu_AI, *submenu_team;
392 QPoint global_pos =
ui.start_players_tree->mapToGlobal(pos);
393 QString me, splayer, str;
395 int hacky_counter = 0;
396 bool need_empty_team;
397 const char *level_cmd, *level_name;
399 QList<player *> selected_players;
400 QVariant qvar, qvar2;
403 QList<QTreeWidgetItem *> sel_items =
404 ui.start_players_tree->selectedItems();
406 menu =
new QMenu(
this);
407 submenu_AI =
new QMenu(
this);
408 submenu_team =
new QMenu(
this);
410 if (sel_items.isEmpty()) {
414 for (
auto *
item : qAsConst(sel_items)) {
415 qvar =
item->data(0, Qt::UserRole);
416 qvar2 =
item->data(1, Qt::UserRole);
426 selected_players.append(
static_cast<player *
>(qvar2.value<
void *>()));
432 if (selected_players.contains(pplayer)) {
435 splayer = QString(pplayer->name);
436 spl.append(
"\"" + splayer +
"\"");
437 if (hacky_counter != sel_items.count()) {
442 if (selected_players.contains(pplayer)) {
443 if (me != splayer && sel_items.count() == 1) {
444 str = QString(
_(
"Observe"));
445 action =
new QAction(str,
ui.start_players_tree);
446 str =
"/observe " + spl.first();
447 QObject::connect(
action, &QAction::triggered,
452 str = QString(
_(
"Remove player"));
453 action =
new QAction(str,
ui.start_players_tree);
454 str =
"/remove " + spl.first();
455 QObject::connect(
action, &QAction::triggered,
459 str = QString(
_(
"Take this player"));
460 action =
new QAction(str,
ui.start_players_tree);
461 str =
"/take " + spl.first();
462 QObject::connect(
action, &QAction::triggered,
468 && sel_items.count() == 1) {
469 str = QString(
_(
"Pick nation"));
470 action =
new QAction(str,
ui.start_players_tree);
472 QObject::connect(
action, &QAction::triggered, [str]() {
476 splayer = QString(pplayer->name);
477 if (!splayer.compare(str)) {
486 if (
is_ai(pplayer)) {
491 submenu_AI->setTitle(
_(
"Set difficulty"));
492 menu->addMenu(submenu_AI);
497 ai_level_translated_name(
static_cast<ai_level
>(
level));
500 new QAction(QString(level_name),
ui.start_players_tree);
501 QObject::connect(
action, &QAction::triggered,
502 [
this, spl, level_cmd]() {
503 for (
const auto &sp : spl) {
505 str =
"/" + QString(level_cmd) +
" " + sp;
509 submenu_AI->addAction(
action);
518 if (pplayer &&
game.
info.is_new_game) {
519 menu->addMenu(submenu_team);
520 submenu_team->setTitle(
_(
"Put on team"));
521 menu->addMenu(submenu_team);
522 count = pplayer->team ? player_list_size(
team_members(pplayer->team))
524 need_empty_team = (count != 1);
528 if (!need_empty_team) {
531 need_empty_team =
false;
534 action =
new QAction(str,
ui.start_players_tree);
536 action, &QAction::triggered, [
this, spl, tslot]() {
537 for (
const auto &sp : spl) {
538 QString str =
"/team" + sp +
" \""
543 submenu_team->addAction(
action);
549 && sel_items.count() == 1) {
550 str = QString(
_(
"Aitoggle player"));
551 action =
new QAction(str,
ui.start_players_tree);
552 QObject::connect(
action, &QAction::triggered, [
this, spl]() {
553 for (
const auto &sp : spl) {
554 QString str =
"/aitoggle " + sp;
564 menu->popup(global_pos);
579 const struct text_tag_list *tags)
581 QColor col =
ui.output_window->palette().color(QPalette::Text);
584 if (
ui.output_window !=
nullptr) {
585 ui.output_window->append(str);
586 ui.output_window->verticalScrollBar()->setSliderPosition(
587 ui.output_window->verticalScrollBar()->maximum());
602 ui.bops->setText(
_(
"Don't Observe"));
605 ui.bops->setText(
_(
"Observe"));
618 dsend_packet_player_ready(&
client.
conn, 0,
true);
QString apply_tags(QString str, const struct text_tag_list *tags, QColor bg_color)
Applies tags to text.
int send_chat(const char *message)
Send the message as a chat to the server.
void send_chat_message(const QString &message)
Sends commands to server, but first searches for custom keys, if it finds then it makes custom action...
QIcon getIcon(const QString &id)
Returns icon by given name.
static fcIcons * instance()
Returns instance of fc_icons.
void slot_disconnect()
Disconnect from server and return to MAIN PAGE.
void update_buttons()
Updates observe button in case user started observing manually.
void send_fake_chat_message(const QString &message)
Slot to send fake chat messages.
void slot_pregame_start()
User clicked Start in START_PAGE.
void start_page_menu(QPoint pos)
Context menu on some player, arg Qpoint specifies some pixel on screen.
void set_rulesets(int num_rulesets, QStringList rulesets)
void slot_pregame_observe()
User clicked Observe button in START_PAGE.
void chat_message_received(const QString &message, const struct text_tag_list *tags) override
Appends text to chat window.
page_pregame(QWidget *, fc_client *)
void update_start_page()
Updates start page (start page = client connected to server, but game not started)
bool client_is_global_observer()
Returns whether client is global observer.
struct player * client_player()
Either controlling or observing.
bool client_is_observer()
Returns whether client is observer.
bool can_client_control()
Returns TRUE iff the client can control player.
bool player_has_color(const struct tileset *t, const struct player *pplayer)
Return whether the player has a color assigned yet.
QColor get_player_color(const struct tileset *t, const struct player *pplayer)
Return the color of the player.
bool can_client_access_hack()
Returns TRUE if the client has hack access.
#define conn_list_iterate(connlist, pconn)
#define conn_list_iterate_end
void popup_races_dialog(struct player *pplayer)
Popup the nation selection dialog.
const char * nation_adjective_for_player(const struct player *pplayer)
Return the (translated) adjective for the given nation of a player.
bool can_conn_edit_players_nation(const struct connection *pconn, const struct player *pplayer)
Return TRUE iff the editor is allowed to edit the player's nation in pregame.
#define NO_NATION_SELECTED
bool is_settable_ai_level(enum ai_level level)
Return is AI can be set to given level.
int player_number(const struct player *pplayer)
Return the player index/number/id.
bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
Check if player has given flag.
const char * player_name(const struct player *pplayer)
Return the leader name of the player.
#define ai_level_cmd(_level_)
#define players_iterate_end
#define players_iterate(_pplayer)
static bool is_barbarian(const struct player *pplayer)
struct setting_list * level[OLEVELS_NUM]
struct conn_list * est_connections
struct packet_game_info info
struct conn_list * all_connections
enum cmdlevel access_level
char username[MAX_LEN_NAME]
const char * team_name_translation(const struct team *pteam)
Returns the name (translated) of the team.
const char * team_slot_name_translation(const struct team_slot *tslot)
Returns the name (translated) of the slot.
const char * team_slot_rule_name(const struct team_slot *tslot)
Returns the name (untranslated) of the slot.
const struct player_list * team_members(const struct team *pteam)
Returns the member list of the team.
bool team_slot_is_used(const struct team_slot *tslot)
Returns TRUE is this slot is "used" i.e.
#define team_slots_iterate_end
#define team_slots_iterate(_tslot)
const QPixmap * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Return the sprite for the nation.