From 05fe72c22648022fe97fa913401666b044d2fc8c Mon Sep 17 00:00:00 2001 From: Dino Date: Sun, 23 Aug 2026 18:07:45 -0400 Subject: [PATCH] Qt client: improve city dialog UI design RM #2115 --- client/gui-qt/citydlg.cpp | 150 ++++++++++++++++----------- client/gui-qt/citydlg.h | 9 +- data/themes/gui-qt/icons/Makefile.am | 1 + data/themes/gui-qt/icons/smiley.png | Bin 0 -> 967 bytes meson.build | 1 + 5 files changed, 98 insertions(+), 63 deletions(-) create mode 100755 data/themes/gui-qt/icons/smiley.png diff --git a/client/gui-qt/citydlg.cpp b/client/gui-qt/citydlg.cpp index 840c12859c..1c805895f4 100644 --- a/client/gui-qt/citydlg.cpp +++ b/client/gui-qt/citydlg.cpp @@ -1699,23 +1699,27 @@ city_dialog::city_dialog(QWidget *parent): qfc_dialog(parent) prev_city_but->setToolTip(_("Show previous city")); happiness_button = new QPushButton(); - happiness_button->setIcon(fc_icons::instance()->get_icon("city-switch")); - happiness_button->setIconSize(QSize(56, 28)); - connect(happiness_button, &QAbstractButton::clicked, this, &city_dialog::show_happiness); + happiness_button->setIcon(fc_icons::instance()->get_icon("smiley")); + happiness_button->setIconSize(QSize(56,28)); + connect(happiness_button, &QAbstractButton::clicked, this, + &city_dialog::show_happiness); + + settings_button = new QPushButton(_("Settings")); + connect(settings_button, &QAbstractButton::clicked, this, + &city_dialog::display_settings_menu); + settings_button->setToolTip(_("Counters, worklist, and options menu")); button->setFixedSize(64, 64); prev_city_but->setFixedSize(64, 64); next_city_but->setFixedSize(64, 64); happiness_button->setFixedSize(64, 32); + settings_button->setFixedSize(64, 32); vbox_layout = new QVBoxLayout; vbox_layout->addWidget(prev_city_but); vbox_layout->addWidget(next_city_but); vbox_layout->addWidget(button); vbox_layout->addWidget(happiness_button, Qt::AlignHCenter); - - counterss_button = new QPushButton(); - connect(counterss_button, &QAbstractButton::clicked, this, &city_dialog::show_counters); - vbox_layout->addWidget(counterss_button, Qt::AlignHCenter); + vbox_layout->addWidget(settings_button, Qt::AlignHCenter); update_tabs(); hbox_layout = new QHBoxLayout; @@ -1817,7 +1821,7 @@ city_dialog::city_dialog(QWidget *parent): qfc_dialog(parent) worklist_layout->addWidget(qgbprod); connect(p_table_p, &QWidget::customContextMenuRequested, this, - &city_dialog::display_worklist_menu); + &city_dialog::display_settings_menu); connect(production_combo_p, &progress_bar::clicked, this, &city_dialog::show_targets); connect(work_add_but, &QAbstractButton::clicked, this, &city_dialog::show_targets_worklist); connect(work_prev_but, &QAbstractButton::clicked, this, &city_dialog::worklist_up); @@ -1874,9 +1878,9 @@ city_dialog::city_dialog(QWidget *parent): qfc_dialog(parent) gridl = new QGridLayout; slider_grid = new QGridLayout; - counterss_layout = new QVBoxLayout(); - counterss_frame = new QFrame(); - counterss_frame->setLayout(counterss_layout); + counters_widget = new QWidget(); + counters_layout = new QVBoxLayout(counters_widget); + counters_widget->setLayout(counters_layout); qpush2 = new QPushButton(style()->standardIcon(QStyle::SP_DialogSaveButton), @@ -2102,23 +2106,16 @@ void city_dialog::change_production(bool next) } /************************************************************************//** - Sets tooltip for happiness/pruction button switcher + Sets tooltip for happiness button switcher ****************************************************************************/ void city_dialog::update_tabs() { if (current_tab == happiness) { + happiness_button->setIcon(fc_icons::instance()->get_icon("city-switch")); happiness_button->setToolTip(_("Show city production")); - counterss_button->setToolTip(_("Show counters information")); - } else { + happiness_button->setIcon(fc_icons::instance()->get_icon("smiley")); happiness_button->setToolTip(_("Show happiness information")); - - if (current_tab == counters) { - counterss_button->setToolTip(_("Show city production")); - } - else { - counterss_button->setToolTip(_("Show counters information")); - } } } @@ -2127,7 +2124,7 @@ void city_dialog::update_tabs() ****************************************************************************/ void city_dialog::show_happiness() { - QWidget *active_tab = current_tab == counters ? (QWidget*) counterss_frame : prod_unit_splitter; + QWidget *active_tab = current_tab == counters ? (QWidget*) counters_widget : prod_unit_splitter; setUpdatesEnabled(false); @@ -2157,39 +2154,48 @@ void city_dialog::show_happiness() update_tabs(); } +/************************************************************************//** + close counters tab +****************************************************************************/ +void city_dialog::close_counters() +{ + setUpdatesEnabled(false); + + leftbot_layout->replaceWidget(counters_widget, + prod_unit_splitter, + Qt::FindDirectChildrenOnly); + prod_unit_splitter->show(); + prod_unit_splitter->updateGeometry(); + counters_widget->hide(); + current_tab = common; + + setUpdatesEnabled(true); + update(); + update_tabs(); +} + /************************************************************************//** Shows counters tab ****************************************************************************/ void city_dialog::show_counters() { QWidget *active_tab = current_tab == happiness ? happiness_widget : prod_unit_splitter; - setUpdatesEnabled(false); - if (current_tab != counters) { + setUpdatesEnabled(false); + leftbot_layout->replaceWidget(active_tab, - counterss_frame, + counters_widget, Qt::FindDirectChildrenOnly); active_tab->hide(); - counterss_frame->show(); - counterss_frame->updateGeometry(); + counters_widget->show(); + counters_widget->updateGeometry(); current_tab = counters; - } else { - /* We do not change prod_unit_splitter to current_tab, - * because counters is active tab and clicked - - * switching to default */ - leftbot_layout->replaceWidget(counterss_frame, - prod_unit_splitter, - Qt::FindDirectChildrenOnly); - prod_unit_splitter->show(); - prod_unit_splitter->updateGeometry(); - counterss_frame->hide(); - current_tab = common; - } - setUpdatesEnabled(true); - update(); - update_tabs(); + setUpdatesEnabled(true); + update(); + update_tabs(); + } } /************************************************************************//** @@ -2280,13 +2286,13 @@ city_dialog::~city_dialog() // Delete the one widget that currently does NOT have a parent if (current_tab == common) { delete happiness_widget; - delete counterss_frame; + delete counters_widget; } else if (current_tab == counters) { delete happiness_widget; delete prod_unit_splitter; - }else { - delete counterss_frame; + } else { + delete counters_widget; delete prod_unit_splitter; } } @@ -2782,28 +2788,32 @@ void city_dialog::cma_context_menu(const QPoint &p) /************************************************************************//** Context menu on production tab in city worklist ****************************************************************************/ -void city_dialog::display_worklist_menu(const QPoint &p) +void city_dialog::display_settings_menu() { QAction *action; QAction *disband; QAction *wl_save; QAction *wl_clear; QAction *wl_empty; + QAction *counters_action; QMap list; QMap::const_iterator map_iter; QMenu *change_menu; QMenu *insert_menu; - QMenu *list_menu; + QMenu *settings_menu; QMenu *options_menu; int city_id = dlgcity->id; if (!can_client_issue_orders()) { return; } - list_menu = new QMenu(this); - change_menu = list_menu->addMenu(_("Change worklist")); - insert_menu = list_menu->addMenu(_("Insert worklist")); - wl_clear = list_menu->addAction(_("Clear")); + settings_menu = new QMenu(this); + counters_action = settings_menu->addAction(_("Counters")); + connect(counters_action, &QAction::triggered, this, + &city_dialog::show_counters); + change_menu = settings_menu->addMenu(_("Change worklist")); + insert_menu = settings_menu->addMenu(_("Insert worklist")); + wl_clear = settings_menu->addAction(_("Clear worklist")); connect(wl_clear, &QAction::triggered, this, &city_dialog::clear_worklist); list.clear(); @@ -2828,9 +2838,9 @@ void city_dialog::display_worklist_menu(const QPoint &p) map_iter++; } - wl_save = list_menu->addAction(_("Save worklist")); + wl_save = settings_menu->addAction(_("Save worklist")); connect(wl_save, &QAction::triggered, this, &city_dialog::save_worklist); - options_menu = list_menu->addMenu(_("Options")); + options_menu = settings_menu->addMenu(_("Options")); disband = options_menu->addAction(_("Allow disbanding city")); disband->setCheckable(true); disband->setChecked(is_city_option_set(dlgcity, CITYO_DISBAND)); @@ -2876,7 +2886,7 @@ void city_dialog::display_worklist_menu(const QPoint &p) city_queue_insert_worklist(pcity, selected_row_p + 1, worklist); }); - list_menu->popup(QCursor::pos()); + settings_menu->popup(QCursor::pos()); } /************************************************************************//** @@ -3030,7 +3040,29 @@ void city_dialog::update_counters_table() small_font = fc_font::instance()->get_font(fonts::notify_label); - qDeleteAll(counterss_frame->findChildren("", Qt::FindDirectChildrenOnly)); + qDeleteAll(counters_widget->findChildren("", Qt::FindDirectChildrenOnly)); + + QWidget *titlebar_widget = new QWidget(); + QHBoxLayout *titlebar_layout = new QHBoxLayout(titlebar_widget); + titlebar_widget->setLayout(titlebar_layout); + + titlebar_layout->addWidget(new QLabel(_("Counters"), + titlebar_widget), + 0, Qt::AlignCenter); + QPushButton *closeButton = + new QPushButton(fc_icons::instance()->get_icon("close"), "", + titlebar_widget); + connect(closeButton, &QPushButton::clicked, this, + &city_dialog::close_counters); + closeButton->setFixedSize(28, 28); + + titlebar_layout->setContentsMargins(11, 0, 5, 0); + titlebar_layout->addWidget(closeButton, 0); + + counters_layout->setContentsMargins(11, 0, 11, 5); + counters_layout->addWidget(titlebar_widget, 0, Qt::AlignTop); + counters_layout->setStretch(0, 0); + city_counters_iterate(pcount) { QString helptext; char buf[1024]; @@ -3056,10 +3088,10 @@ void city_dialog::update_counters_table() activated->setFont(*small_font); help->setFont(*small_font); - counterss_layout->addWidget(name); - counterss_layout->addWidget(value); - counterss_layout->addWidget(activated); - counterss_layout->addWidget(help); + counters_layout->addWidget(name); + counters_layout->addWidget(value); + counters_layout->addWidget(activated); + counters_layout->addWidget(help); } city_counters_iterate_end; } diff --git a/client/gui-qt/citydlg.h b/client/gui-qt/citydlg.h index dc4be42fa0..33d7bf3e92 100644 --- a/client/gui-qt/citydlg.h +++ b/client/gui-qt/citydlg.h @@ -444,7 +444,7 @@ class city_dialog: public qfc_dialog QHBoxLayout *single_page_layout; QHBoxLayout *happiness_layout; - QVBoxLayout *counterss_layout; + QVBoxLayout *counters_layout; QSplitter *prod_unit_splitter; QSplitter *central_left_splitter; QSplitter *central_splitter; @@ -459,7 +459,7 @@ class city_dialog: public qfc_dialog QGroupBox *info_labels_group; QGroupBox *happiness_group; QWidget *happiness_widget; - QFrame *counterss_frame; + QWidget *counters_widget; QWidget *info_widget; QLabel *qlt[NUM_INFO_FIELDS]; QLabel *cma_info_text; @@ -489,7 +489,7 @@ class city_dialog: public qfc_dialog QPushButton *work_add_but; QPushButton *work_rem_but; QPushButton *happiness_button; - QPushButton *counterss_button; + QPushButton *settings_button; QPushButton *zoom_in_button; QPushButton *zoom_out_button; QPixmap *citizen_pixmap; @@ -534,6 +534,7 @@ private slots: void show_targets(); void show_targets_worklist(); void show_happiness(); + void close_counters(); void show_counters(); void buy(); void dbl_click_p(QTableWidgetItem *item); @@ -543,7 +544,7 @@ private slots: void worklist_up(); void worklist_down(); void worklist_del(); - void display_worklist_menu(const QPoint &p); + void display_settings_menu(); void disband_state_changed(bool allow_disband); void cma_slider(int val); void cma_toggle_changed(Qt::CheckState state); diff --git a/data/themes/gui-qt/icons/Makefile.am b/data/themes/gui-qt/icons/Makefile.am index 96e8877ef2..4d85e87905 100644 --- a/data/themes/gui-qt/icons/Makefile.am +++ b/data/themes/gui-qt/icons/Makefile.am @@ -50,6 +50,7 @@ pkgdata_DATA = \ resize.png \ sentry.png \ set_homecity.png \ + smiley.png \ transform.png \ units.png \ unload.png \ diff --git a/data/themes/gui-qt/icons/smiley.png b/data/themes/gui-qt/icons/smiley.png new file mode 100755 index 0000000000000000000000000000000000000000..f445d120c504c04204275508e57f401444ff1487 GIT binary patch literal 967 zcmV;&133JNP)TI}41>AFUIjHAW6dwh3NzO#4S(}#kStM=z>(8h+Et;YSnLAuT6Xmok^ z>V5jqX#K=o^4Vbc?Th@zM;aOv>ceZn)b9JrO!@AS`thU&1_sHpY5MS;m#W11^vIB- zz0tpU$i<0_h-UQ1Zlse_`0IuG*=~1+o%ZH*_}N?e?v(oStM}@F`q5MWw>bOsv2lQu zj-a~t-Cu^7vBcQ(pRvl5rogDX)vdqSv&P_~w$QM{-M!D~NML(~m#@Rn&3K2Jik!9o zzD$RIXTYpumXd1SwO_`wZr9C#lZ;wzb7Yx>R?y(``NwEvUq{BrlJDh!E%X^iT%lC>g1}@ zHq?Wp}rOjoK?BFxO{j+A-vi;fB=Gu2eZg%Y6>yvuteuU!~p_`q22-rR5LX7 z6cqF{8H%)2q(B0700G2MFC`_F8ltJ^sb(z8p~0go%nlTgssjihhI$7F0Uri2SqV9% zO1TsUGik{*2M32bfB<5s7Z6Bh0gB7XDTT>N0L3df1q1}@00M}i-qw~glR-=&F`>jb zivuXmA8l)ETL%z84E6T*>{>iRGP3&m3VH@S@#03M_V)I500G2MZ)3x$B^qNOCL<#z z#AC+F%A{grV^aqZKn(TP*0BYKh0F{>LJT}+xf(_yoYvOXbpQdxP;X~vStf3nALPr- ztij>WWTYNvXJ=Oj5I_v|mX?;WBK*=x;qLC)UQ9-A-arA%I)DITsOJL$`6wfPATTmA z;*X323Df}u5JSBp5JY$cG8ut@NO5_(GEkrnAb=R^t*oqExm|qaCDn5zi!}sI*qoHD ztm*&)h@oCtS=rQy&4f{qgTqgd(L|fu6ev;$5I_v|<{;q2&Bms!t9?F8o60R#|3 peKj`V2oOLFjE;4fz>yIkzyON=i<~|`Wmf?;a30v literal 0 HcmV?d00001 diff --git a/meson.build b/meson.build index 4ab72a4450..19f9218cf5 100644 --- a/meson.build +++ b/meson.build @@ -3733,6 +3733,7 @@ install_data( 'data/themes/gui-qt/icons/resize.png', 'data/themes/gui-qt/icons/sentry.png', 'data/themes/gui-qt/icons/set_homecity.png', + 'data/themes/gui-qt/icons/smiley.png', 'data/themes/gui-qt/icons/transform.png', 'data/themes/gui-qt/icons/units.png', 'data/themes/gui-qt/icons/unload.png', -- 2.31.0