AlmondMenuWidget.cpp 6.1 KB

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