AlmondMenuWidget.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include "AlmondMenuWidget.h"
  2. #include <QVBoxLayout>
  3. #include <QHBoxLayout>
  4. #include <QResizeEvent>
  5. #include <QPropertyAnimation>
  6. #include <QParallelAnimationGroup>
  7. AlmondSubMenu::AlmondSubMenu(QWidget* widget) :
  8. w{ widget }
  9. {
  10. }
  11. QWidget* AlmondSubMenu::widget(void)
  12. {
  13. return w;
  14. }
  15. AlmondMenuWidget::AlmondMenuWidget(QWidget* parent) :
  16. QFrame{ parent },
  17. mainMenu{ nullptr }
  18. {
  19. rightWidget = new QWidget(this);
  20. subMenuContainer = new QStackedWidget(rightWidget);
  21. subMenuContainer->setContentsMargins(0, 0, 0, 0);
  22. rightOK = new QPushButton("OK", rightWidget);
  23. rightCancel = new QPushButton("Cancel", rightWidget);
  24. leftWidget = new QWidget(this);
  25. QVBoxLayout* mainLayout = new QVBoxLayout(leftWidget);
  26. mainLayout->setMargin(0);
  27. mainLayout->setContentsMargins(0, 0, 0, 0);
  28. QVBoxLayout* smlayout = new QVBoxLayout(rightWidget);
  29. smlayout->addWidget(subMenuContainer, 1);
  30. smlayout->addWidget(rightOK);
  31. smlayout->addWidget(rightCancel);
  32. connect(rightOK, &QPushButton::clicked,
  33. this, &AlmondMenuWidget::clickedRightOK);
  34. connect(rightCancel, &QPushButton::clicked,
  35. this, &AlmondMenuWidget::clickedRightCancel);
  36. //layout->addWidget(rightWidget);
  37. //layout->addWidget(leftWidget);
  38. rightWidget->setVisible(false);
  39. /*states = new QStateMachine(this);
  40. QState* mainMenuShow = new QState(states);
  41. QState* subMenuShow = new QState(states);
  42. mainMenuShow->assignProperty(leftWidget, "visible", true);
  43. mainMenuShow->assignProperty(rightWidget, "visible", false);
  44. subMenuShow->assignProperty(leftWidget, "visible", false);
  45. subMenuShow->assignProperty(leftWidget, "pos", QPoint(100, 100));
  46. subMenuShow->assignProperty(rightWidget, "visible", true);
  47. mainMenuShow->addTransition(this, SIGNAL(showLeft()), subMenuShow);
  48. subMenuShow->addTransition(this, SIGNAL(showRight()), mainMenuShow);
  49. states->start();*/
  50. }
  51. AlmondMenuWidget::~AlmondMenuWidget(void)
  52. {
  53. for (auto& a : subMenus) {
  54. delete a;
  55. }
  56. }
  57. void AlmondMenuWidget::setMainMenu(QWidget* mainMenu)
  58. {
  59. //mainMenu->setParent(this);
  60. this->mainMenu = mainMenu;
  61. leftWidget->layout()->addWidget(mainMenu);
  62. }
  63. AlmondSubMenu* AlmondMenuWidget::addSubMenu(QWidget* subMenu)
  64. {
  65. subMenuContainer->addWidget(subMenu);
  66. AlmondSubMenu* almsm = new AlmondSubMenu(subMenu);
  67. this->subMenus.append(almsm);
  68. return almsm;
  69. }
  70. QSize AlmondMenuWidget::sizeHint(void) const
  71. {
  72. QSize hint{ 0, 0 };
  73. hint = leftWidget->sizeHint();
  74. for (auto& subMenu : subMenus) {
  75. const auto& widget = subMenu->widget();
  76. QSize widgetHint = widget->sizeHint();
  77. if (hint.width() < widgetHint.width())
  78. hint.setWidth(widgetHint.width());
  79. if (hint.height() < widgetHint.height())
  80. hint.setHeight(widgetHint.height());
  81. }
  82. return hint;
  83. }
  84. QSize AlmondMenuWidget::minimumSizeHint(void) const
  85. {
  86. QSize hint{ 0, 0 };
  87. hint = leftWidget->minimumSizeHint();
  88. for (auto& subMenu : subMenus) {
  89. const auto& widget = subMenu->widget();
  90. QSize widgetHint = widget->minimumSizeHint();
  91. if (hint.width() < widgetHint.width())
  92. hint.setWidth(widgetHint.width());
  93. if (hint.height() < widgetHint.height())
  94. hint.setHeight(widgetHint.height());
  95. }
  96. return hint;
  97. }
  98. void AlmondMenuWidget::resizeEvent(QResizeEvent* event)
  99. {
  100. QRect leftGeom = contentsRect();
  101. QRect rightGeom = contentsRect();
  102. //leftGeom.setSize(event->size());
  103. //rightGeom.setSize(event->size());
  104. leftWidget->setGeometry(leftGeom);
  105. rightWidget->setGeometry(rightGeom);
  106. }
  107. void AlmondMenuWidget::clickedRightOK(void)
  108. {
  109. int index = subMenuContainer->currentIndex();
  110. emit submenuOK(index);
  111. emit subMenus.at(index)->accepted();
  112. }
  113. void AlmondMenuWidget::clickedRightCancel(void)
  114. {
  115. int index = subMenuContainer->currentIndex();
  116. emit submenuCancel(subMenuContainer->currentIndex());
  117. emit subMenus.at(index)->cancelled();
  118. }
  119. void AlmondMenuWidget::showMainMenu(void)
  120. {
  121. emit showLeft();
  122. if (!mainMenu)
  123. return;
  124. QParallelAnimationGroup* ag = new QParallelAnimationGroup(this);
  125. QPropertyAnimation* mm = new QPropertyAnimation(leftWidget, "geometry", this);
  126. QPropertyAnimation* rw = new QPropertyAnimation(rightWidget, "geometry", this);
  127. mm->setStartValue(contentsRect().adjusted(-width(), 0, -width(), 0));
  128. mm->setEndValue(contentsRect());
  129. rw->setEndValue(contentsRect().adjusted(width(), 0, width(), 0));
  130. rw->setStartValue(contentsRect());
  131. mm->setEasingCurve(QEasingCurve::InOutSine);
  132. rw->setEasingCurve(QEasingCurve::InOutSine);
  133. mm->setDuration(200);
  134. rw->setDuration(200);
  135. ag->addAnimation(mm);
  136. ag->addAnimation(rw);
  137. connect(ag, &QParallelAnimationGroup::finished, [this] () {
  138. emit rightWidget->hide();
  139. leftWidget->setGeometry(contentsRect());
  140. });
  141. leftWidget->setGeometry(rightWidget->geometry().adjusted(-width(), 0, -width(), 0));
  142. emit leftWidget->show();
  143. emit ag->start(QAbstractAnimation::DeleteWhenStopped);
  144. }
  145. void AlmondMenuWidget::showSubMenu(int index)
  146. {
  147. subMenuContainer->setCurrentIndex(index);
  148. /*while (subMenuContainer->layout()->count() > 0)
  149. subMenuContainer->layout()->takeAt(0);
  150. subMenuContainer->layout()->update();
  151. rightWidget->setGeometry(leftWidget->geometry().adjusted(width(), 0, width(), 0));
  152. //subMenuContainer->layout()->addWidget(subMenus.at(index));
  153. subMenuContainer->layout()->update();*/
  154. showSubMenu();
  155. }
  156. void AlmondMenuWidget::showSubMenu(void)
  157. {
  158. emit showRight();
  159. if (!mainMenu)
  160. return;
  161. QParallelAnimationGroup* ag = new QParallelAnimationGroup(this);
  162. QPropertyAnimation* mm = new QPropertyAnimation(leftWidget, "geometry", this);
  163. QPropertyAnimation* rw = new QPropertyAnimation(rightWidget, "geometry", this);
  164. mm->setStartValue(contentsRect());
  165. mm->setEndValue(contentsRect().adjusted(-width(), 0, -width(), 0));
  166. rw->setStartValue(contentsRect().adjusted(width(), 0, width(), 0));
  167. rw->setEndValue(contentsRect());
  168. mm->setEasingCurve(QEasingCurve::InOutSine);
  169. rw->setEasingCurve(QEasingCurve::InOutSine);
  170. mm->setDuration(200);
  171. rw->setDuration(200);
  172. ag->addAnimation(mm);
  173. ag->addAnimation(rw);
  174. connect(ag, &QParallelAnimationGroup::finished, [this] () {
  175. leftWidget->hide();
  176. rightWidget->setGeometry(contentsRect());
  177. });
  178. rightWidget->setGeometry(mainMenu->geometry().adjusted(width(), 0, width(), 0));
  179. emit rightWidget->setVisible(true);
  180. emit ag->start(QAbstractAnimation::DeleteWhenStopped);
  181. }