ctkWorkflowWidgetStep.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*=========================================================================
  2. Library: CTK
  3. Copyright (c) 2010 Kitware Inc.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.commontk.org/LICENSE
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. =========================================================================*/
  14. // Qt includes
  15. #include <QWidget>
  16. #include <QList>
  17. #include <QDebug>
  18. #include <QIcon>
  19. // CTK includes
  20. #include "ctkWorkflowWidgetStep.h"
  21. #include "ctkWorkflowWidget.h"
  22. #include "ctkWorkflow.h"
  23. #include "ctkWorkflowButtonBoxWidget.h"
  24. #include "ctkLogger.h"
  25. // STD includes
  26. #include <iostream>
  27. //--------------------------------------------------------------------------
  28. static ctkLogger logger("org.commontk.libs.widgets.ctkWorkflowWidgetStep");
  29. //--------------------------------------------------------------------------
  30. //-----------------------------------------------------------------------------
  31. class ctkWorkflowWidgetStepPrivate : public ctkPrivate<ctkWorkflowWidgetStep>
  32. {
  33. public:
  34. CTK_DECLARE_PUBLIC(ctkWorkflowWidgetStep);
  35. ctkWorkflowWidgetStepPrivate();
  36. ~ctkWorkflowWidgetStepPrivate(){}
  37. QWidget* stepArea;
  38. QList<QWidget*> stepWidgetsList;
  39. QList<ctkWorkflowStep*> finishStepsToHaveButtonsInStepArea;
  40. // orientation for layout of the step area and button area (for use
  41. // with QBoxLayouy only)
  42. QBoxLayout::Direction stepAreaDirection;
  43. int hasPopulateStepWidgetsListCommand;
  44. int hasShowUserInterfaceCommand;
  45. // names for the buttons
  46. QString backButtonText;
  47. QString nextButtonText;
  48. // QList<QString> finishButtonTexts;
  49. ctkWorkflowButtonBoxWidget* buttonBoxWidget;
  50. bool hasButtonBoxWidget;
  51. ctkWorkflowWidgetStep::ButtonBoxHints ButtonBoxHints;
  52. QIcon icon;
  53. };
  54. //-----------------------------------------------------------------------------
  55. // ctkWorkflowWidgetStepPrivate methods
  56. //-----------------------------------------------------------------------------
  57. ctkWorkflowWidgetStepPrivate::ctkWorkflowWidgetStepPrivate()
  58. {
  59. this->stepArea = 0;
  60. this->buttonBoxWidget = 0;
  61. this->hasButtonBoxWidget = false;
  62. stepAreaDirection = QBoxLayout::TopToBottom;
  63. icon = QIcon();
  64. }
  65. //-----------------------------------------------------------------------------
  66. // ctkWorkflowWidgetStep methods
  67. //-----------------------------------------------------------------------------
  68. ctkWorkflowWidgetStep::ctkWorkflowWidgetStep(ctkWorkflow* newWorkflow, const QString& newId) : Superclass(newWorkflow, newId)
  69. {
  70. CTK_INIT_PRIVATE(ctkWorkflowWidgetStep);
  71. CTK_D(ctkWorkflowWidgetStep);
  72. d->hasPopulateStepWidgetsListCommand = 0;
  73. d->hasShowUserInterfaceCommand = 0;
  74. QObject::connect(this, SIGNAL(populateStepWidgetsListComplete()), this, SLOT(evaluatePopulateStepWidgetsListResults()));
  75. }
  76. //-----------------------------------------------------------------------------
  77. CTK_GET_CXX(ctkWorkflowWidgetStep, QBoxLayout::Direction, stepAreaDirection, stepAreaDirection);
  78. CTK_GET_CXX(ctkWorkflowWidgetStep, int, hasPopulateStepWidgetsListCommand, hasPopulateStepWidgetsListCommand);
  79. CTK_SET_CXX(ctkWorkflowWidgetStep, int, setHasPopulateStepWidgetsListCommand, hasPopulateStepWidgetsListCommand);
  80. CTK_GET_CXX(ctkWorkflowWidgetStep, int, hasShowUserInterfaceCommand, hasShowUserInterfaceCommand);
  81. CTK_SET_CXX(ctkWorkflowWidgetStep, int, setHasShowUserInterfaceCommand, hasShowUserInterfaceCommand);
  82. CTK_GET_CXX(ctkWorkflowWidgetStep, QString, backButtonText, backButtonText);
  83. CTK_SET_CXX(ctkWorkflowWidgetStep, const QString&, setBackButtonText, backButtonText);
  84. CTK_GET_CXX(ctkWorkflowWidgetStep, QString, nextButtonText, nextButtonText);
  85. CTK_SET_CXX(ctkWorkflowWidgetStep, const QString&, setNextButtonText, nextButtonText);
  86. // CTK_GET_CXX(ctkWorkflowWidgetStep, QList<QString>, finishButtonTexts, finishButtonTexts);
  87. // CTK_SET_CXX(ctkWorkflowWidgetStep, QList<QString>, setFinishButtonTexts, finishButtonTexts);
  88. CTK_GET_CXX(ctkWorkflowWidgetStep, bool, hasButtonBoxWidget, hasButtonBoxWidget);
  89. CTK_SET_CXX(ctkWorkflowWidgetStep, bool, setHasButtonBoxWidget, hasButtonBoxWidget);
  90. CTK_GET_CXX(ctkWorkflowWidgetStep, QIcon, icon, icon);
  91. CTK_SET_CXX(ctkWorkflowWidgetStep, const QIcon&, setIcon, icon);
  92. //-----------------------------------------------------------------------------
  93. CTK_GET_CXX(ctkWorkflowWidgetStep, ctkWorkflowWidgetStep::ButtonBoxHints,
  94. buttonBoxHints, ButtonBoxHints);
  95. CTK_SET_CXX(ctkWorkflowWidgetStep, ctkWorkflowWidgetStep::ButtonBoxHints,
  96. setButtonBoxHints, ButtonBoxHints);
  97. //-----------------------------------------------------------------------------
  98. // void ctkWorkflowWidgetStep::setFinishButtonText(const QString& name)
  99. // {
  100. // QList<QString> names;
  101. // names << name;
  102. // this->setFinishButtonTexts(names);
  103. // }
  104. //-----------------------------------------------------------------------------
  105. QWidget* ctkWorkflowWidgetStep::stepArea()
  106. {
  107. CTK_D(ctkWorkflowWidgetStep);
  108. if (!d->stepArea)
  109. {
  110. d->stepArea = new QWidget();
  111. d->stepArea->hide();
  112. }
  113. return d->stepArea;
  114. }
  115. //-----------------------------------------------------------------------------
  116. ctkWorkflowButtonBoxWidget* ctkWorkflowWidgetStep::buttonBoxWidget()
  117. {
  118. CTK_D(ctkWorkflowWidgetStep);
  119. if (!d->buttonBoxWidget)
  120. {
  121. if (!this->workflow())
  122. {
  123. logger.error("buttonBoxWidget - Cannot create buttonBoxWidget without a workflow");
  124. return 0;
  125. }
  126. d->buttonBoxWidget = new ctkWorkflowButtonBoxWidget(this->workflow());
  127. d->stepArea->layout()->addWidget(d->buttonBoxWidget);
  128. }
  129. return d->buttonBoxWidget;
  130. }
  131. // --------------------------------------------------------------------------
  132. void ctkWorkflowWidgetStep::changeWidgetDirection(QWidget* widget, const QBoxLayout::Direction& direction)
  133. {
  134. // easy to change layout direction if we don't already have a layout
  135. if (!widget->layout())
  136. {
  137. widget->setLayout(new QBoxLayout(direction));
  138. }
  139. // do nothing if the page's layout cannot be cast to a QBoxLayout
  140. else if (QBoxLayout* widgetLayout = qobject_cast<QBoxLayout*>(widget->layout()))
  141. {
  142. widgetLayout->setDirection(direction);
  143. }
  144. }
  145. //-----------------------------------------------------------------------------
  146. void ctkWorkflowWidgetStep::setStepAreaDirection(const QBoxLayout::Direction& direction)
  147. {
  148. this->changeWidgetDirection(this->stepArea(), direction);
  149. CTK_D(ctkWorkflowWidgetStep);
  150. d->stepAreaDirection = direction;
  151. }
  152. //-----------------------------------------------------------------------------
  153. // reimplement in derived classes
  154. void ctkWorkflowWidgetStep::showUserInterface()
  155. {
  156. CTK_D(ctkWorkflowWidgetStep);
  157. // use the user's showUserInterfaceCommand if given
  158. if (d->hasShowUserInterfaceCommand)
  159. {
  160. emit invokeShowUserInterfaceCommand();
  161. return;
  162. }
  163. // otherwise we provide an implementation here
  164. logger.debug(QString("showUserInterface - showing %1").arg(this->name()));
  165. QWidget* stepArea = this->stepArea();
  166. // create the default step area layout, if there isn't one set
  167. if (!stepArea->layout())
  168. {
  169. d->stepArea->setLayout(new QBoxLayout(QBoxLayout::TopToBottom));
  170. }
  171. // add the step-specific widgets - only runs the first time this
  172. // method is called
  173. if (d->stepWidgetsList.isEmpty())
  174. {
  175. this->populateStepWidgetsList(d->stepWidgetsList);
  176. // actually enabling/showing the stepArea is handled by evaluatePopulateStepWidgetsListResults
  177. }
  178. else
  179. {
  180. this->addButtons();
  181. }
  182. }
  183. //-----------------------------------------------------------------------------
  184. void ctkWorkflowWidgetStep::addButtons()
  185. {
  186. CTK_D(ctkWorkflowWidgetStep);
  187. if (d->hasButtonBoxWidget)
  188. {
  189. ctkWorkflowButtonBoxWidget* buttonBoxWidget = this->buttonBoxWidget();
  190. buttonBoxWidget->updateButtons();
  191. }
  192. emit showUserInterfaceComplete();
  193. }
  194. //-----------------------------------------------------------------------------
  195. // reimplement in derived classes
  196. void ctkWorkflowWidgetStep::populateStepWidgetsList(QList<QWidget*>& stepWidgetsList)
  197. {
  198. CTK_D(ctkWorkflowWidgetStep);
  199. if (d->hasPopulateStepWidgetsListCommand)
  200. {
  201. emit invokePopulateStepWidgetsListCommand(stepWidgetsList);
  202. }
  203. }
  204. //-----------------------------------------------------------------------------
  205. void ctkWorkflowWidgetStep::evaluatePopulateStepWidgetsListResults()
  206. {
  207. // iterate through the list of widgets, add them to the layout
  208. CTK_D(ctkWorkflowWidgetStep);
  209. if (!d->stepArea)
  210. {
  211. logger.error("evaluatePopulateStepWidgetsListResults - stepArea is Null");
  212. return;
  213. }
  214. foreach(QWidget* widget, d->stepWidgetsList)
  215. {
  216. if (widget)
  217. {
  218. logger.debug("evaluatePopulateStepWidgetsListResults - Adding widget to layout");
  219. d->stepArea->layout()->addWidget(widget);
  220. }
  221. }
  222. this->addButtons();
  223. }