1
0

AlmondMenuWidget.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "AlmondMenuWidget.h"
  2. #include <QVBoxLayout>
  3. #include <QPropertyAnimation>
  4. #include <QParallelAnimationGroup>
  5. AlmondMenuWidget::AlmondMenuWidget(QWidget* parent) :
  6. QWidget{ parent },
  7. mainMenu{ nullptr }
  8. {
  9. QVBoxLayout* layout = new QVBoxLayout(this);
  10. layout->setMargin(0);
  11. rightWidget = new QWidget(this);
  12. subMenuContainer = new QStackedWidget(this);
  13. rightOK = new QPushButton("OK", this);
  14. rightCancel = new QPushButton("Cancel", this);
  15. subMenuContainer->setContentsMargins(0, 0, 0, 0);
  16. QVBoxLayout* smlayout = new QVBoxLayout(rightWidget);
  17. smlayout->addWidget(subMenuContainer, 1);
  18. smlayout->addWidget(rightOK);
  19. smlayout->addWidget(rightCancel);
  20. connect(rightOK, &QPushButton::clicked,
  21. this, &AlmondMenuWidget::clickedRightOK);
  22. connect(rightCancel, &QPushButton::clicked,
  23. this, &AlmondMenuWidget::clickedRightCancel);
  24. layout->addWidget(rightWidget);
  25. rightWidget->hide();
  26. }
  27. void AlmondMenuWidget::setMainMenu(QWidget* mainMenu)
  28. {
  29. //mainMenu->setParent(this);
  30. this->mainMenu = mainMenu;
  31. this->layout()->addWidget(mainMenu);
  32. }
  33. void AlmondMenuWidget::addSubMenu(QWidget* subMenu)
  34. {
  35. subMenuContainer->addWidget(subMenu);
  36. this->subMenus.append(subMenu);
  37. }
  38. QSize AlmondMenuWidget::sizeHint(void) const
  39. {
  40. QSize hint{ 0, 0 };
  41. if (mainMenu)
  42. hint = mainMenu->sizeHint();
  43. for (auto& widget : subMenus) {
  44. QSize widgetHint = widget->sizeHint();
  45. if (hint.width() < widgetHint.width())
  46. hint.setWidth(widgetHint.width());
  47. if (hint.height() < widgetHint.height())
  48. hint.setHeight(widgetHint.height());
  49. }
  50. return hint;
  51. }
  52. QSize AlmondMenuWidget::minimumSizeHint(void) const
  53. {
  54. QSize hint{ 0, 0 };
  55. if (mainMenu)
  56. hint = mainMenu->minimumSizeHint();
  57. for (auto& widget : subMenus) {
  58. QSize widgetHint = widget->minimumSizeHint();
  59. if (hint.width() < widgetHint.width())
  60. hint.setWidth(widgetHint.width());
  61. if (hint.height() < widgetHint.height())
  62. hint.setHeight(widgetHint.height());
  63. }
  64. return hint;
  65. }
  66. void AlmondMenuWidget::clickedRightOK(void)
  67. {
  68. emit submenuOK(subMenuContainer->currentIndex());
  69. }
  70. void AlmondMenuWidget::clickedRightCancel(void)
  71. {
  72. emit submenuCancel(subMenuContainer->currentIndex());
  73. }
  74. void AlmondMenuWidget::showMainMenu(void)
  75. {
  76. if (!mainMenu)
  77. return;
  78. QParallelAnimationGroup* ag = new QParallelAnimationGroup(this);
  79. QPropertyAnimation* mm = new QPropertyAnimation(mainMenu, "geometry", this);
  80. QPropertyAnimation* rw = new QPropertyAnimation(rightWidget, "geometry", this);
  81. mm->setStartValue(rightWidget->geometry().adjusted(-width(), 0, -width(), 0));
  82. mm->setEndValue(rightWidget->geometry());
  83. rw->setEndValue(rightWidget->geometry().adjusted(width(), 0, width(), 0));
  84. rw->setStartValue(rightWidget->geometry());
  85. mm->setEasingCurve(QEasingCurve::InOutSine);
  86. rw->setEasingCurve(QEasingCurve::InOutSine);
  87. mm->setDuration(200);
  88. rw->setDuration(200);
  89. ag->addAnimation(mm);
  90. ag->addAnimation(rw);
  91. connect(ag, &QParallelAnimationGroup::finished, [this] () { emit rightWidget->hide(); });
  92. mainMenu->setGeometry(rightWidget->geometry().adjusted(-width(), 0, -width(), 0));
  93. emit mainMenu->show();
  94. emit ag->start();
  95. }
  96. void AlmondMenuWidget::showSubMenu(int index)
  97. {
  98. if (!mainMenu)
  99. return;
  100. QParallelAnimationGroup* ag = new QParallelAnimationGroup(this);
  101. QPropertyAnimation* mm = new QPropertyAnimation(mainMenu, "geometry", this);
  102. QPropertyAnimation* rw = new QPropertyAnimation(rightWidget, "geometry", this);
  103. mm->setStartValue(mainMenu->geometry());
  104. mm->setEndValue(mainMenu->geometry().adjusted(-width(), 0, -width(), 0));
  105. rw->setStartValue(mainMenu->geometry().adjusted(width(), 0, width(), 0));
  106. rw->setEndValue(mainMenu->geometry());
  107. mm->setEasingCurve(QEasingCurve::InOutSine);
  108. rw->setEasingCurve(QEasingCurve::InOutSine);
  109. mm->setDuration(200);
  110. rw->setDuration(200);
  111. ag->addAnimation(mm);
  112. ag->addAnimation(rw);
  113. connect(ag, &QParallelAnimationGroup::finished, [this] () { mainMenu->hide(); });
  114. subMenuContainer->setCurrentIndex(index);
  115. rightWidget->setGeometry(mainMenu->geometry().adjusted(width(), 0, width(), 0));
  116. emit rightWidget->setVisible(true);
  117. emit ag->start();
  118. }