autostart.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "autostart.h"
  2. #include "../pane.h"
  3. #include "../settings.h"
  4. QJsonObject autostartPaneConfig;
  5. QStringList autostartEntries;
  6. QHash<QListWidgetItem*,QString> entryByItem;
  7. void AutostartPane::readConfig() {
  8. QString homeDirectory = getenv("HOME");
  9. QFile file;
  10. QString data;
  11. file.setFileName(homeDirectory + "/.config/plainDE/config.json");
  12. file.open(QIODevice::ReadOnly | QIODevice::Text);
  13. data = file.readAll();
  14. file.close();
  15. autostartPaneConfig = QJsonDocument::fromJson(data.toUtf8()).object();
  16. }
  17. App readDesktopFile(QString pathToCurrentDesktopFile) {
  18. App myApp;
  19. QString iconPath;
  20. QSettings desktopFileReader(pathToCurrentDesktopFile, QSettings::IniFormat);
  21. desktopFileReader.sync();
  22. desktopFileReader.beginGroup("Desktop Entry");
  23. myApp.displayedName = desktopFileReader.value("Name").toString();
  24. iconPath = desktopFileReader.value("Icon").toString();
  25. if (QIcon::hasThemeIcon(iconPath)) {
  26. myApp.icon = QIcon::fromTheme(iconPath);
  27. }
  28. else {
  29. if (QFile::exists(iconPath)) {
  30. myApp.icon = QIcon(iconPath);
  31. }
  32. else {
  33. // ICON: unknown app
  34. myApp.icon = QIcon(iconPath);
  35. }
  36. }
  37. return myApp;
  38. }
  39. void AutostartPane::prepareUI(QListWidget* autostartEntriesListWidget,
  40. QListWidget* allAppsListWidget) {
  41. QDir appDir("/usr/share/applications");
  42. QStringList desktopFilesList = appDir.entryList();
  43. autostartEntries = autostartPaneConfig["autostart"].toVariant().toStringList();
  44. QString pathToCurrentDesktopFile;
  45. App currentApp;
  46. allAppsListWidget->clear();
  47. autostartEntriesListWidget->clear();
  48. entryByItem.clear();
  49. for (int i = 0; i < desktopFilesList.length(); ++i) {
  50. pathToCurrentDesktopFile = appDir.absoluteFilePath(desktopFilesList[i]);
  51. currentApp = readDesktopFile(pathToCurrentDesktopFile);
  52. if (currentApp.displayedName != "") {
  53. QListWidgetItem* item = new QListWidgetItem(currentApp.displayedName);
  54. item->setIcon(currentApp.icon);
  55. allAppsListWidget->addItem(item);
  56. entryByItem[item] = desktopFilesList[i];
  57. if (autostartEntries.contains(desktopFilesList[i])) {
  58. QListWidgetItem* favItem = new QListWidgetItem(currentApp.displayedName);
  59. favItem->setIcon(currentApp.icon);
  60. autostartEntriesListWidget->addItem(favItem);
  61. entryByItem[favItem] = desktopFilesList[i];
  62. }
  63. }
  64. }
  65. QString homeDir = getenv("HOME");
  66. if (QDir(homeDir + "/.local/share/applications").exists()) {
  67. appDir.cd(homeDir + "/.local/share/applications");
  68. desktopFilesList = appDir.entryList();
  69. for (int i = 0; i < desktopFilesList.length(); ++i) {
  70. pathToCurrentDesktopFile = appDir.absoluteFilePath(desktopFilesList[i]);
  71. currentApp = readDesktopFile(pathToCurrentDesktopFile);
  72. if (currentApp.displayedName != "") {
  73. QListWidgetItem* item = new QListWidgetItem(currentApp.displayedName);
  74. item->setIcon(currentApp.icon);
  75. allAppsListWidget->addItem(item);
  76. entryByItem[item] = desktopFilesList[i];
  77. if (autostartEntries.contains(desktopFilesList[i])) {
  78. QListWidgetItem* favItem = new QListWidgetItem(currentApp.displayedName);
  79. favItem->setIcon(currentApp.icon);
  80. autostartEntriesListWidget->addItem(favItem);
  81. entryByItem[favItem] = desktopFilesList[i];
  82. }
  83. }
  84. }
  85. }
  86. allAppsListWidget->setCurrentRow(0);
  87. }
  88. void AutostartPane::addEntry(QListWidget* autostartEntriesListWidget,
  89. QListWidget* allAppsListWidget) {
  90. if (!allAppsListWidget->selectedItems().isEmpty()) {
  91. QListWidgetItem* selectedItem = allAppsListWidget->selectedItems()[0];
  92. QString selectedItemName = selectedItem->text();
  93. QIcon selectedItemIcon = selectedItem->icon();
  94. QListWidgetItem* favItem = new QListWidgetItem(selectedItemName);
  95. favItem->setIcon(selectedItemIcon);
  96. autostartEntriesListWidget->addItem(favItem);
  97. entryByItem[favItem] = entryByItem[selectedItem];
  98. }
  99. }
  100. void AutostartPane::removeEntry(QListWidget* autostartEntriesListWidget) {
  101. if (!autostartEntriesListWidget->selectedItems().isEmpty()) {
  102. QListWidgetItem* item = autostartEntriesListWidget->selectedItems()[0];
  103. autostartEntriesListWidget->removeItemWidget(item);
  104. delete item;
  105. }
  106. }
  107. void AutostartPane::saveSettings(QListWidget* autostartEntriesListWidget) {
  108. QStringList finalAutostartEntries;
  109. for (short i = 0; i < autostartEntriesListWidget->count(); ++i) {
  110. QString currentItemEntry = entryByItem[autostartEntriesListWidget->item(i)];
  111. finalAutostartEntries << currentItemEntry;
  112. }
  113. autostartPaneConfig["autostart"] = QJsonValue(QJsonArray::fromStringList(finalAutostartEntries));
  114. Pane::saveConfig(autostartPaneConfig);
  115. }
  116. QWidget* AutostartPane::createUI(Settings* controlCenter) {
  117. readConfig();
  118. // UI
  119. QWidget* autostartPane = new QWidget;
  120. autostartPane->setObjectName("autostartPane");
  121. autostartPane->setWindowTitle("plainControlCenter");
  122. QVBoxLayout* layout = new QVBoxLayout;
  123. layout->setContentsMargins(4, 4, 4, 4);
  124. autostartPane->setLayout(layout);
  125. // Theme
  126. QFile stylesheetReader("/usr/share/plainDE/styles/" + autostartPaneConfig["theme"].toString());
  127. stylesheetReader.open(QIODevice::ReadOnly | QIODevice::Text);
  128. QTextStream styleSheet(&stylesheetReader);
  129. autostartPane->setStyleSheet(styleSheet.readAll());
  130. stylesheetReader.close();
  131. QFont paneFont;
  132. paneFont.setFamily(autostartPaneConfig["fontFamily"].toString());
  133. paneFont.setPointSize(autostartPaneConfig["fontSize"].toInt());
  134. autostartPane->setFont(paneFont);
  135. short width = 400, height = 500;
  136. autostartPane->setGeometry(250, 250, width, height);
  137. QPushButton* backPushButton = new QPushButton("Close");
  138. backPushButton->setIcon(QIcon::fromTheme("go-previous"));
  139. autostartPane->layout()->addWidget(backPushButton);
  140. QLabel* autostartEntriesLabel = new QLabel("Autostart entries");
  141. autostartPane->layout()->addWidget(autostartEntriesLabel);
  142. QListWidget* autostartEntriesListWidget = new QListWidget;
  143. autostartPane->layout()->addWidget(autostartEntriesListWidget);
  144. autostartEntriesListWidget->setStyleSheet("QListView::item:selected { background-color: " + \
  145. autostartPaneConfig["accent"].toString() + \
  146. "; color: #ffffff };");
  147. QLabel* allAppsLabel = new QLabel("All applications");
  148. autostartPane->layout()->addWidget(allAppsLabel);
  149. QListWidget* allAppsListWidget = new QListWidget;
  150. autostartPane->layout()->addWidget(allAppsListWidget);
  151. allAppsListWidget->setStyleSheet("QListView::item:selected { background-color: " + \
  152. autostartPaneConfig["accent"].toString() + \
  153. "; color: #ffffff };");
  154. QPushButton* addSelectedPushButton = new QPushButton("Add");
  155. autostartPane->layout()->addWidget(addSelectedPushButton);
  156. QPushButton* removeSelectedPushButton = new QPushButton("Remove");
  157. autostartPane->layout()->addWidget(removeSelectedPushButton);
  158. QPushButton* revertPushButton = new QPushButton("Revert");
  159. autostartPane->layout()->addWidget(revertPushButton);
  160. QPushButton* savePushButton = new QPushButton("Save");
  161. autostartPane->layout()->addWidget(savePushButton);
  162. prepareUI(autostartEntriesListWidget, allAppsListWidget);
  163. // Make connections
  164. autostartPane->connect(backPushButton, &QPushButton::clicked, autostartPane,
  165. [autostartPane, controlCenter]() {
  166. controlCenter->mAutostartWidgetVisible = false;
  167. autostartPane->hide();
  168. delete autostartPane;
  169. });
  170. autostartPane->connect(addSelectedPushButton, &QPushButton::clicked, autostartPane,
  171. [this, autostartEntriesListWidget, allAppsListWidget]() {
  172. addEntry(autostartEntriesListWidget, allAppsListWidget);
  173. });
  174. autostartPane->connect(removeSelectedPushButton, &QPushButton::clicked, autostartPane,
  175. [this, autostartEntriesListWidget]() {
  176. removeEntry(autostartEntriesListWidget);
  177. });
  178. autostartPane->connect(savePushButton, &QPushButton::clicked, autostartPane,
  179. [this, autostartEntriesListWidget]() {
  180. saveSettings(autostartEntriesListWidget);
  181. });
  182. autostartPane->connect(revertPushButton, &QPushButton::clicked, autostartPane,
  183. [this, autostartEntriesListWidget, allAppsListWidget]() {
  184. prepareUI(autostartEntriesListWidget, allAppsListWidget);
  185. });
  186. return autostartPane;
  187. }