Freeciv-3.4
Loading...
Searching...
No Matches
repodlgs.cpp
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18// Qt
19#include <QApplication>
20#include <QComboBox>
21#include <QElapsedTimer>
22#include <QGridLayout>
23#include <QGroupBox>
24#include <QHeaderView>
25#include <QMessageBox>
26#include <QMouseEvent>
27#include <QPainter>
28#include <QRadioButton>
29#include <QScrollArea>
30#include <QTableWidget>
31#include <QtMath>
32#include <QToolTip>
33
34// common
35#include "control.h"
36#include "government.h"
37#include "research.h"
38
39// client
40#include "client_main.h"
41#include "gui_main.h"
42#include "helpdata.h"
43#include "options.h"
44#include "repodlgs_common.h"
45#include "reqtree.h"
46#include "sprite.h"
47#include "text.h"
48#include "tilespec.h"
49
50// gui-qt
51#include "citydlg.h"
52#include "cityrep.h"
53#include "fc_client.h"
54#include "hudwidget.h"
55#include "sidebar.h"
56
57#include "repodlgs.h"
58
59extern QString split_text(QString text, bool cut);
60extern QString cut_helptext(QString text);
62 struct city *pcity, bool ext);
64
66
67/****************************************************************************
68 From reqtree.c used to get tooltips
69****************************************************************************/
81
82/****************************************************************************
83 From reqtree.c used to get tooltips
84****************************************************************************/
93
94/************************************************************************/
98 struct unit_type *ut): QFrame(parent)
99{
100 int isize;
101 QFont f;
107 QImage img;
108 QLabel *lab;
109 QPixmap pix;
110 QRect crop;
111 QSizePolicy size_fixed_policy(QSizePolicy::Maximum, QSizePolicy::Maximum,
112 QSizePolicy::Slider);
114 QVBoxLayout *vbox;
116 struct sprite *spr;
117
119 utype = ut;
120 init_img();
121 unit_scroll = 0;
124 fm = new QFontMetrics(f);
125 isize = fm->height() * 2 / 3;
126 vbox_main = new QVBoxLayout();
127 hbox = new QHBoxLayout();
128 vbox = new QVBoxLayout();
129 hbox_top = new QHBoxLayout();
130 upgrade_button.setText("★");
131 upgrade_button.setVisible(false);
132 connect(&upgrade_button, &QAbstractButton::pressed, this, &unittype_item::upgrade_units);
133 hbox_top->addWidget(&upgrade_button, 0, Qt::AlignLeft);
134 label_info_unit.setTextFormat(Qt::PlainText);
135 hbox_top->addWidget(&label_info_unit);
136 vbox_main->addLayout(hbox_top);
137 vbox->addWidget(&label_info_active);
138 vbox->addWidget(&label_info_inbuild);
139 hbox->addWidget(&label_pix);
140 hbox->addLayout(vbox);
141 vbox_main->addLayout(hbox);
143 hbox_upkeep->addWidget(&shield_upkeep);
144 lab = new QLabel("");
146 "citybar.shields", nullptr, "", "", false);
147 img = spr->pm->toImage();
149 cropped_img = img.copy(crop);
150 pix = QPixmap::fromImage(cropped_img);
151 lab->setPixmap(pix.scaledToHeight(isize));
152 hbox_upkeep->addWidget(lab);
153 spacer = new QSpacerItem(0, isize, QSizePolicy::Expanding,
154 QSizePolicy::Minimum);
155 hbox_upkeep->addSpacerItem(spacer);
156 hbox_upkeep->addWidget(&gold_upkeep);
158 lab = new QLabel("");
159 lab->setPixmap(spr->pm->scaledToHeight(isize));
160 hbox_upkeep->addWidget(lab);
161 spacer = new QSpacerItem(0, isize, QSizePolicy::Expanding,
162 QSizePolicy::Minimum);
163 hbox_upkeep->addSpacerItem(spacer);
164 hbox_upkeep->addWidget(&food_upkeep);
165 lab = new QLabel("");
167 "citybar.food", nullptr, "", "", false);
168 img = spr->pm->toImage();
170 cropped_img = img.copy(crop);
171 pix = QPixmap::fromImage(cropped_img);
172 lab->setPixmap(pix.scaledToHeight(isize));
173 hbox_upkeep->addWidget(lab);
174 vbox_main->addLayout(hbox_upkeep);
176 entered = false;
177 delete fm;
178}
179
180/************************************************************************/
186
187/************************************************************************/
191{
192 struct sprite *sp;
193
196 label_pix.setPixmap(*sp->pm);
197}
198
199/************************************************************************/
203{
204 char buf[1024];
205 char buf2[2048];
206 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
207 int price;
208 QString s2;
209 const struct unit_type *upgrade;
211
214 fc_snprintf(buf, ARRAY_SIZE(buf), PL_("Treasury contains %d gold.",
215 "Treasury contains %d gold.",
216 client_player()->economic.gold),
217 client_player()->economic.gold);
219 PL_("Upgrade as many %s to %s as possible "
220 "for %d gold each?\n%s",
221 "Upgrade as many %s to %s as possible "
222 "for %d gold each?\n%s", price),
224 utype_name_translation(upgrade), price, buf);
225 s2 = QString(buf2);
226 ask->set_text_title(s2, _("Upgrade Obsolete Units"));
227 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
228 ask->setDefaultButton(QMessageBox::Cancel);
229 ask->setAttribute(Qt::WA_DeleteOnClose);
230 connect(ask, &hud_message_box::accepted, [=]() {
232 });
233 ask->show();
234}
235
236/************************************************************************/
240{
241 entered = true;
242 update();
243}
244
245/************************************************************************/
249{
250 QRect rfull;
251 QPainter p;
252
253 if (entered) {
254 rfull = QRect(1 , 1, width() - 2 , height() - 2);
255 p.begin(this);
256 p.setPen(QColor(palette().color(QPalette::Highlight)));
257 p.drawRect(rfull);
258 p.end();
259 }
260}
261
262/************************************************************************/
266{
267 entered = false;
268 update();
269}
270
271/************************************************************************/
275{
276 int unit_count = 0;
277
279 if (punit->utype != utype) {
280 continue;
281 }
285 unit_count++;
286 }
287 }
289
290 if (event->angleDelta().y() < 0) {
291 unit_scroll--;
292 } else {
293 unit_scroll++;
294 }
295 if (unit_scroll < 0) {
296 unit_scroll = unit_count;
297 } else if (unit_scroll > unit_count) {
298 unit_scroll = 0;
299 }
300
301 unit_count = 0;
302
304 if (punit->utype != utype) {
305 continue;
306 }
310 unit_count++;
311 if (unit_count == unit_scroll) {
313 }
314 }
315 }
317 event->accept();
318}
319
320/************************************************************************/
324{
325 layout = new QHBoxLayout;
326 scroll_layout = new QHBoxLayout(this);
327 init_layout();
328 setParent(gui()->mapview_wdg);
329 cw = new close_widget(this);
330 cw->setFixedSize(12, 12);
331 setVisible(false);
332}
333
334/************************************************************************/
338{
340 unittype_list.clear();
341 delete cw;
342}
343
344/************************************************************************/
351
352/************************************************************************/
356{
357 if (!m_instance) {
359 }
360
361 return m_instance;
362}
363
364/************************************************************************/
368{
369 if (m_instance) {
370 delete m_instance;
371 m_instance = nullptr;
372 }
373}
374
375/************************************************************************/
379{
380 was_destroyed = true;
381 drop();
382}
383
384/************************************************************************/
388{
389 QSizePolicy size_fixed_policy(QSizePolicy::Maximum,
390 QSizePolicy::Maximum,
391 QSizePolicy::Slider);
392
393 scroll = new QScrollArea(this);
395 scroll->setWidgetResizable(true);
396 scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
397 scroll_widget.setLayout(layout);
398 scroll->setWidget(&scroll_widget);
399 scroll->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
400 scroll->setProperty("city_scroll", true);
401 scroll_layout->addWidget(scroll);
403}
404
405/************************************************************************/
412
413/************************************************************************/
417{
418 struct urd_info {
419 int active_count;
420 int building_count;
421 int upkeep[O_LAST];
422 };
423 bool upgradable;
424 int i, j;
425 int output;
426 int total_len = 0;
427 struct urd_info *info;
428 struct urd_info *unit_array = (struct urd_info *)fc_calloc(sizeof(struct urd_info), utype_count());
429 struct urd_info unit_totals;
431 unittype_item *ui = nullptr;
432
433 clear_layout();
434 memset(&unit_totals, '\0', sizeof(unit_totals));
435
436 // Count units.
437 players_iterate(pplayer) {
438 if (client_has_player() && pplayer != client_player()) {
439 continue;
440 }
441 unit_list_iterate(pplayer->units, punit) {
443 if (0 != punit->homecity) {
444 for (output = 0; output < O_LAST; output++) {
445 info->upkeep[output] += punit->upkeep[output];
446 }
447 }
448 info->active_count++;
450 city_list_iterate(pplayer->cities, pcity) {
451 if (VUT_UTYPE == pcity->production.kind) {
452 int num_units;
453
454 info = unit_array + utype_index(pcity->production.value.utype);
455 // Account for build slots in city
457 // Unit is in progress even if it won't be done this turn
458 num_units = MAX(num_units, 1);
459 info->building_count += num_units;
460 }
463
464 unit_type_iterate(utype) {
465 utype_id = utype_index(utype);
466 info = unit_array + utype_id;
468 && nullptr != can_upgrade_unittype(client_player(), utype);
469 if (0 == info->active_count && 0 == info->building_count) {
470 continue; // We don't need a row for this type.
471 }
472 ui = new unittype_item(this, utype);
473 ui->label_info_active.setText("⚔:" + QString::number(info->active_count));
474 ui->label_info_inbuild.setText("⚒:" + QString::number(info->building_count));
475 ui->label_info_unit.setText(utype_name_translation(utype));
476 if (upgradable) {
477 ui->upgrade_button.setVisible(true);
478 } else {
479 ui->upgrade_button.setVisible(false);
480 }
481 ui->shield_upkeep.setText(QString::number(info->upkeep[O_SHIELD]));
482 ui->food_upkeep.setText(QString::number(info->upkeep[O_FOOD]));
483 ui->gold_upkeep.setText(QString::number(info->upkeep[O_GOLD]));
484 add_item(ui);
486
488
489 setUpdatesEnabled(false);
490 hide();
491 i = unittype_list.count();
492 for (j = 0; j < i; j++) {
493 ui = unittype_list[j];
494 layout->addWidget(ui, 0, Qt::AlignVCenter);
495 total_len = total_len + ui->sizeHint().width() + 18;
496 }
497
499 + contentsMargins().right();
500 if (show) {
501 setVisible(true);
502 }
503 setUpdatesEnabled(true);
504 setFixedWidth(qMin(total_len, gui()->mapview_wdg->width()));
505 if (ui != nullptr) {
506 setFixedHeight(ui->height() + 60);
507 }
508 layout->update();
510}
511
512/************************************************************************/
516{
517 int i = unittype_list.count();
518 unittype_item *ui;
519 int j;
520
521 setUpdatesEnabled(false);
522 setMouseTracking(false);
523
524 for (j = 0; j < i; j++) {
525 ui = unittype_list[j];
526 layout->removeWidget(ui);
527 delete ui;
528 }
529
530 while (!unittype_list.empty()) {
531 unittype_list.removeFirst();
532 }
533
534 setMouseTracking(true);
535 setUpdatesEnabled(true);
536}
537
538/************************************************************************/
542{
543 return (q1.tech_str < q2.tech_str);
544}
545
546/************************************************************************/
550{
551 pcanvas = nullptr;
552 req = nullptr;
553 reset();
554 setMouseTracking(true);
555}
556
557/************************************************************************/
567
568/************************************************************************/
572{
573 tech_id = -1;
574 tunit = nullptr;
575 timpr = nullptr;
576}
577
578/************************************************************************/
582{
583 int i, j;
584 int swidth, sheight;
585 struct sprite *sprite;
586 reqtree *tree;
588
590 tt_help.clear();
591 if (req == nullptr) {
592 return;
593 } else {
594 tree = req;
595 }
596
597 for (i = 0; i < tree->num_layers; i++) {
598 for (j = 0; j < tree->layer_size[i]; j++) {
599 struct tree_node *node = tree->layers[i][j];
601
602 startx = node->node_x;
603 starty = node->node_y;
604 nwidth = node->node_width;
605 nheight = node->node_height;
606
607 if (!node->is_dummy) {
608 const char *text = research_advance_name_translation(
610 int text_w, text_h;
611 int icon_startx;
612
614 rttp = new req_tooltip_help();
615 rttp->rect = QRect(startx + (nwidth - text_w) / 2, starty + 4,
616 text_w, text_h);
617 rttp->tech_id = node->tech;
618 tt_help.append(rttp);
619 icon_startx = startx + 5;
620
622 unit_type_iterate(utype) {
623
624 if (!is_tech_req_for_utype(utype, advance_by_number(node->tech))) {
625 continue;
626 }
627
631 rttp = new req_tooltip_help();
632 rttp->rect = QRect(icon_startx, starty + text_h + 4
633 + (nheight - text_h - 4 - sheight) / 2,
634 swidth, sheight);
635 rttp->tunit = utype;
636 tt_help.append(rttp);
637 icon_startx += swidth + 2;
639
640 improvement_iterate(pimprove) {
641 if (valid_improvement(pimprove)) {
642 requirement_vector_iterate(&(pimprove->reqs), preq) {
643 if (VUT_ADVANCE == preq->source.kind
644 && advance_number(preq->source.value.advance) == node->tech) {
646 if (sprite) {
648 rttp = new req_tooltip_help();
649 rttp->rect = QRect(icon_startx, starty + text_h + 4
650 + (nheight - text_h - 4 - sheight) / 2,
651 swidth, sheight);
652 rttp->timpr = pimprove;
653 tt_help.append(rttp);
654 icon_startx += swidth + 2;
655 }
656 }
658 }
660
662 requirement_vector_iterate(&(gov->reqs), preq) {
663 if (VUT_ADVANCE == preq->source.kind
664 && advance_number(preq->source.value.advance) == node->tech) {
667 rttp = new req_tooltip_help();
668 rttp->rect = QRect(icon_startx, starty + text_h + 4
669 + (nheight - text_h - 4 - sheight) / 2,
670 swidth, sheight);
671 rttp->tgov = gov;
672 tt_help.append(rttp);
673 icon_startx += swidth + 2;
674 }
677 }
678 }
679 }
680 }
681}
682
683/************************************************************************/
687{
688 reset();
689 draw_reqtree(req, pcanvas, 0, 0, 0, 0, width, height);
691 update();
692}
693
694/************************************************************************/
698{
699 timer_active = false;
700 if (req != nullptr) {
702 }
703 if (pcanvas != nullptr) {
705 }
709 pcanvas->map_pixmap.fill(Qt::transparent);
710 resize(width, height);
711}
712
713/************************************************************************/
717{
718 QPoint pos = event->pos();
719 Tech_type_id tech = get_tech_on_reqtree(req, pos.x(), pos.y());
721 int i;
722
723 if (event->button() == Qt::LeftButton && can_client_issue_orders()) {
727 break;
728 case TECH_UNKNOWN:
730 break;
731 case TECH_KNOWN:
732 break;
733 }
734 } else if (event->button() == Qt::RightButton) {
735 for (i = 0; i < tt_help.count(); i++) {
736 rttp = tt_help.at(i);
737 if (rttp->rect.contains(event->pos())) {
738 if (rttp->tech_id != -1) {
741 rttp->tech_id), HELP_TECH);
742 } else if (rttp->timpr != nullptr) {
746 } else if (rttp->tunit != nullptr) {
748 HELP_UNIT);
749 } else if (rttp->tgov != nullptr) {
752 } else {
753 return;
754 }
755 }
756 }
757 }
758}
759
760/************************************************************************/
764{
766 int i;
769 char buffer[8192];
770 char buf2[1];
771 struct player *pplayer = client_player();
772
773 buf2[0] = '\0';
774 for (i = 0; i < tt_help.count(); i++) {
775 rttp = tt_help.at(i);
776 if (rttp->rect.contains(event->pos())) {
777 if (rttp->tech_id != -1) {
778 helptext_advance(buffer, sizeof(buffer), pplayer,
779 buf2, rttp->tech_id);
780 tt_text = QString(buffer);
781 def_str = "<p style='white-space:pre'><b>"
783 advance_by_number(rttp->tech_id))).toHtmlEscaped()
784 + "</b>\n";
785 } else if (rttp->timpr != nullptr) {
786 def_str = get_tooltip_improvement(rttp->timpr, nullptr);
787 tt_text = helptext_building(buffer, sizeof(buffer),
788 pplayer, nullptr, rttp->timpr);
790 } else if (rttp->tunit != nullptr) {
791 def_str = get_tooltip_unit(rttp->tunit);
792 tt_text += helptext_unit(buffer, sizeof(buffer), pplayer,
793 buf2, rttp->tunit, TRUE);
795 } else if (rttp->tgov != nullptr) {
796 helptext_government(buffer, sizeof(buffer), pplayer,
797 buf2, rttp->tgov);
798 tt_text = QString(buffer);
800 def_str = "<p style='white-space:pre'><b>"
801 + QString(government_name_translation(rttp->tgov)).toHtmlEscaped()
802 + "</b>\n";
803 } else {
804 return;
805 }
806 tt_text = split_text(tt_text, true);
807 tt_text = def_str + tt_text.toHtmlEscaped();
808 tooltip_text = tt_text.trimmed();
809 tooltip_rect = rttp->rect;
810 tooltip_pos = event->globalPosition().toPoint();
811 if (!QToolTip::isVisible() && !timer_active) {
812 timer_active = true;
813 QTimer::singleShot(500, this, SLOT(show_tooltip()));
814 }
815 }
816 }
817}
818
819/************************************************************************/
823{
824 QPoint cp;
825
826 timer_active = false;
827 cp = QCursor::pos();
828 if (qAbs(cp.x() - tooltip_pos.x()) < 4
829 && qAbs(cp.y() - tooltip_pos.y()) < 4) {
830 QToolTip::showText(cp, tooltip_text, this, tooltip_rect);
831 }
832}
833
834/************************************************************************/
838{
840
841 painter.begin(this);
842 painter.drawPixmap(0, 0, width, height, pcanvas->map_pixmap);
843 painter.end();
844}
845
846/************************************************************************/
850{
851 QSize s;
852
853 s.setWidth(width);
854 s.setHeight(height);
855
856 return s;
857}
858
859/************************************************************************/
863{
864 QSize size;
865 QSizePolicy size_expanding_policy(QSizePolicy::Expanding,
866 QSizePolicy::Expanding);
867 QSizePolicy size_fixed_policy(QSizePolicy::Minimum, QSizePolicy::Minimum);
868
869 goal_combo = new QComboBox();
870 info_label = new QLabel();
871 progress = new progress_bar(this);
872 progress_label = new QLabel();
874 sci_layout = new QGridLayout();
876 scroll = new QScrollArea();
877
878 curr_list = nullptr;
879 goal_list = nullptr;
880 progress->setTextVisible(true);
881 progress_label->setSizePolicy(size_fixed_policy);
882 sci_layout->addWidget(progress_label, 0, 0, 1, 8);
883 sci_layout->addWidget(researching_combo, 1, 0, 1, 4);
884 researching_combo->setSizePolicy(size_fixed_policy);
885 sci_layout->addWidget(progress, 1, 5, 1, 4);
886 progress->setSizePolicy(size_fixed_policy);
887 sci_layout->addWidget(goal_combo, 2, 0, 1, 4);
888 goal_combo->setSizePolicy(size_fixed_policy);
889 sci_layout->addWidget(info_label, 2, 5, 1, 4);
890 info_label->setSizePolicy(size_fixed_policy);
891
892 size = res_diag->size();
893 res_diag->setMinimumSize(size);
894 scroll->setAutoFillBackground(true);
895 scroll->setPalette(QPalette(QColor(215,215,215)));
896 scroll->setWidget(res_diag);
897 scroll->setSizePolicy(size_expanding_policy);
898 sci_layout->addWidget(scroll, 4, 0, 1, 10);
899
900 QObject::connect(researching_combo, SIGNAL(currentIndexChanged(int)),
902
903 QObject::connect(goal_combo, SIGNAL(currentIndexChanged(int)),
904 SLOT(goal_tech_changed(int)));
905
907}
908
909/************************************************************************/
915{
916 if (curr_list) {
917 delete curr_list;
918 }
919
920 if (goal_list) {
921 delete goal_list;
922 }
923 gui()->remove_repo_dlg("SCI");
924}
925
926/************************************************************************/
932{
933 gui()->gimme_place(this, "SCI");
934 index = gui()->add_game_tab(this);
935 gui()->game_tab_widget->setCurrentIndex(index);
937}
938
939/************************************************************************/
943{
944 update();
945}
946
947/************************************************************************/
951{
952 QSize size;
953 res_diag->reset();
954 size = res_diag->size();
955 res_diag->setMinimumSize(size);
956 update();
957}
958
959/************************************************************************/
963{
965 const char *text;
966 int total;
967 int done = research->bulbs_researched;
969 double not_used;
970 QString str;
972 struct sprite *sp;
974
975 fc_assert_ret(research != nullptr);
976
977 if (curr_list) {
978 delete curr_list;
979 }
980
981 if (goal_list) {
982 delete goal_list;
983 }
984
985 if (research->researching != A_UNSET) {
987 } else {
988 total = -1;
989 }
990
994 progress_label->setAlignment(Qt::AlignHCenter);
995 info_label->setAlignment(Qt::AlignHCenter);
998 str = QString::fromUtf8(text);
999 progress->setFormat(str);
1000 progress->setMinimum(0);
1001 progress->setMaximum(total);
1002 progress->set_pixmap(static_cast<int>(research->researching));
1003
1004 if (done <= total) {
1005 progress->setValue(done);
1006 } else {
1007 done = total;
1008 progress->setValue(done);
1009 }
1010
1011 // Collect all techs which are reachable in the next step.
1012 ac = advance_count();
1015 item.tech_str
1016 = QString::fromUtf8(advance_name_translation(advance_by_number(i)));
1017 item.id = i;
1018 curr_list->append(item);
1019 }
1021
1022 // Collect all techs which are reachable in next 10 steps.
1026 && (i == research->tech_goal
1028 item.tech_str
1029 = QString::fromUtf8(advance_name_translation(advance_by_number(i)));
1030 item.id = i;
1031 goal_list->append(item);
1032 }
1034
1035 // Sort both lists
1036 std::sort(goal_list->begin(), goal_list->end(), comp_less_than);
1037 std::sort(curr_list->begin(), curr_list->end(), comp_less_than);
1038
1039 // Fill combo boxes
1040 researching_combo->blockSignals(true);
1041 goal_combo->blockSignals(true);
1042
1043 researching_combo->clear();
1044 goal_combo->clear();
1045 for (int i = 0; i < curr_list->count(); i++) {
1046 QIcon ic;
1047
1048 sp = get_tech_sprite(tileset, curr_list->at(i).id);
1049 if (sp) {
1050 ic = QIcon(*sp->pm);
1051 }
1052 qvar = curr_list->at(i).id;
1053 researching_combo->insertItem(i, ic, curr_list->at(i).tech_str, qvar);
1054 }
1055
1056 for (int i = 0; i < goal_list->count(); i++) {
1057 QIcon ic;
1058
1059 sp = get_tech_sprite(tileset, goal_list->at(i).id);
1060 if (sp) {
1061 ic = QIcon(*sp->pm);
1062 }
1063 qvar = goal_list->at(i).id;
1064 goal_combo->insertItem(i, ic, goal_list->at(i).tech_str, qvar);
1065 }
1066
1067 // Set current tech and goal
1072 A_UNSET);
1073 researching_combo->setCurrentIndex(0);
1074 } else {
1075 for (int i = 0; i < researching_combo->count(); i++) {
1076 qvar = researching_combo->itemData(i);
1077
1078 if (qvar == qres) {
1079 researching_combo->setCurrentIndex(i);
1080 }
1081 }
1082 }
1083
1085
1086 if (qres == A_UNSET) {
1087 goal_combo->insertItem(0, Q_("?tech:None"), A_UNSET);
1088 goal_combo->setCurrentIndex(0);
1089 } else {
1090 for (int i = 0; i < goal_combo->count(); i++) {
1091 qvar = goal_combo->itemData(i);
1092
1093 if (qvar == qres) {
1094 goal_combo->setCurrentIndex(i);
1095 }
1096 }
1097 }
1098
1099 researching_combo->blockSignals(false);
1100 goal_combo->blockSignals(false);
1101
1102 if (client_is_observer()) {
1103 researching_combo->setDisabled(true);
1104 goal_combo->setDisabled(true);
1105 } else {
1106 researching_combo->setDisabled(false);
1107 goal_combo->setDisabled(false);
1108 }
1110}
1111
1112/************************************************************************/
1119
1120/************************************************************************/
1124{
1125 QVariant qvar;
1126
1128
1129 if (researching_combo->hasFocus()) {
1132 }
1133 }
1134}
1135
1136/************************************************************************/
1140{
1141 QVariant qvar;
1142
1143 qvar = goal_combo->itemData(changed_index);
1144
1145 if (goal_combo->hasFocus()) {
1148 }
1149 }
1150}
1151
1152/************************************************************************/
1156{
1157 int i;
1158 int percent;
1160 bool blk = false;
1161 QWidget *w;
1162 QString str;
1163 struct player *plr = client_player();
1164
1165 if (plr != nullptr) {
1166 struct research *research = research_get(plr);
1167
1168 if (research->researching == A_UNSET) {
1169 str = QString(Q_("?tech:None"));
1170 } else if (research->client.researching_cost != 0) {
1173 str = str + "\n (" + QString::number(percent) + "%)";
1174 }
1177 blk = true;
1178 }
1179 } else {
1180 str = " ";
1181 }
1182
1183 if (blk) {
1184 gui()->sw_science->keep_blinking = true;
1185 gui()->sw_science->set_custom_labels(str);
1186 gui()->sw_science->sblink();
1187 } else {
1188 gui()->sw_science->keep_blinking = false;
1189 gui()->sw_science->set_custom_labels(str);
1190 gui()->sw_science->update_final_pixmap();
1191 }
1192 gui()->update_sidebar_tooltips();
1193
1194 if (gui()->is_repo_dlg_open("SCI")) {
1195 i = gui()->gimme_index_of("SCI");
1196 fc_assert(i != -1);
1197 w = gui()->game_tab_widget->widget(i);
1198 sci_rep = reinterpret_cast<science_report*>(w);
1200 }
1201}
1202
1203/************************************************************************/
1207{
1208 QHeaderView *header;
1210 eco_widget = new QTableWidget;
1211 disband_button = new QPushButton;
1212 sell_button = new QPushButton;
1213 sell_redun_button = new QPushButton;
1214 eco_label = new QLabel;
1216
1217 slist << _("Type") << Q_("?Building or Unit type:Name") << _("Redundant")
1218 << _("Count") << _("Cost") << _("U Total");
1219 eco_widget->setColumnCount(slist.count());
1220 eco_widget->setHorizontalHeaderLabels(slist);
1221 eco_widget->setProperty("showGrid", "false");
1222 eco_widget->setProperty("selectionBehavior", "SelectRows");
1223 eco_widget->setEditTriggers(QAbstractItemView::NoEditTriggers);
1224 eco_widget->horizontalHeader()->resizeSections(QHeaderView::Stretch);
1225 eco_widget->verticalHeader()->setVisible(false);
1226 eco_widget->setSelectionMode(QAbstractItemView::SingleSelection);
1227 eco_widget->setSortingEnabled(true);
1228 header = eco_widget->horizontalHeader();
1229 header->setSectionResizeMode(1, QHeaderView::Stretch);
1230 header->setStretchLastSection(true);
1231 disband_button->setText(_("Disband"));
1232 disband_button->setEnabled(false);
1233 sell_button->setText(_("Sell All"));
1234 sell_button->setEnabled(false);
1235 sell_redun_button->setText(_("Sell Redundant"));
1236 sell_redun_button->setEnabled(false);
1237 eco_layout->addWidget(eco_widget, 1, 0, 5, 5);
1238 eco_layout->addWidget(disband_button, 0, 0, 1, 1);
1239 eco_layout->addWidget(sell_button, 0, 1, 1, 1);
1240 eco_layout->addWidget(sell_redun_button, 0, 2, 1, 1);
1241 eco_layout->addWidget(eco_label, 6, 0, 1, 5);
1242
1243 connect(disband_button, &QAbstractButton::pressed, this, &eco_report::disband_units);
1244 connect(sell_button, &QAbstractButton::pressed, this, &eco_report::sell_buildings);
1245 connect(sell_redun_button, &QAbstractButton::pressed, this, &eco_report::sell_redundant);
1246 connect(eco_widget->selectionModel(),
1248 const QItemSelection &)),
1250 const QItemSelection &)));
1252}
1253
1254/************************************************************************/
1258{
1259 gui()->remove_repo_dlg("ECO");
1260}
1261
1262/************************************************************************/
1266{
1267 curr_row = -1;
1268 gui()->gimme_place(this, "ECO");
1269 index = gui()->add_game_tab(this);
1270 gui()->game_tab_widget->setCurrentIndex(index);
1271}
1272
1273/************************************************************************/
1277{
1280 int entries_used, building_total, unit_total, tax, i, j;
1281 char buf[256];
1283 QFont f = QApplication::font();
1284 int h;
1285 QFontMetrics fm(f);
1286 h = fm.height() + 6;
1287 QPixmap *pix;
1289 struct sprite *sprite;
1290
1291 eco_widget->setRowCount(0);
1292 eco_widget->clearContents();
1294 &building_total, &tax);
1295 for (i = 0; i < entries_used; i++) {
1297 struct impr_type *pimprove = pentry->type;
1298
1299 pix = nullptr;
1300 sprite = get_building_sprite(tileset, pimprove);
1301 if (sprite != nullptr) {
1302 pix = sprite->pm;
1303 }
1304 if (pix != nullptr) {
1305 pix_scaled = pix->scaledToHeight(h);
1306 } else {
1307 pix_scaled.fill();
1308 }
1309 cid id = cid_encode_building(pimprove);
1310
1311 eco_widget->insertRow(i);
1312 for (j = 0; j < 6; j++) {
1313 item = new QTableWidgetItem;
1314 switch (j) {
1315 case 0:
1316 item->setData(Qt::DecorationRole, pix_scaled);
1317 item->setData(Qt::UserRole, id);
1318 break;
1319 case 1:
1320 item->setTextAlignment(Qt::AlignLeft);
1321 item->setText(improvement_name_translation(pimprove));
1322 break;
1323 case 2:
1324 item->setData(Qt::DisplayRole, pentry->redundant);
1325 break;
1326 case 3:
1327 item->setData(Qt::DisplayRole, pentry->count);
1328 break;
1329 case 4:
1330 item->setData(Qt::DisplayRole, pentry->cost);
1331 break;
1332 case 5:
1333 item->setData(Qt::DisplayRole, pentry->total_cost);
1334 break;
1335 }
1336 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
1337 eco_widget->setItem(i, j, item);
1338 }
1339 }
1340 max_row = i;
1342 for (i = 0; i < entries_used; i++) {
1343 struct unit_entry *pentry = unit_entries + i;
1344 struct unit_type *putype = pentry->type;
1345 cid id;
1346
1347 pix = nullptr;
1350 if (sprite != nullptr) {
1351 pix = sprite->pm;
1352 }
1353 id = cid_encode_unit(putype);
1354
1355 eco_widget->insertRow(i + max_row);
1356 for (j = 0; j < 6; j++) {
1357 item = new QTableWidgetItem;
1358 item->setTextAlignment(Qt::AlignHCenter);
1359 switch (j) {
1360 case 0:
1361 if (pix != nullptr) {
1362 pix_scaled = pix->scaledToHeight(h);
1363 item->setData(Qt::DecorationRole, pix_scaled);
1364 }
1365 item->setData(Qt::UserRole, id);
1366 break;
1367 case 1:
1368 item->setTextAlignment(Qt::AlignLeft);
1370 break;
1371 case 2:
1372 item->setData(Qt::DisplayRole, 0);
1373 break;
1374 case 3:
1375 item->setData(Qt::DisplayRole, pentry->count);
1376 break;
1377 case 4:
1378 item->setData(Qt::DisplayRole, pentry->cost);
1379 break;
1380 case 5:
1381 item->setData(Qt::DisplayRole, pentry->total_cost);
1382 break;
1383 }
1384 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
1385 eco_widget->setItem(max_row + i, j, item);
1386 }
1387 }
1388 max_row = max_row + i;
1389 fc_snprintf(buf, sizeof(buf), _("Income: %d Total Costs: %d"),
1390 tax, building_total + unit_total);
1391 eco_label->setText(buf);
1392}
1393
1394/************************************************************************/
1398 const QItemSelection &ds)
1399{
1401 int i;
1402 QVariant qvar;
1403 struct universal selected;
1404 const struct impr_type *pimprove;
1405 disband_button->setEnabled(false);
1406 sell_button->setEnabled(false);
1407 sell_redun_button->setEnabled(false);
1408
1409 if (sl.isEmpty()) {
1410 return;
1411 }
1412
1413 curr_row = sl.indexes().at(0).row();
1414 if (curr_row >= 0 && curr_row <= max_row) {
1415 itm = eco_widget->item(curr_row, 0);
1416 qvar = itm->data(Qt::UserRole);
1417 uid = qvar.toInt();
1418 selected = cid_decode(uid);
1419 switch (selected.kind) {
1420 case VUT_IMPROVEMENT:
1421 pimprove = selected.value.building;
1422 counter = eco_widget->item(curr_row, 3)->text().toInt();
1423 if (can_sell_building(pimprove)) {
1424 sell_button->setEnabled(true);
1425 }
1426 itm = eco_widget->item(curr_row, 2);
1427 i = itm->text().toInt();
1428 if (i > 0) {
1429 sell_redun_button->setEnabled(true);
1430 }
1431 break;
1432 case VUT_UTYPE:
1433 counter = eco_widget->item(curr_row, 3)->text().toInt();
1434 disband_button->setEnabled(true);
1435 break;
1436 default:
1437 log_error("Not supported type: %d.", selected.kind);
1438 }
1439 }
1440}
1441
1442/************************************************************************/
1446{
1447 struct universal selected;
1448 char title[1024];
1449 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
1450 Unit_type_id utype;
1451
1452 selected = cid_decode(uid);
1453 utype = utype_number(selected.value.utype);
1455 _("Do you really wish to disband every %s (%d total)?"),
1457
1458 ask->set_text_title(title, _("Disband Units"));
1459 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
1460 ask->setDefaultButton(QMessageBox::Cancel);
1461 ask->setAttribute(Qt::WA_DeleteOnClose);
1462 connect(ask, &hud_message_box::accepted, [=]() {
1463 struct unit_type *putype = utype_by_number(utype);
1464 char buf[1024];
1465 hud_message_box *result;
1466
1467 if (putype) {
1468 disband_all_units(putype, false, buf, sizeof(buf));
1469 }
1470
1471 result = new hud_message_box(gui()->central_wdg);
1472 result->set_text_title(buf, _("Disband Results"));
1473 result->setStandardButtons(QMessageBox::Ok);
1474 result->setAttribute(Qt::WA_DeleteOnClose);
1475 result->show();
1476 });
1477}
1478
1479/************************************************************************/
1483{
1484 struct universal selected;
1485 char title[1024];
1486 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
1487 const struct impr_type *pimpr;
1489
1490 selected = cid_decode(uid);
1491 pimpr = selected.value.building;
1493
1495 _("Do you really wish to sell "
1496 "every %s (%d total)?"),
1498
1499 ask->set_text_title(title, _("Sell Improvements"));
1500 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
1501 ask->setDefaultButton(QMessageBox::Cancel);
1502 ask->setAttribute(Qt::WA_DeleteOnClose);
1503 connect(ask, &hud_message_box::accepted, [=]() {
1504 char buf[1024];
1505 hud_message_box *result;
1506 struct impr_type *pimprove = improvement_by_number(impr_id);
1507
1508 if (!pimprove) {
1509 return;
1510 }
1511
1512 sell_all_improvements(pimprove, false, buf, sizeof(buf));
1513
1514 result = new hud_message_box(gui()->central_wdg);
1515 result->set_text_title(buf, _("Sell-Off: Results"));
1516 result->setStandardButtons(QMessageBox::Ok);
1517 result->setAttribute(Qt::WA_DeleteOnClose);
1518 result->show();
1519 });
1520}
1521
1522/************************************************************************/
1526{
1527 struct universal selected;
1528 char title[1024];
1529 hud_message_box *ask = new hud_message_box(gui()->central_wdg);
1530 const struct impr_type *pimpr;
1532
1533 selected = cid_decode(uid);
1534 pimpr = selected.value.building;
1536
1538 _("Do you really wish to sell "
1539 "every redundant %s (%d total)?"),
1541
1542 ask->set_text_title(title, _("Sell Improvements"));
1543 ask->setStandardButtons(QMessageBox::Cancel | QMessageBox::Ok);
1544 ask->setDefaultButton(QMessageBox::Cancel);
1545 ask->setAttribute(Qt::WA_DeleteOnClose);
1546 connect(ask, &hud_message_box::accepted, [=]() {
1547 char buf[1024];
1548 hud_message_box *result;
1549 struct impr_type *pimprove = improvement_by_number(impr_id);
1550
1551 if (!pimprove) {
1552 return;
1553 }
1554
1555 sell_all_improvements(pimprove, true, buf, sizeof(buf));
1556
1557 result = new hud_message_box(gui()->central_wdg);
1558 result->set_text_title(buf, _("Sell-Off: Results"));
1559 result->setStandardButtons(QMessageBox::Ok);
1560 result->setAttribute(Qt::WA_DeleteOnClose);
1561 result->show();
1562 });
1563}
1564
1565/************************************************************************/
1569{
1571 end_widget = new QTableWidget;
1572 unsigned int i;
1573 const size_t col_num = packet->category_num + 3;
1575
1576 players = 0;
1577
1578 slist << _("Player") << _("Nation") << _("Score");
1579 for (i = 0 ; i < col_num - 3; i++) {
1580 slist << Q_(packet->category_name[i]);
1581 }
1582 end_widget->setColumnCount(slist.count());
1583 end_widget->setHorizontalHeaderLabels(slist);
1584 end_widget->setProperty("showGrid", "false");
1585 end_widget->setProperty("selectionBehavior", "SelectRows");
1586 end_widget->setEditTriggers(QAbstractItemView::NoEditTriggers);
1587 end_widget->verticalHeader()->setVisible(false);
1588 end_widget->setSelectionMode(QAbstractItemView::SingleSelection);
1589 end_widget->horizontalHeader()->setSectionResizeMode(
1590 QHeaderView::ResizeToContents);
1591 end_layout->addWidget(end_widget, 1, 0, 5, 5);
1593}
1594
1595/************************************************************************/
1599{
1600 gui()->remove_repo_dlg("END");
1601}
1602
1603/************************************************************************/
1607{
1608 gui()->gimme_place(this, "END");
1609 index = gui()->add_game_tab(this);
1610 gui()->game_tab_widget->setCurrentIndex(index);
1611}
1612
1613/************************************************************************/
1617{
1619 QPixmap *pix;
1620 unsigned int i;
1621 const struct player *pplayer = player_by_number(packet->player_id);
1622 const size_t col_num = packet->category_num + 3;
1623
1624 end_widget->insertRow(players);
1625 for (i = 0; i < col_num; i++) {
1626 item = new QTableWidgetItem;
1627 switch (i) {
1628 case 0:
1629 item->setText(player_name(pplayer));
1630 break;
1631 case 1:
1633 if (pix != nullptr) {
1634 item->setData(Qt::DecorationRole, *pix);
1635 }
1636 break;
1637 case 2:
1638 item->setText(QString::number(packet->score));
1639 item->setTextAlignment(Qt::AlignHCenter);
1640 break;
1641 default:
1642 item->setText(QString::number(packet->category_score[i-3]));
1643 item->setTextAlignment(Qt::AlignHCenter);
1644 break;
1645 }
1646 end_widget->setItem(players, i, item);
1647 }
1648 players++;
1649 end_widget->resizeRowsToContents();
1650}
1651
1652/************************************************************************/
1657{
1659 int i;
1660 QWidget *w;
1661
1663 return;
1664 }
1665 if (!gui()->is_repo_dlg_open("SCI")) {
1666 sci_rep = new science_report;
1667 sci_rep->init();
1668 } else {
1669 i = gui()->gimme_index_of("SCI");
1670 w = gui()->game_tab_widget->widget(i);
1671 sci_rep = reinterpret_cast<science_report*>(w);
1672 if (gui()->game_tab_widget->currentIndex() == i) {
1673 sci_rep->redraw();
1674 } else if (raise) {
1675 gui()->game_tab_widget->setCurrentWidget(sci_rep);
1676 }
1677 }
1678}
1679
1680/************************************************************************/
1684{
1685 int i;
1687 QWidget *w;
1688
1689 if (gui()->is_repo_dlg_open("ECO")) {
1690 i = gui()->gimme_index_of("ECO");
1691 if (gui()->game_tab_widget->currentIndex() == i) {
1692 w = gui()->game_tab_widget->widget(i);
1693 eco_rep = reinterpret_cast<eco_report*>(w);
1695 }
1696 }
1697 gui()->update_sidebar_tooltips();
1698}
1699
1700/************************************************************************/
1704{
1705 int i;
1707 QWidget *w;
1708
1709 if (!gui()->is_repo_dlg_open("ECO")) {
1710 eco_rep = new eco_report;
1711 eco_rep->init();
1712 eco_rep->update_report();
1713 } else {
1714 i = gui()->gimme_index_of("ECO");
1715 fc_assert(i != -1);
1716 w = gui()->game_tab_widget->widget(i);
1717 if (w->isVisible()) {
1718 gui()->game_tab_widget->setCurrentIndex(0);
1719 return;
1720 }
1721 eco_rep = reinterpret_cast<eco_report *>(w);
1723 gui()->game_tab_widget->setCurrentWidget(eco_rep);
1724 }
1725}
1726
1727/************************************************************************/
1736
1737/************************************************************************/
1741{
1742 gui()->game_tab_widget->setCurrentIndex(0);
1744}
1745
1746/************************************************************************/
1750{
1752
1753 end_rep = new endgame_report(packet);
1754 end_rep->init();
1755}
1756
1757/************************************************************************/
1761{
1762 int i;
1763
1764 if (gui()->is_repo_dlg_open("END")) {
1765 i = gui()->gimme_index_of("END");
1766 fc_assert(i != -1);
1767 delete gui()->game_tab_widget->widget(i);
1768 }
1769}
1770
1771/************************************************************************/
1775{
1776 int i;
1777
1778 if (gui()->is_repo_dlg_open("END")) {
1779 i = gui()->gimme_index_of("END");
1780 gui()->game_tab_widget->setCurrentIndex(i);
1781 }
1782}
1783
1784/************************************************************************/
1788{
1789 int i;
1791 QWidget *w;
1792
1793 if (gui()->is_repo_dlg_open("END")) {
1794 i = gui()->gimme_index_of("END");
1795 fc_assert(i != -1);
1796 w = gui()->game_tab_widget->widget(i);
1797 end_rep = reinterpret_cast<endgame_report*>(w);
1798 end_rep->update_report(packet);
1799 }
1800}
1801
1802/************************************************************************/
1806{
1807 int i;
1809 QWidget *w;
1810
1811 if (gui()->is_repo_dlg_open("SCI")) {
1812 i = gui()->gimme_index_of("SCI");
1813 if (gui()->game_tab_widget->currentIndex() == i) {
1814 w = gui()->game_tab_widget->widget(i);
1815 sci_rep = reinterpret_cast<science_report*>(w);
1816 sci_rep->redraw();
1817 }
1818 }
1819}
1820
1821/************************************************************************/
1825{
1826 int i;
1828 QWidget *w;
1829
1830 if (gui()->is_repo_dlg_open("ECO")) {
1831 i = gui()->gimme_index_of("ECO");
1832 fc_assert(i != -1);
1833 w = gui()->game_tab_widget->widget(i);
1834 eco_rep = reinterpret_cast<eco_report*>(w);
1835 eco_rep->deleteLater();
1836 }
1837}
1838
1839/************************************************************************/
1843{
1844 int i;
1846 QWidget *w;
1847
1848 if (gui()->is_repo_dlg_open("SCI")) {
1849 i = gui()->gimme_index_of("SCI");
1850 fc_assert(i != -1);
1851 w = gui()->game_tab_widget->widget(i);
1852 sci_rep = reinterpret_cast<science_report*>(w);
1853 sci_rep->deleteLater();
1854 }
1855}
1856
1857/************************************************************************/
1864
1865/************************************************************************/
1869 {
1870 Q_UNUSED(x);
1872 && gui()->game_tab_widget->currentIndex() == 0) {
1874 } else {
1876 }
1877}
int entries_used
Definition agents.c:77
#define str
Definition astring.c:76
QRect zealous_crop_rect(QImage &p)
Definition canvas.cpp:419
struct canvas * qtg_canvas_create(int width, int height)
Definition canvas.cpp:36
struct canvas int int struct sprite int int int int height
Definition canvas_g.h:44
struct canvas int int struct sprite int int int width
Definition canvas_g.h:44
bool city_production_build_units(const struct city *pcity, bool add_production, int *num_units)
Definition city.c:747
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_list_iterate_end
Definition city.h:510
QString split_text(QString text, bool cut)
Definition optiondlg.cpp:62
QString get_tooltip_improvement(const impr_type *building, struct city *pcity, bool ext)
Definition citydlg.cpp:4003
QString cut_helptext(QString text)
QString get_tooltip_unit(const struct unit_type *utype, bool ext)
Definition citydlg.cpp:4062
void put_to_corner()
Definition mapview.cpp:503
QPushButton * sell_button
Definition repodlgs.h:205
void selection_changed(const QItemSelection &sl, const QItemSelection &ds)
QPushButton * sell_redun_button
Definition repodlgs.h:206
QPushButton * disband_button
Definition repodlgs.h:204
void disband_units()
QTableWidget * eco_widget
Definition repodlgs.h:207
int max_row
Definition repodlgs.h:219
void sell_buildings()
void init()
void sell_redundant()
int curr_row
Definition repodlgs.h:218
void update_report()
QLabel * eco_label
Definition repodlgs.h:208
static fc_font * instance()
Definition fonts.cpp:41
QFont * get_font(QString name)
Definition fonts.cpp:63
bool was_destroyed
Definition mapview.h:176
int set_text_title(QString s1, QString s2, bool return_exec=false)
void set_pixmap(struct universal *target)
Definition citydlg.cpp:114
Tech_type_id tech_id
Definition repodlgs.h:123
struct unit_type * tunit
Definition repodlgs.h:124
struct impr_type * timpr
Definition repodlgs.h:125
struct canvas * pcanvas
Definition repodlgs.h:149
void mousePressEvent(QMouseEvent *event)
Definition repodlgs.cpp:716
void create_tooltip_help()
Definition repodlgs.cpp:581
struct reqtree * req
Definition repodlgs.h:150
QString tooltip_text
Definition repodlgs.h:156
QList< req_tooltip_help * > tt_help
Definition repodlgs.h:154
void mouseMoveEvent(QMouseEvent *event)
Definition repodlgs.cpp:763
void update_reqtree()
Definition repodlgs.cpp:686
void paintEvent(QPaintEvent *event)
Definition repodlgs.cpp:837
research_diagram(QWidget *parent=nullptr)
Definition repodlgs.cpp:549
QPoint tooltip_pos
Definition repodlgs.h:155
static units_reports * m_instance
Definition repodlgs.h:88
void clear_layout()
Definition repodlgs.cpp:515
void paintEvent(QPaintEvent *event)
Definition repodlgs.cpp:408
static void drop()
Definition repodlgs.cpp:367
close_widget * cw
Definition repodlgs.h:83
void add_item(unittype_item *item)
Definition repodlgs.cpp:347
static units_reports * instance()
Definition repodlgs.cpp:355
virtual void update_menu()
Definition repodlgs.cpp:378
void update_units(bool show=false)
Definition repodlgs.cpp:416
QHBoxLayout * layout
Definition repodlgs.h:99
QList< unittype_item * > unittype_list
Definition repodlgs.h:100
QHBoxLayout * scroll_layout
Definition repodlgs.h:85
QWidget scroll_widget
Definition repodlgs.h:87
QScrollArea * scroll
Definition repodlgs.h:86
void init_layout()
Definition repodlgs.cpp:387
QLabel label_pix
Definition repodlgs.h:51
int unit_scroll
Definition repodlgs.h:50
QLabel label_info_active
Definition repodlgs.h:59
void leaveEvent(QEvent *event)
Definition repodlgs.cpp:265
unittype_item(QWidget *parent, unit_type *ut)
Definition repodlgs.cpp:97
QLabel gold_upkeep
Definition repodlgs.h:58
QLabel label_info_inbuild
Definition repodlgs.h:60
QLabel shield_upkeep
Definition repodlgs.h:62
void init_img()
Definition repodlgs.cpp:190
void upgrade_units()
Definition repodlgs.cpp:202
void enterEvent(QEnterEvent *event)
Definition repodlgs.cpp:239
QLabel food_upkeep
Definition repodlgs.h:57
QLabel label_info_unit
Definition repodlgs.h:61
unit_type * utype
Definition repodlgs.h:66
QPushButton upgrade_button
Definition repodlgs.h:63
void paintEvent(QPaintEvent *event)
Definition repodlgs.cpp:248
void wheelEvent(QWheelEvent *event)
Definition repodlgs.cpp:274
bool client_is_global_observer(void)
bool client_is_observer(void)
struct civclient client
bool can_client_issue_orders(void)
bool client_has_player(void)
#define client_player()
cid cid_encode_building(const struct impr_type *pimprove)
Definition climisc.c:505
struct universal cid_decode(cid id)
Definition climisc.c:526
cid cid_encode_unit(const struct unit_type *punittype)
Definition climisc.c:493
int cid
Definition climisc.h:31
char * incite_cost
Definition comments.c:76
void unit_focus_set_and_select(struct unit *punit)
Definition control.c:636
#define can_unit_do_activity_client(_punit_, _act_)
Definition control.h:41
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit * punit
Definition dialogs_g.h:74
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction struct unit struct city * pcity
Definition dialogs_g.h:78
int int id
Definition editgui_g.h:28
enum event_type event
Definition events.c:81
int Tech_type_id
Definition fc_types.h:237
int Impr_type_id
Definition fc_types.h:236
int Unit_type_id
Definition fc_types.h:242
@ O_SHIELD
Definition fc_types.h:102
@ O_FOOD
Definition fc_types.h:102
@ O_GOLD
Definition fc_types.h:102
@ O_LAST
Definition fc_types.h:102
#define Q_(String)
Definition fcintl.h:70
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
struct civ_game game
Definition game.c:62
const char * government_name_translation(const struct government *pgovern)
Definition government.c:145
#define governments_iterate(NAME_pgov)
Definition government.h:127
#define governments_iterate_end
Definition government.h:130
void get_text_size(int *width, int *height, enum client_font font, const char *text)
Definition canvas.c:341
void canvas_free(struct canvas *store)
Definition canvas.c:44
static struct tile * pos
Definition finddlg.c:53
void popup_help_dialog_typed(const char *item, enum help_page_type htype)
Definition helpdlg.c:196
const char * title
Definition repodlgs.c:1314
GType type
Definition repodlgs.c:1313
bool comp_less_than(const qlist_item &q1, const qlist_item &q2)
Definition repodlgs.cpp:541
#define show(id)
Definition widget.h:235
#define hide(id)
Definition widget.h:238
void helptext_government(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, struct government *gov)
Definition helpdata.c:4415
void helptext_advance(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, int i)
Definition helpdata.c:3369
char * helptext_unit(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, const struct unit_type *utype, bool class_help)
Definition helpdata.c:1992
char * helptext_building(char *buf, size_t bufsz, struct player *pplayer, const char *user_text, const struct impr_type *pimprove)
Definition helpdata.c:1439
@ HELP_IMPROVEMENT
Definition helpdlg_g.h:20
@ HELP_UNIT
Definition helpdlg_g.h:20
@ HELP_GOVERNMENT
Definition helpdlg_g.h:22
@ HELP_WONDER
Definition helpdlg_g.h:21
@ HELP_TECH
Definition helpdlg_g.h:21
const struct impr_type * valid_improvement(const struct impr_type *pimprove)
struct impr_type * improvement_by_number(const Impr_type_id id)
bool can_sell_building(const struct impr_type *pimprove)
Impr_type_id improvement_number(const struct impr_type *pimprove)
bool is_great_wonder(const struct impr_type *pimprove)
const char * improvement_name_translation(const struct impr_type *pimprove)
#define improvement_iterate_end
#define improvement_iterate(_p)
#define B_LAST
Definition improvement.h:42
#define fc_assert_ret(condition)
Definition log.h:192
#define fc_assert(condition)
Definition log.h:177
@ LOG_VERBOSE
Definition log.h:34
#define log_error(message,...)
Definition log.h:104
int dsend_packet_player_tech_goal(struct connection *pc, int tech)
int dsend_packet_player_research(struct connection *pc, int tech)
int dsend_packet_unit_type_upgrade(struct connection *pc, Unit_type_id type)
#define fc_calloc(n, esz)
Definition mem.h:38
static mpgui * gui
Definition mpgui_qt.cpp:53
const char *const default_font
Definition fonts.h:27
struct nation_type * nation_of_player(const struct player *pplayer)
Definition nation.c:458
struct client_options gui_options
Definition options.c:71
const char * science_dialog_text(void)
Definition text.c:794
struct player * player_by_number(const int player_id)
Definition player.c:852
const char * player_name(const struct player *pplayer)
Definition player.c:900
#define players_iterate_end
Definition player.h:542
#define players_iterate(_pplayer)
Definition player.h:537
void qtg_real_economy_report_dialog_update(void *unused)
QString get_tooltip_improvement(impr_type *building, struct city *pcity, bool ext)
QString split_text(QString text, bool cut)
Definition optiondlg.cpp:62
void qtg_science_report_dialog_redraw()
bool comp_less_than(const qlist_item &q1, const qlist_item &q2)
Definition repodlgs.cpp:541
void popdown_economy_report()
void economy_report_dialog_popup(bool raise)
void qtg_real_units_report_dialog_update(void *unused)
void qtg_endgame_report_dialog_player(const struct packet_endgame_player *packet)
void popdown_science_report()
void units_report_dialog_popup(bool raise)
void qtg_real_science_report_dialog_update(void *unused)
void popdown_endgame_report()
void popdown_units_report()
void qtg_science_report_dialog_popup(bool raise)
void toggle_units_report(bool x)
void popup_endgame_report()
QString cut_helptext(QString text)
void qtg_endgame_report_dialog_start(const struct packet_endgame_report *packet)
QString get_tooltip_unit(struct unit_type *unit, bool ext)
void get_economy_report_units_data(struct unit_entry *entries, int *num_entries_used, int *total_cost)
void get_economy_report_data(struct improvement_entry *entries, int *num_entries_used, int *total_cost, int *total_income)
void sell_all_improvements(const struct impr_type *pimprove, bool redundant_only, char *message, size_t message_sz)
void disband_all_units(const struct unit_type *punittype, bool in_cities_only, char *message, size_t message_sz)
void draw_reqtree(struct reqtree *tree, struct canvas *pcanvas, int canvas_x, int canvas_y, int tt_x, int tt_y, int w, int h)
Definition reqtree.c:1045
void get_reqtree_dimensions(struct reqtree *reqtree, int *width, int *height)
Definition reqtree.c:878
Tech_type_id get_tech_on_reqtree(struct reqtree *tree, int x, int y)
Definition reqtree.c:1185
void destroy_reqtree(struct reqtree *tree)
Definition reqtree.c:478
struct reqtree * create_reqtree(struct player *pplayer, bool show_all)
Definition reqtree.c:847
#define requirement_vector_iterate_end
#define requirement_vector_iterate(req_vec, preq)
bool research_invention_reachable(const struct research *presearch, const Tech_type_id tech)
Definition research.c:671
const char * research_advance_name_translation(const struct research *presearch, Tech_type_id tech)
Definition research.c:276
struct research * research_get(const struct player *pplayer)
Definition research.c:130
enum tech_state research_invention_state(const struct research *presearch, Tech_type_id tech)
Definition research.c:622
#define ARRAY_SIZE(x)
Definition shared.h:85
#define MAX(x, y)
Definition shared.h:54
size_t size
Definition specvec.h:72
struct sprite int x
Definition sprite_g.h:31
struct sprite int int int int struct sprite int int float bool smooth get_sprite_dimensions
Definition sprite_g.h:36
QPixmap map_pixmap
Definition canvas.h:25
Definition city.h:318
struct packet_ruleset_control control
Definition game.h:83
struct connection conn
Definition client_main.h:96
bool reqtree_show_icons
Definition options.h:222
Definition colors.h:21
QTableWidget * end_widget
Definition repodlgs.h:237
endgame_report(const struct packet_endgame_report *packet)
void update_report(const struct packet_endgame_player *packet)
Definition mapimg.c:367
Definition climisc.h:82
char category_name[32][MAX_LEN_NAME]
Definition packets_gen.h:90
int num_nodes
Definition repodlgs.cpp:86
struct tree_node ** nodes
Definition repodlgs.cpp:87
int * layer_size
Definition repodlgs.cpp:89
int diagram_height
Definition repodlgs.cpp:91
int diagram_width
Definition repodlgs.cpp:91
struct tree_node *** layers
Definition repodlgs.cpp:90
int num_layers
Definition repodlgs.cpp:88
enum tech_state state
Definition research.h:71
Tech_type_id researching
Definition research.h:52
Tech_type_id tech_goal
Definition research.h:83
struct research::@79::@81 client
struct research::research_invention inventions[A_ARRAY_SIZE]
int techs_researched
Definition research.h:42
int researching_cost
Definition research.h:96
int bulbs_researched
Definition research.h:53
QGridLayout * sci_layout
Definition repodlgs.h:171
QLabel * progress_label
Definition repodlgs.h:174
GtkProgressBar * progress_bar
Definition repodlgs.c:75
progress_bar * progress
Definition repodlgs.h:172
QScrollArea * scroll
Definition repodlgs.h:178
QComboBox * goal_combo
Definition repodlgs.h:169
QList< qlist_item > * curr_list
Definition repodlgs.h:175
QLabel * info_label
Definition repodlgs.h:173
research_diagram * res_diag
Definition repodlgs.h:177
QList< qlist_item > * goal_list
Definition repodlgs.h:176
void update_report()
Definition repodlgs.cpp:962
void update_reqtree()
void reset_tree()
Definition repodlgs.cpp:950
void current_tech_changed(int index)
void goal_tech_changed(int index)
QComboBox * researching_combo
Definition repodlgs.h:170
QPixmap * pm
Definition sprite.h:25
Tech_type_id tech
Definition repodlgs.cpp:72
int nprovide
Definition repodlgs.cpp:75
struct tree_node ** provide
Definition repodlgs.cpp:76
int node_width
Definition repodlgs.cpp:78
bool is_dummy
Definition repodlgs.cpp:71
int node_height
Definition repodlgs.cpp:78
int nrequire
Definition repodlgs.cpp:73
struct tree_node ** require
Definition repodlgs.cpp:74
Definition unit.h:140
int upkeep[O_LAST]
Definition unit.h:150
enum unit_activity activity
Definition unit.h:159
int homecity
Definition unit.h:148
const struct unit_type * utype
Definition unit.h:141
enum universals_n kind
Definition fc_types.h:593
universals_u value
Definition fc_types.h:592
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
#define TRUE
Definition support.h:46
struct advance * advance_by_number(const Tech_type_id atype)
Definition tech.c:107
bool is_future_tech(Tech_type_id tech)
Definition tech.c:281
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:300
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define advance_index_iterate_max(_start, _index, _max)
Definition tech.h:250
#define advance_index_iterate_max_end
Definition tech.h:256
static Tech_type_id advance_count(void)
Definition tech.h:167
#define A_FIRST
Definition tech.h:44
#define A_UNSET
Definition tech.h:48
const char * get_science_target_text(double *percent)
Definition text.c:873
const char * get_science_goal_text(Tech_type_id goal)
Definition text.c:919
struct sprite * get_government_sprite(const struct tileset *t, const struct government *gov)
Definition tilespec.c:7033
struct sprite * get_building_sprite(const struct tileset *t, const struct impr_type *pimprove)
Definition tilespec.c:7023
struct tileset * get_tileset(void)
Definition tilespec.c:718
struct sprite * tiles_lookup_sprite_tag_alt(struct tileset *t, enum log_level level, const char *tag, const char *alt, const char *alt2, const char *what, const char *name, bool scale)
Definition tilespec.c:3836
struct sprite * get_tax_sprite(const struct tileset *t, Output_type_id otype)
Definition tilespec.c:7127
struct sprite * get_unittype_sprite(const struct tileset *t, const struct unit_type *punittype, enum unit_activity activity, enum direction8 facing)
Definition tilespec.c:7045
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:6996
struct sprite * get_tech_sprite(const struct tileset *t, Tech_type_id tech)
Definition tilespec.c:7014
const struct unit_type * utype
Definition fc_types.h:535
const struct impr_type * building
Definition fc_types.h:528
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
#define unit_list_iterate_end
Definition unitlist.h:33
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:126
bool is_tech_req_for_utype(const struct unit_type *ptype, struct advance *padv)
Definition unittype.c:2756
const struct unit_type * can_upgrade_unittype(const struct player *pplayer, const struct unit_type *punittype)
Definition unittype.c:1729
Unit_type_id utype_count(void)
Definition unittype.c:82
struct unit_type * utype_by_number(const Unit_type_id id)
Definition unittype.c:114
Unit_type_id utype_number(const struct unit_type *punittype)
Definition unittype.c:102
Unit_type_id utype_index(const struct unit_type *punittype)
Definition unittype.c:93
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1586
int unit_upgrade_price(const struct player *pplayer, const struct unit_type *from, const struct unit_type *to)
Definition unittype.c:1757
#define unit_type_iterate(_p)
Definition unittype.h:863
#define U_LAST
Definition unittype.h:40
#define unit_type_iterate_end
Definition unittype.h:870