Selaa lähdekoodia

Combines ctkWorkflowAbstractWidgetStep and ctkWorkflowWidgetStep classes

Jean-Christophe Fillion-Robin 14 vuotta sitten
vanhempi
commit
88c9e12365

+ 3 - 4
Libs/Widgets/CMakeLists.txt

@@ -9,9 +9,6 @@ SET(KIT_export_directive "CTK_WIDGETS_EXPORT")
 
 # Source files
 SET(KIT_SRCS
-  ctkWorkflowAbstractWidgetStep.cpp
-  ctkWorkflowAbstractWidgetStep.h
-  ctkWorkflowAbstractWidgetStep_p.h
   ctkActionsWidget.cpp
   ctkActionsWidget.h
   ctkAddRemoveComboBox.cpp
@@ -116,6 +113,7 @@ SET(KIT_SRCS
   ctkWorkflowWidget.cpp
   ctkWorkflowWidget.h
   ctkWorkflowWidgetStep.cpp
+  ctkWorkflowWidgetStep_p.h
   ctkWorkflowWidgetStep.h
   ctkDateRangeWidget.cpp
   ctkDateRangeWidget.h
@@ -134,7 +132,7 @@ ENDIF()
 
 # Headers that should run through moc
 SET(KIT_MOC_SRCS
-  ctkWorkflowAbstractWidgetStep_p.h
+  ctkWorkflowAbstractPagedWidget.h
   ctkActionsWidget.h
   ctkAxesWidget.h
   ctkAddRemoveComboBox.h
@@ -187,6 +185,7 @@ SET(KIT_MOC_SRCS
   ctkWorkflowTabWidget.h
   ctkWorkflowWidget.h
   ctkWorkflowWidgetStep.h
+  ctkWorkflowWidgetStep_p.h
   ctkDateRangeWidget.h
   )
 

+ 1 - 1
Libs/Widgets/Testing/Cpp/ctkWorkflowWidgetTest1.cpp

@@ -43,7 +43,7 @@
 #include <iostream>
 
 //-----------------------------------------------------------------------------
-bool buttonClickTest(QApplication& app, int defaultTime, ctkWorkflowAbstractWidgetStep* currentStep, QWidget* shownStepArea, QLineEdit* shownLineEdit, QLabel* shownLabel, QWidget* hiddenStepArea, QLineEdit* hiddenLineEdit, QLabel* hiddenLabel, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, QPushButton* backButton, QPushButton* nextButton, QPushButton* finishButton1=0, QPushButton* finishButton2=0)
+bool buttonClickTest(QApplication& app, int defaultTime, ctkWorkflowWidgetStep* currentStep, QWidget* shownStepArea, QLineEdit* shownLineEdit, QLabel* shownLabel, QWidget* hiddenStepArea, QLineEdit* hiddenLineEdit, QLabel* hiddenLabel, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, QPushButton* backButton, QPushButton* nextButton, QPushButton* finishButton1=0, QPushButton* finishButton2=0)
 {
   QTimer::singleShot(defaultTime, &app, SLOT(quit()));
   app.exec();

+ 1 - 1
Libs/Widgets/Testing/Cpp/ctkWorkflowWidgetTest2.cpp

@@ -43,7 +43,7 @@
 #include <iostream>
 
 //-----------------------------------------------------------------------------
-bool buttonClickTestSignalSlot(QApplication& app, int defaultTime, ctkWorkflowAbstractWidgetStep* currentStep, QWidget* shownStepArea, QLineEdit* shownLineEdit, QLabel* shownLabel, QWidget* hiddenStepArea, QLineEdit* hiddenLineEdit, QLabel* hiddenLabel, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, QPushButton* backButton, QPushButton* nextButton, QPushButton* finishButton1=0, QPushButton* finishButton2=0)
+bool buttonClickTestSignalSlot(QApplication& app, int defaultTime, ctkWorkflowWidgetStep* currentStep, QWidget* shownStepArea, QLineEdit* shownLineEdit, QLabel* shownLabel, QWidget* hiddenStepArea, QLineEdit* hiddenLineEdit, QLabel* hiddenLabel, ctkWorkflow* workflow, ctkWorkflowWidget* workflowWidget, QPushButton* backButton, QPushButton* nextButton, QPushButton* finishButton1=0, QPushButton* finishButton2=0)
 {
   QTimer::singleShot(defaultTime, &app, SLOT(quit()));
   app.exec();

+ 0 - 216
Libs/Widgets/ctkWorkflowAbstractWidgetStep.cpp

@@ -1,216 +0,0 @@
-/*=========================================================================
-
-  Library:   CTK
-
-  Copyright (c) Kitware Inc.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-  http://www.commontk.org/LICENSE
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-
-  =========================================================================*/
-
-// Qt includes
-#include <QObject>
-#include <QWidget>
-#include <QList>
-#include <QDebug>
-#include <QIcon>
-
-// CTK includes
-#include "ctkWorkflowAbstractWidgetStep.h"
-#include "ctkWorkflowAbstractWidgetStep_p.h"
-#include "ctkWorkflowWidget.h"
-#include "ctkWorkflow.h"
-//#include "ctkWorkflowButtonBoxWidget.h"
-#include "ctkLogger.h"
-
-// STD includes
-#include <iostream>
-
-//-----------------------------------------------------------------------------
-static ctkLogger logger("org.commontk.libs.widgets.ctkWorkflowAbstractWidgetStep");
-//-----------------------------------------------------------------------------
-
-//-----------------------------------------------------------------------------
-// ctkWorkflowAbstractWidgetStepPrivate methods
-
-//-----------------------------------------------------------------------------
-ctkWorkflowAbstractWidgetStepPrivate::ctkWorkflowAbstractWidgetStepPrivate(ctkWorkflowAbstractWidgetStep& object)
-  :Superclass(object), q_ptr(&object)
-{
-//  this->buttonBoxWidget = 0;
-//  this->hasButtonBoxWidget = false;
-
-  this->icon = QIcon();
-  this->created = false;
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStepPrivate::invokeShowUserInterfaceCommandInternal()const
-{
-  emit invokeShowUserInterfaceCommand();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStepPrivate::showUserInterfaceCompleteInternal()const
-{
-  emit showUserInterfaceComplete();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStepPrivate::showUserInterface()
-{
-  Q_Q(ctkWorkflowAbstractWidgetStep);
-  q->showUserInterface();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStepPrivate::invokeCreateUserInterfaceCommandInternal()const
-{
-  emit invokeCreateUserInterfaceCommand();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStepPrivate::createUserInterfaceCompleteInternal()const
-{
-  emit createUserInterfaceComplete();
-}
-
-//-----------------------------------------------------------------------------
-// ctkWorkflowAbstractWidgetStep methods
-
-//-----------------------------------------------------------------------------
-ctkWorkflowAbstractWidgetStep::ctkWorkflowAbstractWidgetStep(ctkWorkflow* newWorkflow, const QString& newId) :
-  Superclass(new ctkWorkflowAbstractWidgetStepPrivate(*this), newWorkflow, newId)
-{
-  Q_D(ctkWorkflowAbstractWidgetStep);
-  d->hasShowUserInterfaceCommand = false;
-  d->hasCreateUserInterfaceCommand = false;
-  d->ButtonBoxHints = ctkWorkflowAbstractWidgetStep::NoHints;
-}
-
-//-----------------------------------------------------------------------------
-ctkWorkflowAbstractWidgetStep::~ctkWorkflowAbstractWidgetStep()
-{
-}
-
-//-----------------------------------------------------------------------------
-CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, bool, hasShowUserInterfaceCommand, hasShowUserInterfaceCommand);
-CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, bool, setHasShowUserInterfaceCommand, hasShowUserInterfaceCommand);
-CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, bool, hasCreateUserInterfaceCommand, hasCreateUserInterfaceCommand);
-CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, bool, setHasCreateUserInterfaceCommand, hasCreateUserInterfaceCommand);
-CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, QString, backButtonText, backButtonText);
-CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, const QString&, setBackButtonText, backButtonText);
-CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, QString, nextButtonText, nextButtonText);
-CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, const QString&, setNextButtonText, nextButtonText);
-// CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, QList<QString>, finishButtonTexts, finishButtonTexts);
-// CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, QList<QString>, setFinishButtonTexts, finishButtonTexts);
-//CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, bool, hasButtonBoxWidget, hasButtonBoxWidget);
-//CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, bool, setHasButtonBoxWidget, hasButtonBoxWidget);
-CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, QIcon, icon, icon);
-CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, const QIcon&, setIcon, icon);
-
-//-----------------------------------------------------------------------------
-CTK_GET_CPP(ctkWorkflowAbstractWidgetStep, ctkWorkflowAbstractWidgetStep::ButtonBoxHints,
-            buttonBoxHints, ButtonBoxHints);
-CTK_SET_CPP(ctkWorkflowAbstractWidgetStep, ctkWorkflowAbstractWidgetStep::ButtonBoxHints,
-            setButtonBoxHints, ButtonBoxHints);
-
-//-----------------------------------------------------------------------------
-// void ctkWorkflowAbstractWidgetStep::setFinishButtonText(const QString& name)
-// {
-//   QList<QString> names;
-//   names << name;
-//   this->setFinishButtonTexts(names);
-// }
-
-// //-----------------------------------------------------------------------------
-// ctkWorkflowButtonBoxWidget* ctkWorkflowAbstractWidgetStep::buttonBoxWidget()
-// {
-//   Q_D(ctkWorkflowAbstractWidgetStep);
-
-//   if (!d->hasButtonBoxWidget)
-//     {
-//     return 0;
-//     }
-
-//   if (!d->buttonBoxWidget)
-//     {
-//     if (!this->workflow())
-//       {
-//       logger.error("buttonBoxWidget - Cannot create buttonBoxWidget without a workflow");
-//       return 0;
-//       }
-//     d->buttonBoxWidget = new ctkWorkflowButtonBoxWidget(this->workflow());
-//     }
-//   return d->buttonBoxWidget;
-// }
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStep::showUserInterface()
-{
-  Q_D(ctkWorkflowAbstractWidgetStep);
-
-  // use the user's showUserInterfaceCommand if given
-  if (d->hasShowUserInterfaceCommand)
-    {
-    this->invokeShowUserInterfaceCommand();
-    return;
-    }
-
-  // otherwise we provide an implementation here
-  logger.debug(QString("showUserInterface - showing %1").arg(this->name()));
-
-  // create the user interface if this is the first time we're showing this step
-  if (!d->created)
-    {
-    if (d->hasCreateUserInterfaceCommand)
-      {
-      this->invokeCreateUserInterfaceCommand();
-      }
-    else
-      {
-      this->createUserInterface();
-      }
-    d->created = true;
-    }
-
-  emit showUserInterfaceComplete();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStep::invokeShowUserInterfaceCommand()const
-{
-  Q_D(const ctkWorkflowAbstractWidgetStep);
-  d->invokeShowUserInterfaceCommandInternal();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStep::showUserInterfaceComplete()const
-{
-  Q_D(const ctkWorkflowAbstractWidgetStep);
-  d->showUserInterfaceCompleteInternal();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStep::invokeCreateUserInterfaceCommand()const
-{
-  Q_D(const ctkWorkflowAbstractWidgetStep);
-  d->invokeCreateUserInterfaceCommandInternal();
-}
-
-//-----------------------------------------------------------------------------
-void ctkWorkflowAbstractWidgetStep::createUserInterfaceComplete()const
-{
-  Q_D(const ctkWorkflowAbstractWidgetStep);
-  d->createUserInterfaceCompleteInternal();
-}

+ 0 - 149
Libs/Widgets/ctkWorkflowAbstractWidgetStep.h

@@ -1,149 +0,0 @@
-/*=========================================================================
-
-  Library:   CTK
-
-  Copyright (c) Kitware Inc.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.commontk.org/LICENSE
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-
-=========================================================================*/
-
-#ifndef __ctkWorkflowAbstractWidgetStep_h
-#define __ctkWorkflowAbstractWidgetStep_h 
-
-// QT includes
-class QObject;
-class QWidget;
-class QIcon;
-#include <QBoxLayout>
-#include <QFlags>
-
-// CTK includes
-#include "ctkPimpl.h"
-#include "ctkWidgetsExport.h"
-#include "ctkWorkflowStep.h"
-#include "ctkWorkflowTransitions.h"
-
-class ctkWorkflowGroupBox;
-
-class ctkWorkflowAbstractWidgetStepPrivate;
-
-///
-/// \brief ctkWorkflowAbstractWidgetStep is a convienience class to quickly
-/// construct a ctkWorkflowStep with a user interface.
-///
-/// It embeds a QWidget* stepArea, onto which step-specific widgets can be placed.
-/// The showUserInterface() and hideUserInterface() commands of ctkWorkflowStep are
-/// written for you, and, if you desire, the step's "Next" and/or "Back" buttons are
-/// added with the appropriate signals and slots.
-/// To create a custom step, you can derive from this class and
-/// implement only two functions:
-/// 1) ctkWorkflowAbstractWidgetStep::populateStepWidgetsList(), to define the
-/// step-specific widgets;
-/// 2) ctkWorkflowAbstractWidgetStep::validate(const QString&), to validate the processing
-/// state associated with this step.
-/// For additional customization, you can reimplement
-/// showUserInterface() and hideUserInterface() in derived classes.
-/// \sa showUserInterface() hideUserInterface()
-
-class CTK_WIDGETS_EXPORT ctkWorkflowAbstractWidgetStep : public ctkWorkflowStep
-{
-public:
-
-  enum ButtonBoxHint {
-    NoHints = 0x0,
-    BackButtonHidden = 0x1,
-    BackButtonDisabled = 0x2,
-    NextButtonHidden = 0x4,
-    NextButtonDisabled = 0x8,
-    ButtonBoxHidden = 0x10
-  };
-  Q_DECLARE_FLAGS(ButtonBoxHints, ButtonBoxHint)
-
-  typedef ctkWorkflowStep Superclass;
-  explicit ctkWorkflowAbstractWidgetStep(ctkWorkflow* newWorkflow, const QString& newId);
-  virtual ~ctkWorkflowAbstractWidgetStep();
-
-  /// \brief Override the back button text of any ctkWorkflowButtonBox when this step
-  /// is the current step
-  virtual QString backButtonText()const;
-  virtual void setBackButtonText(const QString& name);
-
-  /// \brief Override the next button text of any ctkWorkflowButtonBox when this step
-  /// is the current step
-  virtual QString nextButtonText()const;
-  virtual void setNextButtonText(const QString& name);
-
-  /// \brief Override the button visibility of any ctkWorkflowButtonBox when this step is the
-  /// current step
-  void setButtonBoxHints(ButtonBoxHints buttonBoxHints);
-  ButtonBoxHints buttonBoxHints()const;
-
-  /// \brief Associate an icon with this step (ex. used by ctkWorkflowButtonBox to display an icon
-  /// on 'goTo' buttons).
-  QIcon icon()const;
-  void setIcon(const QIcon& newIcon);
-
-  /// Returns the QWidget onto which this step's user interface elements are placed.
-  virtual QWidget* stepArea() = 0;
-
-  /// Set/get whether a showUserInterfaceCommand has been provided in
-  /// a separate QObject (see method 2 described for
-  /// showUserInterface())
-  virtual bool hasShowUserInterfaceCommand()const;
-  virtual void setHasShowUserInterfaceCommand(bool flag);
-
-  /// Set/get whether a createUserInterfaceCommand has been provided in
-  /// a separate QObject (see method 2 described for
-  /// createUserInterface())
-  virtual bool hasCreateUserInterfaceCommand()const;
-  virtual void setHasCreateUserInterfaceCommand(bool flag);
-
-protected:
-
-  /// Creates the user interface associated with this step.
-  virtual void createUserInterface() = 0;
-
-  /// Prepares the step to be shown.
-  virtual void showUserInterface();
-
-  /// \brief Signal (emitted by the private implementation) indicating that the step's
-  /// createUserInterface() method should be called.
-  /// \sa createUserInterface()
-  void invokeCreateUserInterfaceCommand()const;
-
-  /// \brief Signal (emitted by the private implementation) indicating that the step's
-  /// createUserInterface() method has completed.
-  /// \sa createUserInterface()
-  void createUserInterfaceComplete()const;
-
-  /// \brief Signal (emitted by the private implementation) indicating that the step's
-  /// 'showUserInterface() method should be called.
-  /// \sa showUserInterface()
-  void invokeShowUserInterfaceCommand()const;
-
-  /// \brief Signal (emitted by the private implementation) indicating that the step's
-  /// showUserInterface() method has completed.
-  /// \sa showUserInterface()
-  void showUserInterfaceComplete()const;
-
-private:
-  Q_DECLARE_PRIVATE(ctkWorkflowAbstractWidgetStep);
-  Q_DISABLE_COPY(ctkWorkflowAbstractWidgetStep);
-  friend class ctkWorkflowGroupBox; // For access to showUserInterface()
-};
-
- Q_DECLARE_OPERATORS_FOR_FLAGS(ctkWorkflowAbstractWidgetStep::ButtonBoxHints)
-
-#endif
-

+ 10 - 10
Libs/Widgets/ctkWorkflowButtonBoxWidget.cpp

@@ -30,7 +30,7 @@
 // CTK includes
 #include "ctkWorkflowButtonBoxWidget.h"
 #include "ctkWorkflowStep.h"
-#include "ctkWorkflowAbstractWidgetStep.h"
+#include "ctkWorkflowWidgetStep.h"
 #include "ctkWorkflow.h"
 
 // STD includes
@@ -118,7 +118,7 @@ void ctkWorkflowButtonBoxWidgetPrivate::updateBackButton(ctkWorkflowStep* curren
   Q_ASSERT(q->layout());
 #endif
 
-  ctkWorkflowAbstractWidgetStep* step = dynamic_cast<ctkWorkflowAbstractWidgetStep*>(currentStep);
+  ctkWorkflowWidgetStep* step = dynamic_cast<ctkWorkflowWidgetStep*>(currentStep);
 
   // Set the back button text
   QString backButtonText = this->BackButtonDefaultText;
@@ -138,9 +138,9 @@ void ctkWorkflowButtonBoxWidgetPrivate::updateBackButton(ctkWorkflowStep* curren
     if (step)
       {
       this->BackButton->setDisabled(
-          step->buttonBoxHints() & ctkWorkflowAbstractWidgetStep::BackButtonDisabled);
+          step->buttonBoxHints() & ctkWorkflowWidgetStep::BackButtonDisabled);
       this->BackButton->setHidden(
-          step->buttonBoxHints() & ctkWorkflowAbstractWidgetStep::BackButtonHidden);
+          step->buttonBoxHints() & ctkWorkflowWidgetStep::BackButtonHidden);
       }
     }
   // Disable the back button if we can't go backward, and optionally hide it
@@ -162,7 +162,7 @@ void ctkWorkflowButtonBoxWidgetPrivate::updateNextButton(ctkWorkflowStep* curren
   Q_ASSERT(q->layout());
 #endif
 
-  ctkWorkflowAbstractWidgetStep* step = dynamic_cast<ctkWorkflowAbstractWidgetStep*>(currentStep);
+  ctkWorkflowWidgetStep* step = dynamic_cast<ctkWorkflowWidgetStep*>(currentStep);
 
   // Set the next button text
   QString nextButtonText = this->NextButtonDefaultText;
@@ -182,9 +182,9 @@ void ctkWorkflowButtonBoxWidgetPrivate::updateNextButton(ctkWorkflowStep* curren
     if (step)
       {
       this->NextButton->setDisabled(
-          step->buttonBoxHints() & ctkWorkflowAbstractWidgetStep::NextButtonDisabled);
+          step->buttonBoxHints() & ctkWorkflowWidgetStep::NextButtonDisabled);
       this->NextButton->setHidden(
-          step->buttonBoxHints() & ctkWorkflowAbstractWidgetStep::NextButtonHidden);
+          step->buttonBoxHints() & ctkWorkflowWidgetStep::NextButtonHidden);
       }
     }
   // Disable the next button if we can't go forward, and optionally hide it
@@ -230,7 +230,7 @@ void ctkWorkflowButtonBoxWidgetPrivate::updateGoToButtons(ctkWorkflowStep* curre
       QObject::connect(goToButton, SIGNAL(clicked()), q, SLOT(prepareGoToStep()));
       this->GoToButtonToStepMap[goToButton] = step;
       // if the goTo step has an icon associated with it, then add it to the button
-      if (ctkWorkflowAbstractWidgetStep* wwStep = dynamic_cast<ctkWorkflowAbstractWidgetStep*>(step))
+      if (ctkWorkflowWidgetStep* wwStep = dynamic_cast<ctkWorkflowWidgetStep*>(step))
         {
         goToButton->setIcon(wwStep->icon());
         }
@@ -393,9 +393,9 @@ void ctkWorkflowButtonBoxWidget::updateButtons(ctkWorkflowStep* currentStep)
   Q_D(ctkWorkflowButtonBoxWidget);
 
   // hide aspects of the button bar if specified by the current step
-  if(ctkWorkflowAbstractWidgetStep* currentWidgetStep = dynamic_cast<ctkWorkflowAbstractWidgetStep*>(currentStep))
+  if(ctkWorkflowWidgetStep* currentWidgetStep = dynamic_cast<ctkWorkflowWidgetStep*>(currentStep))
     {
-    bool hideButtonBar = currentWidgetStep->buttonBoxHints() & ctkWorkflowAbstractWidgetStep::ButtonBoxHidden;
+    bool hideButtonBar = currentWidgetStep->buttonBoxHints() & ctkWorkflowWidgetStep::ButtonBoxHidden;
     this->setHidden(hideButtonBar);
     }
 

+ 3 - 3
Libs/Widgets/ctkWorkflowGroupBox.cpp

@@ -26,7 +26,7 @@
 
 // CTK includes
 #include "ctkWorkflowGroupBox.h"
-#include "ctkWorkflowAbstractWidgetStep.h"
+#include "ctkWorkflowWidgetStep.h"
 #include "ctkFittedTextBrowser.h"
 #include "ui_ctkWorkflowGroupBox.h"
 #include "ctkLogger.h"
@@ -117,7 +117,7 @@ void ctkWorkflowGroupBox::updateGroupBox(ctkWorkflowStep* currentStep)
     }
 
   // disable/hide the previously shown step
-  if (ctkWorkflowAbstractWidgetStep* prevStep = dynamic_cast<ctkWorkflowAbstractWidgetStep*>(d->StepShownPreviously))
+  if (ctkWorkflowWidgetStep* prevStep = dynamic_cast<ctkWorkflowWidgetStep*>(d->StepShownPreviously))
     {
     logger.debug(QString("updateClientArea - hiding %1").arg(prevStep->name()));
     if (QWidget* stepArea = prevStep->stepArea())
@@ -130,7 +130,7 @@ void ctkWorkflowGroupBox::updateGroupBox(ctkWorkflowStep* currentStep)
       }
     }
   
-  ctkWorkflowAbstractWidgetStep* currentWidgetStep = dynamic_cast<ctkWorkflowAbstractWidgetStep*>(currentStep);
+  ctkWorkflowWidgetStep* currentWidgetStep = dynamic_cast<ctkWorkflowWidgetStep*>(currentStep);
   // show/enable the current step
   if (currentWidgetStep)
     {

+ 155 - 24
Libs/Widgets/ctkWorkflowWidgetStep.cpp

@@ -19,17 +19,14 @@
   =========================================================================*/
 
 // Qt includes
-#include <QObject>
-#include <QWidget>
 #include <QList>
 #include <QDebug>
-#include <QIcon>
 
 // CTK includes
 #include "ctkWorkflowWidgetStep.h"
+#include "ctkWorkflowWidgetStep_p.h"
 #include "ctkWorkflowWidget.h"
 #include "ctkWorkflow.h"
-#include "ctkWorkflowButtonBoxWidget.h"
 #include "ctkLogger.h"
 
 // STD includes
@@ -40,40 +37,75 @@ static ctkLogger logger("org.commontk.libs.widgets.ctkWorkflowWidgetStep");
 //-----------------------------------------------------------------------------
 
 //-----------------------------------------------------------------------------
-class ctkWorkflowWidgetStepPrivate
+// ctkWorkflowWidgetStepPrivate methods
+
+//-----------------------------------------------------------------------------
+ctkWorkflowWidgetStepPrivate::ctkWorkflowWidgetStepPrivate(ctkWorkflowWidgetStep& object)
+  :Superclass(object), q_ptr(&object)
+{
+//  this->buttonBoxWidget = 0;
+//  this->hasButtonBoxWidget = false;
+
+  this->icon = QIcon();
+  this->created = false;
+}
+
+//-----------------------------------------------------------------------------
+void ctkWorkflowWidgetStepPrivate::invokeShowUserInterfaceCommandInternal()const
 {
-public:
-  ctkWorkflowWidgetStepPrivate();
-  ~ctkWorkflowWidgetStepPrivate(){};
-  ctkWorkflowWidgetStep::ButtonBoxHintForPlugin ButtonBoxHintsForPlugin;
-};
+  emit invokeShowUserInterfaceCommand();
+}
 
 //-----------------------------------------------------------------------------
-// ctkWorkflowWidgetStepPrivate methods
+void ctkWorkflowWidgetStepPrivate::showUserInterfaceCompleteInternal()const
+{
+  emit showUserInterfaceComplete();
+}
+
+//-----------------------------------------------------------------------------
+void ctkWorkflowWidgetStepPrivate::showUserInterface()
+{
+  Q_Q(ctkWorkflowWidgetStep);
+  q->showUserInterface();
+}
+
+//-----------------------------------------------------------------------------
+void ctkWorkflowWidgetStepPrivate::invokeCreateUserInterfaceCommandInternal()const
+{
+  emit invokeCreateUserInterfaceCommand();
+}
 
 //-----------------------------------------------------------------------------
-ctkWorkflowWidgetStepPrivate::ctkWorkflowWidgetStepPrivate()
+void ctkWorkflowWidgetStepPrivate::createUserInterfaceCompleteInternal()const
 {
+  emit createUserInterfaceComplete();
 }
 
 //-----------------------------------------------------------------------------
 // ctkWorkflowWidgetStep methods
 
 //-----------------------------------------------------------------------------
-ctkWorkflowWidgetStep::ctkWorkflowWidgetStep(ctkWorkflow* newWorkflow, 
-  const QString& newId, QWidget* newParent) : QWidget(newParent), ctkWorkflowAbstractWidgetStep(newWorkflow, newId)
-  , d_ptr(new ctkWorkflowWidgetStepPrivate)
+ctkWorkflowWidgetStep::ctkWorkflowWidgetStep(QWidget* newParent) :
+  QWidget(newParent),
+  ctkWorkflowStep(new ctkWorkflowWidgetStepPrivate(*this), 0, QString())
 {
   Q_D(ctkWorkflowWidgetStep);
-  d->ButtonBoxHintsForPlugin = ctkWorkflowWidgetStep::qNoHints;
+  d->hasShowUserInterfaceCommand = false;
+  d->hasCreateUserInterfaceCommand = false;
+  d->ButtonBoxHints = ctkWorkflowWidgetStep::NoHints;
 }
 
 //-----------------------------------------------------------------------------
-ctkWorkflowWidgetStep::ctkWorkflowWidgetStep(QWidget* newParent) : QWidget(newParent), ctkWorkflowAbstractWidgetStep(0, QString())
-  , d_ptr(new ctkWorkflowWidgetStepPrivate)
+ctkWorkflowWidgetStep::ctkWorkflowWidgetStep(ctkWorkflow* newWorkflow,
+                                                             const QString& newId,
+                                                             QWidget* newParent) :
+  QWidget(newParent),
+  ctkWorkflowStep(new ctkWorkflowWidgetStepPrivate(*this), newWorkflow, newId)
 {
   Q_D(ctkWorkflowWidgetStep);
-  d->ButtonBoxHintsForPlugin = ctkWorkflowWidgetStep::qNoHints;
+  d->hasShowUserInterfaceCommand = false;
+  d->hasCreateUserInterfaceCommand = false;
+  d->ButtonBoxHints = ctkWorkflowWidgetStep::NoHints;
 }
 
 //-----------------------------------------------------------------------------
@@ -82,20 +114,119 @@ ctkWorkflowWidgetStep::~ctkWorkflowWidgetStep()
 }
 
 //-----------------------------------------------------------------------------
+CTK_GET_CPP(ctkWorkflowWidgetStep, bool, hasShowUserInterfaceCommand, hasShowUserInterfaceCommand);
+CTK_SET_CPP(ctkWorkflowWidgetStep, bool, setHasShowUserInterfaceCommand, hasShowUserInterfaceCommand);
+CTK_GET_CPP(ctkWorkflowWidgetStep, bool, hasCreateUserInterfaceCommand, hasCreateUserInterfaceCommand);
+CTK_SET_CPP(ctkWorkflowWidgetStep, bool, setHasCreateUserInterfaceCommand, hasCreateUserInterfaceCommand);
+CTK_GET_CPP(ctkWorkflowWidgetStep, QString, backButtonText, backButtonText);
+CTK_SET_CPP(ctkWorkflowWidgetStep, const QString&, setBackButtonText, backButtonText);
+CTK_GET_CPP(ctkWorkflowWidgetStep, QString, nextButtonText, nextButtonText);
+CTK_SET_CPP(ctkWorkflowWidgetStep, const QString&, setNextButtonText, nextButtonText);
+// CTK_GET_CPP(ctkWorkflowWidgetStep, QList<QString>, finishButtonTexts, finishButtonTexts);
+// CTK_SET_CPP(ctkWorkflowWidgetStep, QList<QString>, setFinishButtonTexts, finishButtonTexts);
+//CTK_GET_CPP(ctkWorkflowWidgetStep, bool, hasButtonBoxWidget, hasButtonBoxWidget);
+//CTK_SET_CPP(ctkWorkflowWidgetStep, bool, setHasButtonBoxWidget, hasButtonBoxWidget);
+CTK_GET_CPP(ctkWorkflowWidgetStep, QIcon, icon, icon);
+CTK_SET_CPP(ctkWorkflowWidgetStep, const QIcon&, setIcon, icon);
+
+//-----------------------------------------------------------------------------
 QWidget* ctkWorkflowWidgetStep::stepArea()
 {
   return this;
 }
 
 //-----------------------------------------------------------------------------
-ctkWorkflowWidgetStep::ButtonBoxHintsForPlugin ctkWorkflowWidgetStep::buttonBoxHintsForPlugin() const
+CTK_GET_CPP(ctkWorkflowWidgetStep, ctkWorkflowWidgetStep::ButtonBoxHints,
+            buttonBoxHints, ButtonBoxHints);
+CTK_SET_CPP(ctkWorkflowWidgetStep, ctkWorkflowWidgetStep::ButtonBoxHints,
+            setButtonBoxHints, ButtonBoxHints);
+
+//-----------------------------------------------------------------------------
+// void ctkWorkflowWidgetStep::setFinishButtonText(const QString& name)
+// {
+//   QList<QString> names;
+//   names << name;
+//   this->setFinishButtonTexts(names);
+// }
+
+// //-----------------------------------------------------------------------------
+// ctkWorkflowButtonBoxWidget* ctkWorkflowWidgetStep::buttonBoxWidget()
+// {
+//   Q_D(ctkWorkflowWidgetStep);
+
+//   if (!d->hasButtonBoxWidget)
+//     {
+//     return 0;
+//     }
+
+//   if (!d->buttonBoxWidget)
+//     {
+//     if (!this->workflow())
+//       {
+//       logger.error("buttonBoxWidget - Cannot create buttonBoxWidget without a workflow");
+//       return 0;
+//       }
+//     d->buttonBoxWidget = new ctkWorkflowButtonBoxWidget(this->workflow());
+//     }
+//   return d->buttonBoxWidget;
+// }
+
+//-----------------------------------------------------------------------------
+void ctkWorkflowWidgetStep::showUserInterface()
+{
+  Q_D(ctkWorkflowWidgetStep);
+
+  // use the user's showUserInterfaceCommand if given
+  if (d->hasShowUserInterfaceCommand)
+    {
+    this->invokeShowUserInterfaceCommand();
+    return;
+    }
+
+  // otherwise we provide an implementation here
+  logger.debug(QString("showUserInterface - showing %1").arg(this->name()));
+
+  // create the user interface if this is the first time we're showing this step
+  if (!d->created)
+    {
+    if (d->hasCreateUserInterfaceCommand)
+      {
+      this->invokeCreateUserInterfaceCommand();
+      }
+    else
+      {
+      this->createUserInterface();
+      }
+    d->created = true;
+    }
+
+  emit showUserInterfaceComplete();
+}
+
+//-----------------------------------------------------------------------------
+void ctkWorkflowWidgetStep::invokeShowUserInterfaceCommand()const
+{
+  Q_D(const ctkWorkflowWidgetStep);
+  d->invokeShowUserInterfaceCommandInternal();
+}
+
+//-----------------------------------------------------------------------------
+void ctkWorkflowWidgetStep::showUserInterfaceComplete()const
+{
+  Q_D(const ctkWorkflowWidgetStep);
+  d->showUserInterfaceCompleteInternal();
+}
+
+//-----------------------------------------------------------------------------
+void ctkWorkflowWidgetStep::invokeCreateUserInterfaceCommand()const
 {
-  return ctkWorkflowWidgetStep::ButtonBoxHintsForPlugin(QFlag(this->Superclass::buttonBoxHints()));
+  Q_D(const ctkWorkflowWidgetStep);
+  d->invokeCreateUserInterfaceCommandInternal();
 }
 
 //-----------------------------------------------------------------------------
-void ctkWorkflowWidgetStep::setButtonBoxHintsForPlugin(
-  ctkWorkflowWidgetStep::ButtonBoxHintsForPlugin newButtonBoxHints)
+void ctkWorkflowWidgetStep::createUserInterfaceComplete()const
 {
-  this->Superclass::setButtonBoxHints(QFlag(newButtonBoxHints));
+  Q_D(const ctkWorkflowWidgetStep);
+  d->createUserInterfaceCompleteInternal();
 }

+ 103 - 44
Libs/Widgets/ctkWorkflowWidgetStep.h

@@ -19,85 +19,144 @@
 =========================================================================*/
 
 #ifndef __ctkWorkflowWidgetStep_h
-#define __ctkWorkflowWidgetStep_h 
+#define __ctkWorkflowWidgetStep_h
 
-// QT includes
+// Qt includes
 #include <QWidget>
-#include <QIcon>
 #include <QBoxLayout>
 #include <QFlags>
+#include <QIcon>
 
 // CTK includes
 #include "ctkPimpl.h"
+#include "ctkWidgetsExport.h"
 #include "ctkWorkflowStep.h"
 #include "ctkWorkflowTransitions.h"
-#include "ctkWorkflowAbstractWidgetStep.h"
-#include "ctkWidgetsExport.h"
 
-class ctkWorkflowWidgetStepPrivate;
-class ctkWorkflowButtonBoxWidget;
 class ctkWorkflowGroupBox;
-class ctkWorkflow;
-
-///
-/// \brief A concrete implementation of ctkWorkflowAbstractWidgetStep that derives from QWidget.
 
-class ctkWorkflowWidgetStepPlugin;
+class ctkWorkflowWidgetStepPrivate;
 
-class CTK_WIDGETS_EXPORT ctkWorkflowWidgetStep : public QWidget,
-                                                 public ctkWorkflowAbstractWidgetStep
-{ 
+///
+/// \brief ctkWorkflowWidgetStep is a convienience class to quickly
+/// construct a ctkWorkflowStep with a user interface.
+///
+/// It embeds a QWidget* stepArea, onto which step-specific widgets can be placed.
+/// The showUserInterface() and hideUserInterface() commands of ctkWorkflowStep are
+/// written for you, and, if you desire, the step's "Next" and/or "Back" buttons are
+/// added with the appropriate signals and slots.
+/// To create a custom step, you can derive from this class and
+/// implement only two functions:
+/// 1) ctkWorkflowWidgetStep::populateStepWidgetsList(), to define the
+/// step-specific widgets;
+/// 2) ctkWorkflowWidgetStep::validate(const QString&), to validate the processing
+/// state associated with this step.
+/// For additional customization, you can reimplement
+/// showUserInterface() and hideUserInterface() in derived classes.
+/// \sa showUserInterface() hideUserInterface()
+
+class CTK_WIDGETS_EXPORT ctkWorkflowWidgetStep : public QWidget, public ctkWorkflowStep
+{
   Q_OBJECT
   Q_PROPERTY(QString stepid READ id WRITE setId)
   Q_PROPERTY(QIcon icon READ icon WRITE setIcon)
   Q_PROPERTY(QString backButtonText READ backButtonText WRITE setBackButtonText)
   Q_PROPERTY(QString nextButtonText READ nextButtonText WRITE setNextButtonText)
-  Q_FLAGS(ButtonBoxHintForPlugin)
-  Q_PROPERTY(ButtonBoxHintForPlugin buttonBoxHints READ buttonBoxHintsForPlugin WRITE setButtonBoxHintsForPlugin)
-
+  Q_ENUMS(ButtonBoxHint)
 public:
 
-  typedef ctkWorkflowAbstractWidgetStep Superclass;
-  explicit ctkWorkflowWidgetStep(ctkWorkflow* newWorkflow, const QString& newId, QWidget* newParent = 0);
+  enum ButtonBoxHint {
+    NoHints = 0x0,
+    BackButtonHidden = 0x1,
+    BackButtonDisabled = 0x2,
+    NextButtonHidden = 0x4,
+    NextButtonDisabled = 0x8,
+    ButtonBoxHidden = 0x10
+  };
+  Q_DECLARE_FLAGS(ButtonBoxHints, ButtonBoxHint)
+
   explicit ctkWorkflowWidgetStep(QWidget* newParent = 0);
+  explicit ctkWorkflowWidgetStep(ctkWorkflow* newWorkflow, const QString& newId,
+                                 QWidget* newParent = 0);
   virtual ~ctkWorkflowWidgetStep();
 
+  /// \brief Override the back button text of any ctkWorkflowButtonBox when this step
+  /// is the current step
+  virtual QString backButtonText()const;
+  virtual void setBackButtonText(const QString& name);
+
+  /// \brief Override the next button text of any ctkWorkflowButtonBox when this step
+  /// is the current step
+  virtual QString nextButtonText()const;
+  virtual void setNextButtonText(const QString& name);
+
+  /// \brief Override the button visibility of any ctkWorkflowButtonBox when this step is the
+  /// current step
+  void setButtonBoxHints(ButtonBoxHints buttonBoxHints);
+  ButtonBoxHints buttonBoxHints()const;
+
+  /// \brief Associate an icon with this step (ex. used by ctkWorkflowButtonBox to display an icon
+  /// on 'goTo' buttons).
+  QIcon icon()const;
+  void setIcon(const QIcon& newIcon);
+
+  /// Returns the QWidget onto which this step's user interface elements are placed.
   virtual QWidget* stepArea();
 
-  //-----------------------------------------------------------------------------
-  // To have ButtonBoxHints displayed as a propery in QtDesigner ... 
-  // Since ctkWorkflowAbstractWidgetStep is not a QObject, there is no way to 
-  // add ctkWorkflowAbstractWidgetStep::ButtonBoxHints to the meta object system using 
-  // the QFLAGS(ctkWorkflowAbstractWidgetStep::ButtonBoxHints)
-  // The following enums, setter and getter serve as proxy for qtdesigner plugin
-  // TODO Ideally, the following code should be private ..
-  enum ButtonBoxHintForPlugin {
-    qNoHints = 0x0,
-    qBackButtonHidden = 0x1,
-    qBackButtonDisabled = 0x2,
-    qNextButtonHidden = 0x4,
-    qNextButtonDisabled = 0x8,
-    qButtonBoxHidden = 0x10
-  };
-  Q_DECLARE_FLAGS(ButtonBoxHintsForPlugin, ButtonBoxHintForPlugin)
-  void setButtonBoxHintsForPlugin(ButtonBoxHintsForPlugin buttonBoxHints);
-  ButtonBoxHintsForPlugin buttonBoxHintsForPlugin()const;
-  //-----------------------------------------------------------------------------
+  /// Set/get whether a showUserInterfaceCommand has been provided in
+  /// a separate QObject (see method 2 described for
+  /// showUserInterface())
+  virtual bool hasShowUserInterfaceCommand()const;
+  virtual void setHasShowUserInterfaceCommand(bool flag);
+
+  /// Set/get whether a createUserInterfaceCommand has been provided in
+  /// a separate QObject (see method 2 described for
+  /// createUserInterface())
+  virtual bool hasCreateUserInterfaceCommand()const;
+  virtual void setHasCreateUserInterfaceCommand(bool flag);
 
 protected:
 
+  /// Creates the user interface associated with this step.
   virtual void createUserInterface(){}
 
-protected:
-  QScopedPointer<ctkWorkflowWidgetStepPrivate> d_ptr;
+  /// Prepares the step to be shown.
+  virtual void showUserInterface();
+
+  /// \brief Signal (emitted by the private implementation) indicating that the step's
+  /// createUserInterface() method should be called.
+  /// \sa createUserInterface()
+  void invokeCreateUserInterfaceCommand()const;
+
+  /// \brief Signal (emitted by the private implementation) indicating that the step's
+  /// createUserInterface() method has completed.
+  /// \sa createUserInterface()
+  void createUserInterfaceComplete()const;
+
+  /// \brief Signal (emitted by the private implementation) indicating that the step's
+  /// 'showUserInterface() method should be called.
+  /// \sa showUserInterface()
+  void invokeShowUserInterfaceCommand()const;
+
+  /// \brief Signal (emitted by the private implementation) indicating that the step's
+  /// showUserInterface() method has completed.
+  /// \sa showUserInterface()
+  void showUserInterfaceComplete()const;
 
 private:
-  Q_DECLARE_PRIVATE(ctkWorkflowWidgetStep);
-  Q_DISABLE_COPY(ctkWorkflowWidgetStep);
 
+  //Q_DECLARE_PRIVATE(ctkWorkflowWidgetStep);
+  // Since this class derives from both QWidget and ctkWorkflowStep,
+  // let's specify which 'd_ptr' to use to avoid ambiguous reference
+  inline ctkWorkflowWidgetStepPrivate* d_func() { return reinterpret_cast<ctkWorkflowWidgetStepPrivate *>(qGetPtrHelper(ctkWorkflowStep::d_ptr)); }
+  inline const ctkWorkflowWidgetStepPrivate* d_func() const { return reinterpret_cast<const ctkWorkflowWidgetStepPrivate *>(qGetPtrHelper(ctkWorkflowStep::d_ptr)); }
+  friend class ctkWorkflowWidgetStepPrivate;
+
+  Q_DISABLE_COPY(ctkWorkflowWidgetStep);
+  friend class ctkWorkflowGroupBox; // For access to showUserInterface()
 };
 
-Q_DECLARE_OPERATORS_FOR_FLAGS(ctkWorkflowWidgetStep::ButtonBoxHintsForPlugin)
+ Q_DECLARE_OPERATORS_FOR_FLAGS(ctkWorkflowWidgetStep::ButtonBoxHints)
 
 #endif
 

+ 9 - 11
Libs/Widgets/ctkWorkflowAbstractWidgetStep_p.h

@@ -18,31 +18,29 @@
 
   =========================================================================*/
 
-#ifndef __ctkWorkflowAbstractWidgetStep_p_h
-#define __ctkWorkflowAbstractWidgetStep_p_h
+#ifndef __ctkWorkflowWidgetStep_p_h
+#define __ctkWorkflowWidgetStep_p_h
 
 // Qt includes
 #include <QObject>
 #include <QList>
 #include <QIcon>
-class QWidget;
 
 // CTK includes
-#include "ctkWorkflowAbstractWidgetStep.h"
+#include "ctkWorkflowWidgetStep.h"
 #include "ctkWorkflowStep_p.h"
-//class ctkWorkflowButtonBoxWidget;
 
 //-----------------------------------------------------------------------------
-class ctkWorkflowAbstractWidgetStepPrivate : public ctkWorkflowStepPrivate
+class ctkWorkflowWidgetStepPrivate : public ctkWorkflowStepPrivate
 {
   Q_OBJECT
-  Q_DECLARE_PUBLIC(ctkWorkflowAbstractWidgetStep);
+  Q_DECLARE_PUBLIC(ctkWorkflowWidgetStep);
 protected:
-  ctkWorkflowAbstractWidgetStep* q_ptr;
+  ctkWorkflowWidgetStep* q_ptr;
   
 public:
-  ctkWorkflowAbstractWidgetStepPrivate(ctkWorkflowAbstractWidgetStep& object);
-  ~ctkWorkflowAbstractWidgetStepPrivate(){}
+  ctkWorkflowWidgetStepPrivate(ctkWorkflowWidgetStep& object);
+  ~ctkWorkflowWidgetStepPrivate(){}
   typedef ctkWorkflowStepPrivate Superclass;
 
 protected:
@@ -57,7 +55,7 @@ protected:
   QString backButtonText;
   QString nextButtonText;
 
-  ctkWorkflowAbstractWidgetStep::ButtonBoxHints  ButtonBoxHints;
+  ctkWorkflowWidgetStep::ButtonBoxHints  ButtonBoxHints;
 
   QIcon icon;