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

Reply via email to