Author: mir3x Date: Tue Jan 27 16:50:54 2015 New Revision: 27859 URL: http://svn.gna.org/viewcvs/freeciv?rev=27859&view=rev Log: Added functions to help creating the sidebar and adding a second panel below the text.
Patch by Louis Moureaux <louis94>. See patch #5747 Modified: branches/S2_5/client/gui-qt/helpdlg.cpp branches/S2_5/client/gui-qt/helpdlg.h Modified: branches/S2_5/client/gui-qt/helpdlg.cpp URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/client/gui-qt/helpdlg.cpp?rev=27859&r1=27858&r2=27859&view=diff ============================================================================== --- branches/S2_5/client/gui-qt/helpdlg.cpp (original) +++ branches/S2_5/client/gui-qt/helpdlg.cpp Tue Jan 27 16:50:54 2015 @@ -17,6 +17,8 @@ #define MAX_HELP_TEXT_SIZE 8192 // Taken from Gtk 3 client +#include "fc_config.h" + // common #include "nation.h" #include "terrain.h" @@ -43,6 +45,7 @@ // Qt #include <QApplication> #include <QDialogButtonBox> +#include <QGraphicsDropShadowEffect> #include <QGroupBox> #include <QProgressBar> #include <QPushButton> @@ -228,7 +231,8 @@ **************************************************************************/ help_widget::help_widget(QWidget *parent) : QWidget(parent), - main_widget(NULL) + main_widget(NULL), text_browser(NULL), bottom_panel(NULL), + info_panel(NULL), splitter(NULL), info_layout(NULL) { setup_ui(); } @@ -238,18 +242,25 @@ **************************************************************************/ help_widget::help_widget(const help_item *topic, QWidget *parent) : QWidget(parent), - main_widget(NULL) + main_widget(NULL), text_browser(NULL), bottom_panel(NULL), + info_panel(NULL), splitter(NULL), info_layout(NULL) { setup_ui(); set_topic(topic); } /************************************************************************** + Destructor. +**************************************************************************/ +help_widget::~help_widget() { + // Nothing to do here +} + +/**************************************************************************** Creates the UI. -**************************************************************************/ +****************************************************************************/ void help_widget::setup_ui() { - QVBoxLayout *layout; QHBoxLayout *group_layout; @@ -267,8 +278,11 @@ group_layout->addWidget(title_label); text_browser = new QTextBrowser(this); + text_browser->setFont(QFont(QLatin1String("mono"))); layout->addWidget(text_browser); main_widget = text_browser; + + splitter_sizes << 200 << 400; update_fonts(); } @@ -289,6 +303,194 @@ foreach (label, label_list) { label->setFont(*label_font); } + foreach (label, title_list) { + label->setFont(*title_font); + } +} + +/**************************************************************************** + Lays things out. The widget is organized as follows, with the additional + complexity that info_ and/or bottom_panel may be absent. + + +---------------------------------+ + | title_label | + +---------------------------------+ + |+-main_widget-------------------+| + ||+------------+ +--------------+|| + ||| | | ||| + ||| info_panel | | text_browser ||| + ||| | | ||| + ||| |.+--------------+|| + ||| |. ... || + ||| |.+--------------+|| + ||| | | ||| + ||| | | bottom_panel ||| + ||| | | ||| + ||+------------+ +--------------+|| + |+-------------------------------+| + +---------------------------------+ +****************************************************************************/ +void help_widget::do_layout() +{ + QWidget *right; + + layout()->removeWidget(main_widget); + main_widget->setParent(NULL); + + if (bottom_panel) { + splitter = new QSplitter(Qt::Vertical); + splitter->addWidget(text_browser); + splitter->setStretchFactor(0, 100); + splitter->addWidget(bottom_panel); + splitter->setStretchFactor(1, 0); + right = splitter; + } else { + right = text_browser; + } + + if (info_panel) { + splitter = new QSplitter(); + splitter->addWidget(info_panel); + splitter->setStretchFactor(0, 25); + splitter->addWidget(right); + splitter->setStretchFactor(1, 75); + splitter->setSizes(splitter_sizes); + main_widget = splitter; + } else { + main_widget = right; + } + + layout()->addWidget(main_widget); + qobject_cast<QVBoxLayout *>(layout())->setStretchFactor(main_widget, 100); +} + +/**************************************************************************** + Deletes the widgets created by do_complex_layout(). +****************************************************************************/ +void help_widget::undo_layout() +{ + // Save the splitter sizes to avoid jumps + if (info_panel) { + splitter_sizes = splitter->sizes(); + } + // Unparent the widget we want to keep + text_browser->setParent(NULL); + // Delete everything else + if (text_browser != main_widget) { + main_widget->deleteLater(); + } + // Reset pointers to defaults + main_widget = text_browser; + bottom_panel = NULL; + info_panel = NULL; + splitter = NULL; + info_layout = NULL; + // Don't keep pointers to deleted labels + label_list.clear(); + title_list.clear(); +} + +/**************************************************************************** + Creates the information panel. It will be shown by do_complex_layout(). +****************************************************************************/ +void help_widget::show_info_panel() +{ + info_panel = new QWidget(); + info_layout = new QVBoxLayout(info_panel); +} + +/**************************************************************************** + Adds a pixmap to the information panel. +****************************************************************************/ +void help_widget::add_info_canvas(struct canvas *canvas, bool shadow) +{ + QLabel *label = new QLabel(); + QGraphicsDropShadowEffect *effect; + + label->setAlignment(Qt::AlignHCenter); + label->setPixmap(canvas->map_pixmap); + + if (shadow) { + effect = new QGraphicsDropShadowEffect(label); + effect->setBlurRadius(3); + effect->setOffset(0, 2); + label->setGraphicsEffect(effect); + } + + info_layout->addWidget(label); +} + +/**************************************************************************** + Adds a text label to the information panel. +****************************************************************************/ +void help_widget::add_info_label(const QString &text) +{ + QLabel *label = new QLabel(text); + label->setWordWrap(true); + + label_list << label; + info_layout->addWidget(label); +} + +/************************************************************************** + Adds a widget indicating a progress to the information panel. + Arguments: + text: A descriptive text + progress: The progress to display + [min,max]: The interval progress is in + value: Use this to display a non-numeral value +**************************************************************************/ +void help_widget::add_info_progress(const QString &text, int progress, + int min, int max, const QString &value) +{ + QGridLayout *layout; + QLabel *label; + QProgressBar *bar; + QWidget *wdg; + + wdg = new QWidget(); + layout = new QGridLayout(wdg); + layout->setMargin(0); + layout->setVerticalSpacing(0); + + label = new QLabel(text, wdg); + label_list << label; + layout->addWidget(label, 0, 0); + + label = new QLabel(wdg); + label_list << label; + if (value.isEmpty()) { + label->setNum(progress); + } else { + label->setText(value); + } + layout->addWidget(label, 0, 1, Qt::AlignRight); + + bar = new QProgressBar(wdg); + bar->setMaximumHeight(4); + bar->setRange(min, max != min ? max : min + 1); + bar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); + bar->setTextVisible(false); + bar->setValue(progress); + layout->addWidget(bar, 1, 0, 1, 2); + + info_layout->addWidget(wdg); +} + +/**************************************************************************** + Adds a separator to the information panel. +****************************************************************************/ +void help_widget::add_info_separator() +{ + info_layout->addSpacing(2 * info_layout->spacing()); +} + +/**************************************************************************** + Called when everything needed has been added to the information panel. +****************************************************************************/ +void help_widget::info_panel_done() +{ + info_layout->addStretch(); } /************************************************************************** @@ -296,15 +498,13 @@ **************************************************************************/ void help_widget::set_topic(const help_item *topic) { - // Remove any widget added by set_topic_xxx - set_main_widget(text_browser); - label_list.clear(); - char *title = topic->topic; for ( ; *title == ' '; ++title) { // Do nothing } title_label->setText(title); + + undo_layout(); switch (topic->type) { case HELP_ANY: @@ -343,7 +543,16 @@ case HELP_LAST: // Just to avoid warning break; } + + do_layout(); update_fonts(); +} + +/**************************************************************************** + Sets the bottom panel. +****************************************************************************/ +void help_widget::set_bottom_panel(QWidget *widget) { + bottom_panel = widget; } /************************************************************************** @@ -365,53 +574,6 @@ } /************************************************************************** - Creates a widget indicating a progress, used eg on unit help pages. - Arguments: - text: A descriptive text - progress: The progress to display - [min,max]: The interval progress is in - value: Use this to display a non-numeral value -**************************************************************************/ -QWidget *help_widget::create_progress_widget(const QString &text, - int progress, - int min, int max, - const QString &value) -{ - QGridLayout *layout; - QLabel *label; - QProgressBar *bar; - QWidget *wdg; - - wdg = new QWidget(); - layout = new QGridLayout(wdg); - layout->setMargin(0); - layout->setVerticalSpacing(0); - - label = new QLabel(text, wdg); - label_list << label; - layout->addWidget(label, 0, 0); - - label = new QLabel(wdg); - label_list << label; - if (value.isEmpty()) { - label->setNum(progress); - } else { - label->setText(value); - } - layout->addWidget(label, 0, 1, Qt::AlignRight); - - bar = new QProgressBar(wdg); - bar->setMaximumHeight(4); - bar->setRange(min, max != min ? max : min + 1); - bar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); - bar->setTextVisible(false); - bar->setValue(progress); - layout->addWidget(bar, 1, 0, 1, 2); - - return wdg; -} - -/************************************************************************** Creates help pages with no special widgets. **************************************************************************/ void help_widget::set_topic_other(const help_item *topic, @@ -435,11 +597,7 @@ struct advance *tech; struct canvas *canvas; struct unit_type *obsolete, *utype, *max_utype; - QLabel *label; QList<int> list; - QSplitter *splitter; - QVBoxLayout *vbox; - QWidget *panel; utype = unit_type_by_translated_name(title); if (utype) { @@ -447,55 +605,34 @@ topic->text, utype); text_browser->setText(buffer); - // Create information widget + // Create information panel + show_info_panel(); max_utype = uclass_max_values(utype->uclass); - splitter = new QSplitter(this); - splitter->setSizePolicy(QSizePolicy::Expanding, - QSizePolicy::Expanding); - set_main_widget(splitter); - - panel = new QWidget(splitter); - vbox = new QVBoxLayout(panel); - splitter->addWidget(panel); - splitter->setStretchFactor(0, 25); - splitter->addWidget(text_browser); - splitter->setStretchFactor(1, 75); - list << 200 << 400; - splitter->setSizes(list); - - label = new QLabel(); - // Create unit icon + + // Unit icon canvas = qtg_canvas_create( tileset_full_tile_width(tileset), tileset_full_tile_height(tileset) ); canvas->map_pixmap.fill(Qt::transparent); put_unittype(utype, canvas, 0, 0); - label->setAlignment(Qt::AlignHCenter); - label->setPixmap(canvas->map_pixmap); + add_info_canvas(canvas); qtg_canvas_free(canvas); - vbox->addWidget(label); - - vbox->addWidget(create_progress_widget( - _("Attack:"), utype->attack_strength, 0, - max_utype->attack_strength)); - vbox->addWidget(create_progress_widget( - _("Defense:"), utype->defense_strength, - 0, max_utype->defense_strength)); - vbox->addWidget(create_progress_widget( - _("Moves:"), utype->move_rate, 0, max_utype->move_rate, - move_points_text(utype->move_rate, true))); - - vbox->addItem(new QSpacerItem(0, 2 * vbox->spacing())); - - vbox->addWidget(create_progress_widget( - _("Hitpoints:"), utype->hp, 0, max_utype->hp)); - vbox->addWidget(create_progress_widget( - _("Cost:"), utype_build_shield_cost(utype), - 0, utype_build_shield_cost(max_utype))); - vbox->addWidget(create_progress_widget( - _("Firepower:"), utype->firepower, 0, - max_utype->firepower)); + + add_info_progress(_("Attack:"), utype->attack_strength, 0, + max_utype->attack_strength); + add_info_progress(_("Defense:"), utype->defense_strength, + 0, max_utype->defense_strength); + add_info_progress(_("Moves:"), utype->move_rate, 0, max_utype->move_rate, + move_points_text(utype->move_rate, true)); + + add_info_separator(); + + add_info_progress(_("Hitpoints:"), utype->hp, 0, max_utype->hp); + add_info_progress(_("Cost:"), utype_build_shield_cost(utype), + 0, utype_build_shield_cost(max_utype)); + add_info_progress(_("Firepower:"), utype->firepower, 0, + max_utype->firepower); // Upkeep upkeep = utype->upkeep[O_FOOD] + utype->upkeep[O_GOLD] @@ -506,52 +643,42 @@ + max_utype->upkeep[O_LUXURY] + max_utype->upkeep[O_SCIENCE] + max_utype->upkeep[O_SHIELD] + max_utype->upkeep[O_TRADE] + max_utype->happy_cost; - vbox->addWidget(create_progress_widget( - _("Basic upkeep:"), upkeep, 0, max_upkeep, - helptext_unit_upkeep_str(utype))); - - vbox->addItem(new QSpacerItem(0, 2 * vbox->spacing())); + add_info_progress(_("Basic upkeep:"), upkeep, 0, max_upkeep, + helptext_unit_upkeep_str(utype)); + + add_info_separator(); // Tech requirement - label = new QLabel(); - label_list << label; tech = utype->require_advance; if (tech && tech != advance_by_number(0)) { - // TRANS: Unit requires technology - label->setText(QString(_("Requires %1.")) + /// TRANS: Unit requires technology + add_info_label(QString(_("Requires %1.")) .arg(advance_name_translation(tech))); } else { - label->setText(_("No technology required.")); + add_info_label(_("No technology required.")); } - label->setWordWrap(true); - vbox->addWidget(label); // Obsolescence - label = new QLabel(); - label_list << label; obsolete = utype->obsoleted_by; if (obsolete) { tech = obsolete->require_advance; if (tech && tech != advance_by_number(0)) { - // TRANS: Current unit obsoleted by other unit (technology - // required to build other unit) - label->setText(QString(_("Obsoleted by %1 (%2).")) + /// TRANS: Current unit obsoleted by other unit (technology + /// required to build other unit) + add_info_label(QString(_("Obsoleted by %1 (%2).")) .arg(utype_name_translation(obsolete)) .arg(advance_name_translation(tech))); } else { - label->setText( - // TRANS: Current unit obsoleted by other unit + add_info_label( + /// TRANS: Current unit obsoleted by other unit QString(_("Obsoleted by %1.")) .arg(utype_name_translation(obsolete))); } } else { - label->setText(_("Never obsolete.")); + add_info_label(_("Never obsolete.")); } - label->setWordWrap(true); - vbox->addWidget(label); - - vbox->addItem(new QSpacerItem( - 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)); + + info_panel_done(); delete max_utype; } else { Modified: branches/S2_5/client/gui-qt/helpdlg.h URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/client/gui-qt/helpdlg.h?rev=27859&r1=27858&r2=27859&view=diff ============================================================================== --- branches/S2_5/client/gui-qt/helpdlg.h (original) +++ branches/S2_5/client/gui-qt/helpdlg.h Tue Jan 27 16:50:54 2015 @@ -28,9 +28,11 @@ class QFrame; class QLabel; +class QSplitter; class QTextBrowser; class QTreeWidget; class QTreeWidgetItem; +class QVBoxLayout; class help_widget; @@ -54,19 +56,36 @@ class help_widget : public QWidget { Q_OBJECT - QTextBrowser *text_browser; QFrame *box_wdg; QLabel *title_label; - QWidget* main_widget; QList<QLabel *> label_list; + QList<QLabel *> title_list; + + QWidget *main_widget; + QTextBrowser *text_browser; + QWidget *bottom_panel; + QWidget *info_panel; + QSplitter *splitter; + QVBoxLayout *info_layout; + QList<int> splitter_sizes; void setup_ui(); void set_main_widget(QWidget *main_widget); - QWidget *create_progress_widget(const QString& label, - int progress, - int min, int max, - const QString& value = QString() - ); + + void do_layout(); + void undo_layout(); + + void show_info_panel(); + void add_info_canvas(struct canvas *canvas, bool shadow = false); + void add_info_label(const QString &text); + void add_info_progress(const QString& label, int progress, + int min, int max, + const QString& value = QString()); + void add_info_separator(); + void add_info_widget(QWidget *widget); + void info_panel_done(); + + void set_bottom_panel(QWidget *widget); void set_topic_other(const help_item *item, const char *title); @@ -86,6 +105,7 @@ public: help_widget(QWidget *parent = 0); help_widget(const help_item *item, QWidget *parent = 0); + ~help_widget(); void update_fonts(); public slots: _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits