usermenu.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "usermenu.h"
  2. #include "powerdialog.h"
  3. void UserMenuApplet::externalWidgetSetup() {
  4. mExternalWidget = new QPushButton();
  5. mExternalWidget->setFont(mCfgMan->mFont);
  6. mExternalWidget->setObjectName("userButton");
  7. mExternalWidget->setToolTip(tr("Power & Settings"));
  8. static_cast<QPushButton*>(mExternalWidget)->setFlat(true);
  9. if (mParentPanel->mPanelLayout == Horizontal) {
  10. QString text = QString(" %1").arg(getenv("USER"));
  11. int userMenuWidth = mParentPanel->mFontMetrics->horizontalAdvance(text) + 20;
  12. static_cast<QPushButton*>(mExternalWidget)->setText(text);
  13. mExternalWidget->setMaximumWidth(userMenuWidth);
  14. }
  15. QString avatar = mCfgMan->mAvatar;
  16. if (!avatar.compare("")) {
  17. static_cast<QPushButton*>(mExternalWidget)->setIcon(
  18. QIcon::fromTheme("computer")
  19. );
  20. }
  21. else {
  22. if (QIcon::hasThemeIcon(avatar)) {
  23. static_cast<QPushButton*>(mExternalWidget)->setIcon(
  24. QIcon::fromTheme(avatar)
  25. );
  26. }
  27. else if (QFile::exists(avatar)) {
  28. static_cast<QPushButton*>(mExternalWidget)->setIcon(
  29. QIcon(avatar)
  30. );
  31. }
  32. }
  33. // Make connections
  34. connect(static_cast<QPushButton*>(mExternalWidget),
  35. &QPushButton::clicked, this, [this]() {
  36. if (!mInternalWidget->isVisible()) {
  37. if (mCfgMan->mTransparent) {
  38. setBlurredBackground();
  39. }
  40. mInternalWidget->show();
  41. }
  42. else {
  43. mInternalWidget->hide();
  44. }
  45. });
  46. }
  47. void UserMenuApplet::internalWidgetSetup() {
  48. mInternalWidget = new QWidget();
  49. // Geometry
  50. int width = mParentPanel->mFontMetrics->horizontalAdvance("About plainDE") + 25;
  51. int height = 150;
  52. preliminaryInternalWidgetSetup(width, height, true);
  53. mInternalWidget->setObjectName("userMenu");
  54. QVBoxLayout* userMenuLayout = new QVBoxLayout(mInternalWidget);
  55. userMenuLayout->setContentsMargins(1, 1, 1, 1);
  56. QPushButton* settingsEntry = new QPushButton();
  57. settingsEntry->setFlat(true);
  58. settingsEntry->setText(tr("Settings"));
  59. settingsEntry->setIcon(QIcon::fromTheme("preferences-system"));
  60. settingsEntry->setFont(mCfgMan->mFont);
  61. settingsEntry->setStyleSheet("text-align: left;");
  62. userMenuLayout->addWidget(settingsEntry);
  63. QPushButton* aboutEntry = new QPushButton();
  64. aboutEntry->setFlat(true);
  65. aboutEntry->setText(tr("About plainDE"));
  66. aboutEntry->setIcon(QIcon("/usr/share/plainDE/menuIcon.png"));
  67. aboutEntry->setFont(mCfgMan->mFont);
  68. aboutEntry->setStyleSheet("text-align: left;");
  69. userMenuLayout->addWidget(aboutEntry);
  70. QPushButton* logOutEntry = new QPushButton();
  71. logOutEntry->setFlat(true);
  72. logOutEntry->setText(tr("Log Out"));
  73. logOutEntry->setIcon(QIcon::fromTheme("system-log-out"));
  74. logOutEntry->setFont(mCfgMan->mFont);
  75. logOutEntry->setStyleSheet("text-align: left;");
  76. userMenuLayout->addWidget(logOutEntry);
  77. QPushButton* suspendEntry = new QPushButton();
  78. suspendEntry->setFlat(true);
  79. suspendEntry->setText(tr("Suspend"));
  80. suspendEntry->setIcon(QIcon::fromTheme("system-suspend"));
  81. suspendEntry->setFont(mCfgMan->mFont);
  82. suspendEntry->setStyleSheet("text-align: left;");
  83. userMenuLayout->addWidget(suspendEntry);
  84. QPushButton* rebootEntry = new QPushButton();
  85. rebootEntry->setFlat(true);
  86. rebootEntry->setText("Reboot");
  87. rebootEntry->setIcon(QIcon::fromTheme("system-reboot"));
  88. rebootEntry->setFont(mCfgMan->mFont);
  89. rebootEntry->setStyleSheet("text-align: left;");
  90. userMenuLayout->addWidget(rebootEntry);
  91. QPushButton* powerOffEntry = new QPushButton();
  92. powerOffEntry->setFlat(true);
  93. powerOffEntry->setText("Power Off");
  94. powerOffEntry->setIcon(QIcon::fromTheme("system-shutdown"));
  95. powerOffEntry->setFont(mCfgMan->mFont);
  96. powerOffEntry->setStyleSheet("text-align: left;");
  97. userMenuLayout->addWidget(powerOffEntry);
  98. // Make connections
  99. connect(powerOffEntry, &QPushButton::clicked, this,
  100. [this]() {
  101. mInternalWidget->hide();
  102. PowerDialog* pd = new PowerDialog(Type::PowerOff, mParentPanel, mCfgMan);
  103. if (mCfgMan->mSecondsUntilPowerOff > -1) {
  104. pd->startTimer();
  105. }
  106. connect(pd, &PowerDialog::actionRequested, this, [this, pd]() {
  107. emit static_cast<Initializer*>(
  108. mParentPanel->mExecHolder)->panelShouldQuit();
  109. if (pd->mPlayLogoutSound) {
  110. pd->mPlayer->play();
  111. connect(pd->mPlayer, &QMediaPlayer::stateChanged, this, [pd]() {
  112. if (pd->mPlayer->state() == QMediaPlayer::StoppedState) {
  113. system("systemctl poweroff");
  114. }
  115. });
  116. }
  117. else {
  118. connect(mParentPanel, &Panel::animationFinished, this, []() {
  119. system("systemctl poweroff");
  120. });
  121. }
  122. });
  123. connect(pd, &PowerDialog::cancelled, this, [pd]() {
  124. delete pd;
  125. });
  126. });
  127. connect(rebootEntry, &QPushButton::clicked, this,
  128. [this]() {
  129. mInternalWidget->hide();
  130. PowerDialog* pd = new PowerDialog(Type::Reboot, mParentPanel, mCfgMan);
  131. if (mCfgMan->mSecondsUntilPowerOff > -1) {
  132. pd->startTimer();
  133. }
  134. connect(pd, &PowerDialog::actionRequested, this, [this, pd]() {
  135. emit static_cast<Initializer*>(
  136. mParentPanel->mExecHolder)->panelShouldQuit();
  137. if (pd->mPlayLogoutSound) {
  138. pd->mPlayer->play();
  139. connect(pd->mPlayer, &QMediaPlayer::stateChanged, this, [pd]() {
  140. if (pd->mPlayer->state() == QMediaPlayer::StoppedState) {
  141. system("systemctl reboot");
  142. }
  143. });
  144. }
  145. else {
  146. connect(mParentPanel, &Panel::animationFinished, this, []() {
  147. system("systemctl reboot");
  148. });
  149. }
  150. });
  151. connect(pd, &PowerDialog::cancelled, this, [pd]() {
  152. delete pd;
  153. });
  154. });
  155. connect(logOutEntry, &QPushButton::clicked, this,
  156. [this]() {
  157. mInternalWidget->hide();
  158. PowerDialog* pd = new PowerDialog(Type::LogOut, mParentPanel, mCfgMan);
  159. if (mCfgMan->mSecondsUntilPowerOff > -1) {
  160. pd->startTimer();
  161. }
  162. connect(pd, &PowerDialog::actionRequested, this, [this, pd]() {
  163. emit static_cast<Initializer*>(
  164. mParentPanel->mExecHolder)->panelShouldQuit();
  165. if (pd->mPlayLogoutSound) {
  166. qDebug() << "1";
  167. pd->mPlayer->play();
  168. connect(pd->mPlayer, &QMediaPlayer::stateChanged, this, [pd]() {
  169. if (pd->mPlayer->state() == QMediaPlayer::StoppedState) {
  170. system("loginctl kill-user $USER");
  171. }
  172. });
  173. }
  174. else {
  175. connect(mParentPanel, &Panel::animationFinished, this, []() {
  176. system("loginctl kill-user $USER");
  177. });
  178. }
  179. });
  180. connect(pd, &PowerDialog::cancelled, this, [pd]() {
  181. delete pd;
  182. });
  183. });
  184. this->connect(suspendEntry, &QPushButton::clicked, this,
  185. [this]() {
  186. mInternalWidget->hide();
  187. system("systemctl suspend");
  188. });
  189. this->connect(settingsEntry, &QPushButton::clicked, this,
  190. [this]() {
  191. mInternalWidget->hide();
  192. QProcess* process = new QProcess(mParentPanel->mExecHolder);
  193. process->start("/usr/bin/plainControlCenter", {""});
  194. });
  195. this->connect(aboutEntry, &QPushButton::clicked, this,
  196. [this]() {
  197. mInternalWidget->hide();
  198. QProcess* process = new QProcess(mParentPanel->mExecHolder);
  199. process->start("/usr/bin/plainAbout", {"--plainPanel"});
  200. });
  201. }
  202. UserMenuApplet::UserMenuApplet(ConfigManager* cfgMan,
  203. Panel* parentPanel) : StaticApplet("org.plainDE.userMenu",
  204. cfgMan,
  205. parentPanel) {
  206. }
  207. UserMenuApplet::~UserMenuApplet() {
  208. }