changeset 17937:f87a7e161710

* welcome-wizard.h, welcome-wizard.cc: Rewrite.
author John W. Eaton <jwe@octave.org>
date Fri, 15 Nov 2013 22:57:45 -0500
parents 8c23f844bd30
children cd97a7ef7355
files libgui/src/welcome-wizard.cc libgui/src/welcome-wizard.h
diffstat 2 files changed, 330 insertions(+), 79 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/welcome-wizard.cc	Fri Nov 15 22:21:05 2013 -0500
+++ b/libgui/src/welcome-wizard.cc	Fri Nov 15 22:57:45 2013 -0500
@@ -26,105 +26,342 @@
 #endif
 
 #include <QApplication>
+#include <QCheckBox>
+#include <QLabel>
+#include <QPushButton>
 #include <QHBoxLayout>
 #include <QVBoxLayout>
-#include <QLabel>
-#include <QPushButton>
 
 #include "welcome-wizard.h"
 #include "resource-manager.h"
 
+static QLabel *
+make_octave_logo (QWidget *p = 0, int height = 100)
+{
+  QLabel *logo = new QLabel (p);
+  QPixmap logo_pixmap (":/actions/icons/logo.png");
+  logo->setPixmap (logo_pixmap.scaledToHeight (height));
+  return logo;
+};
+
+class initial_page : public QWidget
+{
+public:
+
+  initial_page (welcome_wizard *wizard)
+    : QWidget (wizard),
+      title (new QLabel (tr ("Welcome to Octave!"), this)),
+      message (new QLabel (this)),
+      logo (make_octave_logo (this)),
+      next (new QPushButton (tr ("Next"), this)),
+      cancel (new QPushButton (tr ("Cancel"), this))
+  {
+    QFont ft;
+    ft.setPointSize (20);
+    title->setFont (ft);
+
+    message->setText
+      (tr ("<html><body>\n"
+           "<p>You seem to be using the Octave graphical interface for the first time on this computer.\n"
+           "Click 'Next' to create a configuration file and launch Octave.</p>\n"
+           "<p>The configuration file is stored in %1.  If that file exists, you will not see this dialog when Octave starts.</p>\n"
+           "</body></html>").
+           arg (resource_manager::get_settings_file ()));
+    message->setWordWrap (true);
+    message->setMinimumWidth (400);
+
+    QVBoxLayout *message_layout = new QVBoxLayout;
+
+    message_layout->addWidget (title);
+    message_layout->addWidget (message);
+
+    QHBoxLayout *message_and_logo = new QHBoxLayout;
+
+    message_and_logo->addLayout (message_layout);
+    message_and_logo->addStretch (10);
+    message_and_logo->addWidget (logo, 0, Qt::AlignTop);
+
+    QHBoxLayout *button_bar = new QHBoxLayout;
+
+    button_bar->addStretch (10);
+    button_bar->addWidget (next);
+    button_bar->addWidget (cancel);
+
+    QVBoxLayout *page_layout = new QVBoxLayout (this);
+    setLayout (page_layout);
+
+    page_layout->addLayout (message_and_logo);
+    page_layout->addStretch (10);
+    page_layout->addLayout (button_bar);
+
+    next->setDefault (true);
+    next->setFocus ();
+
+    connect (next, SIGNAL (clicked ()), wizard, SLOT (next_page ()));
+    connect (cancel, SIGNAL (clicked ()), wizard, SLOT (reject ()));
+  }
+
+  ~initial_page (void) { }
+
+  static QWidget *
+  create (welcome_wizard *wizard) { return new initial_page (wizard); }
+
+private:
+
+  QLabel *title;
+  QLabel *message;
+  QLabel *logo;
+  QPushButton *next;
+  QPushButton *cancel;
+};
+
+class setup_community_news : public QWidget
+{
+public:
+
+  setup_community_news (welcome_wizard *wizard)
+    : QWidget (wizard),
+      title (new QLabel (tr ("Community News"), this)),
+      message (new QLabel (this)),
+      checkbox (new QCheckBox (this)),
+      checkbox_message (new QLabel (this)),
+      logo (make_octave_logo (this)),
+      previous (new QPushButton (tr ("Previous"), this)),
+      next (new QPushButton (tr ("Next"), this)),
+      cancel (new QPushButton (tr ("Cancel"), this))
+  {
+    QFont ft;
+    ft.setPointSize (20);
+    title->setFont (ft);
+
+    message->setText
+      (tr ("<html><body>\n"
+           "<p>When the Octave GUI starts, it will check the Octave web site for current news and information about the Octave community.\n"
+           "The check will happen at most once each day and news will only be displayed if there is something new since the last time you viewed the news.</p>\n"
+           "<p>You may also view the news by selecting the \"Community News\" item in the \"Help\" menu in the GUI, or by visiting\n"
+           "<a href=\"http://octave.org/community-news.html\">http://octave.org/community-news.html</a>.</p>\n"
+           "</body></html>"));
+    message->setWordWrap (true);
+    message->setMinimumWidth (400);
+    message->setOpenExternalLinks (true);
+
+    QVBoxLayout *message_layout = new QVBoxLayout;
+
+    message_layout->addWidget (title);
+    message_layout->addWidget (message);
+
+    QHBoxLayout *message_and_logo = new QHBoxLayout;
+
+    message_and_logo->addLayout (message_layout);
+    message_and_logo->addStretch (10);
+    message_and_logo->addWidget (logo, 0, Qt::AlignTop);
+
+    QHBoxLayout *checkbox_layout = new QHBoxLayout;
+
+    checkbox->setCheckState (Qt::Checked);
+
+    checkbox_message->setText
+      (tr ("<html><head>\n"
+           "<style>\n"
+           "a:link { text-decoration: underline; color: #0000ff; }\n"
+           "</style>\n"
+           "<head/><body>\n"
+           "<p>Allow Octave to connect to the Octave web site when it starts to display current news and information about the Octave community.</p>\n"
+           "</body></html>"));
+    checkbox_message->setWordWrap (true);
+    checkbox_message->setOpenExternalLinks (true);
+    checkbox_message->setMinimumWidth (500);
+
+    checkbox_layout->addWidget (checkbox, 0, Qt::AlignTop);
+    checkbox_layout->addSpacing (20);
+    checkbox_layout->addWidget (checkbox_message, 0, Qt::AlignTop);
+    checkbox_layout->addStretch (10);
+
+    QVBoxLayout *message_logo_and_checkbox = new QVBoxLayout;
+
+    message_logo_and_checkbox->addLayout (message_and_logo);
+    message_logo_and_checkbox->addSpacing (20);
+    message_logo_and_checkbox->addLayout (checkbox_layout);
+
+    QHBoxLayout *button_bar = new QHBoxLayout;
+
+    button_bar->addStretch (10);
+    button_bar->addWidget (previous);
+    button_bar->addWidget (next);
+    button_bar->addWidget (cancel);
+
+    QVBoxLayout *page_layout = new QVBoxLayout (this);
+    setLayout (page_layout);
+
+    page_layout->addLayout (message_logo_and_checkbox);
+    page_layout->addStretch (10);
+    page_layout->addLayout (button_bar);
+
+    next->setDefault (true);
+    next->setFocus ();
+
+    connect (previous, SIGNAL (clicked ()), wizard, SLOT (previous_page ()));
+    connect (next, SIGNAL (clicked ()), wizard, SLOT (next_page ()));
+    connect (cancel, SIGNAL (clicked ()), wizard, SLOT (reject ()));
+  }
+
+  ~setup_community_news (void) { }
+
+  static QWidget *
+  create (welcome_wizard *wizard) { return new setup_community_news (wizard); }
+
+private:
+
+  QLabel *title;
+  QLabel *message;
+  QCheckBox *checkbox;
+  QLabel *checkbox_message;
+  QLabel *logo;
+  QPushButton *previous;
+  QPushButton *next;
+  QPushButton *cancel;
+};
+
+class final_page : public QWidget
+{
+public:
+
+  final_page (welcome_wizard *wizard)
+    : QWidget (wizard),
+      title (new QLabel (tr ("Enjoy!"), this)),
+      message (new QLabel (this)),
+      logo (make_octave_logo (this)),
+      links (new QLabel (this)),
+      previous (new QPushButton (tr ("Previous"), this)),
+      finish (new QPushButton (tr ("Finish"), this)),
+      cancel (new QPushButton (tr ("Cancel"), this))
+  {
+    QFont ft;
+    ft.setPointSize (20);
+    title->setFont (ft);
+
+    message->setText
+      (tr ("<html><body>\n"
+           "<p>We hope you find Octave to be a useful tool.</p>\n"
+           "<p>If you encounter problems, there are a number of ways to get help including commercial support options, a mailing list, a wiki, and other commnity-based support channels.\n"
+           "You can find more information about each of these by visiting <a href=\"http://octave.org/support.html\">http://octave.org/support.html</a> (opens in external browser).</p>\n"
+           "</body></html>"));
+    message->setWordWrap (true);
+    message->setMinimumWidth (400);
+    message->setOpenExternalLinks (true);
+
+    QVBoxLayout *message_layout = new QVBoxLayout;
+
+    message_layout->addWidget (title);
+    message_layout->addWidget (message);
+
+    QHBoxLayout *message_and_logo = new QHBoxLayout;
+
+    message_and_logo->addLayout (message_layout);
+    message_and_logo->addStretch (10);
+    message_and_logo->addWidget (logo, 0, Qt::AlignTop);
+
+    links->setText
+      (tr ("<html><head>\n"
+           "<style>\n"
+           "a:link { text-decoration: underline; color: #0000ff; }\n"
+           "</style>\n"
+           "<head/><body>\n"
+           "<p>For more information about Octave:</p>\n"
+           "<ul>\n"
+           "<li>Visit <a href=\"http://octave.org\">http://octave.org</a> (opens in external browser)</li>\n"
+           "<li>Get the documentation online as <a href=\"http://www.gnu.org/software/octave/doc/interpreter/index.html\">html</a>- or <a href=\"http://www.gnu.org/software/octave/octave.pdf\">pdf</span></a>-document (opens in external browser)</li>\n"
+           "<li>Open the documentation browser of the Octave GUI with the help menu</li>\n"
+           "</ul>\n"
+           "</body></html>"));
+    links->setWordWrap (true);
+    links->setOpenExternalLinks (true);
+
+    QHBoxLayout *button_bar = new QHBoxLayout;
+
+    button_bar->addStretch (10);
+    button_bar->addWidget (previous);
+    button_bar->addWidget (finish);
+    button_bar->addWidget (cancel);
+
+    QVBoxLayout *page_layout = new QVBoxLayout (this);
+    setLayout (page_layout);
+
+    page_layout->addLayout (message_and_logo);
+    page_layout->addSpacing (20);
+    page_layout->addWidget (links);
+    page_layout->addStretch (10);
+    page_layout->addLayout (button_bar);
+
+    finish->setDefault (true);
+    finish->setFocus ();
+
+    connect (previous, SIGNAL (clicked ()), wizard, SLOT (previous_page ()));
+    connect (finish, SIGNAL (clicked ()), wizard, SLOT (accept ()));
+    connect (cancel, SIGNAL (clicked ()), wizard, SLOT (reject ()));
+  }
+
+  ~final_page (void) { }
+
+  static QWidget *
+  create (welcome_wizard *wizard) { return new final_page (wizard); }
+
+private:
+
+  QLabel *title;
+  QLabel *message;
+  QLabel *logo;
+  QLabel *links;
+  QPushButton *previous;
+  QPushButton *finish;
+  QPushButton *cancel;
+};
+
 welcome_wizard::welcome_wizard (QWidget *p)
-  : QDialog (p)
+  : QDialog (p), page_ctor_list (), page_list_iterator (),
+    current_page (initial_page::create (this))
 {
+  page_ctor_list.push_back (initial_page::create);
+  page_ctor_list.push_back (setup_community_news::create);
+  page_ctor_list.push_back (final_page::create);
+
+  page_list_iterator = page_ctor_list.begin ();
+
   setWindowTitle (tr ("Welcome to GNU Octave"));
 
   setEnabled (true);
   resize (600, 480);
   setMinimumSize (QSize (600, 480));
 
-
-  QVBoxLayout *page_layout = new QVBoxLayout (this);
-  setLayout (page_layout);
-
-  QHBoxLayout *message_and_logo = new QHBoxLayout;
-
-  QVBoxLayout *message = new QVBoxLayout;
-
-  QLabel *title = new QLabel (tr ("Welcome to Octave!"));
-  QFont ft;
-  ft.setPointSize (20);
-  title->setFont (ft);
-
-  QLabel *msg_1 = new QLabel (
-    tr ("You seem to be using the Octave graphical interface for the first time on this computer.  Click 'Finish' to write a configuration file and launch Octave."));
-  msg_1->setWordWrap (true);
+  show_page ();
+}
 
-  QString msg_2_text = QString (tr ("The configuration file is stored in %1. "
-                                    "If that file exists, you will not see "
-                                    "this dialog again when Octave starts.").
-                                arg (resource_manager::get_settings_file ()));
-  QLabel *msg_2 = new QLabel (msg_2_text);
-  msg_2->setWordWrap (true);
-
-  message->addWidget (title);
-  message->addWidget (msg_1);
-  message->addWidget (msg_2);
+void
+welcome_wizard::show_page (void)
+{
+  delete current_page;
+  delete layout ();
 
-  QSpacerItem *logo_filler = new QSpacerItem (40, 20, QSizePolicy::Expanding,
-                                              QSizePolicy::Minimum);
+  current_page = (*page_list_iterator) (this);
 
-  QLabel *logo = new QLabel;
-  QPixmap logo_pixmap (":/actions/icons/logo.png");
-  logo->setPixmap (logo_pixmap.scaledToHeight (150));
-
-  message_and_logo->addLayout (message);
-  message_and_logo->addItem (logo_filler);
-  message_and_logo->addWidget (logo);
+  QVBoxLayout *new_layout = new QVBoxLayout ();
+  setLayout (new_layout);
 
-  QLabel *links = new QLabel
-    (tr ("<html><head>\n"
-         "<style>\n"
-         "a:link { text-decoration: underline; color: #0000ff; }\n"
-         "</style>\n"
-         "<head/><body>\n"
-         "<p>For more information about Octave:</p>\n"
-         "<ul>\n"
-         "<li>Visit <a href=\"http://octave.org\">http://octave.org</a></li>\n"
-         "<li>Get the documentation online in <a href=\"http://www.gnu.org/software/octave/doc/interpreter/index.html\">html</a> or <a href=\"http://www.gnu.org/software/octave/octave.pdf\">pdf</span></a> format</li>\n"
-         "<li>Open the documentation browser from the help menu</li>\n"
-         "</ul>\n"
-         "</body></html>"),
-     this);
-  links->setWordWrap (true);
-  links->setOpenExternalLinks (true);
+  new_layout->addWidget (current_page);
+}
 
-  QSpacerItem *hfill = new QSpacerItem (40, 20, QSizePolicy::Expanding,
-                                        QSizePolicy::Minimum);
-
-  QPushButton *finish_button = new QPushButton;
-  finish_button->setText (tr ("Finish"));
+void
+welcome_wizard::previous_page (void)
+{
+  --page_list_iterator;
 
-  QPushButton *cancel_button = new QPushButton;
-  cancel_button->setText (tr ("Cancel"));
-
-  QSpacerItem *vspace = new QSpacerItem (20, 40, QSizePolicy::Minimum);
-
-  QHBoxLayout *button_bar = new QHBoxLayout;
-
-  button_bar->addItem (hfill);
-  button_bar->addWidget (finish_button);
-  button_bar->addWidget (cancel_button);
+  show_page ();
+}
 
-  QSpacerItem *vfill = new QSpacerItem (20, 40, QSizePolicy::Minimum,
-                                        QSizePolicy::Expanding);
+void
+welcome_wizard::next_page (void)
+{
+  ++page_list_iterator;
 
-  page_layout->addLayout (message_and_logo);
-  page_layout->addWidget (links);
-  page_layout->addItem (vspace);
-  page_layout->addLayout (button_bar);
-  page_layout->addItem (vfill);
-
-  connect (finish_button, SIGNAL (clicked ()), this, SLOT (accept ()));
-  connect (cancel_button, SIGNAL (clicked ()), this, SLOT (reject ()));
+  show_page ();
 }
--- a/libgui/src/welcome-wizard.h	Fri Nov 15 22:21:05 2013 -0500
+++ b/libgui/src/welcome-wizard.h	Fri Nov 15 22:57:45 2013 -0500
@@ -32,9 +32,23 @@
 
 public:
 
+  typedef QWidget *(*page_creator_fptr) (welcome_wizard *wizard);
+
   welcome_wizard (QWidget *parent = 0);
 
   ~welcome_wizard (void) { }
+
+private:
+
+  QList<page_creator_fptr> page_ctor_list;
+  QList<page_creator_fptr>::iterator page_list_iterator;
+  QWidget *current_page;                                         
+
+private slots:
+
+  void show_page (void);
+  void previous_page (void);
+  void next_page (void);
 };
 
 #endif // WELCOMEWIZARD_H